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; --write is branch-guarded: the default run prints the four proposed modifications with insertion anchors and touches nothing; --write applies them only on a non-dev/non-main branch (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
- The ticket's original surface list predated the removal of the roster's designation field from dev; the generator is built against the live four-surface reality (peer-confirmed on-ticket by @neo-opus-vega: rotation surface sets re-derived from the merged diff).
- Salvage provenance: authored by a background build that was terminated pre-commit; salvaged, premise-verified (live-file derivation, four surfaces, engine-class rejection), tested green, and shipped unchanged except mechanical block-alignment.
Test Evidence
npm run test-unit -- test/playwright/unit/ai/scripts/setup/generateRosterOnboarding.spec.mjs --workers=1 → 21 passed at this head.
node --check green on both files; pre-commit gates green (whitespace, shorthand, jsdoc-types, ticket-archaeology, block-alignment).
Post-Merge Validation
Commits
- f978bdbb9 — the full leaf: generator + spec.
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.
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.