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.
- package/README.md +7 -7
- package/bin/cli.js +23 -22
- package/package.json +1 -1
- package/template/.claude/agents/debugger.md +1 -1
- package/template/.claude/agents/e2e-runner.md +1 -1
- package/template/.claude/agents/implementer.md +1 -1
- package/template/.claude/agents/planner.md +1 -1
- package/template/.claude/agents/researcher.md +1 -1
- package/template/.claude/agents/test-author.md +1 -1
- package/template/.claude/commands/change-request.md +35 -14
- package/template/.claude/commands/design.md +51 -0
- package/template/.claude/commands/feature.md +6 -0
- package/template/.claude/commands/goal.md +77 -0
- package/template/.claude/commands/log-issue.md +3 -0
- package/template/.claude/commands/overview.md +10 -3
- package/template/.claude/commands/phase.md +10 -0
- package/template/.claude/commands/propose.md +49 -18
- package/template/.claude/commands/quick.md +7 -2
- package/template/.claude/commands/release.md +13 -4
- package/template/.claude/commands/support.md +43 -0
- package/template/.claude/hooks/session-start.js +2 -0
- package/template/.claude/istartsoft-flow/METHODOLOGY.md +110 -27
- package/template/.claude/skills/support-triage/SKILL.md +40 -0
- package/template/.claude/skills/ux-design/SKILL.md +8 -3
- package/template/.claude/templates/ARCHITECTURE-template.md +53 -0
- package/template/.claude/templates/CR-template.md +34 -0
- package/template/.claude/templates/UX-PACK-template.md +37 -0
- package/template/.claude/templates/automation/Dockerfile +4 -0
- package/template/.claude/templates/automation/feature-docker.js +11 -10
- package/template/.claude/templates/automation/issflow-feature.yml +4 -3
- package/template/.claude/templates/automation/issflow-goal.yml +48 -0
- 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 #
|
|
11
|
-
npx create-issflow --tool=
|
|
12
|
-
# then open your tool
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
-
|
|
61
|
-
|
|
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 '
|
|
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 ·
|
|
221
|
-
'/release · /uat · /change-request · /replan · /quick · /synthesize ·
|
|
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)
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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?)**,
|
|
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
|
|
44
|
-
-
|
|
45
|
-
contingency)
|
|
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
|
|
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
|
-
|
|
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**
|
|
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
|
|
61
|
-
language); then dispatch `/replan` to
|
|
62
|
-
phases stay frozen). Update STATE.md.
|
|
63
|
-
`> Approval: PENDING` and re-runs the
|
|
64
|
-
|
|
65
|
-
`/sprint` stay blocked until you also
|
|
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
|
|
142
|
-
|
|
143
|
-
|
|
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 (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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.
|
|
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>
|
|
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.
|
|
76
|
-
|
|
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>)`.
|
|
82
|
-
|
|
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).
|
|
28
|
-
|
|
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
|
|
54
|
-
|
|
55
|
-
|
|
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.
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
117
|
-
change order (`docs/CHANGES.md`) + sign-off, then
|
|
118
|
-
change silently.
|
|
119
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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),
|
|
130
|
-
(
|
|
131
|
-
Nothing important lives only in chat — it
|
|
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,
|
|
136
|
-
AUTO governs the *dev loop between*
|
|
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
|
|
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–
|
|
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
|
|
544
|
-
+ sign-off. Versioned;
|
|
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
|
-
-
|
|
548
|
-
|
|
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
|
|
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`
|
|
567
|
-
|
|
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)
|
|
35
|
-
|
|
36
|
-
`/ui-audit` (same rubric,
|
|
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}
|
|
86
|
-
const args = [
|
|
87
|
-
|
|
88
|
-
'
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
#
|
|
70
|
-
#
|
|
71
|
-
|
|
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
|
-
|
|
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">
|