@gobing-ai/spur 0.3.73 → 0.3.74
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/config.example.yaml +15 -4
- package/config/pipeline-budgets.json +4 -4
- package/config/rules/strict/runtime-boundaries.yaml +1 -1
- package/config/templates/AGENTS.md +5 -0
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +2 -0
- package/config/workflows/basic.yaml +5 -2
- package/config/workflows/docs-pipeline.yaml +92 -55
- package/config/workflows/feature-dev.yaml +43 -20
- package/config/workflows/feature-lifecycle.yaml +1 -0
- package/config/workflows/history-anatomy.yaml +8 -4
- package/config/workflows/idea-pipeline.yaml +66 -33
- package/config/workflows/pr-review.yaml +31 -8
- package/config/workflows/task-lifecycle.yaml +1 -0
- package/config/workflows/task-pipeline.yaml +929 -905
- package/config/workflows/wayfinder-resolution.yaml +124 -90
- package/config/workflows/wrapup-pipeline.yaml +208 -83
- package/package.json +1 -1
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/history-anatomy-cache.mjs +7 -1
- package/plugins/sp/scripts/history-anatomy-cache.ts +11 -2
- package/plugins/sp/scripts/pr-reviewing.mjs +5 -1
- package/plugins/sp/scripts/pr-reviewing.ts +7 -1
- package/plugins/sp/scripts/transition-shim-check.ts +6 -6
- package/plugins/sp/skills/pr-reviewing/SKILL.md +4 -1
- package/plugins/sp/skills/spur-cli/references/self.md +17 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +5 -5
- package/plugins/sp/skills/spur-cli/references/workflows.md +4 -4
- package/plugins/sp/skills/spur-dev/SKILL.md +17 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +3 -3
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +1 -2
- package/plugins/sp/skills/wayfinder/SKILL.md +1 -1
- package/spur.js +1125 -784
- package/web/_astro/{BoardApp.BYCNkMOn.js → BoardApp.C60RJZRj.js} +78 -77
- package/web/_astro/BoardApp.ymfj1EHA.js +1 -0
- package/web/_astro/{TaskDetail.CgUreSP2.js → TaskDetail.Guk8VuNu.js} +1 -1
- package/web/_astro/{arc.BySSh34M.js → arc.CAZtlWJM.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DM46TS_h.js → architectureDiagram-3BPJPVTR.9-XbF_Tz.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.tZhvNUHA.js → blockDiagram-GPEHLZMM.DC4WLx3L.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.PT4Or4Nf.js → c4Diagram-AAUBKEIU.JgjUQMgG.js} +1 -1
- package/web/_astro/channel.Bxxe2Byc.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.J9r0_Bbe.js → chunk-2J33WTMH.D_JFiXa-.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.hzyeIvhR.js → chunk-4BX2VUAB.Bk_RxoeT.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.B0rO7qVh.js → chunk-55IACEB6.a_Rj2VxL.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.wE_Uk5D4.js → chunk-727SXJPM.C2NoS1U6.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DqEEjQw7.js → chunk-AQP2D5EJ.D1Xn6CNa.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.CDoD9sBX.js → chunk-FMBD7UC4.BhJrSBsX.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.CtX5nF9P.js → chunk-ND2GUHAM.ByVGduYQ.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.CK_EwfaT.js → chunk-QZHKN3VN.B47Paunq.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DLt5a8Lh.js → classDiagram-4FO5ZUOK.BERMSD5C.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DLt5a8Lh.js → classDiagram-v2-Q7XG4LA2.BERMSD5C.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CMCWP49h.js → cose-bilkent-S5V4N54A.O_rHGlhU.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.HyXw_vdS.js → cynefin-OW5HDTMX.qCW2GdNp.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BTuAzh01.js → dagre-BM42HDAG.C5Y4lH_u.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.D9dr9wfT.js → diagram-2AECGRRQ.DxZmRXxF.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.C4Rot0hj.js → diagram-5GNKFQAL.qSxZeYSK.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.B_TK5uWC.js → diagram-KO2AKTUF.-7vl3bXs.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.JkXKK7CO.js → diagram-LMA3HP47.BHVV-UH3.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BzMN8Bd6.js → diagram-OG6HWLK6.DHAuW9sK.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DVZaWGUd.js → erDiagram-TEJ5UH35.DMRLQwPN.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.rjEiWUfR.js → flowDiagram-I6XJVG4X.B3EpPp_8.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.C_EgAarK.js → ganttDiagram-6RSMTGT7.BgUrExXM.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.B-QQSDsK.js → gitGraphDiagram-PVQCEYII.CU-9yVN4.js} +1 -1
- package/web/_astro/{index.B5MTfe7k.css → index.BhvM3djt.css} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.DlWesz7T.js → infoDiagram-5YYISTIA.CvVTCRLe.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BUMZOawi.js → ishikawaDiagram-YF4QCWOH.BUzOfKPf.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.CWfkxfjY.js → journeyDiagram-JHISSGLW.BBTb7ziz.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.B-YpMwXf.js → kanban-definition-UN3LZRKU.CTQQr70i.js} +1 -1
- package/web/_astro/{linear.D7uqzENp.js → linear.CLKlJPiS.js} +1 -1
- package/web/_astro/{mermaid.core.CxrNppBD.js → mermaid.core.BA4wFhLP.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.B4Qe7cM2.js → mindmap-definition-RKZ34NQL.t1vG2l5e.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.Ds-5j2ro.js → pieDiagram-4H26LBE5.C8zJhyTu.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.tBd38uNC.js → quadrantDiagram-W4KKPZXB.DqYYvb7T.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.sFENkWl3.js → requirementDiagram-4Y6WPE33.lzfDZ9nI.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.BeB-Hk7C.js → sankeyDiagram-5OEKKPKP.lm6N5ORM.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DnTeaSpx.js → sequenceDiagram-3UESZ5HK.E6_IV4Dj.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.B-8Jt5EJ.js → stateDiagram-AJRCARHV.Bnv6Ok2p.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Br7xoqMW.js → stateDiagram-v2-BHNVJYJU.mJHH_Ng_.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.C-3WdOyi.js → timeline-definition-PNZ67QCA.BhRgqSLa.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.DCIs7Lc6.js → vennDiagram-CIIHVFJN.pjb5DMC9.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.rGAL-bbz.js → wardleyDiagram-YWT4CUSO.CW20KUng.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.hkfQKiRl.js → xychartDiagram-2RQKCTM6.vX9_yuMl.js} +1 -1
- package/web/index.html +2 -2
- package/config/corpus-baseline.json +0 -1805
- package/config/workflow-composition-baseline.json +0 -615
- package/web/_astro/BoardApp.E12MFjOS.js +0 -1
- package/web/_astro/channel.5cYKr5cs.js +0 -1
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
* so it is a grep target and a review signal, and a manifest entry in
|
|
9
9
|
* `config/transition-shims.json` records who owns it and when it can be removed.
|
|
10
10
|
*
|
|
11
|
-
* The gate is deliberately two-sided
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* The gate is deliberately two-sided: a marker with no manifest entry
|
|
12
|
+
* FAILS, and a manifest entry whose marker no longer appears in source
|
|
13
|
+
* FAILS. Without the second half the manifest would rot into a permanent
|
|
14
|
+
* suppression list — the exact invisible-debt pattern this gate exists to
|
|
15
|
+
* end.
|
|
16
16
|
*
|
|
17
17
|
* Marker convention (docs/04_DESIGN.md §2.5):
|
|
18
18
|
* // @transition-shim(<id>) — <one line on what this keeps working>
|
|
@@ -134,7 +134,7 @@ function scanMarkers(cwd: string, roots: string[]): Map<string, Set<string>> {
|
|
|
134
134
|
return found;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
/** Load the manifest; a missing file degrades to no entries (
|
|
137
|
+
/** Load the manifest; a missing file degrades to no entries (fail-open). */
|
|
138
138
|
function loadManifest(path: string): { entries: ManifestEntry[]; raw: string | null } {
|
|
139
139
|
if (!existsSync(path)) return { entries: [], raw: null };
|
|
140
140
|
const raw = readFileSync(path, 'utf8');
|
|
@@ -164,12 +164,15 @@ superskill script contract.
|
|
|
164
164
|
8. **Collect** — `<script> collect --since "$requestedAt" --head "$requestHead" --json`. Normalize
|
|
165
165
|
only the requested HEAD and request window; then invoke `status` with the same bounds for
|
|
166
166
|
PR/base/CI/local state. Never turn an absent, stale, or moved-HEAD result into `clean`.
|
|
167
|
+
`--head` is mandatory on wait/collect/status (0771): an empty or missing pin fails loud
|
|
168
|
+
instead of silently reviewing whatever HEAD is current.
|
|
167
169
|
|
|
168
170
|
## Fix mode
|
|
169
171
|
|
|
170
172
|
Only in `fix` mode:
|
|
171
173
|
|
|
172
|
-
1. **Collect before editing.** Invoke direct `collect --json
|
|
174
|
+
1. **Collect before editing.** Invoke direct `collect --json --head "$(git rev-parse HEAD)"` plus
|
|
175
|
+
`status --json --head "$(git rev-parse HEAD)"` and require a
|
|
173
176
|
completed result for the current pushed HEAD. If the result is pending, stale, or unavailable,
|
|
174
177
|
report it and stop without source edits. If it is explicitly clean, report no fixes and stop.
|
|
175
178
|
2. **Validate each finding.** Open the referenced code; trace callers/callees; verify the problem
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-self
|
|
3
|
-
description: "spur-cli noun reference for `spur self`: self-management verbs — scaffold (`init`), schema migrations (`migrate`), local web server (`serve`), and status overview (`status`). Each verb mounts the same command builder as its legacy top-level noun, which remains a hidden alias over the identical command."
|
|
3
|
+
description: "spur-cli noun reference for `spur self`: self-management verbs — scaffold (`init`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), and status overview (`status`). Each verb mounts the same command builder as its legacy top-level noun, which remains a hidden alias over the identical command."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# spur self - self-management verbs
|
|
9
9
|
|
|
10
|
-
`spur self` hosts the
|
|
11
|
-
that also remains registered as a legacy top-level **hidden alias** (`spur init`, `spur migrate`,
|
|
10
|
+
`spur self` hosts the self-management verbs. Each verb is the canonical path for a command
|
|
11
|
+
that also remains registered as a legacy top-level **hidden alias** (`spur init`, `spur maintain`, `spur migrate`,
|
|
12
12
|
`spur serve`, `spur status`) so existing scripts, workflow YAML, and habits keep working unchanged.
|
|
13
13
|
Both paths share the same command builder: identical flags, output, and exit codes. The legacy
|
|
14
14
|
top-level forms are omitted from `spur --help`, leaving `self` as the visible surface.
|
|
@@ -18,6 +18,7 @@ top-level forms are omitted from `spur --help`, leaving `self` as the visible su
|
|
|
18
18
|
| Verb | Purpose | Key flags |
|
|
19
19
|
| ---- | ------- | --------- |
|
|
20
20
|
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--json` |
|
|
21
|
+
| `maintain` | Run database maintenance: PRAGMA optimize, WAL truncation, optional VACUUM | `--vacuum` `--json` |
|
|
21
22
|
| `migrate` | Apply CLI-owned schema migrations | `--json` |
|
|
22
23
|
| `serve` | Start the Spur web server (local fallback) | `--port <n>` `--host <addr>` `--no-open` `--cwd <path>` `--json` |
|
|
23
24
|
| `status [path]` | Show project and git status for a Spur project | `--json` |
|
|
@@ -43,6 +44,19 @@ Materializes the `.spur/` directory tree with config, docs, rules, and workflow
|
|
|
43
44
|
(Phase 1.5 / 1.6) run immediately after this verb completes — see **[init.md](init.md)** for the
|
|
44
45
|
probe protocol and rule-glob adaptation procedure.
|
|
45
46
|
|
|
47
|
+
## `self maintain` - run database maintenance
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
spur self maintain # run PRAGMA optimize + wal_checkpoint(TRUNCATE)
|
|
51
|
+
spur self maintain --vacuum # deep maintenance: VACUUM + optimize + checkpoint
|
|
52
|
+
spur self maintain --json # machine-readable
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Executes SQLite database maintenance operations on `.spur/spur.db`:
|
|
56
|
+
- `PRAGMA optimize;` to refresh query planner statistics in `sqlite_stat1`.
|
|
57
|
+
- `PRAGMA wal_checkpoint(TRUNCATE);` to checkpoint committed WAL frames and truncate WAL to 0 bytes.
|
|
58
|
+
- `--vacuum` runs `VACUUM;` first for page compaction and B-tree defragmentation (requires 2x free disk space).
|
|
59
|
+
|
|
46
60
|
## `self migrate` - apply CLI-owned schema migrations
|
|
47
61
|
|
|
48
62
|
```bash
|
|
@@ -51,7 +51,7 @@ re-reading or re-tokenizing the task.
|
|
|
51
51
|
| `batch-create` | Create many tasks from a validated JSON array | `--file <path>` `--folder` `--json` |
|
|
52
52
|
| `record <wbs>` | Write `Testing` from a verify verdict (deterministic); bare-`## Review` fallback only; optional Solution + transition | `--verdict-file <path>` `--solution-from-diff` `--transition <status>` `--folder` `--json` |
|
|
53
53
|
| `verdict <wbs>` | Derive PASS/PARTIAL/FAIL/UNKNOWN from verify answer text → verdict JSON; see [answer-file shape](tasks/verbs.md#answer-file-shape-what---from-answer-parses) | `--from-answer <path>` `--folder` `--json` |
|
|
54
|
-
| `check [wbs]` | Four-layer validation;
|
|
54
|
+
| `check [wbs]` | Four-layer validation; `--fix` repairs structure; `--corpus` is the explicit unsuppressed audit | `--strict` `--as <status>` `--strict-core` `--fix` `--folder` `--corpus` `--since <ref>` `--json` |
|
|
55
55
|
| `resolve <file-path>` | Map a file path to its owning task WBS | `--strict` `--folder` `--json` |
|
|
56
56
|
| `path <wbs>` | Map a WBS to its absolute task file path (inverse of `resolve`) | `--folder` `--json` |
|
|
57
57
|
| `run-link <wbs>` | Record pipeline run provenance link for task | `--source <src>` `--run-id <id>` `--json` |
|
|
@@ -140,10 +140,10 @@ reports it. Do not invent a second threshold; author to the one that is frozen (
|
|
|
140
140
|
| Node count | Every node earns its transition round-trip | A node that always runs immediately after another, with no guard between them, is one node |
|
|
141
141
|
|
|
142
142
|
**When a node breaches the budget, do not reformat to dodge the measure.** Joining five lines with
|
|
143
|
-
`&&` moves the complexity, not the ownership. Pick
|
|
143
|
+
`&&` moves the complexity, not the ownership. Pick one of the four remaining owners from
|
|
144
144
|
`docs/design/workflow-shell-ownership.md`: public `spur` verb (consent-gated), application service,
|
|
145
|
-
least-privilege built-in action kind, workflow-relative external extension
|
|
146
|
-
stays-shell exception with
|
|
145
|
+
least-privilege built-in action kind, or workflow-relative external extension. (0775 retired the
|
|
146
|
+
recorded stays-shell exception along with the suppression snapshot.)
|
|
147
147
|
|
|
148
148
|
**Advisory posture is binding.** Composition findings never block a run, never change a `validate`
|
|
149
149
|
exit status, and are never a reason to hot-edit an executing pipeline. Surface them; fix on operator
|
|
@@ -193,8 +193,8 @@ Steps:
|
|
|
193
193
|
2. **Return each node's work to its owner** — judgment nodes to the command or skill they should
|
|
194
194
|
have been calling; a genuinely useful shell sequence to one script under its owning surface.
|
|
195
195
|
3. **Rewrite the entry surface as the procedure**, in the order the graph ran.
|
|
196
|
-
4. **Delete the YAML
|
|
197
|
-
|
|
196
|
+
4. **Delete the YAML** in the same change. (0775 retired the composition-baseline entries that
|
|
197
|
+
used to be deleted alongside it; the live definition is the only artifact left.)
|
|
198
198
|
5. **Record the demotion** and its trigger, so the next author does not re-promote it by reflex.
|
|
199
199
|
|
|
200
200
|
### optimize — refine an accepted workflow in place
|
|
@@ -231,10 +231,10 @@ agent prompts where a first-class surface would own it better?" — nothing more
|
|
|
231
231
|
raw prompt length only sets the reported severity (<200 low / ≤1000 medium / >1000 high).
|
|
232
232
|
|
|
233
233
|
**How to run it:** it is not a separate command — `spur workflow validate <file> --json` returns
|
|
234
|
-
`composition: {findings[]
|
|
235
|
-
with exit 0.
|
|
236
|
-
`
|
|
237
|
-
|
|
234
|
+
`composition: {findings[]}` on the valid path; human mode prints the advisory to stderr
|
|
235
|
+
with exit 0. Findings are derived from the workflow definition itself
|
|
236
|
+
(`extractResolvedWorkflowFacts`, guarded by `composition-baseline.test.ts`); 0775 retired the
|
|
237
|
+
suppression snapshot, so every finding is reported — none are suppressed.
|
|
238
238
|
|
|
239
239
|
**How to read it, and the fix path per defect class:**
|
|
240
240
|
|
|
@@ -153,6 +153,23 @@ CLI does.
|
|
|
153
153
|
|
|
154
154
|
## Gotchas
|
|
155
155
|
|
|
156
|
+
### Bounded execution and recovery (0777)
|
|
157
|
+
|
|
158
|
+
- During planning/refinement of corpus-scale work, record an execution budget, persisted-artifact
|
|
159
|
+
paths and requireDiff guidance in the task Design. For classification-only work, declare
|
|
160
|
+
`mutationPolicy: none`; its task/evidence change is the deliverable, not invented source edits.
|
|
161
|
+
Preserve partial artifacts at the budget boundary; resume only against the current task contract.
|
|
162
|
+
- Before accepting a child/watcher result, compare its run ID with the dispatched run ID and check
|
|
163
|
+
current trace state through Spur. If using a run log as evidence, require its mtime to be at least
|
|
164
|
+
the dispatch time. A mismatch or stale timestamp is not completion evidence. Do not scrape terminals.
|
|
165
|
+
Bound each watch invocation to 10 minutes or 20 polls, whichever comes first; persist the last
|
|
166
|
+
confirmed identity/state and report a checkpoint before continuing. A watcher timeout does not
|
|
167
|
+
cancel the owned run or authorize launching a replacement.
|
|
168
|
+
- Mark superseded scratch with `SUPERSEDED` and a pointer to the authoritative task Design. Never
|
|
169
|
+
let a scratch instruction override the live task, even when its old run is still readable.
|
|
170
|
+
- Checker-policy changes require one explicit unsuppressed audit (T10); ordinary corpus commit
|
|
171
|
+
prep checks affected documents and linked evidence (T11), not the corpus. No acceptance snapshots.
|
|
172
|
+
|
|
156
173
|
1. **Never skip a gate.** A clean `feature check` is the only proof the AC is valid; a
|
|
157
174
|
passing `batch-create` is the only proof the decomposition is well-formed. Skip either and
|
|
158
175
|
you ship corrupted corpus.
|
|
@@ -887,9 +887,9 @@ time. Before launching a full `spur-check-new`:
|
|
|
887
887
|
`console.*`), spawn processes via `NodeProcessExecutor` (no `Bun.spawnSync`), get a
|
|
888
888
|
`runtime-boundaries` fs-io exemption for sync reads (mirrors `task.ts`), and a non-command helper
|
|
889
889
|
must not live in `apps/cli/src/commands/` (the noun scan treats every file there as a noun).
|
|
890
|
-
3. **Doc/TSDoc edits shift `file:line` anchors** cited by other tasks —
|
|
891
|
-
as `L4.anchor-subject-mismatch
|
|
892
|
-
|
|
890
|
+
3. **Doc/TSDoc edits shift `file:line` anchors** cited by other tasks — the per-task gate surfaces
|
|
891
|
+
them as `L4.anchor-subject-mismatch` (0775: the corpus sweep retired; run `spur task check <wbs>`
|
|
892
|
+
on touched tasks). Repoint the shifted citations (via `spur task update --section`)
|
|
893
893
|
|
|
894
894
|
## AC traceability
|
|
895
895
|
|
|
@@ -170,7 +170,7 @@ transition to `done`.
|
|
|
170
170
|
> The verify skill writes this shape automatically — operators only need it when hand-authoring
|
|
171
171
|
> an answer file or debugging an UNKNOWN verdict.
|
|
172
172
|
|
|
173
|
-
> **
|
|
173
|
+
> **Finding-rule discipline (ADR-108).** When checker policy changes, run focused tests and one explicit unsuppressed `bun run corpus-check` audit; record/reconcile essential failures without waivers (T10). Ordinary corpus commit prep checks changed tasks/features and their required linked evidence, not the corpus (T11). The baseline and regenerators remain deleted; tests are not a substitute for the explicit policy-change audit.
|
|
174
174
|
>
|
|
175
175
|
> **Transition-shim discipline (`transition-shim-check`, task 0541 / ADR-058).** Wired as an early step of `spur-check` / `spur-check-new` (second, after `link-check` and before `lint`) so a shim violation fails in ~0.3 s rather than after the test run. Two-sided against `config/transition-shims.json`: an `@transition-shim(<id>)` marker with no manifest entry fails as a **new unregistered shim**, **and** a listed entry whose marker is gone from source fails as a **stale entry**. Emptying the manifest is the definition of the agent-role transition being complete. A removal condition must be objectively checkable against the repository. Shapes: `docs/04_DESIGN.md` §2.5.
|
|
176
176
|
|
|
@@ -188,4 +188,3 @@ transition to `done`.
|
|
|
188
188
|
> failure is not yours. This costs seconds and mutates nothing — do **not** `git stash` to get a
|
|
189
189
|
> clean baseline on a shared working tree. Treat any failure that does *not* name a port/listen/`ps`
|
|
190
190
|
> cause as yours until proven otherwise; the count is a moving baseline, not a constant.
|
|
191
|
-
|
|
@@ -147,7 +147,7 @@ Invoked when a map already exists (operator provides the feature ID). A ticket i
|
|
|
147
147
|
— no task is claimed, and it does not consume the session's one ticket.
|
|
148
148
|
|
|
149
149
|
5. **Record the resolution.** Post the answer in the task body, then `spur task update <wbs> done`. Append one line to the map's **## Decisions so far**: `- [<WBS> <title>](path) — <one-line gist of the answer>`.
|
|
150
|
-
6. **Graduate fog into new tickets.** Any fog the answer has made specifiable becomes fresh child tasks (create-then-wire). Clear each graduated patch from **### Not yet specified** so it lives only as its new ticket. Doing half of this — deleting the fog without creating the ticket — destroys the only record the work was ever identified
|
|
150
|
+
6. **Graduate fog into new tickets.** Any fog the answer has made specifiable becomes fresh child tasks (create-then-wire). Clear each graduated patch from **### Not yet specified** so it lives only as its new ticket. Doing half of this — deleting the fog without creating the ticket — destroys the only record the work was ever identified; the `corpus.ungraduated-fog` sweep retired in 0775 — enforcement is review-time discipline.
|
|
151
151
|
7. **Rule out mis-scoped tickets.** If the answer reveals a ticket sits beyond the destination, close it and add one line to **### Out of scope** (the gist + why it's out of scope, linking the closed ticket). A scope boundary is not a step on the route — it stays out of **## Decisions so far**.
|
|
152
152
|
8. **Stop after ONE ticket.** Never resolve more than one per session.
|
|
153
153
|
|