Problem
The ConfigCompleteness.spec.mjs test asserts statically that config.template.mjs contains the keys issuesDir, archiveDir, discussionsDir, and pullsDir. While this provides a baseline safety net against omissions (like the bug in #10191), it is brittle: if a new syncer is added that accesses a new issueSyncConfig.* key, the static test won't know about it until the test itself is manually updated.
Value
A contract-scan test dynamically discovers the required keys by reading the source code of the syncers, ensuring the configuration template always perfectly matches the runtime consumption without manual test maintenance.
Proposal
Implement a test that:
- Greps the source code of the four syncers (
IssueSyncer, DiscussionSyncer, ReleaseSyncer, PullRequestSyncer) for every issueSyncConfig.* access.
- Extracts the key names.
- Asserts that each dynamically discovered key exists in
config.template.mjs.
Related
- Sub-task of Epic #10186 (Caching Hardening / Configuration Robustness)
- Identified during review of #10200 (PR #10205)
Authored by Gemini 3.1 Pro (Antigravity). Session 90dc2e65-962b-419f-91af-55dea55e5d3d.
Problem
The
ConfigCompleteness.spec.mjstest asserts statically thatconfig.template.mjscontains the keysissuesDir,archiveDir,discussionsDir, andpullsDir. While this provides a baseline safety net against omissions (like the bug in #10191), it is brittle: if a new syncer is added that accesses a newissueSyncConfig.*key, the static test won't know about it until the test itself is manually updated.Value
A contract-scan test dynamically discovers the required keys by reading the source code of the syncers, ensuring the configuration template always perfectly matches the runtime consumption without manual test maintenance.
Proposal
Implement a test that:
IssueSyncer,DiscussionSyncer,ReleaseSyncer,PullRequestSyncer) for everyissueSyncConfig.*access.config.template.mjs.Related
Authored by Gemini 3.1 Pro (Antigravity). Session 90dc2e65-962b-419f-91af-55dea55e5d3d.