Visual-bar Phase 5 sign-off: FAIL
Verdict: FAIL against VISUAL-BAR.md section 6. Two of the four done criteria are not met. Beauty claim language may not be restored.
Reviewer: independent agent review (Phase 5); not the Phase 3 craft author. Did not write #510, #511, #512, the #515 fixture pass or the northline brand pack, and did not author any scorecard cited below.
Package under test: django-brickwork 3.18.0.
| Item | Value |
|---|---|
main tip at sign-off |
8963711 (feat: Phase 4 visual-bar proof gallery and northline brand stills (#518)) |
| Tip when review began | 145b909 (#517) |
| Stills captured from | 03bb5b5 (feat/phase4-visual-proof, since merged as #518) |
src/ identical across all three |
yes, verified by git diff --stat <a> <b> -- src/ (empty) |
Every defect below therefore applies to main at 8963711 unchanged. The
Phase 4 PR merged mid-review; it moved documentation and harness code only.
Render mode: package-default CSS only, no brand pack, no showcase or kiln CSS. Regenerated by this reviewer rather than taken on trust, because no package-only PNGs existed on disk when the review opened (see Evidence provenance).
Stills: docs/audits/_stills/2026-09-12-phase5-review/ (package-only, 32
PNGs, gitignored) and docs/audits/_stills/2026-09-12-northline/ (brand leg,
32 PNGs, gitignored, produced by the Phase 4 author).
Bar: VISUAL-BAR.md. Clean-room throughout: no kit markup, class strings or structure was read into the package, and no competitor name belongs in public copy.
1. Section 6 done criteria
| # | Criterion | Verdict |
|---|---|---|
| 1 | Independent rendered review has filled the scorecard for S1 to S8 at both themes and both viewports against at least the priority-1 and priority-2 kits | FAIL |
| 2 | Every fail has a package issue or an explicit won't-fix / consumer-owned reason | PASS |
| 3 | Package-default CSS clears the axes that failed for substrate reasons | FAIL |
| 4 | Public copy still does not claim a house aesthetic or name competitors as brickwork's identity | PASS |
Criterion 1 fails on two counts. The S8 surface rendered is not the S8 the bar designates (#525), so one of the eight jobs has never been scored as defined. And on S1, S5 and S6 the fixture data is thinner than the components it feeds (#524), so Density, Spacing rhythm and Section cadence on those surfaces cannot be judged either way; recording them as passes, which the Phase 3 re-score did, reads a fixture limit as a substrate result.
Criterion 3 fails on five substrate-owned defects proved from the rendered package-default evidence: #519, #520, #521, #522, #523. Three of them are Navigation / mobile chrome, the axis the Phase 3 re-score recorded as "Pass examples".
Criterion 4 holds. POSITIONING.md and README.md currently carry the
rolled-back language and name no competitor; nothing in this review asks for a
copy change beyond leaving it as it is.
2. Per-surface scorecard (package-default, light and dark, 1440 and 375)
| Surface | Kit that led | Axes failed | Borrow idea (clean-room) | Package follow-up |
|---|---|---|---|---|
| S1 App list | Preline, shadcn/ui | Navigation / mobile chrome (375, both themes); Typography (numeric column) | Give a phone topbar a visible menu affordance; right-align figures so a money column can be read down | #520, #522; fixture depth #524 |
| S2 App detail | Preline | Typography (numeric column) | Danger zone as its own surface with a compact destructive control, not a full-bleed bar | #522, #526; Navigation #520 at 375 |
| S3 App form | shadcn/ui, Preline | Forms | A textarea must read as multi-line; a form wants a panel, help text and an error grammar | #521; Navigation #520 at 375 |
| S4 App dashboard | Preline, Tailwind Plus | Spacing rhythm and Density (375); Navigation / mobile chrome (375); Typography (numeric column) | Stack every tile at phone width rather than squeezing supporting tiles into a third of the row | #525, #520, #522 |
| S5 Marketing landing | Tailwind Plus, Preline | Navigation / mobile chrome (375); Surface differentiation (dark hero panel, footer groups) | One affordance per control state; a footer link map, not boxed cards; theme-aware media | #519, #500, #524 |
| S6 Marketing pricing | Tailwind Plus, Preline | Navigation / mobile chrome (375) | Keep the highlighted tier and the badge notch; give footer groups a real vocabulary | #519, #500, #524 |
| S7 Docs article | Tailwind Plus docs | Navigation / mobile chrome (375) | A docs page at phone width needs its section selector above the article, not below it | #523 |
| S8 Dense ops | Preline | Off-spec surface; Density; Hierarchy (unlabelled second ranked list); Spacing rhythm (375) | Score the shipped ops report or dense list; label each ranked list; stack tiles at phone | #525, #522, #520 |
Strongest surfaces. S6 pricing at 1440 and S7 docs at 1440 hold their own against the priority-1 bar: three tiers with a highlighted middle, a badge notch, per-tier CTA and a footnote on S6; sidebar with active state, breadcrumbs, labelled code blocks, a bordered callout, a data table and a prev/next pager on S7. Phase 3's craft on S4's weighted scorecard is also genuinely convincing at desktop width: the span-2 revenue tile does read as the page's argument. None of that is in dispute.
Where it comes apart is the phone viewport and forms, neither of which the Phase 3 re-score interrogated.
3. Axis matrix, package-default
Ratings are for package-default CSS across S1 to S8, both themes, both viewports. "Not evidenced" means the stills cannot support a verdict, which is not the same as a pass.
| Axis | Rating | Evidence |
|---|---|---|
| Hierarchy | Pass at 1440, fail on S8 | S4's weighted tile row reads as an argument. On S8 two ranked lists share one "Breakdowns" heading and the country list has no label of its own, so at 375 they run together as one six-item list mixing channels and countries. |
| Typography | Fail | The display serif pairing from #511 works on page titles and marketing heroes. But _data_table has no alignment vocabulary, so GBP 1,240.00 and GBP 880.00 sit left-aligned on S1, S2, S4 and S8 and cannot be compared down the column (#522). |
| Spacing rhythm | Pass at 1440, fail at 375 | Marketing cadence at desktop is much improved. At 375 the _scorecard span-2 row does not stack: supporting tiles hold roughly 130px each, wrapping "INVOICES RAISED" to two lines and "24 more than last month" to three, at unequal heights (#525). |
| Surface differentiation | Fail | S5's hero media paints var(--bw-color-surface-subtle, #f3f4f6); that token does not exist in the sheet, so the hardcoded light fallback applies and a large light-grey panel sits in the dark hero (#524). Footer link groups render as elevated bordered cards on the landing example and as unstyled inline link runs on pricing (#500). S3's form has no panel at all. |
| Density | Not evidenced on S1, S5, S6; fail on S8 | Two table rows, two features against columns=3, one stat and one FAQ item cannot demonstrate density either way (#524). S8 ships no dense list or data table and its largest block is a chart empty state (#525). |
| States | Pass, with a caveat | The chart empty state is designed, legible and offers a route out. The caveat is that it cannot then be counted as a Density win on the surface it dominates. Loading and error states are not exercised by any scorecard fixture. |
| Navigation / mobile chrome | Fail | Three separate defects. The app shell's phone topbar paints nothing at all: mobile_nav_trigger has no default, so the menu button is a 44x44 invisible hit target (#520, affects S1 to S4 and S8). The marketing toggle shows the hamburger and the cross together in its closed state, because .bw-icon at byte 173590 overrides __icon--close{display:none} at 143017 (#519, affects S5 and S6). The docs section nav sits at y=3604 of a 3680px phone document with nothing above the article pointing to it, and bw-docs-site-header measures 0px tall at both widths (#523, affects S7). |
| Forms | Fail | bw_form gives every widget class="bw-input", and .bw-input fixes block-size to the control height, so <textarea rows="3"> computes to 40px and is indistinguishable from a single-line input (#521). Separately, no scorecard form carries help text or an error, so the axis wording "labels, controls, help and errors align" is only half tested. |
| Section cadence (marketing) | Not evidenced | Hero to logos to features to tinted stats to testimonial to tinted CTA is a deliberate sequence, and the 6rem gap token from #510 is visible. But a one-logo cloud with a broken image, a two-of-three feature row and a single-stat band mean the sequence is being judged on placeholders (#524). |
| Brandability | Pass | See below. |
Brandability row, citing the northline stills
| Check | Rating | Evidence in _stills/2026-09-12-northline/ |
|---|---|---|
| Composition survives the seven-token override | Pass | s5-light-1440.png is structurally identical to the package-default frame: same section order, same widths, no reflow or overflow. |
| Accent reads as brand | Pass | Teal replaces the default blue on primary buttons, the hero eyebrow, feature icons and the active nav item in s1-dark-1440.png and s5-light-1440.png. |
| Surfaces and borders shift without losing roles | Pass | s1-dark-1440.png keeps sidebar, filter card and table distinguishable on a cooler dark ground; the tinted marketing bands stay readable as bands. |
| Type pairing survives | Pass | Display serif holds on page titles and heroes; UI chrome stays sans. |
Brandability passes on its own terms: a seven-token override does not break any composition. It carries one caveat the northline note did not record. The brand leg inherits both S5 fixture defects unchanged, the broken logo and the light hero panel, so it cannot be read as evidence that those are cosmetic.
A brand pack cannot rescue any other axis here, because every fail above is present under package-default CSS, which is precisely what criterion 3 tests.
4. Residual fails and their trackers
Filed by this review:
| Issue | Fail | Owner |
|---|---|---|
| #519 | Marketing mobile nav toggle paints both icons in its closed state | Substrate (CSS cascade) |
| #520 | App shell phone topbar renders an invisible menu button | Substrate (shell block with no default) |
| #521 | .bw-input fixes textarea height, so rows= is ignored |
Substrate (CSS) |
| #522 | _data_table has no column alignment vocabulary |
Substrate (component contract) |
| #523 | Docs section nav lands below the article at phone width; docs site header renders empty | Substrate (layout) plus example |
| #524 | Broken logo asset, non-existent hero token, fixture data thinner than its grids | Fixtures and example context |
| #525 | S8 renders an undesignated surface; weighted tile row does not stack at 375 | Harness or bar amendment, plus substrate |
| #526 | Danger action renders as a full-width red bar | Substrate or example composition |
Already open, confirmed still live by this review:
| Issue | Fail |
|---|---|
| #500 | Landing footer links lack grouping and the shell overstates its default layout. Confirmed: the landing example boxes footer groups in bw-feature-card, pricing emits bare <div><h2> with inline link runs, and the two marketing examples on one shell look nothing alike. |
| #498 | Beauty positioning treats composition evidence as proof of visual quality. This sign-off is the evidence that it should stay open. |
Won't fix or consumer-owned, with reasons:
| Item | Reason |
|---|---|
| S8 chart is an empty state, not a chart | Consumer-owned. Bundling a chart engine is a stated programme non-goal, and the empty state is designed and legible. The consequence, which #525 records, is that S8 cannot be scored as a Density win while a placeholder is its largest block. |
| Marketing logo cloud carries one logo | Consumer-owned as content, but the broken asset behind it is not, so it sits under #524 rather than here. |
| No table of contents on the docs article | Already tracked as archetype coverage in #413, which the bar explicitly puts out of scope for this scorecard. Not counted as a Phase 5 fail. |
| Sparse hero and feature illustration craft | Consumer-owned. The bar asks for composition, rhythm and type roles, not for the package to ship artwork. |
5. Claim language
Beauty claim language may not be restored. Section 6 is not met, so the Phase 5 gate has not opened.
- Do not change
POSITIONING.mdorREADME.mdon the strength of this file. - Do not fill VISUAL-BAR "Latest completed pass"; it stays "none yet".
- Do not cite the Phase 3 re-score or the northline note as a certification. Neither claims to be one, and both say so in their own words.
What may honestly be said today: package-default composition, token derivation and desktop craft on pricing, docs and the dashboard are strong, and a seven-token brand override does not break them. What may not be said is that defaults look finished next to the leading kits, because at phone width the app shell has no visible navigation, the marketing toggle contradicts itself, and a textarea looks like a text input.
6. Blockers for a pass
Ordered by how much they cost the claim.
- Phone navigation across every family. #520, #519 and #523. Three of the eight surfaces cannot be navigated at 375px with the package's own examples; on five more the menu button is invisible. Nothing else on this list matters as much.
- Forms. #521. A textarea that renders at single-line height is a defect any consumer meets on their first form. While fixing it, give one scorecard form help text and a bound error so the Forms axis is actually tested.
- Table craft. #522. Numeric alignment is not expressible through the component's vocabulary, and it shows on half the surfaces.
- S8 and the phone tile row. #525. Point the harness at the shipped ops report or dense list, or amend section 3 in a dated revision. Stack the weighted tile row below the app breakpoint.
- Fixture credibility. #524 and #500. Fix the broken logo asset and the non-existent token, populate the feature, stat, FAQ and table data to the shape the components advertise, then re-render. Until then Density, Spacing rhythm and Section cadence on S1, S5 and S6 stay "not evidenced" rather than pass.
A re-score after those five may pass. It should be a fresh independent render from the tagged tip, not an edit of this file.
7. Evidence provenance
Recorded because it changes how much weight the prior scorecards can carry.
- No package-only PNGs existed anywhere in the repository or its worktrees when
this review opened.
docs/audits/_stills/held only its README, and the only captured set on disk was the northline brand leg. The2026-09-12-phase3directory that the Phase 3 re-score cites as "32 PNGs" was gone. Stills are gitignored by design, so this is expected housekeeping rather than misconduct, but it does mean the Phase 3 rows could not be checked against the images that produced them. This reviewer regenerated the package-only set from the same harness and the same substrate instead. - Regeneration:
a11y/generate_visual_bar_fixtures.py(package-only, 16 fixtures, manifest reports 3.18.0), thena11y/visual_bar_capture.mjswithVISUAL_BAR_STILLS_DATE=2026-09-12-phase5-review(32 PNGs). - The fixtures load no JavaScript: the capture inlines
brickwork.cssand the{% static %}script tags do not survive afile://render, so every still is a no-JS render. That is a fair test of this package, whose shells use<details>disclosures rather than script, and it is how #519 and #520 were found. It also means no JS-dependent behaviour anywhere in the scorecard has ever been exercised by these stills, which no prior pass stated. - Defects were confirmed by computed style and geometry under Playwright with
javaScriptEnabled: false, not by eye alone. Each issue records the measured values and, where it is a cascade collision, the byte offsets of the competing rules. - Kit comparison was look-and-idea only, from prior familiarity with the
priority-1 and priority-2 panel kits and the local Forge stills under the
umbrella
docs/_examples/forge-ui-kit-site/(present, ten files). No kit markup, class string or structure was copied, and Forge leads no row.
8. Non-claims
- This file certifies nothing about beauty. It is a FAIL notice with evidence.
- It does not judge axe compliance, catalogue counts, archetype coverage or brand identity preference, all of which the bar puts out of scope.
- It does not supersede 2026-09-12-visual-bar-scorecard-phase3.md or 2026-09-12-visual-bar-brand-northline.md as records of what those passes examined. It disagrees with two of their ratings, Navigation / mobile chrome and Forms, and says why.