@gobing-ai/spur 0.3.61 → 0.3.63
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.global.yaml +64 -57
- package/config/corpus-baseline.json +601 -49
- package/config/plugin-scripts.json +2 -2
- package/config/rules/boundary/config-loading-ownership.yaml +21 -0
- package/config/workflows/history-anatomy.yaml +395 -0
- package/package.json +9 -9
- package/plugins/sp/README.md +19 -6
- package/plugins/sp/commands/dev-find-issue.md +25 -46
- package/plugins/sp/commands/dev-idea.md +3 -3
- package/plugins/sp/commands/dev-run.md +22 -3
- package/plugins/sp/lib/artifact-digest.generated.d.mts +7 -0
- package/plugins/sp/lib/artifact-digest.generated.mjs +48 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +66 -0
- package/plugins/sp/references/roles.md +5 -5
- package/plugins/sp/scripts/history-anatomy-cache.mjs +818 -0
- package/plugins/sp/scripts/history-anatomy-cache.ts +1014 -0
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
- package/plugins/sp/skills/history-anatomy/SKILL.md +67 -0
- package/plugins/sp/skills/history-anatomy/references/modes.md +82 -0
- package/plugins/sp/skills/history-anatomy/references/operations.md +80 -0
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +183 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +15 -6
- package/plugins/sp/skills/spur-cli/references/message.md +4 -2
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +6 -4
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +2 -2
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +14 -1
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +7 -0
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +25 -13
- package/spur.js +1958 -1133
- package/web/_astro/{BoardApp.CBIzcvqi.js → BoardApp.CKolAjUz.js} +102 -102
- package/web/_astro/BoardApp.DXD--ybM.js +1 -0
- package/web/_astro/{TaskDetail.D2N60cfE.js → TaskDetail.Bre7G4gC.js} +1 -1
- package/web/_astro/{arc.D-EfJJwf.js → arc.7luwOGiC.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.CgvTTzqp.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.CnOohvvn.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BFcBGUy_.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
- package/web/_astro/channel.DxfOFf1l.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.C-6MR-XY.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.BN4LP5AR.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.tUJ_CTtZ.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.BNCk-sxv.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.BkpFIbNa.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.DcSZ87PN.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BkLvHFFf.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.HOdgszax.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.CWfRiY6b.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.CWfRiY6b.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.C6j4PxoN.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.BATZG1II.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.B0f5yY6x.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Bewupqv0.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.C23r1tB2.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.DUErdBOR.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.BubmwAjb.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BE_Qs5mv.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.COWdbzon.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.5EGYC4MK.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.bUUV7iEw.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
- package/web/_astro/index.BVXdIsZV.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.CbiInFvz.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CB7lrSsJ.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.rhGZgWt8.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.DPeZD_lP.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
- package/web/_astro/{linear.l60Nyp5b.js → linear.BNNCobvI.js} +1 -1
- package/web/_astro/{mermaid.core.DmtMJcmL.js → mermaid.core.DnpzzuPU.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.Cc47AcCn.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.B8cN-S9g.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.DY1FN89L.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.CnM6VbV8.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B9DcGfNV.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.ymxaNlAY.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.DDOJ3d8P.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Ck0Nb_KY.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BNOvZwAN.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.D3k5ivSF.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.BylaxVqn.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.HLNtFUm9.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.B-WooKSU.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
- package/web/index.html +2 -2
- package/plugins/sp/commands/dev-history-load.md +0 -63
- package/plugins/sp/scripts/history-load.mjs +0 -268
- package/plugins/sp/scripts/history-load.ts +0 -400
- package/web/_astro/BoardApp.BtRfVADq.js +0 -1
- package/web/_astro/channel.kIu33Gui.js +0 -1
- package/web/_astro/index.Cestp9nh.css +0 -1
|
@@ -1,37 +1,32 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "
|
|
2
|
+
description: "Generate the daily or ad-hoc history-anatomy diagnostic report over already-imported history: the twelve-section report contract, closed finding taxonomy, cache branch, bounded correction, and atomic publication. Triggers: find issues, post-mortem, performance analysis, session review, history-anatomy, run the daily report, ad-hoc diagnosis"
|
|
3
3
|
role: reviewer
|
|
4
|
-
argument-hint: "[<
|
|
5
|
-
allowed-tools: ["Bash", "Read", "
|
|
4
|
+
argument-hint: "[<focus>] [--mode <daily|ad-hoc>] [--date <YYYY-MM-DD>] [--since <RFC3339>] [--until <RFC3339>] [--recompute] [--agent <auto|name>] [--output <path>]"
|
|
5
|
+
allowed-tools: ["Bash", "Read", "Skill"]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Dev Find Issue
|
|
9
9
|
|
|
10
|
-
Wraps the **sp:
|
|
11
|
-
The
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
Wraps the **sp:history-anatomy** skill — the independent owner of diagnostic interpretation over
|
|
11
|
+
already-imported history. The skill resolves the mode contract (daily is the default and uses the
|
|
12
|
+
current local calendar day; ad-hoc requires a focus plus two ordered bounds), owns the report
|
|
13
|
+
contract (twelve sections, closed finding taxonomy, evidence rules, recurrence ledger), and
|
|
14
|
+
exposes the `enrich` and `validate` operations the `history-anatomy.yaml` workflow invokes.
|
|
15
|
+
Publication is atomic and gated behind both the deterministic structure gate and independent
|
|
16
|
+
evidence validation. This command never triggers an import.
|
|
14
17
|
|
|
15
18
|
## Argument Flags
|
|
16
19
|
|
|
17
|
-
| Flag
|
|
18
|
-
|
|
|
19
|
-
| `[<
|
|
20
|
-
| `--
|
|
21
|
-
| `--
|
|
22
|
-
| `--
|
|
23
|
-
| `--
|
|
24
|
-
| `--
|
|
25
|
-
| `--
|
|
26
|
-
| `--
|
|
27
|
-
| `--since` `<iso>` | Start of the scan window. | configured |
|
|
28
|
-
| `--until` `<iso>` | End of the scan window. | now |
|
|
29
|
-
| `--top` `<n>` | Limit to top N findings. | omitted |
|
|
30
|
-
| `--min-cost` `<duration>` | Minimum wasted duration to report. | omitted |
|
|
31
|
-
| `--strict-topic` | Drop findings off-topic. | off |
|
|
32
|
-
| `--create-task` | Generate a fix task for findings. | off |
|
|
33
|
-
| `--agent` `<inline\|auto\|name>` | Who runs the model-bearing analysis. | omit |
|
|
34
|
-
| `--json` | Emit structured JSON. | off |
|
|
20
|
+
| Flag | Description | Default |
|
|
21
|
+
| -------------------------------------- | -------------------------------------------------------------------------------------------------- | -------- |
|
|
22
|
+
| `[<focus>]` | Ad-hoc focus string (required in `--mode ad-hoc`; rejected in daily). | omitted |
|
|
23
|
+
| `--mode` `<daily\|ad-hoc>` | Report mode. Daily uses the current local calendar day. | daily |
|
|
24
|
+
| `--date` `<YYYY-MM-DD>` | Selects that local calendar day (daily; DST-aware). | today |
|
|
25
|
+
| `--since` `<RFC3339>` | Inclusive lower bound (ad-hoc; required). | omitted |
|
|
26
|
+
| `--until` `<RFC3339>` | Inclusive upper bound (ad-hoc; required). | omitted |
|
|
27
|
+
| `--recompute` | Force the full analyze/render/enrich/validate path; records disposition forced-recompute. | off |
|
|
28
|
+
| `--agent` `<auto\|name>` | Execution surface selector. This target is engine-driven (headless): omit resolves through the executor precedence chain to `agent.default`, then the workflow literal. Explicit `--agent inline` is rejected with the stable special error (exit 2). | omitted |
|
|
29
|
+
| `--output` `<path>` | Explicit report output path (ad-hoc; default writes to the run directory). | run dir |
|
|
35
30
|
|
|
36
31
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
37
32
|
|
|
@@ -39,31 +34,15 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
39
34
|
|
|
40
35
|
```
|
|
41
36
|
/sp:dev-find-issue
|
|
42
|
-
/sp:dev-find-issue
|
|
43
|
-
/sp:dev-find-issue --
|
|
44
|
-
/sp:dev-find-issue
|
|
45
|
-
/sp:dev-find-issue --category test-loop,guard --min-cost 30m
|
|
46
|
-
/sp:dev-find-issue --source claude --since 2026-07-28 --create-task --json
|
|
37
|
+
/sp:dev-find-issue --date 2026-08-24
|
|
38
|
+
/sp:dev-find-issue --mode ad-hoc --since 2026-08-01T00:00:00Z --until 2026-08-15T00:00:00Z "focus"
|
|
39
|
+
/sp:dev-find-issue --recompute
|
|
47
40
|
```
|
|
48
41
|
|
|
49
|
-
**Report-first (task 0556).** Default output is the markdown report to stdout; no task file is
|
|
50
|
-
written. Task creation moved behind `--create-task`. `--use-history` and `--no-task` are removed:
|
|
51
|
-
the history data plane is now the primary source (no flag needed), and the old report-only behavior
|
|
52
|
-
is the new default. Raw JSONL remains a fallback under the three conditions documented in
|
|
53
|
-
`sp:issue-finding`.
|
|
54
|
-
|
|
55
|
-
**Data-plane preflight.** Forensics read the imported history plane as-is. If findings come back
|
|
56
|
-
empty or stale, run `/sp:dev-history-load` (on-demand cumulative `spur history import` + analyze,
|
|
57
|
-
checkpoint resume — task 0567) before re-running forensics; it owns the interactive preflight, while
|
|
58
|
-
`spur history daily` owns the periodic cadence.
|
|
59
|
-
|
|
60
|
-
**See also:** skill `sp:issue-finding` (SSOT), `/sp:dev-runall`, `/sp:dev-dogfood`,
|
|
61
|
-
`sp:daily-summary`, `sp:reverse-engineering`.
|
|
62
|
-
|
|
63
42
|
## Implementation
|
|
64
43
|
|
|
65
|
-
Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface)
|
|
44
|
+
Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
66
45
|
|
|
67
46
|
```
|
|
68
|
-
Skill(skill="sp:
|
|
47
|
+
Skill(skill="sp:history-anatomy", args="$ARGUMENTS")
|
|
69
48
|
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Turn a vague idea into a feature with AC and a decomposed task batch — discovery, idea-eval, feature-create, AC, feature-check, system-design, decompose, batch-create (Design by default), handoff
|
|
3
3
|
role: planner
|
|
4
|
-
argument-hint: "\"<idea>\" [--auto] [--skip-design] [--approve-taste] [--agent <
|
|
4
|
+
argument-hint: "\"<idea>\" [--auto] [--skip-design] [--approve-taste] [--agent <auto|name>]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Skill", "AskUserQuestion"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -20,7 +20,7 @@ contract below maps to that workflow's transitions.
|
|
|
20
20
|
| `--approve-taste` | With `--auto`: set idea_approved + design_approved so idea-eval / design-approval do not pause. | off |
|
|
21
21
|
| `--idea-approved` | Compatibility alias for idea_approved=true (subset of --approve-taste). | off |
|
|
22
22
|
| `--design-approved` | Compatibility alias for design_approved=true (subset of --approve-taste). | off |
|
|
23
|
-
| `--agent` `<
|
|
23
|
+
| `--agent` `<auto\|name>` | Who runs the model-bearing ideation. The pipeline's `agent.run` stages are headless — they always dispatch a subprocess, so `--agent inline` is rejected there with the stable special error (exit 2). Use `omit` (resolves to `agent.default`), `auto` (tier-resolves an executor), or a name (pins that executor). | agent.default |
|
|
24
24
|
|
|
25
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
26
26
|
|
|
@@ -31,7 +31,7 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
31
31
|
[--auto] # skip objective HITL only (feature-check, batch-create)
|
|
32
32
|
[--skip-design] # design package off (system-design + task Design)
|
|
33
33
|
[--approve-taste] # with --auto: skip idea-eval + design-approval pauses
|
|
34
|
-
[--agent <
|
|
34
|
+
[--agent <auto|name>] # who runs the model-bearing ideation (default: agent.default)
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
There is **no** `--design` force flag. Design is default-on; only `--skip-design` opts out.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Run a task — full pipeline (precheck→implement→test→review→approve→verify→record→done) or single-step (implement)
|
|
3
3
|
role: coder
|
|
4
|
-
argument-hint: "<wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue]"
|
|
4
|
+
argument-hint: "<wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]"
|
|
5
5
|
allowed-tools: ["Bash", "Read", "Write", "Edit", "Skill"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -20,12 +20,13 @@ Wraps the **sp:spur-dev** and **sp:code-implementation** skills.
|
|
|
20
20
|
| `--next` | Chain-to-completion via the next-router. | off |
|
|
21
21
|
| `--wrap` | Run the wrap hop after the main step. The `--agent` selector is preserved into the `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. The wrap hop is workflow-backed and reports its trigger-3 subprocess override. | off |
|
|
22
22
|
| `--continue` | Resume an interrupted task from its checkpoint. | off |
|
|
23
|
+
| `--worktree` `[<name>]` | Run the task pipeline in an isolated git worktree; FF-merge on success, retain on failure. Bare `--worktree` creates a fresh tree; `--worktree <name>` adopts an existing worktree by name/path/branch. Full mode only. | off |
|
|
23
24
|
|
|
24
25
|
For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag-glossary.md).
|
|
25
26
|
|
|
26
27
|
## Usage
|
|
27
28
|
|
|
28
|
-
/sp:dev-run <wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue]
|
|
29
|
+
/sp:dev-run <wbs> [--mode <full|implement>] [--agent <inline|auto|name>] [--auto] [--next] [--wrap] [--continue] [--worktree [<name>]]
|
|
29
30
|
|
|
30
31
|
## Implementation
|
|
31
32
|
|
|
@@ -40,12 +41,30 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
|
|
|
40
41
|
|
|
41
42
|
- `--auto` | `--agent <inline|auto|name>` — Skip objective HITL confirmations (taste/irreversible gates still pause). `--agent` names who does the model-bearing work. Interactive omit/`inline` keeps the controller and implement-only stages in this session; full mode reads `task-pipeline.yaml` as the SSOT and interprets its actions/guards through the inline driver, where **omitted** `--agent`'s eligible `agent.run` stages may dispatch once to a native subagent and otherwise run in the host (task 0508); explicit `--agent inline` is the zero-dispatch carve-out — every stage executes in the invoking session. It records `stage <id> executed inline in session <session-id>` or `stage <id> executed via subagent <agent-id> (host session <session-id>)` in the run log. `auto` or a name is merged into `vars.agent` and `vars.implementAgent` and keeps the existing subprocess workflow. Headless `spur workflow run` / `spur agent run` is unchanged. See the [execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface).
|
|
42
43
|
|
|
44
|
+
`--worktree` `[<name>]` (run the task's pipeline in an isolated git worktree — FF-merge onto the
|
|
45
|
+
base ref on full success, retain intact on any failure/halt/non-FF; bare form creates a fresh tree,
|
|
46
|
+
`<name>` form adopts an existing worktree by name/path/branch). The lifecycle — dirty-tree precheck,
|
|
47
|
+
creation or adoption, crash-safe `.spur/run/` marker, merge-or-retain, `--continue` re-entry — is
|
|
48
|
+
`execution-batch.md` § Worktree isolation applied to a batch of one: marker `command` is `dev-run`
|
|
49
|
+
and `selector` is the `<wbs>`, the derived branch is `sp/run-<wbs>-<short-id>`, and the success
|
|
50
|
+
condition is the task reaching terminal `done` with no failed stage. A failing gate, a non-PASS
|
|
51
|
+
verify verdict, or a HITL pause that ends the run all take the retention path.
|
|
52
|
+
|
|
53
|
+
**`--worktree` is full-mode only.** `--worktree --mode implement` is **rejected**. `--mode implement`
|
|
54
|
+
*is* the pipeline's implement stage and runs in whatever tree the driver already set up (bug-742);
|
|
55
|
+
giving it a second worktree would split one task's evidence across two trees. Use `--worktree` on the
|
|
56
|
+
full-mode invocation, which carries the implement stage with it.
|
|
57
|
+
|
|
58
|
+
**`--worktree` corpus visibility.** While the task runs in a worktree, corpus writes (status
|
|
59
|
+
transitions, evidence sections, kanban) land in the worktree copy; your main tree still shows the
|
|
60
|
+
pre-run status until the FF-merge on success. This is expected, not a bug.
|
|
61
|
+
|
|
43
62
|
**Mode split (load-bearing — bug-742)**
|
|
44
63
|
|
|
45
64
|
| Mode | What runs | Must not do |
|
|
46
65
|
| --- | --- | --- |
|
|
47
66
|
| `--mode full` (default) | Interactive omit/inline: host-session driver over `task-pipeline.yaml`; explicit/headless executor: workflow subprocess | — |
|
|
48
|
-
| `--mode implement` | Single implement competency via `sp:code-implementation` | Re-launch the full pipeline, `spur workflow run …task-pipeline…`,
|
|
67
|
+
| `--mode implement` | Single implement competency via `sp:code-implementation` | Re-launch the full pipeline, `spur workflow run …task-pipeline…`, `/sp:dev-run` **without** `--mode implement`, or accept `--worktree` (rejected) |
|
|
49
68
|
|
|
50
69
|
The pipeline's `implement` step invokes this command **only** as:
|
|
51
70
|
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED by scripts/commands/bundle-plugin-lib.ts — do not edit.
|
|
3
|
+
* Source of truth: packages/domain/src/analytics/artifact-digest.ts (task 0669).
|
|
4
|
+
*/
|
|
5
|
+
export declare const ARTIFACT_ARRAY_CLASSIFICATION: Readonly<Record<string, 'ranked' | 'set'>>;
|
|
6
|
+
export declare const RANKED_ARTIFACT_KEYS: ReadonlySet<string>;
|
|
7
|
+
export declare function semanticArtifactDigest(artifactJson: unknown): string;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// packages/domain/src/analytics/artifact-digest.ts
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
var ARTIFACT_ARRAY_CLASSIFICATION = {
|
|
4
|
+
byTool: "ranked",
|
|
5
|
+
bySession: "ranked",
|
|
6
|
+
topStepsByTokens: "ranked",
|
|
7
|
+
topStepsByDuration: "ranked",
|
|
8
|
+
topSteps: "ranked",
|
|
9
|
+
bottlenecks: "ranked",
|
|
10
|
+
coverage: "set",
|
|
11
|
+
daily: "set",
|
|
12
|
+
loops: "set",
|
|
13
|
+
warnings: "set",
|
|
14
|
+
pairings: "set",
|
|
15
|
+
ladderSnapshot: "set",
|
|
16
|
+
stepSupport: "set",
|
|
17
|
+
phases: "set",
|
|
18
|
+
tools: "set",
|
|
19
|
+
skills: "set",
|
|
20
|
+
sources: "set",
|
|
21
|
+
models: "set"
|
|
22
|
+
};
|
|
23
|
+
var RANKED_ARTIFACT_KEYS = new Set(Object.entries(ARTIFACT_ARRAY_CLASSIFICATION).filter(([, kind]) => kind === "ranked").map(([key]) => key));
|
|
24
|
+
function canonicalize(value, key) {
|
|
25
|
+
if (key === "generatedAt" || key === "validatedAt" || key === "baselineArtifactDigest")
|
|
26
|
+
return null;
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
const raw = value.map((v) => JSON.stringify(canonicalize(v, "")));
|
|
29
|
+
return RANKED_ARTIFACT_KEYS.has(key) ? raw : [...raw].sort();
|
|
30
|
+
}
|
|
31
|
+
if (value !== null && typeof value === "object") {
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const k of Object.keys(value).sort()) {
|
|
34
|
+
out[k] = canonicalize(value[k], k);
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
function semanticArtifactDigest(artifactJson) {
|
|
41
|
+
const material = JSON.stringify(canonicalize(artifactJson, "root"));
|
|
42
|
+
return createHash("sha256").update(material).digest("hex");
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
semanticArtifactDigest,
|
|
46
|
+
RANKED_ARTIFACT_KEYS,
|
|
47
|
+
ARTIFACT_ARRAY_CLASSIFICATION
|
|
48
|
+
};
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sp",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.63",
|
|
4
4
|
"description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
|
|
5
5
|
"extensions": {
|
|
6
6
|
"pi": ["./hooks/pi/guard-extension.ts"]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Environment-improvement lens
|
|
2
|
+
|
|
3
|
+
One mapping turns retrospective "environment" observations into concrete surface improvements
|
|
4
|
+
across the two live report owners: `sp:dogfood-testing` report §6 and `sp:history-anatomy`
|
|
5
|
+
sections 4/9. (The inspiration is an out-of-tree retrospective practice; it is deliberately not
|
|
6
|
+
shipped or invoked by anything in this plugin.)
|
|
7
|
+
|
|
8
|
+
**This file is the single source of truth for the seven categories and the placement rule.**
|
|
9
|
+
Neither report projection restates the table below; each links here as its category table
|
|
10
|
+
(task 0686 / feature I9; accepted design `docs/design/environment-improvement-lens.md`,
|
|
11
|
+
ADR-084/085). There is deliberately no `/sp:dev-retro` command, no CLI change, and no protocol
|
|
12
|
+
bump behind this mapping.
|
|
13
|
+
|
|
14
|
+
## Canonical categories and projections
|
|
15
|
+
|
|
16
|
+
Exactly one file (this one) enumerates these seven names. Encode them **only** in the projected
|
|
17
|
+
field named by each column — never as a history-anatomy `category` (that vocabulary is frozen at
|
|
18
|
+
`reliability | repetition | workflow | performance | coverage | telemetry | positive`).
|
|
19
|
+
|
|
20
|
+
| Retro category | History-anatomy `category` (closed) | History-anatomy `<signal>` | Dogfood class |
|
|
21
|
+
| --- | --- | --- | --- |
|
|
22
|
+
| navigation | `workflow` | `navigation` | `environment` (P3–P2) |
|
|
23
|
+
| automated checks | `reliability` | `automated-checks` | `environment`; action is a gate, not prose |
|
|
24
|
+
| coding standards | `workflow` | `coding-standards` | `environment`; owner surface is review, never implementer |
|
|
25
|
+
| AGENTS.md placement | `workflow` | `agents-md-placement` | `environment`; action = move to skill/reference/check |
|
|
26
|
+
| tool economy | `performance` | `tool-economy` | existing cache-health P3; `environment` when the tool itself is the waste |
|
|
27
|
+
| no-ops | `workflow` | `no-ops` | `environment`; `file:line` of the dead instruction |
|
|
28
|
+
| information access | `telemetry` | `information-access` | existing chained-step `~unknown` P3; `environment` when access is missing |
|
|
29
|
+
|
|
30
|
+
Dogfood class tags are optional and closed: `environment` | `testee` | `waste`. Grammar,
|
|
31
|
+
classification table, and fix-mode boundaries live in the owning projection:
|
|
32
|
+
[`report-template.md` §6](../skills/dogfood-testing/references/report-template.md).
|
|
33
|
+
History-anatomy key grammar and the structure gate live in
|
|
34
|
+
[`report-contract.md`](../skills/history-anatomy/references/report-contract.md).
|
|
35
|
+
|
|
36
|
+
## Placement rule
|
|
37
|
+
|
|
38
|
+
When an observation lands, choose a home in this order — never a new sentence in an
|
|
39
|
+
always-loaded steering file when a lower step fits:
|
|
40
|
+
|
|
41
|
+
1. **Automatable → propose a check.** Anything a linter, typechecker, test, script-contract
|
|
42
|
+
check, or filesystem linter could catch becomes a new-or-tighter automated gate
|
|
43
|
+
(`spur-check`, biome rules, bun tests), not a reminder sentence.
|
|
44
|
+
2. **Coding standard → the review path.** The owner surface is `sp:code-verification`,
|
|
45
|
+
`sp:code-review`, or pipeline review — never the implementer skill.
|
|
46
|
+
3. **Always-loaded steering (`AGENTS.md` / `CLAUDE.md`) → navigation pointer only.** Detail
|
|
47
|
+
moves to a skill, reference, or check; the steering file keeps at most a pointer.
|
|
48
|
+
|
|
49
|
+
## Present-don't-apply
|
|
50
|
+
|
|
51
|
+
Findings projected through this lens are **proposals**, in either owner's report. No projection
|
|
52
|
+
applies a change, produces a diff, or claims to have executed anything. Dogfood bounded fix-mode
|
|
53
|
+
may repair a failed `testee`-class step, but never mutates a finding tagged `environment`;
|
|
54
|
+
class — not the cited file path — decides whether bounded fix may mutate. History-anatomy stays
|
|
55
|
+
report-only. Accepted proposals reach the tree through operator-approved surfaces (`spur task
|
|
56
|
+
create` handoff, manual edit), which remain explicit human gates.
|
|
57
|
+
|
|
58
|
+
## Keep / drop boundary
|
|
59
|
+
|
|
60
|
+
Kept here because both live reports consume it: the seven names above, their projections, and
|
|
61
|
+
this placement rule. Dropped (each needs its own operator decision): installing or invoking the
|
|
62
|
+
out-of-tree retro practice, a standalone retro command, `CODING_STANDARDS.md` as a file, runtime
|
|
63
|
+
parsing of this markdown by validators, automatic remediation of environment findings, and
|
|
64
|
+
folding the lens into wrap-up learnings or `.spur/context/` memory.
|
|
65
|
+
`plugins/sp/skills/issue-finding/` remains the legacy coexistence non-target — it gains nothing
|
|
66
|
+
from this mapping.
|
|
@@ -50,7 +50,7 @@ version: 1
|
|
|
50
50
|
roles:
|
|
51
51
|
- id: scribe
|
|
52
52
|
tier: cheap
|
|
53
|
-
commands: [dev-gitmsg, dev-handover, dev-daily, dev-
|
|
53
|
+
commands: [dev-gitmsg, dev-handover, dev-daily, dev-changelog, dev-refresh, rule-add, rule-refine, workflow-add, workflow-refine, spur-init]
|
|
54
54
|
stages: [changelog]
|
|
55
55
|
- id: coder
|
|
56
56
|
tier: standard
|
|
@@ -83,19 +83,19 @@ must not sit below the highest `min_tier` among its folded stages.
|
|
|
83
83
|
- **`reviewer` (capable-1).** Verification and analysis: per-task verify/review, batch verify,
|
|
84
84
|
dogfooding, anti-pattern scanning (`rule-scan`), and the two audit commands (`dev-find-conflict`,
|
|
85
85
|
`dev-find-issue`) — those analyse rather than transcribe, which is why they sit here and not
|
|
86
|
-
under `scribe`. Folds `verify`, `review`, `dogfood`.
|
|
86
|
+
under `scribe`. `dev-find-issue` now routes through the `sp:history-anatomy` skill (mode contract + report contract). Folds `verify`, `review`, `dogfood`.
|
|
87
87
|
- **`planner` (capable-2).** The planning half: feature planning, requirement refinement (single
|
|
88
88
|
and batch), brainstorm, idea intake, batch run/parallel orchestration, next-step routing,
|
|
89
89
|
architecture survey, feature-frontier prioritization, and feature-tree restructure. Folds `plan`,
|
|
90
90
|
`refine`, `brainstorm`.
|
|
91
91
|
|
|
92
92
|
**Placement notes (directory closure, task 0535).** The decided four-row table listed 31 commands;
|
|
93
|
-
the live `plugins/sp/commands/` directory has 39
|
|
93
|
+
the live `plugins/sp/commands/` directory has 38 (39 at the time of the mapping; `dev-history-load`
|
|
94
|
+
was removed in HA-S1 0661). The six additional commands were placed by the
|
|
94
95
|
same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is planning-side
|
|
95
96
|
frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
|
|
96
97
|
planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
|
|
97
|
-
are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-
|
|
98
|
-
is mechanical load+analyze orchestration → scribe; `dev-pr-review` is review orchestration —
|
|
98
|
+
are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-pr-review` is review orchestration —
|
|
99
99
|
driving the external PR review and triaging its findings folds the `review` stage → reviewer.
|
|
100
100
|
|
|
101
101
|
**Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and
|