Repository navigation
[Phase 4] Promote solution-architect past draft through the release rings, verifying propagation reached a consumer #1631
Copy link
Copy link
Closed
Labels
dev-leadFor dev-lead agent pickupFor dev-lead agent pickupinitiativeEpic / initiative tracking issueEpic / initiative tracking issue
Description
Story
As a maintainer,
I want flip solution-architect from draft through next → ring0 → ring1 → stable behind the green scored eval gate, and confirm the promotion actually reached a consumer,
so that solution-architect becomes the first of eight personas to leave draft, breaking the 8-for-8 stuck-at-draft pattern — and it does so verifiably, not on a ring label alone.
Acceptance Criteria
personas/solution-architect/persona.ymlstatusadvancesdraft → next, and theagents.solution-architectentry is registered incanary-rings.json.- The persona soaks
next → ring0 → ring1 → stable, with S3's scored eval gate green as the precondition forstable(persona-standards §7 Definition of Done). - The Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 propagation hazard is resolved OR explicitly routed around: because solution-architect is mention-routed via the shared
persona-mentionchannel (no dedicated reusable blob), the story documents which path applies and does not silently rely on a ring label moving. - Propagation is VERIFIED against a real consumer — a concrete check that the promoted behavior actually reaches a consumer (e.g. a live mention resolves to the promoted persona), not merely that the ring label advanced.
- The promotion does not introduce any new trigger surface (still mention-routed only) — no
pull_request: synchronize, no cron, no fan-out added during promotion.
Tasks / Subtasks
- Advance
statustonextand registeragents.solution-architectincanary-rings.json(org-repostandards/— coordinate the cross-repo change as qa-lead/security-lead would). (AC: test issue from agent #1) - Soak through the rings to
stable, gatingstableon S3's scored eval green. (AC: Go-live improvements for PR review agent #2) - Determine and document the Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 posture (resolve vs route-around via persona-mention) and add an explicit propagation-reached-a-consumer verification step. (AC: Add @claude delegation, auto-merge, and rebase handling #3, Optimize review: small-PR and incremental fast paths #4)
- Confirm no new trigger surface was added during promotion. (AC: feat: add Copilot engine support via REVIEW_ENGINE toggle #5)
Dev Notes
- This is the story that breaks 8-for-8 draft (§5). Promotion is INSIDE this epic by design — if solution-architect cannot clear the scored gate, that is a finding worth having, not a reason to leave it at draft.
- The Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 hazard: autocut cuts a new channel version only when a REUSABLE's blob changes, but all agent behavior lives in
scripts//prompts/checked out at the pinnedagent_ref— a prompt-only change can merge, close its issue, advance the scoreboard, and propagate to nobody (five merged fixes are in exactly that state). solution-architect's advisory logic IS a prompt file. Mitigation: because this cut is mention-routed via the sharedpersona-mentionrouter (which the router already owns and cuts), route via that channel rather than a dedicated reusable — but VERIFY a live mention actually invokes the promoted persona, do not trust the ring label (§3b, learning 12). - The
canary-rings.json(and optionalagent-rate-limits.json) registries live in the org repopetry-projects/.githubunderstandards/, perpersonas/security-lead/persona.yml'scanary.registrypointer — registration is a cross-repo change, coordinated the way other personas register. This is surfaced in the epic's untracked_prerequisites. - Definition of Done is persona-standards §7: eval gate green before
stable. Mirror the soak shape of qa-lead's [persona-runtime soak] qa-lead mention smoke test #1300 mention smoke test for the consumer-reached verification. - Do NOT wire
pull_request: synchronizeor any cron here — that is exactly what would turn an advisor into a queue (§7 of the body, learning 11). Promotion changes status/rings only, not trigger surface.
Project Structure Notes
Edits personas/solution-architect/persona.yml (status + canary block) and the org-repo standards/canary-rings.json registry (cross-repo). No trigger-surface changes. Verification reuses the mention path served by the shared router.
References
- personas/security-lead/persona.yml#canary, personas/security-lead/README.md (promotion checklist)
- petry-projects/.github standards/canary-rings.json (ring registry, cross-repo)
- petry-projects/.github standards/persona-standards.md §7 (DoD)
- Issue Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 (open: script-only changes never reach the fleet)
- Issue [persona-runtime soak] qa-lead mention smoke test #1300 (qa-lead mention smoke test — soak shape)
- Discussion Architectural integrity in the agentic delivery model — what enforces our standards, and where does the Solution Architect fit? #1360 §3b, §5, §7 S4, §8 learning 12
Story prepared by the BMAD Scrum Master (Bob) for epic #1627. Status: ready-for-dev.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
dev-leadFor dev-lead agent pickupFor dev-lead agent pickupinitiativeEpic / initiative tracking issueEpic / initiative tracking issue
Activity
solution-architectas an addressable advisory persona (repo-local first cut) #1627don-petry commentedon Sep 2, 2026
Dev-Lead Implementation Plan
Issue: #1631 — [Phase 4] Promote
solution-architectpastdraftthrough the release rings, verifying propagation reached a consumerScope
Route-around the #1592 propagation hazard for the mention-routed
solution-architect, add a re-runnable consumer-reached / no-new-trigger-surface verification, and record the exact sequencing blocker on thedraft → nextflip — rather than flip the ring label ahead of its registration and ship a hollow green.Key finding (surfaced in Phase 1, blocks AC #1/#2 in this repo)
statuspastdraftmakesvalidate-personas(lint.yml) require anagents.solution-architectentry in the cross-repopetry-projects/.github/standards/canary-rings.json.petry-projects/.github@main(verified: registry currently registers dev-lead, pr-review-mention, persona-mention, … but not solution-architect), and it cannot be authored from.github-private.statusin this PR alone turnsvalidate-personasred post-merge — the exact channel-skew / hollow-green class (fix(ci): prevent channel-skew workflow breakage — guard forwarded inputs vs pinned refs + codify the pinning rules (post-#1034) #1052/[bug] dev-lead posts a detailed 'Completed' claim before the work is durable, and never retracts it on timeout — #1407 reads as delivered but produced nothing #1445) this epic exists to prevent. The registration is the epic's untracked cross-repo prerequisite and must land first (§6 step 2). This PR therefore does not move the ring label; it lands the route-around + verification and records the sequencing.Implementation Checklist
scripts/persona_reach_check.sh— hermetic verification guard: (a) assertssolution-architectis served by the sharedpersona-mentionrouter and adds no trigger surface beyond it (nopull_request: synchronize, no cron) [AC feat: add Copilot engine support via REVIEW_ENGINE toggle #5]; (b) separates "routes-to" from "promoted" (learning 12) and reports promotion state fromstatus[AC Optimize review: small-PR and incremental fast paths #4].personas/solution-architect/README.md— document the Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 route-around (sharedpersona-mentionchannel, no dedicated reusable blob) [AC Add @claude delegation, auto-merge, and rebase handling #3], the S3 scored-eval-gate precondition forstable[AC Go-live improvements for PR review agent #2], the live consumer-reached verification [AC Optimize review: small-PR and incremental fast paths #4], the no-new-trigger-surface invariant [AC feat: add Copilot engine support via REVIEW_ENGINE toggle #5], and the cross-repo registration sequencing blocker on thedraft → nextflip [AC test issue from agent #1]..github/workflows/lint.yml— register the new bats test in the existingbatsjob list (no new workflow / no cron).Tests to Write
tests/persona_reach_check.bats— pure-logic units: mention-only surface accepted; aschedule/pull_request: synchronizeaddition rejected [AC feat: add Copilot engine support via REVIEW_ENGINE toggle #5];draft⇒promoted=falseeven when routing wiring is present (routes-to ≠ promoted) [AC Optimize review: small-PR and incremental fast paths #4].Test Command
bats tests/persona_reach_check.bats(full: thebatsjob list in.github/workflows/lint.yml) plusbash .dev-lead/scripts/dev-lead-lint.shdon-petry commentedon Sep 2, 2026
Dev-Lead: Progress (in progress — not yet durable)
Key scoping decision (intent)
The
draft → nextstatus flip is deliberately not made in this workspace.validate-personasfetches the cross-repopetry-projects/.github/standards/canary-rings.jsonand hard-fails any non-
draftpersona with noagents.<id>entry. That entry doesnot exist on
petry-projects/.github@main(checked: the registry lists dev-lead,persona-mention, … but not solution-architect) and cannot be authored from this
repo. Flipping
statushere alone would turnvalidate-personasred post-merge — theskew / hollow-green class (#1052/#1592) this epic exists to prevent. So this change
lands the route-around + a re-runnable consumer-reached verification and records the
exact register-first sequencing, rather than moving a ring label ahead of its
registration.
Plan Execution (intended, this workspace)
scripts/persona_reach_check.sh(+tests/persona_reach_check.bats)that asserts the persona stays mention-only (no new trigger surface) and separates
routes-to from promoted — it fails only on the skew state (status past draft with
no cross-repo registration).
shape), the scored-eval-gate precondition for
stable, and the register-firstsequencing in
personas/solution-architect/README.md.batsjob in.github/workflows/lint.yml(no new workflow, no cron, no trigger-surface change).
Files touched (this workspace, not yet pushed)
scripts/persona_reach_check.sh(new): consumer-reached / no-new-surface guard.tests/persona_reach_check.bats(new): pure-logic units for the guard.personas/solution-architect/README.md: Script-only changes never reach the fleet: autocut watches the reusable blob, but agents execute scripts/ pinned at agent_ref #1592 posture, verification, sequencing..github/workflows/lint.yml: register the new bats test.Notes
are blocked on the untracked cross-repo registration prerequisite; the correct order
is register-first (documented). AC Add @claude delegation, auto-merge, and rebase handling #3/Optimize review: small-PR and incremental fast paths #4/feat: add Copilot engine support via REVIEW_ENGINE toggle #5 (route-around posture, consumer-reached
verification, no-new-trigger-surface) are addressed in-repo.
don-petry commentedon Sep 2, 2026
Dev-Lead: Implementation Complete — PR #1664
The implementation for issue #1631 is durable: commits are pushed and a pull request is open. This record is backed by verifiable artifacts you can confirm in one click.
solution-architectpastdraftthrough the release rings, verifying propagation reached a consumer #1664bd8f262da4e1112fe33cb49064e68c4676ded1cdReview happens on the PR. Acceptance criteria and test results are evidenced by the PR's diff and CI checks — not asserted here. If a later stage fails, this claim is retracted in place.
feat: implement issue #1631 — [Phase 4] Promote `solution-architect` …
don-petry commentedon Sep 7, 2026
Blocked on a cross-repo prerequisite — combsmith/.github#1078
Raised combsmith/.github#1078 — Register agents.solution-architect in canary-rings.json (cross-repo prerequisite for .github-private#1631) to unblock AC #1 of this story.
Why this story has been open since 2026-09-03. PR #1664 merged and delivered AC #3 (propagation posture) and AC #4 (
scripts/persona_reach_check.sh+ bats). It did not deliver AC #1 (draft → next+ registry entry) or AC #2 (the ring soak) — becausecanary-rings.jsonlives inpetry-projects/.github, and dev-lead cannot reach it from this repo. Verified today:agents.solution-architectis absent from the registry andpersonas/solution-architect/persona.ymlis stillstatus: draft.The two halves must land together. The merged reach-check deliberately fails on the skew state — status past
draftwith no registry entry — so flipping the manifest here before the registry entry exists would turn CI red. That is the design working as intended, not an obstacle.A design question surfaced while writing it, and it is worth a maintainer read. All 16 registered agents have a
reusable;solution-architectdeliberately has none, because it rides the shared persona runtime (persona-mentionrouter →persona-runner-reusable.yml). The ring model watches reusable blobs, so a persona with no blob does not fit the schema cleanly. #1078 carries the recommendation (register againstpersona-runner-reusable.yml, which is currently unregistered) and names the alternative (personas on a shared runtime inherit the runtime's rings — defensible, but a standards change rather than a config change). It also flags that whichever way this goes sets precedent for the other eight drafted personas.Once #1078 merges, the remaining work here is the
draft → nextflip, thenext → ring0 → ring1 → stablesoak, and running the scored eval gate — which has never actually been run against this persona, so its score is still unknown.don-petry commentedon Sep 7, 2026
AC #1 and AC #2 are superseded by ADR-0006 — and AC #1 is unimplementable as written
Maintainer approved Option C in #1688 on 2026-09-07. Two of this story's acceptance criteria no longer describe the intended outcome, and one of them could never have passed. Recording here rather than silently reinterpreting them.
AC #1 —
statusadvancesdraft → next, andagents.solution-architectis registered incanary-rings.jsonBoth halves change.
nextis not a legal status.persona.schema.json's enum isdraft|canary|ring0|ring1|stable|retired— there is nonext, even though the registry channel andpersona_reach_check.sh'sPRC_RING_ORDERboth use that word. I verified by validating a real manifest at each value:status: nextfails schema validation. This AC could not have passed as literally written, independent of ADR-0006. The correct first step past draft iscanary.AC #2 — soaks
next → ring0 → ring1 → stableThere is no per-persona channel tag to stage (
persona-runner.ymluses a local relative path, noagent_ref). Ring staging for personas is thepersona-mentionrouter's, not this persona's. Promotion evidence isscripts/persona_reach_check.shplus an observed live mention — which #1634 already demonstrated once.AC #3, #4, #5 stand unchanged
They are, if anything, load-bearing now: with rings out of the picture the reach check is the sole automated promotion gate, exactly as ADR-0006's Consequences section states.
Remaining work on this story
personas/validate-personas.py— drop the non-draft-must-be-registered invariant for shared-runtime personas.scripts/persona_reach_check.sh+ bats — invert the skew rule ("status past draft, unregistered" becomes the normal state, not the failure).personas/solution-architect/persona.ymltostatus: canary, remove its now-forbiddencanaryblock, and run the scored eval gate — which has still never been run against this persona.Blocked until #1693 and combsmith/.github#1082 merge, since 1 and 2 must cite an accepted ADR rather than anticipate one.
fix(personas): unbreak validate-personas — drop canary blocks per ADR…
feat(personas): invert the reach check per ADR-0006 and promote solut…
don-petry commentedon Sep 7, 2026
Delivered —
solution-architectis promoted pastdraftPR #1705 merged. Verified against
mainjust now, not asserted:This is the first of nine personas to leave
draft— the outcome the epic put promotion inside the scope to achieve, after eight prior onboardings each deferred it.AC disposition
persona_reach_check.sh+ the live mention in soak #1640surface_mention_only: true, enforced by the guardAC #1 could never have passed as written.
persona.schema.json's status enum isdraft|canary|ring0|ring1|stable|retired— there is nonext, though the registry channel andPRC_RING_ORDERboth use that word.status: nextfails schema validation. The persona is atcanary, the legal first step past draft. That vocabulary mismatch is pre-existing, is now pinned by a test, and deserves its own decision — filed separately, not silently reconciled.What is deliberately NOT done
stablerequires the scored eval gate (evals.required_before: stable), and the scored eval has never been run against this persona.canaryis a legitimate resting state. Running it is the next real step, and if it scores below threshold that is a finding worth having — the answer would be improving the advisory prompt, not lowering the bar.Closing as delivered.