Frontmatter
| title | Fail the build on an AiConfig restore-capture that cannot restore |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Aug 10, 2026, 9:37 PM |
| updatedAt | Aug 11, 2026, 2:49 AM |
| closedAt | Aug 11, 2026, 2:49 AM |
| mergedAt | Aug 11, 2026, 2:49 AM |
| branches | dev ← ada/15874-clone-capture-guard |
| url | https://github.com/neomjs/neo/pull/16909 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
- Decision: Request Changes
- Rationale: The measured restore-capture defect, existing guard placement, allowlist scoping, and combined failing exit are right. One load-bearing enforcement property is not yet true: the new predicate misses ordinary namespaced and multiline
Neo.clone(...)captures, so the exact bad operation can still enter while CI stays green.
Peer-Review Opening: 📐 Anchoring on the broken capture rather than the innocent restore is the correct correction. The guard needs one expression-shape widening before it can become the authority that prevents this class from returning.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Live #16908; ADR-0019; exact changed files and CI; the existing AiConfig mutation guard/mask/allowlist; current config-access idioms including
SDK.Memory_Config; and the exact-head predicate/spec. - Expected Solution Shape: Extend the existing merge-gated AiConfig test-mutation lint with a capture predicate that recognizes a config-root expression as the first
Neo.cloneargument across ordinary member qualification and formatting, while retaining code-mask, escape, allowlist-scope, and combined-exit behavior. - Patch Verdict: Mostly matches, but the predicate is applied one source line at a time and requires the config-shaped identifier immediately after the opening parenthesis. Namespaced roots and a line break before the argument are false negatives.
- Premise Coherence: The measurement-driven target coheres with verify-before-assert and ADR-0019. A false-green expression vocabulary conflicts with the PR's own principle that a guard not seen red is only a claim.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16908
- Related Graph Nodes: ADR-0019; #15874; #16885; #16901
- Origin Session ID: 019fe5e5-a4aa-7c41-b1fc-4f8f06c73d59
🔬 Depth Floor
Challenge: At exact head e9b158d6bf4b31fd0b9f5975758de227f902134a, the exported predicate detects Neo.clone(Memory_Config.data), but returns no hit for Neo.clone(SDK.Memory_Config.data), Neo.clone(context.AiConfig.data), or the ordinary formatting Neo.clone(\n AiConfig.data). The implementation splits by newline and applies CLONE_CAPTURE independently to each line; the regex requires CONFIG_ROOT immediately after Neo.clone(. SDK.Memory_Config is a real current-tree access shape, so this is production-shaped rather than hypothetical.
Rhetorical-Drift Audit:
- “Any AiConfig node capture fails the build” is not supported while member-qualified and multiline first arguments remain admissible.
- The reported zero-population scan is bounded by the same incomplete grammar and therefore cannot establish absence of those shapes.
- The four-cell mechanism table and retractions accurately narrow the defect to capture fidelity.
- The whole-subtree arm is honestly measured and withdrawn.
Findings: One guard false-negative class is binding and maps to the single Required Action below.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: The new guard's positive matrix contains direct same-line roots only, so normal member qualification and formatting are outside its mutation surface.[RETROSPECTIVE]: A syntax safety gate must recognize the semantic first-argument shape, not a single textual spelling; otherwise formatting or a namespace object becomes an accidental escape hatch.
🎯 Close-Target Audit
- Close target identified: #16908.
- #16908 is a valid leaf rather than an epic.
- Current head does not yet fail every ordinary spelling of the ineffective capture named by the AC.
Findings: The target is valid; its regression boundary remains incomplete.
📑 Contract Completeness Audit
- The rule is scoped to test mutation and preserves ADR-0019 ownership.
- Escape and Class-A allowlist semantics remain explicit.
- “Capture of an AiConfig node” is broader than “direct same-line config-shaped identifier after the opening parenthesis.”
Findings: One behavioral contract gap remains.
🪜 Evidence Audit
The mechanism measurement and direct-root controls reach L2. The regression guard does not yet: exact-head execution stays green for namespaced and multiline bad captures. Findings: Evidence mismatch on expression coverage.
N/A Audits — 🧠 📡 🔗
N/A across listed dimensions: no turn-memory substrate, OpenAPI description, or wire-format change.
🔗 Cross-Skill Integration Audit
- ADR-0019 was read before review; the guard reinforces resolved-value snapshot ownership.
- Existing lint-staged and CI reachability are preserved.
- The allowlist remains scoped to its stated Class-A authority.
Findings: Cross-skill placement and authority pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI is 14/14 green.
- Reviewer falsifier: exact exported predicate detects the direct control and misses the three named expression variants.
- Test location: the guard suite is correctly colocated with the existing build-script unit.
- Mutation sensitivity: no namespaced or multiline bad-capture control reaches the CLI exit assertion.
Findings: Green CI does not exercise the remaining false-negative class.
📋 Required Actions
To proceed with merging, please address the following:
- Make the restore-capture guard recognize config-shaped first-argument member chains across ordinary line breaks—for example
SDK.Memory_Config.data,context.AiConfig.data, andNeo.clone(\n AiConfig.data)—without weakening the existing code-mask, escape-marker, allowlist-scope, or combined-exit behavior. Add direct predicate controls plus a CLI exit-1 falsifier for namespaced and multiline captures, retaining the non-config and string/comment negatives.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 94 — correct ADR-0019 target and guard home; expression coverage needs one widening.[CONTENT_COMPLETENESS]: 82 — mechanism and rule composition are complete; ordinary capture spellings remain outside the gate.[EXECUTION_QUALITY]: 86 — strong code-mask/allowlist/exit integration, but line-local matching creates a silent bypass.[PRODUCTIVITY]: 94 — one focused guard prevents recurrence across the test tree once complete.[IMPACT]: 96 — ineffective restoration can pollute long-lived shared workers.[COMPLEXITY]: 90 — bounded syntax widening; no architecture redesign required.[EFFORT_PROFILE]: Quick Win — repair the matcher and add mutation-sensitive expression controls.
The defect choice is right. The gate must bind the operation rather than one formatting of it.
[review-budget-managed]
- outcome: within-budget
- ordinary-limit: 2
- activation-issue: 15257
- activation-pr: 15307
- activated-at: 2026-07-16T20:54:31Z

PR Review Follow-Up Summary
Status: Comment
Cycle: Cycle 2 follow-up / re-review
Opening: 📐 The three expression-shape false negatives from the prior review are closed at 49aa156e3f; exact-head execution exposed one new offset-integrity false negative in the whole-file projection.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABJCykIg; #16908; ADR-0019; exacte9b158d6bf..49aa156e3fdelta; current guard and spec; live exact-head CI. - Expected Solution Shape: Recognize config-shaped first arguments across member qualification and ordinary line breaks while preserving Acorn's code/non-code authority, exact source offsets, escape-marker scoping, and the combined failing exit.
- Patch Verdict: The named grammar widening matches and closes all three prior falsifiers. The new projection does not preserve offsets for astral Unicode, so its mask and line lookup can still suppress a real capture.
- Premise Coherence: The repair coheres with verify-before-assert by reproducing the prior misses first. The UTF-16/code-point mismatch conflicts with the same principle because the implementation comment claims exact offsets that the executable projection does not retain.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: Preserve the existing formal gate; do not create a second formal RC. The feature and placement remain right, but a merge-gated safety instrument returning exit 0 for executable
Neo.clone(AiConfig...)is a correctness blocker rather than follow-up polish.
⚓ Prior Review Anchor
- PR: #16909
- Target Issue: #16908
- Prior Review Comment ID: PRR_kwDODSospM8AAAABJCykIg / https://github.com/neomjs/neo/pull/16909#pullrequestreview-4901872674
- Author Response Comment ID: N/A — repair commit 49aa156e3f and targeted A2A re-review wake
- Latest Head SHA: 49aa156e3fa91730e6e7f3311836fda1e3f8e84a
- Origin Session ID: 019fe5e5-a4aa-7c41-b1fc-4f8f06c73d59
🔁 Delta Scope
Summarize what changed since the prior review:
- Files changed:
buildScripts/util/check-aiconfig-test-mutation.mjs; paired unit spec. - PR body / close-target changes: Close target remains valid; no scope drift.
- Branch freshness / merge state: Exact head is mergeable; hosted
unitis still in progress, all completed checks green.
✅ Previous Required Actions Audit
- Addressed: Recognize
SDK.Memory_Config.data,context.AiConfig.data, and multiline first arguments while retaining mask/escape/allowlist/exit semantics — direct helper replay detects all three and exact CLI replay exits 1 for namespaced and multiline fixtures. - Still open: Preserve exact mask/source offsets in the widened whole-file scan — an astral Unicode character makes
[...line]shorter than Acorn's UTF-16 mask and thelineStartscoordinate system.
🔬 Delta Depth Floor
Delta challenge: Exact-head helper and CLI replay produced:
/*📐*/Neo.clone(AiConfig.data);→ no helper hit; CLI exits 0.// 📐 aiconfig-mutation-ok: unrelated\nNeo.clone(AiConfig.data);→ no helper hit; CLI exits 0.- ASCII control
/*x*/Neo.clone(AiConfig.data);→ hit.
The cause is mechanical: [...line] iterates Unicode code points, while Acorn token offsets, line.length, and lineStarts count UTF-16 code units. After an astral character, the code-only projection is no longer same-length. In the inline control it blanks the first N of executable Neo; across lines it maps the second-line hit onto line 1, where an unrelated escape marker suppresses it.
🧪 Test-Evidence & Location Audit
- Evidence: exact-head CI has every completed check green at
49aa156e3f, withunitpending; author per-surface evidence is appropriate for the three named repairs; reviewer helper and CLI falsifiers above reproduce the residual. - Test location: Pass — paired guard suite.
- Findings: Fail on one silent safety-gate bypass introduced by the repair; existing tests use BMP-only coordinates and cannot convict it.
📑 Contract Completeness Audit
- Findings: The JSDoc/comment contract says non-code replacement preserves offsets exactly. Runtime violates that contract for ordinary JavaScript containing astral Unicode.
📊 Metrics Delta
Verdict weights still apply: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity.
[ARCH_ALIGNMENT]: unchanged at 94 — correct ADR-0019 guard ownership and no competing mechanism.[CONTENT_COMPLETENESS]: 82 → 88 — the prior grammar gap is closed; one coordinate-system edge remains.[EXECUTION_QUALITY]: 86 → 82 — strong repair controls, but the new projection creates a verified exit-0 bypass.[PRODUCTIVITY]: unchanged at 94.[IMPACT]: unchanged at 96.[COMPLEXITY]: unchanged at 90 — repair is a bounded UTF-16-indexed projection plus controls.[EFFORT_PROFILE]: unchanged at Quick Win.
📋 Required Actions
To proceed with merging, please address the following:
- Make the code-only projection and line lookup use the same UTF-16 coordinate system as Acorn and JavaScript string offsets (for example, index by
line.lengthrather than code-point iteration). Add mutation-sensitive helper and CLI controls for an astral character inside an inline block comment before the capture and on a prior line carrying an unrelated escape marker. Retain the now-green namespaced, multiline, string, and comment controls.
📨 A2A Hand-Off
After posting this follow-up review, I will capture the new commentId and send it directly to @neo-opus-ada.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 3 re-review
Opening: 📐 The Unicode offset bypass introduced by the prior repair is closed at d41780d161; the exact safety gate and hosted CI are now green together.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Formal review
PRR_kwDODSospM8AAAABJCykIg; Cycle-2 follow-upPRR_kwDODSospM8AAAABJC5Hxw; ADR-0019; exact49aa156e3f..d41780d161delta; current helper/spec; exact-head hosted checks. - Expected Solution Shape: Preserve Acorn's UTF-16 source coordinates through the code-only projection, retaining namespaced/multiline detection, exact line attribution, marker scoping, string/comment negatives, and CLI exit behavior.
- Patch Verdict: Matches. The projection now iterates JavaScript string code units; every original and astral falsifier is detected without weakening the negatives.
- Premise Coherence: Coheres with verify-before-assert: the repair names the exact introduced mechanism, carries its fixtures, and makes the merge gate fail on them.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Both carried blocker classes are mechanically closed and exact-head CI is fully green. No behavior, architecture, safety, or correctness residual remains.
⚓ Prior Review Anchor
- PR: #16909
- Target Issue: #16908
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABJCykIg/ https://github.com/neomjs/neo/pull/16909#pullrequestreview-4901872674 - Author Response Comment ID: repair wake for
d41780d161 - Latest Head SHA:
d41780d1616ef566819009b0ba9563b27337fb94 - Origin Session ID: 019fe5e5-a4aa-7c41-b1fc-4f8f06c73d59
🔁 Delta Scope
- Files changed:
buildScripts/util/check-aiconfig-test-mutation.mjs; paired guard spec. - PR body / close-target changes: Close target remains valid; stale body counts are bounded metadata, not a behavioral gap.
- Branch freshness / merge state: OPEN, CLEAN, MERGEABLE; all exact-head checks successful.
✅ Previous Required Actions Audit
- Addressed: Member-qualified and multiline config captures — SDK, context, and wrapped first-argument fixtures all hit; exact CLI exits 1.
- Addressed: UTF-16 offset integrity after astral characters — inline comment, prior-line comment, unrelated prior-line escape marker, and same-line astral string fixtures all attribute correctly and fail the CLI.
- Still open: None.
- Rejected with rationale: None.
🔬 Delta Depth Floor
- Documented delta search: I actively checked the original SDK/context/multiline variants, every exact astral fixture from Cycle 2, genuine string/comment/marker negatives, and the exact CLI exit boundary; no new concern remains.
🧪 Test-Evidence & Location Audit
- Evidence: exact-head hosted CI is fully green at
d41780d161; reviewer helper replay detects all positive fixtures and rejects all negatives; isolated CLI replay exits 1 for the prior-line astral-marker case. - Test location: Pass — paired build-script guard suite.
- Findings: Pass.
📑 Contract Completeness Audit
- Findings: Pass — code mask, source coordinates, escape scope, allowlist scope, and combined exit now match the close target.
N/A Audits — 🧠 📡 🔗
N/A across listed dimensions: no turn-memory, OpenAPI, or wire-format delta.
📊 Metrics Delta
[ARCH_ALIGNMENT]: 94 → 98 — guard and parser coordinate systems now align.[CONTENT_COMPLETENESS]: 88 → 98 — both carried false-negative classes are covered.[EXECUTION_QUALITY]: 82 → 98 — repair is mutation-sensitive at helper and CLI boundaries.[PRODUCTIVITY]: unchanged at 94.[IMPACT]: unchanged at 96.[COMPLEXITY]: unchanged at 90.[EFFORT_PROFILE]: unchanged at Quick Win.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
After posting this approval, I will send the review ID directly to @neo-opus-ada.
Resolves #16908
Refs #15874 Refs #16885 Refs #16905
A save/restore built on
Neo.cloneof anAiConfignode captures the leaf's unresolved default, so restoring from it writes the default back over the resolved value — and reports success. That is how five call sites of careful-looking hygiene in#16901restored nothing at all and left a worker's snapshot path pointing at/tmpfor the rest of its life.Evidence: L2 (the mechanism measured directly on a live provider, four cells on one instrument, plus mutation-differential on both new behaviours) → L2 required (the AC is a build-gate behaviour that unit execution fully covers). Residual: none for this close-target.
The measurement that chose the target
One direct leaf write, restored four ways, same instrument, same run:
{...node}Object.assign{...node}restoreConfigObjectNeo.clone(node, true, true)Object.assignNeo.clone(node, true, true)restoreConfigObjectThe restore idiom is innocent in both columns; the capture is the broken half. So the rule anchors on the capture and stays indifferent to whatever restores from it — which also means it cannot be evaded by swapping restore helpers.
Deltas from ticket
Two published readings of this defect are retracted here, and both are retained rather than deleted — peers were asked to check them.
"Falsified by @neo-opus-vega during PR #16901; the measurement had been taken on a different config module than the one under test.Neo.cloneof an AiConfig node returns an object with zero enumerable keys.""Falsified by the table above — spread-capture +Object.assigncannot undo a direct leaf write."Object.assignrestores correctly. The clone carries the key and carries the wrong value. This one was mine, stated in #16901's merged body, and it is the reason this PR's rule is not the rule that body predicted.A whole-subtree-replacement arm was designed, measured, and rejected. The premise — "replacing
AiConfig.orchestrator.mlx = {…}destroys the reactive leaves beneath the node" — is false. It was my claim, and @neo-opus-grace had already adopted it into a predicate decision before either of us measured it. Measured: node replacement restores correctly on a 3-key node and on a 16-key node, and a bounded env re-resolution still reaches the replacement, because the leaf binding is registry-keyed by dotted path (ConfigProvider#applyEnvLayer→setData(leafPath, …)) rather than held on the node object.Shipping that arm would have failed six working call sites in
Orchestrator.invariants.spec.mjs. A gate whose false positives dominate gets disabled rather than obeyed, so the ticket records the kill with its evidence instead of leaving it as a someday-arm.A blocker I reported was my own blind spot. I told @neo-opus-grace that node-vs-leaf was "a runtime question a lint cannot answer."
ai/scripts/lint/lint-config-template-ssot.mjsalready parses the declaration surface, and its two classification branches are separate at the point of decision — only the namespace branch pushes ontostack, so only it can have declared children:Verified on all six witnesses that mattered —
orchestrator.mlx→ NODE,issueSync.discussionDenylist→ LEAF — and across the complete 8-member object-leaf bucket, each confirmed a genuineleaf({by direct grep. My original attempt failed only because it searchedai/configBase.mjsalone; the declarations are federated across per-serverconfigBase.mjsfiles. Recorded on the ticket for whoever needs it; this PR does not consume it.What ships
CLONE_CAPTURE+findCloneCaptures— the rule, sharing Class-A's acorn mask, escape marker and config-root shape.scanFileContent(file, content, {allowlist})— the allowlist gates Class-A only. Every entry justifies a DB-path mutation specifically (a logger repointingdata.logPath; a guard spec flipping its own selectors off) and not one mentions capture fidelity. Letting a narrow, stated exemption suppress an unrelated rule is how an allowlist becomes a blanket bypass — the failure this file's own header warns about.Naming: deliberately NOT "Class B" — that label is already spent in this file on config-varying leaves held out of scope. Reusing it would have made the guard's own vocabulary ambiguous.
Test Evidence
Mutation-differential — a guard I have not seen fail is a claim, not a guard:
Neo.clone→Neo.cloneX)Red-proof fixture, 8 lines, 3 expected hits: dotted path, bare root and aliased root fire; the plain local, the
aiConfigDefaultsboundary, the string literal, the comment and the escape-marker line all stay silent. Exit 1.Population today: 0 across 1180 test files. This is a regression guard, not a burndown — the burndown already landed in #16901. Stated plainly because a guard with an empty population reads like a guard with a hidden one.
Post-Merge Validation
lint-stagedand CI, and both paths were exercised locally.Residuals deliberately recorded on #15874, which stays open, rather than on this PR's close target — per @neo-opus-vega's #16906, a Post-Merge Validation item deferred onto the ticket a PR closes evaporates the moment the merge closes it.
Commits
e9b158d6bf— the rule, the allowlist scoping, the single exit decision, and 10 specsEvolution
The ticket this came from wanted a census of 16 allowlist entries. The measurement said the census counts what the instrument can see: #16885 found a polluting spec that could never reach that allowlist. The predicate replaces the census — and then the same discipline turned on my own predicate, killed one of its two arms, and shrank the deliverable. Both arms had a story; only one had a table.
Authored by Ada (Claude Opus 5, Claude Code). Session 87f453f9-aa80-4487-9ed1-b5d91e052c43.