@gobing-ai/spur 0.4.9 → 0.4.10

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 (83) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/rules/README.md +1 -1
  3. package/config/rules/boundary/env-var-hygiene.yaml +0 -1
  4. package/config/rules/boundary/sp-script-placement.yaml +3 -3
  5. package/config/rules/docs/sourced-api-claims.yaml +23 -96
  6. package/config/workflows/feature-verification.yaml +1 -9
  7. package/config/workflows/task-pipeline.yaml +2 -2
  8. package/package.json +1 -1
  9. package/plugins/sp/agents/expert-spur.md +0 -1
  10. package/plugins/sp/commands/dev-changelog.md +1 -1
  11. package/plugins/sp/plugin.json +1 -1
  12. package/plugins/sp/skills/brainstorm/SKILL.md +12 -11
  13. package/plugins/sp/skills/brainstorm/agents/openai.yaml +1 -1
  14. package/plugins/sp/skills/brainstorm/examples/ideation-example.md +0 -4
  15. package/plugins/sp/skills/brainstorm/metadata.openclaw +1 -1
  16. package/plugins/sp/skills/brainstorm/references/workflows.md +4 -14
  17. package/plugins/sp/skills/code-verification/references/secu-review.md +3 -4
  18. package/plugins/sp/skills/history-anatomy/references/operations.md +3 -4
  19. package/plugins/sp/skills/history-anatomy/references/report-contract.md +2 -3
  20. package/plugins/sp/skills/issue-finding/SKILL.md +1 -1
  21. package/plugins/sp/skills/parallel-execution/SKILL.md +1 -1
  22. package/plugins/sp/skills/parallel-execution/references/result-synthesis.md +9 -10
  23. package/plugins/sp/skills/reverse-engineering/SKILL.md +4 -6
  24. package/plugins/sp/skills/session-review/SKILL.md +10 -26
  25. package/plugins/sp/skills/source-driven-development/SKILL.md +25 -29
  26. package/plugins/sp/skills/spur-cli/references/agent.md +5 -2
  27. package/plugins/sp/skills/spur-cli/references/features.md +1 -1
  28. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +1 -1
  29. package/plugins/sp/skills/spur-dev/references/dev-operations.md +5 -6
  30. package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +1 -1
  31. package/spur.js +378 -411
  32. package/web/_astro/{BoardApp.CaNvQBD_.js → BoardApp.B5rTVNd_.js} +1 -1
  33. package/web/_astro/{BoardApp.C5jnkkKP.js → BoardApp.BMprmPRc.js} +141 -141
  34. package/web/_astro/{TaskDetail.DGKndhI8.js → TaskDetail.Ddsur8qd.js} +1 -1
  35. package/web/_astro/{arc.DHrwdg3G.js → arc.DLqVVBxP.js} +1 -1
  36. package/web/_astro/{architectureDiagram-3BPJPVTR.pvKpK1s5.js → architectureDiagram-3BPJPVTR.C-Pk3uAi.js} +1 -1
  37. package/web/_astro/{blockDiagram-GPEHLZMM.BQmRcZsS.js → blockDiagram-GPEHLZMM.BRO1i_Nm.js} +1 -1
  38. package/web/_astro/{c4Diagram-AAUBKEIU.CCLjHeH1.js → c4Diagram-AAUBKEIU.BU_cWu6e.js} +1 -1
  39. package/web/_astro/channel.Bs3Illhy.js +1 -0
  40. package/web/_astro/{chunk-2J33WTMH.DL6Yuoma.js → chunk-2J33WTMH.D2VXiQ2t.js} +1 -1
  41. package/web/_astro/{chunk-4BX2VUAB.CzlyEI7l.js → chunk-4BX2VUAB.BcHT772J.js} +1 -1
  42. package/web/_astro/{chunk-55IACEB6.B60EWxp1.js → chunk-55IACEB6.DhDtICmo.js} +1 -1
  43. package/web/_astro/{chunk-727SXJPM.c7v_fRLo.js → chunk-727SXJPM.BoKHp7gV.js} +1 -1
  44. package/web/_astro/{chunk-AQP2D5EJ.8BxLWdDc.js → chunk-AQP2D5EJ.Chu4JRpE.js} +1 -1
  45. package/web/_astro/{chunk-FMBD7UC4.DmKuxGFT.js → chunk-FMBD7UC4.wHdwKPlq.js} +1 -1
  46. package/web/_astro/{chunk-ND2GUHAM.1Zwd4mqV.js → chunk-ND2GUHAM.ffN-M1JB.js} +1 -1
  47. package/web/_astro/{chunk-QZHKN3VN.BvYLu-A1.js → chunk-QZHKN3VN.FRubwg4S.js} +1 -1
  48. package/web/_astro/{classDiagram-4FO5ZUOK.CEqRt0WU.js → classDiagram-4FO5ZUOK.c22tQsc_.js} +1 -1
  49. package/web/_astro/{classDiagram-v2-Q7XG4LA2.CEqRt0WU.js → classDiagram-v2-Q7XG4LA2.c22tQsc_.js} +1 -1
  50. package/web/_astro/{cose-bilkent-S5V4N54A.C7JiUdj2.js → cose-bilkent-S5V4N54A.B9c6fiSj.js} +1 -1
  51. package/web/_astro/{cynefin-OW5HDTMX.B6mZ-1be.js → cynefin-OW5HDTMX.DrZsrUHl.js} +1 -1
  52. package/web/_astro/{dagre-BM42HDAG.BuryfDy6.js → dagre-BM42HDAG.DG1U4b3y.js} +1 -1
  53. package/web/_astro/{diagram-2AECGRRQ.dao39YQM.js → diagram-2AECGRRQ.CH15b-K3.js} +1 -1
  54. package/web/_astro/{diagram-5GNKFQAL.lnGZe4At.js → diagram-5GNKFQAL.BH1j7twR.js} +1 -1
  55. package/web/_astro/{diagram-KO2AKTUF.uWfhzEfT.js → diagram-KO2AKTUF.q2zCkbAj.js} +1 -1
  56. package/web/_astro/{diagram-LMA3HP47.ppq8-198.js → diagram-LMA3HP47.BLaaZnHV.js} +1 -1
  57. package/web/_astro/{diagram-OG6HWLK6.CKSCqDt5.js → diagram-OG6HWLK6.BcpRdQwI.js} +1 -1
  58. package/web/_astro/{erDiagram-TEJ5UH35.sFSf2yBN.js → erDiagram-TEJ5UH35.D7KBlqfM.js} +1 -1
  59. package/web/_astro/{flowDiagram-I6XJVG4X.BJQjKLbz.js → flowDiagram-I6XJVG4X.D_gmuRqg.js} +1 -1
  60. package/web/_astro/{ganttDiagram-6RSMTGT7.DAHKNj2N.js → ganttDiagram-6RSMTGT7.DzgWYniD.js} +1 -1
  61. package/web/_astro/{gitGraphDiagram-PVQCEYII.BlmzcW_O.js → gitGraphDiagram-PVQCEYII.576i3hm3.js} +1 -1
  62. package/web/_astro/index.DiC1a6lh.css +1 -0
  63. package/web/_astro/{infoDiagram-5YYISTIA.DGhjaqsi.js → infoDiagram-5YYISTIA.DMCclBiz.js} +1 -1
  64. package/web/_astro/{ishikawaDiagram-YF4QCWOH.gKIpgt6F.js → ishikawaDiagram-YF4QCWOH.9Kyca4SH.js} +1 -1
  65. package/web/_astro/{journeyDiagram-JHISSGLW.DG3tmP0R.js → journeyDiagram-JHISSGLW.chbdG-8q.js} +1 -1
  66. package/web/_astro/{kanban-definition-UN3LZRKU.CgHDSxkR.js → kanban-definition-UN3LZRKU.Bds54-e0.js} +1 -1
  67. package/web/_astro/{linear.BuGEpcuM.js → linear.D5ND9GN_.js} +1 -1
  68. package/web/_astro/{mermaid.core.DBVqkWBp.js → mermaid.core.D9N_PGbj.js} +4 -4
  69. package/web/_astro/{mindmap-definition-RKZ34NQL.D-kOcji9.js → mindmap-definition-RKZ34NQL.t0xop5vp.js} +1 -1
  70. package/web/_astro/{pieDiagram-4H26LBE5.BvGPwtZt.js → pieDiagram-4H26LBE5.DqgKh6hM.js} +1 -1
  71. package/web/_astro/{quadrantDiagram-W4KKPZXB.BKb_9FV6.js → quadrantDiagram-W4KKPZXB.DeuHVi2t.js} +1 -1
  72. package/web/_astro/{requirementDiagram-4Y6WPE33.Cx0fvD8v.js → requirementDiagram-4Y6WPE33.BdYFSG4W.js} +1 -1
  73. package/web/_astro/{sankeyDiagram-5OEKKPKP.fatULi0W.js → sankeyDiagram-5OEKKPKP.k1LPPETJ.js} +1 -1
  74. package/web/_astro/{sequenceDiagram-3UESZ5HK.ChHyKqco.js → sequenceDiagram-3UESZ5HK.DdyfpzoG.js} +1 -1
  75. package/web/_astro/{stateDiagram-AJRCARHV.BdUpKWyj.js → stateDiagram-AJRCARHV.DSEI8il0.js} +1 -1
  76. package/web/_astro/{stateDiagram-v2-BHNVJYJU.fmJxqIm5.js → stateDiagram-v2-BHNVJYJU.CoMnQRKo.js} +1 -1
  77. package/web/_astro/{timeline-definition-PNZ67QCA.BayDn5-V.js → timeline-definition-PNZ67QCA.DM1AHNm-.js} +1 -1
  78. package/web/_astro/{vennDiagram-CIIHVFJN.Bm2Aggwa.js → vennDiagram-CIIHVFJN.C-cJmVtl.js} +1 -1
  79. package/web/_astro/{wardleyDiagram-YWT4CUSO.DI75O-uG.js → wardleyDiagram-YWT4CUSO.D0xMzKPb.js} +1 -1
  80. package/web/_astro/{xychartDiagram-2RQKCTM6.DL90E7Q7.js → xychartDiagram-2RQKCTM6.BH5xJcEq.js} +1 -1
  81. package/web/index.html +2 -2
  82. package/web/_astro/channel.C7wG9RxA.js +0 -1
  83. package/web/_astro/index.BCY1JJHd.css +0 -1
@@ -149,39 +149,23 @@ step 4 excludes. Use `n/a` for any value not supported by the measurement.
149
149
 
150
150
  ### Resolved issues
151
151
 
152
- | Issue | Root cause | Resolution | Evidence | Confidence |
153
- | --- | --- | --- | --- | --- |
152
+ | Issue | Root cause | Resolution | Evidence |
153
+ | --- | --- | --- | --- |
154
154
 
155
155
  Evidence names the tool result, verification command, or concrete repository state visible in the
156
156
  session. Do not list ordinary implementation steps as issues.
157
157
 
158
- **Confidence** is `HIGH`, `MEDIUM`, or `LOW` for that row's claim. The level is **derived from the
159
- check that produced the claim, never assessed from how the row reads**, and the cell carries that
160
- verifier (e.g. `HIGH — gate exit 0, /tmp/g0.log re-run this session`). Add the row's **falsifier**
161
- when the level is not `HIGH`: what would have made it fail, or what moves it up. The same ladder
162
- grades this report's Open-issues table.
163
-
164
- | Level | Verifies when | Not this |
165
- | --- | --- | --- |
166
- | `HIGH` | An executed check in this session produced the result and its raw output is reachable (command + exit code, test counts, query row, gate log). Re-runnable now. | The code or change "looks correct"; a claim asserted only in prose. |
167
- | `MEDIUM` | The claim is inferred from observed facts, rests on prior-session or delegated evidence, or names state that moved after the check (stale by construction). Name which of the three. | Presenting an inference as an observation. |
168
- | `LOW` | No executable check was run. Name the missing evidence **and** the command that would ground it. | Dropping the row instead of marking it. |
169
-
170
- Two guards against level inflation:
171
-
172
- - Evidence that cannot be re-run, or that is only the agent's own summary, **caps the row at
173
- `MEDIUM`** — a re-run is what promotes it.
174
- - An all-`HIGH` multi-finding review is a signal the ladder was not applied, not a clean session.
175
- Where every row genuinely is `HIGH`, the cells show distinct check results rather than repeated
176
- phrasing.
177
-
178
- Any API/library statement in a row cites the installed source as `path:line` or a URL, and a claim
179
- the session could not ground is written `LOW` with the missing evidence named.
158
+ **Evidence is the check, not a grade** (ADR-138). A row resolved by an executed check this session
159
+ names the command and its result (e.g. `gate exit 0, /tmp/g0.log`). A row resting on inference,
160
+ prior-session or delegated evidence says so. A row with no check run names the missing evidence
161
+ **and** the command that would ground it — never drop the row instead. No HIGH/MEDIUM/LOW label:
162
+ a self-assigned level is as easy to write as the claim. Any API/library statement in a row cites
163
+ the installed source as `path:line` or a URL.
180
164
 
181
165
  ### Open issues and risks
182
166
 
183
- | Issue or risk | State | Evidence or confirmation needed | Confidence |
184
- | --- | --- | --- | --- |
167
+ | Issue or risk | State | Evidence or confirmation needed |
168
+ | --- | --- | --- |
185
169
 
186
170
  ### Process and environment improvements
187
171
 
@@ -55,27 +55,28 @@ Do **not** use this skill for:
55
55
 
56
56
  - **Your own code's correctness** — that is `sp:code-verification` (requirements/AC) and `sp:code-review`.
57
57
  - **Stress-testing a design decision** — that is `sp:doubt-driven-development` (artifact vs contract).
58
- - **Well-known, version-stable stdlib** you can state with HIGH confidence — verification has a cost;
58
+ - **Well-known, version-stable stdlib** you have already checked — verification has a cost;
59
59
  spend it where being wrong is likely and expensive.
60
60
 
61
61
  ## The process
62
62
 
63
- ### Step 1 — Classify your confidence before you write
63
+ ### Step 1 — Know where each fact came from before you write
64
64
 
65
- | Level | Meaning | Action |
66
- |---|---|---|
67
- | **HIGH** | Verified against the pinned version's docs/source **this session** | Generate; cite the source inline |
68
- | **MEDIUM** | Recalled from a prior session; plausibly stale | Verify before relying on it |
69
- | **LOW** | Memory only, no source in hand | Stop — verify first; never present as fact |
65
+ | Source in hand | Action |
66
+ |---|---|
67
+ | Checked against the pinned version's docs/source **this session** | Generate; cite the source inline |
68
+ | Recalled from a prior session; plausibly stale | Verify before relying on it |
69
+ | Memory only, no source in hand | Stop — verify first; never present as fact |
70
70
 
71
- If you cannot honestly claim HIGH for a version-specific behavior, you are at MEDIUM or LOW — verify.
71
+ Do not grade the claim with a confidence label (ADR-138): a label is as easy to write as the claim.
72
+ The citation is the evidence.
72
73
 
73
74
  ### Step 2 — Go to the primary source, in priority order
74
75
 
75
76
  1. The **type signature / source** in the installed, pinned dependency (the ground truth for *this* build).
76
77
  2. The **official docs for the pinned version** (not the latest — the version in the lockfile).
77
78
  3. Authoritative references when docs are thin.
78
- 4. Memory — **LOW only**, and never as the final authority.
79
+ 4. Memory — never the final authority; verify before relying on it.
79
80
 
80
81
  State the **version** inline whenever behavior is version-specific.
81
82
 
@@ -91,40 +92,36 @@ Generate the code and **cite the source** (doc URL + date, or `pkg@version` + th
91
92
  point of use or in the task's notes. A claim about external behavior without a citation is
92
93
  unverified — flag it as such rather than presenting it as fact.
93
94
 
94
- ### Step 5 — Close with a verification verdict
95
-
96
- Before finishing, verify the citations for the API/library claims you emitted and close with one
97
- line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or 'all checks passed'>`.
95
+ ### Step 5 — Check the citations before finishing
98
96
 
99
97
  - **Citation coverage** — every API/library claim in the output carries a source citation (doc URL + date, or `pkg@version` + file/symbol); no uncited claim is asserted as fact.
100
98
  - **Source authority** — each citation points at the pinned version's primary source (installed signature/source, or official docs for the lockfile version), not the latest docs or memory.
101
- - **Honest confidence** — the stated HIGH/MEDIUM/LOW matches the evidence: HIGH requires a check against the pinned source this session; MEDIUM/LOW items are labeled, and LOW is never presented as fact.
102
- - **HIGH** — all three checks pass. **MEDIUM** — coverage intact but some citations are off-version (latest docs for a pinned dependency) or secondary-source only. **LOW** — an API/library claim lacks any citation, or a LOW-confidence claim was asserted as fact.
103
99
 
104
- Deterministic backstop: the `cited-version-strings`, `cited-api-claims`,
105
- `cited-api-claims-confidence` and `cited-high-confidence` rules
100
+ Report the first failing check and its deviation, if any. Do not append a confidence verdict.
101
+
102
+ Deterministic backstop: the `cited-version-strings` and `cited-api-claims` rules
106
103
  (`.spur/rules/docs/sourced-api-claims.yaml`) flag markdown lines that assert a version string or a
107
- time-anchored API claim with no citation anchor on the same line, claim lines that carry no
108
- HIGH/MEDIUM/LOW level, and claim lines that claim HIGH with no anchor — the one level that asserts
109
- "verified this session", so its source must be on the line; MEDIUM (recalled) and LOW (memory only)
110
- need no anchor by contract and are not flagged. They are an info-severity advisory backstop for
111
- this contract and are deliberately NOT wired into `recommended-pre-check` — run them ad hoc with
112
- `spur rule run --file .spur/rules/docs/sourced-api-claims.yaml`. The checks above and the SECUA
113
- checklist remain the enforcement points.
104
+ time- or version-anchored API claim (`deprecated since`, `removed in 0.9`, `fixers (since 0.3.4)`)
105
+ with no citation anchor on the same line. They are an info-severity advisory
106
+ backstop for this contract and are deliberately NOT wired into `recommended-pre-check` — run them ad
107
+ hoc with `spur rule run --file .spur/rules/docs/sourced-api-claims.yaml`. Dated working records
108
+ (`docs/report*`, `docs/dogfood`, `docs/plans`, `docs/analysis`) are excluded, as are the task
109
+ archives: a version measured by a past run is not an authorable claim. The checks above and the
110
+ SECUA checklist remain the enforcement points.
114
111
 
115
112
  ## Common Rationalizations
116
113
 
117
114
  | Rationalization | Reality |
118
115
  |---|---|
119
- | "I've used this API a hundred times — I know the signature." | APIs change across versions and your memory is a silent cache. Verify against the *pinned* version; recall is MEDIUM at best. |
116
+ | "I've used this API a hundred times — I know the signature." | APIs change across versions and your memory is a silent cache. Verify against the *pinned* version; recall is not a source. |
120
117
  | "It compiled, so I used it right." | Compiling proves existence and types, not contract. Ordering, preconditions, and error modes are not checked by the compiler. |
121
118
  | "The latest docs say so." | You ship against the *pinned* version, not latest. Read the docs for the version in the lockfile. |
122
119
  | "Close enough — I'll fix it if it breaks." | Guessing at an external contract moves the cost to runtime/production. Verify before generating; it is cheaper here. |
123
- | "Verifying every call is too slow." | Verify what you are *not sure of*, at the confidence level you honestly hold. HIGH needs no re-check; LOW always does. |
120
+ | "Verifying every call is too slow." | Verify what you have no source for. A fact checked this session needs no re-check; memory always does. |
124
121
 
125
122
  ## Red Flags
126
123
 
127
- - Generating version-specific code you would rate MEDIUM or LOW confidence, without opening a source.
124
+ - Generating version-specific code from memory, without opening a source.
128
125
  - Presenting an API claim as fact with no citation (doc + date, or `pkg@version` + symbol).
129
126
  - Treating "it exists" as proof it is used correctly (the two questions collapsed into one).
130
127
  - Reading the *latest* docs for a dependency pinned to an older version.
@@ -136,8 +133,7 @@ checklist remain the enforcement points.
136
133
  - [ ] Every version-specific external behavior relied on was checked against the pinned version's source/docs **this session**.
137
134
  - [ ] Both questions answered — the API exists **and** is called within its contract.
138
135
  - [ ] Claims about external behavior carry a citation (source + date, or `pkg@version` + symbol); unverifiable ones are flagged, not asserted.
139
- - [ ] Confidence is stated honestly (HIGH/MEDIUM/LOW); nothing at LOW was presented as fact.
140
- - [ ] Run closes with the Step 5 verdict line: `Verification: HIGH|MEDIUM|LOW — <first failing check and deviation, or 'all checks passed'>`.
136
+ - [ ] Nothing recalled from memory alone was presented as fact.
141
137
 
142
138
  ## See also
143
139
 
@@ -341,9 +341,12 @@ spur agent usage --dry-run # print would-be changes; write nothing
341
341
  spur agent usage --json
342
342
  ```
343
343
 
344
- Runs `codexbar usage --format json --provider all` once, writes the snapshot to
344
+ Runs `codexbar usage --format json` once — the operator-enabled provider set, deliberately not an
345
+ all-provider sweep (`--provider all` covers every provider configured in CodexBar, most of them
346
+ uncredentialed, and its wall time is the slowest of all of them) — writes the snapshot to
345
347
  `~/.config/spur/agent-usage.json` (`captured_at`, `source`, `providers[]`, `raw`), maps providers
346
- to executors via `agent.executors[].agent` (or the model's `<provider>/` prefix), and records
348
+ to executors via `agent.executors[].agent` (with the `antigravity-cli` → `antigravity` alias) or the
349
+ model's `<provider>/` prefix, and records
347
350
  `owner: quota` availability observations that the standard drain applies — the single availability
348
351
  write path. A provider is exhausted when any `primary|secondary|tertiary` window reports
349
352
  `usedPercent >= 100`; the window name and `resetsAt` go into the observation reason. Per-provider
@@ -30,7 +30,7 @@ what* or *how to write a scenario*, this skill.
30
30
  | `refresh` | Rebuild INDEX + each feature `## Tasks` table from task edges (**docs only**; no status change) | `--feature <id>` `--all` `--folder` `--json` |
31
31
  | `check [id]` | Validate one feature / the tree; the 4-layer gate; `--fix` repairs structural findings in place | `--strict` `--fix` `--as <status>` `--folder` `--json` |
32
32
  | `sync [id]` | Align feature **lifecycle status** with linked task states (real transitions + guards) | `--all` `--dry-run` `--force` `--folder` `--json` |
33
- | `verify [id]` | The `feature-verification` pass: run the check set once and record the bound PASS/FAIL receipt — workflow-internal (`feature-lifecycle` runs it) | `--run-id <id>` `--cmd <command>` `--confidence <level>` `--ack-low-confidence` |
33
+ | `verify [id]` | The `feature-verification` pass: run the check set once and record the bound PASS/FAIL receipt — workflow-internal (`feature-lifecycle` runs it) | `--run-id <id>` `--cmd <command>` |
34
34
  | `handoff [id]` | The `idea-pipeline` finalization: task ordering, roster refresh, handoff report — workflow-internal | `--run-id <id>` `--spur-bin <cmd>` |
35
35
 
36
36
  **`refresh` vs `sync` (do not conflate):**
@@ -138,7 +138,7 @@ Spur's host additionally registers (`registerSpurBuiltins`, `packages/app/src/wo
138
138
 
139
139
  | Kind | Capability |
140
140
  | ---- | ---------- |
141
- | Action | `agent.run` (model call via `spur agent run`; `executor: 'fleet'` dispatches into the agent fleet), `decide` (inline `id`/`method`/`question`/`choices`/`default`/`evidence` → outcome written to `resultFile`; catalog-id references are pending task 1094 — use `spur decision run` for catalog decisions), `command.gate`, `rule.check`, `doctor.probe`, `response.validate`, `proof.fingerprint`, `run.artifact`, `file.exists`, `file.read`, `file.read.into-var`, `http.request`, `hitl.confirm`, `hitl.select`, `hitl.input`, `shell` (streaming) |
141
+ | Action | `agent.run` (model call via `spur agent run`; `executor: 'fleet'` dispatches into the agent fleet), `decide` (inline `id`/`method`/`question`/`choices`/`default`/`evidence` → outcome written to `resultFile`; catalog-id references are pending task 1094 — use `spur decision run` for catalog decisions), `command.gate`, `rule.check`, `doctor.probe`, `proof.fingerprint`, `run.artifact`, `file.exists`, `file.read`, `file.read.into-var`, `http.request`, `hitl.confirm`, `hitl.select`, `hitl.input`, `shell` (streaming) |
142
142
  | Guard | `shell` (env-aware), `contract-violation` |
143
143
 
144
144
  Order matters for both guards and conditions: **the first that passes wins.** Put the discriminating
@@ -590,12 +590,11 @@ host instructions does not add one. An opt-in gate is explicit: `gitmsg --check
590
590
  - `keepachangelog` (default): `## [<version>] - <date>` header, then category headings per the keepachangelog convention — `### Added` / `### Fixed` / `### Changed` / `### Removed` / `### Other` — mapped from conventional-commit types.
591
591
  - `simple`: flat bulleted list grouped by type heading (`### feat`, `### fix`, …).
592
592
  6. Emit: with `<file>`, insert the section into that file above its newest `## [` release heading (or after its title when none exists) and touch nothing else in the file; without `<file>`, print it to stdout.
593
- 7. **Verify claims before emitting — two checks, both required, on every claim bullet.** Classify first: an *API/library claim* is a bullet asserting what code, an API, a library, a dependency or a version does — skip merge/bookkeeping bullets that assert no such fact (a status move, a filing, a doc relocation). Then run both checks and append one HTML comment line directly under the bullet carrying both results: `<!-- src: <citation> · <HIGH|MEDIUM|LOW> -->`.
594
- - **(a) Source citation — the anchor.** Internal claims (what a commit or the code does): confirm against the commit diff (`git show --stat <hash>`, reading hunks when the summary asserts behavior) or the artifact's presence in the tree; cite `path[:line]` — bare path for whole-file claims, `path:line` for a specific behavior or symbol. External claims (framework/library/version behavior): confirm against official docs for the installed version; cite the URL. An anchor you cannot produce fails the check — reword the bullet or drop the claim; a citation is not a citation until it names something a reader can open.
595
- - **(b) Confidence level — exactly one in-rubric token.** HIGH = the diff/artifact confirms the summary as written; MEDIUM = the evidence is real but narrower than the summary; LOW = cannot be confirmed from available sources (append the reason in one clause). A missing level, an off-rubric token, or two levels on one bullet fails the check.
596
- - **Defect precision decides what must be fixed.** Both checks are precise once a bullet is classified as a claim: an annotation missing its anchor or its level is unambiguously wrong and blocks emitting. Which bullets *are* claims is the heuristic half — resolve it by this step's rule, and for a genuinely borderline bullet say so in the bullet's body rather than annotating or skipping it silently.
597
- 8. Self-check before emitting: every short hash in `<since>..<until>` appears exactly once, and every claim bullet carries exactly one `<!-- src: … -->` comment holding exactly one anchor and exactly one of `HIGH`, `MEDIUM`, `LOW` — no unannotated claim bullets, no duplicate annotations, no doubled or off-rubric levels. Fix any miss, duplicate, or bad level; do not report a verdict.
598
- 9. Reply in at most three lines: the range, bullet counts per category plus verified-claim counts (`x HIGH / y MEDIUM / z LOW`), and the output target.
593
+ 7. **Verify claims before emitting — one required check on every claim bullet.** Classify first: an *API/library claim* is a bullet asserting what code, an API, a library, a dependency or a version does — skip merge/bookkeeping bullets that assert no such fact (a status move, a filing, a doc relocation). Then run the check and append one HTML comment line directly under the bullet carrying its anchor: `<!-- src: <citation> -->`. No confidence level is recorded (ADR-138): the anchor is the evidence.
594
+ - **Source citation — the anchor.** Internal claims (what a commit or the code does): confirm against the commit diff (`git show --stat <hash>`, reading hunks when the summary asserts behavior) or the artifact's presence in the tree; cite `path[:line]` — bare path for whole-file claims, `path:line` for a specific behavior or symbol. External claims (framework/library/version behavior): confirm against official docs for the installed version; cite the URL. An anchor you cannot produce fails the check — reword the bullet or drop the claim; a citation is not a citation until it names something a reader can open.
595
+ - **Defect precision decides what must be fixed.** The check is precise once a bullet is classified as a claim: an annotation missing its anchor is unambiguously wrong and blocks emitting. A summary broader than its evidence is reworded to what the anchor shows. Which bullets *are* claims is the heuristic half — resolve it by this step's rule, and for a genuinely borderline bullet say so in the bullet's body rather than annotating or skipping it silently.
596
+ 8. Self-check before emitting: every short hash in `<since>..<until>` appears exactly once, and every claim bullet carries exactly one `<!-- src: … -->` comment holding exactly one anchor — no unannotated claim bullets, no duplicate annotations. Fix any miss or duplicate; do not report a verdict.
597
+ 9. Reply in at most three lines: the range, bullet counts per category plus the verified-claim count, and the output target.
599
598
  - **Invariants:** Bullets are derived from `git log` only; the claim-verification pass (step 7) adds evidence from commit diffs, the working tree, and official docs. No quality gates — no `bun run gate`/lint/typecheck/test/`spur-check`/rule runs, and no edits beyond the one inserted section (its verification comments included). The file is left uncommitted.
600
599
 
601
600
  ### 9. gitmsg
@@ -425,7 +425,7 @@ git checkout <base-ref> && git merge --no-ff -m "<prepared message>" <branch>
425
425
  # git checkout <base-ref> && git merge --no-commit <branch>
426
426
  # 2. resolve source conflicts by hand; generated files are then regenerated with the project's
427
427
  # generator, never hand-merged
428
- # (this repo: bun run build:plugin-lib && bun run --filter @gobing-ai/spur build:bundle)
428
+ # (this repo: bun run --filter @gobing-ai/spur build:bundle)
429
429
  # 3. stage every resolved path and regenerated bundle through the guard — an unmerged or
430
430
  # unstaged path makes step 5 abort, and a conflict-marked path exits 3 (resolve, then retry):
431
431
  # spur workflow commit-guard stage --run "$RUN_ID" -- <resolved paths and regenerated bundles>