@gobing-ai/spur 0.4.10 → 0.4.12
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 +22 -0
- package/config/rules/quality/coverage-gate.yaml +2 -2
- package/config/rules/surface/check-cli-surface.yaml +4 -0
- package/config/workflows/feature-verification.yaml +14 -5
- package/config/workflows/idea-pipeline.yaml +92 -12
- package/config/workflows/pr-review.yaml +72 -224
- package/config/workflows/task-pipeline.yaml +456 -830
- package/config/workflows/wayfinder-resolution.yaml +20 -3
- package/config/workflows/wrapup-pipeline.yaml +22 -9
- package/package.json +1 -1
- package/plugins/sp/README.md +2 -2
- package/plugins/sp/agents/super-planner.md +2 -2
- package/plugins/sp/agents/super-reviewer.md +17 -8
- package/plugins/sp/bunfig.toml +3 -3
- package/plugins/sp/commands/dev-changelog.md +1 -1
- package/plugins/sp/commands/dev-gitmsg.md +2 -2
- package/plugins/sp/commands/dev-handover.md +1 -1
- package/plugins/sp/commands/dev-idea.md +23 -13
- package/plugins/sp/commands/dev-job-dump.md +1 -1
- package/plugins/sp/commands/dev-plan.md +17 -6
- package/plugins/sp/commands/dev-pr-review.md +27 -17
- package/plugins/sp/commands/dev-review.md +1 -1
- package/plugins/sp/commands/dev-run.md +7 -6
- package/plugins/sp/commands/dev-runall.md +1 -1
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/skills/code-implementation/SKILL.md +7 -7
- package/plugins/sp/skills/code-refactoring/SKILL.md +1 -1
- package/plugins/sp/skills/code-verification/SKILL.md +1 -1
- package/plugins/sp/skills/code-verification/references/secu-review.md +8 -4
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +23 -10
- package/plugins/sp/skills/doc-evolve/SKILL.md +1 -1
- package/plugins/sp/skills/next-router/references/routing-table.md +1 -1
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +7 -7
- package/plugins/sp/skills/pr-reviewing/SKILL.md +157 -210
- package/plugins/sp/skills/source-driven-development/SKILL.md +14 -6
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +4 -4
- package/plugins/sp/skills/spur-check/SKILL.md +9 -8
- package/plugins/sp/skills/spur-cli/SKILL.md +3 -3
- package/plugins/sp/skills/spur-cli/references/builder.md +86 -13
- package/plugins/sp/skills/spur-cli/references/self.md +37 -2
- package/plugins/sp/skills/spur-cli/references/tasks/l3-guard-cheatsheet.md +1 -1
- package/plugins/sp/skills/spur-cli/references/tasks/verbs.md +3 -3
- package/plugins/sp/skills/spur-cli/references/tasks.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows.md +5 -3
- package/plugins/sp/skills/spur-dev/SKILL.md +3 -3
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +9 -8
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +11 -11
- package/plugins/sp/skills/spur-dev/references/done-housekeeping.md +4 -3
- package/plugins/sp/skills/spur-dev/references/execution-batch-report.md +4 -4
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +13 -11
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +31 -22
- package/plugins/sp/skills/spur-dev/references/execution-worktree-landing.md +5 -5
- package/plugins/sp/skills/spur-dev/references/execution-worktree-setup.md +4 -4
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +3 -2
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +4 -4
- package/schemas/spur-config.schema.json +19 -1
- package/spur.js +32388 -31906
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +0 -997
- package/plugins/sp/skills/spur-dev/references/structured-trace-emission.md +0 -178
|
@@ -68,8 +68,11 @@ Do **not** use this skill for:
|
|
|
68
68
|
| Recalled from a prior session; plausibly stale | Verify before relying on it |
|
|
69
69
|
| Memory only, no source in hand | Stop — verify first; never present as fact |
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
Every claim carries its citation **and an earned confidence level** — `HIGH|MEDIUM|LOW`: `HIGH`
|
|
72
|
+
cites (`path:line`, a URL, or a path with a code/doc extension), `MEDIUM`/`LOW` cite or name what is
|
|
73
|
+
unverified. That grade is evidence, not self-assessment, so it can only be as strong as what is cited
|
|
74
|
+
beside it. ADR-138 still forbids a confidence label on a verdict or verify answer, where the citation
|
|
75
|
+
alone is the evidence.
|
|
73
76
|
|
|
74
77
|
### Step 2 — Go to the primary source, in priority order
|
|
75
78
|
|
|
@@ -89,20 +92,25 @@ State the **version** inline whenever behavior is version-specific.
|
|
|
89
92
|
### Step 4 — Cite, then generate
|
|
90
93
|
|
|
91
94
|
Generate the code and **cite the source** (doc URL + date, or `pkg@version` + the file/symbol) at the
|
|
92
|
-
point of use or in the task's notes
|
|
93
|
-
unverified — flag it as such rather than presenting it as
|
|
95
|
+
point of use or in the task's notes, with the claim's earned `HIGH|MEDIUM|LOW` level beside it. A claim
|
|
96
|
+
about external behavior without a citation is unverified — flag it as such rather than presenting it as
|
|
97
|
+
fact.
|
|
94
98
|
|
|
95
99
|
### Step 5 — Check the citations before finishing
|
|
96
100
|
|
|
97
101
|
- **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.
|
|
98
102
|
- **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.
|
|
103
|
+
- **Claim confidence** — every API/library claim carries an earned level inside `HIGH|MEDIUM|LOW`: `HIGH` cites evidence, `MEDIUM`/`LOW` cite or name what is unverified. A level outside the enum, or one nothing cited earns, is a defect.
|
|
99
104
|
|
|
100
|
-
Report the first failing check and its deviation, if any.
|
|
105
|
+
Report the first failing check and its deviation, if any. This grade lives on the claim: do not append
|
|
106
|
+
a confidence verdict or a `Confidence:` line to the answer (ADR-138).
|
|
101
107
|
|
|
102
108
|
Deterministic backstop: the `cited-version-strings` and `cited-api-claims` rules
|
|
103
109
|
(`.spur/rules/docs/sourced-api-claims.yaml`) flag markdown lines that assert a version string or a
|
|
104
110
|
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.
|
|
111
|
+
with no citation anchor on the same line. Where a project runs the claim-table companion
|
|
112
|
+
(`structure/api-library-claim-citation`), the rows of an `API/library claim sources and confidence`
|
|
113
|
+
block are checked the same way — citation present, level earned. They are an info-severity advisory
|
|
106
114
|
backstop for this contract and are deliberately NOT wired into `recommended-pre-check` — run them ad
|
|
107
115
|
hoc with `spur rule run --file .spur/rules/docs/sourced-api-claims.yaml`. Dated working records
|
|
108
116
|
(`docs/report*`, `docs/dogfood`, `docs/plans`, `docs/analysis`) are excluded, as are the task
|
|
@@ -53,10 +53,10 @@ Every batch item's hour estimate MUST also travel into the batch JSON as the ite
|
|
|
53
53
|
frontmatter, and it can be corrected later with `spur task update <wbs> --estimate-hours <n>`. The
|
|
54
54
|
estimate already exists at this point (the hour knobs were just applied above); writing it down
|
|
55
55
|
costs nothing and makes the size decision visible to later stages instead of re-derived. Its
|
|
56
|
-
primary consumer is the
|
|
57
|
-
([
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
primary consumer is the host session's dispatch floor
|
|
57
|
+
([execution-batch.md](../../spur-dev/references/execution-batch.md)): a task at or below 1 hour
|
|
58
|
+
executes its stages in the host rather than paying a subagent dispatch. An estimate left unwritten
|
|
59
|
+
forgoes that gate — the task dispatches like any large one.
|
|
60
60
|
|
|
61
61
|
### Worked example: H8's own first decomposition
|
|
62
62
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-check
|
|
3
|
-
description: 'Two-tier check primitive for the sp pipeline: light (changed-scope biome, per-workspace typecheck, related tests) during development; full (
|
|
3
|
+
description: 'Two-tier check primitive for the sp pipeline: light (changed-scope biome, per-workspace typecheck, related tests) during development; full (`spur self exec check`) once at the quality boundary. Reads/writes fingerprint-bound check receipts (.spur/run/<wbs>-check-receipt.json) and reuses a PASS full receipt only at the same proof digest.'
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
version: 1.0.0
|
|
6
6
|
metadata:
|
|
@@ -34,7 +34,7 @@ gate writes a fingerprint-bound receipt that downstream stages read instead of r
|
|
|
34
34
|
| Tier | Mode | When | Scope |
|
|
35
35
|
| --- | --- | --- | --- |
|
|
36
36
|
| `light` | `spur task gate <wbs> light` | after each implement/fix edit | `bunx biome check` on the changed files (`git diff --name-only HEAD` + untracked), `bun run typecheck` per touched workspace, and related tests (`<ws>/src/**/x.ts` → `<ws>/tests/**/x.test.ts` filename mapping) run via `cd <ws> && bun test …` — never from the repo root, whose bunfig preload does not apply inside the workspace |
|
|
37
|
-
| `full` | `spur task gate <wbs> run` | once at the task quality boundary (`test`) | today's chain: `
|
|
37
|
+
| `full` | `spur task gate <wbs> run` | once at the task quality boundary (`test`) | today's chain: `spur self exec lint` + `spur self exec rules-pre` + `spur self exec test` + `spur self exec rules-post` (=`spur self exec check`), with bounded findings, SQLite-busy retry, and the `recheck` probe |
|
|
38
38
|
|
|
39
39
|
Exit contract: `run` and `recheck` return 0 on PASS and 1 on FAIL; `deferred` returns 0 on
|
|
40
40
|
DEFERRED and 1 on FAIL. `light` and `status` return 0; invalid usage returns 2. The pipeline
|
|
@@ -58,10 +58,10 @@ that soft shell wrapper does not change the standalone CLI contract.
|
|
|
58
58
|
}
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
- `inputDigest` is the
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
61
|
+
- `inputDigest` is the git tree the gate computes for itself (`captureGateGitTree`: `git read-tree
|
|
62
|
+
HEAD`, `git add -A` excluding `docs/tasks*` and `docs/features*`, `git write-tree` on a throwaway
|
|
63
|
+
index). The plugin never computes it and no caller supplies it — ADR-140 retired the
|
|
64
|
+
`proofDigest`/`--proof-digest` chain, so a corpus edit cannot invalidate a code PASS.
|
|
65
65
|
- `run` and `recheck` write full-tier receipts; only a PASS at the current digest is reusable. Without a digest, `run` writes no receipt and says
|
|
66
66
|
so in the gate log. The gate executes `qualityGateCmd` as one unit, so the full receipt carries a
|
|
67
67
|
single `test` row for the whole chain; `lint`, `typecheck`, `test-pre-check`,
|
|
@@ -76,7 +76,7 @@ Check `status` mode before re-running a gate. The gate ships inside the CLI (no
|
|
|
76
76
|
resolve):
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
spur task gate <wbs> status --
|
|
79
|
+
spur task gate <wbs> status --no-logo # final stdout line: {"reuse":…,"reason":…}
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
`reuse: true` only when the receipt is `status: PASS`, `tier: full`, and `inputDigest` equals the
|
|
@@ -105,7 +105,8 @@ preserved by construction. `recheck` stays the no-progress probe path for fix lo
|
|
|
105
105
|
## Gotchas
|
|
106
106
|
|
|
107
107
|
1. **Keep gate logic in the CLI/application owner** — plugin skills invoke `spur task gate`;
|
|
108
|
-
they do not restore a script or bundle. The
|
|
108
|
+
they do not restore a script or bundle. The gate computes its own tree identity; there is no
|
|
109
|
+
`--proof-digest` flag and no `env.proofDigest` input to supply.
|
|
109
110
|
2. **Never run light tests from the repo root** — the workspace `bunfig.toml` preload (coverage,
|
|
110
111
|
thresholds) only applies inside the workspace; `cd <ws> && bun test …` is the contract.
|
|
111
112
|
3. **Light is a filter, not a boundary** — unmapped files (root-level scripts, non-src layouts)
|
|
@@ -44,10 +44,10 @@ Pick the noun, read its reference. Each Tier A and Tier B reference owns that no
|
|
|
44
44
|
| **Tier A** | **feature** | Feature tree: author with hierarchical IDs (DD-14), acceptance criteria (Gherkin), status lifecycle, move subtrees, `check --json` | [references/features.md](references/features.md) |
|
|
45
45
|
| **Tier A** | **rule** | Constraint quality gate: run presets, author rules, fine-tune, validate rule files/presets, extend engine | [references/rules.md](references/rules.md) |
|
|
46
46
|
| **Tier A** | **workflow** | Dual-mode workflow runtime: author state-machine / transition-flow workflows, validate, run, read traces | [references/workflows.md](references/workflows.md) |
|
|
47
|
-
| **Tier A** | **builder** | Release/PR plumbing: `bump-ver` (including read-only `--check`), `drop-tags`, `publish`,
|
|
47
|
+
| **Tier A** | **builder** | Release/PR plumbing: `bump-ver` (including read-only `--check`), `drop-tags`, `publish`, the four flat PR verbs (`pr-status`, `pr-check`, `pr-open`, `pr-review`), and the read-only `show-branches` topology report | [references/builder.md](references/builder.md) |
|
|
48
48
|
| **Tier B** | **agent** | Coding-agent execution surface: run prompts via detected/named agents, list agent specs (incl. `agent.fleet` members), start/stop supervised processes, fleet `report`/`join`/`leave`/`wait`/`trace`, readiness check | [references/agent.md](references/agent.md) |
|
|
49
49
|
| **Tier B** | **message** | Durable inter-agent messaging: send, inbox, reply, watch | [references/message.md](references/message.md) |
|
|
50
|
-
| **Tier B** | **self** | Self-management verbs: scaffold (`init`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
|
|
50
|
+
| **Tier B** | **self** | Self-management verbs: scaffold (`init`), project SDLC actions (`exec`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), status overview (`status`); `self init` runs post-scaffold validation probes & layout classification | [references/self.md](references/self.md) |
|
|
51
51
|
| **Tier B** | **history** | Import agent histories, aggregate forensic artifacts, render reports, and run the checkpoint-resumed daily pipeline | [references/history.md](references/history.md) |
|
|
52
52
|
| **Tier B** | **projects** | Manage the local multi-project registry and start/stop project servers | [references/projects.md](references/projects.md) |
|
|
53
53
|
| **Tier B** | **decision** | Decision-catalog transport: list visible decisions, show a served contract, run a decision to a served outcome, audit catalog health | [references/decision.md](references/decision.md) |
|
|
@@ -145,7 +145,7 @@ and spreading it; full contract in `docs/04_DESIGN.md` §1.0.1.
|
|
|
145
145
|
`inbox`, `reply`, `watch`).
|
|
146
146
|
- **[references/decision.md](references/decision.md)** - decision catalog (`list`, `show`, `run`,
|
|
147
147
|
`status`); offline by default via the built-in `typesafe` maker.
|
|
148
|
-
- **[references/self.md](references/self.md)** - `spur self init|maintain|migrate|serve|status` CLI verbs
|
|
148
|
+
- **[references/self.md](references/self.md)** - `spur self init|exec|maintain|migrate|serve|status` CLI verbs
|
|
149
149
|
(the five legacy top-level nouns remain hidden aliases). `self init` runs post-scaffold init
|
|
150
150
|
validation (Phase 1.5/1.6 probes).
|
|
151
151
|
- **[references/history.md](references/history.md)** - history import, forensic artifact analysis,
|
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-builder
|
|
3
|
-
description: "spur-cli noun reference: operate `spur builder` as the release plumbing surface - bump a workspace package (or the `workspace:`-pinned release set) with `bump-ver`, delete release tags with `drop-tags`, with commit + annotated tag + optional push; publish a package to npm with `publish` (and guard version drift with `bump-ver --check`); run the `/sp:dev-pr-review`
|
|
3
|
+
description: "spur-cli noun reference: operate `spur builder` as the release plumbing surface - bump a workspace package (or the `workspace:`-pinned release set) with `bump-ver`, delete release tags with `drop-tags`, with commit + annotated tag + optional push; publish a package to npm with `publish` (and guard version drift with `bump-ver --check`); run the `/sp:dev-pr-review` PR loop with the four flat verbs `pr-status` (read-only status), `pr-check` (submission gate), `pr-open` (push + ensure PR) and `pr-review` (Codex request + wait + collect); report base-relative branch topology with `show-branches`. Promoted from spur-dev (task 0617, ADR-051); frozen at exactly these eight verbs."
|
|
4
4
|
see_also:
|
|
5
5
|
- spur-cli
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# spur builder - release plumbing
|
|
9
9
|
|
|
10
|
-
`spur builder` is the CLI for **version bumps and release tags
|
|
11
|
-
|
|
10
|
+
`spur builder` is the CLI for **version bumps and release tags**, plus the PR-review loop and the
|
|
11
|
+
read-only branch report. It wraps the internal
|
|
12
|
+
`release-ops` implementation behind a public eight-verb surface. The repo-local forwarder
|
|
12
13
|
(`scripts/commands/release.ts`) and its `spur-dev` dispatcher cases were retired in task 1173; the
|
|
13
14
|
root `bun run bump-ver` / `bun run drop-tags` names route to `spur builder` directly. Package ids are
|
|
14
15
|
the unscoped short names (`@gobing-ai/spur` → `spur`); the released set and the aggregate tag are
|
|
15
16
|
discovered from the repo's own workspace manifests, so the same code serves any git+semver
|
|
16
17
|
monorepo.
|
|
17
18
|
|
|
18
|
-
This noun is **frozen at exactly
|
|
19
|
-
|
|
19
|
+
This noun is **frozen at exactly eight verbs** (`bump-ver`, `drop-tags`, `publish` from the 2026-10-15
|
|
20
|
+
script-absorption entries; `show-branches` and the four flat PR verbs `pr-status`, `pr-check`,
|
|
21
|
+
`pr-open`, `pr-review` from the 2026-10-16 feature-L1 entries) by operator consent
|
|
22
|
+
(`docs/design/harness-surface-governance.md` §3) — do not invent additional `builder` subcommands.
|
|
23
|
+
The former `pr <op>` pass-through stays registered as a **hidden, deprecated alias** for one release
|
|
24
|
+
(it prints one stderr deprecation line naming the replacement verb), so it is not listed here.
|
|
20
25
|
|
|
21
26
|
## Verb map
|
|
22
27
|
|
|
@@ -25,7 +30,11 @@ This noun is **frozen at exactly four verbs** (`bump-ver`, `drop-tags`, plus `pr
|
|
|
25
30
|
| `bump-ver [package-id] [version]` | Bump one package (manifest + in-source `binaryVersion` + consumer `workspace:` pins), commit, tag, optionally push; `--check [package-id]` only verifies marketplace/plugin versions (exit 1 on drift) | `--all` `--push` `--check` `--json` |
|
|
26
31
|
| `drop-tags [package-id] <version>` | Delete a package's release tag (local only by default) | `--all` `--remote` `--json` |
|
|
27
32
|
| `publish <dir>` | CI npm publish: resolve `workspace:`/`catalog:` ranges, `build:bundle`, `npm publish --access public`, restore the manifest | `--otp` |
|
|
28
|
-
| `pr <
|
|
33
|
+
| `pr-check [--base <branch>] [--scan-only]` | Submission gate for `/sp:dev-pr-review`: preflight then the `base...HEAD` hygiene scan; a preflight failure stops before hygiene (`PASS`/`WARN`/`BLOCK`/`FAIL`) | `--base` `--scan-only` `--json` `--status-file` |
|
|
34
|
+
| `pr-open [--base <branch>]` | Publish the branch (never force) and reuse or create its PR (`FOUND`/`CREATED`/`FAIL`) | `--base` `--json` `--status-file` |
|
|
35
|
+
| `pr-review [--force] [--focus <text>] [--no-wait]` | Post the `@codex review` request, wait, then collect (`CLEAN`/`FINDINGS`/`PENDING`/`FAIL`; exit 3 = pending) | `--force` `--focus` `--no-wait` `--timeout` `--interval` `--json` `--status-file` |
|
|
36
|
+
| `pr-status [--since <iso>] [--head <sha>]` | Read-only PR/CI/Codex status with the current-HEAD review as `review` (no verdict) | `--since` `--head` `--json` `--status-file` |
|
|
37
|
+
| `show-branches` | Read-only branch topology report against a base (default `markdown` with a condensed mermaid `gitGraph`) | `--format` `--json` `--base` `--local` `--remote` `--pr` `--limit` `--max-commits` `--hide-contained` `--theme` |
|
|
29
38
|
|
|
30
39
|
A bare `bump-ver <version>` (single positional that parses as semver) or explicit `--all` bumps
|
|
31
40
|
every package pinned via `workspace:` by another workspace package, then adds per-package trace
|
|
@@ -58,14 +67,78 @@ spur builder drop-tags spur 0.1.4 # delete the local tag @gobing-ai/sp
|
|
|
58
67
|
spur builder drop-tags --all 0.1.4 --remote # delete per-package + aggregate tags, locally and on origin
|
|
59
68
|
```
|
|
60
69
|
|
|
61
|
-
## `pr` - PR-review
|
|
70
|
+
## `pr-status`, `pr-check`, `pr-open`, `pr-review` - the PR-review loop
|
|
62
71
|
|
|
63
72
|
```bash
|
|
64
|
-
spur builder pr
|
|
65
|
-
spur builder pr
|
|
66
|
-
spur builder pr
|
|
67
|
-
spur builder pr
|
|
73
|
+
spur builder pr-status --json # read-only composite status + .review
|
|
74
|
+
spur builder pr-check --base main --json # preflight + hygiene submission gate
|
|
75
|
+
spur builder pr-check --scan-only --json # hygiene alone (local review on a dirty tree)
|
|
76
|
+
spur builder pr-open --base main --json # push, then reuse or create the PR
|
|
77
|
+
spur builder pr-review --focus "migration safety" --json # request → wait → collect
|
|
78
|
+
spur builder pr-review --no-wait --json # post the request, return PENDING
|
|
79
|
+
spur builder pr-review --force --json # force a fresh review of the current HEAD
|
|
68
80
|
```
|
|
69
81
|
|
|
70
|
-
|
|
71
|
-
the `pr-review` workflow.
|
|
82
|
+
Four flat verbs over the ops absorbed from `plugins/sp/scripts/pr-reviewing.ts` (script-absorption
|
|
83
|
+
PR-7); driven by the `pr-review` workflow. Each composes existing ops and embeds their records in
|
|
84
|
+
one JSON object per verb: `pr-status` → the status object plus `review` (collect, or `null` with no
|
|
85
|
+
PR); `pr-check` → `{ ok, verdict, preflight, hygiene }`; `pr-open` → `{ ok, verdict, push, pr }`;
|
|
86
|
+
`pr-review` → `{ ok, verdict, request, findings }`.
|
|
87
|
+
|
|
88
|
+
- **`--status-file`** holds the verb's one-word verdict: `PASS`/`WARN`/`BLOCK`/`FAIL` (`pr-check`),
|
|
89
|
+
`FOUND`/`CREATED`/`FAIL` (`pr-open`), `CLEAN`/`FINDINGS`/`PENDING`/`FAIL` (`pr-review`).
|
|
90
|
+
`pr-status` is read-only and writes none.
|
|
91
|
+
- **Exit codes:** `0` ok, `1` usage, `2` hard failure, `3` wait timeout — exit 3 is `PENDING`
|
|
92
|
+
(pending, never failure; collect later with `pr-status`).
|
|
93
|
+
- **`--head`:** `pr-status` pins the reviewed commit; it defaults to the current local HEAD, and an
|
|
94
|
+
explicit pin that no longer matches the PR head fails loud instead of reporting a moved commit.
|
|
95
|
+
- **Deduping:** `pr-review` collects without a new request when the exact HEAD is already reviewed,
|
|
96
|
+
and returns `PENDING` when a marked request is still in flight; `--force` requests a fresh review
|
|
97
|
+
(`mode=rerun`). Never force-pushes.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# deprecated alias, one release: maps the old op names to the verbs above
|
|
101
|
+
spur builder pr preflight --json # -> spur builder pr-check
|
|
102
|
+
spur builder pr status --json # -> spur builder pr-status
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## `show-branches` - read-only branch topology report
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
spur builder show-branches # markdown: summary table + condensed mermaid gitGraph
|
|
109
|
+
spur builder show-branches --base origin/main # measure every branch against another base
|
|
110
|
+
spur builder show-branches --format json # raw { base, generatedAt, branches[], omitted, warnings[] }
|
|
111
|
+
spur builder show-branches --pr --limit 50 # add open pull-request state, keep up to 50 rows
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
One row per branch — local, remote-only, or the detached HEAD by short sha — with the fork point,
|
|
115
|
+
commits ahead/behind the base, the contained flag (`ahead == 0`, i.e. everything in it is already in
|
|
116
|
+
the base), the last commit, and the worktree path that has it checked out. Base resolution is
|
|
117
|
+
`--base <ref>`, else the `origin/HEAD` target, else `main`. `--local` / `--remote` filter the ref
|
|
118
|
+
namespace (mutually exclusive), `--limit <n>` (default 30) caps rows by most recent commit and
|
|
119
|
+
reports the omitted count, and `--pr` adds the open pull-request number/state/review decision from a
|
|
120
|
+
single `gh pr list` call (a missing or unauthenticated `gh` degrades to null PR fields plus one
|
|
121
|
+
warning, never a failure).
|
|
122
|
+
|
|
123
|
+
| Flag | Description |
|
|
124
|
+
| ---- | ----------- |
|
|
125
|
+
| `--format <markdown\|json\|text>` | Output format; `markdown` is the default |
|
|
126
|
+
| `--json` | Alias of `--format json` |
|
|
127
|
+
| `--base <ref>` | Base ref (default: the `origin/HEAD` target, else `main`) |
|
|
128
|
+
| `--local` / `--remote` | Restrict to local or remote branches |
|
|
129
|
+
| `--pr` | Enrich rows with open pull-request state (one `gh pr list` call) |
|
|
130
|
+
| `--limit <n>` | Maximum branch rows (default 30) |
|
|
131
|
+
| `--max-commits <n>` | Maximum commit nodes per branch line in the graph (default 3) |
|
|
132
|
+
| `--hide-contained` | Drop contained branches from the graph instead of drawing their join |
|
|
133
|
+
| `--theme <name>` | Mermaid theme for the graph init directive |
|
|
134
|
+
|
|
135
|
+
The graph draws the base line, one `branch` per open branch, a `+N earlier` summary node for the
|
|
136
|
+
commits a cap hides, `HIGHLIGHT` tips, `REVERSE` reverts and the tag names of the commits it shows.
|
|
137
|
+
Read-only: it never creates, moves or deletes a ref, config entry, index entry or worktree.
|
|
138
|
+
|
|
139
|
+
The graph rules are `mermaid@11.15.0` HIGH, pinned at `apps/web/package.json:28` and asserted by
|
|
140
|
+
`apps/web/tests/branch-topology-graph.heavy.test.ts:155`. The `--pr` vocabulary is `gh@2.102.0` HIGH at
|
|
141
|
+
`https://cli.github.com/manual/gh_pr_list` (read 2026-10-16), measured against this repo's own PRs.
|
|
142
|
+
|
|
143
|
+
**Exit codes:** `0` ok, `1` usage (unknown `--format`, non-positive `--limit`/`--max-commits`,
|
|
144
|
+
unknown base ref, `--local` with `--remote`), `2` git failure (not a repository, `git` missing).
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spur-cli-self
|
|
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`).
|
|
3
|
+
description: "spur-cli noun reference for `spur self`: self-management verbs — SDLC action runner (`exec`), scaffold (`init`), database maintenance (`maintain`), schema migrations (`migrate`), local web server (`serve`), and status overview (`status`). The five legacy verbs (`init`, `maintain`, `migrate`, `serve`, `status`) each mount the same command builder as their legacy top-level noun, which remains a hidden alias; `exec` has no top-level alias."
|
|
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 self-management verbs.
|
|
10
|
+
`spur self` hosts the self-management verbs. Five of them are the canonical path for a command
|
|
11
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.
|
|
15
15
|
|
|
16
|
+
`exec` is the exception: it exists only as `spur self exec` — there is no `spur exec` top-level
|
|
17
|
+
alias (`spur exec <action>` is an unknown command), so nothing depends on a legacy path.
|
|
18
|
+
|
|
16
19
|
## Verb map
|
|
17
20
|
|
|
18
21
|
| Verb | Purpose | Key flags |
|
|
19
22
|
| ---- | ------- | --------- |
|
|
23
|
+
| `exec` | Run (or list) a project SDLC action bound in `builder.actions` / `builder.preset` | `--list` `--dry-run` `--json` |
|
|
20
24
|
| `init` | Scaffold a new Spur project in the current directory | `--name <name>` `--force` `--minimal` `--adopt-global-config` `--json` |
|
|
21
25
|
| `maintain` | Run database maintenance: PRAGMA optimize, WAL truncation, optional VACUUM | `--vacuum` `--json` |
|
|
22
26
|
| `migrate` | Apply CLI-owned schema migrations (or `--check` the importer schema) | `--check` `--json` |
|
|
@@ -28,6 +32,37 @@ top-level forms are omitted from `spur --help`, leaving `self` as the visible su
|
|
|
28
32
|
**[serve.md](serve.md)** owns the `serve` verb (server flags and dry-probe semantics). `migrate`
|
|
29
33
|
has no reference of its own and is documented inline below.
|
|
30
34
|
|
|
35
|
+
## `self exec` - run a project SDLC action
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
spur self exec build # run the resolved command in the project root
|
|
39
|
+
spur self exec lint -- --fix # extra args: shell-quoted and appended to a string action
|
|
40
|
+
spur self exec --list # every reserved + declared action, its source and command
|
|
41
|
+
spur self exec --list --json # machine-readable action inventory
|
|
42
|
+
spur self exec test --dry-run # print the resolved command(s), run nothing
|
|
43
|
+
spur self exec check -- --fail-on error # trailing args reach the command (composites refuse them: exit 2)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Runs one action resolved from the project's `builder` config in `.spur/config.yaml`:
|
|
47
|
+
`builder.actions.<action>` first, then the active `builder.preset` (`bun` or `none`), then the
|
|
48
|
+
stack-neutral default. The command runs through `sh -c` **in the project root** with
|
|
49
|
+
stdout/stderr inherited (stdin is not forwarded) and `SPUR_ACTION=<action>` exported to the child;
|
|
50
|
+
spur exits with the child's exit code.
|
|
51
|
+
A composite action runs its steps in order, echoes `▶ <step>` per step on stderr, and stops at the
|
|
52
|
+
first non-zero exit.
|
|
53
|
+
|
|
54
|
+
| Exit | When |
|
|
55
|
+
| ---- | ---- |
|
|
56
|
+
| child's code | the action (or the failing composite step) exited non-zero |
|
|
57
|
+
| `2` | action unbound, composite given arguments, or no action and no `--list` |
|
|
58
|
+
| `1` | unknown option (commander usage error, before the verb runs) |
|
|
59
|
+
|
|
60
|
+
`--list --json` rows are `{ name, reserved, source: config|preset|default|unbound, command | steps }`; an
|
|
61
|
+
`unbound` row carries neither `command` nor `steps`, so branch on `source`;
|
|
62
|
+
`--dry-run --json` prints `[{ name, command }]`, one object per resolved step, and runs nothing.
|
|
63
|
+
`--json` without `--list` or `--dry-run` prints a final `{ action, steps: [{ name, exitCode, durationMs }], exitCode }`
|
|
64
|
+
after the streaming output. Full surface: `docs/design/sdlc-actions.md` §3.3.
|
|
65
|
+
|
|
31
66
|
## `self init` - scaffold a Spur project
|
|
32
67
|
|
|
33
68
|
```bash
|
|
@@ -81,7 +81,7 @@ Prose-only reviews and rows containing only empty/placeholder cells do not pass.
|
|
|
81
81
|
}
|
|
82
82
|
],
|
|
83
83
|
"checks": [
|
|
84
|
-
{ "name": "lint-clean", "status": "pass", "evidence": "
|
|
84
|
+
{ "name": "lint-clean", "status": "pass", "evidence": "spur self exec lint: exit 0" }
|
|
85
85
|
],
|
|
86
86
|
"source": "spur-task-verdict"
|
|
87
87
|
}
|
|
@@ -79,7 +79,7 @@ frontmatter scalar.
|
|
|
79
79
|
- **Frontmatter** (`--feature <id>`, `--priority <p>`): sets the scalar frontmatter field on an
|
|
80
80
|
existing task — the only post-create path, allow-listed to `feature_id` / `parent_wbs` / `priority`.
|
|
81
81
|
- **Estimate** (`--estimate-hours <n>`): sets the `estimate_hours` frontmatter field (positive number) —
|
|
82
|
-
the decomposition size estimate the
|
|
82
|
+
the decomposition size estimate the host-session dispatch floor reads.
|
|
83
83
|
- **`--provenance-bypass`** (pair with `--force-done` and `--reason`): records an audited
|
|
84
84
|
provenance-bypass link when no pipeline run exists. Replaces the `SPUR_PROVENANCE_OVERRIDE` env var.
|
|
85
85
|
- **AC controls** (`--ac-altitude <graduating|task-local>`, `--ac-numbering task-local`) — independent
|
|
@@ -356,7 +356,7 @@ column to distinguish AC rows from requirement rows:
|
|
|
356
356
|
| AC | Status | Evidence Type | Evidence |
|
|
357
357
|
|----|--------|---------------|----------|
|
|
358
358
|
| AC-1 | MET | test | `tests/foo.test.ts:12` |
|
|
359
|
-
| AC-2 | MET | command | `
|
|
359
|
+
| AC-2 | MET | command | `spur self exec lint` exit 0 |
|
|
360
360
|
| AC-3 | N/A | n/a | non-behavioral — doc-only |
|
|
361
361
|
```
|
|
362
362
|
|
|
@@ -465,7 +465,7 @@ spur task resolve <file-path> [--strict] [--folder] [--json]
|
|
|
465
465
|
spur task path <wbs> [--folder] [--json]
|
|
466
466
|
spur task run-link <wbs> [--source <src>] [--run-id <id>] [--json]
|
|
467
467
|
spur task scaffold-tests <wbs> [--file <path>] [--folder] [--json]
|
|
468
|
-
spur task gate <wbs> <run|recheck|light|deferred|status> [--cmd <c>] [--probe-cmd <c>] [--
|
|
468
|
+
spur task gate <wbs> <run|recheck|light|deferred|status> [--cmd <c>] [--probe-cmd <c>] [--run-id <id>]
|
|
469
469
|
spur task residual <wbs> <scan|review-gate|fold|settle|report> [--root <dir>] [--tmp-dir <dir>] [--folder]
|
|
470
470
|
spur task diffstat <wbs>
|
|
471
471
|
```
|
|
@@ -60,7 +60,7 @@ re-reading or re-tokenizing the task.
|
|
|
60
60
|
| `run-link <wbs>` | Record pipeline run provenance link for task | `--source <src>` `--run-id <id>` `--json` |
|
|
61
61
|
| `verifyall-aggregate` | Aggregate per-task verify outcomes into a batch verdict (NOT-STARTED excluded) | `--from-file <path>` `--json` |
|
|
62
62
|
| `scaffold-tests <wbs>` | Generate BDD test stubs from task Acceptance Criteria | `--file <path>` `--folder` `--json` |
|
|
63
|
-
| `gate <wbs> <mode>` | Task-pipeline quality gate (`run`, `recheck`, `light`, `deferred`, `status`); mode-specific exits and
|
|
63
|
+
| `gate <wbs> <mode>` | Task-pipeline quality gate (`run`, `recheck`, `light`, `deferred`, `status`); mode-specific exits and git-tree-keyed receipts (see `sp:spur-check`) | `--cmd <c>` `--probe-cmd <c>` `--run-id <id>` |
|
|
64
64
|
| `residual <wbs> <step>` | F96 residual sweep step (`scan`, `review-gate`, `fold`, `settle`, `report`) | `--root <dir>` `--tmp-dir <dir>` `--folder` |
|
|
65
65
|
| `diffstat <wbs>` | Write the triage diffstat artifact against the run base (fails safe to `sensitive: true`) | — |
|
|
66
66
|
|
|
@@ -119,7 +119,8 @@ The skill's logic divides by **whether the LLM adds value**:
|
|
|
119
119
|
| `summary` | `spur workflow summary` (CLI) | `--progress <[label=]file>`… \| `--rollup <[label=]file>`… `[--transcript] [--since] [--markdown]` | Measured execution summary (per-stage time, wait, tool calls, tokens, actor split) or the batch roll-up `/sp:dev-runall` prints. `n/a` exit 0 without a transcript; exit 2 on usage or unreadable input |
|
|
120
120
|
| `profile` | `spur workflow profile` (CLI) | `<workflow> [--last n] [--window sec] [--spur-bin cmd] [--json]` | Read-only per-node step profile from `spur workflow trace` with the ADR-115 cache-window flags, for `sp:spur-doctor`. Exit 1 when a trace read fails |
|
|
121
121
|
| `cost` | `spur workflow cost` (CLI) | `[--workflow <name>]… [--by-state] [--include-bookkeeping] [--since <date>] [--budget <file>] [--measured-file <json>] [--json]` | Real terminal non-dry run measurements, or a budget result; unknown measurements stay null. Budget failures exit 1 |
|
|
122
|
-
| `
|
|
122
|
+
| `persist-out` | `spur workflow persist-out` (CLI) | `--from <worktree> [--task-file <path>]…` | WT-4 landing: copy a worktree's run rows, two-file records and cited/owned evidence into the invoking tree before teardown; exit 1 fail closed (retain the worktree) |
|
|
123
|
+
| `persist-check` | `spur workflow persist-check` (CLI) | `--from <worktree> [--task-file <path>]… [--run-id <id>]… [--root <tree>] [--success-json <path>]` | WT-4 pre-removal assertion that the worktree owns no unpersisted durable evidence; exit 0 ok / 1 blocked or divergent / 2 usage |
|
|
123
124
|
| `commit-guard` | `spur workflow commit-guard <op>` (CLI) | `start\|stage\|check --run <id> [--base <sha>] [-- <paths…>]` | Stages only paths this run wrote; exit 2 when a listed path is refused, 3 on unmerged/conflict-marked targets |
|
|
124
125
|
| `add` | agent procedure | `"<nl-description>" [--kind <state-machine\|transition-flow>] [--file <path>]` | **Mode chosen (confirmed)** → first reconciled against existing workflows (extend an existing flow rather than duplicate) → YAML authored in real schema shape → **validated AND dry-run** (reaches the expected terminal state) → [add](workflows/operations.md#add) |
|
|
125
126
|
| `refine` | agent procedure | `<workflow-file> [--intent "<goal>"] [--dry-run]` | Smallest change meeting the intent, re-validated and re-dry-run; `--dry-run` emits a diff only → [refine](workflows/operations.md#refine) |
|
|
@@ -255,7 +256,7 @@ suppression snapshot, so every finding is reported — none are suppressed.
|
|
|
255
256
|
|
|
256
257
|
**Advisory-only posture (binding):** findings never justify blocking a run, failing a gate, or
|
|
257
258
|
editing a pipeline that is currently executing. The advisory never changes `validate`'s exit status,
|
|
258
|
-
never blocks `workflow run`, and is not part of `spur-check
|
|
259
|
+
never blocks `workflow run`, and is not part of `spur-check`. Treat a finding as
|
|
259
260
|
a to-be-enhanced note for the workflow's owner — surface it in your report, apply the fix only when
|
|
260
261
|
the operator accepts it, and never hot-edit a running workflow's shell in place.
|
|
261
262
|
|
|
@@ -274,7 +275,8 @@ spur workflow progress <run-id> [--json]
|
|
|
274
275
|
spur workflow summary (--progress <[label=]file>... | --rollup <[label=]file>...) [--transcript <path>] [--since <iso>] [--markdown]
|
|
275
276
|
spur workflow profile <workflow> [--last <n>] [--window <sec>] [--spur-bin <cmd>] [--json]
|
|
276
277
|
spur workflow cost [--workflow <name>]... [--by-state] [--include-bookkeeping] [--since <YYYY-MM-DD>] [--budget <file>] [--measured-file <json>] [--json]
|
|
277
|
-
spur workflow
|
|
278
|
+
spur workflow persist-out --from <worktree> [--task-file <path>]...
|
|
279
|
+
spur workflow persist-check --from <worktree> [--task-file <path>]... [--run-id <id>]... [--root <tree>]
|
|
278
280
|
spur workflow commit-guard <op> [options]
|
|
279
281
|
```
|
|
280
282
|
|
|
@@ -98,12 +98,12 @@ run. Resume with `spur workflow continue --answer-text <answer>` — the guard a
|
|
|
98
98
|
`maxEscalations` (default 2) bounds the loop; exhausted or empty answer → `failed`. Implement only.
|
|
99
99
|
|
|
100
100
|
Full procedure: **[references/execution-workflow.md](references/execution-workflow.md)**.
|
|
101
|
-
Host
|
|
101
|
+
Host executor: `spur workflow run` with `executor=host` → work item → `spur workflow continue`.
|
|
102
102
|
|
|
103
103
|
## Bootstrap reads
|
|
104
104
|
|
|
105
105
|
Read this `SKILL.md` plus your mode's files below before the first dispatch; everything else under
|
|
106
|
-
`references/` is on demand
|
|
106
|
+
`references/` is on demand; the per-task procedure lives in `execution-workflow.md`/`execution-batch.md`
|
|
107
107
|
(budgets: `plugins/sp/tests/bootstrap-budget.test.ts`, task 1128).
|
|
108
108
|
|
|
109
109
|
- sequential-inline: `references/execution-batch.md`
|
|
@@ -131,7 +131,7 @@ reference for the half you're operating; do not duplicate its content here.
|
|
|
131
131
|
| Refine | planning | `spur task update --section` | [planning-workflow.md](references/planning-workflow.md) |
|
|
132
132
|
| Batch refine | planning | `sp:dev-refineall` → per-task `refine` | [dev-operations.md](references/dev-operations.md) § refineall · [planning-workflow.md](references/planning-workflow.md) |
|
|
133
133
|
| Task selection | execution | `spur task list` | [execution-workflow.md](references/execution-workflow.md) |
|
|
134
|
-
| Pipeline run | execution |
|
|
134
|
+
| Pipeline run | execution | `spur workflow run` / `spur workflow continue` | [execution-workflow.md](references/execution-workflow.md) |
|
|
135
135
|
| Implement (dispatch) | execution | `sp:code-implementation` | competency skill — the spine dispatches, does not inline |
|
|
136
136
|
| Test (dispatch) | execution | `sp:code-testing` | competency skill — the spine dispatches, does not inline |
|
|
137
137
|
| Review / verify (dispatch) | execution | `sp:dev-review` → `sp:code-verification` + `sp:functional-review` + `sp:code-improvement` | competency skills — the spine dispatches, does not inline |
|
|
@@ -110,9 +110,10 @@ inside that subprocess boundary runs its backing skill in that process; it must
|
|
|
110
110
|
|
|
111
111
|
**Pipeline wrappers (`dev-run`, `dev-runall`, `dev-idea`, `dev-plan`)** — the orchestrator is a loop; its *stages* do the
|
|
112
112
|
model-bearing work. Interactive omit/`inline` therefore uses the
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
engine loop: `spur workflow run <file> --vars '{"executor":"host",…}'` executes every guard and
|
|
114
|
+
deterministic action on the engine and pauses with one work item per model stage, which this session
|
|
115
|
+
performs through the backing skill before `spur workflow continue <run-id> --answer-text <receipt>`
|
|
116
|
+
advances the run. `auto` or a named executor is merged into per-task `vars.agent` and
|
|
116
117
|
`vars.implementAgent`, and the workflow's `agent.run` steps run under that subprocess executor (see
|
|
117
118
|
`execution-batch.md` § 3.2). The loop itself continues in the current session.
|
|
118
119
|
|
|
@@ -139,8 +140,8 @@ native subagent with shared-worktree read/write/shell capability, and a task abo
|
|
|
139
140
|
(`.spur/run/<wbs>-diffstat.json`, verify only) keeps that stage host-inline (2026-09-15
|
|
140
141
|
subagent-dispatch evaluation; the floor and the
|
|
141
142
|
resume-over-re-dispatch rule for worker-role continuation stages are owned by
|
|
142
|
-
[
|
|
143
|
-
native subagent and joins before the
|
|
143
|
+
[cross-cutting.md](#inline-default-execution-surface)) — dispatches **once** to that
|
|
144
|
+
native subagent and joins before the host reports the work-item receipt; any pre-dispatch eligibility failure falls
|
|
144
145
|
back to one host execution, and a failure after dispatch follows the stage's error policy with no
|
|
145
146
|
automatic host replay. Inline resolution (omitted or explicit, 0687 R1/R2) keeps the native-subagent
|
|
146
147
|
leg for eligible stages. Operator
|
|
@@ -495,8 +496,8 @@ them; they live here because they cross every phase boundary.
|
|
|
495
496
|
skill, no `/sp:prd-*` commands, no `sp:super-pm` agent — unless a later task proves a stable,
|
|
496
497
|
distinct routing value (ADR-022).
|
|
497
498
|
7. **NEVER claim completion without fresh verification evidence.** "Tests pass" must be backed by
|
|
498
|
-
the actual `
|
|
499
|
-
`
|
|
499
|
+
the actual `spur self exec test` tail pasted into the record. "Lint clean" must be backed by
|
|
500
|
+
`spur self exec lint` output. Stale evidence from a prior run is not evidence — re-run the gate and
|
|
500
501
|
paste the current output.
|
|
501
502
|
|
|
502
503
|
## Verification Before Completion
|
|
@@ -594,7 +595,7 @@ principles determine which gates route around HITL and which still pause.
|
|
|
594
595
|
pausing. The schema is the contract; schema-valid means structurally sound.
|
|
595
596
|
2. **Gate-passed → auto-continue.** If `spur task check`, `spur feature check`, or
|
|
596
597
|
`spur workflow validate` exits 0, the run continues to the next state without surfacing.
|
|
597
|
-
3. **Tests-green → auto-continue.** If `
|
|
598
|
+
3. **Tests-green → auto-continue.** If `spur self exec lint` and `spur self exec test` exit 0, the verify step
|
|
598
599
|
continues. A red test suite is a hard stop, not an auto-retry.
|
|
599
600
|
4. **Verdict-PASS → auto-continue.** If the verify step produces a PASS verdict, the run advances
|
|
600
601
|
to `record` and `done`. PARTIAL or FAIL verdicts surface to the operator regardless of `--auto`.
|