create-issflow 1.2.1 → 1.4.0

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/README.md CHANGED
@@ -25,9 +25,9 @@ Flags:
25
25
  The portable kit (every tool) in `<project>/.claude/`:
26
26
 
27
27
  - `agents/` — planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer
28
- - `commands/` — `/overview` `/propose` `/phase` `/ui-audit` `/qa-audit` `/security-audit` `/change-request` `/replan` `/quick` `/synthesize` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
29
- - `skills/` — caveman · grill-me · karpathy-guidelines · ux-design
30
- - `hooks/` — session-start · pre-compact · subagent-stop
28
+ - `commands/` — `/overview` `/propose` `/phase` `/sprint` `/ui-audit` `/qa-audit` `/security-audit` `/release` `/uat` `/change-request` `/replan` `/quick` `/synthesize` `/runbook` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
29
+ - `skills/` — caveman · grill-me · karpathy-guidelines · ux-design · security · code-standards
30
+ - `hooks/` — session-start · context-guard · pre-compact · subagent-stop
31
31
  - `istartsoft-flow/METHODOLOGY.md` — the full methodology (single source of truth)
32
32
 
33
33
  Plus a root `AGENTS.md` (the open standard) and the per-tool adapter:
package/bin/cli.js CHANGED
@@ -211,9 +211,9 @@ function agentsMd() {
211
211
  '## Roles — `.claude/agents/`', '',
212
212
  'planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer', '',
213
213
  '## Procedures — `.claude/commands/` (run as `/name`)', '',
214
- '/overview · /propose · /phase · /ui-audit · /qa-audit · /security-audit ·',
215
- '/change-request · /replan · /quick · /synthesize · /runbook · /store-wisdom · /log-issue ·',
216
- '/log-decision · /unstuck', '',
214
+ '/overview · /propose · /phase · /sprint · /ui-audit · /qa-audit · /security-audit · /release ·',
215
+ '/uat · /change-request · /replan · /quick · /synthesize · /runbook · /store-wisdom ·',
216
+ '/log-issue · /log-decision · /unstuck', '',
217
217
  '## Skills — `.claude/skills/` (loaded on demand)', '',
218
218
  'caveman · grill-me · karpathy-guidelines · ux-design · security (Secure SDLC) · code-standards', '',
219
219
  '## Autonomy', '',
@@ -230,7 +230,8 @@ function agentsMd() {
230
230
  'change · 9 UI conforms to the `ux-design` cookbook + wireframe frame · 10 no-rationalization ·',
231
231
  '11 Secure SDLC: threat-model → secure coding → SAST/SCA/secrets each phase → pentest',
232
232
  'gate + security review before deploy (`security` skill) · 12 code-standards gate:',
233
- 'lint/format clean + naming per language idiom + declared architecture (`code-standards`).', '',
233
+ 'lint/format clean + naming per language idiom + declared architecture (`code-standards`) ·',
234
+ '13 PLAN-APPROVAL gate: no phase/sprint starts until `docs/PLAN.md` is human-approved.', '',
234
235
  '## Your stack', '',
235
236
  'Declare your stack (language, framework, infra, auth, test + E2E runner,',
236
237
  'planning source) once in `docs/OVERVIEW.md`. Every rule references *your declared',
@@ -290,6 +291,13 @@ function main() {
290
291
  writeFile(rel, fs.readFileSync(src, 'utf8'));
291
292
  }
292
293
 
294
+ // 1b. integrity: confirm the methodology resolved on disk (load-bearing sentinel).
295
+ const methPath = path.join(CWD, '.claude', 'istartsoft-flow', 'METHODOLOGY.md');
296
+ const SENTINEL = 'ISTARTSOFTFLOW-AGENTS-SENTINEL-v2.0';
297
+ if (!DRY && (!fs.existsSync(methPath) || !fs.readFileSync(methPath, 'utf8').includes(SENTINEL))) {
298
+ warnings.push(`integrity: ${SENTINEL} not found in installed METHODOLOGY.md — the kit may be incomplete; re-run create-issflow (or npm run build from source).`);
299
+ }
300
+
293
301
  // 2. AGENTS.md — the open-standard entry point.
294
302
  writeFile('AGENTS.md', agentsMd());
295
303
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-issflow",
3
- "version": "1.2.1",
3
+ "version": "1.4.0",
4
4
  "description": "Scaffold the iStartSoftFlow AI-coding workflow into a project. Stack-agnostic, tool-agnostic (Claude Code, Codex, Cursor, Gemini, Aider), non-destructive.",
5
5
  "bin": {
6
6
  "create-issflow": "bin/cli.js"
@@ -1,5 +1,6 @@
1
1
  ---
2
2
  name: e2e-runner
3
+ description: Writes and runs functional browser E2E (your declared E2E runner, e.g. Playwright) BLIND — reads only the acceptance spec + docs/ENDPOINTS.md, never the implementation. Writes a trace to docs/research/e2e-<phase-slug>.md; returns a terse summary.
3
4
  tools: Read, Grep, Glob, Write, Bash
4
5
  model: opus
5
6
  ---
@@ -43,6 +43,12 @@ window. If a phase feels big, split it.
43
43
  money, or PII), add a `security:` note: threat-model it (STRIDE) and fold abuse
44
44
  cases into the acceptance criteria as negative cases; set the ASVS level (default
45
45
  L2). This is the design stage of the Secure SDLC (`security` skill).
46
+ - SPRINT-READY (so the optional `/sprint` layer needs no rework): give every phase a
47
+ relative effort estimate `[N pts]` (Fibonacci 1/2/3/5/8) in its header, and group
48
+ consecutive phases under `## Sprint <n>: <name> [goal: <one-line increment>]`
49
+ headers — each sprint a coherent, demoable theme of a few phases. If you cannot
50
+ size a sprint yet, still tag the points; `/sprint plan` will do the grouping from
51
+ the points + capacity. A phase that feels `>8 pts` is too big — split it.
46
52
 
47
53
  LAST PHASE RULE — the final code phase (the highest-numbered phase you write)
48
54
  MUST contain a deployment task block:
@@ -61,11 +67,19 @@ docs/PLAN.md format:
61
67
 
62
68
  # Plan: <project>
63
69
  <!-- infra: managed (Phase 0 N/A) | self-managed (Phase 0 below) -->
70
+ > Approval: PENDING (hard rule 13 — PLAN-APPROVAL gate; no phase/sprint runs until a human signs this off via the `/overview` gate)
71
+
72
+ Keep the header VALUE a single leading token — `PENDING` here, later
73
+ `approved <date> v<n>` — so the gate readers (`/phase`, `/sprint`) match the first
74
+ token unambiguously. Do not put prose containing the word `approved` after a
75
+ `PENDING` value, or a substring check could false-pass the gate.
64
76
 
65
77
  ## Phase 0: infra setup [status: pending] ← omit entirely if infra is managed
66
78
 
67
79
 
68
- ## Phase 1: <name> [status: pending]
80
+ ## Sprint 1: <name> [goal: <one-line user-visible increment>] ← sprint headers optional; group a few phases
81
+
82
+ ## Phase 1: <name> [5 pts] [status: pending]
69
83
 
70
84
  - slice: <what works end-to-end after this phase>
71
85
  - rationale: <why this slice, why now — the user / business value (from the PRD)>
@@ -90,4 +104,5 @@ docs/PLAN.md format:
90
104
 
91
105
  ```
92
106
  Order phases by dependency. Phase 0 first IF infra is self-managed; otherwise
93
- start at Phase 1. Stop. Do not implement.
107
+ start at Phase 1. Always write the `> Approval: PENDING` header — the plan is unapproved
108
+ until the `/overview` PLAN-APPROVAL gate stamps it (hard rule 13). Stop. Do not implement.
@@ -21,6 +21,9 @@ Do NOT touch docs/ENDPOINTS.md — owned by implementer.
21
21
  - what was just completed (1-3 bullets)
22
22
  - the immediate next action
23
23
  - any open blocker
24
+ PRESERVE verbatim (never blank on rewrite): the `plan:` line (the PLAN-APPROVAL
25
+ sign-off record, hard rule 13) and the `sprint:` line (active-sprint marker) if
26
+ present — load-bearing gate/standup state, not transient progress.
24
27
  Target: under 25 lines.
25
28
 
26
29
  2. ISSUES.md — dedup + compress:
@@ -31,8 +31,12 @@ peek at, your blindness is STRUCTURAL, not honor-system.
31
31
 
32
32
  ## TWO SUITES — write BOTH
33
33
 
34
- 1. MOCK suite — fast, no external dependency. Mocks ONLY the external boundary.
35
- No mocks on the external boundary. Code/API-level — not browser E2E.
34
+ 1. MOCK suite — fast, no external dependency. Mocks ONLY the external boundary
35
+ (the network / 3rd-party seam). Code/API-level — not browser E2E.
36
+ 2. REAL API suite — the SAME tests with no mocks, hitting the real external
37
+ boundary. The phase gate runs against THIS suite (rules 5–6); a green mock
38
+ suite alone can never close a phase. Mock vs real is a fixture/env FLAG on the
39
+ same test (see Test placement), not a duplicated file.
36
40
 
37
41
  ## Test placement (regression layout)
38
42
 
@@ -44,7 +44,10 @@ gate — always interactive).
44
44
  - **Approved** -> set CR status `approved`; bump PROPOSAL.md to a new version (vN+1)
45
45
  with the delta folded in; re-render `docs/proposal.html` from it (same template +
46
46
  language); then dispatch `/replan` to apply the phase changes to PLAN.md (done
47
- phases stay frozen). Update STATE.md.
47
+ phases stay frozen). Update STATE.md. NOTE: `/replan` reverts PLAN.md to
48
+ `> Approval: PENDING` and re-runs the PLAN-APPROVAL gate (hard rule 13) — the
49
+ commercial CR sign-off is SEPARATE from the plan sign-off, so `/phase` and
50
+ `/sprint` stay blocked until you also re-approve the revised plan.
48
51
  - **Rejected** -> set CR status `rejected`; PLAN + PROPOSAL unchanged.
49
52
 
50
53
  ## STEP 6 — RECORD
@@ -75,6 +75,20 @@ Store the round-1 answers as working context — do NOT write OVERVIEW.md yet.
75
75
 
76
76
  ---
77
77
 
78
+ ### Foundations sign-off (confirm BEFORE planning)
79
+
80
+ 5b. Before the `planner` runs, present the FOUNDATIONS for explicit human confirmation
81
+ — the whole plan is built on these, so lock them first. Show a concise summary and
82
+ STOP for sign-off (planning always asks, both modes):
83
+ - **Tech stack** — language · framework · infra · auth · datastore · test + E2E runner
84
+ - **Architecture** — the pattern (Feature-Based by default) + the folder layout
85
+ - **UX direction** — design system / tokens + the wireframe baseline (the frame)
86
+ - **Data & integrations** — core data model + external services + their limits
87
+ - **Conventions** — naming idiom (`code-standards`) + autonomy mode (AUTO / GUIDED)
88
+ - **Estimation config** — unit · rate card · currency · contingency (if quoting)
89
+ On any "change X" → revise OVERVIEW.md and re-confirm. Only a signed-off foundation
90
+ proceeds to the planner. (This is the planning confirmation gate.)
91
+
78
92
  ### Plan
79
93
 
80
94
  6. Hand OVERVIEW.md + design-research findings to the `planner` subagent.
@@ -89,6 +103,7 @@ Store the round-1 answers as working context — do NOT write OVERVIEW.md yet.
89
103
  # STATE
90
104
 
91
105
  phase: 0 (pending)
106
+ plan: PENDING
92
107
  completed: project bootstrapped — design research done, double grill done
93
108
  blocker: none
94
109
 
@@ -97,17 +112,31 @@ blocker: none
97
112
 
98
113
  9. Create empty docs/HISTORY.md.
99
114
 
100
-
101
- 11. Create docs/ENDPOINTS.md:
115
+ 10. Create docs/ENDPOINTS.md:
102
116
  ```
103
117
  # Endpoints — <project name>
104
118
  > Maintained by implementer. Updated each phase.
105
119
  > Base URL: (populated after deployment phase)
106
120
  ```
107
121
 
108
- Then stop and show me PLAN.md for approval before any phase starts. Planning ends
109
- with a human sign-off in both modes; AUTO only governs the development loop that
110
- runs AFTER the plan is approved.
122
+ ---
123
+
124
+ ### PLAN-APPROVAL gate (hard rule 13 — always interactive, both modes)
125
+
126
+ 11. The plan is the contract the whole AUTO dev loop builds against, so it ends with a
127
+ human sign-off — the planning twin of the `/propose` commercial gate.
128
+
129
+ - SHOW me PLAN.md (and note any open risks the planner flagged). **STOP for approval.**
130
+ - On **approval**: record the sign-off in three places —
131
+ 1. stamp the PLAN.md header `> Approval: approved <YYYY-MM-DD> v1`;
132
+ 2. set `plan: approved <YYYY-MM-DD>` in docs/STATE.md;
133
+ 3. append `<YYYY-MM-DD> plan v1 approved` to docs/HISTORY.md (date-first, to
134
+ match the other HISTORY lines).
135
+ Only now may `/phase` / `/sprint` run.
136
+ - On **rejection / change**: revise (re-run the `planner`, or `/replan`), bump the
137
+ version, and re-show. The header stays `PENDING` until I approve.
138
+
139
+ AUTO governs the development loop that runs AFTER this gate, never the gate itself.
111
140
 
112
141
  Optional next step (client / quoted work only): run `/propose` to turn this
113
142
  OVERVIEW + PLAN into a proposal + estimate for sign-off before building. Internal or
@@ -14,12 +14,17 @@ Target phase: $ARGUMENTS (default: the phase marked pending in docs/PLAN.md)
14
14
 
15
15
  ## 0. PRE-FLIGHT
16
16
 
17
- a. INFRA CHECK (phases > 0): Read the declared infra in docs/OVERVIEW.md.
17
+ a. PLAN-APPROVAL CHECK (hard rule 13): Read the docs/PLAN.md `> Approval:` header.
18
+ Still `PENDING` (or no header) -> STOP. The plan is not signed off; no phase may
19
+ start. Route me to the `/overview` PLAN-APPROVAL gate (or `/replan` then re-approve).
20
+ Approved -> continue.
21
+
22
+ b. INFRA CHECK (phases > 0): Read the declared infra in docs/OVERVIEW.md.
18
23
  - Managed infra -> confirm it is reachable; no provisioning step is needed.
19
24
  - Self-managed infra -> confirm Phase 0 (infra) ran and is healthy.
20
25
  Surface infra + auth status before any work. Blocked infra -> STOP.
21
26
 
22
- b. PHASE STATE CHECK: Read docs/STATE.md and docs/PLAN.md.
27
+ c. PHASE STATE CHECK: Read docs/STATE.md and docs/PLAN.md.
23
28
  - No phase in progress, requested is next pending -> START at step 1.
24
29
  - Same phase in-progress -> RESUME from STATE.md "next action".
25
30
  - Different phase in-progress -> STOP. Tell me which phase is open.
@@ -27,7 +32,7 @@ b. PHASE STATE CHECK: Read docs/STATE.md and docs/PLAN.md.
27
32
  phase in PLAN order. GUIDED: STOP, warn, proceed only if I confirm.
28
33
  - Phase not in PLAN.md -> STOP. Suggest /overview or /replan.
29
34
 
30
- c. FINAL PHASE CHECK: Read docs/PLAN.md. Is this the last phase (no further
35
+ d. FINAL PHASE CHECK: Read docs/PLAN.md. Is this the last phase (no further
31
36
  pending phases after this one)? Record this as IS_FINAL_PHASE=true/false.
32
37
 
33
38
 
@@ -181,6 +186,12 @@ SECURITY GATE (rule 11 — Secure SDLC build stage):
181
186
 
182
187
  Mark phase `done` in docs/PLAN.md.
183
188
 
189
+ SPRINT STANDUP (if a sprint is active — STATE.md shows `sprint: <n> (active)`):
190
+ fire the `/sprint standup` tick — append the one-line standup to
191
+ docs/sprints/sprint-<n>.md and update the burndown (rule: SPRINT-STANDUP ritual).
192
+ If all the sprint's committed phases are now done/blocked, recommend `/sprint review`
193
+ (or, under `/sprint run`, the driver proceeds to review automatically).
194
+
184
195
  ARCHITECTURE SELF-CHECK: did this phase add/remove/rename an agent, hook, or
185
196
  command, or change a workflow rule? YES -> run `/log-decision`. NO -> state why not.
186
197
 
@@ -221,10 +232,12 @@ After each step, update docs/STATE.md:
221
232
  ```
222
233
 
223
234
  phase: <n> (in progress)
235
+ plan: approved <date> ← carry forward; never drop the rule-13 sign-off record
224
236
  tdd: <true|false>
225
237
  completed: <steps done so far>
226
238
  next: <exact next step>
227
239
  blocker: <none or open issue>
228
240
 
229
241
  ```
230
- Keep STATE.md small — overwrite, do not append.
242
+ Keep STATE.md small — overwrite, do not append. Preserve the `plan:` line on every
243
+ overwrite (the PLAN-APPROVAL record, hard rule 13); do not blank it.
@@ -13,6 +13,12 @@ A proposal is a commercial gate: always interactive (both AUTO and GUIDED).
13
13
  Read `docs/OVERVIEW.md` (scope, stack, success criteria) and `docs/PRD.md` if
14
14
  present (else the PRD in your BMAD/iSSM). No OVERVIEW -> run `/overview` first.
15
15
 
16
+ PLAN-APPROVAL CHECK (hard rule 13): the proposal prices the *approved* phases, so
17
+ the plan is signed off first (lifecycle: plan → proposal). If `docs/PLAN.md` exists
18
+ and its `> Approval:` header still reads `PENDING` (or is missing), STOP and route me
19
+ to the `/overview` PLAN-APPROVAL gate before quoting — pricing an unapproved plan
20
+ re-prices on every revision.
21
+
16
22
  ## STEP 1 — SCOPE
17
23
  List the deliverables (features / epics) from OVERVIEW / PRD. Mark each
18
24
  **in-scope** or **out-of-scope** explicitly — naming out-of-scope items now is what
@@ -57,12 +63,13 @@ change-orders re-price against.
57
63
  ## Sign-off — approved by: ___ date: ___ version: v1
58
64
  ```
59
65
  2. RENDER a client-facing `docs/proposal.html` from `.claude/templates/proposal.html`:
60
- copy it, replace every `{{PLACEHOLDER}}`, and LOCALISE all labels + content to the
61
- declared language (natural Thai for Thai projects; keep tech terms in English).
62
- Fill `{{COMPANY}}` / `{{LOGO}}` from the ISSUING company's brand declared in
63
- OVERVIEW (or ask once) the template is white-label, never hardcode the kit's
64
- name. It is print-ready (Save as PDF). Keep PROPOSAL.md and proposal.html in sync —
65
- the markdown is the source, the HTML is the deliverable you send the client.
66
+ copy it, replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared
67
+ language (the section labels are already bilingual TH / EN). It must fit ONE A4
68
+ page be terse (≈ 3–6 phase rows, 4 assumptions, short scope items); trim before
69
+ it spills to a second page. Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}`
70
+ from the ISSUING company's brand declared in OVERVIEW (or ask once) white-label,
71
+ never hardcode the kit's name. Print-ready (Ctrl/Cmd-P A4 Save as PDF). Keep
72
+ PROPOSAL.md (source) and proposal.html (deliverable) in sync.
66
73
 
67
74
  ## STEP 6 — SIGN-OFF GATE
68
75
  Show me the proposal. **STOP for approval** (commercial gate — always interactive).
@@ -14,7 +14,7 @@ Use `/quick` when ALL hold:
14
14
  - not mid-phase
15
15
 
16
16
  If any fail -> STOP, tell me, recommend `/phase`.
17
- (Hard rule 11: never route phase-worthy work through `/quick` to dodge the RED gate.)
17
+ (Hard rule 10: never route phase-worthy work through `/quick` to dodge the RED gate.)
18
18
 
19
19
  Steps:
20
20
  1. grep docs/ISSUES.md for anything related.
@@ -0,0 +1,51 @@
1
+ ---
2
+ description: Pre-production release pipeline — after all build phases, run the full automated gauntlet (full regression: functional / integration / e2e · all audits: UI / QA / security / code · smoke test), then hand off to manual UAT, drive the defect loop to green, produce a sign-off document, and promote to production. The automated SDLC backbone; production deploy is a human-signed hard-stop.
3
+ argument-hint: [optional: target env]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR.
7
+
8
+ Run this AFTER every build `/phase` is done (the candidate is on staging/preview).
9
+ AUTO runs all AUTOMATED stages without stopping; it STOPS only at the human gates —
10
+ UAT execution, sign-off, and the production promote (security/irreversible hard-stops).
11
+ Record progress in STATE.md so a resumed session continues mid-pipeline.
12
+
13
+ ## STAGE 1 — FULL REGRESSION (auto)
14
+ Run the whole REAL corpus end-to-end: **functional + integration + e2e**
15
+ (`scripts/regression.sh --real`, then the declared E2E runner via `e2e-runner`).
16
+ Any red → `debugger` (cap 3) → fix → re-run. Must be 100% green to proceed.
17
+
18
+ ## STAGE 2 — AUTO AUDITS (auto)
19
+ Run every whole-product audit and fold results together:
20
+ - `/ui-audit` · `/qa-audit` · `/security-audit`
21
+ - **code cleaning**: lint + format (the language's standard tool) must be clean
22
+ - **code optimization**: a pass for dead code, obvious N+1 / perf, bundle bloat
23
+ Collect every BLOCKER / HIGH / CRITICAL. Open blocker → fix → re-audit. (Security
24
+ fixes surface for sign-off — security is an autonomy hard-stop.)
25
+
26
+ ## STAGE 3 — SMOKE TEST (auto)
27
+ Deploy the candidate to staging/preview; run the **smoke suite**: app boots, health
28
+ endpoint 200, the critical happy paths load, no console/server errors. Fail → STOP, fix.
29
+
30
+ ## STAGE 4 — UAT HANDOFF (human)
31
+ Dispatch `/uat`: generate the all-case scenario document, hand it to the testers, and
32
+ WAIT. Capture their pasted results into `docs/UAT-<date>.md`. (UAT is a human gate.)
33
+
34
+ ## STAGE 5 — UAT DEFECT LOOP
35
+ For each issue/bug reported: log to `docs/ISSUES.md` (repro from the scenario), fix
36
+ (`implementer`/`debugger`), re-run STAGE 1–3 for the touched area, then resubmit ONLY
37
+ the failed scenarios via `/uat`. Loop until ALL scenarios PASS.
38
+
39
+ ## STAGE 6 — SIGN-OFF (human)
40
+ Produce `docs/SIGNOFF-<date>.md`: scope delivered · test + audit results summary · UAT
41
+ pass confirmation · known limitations · the approver/date line. **STOP for human
42
+ sign-off** — a release gate, always interactive in both modes.
43
+
44
+ ## STAGE 7 — PROMOTE TO PRODUCTION (hard-stop)
45
+ On a SIGNED sign-off only: deploy to production, smoke-test prod (health 200), update
46
+ `docs/ENDPOINTS.md` base URL, tag the release. HISTORY line: `released v<n> (<date>)`.
47
+
48
+ ## STAGE 8 — GO-LIVE & SUPPORT
49
+ Enter after-go-live support (hypercare): watch for incidents, keep the issue log live.
50
+ New scope → `/change-request` (impact + re-price + sign-off). The project is live; the
51
+ loop continues through change requests.
@@ -58,8 +58,13 @@ commercial impact (split/merge/reorder, a discovered technical re-slice).
58
58
  reconciled corpus still passes against live services. A failure -> surface it
59
59
  and stop before approval.
60
60
 
61
- 6. SHOW ME the revised phase list + the regression-corpus changes, and STOP for
62
- approval.
61
+ 6. PLAN-APPROVAL gate (hard rule 13). A re-plan reshapes UNBUILT scope, so it reverts
62
+ the plan to unapproved: set the PLAN.md `> Approval:` header back to `PENDING`, SHOW
63
+ ME the revised phase list + the regression-corpus changes, and STOP for approval.
64
+ On approval: re-stamp the header `approved <date> v<n+1>`, update STATE.md `plan:`,
65
+ and append `<date> plan v<n+1> approved (replan)` to docs/HISTORY.md (date-first,
66
+ matching the other HISTORY lines). `/phase` and `/sprint` stay blocked until this
67
+ re-stamp.
63
68
 
64
69
  7. ARCHITECTURE SELF-CHECK: re-planning is not normally a kit-architecture
65
70
  change. Only run /log-decision if the workflow itself changed (rare).
@@ -0,0 +1,233 @@
1
+ ---
2
+ description: The Scrum sprint layer — group PLAN phases into time-/scope-boxed sprints and run the full ceremony set (planning → standups → review/demo → retrospective → close) with burndown + velocity. AUTO-facilitated: the orchestrator runs every ceremony itself and drives the sprint end-to-end without stopping, pausing only at the real hard-stops. The layer between PLAN (backlog) and PHASE (build loop).
3
+ argument-hint: [run|plan|standup|review|retro|close|status] [sprint number]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR / SCRUM MASTER. You FACILITATE the
7
+ ceremonies and ROUTE build work to subagents — you do NOT implement or debug yourself.
8
+
9
+ Subcommand: $ARGUMENTS (default: `status`)
10
+
11
+ Hierarchy: **PLAN (product backlog) → SPRINT (committed slice of phases) → PHASE
12
+ (the build loop)**. A sprint groups consecutive PLAN phases behind ONE sprint goal
13
+ and ships ONE deployable increment. Phases still run via `/phase` exactly as before
14
+ — the sprint layer wraps them with planning, standups, a review, and a retro.
15
+
16
+ **AUTONOMY (read first).** Sprint planning only SLICES the already-approved
17
+ `docs/PLAN.md` — the requirements gate already happened at `/overview` plan approval —
18
+ so the ceremonies are AUTO-safe and the orchestrator runs them WITHOUT stopping.
19
+ - **AUTO (default):** `/sprint run` drives the whole sprint hands-off — plan → loop
20
+ `/phase` → standup tick after each phase → review → retro → close → roll forward →
21
+ start the next sprint. Decisions (points, scope-fit, accept/carry) are made from the
22
+ PLAN + velocity, logged, and the run continues. Pause ONLY for a methodology
23
+ hard-stop (deploy/irreversible/outbound, security-sensitive change, contradictory
24
+ spec, or debug budget spent with no independent slice left).
25
+ - **GUIDED:** each ceremony presents its result and waits for you before the next.
26
+ The PLAN-approval, commercial (`/propose`, `/change-request`), and release
27
+ (`/release`, `/uat`, prod promote) gates are SEPARATE and stay interactive in both
28
+ modes — the sprint layer never auto-passes them.
29
+
30
+ Artifacts: `docs/sprints/sprint-<n>.md` (one per sprint — goal, committed phases,
31
+ burndown, standups, review, retro) and `docs/sprints/VELOCITY.md` (the rolling
32
+ velocity table). Create `docs/sprints/` if absent. STATE.md carries the active sprint.
33
+
34
+ =====================================================================
35
+ ## ROUTER
36
+
37
+ - `run` → §RUN (AUTO end-to-end driver — the default way to use this)
38
+ - `plan` → §1 PLANNING
39
+ - `standup` → §2 STANDUP
40
+ - `review` → §3 REVIEW
41
+ - `retro` → §4 RETRO
42
+ - `close` → §5 CLOSE
43
+ - `status` → §STATUS (default when no subcommand)
44
+
45
+ =====================================================================
46
+ ## §1 — SPRINT PLANNING (ceremony)
47
+
48
+ Pre: `docs/PLAN.md` exists AND its `> Approval:` header reads `approved …` (the
49
+ PLAN-APPROVAL gate, hard rule 13). Still `PENDING` / missing → STOP, route to the
50
+ `/overview` plan-approval gate. A sprint only SLICES an already-signed-off plan.
51
+
52
+ a. **Estimate (one-time, lazy).** Every pending PLAN phase needs a points estimate
53
+ (Fibonacci `1 2 3 5 8`, relative effort from the phase `slice` + `acceptance`
54
+ size; a phase that feels `>8` is too big — note it for `/replan` to split). If the
55
+ planner already wrote `[N pts]` tags, reuse them; otherwise assign now and write
56
+ them back into PLAN.md next to each phase header.
57
+
58
+ b. **Capacity.** Read `docs/sprints/VELOCITY.md`.
59
+ - Have history → capacity = rolling-average completed velocity (last ≤3 sprints).
60
+ - First sprint (no history) → capacity = `flow-config.json` `sprint.defaultCapacity`
61
+ (fallback 8 pts).
62
+
63
+ c. **Commit.** Walk the PLAN in dependency order, pull pending phases into this sprint
64
+ until the next phase would exceed capacity. Don't split a phase across a sprint
65
+ boundary; respect dependencies (never commit a phase whose dependency is in a later
66
+ sprint). Keep one coherent theme → that becomes the **sprint goal** (one line: the
67
+ user-visible increment this sprint ships). Optionally mark 1 phase `stretch`.
68
+
69
+ d. **Write** `docs/sprints/sprint-<n>.md` from the template below; set
70
+ `status: active`; seed the burndown tick 0 = total committed points. Group the
71
+ committed phases under a `## Sprint <n>` header in PLAN.md if not already grouped.
72
+ Update STATE.md: `sprint: <n> (active)`.
73
+
74
+ AUTO: auto-commit the computed backlog, log the goal + points + capacity, continue.
75
+ GUIDED: present goal + committed phases + points, wait for confirm.
76
+
77
+ =====================================================================
78
+ ## §2 — STANDUP (auto-tick — fires once per phase close inside an active sprint)
79
+
80
+ The AI dev loop has no calendar days, so the "daily" standup is rebound to a
81
+ **per-phase-close tick** — the natural cadence of progress. After each `/phase` CLOSE
82
+ while a sprint is active (the `/phase` command fires this; `/sprint run` fires it
83
+ inline; or run `/sprint standup` by hand):
84
+
85
+ 1. Append a standup line to the active sprint doc:
86
+ `- tick <k> (Phase <p> <done|blocked>): done <what>; next <phase/none>; blockers <none|ref>`
87
+ 2. Update the **burndown**: append a row `tick <k> | Phase <p> <state> | <remaining pts>`
88
+ where remaining = committed points minus points of phases now `done`. Re-render the
89
+ ASCII sparkline.
90
+ 3. Surface blockers immediately if any (a blocked phase is the standup's whole point).
91
+ AUTO: the blocker is already parked per the circuit breaker — just record it here
92
+ and keep the burndown honest. GUIDED: relay it.
93
+
94
+ Keep it ONE line per tick. No prose. The burndown is the signal.
95
+
96
+ =====================================================================
97
+ ## §3 — SPRINT REVIEW / DEMO (ceremony — at sprint boundary)
98
+
99
+ Run when every committed phase is `done` or `blocked` (sprint timebox reached).
100
+
101
+ a. **Demo.** Summarise the shipped increment: for each accepted phase, the
102
+ user-visible behaviour now working (pull from the phase `slice` + `docs/ENDPOINTS.md`).
103
+ This is the "done = demoable" check — a phase that can't be demoed isn't done.
104
+
105
+ b. **Boundary audits.** Run the whole-product audits ONCE for the increment (cheaper
106
+ here than per-phase, broader than the inline gates):
107
+ `/ui-audit` (if UI shipped) · `/qa-audit` · `/security-audit`. Fold the scores in.
108
+ Open BLOCKER/HIGH/CRITICAL → route to FIX (`debugger`/`implementer`), re-audit.
109
+ (Security findings remain an autonomy hard-stop.)
110
+
111
+ c. **Accept / carry.** Mark each phase `accepted` (demoed + audits clean) or
112
+ `carried` (not done / failed audit → rolls to the next sprint at §5).
113
+
114
+ d. Write the `## Review` block into the sprint doc (demo bullets, audit scores,
115
+ accepted vs carried).
116
+
117
+ =====================================================================
118
+ ## §4 — RETROSPECTIVE (ceremony — after review)
119
+
120
+ Inspect-and-adapt on the PROCESS, not the product. Write the `## Retro` block:
121
+
122
+ - **went well** — what to keep (2–4 bullets).
123
+ - **didn't** — friction, repeated debugging, churned tests, estimate misses.
124
+ - **actions** — each a CONCRETE, routed change, not a wish. Route every action to a
125
+ durable home so it actually happens:
126
+ - a recurring bug/root-cause pattern → it's already in `docs/ISSUES.md`; note the ref.
127
+ - a workflow/structure change → `/log-decision` (`docs/DESIGN_LOG.md`).
128
+ - an ops/incident lesson → `/runbook`.
129
+ - a plan correction (re-estimate, split, reorder) → `/replan`.
130
+ - a durable, cross-project lesson → flag for `/store-wisdom`.
131
+ - **estimate accuracy** — committed vs completed points; note phases that blew their
132
+ estimate so the next sprint's poker is calibrated.
133
+
134
+ AUTO: auto-apply the routed actions (log/replan) and continue. GUIDED: list actions,
135
+ confirm before applying.
136
+
137
+ =====================================================================
138
+ ## §5 — SPRINT CLOSE
139
+
140
+ a. **Velocity.** completed = sum of `accepted` phase points. Append a row to
141
+ `docs/sprints/VELOCITY.md`:
142
+ `| <n> | <committed> | <completed> | <goal met? yes/no> |` and recompute the rolling
143
+ average (last ≤3 sprints).
144
+ b. **Carry forward.** Each `carried`/`blocked` phase stays pending in PLAN.md — the
145
+ next `/sprint plan` re-commits it first (carried work has priority). Don't lose it.
146
+ c. Set the sprint doc `status: done`; stamp the close date. HISTORY line:
147
+ `sprint <n> closed — <completed>/<committed> pts, goal <met|missed> (<date>)`.
148
+ d. Update STATE.md: clear the active sprint (or set the next one if `/sprint run`
149
+ continues).
150
+
151
+ =====================================================================
152
+ ## §RUN — AUTO END-TO-END DRIVER (the headline: "do all the process automatically")
153
+
154
+ `/sprint run [n]` drives one full sprint — or, if you keep going, every remaining
155
+ sprint until the PLAN is exhausted — with NO human stop except a hard-stop:
156
+
157
+ ```
158
+ loop while pending phases remain in PLAN.md:
159
+ 1. §1 PLANNING → commit the next sprint from PLAN + velocity
160
+ 2. for each committed phase, in dependency order:
161
+ run /phase <p> → the full build loop (its own gates + circuit breaker)
162
+ §2 STANDUP tick → append standup + update burndown
163
+ phase BLOCKED (circuit breaker parked it) → record, keep going to the next
164
+ INDEPENDENT phase; if none remain, end the sprint early (timebox)
165
+ 3. §3 REVIEW → demo + boundary audits (fix blockers, re-audit)
166
+ 4. §4 RETRO → routed actions, applied
167
+ 5. §5 CLOSE → velocity + carry-forward + HISTORY
168
+ 6. /synthesize → suggest /clear (token reset at the sprint boundary, like a phase)
169
+ AUTO: start the next sprint automatically. GUIDED: stop, report, wait.
170
+ HARD-STOP at any point: deploy/irreversible/outbound action, security-sensitive
171
+ change, contradictory spec, or debug budget spent with no independent slice left →
172
+ pause, surface the consolidated report, hand to the human.
173
+ ```
174
+
175
+ When the last PLAN phase is `accepted`, the build is sprint-complete → recommend
176
+ `/release` (the pre-production pipeline) as the next step. Do NOT auto-promote to prod
177
+ — that is a separate, human-signed hard-stop.
178
+
179
+ =====================================================================
180
+ ## §STATUS
181
+
182
+ Read STATE.md + the active `docs/sprints/sprint-<n>.md` + VELOCITY.md and print:
183
+ sprint number + goal, status, the burndown sparkline, committed vs done points,
184
+ the current/next phase, any open blockers, and rolling velocity. One screen. No edits.
185
+
186
+ =====================================================================
187
+ ## SPRINT DOC TEMPLATE (`docs/sprints/sprint-<n>.md`)
188
+
189
+ ```
190
+ # Sprint <n> — <short name>
191
+ goal: <one line — the user-visible increment this sprint ships>
192
+ status: active # planning | active | review | done
193
+ capacity: <cap> pts (basis: velocity avg | default)
194
+
195
+ ## Committed
196
+ - Phase <p>: <name> [<pts> pts] [status: pending|done|blocked|accepted|carried]
197
+ - ...
198
+ ## Stretch
199
+ - Phase <q>: <name> [<pts> pts] # optional, pulled in only if capacity frees up
200
+
201
+ ## Burndown
202
+ tick | event | remaining pts
203
+ 0 | sprint start | <total>
204
+ 1 | Phase <p> done | <rem>
205
+ ...
206
+ <ascii sparkline of remaining pts, e.g. 8 ▆▅▃▂ 0>
207
+
208
+ ## Standups
209
+ - tick 1 (Phase <p> done): done <what>; next Phase <q>; blockers none
210
+ - ...
211
+
212
+ ## Review (<date>)
213
+ - demo: <increment shipped — user-visible behaviour now working>
214
+ - audits: ui <score|n/a> · qa <score> · security <score> · code <clean|issues>
215
+ - accepted: <phases> carried: <phases or —>
216
+
217
+ ## Retro (<date>)
218
+ - went well: ...
219
+ - didn't: ...
220
+ - actions: <each routed → ISSUES | DESIGN_LOG | RUNBOOK | replan | store-wisdom>
221
+ - estimates: committed <c> pts / completed <d> pts — <misses noted>
222
+ ```
223
+
224
+ ## VELOCITY TEMPLATE (`docs/sprints/VELOCITY.md`)
225
+
226
+ ```
227
+ # Velocity
228
+ | sprint | committed | completed | goal met? |
229
+ |--------|-----------|-----------|-----------|
230
+ | 1 | <c> | <d> | yes/no |
231
+
232
+ rolling avg (last ≤3): <v> pts/sprint
233
+ ```
@@ -0,0 +1,36 @@
1
+ ---
2
+ description: Manual UAT cycle — generate an all-case test-scenario document for human testers, hand it off, capture their pasted results, and drive the defect loop until every scenario passes. Used inside /release; the human-in-the-loop acceptance gate.
3
+ argument-hint: [optional: feature scope, or "failed" to re-issue only failures]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR.
7
+
8
+ UAT is a HUMAN gate: real testers run the product and report results. Your job is to
9
+ make that easy — produce a clear scenario sheet, capture results, and loop on defects.
10
+
11
+ ## STEP 1 — BUILD SCENARIOS
12
+ From `docs/OVERVIEW.md` (flows) + `docs/PLAN.md` (acceptance) + `docs/ENDPOINTS.md`,
13
+ write `docs/UAT-<date>.md` covering ALL cases a tester should run:
14
+ ```
15
+ ## UAT — <project> (<date>, build <ref>)
16
+ | # | scenario | preconditions | steps | expected | Result (PASS/FAIL) | Notes |
17
+ |---|----------|---------------|-------|----------|--------------------|-------|
18
+ | 1 | … | … | … | … | | |
19
+ ```
20
+ Cover: every happy path, every acceptance criterion, edge / negative cases, each user
21
+ role, and each critical flow. Group by feature, number them, leave Result + Notes
22
+ blank for the tester. Keep steps concrete enough to follow without you.
23
+
24
+ ## STEP 2 — HAND OFF
25
+ Show me the scenario sheet, ready to run. Tell me to execute it (or pass it to QA /
26
+ the client), then **paste the results back** here. WAIT — do not assume results.
27
+
28
+ ## STEP 3 — CAPTURE RESULTS
29
+ Take the pasted results, fill PASS/FAIL + notes into `docs/UAT-<date>.md`, and
30
+ summarise: **X / Y passed**, list the failures with their scenario IDs.
31
+
32
+ ## STEP 4 — DEFECT LOOP
33
+ For each FAIL: log to `docs/ISSUES.md` (repro = the scenario steps), fix
34
+ (`implementer` / `debugger`, debug cap 3), re-run the automated tests for that area,
35
+ then re-issue **only the failed scenarios** to me for re-test. Loop until 100% PASS.
36
+ On all-green, hand back to `/release` for sign-off.
@@ -39,6 +39,21 @@ if (state !== null) {
39
39
  emit('');
40
40
  }
41
41
 
42
+ // 2b. active sprint (sprint layer) — surface goal + burndown if one is active
43
+ const sprintMatch = (state || '').match(/^\s*sprint:\s*(\d+)\s*\(active\)/m);
44
+ if (sprintMatch) {
45
+ const sf = read(`docs/sprints/sprint-${sprintMatch[1]}.md`);
46
+ if (sf !== null) {
47
+ emit(`## Sprint ${sprintMatch[1]} (active)`);
48
+ const goal = (sf.match(/goal:\s*(.+)/i) || [])[1];
49
+ if (goal) emit('goal: ' + goal.trim());
50
+ const burn = sf.split('\n').find((l) => /burndown|remaining|pts? left|[▁▂▃▄▅▆▇█]/i.test(l));
51
+ if (burn) emit('burndown: ' + burn.trim());
52
+ emit(`see docs/sprints/sprint-${sprintMatch[1]}.md for the full sprint.`);
53
+ emit('');
54
+ }
55
+ }
56
+
42
57
  // 3. issue log — inject only OPEN issues (resolved ones stay in the file for
43
58
  // grep, but are NOT re-paid in tokens every session). Capped.
44
59
  const issues = read('docs/ISSUES.md');
@@ -120,6 +135,8 @@ emit('- AUTO mode (default) governs the DEV loop: follow the plan — decide + l
120
135
  emit(' continue, do NOT stop to ask. (Planning / grill still asks — that part is fine.)');
121
136
  emit(' Hard-stops only: security / irreversible-or-outbound actions / contradictory spec.');
122
137
  emit('- caveman ULTRA mode is active.');
138
+ emit('- PLAN-APPROVAL gate (rule 13): no /phase or /sprint while STATE `plan:` reads');
139
+ emit(' PENDING — the plan needs a human sign-off via /overview first.');
123
140
  emit('- before debugging ANY error: grep ISSUES.md AND research/INDEX.md first.');
124
141
  emit('- debug attempts: WARN at 2; cap 3. AUTO: log + park the slice + continue (batched');
125
142
  emit(' report at the phase boundary). GUIDED: stop and ask you.');
@@ -59,6 +59,37 @@ non-TDD before SCAFFOLD fires.
59
59
 
60
60
  -----
61
61
 
62
+ ## Sprint layer (the Scrum wrapper — optional)
63
+
64
+ Between the PLAN (the product backlog) and the PHASE (the build loop) sits an
65
+ optional **sprint layer** (`/sprint`): consecutive PLAN phases are grouped behind ONE
66
+ sprint goal and ship ONE deployable increment, wrapped in the full Scrum ceremony set.
67
+ The hierarchy is **PLAN (backlog) → SPRINT (committed slice) → PHASE (loop)**. Phases
68
+ run unchanged inside a sprint; the layer only adds cadence + inspect-and-adapt around them.
69
+
70
+ Scrum maps onto the kit with no new vocabulary to learn:
71
+
72
+ | Scrum | iStartSoftFlow |
73
+ |-------|----------------|
74
+ | Product Backlog | `docs/PLAN.md` (all phases) |
75
+ | Sprint Backlog | `docs/sprints/sprint-<n>.md` (committed phases + goal) |
76
+ | Scrum Master / Dev Team | the orchestrator (facilitates) / the subagent fleet (builds) |
77
+ | Sprint Planning | `/sprint plan` — slice the approved PLAN into a capacity-bounded sprint |
78
+ | Daily Scrum | `/sprint standup` — rebound to a **per-phase-close tick** (the AI loop has no calendar days) |
79
+ | Sprint Review / demo | `/sprint review` — demo the increment + run the boundary audits |
80
+ | Retrospective | `/sprint retro` — routed, concrete process actions |
81
+ | Increment · Burndown · Velocity | the deployable slice · remaining-points table · completed pts/sprint |
82
+
83
+ **AUTO-facilitated.** Sprint planning only SLICES an ALREADY-APPROVED plan (the
84
+ requirements gate happened at `/overview` plan approval), so the ceremonies are
85
+ AUTO-safe: `/sprint run` drives a whole sprint — or every remaining sprint — hands-off
86
+ (plan → loop `/phase` → standup tick → review → retro → close → next sprint), pausing
87
+ only at a methodology hard-stop. The PLAN-approval, commercial, and release gates are
88
+ SEPARATE and stay interactive (see Autonomy). The layer is opt-in: skip it and drive
89
+ phases directly off the PLAN exactly as before.
90
+
91
+ -----
92
+
62
93
  ## Project lifecycle (real-world delivery)
63
94
 
64
95
  The loop above is the BUILD engine. Around it runs a full client-delivery lifecycle
@@ -68,20 +99,31 @@ from idea to closeout:
68
99
  1. **Discover** — idea → requirements, captured by `/overview` (the double-grill).
69
100
  2. **PRD** — crystallised requirements in `docs/PRD.md` (or your BMAD/iSSM stories).
70
101
  3. **Stack & architecture** — decided in `/overview` design-research → `OVERVIEW.md`.
71
- 4. **Plan** — `/overview`'s `planner` → `docs/PLAN.md` (the vertical-slice phases).
72
- The plan exists before the proposal, because the proposal estimates *these* phases.
102
+ 4. **Plan** — `/overview`'s `planner` → `docs/PLAN.md` (the vertical-slice phases),
103
+ then the **PLAN-APPROVAL gate** (rule 13): build cannot start until a human signs the
104
+ plan off and the approval is recorded. The plan exists before the proposal, because
105
+ the proposal estimates *these* phases.
73
106
  5. **Proposal & estimate (OPTIONAL — depends on the job)** — for client / quoted
74
107
  work, `/propose` reads OVERVIEW + PLAN → `docs/PROPOSAL.md` + a rendered
75
108
  `docs/proposal.html`: scope, phase breakdown, effort + cost estimate, timeline,
76
109
  assumptions, with a **client sign-off gate** before build. Internal / personal
77
110
  projects skip straight from plan to build.
78
- 6. **Build** — the loop, one phase at a time (`/phase`, AUTO dev loop).
111
+ 6. **Build** — the loop, one phase at a time (`/phase`, AUTO dev loop). Each phase's
112
+ tests (unit + integration + e2e) are automated and MUST pass before the next phase.
113
+ Optionally wrap the phases in the **sprint layer** (`/sprint`): group them into
114
+ capacity-bounded sprints, each shipping one demoable increment with planning →
115
+ standups → review → retro. `/sprint run` drives this end-to-end (see Sprint layer).
79
116
  7. **Change mid-flight** — `/change-request`: impact analysis + re-estimate + a logged
80
117
  change order (`docs/CHANGES.md`) + sign-off, then `/replan`. Scope and cost never
81
118
  change silently.
82
- 8. **Deploy** — in the final phase.
83
- 9. **Closeout** `/synthesize` (final pass) → a project summary: what was built, key
84
- decisions, every change order, and the final cost vs the original estimate.
119
+ 8. **Release** — `/release`: full regression (functional/integration/e2e) → auto
120
+ audits (UI / QA / security / code) → smoke **manual UAT** (`/uat`, scenario sheet
121
+ + captured results) defect loop **sign-off** (`docs/SIGNOFF-…`) promote to
122
+ production (a human-signed hard-stop).
123
+ 9. **Go-live & support** — after-go-live hypercare; new scope routes through
124
+ `/change-request`. The project is live; the loop continues.
125
+ 10. **Closeout** — `/synthesize` → a project summary: what was built, key decisions,
126
+ every change order, and the final cost vs the original estimate.
85
127
 
86
128
  **Logging is continuous and total.** Every stage writes to a durable artifact:
87
129
  requirements (PRD / OVERVIEW), commercial (PROPOSAL / CHANGES), execution
@@ -89,9 +131,9 @@ requirements (PRD / OVERVIEW), commercial (PROPOSAL / CHANGES), execution
89
131
  Nothing important lives only in chat — it is on disk, so the project can always be
90
132
  reconstructed and summarised.
91
133
 
92
- **Commercial gates are always interactive** (both modes): the proposal sign-off and
93
- every change-order approval pause for the human. AUTO governs the *dev loop between*
94
- those gates, never the money decisions.
134
+ **Approval gates are always interactive** (both modes): the **PLAN-APPROVAL** gate
135
+ (rule 13), the proposal sign-off, and every change-order approval pause for the human.
136
+ AUTO governs the *dev loop between* those gates, never the plan or the money decisions.
95
137
 
96
138
  -----
97
139
 
@@ -105,6 +147,7 @@ front-end. They compose — BMAD plans, iStartSoftFlow builds — with no duplic
105
147
  | Analyst / PM / Architect / PO agents | → | `/overview` grill + `researcher` + `planner` |
106
148
  | PRD + Architecture | → | `docs/OVERVIEW.md` (+ `docs/PRD.md`) |
107
149
  | sharded epics / story files | → | `docs/PLAN.md` phases (1 story ≈ 1 phase) |
150
+ | epics / sprint grouping | → | the **sprint layer** (`/sprint`) — phases grouped behind one sprint goal |
108
151
  | SM "story with embedded context" | → | the phase **context package** (rationale + architecture + impl notes + qa focus + sharp acceptance) |
109
152
  | Dev → QA | → | `implementer` → `test-author` + the phase gates (TDD · UX · security · code-standards) |
110
153
 
@@ -149,7 +192,8 @@ can. Escalation is at most two hops.
149
192
  structural, not honor-system. Writes a MOCK suite + a REAL API suite.
150
193
  - **e2e-runner** — writes/runs functional browser E2E (your declared E2E runner,
151
194
  e.g. Playwright) BLIND. Reads only the acceptance spec + `docs/ENDPOINTS.md`,
152
- never the implementation.
195
+ never the implementation. Writes a trace to `docs/research/e2e-<phase-slug>.md`;
196
+ returns a terse summary.
153
197
  - **debugger** — debugs in an ISOLATED context. Writes a trace to
154
198
  `docs/research/debug-<slug>.md`; returns a summary.
155
199
  - **synthesizer** — compresses `docs/STATE.md` / `docs/ISSUES.md`, prunes
@@ -171,7 +215,12 @@ Named procedures, each with a canonical body in `.claude/commands/<name>.md`.
171
215
  a logged change order (`CHANGES.md`) + sign-off, then `replan`.
172
216
  - **phase [n]** — run one phase end-to-end with the circuit breaker. Chooses the
173
217
  TDD or non-TDD order at RESEARCH. CLOSE runs the regression guard + ENDPOINTS
174
- coverage gate.
218
+ coverage gate. When a sprint is active, CLOSE also fires a `/sprint standup` tick.
219
+ - **sprint [run|plan|standup|review|retro|close|status] [n]** — the Scrum wrapper
220
+ around the build loop: slice the approved PLAN into a capacity-bounded sprint, run
221
+ the ceremonies (planning → standups → review/demo + boundary audits → retro → close)
222
+ with burndown + velocity. `/sprint run` drives a whole sprint (or every remaining
223
+ one) AUTO end-to-end. Opt-in; phases run unchanged inside it.
175
224
  - **quick [change]** — small, obvious, non-phase change; no agent chain. Stays
176
225
  non-TDD. Runs the mock regression corpus after the change.
177
226
  - **ui-audit** — whole-product UI audit against the `ux-design` cookbook (a11y /
@@ -183,12 +232,20 @@ Named procedures, each with a canonical body in `.claude/commands/<name>.md`.
183
232
  - **security-audit** — whole-product SECURITY audit against the `security` cookbook
184
233
  (OWASP/ASVS/WSTG/secrets/SCA/SAST/supply-chain); scored report. On-demand; a
185
234
  precondition for the pre-deploy pentest. Distinct from the per-phase rule-11 gate.
235
+ - **release** — the pre-production pipeline (run after all build phases): full
236
+ regression → auto audits → smoke → UAT handoff → defect loop → sign-off → promote
237
+ to production → go-live support. The automated SDLC backbone.
238
+ - **uat** — manual UAT cycle: generate an all-case scenario sheet for human testers,
239
+ capture their results, drive the defect loop to 100% pass. Used inside `release`.
186
240
  - **unstuck** — deep re-research after a circuit breaker (auto-run once in AUTO on
187
241
  first stuck; human-triggered in GUIDED).
188
242
  - **synthesize** — compress STATE.md, dedup ISSUES.md, prune snapshots. Run
189
243
  before a context reset.
190
244
  - **replan** — revise `PLAN.md` (add/cut/split/merge/reorder pending phases) and
191
- reconcile the regression corpus in step.
245
+ reconcile the regression corpus in step. Reshaping unbuilt scope reverts the plan
246
+ to `PENDING` and re-runs the PLAN-APPROVAL gate (rule 13).
247
+ - **runbook** — capture an operational / incident scenario in `docs/RUNBOOK.md` so
248
+ prod-debug knowledge isn't re-derived under pressure.
192
249
  - **log-issue** — append an error to `ISSUES.md` with root cause + failed attempts.
193
250
  - **log-decision** — record an architectural change in `docs/DESIGN_LOG.md`.
194
251
  - **store-wisdom** — promote resolved issues + research to the shared KB.
@@ -205,13 +262,22 @@ inject context, the model performs them itself.
205
262
 
206
263
  At the start of every session, before any other work, surface:
207
264
  1. git state (branch, uncommitted count, last 3 commits).
208
- 2. `docs/STATE.md` — the current position. READ THIS FIRST.
265
+ 2. `docs/STATE.md` — the current position. READ THIS FIRST. If a sprint is active,
266
+ surface its goal + burndown from `docs/sprints/sprint-<n>.md`.
209
267
  3. open items in `docs/ISSUES.md`.
210
268
  4. `docs/research/INDEX.md` (research map) + infra/auth status.
211
269
  5. shared KB: pull latest + load `docs/.kb-snapshot.md` if `.claude/kb-config.json`
212
270
  exists.
213
271
  6. a one-line reminder of the hard rules below.
214
272
 
273
+ ### SPRINT-STANDUP (auto — at phase close inside an active sprint)
274
+
275
+ When a sprint is active, every `/phase` CLOSE fires one standup tick: append a
276
+ one-line entry to the active `docs/sprints/sprint-<n>.md` (done / next / blockers)
277
+ and update the burndown (remaining points + the sparkline). The "daily" Scrum is
278
+ rebound to per-phase-close because the AI dev loop has no calendar days — the phase
279
+ boundary is the real unit of progress. Blockers surface immediately. See `/sprint`.
280
+
215
281
  ### COMPRESS (before a context compaction)
216
282
 
217
283
  Snapshot the live position to `docs/.snapshots/` so a post-compact session can
@@ -223,7 +289,8 @@ The cheapest token is the one never loaded. The kit is built to minimise context
223
289
 
224
290
  - **Phase boundary is the primary reset.** `/synthesize -> /clear` ends every
225
291
  phase so the next one starts with a small, fresh context instead of carrying
226
- the whole history forward.
292
+ the whole history forward. The **sprint boundary** (`/sprint close`) is a second,
293
+ coarser reset — synthesize + clear there too before the next sprint plans.
227
294
  - **Lazy, not always-on.** This methodology + the skills load on demand; only the
228
295
  SessionStart hook output is paid every session, and it injects just the live
229
296
  STATE + *open* issues (resolved ones stay on disk for grep, not re-paid in tokens).
@@ -243,8 +310,8 @@ The cheapest token is the one never loaded. The kit is built to minimise context
243
310
  The kit runs in one of two modes, declared in `docs/OVERVIEW.md` (default: **AUTO**):
244
311
 
245
312
  **Planning always asks; development doesn't.** Asking is cheap and decisive while
246
- *planning* — so `/overview` (the double-grill) and plan approval stay interactive in
247
- both modes. AUTO governs only the **development loop** (implement → test → debug →
313
+ *planning* — so `/overview` (the double-grill) and the **PLAN-APPROVAL gate** (rule 13,
314
+ a recorded sign-off) stay interactive in both modes. AUTO governs only the **development loop** (implement → test → debug →
248
315
  close): there, interruptions are expensive, so it follows the plan instead of asking.
249
316
 
250
317
  - **AUTO (default) — during DEVELOPMENT, follow the plan, don't interrupt.** Once a
@@ -284,7 +351,7 @@ development run that follows the spec and logs every problem so it never recurs.
284
351
 
285
352
  -----
286
353
 
287
- ## Hard rules (1–12)
354
+ ## Hard rules (1–13)
288
355
 
289
356
  1. Before debugging ANY error: grep `docs/ISSUES.md` AND `docs/research/INDEX.md`.
290
357
  The SESSION-OPEN ritual surfaces ISSUES.md — there is no excuse to miss it.
@@ -338,6 +405,16 @@ development run that follows the spec and logs every problem so it never recurs.
338
405
  (the language's standard tool), names follow the language's OWN idiom, and the
339
406
  code conforms to the declared architecture (Feature-Based by default) — checked
340
407
  at CLOSE. Lint/format errors or idiom violations BLOCK the close. (`code-standards`.)
408
+ 13. **PLAN-APPROVAL gate.** No phase / sprint / build work starts until `docs/PLAN.md`
409
+ carries a human approval. `/overview` ends by presenting the plan and STOPPING for
410
+ sign-off; on approval the gate is RECORDED in three places — the PLAN.md
411
+ `> Approval:` header (`approved <date> v<n>`), `plan:` in `docs/STATE.md`, and a
412
+ `plan v<n> approved` line in `docs/HISTORY.md`. `/phase` and `/sprint` REFUSE to
413
+ start while that header still reads `PENDING`. Interactive in BOTH modes: AUTO
414
+ governs the dev loop that runs AFTER approval, never the approval itself — it is
415
+ the planning twin of the commercial sign-off gate (`/propose`). A `/replan` that
416
+ adds or reshapes UNBUILT scope reverts the affected plan to `PENDING` and
417
+ re-surfaces it for confirmation before those phases run.
341
418
 
342
419
  -----
343
420
 
@@ -381,18 +458,35 @@ the KB. The kit works normally without a KB.
381
458
  commands render into `docs/`.
382
459
  - `docs/CHANGES.md` — change-order log (append-only): each scope change with its
383
460
  impact, effort/cost delta, new total, and approval status. The commercial audit trail.
461
+ - `docs/UAT-<date>.md` — UAT scenario sheet (all cases) + captured tester results
462
+ (PASS/FAIL + notes). Drives the release defect loop.
463
+ - `docs/SIGNOFF-<date>.md` — release sign-off: scope delivered, test/audit/UAT
464
+ summary, known limitations, approver — the gate to promote to production.
465
+ - `docs/ui-audit-<date>.md` · `docs/qa-audit-<date>.md` · `docs/security-audit-<date>.md`
466
+ — scored whole-product audit reports (from the `*-audit` commands).
384
467
  - `docs/STATE.md` — current position. Small. Rewritten, not appended.
385
468
  - `docs/ISSUES.md` — error log. Deduped by synthesizer.
386
- - `docs/PLAN.md` — the phase plan. The last phase has the deploy task.
387
- - `docs/HISTORY.md` one line per finished phase.
469
+ - `docs/PLAN.md` — the phase plan (the product backlog). Carries an `> Approval:`
470
+ header `PENDING` until the rule-13 PLAN-APPROVAL gate stamps `approved <date> v<n>`;
471
+ no phase runs while it reads `PENDING`. The last phase has the deploy task. Phases may
472
+ carry a `[N pts]` estimate and be grouped under `## Sprint` headers when the sprint
473
+ layer is used.
474
+ - `docs/sprints/sprint-<n>.md` — one per sprint (sprint layer): goal, committed phases
475
+ + points, burndown, standup log, review (demo + audit scores), retro. Maintained by
476
+ `/sprint`.
477
+ - `docs/sprints/VELOCITY.md` — rolling velocity table (committed vs completed pts per
478
+ sprint). Drives the next sprint's capacity.
479
+ - `docs/HISTORY.md` — one line per finished phase (and per closed sprint).
388
480
  - `docs/DESIGN_LOG.md` — kit architectural rationale (§5.x decision log).
389
481
  - `docs/OVERVIEW.md` — project scope. Written after the double-grill in `overview`.
390
482
  E2E target.
391
483
  - `docs/ENDPOINTS.md` — API/service endpoint catalogue. Maintained by implementer
392
484
  each phase. Drives the CLOSE coverage gate.
485
+ - `docs/RUNBOOK.md` — operational / incident runbook (grep-able): per-scenario
486
+ symptoms, diagnosis, and recovery steps. Maintained by `/runbook`.
393
487
  - `docs/research/` — full research + debug files. `INDEX.md` is the searchable map.
394
488
  `design-<slug>.md` (design research), `<slug>.md` (impl research),
395
- `debug-<slug>.md` (debugger traces).
489
+ `debug-<slug>.md` (debugger traces), `e2e-<slug>.md` (e2e-runner traces).
396
490
  - `docs/.snapshots/` — pre-compact recovery markers (auto-pruned, gitignored).
397
491
  Holds no secrets.
398
492
  - your E2E stack — runner config + any ephemeral test services (e.g. `e2e/`,
@@ -1,126 +1,112 @@
1
1
  <!doctype html>
2
2
  <!--
3
- Client-facing proposal template (rendered by /propose from docs/PROPOSAL.md).
4
- HOW TO USE (agent): copy this file to docs/proposal.html and replace every
5
- {{PLACEHOLDER}}. LOCALISE the labels + content to the project's declared
6
- language (e.g. natural Thai) keep technical terms in English where a Thai dev
7
- team would. Light + print-friendly on purpose (Ctrl/Cmd-P "Save as PDF").
8
- Repeat the <tr> in the phases table per phase; repeat <li> lists as needed.
9
-
10
- WHITE-LABEL: this template is brand-neutral. Fill {{COMPANY}} / {{LOGO}} with the
11
- ISSUING company's brand (whoever is sending the proposal) — NOT the kit's. {{LOGO}}
12
- is optional: replace with an <img src="…"> or a text wordmark, or delete it.
13
- Icons: none by design (no emoji) — keep it clean and typographic.
3
+ Client-facing proposal ONE A4 PAGE (rendered by /propose from docs/PROPOSAL.md).
4
+ HOW TO USE (agent): copy to docs/proposal.html, replace every {{PLACEHOLDER}}, and
5
+ keep it to a SINGLE A4 page be terse (≈3–6 phases, ≈4 assumptions). Localise the
6
+ CONTENT to the project language; the section labels are bilingual (TH / EN) already.
7
+ WHITE-LABEL: fill {{COMPANY}} / {{LOGO}} with the ISSUING company's brand (not the
8
+ kit's). {{LOGO}} optional: an <img src="…">, an SVG, or delete to keep the monogram.
9
+ Print: Ctrl/Cmd-P → A4 → "Save as PDF" (fits one page).
14
10
  -->
15
11
  <html lang="{{LANG}}">
16
12
  <head>
17
13
  <meta charset="utf-8" />
18
- <meta name="viewport" content="width=device-width, initial-scale=1" />
19
14
  <title>{{TITLE}} — Proposal {{VERSION}}</title>
20
15
  <style>
21
- :root{ --ink:#1a2230; --muted:#5b6878; --line:#e3e8f0; --accent:#5b4cf0;
22
- --accent2:#0ea5b7; --bg:#fff; --soft:#f6f8fc;
23
- --sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans Thai",system-ui,sans-serif;
24
- --mono:ui-monospace,Menlo,Consolas,monospace; }
16
+ @page { size: A4; margin: 0 }
17
+ :root{
18
+ --ink:#162033; --muted:#5d6a7d; --line:#dbe3ee; --soft:#f6f8fb;
19
+ --violet:#635bff; --green:#15803d;
20
+ --sans:"Inter","Noto Sans Thai",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
21
+ --mono:ui-monospace,Menlo,Consolas,monospace;
22
+ }
25
23
  *{box-sizing:border-box}
26
- body{margin:0;background:var(--soft);color:var(--ink);font-family:var(--sans);line-height:1.6}
27
- .sheet{max-width:880px;margin:24px auto;background:var(--bg);border:1px solid var(--line);
28
- border-radius:14px;overflow:hidden}
29
- .head{padding:34px 40px;border-bottom:3px solid var(--accent);
30
- background:linear-gradient(120deg,#f3f1ff,#eafcff)}
31
- .brand-row{display:flex;align-items:center;gap:10px;margin-bottom:14px;font-size:1rem}
32
- .brand-row .logo{display:inline-flex;align-items:center}
33
- .head .ey{font:600 .72rem/1 var(--mono);letter-spacing:.18em;text-transform:uppercase;color:var(--accent)}
34
- .head h1{margin:.3em 0 .1em;font-size:1.9rem;letter-spacing:-.02em}
35
- .head .meta{color:var(--muted);font-size:.9rem}
36
- main{padding:14px 40px 40px}
37
- section{padding:20px 0;border-bottom:1px solid var(--line)}
38
- section:last-child{border:none}
39
- h2{font-size:1.05rem;margin:0 0 .5em;display:flex;align-items:center;gap:9px}
40
- h2::before{content:"";width:10px;height:10px;border-radius:3px;
41
- background:linear-gradient(120deg,var(--accent),var(--accent2))}
42
- table{width:100%;border-collapse:collapse;font-size:.92rem}
43
- th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line)}
44
- th{background:var(--soft);font-size:.74rem;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
45
- td.num,th.num{text-align:right;font-family:var(--mono)}
46
- tfoot td{font-weight:700;border-top:2px solid var(--ink);border-bottom:none}
47
- ul{margin:.2em 0;padding-left:1.2em} li{margin:.2em 0;color:var(--muted)}
48
- .total{font-size:1.5rem;font-weight:800}
49
- .total small{font-size:.8rem;color:var(--muted);font-weight:500}
50
- .cols{display:flex;gap:32px;flex-wrap:wrap} .cols>div{flex:1;min-width:220px}
51
- .sign{display:flex;gap:40px;flex-wrap:wrap;margin-top:10px}
52
- .sign div{flex:1;min-width:220px} .line{border-bottom:1px solid var(--ink);height:34px;margin-top:18px}
53
- .muted{color:var(--muted)} .pill{display:inline-block;font:600 .7rem/1 var(--mono);
54
- padding:3px 8px;border-radius:6px;background:var(--soft);border:1px solid var(--line);color:var(--muted)}
55
- footer{padding:18px 40px;color:var(--muted);font-size:.8rem;background:var(--soft)}
56
- @media print{ body{background:#fff} .sheet{margin:0;border:none;border-radius:0;max-width:none}
57
- .head{background:#fff} section{break-inside:avoid} }
24
+ body{margin:0;background:#e9edf3;color:var(--ink);font-family:var(--sans);font-size:10.5px;line-height:1.45}
25
+ .sheet{width:210mm;min-height:297mm;margin:10mm auto;background:#fff;padding:15mm 16mm;display:flex;flex-direction:column;gap:11px}
26
+ .lbl{color:var(--muted);font-size:8.5px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;margin:0 0 3px}
27
+ .lbl em{font-style:normal;opacity:.6;font-weight:600}
28
+ h1{font-size:21px;margin:0;letter-spacing:-.3px;line-height:1.1}
29
+ .muted{color:var(--muted)} ul{margin:0;padding-left:15px} li{margin:1.5px 0}
30
+ hr{border:none;border-top:1px solid var(--line);margin:0}
31
+
32
+ /* header */
33
+ .head{display:flex;justify-content:space-between;align-items:flex-start;border-bottom:2px solid var(--ink);padding-bottom:11px}
34
+ .co{display:flex;align-items:center;gap:10px}
35
+ .logo{width:42px;height:42px;border-radius:9px;background:var(--ink);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:13px;flex:0 0 auto;overflow:hidden}
36
+ .logo img{width:100%;height:100%;object-fit:contain}
37
+ .co .name{font-weight:800;font-size:15px;line-height:1.15}
38
+ .co .tag{color:var(--muted);font-size:9px}
39
+ .head .meta{text-align:right;font-size:9px;color:var(--muted)}
40
+ .head .meta .big{font:800 12px/1.2 var(--sans);letter-spacing:.12em;color:var(--violet)}
41
+ .pill{display:inline-block;border:1px solid var(--line);border-radius:999px;padding:2px 8px;font:800 8px/1 var(--mono);color:var(--muted);margin-top:4px}
42
+
43
+ .cols{display:flex;gap:18px} .cols>div{flex:1;min-width:0}
44
+ table{width:100%;border-collapse:collapse;font-size:10px}
45
+ th,td{text-align:left;padding:5px 7px;border-bottom:1px solid var(--line)}
46
+ th{background:var(--soft);font-size:8px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
47
+ td.n,th.n{text-align:right;font-family:var(--mono)}
48
+ tfoot td{font-weight:800;border-top:1.5px solid var(--ink);border-bottom:none}
49
+ .total{display:flex;align-items:baseline;justify-content:space-between;background:var(--soft);border-radius:9px;padding:9px 13px}
50
+ .total .amt{font-size:19px;font-weight:800} .total .amt small{font-size:9px;color:var(--muted);font-weight:600}
51
+
52
+ .sign{display:flex;gap:34px;margin-top:auto;padding-top:14px}
53
+ .sign>div{flex:1} .line{border-bottom:1px solid var(--ink);height:30px} .sign .lbl{margin-top:5px}
54
+ footer{border-top:1px solid var(--line);padding-top:8px;color:var(--muted);font-size:8.5px;display:flex;justify-content:space-between}
55
+ @media print{ body{background:#fff} .sheet{margin:0;min-height:auto;box-shadow:none} }
58
56
  </style>
59
57
  </head>
60
58
  <body>
61
59
  <div class="sheet">
60
+
62
61
  <div class="head">
63
- <div class="brand-row"><span class="logo">{{LOGO}}</span><strong>{{COMPANY}}</strong></div>
64
- <div class="ey">Proposal · {{VERSION}}</div>
62
+ <div class="co">
63
+ <span class="logo">{{LOGO}}</span>
64
+ <span><span class="name">{{COMPANY}}</span><br><span class="tag">{{COMPANY_TAGLINE}}</span></span>
65
+ </div>
66
+ <div class="meta">
67
+ <div class="big">PROPOSAL</div>
68
+ {{VERSION}} · {{DATE}}<br><span class="pill">{{STATUS}}</span>
69
+ </div>
70
+ </div>
71
+
72
+ <div>
73
+ <p class="lbl">ใบเสนอราคา <em>Prepared for</em></p>
65
74
  <h1>{{TITLE}}</h1>
66
- <div class="meta">{{L_PREPARED_FOR}} {{CLIENT}} · {{DATE}} · <span class="pill">{{STATUS}}</span></div>
75
+ <p class="muted" style="margin:3px 0 0">{{CLIENT}} {{SUMMARY}}</p>
67
76
  </div>
68
- <main>
69
- <section>
70
- <h2>{{L_OVERVIEW}}</h2>
71
- <p class="muted">{{SUMMARY}}</p>
72
- </section>
73
77
 
74
- <section>
75
- <h2>{{L_SCOPE}}</h2>
76
- <div class="cols">
77
- <div><strong>{{L_IN_SCOPE}}</strong><ul>{{SCOPE_IN_ITEMS}}</ul></div>
78
- <div><strong>{{L_OUT_SCOPE}}</strong><ul>{{SCOPE_OUT_ITEMS}}</ul></div>
79
- </div>
80
- </section>
78
+ <div class="cols">
79
+ <div><p class="lbl">ขอบเขตงาน <em>In scope</em></p><ul>{{SCOPE_IN_ITEMS}}</ul></div>
80
+ <div><p class="lbl">นอกขอบเขต <em>Out of scope</em></p><ul>{{SCOPE_OUT_ITEMS}}</ul></div>
81
+ </div>
82
+
83
+ <div>
84
+ <p class="lbl">เฟส &amp; ค่าใช้จ่าย <em>Phases &amp; cost</em></p>
85
+ <table>
86
+ <thead><tr><th>เฟส <em style="font-style:normal;opacity:.5">Phase</em></th><th>Complexity</th><th class="n">Effort</th><th class="n">Cost</th></tr></thead>
87
+ <tbody>{{PHASE_ROWS}}<!-- <tr><td>1. Auth</td><td>M</td><td class="n">2–3d</td><td class="n">฿16k–24k</td></tr> --></tbody>
88
+ <tfoot><tr><td colspan="2">รวม <em style="font-style:normal;opacity:.5">Total</em></td><td class="n">{{TOTAL_EFFORT}}</td><td class="n">{{TOTAL_COST}}</td></tr></tfoot>
89
+ </table>
90
+ </div>
81
91
 
82
- <section>
83
- <h2>{{L_PHASES}}</h2>
84
- <table>
85
- <thead><tr>
86
- <th>{{L_PHASE}}</th><th>{{L_COMPLEXITY}}</th>
87
- <th class="num">{{L_EFFORT}}</th><th class="num">{{L_COST}}</th>
88
- </tr></thead>
89
- <tbody>
90
- {{PHASE_ROWS}}
91
- <!-- e.g. <tr><td>1. Auth</td><td>M</td><td class="num">2–3d</td><td class="num">฿16,000–24,000</td></tr> -->
92
- </tbody>
93
- <tfoot><tr><td colspan="2">{{L_TOTAL}}</td><td class="num">{{TOTAL_EFFORT}}</td><td class="num">{{TOTAL_COST}}</td></tr></tfoot>
94
- </table>
95
- <p class="total" style="margin-top:14px">{{TOTAL_COST}} <small>{{CONTINGENCY_NOTE}}</small></p>
96
- </section>
92
+ <div class="total">
93
+ <span><span class="lbl" style="margin:0">ราคารวม <em>Total</em></span><br><span class="muted" style="font-size:9px">{{TIMELINE}}</span></span>
94
+ <span class="amt">{{TOTAL_COST}} <small>{{CONTINGENCY_NOTE}}</small></span>
95
+ </div>
97
96
 
98
- <section>
99
- <h2>{{L_TIMELINE}}</h2>
100
- <p class="muted">{{TIMELINE}}</p>
101
- </section>
97
+ <div class="cols">
98
+ <div><p class="lbl">สมมุติฐาน <em>Assumptions</em></p><ul>{{ASSUMPTION_ITEMS}}</ul></div>
99
+ <div><p class="lbl">ข้อยกเว้น <em>Exclusions</em></p><ul>{{EXCLUSION_ITEMS}}</ul></div>
100
+ </div>
102
101
 
103
- <section>
104
- <div class="cols">
105
- <div><h2>{{L_ASSUMPTIONS}}</h2><ul>{{ASSUMPTION_ITEMS}}</ul></div>
106
- <div><h2>{{L_EXCLUSIONS}}</h2><ul>{{EXCLUSION_ITEMS}}</ul></div>
107
- </div>
108
- </section>
102
+ <div><p class="lbl">เงื่อนไขการชำระเงิน <em>Payment</em></p><p class="muted" style="margin:0">{{PAYMENT_ITEMS}}</p></div>
109
103
 
110
- <section>
111
- <h2>{{L_PAYMENT}}</h2>
112
- <ul>{{PAYMENT_ITEMS}}</ul>
113
- </section>
104
+ <div class="sign">
105
+ <div><div class="line"></div><p class="lbl">ลงนามลูกค้า <em>Client sign-off</em></p></div>
106
+ <div><div class="line"></div><p class="lbl">วันที่ <em>Date</em></p></div>
107
+ </div>
114
108
 
115
- <section>
116
- <h2>{{L_SIGNOFF}}</h2>
117
- <div class="sign">
118
- <div><div class="line"></div><div class="muted">{{L_CLIENT_SIGN}}</div></div>
119
- <div><div class="line"></div><div class="muted">{{L_DATE}}</div></div>
120
- </div>
121
- </section>
122
- </main>
123
- <footer>{{FOOTER}}</footer>
109
+ <footer><span>{{COMPANY}} · {{FOOTER}}</span><span>{{VERSION}}</span></footer>
124
110
  </div>
125
111
  </body>
126
112
  </html>