pi-aia-asf 0.9.2 → 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,80 @@ 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] - 2026-10-07
11
+
12
+ ### Added
13
+
14
+ - (describe changes for 0.10.0)
15
+
16
+
17
+ ### Added
18
+
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
+
10
53
  ## [0.9.2] - 2026-10-04
11
54
 
12
55
  ### Added
13
56
 
14
- - (describe changes for 0.9.2)
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.
15
84
 
16
85
 
17
86
  ## [0.9.1] - 2026-10-03
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-aia-asf",
3
- "version": "0.9.2",
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",
@@ -324,6 +324,8 @@ conflicts). Record the review + triage in the delivery report.
324
324
  - ❌ Shipping a delivery summary without the report fields: spec status + evidence, test results, skipped checks, not-tested register (06b Rule 17)
325
325
  - ❌ Letting an escaped defect teach nothing — ask which gate should have caught it and close the gap (06b Rule 18)
326
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)
327
329
 
328
330
  ## Reference index (read on demand — never load all)
329
331
 
@@ -338,7 +340,7 @@ reads at most 06b + 06c; large work reads the ones its phase calls for.
338
340
  | `04-adversarial.md` | adversarial checklist (spec/architecture/security lenses) | Phase 4 (large) |
339
341
  | `05-plan.md` | PLAN.md template + ADRs + quality scenarios + ATAM-lite + views | Phase 5 (large) |
340
342
  | `06-implementation.md` | coding discipline, M4/M5, drift self-correction (P20) | Phase 6 |
341
- | `06b-testing-qa.md` | **mandatory** testing & QA standard (18 rules + DoD) | before writing tests (always) |
343
+ | `06b-testing-qa.md` | **mandatory** testing & QA standard (19 rules + DoD) | before writing tests (always) |
342
344
  | `06c-code-quality.md` | **mandatory** modularity standard (9 rules, deep modules, smells) | before structuring code |
343
345
  | `06d-delegation.md` | intercom & subagents + independent reviewer gate (P19) | before delegating; Phase 7 review (large) |
344
346
  | `06e-code-health.md` | Code Health Gate (+ depth, supply-chain, secrets metrics) | Gate 8 (large) |
@@ -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
- 4. Only commit green
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.