🗂️ QuizWizz masterplan — full narrative record
Historical record — 2026-08-19
Relocated, not rewritten: on 2026-08-19 the masterplan was slimmed to its live tables and every narrative section below moved here verbatim, each retraction with its claim. Nothing was deleted; nothing here is release authorization. Preserved as observed. Current truth: Program Masterplan.
2026-08-13 installed-source remediation note
2026-08-13 installed-source remediation
The installed source now contains the remediations for password-gated access, attempt privacy export/erasure and pseudonymous-AI retention disclosure, single-line portability headers, removal of
player.save_attemptsand dead branding-engine settings, signed guest identity, AI reservation release, durable rate-limit diagnostics, native-import type safety/idempotency, event/attempt transaction checks, bounded statistics, RNG error handling, uninstall residue, backup-path containment, and UI token/accessibility defects. Schema1.6.7migrated the attempts table through the transactional-table check. Final bench verification passed on 2026-08-13: every changed PHP file linted, focused malformed-import/language-default/privacy-retention/schema probes passed, the standing harness reportedassertions=30 failures=0, cache-disabled desktop/mobile browser smokes completed without console errors or document overflow, the debug log remained at its 38,388-line baseline, and the WRDP wiki check-only build passed with 42 inputs and 310 outputs. These are installed-bench results, not release authorization.
2026-08-15 visual and IA remediation
Historical run record: the 2026-08-14 fourteen-slice visual and IA audit authorized eight repairs, W10-01 through W10-08; the dated record carries their source, browser, geometry, and boundary evidence, grounded in evidence/2026-08-15-visual-ia/verify-2026-08-16.json. That pass’s 2026-08-16 re-verification reported ./scripts/quizwizz-probe.sh --wave all at 1..30 and assertions=30 failures=0; its final run held logs/debug.log at 38,409 lines. Attempt expiry cleanup reduced the table from 130 rows to 12, with 0 expired rows remaining; browser verification created only ordinary live attempts and did not delete rows directly.
All eight repairs are bench-verified with release-input remainder under verification-contract item 5: their live behavior is closed, while the absent canonical release inputs still prevent release authorization. (vocabulary retired 2026-08-19; see Orientation & glossary)
2026-08-16 post-W10 execution
The post-W10 execution record remains the dated evidence for Wave 5 portability/user-surface contracts, Settings trust, authoring and retrieval, password access, and attempt continuity. Its standing probe run passed TAP 1..32; the subsequent Wave 6 contract gate extended the full shell harness to 1..46 with assertions=46 failures=0. Those are historical steps into the current Option F posture, not product-completion or release-eligibility claims.
2026-08-17 Option F status
Current authority is the four-page contract: probe harness, launch readiness, owner decision intake, and current source preservation. The machine-readable evidence is evidence/2026-08-17-option-f/verify.json.
Operational/runtime/rendered gates are green: health 7/7; backup /home/loca/backups/wrdp/20260817T070900Z; restore drill 4/4 with scratch DB count 0; two consecutive documented browser-loader passes, each 30/30 with overallPass=true, zero console errors, zero page errors, and Settings restored 10→11→10; shell probe TAP 1..46 with 46 pass/0 fail; source preservation manifest 218 files with 0 added, 0 removed, 2 changed since the prior baseline; the last known wiki input check counted 51 inputs and 328 artifacts.
The launch decision remains NO-GO. PW-02 is closed by rendered Builder h1#qwizz-builder-title evidence; PW-01 remains owner-blocked until the subscriber publication-lifecycle policy is answered in owner decision intake. No local operator may invent legal, operator, repository, commit, lockfile, endpoint, signing, or provenance values; releaseEligible: false is unchanged.
2026-07-31 UI/UX execution masterplan
This section records the earlier UI/UX execution plan. Current visual and IA status lives in the 2026-08-15 remediation section above; historical repairs are not relabeled as open defects, and bench evidence does not become release authorization.
Current, independently observed public-shell defect
- UX-01:
- status: public shell implemented; operator completion gated
- evidence: the root uses the QuizWizz static landing page. Privacy, Terms, and Operator/Contact drafts are published and footer-linked; desktop and 390 px DOM checks show one page-title
h1and no horizontal overflow. - remaining: replace every
[INSERT-YOUR-DATA-HERE]value and complete operator legal review before launch readiness
2026-07-31 W7 final-push evidence
- Evidence: W7 localization, cache, and microcopy
- Bench-verified:
- concise microcopy and accessible native-tooltip icon actions
- informal-Du German PO/MO/JSON catalog update, with the complete-catalog gate still offering
de - six direct Dashboard/MetaBoxes asset versions invalidating a warmed Chromium cache after their mtimes changed
- Superseded by W8:
- W3 German rendered-string matrix closed at desktop/mobile across public and admin routes
- W4 public-handle warm-cache proof closed; CDN/edge remains not applicable because no such component exists
- A70 measured and closed as WordPress-core geometry; A71/A73/A77 repaired and verified
- A72 browser verification captured the owner-approved inspector, canvas summary/token geometry, live Builder behavior, Player result behavior, server clamp, and cleanup; W6 negative states are closed with existing bench data
Deliberately separate from the UI/UX waves
PL-06 and PL-09–PL-12/PL-16 now have the authorized F-program implementation recorded in the open work ledger: the guest substrate is safely off by default, metadata audit is bounded, public policy drafts are live, and nginx heavy-route throttling/log retention is installed. PL-13–PL-15 and operator completion of PL-17/PL-18 remain named infrastructure or data gates rather than visual remediation.
Evidence basis
- Current visual and IA evidence: 2026-08-15 visual and IA remediation, grounded in
evidence/2026-08-15-visual-ia/verify-2026-08-16.json. Its eight authorized repairs are bench-verified; only the explicitly disclosed coverage gaps, owner decisions, and release-input boundaries remain. - The dated 80-lead audit is complete, not the ongoing UI/UX frontier: post-remediation visual audit.
- A70 is measured/core-owned and A71/A73/A77 are repaired through the companion block-editor script/editor stylesheet with
build/unedited. A72 is browser-verified through the same companion-script plus registered-attributes route for the inspector, canvas, Builder, Player, and cleanup observations recorded in W8.
2026-07-30 feature-completion pass
Delivered against the itemized re-audit in the preserved itemized re-audit, each item browser- or WP-CLI-verified after install:
- schema
1.6.5(migration explicitly approved by the bench owner in-session before execution):wp_qwizz_attempts.user_idplus index; authenticated attempts store the real user id, guests stay0 - durable per-user aggregate (
qwizz_user_statsuser meta) written at attempt finish with a replay-idempotent marker, so history survives the 24-hour attempt expiry; each successfully delivered non-inline printable-sheet attachment GET callsPlayEvents::increment()and counts, including repeated still-valid artifact URLs. Share alone is rate-limited and usesincrement_once()with the attempt-token event key and seven-day guard. - privacy: the aggregate and both event counters are registered with the core personal-data exporter and eraser, and the suggested policy text now distinguishes expiring anonymous attempts from retained logged-in aggregates
- new presentation options
question_numbering(numeric / alphabetical / none),answer_marker(circle / square / none),editor_hint;show_question_countnow defaults off. Verified by rendering the print HTML in all three numbering/marker combinations - new player options
sound_default,final_cue(tick / bomb / beep / none),score_animation; per-second escalating final-ten cue, animated score count-up honouring reduced motion - settings: autosave-only with a truthful
savingstate, discrete controls persisting immediately, in-place language switch (no reload), a Clear-to-site-theme control for the starred default, and iconized segmented controls for every new option - builder: two source choices side by side (287 px columns at 1440 px, stacked at 390 px) with the prepared shelf attached, sticky Print/Play dock, wizard-hat Play glyph
- player: compact review affordance gated by answer-key exposure — hover, keyboard focus and click all open it, a second click closes it while focused, Escape closes;
Print scoreandPrint unsolved quizadded - dashboard: real aggregates replace the “not stored” disclaimers (finished plays, printable-sheet downloads, shares, right/wrong, per-administrator activity), submenu reduced to Dashboard and Settings, content-ideas card degrades honestly when AI is off
- user surfaces:
[quizwizz_my_library]and[quizwizz_my_stats]with capability-checked unpublish/delete, a translated sign-in prompt when logged out, published on the bench at/?page_id=865 - Site Editor:
quizwizzpattern category plus five registered patterns; the PDF renderer itself stays server-side and is NOT editable there - brand:
wizard-hatis canonical, the default banner icon and the settings/builder brand mark; the wand remains selectable; the compiledbuild/quiz/index.jswand fallback is the one remaining wand surface and stays untouched - public CSS boundary closed: admin-only families moved to
assets/css/qwizz-admin-responsive.css; the public sheet no longer ships#wpcontentor Settings selectors - cache versioning is source-scoped: 34 enqueue/register calls are covered; 33 call
Plugin::asset_version()and the player enqueue inherits its registered mtime-derived version. The six direct Dashboard/MetaBoxes paths and the public Builder CSS/Player JS paths have cache-enabled warm-cache control/fix captures. Byte-identical mtime-only reinstalls changed each checked?ver=and transferred nonzero fresh bytes. - localization: the bench-installed German catalog is complete in informal Du copy.
de_DEhas a reproducibly compiled.moplus the named script JSON files; all 1,563 active PO/POT entries have non-fuzzy translations. The exhaustive desktop/mobile forced-DE matrix is complete, including the A72 companion inspector. WordPress emitted no separate JSON requests because translations resolve server-side/inline, while the Builder receives its PHP-localized payload; direct MO readback verifiedVeröffentlicht,Entwurf,Besucher, German relative-time plurals, and the Builder profile/Advanced labels.
Retracted 2026-08-19. This measured catalog against catalog. Against installed source the shipped
quizwizz.potis missing 153 msgids and carries 76 obsolete ones (wp i18n make-pot→comm -23/comm -13, 2026-08-19). Parity isopen, notdone. Closed 2026-08-19 — the catalog was regenerated to real source parity (POT 1644 msgids = PO 1644, missing 0 / obsolete 0); see tasklist 2.1.1.
-
PHP/JS
EffectStatemirror restored to byte-identical output, including the empty-id skip -
Evidence:
./scripts/quizwizz-probe.sh --wave all=assertions=30 failures=0after the final install; PHP and JS syntax gates passed; forced-DE public/admin desktop/mobile surfaces had zero horizontal overflow and no console errors; German PO/POT parity is 1,563/1,563; two MO builds matched SHA-256177e17df40db8f8c99ce4c5eb5948d463265b4ec34bebaca0f6cb384f7b2f92d; and public warm-cache versions/transfers are recorded in W8 SSOT capability pass. (historical; the harness is 46 assertions as of 2026-08-19)
Retracted 2026-08-19. This measured catalog against catalog. Against installed source the shipped
quizwizz.potis missing 153 msgids and carries 76 obsolete ones (wp i18n make-pot→comm -23/comm -13, 2026-08-19). Parity isopen, notdone. Closed 2026-08-19 — the catalog was regenerated to real source parity (POT 1644 msgids = PO 1644, missing 0 / obsolete 0); see tasklist 2.1.1.
2026-08-02 frontier reconciliation
The dated delivery list above records what was reported on 2026-07-30; it is not silently rewritten. As of 2026-08-15 the answer review is a direct child of
section.qwizz-player__resultwith a 28 px gap, while the closedMore actionsdisclosure holds only five secondary actions underShare, print and start again. The tiny hover/focus tooltip described in the dated list was never implemented and remains decision-gated. The same list’s “submenu reduced to Dashboard and Settings” decision was reversed on 2026-08-15 because URL and bookmark entry exposed screens that the rail denied existed; see the dated record.
Bench-verified runtime work
| Area | Current truth | Evidence |
|---|---|---|
| Waves 1–4 runtime hardening | F-1, F-2a–d, F-3, F-5, F-7c–f, U-1–U-5 remain bench-verified. | Probe harness; historical findings in full audit |
| Native admin shell | The rail is Dashboard, Quizzes, Questions, Subjects, Settings, and the active screen carries .current. This became true on 2026-08-15: until then normalize_submenu() rebuilt the menu from a two-slug allow-list and rendered only Dashboard and Settings, so this row’s earlier five-item claim was not met. Retired Get Started and Import routes still redirect into the shell. | includes/Admin/AdminMenu.php; 2026-08-15 visual and IA remediation |
| Dashboard architecture | The dashboard is a native ordered document. Its aggregate numbers come from one cached AdminStatistics payload rather than per-screen recounting. | includes/Admin/DashboardPage.php; includes/Admin/AdminStatistics.php |
| Statistics truth policy | Question readiness and undersupplied-pool filters use QuestionIndex-backed cached truth. The UI must not invent unsupported counters. | includes/Admin/AdminStatistics.php; includes/Admin/ListTables.php |
| Settings application | Settings are a semantic document with fragment navigation, search, preview, owner-scoped backups, portability jobs, and a no-script fallback. | includes/Admin/SettingsPage.php; includes/Admin/views/settings-page.php; assets/js/qwizz-admin-settings.js |
| Privacy/runtime safeguards | Privacy policy content, personal-data export/erasure, support-bundle redaction, owner-scoped backups, private portability files, and bounded AI/accounting paths are implemented in source. | includes/Admin/Privacy.php; includes/Admin/SettingsBackup.php; includes/Admin/Portability/{PortabilityController,PortabilityStore,PortabilityRunner,PortabilityImport,PortabilityExport,PortabilityEnvelope}.php; includes/Admin/SiteHealth.php; includes/Ai/* |
| Builder, fine-tune, and outputs | The public builder exposes only the enabled Print and Play outcomes. Visitor density, Start over, review/version, and Exact PDF affordances are gone; step-level Change remains. Fine-tune is an edit-only workspace with undo/redo, and one Print action prepares the current edited/rerolled draft through the same protected artifact path. Consumed artifact IDs, tokens, revisions, and draft data are cleared before any later output. | Cache-disabled Chromium on ?page_id=57; includes/Frontend/views/{builder-view,finetune-editor}.php; assets/js/{qwizz-builder,qwizz-finetune}.js |
| Player mechanics | Timer controls remain. Sound is off by default, activates only from an explicit user action, and includes bounded answer and final-ten-second cues. Quiz-link and score sharing are distinct progressive-enhancement actions. | Full 57-question cache-disabled Chromium playthrough; assets/js/qwizz-player.js; assets/js/qwizz-player-renderer.js |
| Canonical selection and lifecycle | Dynamic and prepared generation share GenerationCriteria, the 20-category validation limit, ExposureSettings count bounds, and QuestionSelector selection/capacity policy. Attempt writes reject expired rows at the compare-and-swap boundary; guest cleanup is one bounded 100-row pass with guarded continuation. | includes/{GenerationCriteria,ExposureSettings,QuestionSelector,AttemptService}.php; includes/Rest/GenerateController.php; includes/Frontend/Craft/CraftService.php |
| Unified uninstall coverage | uninstall.php is a strict registry-backed path, not a degraded discovery fallback: it hard-requires PrivateFiles, Tables, PluginOptions, StateRegistry, Cleanup, SettingsStore, Installer and Capabilities, throws when a prerequisite is unreadable, and delegates to Installer::unschedule_all(), cleanup_tables() and cleanup_operational_options(). StateRegistry owns 15 tables, 27 operational options and 12 scheduled hooks. Measured against the pre-refactor live tables/options/cron hooks, uninstall leaves zero plugin tables, exact operational options, owned transients, qw_ cron hooks, capabilities or role/cap residue on the isolated bench. preserve_on_uninstall keeps authored CPT/taxonomy content plus private-file rows and blob chunks only; runtime state is still removed. | uninstall.php; includes/{Installer,Capabilities}.php; includes/Install/{StateRegistry,Cleanup}.php; includes/Settings/SettingsStore.php; includes/Support/{PrivateFiles,Tables,PluginOptions}.php |
| Structural refactor (Waves 3–6) | AI completions run through one boundary: AiGateway::complete() owns authorization, rate limiting, request bounding, budget reservation, transport, accounting and audit finalization, and it is the only caller of OpenRouterClient::transport(). OpenRouterClient keeps readiness, message/model/provider normalization, transport and provider-envelope normalization; its transport primitives are marked @internal with AiGateway named as the sole sanctioned consumer, and its own missing-key guard is retained and labelled defence in depth. AiResponse owns bounded provider-content extraction, one-MiB limiting, JSON-fence stripping and JSON decoding for Ability (depth 64), batch translation (depth 32) and — since this pass — the guest assistant (depth 32). Guest public errors are unchanged (qw_guest_assistant_provider_shape, qw_guest_assistant_json_shape, qw_guest_assistant_question_count, qw_guest_assistant_question_shape, all 502) and guest shape validation still rejects root lists, extra keys, wrong counts and unsupported fields; the single authorized behavior change is that fenced JSON is now accepted. Operational state is registry-owned (Install/StateRegistry), shortcodes dispatch through Frontend/Shortcodes/ShortcodeRegistry, Craft is split into Frontend/Craft/, and settings CSS is four enqueued era sheets. Current DB schema version is 1.6.7; the dated 1.6.5 and 1.6.6 records elsewhere on this page are historical captures. Accepted deviations from the structural plan: Plugin::localize_block_editor() and qwizzBlockI18n stay because the immutable compiled bundle carries the source literal; Plugin::asset_version() stays as cache-safe mtime versioning; and assets/css/qwizz-admin-stats.css intentionally carries one non-.qwizz-stats rule, giving .qwizz-admin-rail padding-block-start: var( --wp-admin--admin-bar--height, 46px ) below 782 px because WordPress’s fixed mobile admin bar otherwise covered the first metric (390×844 evidence: toolbar bottom 56 px, first metric top 101.1875 px). | includes/Ai/{AiGateway,AiResponse,OpenRouterClient,Ability,BatchTranslate}.php; includes/Rest/GuestAssistantController.php:235-303; includes/Install/StateRegistry.php; includes/Frontend/{Shortcodes,Craft}/; includes/Admin/SettingsPage.php:90-96; the .qwizz-admin-rail rule inside the max-width: 782px block of assets/css/qwizz-admin-stats.css; classmap delta |
| Localization/runtime | One authority — ExposureSettings::available_interface_langs() — drives the interface-language storage sanitizer, REST enum, scripted settings UI, and no-script fallback UI. A forced language is offered only while its complete catalog set (PHP .mo plus every localized script-handle JSON) is readable, so no option can promise a language whose catalogs are absent. On this bench that set resolves to auto, en, and de; fr/es plumbing exists but stays dormant until a product decision ships those locales and their catalogs exist, and a stored-but-unrenderable choice degrades to auto. The current German script inventory now includes the newly generated languages/quizwizz-de_DE-qwizz-block-editor-enhance.json and languages/quizwizz-de_DE-quizwizz-quiz-editor-script.json alongside its other required handle catalogs. | WP-CLI gate/degrade matrix; cache-disabled Chromium settings select; includes/{UiLanguage,ExposureSettings}.php; includes/Rest/SettingsController.php; includes/Admin/views/settings-page.php; languages/quizwizz-de_DE-qwizz-block-editor-enhance.json; languages/quizwizz-de_DE-quizwizz-quiz-editor-script.json |
| WordPress-native token phase | Admin-owned pages carry qwizz-admin; the active wp-admin scheme flows from --wp-admin-theme-color through --qw-brand and --qw-focus. Public site mode inherits the site’s type, colour, and accent without emitting player data-theme; its PDF palette prints light. All migrated live CSS sheets are literal-free (hex/rgb/hsl and --qw-* definitions removed) except canonical assets/css/qwizz-tokens.css. StarterPage’s qwizz-starter-ready notice and feedback markup are now styled by active assets/css/qwizz-admin-dashboard.css; the prior statement that dormant qwizz-admin-starter.css remained intentionally deferred is retired. The orphaned legacy settings sheet is gone: assets/css/qwizz-admin-settings.css (2,911 lines, 59,954 bytes, zero runtime references) was deleted after proving its 2,477 non-blank lines equal the four active era sheets concatenated in enqueue order, and no *.unused.css file exists. The literal-free claim above now holds for every active sheet: the six remaining hex literals in assets/css/qwizz-admin-dashboard.css moved into a .qwizz-dashboard-scoped semantic feedback block in assets/css/qwizz-tokens.css (--qw-good-bg, --qw-good-ink, --qw-bad-bg, --qw-bad-ink) with every rendered value unchanged. | Cache-disabled Chromium and source review; settings, subjects, question editor, and portability roots stayed visible without document horizontal overflow at 1600, 782, and 390 px. |
| Theme options and action contrast | qw_exposure_settings enables site, light, dark, retro, and cyber; theme_default is site; nested themes.site is {on:true,def:true}. Existing published quizzes may retain their stored qw_experience.pdf_theme; those per-quiz presentation values were intentionally not migrated. An arbitrary inherited accent is not used as a filled-control background: public actions use --qw-action-bg / --qw-action-ink, explicit data-theme players preserve their palette action pair, and forced-colors overrides explicit palette tokens. | With Twenty Twenty-Five #FFEE58, inherited-player action contrast measured 18.88:1 and derived cards were opaque; CDP forced-colors emulation resolved explicit players to CanvasText/Canvas/LinkText. |
Release inputs absent from this SSOT archive
releaseEligible: false is the live WRDP boundary. This tree is the QuizWizz SSOT archive; the named inputs below are absent here and cannot be inferred from generated/live artifacts. The full tiered inventory is the open work ledger.
| Blocker | Constraint |
|---|---|
| Git history and immutable commit absent | No .git exists at plugin or repo root, so no commit can anchor release provenance; the archive cannot cite an immutable source revision. |
Locked build/sign tooling absent (tools/ suite, package-lock.json, composer.lock) | Signed ZIPs, deterministic builds, SBOM/provenance regeneration, and release packaging need tools/build-release.py, tools/build-source-archive.py, tools/verify-release.sh, tools/sign-release.sh, tools/compare-releases.py, tools/toolchain.json, and the two lockfiles — none present. Inventing digests, locks, or approvals here would be fabricated provenance and is prohibited. |
| Built / vendored artifacts | vendor/ and provenance/ must never be hand-edited; vendor/composer/ lacks installed.json, so the dependency graph cannot be reconstructed. build/quiz/ is readable unminified source that stays unedited; the sanctioned route to change editor behaviour is a companion editor script. |
No CI configuration in tree (.github/ absent) | CI-backed WordPress/PHP support claims, Tested up to, versioning, and release metadata cannot be produced without a workflow definition. |
| Localization release inputs | The current POT/PO/MO/JSON files prove German runtime behavior in this SSOT tree; they are not release authorization. Release authorization still requires the authentic release policy, build/sign scripts, locks, immutable history, and approval objects absent here. |
Runtime changes have no gate to pass — tools/quality-gate.sh, tests/, phpunit.xml, phpcs.xml are absent | Every PHP/CSS/JS change is installed directly into this tree. With no test suite, lint config, or quality gate in the archive, correctness rests on bench probes and browser evidence alone until those inputs exist. |
Gutenberg disposition
A70 is measured and core-owned; A71/A73/A77 are repaired and verified through the companion script/stylesheet while build/ remains unedited. A72 is implemented in source under the owner-approved Craft contract through registered attributes/defaults plus the companion inspector and browser-verified for inspector controls, canvas geometry/token behavior, live Builder, Player result actions, server clamp, and cleanup. A reproducible block-bundle rebuild additionally needs the missing src/ and Node lock/toolchain.
Architecture, operations, and privacy notes
Architecture
AdminStatisticsis the one authoritative cached admin statistics payload; dashboard and readiness UI consume it instead of recounting content ad hoc.QuestionIndexis the authority for usable-question and undersupplied-pool truth.- Portability exports, translation jobs, settings backups, and private temporary artifacts are modeled as bounded jobs or owner-scoped records rather than loose filesystem residue; portability ownership is split across
includes/Admin/Portability/{PortabilityController,PortabilityStore,PortabilityRunner,PortabilityImport,PortabilityExport,PortabilityEnvelope}.php. - The current architecture snapshot is historical on purpose: see architecture map. Current status changes belong here, not by rewriting that snapshot.
Operations
- WRDP is the QuizWizz SSOT archive and verification environment, not a plugin release target.
- The shell probe harness is authoritative for service, HTTP, database, cleanup, non-disclosure, portability REST and job lifecycle, owner-scoped quiz unpublish/delete, password and embed access, attempt resume/retry and site-ceiling behavior, category projection, list-table subject retrieval, the durable Library fixture, and paired source-token/copy contracts: see probe harness. Current Option F full run: TAP
1..46,46 pass/0 fail. - Cache-disabled Chromium evidence in the dated record and the 2026-08-17 durable browser gate is authoritative for rendered admin/player behavior and geometry that the shell harness does not cover. Current Option F browser gate passed twice consecutively at
30/30withoverallPass=true, zero console/page errors, and Settings restored10→11→10. - Operational Option F gates are green on the bench: health
7/7, backup/home/loca/backups/wrdp/20260817T070900Z, restore drill4/4, scratch DB count0, debug log38,416→38,417with the sole new event a WordPress-corehtml_entity_decodedeprecation, and the last known wiki check-only input count51with328artifacts. These observations prove only the WRDP bench gate. - Public launch remains
NO-GO: PW-01, legal/operator values, off-host backup/alerting/image policy, production debug posture, canonical repository/commit, lockfiles, CI, provenance, SBOM, signing, and protected release compare stay owner or canonical-release inputs. No production publish, deploy, or release claim for the plugin is implied by any page in this vault.
Privacy
- QuizWizz registers privacy-policy guidance, exporter/eraser hooks, owner-scoped retention paths, and a 30-day metadata-only AI audit in source.
- Portability exports include authored taxonomy/questions/quizzes plus sanitized settings, not attempts, users, prompts, transcripts, raw guest identifiers, or AI audit history.
- Signed-in AI remains explicit opt-in. The guest substrate is additionally gated by an off-by-default switch, zero-default separate budget, rate, API key, exact model, exact provider endpoint, forced data-collection denial, and zero-data-retention routing.
- Anonymous protection relies on cookie-bound pseudonymous controls rather than advertising or cross-site tracking; guest prompt text reaches OpenRouter only after every readiness gate passes.
Resolution ledger: historical rows
Relocated 2026-08-19 from the masterplan; the masterplan keeps the blocked(release inputs) rows. Status vocabulary: done · verified · open · blocked(<what>) · retracted.
| ID | Status | Current note |
|---|---|---|
| FE-1 | done | Primary-button fill restored; historical fix persists. |
| FE-2 | retracted | Theme/layout interaction, not a plugin defect. |
| FE-3 | retracted | Focus-visible coverage already existed. |
| FE-4 | retracted | Accent discipline claim against the plugin was incorrect. |
| FE-6 | done | Settings density/IA remediation landed historically and remains part of current source. |
| FE-7 | retracted | Native WordPress table hierarchy already handled the concern. |
| FE-8 | done | Reduced-motion-safe player spinner persists. |
| BE-3 | done | Dead RateLimiter::allow() removal persists. |
| BE-7 | done | Dead QUIZWIZZ_VER alias removal persists. |
| F-1 | verified | Empty banner path returns 404 before MIME detection; public/private cache paths preserved. |
| F-2a | verified | Service-layer create/update capability boundaries enforced. |
| F-2b | verified | Authorship derived or preserved; spoofing denied. |
| F-2c | verified | QuizAccess::can_read() gates experience reads. |
| F-2d | verified | Attempt start independently validates quiz access. |
| F-3 | verified | Settings backups are owner-scoped with indistinguishable 404s. |
| F-4 | retracted | Original mPDF remote-resource claim was wrong; the retained boundary probe still matters. |
| F-5 | verified | Shared exact SVG contract covers root and descendants. |
| F-6 | verified | Existing import validation boundary is the right one; no MIME gate added. |
| F-7a | verified | Backfill cursor race remains low-risk and lock-guarded. |
| F-7b | verified | Non-CSPRNG shuffle concern remains non-actionable for this use. |
| F-7c | verified | Dead count_query() removal persists. |
| F-7d | verified | Misleading indentation fix persists without behavior change. |
| F-7e | verified | Delegated copy handler persists for dynamic controls. |
| F-7f | verified | Legacy explanation fallback naming and precedence fix persist. |
| U-1 | verified | Quiz-specific fallback suppresses generic byline while theme overrides still win. |
| U-2 | verified | Timer controls remain responsive without clipping. |
| U-3 | verified | WordPress JS plural catalog resolves the verified player cases. |
| U-4 | verified | Canonical score/total/percentage render at completion. |
| U-5 | verified | ”See results” now leads to an honest summary. |
| U-6 | verified | English starter content inside de_DE chrome is a bench fixture, not a plugin defect. |
| U-7 | verified | Settings IA remains a positive regression gate, not an open defect. |
| U-8 | verified | Guest playthrough remains a positive regression gate. |
| U-9 | verified | The static-front-page content duplicated the theme-provided h1. Removing that content heading restored exactly one h1 while retaining its CTA content at desktop and 390 px; see the 2026-07-31 W6 sweep. |
| D1 | done | Step-title/CTA hierarchy work landed historically and remains part of current source. |
| D2 | retracted | Editor entry was already gated and labeled. |
| D3 | done | Canonical violet token unification persists. |
| D4 | retracted | Builder one-column / scent complaint was stale. |
| D5 | verified | Shared values converge; intentionally different player theme naming remains acceptable. |
| D6 | done | Appearance workspace and related density/gating work landed historically. |
| D7 | done | Metric hierarchy remediation landed historically. |
| D8 | done | Reduced-motion-safe subject-card lift persists. |
| D9 | done | Enriched unavailable state persists. |
| D10 | done | Comfortable/compact density control remains the accepted implementation of the intent. |
| V-1 | verified | The stranded admin-only responsive rules were moved into the active Settings stylesheet. |
| V-2 | verified — release inputs still owed by the owner | Visual truth pass is complete: 80 leads dispositioned, 15 source-owned defects repaired, A70/A71/A72/A73/A77 closed in W8 with browser evidence, and unsupported claims corrected. Reproducible build/release inputs remain absent. |
| W9-01 | verified | Evidence drift was repaired: the probe page now distinguishes the 2026-08-02 clean 30-assertion run from the retained 2026-07-30 historical run, and nine historical design pages explicitly defer current status to source, probes, backlog, and this masterplan. |
| W9-02 | done | The forced-German and localization-residue rows are closed by the W8 matrix and catalog parity proof. Dormant fr/es remain a separately named product/release decision rather than a German-completeness defect. |
| W9-03 | verified | Cache-disabled 2026-08-02 Settings verification found all nine sections simultaneously rendered and visible, with slim anchors, search, Undo, and Redo. Source bounds both history stacks at 30 and wires Cmd/Ctrl+Z. |
| W9-04 | verified | With PDF allowed and editor hidden, the live builder exposed Print without Edit, loaded no fine-tune assets/modal, made one protected request, and returned a 200 application/pdf attachment. The serialized option snapshot was restored byte-identically and the editor path returned. |
| W9-05 | verified | The builder’s outcome container measured fixed at the viewport bottom, the first source click exposed Print/Play immediately, and Fine-tune exposed the delivered edit/reorder/replace/duplicate/add/remove/history controls. Unspecified option expansion, distractor hot-swap, crossing-out, and toggle redesign remain decision-gated product work. |
| W9-06 | verified | This historical reconciliation is superseded by W10-07: the answer review is now a direct child of section.qwizz-player__result with a 28 px gap, and More actions contains only five secondary actions. The historical tiny hover/focus-tooltip contract is an owner decision outside the completed W10 work. |
| W9-08 | verified | Help fusion, replacement onboarding copy, a distinct test mode, broader Site Editor ownership, wholesale WordPress-component adoption, and a public conversational AI wizard lack accepted contracts. They are decision-gated, not confirmed bench defects. |
| W10-01 | verified | Public Builder ReferenceError fixed: maximumCount restored to the shared-context destructure (assets/js/qwizz-builder-controls.js:6-8). Main-world probe measured 0 uncaught errors, 3 count-preset pills, 5 .qwizz-pill and 97 controls in .qwizz-builder__form, against a pre-fix baseline of 1 error, 0 presets, 2 pills and 40 controls. |
| W10-02 | verified | Backup Delete now reads destructive: the never-matching [data-backup-delete] selectors became button.is-danger, and .qwizz-backup__actions form:has(.is-danger) adds 12 px so Download to Restore stays 4 px while Restore to Delete becomes 16 px. Ten owner-visible rows measured the --qw-bad red control at rgb(214, 54, 56). |
| W10-03 | verified | WCAG 1.4.10 reflow repaired on the single-quiz route through grid-template-columns:minmax(0,1fr) plus .qwizz-single-quiz>.qwizz-player{width:100%;overflow-wrap:anywhere}. At 320×720 with a real question rendered, scrollWidth equals clientWidth at 320 with zero overflowing descendants; the pre-fix measurement was 336 against 320. |
| W10-04 | verified | Admin navigation restored: add_pages() registers the Subjects row under Capabilities::MANAGE_TAXONOMIES, and normalize_submenu() orders rows by matcher closures instead of a two-slug allow-list. Five rows render and the active screen carries .current. This reverses the 2026-07-30 two-row submenu decision; see the dated record. |
| W10-05 | verified | Attempts are no longer started without a gesture: QuizEmbed::render() takes bool $autostart = false, emits data-autostart and data-title, and non-autostart players render a Start quiz intro; only templates/single-qw_quiz.php opts in. The archive rendered 8 players and 8 intros with 0 passive /quiz/<id>/start requests; one click produced exactly one request to the measured /quiz/99/start route and one persisted attempt, while the dedicated single-quiz page autostarted. |
| W10-06 | verified | The advance control has its label back: is-icon has no producer or consumer left in the plugin, and the live German control rendered Nächste Frage from source English Next question at 200×48 with one 20×20 glyph and no duplicate aria-label or title. The sound toggle’s state-neutral accessible name remained live German Ton before and after toggle, from source English Sound, while aria-pressed alone carried state. |
| W10-07 | verified | The answer review left the More actions disclosure: it is a direct child of section.qwizz-player__result with a 28 px gap at desktop and mobile, the disclosure holds exactly the five secondary actions under the summary Share, print and start again, and the result-print profile excludes the review. |
| W10-08 | verified | Plugin-owned sub-24 px targets were raised across the Dashboard, Stats, Settings and responsive sheets; WordPress core row-action geometry was deliberately left alone. Exact scans found no sub-24 px plugin-owned targets at 1280×900 or 390×900; all four .qwizz-shortcode-copy code controls measured 24 px high at both viewports, against the earlier unresolved 538×23 census. |
Open perfection frontier
The W10 visual and IA repairs are closed as bench-verified. PW-02 is now closed by 2026-08-17 rendered Builder H1 evidence. The preserved itemized frontier preserves historical contracts rather than presenting them as pending remediation. Remaining action belongs to canonical owners: PW-01 policy, operator/legal content completion, explicitly accepted product decisions or fixtures requiring owner-created bench configuration, and the release, build, provenance, CI, and approval inputs absent from this archive.
The durable service and public-launch ownership record lives at 🧭 Open work ledger. It preserves the no-marketplace/private-one-site boundary and the standing regression-hunt contract without converting a standing hunt into an unresolved defect.
References
- 🧪 Probe harness — executable runtime contract, durable browser-smoke pointer, current
1..46shell result, and authority boundary - 2026-08-17 launch readiness — Option F green gates, PW-02 closure, NO-GO decision, and owner/canonical blockers
- Owner decision intake — required PW-01, legal/operator, operations, image, and canonical release-owner answers
- Current source preservation — 218-file installed-byte manifest with
0 added,0 removed,2 changedsince the prior baseline - 🩺 2026-08-15 visual and IA remediation — fourteen-slice visual audit and the eight measured repairs it authorized
- 🧩 Wave 6A classmap delta — release-owner handoff: the four stale
QuizWizz\*classmap keys whose mapped targets are absent - 🗺️ Open work ledger — tiered capability inventory: W8-closed Tier 1, decision-gated Tier 2, and named missing-input/infrastructure boundaries
- ✅ Post-remediation visual audit — measured visual truth with retained gaps disclosed
- 📋 Visual triage ledger — per-lead disposition, including retained block defects
- 🧭 2026-07-31 W8 SSOT capability pass — current measured standing-discovery, localization, Gutenberg, cache, and cleanup record
- 🧪 2026-07-31 W6 regression sweep — historical U-9 and earlier standing-discovery record
- 🔬 2026-07-27 Full Plugin Audit — historical full re-audit
- 🗺️ Architecture map — historical static source snapshot
- ✨ Design remediation record — historical design program
- 🩹 Code patch spec · 🩹 Design patch spec · 🩹 Settings handoff — historical handoff artifacts, not planning authority
- release boundary of record:
releaseEligible: false - supersedes as status authority: earlier remediation plans, status callouts, and landing-page summaries