Repository navigation
Register agents.solution-architect in canary-rings.json (cross-repo prerequisite for .github-private#1631) #1078
Description
Cross-repo prerequisite for combsmith/.github-private#1631 — [Phase 4] Promote solution-architect past draft through the release rings, verifying propagation reached a consumer, the last open story of epic combsmith/.github-private#1627 — Onboard solution-architect as an addressable advisory persona (repo-local first cut).
Everything else in that epic is delivered. This registry entry lives here, not in .github-private, so dev-lead cannot make it from the other repo — it is the one remaining blocker, and it is why the story has sat open since 2026-09-03.
What is being asked
Add one agents.solution-architect entry to standards/canary-rings.json, per standards/persona-standards.md §6 step 2, so the persona can advance draft → next and soak the rings.
Current state (verified 2026-09-07)
agents.solution-architectis not incanary-rings.json(16 agents registered; neithersolution-architectnorqa-leadis among them).personas/solution-architect/persona.ymlon.github-privatemainis stillstatus: draft.- The persona is otherwise complete and working: manifest +
interaction.yml+prompts/solution-architect/advisory.md, thepetry-projects/solution-architectteam (closed, notifications disabled, 0 members), real held-out evals, a scored eval gate, and a live smoke test in which it citedADR-0001by number and caught two planted violations.
Read this before implementing — the entry does not fit the schema cleanly
Every one of the 16 registered agents has a reusable. solution-architect deliberately has none. It is served by the shared, convention-driven persona runtime: the persona-mention router (registered here) dispatches to persona-runner-reusable.yml in .github-private, which runs any persona that supplies a manifest plus prompts/<role>/advisory.md. That shared runtime is the entire reason onboarding a persona is now cheap; it also means there is no per-persona blob for the ring model to watch.
That matters because the rollout machinery is built around reusable blobs: canary-rollout.sh autocut cuts a version "when a reusable's blob on its host main HEAD differs from the current next candidate," and canary-rollout.sh drift reports *-reusable.yml files that are unregistered.
Relevant fact for whoever implements this: persona-runner-reusable.yml is currently not registered at all, while persona-mention-reusable.yml is registered as agents.persona-mention.
Recommendation
Register agents.solution-architect with host: petry-projects/.github-private and reusable: .github/workflows/persona-runner-reusable.yml — the reusable that actually executes this persona — mirroring agents.persona-mention's rings[] and gate block so ring membership and soak knobs stay consistent with the runtime that serves it.
Two consequences to write into the entry as comments rather than discover later:
- Autocut will not fire on this persona's own changes. Its behavior lives in
prompts/solution-architect/advisory.md, checked out at the pinnedagent_ref— a prompt-only change never moves the runner's blob. That is Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref .github-private#1592 — Script-only changes never reach the fleet, and it is precisely why the story does not treat a ring label as evidence of promotion.scripts/persona_reach_check.shin.github-privateis the compensating control: it separates routes-to from promoted and fails on the skew state. - This sets fleet precedent. Eight other personas are drafted behind the same shared runtime. If each later registers against the same reusable, several agents end up watching one blob — one change would cut several versions. Decide deliberately now rather than by accumulation.
If the maintainer prefers the alternative — that personas on a shared runtime inherit the runtime's rings and are not individually registered — that is defensible and arguably truer to the mechanism, but it is a standards change, not a config change: persona.schema.json requires canary.agent, and §6 step 2 requires the entry. In that case close this issue and raise the standards amendment instead; do not silently skip the registration.
Acceptance criteria
standards/canary-rings.jsoncontains anagents.solution-architectentry withhost,reusable,run_workflow,rings[], andgate, valid against the file's existing shape and consistent withagents.persona-mention's rings/gate.- The entry carries an inline
_noterecording (a) that this persona has no dedicated reusable and rides the shared persona runtime, and (b) that autocut will not fire on prompt-only changes, naming Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref .github-private#1592 and pointing atscripts/persona_reach_check.shas the compensating control. nextring membership ispetry-projects/.github-private(the dogfood ring), matchingagents.persona-mention.- JSON parses and any existing registry validation /
canary_rollout.batsremains green. - Do not flip
personas/solution-architect/persona.ymlhere — that file is in.github-privateand is the other half of [Phase 4] Promotesolution-architectpastdraftthrough the release rings, verifying propagation reached a consumer .github-private#1631. The two land together; the reach-check fails on the skew state (status pastdraftwith no registry entry), so this entry must merge first or with it.
Out of scope
Registering the other eight drafted personas; registering qa-lead; any change to persona-standards.md; the draft → next manifest flip and the ring soak (all in .github-private).
Parent epic: combsmith/.github-private#1627 · Blocking story: combsmith/.github-private#1631 · Standard: standards/persona-standards.md §6, §7
Activity
don-petry commentedon Sep 7, 2026
Dev-Lead Implementation Plan
Issue: #1078 — Register agents.solution-architect in canary-rings.json (cross-repo prerequisite for .github-private#1631)
Scope
Add one
agents.solution-architectentry tostandards/canary-rings.json, registered against the shared persona runtime (.github-private/.github/workflows/persona-runner-reusable.yml), mirroringagents.persona-mention's rings/gate, with an inline_notedocumenting the shared-runtime / no-dedicated-reusable and prompt-only-autocut consequences.Implementation Checklist
agents.solution-architecttostandards/canary-rings.jsonwithhost: petry-projects/.github-private,reusable: .github/workflows/persona-runner-reusable.yml,run_workflow: Persona Runtime(thepersona-runner.ymlcaller name — verified against.github-privatemain),rings[](next→ring0→ring1→stable) andgatemirroringagents.persona-mentionnextring =petry-projects/.github-private(the dogfood ring), matchingagents.persona-mention(AC Add coding standards & principles section to AGENTS.md #3)_noteper AC Add multi-agent isolation strategy using git worktrees #2: (a) no dedicated reusable — rides the shared persona runtime; (b) autocut will not fire on prompt-only changes — names.github-private#1592and points atscripts/persona_reach_check.shas the compensating controlpersonas/solution-architect/persona.yml(lives in.github-private; AC Add stacked PR strategy and Epic-level workflow guidance #5) or any other fileTests to Write
tests/canary_rollout.bats:canary-rings.json: solution-architect onboarded (shared persona runtime, no dedicated reusable, #1078)— asserts host, reusable, run_workflow, ordered rings,next=.github-private, gate consistent withpersona-mention(ring1->stable sample_min==1; no correctness/suspect blocks), and presence of the_notenaming #1592 +persona_reach_check.shTest Command
npx bats --print-output-on-failure tests/canary_rollout.bats(plusbash .dev-lead/scripts/dev-lead-lint.sh)don-petry commentedon Sep 7, 2026
Dev-Lead: Implementation Complete
Plan Execution
agents.solution-architecttostandards/canary-rings.json(hostpetry-projects/.github-private, reusable.github/workflows/persona-runner-reusable.yml,run_workflow: "Persona Runtime",rings[]+gatemirroringagents.persona-mention)nextring =petry-projects/.github-private(dogfood ring), matchingagents.persona-mention(AC Add coding standards & principles section to AGENTS.md #3)_notedocuments (a) no dedicated reusable / rides the shared persona runtime, and (b) autocut will not fire on prompt-only changes — names.github-private#1592and points atscripts/persona_reach_check.shas the compensating control (AC Add multi-agent isolation strategy using git worktrees #2)personas/solution-architect/persona.ymluntouched (it lives in.github-private; AC Add stacked PR strategy and Epic-level workflow guidance #5)- solution-architectto thecanary-rollout.ymlworkflow-dispatch agent enum (a registered agent MUST be dispatchable — this coupling is asserted by an existing bats test, so it is required to keep the registry validation green, AC Add workflow, environment, and orchestration guidance #4)Determination of
run_workflowVerified against
petry-projects/.github-privatemain:persona-runner-reusable.ymlis the shared runner; its caller is.github/workflows/persona-runner.ymlwhose display name isPersona Runtime— that is the workflow the gate samples on the ring tiers (the same "caller-stub name" conventionagents.persona-mentionuses with"Persona — Mention Router").Test Results
Files Changed
standards/canary-rings.json: +64 lines — newagents.solution-architectentry (purely additive; no existing lines modified). Entry'srings[]/gateare copied verbatim fromagents.persona-mention(Define the release soak standard (ring-promotion gate): time floor + traffic-scaled sample + health #548 gate defaults, standard next→ring0→ring1→stable model, no opt-in correctness/suspect/benign machinery)..github/workflows/canary-rollout.yml: +1 line —- solution-architectadded to the manual-dispatchagentchoice list (kept in agreement with.agents | keys).tests/canary_rollout.bats: +38 lines — new test asserting host/reusable/run_workflow, ordered rings,next=.github-private, gate consistency withpersona-mention, and the presence of the_notenaming#1592+persona_reach_check.sh.Notes
persona-mention), 2 ✅ (_note), 3 ✅ (next=.github-private), 4 ✅ (JSON parses; fullcanary_rollout.batsgreen), 5 ✅ (persona.yml not touched — it is the.github-private#1631half; this entry must merge first or with it sopersona_reach_check.shdoes not see the skew state).enum ↔ registryagreement test, so the one-linecanary-rollout.ymladdition is a required consequence of the registration, not extra scope.qa-lead,persona-standards.md, and thedraft → nextmanifest flip / ring soak (all in.github-private).don-petry commentedon Sep 7, 2026
Correction — this issue's premise was wrong
I wrote an incorrect instruction into this issue, and PR #1079 faithfully implemented it. Flagging before it is copied into eight more entries.
This issue told the implementer to record that "autocut will NOT fire on this persona's own prompt-only changes." That is false.
It was written from combsmith/.github-private#1592 — Script-only changes never reach the fleet without verifying that premise still held. It does not. Per #1019,
canary-rings.jsoncarries a fleet-defaultagent_ref_pathsof["scripts/", "prompts/", "personas/"], andcanary-rollout.sh_autocut_agentcuts when the reusable blob or any watched path changed.prompts/is watched, so a prompt-only change does cut.Empirical proof:
dev-lead— same host, same inherited paths — has 162 version tags and is at v139.8.0. Its reusable has not changed 139 times; watched-path changes drive nearly all of that.A second fact this issue did not account for:
persona-runner.ymlconsumes the runtime by local relative path (uses: ./.github/workflows/persona-runner-reusable.yml) and the reusable declares noagent_refinput — so no caller pins a persona channel tag at all.What this means for #1079
The entry is correct against this issue as written; the issue was wrong. Do not merge the
_noteas-is — it would assert something false in the fleet's single source of truth for rollout, and be copied eight more times.The full corrected problem statement, the verified evidence, and three options are in combsmith/.github-private#1688 — Decision: how should shared-runtime personas be represented in the canary ring model? That decision is being put to the
solution-architectpersona for an advisory, then to the maintainer. Holding #1079 until it resolves.don-petry commentedon Sep 7, 2026
Closing as not planned — the premise was wrong, and the corrected decision is ADR-0006 (approved in combsmith/.github-private#1688).
This issue asked for an
agents.solution-architectregistry entry. That registration should not happen: a shared-runtime persona has no dedicated reusable, no caller pins a per-persona channel tag, and per the amended standard a registered persona id is a defect, not a promotion.Superseded by combsmith/.github-private#1693 (ADR-0006) and #1082 (schema +
persona-standards.md§6/§7 in this repo). Implementation PR #1079 closed unmerged.My error, recorded so it is not repeated: I wrote the false autocut claim into this issue without verifying #1592's premise still held after #1019 added
agent_ref_paths.feat: implement issue #1078 — Register agents.solution-architect in c…
docs(adr): ADR-0006 — shared-runtime personas are not individually ri…