# Playable comparison

Serve the repository and open `/authoring/playable-benchmark/`. This source authoring tool runs one actual `createRun` / `stepRun` simulation through native `attachInput` and two independent `BoardPainter` instances. The second pane defaults to the approved FPV appearance with reduced effects. Both panes share the exact run; switching presentation cannot change movement, collisions, pressure, captures or results.

The current queryless Solo resolver chooses the route. The bounded cohort resolves `first-return`, `return-in-reserve` and `crossed-bands` from that exact source at standard difficulty. Before `createRun`, the benchmark applies the same pure `resolveGameplayTuning('standard')` / `applyGameplayTuning` path as ordinary fresh Solo play, exactly once. Retry reuses the owned effective level; personal admin overrides and saved preferences are not read. The page separates the authored mission revision/simulation identity and artwork pin from `setup.runtimeRevision`, `runtimeLevelIdentity` and the resolved tuning version. The level hash identifies the effective level, not a full run or cryptographic artwork pin. The original artwork loads through `acquireCandidatePicture`, which verifies byte length, digest, dimensions and decode before accepting a replacement. The reference always uses the same approved FPV lease and Journey identity adapter as the ordinary default view; the separate appearance pin shows its loaded revisions. Actor appearance goes through the renderer's dedicated option, preserving the mission scene palette and original. A failure leaves the previous run paused and visible. No procedural substitute is admitted for a missing original or approved actor lease. Artwork metadata's candidate review status is preserved; this tool grants no art or publication approval.

In **Mission setup → Craft**, select one of the seven existing classes. A change prepares a fresh real run; Retry retains that accepted class. The three current missions are authored Arcade missions: Boost, E/ability and R/pickup remain disabled by their rules for every class. The inactive Boost control and shortcut hint are hidden. This route does not manufacture equipment-enabled versions.

In **Mission setup → Second view**, explicitly choose the source-only **reference-v3** body-detail study, **reference-v4** battery-contrast study, or **reference-v5** optical-body study, each at native 32 px, native 64 px, or the renderer's automatic treatment. The approved appearance remains the default. **V6** adds all seven native class pairs; earlier studies remain Scout-only. Each named cohort loads only after selection:

- **V3:** `authoring/library/fpv-body-detail-candidates/manifest.json`; three fingerprinted construction modules (`rotor-body-detail-art.mjs`, `rotor-candidate-art.mjs`, `pixel-art.mjs` under `game/presentation/`). Its retained manifest describes Scout and Carrier; this option fetches only the two Scout PNGs.
- **V4:** `authoring/library/fpv-body-contrast-candidates/manifest.json`; the same three modules plus `rotor-body-contrast-art.mjs`. Its manifest contains exactly two Scout PNGs: **288 + 550 = 838 encoded bytes**. V4 composes the immutable v3 native recipe and changes only central battery-face colours. The old source, PNGs and manifest remain exact.

- **V5:** `authoring/library/fpv-body-optical-candidates/manifest.json`; the v3 construction modules plus `rotor-body-optical-art.mjs`. Its two Scout PNGs total **295 + 573 = 868 encoded bytes**. V5 broadens central equipment while retaining the camera, arms, motors, outer occupied bounds and moving-part rig. Earlier studies remain exact.

**V6:** `authoring/library/fpv-body-roster-candidates/manifest.json` is pinned by its exact SHA-256 `49c0ff40b5107eafe39b65a827339608b11b2a534d8a96767617c90b68651535`. Its fourteen native PNGs total6,240 bytes. The loader validates all records and five construction sources, then fetches only the selected class’s pair. The new roster recipe composes retained V5 Scout and V3 Carrier sources; those earlier bytes remain exact.

All four manifests use `revealline.rotor-body-detail-candidates.v1` and `source-candidate-not-runtime-default`, with separate construction and asset identities. The loader bounds the requests, verifies exact PNG lengths and SHA-256 hashes, checks header and decoded dimensions, validates the asset records, and requires the original reference-v2 pivot, hub positions, radii, blade counts, phases and directions. V4 also retains v3's occupied bounds and every silhouette pixel. It displays the observed manifest hash and candidate provenance separately from the approved appearance pin. A frozen image-only wrapper changes only the selected class’s two slots (Scout only for V3–V5); all other actors delegate to the approved lease. The runtime renderer supplies the moving rotors. No registry, source PNG, mission binding or approved pin is changed. The current full-board observation is that v4's amber face is brighter, but its slim central silhouette remains weak at small play sizes. Neither brighter pixels nor successful loading establish art approval.

Candidate selection pauses the run and clears steering. Its previous accepted comparison stays visible through verification; failures, cancellation and stale results cannot replace it. Cancel returns to its visible Craft, Mission, Load or Actors opener; otherwise it uses the native setup summary or enabled Start/Resume without opening details or overriding unrelated focus. Resume is explicit. Retry retains the accepted comparison and resets its visual phase with the reference. Selecting approved actors releases candidate images; scene replacement and final departure do the same. Reduced effects is independent of body choice. The comparison-only **Capture pulse** and **Extra event flashes** toggles control those named accents; threat, active trail, contact, local loss, recovery and result information remain. They do not add audio, haptics or new simulation mechanics.

Batch 6 adds **Mission setup → Second view → Contact outline → Fine outline study** as an explicit comparison option. It narrows only the dark backing stroke from 3 to 2 in each renderer's existing units; the bright line keeps its existing width, and the complete circle's true centre, radius and foreground position stay unchanged. Solo uses logical renderer widths, so its 3/2 backing and 1-unit bright line scale with the board. Team divides by the CSS cell size, giving a 3/2 CSS-pixel backing and a 1 CSS-pixel bright line. The two paths do not imply the same physical stroke width. In this playable page the option affects only the second painter. The reference and production style default retain **Standard**. Changing the option pauses, clears steering and resets measurements without advancing the run; Resume is explicit and Retry retains the selected outline. Unknown style values fall back to Standard. This is an opt-in source study, not a saved player setting or production approval.

The accompanying prepared-Team correction draws its contact circle once in the final foreground pass. It removes the later duplicate filled centre dot that covered the prepared body and cue; the separate pilot identity badge and exact contact radius remain. This intentionally corrects Team's default prepared rendering as well as the optional style. Legacy fallback actors keep their existing contact drawing.

The existing outcome status now changes on meaningful core events. A `player.failed` event supplies its actual cause to the shared localized reason/tip helper; an ordinary life loss describes recovery within the current attempt. `player.respawned` replaces that explanation with a recovery confirmation, and `cells.claimed` replaces it with the captured-cell count and current reveal percentage when available. `run.completed` takes precedence over other events in its batch: a win remains a win even if the core retains an earlier failure cause, and a terminal loss offers Retry instead of promising recovery. Unknown causes receive fixed plain advice; raw cause codes are not displayed. Empty or unrelated batches leave the message alone, and unchanged text is not rewritten each tick. These messages use the one existing outcome status node and add no control, focus, timing, audio, haptic or storage behavior.

Start, Pause, Retry, native keyboard steering/boost, the default D-pad, an explicit optional canvas Swipe mode and the existing basic gamepad input reader operate the real core. Continuous steering and the input reader's fresh-gesture checks are retained. Terminal results announce once and offer Retry focus after 600 ms only if focus still belongs to the same play control. Intervening navigation cancels the focus offer. A deliberate fresh Retry press/release recreates the same mission and seed with the accepted class/immediate turns, resets both painters' visual phase, and clears held controls. Its 600 ms ready cue advances no simulation, then starts automatically; held steering still requires release and a fresh press. Pause cancels the cue. A long browser frame pauses instead of skipping simulation time. Hiding/departing cancels pending work and the RAF. BFCache return remains paused with one RAF; final departure releases the original picture, approved actor lease, painters and input listeners. This isolated host imports no profile, awards, save or replay recorder and writes no persistent/session storage. Locale initialization may read the existing language preference.

The authored six-second [feedback sequence](../game-feel-lab/) remains a separate diagnostic. This playable comparison does not replace a campaign, saved attempt, recorded replay, player setting or artwork binding. Workshop, Poltava and Synevyr artwork directions are future candidates, not the displayed mission originals. Full product shell, settings, audio/haptics, physical-device controls and player-study acceptance remain separate.

The distribution explicitly includes four candidate manifests, six historical Scout PNGs, fourteen V6 roster PNGs and all six fingerprinted construction modules. The candidate files and rotor study modules remain optional Workshop tooling, with no expansion of any mode's core closure. The shared pixel-art module was already a core dependency. Packaging makes the optional study usable in the shipped tool; it does not register or approve the candidate as a runtime appearance. Only the fourteen named V6 PNGs and its manifest are added by this batch; generated concept images are not added.

On small viewports the single-view layout preserves the complete primary board and touch controls. The optional second view is a review layout and may require scrolling; it is not a two-board handheld layout qualification.

**Local performance comparison** is an opt-in, in-memory diagnostic. Enable **Measure active play** to keep a rolling window of at most 120 active-play frame intervals, with p50/p95/worst intervals and synchronous JavaScript draw durations for each painter. Both painters still run when the second pane is hidden. The intervals include the complete two-view host and browser scheduling; draw CPU measures submission only, not GPU completion, end-to-end latency or the ordinary game's FPS. No universal performance score is inferred.

Pauses, loading, the ready cue and background suspension end the timing segment; the first interval on return is omitted. Appearance, effects, size and setup changes reset the window, as does **Reset measurements**. Nothing is stored or transmitted. Candidate memory lists encoded PNG bytes separately from a **20,480-byte lower-bound RGBA payload** for both retained 32×32 and 64×64 images, even when one native treatment is forced. The estimate excludes shared/approved images, mission artwork, browser decoders, canvas backing stores, GPU copies and other overhead; those costs remain unknown, not zero.

Serve the complete repository or distribution with these original mission assets available. A Workshop tooling download alone does not certify the three missions or their original artwork for offline use; this tool does not promote those assets into the core offline pack.

Focused checks: `node --test game/test/playable-benchmark*.test.mjs game/test/playable-roster-*.test.mjs game/test/retry-view.test.mjs`. They exercise the actual standard-difficulty missions at `FIXED_DT = 1/120`, including capture/win, actual self-contact/loss and deterministic Retry. Effective Standard fixtures now assert pursuit warning/commit/capture at ticks 121/211/267 and interception at 289/379/413. Each locks its core target through real turns and cancels on capture; extending the same opening instead produces a carrier trail-impact loss at tick 365 or 466. A carrier may already be cooling down while its travelling impact remains hazardous. These deterministic paired routes prove available counterplay, not a human ability to perceive or execute it. A separate comparison with the ordinary source attempt preparer verifies all three initial runs, 240 ticks per mission and retained Retry state. Outcome tests run a real failure → recovery → nonterminal capture sequence, a later win with a retained failure cause, and exhausted lives; ordinary ticks emit no message. Host tests exercise native D-pad/swipe input, fresh steering/confirmation gates, delayed focus ownership, the ready cue, event-driven status writes and the comparison-only outline choice. Resource tests verify the actual approved release transport, original/candidate digest checks, source fingerprints, geometry compatibility, visual phase reset, replacement rollback, cancellation, stale decode disposal and final release. A modeled canvas/decode host invokes the real BoardPainter for all thirteen approved/v3/v4/v5/v6 comparison choices (104 modeled draw combinations) at compact/desktop widths, standard/reduced effects and paused/running poses, preserving the original backdrop, contact radius and core checkpoint. The focused host checks also cover cancellation return targets and finite local measurement/reset boundaries. These source tests are not native browser pixel decoding, visual acceptance or human-play evidence. Full-board browser review remains necessary before any proposed production adoption.

The separate [foreground contact raster study](../../docs/verification/rotor-motion/contact.html) compares Standard and Fine outline through the actual Solo and Team painters on frozen synthetic checkpoints. It inspects full-circle geometry, foreground order, bright-line contribution, omitted-style versus explicit-Standard raster identity and changes confined to the contact region at native size, including edges and actor overlap. That default-style comparison does not claim byte identity with Team's earlier duplicate-dot rendering. No simulation ticks or playable controls run in that page; its synthetic field colours are contrast fixtures, not the displayed mission originals. Its calibrated Solo 24px fixture is explicitly distinct from a default gameplay size. Those static raster checks complement this playable benchmark's real mission events; they do not establish counterplay, human readability, physical-device performance or production acceptance.

The **reference-v5 optical body** study preserves the v4/v3 global frame and
moving-part rig while widening the central equipment. Its native 32/64 PNGs total
868 bytes; both decoded images still have a 20,480-byte RGBA payload lower bound.
V5 fingerprints its optical recipe, retained v3 detail recipe, original candidate
rig source and palette source. Earlier v2–v4 studies remain exact. At gameplay
scale the wider battery is more prominent, but the required foreground contact
ring still overlaps it: do not hide that cue merely to improve an art screenshot.
The [native-size comparison](../../docs/verification/rotor-motion/optical.html)
shows v4/v5 at 20/24/32px through both painters. Render evidence is separate from
production approval, retained-presentation admission and physical-device review.

## Effective gameplay correction (batch 7)

Earlier batch 1–6 benchmark traces used the authored level without the fresh-play tuning step. Preserve those observations as **untuned authored-level evidence**; they are not ordinary Standard gameplay or public balance qualification. For example, the old First Return down route completed at tick 414; the corrected Standard route completes at tick 469 with the same 816 cells, 8,160 points and three lives. Earlier visual/asset checks retain their stated scope. Batch 7 evidence records the corrected effective runtime and historical-versus-current distinction.

During local browser verification, a reused origin briefly combined a fresh host module with an older cached session module. The missing setup identity exposed the mismatch. Accepted evidence uses a fresh local origin with `Cache-Control: no-store` and checks the displayed runtime identity before play. Slow asset decoding also must not replace loading status with a misleading pause notice: long-frame notices are emitted only when an active run or ready cue was actually interrupted.

## Seven-class adoption review (batch15)

The [batch15 evidence](../../docs/verification/actor-batch-15/README.md) records127 focused passes, all-seven native loading, one real Carrier completion/Retry and bounded responsive observations. These extend A2 current-character review; C2’s formal human study stays last. Class-specific equipment is not exercised by these steering-only missions. No body is newly approved or registered by this tool.
