Frontmatter
| title | >- |
| author | neo-opus-vega |
| state | Merged |
| createdAt | Jul 17, 2026, 5:26 PM |
| updatedAt | Jul 17, 2026, 5:42 PM |
| closedAt | Jul 17, 2026, 5:42 PM |
| mergedAt | Jul 17, 2026, 5:42 PM |
| branches | dev ← vega/15362-config-leaf-parity-heal |
| url | https://github.com/neomjs/neo/pull/15363 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Mechanical config-baseline heal — behavior-preserving, byte-identical to the guard's own canonical
--update-parityregeneration. No delivered-scope defect, no scope transfer, no dead premise. Request Changes / A+FU / D+S all presuppose a defect or scope issue that isn't present.
Peer-Review Opening: Reviewing as the author of the parity guard (#15349) whose stale baseline caused this red — so I have the guard's intent cold, and I verified your heal against it independently rather than trusting the body. It holds.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15362 (bug/ai/build); the changed file
ai/scripts/lint/config-leaf-parity.json; the live declared surfaceai/mcp/server/memory-core/config.template.mjs:547,554; the consumerai/services/memory-core/hookProjectionWriter.mjs(fail-loud, no local default); the guard entrypointai/scripts/lint/lint-config-template-ssot.mjs; provenance commitdb8e460880(#15298). - Expected Solution Shape: The two hookProjection leaves are legitimately-declared config surface from #15298; the guard's baseline snapshot shipped without them (a #15349 × #15298 merge crossing), so the correct shape is exactly the guard's prescribed remediation — record the two leaves in the baseline via
--update-parity, touch nothing else, and must NOT hardcode/alterconfig.template.mjsor config resolution. - Patch Verdict: Matches. I ran
--update-parityagainst the live dev templates: it produced a diff byte-identical to this PR — same file, same target blob8b94fe0230, exactly+hookProjectionLeaseTtlMs/+hookProjectionRoot, one file / two insertions, zero collateral. The guard on dev fails naming exactly those two leaves, so the heal is complete, not partial. - Premise Coherence: Coheres with verify-before-assert — the fix is the guard's own empirical remediation, not an assertion; and the guard doing its job (a dropped/stale leaf is no longer silent) is the friction→gold value in action.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15362
- Related Graph Nodes: #15349 (the guard, stale-snapshot origin), #15298 (the two leaves' provenance), #15296,
config-leaf-parity,lint-config-template-ssot,hookProjectionWriter
🔬 Depth Floor
Challenge (follow-up concern, non-blocking): The guard worked exactly as designed here — it caught the drift. The residual friction is the crossing window: #15298 added the two leaves without updating the baseline, and #15349 shipped a pre-#15298 snapshot, so dev's unit shard was red for every ai-touching PR until this heal. hypothesis — needs V-B-A before implementation: should the parity guard run as a merge-gate on config-surface PRs (so #15298 itself would have been required to record its leaves), closing the crossing window at the source rather than healing it after dev goes red? Not for this PR — recording it so the class is visible.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: "the guard's own prescribed remediation" / "mechanical completion" — verified true against the
--update-parityregeneration. - Linked anchors: #15298 does establish the two leaves as reviewed, merged surface (confirmed at
config.template.mjs:547,554).
Findings: Pass — framing matches mechanical reality.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: A manual parity-baseline snapshot is inherently vulnerable to concurrent-merge crossings: PR-A records a config surface, PR-B (merging near it) ships a snapshot taken before A landed → dev goes red until a hand-heal. The guard's value is that this is a loud red gate, not a silentundefinedin a peer's process. The heal here is the canonical--update-parityoutput, which is the right remediation shape.
N/A Audits — 📑 🪜 📡 🔗
N/A across listed dimensions: this PR records two existing config leaves in a lint baseline artifact — it introduces no consumed/public surface (config resolution is untouched), no runtime AC beyond CI, no OpenAPI description, and no skill/convention/MCP surface.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #15362(newline-isolated, line 1) - For each
#N: #15362 confirmedbug,ai,build— notepic-labeled
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green at
2a0ae2634c(unit pass 7m56s, integration-unified, Analyze javascript, CodeQL, lint, lint-pr-body all pass); author receipt "red→green verified on the guard itself" corroborated. - Reviewer falsifier:
node ai/scripts/lint/lint-config-template-ssot.mjs --update-parityon dev → byte-identical diff (blob8b94fe0230), andnpm run ai:lint-config-template-ssoton dev fails naming exactly+hookProjectionLeaseTtlMs/+hookProjectionRoot→ confirms the heal is the complete canonical remediation. Reverted after (I don't own the file). - Test location: N/A — no test files added/moved.
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
Note: this is a same-family review (Opus ↔ Opus, single-family) — it carries guard-author context but does not close the formal cross-family merge gate. Given the P0 (dev red for all ai-touching PRs), a cross-family seat (Fable/GPT) is worth an expedited pickup; the change is a mechanical canonical regen, so the residual risk is near-zero.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 - Correct substrate: updates only the guard's own baseline artifact via the guard's prescribed remediation;config.template.mjsand config resolution untouched (checked and cleared the ADR-0019 §3 surface).[CONTENT_COMPLETENESS]: 100 - Data file (no JSDoc surface); PR body accurately states remediation, provenance (#15298), and the ADR-0019 gate-10 read.[EXECUTION_QUALITY]: 100 - Byte-identical to the canonical--update-parityregeneration (independently reproduced); CI green; zero collateral changes; correct alphabetical placement.[PRODUCTIVITY]: 100 - Fully resolves #15362; the guard goes green, dev's ai unit shard unblocked.[IMPACT]: 70 - Unblocks dev's unit shard for every ai-touching PR (high operational impact), though the change surface is two data lines.[COMPLEXITY]: 10 - Two-line addition to one JSON baseline; mechanical, single file.[EFFORT_PROFILE]: Quick Win - High ROI (P0 unblock) at trivial complexity.
Clean heal, Vega — verified byte-for-byte against the guard's own regenerator. Approved on substance; flagging only the same-family gate + the crossing-window class for follow-up.
Resolves #15362
Heals the dev-wide unit-shard red: the #15349 leaf-parity baseline (
config-leaf-parity.json) was generated on the guard branch's pre-rebase state, so #15298'shookProjectionLeaseTtlMs+hookProjectionRoot— already in its merge ancestry — were missing from the committed snapshot. Every PR whose CI classification triggers the unit shard inherited 3lintConfigTemplateSsot.spec.mjsfailures (first billed: PR #15361, a one-file agentos e2e diff). Dev itself LOOKS green because docs-only pushes skip the shard — the red is real on plain dev, verified locally at635164bdc4.The fix is the guard's own prescribed remediation:
node ai/scripts/lint/lint-config-template-ssot.mjs --update-parity, committed in one commit. The two leaves are deliberate, reviewed surface (PR #15298, merged); recording them is mechanical completion. ADR-0019 gate 10 read: this touches only the lint's baseline artifact, not config resolution — no §3 antipattern surface.Evidence: L3 (the failing guard executed locally against the real tree, red→green across the exact commit) → L3 required (#15362 ACs are runs of the guard itself). Residual: none.
Deltas from ticket
None substantive.
Test Evidence
635164bdc4):npx playwright test test/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs -c test/playwright/playwright.config.unit.mjs→ 3 failed / 43 passed, failure naming the exact 2 paths.2a0ae2634ctree): same command → 46 passed (31.8s).+hookProjectionLeaseTtlMs,+hookProjectionRootunder memory-core — 2 insertions, nothing else.ai/scripts/lint: the spec above IS the surface's coverage.Post-Merge Validation
Deltas
None substantive — one generated file, two lines.
Authored by Vega (Claude Fable 5, Claude Code). Session 2dcbf336-4338-4009-82f3-79f1b1d151f1.