@gobing-ai/spur 0.3.63 → 0.3.65
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/corpus-baseline.json +2995 -6832
- package/config/rules/boundary/sp-runtime-path.yaml +45 -35
- package/config/rules/surface/check-cli-surface.yaml +7 -5
- package/config/workflows/history-anatomy.yaml +39 -8
- package/package.json +9 -9
- package/plugins/sp/README.md +17 -10
- package/plugins/sp/agents/expert-spur.md +20 -4
- package/plugins/sp/commands/dev-find-issue.md +5 -2
- package/plugins/sp/commands/dev-gitmsg.md +12 -6
- package/plugins/sp/commands/dev-gtd.md +8 -19
- package/plugins/sp/commands/dev-idea.md +1 -1
- package/plugins/sp/commands/dev-plan.md +1 -1
- package/plugins/sp/commands/dev-review-session.md +36 -0
- package/plugins/sp/commands/dev-run.md +2 -2
- package/plugins/sp/commands/dev-runall.md +2 -2
- package/plugins/sp/commands/dev-wrap.md +5 -6
- package/plugins/sp/commands/dev-wrapall.md +5 -7
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +4 -2
- package/plugins/sp/references/roles.md +8 -5
- package/plugins/sp/scripts/history-anatomy-cache.mjs +3 -2
- package/plugins/sp/scripts/history-anatomy-cache.ts +7 -2
- package/plugins/sp/skills/dogfood-testing/SKILL.md +22 -1
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +8 -0
- package/plugins/sp/skills/next-router/SKILL.md +4 -4
- package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -3
- package/plugins/sp/skills/redesign-web-ui/SKILL.md +184 -0
- package/plugins/sp/skills/redesign-web-ui/references/audit-checklist.md +121 -0
- package/plugins/sp/skills/redesign-web-ui/references/upgrade-techniques.md +66 -0
- package/plugins/sp/skills/session-review/SKILL.md +106 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +5 -0
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +20 -5
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +230 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +27 -5
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +22 -30
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +73 -28
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +18 -8
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +15 -12
- package/spur.js +1152 -816
- package/web/_astro/{BoardApp.CKolAjUz.js → BoardApp.BEtcJqde.js} +62 -62
- package/web/_astro/BoardApp.DBEin4N5.js +1 -0
- package/web/_astro/{TaskDetail.Bre7G4gC.js → TaskDetail.ClAbCXom.js} +1 -1
- package/web/_astro/arc.CCvf51_y.js +1 -0
- package/web/_astro/architectureDiagram-3BPJPVTR.C0cb0J5M.js +36 -0
- package/web/_astro/{blockDiagram-GPEHLZMM.CCGHeRVi.js → blockDiagram-GPEHLZMM.CIyjqoCE.js} +4 -4
- package/web/_astro/{c4Diagram-AAUBKEIU.CpqewGmd.js → c4Diagram-AAUBKEIU.fs14IuFs.js} +1 -1
- package/web/_astro/channel.BGn_DUCD.js +1 -0
- package/web/_astro/chunk-2J33WTMH.CaBKv4ZO.js +1 -0
- package/web/_astro/{chunk-4BX2VUAB.ifGXoUA3.js → chunk-4BX2VUAB.BOllTPto.js} +1 -1
- package/web/_astro/chunk-55IACEB6.ChEof0O4.js +1 -0
- package/web/_astro/{chunk-727SXJPM.DzPE41OS.js → chunk-727SXJPM.Co2kdjD8.js} +2 -2
- package/web/_astro/{chunk-AQP2D5EJ.UF2QRXYF.js → chunk-AQP2D5EJ.SWmfcnog.js} +2 -2
- package/web/_astro/{chunk-FMBD7UC4.D2zXKa1R.js → chunk-FMBD7UC4.rDAFifF3.js} +1 -1
- package/web/_astro/chunk-ND2GUHAM.BCnoXKCw.js +1 -0
- package/web/_astro/{chunk-QZHKN3VN.nUKFBiLD.js → chunk-QZHKN3VN.RSmy2hDO.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DZg9K9mO.js → classDiagram-4FO5ZUOK.Be7PEfrX.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DZg9K9mO.js → classDiagram-v2-Q7XG4LA2.Be7PEfrX.js} +1 -1
- package/web/_astro/{client.CdFpTatq.js → client.yhYJvxCU.js} +1 -1
- package/web/_astro/cose-bilkent-S5V4N54A.BkUp2aSK.js +1 -0
- package/web/_astro/cynefin-OW5HDTMX.BegGGlUV.js +166 -0
- package/web/_astro/cytoscape.esm.DzSz-X2X.js +321 -0
- package/web/_astro/dagre-BM42HDAG.BkUdjsaC.js +4 -0
- package/web/_astro/{defaultLocale.CrowFXzY.js → defaultLocale.DX6XiGOO.js} +1 -1
- package/web/_astro/diagram-2AECGRRQ.E9vugt3-.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.Dj4yeHXB.js +10 -0
- package/web/_astro/diagram-KO2AKTUF.Buaquwli.js +3 -0
- package/web/_astro/diagram-LMA3HP47.BV3dgGgm.js +24 -0
- package/web/_astro/diagram-OG6HWLK6.Cnx3s-tc.js +24 -0
- package/web/_astro/{erDiagram-TEJ5UH35.CF2U-pQZ.js → erDiagram-TEJ5UH35.DKK_abu4.js} +3 -3
- package/web/_astro/{flowDiagram-I6XJVG4X.BJK4M3in.js → flowDiagram-I6XJVG4X.BNuu9fbm.js} +4 -4
- package/web/_astro/ganttDiagram-6RSMTGT7.b16KUMjy.js +292 -0
- package/web/_astro/gitGraphDiagram-PVQCEYII.Kh41lbG5.js +106 -0
- package/web/_astro/{graph.D2o_JWn5.js → graph.-OzhPTMs.js} +1 -1
- package/web/_astro/{index.A0eX93qW.js → index.De90oHcH.js} +1 -1
- package/web/_astro/infoDiagram-5YYISTIA.DEWBXkp-.js +2 -0
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BmWDZtwF.js → ishikawaDiagram-YF4QCWOH.DiAdmcL6.js} +4 -4
- package/web/_astro/{journeyDiagram-JHISSGLW.CpB1YWDP.js → journeyDiagram-JHISSGLW.D1Ki7IRm.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.k-fukQX9.js → kanban-definition-UN3LZRKU.CWUhrQpc.js} +21 -21
- package/web/_astro/layout.owoKPs3z.js +1 -0
- package/web/_astro/linear.BaFsgcCe.js +1 -0
- package/web/_astro/{mermaid.core.DnpzzuPU.js → mermaid.core.CHw_AsGy.js} +5 -5
- package/web/_astro/{mindmap-definition-RKZ34NQL.D9NnlLBu.js → mindmap-definition-RKZ34NQL.UIhghgmN.js} +8 -8
- package/web/_astro/ordinal.DBvzRdQf.js +1 -0
- package/web/_astro/pieDiagram-4H26LBE5.D05l3JUA.js +30 -0
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BkAygRlm.js → quadrantDiagram-W4KKPZXB.BcWIhIcE.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.CX8ibmwc.js → requirementDiagram-4Y6WPE33.B1rYvKGn.js} +1 -1
- package/web/_astro/sankeyDiagram-5OEKKPKP.CKylVRC4.js +40 -0
- package/web/_astro/{sequenceDiagram-3UESZ5HK.veO8c2tk.js → sequenceDiagram-3UESZ5HK.Dm3uA_s4.js} +3 -3
- package/web/_astro/stateDiagram-AJRCARHV.Bgca_BLe.js +1 -0
- package/web/_astro/stateDiagram-v2-BHNVJYJU.C1T7YFrG.js +1 -0
- package/web/_astro/{timeline-definition-PNZ67QCA.DayoPp_2.js → timeline-definition-PNZ67QCA.ZOHJn3Sn.js} +4 -4
- package/web/_astro/vennDiagram-CIIHVFJN.DegZitjD.js +34 -0
- package/web/_astro/{wardleyDiagram-YWT4CUSO.lIAjSkZJ.js → wardleyDiagram-YWT4CUSO.BDsC115d.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.D8_2K6U1.js → xychartDiagram-2RQKCTM6.D0MO70ea.js} +4 -4
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.DXD--ybM.js +0 -1
- package/web/_astro/arc.7luwOGiC.js +0 -1
- package/web/_astro/architectureDiagram-3BPJPVTR.F6KaHXp-.js +0 -36
- package/web/_astro/channel.DxfOFf1l.js +0 -1
- package/web/_astro/chunk-2J33WTMH.CB9vKa5F.js +0 -1
- package/web/_astro/chunk-55IACEB6.VIaRo7l8.js +0 -1
- package/web/_astro/chunk-ND2GUHAM.Cb9bDyvx.js +0 -1
- package/web/_astro/cose-bilkent-S5V4N54A.D9STo90d.js +0 -1
- package/web/_astro/cytoscape.esm.D3_iZ_3b.js +0 -321
- package/web/_astro/dagre-BM42HDAG.D3IbwhHz.js +0 -4
- package/web/_astro/diagram-2AECGRRQ.BWTDxBe9.js +0 -43
- package/web/_astro/diagram-5GNKFQAL.XnXlonHG.js +0 -10
- package/web/_astro/diagram-KO2AKTUF.CywOngCO.js +0 -3
- package/web/_astro/diagram-LMA3HP47.DY1D21Iu.js +0 -24
- package/web/_astro/diagram-OG6HWLK6.DQxb59KA.js +0 -24
- package/web/_astro/ganttDiagram-6RSMTGT7.BSniMzdB.js +0 -292
- package/web/_astro/gitGraphDiagram-PVQCEYII.Dxg-yRov.js +0 -106
- package/web/_astro/infoDiagram-5YYISTIA.BY4CgO_n.js +0 -2
- package/web/_astro/layout.DNLMvjEt.js +0 -1
- package/web/_astro/linear.BNNCobvI.js +0 -1
- package/web/_astro/ordinal.BYWQX77i.js +0 -1
- package/web/_astro/pieDiagram-4H26LBE5.CKhoMiyC.js +0 -30
- package/web/_astro/sankeyDiagram-5OEKKPKP.Dvurpa0Y.js +0 -40
- package/web/_astro/stateDiagram-AJRCARHV.DpMr4CO3.js +0 -1
- package/web/_astro/stateDiagram-v2-BHNVJYJU.CKjso86_.js +0 -1
- package/web/_astro/vennDiagram-CIIHVFJN.XNHf04O9.js +0 -34
- package/web/_astro/wardley-L42UT6IY.CpM_031g.js +0 -161
|
@@ -36,21 +36,20 @@ answer. Everything below is a consequence of that sentence, not an additional ru
|
|
|
36
36
|
**Default: execute the backing skill directly in the current coding-agent session.** Do not invoke
|
|
37
37
|
`spur agent run` when no escalation trigger applies and the operator did not select subprocess via
|
|
38
38
|
the `--agent` selector. Omitting `--agent` keeps the default — the backing skill runs in the
|
|
39
|
-
current session, and eligible model stages may dispatch once to a native subagent (task 0508).
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
current session, and eligible model stages may dispatch once to a native subagent (task 0508).
|
|
40
|
+
Explicit `inline` resolves identically (0687 R1: inline is the default selector; R2 generalized
|
|
41
|
+
native-subagent eligibility from omit-only to all inline resolutions).
|
|
42
42
|
|
|
43
|
-
>
|
|
44
|
-
> the
|
|
45
|
-
>
|
|
46
|
-
>
|
|
47
|
-
>
|
|
48
|
-
> fallback.**
|
|
43
|
+
> **`--agent inline` (explicit or omitted) is an honest selector, not a dispatch guarantee. On a
|
|
44
|
+
> host session the work runs in-session and eligible model stages may use a native subagent (0508,
|
|
45
|
+
> as generalized by 0687 R2). A headless dispatch surface (`spur agent run`, workflow `agent.run`,
|
|
46
|
+
> serve-side dispatch) cannot host a session; there AgentService substitutes tier resolution and
|
|
47
|
+
> warns once naming the resolved executor (0687 R3) — no rejection, no `exit 2`.**
|
|
49
48
|
|
|
50
49
|
| Value | Who does the work | Derived surface |
|
|
51
50
|
| --- | --- | --- |
|
|
52
51
|
| `(omitted)` | The agent running this session | Host session — host-controlled; eligible model stages may use a native subagent (0508) |
|
|
53
|
-
| `inline` | The agent running this session |
|
|
52
|
+
| `inline` | The agent running this session | Inline host session — identical to omitted (0687 R1); on headless surfaces tier resolution substitutes with a warning (0687 R3) |
|
|
54
53
|
| `auto` | The role the caller declared — this command's `role:` frontmatter or the workflow step's `role:` (Layer 1, `plugins/sp/references/roles.md`); with nothing declared, `agent.default`'s role (0542) | Subprocess — a tier-resolved executor pins a specific agent/model, which the host session cannot supply |
|
|
55
54
|
| `<name>` (coding agent or configured executor) | That executor | Inline when it resolves to the current session's agent; subprocess otherwise |
|
|
56
55
|
|
|
@@ -58,15 +57,9 @@ The previous `--inline` and `--subprocess` flags (feature H82, task 0413) are co
|
|
|
58
57
|
single selector: `--inline` → `--agent inline`, `--subprocess` → `--agent auto`. The old two-flag
|
|
59
58
|
form is no longer part of the command surface.
|
|
60
59
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
would therefore be a false implementation. On a headless surface (`spur agent run` / workflow
|
|
65
|
-
`agent.run`) explicit `inline` is **rejected** (ADR-047 G5 amendment) with the stable special error —
|
|
66
|
-
headless surfaces cannot host a session: `--agent inline requires a host session: this surface is
|
|
67
|
-
headless and never dispatches inline runs (no fallback to agent.default). Use 'auto', a role, or an
|
|
68
|
-
executor name.` (exit 2 at the CLI; the exported `AGENT_INLINE_HEADLESS_MESSAGE` in
|
|
69
|
-
`agent-service`). No further action is taken — no dispatch, no `agent.default` fallback.
|
|
60
|
+
The explicit-rejection carve-out above was superseded by ADR-087 (task 0687): a headless surface
|
|
61
|
+
substitutes tier resolution with a warning instead of rejecting — see the substitution blockquote
|
|
62
|
+
above and `resolveAgent` in `packages/app/src/services/agent-service.ts`.
|
|
70
63
|
|
|
71
64
|
### Objective triggers override the answer
|
|
72
65
|
|
|
@@ -81,9 +74,8 @@ cannot satisfy, so it wins regardless:
|
|
|
81
74
|
| **Workspace or credential isolation required** | The work must not share the host workspace or credentials. | `trigger 4: workspace or credential isolation required` |
|
|
82
75
|
|
|
83
76
|
A trigger selects subprocess when the selector is omitted, `auto`, or a name, and the applied trigger
|
|
84
|
-
must be named in the dispatch or result.
|
|
85
|
-
|
|
86
|
-
than dispatching a subprocess. When the operator selected a non-current executor and no objective trigger
|
|
77
|
+
must be named in the dispatch or result. Inline selections (omitted or explicit — they are now the
|
|
78
|
+
same value, 0687 R1/R2) satisfy trigger requirements in-session where possible. When the operator selected a non-current executor and no objective trigger
|
|
87
79
|
applies, report `operator override` rather than inventing one of the four. The trigger vocabulary and
|
|
88
80
|
evidence standard are owned by
|
|
89
81
|
[dispatch-surface.md](../../parallel-execution/references/dispatch-surface.md). If none can be named
|
|
@@ -125,15 +117,15 @@ model stage (task 0508): an eligible `agent.run` stage — pure-slash input, non
|
|
|
125
117
|
native subagent with shared-worktree read/write/shell capability — dispatches **once** to that
|
|
126
118
|
native subagent and joins before the driver continues; any pre-dispatch eligibility failure falls
|
|
127
119
|
back to one host execution, and a failure after dispatch follows the stage's error policy with no
|
|
128
|
-
automatic host replay.
|
|
129
|
-
|
|
120
|
+
automatic host replay. Inline resolution (omitted or explicit, 0687 R1/R2) keeps the native-subagent
|
|
121
|
+
leg for eligible stages. Operator
|
|
130
122
|
confirmation actions, `pause: true`, and approve/taste/ask decisions stay host-owned. Each inline
|
|
131
123
|
model stage appends `stage <id> executed inline in session <session-id>` to its run log; a
|
|
132
124
|
subagent-dispatched stage appends `stage <id> executed via subagent <agent-id> (host session
|
|
133
125
|
<session-id>)` instead. `dev-plan` remains a workflow subprocess, as do `dev-run`/`dev-runall` with
|
|
134
126
|
`--agent auto` or a name, parallel batches, and every headless `spur workflow run` / `spur agent
|
|
135
127
|
run`. `dev-run --mode implement` continues to run its single competency in-session under omitted
|
|
136
|
-
`--agent` or explicit `--agent inline` (
|
|
128
|
+
`--agent` or explicit `--agent inline` (identical values, 0687 R1).
|
|
137
129
|
|
|
138
130
|
### Executor precedence chain (R7)
|
|
139
131
|
|
|
@@ -150,11 +142,11 @@ resolved in this order; first match wins:
|
|
|
150
142
|
|
|
151
143
|
`--agent auto` tier-resolves an executor (stage `model_policy` → `agent.default` → tier priority)
|
|
152
144
|
**before** merging, so it enters the chain at step 1 already resolved to a concrete name.
|
|
153
|
-
On a headless workflow surface, explicit `--agent inline`
|
|
154
|
-
—
|
|
155
|
-
|
|
156
|
-
driver. Omitting the flag on a headless surface forwards nothing, so the
|
|
157
|
-
`agent.default` (step 2) or the YAML literal (step 3).
|
|
145
|
+
On a headless workflow surface, explicit `--agent inline` substitutes tier resolution with a warning
|
|
146
|
+
(0687 R3) instead of rejecting — it resolves exactly like an omitted flag. Interactive task wrappers
|
|
147
|
+
consume both inline resolutions identically (0508 eligibility as generalized by 0687 R2) before this
|
|
148
|
+
chain and use the host driver. Omitting the flag on a headless surface forwards nothing, so the
|
|
149
|
+
spawned step resolves to `agent.default` (step 2) or the YAML literal (step 3).
|
|
158
150
|
|
|
159
151
|
### Implement-only executor override (R6)
|
|
160
152
|
|
|
@@ -32,14 +32,17 @@ each would be scope creep for one-liner procedures.
|
|
|
32
32
|
> backbone skill (which owns the 4-phase dogfood protocol, the live ledger, and the report template);
|
|
33
33
|
> it does not map to a numbered dev-\* operation. See its command file and the backing skill for details.
|
|
34
34
|
|
|
35
|
-
> **`dev-find-issue`** is not in this table. It is a thin `Skill()` wrapper over
|
|
36
|
-
>
|
|
37
|
-
>
|
|
38
|
-
>
|
|
39
|
-
>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
> **`dev-find-issue`** is not in this table. It is a thin `Skill()` wrapper over
|
|
36
|
+
> **`sp:history-anatomy`** for daily/ad-hoc imported-history forensics: fixed twelve-section report,
|
|
37
|
+
> baseline comparison, cache branch, independent validation, and atomic publication. It never
|
|
38
|
+
> imports history or creates a task. See `plugins/sp/commands/dev-find-issue.md` and
|
|
39
|
+
> `plugins/sp/skills/history-anatomy/SKILL.md`.
|
|
40
|
+
|
|
41
|
+
> **`dev-review-session`** is not in this table. It is a thin `Skill()` wrapper over
|
|
42
|
+
> **`sp:session-review`** for an immediate, inline, report-only review of the active conversation.
|
|
43
|
+
> It launches no workflow or agent and performs no import, persistence, or mutation. Use it before
|
|
44
|
+
> the active session ends; use history-anatomy for ended sessions, cross-agent windows, trends, or
|
|
45
|
+
> quantitative forensics.
|
|
43
46
|
|
|
44
47
|
> **`dev-find-conflict`** is not in this table. It is a thin `Skill()` wrapper over
|
|
45
48
|
> **`sp:conflict-finding`** (authority-aware four-pillar semantic audit → optional confirmed,
|
|
@@ -74,7 +77,7 @@ each would be scope creep for one-liner procedures.
|
|
|
74
77
|
| 6 | plan | `dev-plan` | `Skill()` | `sp:spur-dev` (`plan`) | `"<description>" [--feature <id>] [--parent <feature-id>] [--agent <inline\|auto\|name>] [--skip-design] [--auto] [--approve-taste]` |
|
|
75
78
|
| 7 | docs | _(no thin wrapper)_ | `Skill()` | `sp:doc-evolve` | `"<change description>"` |
|
|
76
79
|
| 8 | changelog | `dev-changelog` | `inline` | git log + conventional-commit grouping | `[--since <ref>] [--until <ref>] [--version <ver>]` |
|
|
77
|
-
| 9 | gitmsg | `dev-gitmsg` | `inline` |
|
|
80
|
+
| 9 | gitmsg | `dev-gitmsg` | `inline` | bounded diff capture → concern grouping → conventional commit | `[--commit] [--squash] [--all] [--scope <path>]` |
|
|
78
81
|
| 10 | fixall | `dev-fixall` | `inline` | lint + test fix loop | `[<validation-command>] [--max-retry <n>] [--scope <path>] [--gate-log <path>] [--findings <anchors>]` |
|
|
79
82
|
| 11 | handover | `dev-handover` | `inline` | structured doc generation | `"<blocker description>"` |
|
|
80
83
|
| 12 | brainstorm | `dev-brainstorm` | `Skill()` | `sp:brainstorm` (`dev-brainstorm`) | `<topic> [--depth <basic\|detailed\|comprehensive>] [--options <n>] [--agent <inline\|auto\|name>] [--skip-discovery] [--wayfind] [--task [<feature-id>]] [--feature [<parent-id>]] [--next]` |
|
|
@@ -140,12 +143,12 @@ must not be changed without updating the backing skill.
|
|
|
140
143
|
### 4. run
|
|
141
144
|
|
|
142
145
|
- **Purpose:** Run a task through the execution pipeline (full) or execute a single pipeline step (implement).
|
|
143
|
-
- **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full`
|
|
146
|
+
- **Inputs:** `<wbs>` (required). `--mode <full|implement>` selects the execution mode. `implement` invokes `sp:code-implementation` inline by default. Interactive `full` resolves the selector uniformly (task 0687): omit ≡ explicit `--agent inline`; full mode reads `task-pipeline.yaml` and drives its actions/guards in the host session — host-controlled and non-subprocess, with 0508 eligibility applying to the resolved-inline selector (eligible `agent.run` stages dispatch once to a native subagent, host fallback)). `--agent auto`, a name, or headless invocation launches the workflow subprocess. `--agent <inline|auto|name>` selects the execution surface (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips the HITL approve gate / confirmations and propagates down the `--next` chain. `--next` controls chaining only and never changes the mode; a pipeline implement stage must invoke `/sp:dev-run <wbs> --mode implement`. On implement success with `--next`, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`. On a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` section must state that explicitly and the verify verdict will record the scope. `--worktree [<name>]` runs the full pipeline inside an isolated git worktree (create or reuse; FF-merge on success, retain on failure) — the batch lifecycle in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name) applied to a batch of one; rejected with `--mode implement`. `--wrap` hands off to `/sp:dev-wrap <wbs>` after the main step; the `--agent` selector is preserved into that handoff when supplied (omission remains omission), and the wrap hop reports its own trigger-3 subprocess override per the wrap contract.
|
|
144
147
|
- **Backing:** `sp:spur-dev` skill — `run` operation for the full pipeline (the spine drives it); `sp:code-implementation` competency skill for the implement step (the spine dispatches to it).
|
|
145
148
|
- **Modes:**
|
|
146
149
|
- **`full`** (default): Drive the full pipeline — precheck → implement → test → review → approve(HITL) → verify → record → done. Interactive omit/inline uses [inline-pipeline-driver.md](inline-pipeline-driver.md) (host-controlled; eligible stages may use a native subagent); explicit/headless executor selection invokes `spur workflow run task-pipeline.yaml --vars '{"wbs":"<wbs>"}'` (with `profile: auto` when `--auto`). Both monitor/surface HITL and preserve the YAML gates. `--next` never changes this mode.
|
|
147
150
|
- **`implement`** (explicit `--mode implement` only): Execute only the implement step. Read the task's `## Requirements` / `## Design` / `## Plan`, write the code that satisfies them, author the `## Solution` change-map section (file:line + what/why per changed file) via `spur task update <wbs> --section Solution --from-file`. This is the implement step the pipeline calls — it is NOT the pipeline driver. With `--next`: on success, transition `todo → wip → testing` through the FSM (guards honored — no `--no-lifecycle`) + chain to `/sp:dev-verify <wbs> --auto --next`; on a guard failure, stop as review-pending. **Partial-deliverable rule:** if the task ships only part of its requirements (e.g. an R1/R2 split with the rest in a follow-up task), the `## Solution` and `## Review` sections MUST carry a `⚠️ PARTIAL` marker naming the deferred part and the follow-up WBS — see `plugins/sp/commands/dev-run.md` → "Section ownership".
|
|
148
|
-
- **Delegation:** `Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")` for interactive full omit/inline (
|
|
151
|
+
- **Delegation:** `Skill(skill="sp:spur-dev", args="run-inline $ARGUMENTS")` for interactive full omit/inline (resolved-inline semantics, task 0687); `Skill(skill="sp:spur-dev", args="run $ARGUMENTS")` for explicit/headless full mode; `Skill(skill="sp:code-implementation", args="$ARGUMENTS")` for implement mode.
|
|
149
152
|
|
|
150
153
|
### 5. refine
|
|
151
154
|
|
|
@@ -252,7 +255,7 @@ must not be changed without updating the backing skill.
|
|
|
252
255
|
### 6. plan
|
|
253
256
|
|
|
254
257
|
- **Purpose:** Plan a feature from a description — intake → feature create → AC generation → feature check gate → decomposition → batch-create (with **Design by default**).
|
|
255
|
-
- **Inputs:** `"<description>"` (required). `--feature <id>` links to an existing feature. `--parent <feature-id>` nests under a parent. The planning pipeline's `agent.run` stages always dispatch a subprocess; `--agent <inline|auto|name>` selector accepted —
|
|
258
|
+
- **Inputs:** `"<description>"` (required). `--feature <id>` links to an existing feature. `--parent <feature-id>` nests under a parent. The planning pipeline's `agent.run` stages always dispatch a subprocess; `--agent <inline|auto|name>` selector accepted — `inline` substitutes tier resolution with a warning on this headless surface (task 0687) (see [SSOT](cross-cutting.md#inline-default-execution-surface)). **Design package flags (unified with `/sp:dev-idea`):**
|
|
256
259
|
- **Default:** author task `design` on every batch item + feature satellite when the seam heuristic fires (**ties lean design**). There is **no** `--design` force flag.
|
|
257
260
|
- `--skip-design` — skip feature satellite **and** omit task `design` fields (scaffold only; refine fills later). Sole design opt-out.
|
|
258
261
|
- `--approve-taste` — with `--auto`, pre-clear design-approval taste pause when that gate is used (`design_approved=true`). Alias: `--design-approved`.
|
|
@@ -300,7 +303,7 @@ must not be changed without updating the backing skill.
|
|
|
300
303
|
### 14. wrap
|
|
301
304
|
|
|
302
305
|
- **Purpose:** Wrap up a single completed task — capture learnings, record metrics, sync docs, and optionally advance the feature / clean up the branch.
|
|
303
|
-
- **Inputs:** `<wbs>` (required, positional). `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `
|
|
306
|
+
- **Inputs:** `<wbs>` (required, positional). `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `inline`, resolving identically when omitted; task 0687); wrap is workflow-backed (headless), so omit ≡ explicit `inline` (task 0687): tier substitution under objective trigger 3 (durable auditable run record required) plus one warning naming the substituted executor. `auto` tier-resolves an executor, and a name pins that executor into `vars.agent` (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips objective confirmations (the branch-cleanup HITL gate still pauses — irreversible). `--merge` triggers branch cleanup (irreversible HITL gate).
|
|
304
307
|
- **Backing:** `spur workflow run wrapup-pipeline.yaml` — direct workflow invocation (no backing skill; the pipeline IS the procedure).
|
|
305
308
|
- **Behavior:** Resolves the executor (`agent.default` for omit/`inline`, tier-resolved for `auto`, unchanged for a name), emits a pre-dispatch notice naming the subprocess override — `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: <selector>`, `executor: <resolved>` — then builds `--vars '{"tasks":"[\"<wbs>\"]","agent":"<resolved>","profile":"interactive|auto","merge":"true|false"}'` and invokes the wrapup pipeline. The pipeline runs: task-resolve → doc-sync → learning-capture → metrics-record → (feature-transition) → (branch-cleanup) → done. Task statuses are NOT mutated. Branch cleanup is an irreversible HITL gate that always pauses, even under `--auto`.
|
|
306
309
|
- **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `spur workflow run --vars` accepts only string values (`--vars values must be strings`); the pipeline's guards parse the string with `jq length`. `jq -nc` guarantees the shape:
|
|
@@ -316,9 +319,9 @@ must not be changed without updating the backing skill.
|
|
|
316
319
|
### 15. wrapall
|
|
317
320
|
|
|
318
321
|
- **Purpose:** Wrap up a batch of completed tasks — capture learnings, record metrics, sync docs, advance a feature through legal lifecycle edges, and optionally clean up branches.
|
|
319
|
-
- **Inputs:** `--since <iso-date>` filters done tasks by frontmatter `updated_at >= date` (v1 approximation). `--feature <id>` selects all tasks under a feature AND advances the feature through legal lifecycle edges (`backlog → active → verifying → done`, guards honored). `--status <s>` (default: `done`) filters by task status. `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `
|
|
322
|
+
- **Inputs:** `--since <iso-date>` filters done tasks by frontmatter `updated_at >= date` (v1 approximation). `--feature <id>` selects all tasks under a feature AND advances the feature through legal lifecycle edges (`backlog → active → verifying → done`, guards honored). `--status <s>` (default: `done`) filters by task status. `--agent <inline|auto|name>` names the wrap's model-bearing executor (default: `inline`, resolving identically when omitted; task 0687); wrap is workflow-backed (headless), so omit ≡ explicit `inline` (task 0687): tier substitution under objective trigger 3 (durable auditable run record required) plus one warning naming the substituted executor. `auto` tier-resolves an executor, and a name pins that executor into `vars.agent` (see [SSOT](cross-cutting.md#inline-default-execution-surface)). `--auto` skips objective confirmations. `--merge` triggers branch cleanup (irreversible HITL gate).
|
|
320
323
|
- **Backing:** `spur workflow run wrapup-pipeline.yaml` — direct workflow invocation.
|
|
321
|
-
- **Behavior:** Resolves the task list via `spur task list --json` (filtered by `--feature`, `--since`, `--status`), resolves the executor (
|
|
324
|
+
- **Behavior:** Resolves the task list via `spur task list --json` (filtered by `--feature`, `--since`, `--status`), resolves the executor (omission and explicit `--agent inline` tier-substitute identically with a warning per task 0687, `auto` tier-resolves, a name pins), emits a pre-dispatch notice naming the subprocess override — `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: <selector>`, `executor: <resolved>` — then builds `--vars '{"tasks":"[...]","feature":"<id>","agent":"<resolved>","profile":"interactive|auto","merge":"true|false"}'` and invokes the wrapup pipeline. The pipeline runs the same states as `wrap` but with the full task list and optional feature transition. Task statuses are NOT mutated. Feature transitions go through `spur feature update` so lifecycle guards apply. Branch cleanup is an irreversible HITL gate.
|
|
322
325
|
- **Vars string typing:** `tasks` is a JSON-encoded **string**, not a JSON array — `--vars` values must be strings (the CLI rejects raw arrays); `jq -nc` passes the array text through as a string value:
|
|
323
326
|
|
|
324
327
|
```bash
|
|
@@ -378,14 +381,43 @@ is the procedure. The backing is a combination of git CLI, `spur` CLI, and agent
|
|
|
378
381
|
|
|
379
382
|
### 9. gitmsg
|
|
380
383
|
|
|
381
|
-
- **Purpose:** Generate conventional commit message(s)
|
|
382
|
-
- **Inputs:** `--scope <path>` (default:
|
|
383
|
-
- **Backing:** `inline` —
|
|
384
|
+
- **Purpose:** Generate conventional commit message(s) for the current change set — one bounded diff capture → concern grouping → one message per concern; optionally commit.
|
|
385
|
+
- **Inputs:** `--scope <path>` (default: the whole change set) — path filter; an explicit `--scope` always wins over change-set auto-discovery. `--all` (default: off) — widen the change set past the index to every change in the tree: unstaged **and untracked** files. Omitted, the change set is the index only, which keeps pre-commit semantics stable. `--commit` (default: off) — commit the change set, one commit per concern. `--squash` (default: off) — collapse every concern into one message and one commit; implies `--commit`.
|
|
386
|
+
- **Backing:** `inline` — bounded diff capture + concern grouping + conventional commit formatting.
|
|
384
387
|
- **Behavior:**
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
388
|
+
|
|
389
|
+
1. **Gather once — a single shell round trip.** No temp file, no second read, no follow-up `git` call for context:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
# default: RANGE=--cached (the index)
|
|
393
|
+
# --all: RANGE=HEAD (plus untracked, listed below)
|
|
394
|
+
git rev-parse --abbrev-ref HEAD --git-dir --git-common-dir
|
|
395
|
+
git diff $RANGE --stat $PATHSPEC
|
|
396
|
+
git diff $RANGE --name-status $PATHSPEC
|
|
397
|
+
git diff $RANGE -U0 $PATHSPEC ':(exclude)*.lock' ':(exclude)*lock.json' ':(exclude)*.lockb' | head -c 60000
|
|
398
|
+
# --all only:
|
|
399
|
+
git ls-files --others --exclude-standard $PATHSPEC
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
`$PATHSPEC` is `-- <path>` when `--scope` is given, empty otherwise.
|
|
403
|
+
|
|
404
|
+
**Empty index, no `--all`** — the dead-end this command used to hand back. Reading is
|
|
405
|
+
not a mutation, so the two cases split there:
|
|
406
|
+
- **No committing flag** → re-gather once with `--all` semantics and say so
|
|
407
|
+
(`index empty — read the whole tree instead`). A message-only run has nothing to lose by
|
|
408
|
+
looking wider, and the operator gets an answer instead of an errand.
|
|
409
|
+
- **`--commit` / `--squash`** → stop. Print the worktree counts (`N tracked, M untracked`) and
|
|
410
|
+
the exact re-run line (`/sp:dev-gitmsg <the same flags> --all`). Committing
|
|
411
|
+
untracked files is never inferred from an empty index — that is the operator's call, and it
|
|
412
|
+
is now one paste away rather than a guess.
|
|
413
|
+
|
|
414
|
+
Empty under `--all`, or still empty after the widen → report `no changes in <scope>` and stop.
|
|
415
|
+
|
|
416
|
+
2. **Stay inside the budget.** `-U0` (no context lines) plus the lockfile exclusions plus the 60 KB cap is the token contract — never re-run the diff with context to "see more", never paste diff hunks into the output. If the cap truncated the diff, say so and derive the message from `--stat` + `--name-status` alone; a large mechanical change rarely needs hunk detail to be typed and scoped correctly.
|
|
417
|
+
|
|
418
|
+
3. **Summarize only what shapes the message.** One sentence — what changed and _why_, not a line count — for each file whose change is not obvious from its path and status. Skip the obvious ones (generated files, lockfiles, pure renames, `docs/**` under a `docs` group). Past ~12 interesting files, summarize per directory instead of per file.
|
|
419
|
+
|
|
420
|
+
4. **Group by concern**, and for each group derive type, scope, message:
|
|
389
421
|
- Type from the dominant change — `feat` (new functionality) · `fix` (bug fix) · `refactor` (restructuring, no behavior change) · `docs` (documentation only) · `chore` (build/config/tooling) · `perf` · `test` · `style`.
|
|
390
422
|
- Scope from the affected module/package (`cli`, `domain`, `server`, `web`, `app`, …); `--scope` overrides.
|
|
391
423
|
- Message:
|
|
@@ -393,16 +425,29 @@ is the procedure. The backing is a combination of git CLI, `spur` CLI, and agent
|
|
|
393
425
|
```
|
|
394
426
|
<type>(<scope>): <summary>
|
|
395
427
|
|
|
396
|
-
<body —
|
|
428
|
+
<body — why, only when the why is not obvious>
|
|
397
429
|
```
|
|
398
430
|
|
|
399
|
-
Summary: imperative mood, ≤72 chars, lowercase first word, no period. Body
|
|
431
|
+
Summary: imperative mood, ≤72 chars, lowercase first word, no period. Body explains intent and consequence; it never restates the diff. Behavior changes and pure formatting/refactor churn are **different concerns** — never one group.
|
|
432
|
+
|
|
433
|
+
5. **Resolve the message shape without a round trip to the operator.** `--squash` → one combined
|
|
434
|
+
message (dominant type/scope, one body bullet per group). Otherwise one message per group, in
|
|
435
|
+
dependency order (refactor before the feature that uses it); a single group is that same rule
|
|
436
|
+
with one group.
|
|
437
|
+
|
|
438
|
+
6. **Report, then commit if asked.** Print the resolved message(s), a copy-paste `git commit` line per message, and a one-line context header: current branch, and `linked worktree` when `--git-dir` differs from `--git-common-dir` and `git rev-parse --show-superproject-working-tree` is empty (a non-empty result means submodule, not worktree). With neither `--commit` nor `--squash`, stop here — the operator commits.
|
|
439
|
+
|
|
440
|
+
7. **Committing (`--commit` / `--squash`).** The two flags name outcomes, not dimensions: `--commit`
|
|
441
|
+
commits **by concern**, `--squash` commits **everything as one**. `--squash` implies `--commit`,
|
|
442
|
+
so `--commit --squash` is just `--squash`, never an error.
|
|
400
443
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
444
|
+
First scan the captured diff's added lines for credentials (`password`, `secret`, `api[_-]?key`, `token`, `BEGIN [A-Z ]*PRIVATE KEY`, long base64-looking literals). On a hit: print the offending `file:line`, commit nothing, stop. Otherwise:
|
|
445
|
+
- `--all` → `git add -A $PATHSPEC` first (this is what stages the untracked files).
|
|
446
|
+
- `--squash`, or `--commit` on a single group → `git commit -m "$MESSAGE"`.
|
|
447
|
+
- `--commit` on multiple groups → **commit each group in sequence**: record the full staged file list once, then per group `git reset -q -- <all staged paths>` → `git add -- <that group's paths>` → `git commit -m "<that group's message>"`. This is the split; it needs no re-run and no re-staging by the operator.
|
|
448
|
+
- **Partial-staging guard:** if any path appears in _both_ `git diff --cached --name-only` and `git diff --name-only` (a `git add -p` staging), the sequence above would silently widen those commits to the whole file. Do not split — report the affected paths and commit nothing unless `--squash` was given.
|
|
404
449
|
|
|
405
|
-
- **Invariants:**
|
|
450
|
+
- **Invariants:** With neither `--commit` nor `--squash`, never runs `git commit` — message only. Neither flag commits across a credential hit, and `--commit` never splits across a partial staging. Without `--all` the change set is the index, so plain `/sp:dev-gitmsg` keeps pre-commit semantics; only `--all` reaches unstaged and untracked files, and only a committing run (`--commit` / `--squash`) stages them. The empty-index widen is read-only and always announced — a committing run never widens its own scope. An explicit `--scope <path>` always bounds the change set, with or without `--all`. One diff capture per run, bounded and context-free — never a second, wider read.
|
|
406
451
|
|
|
407
452
|
### 10. fixall
|
|
408
453
|
|
|
@@ -147,7 +147,7 @@ On the subprocess path, when `--agent <value>` is set (passed through from the t
|
|
|
147
147
|
`--vars '{"wbs":"<wbs>","agent":"<value>","implementAgent":"<value>"}'`. The pipeline YAML reads
|
|
148
148
|
`${vars.agent}` for review/verify/test-fix and `${vars.implementAgent}` for implement — setting
|
|
149
149
|
both keys ensures the pinned executor reaches every hop. The full value-semantics contract (one
|
|
150
|
-
rule, value table, objective triggers, and headless `inline`
|
|
150
|
+
rule, value table, objective triggers, and headless `inline` substitution (tier resolution + one warning) per ADR-087)
|
|
151
151
|
lives in [cross-cutting.md](cross-cutting.md#inline-default-execution-surface) — the SSOT.
|
|
152
152
|
This file documents only the **workflow-pipeline mechanics**: how the selector reaches `agent.run`
|
|
153
153
|
steps. Precedence chain: `--agent` / explicit `--vars` → `agent.default` → YAML literal (see SSOT
|
|
@@ -47,8 +47,8 @@ The value table below is the C3a cross-file parity surface (kept in lockstep wit
|
|
|
47
47
|
|
|
48
48
|
| Value | Who does the work | Derived surface |
|
|
49
49
|
| ------------------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
50
|
-
| `(omitted)` | The agent running this session | Host session — host-controlled; eligible model stages may use a native subagent (0508) |
|
|
51
|
-
| `inline` | The agent running this session | Host session —
|
|
50
|
+
| `(omitted)` | The agent running this session | Host session — host-controlled; eligible model stages may use a native subagent (0508). Identical to explicit `inline` (0687 R1: inline is the default selector) |
|
|
51
|
+
| `inline` | The agent running this session | Host session — eligible model stages may use a native subagent (0508, generalized to explicit inline by 0687 R2); on a headless dispatch surface AgentService substitutes tier resolution with a warning (0687 R3), never a rejection |
|
|
52
52
|
| `auto` | The role the caller declared — this command's `role:` frontmatter or the workflow step's `role:` (Layer 1, `plugins/sp/references/roles.md`); with nothing declared, `agent.default`'s role (0542) | Subprocess |
|
|
53
53
|
| `<name>` | That coding agent or configured executor | Inline when it is the current session's agent; subprocess otherwise |
|
|
54
54
|
|
|
@@ -62,10 +62,10 @@ threaded by `AgentRunActionRunner`; a pin still beats role routing permanently (
|
|
|
62
62
|
The previous `--inline` and `--subprocess` flags (feature H82, task 0413) are collapsed into this
|
|
63
63
|
selector: `--inline` → `--agent inline`, `--subprocess` → `--agent auto`. Those two flags are no
|
|
64
64
|
longer part of the command surface; their anchors (`#flag-inline`, `#flag-subprocess`) are retained
|
|
65
|
-
as stubs below so external links do not dangle. **
|
|
66
|
-
`--agent inline` leg of the collapse
|
|
67
|
-
|
|
68
|
-
[cross-cutting.md](cross-cutting.md#inline-default-execution-surface)). Operator-layer vocabulary (task 0405): `agent` names
|
|
65
|
+
as stubs below so external links do not dangle. **Restored equivalence (0687 R1/R2):** the
|
|
66
|
+
`--inline` → `--agent inline` leg of the collapse means "equivalent to omitting the flag" again —
|
|
67
|
+
inline is the default selector and omitted/explicit `inline` resolve identically on every surface
|
|
68
|
+
(see [cross-cutting.md](cross-cutting.md#inline-default-execution-surface)). Operator-layer vocabulary (task 0405): `agent` names
|
|
69
69
|
the concrete coding-agent tool; `executor` remains the domain-layer role and is not a command flag.
|
|
70
70
|
`inline` and `auto` are reserved values — config validation rejects an executor claiming either.
|
|
71
71
|
|
|
@@ -177,6 +177,16 @@ all dimensions.
|
|
|
177
177
|
Limit the operation to a file or directory path (`dev-arch`, `dev-debug`, `dev-fixall`,
|
|
178
178
|
`dev-gitmsg`, `dev-gtd`, `dev-simplify`) to bound the working set.
|
|
179
179
|
|
|
180
|
+
### `--all` — widen the operation to everything in its domain
|
|
181
|
+
|
|
182
|
+
**Anchor:** `#flag-all`.
|
|
183
|
+
|
|
184
|
+
Drop the default narrowing and operate on the full set (`dev-gitmsg`, `dev-refresh`). On
|
|
185
|
+
`dev-gitmsg` the default set is the git index, and `--all` widens it to every change in the tree —
|
|
186
|
+
unstaged **and untracked**; on `dev-refresh` the default is one feature or task, and `--all` sweeps
|
|
187
|
+
every feature. An explicit `--scope <path>` still bounds the result, and always wins over
|
|
188
|
+
auto-discovery.
|
|
189
|
+
|
|
180
190
|
### `--dry-run` — print the plan without executing
|
|
181
191
|
|
|
182
192
|
**Anchor:** `#flag-dry-run`.
|
|
@@ -395,9 +405,9 @@ merges but never removes. This keeps the continue-the-work loop stable — after
|
|
|
395
405
|
**Value binding.** The following token is consumed as `<name>` **only when it does not begin with
|
|
396
406
|
`-`**, so `--worktree --auto` is the bare create form and `--agent`/`--feature`/etc. are never
|
|
397
407
|
swallowed as the name. `--worktree=<name>` is the unambiguous spelling. `/sp:dev-next` does not get
|
|
398
|
-
the flag (single
|
|
408
|
+
the flag (single _step_; not worth the worktree cost — unlike `dev-run`, which isolates a whole
|
|
399
409
|
task pipeline), `--worktree --mode parallel` is rejected (per-task parallel isolation stays task
|
|
400
|
-
0142), and `--worktree --mode implement` is rejected on `dev-run` (that mode
|
|
410
|
+
0142), and `--worktree --mode implement` is rejected on `dev-run` (that mode _is_ the pipeline's
|
|
401
411
|
implement stage and runs in the driver's tree). The full lifecycle — name resolution, dirty-tree
|
|
402
412
|
precheck, creation or adoption, crash-safe marker, merge-or-retain, and `--continue` re-entry — is
|
|
403
413
|
specified in [execution-batch.md § Worktree isolation](execution-batch.md#worktree-isolation---worktree-name).
|
|
@@ -10,9 +10,9 @@ see_also:
|
|
|
10
10
|
# Inline Pipeline Driver
|
|
11
11
|
|
|
12
12
|
This driver is the interactive control-inversion path granted by ADR-047. It applies only when an
|
|
13
|
-
interactive `/sp:dev-run --mode full` or sequential `/sp:dev-runall` invocation omits `--agent`
|
|
14
|
-
passes `--agent inline`. A named executor, `--agent auto`, parallel
|
|
15
|
-
and `spur agent run` keep the existing subprocess path.
|
|
13
|
+
interactive `/sp:dev-run --mode full` or sequential `/sp:dev-runall` invocation omits `--agent` (now
|
|
14
|
+
the inline default, 0687 R1) or passes `--agent inline`. A named executor, `--agent auto`, parallel
|
|
15
|
+
batch mode, `spur workflow run`, and `spur agent run` keep the existing subprocess path.
|
|
16
16
|
|
|
17
17
|
The project runtime definition — `task-pipeline.yaml`, resolved through the two-tier
|
|
18
18
|
project→bundled model (task 0648/0650, never an unbundled runtime path) — remains the sole
|
|
@@ -32,14 +32,16 @@ command, skill, script, or second workflow.
|
|
|
32
32
|
`host-session-<run-id>` and record that fallback in the log; provenance must never be blank or
|
|
33
33
|
guessed from an executor subprocess.
|
|
34
34
|
4. Render the two-layer plan into the host todo list (task 0596):
|
|
35
|
-
- **Layer 1** =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
- **Layer 1** = `spur workflow show <pipeline-yaml> --format todo --json` → its `steps[]`: the
|
|
36
|
+
declared state inventory in declaration order with `initial` / `terminal` / `failure` /
|
|
37
|
+
`pause` / `loopBack` / `conditional` markers. Mark the active state. Never re-derive this
|
|
38
|
+
list from the YAML.
|
|
39
|
+
- **Layer 2** = the active state's `onEnter` actions (`kind` + resolved `input`/`command`), from
|
|
40
|
+
the YAML parsed in step 1, shown only for the active state.
|
|
39
41
|
- **Refresh cadence** = stage boundaries only (when the current state changes after a transition),
|
|
40
42
|
never per action.
|
|
41
|
-
- **Source of truth** = the
|
|
42
|
-
state list into the driver, a command, a skill, or a script.
|
|
43
|
+
- **Source of truth** = the CLI projection for layer 1; the YAML parsed in step 1 for layer 2.
|
|
44
|
+
Never hand-copy or hand-derive the state list into the driver, a command, a skill, or a script.
|
|
43
45
|
5. Record lifecycle provenance before entering the FSM:
|
|
44
46
|
|
|
45
47
|
```bash
|
|
@@ -72,9 +74,10 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
72
74
|
**Native-subagent dispatch (R2 eligibility, evaluated before each action):**
|
|
73
75
|
|
|
74
76
|
1. The invocation is one of the two interactive inline full-pipeline surfaces (`dev-run --mode full`
|
|
75
|
-
or sequential `dev-runall`)
|
|
76
|
-
|
|
77
|
-
|
|
77
|
+
or sequential `dev-runall`) and the resolved selector is inline — i.e. `--agent` **omitted**
|
|
78
|
+
(0687 R1 default) or `--agent inline` passed explicitly (0687 R2 generalized from omit-only).
|
|
79
|
+
Explicit inline and omitted resolve identically; a named executor, `auto`, parallel mode,
|
|
80
|
+
`spur workflow run`, and `spur agent run` keep the subprocess path.
|
|
78
81
|
2. The YAML action kind is `agent.run` and its input is a pure slash command. Shell, note, file,
|
|
79
82
|
guard, and operator-interaction actions remain host-executed.
|
|
80
83
|
3. The current state/action has no operator-confirmation action, `pause: true`, approve/taste/ask
|