Skip to content

feat(role-cards): director role cards become versioned registry artifacts (#806) - #811

Merged
aarontrowbridge merged 7 commits into
mainfrom
slice2-role-cards
Sep 6, 2026
Merged

feat(role-cards): director role cards become versioned registry artifacts (#806)#811
aarontrowbridge merged 7 commits into
mainfrom
slice2-role-cards

Conversation

@aarontrowbridge

Copy link
Copy Markdown
Member

Closes #806.

Slice 2 of the modes-first-class campaign: the four role cards (hypothesizer, experimenter, analyzer, implementer) become versioned repo sources owned by their mode bundles — seeded from the deployed staging artifacts with recorded provenance, digest-verified, doctor-convergent via the upgrade verb, with a revision-pinned parity fixture and a nightly pin-behind-HEAD check that files a chore issue on drift.

Verification (director-run, scrubbed env)

  • pnpm --filter amicode test2268 passed / 0 failed (47 skipped — 10 are this slice's named gate-skips pending the seed signature; each cited in the diff doc, none silent)
  • pnpm --filter amicode run test:smoke[smoke] PASS

The human gate (by design)

The seed diff is prepared and committed at docs/seed-gate/role-cards-seed-diff.md — signature block PENDING AARON. Zero flagged content is pinned; the 7 pending skips convert to adjudicated pins when SEED_GATE_SIGNED flips with the signature. This PR stays draft until the signature lands. The diff flags: implementer↔engineer merge-governance divergence (vault def auto-merges; shipped card forbids — recommended: repo wins, vault re-authoring follow-up); experimenter self-grading divergence (vault def grades+saves its own results; shipped card forbids); hypothesizer/analyzer have no vault counterpart (signature confirms or names a pin target).

For reviewer attention

Design of record: spec-20260905-063000-modes-first-class (D3, H2/H5). Campaign ledger: session-20260905-modes-first-class.

… bundle-owned sources (#806, D3)

The hypothesizer/experimenter/analyzer/implementer cards are seeded VERBATIM
from the live deployed staging artifacts on erlich (the only live copies — no
repo source existed for the director's casts; the #758 worker-card authoring
at the same paths never deployed and is superseded by the approved spec
spec-20260905-063000 D3). Provenance recorded in
agents/.seed-provenance.json; the seed is GATED — the human diff against the
engine-neutral vault definitions is prepared separately and parity content
pins block on Aaron's signature.

- role_cards.test.ts: seed integrity (repo bytes ≡ recorded hashes, or a
  recorded signed amendment), bundle ownership (manifests declare their
  roles; shared validator green), bundle staging materializes each card into
  roles/ byte-identical with receipt digests, tamper repair, and a
  structural floor (frontmatter, blocklist, cast-card sections — shape only,
  never flagged content)
- #761 overlay suite re-scoped to the post-D3 card set: librarian is the
  surviving overlay-tunable worker card (librarian-tuning fixture now covers
  all four method-class fields); multi-card and absent-target behaviors
  pinned on synthetic fixtures; the four role cards + directors carry no
  dispatch target
- staging/deploy comments updated: the registry is the source of record for
  the mode surfaces; flat agents/ staging remains opencode's discovery path
…suite (#806, D3, obligations O2/O8)

- docs/seed-gate/role-cards-seed-diff.md — the PREPARED diff for Aaron's
  signature (never signed by the implementing cast): each seeded card against
  its engine-neutral definition where one exists (implementer ↔ engineer.md,
  experimenter ↔ experimenter.md; hypothesizer/analyzer recorded as
  no-counterpart with nearest-kin notes), coherent anchors enumerated,
  divergences FLAGGED with the parity suite's keys verbatim, signature block
  PENDING
- test/fixtures/vault-agents/ — the engine-neutral definitions pinned at
  amicissimo 5c6a1cd0d5bd240e07f6bef6467986e2fb41d7a7 + pin.json carrying
  the revision and per-file digests (the fixture carries the vault revision
  it pinned; the pin is self-contained)
- role_cards_parity.test.ts — coherent overlap anchors pinned against BOTH
  the shipped card and the pinned fixture now; flagged content held as
  named skips citing the diff doc (a guard test breaks if a flag leaves the
  doc — no silent passes, no silent pins); the doc's signature status and
  the suite's SEED_GATE_SIGNED switch are coupled (flip both together);
  dormant post-signature pins assert the spec's direction of record (repo
  wins for shipped bindings)
…fter (#806, D3, H5)

The doctor-world builder gains realAgents: the fixture release tag carries
the REAL D3-seeded role cards byte-for-byte (a post-seed release), opt-in so
the pre-existing synthetic cells are unchanged. New convergence cells:

- a machine on a post-seed release still carrying the OLD deployed-only role
  artifacts (drifted bytes on both deployment roots and the deployed bundles'
  role components) reads STALE with every role card named in evidence — the
  honest pre-upgrade state — and reads CURRENT on both agent-cards records
  once the upgrade verb converges, with every roles/*.md component row
  current and the deployed cards byte-identical to the seeded sources
- a converged post-seed world starts CURRENT across both records and all
  role components (the stale-by-construction verdict resolved)
…#806, obligation O8)

- packages/extension/scripts/role_parity_check.mts — the deterministic
  check CLI: fixture integrity (committed fixtures vs the pin record),
  pin genuineness (the pinned revision is real history carrying the
  recorded bytes), and pin freshness (no pinned definition changed past
  the pin at the vault's ref — revision churn elsewhere in the vault is
  NOT drift; the definitions are the pin). Verdicts from revisions and
  digests, never prose; absent/unprobeable vault are honest named
  non-verdicts (exit 0), drift/integrity failures exit 1
- ops/role-parity/run-role-parity-check.sh — the nightly cadence wrapper
  (skill-freshness precedent): drift files exactly one chore issue
  'Role-card parity pin behind the vault (nightly)' in harmoniqs/amicode
  (exact-title searched, created once, commented on subsequent drifts),
  receipts into the upgrade-receipts journal, --dry-run as the testable
  seam; node resolved from the caller's PATH first (the hardcoded macOS
  ladder shadowed a linux server's node 12 with the same PATH-preprend
  pattern — fixed here) + a strip-types capability probe
- ops/launchd/co.harmoniqs.role-parity.plist — the cadence declaration
  (daily 04:45, after skill-freshness)
- test/ops/role_parity_orchestrator.test.ts — seven dry-run cells
  (current / drift / revision-churn-clean / fixture-mismatch /
  pin-orphaned / vault-absent / the REAL pin record through the CLI),
  gated on the runtime's TS-strip capability probed via NODE_OPTIONS

Live evidence (read-only, this machine): the real pin reads current —
the vault's origin/main moved past the pinned revision but no pinned
definition changed
@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: a5fda625-17c8-4177-81dd-945e81f8d6aa


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…ch+systemd targeting, A1–A4 (PR #811, #806)

B1 — the published parity fixtures failed the amended content policy's
per-line usage-vs-internals test (engineer.md's src/ module tree,
how-to-extend recipe, Complex Internals section, roadmap lines;
experimenter.md's literal internal host paths). The full-definition
fixtures are REMOVED from the repo and their parity pins are held as
named skips in the same gate mechanism as the flagged content: the pin
record (v2, fixture_publication=pending-signature) carries the vault
revision + digests as provenance WITHOUT content, the suite pins the
hold itself (fixtures asserted absent, publication field asserted), and
the nightly check verifies pin genuineness against the vault revision
directly — nothing from the vault definitions is published-verbatim or
pinned before Aaron's signature decides. The vault re-authoring follow-up
is recorded in the seed-diff doc as the recommended morning decision
(vault-side work, its own issue+PR — never edited from this slice).

B2 — the nightly check now runs on the machine it targets: the erlich
systemd pair ships (ops/systemd/co.harmoniqs.role-parity.{service,timer},
mirroring the hub's user-unit conventions), the launchd plist stays as
the macOS-secondary declaration, and the README/install targeting is
corrected (erlich runs the check). The wrapper passes --fetch to the
check CLI, which fetches the ref's remote before the freshness compare —
local remote-tracking refs only move when something fetches, so without
this the nightly compare ran against stale knowledge; a fetch failure
reads as the named unknown vault-unfetchable, never a green receipt. The
exit-2 nit is fixed: a pre-flight/runtime CLI failure appends a NAMED
check-failed receipt, never a malformed empty-status line. The
orchestrator suite proves the fetch is load-bearing (a remote drift is
invisible without it, caught with it), the named-unknown receipt, and
the check-failed receipt.

A1 — the coupling test now also asserts !SEED_GATE_SIGNED ⇒
provenance.amended !== true: an unsigned tree cannot claim an amendment.

A2 — the no-silent-pass guard is two-directional: every suite flag must
appear verbatim in the diff doc (as before), and every bold flag key in
the doc's flag sections (scoped — coherent-anchor quotes are not flags)
must have a suite FLAGGED entry.

A3 — post-signature conversion now enforced for all nine flags: the
three previously unenforced ones (scope perimeter, checkout discipline,
artifact contract) carry dormant it.skipIf(!SEED_GATE_SIGNED) pins with
the repo-wins direction inline — flipping the switch converts every
flag, not four of seven.

A4 — the skill-freshness linux PATH-bug follow-up is filed as
#813 (the bug, the role-parity wrapper's fix pattern,
the affected machines).

Gates (scrubbed env): amicode suite 2273 passed / 0 failed, smoke PASS,
typecheck clean. Live dry-run on erlich: status current, the fetch moved
origin/main eb5c460→5ce67f8 (load-bearing), pin genuineness green, the
B1 hold named in evidence.
@aarontrowbridge

Copy link
Copy Markdown
Member Author

Review verdict: CHANGES-NEEDED → all six findings folded (a007ac4). B1: the two full-definition fixtures are REMOVED — held pending-signature (pin v2 carries revision + digests as provenance without content; a live cell pins the hold itself; the vault re-authoring recommendation recorded in the seed-diff doc §5 for Aaron's morning decision). B2: the check now ships a systemd unit for the Linux vault-visible machine (launchd stays macOS-secondary), README/install targeting corrected, the wrapper fetches the ref before the freshness compare, a fetch failure reads a named vault-unfetchable receipt (never green), and the exit-2 nit reads a named check-failed receipt. A1–A3: the coupling test now forbids unsigned amendment claims, the no-silent-pass guard is two-directional, and all nine flags + three dormant cells convert on signature. A4: follow-up filed as #813. Director re-verified: 2273 passed / 0 failed, smoke PASS, typecheck clean. The PR stays DRAFT pending Aaron's seed signature — by design, twice over now (the gate, and the fixture hold). Delta re-review in flight.

…— the gate flips, the adjudicated pins go live, the fixture hold continues by re-authoring decision (#806)
@aarontrowbridge

Copy link
Copy Markdown
Member Author

The seed gate is SIGNED — Aaron's signature recorded (accept-seed, by chat directive "do as you rec", 2026-09-05; the directive is the human decision and the doc's Signature section says so plainly). The switch flipped with it (3f71189): the adjudicated pins are LIVE — implementer stays merge-free (repo wins on the governance divergence), experimenter stays grade-free (repo wins), no-counterpart confirmed for hypothesizer + analyzer, the A3 triple converts inline. The fixture publications remain held by decision, not unsignedness: the signed choice was VAULT RE-AUTHORING FIRST, so the pin reads pending-re-authoring (the third publication state — the CLI + orchestrator widened for it), the amicissimo re-authoring issue files next, and the fixtures re-take at the re-authored revision. The nightly pin check covers the interim. Delta-verified: full suite 2279/0, smoke PASS, typecheck clean, CI green.

@aarontrowbridge
aarontrowbridge marked this pull request as ready for review September 6, 2026 00:24
@aarontrowbridge
aarontrowbridge merged commit 56fcaee into main Sep 6, 2026
9 checks passed
@aarontrowbridge
aarontrowbridge deleted the slice2-role-cards branch September 6, 2026 00:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Slice 2: director role cards become versioned registry artifacts (human-gated seed)

1 participant