@juzser/blacksmith 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.claude/agents/{auditor.md → bs-auditor.md} +8 -5
  2. package/.claude/agents/{coder.md → bs-coder.md} +8 -7
  3. package/.claude/agents/{grader.md → bs-grader.md} +16 -9
  4. package/.claude/agents/{merger.md → bs-merger.md} +4 -4
  5. package/.claude/agents/{planner.md → bs-planner.md} +20 -6
  6. package/.claude/agents/{researcher.md → bs-researcher.md} +6 -5
  7. package/.claude/agents/{reviewer.md → bs-reviewer.md} +16 -5
  8. package/.claude/agents/{scribe.md → bs-scribe.md} +11 -2
  9. package/.claude/agents/{security-reviewer.md → bs-security-reviewer.md} +9 -6
  10. package/.claude/agents/{spec-reviewer.md → bs-spec-reviewer.md} +18 -10
  11. package/.claude/agents/{tester.md → bs-tester.md} +40 -12
  12. package/.claude/agents/bs-uiux.md +257 -0
  13. package/.claude/agents/{verifier.md → bs-verifier.md} +7 -4
  14. package/.claude/agents/{wave-runner.md → bs-wave-runner.md} +14 -5
  15. package/.claude/skills/bs/SKILL.md +99 -21
  16. package/.claude/skills/bs/audit.md +45 -31
  17. package/.claude/skills/bs/dispatch.md +133 -47
  18. package/.claude/skills/bs/lessons.md +28 -14
  19. package/.claude/skills/bs/mcp.md +4 -4
  20. package/.claude/skills/bs/new.md +3 -3
  21. package/.claude/skills/bs/plan.md +57 -16
  22. package/.claude/skills/bs/report.md +11 -11
  23. package/.claude/skills/bs/run.md +190 -52
  24. package/.claude/skills/bs/status.md +14 -7
  25. package/.claude/skills/bs/ui.md +21 -5
  26. package/.claude/skills/bs/waivers.md +78 -2
  27. package/.claude/skills/bs/wave.md +143 -50
  28. package/README.md +53 -32
  29. package/factory/orchestrator/dist/agentNames.js +43 -0
  30. package/factory/orchestrator/dist/agents-registry.js +11 -4
  31. package/factory/orchestrator/dist/agentsSync.js +70 -13
  32. package/factory/orchestrator/dist/artifacts.js +31 -0
  33. package/factory/orchestrator/dist/attribution.js +4 -0
  34. package/factory/orchestrator/dist/audit.js +245 -20
  35. package/factory/orchestrator/dist/autonomy.js +6 -2
  36. package/factory/orchestrator/dist/budgetAlarm.js +132 -37
  37. package/factory/orchestrator/dist/budgets.js +302 -84
  38. package/factory/orchestrator/dist/claims.js +9 -19
  39. package/factory/orchestrator/dist/cli.js +1087 -116
  40. package/factory/orchestrator/dist/cliName.js +27 -0
  41. package/factory/orchestrator/dist/crossFinding.js +20 -0
  42. package/factory/orchestrator/dist/crosscheck.js +136 -8
  43. package/factory/orchestrator/dist/daemon.js +352 -67
  44. package/factory/orchestrator/dist/db/projector.js +327 -54
  45. package/factory/orchestrator/dist/db/queries.js +1831 -94
  46. package/factory/orchestrator/dist/db/schema.js +57 -4
  47. package/factory/orchestrator/dist/declaredArtifactLine.js +18 -0
  48. package/factory/orchestrator/dist/delegation.js +86 -19
  49. package/factory/orchestrator/dist/diffstat.js +15 -8
  50. package/factory/orchestrator/dist/dispatchLint.js +108 -0
  51. package/factory/orchestrator/dist/effort.js +14 -2
  52. package/factory/orchestrator/dist/effortTiers.js +13 -0
  53. package/factory/orchestrator/dist/env.js +26 -0
  54. package/factory/orchestrator/dist/epic.js +494 -42
  55. package/factory/orchestrator/dist/epicBudget.js +93 -0
  56. package/factory/orchestrator/dist/epicWidth.js +22 -5
  57. package/factory/orchestrator/dist/errorIssues.js +182 -11
  58. package/factory/orchestrator/dist/escalation.js +2 -2
  59. package/factory/orchestrator/dist/events.js +164 -14
  60. package/factory/orchestrator/dist/feedback.js +169 -0
  61. package/factory/orchestrator/dist/findingContext.js +26 -0
  62. package/factory/orchestrator/dist/findings.js +108 -14
  63. package/factory/orchestrator/dist/gate.js +120 -10
  64. package/factory/orchestrator/dist/gh.js +19 -2
  65. package/factory/orchestrator/dist/git.js +20 -2
  66. package/factory/orchestrator/dist/goalCheck.js +2 -2
  67. package/factory/orchestrator/dist/harness.js +25 -17
  68. package/factory/orchestrator/dist/hookDecision.js +411 -39
  69. package/factory/orchestrator/dist/integration.js +20 -8
  70. package/factory/orchestrator/dist/issueReporter.js +81 -16
  71. package/factory/orchestrator/dist/judgePreflight.js +25 -4
  72. package/factory/orchestrator/dist/judgeRoles.js +47 -0
  73. package/factory/orchestrator/dist/judgeStopHook.js +239 -0
  74. package/factory/orchestrator/dist/judges.js +419 -21
  75. package/factory/orchestrator/dist/lessons.js +190 -11
  76. package/factory/orchestrator/dist/logCache.js +291 -0
  77. package/factory/orchestrator/dist/mcp.js +6 -6
  78. package/factory/orchestrator/dist/paths.js +20 -7
  79. package/factory/orchestrator/dist/plan.js +399 -33
  80. package/factory/orchestrator/dist/planQuorum.js +5 -2
  81. package/factory/orchestrator/dist/policy.js +1275 -30
  82. package/factory/orchestrator/dist/projectName.js +25 -0
  83. package/factory/orchestrator/dist/projects.js +12 -1
  84. package/factory/orchestrator/dist/promptCapture.js +306 -0
  85. package/factory/orchestrator/dist/promptHook.js +33 -0
  86. package/factory/orchestrator/dist/promptImport.js +281 -0
  87. package/factory/orchestrator/dist/prompts.js +13 -0
  88. package/factory/orchestrator/dist/providers/schema-validate.js +2 -2
  89. package/factory/orchestrator/dist/providers/types.js +1 -1
  90. package/factory/orchestrator/dist/queue.js +471 -30
  91. package/factory/orchestrator/dist/quorum.js +18 -5
  92. package/factory/orchestrator/dist/results.js +25 -7
  93. package/factory/orchestrator/dist/roadmap.js +10 -5
  94. package/factory/orchestrator/dist/run-cli.js +15 -10
  95. package/factory/orchestrator/dist/runner.js +2 -2
  96. package/factory/orchestrator/dist/scheduler.js +3 -3
  97. package/factory/orchestrator/dist/schemas.js +56 -8
  98. package/factory/orchestrator/dist/severity.js +8 -4
  99. package/factory/orchestrator/dist/spec.js +246 -12
  100. package/factory/orchestrator/dist/specChange.js +13 -9
  101. package/factory/orchestrator/dist/stack.js +6 -6
  102. package/factory/orchestrator/dist/storeRoot.js +90 -0
  103. package/factory/orchestrator/dist/symbols.js +261 -6
  104. package/factory/orchestrator/dist/taskEvents.js +192 -31
  105. package/factory/orchestrator/dist/taskStatus.js +14 -0
  106. package/factory/orchestrator/dist/taxonomy.js +11 -0
  107. package/factory/orchestrator/dist/testerAudit.js +31 -12
  108. package/factory/orchestrator/dist/testgate.js +20 -16
  109. package/factory/orchestrator/dist/uiuxGate.js +83 -0
  110. package/factory/orchestrator/dist/usage.js +113 -48
  111. package/factory/orchestrator/dist/waivers.js +99 -12
  112. package/factory/orchestrator/dist/waveBudget.js +2 -0
  113. package/factory/orchestrator/dist/waveConcurrency.js +143 -7
  114. package/factory/orchestrator/dist/waveSchedule.js +84 -0
  115. package/factory/orchestrator/dist/workroot.js +1 -1
  116. package/factory/orchestrator/dist/worktree.js +76 -21
  117. package/factory/orchestrator/drizzle/0013_operator_feedback.sql +19 -0
  118. package/factory/orchestrator/drizzle/0014_misty_madripoor.sql +2 -0
  119. package/factory/orchestrator/drizzle/0015_gifted_omega_flight.sql +1 -0
  120. package/factory/orchestrator/drizzle/0016_milestones_project_default.sql +30 -0
  121. package/factory/orchestrator/drizzle/0017_events_raw_cli_session_id.sql +2 -0
  122. package/factory/orchestrator/drizzle/meta/_journal.json +35 -0
  123. package/factory/policies/budgets.yml +123 -33
  124. package/factory/policies/crosscheck.yml +51 -13
  125. package/factory/policies/delegation.yml +3 -3
  126. package/factory/policies/effort.yml +18 -10
  127. package/factory/policies/guardrails.yml +8 -6
  128. package/factory/policies/harness.yml +5 -5
  129. package/factory/policies/lessons.md +53 -2
  130. package/factory/policies/scheduler.yml +4 -4
  131. package/factory/policies/sensitive-paths.yml +1 -1
  132. package/factory/policies/severity.yml +13 -1
  133. package/factory/policies/stack.yml +6 -6
  134. package/factory/policies/taxonomy.yml +9 -3
  135. package/factory/policies/worktree.yml +15 -9
  136. package/factory/specs/roadmap.md +27 -3
  137. package/factory/specs/schema/event.schema.json +8 -1
  138. package/factory/specs/schema/result.schema.json +21 -8
  139. package/factory/specs/schema/task-spec.schema.json +12 -0
  140. package/package.json +16 -12
  141. package/.claude/agents/uiux.md +0 -133
@@ -3,10 +3,10 @@
3
3
  Every project leaving the factory ships an MCP surface
4
4
  (`docs/standards/mcp.md`). It is due **late** — at the mandatory
5
5
  `<project> — mcp surface` milestone, once the tools worth exposing are known.
6
- Running this at `smith new` time would produce a manifest declaring nothing,
6
+ Running this at `bs new` time would produce a manifest declaring nothing,
7
7
  which is the rubber stamp the standard exists to prevent.
8
8
 
9
- 1. Run `smith mcp init <project>`. It layers `src/mcp/`, `test/mcp/`, and a
9
+ 1. Run `bs mcp init <project>`. It layers `src/mcp/`, `test/mcp/`, and a
10
10
  root `mcp.manifest.json` onto the already-scaffolded project, merges the
11
11
  `mcp:serve` script and the pinned SDK dependency into its `package.json`,
12
12
  and appends the `mcp surface` milestone to `factory/specs/roadmap.md`.
@@ -22,8 +22,8 @@ which is the rubber stamp the standard exists to prevent.
22
22
  `main`) are not allowed at all (mcp.md MCP-S3). A signed `destructive` tool
23
23
  is permission to act inside the project, never a way around an operator
24
24
  gate.
25
- 4. Run `smith mcp check <project>` before closing anything under that
25
+ 4. Run `bs mcp check <project>` before closing anything under that
26
26
  milestone. Exit 0 means green; exit 1 prints one `{ rule, path, message }`
27
- per violation. `smith epic close` runs the same check and refuses while it
27
+ per violation. `bs epic close` runs the same check and refuses while it
28
28
  is red — the only way past it is `--override-rationale`, which is the
29
29
  operator's call and their name in the event log, never yours.
@@ -1,8 +1,8 @@
1
1
  # `/bs new <project> [--ui]` — scaffold a target project
2
2
 
3
- 1. Ask where the project should live, then run `smith new <project> [--ui]
3
+ 1. Ask where the project should live, then run `bs new <project> [--ui]
4
4
  [--target-dir <dir>]`. Without `--target-dir` it lands beside the clone, in
5
- `<repo-parent>/<project>` — or, when `smith` is an installed package rather
5
+ `<repo-parent>/<project>` — or, when `bs` is an installed package rather
6
6
  than a clone, in the directory you run it from, never inside the package.
7
7
  Either way that is a default rather than a requirement —
8
8
  the answer becomes the `<project-dir>` every later command takes, so take
@@ -15,7 +15,7 @@
15
15
  bootstrap milestone in `factory/specs/roadmap.md` — all in one call.
16
16
  An answer the templates cannot build (`frontend: react`) makes it **refuse
17
17
  before creating anything**, rather than quietly handing over the frontend
18
- they do ship. `smith stack check` says in advance which answers are
18
+ they do ship. `bs stack check` says in advance which answers are
19
19
  honoured, merely recorded, or refused.
20
20
  2. The gate run is `pnpm install` then `lint`, `typecheck`, `test:coverage`,
21
21
  `build` — `ci.yml`'s order, so the lockfile lands in the first commit and no
@@ -11,8 +11,8 @@ one — and it scales steps 3–4 below plus most of `/bs run`. Ask, do not
11
11
  recall:
12
12
 
13
13
  ```bash
14
- smith effort show --effort <small|medium|huge> # no plan file exists yet
15
- smith effort show --plan factory/specs/active/<epic>/plan-vN.json
14
+ bs effort show --effort <small|medium|huge> # no plan file exists yet
15
+ bs effort show --plan factory/specs/active/<epic>/plan-vN.json
16
16
  ```
17
17
 
18
18
  `profile` is what this epic buys, and every step below that a tier touches
@@ -34,17 +34,41 @@ there means "not looked at", not "looked at and clean".
34
34
 
35
35
  1. **Static analysis for claims first.** Before any decomposition, get the
36
36
  target repo's import/dependency graph so claims are computed, not
37
- guessed (architecture §5) — dispatch `researcher`
38
- (`.claude/agents/researcher.md`) for an unfamiliar repo, or do it
37
+ guessed (architecture §5) — dispatch `bs-researcher`
38
+ (`.claude/agents/bs-researcher.md`) for an unfamiliar repo, or do it
39
39
  directly with Grep/Read for a small one.
40
- 2. Dispatch a **`planner`** session (`.claude/agents/planner.md`, frontier
40
+ 2. Dispatch a **`bs-planner`** session (`.claude/agents/bs-planner.md`, frontier
41
41
  tier) with the goal + the claims analysis. It drafts the epic spec and
42
42
  task specs (`factory/specs/schema/task-spec.schema.json` shape).
43
- 3. Dispatch a **`spec-reviewer`** session (`.claude/agents/spec-reviewer.md`)
43
+ 3. Dispatch a **`bs-spec-reviewer`** session (`.claude/agents/bs-spec-reviewer.md`)
44
44
  — a *different model* than the planner's, per its own frontmatter — to
45
45
  hunt spec gaps/ambiguities/missing-nonfunctional clauses
46
46
  (`docs/standards/agent-constraints.md` "planner"; `severity.yml`: most
47
- spec gaps land S2, blocking sign-off).
47
+ spec gaps land S2, blocking sign-off). Name the review focus in the
48
+ dispatch itself, as a short list of at most six items, so findings come
49
+ back tagged to one of them:
50
+
51
+ 1. Claims and dependency edges, cross-checked against
52
+ `bs claims impact`.
53
+ 2. TDD-ability -- a named failing test per task, before its code.
54
+ 3. Nonfunctional and security clauses.
55
+ 4. Budget and diff-cap fit.
56
+ 5. Acceptance-criterion coverage -- every epic criterion maps to a task.
57
+ 6. From round 2 on, only the previous round's findings plus any task
58
+ that changed since then.
59
+
60
+ The prompt also carries, inline on its own line,
61
+ `Declared artifact: /abs/path/to/state/results/<epic-id>.spec-review.json`
62
+ — the absolute form of the path `bs-spec-reviewer.md` names. The PreToolUse
63
+ guard refuses a judge dispatch without it.
64
+
65
+ When `size.small` reads true on the draft (`bs wave schedule` or
66
+ `bs plan ingest`'s `parallelism.size`, run against the draft plan
67
+ file), recommend effort tier `small` -- single-pass spec review -- to
68
+ the operator unless a security trigger floors it first, and say why in
69
+ the same message: a plan that cannot spread past a few tasks and a
70
+ handful of claim paths does not need a second review round to find what
71
+ one pass already covers.
48
72
  4. Planner fixes flagged issues; repeat 2–3 until the spec-reviewer has
49
73
  nothing S1/S2 left — or exactly once when `profile.specReviewRounds` is
50
74
  `single-pass` (`small`), where the planner fixes what came back and
@@ -55,9 +79,10 @@ there means "not looked at", not "looked at and clean".
55
79
  confidence) for you:
56
80
 
57
81
  ```bash
58
- smith plan quorum --plan <the draft's plan.json> --plan-version <n> \
82
+ bs plan quorum --plan <the draft's plan.json> --plan-version <n> \
59
83
  --session <session-id> --causal-parent <event-id> \
60
84
  --confidence <your own 0–1 confidence in this plan> \
85
+ --project <project-dir> \
61
86
  --out <scratch>/quorum-v<n>.json
62
87
  ```
63
88
 
@@ -67,7 +92,10 @@ there means "not looked at", not "looked at and clean".
67
92
  exist. (`--epic <epic>` instead of `--plan` critiques a version already
68
93
  filed.) The draft's own `epic_id`/`version` must be the ones the command
69
94
  names, or it refuses (`plan.identity-mismatch`) rather than record one
70
- plan's identity with another plan's triggers. `--out` keeps the outcome
95
+ plan's identity with another plan's triggers. `--project <project-dir>`
96
+ has no worktree to derive from at this step — no task has one yet — so
97
+ name it directly, or a `<project-dir>/.blacksmith/crosscheck.yml` overlay
98
+ never reaches the providers this quorum weighs. `--out` keeps the outcome
71
99
  — three rationales of several kB each — where step 5 can hand it to the
72
100
  operator whole instead of quoting a terminal.
73
101
 
@@ -90,10 +118,10 @@ there means "not looked at", not "looked at and clean".
90
118
  "planner: autonomy — spec sign-off per epic").
91
119
  6. On approval, write task specs to
92
120
  `factory/specs/active/<epic>/plan-v1.json` and validate:
93
- `smith plan validate factory/specs/active/<epic>/plan-v1.json` must
121
+ `bs plan validate factory/specs/active/<epic>/plan-v1.json` must
94
122
  report `{"valid":true}` before anything else touches this plan. Write the
95
123
  tier onto the plan file as a top-level `"effort": "<tier>"` — that is
96
- where `/bs run` reads it, and `smith plan amend` carries it into
124
+ where `/bs run` reads it, and `bs plan amend` carries it into
97
125
  v(n+1) so a re-plan is not a fresh choice. Omit the field to take the
98
126
  policy default; a value that is not `small`/`medium`/`huge` fails
99
127
  validation rather than degrading to it.
@@ -102,7 +130,7 @@ there means "not looked at", not "looked at and clean".
102
130
  against it:
103
131
 
104
132
  ```bash
105
- smith wave schedule factory/specs/active/<epic>/plan-v1.json \
133
+ bs wave schedule factory/specs/active/<epic>/plan-v1.json \
106
134
  --session <session-id> --repo <project-dir>
107
135
  ```
108
136
 
@@ -127,10 +155,15 @@ there means "not looked at", not "looked at and clean".
127
155
  decide whether to re-slice, and say which you chose when you present the
128
156
  plan.
129
157
 
158
+ The same JSON also carries `size` -- `{tasks, claims, small}` over live
159
+ tasks only -- the block `plan ingest` prints again under `parallelism`
160
+ at step 7; `small` is true at or under 3 live tasks and 10 distinct
161
+ claim paths, and this is where the step 3 tier read gets confirmed.
162
+
130
163
  Beside the schedule, the read that names what it only counts:
131
164
 
132
165
  ```bash
133
- smith claims impact --plan factory/specs/active/<epic>/plan-v1.json \
166
+ bs claims impact --plan factory/specs/active/<epic>/plan-v1.json \
134
167
  <task-id>... --repo <project-dir>
135
168
  ```
136
169
 
@@ -138,8 +171,8 @@ there means "not looked at", not "looked at and clean".
138
171
  at; `promised` holds the ones a producer's `keeps_exports` already
139
172
  answers, which the schedule admits and the diff is later checked against.
140
173
  7. Log the sign-off itself as a decision checkpoint (this is exactly what
141
- `smith dream`'s "plan sign-off" extraction looks for, `lessons.ts`):
142
- `smith event append '{"session_id":"...","actor":"operator",
174
+ `bs dream`'s "plan sign-off" extraction looks for, `lessons.ts`):
175
+ `bs event append '{"session_id":"...","actor":"operator",
143
176
  "event_type":"plan-version-created","plan_version":1,
144
177
  "causal_parent":"...","payload":{"epic_id":"<epic>","version":1,
145
178
  "note":"<operator's own words>"}}'`.
@@ -148,7 +181,7 @@ there means "not looked at", not "looked at and clean".
148
181
  the sign-off event:
149
182
 
150
183
  ```bash
151
- smith plan ingest factory/specs/active/<epic>/plan-v1.json \
184
+ bs plan ingest factory/specs/active/<epic>/plan-v1.json --project <project-dir> \
152
185
  --session <session-id> --plan-version 1 --causal-parent <sign-off event id>
153
186
  ```
154
187
 
@@ -163,6 +196,14 @@ there means "not looked at", not "looked at and clean".
163
196
  UI check found behind two epics. It is idempotent, so run it again on a
164
197
  resumed session; read `added` and `edges` back, and say so when either is
165
198
  0 on a plan that has tasks or edges.
199
+
200
+ Read `parallelism.widest` back from that same output, too. `parallel_with`
201
+ underneath it is claims-and-edges only -- import-graph crossings stay
202
+ `wave schedule --repo`'s job, not this key's -- so it can only ever name
203
+ a width that job would not contradict. A `widest` of 1 on a
204
+ plan of two or more tasks means every task the wave loop will ever run
205
+ sits behind some claim or edge that serializes it: flag that to the
206
+ operator now, before a run discovers it as a stalled wave.
166
207
  8. If this epic opens a new roadmap milestone, add it to
167
208
  `factory/specs/roadmap.md` (planner-maintained, architecture §12) — a
168
209
  roadmap change is itself a scope change and needs the same operator nod.
@@ -8,8 +8,8 @@ duties, v3.2)"), plus running the scheduler first — a report that omits
8
8
  pending proposals lets them sit invisible instead of surfacing them.
9
9
 
10
10
  1. **Ask what the factory is answerable for, then run the scheduler.**
11
- `smith projects list` reads the roadmap's `- project:` bullets — the
12
- register `smith new` writes to — and prints the factory itself plus every
11
+ `bs projects list` reads the roadmap's `- project:` bullets — the
12
+ register `bs new` writes to — and prints the factory itself plus every
13
13
  project it built that has a checkout, ending in the `--project` line to
14
14
  pass on. Do not assemble that list from memory: the maintenance pass
15
15
  reads one lockfile per flag and reports one proposal per repo, so a repo
@@ -17,9 +17,9 @@ pending proposals lets them sit invisible instead of surfacing them.
17
17
  mentioned. (The daemon raises `unwatched-project` for a child project with
18
18
  a checkout that is left off the line — not for the factory itself, which is in
19
19
  the pass by default, and not for a declared project with no checkout at
20
- all, which `smith projects list` marks with `?` instead of leaving it
20
+ all, which `bs projects list` marks with `?` instead of leaving it
21
21
  off the printed list. The two surfaces no longer answer the same
22
- question.) Then run `smith scheduler run
22
+ question.) Then run `bs scheduler run
23
23
  [--dry] --session <id> [--project <dir>...]` with those flags — a
24
24
  deterministic pass over the event log, it never dispatches an agent
25
25
  itself (`factory/policies/scheduler.yml`, architecture §12). Read its
@@ -42,7 +42,7 @@ pending proposals lets them sit invisible instead of surfacing them.
42
42
  where the planner reads the living spec/analytics/recheck outcomes
43
43
  and proposes new epics — the operator's tick is required regardless
44
44
  of confidence, same as any other plan sign-off.
45
- 2. **Ask who may say yes.** `smith scheduler admit --session <id>
45
+ 2. **Ask who may say yes.** `bs scheduler admit --session <id>
46
46
  [--project <dir>...]`, with the same flag line step 1 printed, re-reads
47
47
  the same proposals and classifies
48
48
  each one `auto` or `operator` against `scheduler.yml`'s `autonomy:`
@@ -66,9 +66,9 @@ pending proposals lets them sit invisible instead of surfacing them.
66
66
  `confidence_floor` is an operator decision about standing policy, not
67
67
  a way past one proposal — and a `security-surface` denial is the one
68
68
  nothing in the file can lift.
69
- 3. Gather `smith stats overview [--session <id>]` and `smith stats roadmap
69
+ 3. Gather `bs stats overview [--session <id>]` and `bs stats roadmap
70
70
  [--session <id>]` (milestone progress + budget burn per milestone).
71
- 4. **Read back the disagreements.** `smith judge escalations --session
71
+ 4. **Read back the disagreements.** `bs judge escalations --session
72
72
  <id>` folds the lineage for `quorum-decision` events whose latest word
73
73
  was `escalate` — a gate finding, an epic verdict or a plan critique the
74
74
  cross-provider quorum could not settle. It exits `1` on an open
@@ -83,7 +83,7 @@ pending proposals lets them sit invisible instead of surfacing them.
83
83
  `mode: shadow` disagreement, which the gate outcome never reported to
84
84
  anyone). Resolving one is an operator reading, never this session
85
85
  deciding on its own which provider was right.
86
- 5. **Read back the parallelism.** `smith wave audit --session <id>
86
+ 5. **Read back the parallelism.** `bs wave audit --session <id>
87
87
  [--epic <id>]` folds every `wave-admitted` against the
88
88
  `dispatch_decision` intervals underneath it and says whether a wave
89
89
  admitted N wide actually *ran* N wide. `wave check` only ever certified
@@ -97,11 +97,11 @@ pending proposals lets them sit invisible instead of surfacing them.
97
97
  check before reporting it as a stall. A `partial` verdict is **not** a
98
98
  finding; put `widest` in the digest as the one number that says how wide
99
99
  this factory has ever actually run.
100
- 6. Dispatch **`scribe`** (`.claude/agents/scribe.md`, small tier) with that
100
+ 6. Dispatch **`bs-scribe`** (`.claude/agents/bs-scribe.md`, small tier) with that
101
101
  JSON plus step 2's admissions as input: shipped / in-flight / blocked /
102
102
  budget burn / next milestone / **N rechecks pending, M maintenance
103
103
  bumps auto-schedulable** (never silently dropped), ≤300 words, linking
104
- into the dashboard (`smith ui serve`'s URL) — never paraphrase numbers
104
+ into the dashboard (`bs ui serve`'s URL) — never paraphrase numbers
105
105
  the query didn't return.
106
106
  7. This fires automatically on a weekly cadence and immediately on any
107
107
  milestone completion (architecture §12) — for an ad hoc `/bs report`,
@@ -114,7 +114,7 @@ pending proposals lets them sit invisible instead of surfacing them.
114
114
 
115
115
  **Provider calibration note (Phase 8).** While any provider in
116
116
  `factory/policies/crosscheck.yml` is still `mode: shadow`, run
117
- `smith stats providers [--session <id>] [--since <iso-date>]` alongside the
117
+ `bs stats providers [--session <id>] [--since <iso-date>]` alongside the
118
118
  scheduler pass and fold a one-line mention into the digest when a provider
119
119
  has accumulated enough runs to review (`runs`, `verdicts`, `agreementRate`,
120
120
  `schemaFailureRate`, `transportFailureRate`, `failuresByCode` per provider —