2026-08-25 UI corpus

Historical record — 2026-08-25

Preserved as observed, and still the current pixel corpus: nothing supersedes the images on this page. Current truth: Program Masterplan.

This supersedes the 2026-08-20 tour gallery for every route it covers. That gallery photographed a UI that no longer exists: the TNDM remediation changed 33 plugin files, so the pixels behind the older corpus are stale even where the routes are unchanged.

Every number below is recomputed from shotlist.expanded.json, digests.json and verify.json, which are published beside the images in tour-2026-08-25/. Nothing here is hand-maintained.

Ledger

quantityvalue
shots on disk294
blocked, with a recorded cause52
shotlist total346
identityexpected_total == on_disk + blocked holds; 0 missing, 0 orphans
routes58
viewports221 desktop (1280x900), 71 mobile (390x900), 2 at 320x720
kinds143 page, 124 panel, 9 state, 18 variant
corpus size22.0 MB

The corpus was captured with the same harness as the previous tour (harness.js), driven by a data-driven driver.js for the 282 shots reachable by URL alone and by scripted waves (waves.js, waves2.js) for everything that only exists after real clicks, a config mutation, or an emulated media feature.

What the recapture proves about the remediation

These are the fixes the corpus was built to check, each confirmed by an independent read-only reviewer working from pixels plus source, not from my claims.

  • Item 09, the fine-tune print studio. g02f-d-p06-bar shows one row carrying the step title, the guidance line, the count and Undo/Redo. Undo measures 88x46 and Redo 86x46, label cap-height 9px implying roughly a 12.8px font at weight 800 — not the theme’s 22px/300 body font that the four fighting override passes used to produce. g02f-d-p08-actions shows Cancel and Print as 50px pills in one bottom row. g02f-d-p02-paper shows the editable sheet rendering the generator’s own screen contract. The reviewer also established that the grey on Undo/Redo is the shipped disabled state (measured RGB 143,143,143 on 248, i.e. #111 at 45% opacity, from .qwizz-btn:disabled{opacity:.45}), not a contrast defect.
  • Items 27 and 28, the record editors. a05-d-p07-no-rail is a full 1100x3374 crop of #wpbody-content on the quiz editor: title field, permalink, the 58-row question metabox, and in the right column only Publish and Subjects. No statistics rail of any kind. Every record-editor shot in that slice is rail-free, while the list screens still carry it.
  • The mobile statistics rail. a01-m-p02-stats-rail shows all five segments wrapped 2+2+1 inside a 368px box with every tile’s right edge terminating inside it. The reviewer corroborated this against the two real page shots at 390px rather than trusting the crop. The 750px-carousel-in-a-366px-box defect, which hid three of five segments on every QuizWizz admin screen, is gone.
  • Item 01, the shortcode surface. a01-d-p10-shortcodes-open advertises all six: [quizwizz_quiz], [quizwizz_library], [quizwizz_subjects], [quizwizz_craft], [quizwizz_my_library], [quizwizz_my_stats].
  • Item 19, answer layout. g05-d-p07-answers shows the 2x2 answer grid on desktop, and g05-m-full shows the single column at 390px.
  • Items 13 and 15. The single-quiz page renders its title exactly once (g05-m-full, g05-x-full), and the user-surfaces page renders exactly one sign-in card (g07-d-full).

Honesty gates

Ledger identity

shotlist.expanded.json carries every shot the tour intended. A shot is either on disk or blocked with a file:line-grade cause; there is no third state and no silent drop. The 52 blocked entries break down as:

reasonn
mutation-scope (would need a destructive settings or import write)6
state-absent (the state does not exist on this bench)6
config-gated (an exposure setting removes the control)5
covered-elsewhere (captured under a different, honest route)5
no-distinct-surface4
state-not-reached4
mislabelled-crop3
no-visible-area, run-budget, duplicate-name, not-visually-distinct, control-not-found, occluded, no-reviewable-content2 each
dead-ui, not-reproduced, no-control, no-distinct-element, no-visual-change1 each

Pixel-duplicate sweep

A sha256 sweep over the raw bytes found 37 duplicate groups on the first pass. That sweep is the single most valuable gate in this exercise, because every one of those groups was a file claiming a state it did not hold. The largest cause was structural: the data-driven driver knows one URL per route, so every extra-state shot had been captured at its route’s base URL. a03-d-x01-draft, a03-d-x02-source-generated and a03-d were byte-identical; so were the four a04 files and the two a07 supply files. Each such shot now pins its own URL, and an independent reviewer re-verified that all three families differ by both digest and visible state.

18 groups remain and each is documented as legitimately identical in duplicate_audit — almost all are a fold shot and a fullPage shot of a page shorter than the viewport, plus a few genuinely shared components (the same wrapped rail on two list screens; v08’s “site” theme being the default player by definition).

Reviewer-driven corrections

Seven read-only reviewers inspected the corpus with no knowledge of each other. Their verdicts removed 12 shots and renamed 3. The corrections worth naming:

  • Four g16 page shots showed a WordPress 404. They were captured at 07:02, and the locked-quiz fixture was only repaired at 07:05 — proven from capture-log.jsonl timestamps against the post’s post_modified. The corpus briefly held two contradictory states for one route. Re-captured; all four now show the password form.
  • The sound-toggle pair was inverted. -off held the accented button with sound waves and -on held the muted one, contradicting qwizz-player.css:63 and qwizz-player.js:784. The filenames were swapped.
  • A harness bug poisoned three page shots. harness.js calls scrollIntoView() for element crops, so a later viewport shot on the same page load inherited that offset: g01-d, g02-d and g03-d photographed the middle of their pages. The harness now scrolls to the document top before every viewport page shot, and the three were re-captured and re-verified.
  • a01-d-p14-shortcodes-six showed no shortcodes at all — its selector lacked [open], so the grid sat inside a closed <details> and the crop caught the page footer instead. The claim was true but proved by the wrong file; re-captured with the disclosure open.
  • g02-d-p09-langs had photographed the question-count pills. A loose comma-fallback selector matched .qwizz-pills after .qwizz-pills[data-languages] failed. Deleted rather than published mislabelled, and every remaining fallback selector was removed from the wave scripts. A fallback_audit rule now requires image inspection for any shot captured through a fallback.
  • The 2026-08-20 corpus contains the same class of error. matrix.key was already forced in that tour’s own options-pre.json, so its two g02-d-p12-group-shared-* files cannot show the answer-review toggle their names imply; inspection confirms both show only the Question position and Banner rows, differing solely in banner sub-panel state. This tour publishes one honest g02-d-p12-group-shared instead.

Method disclosures

  • g05r-d-p07-print-sheet-revealed was captured under a temporary injected style, because the unsolved print sheet computes to display:none with zero height on screen media. The override was removed immediately after the crop and the filename carries -revealed so the fact is visible in the gallery rather than buried here.
  • The end-of-quiz states live under their own route id g05r, captured on the 10-question quiz, because world-quiz-english holds 58 questions and cannot be completed inside one harness run. No image is filed under a quiz it was not taken on.
  • g18-d-full is a screenshot of the real generated PDF (91,148 bytes, %PDF- header) opened in the browser’s PDF viewer. A first attempt photographed the builder page under that name, because the Print control does not navigate the tab; that file was deleted.
  • The five -simulated theme crops were produced by swapping data-theme on the live player and are named accordingly.

Residue

verify.json records executed proof, not intentions:

  • fixture ids remaining: [] — all six deleted and re-queried by id and by exact title
  • fixture users remaining: []; administrators remaining: admin#1 only
  • qw_exposure_settings md5 cf4ea924e3fd29c2405b1073ddfad73c, byte-identical to the pre-tour baseline after four separate mutation waves, each of which printed its own before/after digest and was followed by a verified restore
  • wp_qwizz_settings_backups: 218 rows, all created inside the tour window, all deleted, table now empty and nothing predated the window — this restores the “No settings snapshots yet” state that a12a-d-p01-backups documents
  • generated fixture passwords were written inside the container and relocated to /tmp by the host, so no credential entered a transcript; 0 qwtour files remain under uploads/
  • kept deliberately and disclosed: 56 rows in wp_qwizz_attempts from driving the player flow. Runtime analytics rather than configuration, orphaned by design now that the fixture subscriber is deleted.

New findings

The recapture was not only a verification pass. The reviewers found defects that are not among the 36 TNDM items, ordered by severity. These are candidates for the next remediation round; none is fixed here.

  1. The question list overprints two columns. In a04-d-full the document renders 1497px wide inside a 1280px viewport and the source badge — QuizWizz question pack:295b490e…adc:50, a 64-hex pack id — runs straight through the Updated cell on 19 of 20 rows, making both unreadable. includes/Admin/ListTables.php:329 emits .column-qw_source .qwizz-list-badge{white-space:nowrap}.
  2. The list empty-state paints over the table header. In a03-d-p06-empty-actions and the independent full-page shot 80 minutes later, the empty-state sentence, a “Create a quiz” button and a “Clear filters” link are drawn on top of thead, colliding with “Titel” and “Details” and rendering both illegible.
  3. Active filters exist that the UI cannot set. a04-d-x01/x02/x03 show pills reading “Readiness: Ready”, “Readiness: Needs review” and “Pool: Undersupplied”, but the filter bar offers no readiness or pool control — only “Clear all” acts on them.
  4. Labels and helper text are concatenated with no separator. a05-d-p05-answers-controls renders “Answer review for players Site policy forces the answer key” and “Answer sheet in PDF Per-quiz setting wins; site Forced only sets the default” in one weight, one colour, no punctuation.
  5. Three of four answer radios are visually unlabelled. In a06-d-p03-choices only the checked radio shows text (“Correct”); Ruby, Perl and Java render as bare circles.
  6. Helper text contradicts the selected value. Under a select reading “Multiple choice”, a06-d-p05-selects reads “True / False questions always contain exactly two answer choices.”
  7. A sticky settings toolbar hides the anchor target it scrolls to. On the live settings page the toolbar band covers the “Page numbers” control (a02-d-p09-qw-pdf), the theme name row (a02-d-p10-qw-theme) and the heading of two panels outright.
  8. Settings search returns section matches as one result per control. Query “language” yields roughly two dozen “BUILDER › GUEST BUILDER › SECTION MATCH” rows for category names that do not contain the word, drowning the single real hit.
  9. Stray outline boxes on radio labels survive. a02-d-p08-qw-presentation boxes every choice in the Prefix and Print columns groups simultaneously, so this is not a focus ring. Same family as TNDM items 20-22.
  10. Mobile admin regressions the desktop fix did not cover. The settings anchor strip is sliced at 390px with five of nine sections unreachable-looking (a02-m); question rows lose their index and split their control strip across two lines (a05-m); the subjects table drops the question-count column entirely, which is the whole point of the supply views (a07-m).
  11. Singular/plural and mistranslation bugs. “Showing subjects with no usable question.” (a07-d-x02-supply-empty) and “has 1 usable questions” repeated four times in a01-d-p09-ideas, where the subjects grid gets it right — a missing _n().
  12. A count column contradicts its own filter. a07-d-x01-supply-under says “fewer than 10 usable questions” while the Anzahl column shows 11 and 8.
  13. The subject archive serves the theme’s German search-miss string. g10-d-full shows “Subject: Computers” then “Es wurde leider nichts gefunden…” with zero quizzes.
  14. Search results render whole page bodies. g08-d-full is 9021px tall and stacks entire pages including live “Start quiz” buttons and a complete builder step; one excerpt shows a raw unrendered [ays_quiz id='1'] shortcode.
  15. Three product names on one screen. The menu says “Qwizz”, the page titles say “QuizWizz”, onboarding says “Place a Qwizz block”, and the AI card says “Quiz Wizzard for visitors” — with “Wizzard” misspelled.
  16. Danger styling on the safe state. a02-d-p12-qw-data draws the “Keep on uninstall” panel with a red danger border while the toggle is ON and its own text calls that recommended.
  17. A destructive control with no label. The same card exposes four icon-only buttons, one a red ✕, with no text at all.
  18. The delete control carries no destructive styling. In a05-d-p03-row-actions the trash glyph is the same weight, colour and size as the pencil and the reorder arrows.
  19. Per-question actions are invisible at rest. In the fine-tune step every row affordance is opacity:0 until hover, so the only control visible at rest is a disabled one.
  20. The locked-embed CTA lost its button chrome. “Open the quiz page” renders as plain bold text though qwizz-embeds.css:200 specifies background:var(--qw-action-bg); sibling “Play quiz” buttons paint correctly. This is the public-token trap again, in the empty-state CTA.
  21. Test residue on an operator surface. “QW SVG Probe 4lHqFtjO” appears in the dashboard subjects tile, and an auto-draft with 0 questions leaks into “Recent quizzes” with live Edit and Play links.
  22. Duplicate subject names on different slugs. “Literature & Arts” exists as both literature-arts and literature-and-arts; “People & Society” likewise.
  23. A duplicated Advanced panel in the block inspector. The craft inspector shows an English “Advanced” directly above core’s German “Erweitert”, a consequence of UiLanguage.php:100-101 deliberately refusing script translations when iface_lang is en.
  24. Roughly 45-55% of the player card is empty below the answers at every viewport, and the pre-hydration shell ignores the player theme, flashing a light card before a dark one.
  25. An invalid share-play token serves the front page. /?qwizz_play=999999 returns the ordinary front page rather than any denial, so there is no denied-share-play surface at all.

Twenty of the 294 shots are published beside this page in tour-2026-08-25/ and are embedded below, grouped by route family. They are the crops the reviewers argued from: the ones that confirm a remediation item, or that carry a finding above. The other 274 stay bench-local under evidence/2026-08-25-ui-tour/shots/, where the ledger recomputes.

A sha256 pass over these 20 files on 2026-08-27 returned 20 distinct digests and no duplicate group, so every embed below is its own pixels. That is a check on the published subset only; the corpus-wide sweep and its 18 documented identical groups are unchanged above.

Geometry in each caption is the file’s own pixel size. Element crops are the captured selector, not a viewport.

Admin dashboard — /wp-admin/admin.php?page=qw-dashboard

QuizWizz dashboard statistics rail at desktop width: five tiles labelled Quizzes, Usable questions, Subjects, Finished plays and Ready languages, side by side on one row. a01-d-p02-stats-rail.png · route a01 · desktop element crop 1078x113 · the desktop half of the statistics-rail repair: five tiles on one row, no carousel, no clipped edge

The same statistics rail at 390px: the five segments wrapped two, two and one inside the container, every tile ending inside the box. a01-m-p02-stats-rail.png · route a01 · mobile element crop 368x313 · the mobile statistics rail, wrapped 2+2+1; the 750px-carousel-in-a-366px-box defect that hid three of five segments on every QuizWizz admin screen is gone

Dashboard Shortcodes disclosure expanded, showing a grid of the registered shortcode tags. a01-d-p10-shortcodes-open.png · route a01 · desktop element crop 1078x307 · TNDM item 01, the shortcode surface advertising all six registered tags; this is the re-captured file, after the first crop caught a closed details and photographed the page footer instead

The dashboard under the German interface variant: German stat tiles, and a Recent quizzes panel whose rows read Automatischer Entwurf with zero questions. v01-d-p06-dashboard.png · route v01, the iface_lang=de config variant · desktop page 1280x900 · finding 21: four Automatischer Entwurf · Entwurf · 0 Fragen rows sit in Aktuelle Tests, so the auto-draft residue reaches an operator surface in every locale

Admin settings — /wp-admin/admin.php?page=qw-settings

Presentation settings panel with outline boxes drawn around every radio label in two separate option groups at once. a02-d-p08-qw-presentation.png · route a02 · desktop element crop 573x1081 · finding 9: every choice in the Prefix and Print columns groups is boxed simultaneously, which is what rules out a focus ring; same family as TNDM items 20-22

Admin list screens — /wp-admin/edit.php

Quiz-list empty state: the empty-state sentence, a Create a quiz button and a Clear filters link drawn on top of the table header, so header labels and empty-state text overlap. a03-d-p06-empty-actions.png · route a03, captured at ?post_type=qw_quiz&qw_lang=fr&qw_source_filter=generated&post_status=draft · desktop element crop 1078x62 · finding 2: the empty-state row paints over thead; in this crop a header label overprints the empty-state sentence and another overprints the Create a quiz button, both illegible

Question list full page: a long 64-hex source badge running through the Updated column on nearly every row. a04-d-full.png · route a04, ?post_type=qw_question · desktop full page 1497x2505, wider than its own 1280px viewport · finding 1: the source badge overprints Updated on 19 of 20 rows, from the white-space:nowrap at includes/Admin/ListTables.php:329

Quiz editor — /wp-admin/post.php?post=413&action=edit

Full quiz-editor column: title field, permalink, the long question metabox, and a right column holding only Publish and Subjects. No statistics rail anywhere. a05-d-p07-no-rail.png · route a05 · desktop element crop of #wpbody-content, 1100x3374 · TNDM items 27 and 28: the five-card site-statistics rail no longer renders on a record editor, and the right column carries only Publish and Subjects

Block editor — /wp-admin/post-new.php?post_type=post

Block inspector sidebar for the builder block: a Builder profile panel, then an English Advanced heading directly above a German Erweitert heading. e02-d-p01-inspector.png · route e02 · desktop element crop 280x350 · finding 23: an English Advanced panel heading sits directly above core’s German Erweitert, under a Builder profile panel. Read the finding above for the UiLanguage.php anchor as it stood on 2026-08-25; that line has since moved

Player — /?qw_quiz=…

Answer review is visible in two of these crops. Which sites and which quizzes are allowed to reveal it is settled policy, not a tour finding: see Answer visibility policy — D005.

Player answer area at desktop width: four answer choices in a two-by-two grid. g05-d-p07-answers.png · route g05, ?qw_quiz=world-quiz-english · desktop element crop 1074x130 · TNDM item 19, the 2x2 answer grid on desktop; the single column at 390px is g05-m-full

End-of-quiz result surface: a Quiz complete banner, the score four out of ten at forty percent, a Retry button, an answer-review summary and ten stacked review cards, closing on a row of actions. g05r-d-p01-result.png · route g05r, ?qw_quiz=zeitmaschine-geschichte · desktop element crop 1178x2092 · the whole finish surface: score, Retry, review summary, then New, Print score, Print blank, Quiz and Score. Filed under its own route id because the 58-question quiz cannot be completed inside one harness run, so no image is filed under a quiz it was not taken on

Post-attempt answer review: ten rows, each showing the question, the submitted answer and the correct answer, with green accents on correct rows and pink on incorrect ones. g05r-d-p03-review.png · route g05r · desktop element crop 1074x1568 · the review list every print-flag coupling used to mute: each row reveals Your answer: against Correct answer:, colour-accented by outcome, with no explanations shown

Player timing strip reading Next question in one second, beside a Pause control and an Add ten seconds control. v03-d-p02-player-timer.png · route v03, a config variant · desktop element crop 1074x44 · the countdown strip reads Next question in 1 second. beside Pause and Add 10 seconds. It exists only as a variant: player.auto_advance_ms ships at 0 since TNDM item 33 (2026-08-25-tndm-ui-review.md:455)

Fine-tune print studio and its PDF — /?page_id=57

Item 09’s four defects were all in this surface. The step is implemented and good here, but unreachable as configured — matrix.editor ships {st: visitor, def: false} and no visitor-facing control opens it, so Print goes straight to PDF. That reachability question is an open owner branch, not a fixed defect (2026-08-25-tndm-ui-review.md:460).

Fine-tune editor top bar: one row carrying the step title, a guidance line, a count and the Undo and Redo controls. g02f-d-p06-bar.png · route g02f · desktop element crop 832x72 · TNDM item 09: the rebuilt bar on one row, Undo 88x46 and Redo 86x46 at roughly 12.8px weight 800, not the theme’s 22px/300 body font the four fighting override passes produced. The grey is the shipped disabled state from .qwizz-btn:disabled{opacity:.45}, not a contrast defect

The editable fine-tune sheet: a paper-like preview of the worksheet as it will print. g02f-d-p02-paper.png · route g02f · desktop element crop 794x796 · TNDM item 09: the editable sheet rendering the generator’s own screen contract rather than a second, divergent layout

Fine-tune footer action row: Cancel and Print as two pill buttons side by side. g02f-d-p08-actions.png · route g02f · desktop element crop 832x50 · TNDM item 09: Cancel and Print as 50px pills in one bottom row, in the builder’s own button vocabulary

Browser PDF viewer showing a generated three-page worksheet headed Science and the date, with its first question visible. g18-d-full.png · route g18 · desktop full page 1600x1125 · the real generated PDF, 91,148 bytes with a %PDF- header, opened in the browser’s own viewer at page 1 of 3, headed Science · 2026-08-25. Disclosed because a first attempt photographed the builder page under this name — the Print control does not navigate the tab — and that file was deleted

Locked and unavailable surfaces

WordPress password form for a protected quiz, carrying an invalid-password error above the password field and submit button. g16-d-p02-wrong-pw.png · route g16, ?qw_quiz=tour-locked-quiz · desktop element crop 1280x162 · the wrong-password state, showing Das Passwort ist ungültig. above the form. This is the re-captured file: the four original g16 page shots photographed a WordPress 404 because they were taken at 07:02 and the locked-quiz fixture was only repaired at 07:05

Embedded quiz library empty state reading Password required, where the Open the quiz page call to action renders as plain bold text with no button background. g17-d-p01-locked-embed.png · route g17, ?page_id=10983 · desktop element crop 693x239 · finding 20: Open the quiz page renders as plain bold text with no background, border or other button chrome. Read the finding above for the qwizz-embeds.css anchor as it stood on 2026-08-25; that line has since moved

Embedded quiz empty state reading Quiz unavailable, with an explanatory sentence and no link or button at all. g17-d-p02-unavailable-embed.png · route g17 · desktop element crop 693x183 · the sibling denial state on the same page: Quiz unavailable with an explanatory sentence and no call to action of any kind, so there is no chrome defect to compare against the locked embed above

Reproducing this

cd /home/loca/dev/wrdp
# ledger identity, duplicate sweep and digests all recompute from the published files
python3 - <<'EOF'
import json, hashlib, pathlib, collections
d = pathlib.Path('evidence/2026-08-25-ui-tour')
m = json.load(open(d / 'shotlist.expanded.json'))
disk = {p.name for p in (d / 'shots').glob('*.png')}
print('expected', len(m['expected']), 'blocked', len(m['blocked']), 'on disk', len(disk))
print('missing', sorted(set(m['expected']) - disk), 'orphans', sorted(disk - set(m['expected'])))
by = collections.defaultdict(list)
for p in sorted((d / 'shots').glob('*.png')):
    by[hashlib.sha256(p.read_bytes()).hexdigest()].append(p.name)
print('duplicate groups', sum(1 for v in by.values() if len(v) > 1))
EOF

Machine records: evidence/2026-08-25-ui-tour/{shotlist.expanded.json,digests.json,verify.json,capture-log.jsonl}, mirrored beside the featured images in tour-2026-08-25/. Reviewer reports: agent://Guest, agent://Player, agent://Finetune, agent://AdminCore, agent://AdminLists, agent://AdminRest, agent://Variants.

releaseEligible: false — this is bench evidence. The release owner applies source changes through the locked pipeline.