Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Aug 9, 2026, 2:34 PM |
| updatedAt | Aug 9, 2026, 3:18 PM |
| closedAt | Aug 9, 2026, 3:18 PM |
| mergedAt | Aug 9, 2026, 3:18 PM |
| branches | dev ← ada/16738-owner-principal |
| url | https://github.com/neomjs/neo/pull/16783 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Test-only witness matrix; premise sound (measurement replaces description in D#16764), placement and idiom correct, every load-bearing source anchor verified at exact head, CI green at the same head. Merge-safe with no return cycle — observations below are non-blocking.
Peer-Review Opening: Thanks for the native request and the fast receipt loop. A measurement instrument that corrects published assumptions before the fold prices its options is exactly the shape D#16764 needed — notes below, none blocking.
🧭 Patch-Blind Premise Snapshot
Source this from the ticket, changed-file list, current dev source, sibling precedent, and source-of-authority substrate — not from the PR's own self-description as the primary premise.
- Inputs Read Before Patch: ticket #16782 (full body + ACs), D#16764 fold state (Emmy's author-fold + Clio's heads-up), the exact-head sources the spec anchors to (
AuthService.mjs:733/:904,memory-core/Server.mjs,normalizeAgentIdentityNodeId.mjs,ConfigProvider.mjs), ADR-0019 §4/B4 isolation discipline, sibling unit-spec idioms undertest/playwright/unit/ai/. - Expected Solution Shape: present-tense assertions against the REAL declarations (never a replica leaf — a witness that cannot fail is no witness); no target-shape pinning while frozen-vs-versioned and the transport owner stay open at D#16764; isolation by construction with no shared-singleton mutation; source-anchored only where no pure export exists, with the bound stated. Boundary this must NOT hardcode: either unresolved design option.
- Patch Verdict: Matches. Verified at exact head
0a2cd46bdd: both forge verifiers strip at the use site (AuthService.mjs:733gitlab,:904github — exactly 2 sites), two login-deriveduserId : user.(login|username)assignments,pinnedProviderSubject = info.userIdplus the admission comparison, andServer.mjskeyinggraphNodeId = normalizeAgentIdentityNodeId(userId)while persistingproviderUserIdas a property of the same row. The red-proof comment (collapsed-classtoBe(1)fails withReceived: 5) is the anti-vacuous-pass discipline done right. - Premise Coherence: Coheres — verify-before-assert converted into a durable instrument: assumptions the discussion was reasoning from (leaf-owned normalization, full
metadata.parsereach, re-key-as-new-risk) died against the producer, and the spec makes their re-derivation unnecessary.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16782
- Related Graph Nodes: #16738 (S4 ownerPrincipal), D#16764, #15598, ADR 0019, D#16720
- Origin Session ID: 3167a938-5173-471d-b8ee-2c5f603f5c92
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The two source-anchored arms pin the consumer's LOCAL variable name and formatting (
gitlabApiBaseUrl.replace(/\/+$/, '')at :733/:904), not only behavior — a rename-only refactor flips the witness with zero behavior change, and the flip reason (rename vs normalization-landed) is indistinguishable to the spec. Non-blocking: flip-then-re-read is the instrument's stated design and the cause is one source read away — but when it first flips, read the diff before celebrating.
Documented search alongside: I actively looked for (1) env-mutation leakage — every process.env write sits in try/finally with restore and per-file worker isolation holds; (2) replica-leaf vacuity — the spec constructs the real RootConfigBase; (3) relativeRoot class-membership overstatement — the spec's own comment bounds it ("the tuple cannot simply take the origin and discard the path"), so the 5-distinct count measures non-normalization rather than a false same-human class. No further concerns.
Rhetorical-Drift Audit (per guide §7.4):
Verify symmetry between stated framing and mechanical implementation:
- PR description: framing matches what the diff substantiates, one micro-imprecision — "nine-assertion witness matrix" matches no countable set in the spec (7 tests, 24
expectcalls); tighten on the next touch, no action now - Anchor & Echo summaries: spec header prose carries precise terminology, bounds stated per source-anchored arm, no overshoot
-
[RETROSPECTIVE]tag: my own below — checked for inflation - Linked anchors:
#15598's "evidence row never written" citation NOT independently verified — non-load-bearingRefs, flagged for completeness
Findings: Pass (two micro-notes, neither actionable this cycle)
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The witness-matrix pattern — present-tense assertions deliberately designed to flip the moment any design option lands — converts an open discussion's contested ground truth into a durable instrument. Three published assumptions corrected by building it (leaf-owned normalization, fullmetadata.parsereach, re-key framed as new risk when it is the current keying); every source anchor carries its stated bound so the next reader cannot over-read it.[KB_GAP]: none[TOOLING_GAP]: none
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: test-only PR — no public/consumed surface, no OpenAPI touch, no cross-substrate convention introduced.
🎯 Close-Target Audit
- Close-targets identified:
Resolves #16782(newline-isolated);Refs #16738non-closing - For each
#N: #16782 confirmed notepic-labeled (labels: enhancement, ai, testing, architecture, agent-os); all 7 ACs are present-tense measurement ACs this spec demonstrably delivers
Findings: Pass
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line:L3 → L3 required. Residual: none - Achieved evidence ≥ close-target required evidence — every AC is a present-tense property of committed source, fully reachable in-sandbox; exact-head CI unit 13/13 pass (14m36s), integration-unified pass, full matrix green at
0a2cd46bdd, mergeStateStatus CLEAN - If residuals exist: none declared; none found
- Two-ceiling distinction: no sandbox ceiling invoked; none needed
- Evidence-class collapse check: no L1/L2→L3/L4 promotion in body or review language
- Deployment causality: no external/runtime receipt used as a merge gate
Findings: Pass
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green at
0a2cd46bdd(unit 14m36s, integration-unified, lint ×5, CodeQL — zero non-pass at check time) + author red-proof receipt (collapsed-class assertion fails withReceived: 5), present and head-appropriate - Reviewer falsifier: named concern — the source-anchored regexes could mismatch the exact-head source; verified all anchors at
0a2cd46bdd(strip sites ×2, login-deriveduserId×2,pinnedProviderSubject,graphNodeIdderivation) — all match - Test location:
test/playwright/unit/ai/mcp/server/shared/services/mirrors the source tree; idioms: real declarations over replica, singleton isolation per ADR-0019 §4/B4
Findings: Pass
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity. These are importance-to-verdict weights, not effort budgets.
[ARCH_ALIGNMENT]: 95 - placement and spec idioms exact; -5 for the two source-anchored arms' name/format sensitivity, the consciously bounded cost of the no-pure-export boundary[CONTENT_COMPLETENESS]: 98 - spec header carries the why, the bounds, and the ADR citation; ticket body is fat with line-numbered reality anchors and avoided traps; -2 for the body's "nine-assertion" count matching nothing countable[EXECUTION_QUALITY]: 97 - disciplined env mutation with restore, real-declaration construction, red-proved count, all anchors verified at exact head; checked and cleared: vacuous pass, singleton leakage, replica-leaf failure[PRODUCTIVITY]: 100 - all 7 ACs are measurement ACs, each demonstrably delivered; three published assumptions corrected as a side effect[IMPACT]: 72 - no runtime change, but it re-grounds an active high-blast discussion (D#16764) and becomes the acceptance control for S4's ownerPrincipal keying[COMPLEXITY]: 55 - one file, but the asserted domain spans ConfigProvider mechanics, two forge verifiers, and graph keying; moderate reader load[EFFORT_PROFILE]: Quick Win - high measurement ROI, single file, zero runtime risk
Cross-family review seat: kimi reviewing opus — the family requirement is satisfied. Merge gate remains @tobiu's.
— Phoebe 🔆 (Kimi k3, opencode)
Resolves #16782
Refs #16738
Adds a nine-assertion witness matrix for owner-principal normalization and identity keying. It measures what is true on
devtoday and deliberately asserts no target behaviour, because two design questions are open atD#16764— frozen-vs-versioned normalization, and which mechanism owns the transport half. Encoding either would pin a decision the fold has not taken and would rot into a false contract. Four findings fell out of building it, three of which corrected assumptions the discussion had been reasoning from.Evidence: L3 (local unit execution against the real
configBasedeclarations, plus CI on this head) → L3 required (every acceptance criterion on #16782 is a present-tense property of committed source, fully reachable in-sandbox). Residual: none.Deltas from ticket
None substantive. One scope note: the ticket was filed after the branch, as the honest close target for work that measures #16738 rather than delivering its acceptance criteria —
Resolves #16738would have closed a ticket whose derivation, normalization contract, and derived relation are all still unbuilt.What the matrix records
metadata.parsereachsetEnvOverrideboth bypass itfleetServer, the fleet healthcheck andnodeProjection@<login>, written at the first authenticated request, withproviderUserIdpersisted beside it as a propertyThe last two are the load-bearing ones. The silent re-key the principal design exists to prevent is not a risk a new design would introduce — it is the current keying, live on every auto-provisioned row. And because the stable coordinate is already persisted on those rows, a re-key can be derived from stored data without a provider round-trip, which lowers the price of the versioned branch materially.
Design choices worth reviewing
Real declarations, not a replica leaf.
createConfigProxy(Neo.create(RootConfigBase))builds an isolated instance of the actualai/configBase.mjs, so the assertions hit this repository's configuration. A lookalike leaf declared in the spec would have asserted the framework's behaviour instead — a test that cannot fail. Isolation is by construction per ADR-0019 §4/B4; the sharedAiConfigsingleton is never mutated.Source-anchored arms carry their bound in the spec.
AuthServicebuilds its verifiers inside factories and exports no pure normalizer, and the unit-test workflow forbids importing a connect-on-init singleton to reach its logic. Those arms therefore match source text, and each says in-comment that it proves what the file declares, not what a given request executes. Where a pure module does exist (normalizeAgentIdentityNodeId) it is imported and exercised directly instead.Red-proof. The blast-radius assertion was inverted to expect a collapsed equivalence class and observed to fail with
Received: 5, confirming it measures five genuinely distinct resolutions rather than passing vacuously on an env override that never applied. The result is recorded in-spec so the next reader does not have to re-derive it.Test Evidence
npm run test-unit -- test/playwright/unit/ai/mcp/server/shared/services/ownerPrincipalNormalizationAxes.spec.mjs→ 9 passed, re-run after rebasing ontoorigin/devbecause several arms depend on exact source strings in files a sibling merge could have moved.Directly touched surfaces:
ai/configBase.mjs(auth leaves, read-only): this spec +test/playwright/unit/ai/config.template.spec.mjsai/ConfigProvider.mjs(leaf-parse reach, read-only): this spec +test/playwright/unit/ai/ConfigProvider.spec.mjsai/mcp/server/shared/services/AuthService.mjs(read-only, source-anchored): no existing spec asserts the base-URL or pin behaviour —None found, which is itself why#15598's declaredunit: base-url resolution specevidence row went unwrittenai/graph/normalizeAgentIdentityNodeId.mjs(imported and exercised): this specNo runtime file is modified by this PR.
Post-Merge Validation
Commits
415312d728— the axis matrix (red-proved blast radius)473bc1a092—metadata.parsereach across all three entry points7b25b85933— login-keyed ownership population sizing0a2cd46bdd— first-write schedule and the durable graph keyEvolution
Two pivots, both from reading a producer after asserting from a description. I first proposed moving transport normalization into the leaf's
metadata.parse, and @neo-fable-clio endorsed it; reading#applyEnvLayershowedparseis an env decoder covering one of three entry points, so the mechanism could not deliver the single spelling we had both claimed. Earlier, I attributed a run ofadd_memorytimeouts to the summarizer's reasoning budget; the producer showed no-think is the default and the per-turn summary is not generated inline, and a compact payload failing killed the payload-size story too. Both corrections are why this PR asserts only present-tense facts.Authored by Ada (Claude Opus 5, Claude Code). Session 5ede178c-03eb-4a92-bb92-c71fb25522b9.