@gobing-ai/spur 0.3.98 → 0.3.99
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/plugin-scripts.json +5 -0
- package/config/templates/task/brainstorm.md +1 -1
- package/config/templates/task/feature-impl.md +1 -1
- package/config/templates/task/issue.md +1 -1
- package/config/templates/task/meta.md +1 -1
- package/config/templates/task/review.md +1 -1
- package/config/templates/task/standard.md +1 -1
- package/package.json +9 -9
- package/plugins/sp/lib/idea-handoff.generated.mjs +37 -4
- package/plugins/sp/lib/inline-run.generated.mjs +38 -5
- package/plugins/sp/lib/residual-scan.generated.d.mts +5 -0
- package/plugins/sp/lib/residual-scan.generated.mjs +45 -5
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/persist-out-check.mjs +164 -0
- package/plugins/sp/scripts/persist-out-check.ts +185 -0
- package/plugins/sp/scripts/residual-scan.mjs +50 -8
- package/plugins/sp/scripts/residual-scan.ts +4 -3
- package/plugins/sp/scripts/task-diffstat.mjs +17 -5
- package/plugins/sp/scripts/task-diffstat.ts +25 -4
- package/plugins/sp/skills/code-verification/SKILL.md +3 -0
- package/plugins/sp/skills/code-verification/references/verdict-schema.md +17 -1
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +40 -7
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +216 -37
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +3 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +107 -3
- package/spur.js +1662 -386
- package/web/_astro/{BoardApp.CYbe-OTb.js → BoardApp.BVp-LYi6.js} +101 -101
- package/web/_astro/{BoardApp.Dflq5a8x.js → BoardApp.i4eh_fHA.js} +1 -1
- package/web/_astro/{TaskDetail.CK7oXddP.js → TaskDetail.C5Cu8LdB.js} +1 -1
- package/web/_astro/{arc.BIqkDATc.js → arc.Bu5XpBEz.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.D0B3SvWv.js → architectureDiagram-3BPJPVTR.9vHQTvhF.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.C2YyKQmL.js → blockDiagram-GPEHLZMM.Cn2Xl7D6.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.DmtTYrt_.js → c4Diagram-AAUBKEIU.7o0P_QDo.js} +1 -1
- package/web/_astro/channel.6IFIKBhu.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.HsRXbh7l.js → chunk-2J33WTMH.C3zZFsNt.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.obE_P-R3.js → chunk-4BX2VUAB.CNy_M7fO.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CjWTF5mz.js → chunk-55IACEB6.2TiPnLBL.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DMo799Ax.js → chunk-727SXJPM.5CGSyKAp.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.-cE6JOKZ.js → chunk-AQP2D5EJ.w-ZIgfsK.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.D6Rw6HIk.js → chunk-FMBD7UC4.BkcEyhKa.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.d5rBD73Z.js → chunk-ND2GUHAM.mxKKbBG4.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.r3ox40Q3.js → chunk-QZHKN3VN.cyA0z9aT.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CGGbvjjJ.js → classDiagram-4FO5ZUOK.CqtUzwhX.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CGGbvjjJ.js → classDiagram-v2-Q7XG4LA2.CqtUzwhX.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.CmKtPd4l.js → cose-bilkent-S5V4N54A.BExPTopI.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.QNg5GXs8.js → cynefin-OW5HDTMX.Bq2i10Cn.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.B1SabsjC.js → dagre-BM42HDAG.By_HsOuv.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.RtDbNj89.js → diagram-2AECGRRQ.BtU0b7hz.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.IzZpuM-Y.js → diagram-5GNKFQAL.D00ztMdT.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.DPTF_fgv.js → diagram-KO2AKTUF.DMVJWaUN.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CCyza39P.js → diagram-LMA3HP47.Cxqrjg5-.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BXAi8zcZ.js → diagram-OG6HWLK6.2lz_1B5h.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.DUDX7_MR.js → erDiagram-TEJ5UH35.BVQEuJ3T.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.C63QTh3N.js → flowDiagram-I6XJVG4X.Qlyo90ky.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.CnlZJSwG.js → ganttDiagram-6RSMTGT7.DRwb8HHZ.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.CTqIrOPC.js → gitGraphDiagram-PVQCEYII.YfoPthfS.js} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.BYMiDFh9.js → infoDiagram-5YYISTIA.DvFREck1.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CRiQmI-z.js → ishikawaDiagram-YF4QCWOH.BzCj9Q0-.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.YQgWBsEU.js → journeyDiagram-JHISSGLW.BDMT_AFb.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.1ECnrrK1.js → kanban-definition-UN3LZRKU.D6Fh3gj9.js} +1 -1
- package/web/_astro/{linear.DzVA71yT.js → linear.Dxw00fGQ.js} +1 -1
- package/web/_astro/{mermaid.core.BK7P2Sr_.js → mermaid.core.CsoxUWa0.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.BvXyWZK7.js → mindmap-definition-RKZ34NQL.CN8oeHLu.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.BiXk1TW3.js → pieDiagram-4H26LBE5.C7ADqQ_7.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.krvBH8lh.js → quadrantDiagram-W4KKPZXB.Cw9lKyHP.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.ih1gL25c.js → requirementDiagram-4Y6WPE33.B1ni-z4q.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CpUxkv4u.js → sankeyDiagram-5OEKKPKP.BhexdjVr.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.clAfeN7y.js → sequenceDiagram-3UESZ5HK.C3Rm7dpQ.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DpXWb8-m.js → stateDiagram-AJRCARHV.CkuMt27u.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.ClZb9GIH.js → stateDiagram-v2-BHNVJYJU.Dc_aazUA.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BLcX5dh7.js → timeline-definition-PNZ67QCA.ja7sUFhH.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.oGgpKMpx.js → vennDiagram-CIIHVFJN.BxIshX_K.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BPHtMtt-.js → wardleyDiagram-YWT4CUSO.DfHlC0sh.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.BNZOPYSk.js → xychartDiagram-2RQKCTM6.DSnhHwCh.js} +1 -1
- package/web/index.html +1 -1
- package/web/_astro/channel.JuKVyuhZ.js +0 -1
|
@@ -142,7 +142,10 @@ the human/native presentation layer — labels are display addresses only, never
|
|
|
142
142
|
safety checks succeed, create/adopt and `cd` into the execution tree; confirm absolute cwd,
|
|
143
143
|
branch, base SHA, and ownership. An invalid/empty target, unsupported mode, ambiguous ownership,
|
|
144
144
|
or stale target stops without creating a tree or discarding work. All subsequent tools, agents,
|
|
145
|
-
corpus writes, and run artifacts use the confirmed execution tree
|
|
145
|
+
corpus writes, and run artifacts use the confirmed execution tree — **re-selected per call, not
|
|
146
|
+
inherited**: a host shell call starts in an arbitrary directory and carries no cwd from the
|
|
147
|
+
previous call, so every later call runs inside the **Per-call execution-tree pin** protocol
|
|
148
|
+
below (task 1058), which consumes the identity confirmed here.
|
|
146
149
|
8. **Publish the workflow inventory (R4), BEFORE reading the YAML.** Resolve the selected workflow
|
|
147
150
|
through the same project/bundled resolver as execution and run
|
|
148
151
|
`spur workflow show <resolved-file> --no-logo --format todo --json`. Validate the projection with
|
|
@@ -186,6 +189,12 @@ the human/native presentation layer — labels are display addresses only, never
|
|
|
186
189
|
This is required for the normal `testing → done` provenance guard. Planning pipelines have no
|
|
187
190
|
task lifecycle link and skip this task-specific action.
|
|
188
191
|
|
|
192
|
+
**Run it from the task's execution tree.** Every tree has an isolated `.spur` DB, so a link
|
|
193
|
+
recorded from the invoking tree never satisfies a worktree's guard — the exact failure that
|
|
194
|
+
forced audited `--provenance-bypass` on tasks 1029/1030 (E93). Under `--worktree`, enter the
|
|
195
|
+
worktree first and run this command (and every lifecycle-touching command: `task record`,
|
|
196
|
+
`task update <wbs> testing|done`) from the worktree root.
|
|
197
|
+
|
|
189
198
|
### Idea-pipeline quick start (0887 R1/R2)
|
|
190
199
|
|
|
191
200
|
Minimum files to read for `/sp:dev-idea` inline runs — then drive `idea-pipeline.yaml`:
|
|
@@ -215,6 +224,91 @@ Expected artifacts per stage (all run-scoped under `.spur/run/<run-id>-*`):
|
|
|
215
224
|
| ready-prepare | `-idea-ready.json` |
|
|
216
225
|
| handoff-finalize | `-idea-handoff.md` |
|
|
217
226
|
|
|
227
|
+
## Per-call execution-tree pin (task 1058)
|
|
228
|
+
|
|
229
|
+
A host shell tool call may start in an arbitrary directory; no earlier call's `cd` is input to the
|
|
230
|
+
next call. During inline run `95522d21` that drift silently landed corpus writes in the invoking
|
|
231
|
+
tree instead of the run worktree. Every host-session corpus command — reads, writes, absolute
|
|
232
|
+
section-input files and output artifacts — therefore selects the confirmed execution tree **within
|
|
233
|
+
the same tool call**, in a self-contained subshell. The identity is never re-derived: it is the
|
|
234
|
+
tree path, branch and resolved Spur invocation confirmed at bootstrap isolation (step 7) and, for
|
|
235
|
+
batch worktrees, recorded in the WT-3 marker (execution-batch.md). The resolved invocation is
|
|
236
|
+
field 4 of the dispatch payload — never a bare `spur`.
|
|
237
|
+
|
|
238
|
+
Template — every host shell call follows this shape; paths are quoted because trees may contain
|
|
239
|
+
spaces:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
(
|
|
243
|
+
cd -- "$SPUR_TREE" || { echo "tree missing: expected $SPUR_TREE" >&2; exit 1; }
|
|
244
|
+
ACTUAL_TREE="$(pwd -P)"
|
|
245
|
+
[ "$ACTUAL_TREE" = "$SPUR_TREE" ] || { echo "tree mismatch: expected $SPUR_TREE, got $ACTUAL_TREE" >&2; exit 1; }
|
|
246
|
+
GIT_TOP="$(git rev-parse --show-toplevel)" || exit 1
|
|
247
|
+
[ "$GIT_TOP" = "$SPUR_TREE" ] || { echo "toplevel mismatch: expected $SPUR_TREE, got $GIT_TOP" >&2; exit 1; }
|
|
248
|
+
ACTUAL_BRANCH="$(git branch --show-current)"
|
|
249
|
+
[ "$ACTUAL_BRANCH" = "$SPUR_BRANCH" ] || { echo "branch mismatch: expected $SPUR_BRANCH, got $ACTUAL_BRANCH" >&2; exit 1; }
|
|
250
|
+
exec <resolved-spur-invocation> task show <wbs> --json # the already-resolved CLI command
|
|
251
|
+
)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Rules (R1):
|
|
255
|
+
|
|
256
|
+
- **Pin reads as well as writes.** `task show`, `feature show`, `workflow show` and `task check`
|
|
257
|
+
use the same subshell — a read from the wrong tree is a wrong answer, not a harmless one.
|
|
258
|
+
- **Validate the returned `filePath`.** A pinned `task show --json` must return a `filePath`
|
|
259
|
+
inside the expected configured corpus/tree. Configured task folders may intentionally live
|
|
260
|
+
outside the default `docs/tasks` — check membership in the configured folder set, not one
|
|
261
|
+
literal path.
|
|
262
|
+
- **Prove sections with a fresh pinned read.** After a section write, re-run a pinned
|
|
263
|
+
`task show <wbs> --json` and assert the new body there; a heading-only grep is not proof of
|
|
264
|
+
section contents.
|
|
265
|
+
- **Resolve section input/output paths before changing tree.** `--section <name> --from-file
|
|
266
|
+
<path>`, `answerFile`/`expectFile` and run artifacts are resolved against the confirmed tree
|
|
267
|
+
(dispatch field 5) before the subshell `cd`s.
|
|
268
|
+
- **Fail closed before writing.** A failed `cd` or any identity mismatch exits nonzero naming
|
|
269
|
+
expected vs actual, before the CLI runs — there is no designated exit code; consumers read
|
|
270
|
+
nonzero and the named expected/actual trees. A PWD assertion alone cannot select a tree: `cd`
|
|
271
|
+
first, then verify the physical path and repository identity.
|
|
272
|
+
- **Native tool cwd options are additive.** A tool-level cwd/`cd` pin may additionally set the
|
|
273
|
+
call's directory, but never replaces the identity checks above.
|
|
274
|
+
- **Host-only scope.** Engine `shell` actions already bind `context.workdir`
|
|
275
|
+
(`packages/app/src/workflow/actions/shell.ts:98`) — leave them alone. No service-wide
|
|
276
|
+
`process.chdir`, no new public flag, no helper framework.
|
|
277
|
+
|
|
278
|
+
The `spur …` command examples in this driver (run setup, workflow inventory, `task run-link`,
|
|
279
|
+
fingerprint capture, record/done sequencing) abbreviate the pinned subshell form for readability;
|
|
280
|
+
each executes inside the template above with the confirmed tree, branch and resolved invocation
|
|
281
|
+
substituted. A dispatched subagent inherits the same duty: its own tool calls may each start in
|
|
282
|
+
an arbitrary directory, so every shell call the delegate makes re-pins the execution tree with
|
|
283
|
+
the identity supplied in the dispatch payload — never re-derived.
|
|
284
|
+
|
|
285
|
+
## Chunked implement dispatch contract (cap-limited worker models, task 1066)
|
|
286
|
+
|
|
287
|
+
Cap-limited worker executors die on monolithic implement briefs: the output cap is consumed by
|
|
288
|
+
one giant thinking block before any file action lands. Recognized failure signature —
|
|
289
|
+
consecutive implement dispatches end with `stopReason=length` and **zero output** (no tool
|
|
290
|
+
call, no file write), optionally with a `contact_supervisor` call mid-death. The trigger is
|
|
291
|
+
the observed signature, never a model name: any executor that exhibits it is treated as
|
|
292
|
+
cap-limited for the rest of the run.
|
|
293
|
+
|
|
294
|
+
Before dispatching an `implement` stage to a worker executor:
|
|
295
|
+
|
|
296
|
+
1. **Chunk the brief.** Split the implement scope into small, independent dispatches ordered
|
|
297
|
+
by dependency (e.g. test cases → doc rewrite → task sections), one bounded objective per
|
|
298
|
+
dispatch. Never pack the whole task plan into one dispatch.
|
|
299
|
+
2. **Cap thinking.** Instruct the worker to keep every thinking block under ~150 words and act
|
|
300
|
+
between thoughts; never plan the whole task in one block.
|
|
301
|
+
3. **Fallback ladder.** A worker still dying with the signature: re-chunk the remaining scope
|
|
302
|
+
smaller once; still failing → execute the stage host-inline (the driver's inline stage
|
|
303
|
+
fallback) and record the fallback in the run log.
|
|
304
|
+
|
|
305
|
+
Evidence (2026-10-02, task 1059 implement stage, runall-D63-2ebbd97c): 4/4 single-shot
|
|
306
|
+
implement dispatches died `stopReason=length` on a 16k-output-cap worker; the same scope in
|
|
307
|
+
three chunked dispatches with the thinking cap succeeded 3/3. See the pitfalls 2026-10-02
|
|
308
|
+
entry and `.spur/memory/runs/runall-D63-2ebbd97c.md`.
|
|
309
|
+
|
|
310
|
+
## Comprehensive-check retention and evidence (R7/R8)
|
|
311
|
+
|
|
218
312
|
## Comprehensive-check retention and evidence (R7/R8)
|
|
219
313
|
|
|
220
314
|
**R7 — comprehensive checks stay at their owning boundaries.** Quick readiness and plan projection are
|
|
@@ -296,7 +390,8 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
296
390
|
`verify-verdict`: verdict `PASS`), `proofBinding: current` is honored against a freshly captured
|
|
297
391
|
proof digest — capture it with `bun "$SETUP_SCRIPT" --fingerprint --task-file <task path>
|
|
298
392
|
[--feature-file <feature path>]`, the same entry point used at Run setup, which prints the engine
|
|
299
|
-
`sha256:<hex>` digest. Run it
|
|
393
|
+
`sha256:<hex>` digest. Run it inside a per-call pin subshell for the confirmed execution tree
|
|
394
|
+
(the cwd feeds the git-tree half of the digest)
|
|
300
395
|
and pass the same `--feature-file` the run folded in — omitting it, or running from elsewhere,
|
|
301
396
|
yields a different digest and the mismatch surfaces later as a refused `run.artifact`
|
|
302
397
|
registration — and the run-scoped review-completion marker exists — then appends one provenance
|
|
@@ -314,6 +409,10 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
314
409
|
|
|
315
410
|
**Native-subagent dispatch (R2 eligibility, evaluated before each action):**
|
|
316
411
|
|
|
412
|
+
Before dispatching an `implement` stage to a worker executor, apply the chunked implement
|
|
413
|
+
dispatch contract (§ Chunked implement dispatch contract): chunk the brief, cap thinking
|
|
414
|
+
blocks, and know the fallback ladder before spending a dispatch.
|
|
415
|
+
|
|
317
416
|
1. The invocation is one of the two interactive inline full-pipeline surfaces (`dev-run --mode full`
|
|
318
417
|
or sequential `dev-runall`) and the resolved selector is inline — i.e. `--agent` **omitted**
|
|
319
418
|
(0687 R1 default) or `--agent inline` passed explicitly (0687 R2 generalized from omit-only).
|
|
@@ -391,7 +490,10 @@ boundary, and a delegate left to re-derive them re-derives them against its own
|
|
|
391
490
|
that invocation and MUST NOT rely on a bare `spur`: a competing `spur` earlier on the delegate's
|
|
392
491
|
PATH otherwise wins. Setting `SPUR_BIN` alone does **not** change bare-command resolution — only
|
|
393
492
|
using the supplied invocation does. Spur-owned scripted calls take it through the existing
|
|
394
|
-
`--spur-bin` flag rather than a new mechanism.
|
|
493
|
+
`--spur-bin` flag rather than a new mechanism. A delegate's tool calls may each start in an
|
|
494
|
+
arbitrary directory, so every shell call the delegate makes re-pins the execution tree per the
|
|
495
|
+
**Per-call execution-tree pin** protocol using this supplied identity — never an inherited cwd
|
|
496
|
+
and never a re-derivation.
|
|
395
497
|
5. The **resolved absolute output path** (`answerFile`/`expectFile`, resolved as above) and the
|
|
396
498
|
**owning stage's artifact contract** — for a verify stage, the compact contract below.
|
|
397
499
|
6. **The implement-stage acceptance-evidence requirement** — for the implement stage and any stage
|
|
@@ -636,6 +738,8 @@ tasks (0617, 0619) because the sections were hand-written **before** the verdict
|
|
|
636
738
|
```bash
|
|
637
739
|
# verdict artifact first (shape: {wbs, verdict, requirements:[{id,status,evidence}], checks:[], source})
|
|
638
740
|
# then the record hop; then re-write Testing/Solution if record's backfill is thinner than intended.
|
|
741
|
+
# Both calls are per-call pinned (task 1058): the record hop selects the execution tree inside
|
|
742
|
+
# the same tool call — never through a cwd a previous call happened to leave behind.
|
|
639
743
|
spur task update <wbs> wip --no-lifecycle
|
|
640
744
|
spur task record <wbs> --solution-from-diff --transition testing
|
|
641
745
|
```
|