@gobing-ai/spur 0.3.74 → 0.3.76

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 (78) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/config.example.yaml +6 -0
  3. package/config/rules/README.md +1 -1
  4. package/config/rules/strict/runtime-boundaries.yaml +1 -0
  5. package/config/rules/typescript/no-eslint-suppressions.yaml +30 -0
  6. package/config/workflows/docs-pipeline.yaml +26 -1
  7. package/config/workflows/feature-dev.yaml +143 -102
  8. package/config/workflows/idea-pipeline.yaml +58 -11
  9. package/config/workflows/task-pipeline.yaml +76 -40
  10. package/config/workflows/wrapup-pipeline.yaml +183 -111
  11. package/package.json +9 -9
  12. package/plugins/sp/agents/expert-spur.md +7 -4
  13. package/plugins/sp/commands/dev-idea.md +1 -1
  14. package/plugins/sp/commands/dev-refineall.md +2 -2
  15. package/plugins/sp/plugin.json +1 -1
  16. package/plugins/sp/skills/dogfood-testing/SKILL.md +7 -4
  17. package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -3
  18. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +5 -3
  19. package/plugins/sp/skills/spur-cli/references/tasks.md +3 -1
  20. package/plugins/sp/skills/spur-cli/references/workflows.md +3 -3
  21. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +23 -8
  22. package/plugins/sp/skills/spur-dev/references/dev-operations.md +3 -3
  23. package/plugins/sp/skills/spur-dev/references/gate-checklists.md +4 -1
  24. package/schemas/spur-config.schema.json +4 -0
  25. package/spur.js +3675 -838
  26. package/web/_astro/{BoardApp.C60RJZRj.js → BoardApp.CHQ1lycZ.js} +92 -92
  27. package/web/_astro/BoardApp.DV9kx0wo.js +1 -0
  28. package/web/_astro/{TaskDetail.Guk8VuNu.js → TaskDetail.GKfQJ60c.js} +1 -1
  29. package/web/_astro/{arc.CAZtlWJM.js → arc.DWEtA3Tx.js} +1 -1
  30. package/web/_astro/{architectureDiagram-3BPJPVTR.9-XbF_Tz.js → architectureDiagram-3BPJPVTR.DB42oWmP.js} +1 -1
  31. package/web/_astro/{blockDiagram-GPEHLZMM.DC4WLx3L.js → blockDiagram-GPEHLZMM.rhv-zNQV.js} +1 -1
  32. package/web/_astro/{c4Diagram-AAUBKEIU.JgjUQMgG.js → c4Diagram-AAUBKEIU.Ci4-4VvY.js} +1 -1
  33. package/web/_astro/channel.BAI6xLeV.js +1 -0
  34. package/web/_astro/{chunk-2J33WTMH.D_JFiXa-.js → chunk-2J33WTMH.Cc9veUgf.js} +1 -1
  35. package/web/_astro/{chunk-4BX2VUAB.Bk_RxoeT.js → chunk-4BX2VUAB.Bec9c4eI.js} +1 -1
  36. package/web/_astro/{chunk-55IACEB6.a_Rj2VxL.js → chunk-55IACEB6.DoV8S1iB.js} +1 -1
  37. package/web/_astro/{chunk-727SXJPM.C2NoS1U6.js → chunk-727SXJPM.DwR-Qlyj.js} +1 -1
  38. package/web/_astro/{chunk-AQP2D5EJ.D1Xn6CNa.js → chunk-AQP2D5EJ.ND_a81WY.js} +1 -1
  39. package/web/_astro/{chunk-FMBD7UC4.BhJrSBsX.js → chunk-FMBD7UC4.Wv_jwG48.js} +1 -1
  40. package/web/_astro/{chunk-ND2GUHAM.ByVGduYQ.js → chunk-ND2GUHAM.CXKXCMmp.js} +1 -1
  41. package/web/_astro/{chunk-QZHKN3VN.B47Paunq.js → chunk-QZHKN3VN.nkaoNYQq.js} +1 -1
  42. package/web/_astro/{classDiagram-4FO5ZUOK.BERMSD5C.js → classDiagram-4FO5ZUOK.cMQcVlQu.js} +1 -1
  43. package/web/_astro/{classDiagram-v2-Q7XG4LA2.BERMSD5C.js → classDiagram-v2-Q7XG4LA2.cMQcVlQu.js} +1 -1
  44. package/web/_astro/{cose-bilkent-S5V4N54A.O_rHGlhU.js → cose-bilkent-S5V4N54A.OaDJ7Mr2.js} +1 -1
  45. package/web/_astro/{cynefin-OW5HDTMX.qCW2GdNp.js → cynefin-OW5HDTMX.Chi8IphF.js} +1 -1
  46. package/web/_astro/{dagre-BM42HDAG.C5Y4lH_u.js → dagre-BM42HDAG.CzK2t_Fp.js} +1 -1
  47. package/web/_astro/{diagram-2AECGRRQ.DxZmRXxF.js → diagram-2AECGRRQ.DRvxlVS7.js} +1 -1
  48. package/web/_astro/{diagram-5GNKFQAL.qSxZeYSK.js → diagram-5GNKFQAL.CnYvNdwA.js} +1 -1
  49. package/web/_astro/{diagram-KO2AKTUF.-7vl3bXs.js → diagram-KO2AKTUF.CpLpMw5R.js} +1 -1
  50. package/web/_astro/{diagram-LMA3HP47.BHVV-UH3.js → diagram-LMA3HP47.JTb78qUA.js} +1 -1
  51. package/web/_astro/{diagram-OG6HWLK6.DHAuW9sK.js → diagram-OG6HWLK6.Bk-1jDIb.js} +1 -1
  52. package/web/_astro/{erDiagram-TEJ5UH35.DMRLQwPN.js → erDiagram-TEJ5UH35.D8hN9GZq.js} +1 -1
  53. package/web/_astro/{flowDiagram-I6XJVG4X.B3EpPp_8.js → flowDiagram-I6XJVG4X.-6zQr6m5.js} +1 -1
  54. package/web/_astro/{ganttDiagram-6RSMTGT7.BgUrExXM.js → ganttDiagram-6RSMTGT7.DboLQ9ca.js} +1 -1
  55. package/web/_astro/{gitGraphDiagram-PVQCEYII.CU-9yVN4.js → gitGraphDiagram-PVQCEYII.4tYvJKGR.js} +1 -1
  56. package/web/_astro/index.Dcr_8fiK.css +1 -0
  57. package/web/_astro/{infoDiagram-5YYISTIA.CvVTCRLe.js → infoDiagram-5YYISTIA.Bd9rXpsB.js} +1 -1
  58. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BUzOfKPf.js → ishikawaDiagram-YF4QCWOH.CvMoaf67.js} +1 -1
  59. package/web/_astro/{journeyDiagram-JHISSGLW.BBTb7ziz.js → journeyDiagram-JHISSGLW.Ccy1CA7y.js} +1 -1
  60. package/web/_astro/{kanban-definition-UN3LZRKU.CTQQr70i.js → kanban-definition-UN3LZRKU.0MaMqHNS.js} +1 -1
  61. package/web/_astro/{linear.CLKlJPiS.js → linear.CHXgcIbN.js} +1 -1
  62. package/web/_astro/{mermaid.core.BA4wFhLP.js → mermaid.core.Ca-kcelG.js} +4 -4
  63. package/web/_astro/{mindmap-definition-RKZ34NQL.t1vG2l5e.js → mindmap-definition-RKZ34NQL.BUIDlHa0.js} +1 -1
  64. package/web/_astro/{pieDiagram-4H26LBE5.C8zJhyTu.js → pieDiagram-4H26LBE5.2dX3CU1s.js} +1 -1
  65. package/web/_astro/{quadrantDiagram-W4KKPZXB.DqYYvb7T.js → quadrantDiagram-W4KKPZXB.B3LBlRiv.js} +1 -1
  66. package/web/_astro/{requirementDiagram-4Y6WPE33.lzfDZ9nI.js → requirementDiagram-4Y6WPE33.X12I2uNx.js} +1 -1
  67. package/web/_astro/{sankeyDiagram-5OEKKPKP.lm6N5ORM.js → sankeyDiagram-5OEKKPKP.BXohIHqx.js} +1 -1
  68. package/web/_astro/{sequenceDiagram-3UESZ5HK.E6_IV4Dj.js → sequenceDiagram-3UESZ5HK.C37ZIUzg.js} +1 -1
  69. package/web/_astro/{stateDiagram-AJRCARHV.Bnv6Ok2p.js → stateDiagram-AJRCARHV.BRgz317z.js} +1 -1
  70. package/web/_astro/{stateDiagram-v2-BHNVJYJU.mJHH_Ng_.js → stateDiagram-v2-BHNVJYJU.7VYSXN9-.js} +1 -1
  71. package/web/_astro/{timeline-definition-PNZ67QCA.BhRgqSLa.js → timeline-definition-PNZ67QCA.BVNz_HiN.js} +1 -1
  72. package/web/_astro/{vennDiagram-CIIHVFJN.pjb5DMC9.js → vennDiagram-CIIHVFJN.CHVDkPX4.js} +1 -1
  73. package/web/_astro/{wardleyDiagram-YWT4CUSO.CW20KUng.js → wardleyDiagram-YWT4CUSO.EQQ_qT9v.js} +1 -1
  74. package/web/_astro/{xychartDiagram-2RQKCTM6.vX9_yuMl.js → xychartDiagram-2RQKCTM6.DrAT9WoP.js} +1 -1
  75. package/web/index.html +2 -2
  76. package/web/_astro/BoardApp.ymfj1EHA.js +0 -1
  77. package/web/_astro/channel.Bxxe2Byc.js +0 -1
  78. package/web/_astro/index.BhvM3djt.css +0 -1
@@ -187,7 +187,9 @@ spur task record 0040 --verdict-file .spur/run/0040-verdict.json --solution-from
187
187
  - **`--solution-from-diff`** backfills `Solution` from `git diff -U0` hunk headers **only when the
188
188
  Solution section is still bare** — a safety net, not an overwrite.
189
189
  - **`--transition <status>`** optionally advances the lifecycle after writing (e.g. `testing`).
190
- `record` **never transitions to `done`** the `testing→done` gate stays in the workflow (0108).
190
+ `--transition done` is a **guarded** completion path: it requires a PASS verdict, auto-walks
191
+ `wip → testing → done`, and auto-creates the pipeline run-link (0436 R4); a non-PASS verdict to
192
+ `done` errors instead of transitioning, and the normal done gates still apply (0108).
191
193
 
192
194
  The verdict shape (`wbs`, `verdict`, `requirements[]`, `checks[]`) and the rendered tables are
193
195
  documented in [tasks/verbs.md](tasks/verbs.md).
@@ -209,7 +209,7 @@ spur workflow run ./workflows/approval.yaml --steer # interactive
209
209
  are exclusive (exit `2`); `--silent` cannot combine with either (exit `2`).
210
210
  - **`--detail <level>`** sets human verbosity: `minimal` (state changes only), `invocation` (default;
211
211
  per-step headers), `full` (transitions + correlation). `--verbose` is shorthand for `--detail full`.
212
- - **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/runs/workflow/`
212
+ - **`--trace-file`** appends a redacted, schema-versioned JSONL trace under `.spur/workflow/`
213
213
  for post-run analysis - independent of human/JSON output.
214
214
  - **`--no-log`** opts out of writing the consolidated all-in-one run log (`.spur/run/<RUNID>.log`).
215
215
  By default the log is written **and retained** after the run ends; this flag skips it entirely
@@ -280,7 +280,7 @@ not advertise `--json-envelope` because its JSON projection is a kept-raw docume
280
280
  | `--silent` | Suppress all routine output; errors still set a non-zero exit status. |
281
281
  | `--verbose` | Include transitions and correlation diagnostics in human progress (implies `--detail full`). |
282
282
  | `--detail <level>` | Human detail level: `minimal`, `invocation` (default), or `full`. |
283
- | `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/runs/workflow/`. |
283
+ | `--trace-file` | Append a redacted schema-versioned JSONL trace under `.spur/workflow/`. |
284
284
  | `--no-log` | Opt out of writing the consolidated `.spur/run/<RUNID>.log` (retained by default; propagates to `--async` workers). |
285
285
  | `--steer` | Accept in-process steering commands on stdin at declared action boundaries (sync only; incompatible with `--json`/`--async`). |
286
286
 
@@ -335,7 +335,7 @@ redirecting `agent.run` stages (ADR-047).
335
335
  - **Run-log reclamation** (0429): removes retained `.spur/run/<RUNID>.log` files whose mtime is older
336
336
  than `workflow.logRetentionDays` in `.spur/config.yaml` (default 30 days; integer days, not minutes).
337
337
  Age is the only gate; best-effort deletes never abort the rest. Never touches
338
- `.spur/runs/workflow/<RUNID>.jsonl` or `*-partial.md`.
338
+ `.spur/workflow/<RUNID>.jsonl` or `*-partial.md`.
339
339
  - **`--logs`** scopes to log reclamation only (skips stale-run finalization). `--dry-run` applies to
340
340
  both scopes (lists what would be removed, writes nothing). `--json` returns
341
341
  `{ olderThanMinutes, dryRun, cleaned, logs: { retentionDays, dryRun, reclaimed, failures } }` (with
@@ -652,21 +652,35 @@ Field semantics (enforced by `parseCheckpointMetadata` / `checkpointStaleness`):
652
652
  up once retention expires.
653
653
  - `source_commit` pins repository HEAD at write time; drift staleness is reported, not hidden.
654
654
  - `artifacts` lists referenced run files; a missing artifact makes the checkpoint stale.
655
- - Writers: write after every HITL gate decision, phase transition, and terminal state; overwrite
656
- the same file on resume (`session_id` = `<date>-<wbs-or-feature>`).
655
+
656
+ **Writer cadence (0784 R4).** There is exactly one canonical writer: the `task-pipeline` done
657
+ state's terminal checkpoint (`status: done`, real HEAD, run id from `$__runId`, and `$wbs`-expanded
658
+ artifact paths). It is a plain `shell` step — checkpoints are working memory, not CLI-gated corpus.
659
+ The `feature-dev`, `wrapup-pipeline`, and `idea-pipeline` pipelines used to echo pseudo-checkpoints
660
+ ("checkpoint: <workflow> done ...") that violated the canonical schema; those writers were removed
661
+ in 0784 — the persisted run row is the authoritative terminal record, and a non-canonical echo
662
+ cannot be resumed, routed, or reclaimed safely.
663
+
664
+ **Engine state vs checkpoint status (0784 R3).** The persisted run row's status is authoritative;
665
+ a checkpoint's `status` is an advisory projection written by consumers. On resume
666
+ (`workflow continue`), a checkpoint associated with the paused run must project a nonterminal
667
+ engine state — `pending`, `running`, or `approved` are accepted; `done`/`failed`/`cancelled`/
668
+ `skipped`, a missing status, or any unknown value refuse the resume with a named reason. The
669
+ engine owns no persisted `paused` checkpoint status.
657
670
 
658
671
  **Write checkpoints after:**
659
672
 
660
- - Every HITL gate decision (approved/rejected/deferred).
661
- - Every phase transition in `task-pipeline`, `feature-dev`, `idea-pipeline`, and
662
- `wrapup-pipeline`.
663
- - Every terminal state (`done`, `failed`, `cancelled`, `skipped`).
673
+ - Terminal task completion in `task-pipeline` (the canonical writer above).
674
+ - Any additional consumer-specific checkpoints you genuinely need for local resume; keep the
675
+ canonical schema — non-canonical files are ignored by routing and cleanup.
664
676
 
665
677
  **Read checkpoints when:**
666
678
 
667
679
  - `/sp:dev-run --continue` or `/sp:dev-runall --continue` is used.
668
680
  - The operator asks to resume a task or feature.
669
- - A workflow run is paused and later continued (`spur workflow continue <run-id>`).
681
+ - A workflow run is paused and later continued (`spur workflow continue <run-id>`). Resume
682
+ validates freshness in the run's recorded launch workdir (0784 R1/R3): artifacts resolve relative
683
+ to that workdir, and git HEAD is probed there — never in the ambient process cwd.
670
684
 
671
685
  **Rules:**
672
686
 
@@ -678,7 +692,8 @@ Field semantics (enforced by `parseCheckpointMetadata` / `checkpointStaleness`):
678
692
  - **Retention.** Terminal checkpoints older than `workflowLogRetentionDays` with no active run are
679
693
  reclaimed by `spur workflow clean` (task 0711 R5–R8); non-terminal checkpoints are always kept.
680
694
  - **Not a validated corpus.** Checkpoints are working memory. They are overwritten when a session
681
- resumes and re-checkpoints. They are NOT authoritative task state — the task file is.
695
+ resumes and re-checkpoints. They are NOT authoritative task state — the task file and the
696
+ persisted run row are.
682
697
  - **One file per session.** The `session_id` is `<date>-<wbs-or-feature>`. A resumed session
683
698
  overwrites the same file.
684
699
  - **Operator-readable.** The YAML frontmatter is machine-parseable; the body is free-form markdown
@@ -237,11 +237,11 @@ must not be changed without updating the backing skill.
237
237
  - **Inputs:**
238
238
  - `--feature <id>` **or** `--tasks <selector>` (required — at least one). `--feature` is sugar for `--tasks feature:<id>` (shared selector grammar: explicit WBS list, `feature:<id>`, `ready`, status pseudo-list — [execution-batch.md](execution-batch.md) Step 1). If both are present, `--tasks` wins (one-line note in the report).
239
239
  - Shared refine flags (passed through to each per-task refine): `--focus <mode>`, `--description <text>`, `--depth <standard|ready>`, `--agent <inline|auto|name>`, `--auto`.
240
- - Batch-only flags: `--keep-going` (continue independents after a failure; default halt), `--status <s>` (filter resolved membership; default **`backlog,todo`** — planning-side fill candidates), `--json` (machine-readable batch report).
240
+ - Batch-only flags: `--keep-going` (continue independents after a failure; default halt), `--status <s>` (filter resolved membership; default **`backlog` + `todo`** — planning-side fill candidates. The filter is applied in-agent against the frozen set; `spur task list --status` takes exactly one canonical status per call (see `execution-batch.md` Step 1).), `--json` (machine-readable batch report).
241
241
  - **Backing:** `sp:spur-dev` skill, `refineall` operation (orchestrates; per-task body is the single-task `refine` operation — never a second refine implementation).
242
242
  - **Behavior:**
243
243
  1. Resolve + **freeze** the set at kickoff (never re-query membership mid-batch).
244
- 2. Apply `--status` filter (default `backlog,todo`). Tasks already `done`/`cancelled`/`testing` are excluded unless the operator widens `--status`. Report each exclusion with reason.
244
+ 2. Apply `--status` filter (default `backlog` + `todo`; applied in-agent against the frozen set; `spur task list --status` takes exactly one canonical status per call — see `execution-batch.md` Step 1). Tasks already `done`/`cancelled`/`testing` are excluded unless the operator widens `--status`. Report each exclusion with reason.
245
245
  3. Topo-sort by `dependencies[]` (Kahn, WBS-ascending tie-break). Cycle → abort entire batch before any refine. Out-of-set deps: `done` → allow; else → block subtree (same as runall).
246
246
  4. For each WBS in order: invoke single-task refine with shared flags **including `--depth`**. Under `--auto` + **`--depth standard`** (default), the per-task **L3 pre-synthesis SKIP gate** still applies. Under **`--depth ready`**, each task runs the implement-ready checklist (no L3-only SKIP).
247
247
  5. Failure policy: **stop-the-batch** (default) or `--keep-going` (skip in-batch dependents of a failed refine; continue independents).
@@ -341,7 +341,7 @@ must not be changed without updating the backing skill.
341
341
  - `--approve-taste` — with `--auto`, skip **all** remaining taste pauses this run (idea-eval + design-approval). Sets `idea_approved=true` and `design_approved=true`.
342
342
  Aliases (prefer `--approve-taste`): `--idea-approved` → `idea_approved`; `--design-approved` → `design_approved`. There is **no** `--design` force flag.
343
343
  - **Backing:** `idea-pipeline.yaml` through the inline driver for omitted/`inline`, or `spur workflow run idea-pipeline.yaml --async` for `auto`/name.
344
- - **Behavior:** Builds vars from the table above and drives the idea pipeline. Flow: discovery → **idea-eval** (taste; reject → cancelled) → feature-create → ac-generate → feature-check → system-design (conditional) → design-approval (taste) → decompose → batch-create → handoff. STOPS at handoff — no task execution, no pipeline nesting. Headless runs use one `trace --follow`; cancellation is reported stopped only when `workflow cancel --json` returns `killed: true`.
344
+ - **Behavior:** Builds vars from the table above and drives the idea pipeline. Flow: discovery → **idea-eval** (taste; reject → cancelled) → feature-create → ac-generate → feature-check → system-design (conditional) → design-approval (taste) → decompose → batch-create (`--skip-ready`) ready-prepare (ready checklist per created task + ready-evidence sidecar, 0788) → handoff. STOPS at handoff — no task execution, no pipeline nesting. Headless runs use one `trace --follow`; cancellation is reported stopped only when `workflow cancel --json` returns `killed: true`.
345
345
  - **Delegation:** Host-session inline driver by default; explicit executor selection uses the async workflow worker.
346
346
  - **Idea-evaluation gate:** After discovery, operator reviews `.spur/run/idea-eval-report.md` ([idea-evaluation.md](idea-evaluation.md)). Approve continues; reject/cancel → no feature. Under `--auto`, still pauses unless taste pre-cleared (`--approve-taste` / alias). Enhanced idea is a sidecar — `vars.idea` is not overwritten.
347
347
  - **Design package (`--skip-design` only):**
@@ -149,7 +149,10 @@ passed, so provenance denied first and Review L3 denied on the retry.
149
149
 
150
150
  | # | Gate layer | Triggers denial when | Remediation |
151
151
  |---|------------|----------------------|-------------|
152
- | 1 | **Strict-core + verdict artifact** (`spur task check <wbs> --strict-core` + `done-transition-guard.ts`) | The strict-core check fails, or `.spur/run/<wbs>-verdict.json` is **missing** or has a non-PASS aggregate. **Missing artifact is a deny** (not a silent allow — closes the 0349 "done without verdict" class). The aggregate is recomputed from requirement/AC rows; the harsher of stored and computed wins. | Re-run `/sp:dev-verify <wbs>` until PASS (writes the artifact), or explicitly override with `spur task update <wbs> done --force-done --reason "<why>"`. Docs-only pipelines write a docs PASS stub under `.spur/run/` before `done` (see `docs-pipeline.yaml`). |
152
+ | 1 | **Strict-core + verdict artifact** (`spur task check <wbs> --strict-core` + `done-transition-guard.ts`) | The strict-core check fails, or `.spur/run/<wbs>-verdict.json` is **missing** or has a non-PASS aggregate. **Missing artifact is a deny** (not a silent allow — closes the 0349 "done without verdict" class). The aggregate is recomputed from requirement/AC rows; the harsher of stored and computed wins. | Re-run `/sp:dev-verify <wbs>` until PASS (writes the artifact), or explicitly override with `spur task update <wbs> done --force-done --reason "<why>"`. Docs-only pipelines (`docs-pipeline.yaml`) meet the same layer: read-only measured verification
153
+ (answer file + `spur task verdict`) writes the standard `.spur/run/<wbs>-verdict.json` artifact
154
+ under proof-input digest bracketing; missing or non-PASS evidence is a refusal, never a synthetic
155
+ PASS stub. |
153
156
  | 2 | **Provenance guard** (`lifecycle-adapter.ts`) | No pipeline-kind run link exists for `<wbs>`. | Run `/sp:dev-run <wbs>` through the full pipeline, use `/sp:dev-run <wbs> --mode implement --auto --next` for the explicit step chain, or record the audited bypass with `SPUR_PROVENANCE_OVERRIDE=1`. |
154
157
  | 3 | **Review L3** (`task-check.ts`) | `### Review` is empty, placeholder-only, or lacks a populated P1–P4 findings table. | Run `/sp:dev-review <wbs>`; verify cannot write Review because of the Step 10 prohibition above. |
155
158
 
@@ -165,6 +165,10 @@
165
165
  "type": "string",
166
166
  "enum": ["cheap", "standard", "capable-1", "capable-2", "capable-3"],
167
167
  "description": "Capability tier for stage-registry adaptive model routing (ADR-033, 0343). Live values: cheap | standard | capable-1 | capable-2 | capable-3 (1=low output quality, 3=high within the capable band). A stage starts on the cheapest eligible executor meeting its model_policy min_tier. Bare legacy `capable` is accepted at runtime (zod preprocess \u2192 capable-1) during the deprecation window but is not part of this editor enum."
168
+ },
169
+ "disabled": {
170
+ "type": "boolean",
171
+ "description": "Routing kill-switch (111): a disabled profile never serves a role, team, stage, or explicit selection, and doctor inventories it without probing. Omitted = enabled; only true/false accepted (no string/number/null coercion)."
168
172
  }
169
173
  }
170
174
  }