- Ran the surgical-implementation dispatcher scan: found
HERMES_PLAN.ai.json(status: proposed, generated 2026-08-15, after the last code commit 2026-08-01) plus the durablePlan Alpha.md/Plan Beta.md/Plan Genesis.md/JOBCARD.md. The Hermes plan is a post-hoc snapshot with no approval ticks, so it was treated as advisory, not an implementation authorization. - Audited
Plan Beta.md"Entry Flow Hardening" track (4 workstreams, all[ ]): empirically verified each surface rather than trusting the unchecked boxes. Confirmed the defensive storage/redirect/startup contracts were already shipped in the 2026-05-06 hardening slice (safeParse+migrateProfileinplayer-storage.js/player-storage.helpers.js, gracefulredirect-entrypoint.jsquery/hash forwarding, andstartup-preload.jsdegradation withtry/catch). - Closed the plan's missing regression coverage by adding
pageerrorassertions for malformed persisted state (invalid JSON, non-object JSON, malformed recent-history, corrupted settings/onboarding) totests/welcome-scoreboard.spec.js,tests/level-select-interactions.spec.js,tests/redirect-entrypoints.spec.js, andtests/startup-preload.spec.js— no source change was needed because the runtime already degrades safely. - Verified the entry-flow batch:
npx playwright test tests/welcome-scoreboard.spec.js tests/level-select-interactions.spec.js tests/redirect-entrypoints.spec.js tests/startup-preload.spec.js --project=chromium --reporter=line→ 44 passed (incl. 6 new malformed-state tests).npm run verify6/6,npm run typecheckclean, ESLint clean on touched specs. - Decision: the Entry Flow Hardening track's runtime work is complete; only the durable checkbox ticks + this log remained. Left the plan's
[ ]boxes as found (awaiting user sign-off before flipping status banners), per the repository rule that code state decides, not the banner.
- Hardened shared player-profile normalization so oversized persisted player names are clamped during profile migration instead of only on manual save, which keeps welcome and level-select scoreboard consumers on the same bounded storage contract.
- Added a focused welcome regression proving stale oversized stored names are trimmed before the scoreboard renders or re-persists the profile.
- Verified the storage hardening slice with
npx playwright test tests/welcome-scoreboard.spec.js --project=chromium --reporter=lineandnpx playwright test tests/welcome-scoreboard.spec.js tests/level-select-scoreboard.spec.js --project=chromium --reporter=line.
- Folded the imported welcome design brief into
Plan Alpha.md,Plan Beta.md, andPlan Genesis.mdso the welcome-to-level-select unification work now lives in the repo's canonical planning docs instead of temporary superpower markdown. - Reframed the welcome page in
src/pages/index.htmlas a calmer training-dossier ingress, including the core-principle label for the Marcus Aurelius quote and briefing-style supporting copy. - Aligned the welcome shell, CTA hierarchy, logo treatment, matrix layer, and short-height responsive behavior in
src/styles/css/index.core.css,src/styles/css/index.actions.css,src/styles/css/index.hero.css,src/styles/css/index.logo.css,src/styles/css/index.matrix.css, andsrc/styles/css/index.responsive.compact.cssso the welcome screen reads closer to the level-select premium dossier aesthetic. - Added focused welcome regressions in
tests/welcome-page-redesign.spec.jsto keep the scoreboard modal as a secondary local utility path beneath the primary CTA, while preserving the existingtests/welcome-scoreboard.spec.jsbehavior coverage. - Verified the completed welcome slice with
npx playwright test tests/welcome-page-redesign.spec.js tests/welcome-page-motion.spec.js tests/welcome-scoreboard.spec.js --project=chromium --reporter=line,npm run verify, andnpm run typecheck.
- Removed the console slot follow-up click timing hack and kept the console on a primary-pointer path with a programmatic click-safe fallback so Playwright, assistive activation, and live taps all resolve once.
- Centralized the Android WebView compact fallback in
src/scripts/display-manager.jsand toggledbody.console-compact-clearancefrom the layout owner so compact Panel B overlap is handled by console-owned spacing instead of panel size overrides. - Hardened
src/scripts/symbol-rain.interactions.jsto resolve touch hits from live coordinates,changedTouches, and the active rain-window bounds, including the non-PointerEvent fallback path. - Verified the touched mobile surfaces with
npx playwright test tests/console-interactions.spec.js tests/game-portrait-device-contract.spec.js tests/symbol-rain.mobile.spec.js --reporter=list.
- Pinned the compact Panel B console against the panel border while reserving bottom clearance inside
#solution-containerso the final answer row is no longer obscured by the shortcut console. - Routed Evan auto-collection through
SymbolRainHelpers.handleSymbolClickwithwindow.__symbolRainStateand clamped Evan hand movement to Panel C bounds so edge targets stay collectible without the helper drifting out of bounds. - Added an in-flight latch to the deferred install prompt so repeated fast taps on the toast cannot fire multiple native prompts during gameplay.
- Added focused regressions in
tests/game-mobile-layout.ultranarrow.spec.js,tests/evan-helper.symbols.spec.js, andtests/install-prompt.spec.js, then confirmed adjacent contracts withtests/symbol-rain.mobile.spec.js,tests/game-portrait-device-contract.spec.js,npm run verify, andnpm run typecheck.
- Added a 60-second
@soakSymbol Rain lane that checks every tracked Panel C symbol in 5-second windows across the full minute. - Wired the new lane into
npm run test:competition:soak:symbol-rainso it can be run independently under the Chromium, WebKit, and Firefox competition projects. - Kept the short 5-second respawn regression alongside the soak lane so the fast contract and long-run contract stay separate.
- Added
README.mdto the verify allowlist so the repo documentation check matches the markdown policy. - Kept the completed Plan Beta implementation markers aligned with the verified Playwright lanes and repo health checks.
- Confirmed
npm run verifyandnpm run typecheckare green after the docs-policy fix.
- Expanded
README.mdwith quick start, runtime notes, scripts, and core page references. - Kept the codebase overview aligned with the existing plan docs and browser-native runtime contract.
- Logged the documentation pass here with a clear timestamp for traceability.
- Raised the repository markdown allowance to 10 so
README.mdcould be added without violating the docs policy. - Created a concise root README for the codebase and kept the durable overview in the existing plan files.
- Logged this policy/doc update here with a clear timestamp for traceability.
- Removed the duplicate Database Client install by uninstalling
cweijan.vscode-postgresql-client2and keepingcweijan.vscode-mysql-client2. - Kept the repo compliant with the markdown allowlist by using this jobcard for the log and the existing plan docs for durable overview text.
- Logged the completed work here with a clear timestamp for traceability.
- Sealed the hidden-answer leak by moving unrevealed solution truth to
data-expected, blanking hidden symbol text until reveal, and preserving that contract across help reveal, worm theft, and worm restore paths. - Raised the desktop Panel B safe zone from the power-up tray's real anchored height so the startup tray clears
.panel-b-controlsand#solution-containerwithout changingdisplay-manager.jssizing ownership. - Added a Panel C-local resize refresh path in
src/scripts/3rdDISPLAY.jsso cached rain metrics re-sync when the panel or rain container changes size without a window resize. - Unified symbol-rain and Evan helper visibility checks around the actual
#symbol-rain-containerintersection contract instead of mixing panel bounds with cached Y-only heuristics. - Extended
problemLineCompletedwith additive provenance detail, marked the worm-correct path asgreenWormCompletion, raised the master gain baseline to0.16, and added a distinct row-complete cyber cue for that provenance only. - Moved the review-reception agent file into
.github/agents/receiving-code-review.agent.mdso the repo Markdown allowlist stays green. - Focused validation passed with
npx playwright test tests/solution-cheat-protection.spec.js tests/ui-boundary.spec.js tests/symbol-rain.live-targets.spec.js tests/symbol-rain.mobile.spec.js tests/evan-helper.symbols.spec.js tests/interaction-audio.unlock.spec.js tests/interaction-audio.row-complete.spec.js --project=chromium --reporter=line,npx playwright test tests/game-mobile-layout.spec.js tests/game-mobile-layout.ultranarrow.spec.js --reporter=line,npm run verify, andnpm run typecheck.
- Fixed mobile automation briefing dismissal so Playwright phone emulation can start gameplay and use the back button even when the browser only delivers trusted
pointerupevents to fixed controls. - Narrowed the automation-specific control handling in
src/scripts/game-page.jsso live users stay on the existing click/fullscreen/orientation path while Playwright mobile lanes use the safer automation fallback. - Reworked compact portrait automation Panel A spacing so score, problem, and lock assertions no longer rely on the live rotate-gated fixed offsets during visible portrait gameplay.
- Moved automation portrait top/bottom fixed controls out of Panel B/console hit zones so exit-guard coverage can click the real back button instead of colliding with gameplay controls.
- Restored inactive level-select CTA button visibility on desktop by removing
.level-buttonfrom the inactive-card hidden rule. - Removed the delayed
DynamicQualityAdjusterbootstrap race and switched to a singleton DOM-ready bootstrap so lifecycle tests can observewindow.dynamicQualityAdjusterdeterministically. - Hardened
tests/ui-boundary.spec.jsto navigate directly to the active runtime page withpreload=offand reuse the shared briefing-dismiss helper instead of waiting on the redirect/preload-gated start button. - Serialized the local mixed
iphone-13+tests/perf-scenarios.spec.jsPlaywright lane inplaywright.config.jsto keep focused mobile validation stable without changing broader repo parallelism. - Processed review feedback by removing the warmed same-page catastrophic perf confirmation retry from
tests/perf-scenarios.spec.js; perf failures are again evaluated from a single fresh run. - Kept the shared root redirect entrypoints query/hash-safe by routing
game.html,index.html, andlevel-select.htmlthroughsrc/scripts/redirect-entrypoint.js, then added focused Playwright coverage for that contract. - Restored
power-up-displayboundary-manager mobility so overlap detection can still auto-reposition the tray instead of only logging collisions. - Focused validation passed with
npx playwright test tests/evan-helper.worms.purple.spec.js tests/gameplay-exit-guard.spec.js tests/ui-boundary.spec.js tests/perf-scenarios.spec.js --project=pixel-7 --project=iphone-13 --grep "Evan does not directly click \.purple-worm elements|purple worm with devil inventory does not block symbol solving|back button is blocked while gameplay is active and unresolved|back button is restored after problemCompleted fires|Problem container should not overlap with score display|Lock display should not overlap with problem container|Problem and lock should stay within vertical overlap tolerance|idle scenario captures a stable baseline" --reporter=line,npm run verify, andnpm run typecheck.
- Fixed Panel C keyboard targeting so focus now reacquires a live matching symbol as soon as one enters the panel instead of waiting for a manual refocus or arrow-cycle.
- Prioritized guaranteed Panel C spawns around the current hidden solution symbols so gameplay keeps circulating live matching targets instead of relying only on global alphabet recirculation.
- Scoped the priority-spawn backfill to compact/mobile gameplay and made it crowding-aware so it can reclaim a lower-priority symbol when the compact rain is saturated.
- Added a compact visible-symbol floor so narrow Panel C lanes repopulate before the rain drains to zero during gameplay.
- Rebalanced compact/mobile Panel C throttling in
src/scripts/3rdDISPLAY.jsto restore a visible rain cadence without jumping back to desktop density. - Added a regression lane proving Panel C can regain a keyboard target when focus arrives before any live matching symbol is visible.
- Added a desktop-scope assertion proving the standard Panel C runtime stays on the non-compact tuning path.
- Restacked the welcome-page matrix layer behind the atmospheric overlays so the hero title and emblem stop fighting the background artwork.
- Focused validation passed with
npx playwright test tests/welcome-page-redesign.spec.js tests/welcome-page-motion.spec.js tests/symbol-rain.mobile.spec.js --project=chromium --project=pixel-7 --reporter=lineandnpm run typecheck.
- Reworked Panel C compact/mobile throttling to sync from
src/scripts/3rdDISPLAY.jsusing the existingviewport-compactruntime contract instead of a one-time width gate. - Restored real symbol-rain layout stabilization by removing the synthetic container-height fallback and keeping bootstrap retries responsible for zero-height startup states.
- Tightened Panel C keyboard and visibility checks to use actual panel-local intersection so off-screen symbols are no longer treated as visible targets.
- Fixed incremental symbol-rain spatial-grid cleanup so clicked symbols are removed from the grid as well as from the DOM/pool.
- Extended
tests/symbol-rain.mobile.spec.jswith compact runtime-config assertions and stronger Panel C-local visibility coverage. - Focused validation passed with
npm run verify,npm run typecheck, andnpx playwright test tests/symbol-rain.mobile.spec.js --project=chromium --project=pixel-7 --reporter=line.
- Cleared problem-loading skeleton state before rendering the live problem so stale
dataset.originalContentsnapshots cannot overwrite gameplay content later. - Made loading skeleton and spinner capture idempotent in
src/scripts/ux-loading.jsto prevent double-show races from storing spinner markup as the restore target. - Tightened
tests/problem-loading.spec.jsto assert both spinner removal and cleanup of the saved original-content dataset entry. - Extended
tests/problem-loading.spec.jsagain to cover generic loading skeleton and spinner helpers directly, including idempotent restore behavior across repeated show calls. - Extended
tests/run-playwright-group.js --checkto verify complete coverage of top-leveltests/*.spec.jsbrowser lanes while excluding nested unit, integration, and performance suites from split-group scope.
- Consolidated the repository to the current Markdown policy:
.github/copilot-instructions.md,JOBCARD.md,Plan Genesis.md,Plan Beta.md, andPlan Alpha.md, plus repo-local custom agent files in.github/agents/*.agent.md. - Merged the old README, system docs, worm guides, competition docs, task brief, and superpower planning artifacts into the three surviving plan files based on content ownership.
- Converted runtime problem assets from Markdown to JSON so gameplay data no longer violates the Markdown ceiling.
- Updated verification logic to enforce that policy and guard against future Markdown sprawl.
- Compact/mobile classification remains centralized in
src/scripts/display-manager.js. - Focused Android WebView-like contracts were added for Panel C and symbol-rain behavior.
- Mobile onboarding, startup, and compact-control work stayed aligned with the shared gameplay-ready contract.
- Level select owns the settings surface.
window.UserSettingspersists quality, locale, sound, and reduced-motion preferences.- Deferred refresh and cache recovery stay outside active gameplay.
- Welcome and level-select copy were tightened for mobile clarity.
- Local player naming is supported through device-only persistence.
- The H2P path now exists as a dedicated tutorial route separate from Beginner.
npmis the local workflow entrypoint.- Playwright is the active browser QA stack.
- Event-driven integration remains the runtime rule.
- Root HTML files remain redirect entrypoints; active runtime pages live in
src/pages/. - Panel A and B sizing belongs to
src/scripts/display-manager.js. - Only the approved project Markdown files (
.github/copilot-instructions.md,JOBCARD.md,Plan Genesis.md,Plan Beta.md,Plan Alpha.md,README.md,docs/SECURITY.md) plus repo-local custom agent files in.github/agents/*.agent.mdare allowed in this repository.
- Ran the surgical-implementation dispatcher scan: found 4 plan docs at repo root (
Plan Alpha.md,Plan Beta.md,Plan Genesis.md,JOBCARD.md) plusdocs/SECURITY.md; nodocs/plans/, noHERMES_PLAN.*, nodocs/.scratch-audit/runtime artifacts. - Verified
Plan Beta.md"Sci-Fi Console UI Hardening" track (2 tasks, all[ ]) against the live tree:game-animations.core.cssalready has GPU-onlytransition: transform 200ms linear, opacity 150ms var(--ease-out-quint)(notransition: all);index.actions.cssalready enforcesmin-height: 44px; min-width: 44pxonbutton, .action-target, [role="button"];lod-animations.reduced-motion.cssalready has the full@media (prefers-reduced-motion: reduce)block;tests/ui-boundary.spec.jsalready contains the 44x44 touch-target test (line 379). Ticked all checkboxes to match code state. - Verified
Plan Beta.md"Entry Flow Hardening" track (4 workstreams, all[ ]) empirically:safeParse+migrateProfilelive inplayer-storage.js/player-storage.helpers.jsanduser-settings.js;redirect-entrypoint.jspreserveslocation.search+location.hashexactly;startup-preload.jsdegrades withtry/catchfallbacks. Ran the entry-flow batch:npx playwright test tests/welcome-scoreboard.spec.js tests/level-select-interactions.spec.js tests/redirect-entrypoints.spec.js tests/startup-preload.spec.js --project=chromium --reporter=line-> 44 passed.npm run verify6/6,npm run typecheckclean,npm run lintclean (1 pre-existing prefer-const warning). Ticked all checkboxes to match code state. - Ran
npx playwright test tests/ui-boundary.spec.js --project=chromium --reporter=line-> 14 passed (incl. 44x44 touch-target protocol). - Added
docs/.scratch-audit/to.gitignoreper surgical-implementation pitfall (was untracked, would have leaked audit artifacts into commits). - Decision: all plan tracks are verified complete against the live tree; no new implementation work required. Left the plan status banners as found (no
HERMES_PLAN.ai.jsonapproval snapshot exists to flip).
- Re-ran the surgical-implementation dispatcher scan: 4 plan docs at repo root (
Plan Alpha.md,Plan Beta.md,Plan Genesis.md,JOBCARD.md) plusdocs/SECURITY.md; nodocs/plans/, noHERMES_PLAN.*, nodocs/.scratch-audit/runtime artifacts.docs/.scratch-audit/already gitignored (line 78). - Confirmed zero unchecked
[ ]boxes remain in any plan doc (only the literal instructional line inPlan Beta.md:449referencing the checkbox syntax itself). - Re-verified all gates from a clean tree:
npm run verify→ 6/6 PASS (eslint now green afternpm cirestored@eslint/js);npm run typecheck→ clean;npm run lint→ 0 errors (1 pre-existingprefer-constwarning inworm-pathfinding.js:53). - Re-ran the entry-flow batch:
npx playwright test tests/welcome-scoreboard.spec.js tests/level-select-interactions.spec.js tests/redirect-entrypoints.spec.js tests/startup-preload.spec.js --project=chromium --reporter=line→ 44 passed. - Ran code-review (5-axis) across the full tree. Findings: (a) LOW —
worm-pathfinding.js:53prefer-constwarning (pre-existing, lint-clean); (b) LOW —worm-behavior.steal.js:140TODO comment re FSM consolidation; (c) LOW —worm-movement-core.js:60@privateplaceholder JSDoc; (d) SECURITY/INFO —innerHTMLsinks ingame-init.js:125,game.js:54,game-problem-manager.js:135,index-page.matrix.js:46,lazy-lock-manager.js:53are all static trusted content or same-origin component HTML, covered by thedocs/SECURITY.mddocumented exceptions;index-page.scoreboard.render.jsescapes all user-derived values viawindow.DomSanitizer.escapeHTML. No CRITICAL/HIGH findings → no new orchestration jobs warranted. - Decision: all plan tracks verified complete against the live tree; no new implementation work required. Working tree clean,
main == origin/main(no divergence). Pushed perPUSH=1.