Skip to content

Commit f6fb04e

Browse files
committed
Fill in the change log hash for the audit selector
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 718e5cb commit f6fb04e

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

docs/changelog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ zero across these commits; several were pre-existing bugs the old markup had bee
352352
| `c855ff0ec` | **The `responsive-audit` flicker, fixed at the fifth attempt — and it had been hiding two real defects.** Findings alternated 8/9, always `/items/inventory`. **A target's own ancestor is not a neighbour**: WCAG 2.5.8's spacing exception excuses an undersized target when a 24px circle on it reaches no *other* target's hit area, and "other" was implemented as `o.el !== t.el` — which is true of the target's own parent, whose box necessarily contains the child's centre. So any control inside a focusable container could never pass. `clipped_text_controller` gives a truncated `<td>` `tabindex="0"` so a keyboard user can reach its tooltip, and on that page the marked cell **wraps** each row's disclosure button: fifty buttons reported, at every width, and whether 320 joined them varied per run. One predicate — `!a.contains(b) && !b.contains(a)` — and three full runs are **byte-identical**. Verified the honest way: the underlying population still swings (`allTargets` 133 or 183 between runs) and the output no longer moves with it, which is better than suppressing the swing because the audit no longer depends on it. Four isolated controls, one of which corrected **my expectation** rather than the code — a focusable *wrapper* that is itself under 24px is a real target and is still reported. **Why four attempts missed it**: they compared counts, then positions. The number that moved was neither the sizes (`undersized` sat at 52 throughout) nor the geometry but the size of the *comparison set*, and nothing printed that. **Then 8 findings became 2, which is where a fix turns into a suppression unless you read what vanished** — every removed line was the same page and the same message, and two genuine defects were underneath. **The button really was 20×28**, a hand-written near-copy of `ROW_ICON_CLASSES` missing `size-7`, against design.md's rule that every actions-column control is 28×28; the audit had said so at every width for as long as it had flickered and it read as more flicker. *A permanently noisy check is a check whose true findings get filed as noise.* **And the clipped-cell scan counted `sr-only` text**: `textContent` includes it, so any cell whose only text was a screen-reader label qualified — **55 cells marked at 320px, 50 holding nothing but "Show storage locations for …"**, each a tab stop raising a bubble repeating a deliberately hidden string over a cell showing a chevron, which is the tab-stop-per-row that controller's own comment exists to prevent, reached from the other side. After: 5 marked, 0 unreadable, button 28×28. Both pinned by `item_system_spec.rb` and **both specs watched failing first** (`got: [20, 28]`; 2 spurious tab stops). 13 + 31 examples 0 failures, audit-selftest 11 controls 0 wrong, erb_lint and rubocop clean. Left open deliberately and written down: that 133/183 swing is the clipped scan reacting to `resize` while stacking labels arrive on a `matchMedia` change — no audit result and no user symptom depends on it now. |
353353
| `daba48850` | **`responsive-audit` reports zero across the whole app, and the last two findings were the same class of false positive as the flicker.** Both remaining findings were "fixed/sticky chrome covers 186px of a 360px viewport", on `/admin/base_items` and `/admin/partners`. The check sums the vertical bands of everything `fixed` or `sticky`; **a `sticky` element with `top` and `bottom` both `auto` is pinned to a horizontal edge**, and its band scrolls away with the content rather than occluding a fixed strip. The frozen actions column is precisely that — measured on `/admin/partners` at 740×360, eight `td.cell-actions` at `top: auto, bottom: auto, right: 0px` in consecutive bands (216..269, 269..322, 322..375), unioned to 186 of 360 and over the 50% threshold, for a column that eats **no height at all**. Same family as the ancestor bug fixed an hour earlier: a geometric rule reading an element whose geometry does not mean what the rule assumes. **Five controls, all correct**: a right-pinned column over eight rows scores 0, a sticky topbar 64, a fixed bottom bar 56, both together 120 (unioned, not summed), and a topbar beside a pinned column scores only the topbar's 64. Three full runs byte-identical, **0 findings across 155 routes**. **Then the interesting part, which is a correction of my own.** Having removed the column, a four-page spot check showed nothing pinned and I concluded — and wrote into the code and the to-do — that the check had gone inert on this app. So the run now prints what it considered, per the suite's own "count what you examined" rule, and that line **falsified me in one run**: it considers **30 elements across 146 page visits**, identical on three runs, every one of them `.table-rail`, the fixed 24px scroll rail on a wide table, at 24px of 360 — about 7%. Live input, negative verdict. Both claims corrected in place. What is genuinely unexercised is the *reporting* path above 50%, which no real screen reaches; the five controls live nowhere yet because the check is inline rather than exported, and `docs/todo.md` names the extraction. **Two doc corrections in the same commit.** `design-decisions.md` still said `/broadcast_announcements/1/edit` and `/partners/children/new` "still 404 and are still skipped by every audit" — fixed the next day by `3403c72b7`; marked superseded rather than rewritten, because a dated entry is a record and not a status page, and re-verified at 155 routes with an empty not-reached list. And `todo.md`'s skills figures said 17 files/1,383 lines against an actual **18/1,599**. The other two numbers in that file were re-measured and both still hold: 11 of `UiHelper`'s 27 methods live, and 9 users whose `display_name` is the placeholder. |
354354
| `3c4812e72` | **The skills-symlink premise, verified — it holds, and symlinks are followed.** The standing item to make `.claude/skills/` available outside this repo rested on a claim nobody had tested here: that Claude also reads `~/.claude/skills/`. It had never been tested because that directory has never existed on this machine, so the plan's foundation was an assumption. **Asking a model whether it can see a file is the weakest available evidence**, so it was checked with a canary: a skill at `/tmp/canary-skill/SKILL.md` carrying **two different random tokens**, one in the frontmatter `description` and one in the body, installed exactly as the plan proposes — as a symlink, `~/.claude/skills/canary-probe -> /tmp/canary-skill`. `claude -p` run from `/tmp`, a directory with no `.claude/skills` of its own, returned **both**. Two tokens because they answer different questions: the description token proves *registration*, the body token proves the file was *read*. **The negative control is what makes it evidence** — the symlink was removed while the file was left on disk inside the working directory, and the same prompt returned `NO-CANARY-SKILL`, excluding the confound that a positive result alone leaves open (the file simply being near the session's cwd). Corroborating but insufficient on its own, and ranked as such: the client binary carries **14** references to `~/.claude/skills/`, including a `synced` subdirectory named in help text — string evidence shows the path is *known*, only the canary shows it is *loaded*. Both artefacts were removed and `~/.claude/skills/` left absent, so `todo.md` still describes the machine as it stands. **The symlink itself is still not done** and still needs a decision: it writes outside the repo, and the one real tradeoff is unchanged — a symlink points at a path, so if this repo moves the skills stop working silently, while a copy trades that for two versions that drift. Generalised into `evidence-discipline` as "verify a mechanism with a canary, not with a self-report". |
355-
| `TBD` | **Ran the seven audits I had skipped, and built the thing that stops the skipping.** Yesterday's changes removed **fifty keyboard tab stops** and altered two control sizes, and the audits re-run afterwards were chosen from memory — so `keyboard-audit`, `wcag22-audit`, `row-actions-audit`, `tooltip-audit`, `wcag-audit`, `icon-audit` and `table-audit` were all skipped, every one of them a check measuring exactly what had changed. **Run now, and the tab-stop removal broke nothing**: keyboard-audit 146 screens at 1280 and again at 375, no findings; axe 160 pages 0 violations; wcag22 no failures with its examined counts printed; tooltip 653 icon-only controls 0 defects; table-audit 155 tables, 0 mixed weights, 0 filled buttons in a row. **Two audits exit non-zero and neither is from yesterday**, which is worth stating rather than implying: `icon-audit` reports `bi-arrow-left-right` ("Compare with the previous period") and `bi-key` ("Reset password") as glyphs absent from the lexicon, and `row-actions-audit` reports `/admin/barcode_items` carrying 3 inline actions with no menu, plus advisories on nine tables that need a human. **One genuine inconsistency surfaced**: `bi-envelope` now carries three labels — "Re-send invitation" on `/organization` against "Re-send invite" in `admin/users/_list` and `partners/_partner_row` — for the same action. Pre-existing (the old `title` said "Re-send invitation" too), but it took a proper `aria-label` for the audit to see it. **The fix for the skipping is `bin/design/which-audits.rb`.** Not a checklist, deliberately: a checklist is memory written down, correct the day it is written and silently wrong the day an audit is added. Instead omission is impossible by construction — each audit declares its inputs in its own header (`AUDIT-READS: RENDER`), the script **enumerates `bin/design/` itself** rather than carrying a list, and **a file that neither declares nor is named a non-audit fails the run**, so a new audit cannot drop silently out of every future selection. Six non-audits are excused with a reason each, because an unexplained absence reads identically to an oversight. Bundles are coarse on purpose: a browser audit drives real pages, so for a render-path change the honest answer is *most of them* — asked by hand about one view and one controller I picked six and the truthful number was twenty-eight. **Three controls, in the three directions the failure can hide**: a view change selects the render audits; a **docs-only change selects zero browser audits** (otherwise it is not selecting, it is saying "everything"); and a planted undeclared file fails with exit 2, proven both with the file present and after removing it. It also prints what it considered and did *not* select, and a pasteable command for the selected set. Fixed on the way: the `state.rb` paragraph in `onboarding.md` was **inside** a ```bash fence and rendering as shell. Generalised into `audit-suite` as "after a change, do not choose the audits from memory". |
355+
| `718e5cbaf` | **Ran the seven audits I had skipped, and built the thing that stops the skipping.** Yesterday's changes removed **fifty keyboard tab stops** and altered two control sizes, and the audits re-run afterwards were chosen from memory — so `keyboard-audit`, `wcag22-audit`, `row-actions-audit`, `tooltip-audit`, `wcag-audit`, `icon-audit` and `table-audit` were all skipped, every one of them a check measuring exactly what had changed. **Run now, and the tab-stop removal broke nothing**: keyboard-audit 146 screens at 1280 and again at 375, no findings; axe 160 pages 0 violations; wcag22 no failures with its examined counts printed; tooltip 653 icon-only controls 0 defects; table-audit 155 tables, 0 mixed weights, 0 filled buttons in a row. **Two audits exit non-zero and neither is from yesterday**, which is worth stating rather than implying: `icon-audit` reports `bi-arrow-left-right` ("Compare with the previous period") and `bi-key` ("Reset password") as glyphs absent from the lexicon, and `row-actions-audit` reports `/admin/barcode_items` carrying 3 inline actions with no menu, plus advisories on nine tables that need a human. **One genuine inconsistency surfaced**: `bi-envelope` now carries three labels — "Re-send invitation" on `/organization` against "Re-send invite" in `admin/users/_list` and `partners/_partner_row` — for the same action. Pre-existing (the old `title` said "Re-send invitation" too), but it took a proper `aria-label` for the audit to see it. **The fix for the skipping is `bin/design/which-audits.rb`.** Not a checklist, deliberately: a checklist is memory written down, correct the day it is written and silently wrong the day an audit is added. Instead omission is impossible by construction — each audit declares its inputs in its own header (`AUDIT-READS: RENDER`), the script **enumerates `bin/design/` itself** rather than carrying a list, and **a file that neither declares nor is named a non-audit fails the run**, so a new audit cannot drop silently out of every future selection. Six non-audits are excused with a reason each, because an unexplained absence reads identically to an oversight. Bundles are coarse on purpose: a browser audit drives real pages, so for a render-path change the honest answer is *most of them* — asked by hand about one view and one controller I picked six and the truthful number was twenty-eight. **Three controls, in the three directions the failure can hide**: a view change selects the render audits; a **docs-only change selects zero browser audits** (otherwise it is not selecting, it is saying "everything"); and a planted undeclared file fails with exit 2, proven both with the file present and after removing it. It also prints what it considered and did *not* select, and a pasteable command for the selected set. Fixed on the way: the `state.rb` paragraph in `onboarding.md` was **inside** a ```bash fence and rendering as shell. Generalised into `audit-suite` as "after a change, do not choose the audits from memory". |
356356

357357

358358

0 commit comments

Comments
 (0)