@pilotspace/add 1.1.0 → 1.3.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 +81 -0
- package/GETTING-STARTED.md +187 -139
- package/README.md +13 -7
- package/bin/cli.js +96 -5
- package/docs/01-principles.md +3 -3
- package/docs/02-the-flow.md +19 -12
- package/docs/03-step-1-specify.md +15 -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 +10 -2
- package/docs/07-step-5-build.md +3 -1
- package/docs/08-step-6-verify.md +25 -5
- package/docs/09-the-loop.md +12 -6
- package/docs/10-setup-and-stages.md +27 -13
- package/docs/11-governance.md +6 -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 +49 -12
- package/docs/appendix-d-worked-example.md +2 -2
- package/docs/appendix-e-checklists.md +16 -4
- 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 +41 -38
- 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-ground.md +66 -0
- package/skill/add/phases/0-setup.md +32 -25
- package/skill/add/phases/1-specify.md +28 -13
- package/skill/add/phases/2-scenarios.md +14 -4
- package/skill/add/phases/3-contract.md +27 -12
- package/skill/add/phases/4-tests.md +15 -5
- package/skill/add/phases/5-build.md +33 -4
- package/skill/add/phases/6-verify.md +40 -2
- package/skill/add/phases/7-observe.md +13 -5
- package/skill/add/report-template.md +65 -7
- package/skill/add/run.md +93 -39
- package/skill/add/scope.md +10 -6
- package/skill/add/setup-review.md +13 -10
- package/skill/add/streams.md +88 -23
- package/tooling/add.py +1817 -90
- package/tooling/templates/CONVENTIONS.md.tmpl +1 -1
- package/tooling/templates/DESIGN.md.tmpl +66 -0
- package/tooling/templates/GLOSSARY.md.tmpl +29 -0
- package/tooling/templates/MILESTONE.md.tmpl +1 -0
- package/tooling/templates/PROJECT.md.tmpl +6 -3
- package/tooling/templates/TASK.md.tmpl +55 -15
- package/tooling/templates/catalog.sample.json +38 -0
- package/tooling/templates/prototype.sample.json +48 -0
- package/tooling/templates/tokens.sample.json +55 -0
- package/tooling/templates/udd-catalog.md +122 -0
- package/tooling/templates/udd-tokens.md +79 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,87 @@ 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.3.0] — 2026-06-13
|
|
8
|
+
|
|
9
|
+
The render-ready-foundation release: a UI project now gets a lintable design
|
|
10
|
+
foundation the AI drafts from, a build's declared scope is enforced as a gate,
|
|
11
|
+
every command names who drives the next step, and the new update command
|
|
12
|
+
refreshes an installed project in place. All additive; no breaking changes
|
|
13
|
+
(SemVer MINOR).
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Render-ready UDD foundation** — a `DESIGN.md` prose front-door plus a JSON
|
|
17
|
+
foundation (3-layer design tokens · a component catalog · flat prototype
|
|
18
|
+
content trees) the AI drafts UI from, wired into 0-setup. `add.py check` now
|
|
19
|
+
lints the named set under `.add/design/`, going red with a named code on any
|
|
20
|
+
layer, catalog, tree, or cross-file token-resolution violation — and staying
|
|
21
|
+
silent when a project has no design set, so non-UI projects are unaffected.
|
|
22
|
+
A `udd-tokens.md` + `udd-catalog.md` pair documents the compact-DTCG dialect
|
|
23
|
+
and the json-render render recipe.
|
|
24
|
+
- **The scope gate** — a task's `§5 Scope (may touch)` declaration is frozen
|
|
25
|
+
into a snapshot at tests→build and enforced at the gate: an out-of-scope touch
|
|
26
|
+
heals the task back to BUILD for an honest redo (counting against a per-task
|
|
27
|
+
cap), while erased gate evidence fails closed. Scope creep can no longer ride a
|
|
28
|
+
green suite into a merge.
|
|
29
|
+
- **Engine next-step footer + the driver marker** — every completing command now
|
|
30
|
+
prints exactly one engine-sourced `next:` line, and names who owns it:
|
|
31
|
+
`[you drive]` when the AI proceeds, `[human gate]` at a decision point. The
|
|
32
|
+
driver marker resolves from one place (autonomy × phase), so the next step and
|
|
33
|
+
its owner are never ambiguous across a session.
|
|
34
|
+
- **The `update` command** — `npx @pilotspace/add update` (and the
|
|
35
|
+
`pilotspace-add update` command on PyPI) re-materializes the managed layer
|
|
36
|
+
(skill · tooling · docs) to the installed package version without a re-install.
|
|
37
|
+
It never touches your work — `state.json`, `PROJECT.md`, milestones, tasks, and
|
|
38
|
+
archive are preserved (state is backed up first regardless) — is idempotent via
|
|
39
|
+
a `.add-version` stamp, and offers `--check` to report version drift without
|
|
40
|
+
writing.
|
|
41
|
+
|
|
42
|
+
### Changed
|
|
43
|
+
- The foundation self-improved across these milestones: closing
|
|
44
|
+
`udd-design-foundation` folded its OBSERVE backlog into the versioned
|
|
45
|
+
CONVENTIONS/PROJECT foundation (foundation-version 29), sharpening the
|
|
46
|
+
contract-completeness, adversarial-refute, and engine-pin conventions.
|
|
47
|
+
|
|
48
|
+
## [1.2.0] — 2026-06-10
|
|
49
|
+
|
|
50
|
+
The decision-arc release: the method now narrates the build as one continuous
|
|
51
|
+
arc of decisions, and the loop reaches past a single milestone — graduating a
|
|
52
|
+
prototype to production, gating milestones on their own goal, and running tasks
|
|
53
|
+
in parallel waves. All additive; no breaking changes (SemVer MINOR).
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
- **The decision arc** — every human-gate report opens by naming where you are
|
|
57
|
+
on the arc (intent → cases → contract → tests → build → verify → observe), and
|
|
58
|
+
the book + GLOSSARY describe it as the spine of the method. The one human
|
|
59
|
+
approval is always placed on the arc, never floating.
|
|
60
|
+
- **Graduation to production** — `add.py graduate` plus a graduate-guide and a
|
|
61
|
+
`→production` stage guard turn the mvp→production transition into an
|
|
62
|
+
analytics-driven, criteria-gated step instead of a label flip: a
|
|
63
|
+
graduation-report surfaces the evidence and a stage-goal-criteria cue tells you
|
|
64
|
+
when the prototype has earned the next stage.
|
|
65
|
+
- **Goal-gated milestones & the dynamic task loop** — an explicit project GOAL
|
|
66
|
+
now rides on `status`/`guide`, a milestone completes only when every success
|
|
67
|
+
criterion is met, and a recorded `done → phase` reopen-transition lets a closed
|
|
68
|
+
task legitimately re-open without losing its history.
|
|
69
|
+
- **verify-deepen** — the verify phase gained a deep-check rubric
|
|
70
|
+
(wiring · dead-code · semantic) so verification probes intent, not just a green
|
|
71
|
+
suite.
|
|
72
|
+
- **Parallel waves** — `WAVE.md`, the wave ledger that is the resume point for
|
|
73
|
+
parallel task execution; `status` surfaces a live wave so a multi-task wave can
|
|
74
|
+
pause and resume cleanly.
|
|
75
|
+
- **The flag-first freeze guard** — declaring a contract freeze is now
|
|
76
|
+
fail-closed: an `unflagged_freeze` is refused at `advance` time and flagged by
|
|
77
|
+
`add.py audit`, so a freeze can never be recorded without its explicit marker.
|
|
78
|
+
- **Foundations & Lineage chapter** — the book gained an annotated Foundations
|
|
79
|
+
chapter with author-year citations and a references appendix, tracing the
|
|
80
|
+
method's lineage.
|
|
81
|
+
|
|
82
|
+
### Changed
|
|
83
|
+
- Engine prose now speaks one ubiquitous language — `add.py` output uses
|
|
84
|
+
consistent domain terms (scope level, decision point, retrospective, …).
|
|
85
|
+
- `add.py compact` keeps the active state lean by compacting heavy archive
|
|
86
|
+
history, with the bundled engine frozen in lockstep.
|
|
87
|
+
|
|
7
88
|
## [1.1.0] — 2026-06-05
|
|
8
89
|
|
|
9
90
|
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,232 @@ 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
|
|
|
66
|
+
### Updating to a newer ADD — no re-install
|
|
67
|
+
|
|
68
|
+
When a new ADD version ships, refresh a project in two steps: bump the package
|
|
69
|
+
(your package manager), then re-materialize it into the project with `update`:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# npm — one shot (npx fetches latest, then re-materializes into this project):
|
|
73
|
+
npx @pilotspace/add@latest update
|
|
74
|
+
|
|
75
|
+
# pip — one shot via pipx (the npx analog: fetch latest + run):
|
|
76
|
+
pipx run pilotspace-add update
|
|
77
|
+
|
|
78
|
+
# …or plain pip, in two steps:
|
|
79
|
+
pip install -U pilotspace-add && pilotspace-add update
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`update` clean-replaces the managed layer (`skill` · `.add/tooling` · `.add/docs`)
|
|
83
|
+
and **never touches your work** — `state.json`, `PROJECT.md`, milestones, tasks and
|
|
84
|
+
archive are left exactly as they were (it backs `state.json` up first regardless). It
|
|
85
|
+
is idempotent (same version twice is a no-op) and writes a `.add/.add-version` stamp.
|
|
86
|
+
Run `… update --check` to see whether a project is behind the installed package.
|
|
87
|
+
|
|
81
88
|
---
|
|
82
89
|
|
|
83
|
-
## 2 ·
|
|
90
|
+
## 2 · Your first feature — talk to the agent
|
|
91
|
+
|
|
92
|
+
In Claude Code, the whole onboarding is one move:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
in Claude Code: /add
|
|
96
|
+
you: "I want to let users transfer money between their own accounts."
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
From there the agent runs the **onboarding** for you:
|
|
100
|
+
|
|
101
|
+
1. **Orient** — it reads the project state (the resume point), never re-reading
|
|
102
|
+
your repo. On a fresh install it initialises the project itself and drafts
|
|
103
|
+
the foundation for your sign-off (the **baseline approval** — the one signature the
|
|
104
|
+
installer's closing message points at).
|
|
105
|
+
2. **Intake** — it sizes your request into versioned scope and proposes a **milestone**
|
|
106
|
+
(goal · scope · breadth-first tasks · exit criteria). *You confirm the shape.*
|
|
107
|
+
3. **Specification bundle** — for each task it drafts Spec + Scenarios + Contract + Tests
|
|
108
|
+
as one bundle, led by its lowest-confidence points. *You give one approval at the
|
|
109
|
+
frozen contract.*
|
|
110
|
+
4. **Self-driving run** — build→verify runs to green; a security finding always stops
|
|
111
|
+
back to you.
|
|
112
|
+
|
|
113
|
+
So a milestone-sized feature is: **describe it → confirm the milestone → approve each
|
|
114
|
+
contract → review the result.** Everything between is the agent. For the
|
|
115
|
+
transfer-money feature above, that's four short conversations — and zero typed
|
|
116
|
+
commands.
|
|
117
|
+
|
|
118
|
+
> New term: **Onboarding** — the install→first-milestone path. See `.add/docs/appendix-c-glossary.md`.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 3 · What just happened (and your override)
|
|
123
|
+
|
|
124
|
+
Behind the conversation, the agent drove the CLI: it read the resume point, sized
|
|
125
|
+
the milestone, froze the contract you approved, ran the tests red, built to green,
|
|
126
|
+
and recorded the gate. The state lives on disk, not in the chat window.
|
|
127
|
+
|
|
128
|
+
If you ever want to see that state yourself — or take over entirely — the same
|
|
129
|
+
CLI is yours:
|
|
84
130
|
|
|
85
131
|
```bash
|
|
86
132
|
python3 .add/tooling/add.py status
|
|
87
133
|
```
|
|
88
134
|
|
|
89
|
-
`add.py status` is
|
|
90
|
-
|
|
91
|
-
|
|
135
|
+
`add.py status` is the resume point: project stage, active task, current phase.
|
|
136
|
+
And `add.py guide` tells you what the current phase needs — its `guide :` line
|
|
137
|
+
names the exact phase-guide file to read (`.claude/skills/add/phases/…` — plain
|
|
138
|
+
markdown), which is how **any** agent — Claude, Cursor, Copilot, Codex — follows
|
|
139
|
+
ADD through the CLI alone.
|
|
92
140
|
|
|
93
141
|
> Tip: shorten typing with an alias — `alias add="python3 .add/tooling/add.py"` —
|
|
94
|
-
> then you can run `add status`, `add
|
|
95
|
-
> the
|
|
142
|
+
> then you can run `add status`, `add guide`, etc. These are override and resume
|
|
143
|
+
> surfaces, not steps you owe the method: the appendix walks the full by-hand path
|
|
144
|
+
> whenever you want the wheel.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Resume next session
|
|
96
149
|
|
|
97
|
-
|
|
150
|
+
Close your laptop, come back tomorrow, type `/add` again — the agent reorients
|
|
151
|
+
itself from disk and continues exactly where you left off. No context rot.
|
|
152
|
+
|
|
153
|
+
The same resume point is yours directly:
|
|
98
154
|
|
|
99
155
|
```bash
|
|
100
|
-
python3 .add/tooling/add.py
|
|
156
|
+
python3 .add/tooling/add.py status
|
|
101
157
|
```
|
|
102
158
|
|
|
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
159
|
---
|
|
110
160
|
|
|
111
|
-
##
|
|
161
|
+
## Self-check
|
|
162
|
+
|
|
163
|
+
Confirm your project is internally consistent at any time:
|
|
112
164
|
|
|
113
165
|
```bash
|
|
114
|
-
python3 .add/tooling/add.py
|
|
166
|
+
python3 .add/tooling/add.py check
|
|
115
167
|
```
|
|
116
168
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
169
|
+
It verifies state is valid, every task has its TASK.md, and markers match. Exit
|
|
170
|
+
code 0 means healthy — handy as a CI gate.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Enforce the decision points in CI
|
|
175
|
+
|
|
176
|
+
`add.py audit` re-verifies every recorded human gate on your board — a named
|
|
177
|
+
human at each contract freeze, exactly one gate outcome per done task, a human
|
|
178
|
+
reviewer wherever the security line carries a note. It exits non-zero naming
|
|
179
|
+
the task and the finding, which makes it a CI gate: enforcement runs on a
|
|
180
|
+
machine the agent does not control, so the agent can never stamp its own work
|
|
181
|
+
green (*never self-gate*).
|
|
182
|
+
|
|
183
|
+
Drop this workflow into `.github/workflows/seam-audit.yml`:
|
|
184
|
+
|
|
185
|
+
```yaml
|
|
186
|
+
name: seam-audit
|
|
187
|
+
|
|
188
|
+
on:
|
|
189
|
+
push:
|
|
190
|
+
branches: [main]
|
|
191
|
+
pull_request:
|
|
192
|
+
|
|
193
|
+
permissions:
|
|
194
|
+
contents: read
|
|
195
|
+
|
|
196
|
+
jobs:
|
|
197
|
+
seam-audit:
|
|
198
|
+
name: Decision-point audit (recorded human gates)
|
|
199
|
+
runs-on: ubuntu-latest
|
|
200
|
+
steps:
|
|
201
|
+
- uses: actions/checkout@v4
|
|
202
|
+
|
|
203
|
+
- uses: actions/setup-python@v5
|
|
204
|
+
with:
|
|
205
|
+
python-version: '3.12'
|
|
120
206
|
|
|
121
|
-
|
|
207
|
+
- name: Audit recorded decision points
|
|
208
|
+
run: python3 .add/tooling/add.py audit
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
The command is the same one you can run locally — the installer already placed
|
|
212
|
+
`add.py` at `.add/tooling/add.py`, and the audit is read-only (it never edits
|
|
213
|
+
your board). A red `seam-audit` job means a decision record is malformed or a
|
|
214
|
+
security note was left to the auto-gate; fix the record (or escalate the gate
|
|
215
|
+
to a human), never the auditor.
|
|
122
216
|
|
|
123
217
|
---
|
|
124
218
|
|
|
125
219
|
## Under the hood — the seven phases by hand (escape hatch)
|
|
126
220
|
|
|
127
|
-
Everything above is what the agent drives for you through the one-approval
|
|
128
|
-
|
|
221
|
+
Everything above is what the agent drives for you through the one-approval flow. This
|
|
222
|
+
appendix is the **escape hatch**: the same seven phases run by hand, so you can see what
|
|
129
223
|
each one produces and step in manually whenever you want to. You never *have* to type
|
|
130
224
|
these — they are the agent's hands, and yours when you take the wheel.
|
|
131
225
|
|
|
132
226
|
The rhythm is always: **fill the section → run `python3 .add/tooling/add.py advance`.**
|
|
133
227
|
The tool keeps the `phase:` marker at the top of TASK.md in sync.
|
|
134
228
|
|
|
135
|
-
###
|
|
229
|
+
### Before the phases — initialise and scaffold
|
|
230
|
+
|
|
231
|
+
Starting cold? Install first as in §1 (`npx @pilotspace/add init`). Then
|
|
232
|
+
initialise once and scaffold the task yourself (the agent normally does both):
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
python3 .add/tooling/add.py init
|
|
236
|
+
python3 .add/tooling/add.py new-task transfer --title "Transfer money between my accounts"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
> **Note:** the installer's closing hint shows `init --await-lock` — that form
|
|
240
|
+
> arms the baseline-approval gate so a *human* signs the AI-drafted foundation before
|
|
241
|
+
> any build. Plain `init` skips that gate, which is fine here: by hand, the
|
|
242
|
+
> human IS the one driving every step.
|
|
243
|
+
|
|
244
|
+
This scaffolds `.add/tasks/transfer/TASK.md` — **one file holding all seven phase
|
|
245
|
+
sections** — plus empty `tests/` and `src/` folders, and makes it the active task
|
|
246
|
+
at phase `specify`. Open it in your editor; you'll fill it top to bottom.
|
|
247
|
+
|
|
248
|
+
You can also change the project's depth at any time:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
python3 .add/tooling/add.py stage mvp
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Phase 1 — Specify (`.add/docs/03-step-1-specify.md`)
|
|
136
255
|
|
|
137
256
|
Write the rules in **§1**. State what it *must* do, what it must *reject* (each
|
|
138
257
|
with a named error code), and what's true after success:
|
|
@@ -156,7 +275,7 @@ Confirm every assumption (no FX, no daily limit in v1). Then:
|
|
|
156
275
|
python3 .add/tooling/add.py advance
|
|
157
276
|
```
|
|
158
277
|
|
|
159
|
-
### Phase 2 — Scenarios (
|
|
278
|
+
### Phase 2 — Scenarios (`.add/docs/04-step-2-scenarios.md`)
|
|
160
279
|
|
|
161
280
|
In **§2**, turn each rule into a Given/When/Then. For every rejection, assert what
|
|
162
281
|
must stay **unchanged**:
|
|
@@ -171,7 +290,7 @@ Scenario: insufficient funds
|
|
|
171
290
|
|
|
172
291
|
Then `python3 .add/tooling/add.py advance`.
|
|
173
292
|
|
|
174
|
-
### Phase 3 — Contract (
|
|
293
|
+
### Phase 3 — Contract (`.add/docs/05-step-3-contract.md`)
|
|
175
294
|
|
|
176
295
|
In **§3**, fix the external shape and **freeze** it (`Status: FROZEN @ v1`):
|
|
177
296
|
|
|
@@ -182,21 +301,21 @@ POST /transfers body: { fromAccountId, toAccountId, amount }
|
|
|
182
301
|
403 -> { error: "forbidden" }
|
|
183
302
|
```
|
|
184
303
|
|
|
185
|
-
A frozen contract is the
|
|
304
|
+
A frozen contract is the decision point that makes the AI build safe. Then advance.
|
|
186
305
|
|
|
187
|
-
### Phase 4 — Tests, red first (
|
|
306
|
+
### Phase 4 — Tests, red first (`.add/docs/06-step-4-tests.md`)
|
|
188
307
|
|
|
189
308
|
Write one test per scenario into `.add/tasks/transfer/tests/`, then **run them and
|
|
190
309
|
confirm they FAIL** — there's no code yet. A test that passes now is testing
|
|
191
310
|
nothing. This is red/green TDD: red before green. Then advance.
|
|
192
311
|
|
|
193
|
-
### Phase 5 — Build (
|
|
312
|
+
### Phase 5 — Build (`.add/docs/07-step-5-build.md`)
|
|
194
313
|
|
|
195
314
|
Now let the AI write code into `.add/tasks/transfer/src/` until **every test
|
|
196
315
|
passes** — without changing any test or the frozen contract. Honor the safety rule
|
|
197
316
|
(here: debit + credit in one atomic transaction). Then advance.
|
|
198
317
|
|
|
199
|
-
### Phase 6 — Verify (
|
|
318
|
+
### Phase 6 — Verify (`.add/docs/08-step-6-verify.md`)
|
|
200
319
|
|
|
201
320
|
In **§6**, confirm the evidence (all green, nothing weakened) and check what tests
|
|
202
321
|
miss: concurrency, security, architecture. Record the gate — and close the task:
|
|
@@ -208,91 +327,20 @@ python3 .add/tooling/add.py gate PASS
|
|
|
208
327
|
`gate PASS` marks the task `done`. (Use `gate HARD-STOP` to send it back to Build,
|
|
209
328
|
or `gate RISK-ACCEPTED` for a signed, non-security waiver.)
|
|
210
329
|
|
|
211
|
-
### Phase 7 — Observe (
|
|
330
|
+
### Phase 7 — Observe (`.add/docs/09-the-loop.md`)
|
|
212
331
|
|
|
213
332
|
In **§7**, note what to watch in production and the next spec delta. Every learning
|
|
214
333
|
becomes the next `new-task`. The flow is a loop, not a finish line.
|
|
215
334
|
|
|
216
335
|
---
|
|
217
336
|
|
|
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
|
|
337
|
+
## Where to read more
|
|
290
338
|
|
|
291
339
|
You just ran the method; now read *why* it's shaped this way:
|
|
292
340
|
|
|
293
341
|
- The shift & principles — `.add/docs/00-introduction.md`, `.add/docs/01-principles.md`
|
|
294
342
|
- The flow end to end — `.add/docs/02-the-flow.md`
|
|
295
|
-
- Each step in depth — `.add/docs/03
|
|
343
|
+
- Each step in depth — `.add/docs/03-step-1-specify.md` through `.add/docs/09-the-loop.md`
|
|
296
344
|
- Operating it on a team — `.add/docs/11-governance.md`, `.add/docs/12-roles.md`
|
|
297
345
|
- A fully worked example — `.add/docs/appendix-d-worked-example.md`
|
|
298
346
|
|
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`.
|