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
| quantity | value |
|---|---|
| shots on disk | 294 |
| blocked, with a recorded cause | 52 |
| shotlist total | 346 |
| identity | expected_total == on_disk + blocked holds; 0 missing, 0 orphans |
| routes | 58 |
| viewports | 221 desktop (1280x900), 71 mobile (390x900), 2 at 320x720 |
| kinds | 143 page, 124 panel, 9 state, 18 variant |
| corpus size | 22.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-barshows 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-actionsshows Cancel and Print as 50px pills in one bottom row.g02f-d-p02-papershows the editable sheet rendering the generator’s own screen contract. The reviewer also established that the grey on Undo/Redo is the shippeddisabledstate (measured RGB 143,143,143 on 248, i.e.#111at 45% opacity, from.qwizz-btn:disabled{opacity:.45}), not a contrast defect. - Items 27 and 28, the record editors.
a05-d-p07-no-railis a full 1100x3374 crop of#wpbody-contenton 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-railshows 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-openadvertises all six:[quizwizz_quiz],[quizwizz_library],[quizwizz_subjects],[quizwizz_craft],[quizwizz_my_library],[quizwizz_my_stats]. - Item 19, answer layout.
g05-d-p07-answersshows the 2x2 answer grid on desktop, andg05-m-fullshows 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:
| reason | n |
|---|---|
| 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-surface | 4 |
| state-not-reached | 4 |
| mislabelled-crop | 3 |
| no-visible-area, run-budget, duplicate-name, not-visually-distinct, control-not-found, occluded, no-reviewable-content | 2 each |
| dead-ui, not-reproduced, no-control, no-distinct-element, no-visual-change | 1 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
g16page shots showed a WordPress 404. They were captured at 07:02, and the locked-quiz fixture was only repaired at 07:05 — proven fromcapture-log.jsonltimestamps against the post’spost_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.
-offheld the accented button with sound waves and-onheld the muted one, contradictingqwizz-player.css:63andqwizz-player.js:784. The filenames were swapped. - A harness bug poisoned three page shots.
harness.jscallsscrollIntoView()for element crops, so a later viewport shot on the same page load inherited that offset:g01-d,g02-dandg03-dphotographed 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-sixshowed 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-langshad photographed the question-count pills. A loose comma-fallback selector matched.qwizz-pillsafter.qwizz-pills[data-languages]failed. Deleted rather than published mislabelled, and every remaining fallback selector was removed from the wave scripts. Afallback_auditrule now requires image inspection for any shot captured through a fallback.- The 2026-08-20 corpus contains the same class of error.
matrix.keywas alreadyforcedin that tour’s ownoptions-pre.json, so its twog02-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 honestg02-d-p12-group-sharedinstead.
Method disclosures
g05r-d-p07-print-sheet-revealedwas captured under a temporary injected style, because the unsolved print sheet computes todisplay:nonewith zero height on screen media. The override was removed immediately after the crop and the filename carries-revealedso 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, becauseworld-quiz-englishholds 58 questions and cannot be completed inside one harness run. No image is filed under a quiz it was not taken on. g18-d-fullis 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
-simulatedtheme crops were produced by swappingdata-themeon 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#1only qw_exposure_settingsmd5cf4ea924e3fd29c2405b1073ddfad73c, 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 restorewp_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 thata12a-d-p01-backupsdocuments- generated fixture passwords were written inside the container and relocated to
/tmpby the host, so no credential entered a transcript; 0qwtourfiles remain underuploads/ - kept deliberately and disclosed: 56 rows in
wp_qwizz_attemptsfrom 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.
- The question list overprints two columns. In
a04-d-fullthe 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:329emits.column-qw_source .qwizz-list-badge{white-space:nowrap}. - The list empty-state paints over the table header. In
a03-d-p06-empty-actionsand 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 ofthead, colliding with “Titel” and “Details” and rendering both illegible. - Active filters exist that the UI cannot set.
a04-d-x01/x02/x03show 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. - Labels and helper text are concatenated with no separator.
a05-d-p05-answers-controlsrenders “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. - Three of four answer radios are visually unlabelled. In
a06-d-p03-choicesonly the checked radio shows text (“Correct”); Ruby, Perl and Java render as bare circles. - Helper text contradicts the selected value. Under a select reading “Multiple choice”,
a06-d-p05-selectsreads “True / False questions always contain exactly two answer choices.” - 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. - 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.
- Stray outline boxes on radio labels survive.
a02-d-p08-qw-presentationboxes every choice in the Prefix and Print columns groups simultaneously, so this is not a focus ring. Same family as TNDM items 20-22. - 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). - Singular/plural and mistranslation bugs. “Showing subjects with no usable question.” (
a07-d-x02-supply-empty) and “has 1 usable questions” repeated four times ina01-d-p09-ideas, where the subjects grid gets it right — a missing_n(). - A count column contradicts its own filter.
a07-d-x01-supply-undersays “fewer than 10 usable questions” while the Anzahl column shows 11 and 8. - The subject archive serves the theme’s German search-miss string.
g10-d-fullshows “Subject: Computers” then “Es wurde leider nichts gefunden…” with zero quizzes. - Search results render whole page bodies.
g08-d-fullis 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. - 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.
- Danger styling on the safe state.
a02-d-p12-qw-datadraws the “Keep on uninstall” panel with a red danger border while the toggle is ON and its own text calls that recommended. - A destructive control with no label. The same card exposes four icon-only buttons, one a red ✕, with no text at all.
- The delete control carries no destructive styling. In
a05-d-p03-row-actionsthe trash glyph is the same weight, colour and size as the pencil and the reorder arrows. - Per-question actions are invisible at rest. In the fine-tune step every row affordance is
opacity:0until hover, so the only control visible at rest is a disabled one. - The locked-embed CTA lost its button chrome. “Open the quiz page” renders as plain bold text though
qwizz-embeds.css:200specifiesbackground:var(--qw-action-bg); sibling “Play quiz” buttons paint correctly. This is the public-token trap again, in the empty-state CTA. - 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.
- Duplicate subject names on different slugs. “Literature & Arts” exists as both
literature-artsandliterature-and-arts; “People & Society” likewise. - 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-101deliberately refusing script translations wheniface_langisen. - 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.
- An invalid share-play token serves the front page.
/?qwizz_play=999999returns the ordinary front page rather than any denial, so there is no denied-share-play surface at all.
Featured pixels
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
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
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
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
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
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
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
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
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
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.
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
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
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
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).
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
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
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
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
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
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
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))
EOFMachine 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.