🩺 2026-08-15 visual and IA remediation
Historical record — 2026-08-15
Dated evidence record for the 2026-08-14 visual and information-architecture audit and its eight bench-local repairs; every change described here was made only to the gitignored WRDP bench, and
releaseEligible: falseremains the controlling release boundary. Preserved as observed. Current truth: Program Masterplan.
What was audited
The orchestrated sweep covered 21 admin and frontend routes plus 6 logged-out routes at 1600×1000, 390×844, and 320×720: authenticated and anonymous states, normal and prefers-reduced-motion, a complete ten-question play-through, the Gutenberg canvas, and 12 structured DOM and geometry probes. Fourteen read-only expert slices analysed that captured corpus against installed source.
No expert slice had its own browser. Every slice report records that limitation in its evidenceGaps, so computed-style, accessible-name, network, and geometry values in this record are orchestrator measurements rather than independent browser observations by the experts.
The combined review recorded 151 findings: 2 blocker, 48 high, 83 medium, and 18 low; 37 hard defects and 94 design weaknesses; 109 observed and 42 inferred. It also retained 78 evidenced strengths. An 18-finding adversarial review corrected or narrowed five findings before the repair disposition was approved.
Evidence corpus
The immutable audit snapshot is retained under evidence/2026-08-15-visual-ia/audit/; its SHA-256 manifest evidence/2026-08-15-visual-ia/SHA256SUMS covers the 178-file corpus. It is deliberately outside the published content root because it includes authenticated admin and guest DOM dumps. The corpus was captured on 2026-08-14 from 16:43–18:07 UTC; audit/reports/PlanReview.json was captured at 23:24 UTC.
The final authority for the measured values below is evidence/2026-08-15-visual-ia/verify-2026-08-16.json, run at 2026-08-16T06:08:05Z. It reports status: pass, an empty failures array, and an empty consoleErrors array.
Disposition matrix
| ID | Disposition | Closed contract |
|---|---|---|
| W10-01 | closed, bench-verified | Builder customization initializes without the maximumCount ReferenceError; count presets and the full form render. |
| W10-02 | closed, bench-verified | Backup Delete controls carry destructive colour and stronger separation from Restore. |
| W10-03 | closed, bench-verified | A real question reflows at 320×720 without document or descendant overflow. |
| W10-04 | closed, bench-verified | The native rail contains five ordered rows and gives every corresponding screen .current. |
| W10-05 | closed, bench-verified | Archive players require a gesture; only the dedicated single-quiz route autostarts. |
| W10-06 | closed, bench-verified | The advance control has visible localized text and non-duplicated labelling; the sound control remains named in both states. |
| W10-07 | closed, bench-verified | Answer review is outside the secondary-actions disclosure with a stable 28 px separation. |
| W10-08 | closed, bench-verified | The exact plugin-owned target census has no sub-24 px result at either final viewport. |
The eight repairs
W10-01 — Builder customization restored
Root cause: assets/js/qwizz-builder-controls.js:6-8 used maximumCount while omitting it from the shared-context destructure. The repair restored that binding beside minimumCount; no fallback or special-case count path was added. Before repair, the main-world probe saw 1 uncaught ReferenceError, 0 preset pills, 2 total .qwizz-pill controls, and 40 form controls. The final probe measured 0 uncaught errors, 3 preset pills, 5 total pills, and 97 input, select, textarea, button controls in .qwizz-builder__form. Touched file: assets/js/qwizz-builder-controls.js.
W10-02 — Backup deletion made visibly destructive
Root cause: the backup CSS targeted a nonexistent [data-backup-delete] attribute, so Delete inherited the ordinary action colour and spacing. At assets/css/qwizz-admin-settings-core.css:1591-1605, the selector now follows the rendered button.is-danger class and gives its form a 12 px inline-start margin. Before repair, Delete was not visually distinct and the three actions read as one undifferentiated run. Across 10 final owner-visible rows, Delete computed to rgb(214, 54, 56); Download-to-Restore measured 4 px and Restore-to-Delete 16 px. Touched file: assets/css/qwizz-admin-settings-core.css.
W10-03 — Single-quiz reflow repaired
Root cause: the standalone player participated in an intrinsic-width grid track and had no explicit wrapping boundary. assets/css/qwizz-player.css:126-129 now uses grid-template-columns: minmax(0, 1fr) and gives the direct player width: 100% with overflow-wrap: anywhere. The pre-fix document measured 336 px of scroll width against a 320 px client. At 320×720, the final isolated-context run rendered a real question, measured scrollWidth = clientWidth = 320, and found no overflowing descendant. Touched file: assets/css/qwizz-player.css.
W10-04 — Native admin navigation restored
Root cause: normalize_submenu() rebuilt the rail from a two-slug allow-list, silently dropping the core-generated Quizzes and Questions entries; Subjects was not registered under the parent. includes/Admin/AdminMenu.php:50-56 now registers Subjects under Capabilities::MANAGE_TAXONOMIES, and includes/Admin/AdminMenu.php:59-88 orders all five rows with matcher closures while retaining the core-generated entries. Before repair only Dashboard and Settings rendered, and bookmarked native screens had no matching current row. The final order is Dashboard, Quizzes, Questions, Subjects, Settings; each of those five screens maps to its own .current row.
This is a documented reversal of the 2026-07-30 decision to reduce the submenu to Dashboard and Settings, not a decision retroactively relabelled as a defect. The Dashboard’s 35 deep links did not solve the navigation contradiction: a URL or bookmark could land an operator on a screen that the rail denied existed. The owner can re-affirm a two-row rail later, but that would retain Subjects registration and matcher ordering and explicitly hide chosen rows rather than revive an allow-list that silently deletes core-generated entries. Touched file: includes/Admin/AdminMenu.php.
W10-05 — Attempt creation gated by intent
Root cause: every embed initialized immediately and therefore started an attempt on passive archive load. includes/Frontend/QuizEmbed.php:12-37 now accepts bool $autostart = false and emits data-autostart plus data-title; assets/js/qwizz-player.js:768-786 renders a Start quiz intro unless that flag is set. Only templates/single-qw_quiz.php:10-11 passes true; assets/css/qwizz-player.css:57-60 styles the intro.
Before repair, archive loading could create attempts without a gesture. The final archive rendered 8 players and 8 intros with 0 passive start requests. One click produced exactly 1 request to the measured live endpoint /quizwizz/v1/quiz/99/start and exactly 1 persisted attempt identified by the token hash; the dedicated single quiz autostarted and rendered answers without a click. The live route is /quizwizz/v1/quiz/<id>/start, not the stale attempt/start description used during planning. Touched files: includes/Frontend/QuizEmbed.php, templates/single-qw_quiz.php, assets/js/qwizz-player.js, and assets/css/qwizz-player.css.
W10-06 — Advance and sound controls labelled
Root cause: the advance action was reduced to an icon-only presentation even though progression is the primary task; its generated accessible label and title also duplicated rather than complemented visible content. assets/js/qwizz-player.js:352-364 now appends the visible text label and removes the duplicate attributes. includes/Frontend/QuizEmbed.php:74-82,92 supplies the 20 px glyph and translated source strings, while assets/js/qwizz-player-renderer.js:149-155 and assets/js/qwizz-player.js:620-629 rebuild the sound icon while retaining button state.
The live German locale rendered Nächste Frage; the English source contract is Next question. The localized control measured 200×48, its sole glyph 20×20, with neither aria-label nor title. The final JSON records the sound toggle’s normalized English accessible name as the state-neutral Sound both before and after toggling; a fresh cache-disabled live check rendered its German translation Ton in both states. aria-pressed carries the state. Touched files: includes/Frontend/QuizEmbed.php, assets/js/qwizz-player-renderer.js, assets/js/qwizz-player.js, and assets/css/qwizz-player.css.
W10-07 — Review moved out of More actions
Root cause: the answer review was nested inside the closed More actions disclosure, hiding the primary learning outcome behind a secondary-action affordance. assets/js/qwizz-player-renderer.js:329-353 keeps the five secondary actions under Share, print and start again and appends the review directly to section.qwizz-player__result; assets/css/qwizz-player.css:100-110 supplies the review layout and 28 px separation, while assets/css/qwizz-player.css:131-138 excludes review from the result print profile.
Before repair, review visibility depended on opening the disclosure. After a ten-question completion, the final DOM held a 10-item review as a direct result-section child. The disclosure was closed, contained exactly 5 actions, and its summary read Share, print and start again; the disclosure-to-review gap measured 28 px at desktop and at 390 px mobile. Touched files: assets/js/qwizz-player-renderer.js and assets/css/qwizz-player.css.
W10-08 — Plugin-owned target floors completed
Root cause: compact plugin links and code controls inherited dimensions below the agreed 24 px floor. The main target pass raised owned controls across Dashboard, Stats, Settings, and responsive sheets in assets/css/qwizz-admin-dashboard.css, assets/css/qwizz-admin-stats.css, assets/css/qwizz-admin-settings-core.css, and assets/css/qwizz-admin-responsive.css; WordPress-owned admin-menu, admin-bar, row-action, checkbox-column, tab-navigation, and screen-meta geometry remained excluded.
Two final bench-local CSS repairs closed the exact census without changing the release boundary. assets/css/qwizz-admin-dashboard.css:386-414 adds the 24 px floor to compact Dashboard links, footer links, and .qwizz-shortcode-copy code; the latter had remained 23 px high after the first pass. assets/css/qwizz-admin-settings-core.css:1794-1828 applies the same scoped floor to plugin-owned Settings targets, explicitly including visually hidden/native inputs and footer links without changing their clipping or positioning. These are installed-bench source repairs only; they are not canonical release inputs and do not make this archive release-eligible.
The final exact scan used 1280×900 desktop and 390×900 mobile. Dashboard and Settings each returned empty under-24 arrays at both viewports. All four shortcode code controls measured 487×24 desktop and 328×24 mobile; the aggregate desktopUnder24 and mobileUnder24 arrays are empty. Touched files: assets/css/qwizz-admin-dashboard.css, assets/css/qwizz-admin-stats.css, assets/css/qwizz-admin-settings-core.css, and assets/css/qwizz-admin-responsive.css.
Critical files and anchors
| Contract | Installed bench authority | Anchor |
|---|---|---|
| W10-01 | assets/js/qwizz-builder-controls.js | 6-8, 189-193 |
| W10-02 | assets/css/qwizz-admin-settings-core.css | 1591-1605 |
| W10-03 | assets/css/qwizz-player.css | 126-129 |
| W10-04 | includes/Admin/AdminMenu.php | 50-56, 59-88 |
| W10-05 | includes/Frontend/QuizEmbed.php; templates/single-qw_quiz.php; assets/js/qwizz-player.js; assets/css/qwizz-player.css | 12-37; 10-11; 208-211, 768-786; 57-60 |
| W10-06 | includes/Frontend/QuizEmbed.php; assets/js/qwizz-player-renderer.js; assets/js/qwizz-player.js; assets/css/qwizz-player.css | 74-82, 92; 149-155; 352-364, 620-629; 53-56 |
| W10-07 | assets/js/qwizz-player-renderer.js; assets/css/qwizz-player.css | 329-353; 100-110, 131-138 |
| W10-08 | assets/css/qwizz-admin-dashboard.css; assets/css/qwizz-admin-stats.css; assets/css/qwizz-admin-settings-core.css; assets/css/qwizz-admin-responsive.css | 386-414; 78-86; 1794-1828; 203-230 |
These are the eleven files changed by the eight-repair pass. Shared files appear in more than one row because one source change can satisfy more than one measured contract.
Decision recorded, not laundered
W10-04 reverses the 2026-07-30 feature-completion decision “submenu reduced to Dashboard and Settings” recorded in the masterplan. The reason is operational, not cosmetic: the Dashboard compensated with 35 deep links, but arriving by URL or bookmark put the operator on a native QuizWizz screen for which the rail exposed no row and no .current state. The five-row rail is now the installed and measured bench truth. A future owner decision may deliberately hide rows, but it must do so explicitly and preserve the registration and matcher mechanics that prevent silent deletion of core-generated entries.
Verification
- Final evidence time and result:
2026-08-16T06:08:05Z;status: pass;failures: []. - Shell harness: TAP plan
1..30;assertions=30;failures=0. - Plugin and schema: active QuizWizz
1.10.0;Installer::SCHEMA_VERSION1.6.7. - Final debug gate:
logs/debug.logremained38409 → 38409. An earlier exploratory run had moved38408 → 38409through one WordPress-corehtml_entity_decodedeprecation atwp-includes/widgets.php:1652; the final full run added no line. - Attempt-table disclosure:
130 → 12, not an ordinary creation delta. QuizWizz expiry cleanup removed expired records during the run; all 12 retained rows were unexpired (attemptRowsExpiredAfter: 0). Browser verification created ordinary live attempts and did not directly delete rows. - Reduced motion: card, progress, answers, submit, and feedback each computed to
0stransition or animation duration. - Browser error gate:
consoleErrors: []. - Reflow, request gating, result composition, and target geometry match the W10 measurements above; the final JSON contains the raw objects and token hash without exposing the attempt token.
Publication
The corrected vault was published to https://wiki.wrdp.loca.zone on 2026-08-16. The first recorded published target was dist-1786861738.695567118-3945163, with dist-1785651677.699209047-3759274 retained as the pre-publication rollback target; the check-only gate processed 43 Markdown inputs and emitted 312 artifacts, and the live sitemap exposed 43 URLs. Later builds publish this record and are deliberately not self-recorded here; their labeled targets are retained outside the public content root in evidence/2026-08-15-visual-ia/publish-2026-08-16.txt.
Publishing the wiki is a documentation act, not a QuizWizz plugin release. The installed-source repairs remain bench-local and releaseEligible: false; no canonical source, package, provenance, signing, deploy, or release authorization follows from this publication.
Coverage this audit did not close
The following paths require bench content or configuration that does not exist on this site and therefore remain source-read rather than browser-closed:
- no mounted public Library instance exists, so
LibraryShortcodecard, grid, and pagination rendering remains source-read; - user-facing unpublish and delete flows, mutation-error states, and true zero-content empty states were not exercised;
- portability export and import job lifecycles were not enqueued;
- AI-enabled panels were not exercised because AI is disabled;
- quiz password protection was not applied.
Remaining frontier
The audit intentionally did not implement the Settings information-architecture rework, an exception-first Dashboard hierarchy, the block placeholder, Library and archive information architecture, density modes, or design-token consolidation. Those findings remain in the immutable corpus for a separately approved design pass; they are not silently converted into W10 defects or implied release work.
Source hygiene and release boundary
Only the eleven installed bench files listed in the anchor table changed. No plugin source outside that set changed; build/, vendor/, provenance artifacts, and QUIZWIZZ_VERSION were untouched. QUIZWIZZ_VERSION remains 1.10.0, and Installer::SCHEMA_VERSION remains 1.6.7.
This working tree is a gitignored live bench, not the canonical release repository. The audit snapshot and verification JSON are evidence, not release provenance. No release, package, provenance, deploy, or canonical-source claim follows from these repairs: releaseEligible: false.