pi-aia-asf 0.9.1 → 0.10.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
CHANGED
|
@@ -7,11 +7,106 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
-
## [0.
|
|
10
|
+
## [0.10.0] - 2026-10-07
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- (describe changes for 0.10.0)
|
|
15
|
+
|
|
11
16
|
|
|
12
17
|
### Added
|
|
13
18
|
|
|
14
|
-
-
|
|
19
|
+
- **06b Rule 19 — test selection for the inner loop (P25)**. Rule 10's
|
|
20
|
+
"full test suite green (not a subset)" is a **gate**, and it stays exactly
|
|
21
|
+
where it is: the run before a commit is always the full suite. What Rule 19
|
|
22
|
+
relaxes is only the **intermediate red-green-refactor runs inside a single
|
|
23
|
+
change** — the runs on code you are still editing. The rule is the user's
|
|
24
|
+
own: **run a partial, impact-area subset only when certain that is
|
|
25
|
+
warranted; if not certain, or the blast radius *might* be larger, always run
|
|
26
|
+
full. Default is full** — so the burden of proof sits on the subset, and the
|
|
27
|
+
cheap direction to be wrong in is also the safe one.
|
|
28
|
+
- **"Certain" is evidence, not a feeling.** A subset run must be preceded by a
|
|
29
|
+
stated **impact statement** — changed files, tests selected, and *why nothing
|
|
30
|
+
else can be reached*. Restating the file list does not qualify; no statement
|
|
31
|
+
means not certain, which means full. On top of that, a **mechanical
|
|
32
|
+
disqualifier list** removes judgment wherever "might be bigger" is the
|
|
33
|
+
honest answer: shared/global state, dependencies and lockfile, build/test/CI
|
|
34
|
+
config or the harness itself, schema/migrations/shared fixtures, public
|
|
35
|
+
contracts and shared types, cross-module refactor/rename/move/delete — and
|
|
36
|
+
**any changed file with no entry in the test-impact map**, so a project that
|
|
37
|
+
has not built a map always runs full. The relaxation only ever applies where
|
|
38
|
+
the mapping is known, never where it is guessed.
|
|
39
|
+
- **Deliberately not built**: the drafted coin toss and `iteration % N`
|
|
40
|
+
counter are gone. An LLM cannot roll a dice — asked to flip one it picks the
|
|
41
|
+
answer that skips the slow run — and an undefined iteration boundary means
|
|
42
|
+
the trigger silently never fires. A subset streak also cannot survive a
|
|
43
|
+
commit, because every commit is full-gated. Below a measured ~90s full-suite
|
|
44
|
+
runtime the assessment is skipped entirely and the suite is just run.
|
|
45
|
+
- **Wired in**: `06b-testing-qa.md` Rule 10's checkbox now says in place that
|
|
46
|
+
the gate never moves; `06-implementation.md` test-first steps 3 and 4 name
|
|
47
|
+
the loop/gate split; `SKILL.md` gains two anti-patterns (a subset run with no
|
|
48
|
+
impact statement, and a subset run passed off as the Rule 10 checkbox) and
|
|
49
|
+
the index count moves to 19 rules. Covered by
|
|
50
|
+
`test/test-test-selection.mjs` (26 assertions), which includes a regression
|
|
51
|
+
guard that **fails if the coin-toss or iteration-counter design ever returns**.
|
|
52
|
+
|
|
53
|
+
## [0.9.2] - 2026-10-04
|
|
54
|
+
|
|
55
|
+
### Added
|
|
56
|
+
|
|
57
|
+
- **`references/06i-completeness.md` — the completeness standard (P24, mandatory)**.
|
|
58
|
+
Newer models increasingly ship work that *looks* finished: a function whose body is
|
|
59
|
+
a placeholder, a screen populated with invented records, a report citing a limit
|
|
60
|
+
nobody checked. Green tests do not catch it — the tests get written against the
|
|
61
|
+
stub, so the fake looks verified. The reference states the core rule (**ship the
|
|
62
|
+
real thing, or say out loud what is not real**), the banned patterns (`TODO` /
|
|
63
|
+
`not implemented` / `coming soon` on a user-reachable path, fake or seed data the
|
|
64
|
+
user reads as their own, invented facts stated as checked, silently deferred scope,
|
|
65
|
+
built-but-never-wired, mocks in production paths, config nothing sets), the
|
|
66
|
+
exceptions that must be **declared, never silent** (the user asked for a scaffold,
|
|
67
|
+
an approved deferral, a fake at a test seam), how to prove it is real (exercise each
|
|
68
|
+
part through the entry point the user will use and name that action in the delivery
|
|
69
|
+
report), and a completeness DoD.
|
|
70
|
+
- **Wired in, not bolted on**: Phase 6 gains a mandatory read block and discipline
|
|
71
|
+
rule 11; Phase 7 gains the completeness DoD check; the anti-pattern list gains six
|
|
72
|
+
entries (stub wearing a name, fake data the user reads as their own, invented facts
|
|
73
|
+
stated as fact, quietly deferred scope, stub presented as complete because its own
|
|
74
|
+
tests pass, unexplained deliberate stub); the reference index marks 06i as always
|
|
75
|
+
read. Proportionality holds — small work reads only the core rule and the DoD.
|
|
76
|
+
|
|
77
|
+
### Requires
|
|
78
|
+
|
|
79
|
+
- The enforcement side lives in **pi-vigilant 0.6.2**, which scans the files a
|
|
80
|
+
session changed for stub / fabricated-data / fact-hole markers at final
|
|
81
|
+
verification and puts the `file:line` evidence in front of the agent. The rule and
|
|
82
|
+
the check are the same proposal: the agent must finish the work or state the
|
|
83
|
+
discrepancy.
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
## [0.9.1] - 2026-10-03
|
|
87
|
+
|
|
88
|
+
### Fixed
|
|
89
|
+
|
|
90
|
+
- **Extension no longer loads on pi >= 1.0** — pi 1.0 changed the command
|
|
91
|
+
contract to `registerCommand(name, { description, handler })`, where
|
|
92
|
+
`handler(args: string, ctx)` returns void and user-visible output goes
|
|
93
|
+
through `ctx.ui.notify()`. `/asf` and `/asf-approve` were registered as bare
|
|
94
|
+
functions taking `(args: string[], ctx)` and returning their text, so pi
|
|
95
|
+
1.0.1 refused to load the package at all:
|
|
96
|
+
`Command "/asf" registered by extension ".../index.ts" must define handler()`.
|
|
97
|
+
Both commands now use the options-object form; the argument string is split
|
|
98
|
+
into subcommand + flags and every gate report is notified. Subcommand
|
|
99
|
+
behaviour is unchanged.
|
|
100
|
+
|
|
101
|
+
### Tests
|
|
102
|
+
|
|
103
|
+
- The test harness mock now enforces the real `RegisteredCommand` contract
|
|
104
|
+
(it accepted any shape before, which is how this shipped) and exposes
|
|
105
|
+
`invokeCommand()`, which calls a registered command exactly as pi does and
|
|
106
|
+
captures `ctx.ui.notify()` output.
|
|
107
|
+
- New `test/test-command-contract.mjs` (16 checks): contract enforcement with a
|
|
108
|
+
negative control, arg-as-string parsing, case-insensitive subcommands,
|
|
109
|
+
void return, notify-based output, no bare-function registration left.
|
|
15
110
|
|
|
16
111
|
|
|
17
112
|
## [0.9.0] - 2026-09-27
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-aia-asf",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Ai Applied Agentic Software Factory — codifies the full software development flow: intake, research, spec capture, adversarial analysis, planning with approval gates, test-first implementation, and release. Requires pi-vigilant, pi-smart-web-search, pi-smart-fetch, and pi-aia-browser.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"pi-package",
|
package/skills/aia-asf/SKILL.md
CHANGED
|
@@ -199,6 +199,13 @@ Keep the plan **implementation-ready**: any competent engineer (or agent) can ex
|
|
|
199
199
|
> bloat), split it by topic and keep the parent as an index — never let it grow until
|
|
200
200
|
> editing breaks.**
|
|
201
201
|
|
|
202
|
+
> **Read `references/06i-completeness.md` before implementing, and again before claiming
|
|
203
|
+
> done.** Ship the real thing or say out loud what is not real: no `// TODO` /
|
|
204
|
+
> not-implemented paths on a user-reachable code path, no fake or seed data the user will
|
|
205
|
+
> read as their own, no invented facts presented as checked, no silently deferred scope,
|
|
206
|
+
> no built-but-never-wired module. A stub is legitimate only when the user asked for one
|
|
207
|
+
> — and then it is declared, never silent.
|
|
208
|
+
|
|
202
209
|
> **Read `references/06d-delegation.md` before delegating.** Work may be delegated two ways:
|
|
203
210
|
> **intercom** (message another live pi session that owns relevant context — always `list`
|
|
204
211
|
> first, say what you want back, and treat their findings as evidence, not proof; **optional** —
|
|
@@ -228,6 +235,7 @@ Execute the task list milestone by milestone. Discipline rules:
|
|
|
228
235
|
8. **CHANGELOG discipline**: every user-visible change gets a CHANGELOG entry describing exactly what changed (no placeholder text).
|
|
229
236
|
9. **Challenge approved designs (M4)**: if a spec's literal reading creates product tension (e.g. feedback clusters under "Plan" when "Plan = plans"), stop and resolve it with the user before implementing — never implement blindly and call it delivered.
|
|
230
237
|
10. **Trace before claiming delivered (M5)**: the delivery log is a claim; the code is the evidence. Before marking anything ✅, trace the actual code path, confirm the output is consumed by a surface, and confirm the operator-facing outcome test passes.
|
|
238
|
+
11. **No stubs, no fake data, no invented facts (`references/06i-completeness.md`)**: the deliverable is the real implementation. Finish it, or state the discrepancy plainly to the user — what is missing, why, what remains. Never let the user discover the gap by using the product.
|
|
231
239
|
|
|
232
240
|
---
|
|
233
241
|
|
|
@@ -239,6 +247,8 @@ Also check the **modularity DoD** from `references/06c-code-quality.md` (Phase 7
|
|
|
239
247
|
|
|
240
248
|
Also check the **stability DoD** (`references/06f-stability.md`): if the deliverable makes external calls, it has timeouts and bounded retries (idempotent only). And the **security DoD** (`references/06h-security.md`): no secrets in the repo, no untrusted input reaches a shell/query/path unvalidated, no unbounded resource use on user-controlled input; for agent-like tool surfaces, every tool is least-privilege with an abuse-case test.
|
|
241
249
|
|
|
250
|
+
Also check the **completeness DoD** (`references/06i-completeness.md`): no stub, placeholder, unimplemented path or fabricated data left on a user-reachable path (or declared to the user with the reason); every part of the ask reachable from where the user enters it, with the exercising command/request/action named in the delivery report; nothing asked for quietly moved to "later"; no claim presented as verified when it was not. `pi-vigilant` scans the changed files for these markers at completion — resolve every finding or explain it; a clean scan is not proof of completeness.
|
|
251
|
+
|
|
242
252
|
**Large work:** run `/asf verify` — it mechanically validates the **spec-to-code traceability matrix** (M1): every `met` spec must carry `trace` (outcome → codePath → testFile + assertion), testFile must exist, assertion must appear in it. FAIL rows block delivery. **Verify ingested specs from external planning docs too** — the doc's ✅ markers are claims, not evidence.
|
|
243
253
|
|
|
244
254
|
**Independent reviewer gate (large work, P19):** before delivery, run the
|
|
@@ -259,8 +269,8 @@ conflicts). Record the review + triage in the delivery report.
|
|
|
259
269
|
3. Run `get_task_specs` and verify **every spec** with `update_spec_status` + concrete evidence (test output, build result, code inspection). Unverifiable → `partial` + ask the user. Never self-certify.
|
|
260
270
|
4. **Report honestly**: never claim a check you didn't run; state explicitly anything
|
|
261
271
|
skipped or inconclusive, and distinguish "tests pass" from "works for the user".
|
|
262
|
-
|
|
263
|
-
|
|
272
|
+
5. If the project is a library/package that the user publishes (npm, GitHub release): **check the release policy** — read `.asf-release.json` at the project root if present (see `references/07-release.md`). It defines **when** (user-stated conditional rules: "when X is true, publish automatically; when Y is true, do this…") and **how** (instructions the ASF drives with judgment — credentials, git sync, publish steps). If the policy authorizes automatic publishing for the current state, drive the release per `how`; otherwise **offer** to run the release and get explicit approval (the default stance: publishing is the user's decision). **Always test on publish / in production, if applicable** — verify the shipped artifact from the registry / smoke-test prod, never assume it works. Optionally offer to set up a CI/CD pipeline for publishing.
|
|
273
|
+
6. Present a completion summary: what was built, specs met, tests passing, how to use it.
|
|
264
274
|
|
|
265
275
|
---
|
|
266
276
|
|
|
@@ -298,6 +308,12 @@ conflicts). Record the review + triage in the delivery report.
|
|
|
298
308
|
- ❌ Breaking existing functionality during a refactor — refactoring preserves behavior
|
|
299
309
|
- ❌ Marking a spec delivered from the delivery log instead of tracing the code — the log is a claim
|
|
300
310
|
- ❌ Shipping machinery no surface consumes — delivered = visible in the product (UI or API)
|
|
311
|
+
- ❌ A `// TODO`, `not implemented`, empty handler or `coming soon` on a user-reachable path — that is an absent feature wearing a name
|
|
312
|
+
- ❌ Fake, seed, demo or lorem-ipsum data on a path the user reads as their own
|
|
313
|
+
- ❌ An invented API signature, config key, endpoint, version or limit stated as fact — verify it or mark it unverified
|
|
314
|
+
- ❌ Quietly deferring part of the ask ("v1 does X") instead of finishing it or telling the user
|
|
315
|
+
- ❌ Presenting a stub as complete because the tests written against it pass
|
|
316
|
+
- ❌ Leaving a deliberate stub unexplained — if the user asked for a scaffold, say so in the report
|
|
301
317
|
- ❌ Trusting unit tests as proof of wiring — assert the operator-facing outcome end-to-end
|
|
302
318
|
- ❌ Trusting an external plan's ✅ (IMPROVEMENT-PLAN / delivery log) — ingest its items as specs and verify them
|
|
303
319
|
- ❌ Implementing a spec literally when it creates product tension — challenge it and resolve with the user
|
|
@@ -308,6 +324,8 @@ conflicts). Record the review + triage in the delivery report.
|
|
|
308
324
|
- ❌ Shipping a delivery summary without the report fields: spec status + evidence, test results, skipped checks, not-tested register (06b Rule 17)
|
|
309
325
|
- ❌ Letting an escaped defect teach nothing — ask which gate should have caught it and close the gap (06b Rule 18)
|
|
310
326
|
- ❌ Self-modifying the ASF's own rules during a task run — standards change only via the review process (P22)
|
|
327
|
+
- ❌ Running a subset of tests inside the loop without a stated impact statement, or when uncertain whether the blast radius is larger — default is full (06b Rule 19)
|
|
328
|
+
- ❌ Treating a subset run as satisfying the Rule 10 full-suite checkbox — the commit/DoD gate is always a real full run (06b Rule 19)
|
|
311
329
|
|
|
312
330
|
## Reference index (read on demand — never load all)
|
|
313
331
|
|
|
@@ -322,13 +340,14 @@ reads at most 06b + 06c; large work reads the ones its phase calls for.
|
|
|
322
340
|
| `04-adversarial.md` | adversarial checklist (spec/architecture/security lenses) | Phase 4 (large) |
|
|
323
341
|
| `05-plan.md` | PLAN.md template + ADRs + quality scenarios + ATAM-lite + views | Phase 5 (large) |
|
|
324
342
|
| `06-implementation.md` | coding discipline, M4/M5, drift self-correction (P20) | Phase 6 |
|
|
325
|
-
| `06b-testing-qa.md` | **mandatory** testing & QA standard (
|
|
343
|
+
| `06b-testing-qa.md` | **mandatory** testing & QA standard (19 rules + DoD) | before writing tests (always) |
|
|
326
344
|
| `06c-code-quality.md` | **mandatory** modularity standard (9 rules, deep modules, smells) | before structuring code |
|
|
327
345
|
| `06d-delegation.md` | intercom & subagents + independent reviewer gate (P19) | before delegating; Phase 7 review (large) |
|
|
328
346
|
| `06e-code-health.md` | Code Health Gate (+ depth, supply-chain, secrets metrics) | Gate 8 (large) |
|
|
329
347
|
| `06f-stability.md` | stability patterns + error handling + observability (P06/P07/P08) | **if the deliverable makes external calls or is a service** |
|
|
330
348
|
| `06g-test-design.md` | risk-based test derivation + determinism | Phase 6 large (test plan) / non-trivial tests |
|
|
331
349
|
| `06h-security.md` | threat model, ASVS DoD, supply chain, agent tools | Phase 4/5 large; small = one line |
|
|
350
|
+
| `06i-completeness.md` | **mandatory** no stubs / no fabricated data / no invented facts + completeness DoD | before implementing and before claiming done (always) |
|
|
332
351
|
| `07-release.md` | release workflow + **configurable release policy** (`.asf-release.json`: when/how) + test-on-publish | before publishing |
|
|
333
352
|
|
|
334
353
|
## ASF self-modification policy (P22)
|
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
1. Write the failing test for the next behavior
|
|
17
17
|
2. Implement the minimum to pass
|
|
18
|
-
3. Run the suite; refactor; re-run
|
|
19
|
-
|
|
18
|
+
3. Run the suite; refactor; re-run — steps 3's intermediate runs (not the
|
|
19
|
+
commit-gate run) may use a selected subset per **06b Rule 19**, and only
|
|
20
|
+
when certain the subset is warranted; default is full
|
|
21
|
+
4. Only commit green — the pre-commit run is always the FULL suite (06b
|
|
22
|
+
Rule 10), never a subset, regardless of what ran in step 3
|
|
20
23
|
|
|
21
24
|
For web interfaces, browser tests via pi-aia-browser are part of the test suite, not an afterthought.
|
|
22
25
|
|
|
@@ -139,7 +139,7 @@ never arrives, the wiring is dead — that is a failed test.
|
|
|
139
139
|
## Rule 10 — Definition of done (all must hold)
|
|
140
140
|
|
|
141
141
|
- [ ] Typecheck/build passes
|
|
142
|
-
- [ ] Full test suite green (not a subset)
|
|
142
|
+
- [ ] Full test suite green (not a subset) — **the gate never moves: this checkbox always means a full run, even when Rule 19 permitted subset runs earlier in the loop that led here**
|
|
143
143
|
- [ ] Regression test added for every bug fixed this cycle
|
|
144
144
|
- [ ] Triggers **and** non-triggers tested for conditional behavior
|
|
145
145
|
- [ ] Shipped artifact inspected (`npm pack` file list) and installed clean-room
|
|
@@ -325,3 +325,57 @@ production incident), the fix is not the end — the **loop** is:
|
|
|
325
325
|
> **Real failure:** a package shipped with a broken `files` allowlist; the
|
|
326
326
|
> fix landed but the *gap* ("no test inspects the packaged artifact") was not
|
|
327
327
|
> closed until Rule 1 was added. The loop is what prevents the next one.
|
|
328
|
+
|
|
329
|
+
## Rule 19 — Test selection for the inner loop (P25; the DoD gate never moves)
|
|
330
|
+
|
|
331
|
+
Rule 10's full-suite checkbox is a **gate**, not a loop constraint. The gate
|
|
332
|
+
never relaxes. What this rule relaxes is the **intermediate** runs inside one
|
|
333
|
+
change's own red-green-refactor cycle (06-implementation "Test-first" steps
|
|
334
|
+
1-3) — the runs that happen *before* the commit-gate run, on code you are
|
|
335
|
+
still editing.
|
|
336
|
+
|
|
337
|
+
**The rule, in the user's own words: run a partial (impact-area) subset only
|
|
338
|
+
when certain that this is warranted; if not certain, or if the blast radius
|
|
339
|
+
might be greater than the impact area, always run full. Default is full.**
|
|
340
|
+
|
|
341
|
+
- **Burden of proof is on the subset, not on the full run.** Silence,
|
|
342
|
+
uncertainty, or "probably fine" all mean full. A subset run requires an
|
|
343
|
+
affirmative, checkable case.
|
|
344
|
+
- **A subset run requires a stated impact statement** in the transcript,
|
|
345
|
+
before the run: the changed files, the tests selected because of them, and
|
|
346
|
+
*why nothing else can be reached*. A file list alone is not an impact
|
|
347
|
+
statement — restating the diff is not an argument for why the blast radius
|
|
348
|
+
stops there. No statement, or a statement that does not argue the
|
|
349
|
+
boundary → **not certain → full.**
|
|
350
|
+
- **Certainty is impossible by definition (no judgment call — always full)**
|
|
351
|
+
when the changed footprint includes any of:
|
|
352
|
+
- shared/global state, a singleton, a cache, env/config, a feature flag
|
|
353
|
+
- `package.json`, the lockfile, or any dependency
|
|
354
|
+
- build, test, lint, or CI config, or the test harness itself
|
|
355
|
+
- a DB schema, a migration, or a shared fixture
|
|
356
|
+
- a public API/contract, CLI args, or a wire/shared type
|
|
357
|
+
- a cross-module refactor, a rename, a file move, or a deletion
|
|
358
|
+
- **any changed file with no entry in the project's test-impact map** — a
|
|
359
|
+
project that has not built a map always runs full; the relaxation only
|
|
360
|
+
ever applies where the mapping is known, never where it is guessed.
|
|
361
|
+
- **The ~90s-and-under guard**: if the full suite's own measured runtime is
|
|
362
|
+
small enough that an assessment costs more than just running it, skip the
|
|
363
|
+
assessment and run full — state the measured number once rather than
|
|
364
|
+
re-litigating it every iteration.
|
|
365
|
+
- **Reporting stays honest (Rule 11/17) no matter which path was taken.** A
|
|
366
|
+
subset run is reported as a subset run — "ran N/M suites (impact-area: X);
|
|
367
|
+
full suite not run this iteration" — never as "suite green". The Rule 10
|
|
368
|
+
checkbox is only ever satisfied by an actual full run, shown in this cycle,
|
|
369
|
+
regardless of how many subset runs preceded it.
|
|
370
|
+
- **Never an escape from a failing test.** Selection decides *which* suites
|
|
371
|
+
run; it never decides whether a failing test counts. A failing test is
|
|
372
|
+
fixed or deleted (Rule 16), never excluded from the run that would have
|
|
373
|
+
caught it.
|
|
374
|
+
- **If a defect escapes that a full run would have caught**, that is Rule 18:
|
|
375
|
+
the fix must say so, and the certainty bar for that class of change tightens
|
|
376
|
+
(added to the "certainty is impossible" list above if it recurs).
|
|
377
|
+
|
|
378
|
+
This does not change Rule 10, Rule 11, or the commit-gate workflow: a project
|
|
379
|
+
that commits after every green run already runs full before every commit, so
|
|
380
|
+
Rule 19 only ever saves the intermediate runs inside a single change — it
|
|
381
|
+
never reduces what runs before anything is committed.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Completeness — no stubs, no fabricated data, no invented facts
|
|
2
|
+
|
|
3
|
+
**Read when:** before writing implementation, and again before claiming done — for
|
|
4
|
+
every deliverable with real behaviour. **Skip when:** never. Small work needs only
|
|
5
|
+
the Core rule and the DoD checklist at the bottom.
|
|
6
|
+
|
|
7
|
+
Newer models can produce work that *looks* finished: a function with the right name
|
|
8
|
+
whose body is a placeholder, a screen populated with invented records, a report that
|
|
9
|
+
cites a limit nobody checked. Green tests do not disprove it — the tests were written
|
|
10
|
+
against the stub. This reference is the standing answer.
|
|
11
|
+
|
|
12
|
+
## Core rule
|
|
13
|
+
|
|
14
|
+
**Ship the real thing, or say out loud what is not real.**
|
|
15
|
+
|
|
16
|
+
Complete means: the user can use what they asked for, through the entry point they
|
|
17
|
+
will actually use. Not: the files exist, the suite is green, the shape looks right.
|
|
18
|
+
There is no third option — an undeclared gap is a defect, however tidy it looks.
|
|
19
|
+
|
|
20
|
+
## Never ship silently
|
|
21
|
+
|
|
22
|
+
| Pattern | Why it is a lie |
|
|
23
|
+
|---|---|
|
|
24
|
+
| `// TODO`, `FIXME`, `not implemented`, `coming soon`, `pass`, empty handler, `throw new Error("not implemented")` on a user-reachable path | The feature is absent; the name says it is present |
|
|
25
|
+
| Fake / seed / demo data on a user path — hardcoded users, invented prices, lorem ipsum, `example.com`, `+1 555-…`, `dummy`/`fake`/`sample` records | The user reads invention as their own data |
|
|
26
|
+
| Invented facts presented as checked — API signatures, config keys, endpoints, version numbers, limits, quotas | Confidence without verification is the expensive kind of wrong |
|
|
27
|
+
| Silently deferred scope — "v1 covers X" when X+Y was asked | A stub with better marketing |
|
|
28
|
+
| Built-but-never-wired — the module exists and is tested, but nothing calls it, no route reaches it, no surface consumes it | The user cannot get to the feature at all |
|
|
29
|
+
| Mocks or fakes in production code paths | Test seams belong at test seams (06b) |
|
|
30
|
+
| A config/env value the code reads but nothing sets, or a key the code never reads | The switch does nothing |
|
|
31
|
+
|
|
32
|
+
## Legitimate exceptions — declared, never silent
|
|
33
|
+
|
|
34
|
+
1. **The user asked for it**: a scaffold, spike, stub, mock or placeholder was the
|
|
35
|
+
requested deliverable. Keep it, and state in the delivery report that it is
|
|
36
|
+
deliberate and what it stands in for.
|
|
37
|
+
2. **An approved deferral**: a scope conflict, missing credential, or external
|
|
38
|
+
dependency stopped part of the work. Record it as an open item: what is missing,
|
|
39
|
+
why, what remains.
|
|
40
|
+
3. **A fake at a test seam**: legitimate, and stays out of shipped paths.
|
|
41
|
+
|
|
42
|
+
Anything else: **finish it.** If it cannot be finished in this run, the discrepancy
|
|
43
|
+
goes in the final message in plain words — never discovered by the user through use.
|
|
44
|
+
|
|
45
|
+
## Prove it is real (Phase 7)
|
|
46
|
+
|
|
47
|
+
- **Exercise each part through the entry point the user will use** — the CLI command,
|
|
48
|
+
the HTTP request, the UI action, the installed package — and name that action in the
|
|
49
|
+
delivery report. "Implemented the export endpoint" is a claim; "`curl -s
|
|
50
|
+
localhost:3000/export.csv` returned 412 rows" is evidence.
|
|
51
|
+
- **Data-shaped output**: show one real record end to end. If data is seeded, label it
|
|
52
|
+
seeded and say where the real source plugs in.
|
|
53
|
+
- **Factual claims**: cite where verified (doc URL, tool output, schema, measured run)
|
|
54
|
+
or mark it unverified. Never launder an assumption into a statement of fact.
|
|
55
|
+
- **The host audits you**: `pi-vigilant` scans the files this session changed for
|
|
56
|
+
stub / fabricated-data / fact-hole markers and puts the findings in front of you at
|
|
57
|
+
completion. Resolve every finding or explain it — and a clean scan is *not* proof of
|
|
58
|
+
completeness: deferral and wiring remain your check, not the scanner's.
|
|
59
|
+
|
|
60
|
+
## Definition of Done — completeness
|
|
61
|
+
|
|
62
|
+
- [ ] No stub, unimplemented path, placeholder or fabricated data remains on a
|
|
63
|
+
user-reachable path — or it is declared to the user with the reason.
|
|
64
|
+
- [ ] Every part of the ask is reachable from where the user enters it; the delivery
|
|
65
|
+
report names the command / request / action that exercised each part.
|
|
66
|
+
- [ ] Nothing asked for was quietly moved to "later" without the user being told.
|
|
67
|
+
- [ ] No claim in the deliverable or the report is presented as verified when it was not.
|