@gobing-ai/spur 0.3.49 → 0.3.50

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 (61) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/corpus-baseline.json +12144 -3
  3. package/package.json +9 -9
  4. package/plugins/sp/plugin.json +1 -1
  5. package/plugins/sp/skills/code-verification/SKILL.md +14 -0
  6. package/plugins/sp/skills/spur-cli/references/tasks.md +1 -0
  7. package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +18 -2
  8. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +14 -6
  9. package/spur.js +4754 -5592
  10. package/web/_astro/BoardApp.pdtYu-yW.js +1 -0
  11. package/web/_astro/{BoardApp.BjQUNhuj.js → BoardApp.plVXYkKo.js} +11 -11
  12. package/web/_astro/{TaskDetail.CVBuD6dF.js → TaskDetail.5DIyVQ_N.js} +1 -1
  13. package/web/_astro/{arc.BMMjdODi.js → arc.BnUgL7ho.js} +1 -1
  14. package/web/_astro/{architectureDiagram-3BPJPVTR.BU5ShzXf.js → architectureDiagram-3BPJPVTR.B9YMJau-.js} +1 -1
  15. package/web/_astro/{blockDiagram-GPEHLZMM.Bj1iEqPD.js → blockDiagram-GPEHLZMM.Dw2qgvWJ.js} +1 -1
  16. package/web/_astro/{c4Diagram-AAUBKEIU.vX8wepCL.js → c4Diagram-AAUBKEIU.jTbU0-Nk.js} +1 -1
  17. package/web/_astro/channel.DEqvaz-I.js +1 -0
  18. package/web/_astro/{chunk-2J33WTMH.BKAipTym.js → chunk-2J33WTMH.Di46EtkU.js} +1 -1
  19. package/web/_astro/{chunk-4BX2VUAB.B68XkPG7.js → chunk-4BX2VUAB.DweHBwqQ.js} +1 -1
  20. package/web/_astro/{chunk-55IACEB6.BmeDLcrc.js → chunk-55IACEB6.rRjTKaa7.js} +1 -1
  21. package/web/_astro/{chunk-727SXJPM.PDuBA3Kw.js → chunk-727SXJPM.BkEQIkSV.js} +1 -1
  22. package/web/_astro/{chunk-AQP2D5EJ.C7A044za.js → chunk-AQP2D5EJ.Cfe9IvAd.js} +1 -1
  23. package/web/_astro/{chunk-FMBD7UC4.BtzKKFqR.js → chunk-FMBD7UC4.fI6tLbeN.js} +1 -1
  24. package/web/_astro/{chunk-ND2GUHAM.BJuDeeOy.js → chunk-ND2GUHAM.BIjgpq0O.js} +1 -1
  25. package/web/_astro/{chunk-QZHKN3VN.DSeMDgcQ.js → chunk-QZHKN3VN.ZwLnVxyz.js} +1 -1
  26. package/web/_astro/{classDiagram-4FO5ZUOK.D53Q4tCw.js → classDiagram-4FO5ZUOK.BJAGYidE.js} +1 -1
  27. package/web/_astro/{classDiagram-v2-Q7XG4LA2.D53Q4tCw.js → classDiagram-v2-Q7XG4LA2.BJAGYidE.js} +1 -1
  28. package/web/_astro/{cose-bilkent-S5V4N54A.c712AFRH.js → cose-bilkent-S5V4N54A.B5y3nz26.js} +1 -1
  29. package/web/_astro/{dagre-BM42HDAG.D-idisph.js → dagre-BM42HDAG.DHmw0ZBC.js} +1 -1
  30. package/web/_astro/{diagram-2AECGRRQ.DLgnsJCU.js → diagram-2AECGRRQ.10gapJfY.js} +1 -1
  31. package/web/_astro/{diagram-5GNKFQAL.BiaxBVqx.js → diagram-5GNKFQAL.Gh33_drM.js} +1 -1
  32. package/web/_astro/{diagram-KO2AKTUF.C8HX1vd8.js → diagram-KO2AKTUF.8ROWlfcX.js} +1 -1
  33. package/web/_astro/{diagram-LMA3HP47.CfqDLLes.js → diagram-LMA3HP47.BsP3tKmg.js} +1 -1
  34. package/web/_astro/{diagram-OG6HWLK6.15SDiEed.js → diagram-OG6HWLK6.DM2WFDhU.js} +1 -1
  35. package/web/_astro/{erDiagram-TEJ5UH35.DksYtOYM.js → erDiagram-TEJ5UH35.royaC_lH.js} +1 -1
  36. package/web/_astro/{flowDiagram-I6XJVG4X.DR_Au-HV.js → flowDiagram-I6XJVG4X.C9GEvIie.js} +1 -1
  37. package/web/_astro/{ganttDiagram-6RSMTGT7.CHhHrffI.js → ganttDiagram-6RSMTGT7.CXO4T2U0.js} +1 -1
  38. package/web/_astro/{gitGraphDiagram-PVQCEYII.B2Xehvam.js → gitGraphDiagram-PVQCEYII.Q02KzYH7.js} +1 -1
  39. package/web/_astro/{infoDiagram-5YYISTIA.C9c3CNNN.js → infoDiagram-5YYISTIA.DNfSDKJt.js} +1 -1
  40. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BibUHkh8.js → ishikawaDiagram-YF4QCWOH.BFttvtgJ.js} +1 -1
  41. package/web/_astro/{journeyDiagram-JHISSGLW.BYoVHiyO.js → journeyDiagram-JHISSGLW.Cfm-2SbG.js} +1 -1
  42. package/web/_astro/{kanban-definition-UN3LZRKU.CM1K5wHE.js → kanban-definition-UN3LZRKU.BWGNW6fV.js} +1 -1
  43. package/web/_astro/{linear.SPpjJUb-.js → linear.BprdUk2Y.js} +1 -1
  44. package/web/_astro/{mermaid.core.BAgx3nnb.js → mermaid.core.B2zRNxtX.js} +4 -4
  45. package/web/_astro/{mindmap-definition-RKZ34NQL.D35oPG1R.js → mindmap-definition-RKZ34NQL.g9jij8sw.js} +1 -1
  46. package/web/_astro/{pieDiagram-4H26LBE5.DiWuRwk7.js → pieDiagram-4H26LBE5.CbzR4n5b.js} +1 -1
  47. package/web/_astro/{quadrantDiagram-W4KKPZXB.B9PBzTWn.js → quadrantDiagram-W4KKPZXB.DxV3viWt.js} +1 -1
  48. package/web/_astro/{requirementDiagram-4Y6WPE33.CYuuamFN.js → requirementDiagram-4Y6WPE33.DvAb90JS.js} +1 -1
  49. package/web/_astro/{sankeyDiagram-5OEKKPKP.W24UhhtD.js → sankeyDiagram-5OEKKPKP.CIFz5t4D.js} +1 -1
  50. package/web/_astro/{sequenceDiagram-3UESZ5HK.BpbNjA51.js → sequenceDiagram-3UESZ5HK.DzlEQynd.js} +1 -1
  51. package/web/_astro/{stateDiagram-AJRCARHV.DqVsHudf.js → stateDiagram-AJRCARHV.Dph2V-ts.js} +1 -1
  52. package/web/_astro/{stateDiagram-v2-BHNVJYJU.CzwHYX81.js → stateDiagram-v2-BHNVJYJU.wJhfrLAy.js} +1 -1
  53. package/web/_astro/{timeline-definition-PNZ67QCA.Bc3B6djw.js → timeline-definition-PNZ67QCA.BrSiyubX.js} +1 -1
  54. package/web/_astro/{vennDiagram-CIIHVFJN.C-D5rh8O.js → vennDiagram-CIIHVFJN.COobPrUX.js} +1 -1
  55. package/web/_astro/{wardley-L42UT6IY.D7PdYCqn.js → wardley-L42UT6IY.CrjeTx8A.js} +1 -1
  56. package/web/_astro/{wardleyDiagram-YWT4CUSO.CwmJKXF3.js → wardleyDiagram-YWT4CUSO.B8_fTQ8E.js} +1 -1
  57. package/web/_astro/{xychartDiagram-2RQKCTM6.avDYnLsb.js → xychartDiagram-2RQKCTM6.BPpokgVv.js} +1 -1
  58. package/web/favicon.svg +1 -0
  59. package/web/index.html +1 -1
  60. package/web/_astro/BoardApp.8hiqShQn.js +0 -1
  61. package/web/_astro/channel.EwdSemIC.js +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/spur",
3
- "version": "0.3.49",
3
+ "version": "0.3.50",
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.35",
57
- "@gobing-ai/ts-ai-runner": "^0.4.35",
58
- "@gobing-ai/ts-dual-workflow-engine": "^0.4.35",
59
- "@gobing-ai/ts-infra": "^0.4.35",
60
- "@gobing-ai/ts-llm-jsonl-importer": "^0.4.31",
61
- "@gobing-ai/ts-rule-engine": "^0.4.35",
62
- "@gobing-ai/ts-runtime": "^0.4.35",
63
- "@gobing-ai/ts-utils": "^0.4.35",
56
+ "@gobing-ai/ts-db": "^0.4.38",
57
+ "@gobing-ai/ts-ai-runner": "^0.4.38",
58
+ "@gobing-ai/ts-dual-workflow-engine": "^0.4.38",
59
+ "@gobing-ai/ts-infra": "^0.4.38",
60
+ "@gobing-ai/ts-llm-jsonl-importer": "^0.4.38",
61
+ "@gobing-ai/ts-rule-engine": "^0.4.38",
62
+ "@gobing-ai/ts-runtime": "^0.4.38",
63
+ "@gobing-ai/ts-utils": "^0.4.38",
64
64
  "@types/bun": "1.3.14",
65
65
  "@types/figlet": "^1.7.0",
66
66
  "@types/node-notifier": "8.0.5",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.49",
3
+ "version": "0.3.50",
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"]
@@ -127,6 +127,20 @@ heading/comment unrelated to the requirement fails the row to UNMET and surfaces
127
127
  a finding (severity >= P2). This closes the gap where a verify run certified a task `done` citing
128
128
  `evidence:134` that was actually a sibling ticket's telemetry text (0299 R1, from the 0282 re-audit).
129
129
 
130
+ **External evidence (task 0584 / ADR-062) — legal citation form.** Evidence that lives OUTSIDE this
131
+ repository has a frozen non-anchor form: a named origin plus a backticked path with the line number
132
+ **outside** the backticks.
133
+
134
+ ```
135
+ Evidence: @gobing-ai/ts-llm-jsonl-importer `src/mappers.ts` line 481 — omp call_id write
136
+ ```
137
+
138
+ Use this form ONLY when the evidence genuinely lives outside `spur`'s working tree (a `@gobing-ai/ts-*`
139
+ source under `~/xprojects/ts-libs`, or a gitignored `.spur/run/**` artifact). `checkLineAnchors`
140
+ classifies it as external and never raises `L4.stale-line-anchor` for it (R1). Do NOT use it for a file
141
+ that lives in this repo — in-repo evidence MUST use the repo-relative backtick form
142
+ `` `path:line` `` / `` `path:start-end` ``, and citing it in the external form still reports (R2).
143
+
130
144
  ### Step 5 — Acceptance Criteria guard
131
145
 
132
146
  If the task has a non-empty Acceptance Criteria section, evaluate every checklist item and every
@@ -46,6 +46,7 @@ re-reading or re-tokenizing the task.
46
46
  | `list` | List tasks, filtered | `--status <s>` `--phase <p>` `--parent <wbs>` `--feature <id>` `--folder` `--json` |
47
47
  | `refresh` | Re-scan the corpus and report counts (**`kanban.md` retired** — web Task Kanban is SSOT) | `--folder` `--json` |
48
48
  | `migrate` | One-time A17 corpus normalization pass | `--dry-run` `--folder` `--json` |
49
+ | `migrate-anchors` | Qualify in-repo evidence anchors to repo-relative paths (0583 R1–R3) | `--dry-run` `--json` |
49
50
  | `refresh-roster <wbs>` | Regenerate a parent task's sub-task roster block in `## Plan` | `--folder` `--json` |
50
51
  | `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--folder` `--json` |
51
52
  | `record <wbs>` | Write Testing/Review from a verify verdict; optional Solution + transition | `--verdict-file <path>` `--solution-from-diff` `--transition <status>` `--folder` `--json` |
@@ -103,7 +103,7 @@ omission is now reported as an `ac-row-dropped` check naming the row and the unr
103
103
  `rowMatchesScenario` accepts any of these as naming the feature scenario `R3 — Foo`:
104
104
 
105
105
  | Form | Example |
106
- |------|---------|
106
+ | ------ | --------- |
107
107
  | Exact title | `R3 — Foo` |
108
108
  | Bare title (R-prefix dropped) | `Foo` |
109
109
  | `Scenario:` prefix | `Scenario: R3 — Foo` |
@@ -201,7 +201,7 @@ regenerates the `## Tasks` block.
201
201
  Each resolved decision from a grilling interview (Phase 1) becomes one or more Gherkin scenarios:
202
202
 
203
203
  | Decision-tree element | Becomes |
204
- |-----------------------|---------|
204
+ | ----------------------- | --------- |
205
205
  | A **locked decision** (a capability the feature commits to) | A `@core` scenario — the must-ship behavior it enables |
206
206
  | The decision's **observable outcome** (why it was chosen) | The scenario's `Then` — assert the observable, not the mechanism |
207
207
  | A decision's **preconditions / constraints** | The scenario's `Given` |
@@ -211,3 +211,19 @@ Each resolved decision from a grilling interview (Phase 1) becomes one or more G
211
211
 
212
212
  Number scenarios `R1, R2, …` sequentially, stable forever (the title is the traceability identity
213
213
  key). Use the Gherkin template at `.spur/templates/bdd/gherkin.md`.
214
+
215
+ ## AC altitude (task 0584 / ADR-062)
216
+
217
+ A task must declare, via the `ac_altitude` frontmatter field, whether its AC scenarios are the
218
+ feature's ship contract or a finer-grained local contract. The field is the **only** input — it is
219
+ never inferred from `template`, `status`, or whether the AC uses Gherkin (R4).
220
+
221
+ | `ac_altitude` | Meaning | DD-09 subset rule |
222
+ | --- | --- | --- |
223
+ | `graduating` (or absent) | Task scenarios are ship-contract criteria that graduate the feature's AC | Enforced — every task scenario must match a linked-feature scenario by normalized title. Drifted titles still report (R5). |
224
+ | `task-local` | Task criteria sit at a finer altitude than the feature's ship contract (fix-task regression criteria, per-defect cases) | Skipped — no uncovered-scenario findings regardless of title drift (R3) |
225
+
226
+ Use `task-local` for a fix/refactor task whose regression criteria are not the feature's ship
227
+ contract. Keep a `graduating` task's scenario titles identical to the feature's so DD-09 stays
228
+ satisfied. Absent-altitude is `graduating` — set `task-local` explicitly only where the subset rule
229
+ truly does not apply (do not silently default new tasks to it).
@@ -24,7 +24,6 @@ not redefine it.
24
24
  > does not restate the contract. The value table below is authoritative; parity with it is
25
25
  > enforced by `validate-flag-contracts.ts` (C3a/C3b).
26
26
 
27
-
28
27
  ### The one rule
29
28
 
30
29
  > **`--agent <value>` names *who* does the model-bearing work. The execution surface is derived from
@@ -49,7 +48,7 @@ selects the zero-dispatch carve-out below.
49
48
  > fallback.**
50
49
 
51
50
  | Value | Who does the work | Derived surface |
52
- |---|---|---|
51
+ | --- | --- | --- |
53
52
  | `(omitted)` | The agent running this session | Host session — host-controlled; eligible model stages may use a native subagent (0508) |
54
53
  | `inline` | The agent running this session | Host session — hard guarantee: zero dispatch, never a subprocess, never a workflow hop; headless surfaces reject `inline` (exit 2, stable special error) |
55
54
  | `auto` | The role the caller declared — this command's `role:` frontmatter or the workflow step's `role:` (Layer 1, `plugins/sp/references/roles.md`); with nothing declared, `agent.default`'s role (0542) | Subprocess — a tier-resolved executor pins a specific agent/model, which the host session cannot supply |
@@ -219,7 +218,7 @@ stage is required, select the subprocess path (`--agent auto` or `--agent <name>
219
218
  Never edit a task or feature file directly. Every mutation goes through:
220
219
 
221
220
  | Intent | CLI verb |
222
- |--------|----------|
221
+ | -------- | ---------- |
223
222
  | Create a task | `spur task create` |
224
223
  | Change status | `spur task update <wbs> <status>` |
225
224
  | Edit a section | `spur task update <wbs> --section <name> --from-file <path>` |
@@ -329,6 +328,15 @@ loop?**
329
328
  operator, and the *answer* is recorded where the decision belongs — the feature body, an ADR
330
329
  (`docs/00_ADR.md`), or the design doc. A task may then be created for the work the answer implies.
331
330
 
331
+ **Authoring-contract decisions (task 0584 / ADR-062).** Two fields a task author must get right:
332
+
333
+ - **External evidence** — evidence that lives outside `spur`'s working tree uses the frozen non-anchor
334
+ form `origin`path`line N` (line OUTSIDE the backticks), e.g.
335
+ `@gobing-ai/ts-llm-jsonl-importer`src/mappers.ts`line 481`. It is classified external, never
336
+ `L4.stale-line-anchor`. In-repo evidence MUST use the repo-relative backtick form `path:line` —
337
+ citing an in-repo file in the external form still reports (R1/R2). See `ac-style-guide.md` and the
338
+ `code-verification` skill for when each applies.
339
+
332
340
  **Why this is a rule and not a preference.** A decision filed as a task sits in `spur task list` and
333
341
  in a feature's Tasks table looking like queued work. It gets handed to an implementing agent, which
334
342
  either stalls or invents the decision and calls it done. It also inflates task counts, which is how
@@ -432,7 +440,7 @@ line is a claim to re-verify, not evidence to forward. Re-run and paste.
432
440
  **Red Flags — an unverified claim is usually hiding behind one of these:**
433
441
 
434
442
  | Red flag | What it usually means |
435
- |---|---|
443
+ | --- | --- |
436
444
  | "This should work" / "this will pass" / "probably fine" | You are predicting, not reporting. Run it and paste the result. |
437
445
  | Expressing satisfaction ("great, that's done!") before any check ran | Relief is not evidence — the check has not been run this turn. |
438
446
  | Forwarding a subagent's "success" without re-running its gate | You are trusting a claim, not verifying it. Re-run the check yourself. |
@@ -529,7 +537,7 @@ invariants that keep the pipeline set coherent as new ones are added.
529
537
  ### Pipeline phase table
530
538
 
531
539
  | Pipeline | Lifecycle phase | Entry point | Terminal states |
532
- |---|---|---|---|
540
+ | --- | --- | --- | --- |
533
541
  | `idea-pipeline.yaml` | Ideation (vague idea → feature + AC + task batch) | `/sp:dev-idea` | `handoff`, `cancelled` |
534
542
  | `planning-pipeline.yaml` | Design (known slug/task → design handoff) | `/sp:dev-plan` | `handoff`, `cancelled` |
535
543
  | `task-pipeline.yaml` | Execution (one task → done) | `/sp:dev-run` | `done`, `failed` |
@@ -691,7 +699,7 @@ The signal is emitted by the `discovery` state's brainstorm dispatch and written
691
699
  determine routing:
692
700
 
693
701
  | `design` var | `needs_design` signal | Route |
694
- |---|---|---|
702
+ | --- | --- | --- |
695
703
  | `skip` | (ignored) | `decompose` (skip system-design; brainstorm summary still recorded) |
696
704
  | `auto` | `true` | `system-design` -> `design-approval` -> `decompose` |
697
705
  | `auto` | `false` | `decompose` (skip system-design) |