create-issflow 1.6.0 → 1.8.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.
Files changed (32) hide show
  1. package/README.md +7 -7
  2. package/bin/cli.js +23 -22
  3. package/package.json +1 -1
  4. package/template/.claude/agents/debugger.md +1 -1
  5. package/template/.claude/agents/e2e-runner.md +1 -1
  6. package/template/.claude/agents/implementer.md +1 -1
  7. package/template/.claude/agents/planner.md +1 -1
  8. package/template/.claude/agents/researcher.md +1 -1
  9. package/template/.claude/agents/test-author.md +1 -1
  10. package/template/.claude/commands/change-request.md +35 -14
  11. package/template/.claude/commands/design.md +51 -0
  12. package/template/.claude/commands/feature.md +6 -0
  13. package/template/.claude/commands/goal.md +77 -0
  14. package/template/.claude/commands/log-issue.md +3 -0
  15. package/template/.claude/commands/overview.md +10 -3
  16. package/template/.claude/commands/phase.md +10 -0
  17. package/template/.claude/commands/propose.md +49 -18
  18. package/template/.claude/commands/quick.md +7 -2
  19. package/template/.claude/commands/release.md +13 -4
  20. package/template/.claude/commands/support.md +43 -0
  21. package/template/.claude/hooks/session-start.js +2 -0
  22. package/template/.claude/istartsoft-flow/METHODOLOGY.md +110 -27
  23. package/template/.claude/skills/support-triage/SKILL.md +40 -0
  24. package/template/.claude/skills/ux-design/SKILL.md +8 -3
  25. package/template/.claude/templates/ARCHITECTURE-template.md +53 -0
  26. package/template/.claude/templates/CR-template.md +34 -0
  27. package/template/.claude/templates/UX-PACK-template.md +37 -0
  28. package/template/.claude/templates/automation/Dockerfile +4 -0
  29. package/template/.claude/templates/automation/feature-docker.js +11 -10
  30. package/template/.claude/templates/automation/issflow-feature.yml +4 -3
  31. package/template/.claude/templates/automation/issflow-goal.yml +48 -0
  32. package/template/.claude/templates/proposal.html +2 -1
package/README.md CHANGED
@@ -7,14 +7,14 @@ and tool-agnostic. Non-destructive: it never overwrites your files.
7
7
 
8
8
  ```bash
9
9
  cd my-project
10
- npx create-issflow # prompts for your AI tool
11
- npx create-issflow --tool=claude # or pass it: claude | codex | cursor | gemini | aider | all
12
- # then open your tool — Claude Code fires the SessionStart hook automatically
10
+ npx create-issflow # omit --tool = install EVERY adapter
11
+ npx create-issflow --tool=cursor # claude | codex | cursor | gemini | aider | all
12
+ # then open your tool and run:
13
13
  /overview # bootstrap the project
14
14
  ```
15
15
 
16
16
  Flags:
17
- - `--tool=<name>` — pick the target tool (skips the prompt). `all` writes every adapter.
17
+ - `--tool=<name>` — pick the target tool. **Omit = `all`** (every adapter).
18
18
  - `--ci` — also write `.github/workflows/issflow-feature.yml` (headless `/feature`
19
19
  via GitHub Actions: label an issue `feature:approved` → the lane runs).
20
20
  - `--docker` — also write `Dockerfile.issflow` + `scripts/feature-docker.js`
@@ -31,20 +31,20 @@ Flags:
31
31
  The portable kit (every tool) in `<project>/.claude/`:
32
32
 
33
33
  - `agents/` — planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer
34
- - `commands/` — `/overview` `/feature` `/propose` `/phase` `/sprint` `/ui-audit` `/qa-audit` `/security-audit` `/release` `/uat` `/change-request` `/replan` `/quick` `/synthesize` `/runbook` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
34
+ - `commands/` — `/overview` `/feature` `/goal` `/propose` `/phase` `/sprint` `/ui-audit` `/qa-audit` `/security-audit` `/release` `/uat` `/change-request` `/replan` `/quick` `/synthesize` `/runbook` `/store-wisdom` `/log-issue` `/log-decision` `/unstuck`
35
35
  - `skills/` — caveman · grill-me · karpathy-guidelines · ux-design · security · code-standards
36
36
  - `hooks/` — session-start · context-guard · plan-gate (rule-13 enforcement) · pre-compact · subagent-stop · feature-gate (Stop gate for `/feature`, artifact-verified)
37
37
  - `istartsoft-flow/METHODOLOGY.md` — the full methodology (single source of truth)
38
38
 
39
- Plus a root `AGENTS.md` (the open standard) and the per-tool adapter:
39
+ Plus a root **`AGENTS.md`** (open standard — primary entry) and the per-tool adapter:
40
40
 
41
41
  | Tool | Adds |
42
42
  |------|------|
43
- | `claude` | merges hooks into `.claude/settings.json` |
44
43
  | `codex` | nothing extra — `AGENTS.md` is read natively |
45
44
  | `cursor` | `.cursor/rules/` + `.cursor/commands/` + `.cursor/hooks.json` |
46
45
  | `gemini` | `GEMINI.md` pointer |
47
46
  | `aider` | `.aider.conf.yml` that loads the methodology |
47
+ | `claude` | thin `CLAUDE.md` (`@AGENTS.md`) + merges hooks into `.claude/settings.json` |
48
48
  | `all` | every adapter above |
49
49
 
50
50
  It also un-ignores the workflow dirs in `.gitignore` if `.claude/*` was ignored.
package/bin/cli.js CHANGED
@@ -40,7 +40,7 @@ function printHelp() {
40
40
 
41
41
  Usage: npx create-issflow [--tool=<name>] [--dry-run] [--force]
42
42
 
43
- Tools (--tool=, interactive prompt if omitted):`);
43
+ Tools (--tool=). Omit --tool to install EVERY adapter (same as --tool=all):`);
44
44
  for (const [k, v] of Object.entries(TOOLS)) log(` ${k.padEnd(7)} ${v}`);
45
45
  log(`
46
46
  Flags:
@@ -51,27 +51,22 @@ Flags:
51
51
  -h, --help this message
52
52
 
53
53
  Every tool installs the portable kit in .claude/ + a root AGENTS.md (the open
54
- standard). The full methodology lives in .claude/istartsoft-flow/METHODOLOGY.md.`);
54
+ standard — primary entry for most hosts). The full methodology lives in
55
+ .claude/istartsoft-flow/METHODOLOGY.md. Claude Code also gets a thin CLAUDE.md
56
+ shim (@AGENTS.md) because that host only auto-loads CLAUDE.md.`);
55
57
  }
56
58
 
57
- // Resolve the target tool: flag -> interactive (TTY) -> default 'claude'.
59
+ // Typo / alias map → canonical TOOLS key
60
+ const TOOL_ALIASES = { cusor: 'cursor' };
61
+
62
+ // Resolve the target tool: --tool= flag → default 'all' when omitted.
58
63
  function pickTool() {
59
64
  if (toolArg) {
60
- if (!TOOLS[toolArg]) { console.error(`create-issflow: unknown --tool=${toolArg}. One of: ${Object.keys(TOOLS).join(', ')}`); process.exit(1); }
61
- return toolArg;
62
- }
63
- if (process.stdin.isTTY && process.stdout.isTTY && !DRY) {
64
- const keys = Object.keys(TOOLS);
65
- process.stdout.write('\nWhich AI coding tool? (the kit is portable — pick your primary)\n');
66
- keys.forEach((k, i) => process.stdout.write(` ${i + 1}) ${k} — ${TOOLS[k]}\n`));
67
- process.stdout.write('> ');
68
- let line = '';
69
- try { line = (fs.readFileSync(0, 'utf8').split('\n')[0] || '').trim().toLowerCase(); } catch (_) {}
70
- const chosen = TOOLS[line] ? line : keys[parseInt(line, 10) - 1];
71
- if (!chosen) { console.error('create-issflow: no valid choice; defaulting to claude.'); return 'claude'; }
72
- return chosen;
65
+ const key = TOOL_ALIASES[toolArg] || toolArg;
66
+ if (!TOOLS[key]) { console.error(`create-issflow: unknown --tool=${toolArg}. One of: ${Object.keys(TOOLS).join(', ')}`); process.exit(1); }
67
+ return key;
73
68
  }
74
- return 'claude'; // non-interactive default = back-compatible
69
+ return 'all'; // omit --tool = every adapter
75
70
  }
76
71
 
77
72
  // write a single file, non-destructive (honors DRY/FORCE).
@@ -217,9 +212,9 @@ function agentsMd() {
217
212
  '## Roles — `.claude/agents/`', '',
218
213
  'planner · researcher · implementer · test-author · debugger · e2e-runner · synthesizer', '',
219
214
  '## Procedures — `.claude/commands/` (run as `/name`)', '',
220
- '/overview · /feature · /propose · /phase · /sprint · /ui-audit · /qa-audit · /security-audit ·',
221
- '/release · /uat · /change-request · /replan · /quick · /synthesize · /runbook · /store-wisdom ·',
222
- '/log-issue · /log-decision · /unstuck', '',
215
+ '/overview · /feature · /goal · /propose · /phase · /sprint · /ui-audit · /qa-audit ·',
216
+ '/security-audit · /release · /uat · /change-request · /replan · /quick · /synthesize ·',
217
+ '/runbook · /store-wisdom · /log-issue · /log-decision · /unstuck', '',
223
218
  '## Skills — `.claude/skills/` (loaded on demand)', '',
224
219
  'caveman · grill-me · karpathy-guidelines · ux-design · security (Secure SDLC) · code-standards', '',
225
220
  '## Autonomy', '',
@@ -237,7 +232,9 @@ function agentsMd() {
237
232
  '11 Secure SDLC: threat-model → secure coding → SAST/SCA/secrets each phase → pentest',
238
233
  'gate + security review before deploy (`security` skill) · 12 code-standards gate:',
239
234
  'lint/format clean + naming per language idiom + declared architecture (`code-standards`) ·',
240
- '13 PLAN-APPROVAL gate: no phase/sprint starts until `docs/PLAN.md` is human-approved.', '',
235
+ '13 PLAN-APPROVAL gate: no phase/sprint starts until `docs/PLAN.md` is human-approved ·',
236
+ '14 UNDERSTAND-FIRST gate: brief back any new free-text task and wait for confirm',
237
+ 'before executing (an approved PLAN/FEATURE/CR/goal is the recorded confirmation).', '',
241
238
  '## Your stack', '',
242
239
  'Declare your stack (language, framework, infra, auth, test + E2E runner,',
243
240
  'planning source) once in `docs/OVERVIEW.md`. Every rule references *your declared',
@@ -318,7 +315,10 @@ function main() {
318
315
 
319
316
  // 3b. headless feature lane (opt-in): materialize the automation templates.
320
317
  const autoDir = path.join(TPL, '.claude', 'templates', 'automation');
321
- if (CI) writeFile(path.join('.github', 'workflows', 'issflow-feature.yml'), fs.readFileSync(path.join(autoDir, 'issflow-feature.yml'), 'utf8'));
318
+ if (CI) {
319
+ writeFile(path.join('.github', 'workflows', 'issflow-feature.yml'), fs.readFileSync(path.join(autoDir, 'issflow-feature.yml'), 'utf8'));
320
+ writeFile(path.join('.github', 'workflows', 'issflow-goal.yml'), fs.readFileSync(path.join(autoDir, 'issflow-goal.yml'), 'utf8'));
321
+ }
322
322
  if (DOCKER) {
323
323
  writeFile('Dockerfile.issflow', fs.readFileSync(path.join(autoDir, 'Dockerfile'), 'utf8'));
324
324
  writeFile(path.join('scripts', 'feature-docker.js'), fs.readFileSync(path.join(autoDir, 'feature-docker.js'), 'utf8'), { exec: true });
@@ -341,6 +341,7 @@ function main() {
341
341
  for (const w of warnings) log(` ! ${w}`);
342
342
  log(NEXT_STEPS[TOOL] || NEXT_STEPS.claude);
343
343
  if (!CI && !DOCKER) log('Headless feature lane: re-run with --ci (GitHub Action) and/or --docker (container runner).');
344
+ log('New to the kit? Plain-language guide (EN/TH): https://iamstarter.github.io/istartsoftflow/how-to-use.html');
344
345
  }
345
346
 
346
347
  main();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-issflow",
3
- "version": "1.6.0",
3
+ "version": "1.8.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"
@@ -2,7 +2,7 @@
2
2
  name: debugger
3
3
  description: Diagnoses one specific failing test or bug in an ISOLATED context. Keeps debug noise out of the main session.
4
4
  tools: Read, Grep, Glob, Edit, Bash, Write
5
- model: opus
5
+ model: inherit
6
6
  ---
7
7
 
8
8
  You are the DEBUGGER. Caveman ULTRA mode.
@@ -2,7 +2,7 @@
2
2
  name: e2e-runner
3
3
  description: Writes and runs functional browser E2E (your declared E2E runner, e.g. Playwright) BLIND — reads the acceptance spec, OVERVIEW (stack), docs/ENDPOINTS.md, and the E2E runner config, never the implementation. Writes a trace to docs/research/e2e-<phase-slug>.md; returns a terse summary.
4
4
  tools: Read, Grep, Glob, Write, Bash
5
- model: opus
5
+ model: sonnet
6
6
  ---
7
7
 
8
8
  You are the E2E-RUNNER. Caveman ULTRA mode.
@@ -2,7 +2,7 @@
2
2
  name: implementer
3
3
  description: Implements exactly one phase from docs/PLAN.md. Writes code only — no tests. On TDD phases runs in SCAFFOLD or FILL mode. Maintains docs/ENDPOINTS.md after each phase.
4
4
  tools: Read, Grep, Glob, Edit, Write, Bash
5
- model: opus
5
+ model: inherit
6
6
  ---
7
7
 
8
8
  You are the IMPLEMENTER. Caveman ULTRA mode. Apply karpathy-guidelines skill.
@@ -2,7 +2,7 @@
2
2
  name: planner
3
3
  description: Turns research findings and OVERVIEW into a vertical-slice phase plan. Phase 0 (infra) leads only when infra is self-managed; with managed infra it is N/A. Last code phase always includes deployment. Writes docs/PLAN.md.
4
4
  tools: Read, Grep, Glob, Write
5
- model: opus
5
+ model: inherit
6
6
  ---
7
7
 
8
8
  You are the PLANNER. Caveman ULTRA mode.
@@ -2,7 +2,7 @@
2
2
  name: researcher
3
3
  description: Two-mode fact gathering. DESIGN mode: domain/constraint research before planning — discovers service limits, API contracts, architectural constraints. IMPL mode: codebase + service investigation during a phase. Always checks KB snapshot first. Always writes findings to docs/research/, returns only terse summary + path.
4
4
  tools: Read, Grep, Glob, Write, WebSearch, WebFetch
5
- model: haiku
5
+ model: sonnet
6
6
  ---
7
7
 
8
8
  You are the RESEARCHER. Caveman ULTRA mode.
@@ -2,7 +2,7 @@
2
2
  name: test-author
3
3
  description: Writes tests for a phase WITHOUT reading the implementation logic. On TDD phases, writes the suite BEFORE logic exists (RED-first). Tests behavior from the plan's acceptance spec only.
4
4
  tools: Read, Grep, Glob, Write, Bash
5
- model: opus
5
+ model: inherit
6
6
  ---
7
7
 
8
8
  You are the TEST-AUTHOR. Caveman ULTRA mode. You write UNBIASED tests.
@@ -33,36 +33,57 @@ Is this an in-scope **clarification** (no cost change) or a real **scope change*
33
33
  (add / remove / alter)? Clarification -> log it, proceed, no re-price. Scope change
34
34
  -> continue.
35
35
 
36
+ Also classify commercial lane:
37
+ - **Warranty / defect** (bug vs approved scope, inside support window) → prefer
38
+ `/support` or `/quick` — not a billable CR unless the client expands scope.
39
+ - **Billable CR** → continue below.
40
+
36
41
  ## STEP 2 — IMPACT ANALYSIS
37
42
  Determine:
38
43
  - phases affected — **done phases are frozen** (their cost is already spent and
39
44
  counts); new / changed phases; cut phases (credit back the un-started effort).
40
- - knock-on effects — architecture, **security (re-threat-model?)**, tests, timeline.
45
+ - knock-on effects — architecture, **UX pack**, **security (re-threat-model?)**,
46
+ tests, timeline. If UX or arch artifacts change, those gates re-open (rule 15).
41
47
  - dispatch `researcher` (DESIGN or IMPL) if the change needs grounding in facts.
42
48
 
43
- ## STEP 3 — RE-ESTIMATE (the DELTA only; reasonable + transparent)
44
- - Use the SAME estimation config as PROPOSAL.md (unit, rate card, currency,
45
- contingency) — consistency is what makes the re-price defensible.
49
+ ## STEP 3 — RE-ESTIMATE (the DELTA only)
50
+ - Reuse the SAME estimation config used for the approved proposal’s **internal**
51
+ math (unit, rate card, currency, contingency) if still available in a private
52
+ estimate memo or chat-recorded answers.
53
+ - If rate / contingency is missing → **ASK once** (same rule as `/propose`). Never
54
+ invent a kit default rate; never commit personal rates into public kit files.
46
55
  - added effort × rate = added cost; cut effort = credit.
47
- - **net cost Δ** + **new total** vs the approved baseline — as a range + assumptions.
56
+ - **net cost Δ** + **new total** vs the approved baseline — as a range.
57
+ - Show rate math **in chat to the human only**.
48
58
  - **timeline Δ**. State what stays the SAME so the client sees the price is fair.
49
59
 
50
- ## STEP 4 — LOG the change order to docs/CHANGES.md (append-only)
60
+ ### CLIENT-DOC RULE
61
+ Anything the client sees (CR summary, updated PROPOSAL.md / proposal.html) shows
62
+ **Δ cost + new total** (and effort/timeline) only — **never** rate, rate card, or
63
+ contingency %.
64
+
65
+ ## STEP 4 — LOG the change order
66
+ 1. Append a one-line summary to `docs/CHANGES.md` (append-only):
51
67
  ```
52
68
  CR-<n> | <date> | <change> | impact: <phases> | effort Δ: <±days> |
53
69
  cost Δ: <±amount> | new total: <amount> | status: proposed
54
70
  ```
71
+ 2. Fill `.claude/templates/CR-template.md` → `docs/changes/CR-<n>.md` (detail:
72
+ classification, impact, Δ cost, warranty vs billable, status). Keep the detail
73
+ file client-safe on money fields (totals only).
55
74
 
56
75
  ## STEP 5 — APPROVAL GATE
57
- Show me CR-<n> (impact + price delta + new total). **STOP for approval** (commercial
58
- gate — always interactive).
76
+ Show me CR-<n> (impact + price delta + new total — no rate). **STOP for approval**
77
+ (commercial gate — always interactive).
59
78
  - **Approved** -> set CR status `approved`; bump PROPOSAL.md to a new version (vN+1)
60
- with the delta folded in; re-render `docs/proposal.html` from it (same template +
61
- language); then dispatch `/replan` to apply the phase changes to PLAN.md (done
62
- phases stay frozen). Update STATE.md. NOTE: `/replan` reverts PLAN.md to
63
- `> Approval: PENDING` and re-runs the PLAN-APPROVAL gate (hard rule 13) — the
64
- commercial CR sign-off is SEPARATE from the plan sign-off, so `/phase` and
65
- `/sprint` stay blocked until you also re-approve the revised plan.
79
+ with the delta folded in (**totals only**); re-render `docs/proposal.html` from it
80
+ (same template + language; no contingency note / rate); then dispatch `/replan` to
81
+ apply the phase changes to PLAN.md (done phases stay frozen). Update STATE.md.
82
+ NOTE: `/replan` reverts PLAN.md to `> Approval: PENDING` and re-runs the
83
+ PLAN-APPROVAL gate (hard rule 13) — the commercial CR sign-off is SEPARATE from
84
+ the plan sign-off, so `/phase` and `/sprint` stay blocked until you also
85
+ re-approve the revised plan. If UX/arch scope changed, reset `design:` /
86
+ `architecture:` in STATE to PENDING (rule 15) before build resumes.
66
87
  - **Rejected** -> set CR status `rejected`; PLAN + PROPOSAL unchanged.
67
88
 
68
89
  ## STEP 6 — RECORD
@@ -0,0 +1,51 @@
1
+ ---
2
+ description: Post-proposal DESIGN + ARCHITECTURE gates — produce UX pack and architecture note, stop for human approve before /phase (hard rule 15).
3
+ argument-hint: [optional: "ux" | "arch" | "both" · "dry-run"]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR.
7
+
8
+ Purpose: after a **client proposal is signed** (or when the project opts into these
9
+ gates), produce build-ready design + architecture artifacts and get human approve
10
+ **before** `/phase` runs. Vertical slices still build UX+code together — these gates
11
+ lock the *frame* first (model B).
12
+
13
+ DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, outline what you'd write
14
+ and STOP. Write nothing.
15
+
16
+ ## PRE-FLIGHT
17
+ - Read `docs/OVERVIEW.md`, `docs/PLAN.md`, `docs/PROPOSAL.md` (if any), `docs/STATE.md`.
18
+ - PLAN must be approved (rule 13). If a proposal exists for quoted work, it should
19
+ be signed off first (`/propose`) — otherwise warn and confirm they want design
20
+ gates without a commercial proposal (internal projects may skip `/propose` and
21
+ still run `/design`, or skip rule 15 entirely when STATE has `design: n/a` and
22
+ `architecture: n/a` set deliberately for non-quoted work).
23
+
24
+ Target: `$ARGUMENTS` → `ux` | `arch` | `both` (default **both**).
25
+
26
+ ## STEP 1 — UX PACK (if ux|both)
27
+ 1. Apply `ux-design` skill (authoring mode): wireframe baseline + cookbook direction.
28
+ 2. Scaffold or update `docs/UX-PACK.md` from `.claude/templates/UX-PACK-template.md`.
29
+ 3. Fill flows, screen inventory, tokens/frame, a11y notes from OVERVIEW + PLAN.
30
+ 4. SHOW me UX-PACK.md. **STOP for approval.**
31
+ 5. On approve: stamp `> Approval: approved <date> v<n>`; set `design: approved <date>`
32
+ in STATE.md; HISTORY line `design v<n> approved`.
33
+ 6. On change request: revise and re-show; header stays PENDING.
34
+
35
+ ## STEP 2 — ARCHITECTURE (if arch|both)
36
+ 1. Dispatch `researcher` (DESIGN) only if open unknowns remain; else use OVERVIEW.
37
+ 2. Scaffold or update `docs/ARCHITECTURE.md` from
38
+ `.claude/templates/ARCHITECTURE-template.md`.
39
+ 3. Apply `code-standards` architecture guidance; security trust boundaries via
40
+ `security` skill when relevant.
41
+ 4. SHOW me ARCHITECTURE.md. **STOP for approval.**
42
+ 5. On approve: stamp header; set `architecture: approved <date>` in STATE.md;
43
+ HISTORY line `architecture v<n> approved`. Optionally `/log-decision` for
44
+ material pattern choices.
45
+ 6. On change request: revise and re-show.
46
+
47
+ ## STEP 3 — HANDOFF
48
+ When both required gates are approved (or N/A for internal skip):
49
+ - Tell me `/phase` is unblocked for rule 15.
50
+ - Reminder: frontend phases still run the `ux-design` CLOSE check (rule 9);
51
+ architecture drift still needs `/log-decision` (rule 8).
@@ -146,6 +146,12 @@ All slices done + full feature suite green -> check gate `build-green`.
146
146
  - Self-review: reread the diff against FEATURE.md acceptance criteria — every
147
147
  criterion maps to a test; every assumption still holds.
148
148
  - Run the regression corpus (`scripts/regression.sh`) + the full real suite.
149
+ No regression corpus in this repo (fresh brownfield install)? -> run the
150
+ project's OWN full test suite (the test command declared in OVERVIEW.md, or
151
+ the repo's obvious one — package.json test script, make test, pytest, …) and
152
+ note "corpus: n/a (brownfield)" in the summary. NOTHING runnable at all ->
153
+ that is a hard-stop: a feature cannot be verified green on a repo with no
154
+ tests; say so instead of pretending.
149
155
  Green -> check gates `review-harden` + `regression-green`.
150
156
 
151
157
  ## 7. MANUAL TEST PLAN
@@ -0,0 +1,77 @@
1
+ ---
2
+ description: Goal layer — declare an OUTCOME, then let the kit drive lanes toward it until done, blocked, or budget spent. Goal-driven (stops on the outcome), not just time-driven like an interval loop.
3
+ argument-hint: [set "<outcome>" · run [id] · status · done <id> · drop <id> · "dry-run"]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR. Goals live in `docs/GOALS.md`.
7
+
8
+ A GOAL is bigger than one task: "clear the approved feature queue", "get the
9
+ release candidate green", "close every open HIGH issue". The goal layer picks
10
+ the next actionable unit, routes it through the RIGHT lane (METHODOLOGY → Lane
11
+ routing), and repeats — with the same gates every lane already enforces.
12
+
13
+ DRY-RUN: with `dry-run`, `/goal run` prints the pick-order + lanes it would fire
14
+ and STOPS. `/goal set` always stops at the confirmation gate anyway.
15
+
16
+ ---
17
+
18
+ ## /goal set "<outcome>"
19
+
20
+ 1. UNDERSTAND-FIRST gate (hard rule 14) — BRIEF-BACK before writing anything:
21
+ - the outcome as YOU understand it, restated in one paragraph
22
+ - **Done when** — a measurable finish line (else the loop never terminates)
23
+ - scope / out-of-scope · assumptions · which lanes will likely fire
24
+ - **Budget** — max units per run (features/phases/quick fixes) so a runaway
25
+ goal cannot burn the wallet
26
+ STOP for explicit confirmation. Correction -> re-brief. Never skip this.
27
+ 2. On confirm, append to `docs/GOALS.md`:
28
+ ```
29
+ ## G<n> — <outcome> [active]
30
+ > Done when: <measurable condition>
31
+ > Budget: <max units per run / other caps>
32
+ > Approved: <name> <date>
33
+ ```
34
+ The `Approved:` line is what arms HEADLESS goal runs (same doctrine as the
35
+ feature lane: recorded consent, scoped to this goal).
36
+
37
+ ## /goal run [id] (default: the single active goal)
38
+
39
+ LOOP — repeat until a stop condition:
40
+ 1. PICK the next actionable unit, in this order:
41
+ a. an in-progress unit in STATE (finish what is started)
42
+ b. an APPROVED, pending `docs/features/*/FEATURE.md` that advances the goal
43
+ c. the next pending PLAN phase that advances the goal (plan must be approved — rule 13)
44
+ d. an open ISSUES.md item inside the goal's scope (route `/quick` or `/feature`)
45
+ Nothing actionable -> report + stop.
46
+ 2. ROUTE it through the lane-routing table (`/feature` · `/phase` · `/quick`).
47
+ The lane runs with ALL its own gates — the goal layer never bypasses one.
48
+ 3. TICK: append one line under the goal (`- [x] <unit> — <lane> — <result>`),
49
+ decrement budget, update STATE (`goal: G<n> (active — <units left>)`).
50
+ 4. CHECK "Done when". Met -> mark `[done]`, STATE `goal: G<n> (done)`, final
51
+ report (units shipped · parked blockers · budget used). Not met -> loop.
52
+
53
+ STOP conditions (whichever first): Done-when met · budget spent · a lane
54
+ hard-stop (surface it; headless: `BLOCKED.md` + clean exit) · nothing actionable.
55
+ Every stop produces ONE consolidated report — never a silent end.
56
+
57
+ ## /goal status · /goal done <id> · /goal drop <id>
58
+
59
+ Show goals + progress ticks · force-close (human says it's done) · abandon
60
+ (log why). Both edits keep the history lines — GOALS.md is append-style memory.
61
+
62
+ ---
63
+
64
+ ## Recurrence (running a goal on a schedule)
65
+
66
+ `/goal run` is one pass: it works until done/blocked/budget. To keep pressure on
67
+ a long goal, re-fire the pass on a schedule — host-level, not kit-level:
68
+ - **Claude Code web/desktop**: `/loop 30m /goal run` — the host's interval loop
69
+ re-invokes the pass; the goal layer supplies the state + finish line that a
70
+ bare interval loop lacks (it stops itself when Done-when is met).
71
+ - **CI (headless)**: `create-issflow --ci` also installs
72
+ `.github/workflows/issflow-goal.yml` — a cron-ready workflow that runs
73
+ `/goal run` with `ISSFLOW_HEADLESS=1` (schedule commented out by default;
74
+ uncomment to arm). The `Approved:` line in GOALS.md is the recorded consent.
75
+ - **Docker**: `node scripts/feature-docker.js` per feature stays the unit
76
+ runner; a goal pass inside a container is `claude -p "/goal run"` on the
77
+ same image (cron it with the scheduler you already have).
@@ -13,6 +13,8 @@ Canonical format:
13
13
  ### <short error title — searchable, literal error keywords>
14
14
 
15
15
  - [ ] open (or “- [x] resolved” once fixed)
16
+ - severity: P1 | P2 | P3 (optional; required when filed via /support)
17
+ - commercial: warranty | billable | n/a
16
18
  - symptom: <what was observed>
17
19
  - root cause: <the REAL underlying cause>
18
20
  - solution: <exact fix, or “pending”>
@@ -26,5 +28,6 @@ Rules:
26
28
  - open issues use the empty box `- [ ]`; resolved are checked `- [x] resolved`
27
29
  (the SessionStart hook surfaces every `- [ ]` as open — keep the box empty until fixed).
28
30
  - open issues go at the TOP; resolved below; archived oldest at bottom.
31
+ - For after-go-live tickets prefer `/support` first (triage), then this log.
29
32
 
30
33
  Confirm the entry back in 2 lines.
@@ -104,10 +104,14 @@ proceeds to the planner. (This is the planning confirmation gate.)
104
104
 
105
105
  phase: 0 (pending)
106
106
  plan: PENDING
107
+ design: PENDING
108
+ architecture: PENDING
107
109
  completed: project bootstrapped — design research done, double grill done
108
110
  blocker: none
109
111
 
110
112
  ```
113
+ (For internal non-quoted work you may set `design: n/a` and `architecture: n/a`
114
+ instead of PENDING so rule 15 does not block `/phase`.)
111
115
  8. Create docs/ISSUES.md with header `# Issues` and `## Archived` section.
112
116
 
113
117
  9. Create empty docs/HISTORY.md.
@@ -138,6 +142,9 @@ blocker: none
138
142
 
139
143
  AUTO governs the development loop that runs AFTER this gate, never the gate itself.
140
144
 
141
- Optional next step (client / quoted work only): run `/propose` to turn this
142
- OVERVIEW + PLAN into a proposal + estimate for sign-off before building. Internal or
143
- personal projects skip it and go straight to `/phase`.
145
+ Optional next steps (client / quoted work):
146
+ 1. `/propose` — proposal + estimate (asks rate in chat; client docs stay totals-only).
147
+ 2. `/design` — UX pack + architecture approve gates (hard rule 15) before `/phase`.
148
+
149
+ Internal or personal projects may skip `/propose` and set `design: n/a` /
150
+ `architecture: n/a` in STATE, then go to `/phase`.
@@ -29,6 +29,16 @@ a. PLAN-APPROVAL CHECK (hard rule 13): Read the docs/PLAN.md `> Approval:` heade
29
29
  start. Route me to the `/overview` PLAN-APPROVAL gate (or `/replan` then re-approve).
30
30
  Approved -> continue.
31
31
 
32
+ a2. DESIGN + ARCHITECTURE GATES (hard rule 15): Read `docs/STATE.md` for `design:`
33
+ and `architecture:`.
34
+ - Quoted / client work (approved `docs/PROPOSAL.md` exists): both must read
35
+ `approved <date>` (or explicit `n/a` only if the human waived the gate in
36
+ writing). Still PENDING / missing -> STOP. Route me to `/design`.
37
+ - Internal / no proposal: if STATE has `design: n/a` and `architecture: n/a`,
38
+ continue; if fields are missing, treat as n/a once (set them) unless OVERVIEW
39
+ opted into the gates.
40
+ Approved / n/a -> continue.
41
+
32
42
  b. INFRA CHECK (phases > 0): Read the declared infra in docs/OVERVIEW.md.
33
43
  - Managed infra -> confirm it is reachable; no provisioning step is needed.
34
44
  - Self-managed infra -> confirm Phase 0 (infra) ran and is healthy.
@@ -34,18 +34,37 @@ Derive the vertical-slice phases (or read `docs/PLAN.md` if it exists). Size eac
34
34
  - effort: an ideal-days RANGE (e.g. 2–3d), + story points if your team uses them
35
35
  - risk / unknowns: what could move the estimate
36
36
 
37
- ## STEP 3 — ESTIMATE (flexible, transparent — no false precision)
38
- Read the **estimation config** from OVERVIEW (or ask once — a commercial/planning
39
- input, allowed). Everything is configurable; use sensible defaults if unset:
40
- - **unit:** ideal-days (default) | story-points | both.
41
- - **rate card:** a single blended rate, OR per-role rates (e.g. senior / mid /
42
- junior). Cost = Σ(effort per role × that role's rate).
43
- - **currency:** as declared (THB default for a Thai project).
44
- - **contingency:** a % buffer for unknowns (default 10–15%).
45
- - **payment milestones:** by-phase, or a split (e.g. 30/40/30), or none.
46
- - **language:** the rendered doc's language (default = the project language).
47
- Compute cost per phase, then a **Total as a RANGE (low–high)** incl. contingency —
48
- show the math. **Timeline:** phases in dependency order → calendar estimate (note parallelism).
37
+ ## STEP 3 — ESTIMATE (ask rate · never invent a kit default)
38
+ Estimation config is **project-private**. The public kit ships **no** default rate
39
+ card and **no** sample salary/rate numbers — rates are confidential.
40
+
41
+ 1. Read estimation fields from OVERVIEW **only if the human already put them there
42
+ for this project** (unit, rate card, currency, contingency, milestones, language).
43
+ 2. If **rate card** or **contingency** is missing → **ASK once** in chat (commercial
44
+ input, allowed). Do not guess. Do not copy rates from other repos or prior chats
45
+ into kit files.
46
+ 3. Optional: store the answered rate/contingency in a **project-local** file the
47
+ team keeps private (e.g. `docs/ESTIMATE.local.md` gitignored, or OVERVIEW fields
48
+ that never get published). Never commit personal rate/salary into a public kit
49
+ or template.
50
+ 4. Configurable fields (ask or read — no invented kit defaults for money):
51
+ - **unit:** ideal-days | hours | story-points | both
52
+ - **rate card:** blended OR per-role (senior / mid / junior…)
53
+ - **currency:** as declared (ask if unset; THB is common for Thai clients)
54
+ - **contingency:** % buffer for unknowns (ask if unset)
55
+ - **payment milestones:** by-phase, split (e.g. 30/40/30), or none
56
+ - **language:** rendered doc language (default = project language)
57
+
58
+ Compute cost per phase, then a **Total as a RANGE (low–high)** that already folds
59
+ in contingency. Show the math **in chat to the human** (rate × effort + contingency).
60
+ **Timeline:** phases in dependency order → calendar estimate (note parallelism).
61
+
62
+ ### CLIENT-DOC RULE (hard — commercial privacy)
63
+ Client-facing artifacts (`docs/PROPOSAL.md` client sections, `docs/proposal.html`,
64
+ and any PDF/print) MUST show **totals and phase costs only**.
65
+ **Never** print: hourly/day rates, rate cards, contingency %, “incl. X% buffer”,
66
+ salary, or the estimate math. Contingency is already inside the numbers — do not
67
+ label it on the client page.
49
68
 
50
69
  ## STEP 4 — ASSUMPTIONS & EXCLUSIONS
51
70
  List every assumption the estimate rests on (infra provided, third-party/licence
@@ -54,29 +73,41 @@ change-orders re-price against.
54
73
 
55
74
  ## STEP 5 — WRITE + RENDER
56
75
  1. Write `docs/PROPOSAL.md` — the SOURCE OF TRUTH (versioned v1 + date). This is
57
- what `CHANGES.md` re-prices against. Template:
76
+ what `CHANGES.md` re-prices against. **Client-safe** body (no rate / no
77
+ contingency %):
58
78
  ```
59
79
  # Proposal — <project> (v1, <date>)
60
80
  ## Scope — in-scope: … | out-of-scope: …
61
81
  ## Phases — table: phase | complexity | effort (range) | cost
62
- ## Total — <low>–<high> (incl. <buffer>% contingency)
82
+ ## Total — <low>–<high> ← totals only; no “incl. X% contingency”
63
83
  ## Timeline — <estimate>, dependency order
64
84
  ## Assumptions — …
65
85
  ## Exclusions — …
66
86
  ## Payment — milestones (if any)
67
87
  ## Sign-off — approved by: ___ date: ___ version: v1
68
88
  ```
89
+ If you keep an internal rate memo, put it in a **separate private** file (not
90
+ the client PROPOSAL.md / HTML). PROPOSAL.md itself stays client-safe so it can
91
+ be shared.
92
+
69
93
  2. RENDER a client-facing `docs/proposal.html` from `.claude/templates/proposal.html`:
70
94
  copy it, replace every `{{PLACEHOLDER}}`, and fill the CONTENT in the declared
71
95
  language (the section labels are already bilingual TH / EN). It must fit ONE A4
72
96
  page — be terse (≈ 3–6 phase rows, ≈ 4 assumptions, short scope items); trim before
73
97
  it spills to a second page. Fill `{{COMPANY}}` / `{{COMPANY_TAGLINE}}` / `{{LOGO}}`
74
98
  from the ISSUING company's brand declared in OVERVIEW (or ask once) — white-label,
75
- never hardcode the kit's name. Print-ready (Ctrl/Cmd-P → A4 → Save as PDF). Keep
76
- PROPOSAL.md (source) and proposal.html (deliverable) in sync.
99
+ never hardcode the kit's name. Leave `{{TOTAL_NOTE}}` empty or a non-rate line
100
+ (e.g. currency / “ราคารวมทั้งโครงการ”) — **never** a contingency % or rate.
101
+ Print-ready (Ctrl/Cmd-P → A4 → Save as PDF). Keep PROPOSAL.md and proposal.html
102
+ in sync.
77
103
 
78
104
  ## STEP 6 — SIGN-OFF GATE
79
105
  Show me the proposal. **STOP for approval** (commercial gate — always interactive).
80
106
  On approval: record the approved version + date in PROPOSAL.md and STATE.md, and
81
- append a HISTORY line `proposal v<n> approved (<total>)`. Building starts only after
82
- sign-off. On rejection: revise per feedback and re-show.
107
+ append a HISTORY line `proposal v<n> approved (<total>)`.
108
+
109
+ **Next (quoted / client work):** before `/phase`, run the **DESIGN + ARCHITECTURE
110
+ gates** (METHODOLOGY lifecycle · hard rule 15) — produce `docs/UX-PACK.md` +
111
+ `docs/ARCHITECTURE.md`, get human approve, stamp STATE. Building starts only after
112
+ proposal sign-off **and** those gates (or explicit skip for internal non-quoted
113
+ work). On rejection: revise per feedback and re-show.
@@ -21,11 +21,16 @@ If any fail -> STOP, tell me, recommend `/phase`.
21
21
  (Hard rule 10: never route phase-worthy work through `/quick` to dodge the RED gate.)
22
22
 
23
23
  Steps:
24
+ 0. UNDERSTAND-FIRST (hard rule 14): brief back in 2–3 lines — the change as you
25
+ understand it · file(s) you'll touch · blast radius — and WAIT for my confirm.
26
+ One cheap turn beats redoing a misunderstood edit. (Already confirmed in this
27
+ conversation? say so and proceed — don't re-ask the same understanding.)
24
28
  1. grep docs/ISSUES.md for anything related.
25
29
  2. Make the change. Smallest diff that works.
26
30
  3. Run it — lint/typecheck/smoke. Show me result.
27
- 4. REGRESSION GUARD: run `scripts/regression.sh` (mock corpus). A break BLOCKS the
28
- `/quick` — surface it to me and stop. No agent chain is added.
31
+ 4. REGRESSION GUARD: run `scripts/regression.sh` (mock corpus). No corpus in this
32
+ repo? run the project's own test suite instead (or the touched area's tests).
33
+ A break BLOCKS the `/quick` — surface it to me and stop. No agent chain is added.
29
34
  5. Error you cannot fix in 2 tries -> STOP. Recommend `/phase`.
30
35
  6. Change revealed a bug -> `/log-issue`.
31
36
  7. ARCHITECTURE SELF-CHECK: touched an agent, hook, command, or workflow rule?
@@ -49,7 +49,16 @@ sign-off** — a release gate, always interactive in both modes.
49
49
  On a SIGNED sign-off only: deploy to production, smoke-test prod (health 200), update
50
50
  `docs/ENDPOINTS.md` base URL, tag the release. HISTORY line: `released v<n> (<date>)`.
51
51
 
52
- ## STAGE 8 — GO-LIVE & SUPPORT
53
- Enter after-go-live support (hypercare): watch for incidents, keep the issue log live.
54
- New scope → `/change-request` (impact + re-price + sign-off). The project is live; the
55
- loop continues through change requests.
52
+ ## STAGE 8 — GO-LIVE & SUPPORT (hypercare)
53
+ Enter after-go-live support:
54
+
55
+ 1. **Watch** — incidents, error budgets, critical paths; keep `docs/ISSUES.md` live.
56
+ 2. **Front door** — route client/prod reports through `/support` (severity P1–P3,
57
+ warranty vs billable). Warranty defects → `/quick` (or larger lane); do not
58
+ silently expand scope for free.
59
+ 3. **New scope** → `/change-request` (impact + re-price + sign-off).
60
+ 4. **Ops memory** — update `/runbook` when a fix changes operational steps.
61
+ 5. Default warranty window if unset: **30 days** from this promote (STATE/HISTORY);
62
+ override from PROPOSAL assumptions when present.
63
+
64
+ The project is live; the loop continues through `/support` and change requests.
@@ -0,0 +1,43 @@
1
+ ---
2
+ description: After-go-live support triage — severity, warranty vs billable CR, hotfix via /quick or route to /change-request. Use for bugs and issues in hypercare / warranty.
3
+ argument-hint: [symptom or ticket summary · "dry-run"]
4
+ ---
5
+
6
+ Caveman ULTRA mode. You are the ORCHESTRATOR.
7
+
8
+ Purpose: handle production / post-release issues like a small software house —
9
+ triage first, then fix under warranty or open a billable CR. Issue: $ARGUMENTS
10
+
11
+ DRY-RUN: if `$ARGUMENTS` contains `dry-run`/`--dry-run`, print the triage plan and
12
+ STOP. Log and fix nothing.
13
+
14
+ Apply the `support-triage` skill.
15
+
16
+ ## PRE-FLIGHT
17
+ Read `docs/PROPOSAL.md` (warranty / support assumptions if any), `docs/STATE.md`,
18
+ `docs/ISSUES.md`, `docs/RUNBOOK.md` (if present), and recent HISTORY release lines.
19
+ No live release yet → say so; may still log the issue for pre-prod.
20
+
21
+ ## STEP 1 — TRIAGE
22
+ Brief-back (rule 14) then classify:
23
+
24
+ | Field | Values |
25
+ |-------|--------|
26
+ | Severity | **P1** (down / data loss / security) · **P2** (major feature broken, workaround) · **P3** (minor / cosmetic) |
27
+ | Type | defect vs approved scope · clarification · **new scope** |
28
+ | Commercial | **warranty** (in support window, defect) · **billable** (out of window or new scope) · **unclear** (ask) |
29
+
30
+ Default warranty window if unset in PROPOSAL/OVERVIEW: **30 days** after production
31
+ promote (`released` HISTORY line). Ask once if the human wants a different window.
32
+
33
+ ## STEP 2 — ROUTE
34
+ - **Warranty defect** → `/log-issue` (severity in title/symptom) → fix with `/quick`
35
+ (or `/phase` / `/feature` if phase-worthy — do not dodge TDD via quick for large
36
+ work, rule 10). P1: prioritize; note runbook updates via `/runbook` if ops-related.
37
+ - **Billable / new scope** → `/change-request` (do not silently build free work).
38
+ - **Unclear** → STOP and ask warranty vs billable before coding.
39
+
40
+ ## STEP 3 — CLOSE THE LOOP
41
+ - Confirm ISSUES entry + HISTORY note `support P<n>: <title> → <route>`.
42
+ - If fixed under warranty: mark issue resolved; no PROPOSAL bump.
43
+ - Reminder: release STAGE 8 hypercare keeps ISSUES live; `/support` is the front door.
@@ -139,6 +139,8 @@ emit(' Hard-stops only: security / irreversible-or-outbound actions / contradic
139
139
  emit('- caveman ULTRA mode is active.');
140
140
  emit('- PLAN-APPROVAL gate (rule 13): no /phase or /sprint while STATE `plan:` reads');
141
141
  emit(' PENDING — the plan needs a human sign-off via /overview first.');
142
+ emit('- UNDERSTAND-FIRST (rule 14): new free-text task -> brief back your understanding');
143
+ emit(' (goal · scope · assumptions · blast radius) and WAIT for confirm before executing.');
142
144
  emit('- before debugging ANY error: grep ISSUES.md AND research/INDEX.md first.');
143
145
  emit('- debug attempts: WARN at 2; cap 3. AUTO: log + park the slice + continue (batched');
144
146
  emit(' report at the phase boundary). GUIDED: stop and ask you.');
@@ -106,34 +106,55 @@ from idea to closeout:
106
106
  5. **Proposal & estimate (OPTIONAL — depends on the job)** — for client / quoted
107
107
  work, `/propose` reads OVERVIEW + PLAN → `docs/PROPOSAL.md` + a rendered
108
108
  `docs/proposal.html`: scope, phase breakdown, effort + cost estimate, timeline,
109
- assumptions, with a **client sign-off gate** before build. Internal / personal
110
- projects skip straight from plan to build.
111
- 6. **Build** — the loop, one phase at a time (`/phase`, AUTO dev loop). Each phase's
109
+ assumptions, with a **client sign-off gate** before build. **Ask rate +
110
+ contingency in chat** when missing — the kit stores **no** default rate (rates
111
+ are confidential). Client docs show **totals only** (never rate or contingency %).
112
+ Internal / personal projects skip straight from plan to build (and may set
113
+ design/architecture gates to `n/a`).
114
+ 6. **Design + architecture gates (rule 15 — after proposal, before build)** —
115
+ `/design` produces `docs/UX-PACK.md` + `docs/ARCHITECTURE.md` and stops for
116
+ human approve. Vertical slices still implement UI+code together; these gates
117
+ lock the *frame* first (software-house shape without abandoning slices).
118
+ 7. **Build** — the loop, one phase at a time (`/phase`, AUTO dev loop). Each phase's
112
119
  tests (unit + integration + e2e) are automated and MUST pass before the next phase.
113
120
  Optionally wrap the phases in the **sprint layer** (`/sprint`): group them into
114
121
  capacity-bounded sprints, each shipping one demoable increment with planning →
115
122
  standups → review → retro. `/sprint run` drives this end-to-end (see Sprint layer).
116
- 7. **Change mid-flight** — `/change-request`: impact analysis + re-estimate + a logged
117
- change order (`docs/CHANGES.md`) + sign-off, then `/replan`. Scope and cost never
118
- change silently.
119
- 8. **Release** — `/release`: full regression (functional/integration/e2e) → auto
123
+ 8. **Change mid-flight** — `/change-request`: impact analysis + re-estimate + a logged
124
+ change order (`docs/CHANGES.md` + `docs/changes/CR-<n>.md`) + sign-off, then
125
+ `/replan`. Scope and cost never change silently. Client-facing CR = Δ cost + new
126
+ total only.
127
+ 9. **Release** — `/release`: full regression (functional/integration/e2e) → auto
120
128
  audits (UI / QA / security / code) → smoke → **manual UAT** (`/uat`, scenario sheet
121
129
  + captured results) → defect loop → **sign-off** (`docs/SIGNOFF-…`) → promote to
122
130
  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,
131
+ 10. **Go-live & support** — hypercare + `/support` triage (severity, warranty vs
132
+ billable CR, hotfix via `/quick`). New scope → `/change-request`.
133
+ 11. **Closeout** — `/synthesize` → a project summary: what was built, key decisions,
126
134
  every change order, and the final cost vs the original estimate.
127
135
 
128
136
  **Logging is continuous and total.** Every stage writes to a durable artifact:
129
- requirements (PRD / OVERVIEW), commercial (PROPOSAL / CHANGES), execution
130
- (PLAN / HISTORY), decisions (DESIGN_LOG), errors (ISSUES), research (research/).
131
- Nothing important lives only in chat — it is on disk, so the project can always be
132
- reconstructed and summarised.
137
+ requirements (PRD / OVERVIEW), commercial (PROPOSAL / CHANGES), design
138
+ (UX-PACK / ARCHITECTURE), execution (PLAN / HISTORY), decisions (DESIGN_LOG),
139
+ errors (ISSUES), research (research/). Nothing important lives only in chat — it
140
+ is on disk, so the project can always be reconstructed and summarised.
133
141
 
134
142
  **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.
143
+ (rule 13), the proposal sign-off, **DESIGN + ARCHITECTURE** (rule 15), and every
144
+ change-order approval pause for the human. AUTO governs the *dev loop between*
145
+ those gates, never the plan, the money, or the design/arch frame.
146
+
147
+ ### Software-house roles → kit map
148
+
149
+ | House role | Kit surface |
150
+ |------------|-------------|
151
+ | BA / PM | `/overview` grill · `grill-me` · PLAN / PROPOSAL / CR gates |
152
+ | UX / UI | `/design` (UX pack) · `ux-design` skill · `/ui-audit` · rule 9 CLOSE |
153
+ | Architect | `/design` (ARCHITECTURE) · `researcher` DESIGN · `code-standards` · `/log-decision` |
154
+ | Developer | `implementer` · `/phase` · `/feature` · `/quick` |
155
+ | QA | `test-author` · `e2e-runner` · `/qa-audit` · `/uat` |
156
+ | DevOps | final-phase deploy · `/release` promote |
157
+ | Support | `/support` · `/log-issue` · `/runbook` · release hypercare |
137
158
 
138
159
  -----
139
160
 
@@ -258,6 +279,20 @@ can. Escalation is at most two hops.
258
279
 
259
280
  The orchestrator ROUTES. It does not implement or debug.
260
281
 
282
+ **Model routing (per-role tiers).** Each role's `.claude/agents/<role>.md` pins a
283
+ `model:` tier suited to its work, so the RIGHT model runs each task by default:
284
+
285
+ | Role | `model:` | Why |
286
+ |------|----------|-----|
287
+ | planner · debugger · implementer · test-author | `inherit` | hardest reasoning — follows the session model the OWNER picked (`/model` / `--model`), so one choice cascades |
288
+ | researcher · e2e-runner | `sonnet` | judgment-heavy but mid-tier is the sweet spot |
289
+ | synthesizer | `haiku` | mechanical compression — cheapest tier |
290
+
291
+ Owner wants a SPECIFIC model? Edit the role's `model:` line — values `haiku` ·
292
+ `sonnet` · `opus` · `inherit` · or a full model id. The installer is
293
+ non-destructive, so your pins survive kit updates. Hosts without per-agent model
294
+ support run everything on the session model (graceful degrade).
295
+
261
296
  -----
262
297
 
263
298
  ## Procedures (the slash-command set)
@@ -266,12 +301,23 @@ Named procedures, each with a canonical body in `.claude/commands/<name>.md`.
266
301
 
267
302
  **Lane routing — which entry point for which job:**
268
303
 
304
+ **Default paths** (most days — elevate these in HOW-TO / landing):
305
+
269
306
  | The job | Lane |
270
307
  |---------|------|
271
- | Brand-new project (no OVERVIEW yet) | `/overview` → `/phase` (optionally `/sprint`) |
308
+ | Brand-new project (no OVERVIEW yet) | `/overview` → (`/propose` if quoted) → `/design` → `/phase` (optionally `/sprint`) |
272
309
  | New FEATURE on an existing product | `/feature` (scaffold the doc with `/feature new`) |
273
310
  | Small, obvious, non-phase change (a fix, a rename, a copy tweak) | `/quick` |
311
+
312
+ **Advanced** (same kit — do not cut; use when the job needs them):
313
+
314
+ | The job | Lane |
315
+ |---------|------|
316
+ | Client quote after plan approval | `/propose` (asks rate; client totals only) |
317
+ | UX pack + architecture sign-off | `/design` (rule 15) |
274
318
  | Scope change to already-approved work | `/change-request` |
319
+ | After-go-live bug / triage | `/support` |
320
+ | An OUTCOME spanning several units ("clear the feature queue") | `/goal` (drives the lanes above) |
275
321
  | Whole-product quality sweep / pre-release | `/ui-audit` · `/qa-audit` · `/security-audit` · `/release` |
276
322
 
277
323
  On ambiguity between `/quick` and `/feature`: does it add or change a public
@@ -287,10 +333,22 @@ surface or need its own acceptance criteria? -> `/feature`. Otherwise `/quick`.
287
333
  story into a PENDING doc (approval stays human). Gate checklist in
288
334
  `docs/features/<slug>/GATES.md`, enforced by the `Stop` hook with artifact
289
335
  verification. Headless-capable (CI / Docker, `ISSFLOW_HEADLESS=1`). See "Feature lane".
336
+ - **goal [set|run|status|done|drop]** — the goal layer: declare an OUTCOME with a
337
+ measurable Done-when + budget (`set`, behind the rule-14 brief-back), then
338
+ `run` loops pick-next-unit → route lane → tick until done / budget / hard-stop.
339
+ Goal-driven, not time-driven: it stops itself on the finish line. Recurrence is
340
+ host-level (interval loop or the cron-ready `issflow-goal.yml`). `docs/GOALS.md`
341
+ holds state; its `Approved:` line arms headless passes.
290
342
  - **propose** — turn approved requirements + stack into `PROPOSAL.md` (scope, phase
291
343
  breakdown, effort + cost estimate, assumptions) with a client sign-off gate.
344
+ Asks rate/contingency in chat when missing; client artifacts are totals-only.
345
+ - **design** — post-proposal UX pack + architecture note (`UX-PACK.md` /
346
+ `ARCHITECTURE.md`) with human approve (rule 15) before `/phase`.
292
347
  - **change-request** — a mid-project scope change: impact analysis + re-estimate +
293
- a logged change order (`CHANGES.md`) + sign-off, then `replan`.
348
+ a logged change order (`CHANGES.md` + `docs/changes/CR-<n>.md`) + sign-off, then
349
+ `replan`. Client sees Δ cost + new total only.
350
+ - **support** — after-go-live triage: severity P1–P3, warranty vs billable CR,
351
+ hotfix via `/quick` or route to `/change-request`.
294
352
  - **phase [n]** — run one phase end-to-end with the circuit breaker. Chooses the
295
353
  TDD or non-TDD order at RESEARCH. CLOSE runs the regression guard + ENDPOINTS
296
354
  coverage gate. When a sprint is active, CLOSE also fires a `/sprint standup` tick.
@@ -441,7 +499,7 @@ Mirrors the installer's `--dry-run`. (In a dry-run, even AUTO never acts — it
441
499
 
442
500
  -----
443
501
 
444
- ## Hard rules (1–13)
502
+ ## Hard rules (1–15)
445
503
 
446
504
  1. Before debugging ANY error: grep `docs/ISSUES.md` AND `docs/research/INDEX.md`.
447
505
  The SESSION-OPEN ritual surfaces ISSUES.md — there is no excuse to miss it.
@@ -505,6 +563,24 @@ Mirrors the installer's `--dry-run`. (In a dry-run, even AUTO never acts — it
505
563
  the planning twin of the commercial sign-off gate (`/propose`). A `/replan` that
506
564
  adds or reshapes UNBUILT scope reverts the affected plan to `PENDING` and
507
565
  re-surfaces it for confirmation before those phases run.
566
+ 14. **UNDERSTAND-FIRST gate (brief-back).** No new task starts executing on an
567
+ unconfirmed understanding. Any command that takes free-text work (`/quick`,
568
+ `/change-request`, `/goal set`, the `/overview` grill) BRIEFS BACK first:
569
+ restate the task — goal · scope · out-of-scope · assumptions · plan sketch ·
570
+ blast radius — then WAIT for explicit confirmation before touching anything.
571
+ A recorded approval artifact IS the confirmation for its lane (approved
572
+ PLAN → phases · APPROVED FEATURE doc → the feature lane · approved CR → the
573
+ change · `Approved:` goal → goal runs) — that is exactly what arms headless.
574
+ Rationale: a wrong understanding burns tokens and context at 100× the cost
575
+ of one confirm turn. AUTO governs execution AFTER intake, never instead of it.
576
+ 15. **DESIGN + ARCHITECTURE gates.** After a client proposal is signed (quoted
577
+ work), no `/phase` / `/sprint` build starts until `docs/UX-PACK.md` and
578
+ `docs/ARCHITECTURE.md` carry human approval, recorded as `design:` /
579
+ `architecture:` in `docs/STATE.md` plus HISTORY lines. Run `/design` to
580
+ author and stop for sign-off. Internal / non-quoted projects may set both to
581
+ `n/a`. A CR that reshapes UX or architecture reverts the affected gate to
582
+ `PENDING`. Client-facing commercial docs never include rate cards or
583
+ contingency percentages (ask rates in chat; totals only on the page).
508
584
 
509
585
  -----
510
586
 
@@ -540,14 +616,17 @@ the KB. The kit works normally without a KB.
540
616
  ## File contract
541
617
 
542
618
  - `docs/PRD.md` — crystallised product requirements (or your BMAD/iSSM stories).
543
- - `docs/PROPOSAL.md` — scope + phase breakdown + effort/cost estimate + assumptions
544
- + sign-off. Versioned; the commercial baseline (source of truth).
619
+ - `docs/PROPOSAL.md` — scope + phase breakdown + effort/cost totals + assumptions
620
+ + sign-off. Versioned; client-safe commercial baseline (no rate / contingency %).
545
621
  - `docs/proposal.html` — the client-facing proposal, rendered from PROPOSAL.md via
546
622
  `.claude/templates/proposal.html`, in the project language; print-ready (PDF).
547
- - `.claude/templates/` — client-facing document templates (proposal.html, …) the
548
- commands render into `docs/`.
623
+ - `docs/UX-PACK.md` · `docs/ARCHITECTURE.md` — pre-build design/arch frames
624
+ (rule 15); templates under `.claude/templates/`.
625
+ - `.claude/templates/` — document templates (proposal.html, UX-PACK, ARCHITECTURE,
626
+ CR, FEATURE, …) the commands render into `docs/`.
549
627
  - `docs/CHANGES.md` — change-order log (append-only): each scope change with its
550
628
  impact, effort/cost delta, new total, and approval status. The commercial audit trail.
629
+ - `docs/changes/CR-<n>.md` — detailed CR from `CR-template.md` (client-safe totals).
551
630
  - `docs/UAT-<date>.md` — UAT scenario sheet (all cases) + captured tester results
552
631
  (PASS/FAIL + notes). Drives the release defect loop.
553
632
  - `docs/SIGNOFF-<date>.md` — release sign-off: scope delivered, test/audit/UAT
@@ -561,13 +640,17 @@ the KB. The kit works normally without a KB.
561
640
  `BLOCKED.md` (headless blocker reports).
562
641
  - `docs/WISDOM-QUEUE.md` — auto-appended wisdom candidates from feature runs;
563
642
  `/store-wisdom` reads it before pushing to the shared KB (push stays human).
564
- - `.claude/templates/automation/` — headless-runner sources (GitHub Action ·
643
+ - `.claude/templates/automation/` — headless-runner sources (GitHub Actions ·
565
644
  Dockerfile · docker wrapper), materialized by `create-issflow --ci` /
566
- `--docker` as `.github/workflows/issflow-feature.yml` · `Dockerfile.issflow` ·
567
- `scripts/feature-docker.js`.
645
+ `--docker` as `.github/workflows/issflow-feature.yml` +
646
+ `.github/workflows/issflow-goal.yml` (cron-ready, disarmed by default) ·
647
+ `Dockerfile.issflow` · `scripts/feature-docker.js`.
648
+ - `docs/GOALS.md` — the goal layer's state: one `## G<n>` block per goal
649
+ (Done-when · Budget · `Approved:` line · progress ticks). Maintained by `/goal`.
568
650
  - `.claude/templates/FEATURE-template.md` — the Feature-doc form `/feature new`
569
651
  scaffolds (Approval/Automation headers + spec sections).
570
- - `docs/STATE.md` — current position. Small. Rewritten, not appended.
652
+ - `docs/STATE.md` — current position. Small. Rewritten, not appended. Includes
653
+ `plan:`, `design:`, `architecture:` gate pointers (approved · PENDING · n/a).
571
654
  - `docs/ISSUES.md` — error log. Deduped by synthesizer.
572
655
  - `docs/PLAN.md` — the phase plan (the product backlog). Carries an `> Approval:`
573
656
  header — `PENDING` until the rule-13 PLAN-APPROVAL gate stamps `approved <date> v<n>`;
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: support-triage
3
+ description: >
4
+ After-go-live issue triage for software-house support — severity P1–P3,
5
+ warranty vs billable CR, hotfix vs change-request routing. Use with /support,
6
+ production incidents, hypercare, client bug reports, or when classifying
7
+ whether a fix is free warranty work. Keywords: support, hypercare, warranty,
8
+ P1, severity, ticket, hotfix, aftercare, ซัพพอร์ต, รับประกัน.
9
+ ---
10
+
11
+ # support-triage — post-release front door
12
+
13
+ Caveman ULTRA mode. Triage before you code. Wrong commercial lane (free vs
14
+ billable) is a process defect.
15
+
16
+ ## Severity
17
+
18
+ | Level | Meaning | Response shape |
19
+ |-------|---------|----------------|
20
+ | **P1** | Service down, data loss, active security incident | Drop-everything; runbook; fix or mitigate now |
21
+ | **P2** | Major feature broken; workaround exists | Same-day / next business day aim |
22
+ | **P3** | Minor, cosmetic, nice-to-have | Queue; batch with other P3s |
23
+
24
+ ## Warranty vs billable
25
+
26
+ - **Warranty:** defect against **approved** scope inside the support window
27
+ (default 30 days after prod `released` unless PROPOSAL/OVERVIEW says otherwise)
28
+ → log + `/quick` (or larger lane if needed) — **no** proposal bump.
29
+ - **Billable:** new scope, enhancement, or outside window → `/change-request`.
30
+ - **Unclear:** ask once; do not assume free work.
31
+
32
+ ## Routing checklist
33
+
34
+ 1. Reproduce / capture symptom (prefer client steps).
35
+ 2. Grep `docs/ISSUES.md` + runbook — known issue?
36
+ 3. Assign P1–P3 + warranty/billable.
37
+ 4. Route: support fix · CR · or escalate (infra / vendor).
38
+ 5. HISTORY line for the triage decision.
39
+
40
+ Never put personal rate cards into public tickets or client emails from this skill.
@@ -27,18 +27,23 @@ against the cookbook + wireframe and produces a UX CHECK verdict; nothing UI shi
27
27
  without it. New visual direction (a layout or look the wireframe doesn't cover) is
28
28
  confirmed with the user before building — design is where human taste matters.
29
29
 
30
+ - **Authoring the UX pack** (`/design` → `docs/UX-PACK.md`) after proposal sign-off
31
+ and before `/phase` (hard rule 15) — produce the frame the build must stay inside.
30
32
  - Building a screen / page / component.
31
33
  - Reviewing a UI diff (the "ตรวจ" pass).
32
34
  - CLOSE gate of any frontend phase — the cookbook check MUST pass.
33
35
 
34
- This skill is the STANDARD + the inline GATE (one screen, at phase close). For a
35
- WHOLE-PRODUCT sweep against this same cookbook — periodic or before a release — run
36
- `/ui-audit` (same rubric, broader scope, a scored report).
36
+ This skill is the STANDARD + the inline GATE (one screen, at phase close) **and**
37
+ the authoring guide for the pre-build UX pack. For a WHOLE-PRODUCT sweep against
38
+ this same cookbook — periodic or before a release — run `/ui-audit` (same rubric,
39
+ broader scope, a scored report).
37
40
 
38
41
  Order: **wireframe first** (does the layout match the baseline frame?) ->
39
42
  **cookbook** (do the details obey the system?). Never invent layout the
40
43
  wireframe does not have. If the design truly needs a frame the wireframe lacks,
41
44
  STOP and update the wireframe baseline first (a design decision -> `log-decision`).
45
+ When an approved `docs/UX-PACK.md` exists, treat it as the project frame — drift
46
+ from the pack is a defect unless the pack is re-approved.
42
47
 
43
48
  -----
44
49
 
@@ -0,0 +1,53 @@
1
+ # Architecture — <project>
2
+
3
+ > Approval: PENDING
4
+ > (Stamp on sign-off: `approved <YYYY-MM-DD> v<n>` — hard rule 15)
5
+
6
+ ## Purpose
7
+ Build-ready architecture note after commercial sign-off. Refines OVERVIEW stack
8
+ into concrete boundaries the implementer follows per phase.
9
+
10
+ ## Context
11
+ - OVERVIEW stack summary:
12
+ - Constraints / non-goals:
13
+
14
+ ## Pattern
15
+ - Declared architecture: Feature-Based (default) | layered | hexagonal | other:
16
+ - Why this fits:
17
+
18
+ ## System diagram (text)
19
+ ```
20
+ (clients) → (API / BFF) → (domain) → (data / external)
21
+ ```
22
+
23
+ ## Boundaries & modules
24
+ | Module | Owns | Talks to |
25
+ |--------|------|----------|
26
+ | | | |
27
+
28
+ ## Data
29
+ - Stores / schemas (high level):
30
+ - Migrations approach:
31
+
32
+ ## Auth & trust boundaries
33
+ - Authn / authz:
34
+ - Secrets:
35
+ - Threat notes (STRIDE if security-touching):
36
+
37
+ ## Integrations
38
+ | Service | Use | Failure mode |
39
+ |---------|-----|--------------|
40
+ | | | |
41
+
42
+ ## Quality & ops
43
+ - Test + E2E runners (from OVERVIEW):
44
+ - Deploy target:
45
+ - Observability / runbook hooks:
46
+
47
+ ## Decisions open
48
+ -
49
+
50
+ ## Sign-off
51
+ - Approved by: ___
52
+ - Date: ___
53
+ - Version: v1
@@ -0,0 +1,34 @@
1
+ # CR-<n> — <short title>
2
+
3
+ > Status: proposed | approved | rejected
4
+ > Date: <YYYY-MM-DD>
5
+ > Baseline: PROPOSAL v<n> | FEATURE `<slug>`
6
+
7
+ ## Classification
8
+ - [ ] Clarification (no cost change)
9
+ - [ ] Billable scope change (add / remove / alter)
10
+ - [ ] Warranty defect (prefer `/support` / `/quick` — not billable unless scope expands)
11
+
12
+ ## Request
13
+ <what the client / stakeholder asked>
14
+
15
+ ## Impact
16
+ - Phases affected (done phases frozen):
17
+ - UX pack impact: none | amend → re-approve (rule 15)
18
+ - Architecture impact: none | amend → re-approve (rule 15)
19
+ - Security re-threat-model?: no | yes
20
+ - Timeline Δ:
21
+
22
+ ## Commercial (client-safe)
23
+ | | |
24
+ |--|--|
25
+ | Effort Δ | <± range> |
26
+ | Cost Δ | <± amount · currency> |
27
+ | New total | <amount> |
28
+
29
+ **Do not** put rate, rate card, or contingency % in this file if it is shared with
30
+ the client. Show math with rates only in private chat / private estimate memo.
31
+
32
+ ## Decision
33
+ - Approved by: ___ · Date: ___
34
+ - Or rejected because:
@@ -0,0 +1,37 @@
1
+ # UX pack — <project>
2
+
3
+ > Approval: PENDING
4
+ > (Stamp on sign-off: `approved <YYYY-MM-DD> v<n>` — hard rule 15)
5
+
6
+ ## Purpose
7
+ Hi-fi-enough UI direction for build: screens, flows, and frame the implementer
8
+ must stay inside. Wireframe baseline first; visual direction confirmed here.
9
+
10
+ ## Users & jobs
11
+ -
12
+
13
+ ## Key flows
14
+ 1.
15
+ 2.
16
+
17
+ ## Screen inventory
18
+ | Screen | Job | Priority |
19
+ |--------|-----|----------|
20
+ | | | |
21
+
22
+ ## Frame & tokens
23
+ - Wireframe baseline: (link or summary)
24
+ - Brand / tokens: (or “follow OVERVIEW UX direction”)
25
+ - Breakpoints: XS · SM · MD · LG · XL
26
+
27
+ ## States & a11y notes
28
+ - Empty / loading / error covered for each primary view
29
+ - WCAG 2.1 AA targets
30
+
31
+ ## Out of scope (design)
32
+ -
33
+
34
+ ## Sign-off
35
+ - Approved by: ___
36
+ - Date: ___
37
+ - Version: v1
@@ -28,6 +28,10 @@ RUN useradd --create-home --shell /bin/sh runner
28
28
  USER runner
29
29
  WORKDIR /work
30
30
 
31
+ # the mounted repo is owned by the HOST uid, not `runner` — without this every
32
+ # git command fails with "detected dubious ownership in repository".
33
+ RUN git config --global --add safe.directory '*'
34
+
31
35
  # headless marker — /feature degrades every hard-stop to a BLOCKED report + clean exit.
32
36
  ENV ISSFLOW_HEADLESS=1
33
37
 
@@ -82,16 +82,17 @@ if (useWorktree) {
82
82
  console.log(`feature-docker: parallel lane — this run is isolated in ${wt}; your checkout stays untouched.`);
83
83
  }
84
84
 
85
- console.log(`feature-docker: running /feature ${doc} in ${IMAGE} (repo mounted at /work)`);
86
- const args = [
87
- 'run', '--rm',
88
- '--entrypoint', 'claude',
89
- '-v', `${mountDir}:/work`, '-w', '/work',
90
- ];
91
- // a worktree's .git is a FILE pointing at the main repo's .git by absolute host
92
- // path — mount the main repo at that same path so git resolves inside the
93
- // container. (Path-identical mounts: Linux/macOS; on Windows use the default mode.)
94
- if (useWorktree) args.push('-v', `${repo}:${repo}`);
85
+ console.log(`feature-docker: running /feature ${doc} in ${IMAGE}`);
86
+ const args = ['run', '--rm', '--entrypoint', 'claude'];
87
+ if (useWorktree) {
88
+ // a worktree's git metadata references BOTH trees by absolute HOST path
89
+ // (.git file -> main .git/worktrees/<n>; gitdir file -> back to the worktree).
90
+ // Mount both at their host paths so every pointer resolves in-container.
91
+ // (Path-identical mounts: Linux/macOS; on Windows use the default mode.)
92
+ args.push('-v', `${repo}:${repo}`, '-v', `${mountDir}:${mountDir}`, '-w', mountDir);
93
+ } else {
94
+ args.push('-v', `${mountDir}:/work`, '-w', '/work');
95
+ }
95
96
  args.push(
96
97
  '-e', 'ANTHROPIC_API_KEY',
97
98
  '-e', 'ISSFLOW_HEADLESS=1'
@@ -66,9 +66,10 @@ jobs:
66
66
  anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
67
67
  github_token: ${{ secrets.GITHUB_TOKEN }}
68
68
  prompt: "/feature ${{ env.FEATURE_DOC }}"
69
- # Ephemeral runner = the sandbox; the Stop hook (feature-gate.js) still
70
- # enforces the gate checklist inside the run.
71
- claude_args: "--dangerously-skip-permissions"
69
+ # Broad allowlist via the documented --allowedTools flag (the ephemeral
70
+ # runner is the sandbox). The Stop hook (feature-gate.js) still enforces
71
+ # the gate checklist inside the run.
72
+ claude_args: "--allowedTools Bash,Edit,Write,Read,Glob,Grep,Task,WebFetch,WebSearch,TodoWrite"
72
73
 
73
74
  # The lane's own delivery step (git push / PR) runs inside Claude per the
74
75
  # doc's `> Automation:` header. This job only reports.
@@ -0,0 +1,48 @@
1
+ # iStartSoftFlow — scheduled goal pass (GitHub Actions).
2
+ # Installed by `npx create-issflow --ci` as .github/workflows/issflow-goal.yml.
3
+ #
4
+ # Runs ONE `/goal run` pass headless: pick next actionable unit -> route lane ->
5
+ # tick -> repeat until Done-when / budget / hard-stop. The goal's `> Approved:`
6
+ # line in docs/GOALS.md is the recorded consent that arms the run; a lane
7
+ # hard-stop writes BLOCKED.md and exits cleanly. It never merges, never deploys.
8
+ #
9
+ # DISARMED BY DEFAULT: uncomment `schedule:` to run on cron. Manual dispatch
10
+ # always works. Setup: secret ANTHROPIC_API_KEY + Actions write permissions
11
+ # (same as issflow-feature.yml).
12
+
13
+ name: issflow-goal
14
+
15
+ on:
16
+ workflow_dispatch:
17
+ inputs:
18
+ goal_id:
19
+ description: Goal id to run (blank = the single active goal)
20
+ required: false
21
+ type: string
22
+ # schedule:
23
+ # - cron: '0 1 * * 1-5' # 01:00 UTC weekdays — one pass per night
24
+
25
+ permissions:
26
+ contents: write
27
+ pull-requests: write
28
+ issues: write
29
+
30
+ jobs:
31
+ goal:
32
+ runs-on: ubuntu-latest
33
+ timeout-minutes: 120
34
+ steps:
35
+ - uses: actions/checkout@v4
36
+ with:
37
+ fetch-depth: 0
38
+
39
+ - name: Run one goal pass
40
+ uses: anthropics/claude-code-action@v1
41
+ env:
42
+ ISSFLOW_HEADLESS: "1"
43
+ with:
44
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
45
+ github_token: ${{ secrets.GITHUB_TOKEN }}
46
+ prompt: "/goal run ${{ inputs.goal_id }}"
47
+ # Documented --allowedTools flag; the ephemeral runner is the sandbox.
48
+ claude_args: "--allowedTools Bash,Edit,Write,Read,Glob,Grep,Task,WebFetch,WebSearch,TodoWrite"
@@ -91,7 +91,8 @@
91
91
 
92
92
  <div class="total">
93
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>
94
+ <!-- CLIENT-SAFE: totals only. Never put rate, rate card, or contingency % in {{TOTAL_NOTE}}. Leave empty or a non-rate label (e.g. currency). -->
95
+ <span class="amt">{{TOTAL_COST}} <small>{{TOTAL_NOTE}}</small></span>
95
96
  </div>
96
97
 
97
98
  <div class="cols">