@pilotspace/add 1.11.0 → 1.13.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 +112 -0
- package/docs/02-the-flow.md +10 -0
- package/docs/03-step-1-specify.md +1 -1
- package/docs/04-step-2-scenarios.md +1 -1
- package/docs/08-step-6-verify.md +4 -2
- package/docs/09-the-loop.md +4 -0
- package/docs/11-governance.md +1 -1
- package/docs/14-foundation.md +6 -4
- package/docs/16-releasing.md +1 -1
- package/docs/appendix-c-glossary.md +10 -2
- package/package.json +1 -1
- package/skill/add/SKILL.md +7 -3
- package/skill/add/advisor.md +8 -1
- package/skill/add/design.md +19 -2
- package/skill/add/intake.md +16 -0
- package/skill/add/phases/5-build.md +1 -1
- package/skill/add/phases/6-verify.md +13 -14
- package/skill/add/phases/7-observe.md +11 -10
- package/skill/add/release.md +1 -1
- package/skill/add/run.md +20 -20
- package/skill/add/scope.md +1 -1
- package/skill/add/streams.md +7 -0
- package/tooling/add.py +688 -107
- package/tooling/add_engine/constants.py +1 -1
- package/tooling/add_engine/release.py +3 -3
- package/tooling/templates/DESIGN.md.tmpl +11 -0
- package/tooling/templates/TASK.fast.md.tmpl +2 -0
- package/tooling/templates/TASK.md.tmpl +15 -1
|
@@ -213,7 +213,7 @@ _DELTA_RE = re.compile(
|
|
|
213
213
|
)
|
|
214
214
|
_EVIDENCE_RE = re.compile(r"^(.*?)\s*\(evidence:\s*(.*?)\)\s*$")
|
|
215
215
|
_SPEC_DELTA_RE = re.compile(
|
|
216
|
-
r"\s*-\s*\[\s*(SPEC)\s*·\s*(open|seeded|dropped)\s*\]\s*(.+)$"
|
|
216
|
+
r"\s*-\s*\[\s*(SPEC)\s*·\s*(open|seeded|dropped|carried)\s*\]\s*(.+)$"
|
|
217
217
|
)
|
|
218
218
|
|
|
219
219
|
|
|
@@ -46,9 +46,9 @@ def _key_decisions_for(root: Path, slug: str) -> list[str]:
|
|
|
46
46
|
if st.startswith(("-", "*")) and slug in st]
|
|
47
47
|
|
|
48
48
|
def _build_in_flight(state: dict) -> bool:
|
|
49
|
-
"""
|
|
50
|
-
— phase ∈ {build, verify} AND gate == 'none'? The tool-agnostic engine never runs the
|
|
51
|
-
so an entered-but-ungated build is the recorded-evidence stand-in for 'the suite is red'."""
|
|
49
|
+
"""release_build_in_flight proxy (PURE): is any ACTIVE task mid-build without a recorded green
|
|
50
|
+
gate — phase ∈ {build, verify} AND gate == 'none'? The tool-agnostic engine never runs the
|
|
51
|
+
suite, so an entered-but-ungated build is the recorded-evidence stand-in for 'the suite is red'."""
|
|
52
52
|
return any(t.get("phase") in ("build", "verify") and t.get("gate") == "none"
|
|
53
53
|
for t in (state.get("tasks") or {}).values())
|
|
54
54
|
|
|
@@ -31,6 +31,17 @@ The design intent the AI drafts UI against — the persona, the one job, the fee
|
|
|
31
31
|
- **Design principles** — <!-- 3–5 lines, e.g. "one primary action per screen" · "never hide state" -->
|
|
32
32
|
- **Accessibility floor** — <!-- e.g. WCAG AA contrast · focus-visible · hit-target ≥ 44px -->
|
|
33
33
|
|
|
34
|
+
## Design intake
|
|
35
|
+
|
|
36
|
+
The per-design picks the `design-intake` beat collects (see the `add` skill's `design.md`).
|
|
37
|
+
These are project **defaults**; a screen records only its **overrides** in its prototype note.
|
|
38
|
+
VISUAL DESIGN draws its color/type from **## Identity** above — don't restate the brand here.
|
|
39
|
+
|
|
40
|
+
- **Fidelity** — <!-- lo-fi wireframe | hi-fi mockup | production — how far this design renders -->
|
|
41
|
+
- **Concept** — <!-- the design idea / mood / direction, in a line -->
|
|
42
|
+
- **Layout** — <!-- the structure / grid / hierarchy the screens lean on -->
|
|
43
|
+
- **Visual design** — <!-- spacing scale · imagery style (color · type come from ## Identity) -->
|
|
44
|
+
|
|
34
45
|
## Screens
|
|
35
46
|
|
|
36
47
|
An index of the app's screens — one `design/prototypes/<name>.json` per screen (a flat
|
|
@@ -55,6 +55,8 @@ Tests live in: `./tests/` · MUST run red (missing implementation) before Build.
|
|
|
55
55
|
## 5 · BUILD — AI writes code
|
|
56
56
|
|
|
57
57
|
Scope (may touch): `./src/` <every file the build may write — declared before the §3 freeze>
|
|
58
|
+
Strategy & known-problem fixes: <ordered build steps · the trap each known problem must dodge>
|
|
59
|
+
Strategy actually used: <fill at verify — what you ACTUALLY did, or "as planned"; harvested into §7 Decisions>
|
|
58
60
|
Code lives in: `./src/` · Constraints: change no test, no contract; allow-list packages only.
|
|
59
61
|
|
|
60
62
|
---
|
|
@@ -108,6 +108,8 @@ Tests live in: `./tests/` · MUST run red (missing implementation) before Build.
|
|
|
108
108
|
|
|
109
109
|
Scope (may touch): `./src/` <fill before the §3 freeze — every file the build may write>
|
|
110
110
|
Strategy (ordered batches): <1. … 2. … — the planned build order; guidance, not enforced>
|
|
111
|
+
Known-problem fixes: <trap → planned fix — the failure modes this build must dodge; guidance, not enforced>
|
|
112
|
+
Strategy actually used: <fill at VERIFY — the strategy you ACTUALLY used (or "as planned"); harvested into the §7 Decisions (ADR) block as the [AI] build decision>
|
|
111
113
|
Safety rule (feature-specific): <e.g. debit+credit in one atomic transaction>
|
|
112
114
|
Code lives in: `./src/`
|
|
113
115
|
Constraints: do NOT change any test or the contract; allow-list packages only; ask if unclear.
|
|
@@ -117,7 +119,8 @@ Constraints: do NOT change any test or the contract; allow-list packages only; a
|
|
|
117
119
|
outside-root resolutions are dropped fail-closed · a DIRECTORY token covers its
|
|
118
120
|
whole subtree (containment — diverges from §4's non-recursive counting) ·
|
|
119
121
|
absent line = UNDECLARED (pre-existing tasks grandfathered, never retro-red) ·
|
|
120
|
-
engine enforcement (touched ⊆ declared)
|
|
122
|
+
engine enforcement (touched ⊆ declared) is live: a completing verify gate refuses an
|
|
123
|
+
out-of-scope build (scope_violation → self-heal) and add.py check surfaces it.
|
|
121
124
|
EXIT: all green; coverage held; no test/contract touched; no unlisted dependency. -->
|
|
122
125
|
|
|
123
126
|
---
|
|
@@ -145,6 +148,14 @@ Constraints: do NOT change any test or the contract; allow-list packages only; a
|
|
|
145
148
|
- [ ] DEAD-CODE (code) — no new unused or orphaned symbol introduced
|
|
146
149
|
- [ ] SEMANTIC (prose / non-code) — read in full, not skimmed: <what read · what confirmed>
|
|
147
150
|
|
|
151
|
+
### Refute-read verdict — the earned-green check (record it; required for an auto-PASS)
|
|
152
|
+
> Under autonomy: auto the AI auto-resolves Verify, so the earned-green refute-read MUST be
|
|
153
|
+
> recorded here (the engine never spawns it — you do; NOT-EARNED -> `add.py heal`). The engine
|
|
154
|
+
> MEASURES it is filled (`audit: refute_unrecorded`); it never auto-blocks — a human spot-audit
|
|
155
|
+
> is the backstop. A human-gated (conservative/manual) task may leave it for the human's judgment.
|
|
156
|
+
Verdict: <EARNED | NOT-EARNED>
|
|
157
|
+
By: <self | agent-id> · adversarially checked: <what was probed>
|
|
158
|
+
|
|
148
159
|
### GATE RECORD
|
|
149
160
|
Outcome: <PASS | RISK-ACCEPTED | HARD-STOP>
|
|
150
161
|
If RISK-ACCEPTED -> owner: <name> · ticket: <link> · expires: <date> (never for a security gap)
|
|
@@ -158,6 +169,9 @@ Reviewed by: <name> · date: <date>
|
|
|
158
169
|
|
|
159
170
|
Watch (reuse scenarios as monitors): <error rate / per-rejection rate / latency>
|
|
160
171
|
|
|
172
|
+
### Decisions (ADR)
|
|
173
|
+
<harvested at done from §1/§3/§5/§6 — do not hand-edit; one actor-tagged line per decision, refilled only while this placeholder stands>
|
|
174
|
+
|
|
161
175
|
### Spec delta
|
|
162
176
|
Forward changes for the next loop — each re-enters at Specify as the next task. One line
|
|
163
177
|
each, tagged `[SPEC · open|seeded|dropped]`, with evidence (e.g. `[SPEC · open] rate-limit
|