@gobing-ai/spur 0.3.53 → 0.3.55
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 +2783 -2783
- package/config/pipeline-budgets.json +42 -0
- package/config/plugin-scripts.json +73 -0
- package/config/workflow-composition-baseline.json +561 -0
- package/config/workflows/docs-pipeline.yaml +29 -13
- package/config/workflows/feature-dev.yaml +54 -2
- package/config/workflows/idea-pipeline.yaml +15 -0
- package/config/workflows/task-pipeline.yaml +77 -65
- package/config/workflows/wrapup-pipeline.yaml +40 -45
- package/package.json +9 -9
- package/plugins/README.md +1 -1
- package/plugins/sp/README.md +3 -3
- package/plugins/sp/agents/super-planner.md +1 -1
- package/plugins/sp/commands/dev-daily.md +1 -1
- package/plugins/sp/commands/dev-history-load.md +1 -1
- package/plugins/sp/commands/dev-idea.md +10 -2
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/batch-preflight.mjs +160 -0
- package/plugins/sp/scripts/batch-preflight.ts +1 -1
- package/plugins/sp/scripts/daily-summary/daily-summary.mjs +479 -0
- package/plugins/sp/scripts/daily-summary/daily-summary.ts +75 -37
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.mjs +204 -0
- package/plugins/sp/scripts/dogfood-testing/detect-pipeline-driving.ts +1 -1
- package/plugins/sp/scripts/dogfood-testing/validate-report.mjs +141 -0
- package/plugins/sp/scripts/dogfood-testing/validate-report.ts +1 -1
- package/plugins/sp/scripts/feature-sync-bounded.mjs +290 -0
- package/plugins/sp/scripts/feature-sync-bounded.ts +9 -8
- package/plugins/sp/scripts/history-load.mjs +268 -0
- package/plugins/sp/scripts/pr-reviewing.mjs +685 -0
- package/plugins/sp/scripts/pr-reviewing.ts +1 -1
- package/plugins/sp/scripts/script-contract-check.ts +319 -0
- package/plugins/sp/skills/daily-summary/SKILL.md +3 -3
- package/plugins/sp/skills/dogfood-testing/SKILL.md +5 -5
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +1 -1
- package/plugins/sp/skills/pr-reviewing/SKILL.md +3 -3
- package/plugins/sp/skills/spur-dev/SKILL.md +2 -1
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +3 -4
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +3 -3
- package/plugins/sp/skills/spur-dev/references/gate-checklists.md +4 -4
- package/spur.js +4270 -1323
- package/web/_astro/{BoardApp.plVXYkKo.js → BoardApp.DCLSB3Zs.js} +63 -63
- package/web/_astro/BoardApp.Dx5gzAhb.js +1 -0
- package/web/_astro/{TaskDetail.5DIyVQ_N.js → TaskDetail.DN_RxS-2.js} +1 -1
- package/web/_astro/{arc.BnUgL7ho.js → arc.CldTHRg-.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.B9YMJau-.js → architectureDiagram-3BPJPVTR.DQ4T9oeU.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.Dw2qgvWJ.js → blockDiagram-GPEHLZMM.CGDaXH8J.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.jTbU0-Nk.js → c4Diagram-AAUBKEIU.Cqsc2iub.js} +1 -1
- package/web/_astro/channel.CrBJYpxo.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Di46EtkU.js → chunk-2J33WTMH.CQSKsRmq.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DweHBwqQ.js → chunk-4BX2VUAB.Pv1HCtp8.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.rRjTKaa7.js → chunk-55IACEB6.-9MseOIk.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.BkEQIkSV.js → chunk-727SXJPM.M3OI1DF7.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.Cfe9IvAd.js → chunk-AQP2D5EJ.NfHka5Ca.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.fI6tLbeN.js → chunk-FMBD7UC4.B2suYe3s.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.BIjgpq0O.js → chunk-ND2GUHAM.BfJ7aucP.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.ZwLnVxyz.js → chunk-QZHKN3VN._582hZVc.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.BJAGYidE.js → classDiagram-4FO5ZUOK._tttU_jk.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.BJAGYidE.js → classDiagram-v2-Q7XG4LA2._tttU_jk.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.B5y3nz26.js → cose-bilkent-S5V4N54A.C4rVATLQ.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.DHmw0ZBC.js → dagre-BM42HDAG.8BLRi7f9.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.10gapJfY.js → diagram-2AECGRRQ.D6lwUZos.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.Gh33_drM.js → diagram-5GNKFQAL.Cl_rMiVT.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.8ROWlfcX.js → diagram-KO2AKTUF.DhMExHLp.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.BsP3tKmg.js → diagram-LMA3HP47.3OAxzH_o.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.DM2WFDhU.js → diagram-OG6HWLK6.Uh9RLucG.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.royaC_lH.js → erDiagram-TEJ5UH35.izzElG0c.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.C9GEvIie.js → flowDiagram-I6XJVG4X.BlGwp5qM.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.CXO4T2U0.js → ganttDiagram-6RSMTGT7.je7Vf8dN.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.Q02KzYH7.js → gitGraphDiagram-PVQCEYII.DNk0Ycop.js} +1 -1
- package/web/_astro/{index.DAxu50UF.css → index.V6Q7nhed.css} +1 -1
- package/web/_astro/{infoDiagram-5YYISTIA.DNfSDKJt.js → infoDiagram-5YYISTIA.K2HhGyWH.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BFttvtgJ.js → ishikawaDiagram-YF4QCWOH.BbbOW4IN.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.Cfm-2SbG.js → journeyDiagram-JHISSGLW.B1UaZKqN.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.BWGNW6fV.js → kanban-definition-UN3LZRKU.9tsw5QFd.js} +1 -1
- package/web/_astro/{linear.BprdUk2Y.js → linear.I9dvtu-j.js} +1 -1
- package/web/_astro/{mermaid.core.B2zRNxtX.js → mermaid.core.5bKJsMgf.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.g9jij8sw.js → mindmap-definition-RKZ34NQL.BC5MqSn6.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.CbzR4n5b.js → pieDiagram-4H26LBE5.B8GIMyxD.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.DxV3viWt.js → quadrantDiagram-W4KKPZXB.K_aZSM_u.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.DvAb90JS.js → requirementDiagram-4Y6WPE33.B_V5kzfT.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.CIFz5t4D.js → sankeyDiagram-5OEKKPKP.DyV2quLS.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.DzlEQynd.js → sequenceDiagram-3UESZ5HK.BlKvPnBv.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.Dph2V-ts.js → stateDiagram-AJRCARHV.C1lYUMdS.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.wJhfrLAy.js → stateDiagram-v2-BHNVJYJU.DJWjr3QV.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BrSiyubX.js → timeline-definition-PNZ67QCA.CYYiXVlv.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.COobPrUX.js → vennDiagram-CIIHVFJN.zYjQKa_S.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.CrjeTx8A.js → wardley-L42UT6IY.BGrWTY3D.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.B8_fTQ8E.js → wardleyDiagram-YWT4CUSO.CkXxtcI1.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.BPpokgVv.js → xychartDiagram-2RQKCTM6.BhKH3KG3.js} +1 -1
- package/web/index.html +2 -2
- package/config/workflows/planning-pipeline.yaml +0 -249
- package/config/workflows/task-pipeline2.yaml +0 -778
- package/web/_astro/BoardApp.pdtYu-yW.js +0 -1
- package/web/_astro/channel.DEqvaz-I.js +0 -1
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
# Planning pipeline — front-half of the development workflow (task 0088, design §6).
|
|
2
|
-
#
|
|
3
|
-
# Orchestration is configuration (ADR-022 / §3.2): this is YAML over the existing
|
|
4
|
-
# dual-workflow engine — zero new engine code. The pipeline automates steps 3–6 of the
|
|
5
|
-
# ideation→implementation chain: phasing → feature-ID derivation → design-doc generation →
|
|
6
|
-
# design-doc approval. It terminates at a drafted feature list and hands off to sp:spur-dev
|
|
7
|
-
# (steps 7–12), which is already shipped and unchanged.
|
|
8
|
-
#
|
|
9
|
-
# Every authoritative-doc touch invokes sp:doc-evolve to honor the constitution §5 sync triggers.
|
|
10
|
-
# Derived docs (docs/design/*, docs/features/*, 05_FEATURES index) are auto-written; high-risk
|
|
11
|
-
# authoritative edits (02_ROADMAP phasing, 04_DESIGN index) are STAGED to docs/plans/ for human
|
|
12
|
-
# commit (Q3 — hybrid by risk).
|
|
13
|
-
#
|
|
14
|
-
# Shape: phasing(HITL) → feature-id → design-gen → design-approval(HITL) → handoff
|
|
15
|
-
# (phasing skipped when profile=auto; design-approval skipped when profile=auto
|
|
16
|
-
# AND design_approved=true — taste gates pause even in auto unless prior approval
|
|
17
|
-
# is encoded, per design doc HITL taxonomy).
|
|
18
|
-
#
|
|
19
|
-
# Vars (passed as a JSON object via `--vars`):
|
|
20
|
-
# slug — the design-doc slug, e.g. `--vars '{"slug":"auth-migration"}'`
|
|
21
|
-
# profile — set `--vars '{"profile":"auto"}'` to skip the HITL gates (Q4)
|
|
22
|
-
# feature — optional parent feature ID for derivation context
|
|
23
|
-
# design_approved — "true" only when the operator explicitly approved the design in-session;
|
|
24
|
-
# lets profile=auto route around the design-approval taste gate (default "false")
|
|
25
|
-
#
|
|
26
|
-
# Reliability (aligned with task-pipeline / ADR-043):
|
|
27
|
-
# - Soft start precheck (slug non-empty + agent doctor) → failed via transitions
|
|
28
|
-
# - feature-id + design-gen use expectFile so silent no-ops cannot proceed
|
|
29
|
-
# - HITL routing is exhaustive (yes/no/cancel) on phasing and design-approval
|
|
30
|
-
# - Free-form skill pointers remain only where no pure slash surface exists yet
|
|
31
|
-
|
|
32
|
-
"$schema": "@gobing-ai/spur/schemas/state-machine-workflow.schema.json"
|
|
33
|
-
kind: state-machine
|
|
34
|
-
name: planning-pipeline
|
|
35
|
-
description: "Front-half planning pipeline (start → phasing → feature-ID → design-gen → design-approval → handoff)"
|
|
36
|
-
iterationBound: 20
|
|
37
|
-
initialState: start
|
|
38
|
-
terminalStates:
|
|
39
|
-
- handoff
|
|
40
|
-
- cancelled
|
|
41
|
-
- failed
|
|
42
|
-
failureStates:
|
|
43
|
-
- failed
|
|
44
|
-
- cancelled
|
|
45
|
-
vars:
|
|
46
|
-
slug: "draft"
|
|
47
|
-
profile: "interactive"
|
|
48
|
-
feature: ""
|
|
49
|
-
design_approved: "false"
|
|
50
|
-
__hitlAnswer: ""
|
|
51
|
-
spurBin: "spur"
|
|
52
|
-
agent: "omp"
|
|
53
|
-
stepTimeoutMs: "1800000"
|
|
54
|
-
# Injected by WorkflowAppService.run(); scopes .spur/run artifacts per run (0425 R4).
|
|
55
|
-
__runId: ""
|
|
56
|
-
|
|
57
|
-
states:
|
|
58
|
-
- id: start
|
|
59
|
-
description: >
|
|
60
|
-
Soft precheck + routing node. Validates slug and agent doctor (status file,
|
|
61
|
-
always exit 0), then routes to the phasing HITL gate (interactive) or straight
|
|
62
|
-
to feature-id (profile=auto) so hitl.confirm only fires when a human is in loop.
|
|
63
|
-
onEnter:
|
|
64
|
-
- kind: shell
|
|
65
|
-
options:
|
|
66
|
-
command: >-
|
|
67
|
-
mkdir -p .spur/run &&
|
|
68
|
-
set +e &&
|
|
69
|
-
test -n "$slug"; slug_rc=$?;
|
|
70
|
-
$spurBin agent doctor $agent; doctor_rc=$?;
|
|
71
|
-
set -e &&
|
|
72
|
-
if [ "$slug_rc" -eq 0 ] && [ "$doctor_rc" -eq 0 ]; then
|
|
73
|
-
printf 'PASS\n' > .spur/run/$__runId-plan-precheck.status;
|
|
74
|
-
else
|
|
75
|
-
printf 'FAIL\n' > .spur/run/$__runId-plan-precheck.status;
|
|
76
|
-
fi &&
|
|
77
|
-
exit 0
|
|
78
|
-
- kind: note
|
|
79
|
-
options:
|
|
80
|
-
message: "Planning pipeline start for slug=${vars.slug}."
|
|
81
|
-
|
|
82
|
-
- id: phasing
|
|
83
|
-
description: >
|
|
84
|
-
Decide whether this requirement needs a new phase in 02_ROADMAP. The HITL gate asks
|
|
85
|
-
the operator; if a new phase is needed, the edit is STAGED to docs/plans/ (never
|
|
86
|
-
auto-written — Q3). Under profile=auto this state is never entered (start routes
|
|
87
|
-
around it straight to feature-id).
|
|
88
|
-
onEnter:
|
|
89
|
-
- kind: hitl.confirm
|
|
90
|
-
options:
|
|
91
|
-
prompt: "Does this requirement need a new phase in 02_ROADMAP? (Stage the edit if yes.)"
|
|
92
|
-
|
|
93
|
-
- id: feature-id
|
|
94
|
-
description: >
|
|
95
|
-
Allocate the feature id via the canonical `spur feature create` verb (DD-14).
|
|
96
|
-
expectFile fails a silent no-op so design-gen never runs without an id.
|
|
97
|
-
onEnter:
|
|
98
|
-
- kind: shell
|
|
99
|
-
options:
|
|
100
|
-
command: 'mkdir -p .spur/run && rm -f .spur/run/$__runId-plan-feature-id.txt'
|
|
101
|
-
- kind: agent.run
|
|
102
|
-
options:
|
|
103
|
-
agent: ${vars.agent}
|
|
104
|
-
# `vars.feature` is optional and defaults to "" — the parent flag must be
|
|
105
|
-
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
106
|
-
role: planner
|
|
107
|
-
# described conditionally, never interpolated bare. `--parent <empty> --json`
|
|
108
|
-
# makes commander swallow `--json` as the parent value.
|
|
109
|
-
input: "Skill(skill=\"sp:spur-cli\", args=\"feature create for slug ${vars.slug}\"). Run `${vars.spurBin} feature create \"${vars.slug}\" --json` (or reuse an existing id); append `--parent \"${vars.feature}\"` ONLY if the parent id between those quotes is non-empty — if it is empty, omit the --parent flag entirely. Write the feature id alone to .spur/run/${vars.__runId}-plan-feature-id.txt."
|
|
110
|
-
expectFile: .spur/run/${vars.__runId}-plan-feature-id.txt
|
|
111
|
-
timeoutMs: ${vars.stepTimeoutMs}
|
|
112
|
-
|
|
113
|
-
- id: design-gen
|
|
114
|
-
description: >
|
|
115
|
-
Author docs/design/${vars.slug}.md from docs/plans/${vars.slug}-drafted.md and
|
|
116
|
-
stage 04_DESIGN index via sp:doc-evolve (Q3 — never auto-write the index).
|
|
117
|
-
expectFile fails a silent no-op design gen.
|
|
118
|
-
onEnter:
|
|
119
|
-
- kind: agent.run
|
|
120
|
-
options:
|
|
121
|
-
agent: ${vars.agent}
|
|
122
|
-
input: "Skill(skill=\"sp:doc-evolve\", args=\"design-gen slug=${vars.slug}\"). Author docs/design/${vars.slug}.md from docs/plans/${vars.slug}-drafted.md; stage 04_DESIGN index edit only."
|
|
123
|
-
# Declared Layer-1 role (0538 R2): routing reason beside the agent: pin.
|
|
124
|
-
role: planner
|
|
125
|
-
expectFile: docs/design/${vars.slug}.md
|
|
126
|
-
timeoutMs: ${vars.stepTimeoutMs}
|
|
127
|
-
|
|
128
|
-
- id: failed
|
|
129
|
-
description: Terminal — planning failed a hard gate (feature-id / design-gen / check).
|
|
130
|
-
|
|
131
|
-
- id: design-approval
|
|
132
|
-
description: >
|
|
133
|
-
HITL gate — the highest-leverage gate in the pipeline. Loop until the operator
|
|
134
|
-
approves the design doc. Under profile=auto this state is skipped ONLY when
|
|
135
|
-
vars.design_approved=true (explicit prior approval); otherwise the taste gate
|
|
136
|
-
pauses even in auto mode (design doc HITL taxonomy). Loop back to design-gen
|
|
137
|
-
for revisions.
|
|
138
|
-
pause: true
|
|
139
|
-
onEnter:
|
|
140
|
-
- kind: hitl.confirm
|
|
141
|
-
options:
|
|
142
|
-
prompt: "Approve the design doc at docs/design/${vars.slug}.md? (Loop back to design-gen for revisions.)"
|
|
143
|
-
|
|
144
|
-
- id: handoff
|
|
145
|
-
description: >
|
|
146
|
-
Terminal — design doc approved; the drafted feature list is ready. Hand off to
|
|
147
|
-
sp:spur-dev (steps 7–12), which starts at `spur feature create`. The seam is the
|
|
148
|
-
drafted-feature-list file at docs/plans/${vars.slug}-drafted.md.
|
|
149
|
-
# Checkpoint write: record session state for resume (Phase 4, task 0171 R3)
|
|
150
|
-
onEnter:
|
|
151
|
-
- kind: shell
|
|
152
|
-
options:
|
|
153
|
-
command: 'mkdir -p .spur/memory/sessions && echo "checkpoint: planning-pipeline handoff slug=$slug ts=$(date -u +%Y-%m-%dT%H:%M:%SZ)" > .spur/memory/sessions/$slug-checkpoint.md'
|
|
154
|
-
|
|
155
|
-
- id: cancelled
|
|
156
|
-
description: Terminal — planning abandoned by the operator.
|
|
157
|
-
|
|
158
|
-
transitions:
|
|
159
|
-
# ── start: precheck FAIL → failed; else route around phasing when profile=auto ──
|
|
160
|
-
# Declaration order: FAIL first, then auto-skip, then interactive phasing.
|
|
161
|
-
- from: start
|
|
162
|
-
to: failed
|
|
163
|
-
description: Precheck FAIL (empty slug and/or doctor red) — stop.
|
|
164
|
-
guard:
|
|
165
|
-
kind: shell
|
|
166
|
-
options:
|
|
167
|
-
command: 'test "$(cat .spur/run/$__runId-plan-precheck.status 2>/dev/null)" = FAIL'
|
|
168
|
-
- from: start
|
|
169
|
-
to: feature-id
|
|
170
|
-
description: profile=auto and precheck PASS — skip the phasing HITL gate.
|
|
171
|
-
guard:
|
|
172
|
-
kind: shell
|
|
173
|
-
options:
|
|
174
|
-
command: 'test "$profile" = auto && test "$(cat .spur/run/$__runId-plan-precheck.status 2>/dev/null)" = PASS'
|
|
175
|
-
- from: start
|
|
176
|
-
to: phasing
|
|
177
|
-
description: Interactive and precheck PASS — enter the phasing HITL gate.
|
|
178
|
-
guard:
|
|
179
|
-
kind: shell
|
|
180
|
-
options:
|
|
181
|
-
command: 'test "$(cat .spur/run/$__runId-plan-precheck.status 2>/dev/null)" = PASS'
|
|
182
|
-
- from: start
|
|
183
|
-
to: failed
|
|
184
|
-
description: Defense — corrupt/missing precheck status — failed.
|
|
185
|
-
guard:
|
|
186
|
-
kind: always
|
|
187
|
-
|
|
188
|
-
# ── phasing: HITL gate (reached only when profile != auto) ──
|
|
189
|
-
- from: phasing
|
|
190
|
-
to: feature-id
|
|
191
|
-
description: Phasing decided — proceed to feature-ID derivation.
|
|
192
|
-
guard:
|
|
193
|
-
kind: shell
|
|
194
|
-
options:
|
|
195
|
-
command: 'test "$__hitlAnswer" = yes || test "$__hitlAnswer" = no'
|
|
196
|
-
- from: phasing
|
|
197
|
-
to: cancelled
|
|
198
|
-
description: Operator cancelled planning.
|
|
199
|
-
guard:
|
|
200
|
-
kind: shell
|
|
201
|
-
options:
|
|
202
|
-
command: 'test "$__hitlAnswer" = cancel'
|
|
203
|
-
|
|
204
|
-
# ── linear body ──
|
|
205
|
-
- from: feature-id
|
|
206
|
-
to: design-gen
|
|
207
|
-
description: Feature ID derived — generate the design doc.
|
|
208
|
-
guard:
|
|
209
|
-
kind: always
|
|
210
|
-
|
|
211
|
-
# ── design-gen → design-approval, OR skip the HITL gate when profile=auto AND design_approved=true ──
|
|
212
|
-
# Auto-skip guard tried FIRST: under profile=auto with explicit prior approval,
|
|
213
|
-
# route straight to handoff without entering design-approval. Without prior
|
|
214
|
-
# approval, the taste gate pauses even in auto (design doc HITL taxonomy).
|
|
215
|
-
- from: design-gen
|
|
216
|
-
to: handoff
|
|
217
|
-
description: profile=auto AND design_approved=true — skip the design-approval HITL gate.
|
|
218
|
-
guard:
|
|
219
|
-
kind: shell
|
|
220
|
-
options:
|
|
221
|
-
command: 'test "$profile" = auto && test "$design_approved" = true'
|
|
222
|
-
- from: design-gen
|
|
223
|
-
to: design-approval
|
|
224
|
-
description: Design doc drafted — gate on human approval.
|
|
225
|
-
guard:
|
|
226
|
-
kind: always
|
|
227
|
-
|
|
228
|
-
# ── design-approval: HITL gate (reached only when profile != auto) ──
|
|
229
|
-
- from: design-approval
|
|
230
|
-
to: handoff
|
|
231
|
-
description: Design approved — hand off to sp:spur-dev.
|
|
232
|
-
guard:
|
|
233
|
-
kind: shell
|
|
234
|
-
options:
|
|
235
|
-
command: 'test "$__hitlAnswer" = yes'
|
|
236
|
-
- from: design-approval
|
|
237
|
-
to: design-gen
|
|
238
|
-
description: Rework — operator requested design revisions.
|
|
239
|
-
guard:
|
|
240
|
-
kind: shell
|
|
241
|
-
options:
|
|
242
|
-
command: 'test "$__hitlAnswer" = no'
|
|
243
|
-
- from: design-approval
|
|
244
|
-
to: cancelled
|
|
245
|
-
description: Operator cancelled planning.
|
|
246
|
-
guard:
|
|
247
|
-
kind: shell
|
|
248
|
-
options:
|
|
249
|
-
command: 'test "$__hitlAnswer" = cancel'
|