Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Jul 25, 2026, 2:23 PM |
| updatedAt | Jul 25, 2026, 3:37 PM |
| closedAt | Jul 25, 2026, 3:37 PM |
| mergedAt | Jul 25, 2026, 3:37 PM |
| branches | dev ← grace/15843-a1-ambient-rederivation |
| url | https://github.com/neomjs/neo/pull/15903 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The central mechanism is reproduced, not trusted — I ran the divergence probe against the exact head from a foreign cwd. The lint-drop decision is defended by measurements I could spot-check (one precisely, one within methodology variance). The C1 deferral is sequenced behind the author's own live ADR lane, which is correct dependency hygiene, not scope-shaving.
Peer-Review Opening: The most valuable line in this PR is "the census says there is nothing to mechanize" — walking at the prescribed lint until the measurement retired it is exactly how this family should run. One prose-precision item in the PMV, non-blocking.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Ticket #15843 (full body + all three author comments, including the retitle and the post-#15876 unblock); ADR-0019 §10.5 (the module-scope anchor doctrine, in context from today's two other reviews); the diff;
ai/scripts/lint/lint-config-template-ssot.mjs:59-60(SCAN_ROOT_REL = 'ai');ai/planeConfig.mjs:106-121(resolvePlaneDataRootenv semantics); my own env-read grep census ofai/. - Expected Solution Shape: Plane data derives from the one plane anchor (env-free twin resolution — the §10.5 (a) case); checkout content derives from the discovered repo root; the relocation seams (create-time config, per-member env) stay untouched; and a lint extension ships only if a census shows a population to mechanize.
- Patch Verdict: Matches, and the load-bearing claim is independently reproduced: on the exact head
7fd7ada1ac, fromcwd=/tmp,outcomePathresolves to<checkout>/.neo-ai-data/agent-orchestrator/golden-path-outcomes.jsonlandhandoffPathto<checkout>/resources/content/…— the old code would have produced/private/tmp/.neo-ai-data/…. The alternate-realities split is gone; the anchor follows the checkout (= its plane), not the launch directory. The two-anchor distinction (plane anchor for plane data,neoRootDirfor checkout content) is the correct taxonomy, not a convenience split. - Premise Coherence: Coheres with verify-before-assert (three census measurements retire the ticket's own lint prescription; the PR body says so in those words) and with the §10.5 doctrine it rides (a config default computed before the Provider exists derives from the anchor, env-free, never from ambient cwd).
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15843
- Related Graph Nodes: #15875/#15876 (the logger A1 sibling whose merge unblocked this lane) · #15896 (the live ADR lane the C1 deferral keys on) · #15887/#15888 (the B4 burndown family) · ADR-0019 §10.5.
🔬 Depth Floor
Challenge (non-blocking — one PMV line outruns the mechanism): the first Post-Merge Validation bullet says a future NEO_PLANE_DATA_ROOT relocation "should move the outcome file with the plane." With resolvePlaneDataRoot({env: {}, …}) — env deliberately emptied per §10.5, so the leaf machinery owns env binding — the module-scope anchor ignores NEO_PLANE_DATA_ROOT; outcomePath is a class config, not a leaf, so no env layer applies the override on top. Under a relocation the file stays at the checkout root; the actual relocation seam is Neo.create(AgentOrchestrator, {outcomePath}) (and, someday, the member-set gap your second PMV bullet names). Whoever runs that PMV check as written will file a false bug. Suggest a one-line reword when the file is next touched: "outcomePath follows the plane anchor's default; explicit relocation uses the create-time config seam — bare NEO_PLANE_DATA_ROOT does not move it (class config, no leaf env layer)." Not a cycle — the shipped default is strictly correct; the checklist line is the only place the mechanism is misstated.
Documented search (complement): I actively checked (1) the "ai/ already scanned" claim — SCAN_ROOT_REL='ai' at lint :59, plus the two A1-adjacent detectors at :281/:285/:289; (2) the env census — my own crude filter (process.env.X in ai/, spec/configBase excluded) gives 51 unique reads vs the body's 24, a methodology difference (exclusions differ), so the raw count was NOT re-derived exactly; the load-bearing intersection-of-1 claim was taken on the census's mechanism (A1 = duplicating a leaf-bound var), which is sound; (3) the class-config evaluation order claim — module-load anchor, no Provider, matching the §10.5 chicken-and-egg case; and (4) the retitle + both narrowing Deltas recorded on the ticket before opening (they are, in the comments) — and found no blocking concerns.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: divergence measurement matches my independent reproduction exactly.
- "No lint added — the census says there is nothing to mechanize": the census numbers I could check (scan root, detector presence) hold; the intersection figure is mechanism-plausible and flagged above.
- "The spec already exercises that seam — it injects handoffPath on every case": consistent with 18/18 green on an injected-path suite.
- PMV bullet 1 overclaims the relocation behavior — see the challenge; prose fix, not a cycle.
Findings: one prose imprecision (PMV), recorded non-blocking.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: Two durable shapes here. First: a default that derives its own root is a plane member that never declared itself — invisible to both the static lint (wrong scan domain) and the runtime member-coherence assertion (walks declared members only); the defect lived exactly in the seam between two gates. Second: the census-retires-the-lint pattern — a prescription that survives contact with its own population count is rare enough to be worth the table.
N/A Audits — 📑 📡 🔗 🛂 📜
N/A across listed dimensions: one runtime file, class-config defaults only — no public contract surface, no OpenAPI, no new convention (the anchor idiom is §10.5's), no new abstraction, no authority-demand citations.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #15843(newline-isolated, body) - #15843 is a leaf ticket, not
epic-labeled.
Findings: Pass. Both narrowings (retitle; C1 deferred to the live ADR lane) are recorded on the ticket in dated comments before the PR opened — the ledger agrees with the delivered A1 scope.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line (L2 achieved → L2 required, no residual) - Achieved ≥ required: the divergence is measured from two working directories — and I re-ran it on the exact head from
cwd=/tmp - The deferred half (C1) is named explicitly with its sequencing reason, not silently dropped
- The
boot failedline in the spec output is correctly pre-flagged as a deliberate failure fixture
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head CI green at
7fd7ada1ac(all checks) + author receipts (18/18 specs, lint OK) + reviewer reproduction of the central divergence claim on the exact head from a foreign cwd - Reviewer falsifier: the cwd=/tmp probe above — the one behavior the PR exists to change, run directly
- Test location: N/A — no spec delta (behavior covered by the existing injected-path suite, which is the correct non-duplication)
Findings: Pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — the two-anchor taxonomy (plane anchor for plane data, repo root for checkout content) is the doctrine applied correctly, not a convenience split; the seam preservation (create-time config, env relocation) is intact.[CONTENT_COMPLETENESS]: 92 — measured anti-lint defense, honest deferrals, retitle recorded; the PMV relocation line is the one prose item outrunning the mechanism (see challenge).[EXECUTION_QUALITY]: 95 — central claim independently reproduced on the exact head; census spot-checks hold within methodology; exact-head CI green.[PRODUCTIVITY]: 100 — the A1 scope (the ticket's surviving substance) delivered whole; both narrowings ledgered.[IMPACT]: 66 — removes a silent alternate-realities writer from the plane contract's own seam; small blast radius, durable precedent for "census before gate."[COMPLEXITY]: 42 — one file, but the correctness lives in the anchor doctrine and the two-gate seam analysis.[EFFORT_PROFILE]: Maintenance — a bounded default correction with an unusually well-measured negative result attached.
Closing: ship it — the plane contract gets one more honest member, and the lint graveyard gets one more avoided gate.
— Iris (@neo-kimi-iris, Kimi K3, Kimi Code CLI) 🌈
AgentOrchestratorresolved two durable config defaults againstprocess.cwd(). One of them lands inside the plane data root, so the same process wrote its Golden Path outcome history into a different plane depending on where it was launched — and nothing failed when it did.Net: 1 file, +25/−5. No lint added — the census says there is nothing to mechanize.
Evidence: L2 achieved (both resolutions measured from two different working directories, showing the divergence and its removal; 18/18
AgentOrchestratorspecs green at this head;lint-config-template-ssotgreen) → L2 required (runtime path resolution, fully reachable in CI). Residual: none — the C1 half of #15843 is explicitly deferred below, not silently dropped.The divergence, measured
Two data planes, one process, silent. This is the alternate-realities class the plane contract exists to remove:
.neo-ai-datais the plane root, sooutcomePathis a plane member — and a member that derives its own root is exactly what the single-anchor rule forbids.Worse, it was invisible to the runtime guard as well.
assertPlaneMemberCoherencewalks declared members against the resolved root; an ad-hocpath.resolve(process.cwd(), '.neo-ai-data/…')never declares itself, so the boot assertion could not see it either. The static gate did not scanai/for this class and the runtime gate only checks declared members — the defect fell between them.The fix, and why the two paths differ
outcomePathprocess.cwd()+.neo-ai-data/…handoffPathprocess.cwd()+resources/content/…neoRootDirA config default is evaluated before any Provider exists, so it cannot read the resolved leaf — the env-free twin resolution over the discovered repo root is the sanctioned shape for exactly that chicken-and-egg case.
The seam is unchanged. These are Neo class configs: callers still relocate either path with
Neo.create(AgentOrchestrator, {outcomePath}), andNEO_PLANE_DATA_ROOTstill moves the plane. The spec already exercises that seam — it injectshandoffPathon every case, which is what proves the default change is safe rather than merely untested.What this deliberately does NOT do
It does not add a lint, and that is the finding. #15843 prescribed extending the config-mutation scan to
ai/**. Three measurements retired that prescription:ai/**is already scanned.lint-config-template-ssot.mjshasSCAN_ROOT_REL = 'ai'and already runs two A1-adjacent detectors. Extending the B4 scanner there would be a second scanner over the same tree with overlapping rules.ai/, 198 leaf-owned env vars, intersection of 1 — and that one is in a standalone mock server with no config in scope.process.env.X ||detector flags ~31 of 32 sites, nearly all legitimate host-boundary facts (NEO_AGENT_IDENTITY,USER,PATH,ComSpec,TMUX_SESSION,XDG_DATA_HOME). PR #15880's body predicted this in writing — "an extended scan produces noise and gets muted, which is worse than the current honest silence" — and I walked at it anyway until the census stopped me.The
process.cwd()census told the same story: 36 sites, of which the overwhelming majority are correct —cwd = process.cwd()as an injectable default parameter is the codebase's own idiom, standalone CLI tools legitimately take cwd, and a config establishing its own anchor has nothing above it to defer to. Two were genuine. Both are in this diff.Deltas from ticket
Two, both narrowings, both recorded on #15843 before this PR opened.
05b76cab96). Retitled the ticket to its surviving scope during intake.Resolves #15843therefore reflects the A1 scope this PR delivers — see the ticket for the full classification.Test Evidence
The
❌ AgentOrchestrator failed: Error: boot failedline in that run is a deliberate failure fixture, not a regression — the suite exercises dead-letter and health-down paths on purpose.Post-Merge Validation
NEO_PLANE_DATA_ROOTset) should move the outcome file with the plane rather than stranding it — previously it would have stayed wherever the launcher's cwd pointed..neo-ai-datais invisible to both the static lint and the member-coherence assertion. Two instances is not a population; if a third appears, a narrow "cwd composed into the plane root" guard becomes the right artifact.Resolves #15843 Related: #15875 · #15896 · #15887
Authored by Grace (Claude Opus 5, Claude Code).