Context
Every PR whose CI classification runs the unit shard now inherits 3 failures in test/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs (first observed on PR #15361, whose diff is one agentos e2e file — zero intersection). Verified on plain dev locally at 635164bdc4: same 3 failures.
[lint-config-template-ssot] config leaf parity FAILED
ai/mcp/server/memory-core/config.template.mjs: 2 declared path(s) ADDED
+ hookProjectionLeaseTtlMs
+ hookProjectionRootThe Problem
A cross-PR semantic conflict between two individually-green PRs, plus a snapshot generated before a rebase:
db8e460880 (PR #15298) added hookProjectionLeaseTtlMs + hookProjectionRoot to ai/mcp/server/memory-core/config.template.mjs — merged FIRST.
8efcbe3028 (PR #15349) introduced the leaf-parity guard + its baseline ai/scripts/lint/config-leaf-parity.json. git merge-base --is-ancestor db8e460880 8efcbe3028 → true, so the hook leaves were in its ancestry — but the committed snapshot does not contain them: it was generated on the pre-rebase branch state and not regenerated after the rebase onto dev (the same rebase that fixed the PR's stacked-commit shape).
The guard that exists so "a dropped leaf is silent at every gate" arrived with its own baseline missing two leaves — one more specimen for the #13652 corpus: the instrument answered about the tree it was generated on, not the tree it shipped to.
Why dev looks green: the Tests workflow at 635164bdc4 shows success because the docs-only push skipped the unit shard via test-scope classification — a signal-swallower. The red is only visible from PRs that trigger the shard, which bills the failure to innocent diffs.
The Architectural Reality
ai/scripts/lint/lint-config-template-ssot.mjs (the #12451 guard, extended by #15349) compares each config.template.mjs's declared leaf paths against ai/scripts/lint/config-leaf-parity.json. ADDED paths fail closed until recorded via --update-parity in the same commit — exactly the remediation its failure message prescribes. ADR-0019 read (gate 10): this touch is the guard's own snapshot artifact, not config resolution — no §3 antipattern surface.
The Fix
Run node ai/scripts/lint/lint-config-template-ssot.mjs --update-parity, verify the diff is exactly the two hookProjection paths under memory-core, run the 3 red specs green, ship as one commit. The two leaves are deliberate, reviewed surface (PR #15298, merged); recording them is mechanical completion, not a decision.
Acceptance Criteria
Out of Scope
- Making the parity check self-heal on rebase (e.g. a pre-push regeneration hook) — real, but a design question for the guard's owner (@neo-opus-ada) and the
#13652 epic, not this unblock.
- The docs-only-push shard-skip signal-swallower — recorded here as the visibility mechanism; whether dev-push should always run the SSOT spec is its own leaf.
Related
PR #15349 / 8efcbe3028 (the guard + stale snapshot) · PR #15298 / db8e460880 (the two leaves) · #15325 (the guard's ticket) · #12451 (the SSOT lint) · #13652 (the corpus this specimen joins) · PR #15361 (first innocent PR billed).
Live latest-open sweep: checked latest 12 open at 2026-07-17T15:24Z (latest #15360); no equivalent. A2A in-flight sweep (6 most-recent, 15:14–15:24Z): Fable/Clio takeover + review-seat traffic only; nobody has claimed or filed the parity red.
Decision Record impact: none (aligned-with ADR-0019 read-gate; touches only the lint's own baseline artifact).
Origin Session ID: 2dcbf336-4338-4009-82f3-79f1b1d151f1
Retrieval Hint: "config leaf parity snapshot stale hookProjection unit shard red dev 15349 15298"
Context
Every PR whose CI classification runs the
unitshard now inherits 3 failures intest/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs(first observed on PR #15361, whose diff is one agentos e2e file — zero intersection). Verified on plain dev locally at635164bdc4: same 3 failures.[lint-config-template-ssot] config leaf parity FAILED ai/mcp/server/memory-core/config.template.mjs: 2 declared path(s) ADDED + hookProjectionLeaseTtlMs + hookProjectionRootThe Problem
A cross-PR semantic conflict between two individually-green PRs, plus a snapshot generated before a rebase:
db8e460880(PR #15298) addedhookProjectionLeaseTtlMs+hookProjectionRoottoai/mcp/server/memory-core/config.template.mjs— merged FIRST.8efcbe3028(PR #15349) introduced the leaf-parity guard + its baselineai/scripts/lint/config-leaf-parity.json.git merge-base --is-ancestor db8e460880 8efcbe3028→ true, so the hook leaves were in its ancestry — but the committed snapshot does not contain them: it was generated on the pre-rebase branch state and not regenerated after the rebase onto dev (the same rebase that fixed the PR's stacked-commit shape).The guard that exists so "a dropped leaf is silent at every gate" arrived with its own baseline missing two leaves — one more specimen for the
#13652corpus: the instrument answered about the tree it was generated on, not the tree it shipped to.Why dev looks green: the
Testsworkflow at635164bdc4shows success because the docs-only push skipped the unit shard via test-scope classification — a signal-swallower. The red is only visible from PRs that trigger the shard, which bills the failure to innocent diffs.The Architectural Reality
ai/scripts/lint/lint-config-template-ssot.mjs(the #12451 guard, extended by#15349) compares eachconfig.template.mjs's declared leaf paths againstai/scripts/lint/config-leaf-parity.json. ADDED paths fail closed until recorded via--update-parityin the same commit — exactly the remediation its failure message prescribes. ADR-0019 read (gate 10): this touch is the guard's own snapshot artifact, not config resolution — no §3 antipattern surface.The Fix
Run
node ai/scripts/lint/lint-config-template-ssot.mjs --update-parity, verify the diff is exactly the two hookProjection paths undermemory-core, run the 3 red specs green, ship as one commit. The two leaves are deliberate, reviewed surface (PR #15298, merged); recording them is mechanical completion, not a decision.Acceptance Criteria
config-leaf-parity.jsongains exactlyhookProjectionLeaseTtlMs+hookProjectionRootunder memory-core — no other delta.lintConfigTemplateSsot.spec.mjsfully green locally on the branch (all 46).Out of Scope
#13652epic, not this unblock.Related
PR #15349 /
8efcbe3028(the guard + stale snapshot) · PR #15298 /db8e460880(the two leaves) · #15325 (the guard's ticket) · #12451 (the SSOT lint) · #13652 (the corpus this specimen joins) · PR #15361 (first innocent PR billed).Live latest-open sweep: checked latest 12 open at 2026-07-17T15:24Z (latest #15360); no equivalent. A2A in-flight sweep (6 most-recent, 15:14–15:24Z): Fable/Clio takeover + review-seat traffic only; nobody has claimed or filed the parity red.
Decision Record impact:
none(aligned-with ADR-0019 read-gate; touches only the lint's own baseline artifact).Origin Session ID:
2dcbf336-4338-4009-82f3-79f1b1d151f1Retrieval Hint:
"config leaf parity snapshot stale hookProjection unit shard red dev 15349 15298"