@gobing-ai/spur 0.3.75 → 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 (66) 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/package.json +9 -9
  7. package/plugins/sp/commands/dev-refineall.md +2 -2
  8. package/plugins/sp/plugin.json +1 -1
  9. package/plugins/sp/skills/dogfood-testing/SKILL.md +7 -4
  10. package/plugins/sp/skills/spur-cli/references/tasks/section-editing.md +9 -3
  11. package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +5 -3
  12. package/plugins/sp/skills/spur-cli/references/workflows.md +3 -3
  13. package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
  14. package/schemas/spur-config.schema.json +4 -0
  15. package/spur.js +1854 -665
  16. package/web/_astro/{BoardApp.BOW1815F.js → BoardApp.CHQ1lycZ.js} +83 -83
  17. package/web/_astro/BoardApp.DV9kx0wo.js +1 -0
  18. package/web/_astro/{TaskDetail.CX6C7dSJ.js → TaskDetail.GKfQJ60c.js} +1 -1
  19. package/web/_astro/{arc.CwSvH1ji.js → arc.DWEtA3Tx.js} +1 -1
  20. package/web/_astro/{architectureDiagram-3BPJPVTR.Dxne1RvP.js → architectureDiagram-3BPJPVTR.DB42oWmP.js} +1 -1
  21. package/web/_astro/{blockDiagram-GPEHLZMM.D9Fb14rC.js → blockDiagram-GPEHLZMM.rhv-zNQV.js} +1 -1
  22. package/web/_astro/{c4Diagram-AAUBKEIU.DmvWSFvv.js → c4Diagram-AAUBKEIU.Ci4-4VvY.js} +1 -1
  23. package/web/_astro/channel.BAI6xLeV.js +1 -0
  24. package/web/_astro/{chunk-2J33WTMH.BCCktIrE.js → chunk-2J33WTMH.Cc9veUgf.js} +1 -1
  25. package/web/_astro/{chunk-4BX2VUAB.BzCk9q27.js → chunk-4BX2VUAB.Bec9c4eI.js} +1 -1
  26. package/web/_astro/{chunk-55IACEB6.CZXVgTk4.js → chunk-55IACEB6.DoV8S1iB.js} +1 -1
  27. package/web/_astro/{chunk-727SXJPM.CJL8UIpX.js → chunk-727SXJPM.DwR-Qlyj.js} +1 -1
  28. package/web/_astro/{chunk-AQP2D5EJ.Dz8MDEdw.js → chunk-AQP2D5EJ.ND_a81WY.js} +1 -1
  29. package/web/_astro/{chunk-FMBD7UC4.CkQeYYUw.js → chunk-FMBD7UC4.Wv_jwG48.js} +1 -1
  30. package/web/_astro/{chunk-ND2GUHAM.KiC1QgzH.js → chunk-ND2GUHAM.CXKXCMmp.js} +1 -1
  31. package/web/_astro/{chunk-QZHKN3VN.AJ08mw2e.js → chunk-QZHKN3VN.nkaoNYQq.js} +1 -1
  32. package/web/_astro/{classDiagram-4FO5ZUOK.DRWRDKzK.js → classDiagram-4FO5ZUOK.cMQcVlQu.js} +1 -1
  33. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DRWRDKzK.js → classDiagram-v2-Q7XG4LA2.cMQcVlQu.js} +1 -1
  34. package/web/_astro/{cose-bilkent-S5V4N54A.CavydfLP.js → cose-bilkent-S5V4N54A.OaDJ7Mr2.js} +1 -1
  35. package/web/_astro/{cynefin-OW5HDTMX.D_7o_a0B.js → cynefin-OW5HDTMX.Chi8IphF.js} +1 -1
  36. package/web/_astro/{dagre-BM42HDAG.LWk2dKgg.js → dagre-BM42HDAG.CzK2t_Fp.js} +1 -1
  37. package/web/_astro/{diagram-2AECGRRQ.82lbq6aB.js → diagram-2AECGRRQ.DRvxlVS7.js} +1 -1
  38. package/web/_astro/{diagram-5GNKFQAL.hyNL1pwY.js → diagram-5GNKFQAL.CnYvNdwA.js} +1 -1
  39. package/web/_astro/{diagram-KO2AKTUF.BaLqVf-b.js → diagram-KO2AKTUF.CpLpMw5R.js} +1 -1
  40. package/web/_astro/{diagram-LMA3HP47.DQJxj0oz.js → diagram-LMA3HP47.JTb78qUA.js} +1 -1
  41. package/web/_astro/{diagram-OG6HWLK6.DhlL8cG2.js → diagram-OG6HWLK6.Bk-1jDIb.js} +1 -1
  42. package/web/_astro/{erDiagram-TEJ5UH35.HoTnXwkF.js → erDiagram-TEJ5UH35.D8hN9GZq.js} +1 -1
  43. package/web/_astro/{flowDiagram-I6XJVG4X.DkFKlZIZ.js → flowDiagram-I6XJVG4X.-6zQr6m5.js} +1 -1
  44. package/web/_astro/{ganttDiagram-6RSMTGT7.9qPfOTDb.js → ganttDiagram-6RSMTGT7.DboLQ9ca.js} +1 -1
  45. package/web/_astro/{gitGraphDiagram-PVQCEYII.B4G18Dwc.js → gitGraphDiagram-PVQCEYII.4tYvJKGR.js} +1 -1
  46. package/web/_astro/{infoDiagram-5YYISTIA.e3KJkXAM.js → infoDiagram-5YYISTIA.Bd9rXpsB.js} +1 -1
  47. package/web/_astro/{ishikawaDiagram-YF4QCWOH.CY3yddhD.js → ishikawaDiagram-YF4QCWOH.CvMoaf67.js} +1 -1
  48. package/web/_astro/{journeyDiagram-JHISSGLW.DaAKIO1t.js → journeyDiagram-JHISSGLW.Ccy1CA7y.js} +1 -1
  49. package/web/_astro/{kanban-definition-UN3LZRKU.DGkDddtc.js → kanban-definition-UN3LZRKU.0MaMqHNS.js} +1 -1
  50. package/web/_astro/{linear.DnDPcpd1.js → linear.CHXgcIbN.js} +1 -1
  51. package/web/_astro/{mermaid.core.1uBmxa9t.js → mermaid.core.Ca-kcelG.js} +4 -4
  52. package/web/_astro/{mindmap-definition-RKZ34NQL.XFJVayxw.js → mindmap-definition-RKZ34NQL.BUIDlHa0.js} +1 -1
  53. package/web/_astro/{pieDiagram-4H26LBE5.BXm2OgHh.js → pieDiagram-4H26LBE5.2dX3CU1s.js} +1 -1
  54. package/web/_astro/{quadrantDiagram-W4KKPZXB.DgB2p5fc.js → quadrantDiagram-W4KKPZXB.B3LBlRiv.js} +1 -1
  55. package/web/_astro/{requirementDiagram-4Y6WPE33.jBR39bnS.js → requirementDiagram-4Y6WPE33.X12I2uNx.js} +1 -1
  56. package/web/_astro/{sankeyDiagram-5OEKKPKP.N3u9OhE3.js → sankeyDiagram-5OEKKPKP.BXohIHqx.js} +1 -1
  57. package/web/_astro/{sequenceDiagram-3UESZ5HK.CZhqZXNL.js → sequenceDiagram-3UESZ5HK.C37ZIUzg.js} +1 -1
  58. package/web/_astro/{stateDiagram-AJRCARHV.DlNu1VEa.js → stateDiagram-AJRCARHV.BRgz317z.js} +1 -1
  59. package/web/_astro/{stateDiagram-v2-BHNVJYJU.BEqi8NQV.js → stateDiagram-v2-BHNVJYJU.7VYSXN9-.js} +1 -1
  60. package/web/_astro/{timeline-definition-PNZ67QCA.BPcexclc.js → timeline-definition-PNZ67QCA.BVNz_HiN.js} +1 -1
  61. package/web/_astro/{vennDiagram-CIIHVFJN.BZalxKGQ.js → vennDiagram-CIIHVFJN.CHVDkPX4.js} +1 -1
  62. package/web/_astro/{wardleyDiagram-YWT4CUSO.BqOljod9.js → wardleyDiagram-YWT4CUSO.EQQ_qT9v.js} +1 -1
  63. package/web/_astro/{xychartDiagram-2RQKCTM6.tkO4ppN5.js → xychartDiagram-2RQKCTM6.DrAT9WoP.js} +1 -1
  64. package/web/index.html +1 -1
  65. package/web/_astro/BoardApp.C4zimv1U.js +0 -1
  66. package/web/_astro/channel.CQHdDVp9.js +0 -1
@@ -7,7 +7,7 @@
7
7
  "plugins": [
8
8
  {
9
9
  "name": "sp",
10
- "version": "0.3.75",
10
+ "version": "0.3.76",
11
11
  "source": "./plugins/sp"
12
12
  }
13
13
  ]
@@ -130,6 +130,12 @@ agent:
130
130
  # agent: omp
131
131
  # model: minimax/MiniMax-M3
132
132
  # tier: cheap
133
+ # A disabled profile stays visible to `spur agent doctor` but never routes
134
+ # (no role, team, stage, or explicit selection). Flip back to enabled by
135
+ # removing the line or setting disabled: false.
136
+ # - name: retired-profile
137
+ # agent: omp
138
+ # disabled: true
133
139
  - name: pi-dsv4-flash-volc
134
140
  agent: pi
135
141
  # tier: standard
@@ -9,7 +9,7 @@ install or to ts-libs.
9
9
 
10
10
  | Category | Dir | Purpose |
11
11
  |---|---|---|
12
- | `typescript` | `typescript/` | TypeScript tooling, output boundaries, biome-suppression ban, no `debugger` |
12
+ | `typescript` | `typescript/` | TypeScript tooling, output boundaries, biome/eslint-suppression ban, no `debugger` |
13
13
  | `strict` | `strict/` | Opt-in strict rules (runtime boundaries, HTTP boundaries, structural) |
14
14
  | `boundary` | `boundary/` | DB/DAO boundary enforcement |
15
15
  | `structure` | `structure/` | File layout, protected files, no focused/skipped tests |
@@ -69,6 +69,7 @@ rules:
69
69
  # Synchronous bootstrap & path resolution:
70
70
  - "packages/config/src/bundled-config.ts" # sync bundledConfigRoot() directory walk
71
71
  - "packages/config/src/loader.ts" # sync resolveConfigFile() / schema specifier lookup
72
+ - "packages/config/src/executor-update.ts" # atomic single-entry config update (task 0797): O_EXCL lock, fsync'd tmp+rename commit, lstat symlink refusal, mode preservation — ts-runtime FileSystem seam has no lstat/fsync/chmod/O_EXCL
72
73
  - "packages/app/src/services/project-start.ts" # sync CLI binary path checks before daemon spawn
73
74
 
74
75
  # Synchronous template & workflow resolvers:
@@ -0,0 +1,30 @@
1
+ $schema: "@gobing-ai/spur/schemas/rule-file.schema.json"
2
+ # No ESLint suppression comments. Spur lints with Biome, not ESLint; leftover
3
+ # `eslint-disable*` comments are dead suppressions that hide the real fix and
4
+ # would not even silence the live gate. Sibling of `no-biome-suppressions`
5
+ # (AGENTS.md: never suppress a gate to force green).
6
+ #
7
+ # Tests ARE in scope: an eslint-disable in a test is the same bypass.
8
+ include:
9
+ - "apps/**/*.ts"
10
+ - "apps/**/*.tsx"
11
+ - "packages/**/*.ts"
12
+ - "packages/**/*.tsx"
13
+ - "plugins/**/*.ts"
14
+ - "scripts/**/*.ts"
15
+ exclude:
16
+ - "**/node_modules/**"
17
+ - "**/dist/**"
18
+ - "**/vendors/**"
19
+ rules:
20
+ - id: no-eslint-suppressions
21
+ description: >
22
+ Do not use ESLint disable comments (file, line, or next-line forms).
23
+ Spur lints with Biome; an ESLint suppression does not silence the live
24
+ gate and hides the real fix. Remove the comment and fix the underlying
25
+ issue (AGENTS.md: no suppressions to force green).
26
+ severity: error
27
+ evaluator:
28
+ type: rg
29
+ config:
30
+ pattern: "eslint-disable"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.75",
3
+ "version": "0.3.76",
4
4
  "description": "Spur CLI — local-first harness for mainstream coding agents: constraint checking, workflow orchestration, agent health, and history analytics. Bun-native; exposes the `spur` command.",
5
5
  "keywords": [
6
6
  "spur",
@@ -53,14 +53,14 @@
53
53
  },
54
54
  "devDependencies": {
55
55
  "@commander-js/extra-typings": "^14.0.0",
56
- "@gobing-ai/ts-db": "^0.4.56",
57
- "@gobing-ai/ts-ai-runner": "^0.4.56",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.56",
59
- "@gobing-ai/ts-infra": "^0.4.56",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.56",
61
- "@gobing-ai/ts-rule-engine": "^0.4.56",
62
- "@gobing-ai/ts-runtime": "^0.4.56",
63
- "@gobing-ai/ts-utils": "^0.4.56",
56
+ "@gobing-ai/ts-db": "^0.4.57",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.57",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.57",
59
+ "@gobing-ai/ts-infra": "^0.4.57",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.57",
61
+ "@gobing-ai/ts-rule-engine": "^0.4.57",
62
+ "@gobing-ai/ts-runtime": "^0.4.57",
63
+ "@gobing-ai/ts-utils": "^0.4.57",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -23,7 +23,7 @@ operation, applied to a resolved set (typically every task under a feature). Pas
23
23
  | `--agent` `<inline\|auto\|name>` | Who runs the model-bearing refinement. | omit |
24
24
  | `--auto` | Skip objective HITL gates. | off |
25
25
  | `--keep-going` | Continue past per-task failures. | off |
26
- | `--status` `<s>` | Only refine tasks in a status. | backlog,todo |
26
+ | `--status` `<s>` | Only refine tasks in these statuses (applied in-agent to the frozen set). | `backlog` + `todo` |
27
27
  | `--json` | Emit structured JSON. | off |
28
28
  | `--worktree` `[<name>]` | Run the batch in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. | off |
29
29
 
@@ -39,7 +39,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
39
39
  Flags: `--feature` (sugar for `feature:<id>`), `--tasks <selector>`, shared refine flags
40
40
  (`--focus`, `--description`, `--depth`, `--agent`, `--auto`),
41
41
  plus `--keep-going`,
42
- `--status` (default `backlog,todo`),
42
+ `--status` (default `backlog` + `todo`),
43
43
  `--json`, `--worktree` `[<name>]` (run the batch in an isolated git worktree — FF-merge onto the base ref on
44
44
  full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree, `<name>`
45
45
  form adopts an existing worktree by name/path/branch; see `execution-batch.md` § Worktree
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.75",
3
+ "version": "0.3.76",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -75,8 +75,11 @@ The command forwards these via `$ARGUMENTS`:
75
75
  > independent mutation sources is present:
76
76
  >
77
77
  > - **Pipeline-driving testees** — tokens
78
- > [`--next`, `dev-runall`, `dev-wrapall`, `dev-run`, `dev-wrap`, `dev-idea`,
79
- > `runall`, `wrapall`, `run`, `wrap`, `idea`] matched as a **distinct hyphen-word**
78
+ > <!-- pipeline-tokens:start -->
79
+ > [`--next`, `dev-runall`, `dev-wrapall`, `dev-refineall`, `dev-verifyall`, `dev-run`, `dev-wrap`, `dev-idea`,
80
+ > `refineall`, `verifyall`, `runall`, `wrapall`, `run`, `wrap`, `idea`]
81
+ > <!-- pipeline-tokens:end -->
82
+ > matched as a **distinct hyphen-word**
80
83
  > (machine-checked by
81
84
  > [`detectPipelineDriving`](../../scripts/dogfood-testing/detect-pipeline-driving.ts);
82
85
  > see [§Pipeline-driving word-boundary contract](#pipeline-driving-word-boundary-contract))
@@ -335,8 +338,8 @@ node "$(superskill script path sp dogfood-testing/detect-pipeline-driving.mjs)"
335
338
 
336
339
  | Token shape | Examples | Matches | Rejects |
337
340
  |-------------|----------|---------|---------|
338
- | Flag / complete | `--next`, `dev-run`, `dev-runall`, `dev-wrap`, `dev-wrapall`, `dev-idea` | `/sp:dev-run 0125`, bare `--next` | `--next-gen`, `dev-runner` |
339
- | Bare noun | `run`, `runall`, `wrap`, `wrapall`, `idea` | `task run 0042` | `runaway`, `wrapper`, `idealist` |
341
+ | Flag / complete | <!-- pipeline-tokens:start -->`--next`, `dev-run`, `dev-runall`, `dev-wrap`, `dev-wrapall`, `dev-idea`, `dev-refineall`, `dev-verifyall`<!-- pipeline-tokens:end --> | `/sp:dev-run 0125`, bare `--next` | `--next-gen`, `dev-runner` |
342
+ | Bare noun | <!-- pipeline-tokens:start -->`run`, `runall`, `wrap`, `wrapall`, `idea`, `refineall`, `verifyall`<!-- pipeline-tokens:end --> | `task run 0042` | `runaway`, `wrapper`, `idealist` |
340
343
 
341
344
  `-` is a **word character** for boundaries: a token must be a distinct hyphen-word. Contract tests:
342
345
  `plugins/sp/tests/dogfood-testing/pipeline-detect.test.ts`. Helpers:
@@ -9,8 +9,8 @@ see_also:
9
9
 
10
10
  Task bodies are edited section-by-section through `spur task update --section <name> --from-file
11
11
  <path>`. The write is **file-wins and crash-safe** (atomic write): the named section's body is
12
- replaced wholesale from the file you point at. There is no inline-body flag always stage the new
13
- body in a file first.
12
+ replaced wholesale from the file you point at with one exception, `Q&A`, which appends (see
13
+ below). There is no inline-body flag — always stage the new body in a file first.
14
14
 
15
15
  For **pipeline output**, section authorship is one-writer-per-section (F92 0593 R1):
16
16
  `Testing` comes from `spur task record` (deterministic, from a verify verdict artifact — the
@@ -23,6 +23,8 @@ for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any narrative s
23
23
 
24
24
  1. **Assemble the full section body** in a temp file. The body is everything *under* the `###`
25
25
  heading — do not include the heading line itself; the CLI owns the heading.
26
+ Sub-headings inside the body MUST be `####` or deeper: a `###` in a body parses as a new
27
+ top-level section and trips `L2.disallowed-section` (task 0787 grew 8 phantom sections this way).
26
28
 
27
29
  ```bash
28
30
  cat > /tmp/review.md <<'EOF'
@@ -42,7 +44,11 @@ for `Plan`, `Acceptance Criteria`, hand-authored `Solution`, and any narrative s
42
44
 
43
45
  3. The whole `### Review` body is now that file's contents. To amend rather than overwrite, read
44
46
  the current body (`spur task show 0040`), edit the temp file to the full desired state, and
45
- replace again — there is no append mode.
47
+ replace again — there is no append mode for ordinary sections.
48
+
49
+ **`Q&A` is the exception.** `--section "Q&A"` APPENDS a timestamped `#### Q&A entry — <ISO>`
50
+ block rather than replacing the section. Start the body with `<!-- qa:replace -->` to replace it
51
+ wholesale.
46
52
 
47
53
  `--section` **requires** `--from-file` (exit `2` otherwise). Section names match the DD-08 headings
48
54
  exactly: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes` (universal sections are `History`, `References`, `Notes`; `Root Cause` is carried by the `issue` template variant).
@@ -61,8 +61,10 @@ frontmatter scalar.
61
61
  to avoid orphaned nested lifecycle runs). **It is not a guard bypass** — the `wip→testing` and
62
62
  `testing→done` `check` gates above still run; the CLI evaluates them inline when the FSM guard
63
63
  does not. `--force-done` waives the verify **verdict** only, never the section matrix.
64
- - **Section** (`--section` **requires** `--from-file`): replaces the entire named section body from
65
- the file. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
64
+ - **Section** (`--section` **requires** `--from-file`): writes the named section body from the file.
65
+ Most sections replace wholesale. Exception: `--section "Q&A"` APPENDS a timestamped
66
+ `#### Q&A entry — <ISO>` block; start the body with `<!-- qa:replace -->` to replace the section
67
+ wholesale. No inline-body flag. Section names: `Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Testing`, `Review`, `References`, `History`, `Notes`.
66
68
  - **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
67
69
  existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
68
70
 
@@ -85,7 +87,7 @@ Flags: `--folder <path>`, `--json`. Exit codes: `0` success, `1` error, `2` usag
85
87
 
86
88
  ## `sections <wbs> <op> [name]`
87
89
 
88
- CLI-safe, matrix-enforced task section mutation. Section names are validated against canonical sections (`Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes`). Universal sections (`History`, `References`, `Notes`) are always allowed; `Root Cause` is carried by the `issue` template variant.
90
+ CLI-safe, matrix-enforced task section mutation. Section names are validated against canonical sections (`Background`, `Requirements`, `Acceptance Criteria`, `Q&A`, `Design`, `Plan`, `Solution`, `Root Cause`, `Testing`, `Review`, `References`, `History`, `Notes`). Universal sections (`History`, `References`, `Notes`) are always allowed; `Root Cause` is carried by the `issue` template variant. `Q&A` on `update --section` appends rather than replacing (see the Section bullet above); `<!-- qa:replace -->` forces a wholesale replace.
89
91
 
90
92
  | Op | Usage | Description |
91
93
  | --- | --- | --- |
@@ -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
@@ -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).
@@ -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
  }