Repository navigation
Replies: 2 comments
Refresh + scoped first cut — 2026-08-31Read this as an amendment to the body above, not a replacement. The Q0–Q13 decisions stand; nothing here reopens them. But they were recorded on 2026‑07‑22/23. Five weeks on, four of their factual premises have moved, one premise has silently failed, and two hard CI gates that did not exist then now bind any new agentic role. This comment corrects the base, records what changed, and — most importantly — scopes the initiative that (Handles below are written without the 0. Scope for the planner — read this before decomposing
Phases A, C, F, G and the fleet-wide half of B stay in this Discussion for later cuts. Do not create stories for them. Full in/out list in §7. 1. Corrections to the factual baseEvery row verified live on 2026‑08‑31.
2. The premise that silently failed — Q6
#1043's initiative (#1148) closed 2026‑07‑16 — six days before Q6 was recorded. It did not land as a detector-agnostic engine. So Q6's precondition is not merely unmet — it is unmeetable as written. The thing that was supposed to land first had already landed, differently. Consequence for Phase F: it must either (a) build the shared engine itself and retrofit the three existing detectors, or (b) accept a fourth sibling and drop the shared-engine claim. That is a real decision Q6 assumed away. Out of scope for this cut — flagged here so it is not discovered at F's planning time. 3. Two hard gates that did not exist on 2026‑07‑23a. The agentic interaction model is now CI-enforced (#1402, delivered 2026‑08‑01/02)
Every role now carries a machine-readable contract ( Consequence for Phase E: Second consequence, worth stating plainly — qa-lead's contract says so in its own header: the contract records what is deployed, not what is aspired to. So the manifest's declared surfaces must be trimmed to what the router actually wires. qa-lead declares seven surfaces; five of them dispatch nothing (persona-standards finding 10 / combsmith/.github#755). b. Script-only changes never reach the fleet (#1592, OPEN)Autocut cuts a new channel version when a reusable's blob changes. All agent behaviour lives in Consequence for the promotion story: 4. Phase E got materially cheaper — the cost objection is already paid§5E priced the separate-agent choice as "more infrastructure than one registry row (caller stub + reusable + release channel, per persona-standards §6) — this is the cost… paid once." That bill has already been paid, by someone else. Since this thread was written the persona runtime shipped, and it is convention-driven: one shared router ( The cost curve across the three personas onboarded on that path is the evidence:
Three onboardings, and the third cost one commit and two review rounds. This is the strongest argument yet for Q3's separate-agent choice: the thing that made it expensive stopped being expensive. A dedicated stub/reusable/channel is now needed only if One more free win: no vendoring story is required. 5. The failure mode this initiative must not repeatEight personas. All
The aggregate of eight locally-correct deferrals is eight manifests and zero promoted personas — precisely what §4 of the body warns about ("a persona that only exists as a manifest changes nothing"), now at 8×. And the gate that does exist is weaker than it looks: qa-lead's held-out set is 6 synthetic placeholder cases. It clears a count. There is no scorer wired, so nothing has ever measured whether qa-lead's advice is any good. Therefore: promotion is a story inside this epic, not a follow-up after it. If 6. One correction that is architecture-specific, not persona-genericqa-lead works as a thin wrapper because §2 of the body already names the mechanism exactly: an agent with no architecture-of-record reverse-engineers intent from the code, and "a drifted codebase teaches the planner its drift." A Hence the ADR seed is in this cut and it blocks the persona, rather than being deferred to Phase B. Repo-local to 7. Scope for
|
|
📋 Initiative planned by the BMAD Scrum Master (Bob). Epic #1627 — Onboard 7 stories created (inert — labelled
Review the epic and its sub-issue DAG, adjust as needed, then add |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
The problem
We have an agentic delivery model that is very good at making changes correct, safe, and consistent, and has no mechanism at all for keeping them structurally sound. Every gate we own asks "is this change right?" — none asks "is the shape of the system after this change still right?"
That asymmetry has a name in the wild: enshittification. In a codebase it looks like this — every individual PR is defensible, every CI check is green, every review is approved, and eighteen months later nobody can change anything without touching nine files. Nothing ever failed. The system just quietly got worse, one locally-optimal merge at a time.
We are running ~223 PRs/month through this pipeline in
.github-privatealone, most of it agent-authored. If there is a structural ratchet in our loop, it is turning fast.And gates alone cannot fix this. Every mechanism in A–E below is an inbound gate — it judges a change on its way in. A perfect set of inbound gates gets you exactly one thing: entropy stops increasing. Every structural compromise already merged stays merged, forever, because nothing in the system is ever tasked with going back for it. Holding the line at today's quality is not the goal — today's quality is the thing we're complaining about. That is why Phase F (continuous refactor) is not an optional extra at the end of this list; it is the only proposal here that pays debt down rather than capping its rate of growth.
1. What we have defined
Real, and better than most orgs have:
AGENTS.mdcarries ~160 lines of architectural doctrine — SOLID, CLEAN, DRY ("three instances before you extract"), DDD (bounded contexts, aggregate roots, repository pattern), KISS, YAGNI, Separation of Concerns (layered architecture, dependencies point inward, no framework bleed), Breaking Changes (a full protocol with a per-layer table and 9 agentic directives), and Code Organization.AGENTS.md§"BMAD Method — Spec-Driven Development" requires every repo to produce planning artifacts in_bmad-output/planning-artifacts/, explicitly including an Architecture doc ("technical decisions, component design, data model"), and to runbmad-check-implementation-readinessbefore a sprint..github-private/AGENTS.mddocuments ~310 lines of repo-local structural rules — the thin-caller/reusable tier, the channel-tag release model, the rubric-registry contract ("add a manifest row; do not fork the reviewer").What's missing from the definitions
standards/has 11 documents — CI, agents, CODEOWNERS, Copilot instructions, Dependabot, push protection, advanced security, GitHub settings, initiatives, personas, ruleset remediation. None of them is about architecture. The doctrine is scattered through orgAGENTS.mdprose with no stable section ids, so nothing can cite it — and a rule nothing can cite is a rule nothing can enforce..githuband.github-private— have no_bmad-output/at all. Nothing inscripts/,.github/workflows/, orprompts/references_bmad-outputorplanning-artifactsanywhere.2. What actually enforces them — the honest matrix
lint.yml(shellcheck, markdownlint, actionlint, gh-aw-compile)validate-workflow-schedules,validate-caller-inputs,template-drifttest-deletion-guard,holdout-guardsonar.sources=.on a shell/YAML repo sees almost nothing, and.github/workflows/**is excludedThe review council has no architecture lens
scripts/lib/review-registry.tsvregisters exactly four deep specialists:deep_specialist:security,:logic,:performance,:style. Architecture is not one of them, and Tier-1 triage can only emit one of those fourtypelabels — so there is no route to a structural review even in principle.The closest thing we have is the style lens, and it is explicitly instructed away from this job:
That is the right instruction for a style lens. It means the only reviewer positioned to notice structural drift is told to treat it as taste and wave it through.
Worse — the shared risk taxonomy actively auto-approves the erosion.
prompts/shared.mdclassifies:A change that crosses a module boundary is precisely the change class that alters system shape. We have it on the auto-approve path. Meanwhile the HIGH taxonomy does contain "The PR explicitly violates org/project standards (…AGENTS.md…)" — but no lens is tasked with checking
AGENTS.md§Coding Standards, no lens is given its principles, and no eval case tests for it. It is an unowned line in a shared list.The planner has no architecture checkpoint — and this is the ratchet
The plan rubric (single source of truth in
prompts/bmad/scrum-master.md, adversarially re-applied byprompts/plan-review.md) is six checks:contested_ac,success_metric,cost_cap,untracked_prereq,reviewability,eval_safeguards. All six are about plan hygiene. None asks whether the plan is architecturally sound, whether it respects a boundary, whether three stories are about to introduce three parallel implementations of the same concept, or whether the right move is to refactor first and feature second.Bob's story template requires Dev Notes to carry "the architecture constraints, the source-tree components to touch, and the testing standards." But look at where he gets them —
prompts/bmad/scrum-master.mdStep 3:He reads the code. There is no architecture artifact in the loop, so the "architecture constraints" in every story are reverse-engineered from the current implementation. This is the whole problem in one line: the plan can only ever describe and ratify the structure that already exists. A drifted codebase teaches the planner its drift, the planner writes the drift into Dev Notes as a constraint, dev-lead faithfully implements to it, and the drift is now doctrine. Nothing in the loop can ever propose that the current shape is wrong. That is a ratchet, and it only turns one way.
dev-lead can't catch it either
prompts/dev-lead/fix-issue.mdPhase 1 does readAGENTS.md— and then produces "a numbered implementation checklist covering every file to create or modify." It's a file plan, not a design plan. Phase 3 says "Do not implement more than what the issue requests," which is correct YAGNI discipline and simultaneously guarantees dev-lead will never fix a structural problem it notices. Phase 5's rubber-duck is a correctness review. The agent is behaving exactly as instructed; the instructions have no design step.And nothing detects the drift after the fact
scripts/spec-drift.sh(#1144) is the closest existing machinery — but it compares a merged diff against a story's acceptance criteria, it is scoped one-way (spec → code) by design, and it is not wired into any workflow yet (only bats tests reference it). Note also that the Kiro reconciliation (docs/initiatives/kiro-gap-analysis.md) marked "spec-driven planning" as already-covered on the strength of the story DAG — which is true for task decomposition and silently untrue for architecture. Its one carried sub-gap, G1, was scoped to AC-drift only.3. The evidence that this is already happening
The three product repos that did run BMAD properly:
_bmad-output/planning-artifacts/architecture.mdlast touchedFour months of continuous delivery against an architecture document that has not been opened since March.
.githuband.github-private— the highest-volume repos in the fleet — never had one.google-app-scriptshas a PRD and no architecture.ContentTwinandbmad-bgreat-suitehave neither.These artifacts were produced by a human running BMAD interactively, once, and then the agentic pipeline was built around them without ever connecting to them. They are not stale because anyone neglected them — they are stale because nothing in our automation has ever had a reason to read or write one.
4. Where Winston fits
BMAD's Solution Architect is already vendored and completely unused. Sitting in
frameworks/bmad-method/src/bmm-skills/3-solutioning/:bmad-agent-architect— the persona ("favoring boring technology, developer productivity, and trade-offs over verdicts")bmad-create-architecture— 8-step workflow with an architecture-decision templatebmad-check-implementation-readiness— 6-step gate incl. epic-coverage validation and epic-quality reviewbmad-generate-project-context,bmad-create-epics-and-storiesOur persona roster (
personas/) has eight roles —business-analyst,dev-lead,devops-lead,pr-review,qa-lead,scrum-master,security-lead,sre-lead, allstatus: draft. There is no architect. We staffed the whole delivery org and left out the one role whose entire job is the thing we have no gate for.The adoption path is already paved:
qa-leadis the worked example instandards/persona-standards.mdfor exactly this shape — wrap a vendored framework agent, advisory everywhere, write nowhere. Per persona-standards §1.6 (role, not person) the persona issolution-architect; Winston is upstream's cast name and stays upstream, referenced only asframework.skill: bmad-agent-architect.Note the precedent worth copying and the one worth avoiding: Bob already consults the Test Architect at plan time (
scrum-master.mdStep 4) — that's the integration pattern. Butqa-leadhas sat atdraftwithout a reusable; a persona that only exists as a manifest changes nothing.5. Proposal — seven phases, cheapest first
A–E are sequenced so each is useful alone and none depends on a later one. F (continuous refactor) depends on B and D — it is unsafe without a design to measure against and a lens to judge its output. G (contract conformance) depends on A (which defines the
specs/location and the conformance contract) and is otherwise independent — a repo can adopt G per spec type without any of C–F.A.
standards/architecture-standards.md(org repo). Lift the scattered doctrine out ofAGENTS.mdprose into one citable standard with stable ids, and define the ADR convention —docs/architecture/adr/NNNN-title.md, sequential, status field (proposed/accepted/superseded-by), immutable onceaccepted(a reversal is a new ADR, never an edit — the idempotency rule). Give the unfalsifiable principles a testable form (dependency direction, declared module boundaries, the DRY rule-of-three as a reviewable claim). Amend the orgAGENTS.mdBMAD section to point architecture output atdocs/architecture/(Q0). Also define thespecs/location and the contract-conformance rules (the authoritative-contract layer G enforces): the recognised spec types (DDD DSL, OpenAPI, event/message contracts, DDL, …), where each lives, and the invariant that implementation must satisfy its spec at all times. Nothing can enforce a standard it cannot cite — this unblocks C, D, F, and G.B. A live architecture artifact — in every repo, at
docs/architecture/, split by authority (corrected). My original proposal here was wrong and I'm flagging it as a defect: I said refresh the artifact on thereadme-refresh.ymlmechanism — regenerate from live state, open a rolling PR. That's correct for READMEs, which are supposed to describe current state. It is wrong for architecture, because a doc the automation rewrites to match the code can only ever describe what the code already is — drift becomes undetectable, because drift just becomes the new document. That silently defeats D and F. The maintainer's decision model fixes this by splitting the artifact:docs/architecture/adr/— normative, hand-authored, idempotent.solution-architect(Winston, viabmad-create-architecture) facilitates the initial draft and major revisions with a human; the result is committed as source and reviewed in a PR like any code. Automation never rewrites it. This is the intent-of-record that D reviews against and F measures decay against. Winston is an authoring aid at decision time, not a scheduled regenerator.docs/architecture/views/— descriptive, regenerated, deterministic. Diagrams, module maps, dependency-direction graphs, boundary listings — derived from the code by parsing it, not prompting about it (maintainer preference). A pure script walks imports/modules and emits the current-state view + a machine-readable graph; a workflow opens a rolling PR when it changes (thereadme-refreshdelivery pattern is fine here — it's the LLM-regeneration of the normative doc that was the mistake). This reuses the repo's established "pure logic + bats, LLM only where it must be" discipline (spec-drift.sh,fleet_stub_drift.sh), and the machine-readable graph it emits is exactly the input D and F need — so drift detection becomes a deterministic diff (declared boundaries in an ADR vs. derived graph), with the LLM reserved for explaining a violation, not finding it.Because the design lives beside the code, two properties follow and are worth designing for: a system change and its ADR/view update can arrive in the same PR (so the D lens compares them), and everything is branch-versioned — no central doc drifting against N repos.
.github/.github-privateneed a view shape that fits a shell + reusable-workflow repo (stub/reusable tiering, channel-tag releases, rubric-registry, prompt-library layering) — most of it already written inAGENTS.md, to be lifted into ADRs rather than invented, with the deterministic view derived from the workflow call-graph.C. Plan-time gate — architecture in the rubric. Two tiers:
arch_conformance,boundary_impact). The rubric is already a single-source-of-truth consumed by both Bob's self-check and the adversarialplan-review.mdcritic — this is additive to an existing gate, not a new one.idea-triageand Bob, wheresolution-architectemits or updates the architecture artifact and Bob decomposes against that artifact instead of against the current code. This is the phase that breaks the ratchet — it's the only proposal here that lets the pipeline conclude the existing shape is wrong.D. Review-time — a separate architecture-review agent (Q3 decided), split blocking-vs-advisory. Decision: not a fifth lens inside the pr-review cascade, but its own reviewer — the
solution-architectpersona acting as an advisory architecture reviewer, the wayqa-leadis a separate advisory test reviewer. This is cleaner than bolting a lens onto a cascade whose risk model is oriented around merge-safety (approve/escalate), not structural quality — and it merges D with E (the persona is the reviewer; see below). The choice forces a useful split in what actually blocks a merge:This maps exactly onto the determinism preference: block on the computable, advise on the judgment call. One consequence to make conscious, not accidental: with
solution-architectadvisory (Q5) and architecture review as a separate advisory agent, the subjective structural layer has no merge-blocking teeth at PR time — it relies on the computable checks above plus humans acting on comments. That is the right advisory-first posture (and matches Q12's staged rollout), but it means the one edit that still has to happen inside the main cascade is real: reclassify "refactors crossing module boundaries" out of auto-approvable MEDIUM inprompts/shared.md, so the cascade stops rubber-stamping structural changes and escalates them for the human + advisory-agent read. That one-line change may be the single highest-leverage edit in this whole proposal.E. Promote the persona — which, given Q3, IS Phase D's reviewer. D and E are one workstream:
personas/solution-architect/persona.ymlwrappingbmad-agent-architect,default_mode: advisory,opt_out_label: solution-architect:hands-off, its own advisory review workflow (caller stub + reusable + release channel, per persona-standards §6 — this is the "more infrastructure than one registry row" cost of the separate-agent choice, paid once),evals/solution-architect/{dev,holdout}/, thencanary-rings.jsonandnext → ring0 → ring1 → stablebehind the eval gate. Advisory-everywhere first — architecture opinions land as comments before they ever land as blocks. The same persona also plays the authoring role in Phase B (ADRs) and the solutioning role in Phase C; the review agent here is its third surface.F. Continuous refactor — the entropy pump. A standing workflow that periodically examines each repo against its own architecture design (Phase B) and the architecture standard (Phase A), identifies the highest-value structural decay, and raises a refactor PR to fix it. Detect → remediate → verify, on a loop, forever.
This is not a new pattern for us — it's an existing one applied one level up. Idea #1043 ("Fleet-Wide Stub Drift Auto-Remediation via Automated PRs") is already
idea:approvedand proposes exactly this reconciliation loop for stub/config drift against canonical standards, on top offleet_stub_drift.sh's ALIGNED/DRIFTED/MISSING model. Phase F is the same loop over code structure against architecture standards. The two should almost certainly share machinery and vocabulary rather than being built twice — see Q6.What it looks for is the Phase D lens pointed at the corpus instead of the diff: dependency-direction inversions, layering violations, a concept implemented a second and third time, abstractions built for two cases that never got a third, framework bleed into domain code, config sprawl, modules that have quietly become god-objects. Detection is deterministic-first, matching the Phase B decision: the same script that derives the current-state graph flags where it violates an accepted ADR's declared boundaries — that's a computed finding, not an LLM opinion. The LLM's job is to rank the computed candidates by value and draft the remediation, not to decide what counts as decay. This keeps F's per-scan token cost bounded (the expensive whole-corpus read is a parse, not a prompt) and makes its findings reproducible and arguable against a named ADR rather than against taste.
Three constraints bind this hard, and two of them are already measured:
standards/pr-limits.jsonsets a signed-off org-wide soft ceiling of 50 concurrent open non-draft automation PRs, enforced source-side byscripts/lib/pr-limit-gate.sh. The ADR baseline was ~47 open, ~34 non-Dependabot automation — dev-lead alone holds ~30. A refactor stream does not get to pretend this headroom exists. It must read the cap from that file (never hardcode it), defer rather than fail when at ceiling, and it must not starve dev-lead of queue slots to do cleanup work.AGENTS.mdsays "premature abstraction is worse than duplication — wait until you have at least three concrete instances." A refactor agent that only knows "duplication bad" will spend its entire budget building the exact abstractions the standard forbids. The rule-of-three must be a hard constraint on what it is allowed to propose, not a preference.Sequencing hazard — F must not ship before D. A refactor PR is, by definition, a "refactor crossing module boundaries" — which
prompts/shared.mdcurrently classifies as MEDIUM, auto-approve allowed. Shipping continuous refactor before the architecture lens and that reclassification exist would mass-produce boundary-crossing changes on the auto-approve path with no reviewer competent to judge them. That is not entropy reduction; it is automated entropy with a green check. F depends on D. It also depends on B — without a design artifact to compare against, "suboptimal" collapses into the agent's taste, which is precisely the ratchet in §2 wearing a different hat.What already protects us and should be kept in the loop rather than re-invented:
test-deletion-guard.yml(a refactor PR cannot silently drop a test — it needs an explicitack-test-deletionlabel), the Breaking Changes protocol in orgAGENTS.md(a refactor touching a public signature needs human approval — behavior-preserving is a claim to be checked, not trusted), andreadme-refresh.yml's rolling-PR-never-direct-push discipline.Start smaller than "raises a PR." The cheapest useful version is a standing report + issues, not PRs: the scan runs, ranks candidates, and files (or refreshes a single rolling issue of) structural-debt candidates that a human promotes into the existing
idea:approved → initiative-planner → dev-leadpath we already trust. That gets the detection value immediately at near-zero queue cost, proves the finding quality is real before we spend PR slots on it, and reuses the whole pipeline rather than bolting a second PR-producing agent onto a queue that's at 47/50. Graduate to direct PRs per-category, once a category's findings have a track record of being accepted.G. Contract conformance — specs as the authoritative source, CI as the enforcer. A
specs/tree holds the contracts implementation must satisfy, and a CI gate proves — on every PR — that spec and implementation still agree. This is the layer that turns the Breaking-Changes protocol from prose into an enforced invariant.The invariant (bidirectional). Spec is authoritative; implementation must conform to it at all times. Four PR shapes, and what CI does with each:
ack-contract-changelabel in thetest-deletion-guardmould. Green CI ≠ auto-approve for this shape.That fourth row is the "mutable with strict guardrails" the maintainer asked for: specs can change, but only as a deliberate, human-approved, propagated change — never a silent one.
Deterministic per spec type — matching this turn's determinism decision. Conformance is exactly the kind of thing that should be computed, not LLM-judged; mature tooling exists per type. The standard defines the contract; each repo wires the checker for the spec types it actually uses (opt-in per type, the way
ci.ymlis customised per stack — a repo with no OpenAPI spec gets no OpenAPI gate):specs/openapi/*.yamloasdiff-class breaking-change classification on the spec diff itselfbuf breaking, Avro/JSON-Schema compat) — backward-compat is the default gatespecs/db/*.sql(declarative)migra/alembic --check-class); fail on undeclared driftspecs/domain/*(a purpose-built DSL — Q11 decided)tests/test_downstream_impact_regression.bats, one level up.The LLM is reserved for explaining a violation in the PR comment, never for finding it — same division of labour as Phases B/D/F. A pure
contract-conformance.sh(pure classifiers + bats,main()does I/O) mirrorsspec-drift.sh's structure.Severity — blocking from day one (Q12 decided). Each conformance checker is a required status check the moment it lands for a repo — no advisory soak. This is defensible because the checks are deterministic: a computed conformance check either matches or it doesn't, so the false-positive risk that would make blocking-an-unproven-fuzzy-check dangerous mostly doesn't apply. The residual risk is a checker bug (a wrong checker blocks a good PR), and the mitigation is non-negotiable: a checker earns "required" only after its own bats suite is green — the checker is proven before it gates, not soaked in production. Contracts are treated as sacred; a violation stops the merge.
The purpose-built DSL (Q11) is the one genuinely novel build in this entire proposal. Everything else adapts an existing tool (
oasdiff,buf,migra) or an existing pattern (golden-fixture, pre-fed context, rolling-PR delivery). A bespoke DDD DSL needs three new things — a grammar, a generator (DSL → per-stack types), and the codegen-and-verify harness — and it deserves to be its own scoped sub-initiative with a deliberately minimal MVP grammar (aggregates, entities, value objects, identifiers; not the whole DDD tactical catalogue on day one), proven end-to-end on broodly before any second stack. This is the highest-effort, highest-uncertainty line item here; scoping it as a checkbox under G would under-serve it. Flagging it plainly so planning sizes it as the epic it is.Name collision to avoid.
scripts/spec-drift.shalready exists and means something different — it's the LLM-based, initiative-scoped comparison of a merged PR against a story's acceptance criteria (#1144). Phase G is deterministic contract↔implementation conformance. Different inputs, different mechanism — it must not reuse that name or that script. (If anything, it's the deterministic sibling the AC-drift tool's header already gestures at.)How this lands on existing machinery — mostly by activating what's already written:
AGENTS.mdalready enumerates the contract surface (§"Shared contracts": "removing/renaming fields in API schemas, changing message payload structures, modifying shared type definitions consumed by multiple services") and demands human approval — but nothing detects it today. G is the missing detector:oasdiff/buf breakingclassify the spec change deterministically, and the existing HIGH-risk taxonomy + human gate handle it. The rule exists; G gives it teeth.specs/. Specs are authoritative; a refactor agent may change implementation to conform to a spec, never change a spec to match drifted code. Addspecs/to F's denylist (Q9).Reality check — the fleet is greenfield here, and that's the argument for doing it now. A sweep of the fleet found no OpenAPI, proto, GraphQL, or DDL anywhere (broodly, the most built-out repo, is a TS monorepo with
apps//packages//infra/but no formal contract tree). So G governs contracts that mostly don't exist yet. That is precisely when to set the standard — definingspecs/and the conformance gate before contracts proliferate ungoverned is cheap; retrofitting conformance onto a fleet full of implicit, undocumented contracts is the expensive path we're trying to avoid. Practically: ship A's top-levelspecs/definition + the conformance-gate framework now; each checker becomes a required gate per repo as that contract type appears (blocking on arrival, Q12). broodly is the first adopter — real TS domain types, and the proving ground for the purpose-built DSL (Q11).6. Success metrics
architecture.mdacross active repos < 30 days (today: ~120 and climbing).pr-limits.jsoncap, and no measurable reduction in dev-lead's available queue slots.specs/and implementation in disagreement (the gate is a required check, so the target is structural, not aspirational). And every contract change that merges carries theack-contract-changelabel + a human approval — no silent contract mutations.7. Cost cap
readme-refreshcadence and mechanism.Phase F specifically — a whole-corpus scan is the most expensive thing proposed here, and the one most able to run away:
log()-visible when it truncates. Per this repo's own "no silent caps" rule, a scan that found 40 things and reported 3 must say so — a silently truncated list reads as "the codebase is nearly clean," which is the exact opposite of the truth and the most dangerous possible failure mode for this agent.automation_open_pr_capfromstandards/pr-limits.json, defers when at ceiling, never counts itself exempt.Phase G is nearly free by design — it's a deterministic CI check (parse + diff), so it adds a required-check job on the existing Lint/CI surface, not a new scheduled LLM workload. Its only LLM cost is drafting the explanation comment on a failing PR, which is bounded by failure count, not corpus size. This is the cheapest enforcement mechanism in the whole proposal and the one with the hardest guarantee.
8. Decisions log
Every open question is now resolved (maintainer, 2026-07-22 / 2026-07-23). Kept as a log so the planner sees not just what was decided but why, and so a reversal is a visible, dated change rather than a silent one.
Artifact model (Q1, Q2, Q0, authority):
.github/.github-privateexemption. Remaining work is the view shape for a shell+reusable repo, not whether one exists.docs/architecture/(adr/+views/). BMAD output relocates there; the three March-2026 artifacts migrate in (git-mv).Persona & enforcement (Q3–Q5):
solution-architectpersona as an advisory reviewer (likeqa-lead). Merges Phase D into E. Blocking teeth come from computable checks (Phase G + graph-diffable boundary/dependency violations as required CI); the subjective structural read is advisory. See §5D..github-private, then promote intostandards/via the established pattern. The greenfield fleet gives the runway.solution-architectwrite code? (Q5) → Advisory-only;dev-leadwrites. SA identifies debt and authors specs/ADRs; dev-lead implements. Safe persona default (persona-standards §1.3); no new write-capable identity.Phase F — continuous refactor (Q6–Q9):
idea:approved → planner → dev-lead. No auto-enqueue, no SA PRs. Direct-fix graduation out of scope for v1.frameworks/subtrees,agent-shield.yml+ immutable set, held-outevals/, thin caller stubs, andspecs/. Composes withholdout-guard.sh+ AgentShield.Phase G — contract conformance (Q10–Q13):
specs/location? (Q10) → Top-levelspecs/. Contracts are machine-consumed (codegen, validation, registry), not human docs — they don't belong underdocs/. The standard catalogues it; an ADR records the choice.oasdiff/buf breakingshould live as a shared lib (à lascripts/lib/downstream-impact.sh) consumable by both G and the review agent, not G-only — a design note for the builder, not a decision needing a call.Grounding: org
AGENTS.md§§Coding Standards / BMAD;standards/(11 docs, no architecture standard);scripts/lib/review-registry.tsv;prompts/shared.md,prompts/deep-review-style.md,prompts/plan-review.md,prompts/bmad/scrum-master.md,prompts/dev-lead/fix-issue.md;scripts/spec-drift.sh;docs/initiatives/kiro-gap-analysis.md§§2/5;frameworks/bmad-method/src/bmm-skills/3-solutioning/;personas/(8 roles, no architect);standards/persona-standards.md§§1.2/1.3/1.6/7;standards/pr-limits.md+standards/pr-limits.json(cap 50, baseline ~47/~34, dev-lead ~30) +scripts/lib/pr-limit-gate.sh; Discussions #1043 (approved) and #1348; orgAGENTS.md§Breaking Changes (“Shared contracts”);scripts/spec-drift.sh(AC-drift, name-collision note);tests/test_downstream_impact_regression.bats(golden-fixture pattern); fleet contract sweep 2026-07-23 (no OpenAPI/proto/GraphQL/DDL found); artifact timestamps read live from the fleet on 2026-07-22.All reactions