diff --git a/docs/reference/file-map.md b/docs/reference/file-map.md index edb6f5c..d4389eb 100644 --- a/docs/reference/file-map.md +++ b/docs/reference/file-map.md @@ -243,6 +243,26 @@ python tests/sections_check.py # CR-006/CR-002/CR-016 — hidden, not delet python tests/validation_check.py # S1 wizard — errors at the field, no dialogs 81 checks ``` +Wave 6 added three more: + +```bash +python tests/generalinfo_check.py # CR-001/CR-003 — P6 activity, priority 49 checks +python tests/rollup_check.py # CR-004/CR-018 — codes, and totals that add 63 checks +python tests/cards_check.py # A7 — card status, footer, localization 44 checks +``` + +**Two probes were re-pointed at `T6.5`, and the reason is worth carrying forward.** +`aggregates_check.py` matched the launcher card's exact wording (`"SOP complete"`), and it +also waited for the status line to be non-empty — which stopped meaning "the answer has +arrived" once the card gained a line for the in-flight state too. Both assertions now match +the ANSWER rather than the sentence, which is what that check was ever about. A probe that +breaks on wording is a probe somebody edits carelessly the next time wording changes. + +**Windows consoles are cp1252.** Several probes print page text back in a failure message, +and a glyph outside cp1252 (`✓`, `✕`, `→`) crashes the *reporter* instead of +reporting the failure — losing the diagnosis, which is the only thing that run was for. +The wave 5 and 6 probes route any page-derived text through an `ascii_()` helper. + `pipeline_check.py` reads the dashboard's state out of the **iframe's DOM**, not its globals: `dashFilter` and `currentView` are declared with `let` in a classic script, so they are not properties of `window` and a cross-frame read of either comes back diff --git a/docs/waves/wave-6.md b/docs/waves/wave-6.md index c64c749..112323c 100644 --- a/docs/waves/wave-6.md +++ b/docs/waves/wave-6.md @@ -147,7 +147,62 @@ removing it, that reading is wrong. ## Wave 6 exit criteria -- [ ] P6 activity, priority and structured location all persist and export -- [ ] the dashboard filters by priority and by all three location levels -- [ ] rollups are server-computed and reconcile -- [ ] localization intact +- [x] P6 activity, priority and structured location all persist and export +- [x] the dashboard filters by priority and by all three location levels +- [x] rollups are server-computed and reconcile — at **every** level, not only the leaf +- [x] localization intact — `admin.js` is byte-identical, and the feature was driven + end to end rather than read + +--- + +## Wave 6 exit — what shipped + +| Task | Items | What landed | +|---|---|---| +| `T6.1` | `CR-001` | P6 activity ID and description, beside the due date; a sortable board column | +| `T6.2` | `CR-003` | Priority — three levels, Normal default, sortable by escalation, filterable | +| `T6.3` | `CR-004` | Dependent Building / Floor / Sector dropdowns; codes, not typed strings | +| `T6.4` | `CR-018` | Server-side rollup at every level, hours included, unassigned explicit | +| `T6.5` | `A7` | Card status in all three states; a footer that says what it is showing | + +### The one decision each task had to make, rather than inherit + +- **`T6.1`** — "sorts correctly, including with empty values" is not a behaviour, it is a + choice. **Blanks sort last in both directions**, because nobody sorts by a column in + order to look at the rows with nothing in it. +- **`T6.2`** — priority sorts by **escalation**, not alphabetically. `High, Normal, Urgent` + would put the most urgent last, which is the one thing the column exists to prevent. +- **`T6.3`** — the stored value is the full **path** (`B-ONE/L1`), not the node's own code. + A floor's own code is not unique across buildings; its path is. That is what lets a + building filter match everything beneath it with a prefix test. +- **`T6.4`** — the unassigned group is **shown**. A group set that omits it does not sum to + the project total, and a rollup that does not reconcile is decoration. +- **`T6.5`** — a card has **three** states, so it needs three status lines, not one plus + silence. The silent one was the commonest state on a live project. + +### What did not change, deliberately + +`admin.js` — not one byte. `A7`'s note about localization is the loudest "do not" in the +wave file, and `tests/cards_check.py` proves it two ways: by driving the feature through a +save and a reload, and by diffing the file. + +### Probes + +```bash +python tests/generalinfo_check.py # CR-001 / CR-003 49 checks +python tests/rollup_check.py # CR-004 / CR-018 63 checks +python tests/cards_check.py # A7 44 checks +``` + +Both `CR-004` and `CR-018` are checked the way `aggregates_check.py` checks its own: by +**poisoning `localStorage`** and demanding the server's answer. `X5` makes both blocking on +`B4` for exactly that reason, so agreeing with the browser would have proved nothing. + +### Carried forward + +- **BL-010** unchanged again. Wave 6 added rules that consume tokens; it re-laid-out no page + that carries the 829 literals. `T7.1` still owns it. +- **BL-018** unchanged and now touched twice: three separate probes have had to seed a SOP + in the `{sop, state}` shape because `browser_check.py`'s fixture does not use it. That + fixture should adopt the production shape when BL-018 is fixed. +- **BL-019** unchanged — the cost-code `