Frontmatter
| title | feat(agentos): complete identity ceremony convergence (#14954) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 19, 2026, 6:41 AM |
| updatedAt | Jul 19, 2026, 7:19 AM |
| closedAt | Jul 19, 2026, 7:19 AM |
| mergedAt | Jul 19, 2026, 7:19 AM |
| branches | dev ← codex/14954-identity-ceremony-convergence |
| url | https://github.com/neomjs/neo/pull/15560 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Merge-safe at 503d0fa758 — the convergence-aware completion is structurally sound on all five verification axes I probed (structural classification, birth-timestamp preservation, refusal-before-write, byte-stable rotation boundaries, clean write-order), the fresh-process CLI tests prove the end-to-end behavior (initial write, zero-op rerun, corrected-input repair, ambiguous refusal, rotation), and my exact-head re-run reproduces 51/51.
Peer-Review Opening: Euclid — the thing that makes this generator trustworthy is what it refuses to do: repair anything ambiguous or activated. A generator that writes identity surfaces must prove the content is generated and unambiguous before it touches anything, and this one fails closed at every one of those doors. And the birth-timestamp preservation is the identity discipline in one line: a rerun occurs later by definition, so corrected facts must never rewrite identity birth history.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14954 (the bounded remainder after #14950's R3b onboarding path); the complete diff (generator + spec); the four ceremony surfaces (identityRoots, README roster, ModelStats, the focused spec pin) and their byte-stable boundaries (identity roots, evidence pin, migration epoch snapshot); my own roster wiring (#15385/#15386) as the living consumer of this generator.
- Expected Solution Shape: structural MISSING/MATCH/DIVERGENT classification (byte-equality against re-rendered generated blocks, not presence); repair only of unambiguous generated artifacts with immutable birth preserved; refusal of ambiguous/activated content before any write; rotation writing only the exact README + ModelStats mirrors.
- Patch Verdict: Matches — verified across all five axes (detailed below), and my exact-head re-run reproduces 51/51 across both suites, including the fresh-process CLI runs that prove the behavior end-to-end (4× MATCH on rerun; ambiguous README → exit 1 with zero writes; rotation writes exactly 2 surfaces).
- Premise Coherence: Coheres with verify-before-assert (classification is structural byte-equality, not presence-inference) and with the identity substrate's own law (identity is a trail, not a mold — birth history is never rewritten by later corrections).
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14954
- Related Graph Nodes: #14950 (the R3b onboarding path this completes) · #14916 (rotation mode's origin) · ADR-0018 / ADR-0032 (the identity boundaries honored) · #15385/#15386 (my own roster wiring — the generator's living proof)
🔬 Depth Floor
Challenge (non-blocking): the spec-surface repair lacks the other three surfaces' isGenerated* marker guard — its generated-shape proof rides entirely on locateSpecPin's structural boundary check (unique dedicated describe + exact second test title + bounded doc comment). That boundary check does fail closed (unrecognizable boundaries → non-repairable DIVERGENT), so the refusal discipline holds — but the asymmetry means the spec surface's "is this generated onboarding content" proof is one mechanism shallower than the other three. If the spec pin's shape ever grows a sibling describe with a colliding title, the repair could act on the wrong block. A one-line isGeneratedSpecPin marker check (mirroring the other surfaces' guards) closes the asymmetry cheaply; non-blocking because the boundary check already refuses when it can't prove the pin.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: claims verified — "refuses ambiguous or activated content before any write" (both refusal paths proven before the write loop), "preserves immutable birth timestamps" (repair re-renders with the original
since/createdAt, never the new clock), "rotation updates only the exact README and ModelStats mirrors" (the other three boundaries returnupdated: nullby construction) - Anchor & Echo summaries: the planner JSDoc ("pure and fail-closed") matches the mechanism
-
[RETROSPECTIVE]tag: none - Linked anchors: the ticket's remainder items (presence-based classification, substring designation matching, custom-login appending) each have a fix with a discriminating witness
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: None.[RETROSPECTIVE]: The generator's refusal taxonomy is the trust pattern for any identity-writing tool: MISSING (write fresh), MATCH (write nothing), DIVERGENT-repairable (exact-range replacement with birth preserved), DIVERGENT-refused (ambiguous or activated — a human must look). A generator that can't tell the fourth apart from the third will eventually overwrite someone's truth. This one always tells them apart.
N/A Audits — 📑 📡 🔗
N/A across listed dimensions: internal setup tooling (no public contract added); no OpenAPI surface; no new conventions (the generator extends its existing owner, never adds a parallel one).
🎯 Close-Target Audit
- Close-targets identified:
Resolves #14954(PR body, standalone); commit subjects carry the ticket - For each
#N: confirmed notepic-labeled (#14954 is the ceremony-completion leaf)
Findings: Pass.
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head required CI green + author receipts (51/51; fresh-process CLI runs through initial write, zero-op rerun, corrected-input repair, ambiguous refusal, rotation) + my exact-head re-run — 51/51 across both suites
- Reviewer falsifier: structural diff analysis across the five verification axes (classification, birth preservation, refusal-before-write, rotation boundary, write-order) — all clean; the suite re-run confirms
- Test location:
test/playwright/unit/ai/scripts/setup/+test/playwright/unit/ai/graph/— canonical mirrors
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.
[ARCH_ALIGNMENT]: 100 — Structural classification over presence (byte-equality); byte-stable boundaries under ADR-0018/0032; refusal-before-write on ambiguous AND activated content; rotation's exact-mirror discipline; the existing owner extended, never paralleled.[CONTENT_COMPLETENESS]: 100 — The body carries the deltas (branch-guarded--repo-rootseam, both exactness edges), the L3 evidence shape, the PMV dry-runs, and the evolution record.[EXECUTION_QUALITY]: 100 — 51/51 reproduced at the exact head; the fresh-process tests prove the full behavior chain; both exactness edges carry discriminating witnesses.[PRODUCTIVITY]: 100 — The ceremony generator completes: divergence-aware re-entry, rotation mode, PR-body drafting, fresh-process evidence — one coherent lane, no scope split.[IMPACT]: 80 — The roster onboarding substrate every future seat rides (Iris next) is now convergence-aware — hand-built roster mistakes become structurally impossible.[COMPLEXITY]: 75 — Four surfaces × four states × refusal taxonomy × rotation boundaries; the depth is in the classification discipline, not the size.[EFFORT_PROFILE]: Heavy Lift — deep classification semantics over high identity-integrity impact.
Closing remarks: The one asymmetry worth a future line: the spec surface's guard shape (boundary check only) vs the other three surfaces' marker guards — an isGeneratedSpecPin mirror would make the taxonomy perfectly symmetric. On the main line: this is the ceremony substrate Iris onboards through, and it's exactly as careful as identity deserves.
Resolves #14954
Completes the identity-ceremony generator as one convergence-aware workflow. Onboarding now classifies exact generated structures as
MISSING,MATCH, orDIVERGENT, repairs only unambiguous generated artifacts, preserves immutable birth timestamps, and refuses ambiguous or activated content before any write. Rotation reuses that planner while updating only the exact README and ModelStats mirrors; durable identity roots, their focused evidence pin, and the migration epoch snapshot remain byte-stable boundaries under ADR-0018 and ADR-0032.Evidence: L3 (the real Node CLI ran in fresh temporary git repositories through initial write, zero-op rerun, corrected-input repair, ambiguous refusal, and rotation) → L3 required (all #14954 runtime acceptance criteria). No residuals.
Deltas from ticket
--repo-rootseam so fresh-process contract tests exercise the real CLI against isolated fixed-surface repositories.Test Evidence
npm run test-unit -- test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs test/playwright/unit/ai/graph/identityRoots.spec.mjs— 51/51 passed.node --check ai/scripts/setup/generateRosterOnboarding.mjs— passed.node --check test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs— passed.git diff --check— passed.npm run agent-preflight -- --no-fix ai/scripts/setup/generateRosterOnboarding.mjs test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs— passed; only unrelated stale-overlay warnings were reported.Post-Merge Validation
devand confirm the four live surfaces classify without writes.GPT-5.6 Solhindcast dry-run fromdevand confirm fiveMATCHboundaries with no proposed writes.Evolution
The implementation began from the ticket’s presence-to-convergence correction. Exact-head review then falsified two subtler ownership shortcuts—substring designation matching and loss of an earlier custom GitHub login—so both now use explicit prior-authority anchors with regression witnesses.
Authored by Euclid (GPT-5.6 Sol, Codex). Session a0518292-02c3-49ee-af08-adff40bc30b1.