Wave 5 exit - record what shipped and where the counts landed

First field-visible wave. Waves 1-4 moved almost nothing on screen; every page
in this one looks different.

Baseline counts, against wave 0
  <div onclick>              12 -> 2    (T5.1 took exactly ten)
  native dialogs app-wide    79 -> 64   (T5.1 2, T5.2 1, T5.8 13)
  ...in the SOP wizard       14 -> 0
  ...in the creator          43 -> 43   wave 7's
  colour literals outside theme-light.css   0 -> 0, held
  SOP wizard steps           10 -> 12   (T5.4 Locations, T5.5 Sections)

Six probes now cover this wave, 399 checks between them, each written because
its task's done-when could not be checked by anything that already existed.

Screenshots re-captured at 390 and 1440 across all seven pages. One overflow,
the known creator@390 (BL-001), unchanged. The two beforeunload log lines on
sop@1440 and creator@1440 are present at wave 4 too - captured both sides during
T5.1 rather than assuming.

BL-010 is honestly unchanged: every rule wave 5 added consumes --wp-s*, and none
of the 829 pre-existing spacing/type/radius literals were converted, because
none of the pages carrying them were re-laid-out here. T7.1 still owns it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-16 14:05:16 -05:00
parent 55caefb099
commit 7893a56ea2

View File

@@ -232,8 +232,79 @@ from wave 0 must go down.
## Wave 5 exit criteria
- [ ] the stepper is keyboard operable and `<div onclick>` count dropped by at least 10
- [ ] section toggles work end to end, including the export
- [ ] Acumatica fields and Assets are hidden by configuration, with no data deleted
- [ ] the wizard has no `alert()` calls left
- [ ] first-run users can create a project
- [x] the stepper is keyboard operable and `<div onclick>` count dropped by at least 10
**12 → 2**, exactly ten, and the two survivors are wave 7's and wave 9's
- [x] section toggles work end to end, including the export
- [x] Acumatica fields and Assets are hidden by configuration, with no data deleted
- [x] the wizard has no `alert()` calls left — **0**, raw and comment-stripped
- [x] first-run users can create a project
---
## Wave 5 exit — what shipped, and what it cost
First field-visible wave. Everything before this was prerequisites, and the difference
shows: waves 14 moved almost nothing on screen, and every page in this one looks
different.
### The tasks
| Task | Items | What landed |
|---|---|---|
| `T5.1` | `A4` `S9` | Vertical stepper, ten real `<button>`s, keyboard operable, states in words |
| `T5.2` | `B3` | First-run empty state, then the picker card removed; switching moved to the app bar |
| `T5.3` | `B4` UI | Four-cell pipeline strip, every number from the server, every cell a shareable link |
| `T5.4` | `CR-005` | Per-project Building / Floor / Sector taxonomy — new table, four routes, step 11 |
| `T5.5` | `CR-006` | Section toggles, shared registry, form + detail view + export |
| `T5.6` | `CR-002` | Acumatica cost code and task, hidden by field toggle |
| `T5.7` | `CR-016` | Assets off for Micron EUV, by configuration |
| `T5.8` | `S1` wizard | Inline validation on five steps; thirteen native dialogs retired |
### Baseline counts
| Metric | Wave 0 | End of wave 5 | Moved by |
|---|---|---|---|
| `<div onclick>` | 12 | **2** | `T5.1` |
| native dialogs app-wide | 79 | **64** | `T5.1` (2), `T5.2` (1), `T5.8` (13) |
| …of those, in the SOP wizard | 14 | **0** | `T5.8` |
| …of those, in the creator | 43 | 43 | wave 7 |
| colour literals outside `theme-light.css` | 0 | **0** | held |
| SOP wizard steps | 10 | **12** | `T5.4`, `T5.5` |
### Probes added
Five, each written because its task's done-when could not be checked by anything that
already existed. Run them **one at a time**.
```bash
python tests/stepper_check.py # A4/S9 71 checks
python tests/launcher_check.py # B3 58 checks (two seeded databases)
python tests/pipeline_check.py # B4 UI 43 checks
python tests/locations_check.py # CR-005 58 checks
python tests/sections_check.py # CR-006/CR-002/CR-016 88 checks
python tests/validation_check.py # S1 81 checks
```
### The four things the probes caught that a review would not have
1. **`T5.1`** — the rail did not track the form. Fill step 1 and every step ahead stayed
padlocked until you navigated. A rail that lies about the form is worse than the strip
it replaced, because that one at least lied consistently.
2. **`T5.2`** — `f_items.py`'s `F1` went `INCONCLUSIVE`, not `FAIL`. Its probe drove the
picker card's `<select>`, which `B3` deleted. It refused to guess, which is the
behaviour `f_items` exists for.
3. **`T5.3`** — a pipeline link landed on "complete the SOP first". Not the strip's fault:
`browser_check`'s fixture stores a SOP shape production never writes. Logged as BL-018.
4. **`T5.6`** — a probe reported the cost code being eaten by a section toggle. It was not;
the probe used an invented code and `wp_cost` is a `<select>` that silently drops an
unknown value. That silent drop is real, is not this wave's, and is BL-019.
### Open, carried into wave 6 and beyond
- **BL-010** (raw spacing and type values) is **unchanged**. Every rule wave 5 added
consumes `--wp-s*`; none of the 483/281/65 pre-existing literals were converted, because
none of the pages carrying them were re-laid-out here. `T7.1` still owns it.
- **X4** is resolved rather than deferred — see `T5.5`'s commit. The SOP-borne propagation
path is unaffected by `B7`; the live hand-off across the frame is what `T7.1` removes.
- **BL-018** (the WP tab's gate is the last `localStorage`-derived status) is the one
finding in this wave that is a real user-facing weakness rather than a test artefact.