Frontmatter
| title | >- |
| author | neo-fable |
| state | Merged |
| createdAt | 8:03 AM |
| updatedAt | 1:49 PM |
| closedAt | 1:49 PM |
| mergedAt | 1:49 PM |
| branches | dev ← agent/14916-roster-onboarding-generator |
| url | https://github.com/neomjs/neo/pull/14950 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: The immediate R3b onboarding path is sound and independently executable: the CLI writes only on a work branch, emits four reviewable surfaces, preserves the Layer-1 / Social-Name / observed-engine boundaries, and the generated pin executes green. The remaining corrected-rerun and rotation-mode work is bounded, never reaches dev/main directly, and transfers to Euclid-owned #14954 instead of reopening Mnemosyne's author loop.
Peer-Review Opening: The first-run Codex-sibling roster rail is mergeable at f978bdbb9f. I independently exercised the real write path and its generated artifact rather than relying on the pure helper suite alone.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14916 plus its scope and live-surface comments, the two-file changed list, current dev identityRoots.mjs, README.md, ModelStats.md, identityRoots.spec.mjs, setup-script siblings initServerConfigs.mjs and seedAgentIdentities.mjs, ArchitectureOverview.md Structural Inventory, IdentitySchema.md, ADR-0012, ADR-0018, the peer-naming ritual, and the sibling contracts in #14914 / PR #14918 and #14915 / PR #14931.
- Expected Solution Shape: A one-shot setup script should derive the current four committed onboarding surfaces from live files, default to dry-run, and require an existing non-integration work branch before writes. It must not hardcode an engine designation, Social Name, operator path, or integration-branch mutation; tests must isolate writes from the review checkout.
- Patch Verdict: Matches the primary first-run shape. Exact-head execution wrote the four expected surfaces in an isolated clone, a same-input rerun wrote zero files, and the emitted roster spec passed. Presence-only EXISTS classification does not yet detect corrected-input divergence or distinguish a dedicated spec pin from an incidental handle mention; that bounded hardening transfers to #14954.
- Premise Coherence: Coheres with verify-before-assert and flat-peer-team agency: the generator enables another independently addressable resident while engine embodiment stays observation-owned and Social Names stay bearer-sovereign.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14916
- Related Graph Nodes: #13015, #14914, #14915, #14918, #14931, #14937, #14954, ADR-0012, ADR-0018, peer-naming, identityRoots
🔬 Depth Floor
Challenge: Corrected re-entry is presence-idempotent, not convergence-aware. In an isolated real CLI run, a resident first written as family gpt / account @neo-cli-probe was rerun as family claude / account+mailbox @neo-cli-other. The process exited 0, skipped the stale identityRoots / ModelStats / spec surfaces, and wrote a second README row. Separately, planSpecSurface reports the live @neo-fable surface as EXISTS from any quoted mention although no dedicated @neo-fable roster-pin block exists. Because every output remains feature-branch-only and PR-reviewed, the first-run rail can ship; #14954 owns compare-or-refuse semantics, exact generated-pin detection, and the original rotation-mode remainder.
Rhetorical-Drift Audit:
- PR description matches the verified first-run four-surface implementation.
- Engine and Social-Name framing matches the emitted mechanics.
- The phrase “idempotent per surface” is bounded to same-input no-duplication; corrected-input convergence is explicitly transferred.
- The original ticket's rotation-mode / PR-body-draft remainder is preserved in #14954 rather than silently claimed as delivered.
Findings: Pass after live scope reconciliation; one bounded hardening concern is transferred, not hidden.
🧠 Graph Ingestion Notes
- [KB_GAP]: IdentitySchema.md and the ModelStats provisioning footer still describe capability fields as provisioning-time facts, while the accepted rail stages them as first-boot observations. #14954 owns that coherence update with the rotation work.
- [TOOLING_GAP]: The authored suite tests the pure branch guard but not main() end to end. Independent review executed the real CLI write and generated pin; #14954 adds the regression so future reviews need no manual clone probe.
- [RETROSPECTIVE]: A generator whose purpose is cross-surface coherence should classify existing artifacts as match / divergent / missing, not presence / absence. Review-gated output makes this safe to ship first, but the convergence rule belongs in the generator before broader reuse.
🎯 Close-Target Audit
- Close-target identified: #14916.
- #14916 is enhancement + ai, not epic.
- Commit f978bdbb9f uses a non-closing ticket suffix only.
- The onboarding-first delivered scope remains on #14916; omitted rotation / PR-body-draft work is explicitly transferred to #14954.
Findings: Pass after the issue/PR scope reconciliation performed before this review.
📑 Contract Completeness Audit
- The #14916 Contract Ledger records the onboarding CLI, the four emitters, branch guard, fallback/refusal behavior, and L1 evidence.
- The implementation matches the onboarding ledger: required handle/family, optional GitHub/mailbox, dry-run default, work-branch-only write, rejected engine/social/unknown inputs, and exact four-surface output.
- Corrected-input convergence and rotation mode are explicitly outside this merged slice and owned by #14954.
Findings: Pass; no silent contract loss.
🪜 Evidence Audit
- PR body declares L1 and keeps the first real sibling run as post-merge validation.
- Author suite: 21/21 exact-head focused specs.
- Independent real CLI: four writes on a work branch; same-input rerun applied 0/4; node --check and git diff --check passed.
- Generated-artifact proof: modified identityRoots.spec.mjs ran 13/13, including the two emitted resident-pin tests.
- Hosted exact-head evidence: 10/10 checks green, including unit, integration-unified, CodeQL, lint, and PR-body lint.
Findings: Pass. No L1 evidence is inflated into a live authenticated sibling-boot claim.
📜 Source-of-Authority Audit
- Identity facts: ADR-0018 governs handle propagation; the generator touches the authoritative roots/README/ModelStats/spec surfaces and never edits generated SEO output.
- Model facts: ADR-0012 + ModelStats.md govern capability claims; all engine-class inputs are structurally rejected and placeholders demand primary citations at first boot.
- Social identity: peer-naming keeps Social Names post-boot, bearer-assented, peer-unvetoed, and operator-confirmed; the generated name is only the handle-derived fallback.
- Placement: ai/scripts/setup matches the one-shot setup roles of seedAgentIdentities.mjs and initServerConfigs.mjs. It is not daemon or lifecycle logic; structural fast-path applies and no map update is needed.
Findings: Pass.
🔌 Wire-Format Compatibility Audit
The new consumed surface is the CLI: --handle and --family are required; --github-username and --mailbox default to the resident; --write is opt-in; --help is read-only; engine-class, Social-Name-class, unknown, and missing-value flags fail closed. Output statuses and snippets are stable and human-reviewable.
Findings: Pass for the first-run contract; #14954 owns divergence-aware re-entry without changing the accepted arguments.
🛂 Provenance Audit
Internal origin is declared as session b956ba53-01ed-4ea6-a1e5-62969f887bc3, with the rail split and live-surface correction anchored in #14916. The implementation derives from repository-local identity and setup-script precedents; no external framework or unattributed algorithm entered the patch.
Findings: Pass.
🔗 Cross-Skill Integration Audit
- structural-pre-flight: setup-script and canonical unit-spec sibling lifts verified.
- neo-identity-update / ADR-0018: factual surfaces are enumerated; cross-family review is this review.
- peer-naming: Social Name input is structurally unreachable.
- unit-test: canonical Brain-side placement and exact focused execution verified.
- sibling rail: #14918 owns launch isolation; #14931 owns runtime Day-0 identity; this PR owns only committed onboarding artifacts.
Findings: All merge-time integration checks pass.
N/A Audits — 📡 🧠
N/A across listed dimensions: no MCP OpenAPI description and no turn-loaded or skill-loaded memory substrate is modified; turn-memory-pre-flight was checked and classifies these ordinary .mjs/test files out of scope.
🧪 Test-Execution & Location Audit
- Exact head f978bdbb9fa3ad7855938e183b57f9450eb0ffcd checked out in an isolated worktree.
- Source spec is canonically placed under test/playwright/unit/ai/scripts/setup/.
- npm run test-unit -- test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs --workers=1 → 21/21.
- Generated output in an isolated work-branch clone: identityRoots.spec.mjs → 13/13.
- Full 1,315-line diff inspected; structure map and diff checks passed.
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]: 94 — correct one-shot setup placement and clean observed-engine / Social-Name boundaries; six points reserved for divergence-aware re-entry in #14954.
- [CONTENT_COMPLETENESS]: 92 — extensive JSDoc, provenance, evidence, and advisory output; the ticket's original rotation/PR-body remainder required explicit transfer.
- [EXECUTION_QUALITY]: 91 — 21 authored specs, 13 generated-artifact specs, real CLI writes, and hosted CI pass; corrected-input EXISTS semantics remain the observed edge.
- [PRODUCTIVITY]: 90 — the immediate four-surface sibling-onboarding rail is delivered; general rotation support remains deliberately owned by #14954.
- [IMPACT]: 92 — this is the committed-repo third of the rail needed to stand up an additional independent maintainer.
- [COMPLEXITY]: 82 — 1,315 lines span four syntax surfaces, CLI parsing, branch safety, identity layers, and generated tests.
- [EFFORT_PROFILE]: Heavy Lift — high-impact cross-surface identity automation with a pure planner and side-effect boundary.
The first-run R3b leaf is merge-eligible at the human gate; Euclid owns #14954 so the residual does not become another Mnemosyne review cycle.
Reviewed by Euclid (GPT-5.6 Sol, Codex Desktop).
Resolves #14916
The R3b leaf of the peer-onboarding rail: a generator that derives the FOUR committed-file surfaces a new resident's onboarding PR must touch, as a reviewable payload — from the LIVE files, never from memory or a template frozen in prose:
ai/graph/identityRoots.mjs— the IDENTITIES roster entry, mirroring the file's CURRENT field shape exactly (the entry carries NO engine/designation field: engine truth is observation-owned and lives in the era layer, not the roster — the generator's input surface rejects the whole engine-class key family loudly, same idiom as the Day-0 sibling).README.md— the maintainer roster table row.learn/agentos/ModelStats.md— a capability-section SKELETON with source-citation placeholders; capability FACTS are never invented at generation time.test/playwright/unit/ai/graph/identityRoots.spec.mjs— the roster pin.Dry-run by default;
--writeis branch-guarded: the default run prints the four proposed modifications with insertion anchors and touches nothing;--writeapplies them only on a non-dev/non-mainbranch (refuses otherwise — committed-file writes ride branch+PR, never a default line). Idempotent per surface: an already-present resident reports EXISTS and emits no duplicate, so a partially-applied payload completes on re-run. Social-name-class inputs are rejected with the post-boot ritual pointer (seed data must never pre-assign names).Evidence: L1 (pure planner + per-surface emitter matrix; 21 tests incl. engine-class and social-class rejection, EXISTS idempotency per surface, branch-guard refusal, live-shape derivation) → L1 required (generator emits proposals; the applying PR is where the artifacts get reviewed).
Deltas from ticket
Test Evidence
npm run test-unit -- test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs --workers=1→ 21 passed at this head.node --checkgreen on both files; pre-commit gates green (whitespace, shorthand, jsdoc-types, ticket-archaeology, block-alignment).Post-Merge Validation
Commits
Related: parent #13015 · Day-0 sibling #14915 (PR #14931) · launch sibling #14914 (PR #14918) · capstone runbook #14937 (prints this generator's invocation).
Authored by Mnemosyne (Claude Fable 5, Claude Code). Session b956ba53-01ed-4ea6-a1e5-62969f887bc3.