@pilotspace/add 1.1.0 → 1.2.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/CHANGELOG.md +40 -0
- package/GETTING-STARTED.md +165 -139
- package/README.md +13 -7
- package/bin/cli.js +13 -4
- package/docs/01-principles.md +3 -3
- package/docs/02-the-flow.md +15 -11
- package/docs/03-step-1-specify.md +13 -13
- package/docs/04-step-2-scenarios.md +2 -2
- package/docs/05-step-3-contract.md +3 -3
- package/docs/06-step-4-tests.md +2 -2
- package/docs/07-step-5-build.md +1 -1
- package/docs/08-step-6-verify.md +14 -5
- package/docs/09-the-loop.md +12 -6
- package/docs/10-setup-and-stages.md +27 -13
- package/docs/11-governance.md +2 -2
- package/docs/12-roles.md +3 -3
- package/docs/13-adoption.md +1 -1
- package/docs/14-foundation.md +15 -15
- package/docs/15-foundations-and-lineage.md +106 -0
- package/docs/README.md +4 -0
- package/docs/appendix-a-templates.md +3 -3
- package/docs/appendix-b-prompts.md +40 -5
- package/docs/appendix-c-glossary.md +42 -12
- package/docs/appendix-d-worked-example.md +2 -2
- package/docs/appendix-e-checklists.md +2 -2
- package/docs/appendix-f-requirements-matrix.md +8 -8
- package/docs/appendix-g-references.md +106 -0
- package/package.json +1 -1
- package/skill/add/SKILL.md +39 -37
- package/skill/add/adopt.md +13 -11
- package/skill/add/deltas.md +8 -6
- package/skill/add/fold.md +19 -17
- package/skill/add/graduate.md +74 -0
- package/skill/add/intake.md +22 -7
- package/skill/add/loop.md +59 -0
- package/skill/add/phases/0-setup.md +29 -24
- package/skill/add/phases/1-specify.md +23 -13
- package/skill/add/phases/2-scenarios.md +14 -4
- package/skill/add/phases/3-contract.md +24 -11
- package/skill/add/phases/4-tests.md +15 -5
- package/skill/add/phases/5-build.md +11 -4
- package/skill/add/phases/6-verify.md +24 -2
- package/skill/add/phases/7-observe.md +13 -5
- package/skill/add/report-template.md +65 -7
- package/skill/add/run.md +45 -34
- package/skill/add/scope.md +10 -6
- package/skill/add/setup-review.md +13 -10
- package/skill/add/streams.md +69 -19
- package/tooling/add.py +476 -34
- package/tooling/templates/CONVENTIONS.md.tmpl +1 -1
- package/tooling/templates/GLOSSARY.md.tmpl +23 -0
- package/tooling/templates/MILESTONE.md.tmpl +1 -0
- package/tooling/templates/PROJECT.md.tmpl +4 -3
- package/tooling/templates/TASK.md.tmpl +33 -12
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,46 @@ All notable changes to the ADD method (`@pilotspace/add` on npm,
|
|
|
4
4
|
`pilotspace-add` on PyPI) are documented here. The format follows
|
|
5
5
|
[Keep a Changelog](https://keepachangelog.com/); versions follow semver.
|
|
6
6
|
|
|
7
|
+
## [1.2.0] — 2026-06-10
|
|
8
|
+
|
|
9
|
+
The decision-arc release: the method now narrates the build as one continuous
|
|
10
|
+
arc of decisions, and the loop reaches past a single milestone — graduating a
|
|
11
|
+
prototype to production, gating milestones on their own goal, and running tasks
|
|
12
|
+
in parallel waves. All additive; no breaking changes (SemVer MINOR).
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **The decision arc** — every human-gate report opens by naming where you are
|
|
16
|
+
on the arc (intent → cases → contract → tests → build → verify → observe), and
|
|
17
|
+
the book + GLOSSARY describe it as the spine of the method. The one human
|
|
18
|
+
approval is always placed on the arc, never floating.
|
|
19
|
+
- **Graduation to production** — `add.py graduate` plus a graduate-guide and a
|
|
20
|
+
`→production` stage guard turn the mvp→production transition into an
|
|
21
|
+
analytics-driven, criteria-gated step instead of a label flip: a
|
|
22
|
+
graduation-report surfaces the evidence and a stage-goal-criteria cue tells you
|
|
23
|
+
when the prototype has earned the next stage.
|
|
24
|
+
- **Goal-gated milestones & the dynamic task loop** — an explicit project GOAL
|
|
25
|
+
now rides on `status`/`guide`, a milestone completes only when every success
|
|
26
|
+
criterion is met, and a recorded `done → phase` reopen-transition lets a closed
|
|
27
|
+
task legitimately re-open without losing its history.
|
|
28
|
+
- **verify-deepen** — the verify phase gained a deep-check rubric
|
|
29
|
+
(wiring · dead-code · semantic) so verification probes intent, not just a green
|
|
30
|
+
suite.
|
|
31
|
+
- **Parallel waves** — `WAVE.md`, the wave ledger that is the resume point for
|
|
32
|
+
parallel task execution; `status` surfaces a live wave so a multi-task wave can
|
|
33
|
+
pause and resume cleanly.
|
|
34
|
+
- **The flag-first freeze guard** — declaring a contract freeze is now
|
|
35
|
+
fail-closed: an `unflagged_freeze` is refused at `advance` time and flagged by
|
|
36
|
+
`add.py audit`, so a freeze can never be recorded without its explicit marker.
|
|
37
|
+
- **Foundations & Lineage chapter** — the book gained an annotated Foundations
|
|
38
|
+
chapter with author-year citations and a references appendix, tracing the
|
|
39
|
+
method's lineage.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
- Engine prose now speaks one ubiquitous language — `add.py` output uses
|
|
43
|
+
consistent domain terms (scope level, decision point, retrospective, …).
|
|
44
|
+
- `add.py compact` keeps the active state lean by compacting heavy archive
|
|
45
|
+
history, with the bundled engine frozen in lockstep.
|
|
46
|
+
|
|
7
47
|
## [1.1.0] — 2026-06-05
|
|
8
48
|
|
|
9
49
|
Production-ready enforcement: the gates are now verified by machinery distinct
|
package/GETTING-STARTED.md
CHANGED
|
@@ -8,35 +8,12 @@ You'll learn the whole loop by doing it once:
|
|
|
8
8
|
|
|
9
9
|
> **Specify → Scenarios → Contract → Tests → Build → Verify → Observe**
|
|
10
10
|
|
|
11
|
-
ADD is **AI-first**: you talk to the agent and it drives the method
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## The fast path — talk to the agent
|
|
18
|
-
|
|
19
|
-
After installing (step 1 below), the whole on-ramp is one move:
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
in Claude Code: /add
|
|
23
|
-
you: "I want to let users transfer money between their own accounts."
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
From there the agent runs the **on-ramp** for you:
|
|
27
|
-
|
|
28
|
-
1. **Orient** — it reads `add.py status` (the resume point), never re-reading your repo.
|
|
29
|
-
2. **Intake** — it sizes your request into versioned scope and proposes a **milestone**
|
|
30
|
-
(goal · scope · breadth-first tasks · exit criteria). *You confirm the shape.*
|
|
31
|
-
3. **One-approval front** — for each task it drafts Spec + Scenarios + Contract + Tests
|
|
32
|
-
as one bundle. *You give one approval at the frozen contract.*
|
|
33
|
-
4. **Self-driving run** — build→verify runs to green; a security finding always stops
|
|
34
|
-
back to you.
|
|
35
|
-
|
|
36
|
-
So a milestone-sized feature is: **describe it → confirm the milestone → approve each
|
|
37
|
-
contract → review the result.** Everything between is the agent.
|
|
38
|
-
|
|
39
|
-
> New term: **On-ramp** — the install→first-milestone path. See `docs/appendix-c-glossary.md`.
|
|
11
|
+
ADD is **AI-first**: you talk to the agent and it drives the method. Reading this
|
|
12
|
+
guide top to bottom, you will type exactly **one shell command — the install**.
|
|
13
|
+
After that, everything happens in conversation (`/add` is how you start it, not
|
|
14
|
+
a terminal command): the agent's hands are the CLI, and the same CLI is your
|
|
15
|
+
escape hatch whenever you want to take the wheel (it's all in the appendix at
|
|
16
|
+
the end).
|
|
40
17
|
|
|
41
18
|
---
|
|
42
19
|
|
|
@@ -49,90 +26,210 @@ contract → review the result.** Everything between is the agent.
|
|
|
49
26
|
|
|
50
27
|
> **Windows:** use `py` wherever this guide writes `python3` (the Python launcher on
|
|
51
28
|
> Windows) — e.g. `py .add\tooling\add.py status`. Both installers handle the install
|
|
52
|
-
> step for you; only the by-hand `add.py` commands
|
|
29
|
+
> step for you; only the by-hand `add.py` commands in the appendix differ.
|
|
53
30
|
|
|
54
31
|
---
|
|
55
32
|
|
|
56
|
-
## 1 · Install
|
|
33
|
+
## 1 · Install — the one command you type
|
|
57
34
|
|
|
58
35
|
From your project root, pick **one** path — both produce the same install:
|
|
59
36
|
|
|
60
37
|
**Option A — npm (Node.js ≥ 18):**
|
|
61
38
|
|
|
62
39
|
```bash
|
|
63
|
-
npx @pilotspace/add init
|
|
40
|
+
npx @pilotspace/add init
|
|
64
41
|
```
|
|
65
42
|
|
|
66
43
|
**Option B — pip (Python 3.10+):**
|
|
67
44
|
|
|
68
45
|
```bash
|
|
69
46
|
pip install pilotspace-add
|
|
70
|
-
pilotspace-add init
|
|
47
|
+
pilotspace-add init
|
|
71
48
|
```
|
|
72
49
|
|
|
50
|
+
No flags needed — the agent infers your project's name from the folder and starts
|
|
51
|
+
at the `prototype` stage. (Prefer to choose up front? Both installers take
|
|
52
|
+
`--name "My App" --stage prototype|poc|mvp|production`; the stage can also be
|
|
53
|
+
changed later — see the appendix.)
|
|
54
|
+
|
|
73
55
|
Either one creates `.add/` (your runtime), drops the `add` skill into
|
|
74
|
-
`.claude/skills/add/`, and bundles the book into `.add/docs/`.
|
|
75
|
-
|
|
76
|
-
|
|
56
|
+
`.claude/skills/add/`, and bundles the book into `.add/docs/`. It deliberately
|
|
57
|
+
does **not** initialise the project — that's the agent's first move, so nothing
|
|
58
|
+
gets decided without you in the loop.
|
|
59
|
+
|
|
60
|
+
**When the install finishes: open Claude Code and type `/add`.** That's the
|
|
61
|
+
handoff — from here on it's conversation, not terminal commands.
|
|
77
62
|
|
|
78
63
|
> Why stages exist: the steps never change, only how *deeply* you run them.
|
|
79
64
|
> See `.add/docs/10-setup-and-stages.md`.
|
|
80
65
|
|
|
81
66
|
---
|
|
82
67
|
|
|
83
|
-
## 2 ·
|
|
68
|
+
## 2 · Your first feature — talk to the agent
|
|
69
|
+
|
|
70
|
+
In Claude Code, the whole onboarding is one move:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
in Claude Code: /add
|
|
74
|
+
you: "I want to let users transfer money between their own accounts."
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
From there the agent runs the **onboarding** for you:
|
|
78
|
+
|
|
79
|
+
1. **Orient** — it reads the project state (the resume point), never re-reading
|
|
80
|
+
your repo. On a fresh install it initialises the project itself and drafts
|
|
81
|
+
the foundation for your sign-off (the **baseline approval** — the one signature the
|
|
82
|
+
installer's closing message points at).
|
|
83
|
+
2. **Intake** — it sizes your request into versioned scope and proposes a **milestone**
|
|
84
|
+
(goal · scope · breadth-first tasks · exit criteria). *You confirm the shape.*
|
|
85
|
+
3. **Specification bundle** — for each task it drafts Spec + Scenarios + Contract + Tests
|
|
86
|
+
as one bundle, led by its lowest-confidence points. *You give one approval at the
|
|
87
|
+
frozen contract.*
|
|
88
|
+
4. **Self-driving run** — build→verify runs to green; a security finding always stops
|
|
89
|
+
back to you.
|
|
90
|
+
|
|
91
|
+
So a milestone-sized feature is: **describe it → confirm the milestone → approve each
|
|
92
|
+
contract → review the result.** Everything between is the agent. For the
|
|
93
|
+
transfer-money feature above, that's four short conversations — and zero typed
|
|
94
|
+
commands.
|
|
95
|
+
|
|
96
|
+
> New term: **Onboarding** — the install→first-milestone path. See `.add/docs/appendix-c-glossary.md`.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 3 · What just happened (and your override)
|
|
101
|
+
|
|
102
|
+
Behind the conversation, the agent drove the CLI: it read the resume point, sized
|
|
103
|
+
the milestone, froze the contract you approved, ran the tests red, built to green,
|
|
104
|
+
and recorded the gate. The state lives on disk, not in the chat window.
|
|
105
|
+
|
|
106
|
+
If you ever want to see that state yourself — or take over entirely — the same
|
|
107
|
+
CLI is yours:
|
|
84
108
|
|
|
85
109
|
```bash
|
|
86
110
|
python3 .add/tooling/add.py status
|
|
87
111
|
```
|
|
88
112
|
|
|
89
|
-
`add.py status` is
|
|
90
|
-
|
|
91
|
-
|
|
113
|
+
`add.py status` is the resume point: project stage, active task, current phase.
|
|
114
|
+
And `add.py guide` tells you what the current phase needs — its `guide :` line
|
|
115
|
+
names the exact phase-guide file to read (`.claude/skills/add/phases/…` — plain
|
|
116
|
+
markdown), which is how **any** agent — Claude, Cursor, Copilot, Codex — follows
|
|
117
|
+
ADD through the CLI alone.
|
|
92
118
|
|
|
93
119
|
> Tip: shorten typing with an alias — `alias add="python3 .add/tooling/add.py"` —
|
|
94
|
-
> then you can run `add status`, `add
|
|
95
|
-
> the
|
|
120
|
+
> then you can run `add status`, `add guide`, etc. These are override and resume
|
|
121
|
+
> surfaces, not steps you owe the method: the appendix walks the full by-hand path
|
|
122
|
+
> whenever you want the wheel.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Resume next session
|
|
96
127
|
|
|
97
|
-
|
|
128
|
+
Close your laptop, come back tomorrow, type `/add` again — the agent reorients
|
|
129
|
+
itself from disk and continues exactly where you left off. No context rot.
|
|
130
|
+
|
|
131
|
+
The same resume point is yours directly:
|
|
98
132
|
|
|
99
133
|
```bash
|
|
100
|
-
python3 .add/tooling/add.py
|
|
134
|
+
python3 .add/tooling/add.py status
|
|
101
135
|
```
|
|
102
136
|
|
|
103
|
-
`status` tells you *where* you are; `guide` tells you *what to do next* — the active
|
|
104
|
-
task's phase, the one concrete next action, the chapter to read, and the exact command
|
|
105
|
-
to run once that phase is done. Its `guide :` line names the phase-guide file to
|
|
106
|
-
read for the current phase (`.claude/skills/add/phases/…` — plain markdown), which is
|
|
107
|
-
how **any** agent — Claude, Cursor, Copilot, Codex — follows ADD through the CLI alone.
|
|
108
|
-
|
|
109
137
|
---
|
|
110
138
|
|
|
111
|
-
##
|
|
139
|
+
## Self-check
|
|
140
|
+
|
|
141
|
+
Confirm your project is internally consistent at any time:
|
|
112
142
|
|
|
113
143
|
```bash
|
|
114
|
-
python3 .add/tooling/add.py
|
|
144
|
+
python3 .add/tooling/add.py check
|
|
115
145
|
```
|
|
116
146
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
147
|
+
It verifies state is valid, every task has its TASK.md, and markers match. Exit
|
|
148
|
+
code 0 means healthy — handy as a CI gate.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Enforce the decision points in CI
|
|
153
|
+
|
|
154
|
+
`add.py audit` re-verifies every recorded human gate on your board — a named
|
|
155
|
+
human at each contract freeze, exactly one gate outcome per done task, a human
|
|
156
|
+
reviewer wherever the security line carries a note. It exits non-zero naming
|
|
157
|
+
the task and the finding, which makes it a CI gate: enforcement runs on a
|
|
158
|
+
machine the agent does not control, so the agent can never stamp its own work
|
|
159
|
+
green (*never self-gate*).
|
|
160
|
+
|
|
161
|
+
Drop this workflow into `.github/workflows/seam-audit.yml`:
|
|
162
|
+
|
|
163
|
+
```yaml
|
|
164
|
+
name: seam-audit
|
|
165
|
+
|
|
166
|
+
on:
|
|
167
|
+
push:
|
|
168
|
+
branches: [main]
|
|
169
|
+
pull_request:
|
|
170
|
+
|
|
171
|
+
permissions:
|
|
172
|
+
contents: read
|
|
173
|
+
|
|
174
|
+
jobs:
|
|
175
|
+
seam-audit:
|
|
176
|
+
name: Decision-point audit (recorded human gates)
|
|
177
|
+
runs-on: ubuntu-latest
|
|
178
|
+
steps:
|
|
179
|
+
- uses: actions/checkout@v4
|
|
180
|
+
|
|
181
|
+
- uses: actions/setup-python@v5
|
|
182
|
+
with:
|
|
183
|
+
python-version: '3.12'
|
|
120
184
|
|
|
121
|
-
|
|
185
|
+
- name: Audit recorded decision points
|
|
186
|
+
run: python3 .add/tooling/add.py audit
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The command is the same one you can run locally — the installer already placed
|
|
190
|
+
`add.py` at `.add/tooling/add.py`, and the audit is read-only (it never edits
|
|
191
|
+
your board). A red `seam-audit` job means a decision record is malformed or a
|
|
192
|
+
security note was left to the auto-gate; fix the record (or escalate the gate
|
|
193
|
+
to a human), never the auditor.
|
|
122
194
|
|
|
123
195
|
---
|
|
124
196
|
|
|
125
197
|
## Under the hood — the seven phases by hand (escape hatch)
|
|
126
198
|
|
|
127
|
-
Everything above is what the agent drives for you through the one-approval
|
|
128
|
-
|
|
199
|
+
Everything above is what the agent drives for you through the one-approval flow. This
|
|
200
|
+
appendix is the **escape hatch**: the same seven phases run by hand, so you can see what
|
|
129
201
|
each one produces and step in manually whenever you want to. You never *have* to type
|
|
130
202
|
these — they are the agent's hands, and yours when you take the wheel.
|
|
131
203
|
|
|
132
204
|
The rhythm is always: **fill the section → run `python3 .add/tooling/add.py advance`.**
|
|
133
205
|
The tool keeps the `phase:` marker at the top of TASK.md in sync.
|
|
134
206
|
|
|
135
|
-
###
|
|
207
|
+
### Before the phases — initialise and scaffold
|
|
208
|
+
|
|
209
|
+
Starting cold? Install first as in §1 (`npx @pilotspace/add init`). Then
|
|
210
|
+
initialise once and scaffold the task yourself (the agent normally does both):
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
python3 .add/tooling/add.py init
|
|
214
|
+
python3 .add/tooling/add.py new-task transfer --title "Transfer money between my accounts"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
> **Note:** the installer's closing hint shows `init --await-lock` — that form
|
|
218
|
+
> arms the baseline-approval gate so a *human* signs the AI-drafted foundation before
|
|
219
|
+
> any build. Plain `init` skips that gate, which is fine here: by hand, the
|
|
220
|
+
> human IS the one driving every step.
|
|
221
|
+
|
|
222
|
+
This scaffolds `.add/tasks/transfer/TASK.md` — **one file holding all seven phase
|
|
223
|
+
sections** — plus empty `tests/` and `src/` folders, and makes it the active task
|
|
224
|
+
at phase `specify`. Open it in your editor; you'll fill it top to bottom.
|
|
225
|
+
|
|
226
|
+
You can also change the project's depth at any time:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
python3 .add/tooling/add.py stage mvp
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Phase 1 — Specify (`.add/docs/03-step-1-specify.md`)
|
|
136
233
|
|
|
137
234
|
Write the rules in **§1**. State what it *must* do, what it must *reject* (each
|
|
138
235
|
with a named error code), and what's true after success:
|
|
@@ -156,7 +253,7 @@ Confirm every assumption (no FX, no daily limit in v1). Then:
|
|
|
156
253
|
python3 .add/tooling/add.py advance
|
|
157
254
|
```
|
|
158
255
|
|
|
159
|
-
### Phase 2 — Scenarios (
|
|
256
|
+
### Phase 2 — Scenarios (`.add/docs/04-step-2-scenarios.md`)
|
|
160
257
|
|
|
161
258
|
In **§2**, turn each rule into a Given/When/Then. For every rejection, assert what
|
|
162
259
|
must stay **unchanged**:
|
|
@@ -171,7 +268,7 @@ Scenario: insufficient funds
|
|
|
171
268
|
|
|
172
269
|
Then `python3 .add/tooling/add.py advance`.
|
|
173
270
|
|
|
174
|
-
### Phase 3 — Contract (
|
|
271
|
+
### Phase 3 — Contract (`.add/docs/05-step-3-contract.md`)
|
|
175
272
|
|
|
176
273
|
In **§3**, fix the external shape and **freeze** it (`Status: FROZEN @ v1`):
|
|
177
274
|
|
|
@@ -182,21 +279,21 @@ POST /transfers body: { fromAccountId, toAccountId, amount }
|
|
|
182
279
|
403 -> { error: "forbidden" }
|
|
183
280
|
```
|
|
184
281
|
|
|
185
|
-
A frozen contract is the
|
|
282
|
+
A frozen contract is the decision point that makes the AI build safe. Then advance.
|
|
186
283
|
|
|
187
|
-
### Phase 4 — Tests, red first (
|
|
284
|
+
### Phase 4 — Tests, red first (`.add/docs/06-step-4-tests.md`)
|
|
188
285
|
|
|
189
286
|
Write one test per scenario into `.add/tasks/transfer/tests/`, then **run them and
|
|
190
287
|
confirm they FAIL** — there's no code yet. A test that passes now is testing
|
|
191
288
|
nothing. This is red/green TDD: red before green. Then advance.
|
|
192
289
|
|
|
193
|
-
### Phase 5 — Build (
|
|
290
|
+
### Phase 5 — Build (`.add/docs/07-step-5-build.md`)
|
|
194
291
|
|
|
195
292
|
Now let the AI write code into `.add/tasks/transfer/src/` until **every test
|
|
196
293
|
passes** — without changing any test or the frozen contract. Honor the safety rule
|
|
197
294
|
(here: debit + credit in one atomic transaction). Then advance.
|
|
198
295
|
|
|
199
|
-
### Phase 6 — Verify (
|
|
296
|
+
### Phase 6 — Verify (`.add/docs/08-step-6-verify.md`)
|
|
200
297
|
|
|
201
298
|
In **§6**, confirm the evidence (all green, nothing weakened) and check what tests
|
|
202
299
|
miss: concurrency, security, architecture. Record the gate — and close the task:
|
|
@@ -208,91 +305,20 @@ python3 .add/tooling/add.py gate PASS
|
|
|
208
305
|
`gate PASS` marks the task `done`. (Use `gate HARD-STOP` to send it back to Build,
|
|
209
306
|
or `gate RISK-ACCEPTED` for a signed, non-security waiver.)
|
|
210
307
|
|
|
211
|
-
### Phase 7 — Observe (
|
|
308
|
+
### Phase 7 — Observe (`.add/docs/09-the-loop.md`)
|
|
212
309
|
|
|
213
310
|
In **§7**, note what to watch in production and the next spec delta. Every learning
|
|
214
311
|
becomes the next `new-task`. The flow is a loop, not a finish line.
|
|
215
312
|
|
|
216
313
|
---
|
|
217
314
|
|
|
218
|
-
##
|
|
219
|
-
|
|
220
|
-
Confirm your project is internally consistent at any time:
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
python3 .add/tooling/add.py check
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
It verifies state is valid, every task has its TASK.md, and markers match. Exit
|
|
227
|
-
code 0 means healthy — handy as a CI gate.
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
## Enforce the seams in CI
|
|
232
|
-
|
|
233
|
-
`add.py audit` re-verifies every recorded human gate on your board — a named
|
|
234
|
-
human at each contract freeze, exactly one gate outcome per done task, a human
|
|
235
|
-
reviewer wherever the security line carries a note. It exits non-zero naming
|
|
236
|
-
the task and the finding, which makes it a CI gate: enforcement runs on a
|
|
237
|
-
machine the agent does not control, so the agent can never stamp its own work
|
|
238
|
-
green (*never self-gate*).
|
|
239
|
-
|
|
240
|
-
Drop this workflow into `.github/workflows/seam-audit.yml`:
|
|
241
|
-
|
|
242
|
-
```yaml
|
|
243
|
-
name: seam-audit
|
|
244
|
-
|
|
245
|
-
on:
|
|
246
|
-
push:
|
|
247
|
-
branches: [main]
|
|
248
|
-
pull_request:
|
|
249
|
-
|
|
250
|
-
permissions:
|
|
251
|
-
contents: read
|
|
252
|
-
|
|
253
|
-
jobs:
|
|
254
|
-
seam-audit:
|
|
255
|
-
name: Seam audit (recorded human gates)
|
|
256
|
-
runs-on: ubuntu-latest
|
|
257
|
-
steps:
|
|
258
|
-
- uses: actions/checkout@v4
|
|
259
|
-
|
|
260
|
-
- uses: actions/setup-python@v5
|
|
261
|
-
with:
|
|
262
|
-
python-version: '3.12'
|
|
263
|
-
|
|
264
|
-
- name: Audit recorded human seams
|
|
265
|
-
run: python3 .add/tooling/add.py audit
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
The command is the same one you can run locally — the installer already placed
|
|
269
|
-
`add.py` at `.add/tooling/add.py`, and the audit is read-only (it never edits
|
|
270
|
-
your board). A red `seam-audit` job means a seam record is malformed or a
|
|
271
|
-
security note was left to the auto-gate; fix the record (or escalate the gate
|
|
272
|
-
to a human), never the auditor.
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
## 6 · Resume next session
|
|
277
|
-
|
|
278
|
-
Close your laptop, come back tomorrow, run:
|
|
279
|
-
|
|
280
|
-
```bash
|
|
281
|
-
python3 .add/tooling/add.py status
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
It tells you exactly where you left off and what to do next. No context rot — the
|
|
285
|
-
state lives on disk, not in a chat window.
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## 7 · Where to read more
|
|
315
|
+
## Where to read more
|
|
290
316
|
|
|
291
317
|
You just ran the method; now read *why* it's shaped this way:
|
|
292
318
|
|
|
293
319
|
- The shift & principles — `.add/docs/00-introduction.md`, `.add/docs/01-principles.md`
|
|
294
320
|
- The flow end to end — `.add/docs/02-the-flow.md`
|
|
295
|
-
- Each step in depth — `.add/docs/03
|
|
321
|
+
- Each step in depth — `.add/docs/03-step-1-specify.md` through `.add/docs/09-the-loop.md`
|
|
296
322
|
- Operating it on a team — `.add/docs/11-governance.md`, `.add/docs/12-roles.md`
|
|
297
323
|
- A fully worked example — `.add/docs/appendix-d-worked-example.md`
|
|
298
324
|
|
package/README.md
CHANGED
|
@@ -34,15 +34,18 @@ Pick your ecosystem — both install the same skill, tooling, and book:
|
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
# Node / npm
|
|
37
|
-
npx @pilotspace/add init
|
|
37
|
+
npx @pilotspace/add init
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
41
|
# Python / pip
|
|
42
42
|
pip install pilotspace-add
|
|
43
|
-
pilotspace-add init
|
|
43
|
+
pilotspace-add init
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
No flags needed — the project name is inferred from your folder and the stage
|
|
47
|
+
defaults to `prototype` (pass `--name "My App" --stage mvp` to choose up front).
|
|
48
|
+
|
|
46
49
|
**New here?** Follow the [10-minute Quickstart](./GETTING-STARTED.md) — it walks
|
|
47
50
|
your first feature end to end.
|
|
48
51
|
|
|
@@ -52,9 +55,12 @@ This installs:
|
|
|
52
55
|
|------|------|
|
|
53
56
|
| `.claude/skills/add/` | the `add` skill Claude loads (thin router + per-phase guides) |
|
|
54
57
|
| `.add/tooling/add.py` | scaffolder + state tracker (Python, stdlib only) |
|
|
55
|
-
| `.add/docs/` | the AIDD book — the
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
| `.add/docs/` | the AIDD book — the method rationale |
|
|
59
|
+
|
|
60
|
+
Project state (`.add/state.json`) and the living-documentation files (`CONVENTIONS.md`,
|
|
61
|
+
`GLOSSARY.md`, `MODEL_REGISTRY.md`, `dependencies.allowlist`) are *not* created
|
|
62
|
+
here — the installer drops files only; initialisation is the agent's first move
|
|
63
|
+
when you run `/add`.
|
|
58
64
|
|
|
59
65
|
## Use it
|
|
60
66
|
|
|
@@ -64,7 +70,7 @@ ADD is AI-first: you talk to the agent; it drives the method. In Claude Code, ru
|
|
|
64
70
|
> `/add` — *"I want to let users transfer money between their own accounts."*
|
|
65
71
|
|
|
66
72
|
The agent orients from `state.json`, **sizes your request into a milestone** (you
|
|
67
|
-
confirm the shape), then drafts each feature's **
|
|
73
|
+
confirm the shape), then drafts each feature's **specification bundle** — Spec +
|
|
68
74
|
Scenarios + Contract + Tests as one bundle — and you give **one approval at the
|
|
69
75
|
frozen contract**. A self-driving build→verify run takes it to green; security
|
|
70
76
|
findings always stop back to you.
|
|
@@ -80,7 +86,7 @@ python3 .add/tooling/add.py status # where am I? (resume point)
|
|
|
80
86
|
1. **Direction before speed** — no Build until spec, scenarios, contract, and *red*
|
|
81
87
|
tests exist.
|
|
82
88
|
2. **Trust evidence, not inspection** — a feature is trusted because its tests pass
|
|
83
|
-
and the
|
|
89
|
+
and the non-functional risks (concurrency, security, architecture) were checked.
|
|
84
90
|
3. **Never weaken a test or edit a frozen contract** to make the build pass.
|
|
85
91
|
4. **No silent skips** — every Verify records `PASS`, `RISK-ACCEPTED`, or
|
|
86
92
|
`HARD-STOP`. Security findings are always `HARD-STOP`.
|
package/bin/cli.js
CHANGED
|
@@ -29,12 +29,20 @@ function warn(msg) { process.stderr.write("warn: " + msg + "\n"); }
|
|
|
29
29
|
function fail(msg) { process.stderr.write("error: " + msg + "\n"); process.exit(1); }
|
|
30
30
|
|
|
31
31
|
function parseArgs(argv) {
|
|
32
|
-
|
|
32
|
+
// stage/name stay null unless EXPLICITLY passed — the engine's own `init`
|
|
33
|
+
// defaults the stage and infers the name from the folder, so the manual-init
|
|
34
|
+
// hint only echoes flags the user actually chose (shortest true command).
|
|
35
|
+
const args = { _: [], force: false, stage: null, name: null };
|
|
33
36
|
for (let i = 0; i < argv.length; i++) {
|
|
34
37
|
const a = argv[i];
|
|
35
38
|
if (a === "--force") args.force = true;
|
|
36
|
-
else if (a === "--stage"
|
|
37
|
-
|
|
39
|
+
else if (a === "--stage" || a === "--name") {
|
|
40
|
+
const v = argv[++i];
|
|
41
|
+
// fail loudly on a trailing/abutting flag — never silently drop a value
|
|
42
|
+
// the user tried to pass (parity with the pip twin's argparse error)
|
|
43
|
+
if (v == null || v.startsWith("--")) fail(a + " requires a value");
|
|
44
|
+
if (a === "--stage") args.stage = v; else args.name = v;
|
|
45
|
+
}
|
|
38
46
|
else if (a.startsWith("--")) warn("ignoring unknown flag " + a);
|
|
39
47
|
else args._.push(a);
|
|
40
48
|
}
|
|
@@ -99,7 +107,8 @@ function cmdInit(args) {
|
|
|
99
107
|
log("");
|
|
100
108
|
log("Prefer the CLI / not using Claude Code? Initialise it yourself (this arms the lock-down):");
|
|
101
109
|
const launcher = process.platform === "win32" ? "py" : "python3";
|
|
102
|
-
log(` ${launcher} .add/tooling/add.py init --await-lock
|
|
110
|
+
log(` ${launcher} .add/tooling/add.py init --await-lock` +
|
|
111
|
+
(args.stage ? ` --stage ${args.stage}` : "") +
|
|
103
112
|
(args.name ? ` --name "${args.name}"` : ""));
|
|
104
113
|
}
|
|
105
114
|
|
package/docs/01-principles.md
CHANGED
|
@@ -34,7 +34,7 @@ The flow has an order, but it is not a one-way march. Any step may reveal a gap
|
|
|
34
34
|
|
|
35
35
|
How much you let the AI do is not a single switch. It is a setting that lives *per scope*, and it can differ from one part of the system to another. A well-tested, low-risk area may run at full autonomy while a new, high-risk one is held back.
|
|
36
36
|
|
|
37
|
-
The *default starting point* is a deliberate choice. A team that has built up evidence and tooling may **start a scope at auto** — the AI drafts the
|
|
37
|
+
The *default starting point* is a deliberate choice. A team that has built up evidence and tooling may **start a scope at auto** — the AI drafts the specification bundle, a human approves the frozen contract once, and the build runs and auto-gates on evidence — and *lower to conservative* wherever risk is high. (An earlier formulation started every scope conservative and made autonomy the earned exception; it is the same control either way — what differs is which end you default to.) Two things never move with the default, whichever way it points: the contract-freeze decision point stays human (the AI never freezes the interface it then builds against), and a high-risk scope is always lowered, never auto-run.
|
|
38
38
|
|
|
39
39
|
**Consequence:** autonomy is a per-scope setting you choose deliberately and can lower at any time; high-risk scope is held to a human gate regardless of the default (see [11 Governance](./11-governance.md)).
|
|
40
40
|
|
|
@@ -60,9 +60,9 @@ The instructions you give the AI are plain text that reference files in the repo
|
|
|
60
60
|
|
|
61
61
|
**Consequence:** the same project works whether the team uses one AI coding tool or another, and switching tools changes nothing structural.
|
|
62
62
|
|
|
63
|
-
## 9. Two
|
|
63
|
+
## 9. Two layers: the working state you load, the audit trail you reference
|
|
64
64
|
|
|
65
|
-
A method that fills the context window with its own documentation defeats itself — the agent rots before it reaches the work. So ADD keeps two
|
|
65
|
+
A method that fills the context window with its own documentation defeats itself — the agent rots before it reaches the work. So ADD keeps two documentation layers and never loads both. The **working state** is everything an agent loads to do the work each session: the `add` skill itself (its router `SKILL.md` and the one phase currently in play) together with the lean, current operational docs — `PROJECT.md` (the foundation), the active `MILESTONE.md`, the active `TASK.md`, and `state.json`. The **audit trail** is this book plus the records behind it: the whole method, read once by a person to understand and trust ADD, and thereafter **never auto-loaded** into agent context — only referenced by a pointer. Depth lives in the audit trail; leanness is enforced on the working state; they never compete for the same tokens.
|
|
66
66
|
|
|
67
67
|
**Consequence:** the book can be as rich as trust requires without costing a single runtime token, while the loaded surface stays small enough never to rot. It is why the guideline block in `CLAUDE.md`/`AGENTS.md` *points* to `add.py status` and `PROJECT.md` rather than copying them.
|
|
68
68
|
|