You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/changelog.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -342,7 +342,7 @@ zero across these commits; several were pre-existing bugs the old markup had bee
342
342
| `b1c97ada2` | **`.link-brand`: 71 hand-written link styles become one class, and every link gains a non-colour cue.** Previewed as rendered HTML before building, and the preview changed the answer. My first recommendation covered colour and weight and was **silent on affordance**; asked "shouldn't it have an underline for accessibility", measuring settled it. **Brand colour against the prose these links sit in: 1.04:1 on `slate-600`, 1.31:1 on `slate-700`, 2.26:1 on `slate-900`** — WCAG technique **G183 wants 3:1** when colour is the only marker, so colour was doing essentially nothing. Against white it is 7.90:1: the links were readable, just not *identifiable*. And of **78** brand link strings, **3** had `hover:underline` and **6** any focus style — a table-cell link had no non-colour cue at rest, on hover or on focus, verified in a browser. The class carries the colour plus `underline` on **hover and `:focus-visible`**. **It carries no weight**, deliberately: a table cell is already `font-medium` and the link inherits it, a list of nineteen item names should not be medium per line, a sentence adds it — measured after, the name-cell link is **500** and the list link **400**, exactly as before. Baking weight in would have bolded six list links to make the rule tidier than the design is. **Nothing changes at rest**: colour identical, weight per context, no decoration. 71 strings in 13 shapes across 48 files; the 5 `file:text-brand-700` and 2 avatar discs correctly untouched. `page-audit` now reports a hand-written `hover:text-brand-800` as a defect, proven by planting one. axe 156 pages 0 violations; 46 examples 0 failures. |
343
343
| `58e10a924` | **The "Current state" table is generated, and CI fails when it drifts.** It was hand-maintained, and hand-maintained meant wrong: refreshed on 2026-09-03 and **42 commits stale two days later**, and before that it had drifted far enough that `migration-map.md` carried a second copy disagreeing with it. Every figure in it was already computed by something — `status.rb`, `dead-routes.rb`, `dead-code.rb`, `undefined-classes.py`, a couple of `git` counts — so the only reason they went stale is that a person had to copy them across. `bin/design/state.rb` rewrites the block between two markers; the prose around it stays hand-written, because a generator has nothing useful to say about which numbers are misleading. **`--check` is wired into the `audit-selftest` workflow** and fails when a figure has drifted, the same discipline as a schema dump. **It deliberately excludes the commit and file counts** — those change on every commit, and a gate that fails every pull request for a reason nobody can act on is a gate that gets switched off. Proven both ways: corrupting `Routes whose request would raise` fails the check, corrupting the commit count does not. Two faults found while building it — `sh` resolves to Rake's `FileUtils#sh` under `rails runner`, which echoes the command and returns `true`, so every figure came back as `true`; and CI checks out shallow, so `main..HEAD` resolves to nothing and the git counts would have printed a confident **0**. They say `n/a (no main ref)` now, verified by renaming the branch. |
344
344
| `380833de9` | **The avatar disc deferral was wrong, and the duplication was hiding a defect.** Asked why it had not been done, and looking settled it: the reason on file — that merging with `essentials_step_number` needs a size *and* a semantics argument — is true and **beside the point**. The two copies were **byte-identical to each other**, so extracting them needed no argument at all. Deferring a two-line job because a *different* question about it was hard is how it survived the whole migration. **Both copies were also wrong**: they passed `display_name`, which returns the literal `"Name Not Provided"`, so a nameless user's avatar read **"NN"** — **9 such users** in the development database. The partner bar appeared to guard against it with `display_name.presence || email`, but `display_name` is never blank, so that fallback was **dead code** and it rendered "NN" as well. `essentials_avatar_disc(user)` owns the markup and the name choice, using `preferred_name`. **The same fault was in the trigger's `aria-label`**, so two different users announced as *"Account menu for Name Not Provided"* — identical to the defect this project found and fixed in `users/_organization_user`, and missed here because the topbar was edited three times this week without anyone reading that line. Measured after: bank `org_admin1@example.com`, partner `Justine Baumbach`, admin `superadmin@example.com` — three distinct names. 4 helper examples watched failing with `got: "NN"`; 144 examples, axe 156 pages 0 violations, `page-audit` 0 defects. `essentials_step_number` stays separate and that half stands. |
345
-
| `PENDING` | **The adapter, written — and the deferral was half right, which is why measuring it first mattered.** The reason on file was that inventing a cross-stack abstraction from a sample of one repeats an earlier mistake. **That still holds**, and nothing here claims the interface generalises. But it was doing double duty: it also deferred writing down the Rails adapter that **already exists and works**, for which the evidence is 34 audit scripts over 155 screens. Two jobs, one reason — the same shape as the avatar disc deferral an hour earlier. `templates/adapter-rails.md` (128 lines) records what runs: the nine-export seam, route enumeration behind one `TARGETS_CMD` variable, the Devise sign-in with the four details that were each a bug first, role predicates including the awkward `/partners/12` case, and `visit` returning null so a caller can tell *not checked* from *fine*. **The most useful part is the honest measurement**: only **7** browser audits import the seam, **13** shell out to the generator directly, and **16** files still carry their own `signIn`, at least two byte-identical. **A change log row was overstated and is corrected**: it said the seam was "replacing 21 hand-copied `signIn` functions" when the commit changed three files and converted one audit — it made 21 *replaceable*. A seam nobody adopts is a ninth way of doing something with none removed, and the skill now says so, with the cheap first step: a check that fails on a new private `signIn` so the number can only go down. |
345
+
| `11456a0d8` | **The adapter, written — and the deferral was half right, which is why measuring it first mattered.** The reason on file was that inventing a cross-stack abstraction from a sample of one repeats an earlier mistake. **That still holds**, and nothing here claims the interface generalises. But it was doing double duty: it also deferred writing down the Rails adapter that **already exists and works**, for which the evidence is 34 audit scripts over 155 screens. Two jobs, one reason — the same shape as the avatar disc deferral an hour earlier. `templates/adapter-rails.md` (128 lines) records what runs: the nine-export seam, route enumeration behind one `TARGETS_CMD` variable, the Devise sign-in with the four details that were each a bug first, role predicates including the awkward `/partners/12` case, and `visit` returning null so a caller can tell *not checked* from *fine*. **The most useful part is the honest measurement**: only **7** browser audits import the seam, **13** shell out to the generator directly, and **16** files still carry their own `signIn`, at least two byte-identical. **A change log row was overstated and is corrected**: it said the seam was "replacing 21 hand-copied `signIn` functions" when the commit changed three files and converted one audit — it made 21 *replaceable*. A seam nobody adopts is a ninth way of doing something with none removed, and the skill now says so, with the cheap first step: a check that fails on a new private `signIn` so the number can only go down. |
0 commit comments