@gobing-ai/spur 0.3.62 → 0.3.64
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 +3428 -3796
- package/config/workflows/history-anatomy.yaml +40 -11
- package/package.json +9 -9
- package/plugins/sp/README.md +8 -5
- package/plugins/sp/agents/expert-spur.md +20 -4
- package/plugins/sp/commands/dev-find-issue.md +4 -4
- 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 +3 -3
- package/plugins/sp/commands/dev-plan.md +1 -1
- 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 +66 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +165 -15
- package/plugins/sp/scripts/history-anatomy-cache.ts +216 -15
- package/plugins/sp/skills/dogfood-testing/SKILL.md +14 -1
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
- package/plugins/sp/skills/history-anatomy/SKILL.md +3 -3
- package/plugins/sp/skills/history-anatomy/references/operations.md +21 -8
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +63 -5
- 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/spur-cli/references/agent.md +16 -7
- package/plugins/sp/skills/spur-cli/references/message.md +4 -2
- 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 +26 -4
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +28 -34
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +62 -20
- 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 +7 -6
- package/spur.js +1012 -372
- package/web/_astro/{BoardApp.rkWGVwwK.js → BoardApp.CKolAjUz.js} +56 -56
- package/web/_astro/BoardApp.DXD--ybM.js +1 -0
- package/web/_astro/{TaskDetail.B7ODt_bA.js → TaskDetail.Bre7G4gC.js} +1 -1
- package/web/_astro/{arc.C5QRz6AQ.js → arc.7luwOGiC.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.CHptn8gZ.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.b1nEDkDw.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BWj8S_Qq.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
- package/web/_astro/channel.DxfOFf1l.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.q0BBuE1n.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DP2KDkAU.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CkCId72p.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.oHWzxMot.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DkkgxfMP.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.lmFJDvRK.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.52jt0eHK.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.Cg8KEFoD.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.BuOUhxcD.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.BuOUhxcD.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.BRUU8E_0.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.GDbfFYVV.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CvIDBeJF.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DMgJjWOX.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.njjl-0AP.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CcCqgP8M.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Btqd-YVE.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BbhML_Xo.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.CkvsIgY8.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.m8IWD_wW.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.5z87HXO-.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
- package/web/_astro/index.BVXdIsZV.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.Bvyvsd7Q.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.DdWVYO87.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.C3kOlYH1.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.CfKTUHVC.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
- package/web/_astro/{linear.CMDHnzgX.js → linear.BNNCobvI.js} +1 -1
- package/web/_astro/{mermaid.core.DN7-WrsP.js → mermaid.core.DnpzzuPU.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.DcQxLvqG.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.Nu-Inbw6.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.Dck2EChs.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.C--E5XuW.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B_0iRNna.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.PKuKr9mk.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.ClhGHb-O.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BZm2ZvAH.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.Dt6yZXry.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.rUs-E00M.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BcWgv4cA.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DH-M-cX9.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.Z9jMwI9G.js +0 -1
- package/web/_astro/channel.BJtn6CGV.js +0 -1
- package/web/_astro/index.nWve6EHS.css +0 -1
|
@@ -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
|
|
|
@@ -185,11 +177,13 @@ recovery (0482 R1). To confirm recovery is wired, watch the run log for
|
|
|
185
177
|
`Escalating: <executor> (tier <t>) failed with resource-exhaustion; retrying on <executor>` — that
|
|
186
178
|
line, not quota state, is the signal that the fallback ladder fired.
|
|
187
179
|
|
|
188
|
-
Do not read provider quota from `spur agent doctor`. The doctor resolves provider keys from
|
|
180
|
+
Do not read provider auth or quota from `spur agent doctor`. The doctor resolves provider keys from
|
|
189
181
|
`${PROVIDER}_API_KEY` env vars and cannot see an agent-owned credential store (e.g. omp's models
|
|
190
|
-
config), so
|
|
191
|
-
and
|
|
192
|
-
|
|
182
|
+
config), so it historically degraded to `status: usable · auth: no · model: unknown` for GLM-style
|
|
183
|
+
executors and was useless as a preflight gate. Feature B4 removed the auth signal from the surface
|
|
184
|
+
entirely (no column, no `authenticated` in `--json`) precisely so nothing can read it by mistake;
|
|
185
|
+
the precheck probe classifies on usability alone. Exhaustion is detected mid-run by the escalation
|
|
186
|
+
classifier, not by any preflight probe.
|
|
193
187
|
|
|
194
188
|
### Explicit subprocess surfaces are unchanged
|
|
195
189
|
|
|
@@ -74,7 +74,7 @@ each would be scope creep for one-liner procedures.
|
|
|
74
74
|
| 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
75
|
| 7 | docs | _(no thin wrapper)_ | `Skill()` | `sp:doc-evolve` | `"<change description>"` |
|
|
76
76
|
| 8 | changelog | `dev-changelog` | `inline` | git log + conventional-commit grouping | `[--since <ref>] [--until <ref>] [--version <ver>]` |
|
|
77
|
-
| 9 | gitmsg | `dev-gitmsg` | `inline` |
|
|
77
|
+
| 9 | gitmsg | `dev-gitmsg` | `inline` | bounded diff capture → concern grouping → conventional commit | `[--commit] [--squash] [--all] [--scope <path>]` |
|
|
78
78
|
| 10 | fixall | `dev-fixall` | `inline` | lint + test fix loop | `[<validation-command>] [--max-retry <n>] [--scope <path>] [--gate-log <path>] [--findings <anchors>]` |
|
|
79
79
|
| 11 | handover | `dev-handover` | `inline` | structured doc generation | `"<blocker description>"` |
|
|
80
80
|
| 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 +140,12 @@ must not be changed without updating the backing skill.
|
|
|
140
140
|
### 4. run
|
|
141
141
|
|
|
142
142
|
- **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`
|
|
143
|
+
- **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
144
|
- **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
145
|
- **Modes:**
|
|
146
146
|
- **`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
147
|
- **`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 (
|
|
148
|
+
- **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
149
|
|
|
150
150
|
### 5. refine
|
|
151
151
|
|
|
@@ -252,7 +252,7 @@ must not be changed without updating the backing skill.
|
|
|
252
252
|
### 6. plan
|
|
253
253
|
|
|
254
254
|
- **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 —
|
|
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 — `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
256
|
- **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
257
|
- `--skip-design` — skip feature satellite **and** omit task `design` fields (scaffold only; refine fills later). Sole design opt-out.
|
|
258
258
|
- `--approve-taste` — with `--auto`, pre-clear design-approval taste pause when that gate is used (`design_approved=true`). Alias: `--design-approved`.
|
|
@@ -300,7 +300,7 @@ must not be changed without updating the backing skill.
|
|
|
300
300
|
### 14. wrap
|
|
301
301
|
|
|
302
302
|
- **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: `
|
|
303
|
+
- **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
304
|
- **Backing:** `spur workflow run wrapup-pipeline.yaml` — direct workflow invocation (no backing skill; the pipeline IS the procedure).
|
|
305
305
|
- **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
306
|
- **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 +316,9 @@ must not be changed without updating the backing skill.
|
|
|
316
316
|
### 15. wrapall
|
|
317
317
|
|
|
318
318
|
- **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: `
|
|
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: `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
320
|
- **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 (
|
|
321
|
+
- **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
322
|
- **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
323
|
|
|
324
324
|
```bash
|
|
@@ -378,14 +378,43 @@ is the procedure. The backing is a combination of git CLI, `spur` CLI, and agent
|
|
|
378
378
|
|
|
379
379
|
### 9. gitmsg
|
|
380
380
|
|
|
381
|
-
- **Purpose:** Generate conventional commit message(s)
|
|
382
|
-
- **Inputs:** `--scope <path>` (default:
|
|
383
|
-
- **Backing:** `inline` —
|
|
381
|
+
- **Purpose:** Generate conventional commit message(s) for the current change set — one bounded diff capture → concern grouping → one message per concern; optionally commit.
|
|
382
|
+
- **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`.
|
|
383
|
+
- **Backing:** `inline` — bounded diff capture + concern grouping + conventional commit formatting.
|
|
384
384
|
- **Behavior:**
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
385
|
+
|
|
386
|
+
1. **Gather once — a single shell round trip.** No temp file, no second read, no follow-up `git` call for context:
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
# default: RANGE=--cached (the index)
|
|
390
|
+
# --all: RANGE=HEAD (plus untracked, listed below)
|
|
391
|
+
git rev-parse --abbrev-ref HEAD --git-dir --git-common-dir
|
|
392
|
+
git diff $RANGE --stat $PATHSPEC
|
|
393
|
+
git diff $RANGE --name-status $PATHSPEC
|
|
394
|
+
git diff $RANGE -U0 $PATHSPEC ':(exclude)*.lock' ':(exclude)*lock.json' ':(exclude)*.lockb' | head -c 60000
|
|
395
|
+
# --all only:
|
|
396
|
+
git ls-files --others --exclude-standard $PATHSPEC
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
`$PATHSPEC` is `-- <path>` when `--scope` is given, empty otherwise.
|
|
400
|
+
|
|
401
|
+
**Empty index, no `--all`** — the dead-end this command used to hand back. Reading is
|
|
402
|
+
not a mutation, so the two cases split there:
|
|
403
|
+
- **No committing flag** → re-gather once with `--all` semantics and say so
|
|
404
|
+
(`index empty — read the whole tree instead`). A message-only run has nothing to lose by
|
|
405
|
+
looking wider, and the operator gets an answer instead of an errand.
|
|
406
|
+
- **`--commit` / `--squash`** → stop. Print the worktree counts (`N tracked, M untracked`) and
|
|
407
|
+
the exact re-run line (`/sp:dev-gitmsg <the same flags> --all`). Committing
|
|
408
|
+
untracked files is never inferred from an empty index — that is the operator's call, and it
|
|
409
|
+
is now one paste away rather than a guess.
|
|
410
|
+
|
|
411
|
+
Empty under `--all`, or still empty after the widen → report `no changes in <scope>` and stop.
|
|
412
|
+
|
|
413
|
+
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.
|
|
414
|
+
|
|
415
|
+
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.
|
|
416
|
+
|
|
417
|
+
4. **Group by concern**, and for each group derive type, scope, message:
|
|
389
418
|
- 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
419
|
- Scope from the affected module/package (`cli`, `domain`, `server`, `web`, `app`, …); `--scope` overrides.
|
|
391
420
|
- Message:
|
|
@@ -393,16 +422,29 @@ is the procedure. The backing is a combination of git CLI, `spur` CLI, and agent
|
|
|
393
422
|
```
|
|
394
423
|
<type>(<scope>): <summary>
|
|
395
424
|
|
|
396
|
-
<body —
|
|
425
|
+
<body — why, only when the why is not obvious>
|
|
397
426
|
```
|
|
398
427
|
|
|
399
|
-
Summary: imperative mood, ≤72 chars, lowercase first word, no period. Body
|
|
428
|
+
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.
|
|
429
|
+
|
|
430
|
+
5. **Resolve the message shape without a round trip to the operator.** `--squash` → one combined
|
|
431
|
+
message (dominant type/scope, one body bullet per group). Otherwise one message per group, in
|
|
432
|
+
dependency order (refactor before the feature that uses it); a single group is that same rule
|
|
433
|
+
with one group.
|
|
434
|
+
|
|
435
|
+
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.
|
|
436
|
+
|
|
437
|
+
7. **Committing (`--commit` / `--squash`).** The two flags name outcomes, not dimensions: `--commit`
|
|
438
|
+
commits **by concern**, `--squash` commits **everything as one**. `--squash` implies `--commit`,
|
|
439
|
+
so `--commit --squash` is just `--squash`, never an error.
|
|
400
440
|
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
441
|
+
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:
|
|
442
|
+
- `--all` → `git add -A $PATHSPEC` first (this is what stages the untracked files).
|
|
443
|
+
- `--squash`, or `--commit` on a single group → `git commit -m "$MESSAGE"`.
|
|
444
|
+
- `--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.
|
|
445
|
+
- **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
446
|
|
|
405
|
-
- **Invariants:**
|
|
447
|
+
- **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
448
|
|
|
407
449
|
### 10. fixall
|
|
408
450
|
|
|
@@ -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
|
|
@@ -72,9 +72,10 @@ Action semantics come from the YAML and the workflow action contract:
|
|
|
72
72
|
**Native-subagent dispatch (R2 eligibility, evaluated before each action):**
|
|
73
73
|
|
|
74
74
|
1. The invocation is one of the two interactive inline full-pipeline surfaces (`dev-run --mode full`
|
|
75
|
-
or sequential `dev-runall`)
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
or sequential `dev-runall`) and the resolved selector is inline — i.e. `--agent` **omitted**
|
|
76
|
+
(0687 R1 default) or `--agent inline` passed explicitly (0687 R2 generalized from omit-only).
|
|
77
|
+
Explicit inline and omitted resolve identically; a named executor, `auto`, parallel mode,
|
|
78
|
+
`spur workflow run`, and `spur agent run` keep the subprocess path.
|
|
78
79
|
2. The YAML action kind is `agent.run` and its input is a pure slash command. Shell, note, file,
|
|
79
80
|
guard, and operator-interaction actions remain host-executed.
|
|
80
81
|
3. The current state/action has no operator-confirmation action, `pause: true`, approve/taste/ask
|