Wave 6 exit - the work package's general information

Five tasks, three probes, 156 new checks. Every wave-6 item persists, exports
and filters, and the rollup adds up at every level rather than only at the leaf.

Each task had one decision it had to make rather than inherit, and each is
recorded in wave-6.md because a later reader will otherwise read the behaviour
as an accident:

  T6.1  blanks sort LAST in both directions
  T6.2  priority sorts by escalation, not alphabetically
  T6.3  the stored value is the full path, not the node's own code
  T6.4  the unassigned group is shown, or the totals do not reconcile
  T6.5  a card has three states, so it needs three status lines

admin.js is byte-identical. A7's note about localization is the loudest "do not"
in the wave file and cards_check proves it two ways.

Screenshots re-captured at 390 and 1440 across all seven pages. One overflow,
the known creator@390 (BL-001), unchanged.

Carried forward unchanged: BL-010 (829 spacing/type literals - wave 6 re-laid-out
none of the pages carrying them), BL-018, BL-019. BL-018 has now cost three
separate probes a hand-seeded SOP; browser_check's fixture should adopt the
production {sop, state} shape when it is fixed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-17 00:26:29 -05:00
parent 815f266039
commit 7e33a3cbfd
2 changed files with 79 additions and 4 deletions

View File

@@ -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

View File

@@ -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 `<select>` still drops a value that has left the list.