@baldurpan/create-ai-workflow 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  npx @baldurpan/create-ai-workflow # or: npm create @baldurpan/ai-workflow
8
8
  ```
9
9
 
10
- You get a backlog, plan documents with phase ledgers, two verification gates, and seven commands that
10
+ You get a backlog, plan documents with phase ledgers, two verification gates, and eight commands that
11
11
  move work between them. Your coding agent runs the commands; you read and hand-edit the files.
12
12
 
13
13
  ---
@@ -39,6 +39,7 @@ starting point — nothing has to be looked up first.
39
39
  | `/feature-status` | read-only. Reconciles the ledger against the repo, then names **exactly one** next action |
40
40
  | `/feature-close` | retires a feature: a `history.md` row, a `git mv` into `archive/`, and a reviewed reference sweep |
41
41
  | `/orchestrate` | one ad-hoc, commit-sized change through the same gates — no entry, no ledger |
42
+ | `/prototype` | a throwaway HTML/CSS mockup under `prototypes/`, to settle a layout question before a plan commits to it — no gates, no application code |
42
43
  | `/onboard` | fills in your own stubs, adopting what the repo already documented and running each verification command before writing it down |
43
44
 
44
45
  ## What makes it different
@@ -57,6 +58,11 @@ test commands. No skill, agent prompt or role file carries a copy — a hardcode
57
58
  project changes shape, and a second copy rots faster. `/onboard` **runs each candidate and writes only the
58
59
  ones that exit 0.**
59
60
 
61
+ **Nothing commits unless you said it could.** `context/git.md` holds one answer — the user commits, or
62
+ the agent does — and every command that lands code reads it before closing out. It ships saying *the user
63
+ commits*: a tool installed into a repository it knows nothing about does not get to write that
64
+ repository's history unasked. Branches, pushes and pull requests are outside the workflow entirely.
65
+
60
66
  **A finding outlives the session that found it.** A reviewer `FAIL` or a capped gate is written to
61
67
  `context/findings.md` *before* the loopback, so it survives the conversation ending. An open `P0`/`P1`
62
68
  blocks its phase from being marked `done` and blocks `/feature-close`.
@@ -66,11 +72,11 @@ blocks its phase from being marked `done` and blocks `/feature-close`.
66
72
  ```
67
73
  context/
68
74
  README.md workflow.md plan-template.md plan-template.notes.md roles/ standards/ tool-owned
69
- stack.md verify.md executors.md roadmap.md history.md findings.md yours
75
+ stack.md verify.md executors.md git.md roadmap.md history.md findings.md yours
70
76
  drafts/ plans/ archive/ yours
71
77
  .state/manifest.json
72
- .claude/skills/<seven>/SKILL.md .claude/agents/*.agent.md tool-owned
73
- .agents/skills/<seven>/SKILL.md the same seven bodies, for hosts that read that tree tool-owned
78
+ .claude/skills/<eight>/SKILL.md .claude/agents/*.agent.md tool-owned
79
+ .agents/skills/<eight>/SKILL.md the same eight bodies, for hosts that read that tree tool-owned
74
80
  AGENTS.md a delimited block, merged into whatever is already there
75
81
  CLAUDE.md a single @AGENTS.md line, and only when the file does not exist
76
82
  ```
@@ -79,7 +85,7 @@ Nothing is committed. Review the diff yourself.
79
85
 
80
86
  **Onto a repository that already documents itself**, the installer only appends — your existing
81
87
  `AGENTS.md` prose is left exactly where it is. `/onboard` reconciles the two afterwards: it classifies
82
- each existing claim into `stack.md`, `verify.md` or `executors.md`, asks wherever a destination is
88
+ each existing claim into `stack.md`, `verify.md`, `git.md` or `executors.md`, asks wherever a destination is
83
89
  unclear or the old text contradicts the installed workflow, and prunes the source only once the
84
90
  replacement is written and shown.
85
91
 
@@ -140,7 +146,7 @@ positive points at the document that is out of step.
140
146
  ## Scope
141
147
 
142
148
  **Both skill trees ship.** Claude Code reads `.claude/skills/`; Codex reads `.agents/skills/` and never
143
- looks at the other one. They get the same seven bodies — the only difference is one frontmatter line,
149
+ looks at the other one. They get the same eight bodies — the only difference is one frontmatter line,
144
150
  `disable-model-invocation: true`, which is Claude Code's key and means nothing elsewhere. The bodies are
145
151
  written runtime-neutral, with no runtime primitive named in any of them, and a test enforces it.
146
152
 
package/dist/cli.js CHANGED
@@ -24,8 +24,8 @@ ${bold('Options')}
24
24
  ${bold('What it installs')}
25
25
  context/ the workflow's documents. Tool-owned files are replaced on update; your
26
26
  roadmap, plans, findings, stack, verify and executors never are.
27
- .claude/ seven skills and two subagent definitions, for Claude Code.
28
- .agents/ the same seven skills, for Codex and anything else reading that tree.
27
+ .claude/ eight skills and two subagent definitions, for Claude Code.
28
+ .agents/ the same eight skills, for Codex and anything else reading that tree.
29
29
  AGENTS.md a delimited block, merged into whatever is already there.
30
30
  CLAUDE.md a single ${cyan('@AGENTS.md')} line, and only if the file does not exist.
31
31
 
@@ -34,7 +34,7 @@ export function install(root) {
34
34
  manifest.managedFiles[file.dest] = hash(content);
35
35
  }
36
36
  info(`${green('+')} ${managed.length} tool-owned files ${dim('(replaced on update)')}`);
37
- info(dim(` the seven skills go to ${adapters.map((a) => `${ADAPTER_SKILL_DIRS[a]}/`).join(' and ')} — ` +
37
+ info(dim(` the eight skills go to ${adapters.map((a) => `${ADAPTER_SKILL_DIRS[a]}/`).join(' and ')} — ` +
38
38
  'one body, one directory per host, neither hand-edited'));
39
39
  for (const stub of STUBS) {
40
40
  write(root, stub.dest, readTemplate(stub.source));
@@ -70,9 +70,9 @@ export function install(root) {
70
70
  info();
71
71
  info(bold('Next'));
72
72
  info(` 1. Review the diff. ${dim('Nothing was committed — that is deliberate.')}`);
73
- info(` 2. Run ${cyan('/onboard')} in your agent to fill in verify.md, executors.md and stack.md.`);
73
+ info(` 2. Run ${cyan('/onboard')} in your agent to fill in verify.md, executors.md, git.md and stack.md.`);
74
74
  if (before !== null) {
75
- info(dim(' AGENTS.md already said things of its own — /onboard folds those into the three files\n' +
75
+ info(dim(' AGENTS.md already said things of its own — /onboard folds those into the four files\n' +
76
76
  ' above and prunes what it moved, asking before anything is deleted.'));
77
77
  }
78
78
  info(` 3. ${cyan('/roadmap "some idea"')} starts the loop.`);
@@ -128,7 +128,7 @@ export function update(root, options) {
128
128
  info();
129
129
  info(bold('Ownership'));
130
130
  info(` ${green('replaced by update')} ${dim('the tool-owned files above — every one is in the manifest')}`);
131
- info(` ${cyan('yours, untouched')} ${dim('context/stack.md, verify.md, executors.md, roadmap.md,')}`);
131
+ info(` ${cyan('yours, untouched')} ${dim('context/stack.md, verify.md, executors.md, git.md, roadmap.md,')}`);
132
132
  info(` ${dim('history.md, findings.md, drafts/, plans/, archive/, CLAUDE.md,')}`);
133
133
  info(` ${dim('and anything else you have added under context/')}`);
134
134
  info(dim(' A project-owned file is not in the manifest, so no code path here reaches it.'));
package/dist/layout.js CHANGED
@@ -28,6 +28,7 @@ export const SKILL_NAMES = [
28
28
  'feature-status',
29
29
  'feature-close',
30
30
  'orchestrate',
31
+ 'prototype',
31
32
  'onboard',
32
33
  ];
33
34
  /**
@@ -79,7 +80,7 @@ export function managedFiles(adapters) {
79
80
  files.push({ source: `claude/agents/${posix}`, dest: `.claude/agents/${posix}` });
80
81
  }
81
82
  }
82
- // The same seven bodies, verbatim. No transform: `disable-model-invocation` is Claude Code's key and
83
+ // The same eight bodies, verbatim. No transform: `disable-model-invocation` is Claude Code's key and
83
84
  // means nothing here, and there is no subagent tree to go with it — the skills already write
84
85
  // delegation as optional.
85
86
  if (adapters.includes('agents')) {
@@ -97,6 +98,7 @@ export const STUBS = [
97
98
  { source: 'stubs/stack.md', dest: 'context/stack.md' },
98
99
  { source: 'stubs/verify.md', dest: 'context/verify.md' },
99
100
  { source: 'stubs/executors.md', dest: 'context/executors.md' },
101
+ { source: 'stubs/git.md', dest: 'context/git.md' },
100
102
  { source: 'stubs/roadmap.md', dest: 'context/roadmap.md' },
101
103
  { source: 'stubs/history.md', dest: 'context/history.md' },
102
104
  { source: 'stubs/findings.md', dest: 'context/findings.md' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baldurpan/create-ai-workflow",
3
- "version": "0.4.1",
3
+ "version": "0.5.1",
4
4
  "description": "Overlay a tiered planning workflow — roadmap, plans, phase ledgers, verification gates — onto an existing repository, for coding agents.",
5
5
  "keywords": [
6
6
  "ai",
@@ -12,17 +12,22 @@ the standing rules, and every command cites it rather than restating it.
12
12
  | `/feature-status` | read-only "where do things stand". **Never a prerequisite** for anything |
13
13
  | `/feature-close` | retires a finished or abandoned feature into `context/archive/` |
14
14
  | `/orchestrate` | one ad-hoc, gated, commit-sized change — no roadmap entry, no ledger |
15
- | `/onboard` | fills in this project's own stubs — `verify.md`, `executors.md`, `stack.md` adopting what an existing `AGENTS.md` already said |
15
+ | `/prototype` | a throwaway HTML/CSS mockup under `prototypes/`no gates, no ledger, no application code |
16
+ | `/onboard` | fills in this project's own stubs — `verify.md`, `executors.md`, `git.md`, `stack.md` — adopting what an existing `AGENTS.md` already said |
16
17
 
17
18
  | Read | For |
18
19
  |---|---|
19
20
  | [`context/stack.md`](context/stack.md) | runtime, layout, conventions |
20
21
  | [`context/standards/README.md`](context/standards/README.md) | engineering standards — load per its conditional table |
21
22
  | [`context/verify.md`](context/verify.md) | the real lint / typecheck / build / test commands — the only file that names one |
23
+ | [`context/git.md`](context/git.md) | who commits, and at what granularity — read it before closing out any change |
22
24
 
23
25
  **Phase status lives in the active plan's status ledger and nowhere else.** Work the lowest-numbered phase
24
26
  that is not `done` and whose `Depends on` are all `done`; state which you picked before starting; update
25
- the row in the same commit as the work. **If the ledger disagrees with the repo, stop and say so.**
27
+ the row as part of the same change as the work. **If the ledger disagrees with the repo, stop and say so.**
28
+
29
+ **Nothing commits unless [`context/git.md`](context/git.md) says so.** Absent or silent, the work is left in
30
+ the working tree and the user commits it.
26
31
 
27
32
  **An open `P0` or `P1` in [`context/findings.md`](context/findings.md) blocks its phase from being `done`.**
28
33
 
@@ -35,6 +35,7 @@ generated "current state" file — hand-editing a ledger row changes every comma
35
35
  | [`stack.md`](stack.md) | this project's runtime, layout, conventions, and an index of your own files | project |
36
36
  | [`verify.md`](verify.md) | this project's real lint / typecheck / build / test commands | project |
37
37
  | [`executors.md`](executors.md) | how this project dispatches a coder and a reviewer | project |
38
+ | [`git.md`](git.md) | who commits the work an agent produces, and at what granularity | project |
38
39
  | [`roadmap.md`](roadmap.md) | Tier 1 — the backlog. `pending` and `active` entries only | project |
39
40
  | [`history.md`](history.md) | index of retired features, newest last | project |
40
41
  | [`findings.md`](findings.md) | open findings that gate a phase from being marked `done` | project |
@@ -64,7 +65,7 @@ hash, `update` walks that manifest, and a project-owned file is not in it — so
64
65
 
65
66
  | Tool-owned — replaced on `update` | Project-owned — unreachable by the updater |
66
67
  |---|---|
67
- | `README.md`, `workflow.md`, `plan-template*.md`, `roles/` | `stack.md`, `verify.md`, `executors.md` |
68
+ | `README.md`, `workflow.md`, `plan-template*.md`, `roles/` | `stack.md`, `verify.md`, `executors.md`, `git.md` |
68
69
  | the skill and agent trees, the `AGENTS.md` block | `roadmap.md`, `history.md`, `findings.md` |
69
70
  | `standards/` while it is ours and unmodified | `drafts/`, `plans/`, `archive/`, `CLAUDE.md` |
70
71
 
@@ -36,8 +36,11 @@ Written <YYYY-MM-DD>. <One line on what this is.> The `<name>` entry in
36
36
  | 1 | <name> | not started | — | |
37
37
  | 2 | <name> | not started | 1 | |
38
38
 
39
- Status is one of `not started`, `in progress`, `blocked`, `done`. `done` only when committed and verified,
40
- and whoever finishes a phase updates the row in the same commit.
39
+ Status is one of `not started`, `in progress`, `blocked`, `done`. A row goes to `in progress` when work on
40
+ the phase starts, before any code, so an interrupted run leaves a ledger that says what was underway. `done`
41
+ only when the scope landed and both gates passed, and whoever finishes a phase updates the row as part of
42
+ the same change as the work — who commits that change is [`../git.md`](../git.md)'s answer, not this
43
+ table's.
41
44
 
42
45
  **Exactly one table in this document has these columns.** Do not add a second phase table — a
43
46
  differently-shaped one nearby is a decoy that gets read by mistake.
@@ -20,7 +20,7 @@ running something else.
20
20
  | Tier 1 → a plan | `/feature-plan` |
21
21
  | a plan → being worked, then phase by phase | `/feature-implement` |
22
22
  | Tier 2 → retired | `/feature-close` |
23
- | no tier crossed | `/orchestrate` — one ad-hoc gated change; `/feature-status` — read-only |
23
+ | no tier crossed | `/orchestrate` — one ad-hoc gated change; `/feature-status` — read-only; `/prototype` — a throwaway mockup |
24
24
 
25
25
  **Every command finds its own starting point.** Nothing has to be looked up first, and `/feature-status` is
26
26
  never a prerequisite for anything.
@@ -35,7 +35,8 @@ never a prerequisite for anything.
35
35
  | `/feature-status` | nothing — read-only | — |
36
36
  | `/feature-close` | Tier 2 → retired | `history.md`, `archive/`, the reference sweep |
37
37
  | `/orchestrate` | one ad-hoc gated change | the code, and `findings.md` |
38
- | `/onboard` | the project-owned stubs | `verify.md`, `executors.md`, `stack.md`, and the pruning of what they replace |
38
+ | `/prototype` | one throwaway HTML/CSS mockup no gates, no application code | `prototypes/<NAME>/`, and nothing else |
39
+ | `/onboard` | the project-owned stubs | `verify.md`, `executors.md`, `git.md`, `stack.md`, and the pruning of what they replace |
39
40
 
40
41
  ## One source of truth per fact
41
42
 
@@ -85,6 +86,16 @@ features may hold plans at once, and that is what makes planning ahead possible.
85
86
  `/orchestrate` is the ad-hoc escape hatch, not the way to skip planning. It refuses anything larger than a
86
87
  commit-sized unit and anything an existing roadmap entry already covers.
87
88
 
89
+ ### Nothing commits unless `git.md` says so
90
+
91
+ > **Read [`git.md`](git.md) before closing out any command that lands code. If it does not exist, or does
92
+ > not say the agent commits, the work is left in the working tree and the user commits it.**
93
+
94
+ This workflow has always described phases as commit-sized and `done` as landed — which an agent, given no
95
+ policy, resolves by committing on its own every phase. That is a call about someone else's repository, so
96
+ it is a written answer rather than an inference. Branching and pushing are outside it: nothing here creates
97
+ a branch, pushes, or opens a pull request under either answer.
98
+
88
99
  ### Never transcribe a credential
89
100
 
90
101
  > **A DSN, token or key is described and pointed at the secret store, never copied into a tracked file.**
@@ -114,10 +125,21 @@ To pick the next phase: take the **lowest-numbered phase that is not `done` and
114
125
  are all `done`.** State which one you picked before starting. If it is already `in progress`, read its Note
115
126
  and resume — do not restart it.
116
127
 
117
- `done` means committed and verified, and whoever finishes a phase updates its row in the same commit.
128
+ **A phase's row is written twice.** It opens to `in progress` when the work starts, before any code, and
129
+ closes to `done`, `in progress` or `blocked` when the phase ends. The opening write is what makes an
130
+ interruption survivable: a run that dies mid-phase leaves a tree with half the work in it, and the row is
131
+ the only thing that can say so.
132
+
133
+ `done` means the phase's scope landed and both gates passed — **a verdict about the gates, not about git.**
134
+ Whoever finishes a phase updates its row **as part of the same change as the work**: one commit where the
135
+ agent commits, one working tree handed over where the user does. A closing row updated separately is a row
136
+ that disagrees with the repository in between. The opening write is not a change of its own — it is left in
137
+ the tree and lands with the work it describes.
118
138
 
119
139
  If the ledger's claim disagrees with the repo — a phase marked `done` whose files do not exist, or the
120
- reverse — **stop and say so.** Never silently re-do or skip a phase on a stale ledger.
140
+ reverse — **stop and say so.** Never silently re-do or skip a phase on a stale ledger. A `done` row whose
141
+ change is still uncommitted is not that: under the default policy in [`git.md`](git.md) it is the normal
142
+ end state.
121
143
 
122
144
  ## The gates
123
145
 
@@ -79,6 +79,11 @@ grep -rn "<old-path>\|<OLD-FILENAME>" --include='*.md' . | grep -v node_modules
79
79
  Move every **closed** finding tied to this feature out of `context/findings.md` and into the archived plan's
80
80
  own log. `findings.md` must not grow for the life of the project.
81
81
 
82
+ Then read [`context/git.md`](../../../context/git.md) before committing anything. `git mv` stages a rename
83
+ and writes no history, so it is safe under either answer — but the commit that carries it is the agent's to
84
+ make only where that file says so. If it does not exist, the answer is *the user commits*: show the whole
85
+ retirement as one reviewable change and hand it over.
86
+
82
87
  ## Mode 2 — `--dropped`
83
88
 
84
89
  For an entry that will not be built. **There is no ledger check in this mode** — unfinished phases are
@@ -97,6 +102,6 @@ expected.
97
102
  - **Never delete a plan document.** Archiving keeps the reasoning; deleting throws away the record of a
98
103
  decision someone will otherwise re-litigate.
99
104
  - **Never leave `roadmap.md` and `history.md` inconsistent.** An entry is in exactly one of them.
100
- - **Never commit the sweep unreviewed.**
105
+ - **Never commit the sweep unreviewed** — and never commit it at all unless `git.md` says the agent commits.
101
106
  - **Never mark a phase `done` to get past the refusal.** If phases are unfinished, the feature is
102
107
  unfinished.
@@ -65,7 +65,22 @@ If the ledger's claim contradicts the repo — a phase marked `done` whose **Fil
65
65
  plainly in the tree under a phase marked `not started` — **say so and stop.** Never silently re-do or skip
66
66
  a phase on a stale ledger.
67
67
 
68
- ## 6. Do the work
68
+ ## 6. Open the ledger row
69
+
70
+ Set the phase's Status to `in progress` and write a Note naming what is underway — **before any code.**
71
+
72
+ This row is what a *later* session reads. A phase interrupted here — context exhausted, session closed, run
73
+ cancelled — leaves a working tree with half a phase in it. A row still reading `not started` sends the next
74
+ run into step 5's disagreement stop, or into redoing work that is already there.
75
+
76
+ One token and one Note, in the row that is already there — do not move the entry, restructure the table, or
77
+ write a summary anywhere else. If the row is already `in progress` because you are resuming it, leave it
78
+ alone; step 11 rewrites the Note.
79
+
80
+ **This write is not a change of its own.** Leave it in the working tree — it lands with the phase's work
81
+ under either answer in [`context/git.md`](../../../context/git.md). Never commit it on its own.
82
+
83
+ ## 7. Do the work
69
84
 
70
85
  Read the phase's §6.2 sub-section: its scope, its **Files:**, and what `done` means for it.
71
86
 
@@ -79,7 +94,7 @@ this repository can open them, and a brief that inlines them is a brief that goe
79
94
 
80
95
  Describe **what** needs to happen, never **how** to code it. Scope each delegated task to specific files.
81
96
 
82
- ## 7. Gate 1 — verification
97
+ ## 8. Gate 1 — verification
83
98
 
84
99
  Per the gate contract in [`context/workflow.md`](../../../context/workflow.md): read
85
100
  [`context/verify.md`](../../../context/verify.md) and run its sections in order — Lint → Typecheck → Build →
@@ -89,9 +104,9 @@ Test.
89
104
  so, never faked. Exit 0 is the verdict regardless of summary text. If `verify.md` does not exist or has no
90
105
  filled-in section, stop and say so. Docs-only changes run Lint plus a read of the diff.
91
106
 
92
- A failure is the verdict — go to step 9 with the failing output verbatim as the feedback.
107
+ A failure is the verdict — go to step 10 with the failing output verbatim as the feedback.
93
108
 
94
- ## 8. Gate 2 — review
109
+ ## 9. Gate 2 — review
95
110
 
96
111
  Dispatch per [`context/executors.md`](../../../context/executors.md). With no independent reviewer
97
112
  configured, review the diff yourself against the plan's review expectations and the standards — weaker, and
@@ -100,13 +115,13 @@ configured, review the diff yourself against the plan's review expectations and
100
115
  Require concrete evidence — file paths, command output — for every verdict, and a `P0`–`P3` severity on
101
116
  every blocking finding.
102
117
 
103
- - `PASS` or `PASS WITH NOTES` → the phase's work is done; go to step 10.
104
- - `FAIL` → **write it to [`context/findings.md`](../../../context/findings.md) first, then** go to step 9.
118
+ - `PASS` or `PASS WITH NOTES` → the phase's work is done; go to step 11.
119
+ - `FAIL` → **write it to [`context/findings.md`](../../../context/findings.md) first, then** go to step 10.
105
120
 
106
121
  **Write the finding before the loopback, not after it.** A verdict that lives only in this session's
107
122
  transcript evaporates when the conversation ends — including a `P0` the cap never got to.
108
123
 
109
- ## 9. Loopback
124
+ ## 10. Loopback
110
125
 
111
126
  Cap: **two loops per gate, per phase.**
112
127
 
@@ -118,9 +133,9 @@ At the cap: **write a finding** (`P1` for a Gate 1 cap-out — a phase whose ver
118
133
  blocked by definition), then escalate to the user with the current state and the last feedback.
119
134
  **Escalating is not a substitute for recording.**
120
135
 
121
- ## 10. Close out the ledger row
136
+ ## 11. Close out the ledger row
122
137
 
123
- In the same commit as the work:
138
+ The row is part of the same change as the work — never a separate step afterwards:
124
139
 
125
140
  - **All of the phase's scope landed and both gates passed** → `done`.
126
141
  - **Some landed** → stays `in progress`, Note rewritten to name exactly what remains.
@@ -129,9 +144,22 @@ In the same commit as the work:
129
144
  **Never mark `done` on a coder's self-report** — the gate output is the evidence. **Refuse `done` while an
130
145
  open `P0` or `P1` is tied to this phase**; leave it `in progress` and name the finding.
131
146
 
132
- ## 11. Report
147
+ `done` is a verdict about the gates, not about git. Whether the change is committed at all is the next step.
148
+
149
+ ## 12. Land it — read [`context/git.md`](../../../context/git.md)
150
+
151
+ **Do not commit until you have read that file, and do not commit at all unless it says the agent does.**
152
+ It is the only place this project's answer lives, the same way `verify.md` is the only place its commands
153
+ live. If it does not exist — an install from before it shipped — the answer is *the user commits*: say so
154
+ once, and name `/onboard`.
155
+
156
+ - **The user commits** → leave the change in the working tree, ledger row and all. Report it, hand it over,
157
+ and stop. Do not stage-and-commit "to be helpful", and do not push or branch under either answer.
158
+ - **The agent commits** → the code and the ledger row in one commit, at the granularity that file names.
159
+
160
+ ## 13. Report
133
161
 
134
- - What changed, and which files.
162
+ - What changed, and which files — and whether it is committed or waiting in the tree.
135
163
  - Gate 1 output, and Gate 2's verdict.
136
164
  - Loopback counts, if any.
137
165
  - Findings written or closed, by id.
@@ -89,6 +89,10 @@ inline. Either way the brief is the same, and the output contract is the templat
89
89
  planner's own default shape:
90
90
 
91
91
  - The roadmap entry verbatim, and the full content of its draft if there was one.
92
+ - **If `prototypes/<NAME>/` exists at the repository root**, its `NOTES.md` and the mockups beside it. A
93
+ sketch someone has already looked at settles a design question that a paragraph would only argue. Carry
94
+ what it settled into §4 Design and cite the folder; treat anything it marked invented as a proposal, not
95
+ a fact. **No folder, no step** — this is a conditional read, not a prerequisite.
92
96
  - **The full section list from `context/plan-template.md`, stated as required output**, in order, with the
93
97
  ledger's exact column set. A general-purpose planner will otherwise emit implementation-steps-and-
94
98
  acceptance-criteria — a per-phase artifact, not a plan — and you will throw it away.
@@ -40,8 +40,10 @@ stale. That is the exact failure this workflow exists to prevent.
40
40
 
41
41
  - Every phase `done` while the entry still reads `active` — that is the normal state before
42
42
  `/feature-close`. Next action 5 handles it.
43
- - A `done` row with its changes still in the working tree a phase finished but not committed. Name it in
44
- the report; do not stop on it.
43
+ - A `done` row with its changes still in the working tree. Under the default policy in
44
+ [`context/git.md`](../../../context/git.md) that is the normal end state of a phase, not a discrepancy
45
+ the user commits. Name it in the report; do not stop on it, and do not commit it: this command writes
46
+ nothing.
45
47
 
46
48
  ## 3. Report
47
49
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: onboard
3
- description: "Fill in this project's own workflow stubs — context/verify.md, context/executors.md and context/stack.md — by adopting what the repository already documented, asking wherever a claim's destination is unclear, and running each candidate verification command so only the ones that pass are written down. Explicit invocation only — run this when the user types /onboard. Do NOT match on 'set up the project', 'get started', or general setup requests."
3
+ description: "Fill in this project's own workflow stubs — context/verify.md, context/executors.md, context/git.md and context/stack.md — by adopting what the repository already documented, asking wherever a claim's destination is unclear, and running each candidate verification command so only the ones that pass are written down. Explicit invocation only — run this when the user types /onboard. Do NOT match on 'set up the project', 'get started', or general setup requests."
4
4
  ---
5
5
 
6
6
  # /onboard
@@ -21,8 +21,9 @@ Read [`context/workflow.md`](../../../context/workflow.md) for the tier model.
21
21
  |---|---|
22
22
  | [`context/verify.md`](../../../context/verify.md) | the real Lint / Typecheck / Build / Test commands — **only ones that exited 0** |
23
23
  | [`context/executors.md`](../../../context/executors.md) | how this project dispatches a coder and a reviewer |
24
+ | [`context/git.md`](../../../context/git.md) | who commits the work, and at what granularity |
24
25
  | [`context/stack.md`](../../../context/stack.md) | runtime, layout, conventions |
25
- | [`AGENTS.md`](../../../AGENTS.md) | pruned, on confirmation, of what moved into those three. The region between the `ai-workflow` markers is never touched |
26
+ | [`AGENTS.md`](../../../AGENTS.md) | pruned, on confirmation, of what moved into those four. The region between the `ai-workflow` markers is never touched |
26
27
 
27
28
  Show every proposed edit before writing it, and **do not commit.** The user reviews and commits.
28
29
 
@@ -44,8 +45,9 @@ Break what you read into claims — a paragraph, a table row, a bullet — and p
44
45
  | A claim about | Goes to |
45
46
  |---|---|
46
47
  | what the project is, its layout, its conventions | `context/stack.md` |
47
- | a lint, typecheck, build or test command | a **candidate** for `context/verify.md` — Step 5 still has to run it |
48
+ | a lint, typecheck, build or test command | a **candidate** for `context/verify.md` — Step 6 still has to run it |
48
49
  | how a coder or a reviewer is dispatched | `context/executors.md` |
50
+ | a rule about who commits, or when work is committed | `context/git.md` |
49
51
  | a rule the bundled standards already state | nowhere — the standards own it. Ask before dropping |
50
52
  | planning or review process this workflow now owns | nowhere — superseded. Ask before dropping |
51
53
  | anything else — ownership, contacts, external links | stays in `AGENTS.md`, outside the block |
@@ -63,7 +65,7 @@ destination. Two kinds of row are never decided alone:
63
65
  An adopted claim is an *input* to the steps below, not a substitute for them. A command lifted out of the
64
66
  old file is a candidate like any other and still has to run.
65
67
 
66
- **Nothing is deleted here.** Pruning is Step 7, after the destination files exist.
68
+ **Nothing is deleted here.** Pruning is Step 8, after the destination files exist.
67
69
 
68
70
  On a re-run, a claim its destination file already states is already adopted. Say so in a line and move on.
69
71
 
@@ -87,7 +89,7 @@ on that being true, and it is true of some executors and not others.
87
89
  4. If it comes back empty, guessed, or refused, record that **this executor needs content inline** — the
88
90
  one case where a brief carries file contents instead of paths.
89
91
 
90
- Never write down an invocation you have not run. This is the same rule as Step 5, for the same reason.
92
+ Never write down an invocation you have not run. This is the same rule as Step 6, for the same reason.
91
93
 
92
94
  ## Step 3 — Reviewer dispatch
93
95
 
@@ -107,7 +109,33 @@ winner: it differs per host and changes underneath you. What ships is the contra
107
109
  Whatever is chosen, that contract stands: a review happens, every blocking finding carries a `P0`–`P3`
108
110
  severity, and a `FAIL` writes a finding before the loopback.
109
111
 
110
- ## Step 4 — Standards source
112
+ ## Step 4 — Who commits
113
+
114
+ **Ask this one. It is the question the workflow used to answer by inference.**
115
+
116
+ Every command that lands code closes out by updating a ledger row *as part of the same change as the work*,
117
+ and `done` has always meant the scope landed and the gates passed. Given no policy, an agent resolves that
118
+ the only way it can — by committing, every phase, in someone else's repository. That is a call for the
119
+ project to make, so ask it and write the answer to [`context/git.md`](../../../context/git.md).
120
+
121
+ Ask, using your runtime's question mechanism if it has one:
122
+
123
+ - **The user commits** — the default, and what the stub ships saying. A phase ends verified, with its
124
+ ledger row updated, left in the working tree. The agent reports and stops.
125
+ - **The agent commits** — one commit per phase, the code and its ledger row together.
126
+
127
+ Then confirm the granularity if the agent commits, and **say plainly what is not being decided**: nothing in
128
+ this workflow branches, pushes, or opens a pull request under either answer, and choosing one does not start
129
+ that.
130
+
131
+ Write the answer as the surviving line under **Who commits**, and delete the other. If `context/git.md` does
132
+ not exist — an install from before it shipped — create it, with a `## Who commits` section holding the
133
+ chosen line, a `## Granularity` section, and a line recording that branches and pushes are out of scope.
134
+
135
+ If Step 1 turned up an existing rule about committing, quote it here and let it win unless the user says
136
+ otherwise. Prose someone wrote about their own repository beats a default.
137
+
138
+ ## Step 5 — Standards source
111
139
 
112
140
  `context/standards/` ships with a bundled default. Ask whether that is right for this project.
113
141
 
@@ -121,7 +149,7 @@ Say plainly what the default is and that a wrong set is not inert — agents loa
121
149
  conditional table unprompted, on every task. If Step 1 turned up house rules that the bundled set already
122
150
  covers, this is the moment that matters: keeping both means the project has two answers.
123
151
 
124
- ## Step 5 — Verification commands
152
+ ## Step 6 — Verification commands
125
153
 
126
154
  **This is the most valuable step in this command.** Do it properly.
127
155
 
@@ -143,7 +171,7 @@ covers, this is the moment that matters: keeping both means the project has two
143
171
  Explain what you are doing: this turns `verify.md` from someone's guess into something verified at install
144
172
  time, which is the one moment it is cheap to catch.
145
173
 
146
- ## Step 6 — Stack
174
+ ## Step 7 — Stack
147
175
 
148
176
  Start from what Step 1 routed here, show it back as a draft, and ask only for the gaps:
149
177
 
@@ -158,9 +186,9 @@ Start from what Step 1 routed here, show it back as a draft, and ask only for th
158
186
  Point out that anything else added under `context/` should be indexed in `stack.md`, not in
159
187
  `context/README.md`, which is tool-owned and replaced on update.
160
188
 
161
- ## Step 7 — Prune the sources
189
+ ## Step 8 — Prune the sources
162
190
 
163
- Only now, with the three stubs written, remove from `AGENTS.md` and `CLAUDE.md` what has landed elsewhere.
191
+ Only now, with the four stubs written, remove from `AGENTS.md` and `CLAUDE.md` what has landed elsewhere.
164
192
  Duplication left standing is the failure this step exists to prevent: two statements of one fact drift, and
165
193
  the stale copy is indistinguishable from the live one.
166
194
 
@@ -79,10 +79,18 @@ expand no scope.
79
79
  At the cap: write a finding (`P1` for a Gate 1 cap-out), then escalate with the current state and the last
80
80
  feedback. **Escalating is not a substitute for recording.**
81
81
 
82
- ## 6. Report
82
+ ## 6. Land it — read [`context/git.md`](../../../context/git.md)
83
83
 
84
- What changed, the Gate 1 output, the Gate 2 verdict, any loopbacks, and any findings written, closed or
85
- swept by id.
84
+ **Do not commit unless that file says the agent does.** If it does not exist, the answer is *the user
85
+ commits*: say so once, and name `/onboard`. Nothing branches or pushes under either answer.
86
+
87
+ - **The user commits** → leave the change in the working tree and hand it over.
88
+ - **The agent commits** → one commit, at the granularity that file names.
89
+
90
+ ## 7. Report
91
+
92
+ What changed, whether it is committed or waiting in the tree, the Gate 1 output, the Gate 2 verdict, any
93
+ loopbacks, and any findings written, closed or swept — by id.
86
94
 
87
95
  ## Rules
88
96
 
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: prototype
3
+ description: "Mock one screen or interaction as throwaway HTML and CSS under prototypes/, to settle a layout or look-and-feel question before a plan commits to it. Writes no application code and runs no gates. Explicit invocation only — run this when the user types /prototype. Do NOT match on 'mock this up', 'try a layout', 'what should this look like', or any request to build, style or restyle real UI."
4
+ ---
5
+
6
+ # /prototype
7
+
8
+ A cheap, disposable sketch of something that will be built properly later. **No roadmap entry, no ledger,
9
+ no gates, no tier boundary crossed** — and no application source is touched.
10
+
11
+ It exists because some questions are only answerable by looking at the thing. Arguing about a layout in a
12
+ plan document is slow and inconclusive; two static files answer it in minutes, and the answer then goes
13
+ into the plan as a decision rather than a paragraph of hedging. **Nothing in the workflow requires this
14
+ command** — skip it and every other command behaves identically.
15
+
16
+ Read [`context/workflow.md`](../../../context/workflow.md) for the tier model and the feature/task rule.
17
+
18
+ ## Usage
19
+
20
+ ```
21
+ /prototype "<what to mock>" # a screen, a flow, an interaction
22
+ /prototype "<entry name>" # mock what a roadmap entry describes
23
+ ```
24
+
25
+ ## 0. Refuse, before anything else
26
+
27
+ 1. **Refuse to build the real thing.** This command produces throwaway files outside the application. The
28
+ moment the request is "now wire it up" or "put this in the app", it belongs to `/orchestrate` if it is
29
+ commit-sized, or to `/feature-plan` and `/feature-implement` if it is a feature. Name the one that
30
+ applies and stop.
31
+ 2. **Refuse to sketch the whole application.** A screen or two, chosen because something about them is
32
+ actually in question. If the answer is "all of them", ask which decision is being made and mock the two
33
+ screens that decide it.
34
+
35
+ Say which question the mockup exists to answer, in one line, before writing anything.
36
+
37
+ ## 1. Read what this project already looks like
38
+
39
+ **Borrow before inventing.** This repository exists already, so most of the look is decided — and a mockup
40
+ built from values the project does not have is a picture of an app nobody is going to build.
41
+
42
+ Read `context/stack.md`, then find the real thing: the stylesheet or token file, the design system or
43
+ component library, and two or three existing screens close to what is being mocked. Copy the actual token
44
+ names, spacing scale, radii and type stack out of them.
45
+
46
+ Invent only where there is genuinely nothing to borrow — a new surface, or a project with no styling of its
47
+ own yet. **Mark every invented value**, so the plan that reads this knows which parts are proposals and
48
+ which are already true.
49
+
50
+ ## 2. Agree the sketch, then stop
51
+
52
+ Ask a short set of questions — which screens, which states, and what specifically is undecided. Use your
53
+ runtime's question mechanism if it has one, or a plain numbered question if it does not.
54
+
55
+ Then propose, and **wait**:
56
+
57
+ - the screens, one line each on what each one shows,
58
+ - the states each will exercise, and
59
+ - which values are borrowed and which are invented.
60
+
61
+ **Write nothing until the user approves.** Adjust the proposal if they push back. Generating five files
62
+ before anyone has agreed what is being asked is how a fast tool becomes a slow one.
63
+
64
+ ## 3. Write the mockups
65
+
66
+ Everything goes under `prototypes/<NAME>/` at the repository root, where `<NAME>` is the kebab-case subject
67
+ — matching the roadmap entry's name when there is one.
68
+
69
+ | File | Holds |
70
+ |---|---|
71
+ | `theme.css` | every value the mockups use, in one place — the project's real tokens copied in, and invented ones marked with a comment |
72
+ | `<screen>.html` | one self-contained page per screen, linking `theme.css` |
73
+ | `NOTES.md` | the question this exists to answer, what it settled, what is still open, and which values were invented |
74
+
75
+ - **Plain HTML and CSS. No framework, no build step, no dependencies.** A few lines of inline script for a
76
+ view toggle is fine; anything more means this stopped being a sketch.
77
+ - **Every colour, font and spacing value comes from a `theme.css` variable**, never hard-coded — that is
78
+ what makes tweaking one file restyle every screen at once.
79
+ - **Realistic content and the states that matter** — the empty list, the error, the mid-action moment, the
80
+ name that is too long. An empty shell full of lorem ipsum answers nothing. Desktop-first is enough unless
81
+ the question is about small screens.
82
+ - Never transcribe a credential. Placeholder content is invented, and a real key is never realistic detail.
83
+
84
+ `NOTES.md` is the durable part. The HTML is scaffolding for a conversation; the notes are what a plan reads.
85
+
86
+ ## 4. It gets committed
87
+
88
+ `prototypes/` is yours, not the tool's — nothing installs it, nothing updates it, nothing validates it.
89
+ **It gets committed anyway.** Until a plan absorbs `NOTES.md` its conclusions live nowhere else, and neither
90
+ the notes nor the mockups survive a cleared context or a second machine if they were never tracked.
91
+
92
+ Who does the committing is [`context/git.md`](../../../context/git.md)'s answer, not this command's. Where
93
+ the user commits, say plainly that these files are worth tracking rather than leaving them to be mistaken
94
+ for scratch output.
95
+
96
+ ## 5. Hand off and stop
97
+
98
+ Report the folder path, and tell the user to open the files in a browser and iterate on the look — that
99
+ iteration is the point, and it costs nothing.
100
+
101
+ Then name exactly one next step, and **do not run it**:
102
+
103
+ - **No roadmap entry yet** → `/roadmap "<idea>"`, citing `prototypes/<NAME>/`.
104
+ - **An entry exists** → `/feature-plan "<NAME>"`, which reads the folder and carries what it settled into
105
+ the plan's Design section.
106
+
107
+ ## Rules
108
+
109
+ - **Nothing outside `prototypes/` is written.** Not application source, not `context/`, not `roadmap.md`.
110
+ This command creates no entry, marks nothing active, and touches no ledger row.
111
+ - **No gates.** Nothing here is verified or reviewed, because there is nothing to verify — no test covers
112
+ a throwaway file, and review time spent on one is time wasted. Work that needs a gate is not a mockup.
113
+ - **Throwaway means throwaway.** When the feature ships, delete `prototypes/<NAME>/` and the citation that
114
+ pointed at it. A mockup that no longer matches the app is worse than no mockup, because someone will
115
+ believe it.
@@ -0,0 +1,44 @@
1
+ # Git
2
+
3
+ Who commits the work an agent produces, and at what granularity. **Every command that lands code reads this
4
+ file before it closes out** — the exact parallel to [`verify.md`](verify.md) for commands and
5
+ [`executors.md`](executors.md) for dispatch, and for the same reason: git etiquette differs per repository,
6
+ and a skill that assumes one project's ships one project's habits everywhere.
7
+
8
+ Two answers, and the file is short on purpose. Run `/onboard` to set them, or edit them here.
9
+
10
+ ## Who commits
11
+
12
+ <!-- Exactly one of the two answers below is this project's. Keep it, delete the other.
13
+
14
+ Shipped as: the user commits. A tool installed into a repository it knows nothing about does not get
15
+ to write that repository's history unasked. -->
16
+
17
+ **The user commits.** A phase ends with the work verified and its ledger row updated, left in the working
18
+ tree. The agent reports what changed and stops there — no `git commit`, no `git push`, nothing that
19
+ rewrites history.
20
+
21
+ <!-- **The agent commits.** A phase ends committed: the code and its ledger row in one commit, so the two
22
+ cannot disagree. Nothing is pushed either way. -->
23
+
24
+ ## Granularity
25
+
26
+ **One commit per phase.** A phase is a commit-sized unit with one checkable outcome — that is what a plan's
27
+ ledger is a list of. Where the user commits, this describes the shape the agent leaves the tree in, not
28
+ something it carries out.
29
+
30
+ ## What this file does not decide
31
+
32
+ **Branches, pushes and pull requests.** Nothing in this workflow creates a branch, pushes, or opens a pull
33
+ request, and neither answer above makes it start. If work here belongs on a branch, make the branch before
34
+ the phase starts.
35
+
36
+ ## The rules that hold either way
37
+
38
+ - **The ledger row lands with the work.** Whoever makes the commit, the row and the code it describes are
39
+ one change. A row updated separately is a row that disagrees with the repository in between.
40
+ - **`done` is a verdict about the gates, not about git.** A phase is `done` when its scope landed and both
41
+ gates passed. Where the user commits, a `done` row whose change is still in the working tree is the
42
+ normal end state — not a discrepancy, and nothing stops on it.
43
+ - **If this file is missing, the answer is the first one.** An install from before this file existed has
44
+ no policy written down; treat it as *the user commits*, say so once, and name `/onboard`.
@@ -32,4 +32,4 @@ What this project is, and what an agent has to know before touching it. Run `/on
32
32
  line lost. -->
33
33
 
34
34
  Verification commands are in [`verify.md`](verify.md), not here. Executor dispatch is in
35
- [`executors.md`](executors.md).
35
+ [`executors.md`](executors.md), and who commits is in [`git.md`](git.md).