🗂️ 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_attempts and 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. Schema 1.6.7 migrated 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 reported assertions=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 h1 and 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_id plus index; authenticated attempts store the real user id, guests stay 0
  • durable per-user aggregate (qwizz_user_stats user 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 calls PlayEvents::increment() and counts, including repeated still-valid artifact URLs. Share alone is rate-limited and uses increment_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_count now 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 saving state, 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 score and Print unsolved quiz added
  • 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: quizwizz pattern category plus five registered patterns; the PDF renderer itself stays server-side and is NOT editable there
  • brand: wizard-hat is canonical, the default banner icon and the settings/builder brand mark; the wand remains selectable; the compiled build/quiz/index.js wand 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 #wpcontent or 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_DE has a reproducibly compiled .mo plus 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 verified Verö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.pot is missing 153 msgids and carries 76 obsolete ones (wp i18n make-potcomm -23 / comm -13, 2026-08-19). Parity is open, not done. 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 EffectState mirror restored to byte-identical output, including the empty-id skip

  • Evidence: ./scripts/quizwizz-probe.sh --wave all = assertions=30 failures=0 after 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-256 177e17df40db8f8c99ce4c5eb5948d463265b4ec34bebaca0f6cb384f7b2f92d; 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.pot is missing 153 msgids and carries 76 obsolete ones (wp i18n make-potcomm -23 / comm -13, 2026-08-19). Parity is open, not done. 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__result with a 28 px gap, while the closed More actions disclosure holds only five secondary actions under Share, 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

AreaCurrent truthEvidence
Waves 1–4 runtime hardeningF-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 shellThe 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 architectureThe 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 policyQuestion 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 applicationSettings 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 safeguardsPrivacy 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 outputsThe 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 mechanicsTimer 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 lifecycleDynamic 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 coverageuninstall.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/runtimeOne 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 phaseAdmin-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 contrastqw_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.

BlockerConstraint
Git history and immutable commit absentNo .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 artifactsvendor/ 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 inputsThe 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 absentEvery 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

  • AdminStatistics is the one authoritative cached admin statistics payload; dashboard and readiness UI consume it instead of recounting content ad hoc.
  • QuestionIndex is 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/30 with overallPass=true, zero console/page errors, and Settings restored 10→11→10.
  • Operational Option F gates are green on the bench: health 7/7, backup /home/loca/backups/wrdp/20260817T070900Z, restore drill 4/4, scratch DB count 0, debug log 38,416→38,417 with the sole new event a WordPress-core html_entity_decode deprecation, and the last known wiki check-only input count 51 with 328 artifacts. 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.

IDStatusCurrent note
FE-1donePrimary-button fill restored; historical fix persists.
FE-2retractedTheme/layout interaction, not a plugin defect.
FE-3retractedFocus-visible coverage already existed.
FE-4retractedAccent discipline claim against the plugin was incorrect.
FE-6doneSettings density/IA remediation landed historically and remains part of current source.
FE-7retractedNative WordPress table hierarchy already handled the concern.
FE-8doneReduced-motion-safe player spinner persists.
BE-3doneDead RateLimiter::allow() removal persists.
BE-7doneDead QUIZWIZZ_VER alias removal persists.
F-1verifiedEmpty banner path returns 404 before MIME detection; public/private cache paths preserved.
F-2averifiedService-layer create/update capability boundaries enforced.
F-2bverifiedAuthorship derived or preserved; spoofing denied.
F-2cverifiedQuizAccess::can_read() gates experience reads.
F-2dverifiedAttempt start independently validates quiz access.
F-3verifiedSettings backups are owner-scoped with indistinguishable 404s.
F-4retractedOriginal mPDF remote-resource claim was wrong; the retained boundary probe still matters.
F-5verifiedShared exact SVG contract covers root and descendants.
F-6verifiedExisting import validation boundary is the right one; no MIME gate added.
F-7averifiedBackfill cursor race remains low-risk and lock-guarded.
F-7bverifiedNon-CSPRNG shuffle concern remains non-actionable for this use.
F-7cverifiedDead count_query() removal persists.
F-7dverifiedMisleading indentation fix persists without behavior change.
F-7everifiedDelegated copy handler persists for dynamic controls.
F-7fverifiedLegacy explanation fallback naming and precedence fix persist.
U-1verifiedQuiz-specific fallback suppresses generic byline while theme overrides still win.
U-2verifiedTimer controls remain responsive without clipping.
U-3verifiedWordPress JS plural catalog resolves the verified player cases.
U-4verifiedCanonical score/total/percentage render at completion.
U-5verified”See results” now leads to an honest summary.
U-6verifiedEnglish starter content inside de_DE chrome is a bench fixture, not a plugin defect.
U-7verifiedSettings IA remains a positive regression gate, not an open defect.
U-8verifiedGuest playthrough remains a positive regression gate.
U-9verifiedThe 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.
D1doneStep-title/CTA hierarchy work landed historically and remains part of current source.
D2retractedEditor entry was already gated and labeled.
D3doneCanonical violet token unification persists.
D4retractedBuilder one-column / scent complaint was stale.
D5verifiedShared values converge; intentionally different player theme naming remains acceptable.
D6doneAppearance workspace and related density/gating work landed historically.
D7doneMetric hierarchy remediation landed historically.
D8doneReduced-motion-safe subject-card lift persists.
D9doneEnriched unavailable state persists.
D10doneComfortable/compact density control remains the accepted implementation of the intent.
V-1verifiedThe stranded admin-only responsive rules were moved into the active Settings stylesheet.
V-2verified — release inputs still owed by the ownerVisual 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-01verifiedEvidence 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-02doneThe 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-03verifiedCache-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-04verifiedWith 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-05verifiedThe 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-06verifiedThis 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-08verifiedHelp 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-01verifiedPublic 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-02verifiedBackup 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-03verifiedWCAG 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-04verifiedAdmin 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-05verifiedAttempts 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-06verifiedThe 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-07verifiedThe 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-08verifiedPlugin-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


  • release boundary of record: releaseEligible: false
  • supersedes as status authority: earlier remediation plans, status callouts, and landing-page summaries