Player interface recovery audit #
Date: 2026-09-09. Status: implementation integrated with automated correction evidence; human acceptance pending, not usability certification. Current final results and explicit matrix limits: player-interface-validation.md. The chronological ledger below retains earlier failures and intermediate measurements; the validation ledger supersedes its pending statuses. Authority is the operator-approved player-interface recovery plan. Shared worker/API contract: player-interface-contract.md.
Evidence baseline #
Pre-repair source inspection established the defects below. Line references refer to the pre-repair working tree and will move during implementation. Existing uncommitted edits to Entry, core light, scene/shade/tests and renderer docs are preserved as evaluation baseline, not accepted visual certification. playtest-data is not modified by this work. Historical passing worker tests are not current integrated evidence. The supplied prior screenshot showed tactical Z9 while the player was on Z8; it did not establish current perspective colors or a terminal fault. Rust language-server initialization failed during planning and again on execution; targeted source reads are the fallback.
| Severity | Baseline evidence | Observable defect | Acceptance mapping |
|---|---|---|---|
| High | app.rs 306–317, 582–590, 1330–1340 | M/Tab one-way, no FP yaw/pitch, chase level gaze; cannot orient and return coherently | AC2–4 |
| High | backend.rs 107–170; keymap.rs 172–188 | Mouse coordinates discarded, drag toggles, no genuine look path | AC2 |
| High | app.rs 1243–1263, 1292–1328 | Up/Down change map slices; modal/screen/camera can disagree | AC2–3 |
| High | camera.rs 120–139; worldgen/runtime.rs 1168–1173 | Chase lacks look-at/collision; new view +X instead of road north | AC4 |
| High | scene.rs 123–239 | Brightest half replaces other half; entity coordinates ignore camera basis and clamp to border | AC5 |
| High | scene.rs 171–183; shade.rs 149–181 | Hit/miss silhouette becomes discarded infinity; only right neighbor used | AC5 |
| High | entry.rs 1095–1125, 1334–1347 | Actors only, alive mistaken for illumination; ASCII may erase role glyphs | AC6 |
| High | entry.rs 754–815 | Terminal dimensions captured once; no production Resize lifecycle | AC8 |
| Medium | ansi.rs 115–126 | Incorrect ANSI256 cube; no documented no-color bold | AC7 |
| High evidence gap | Entry test decoder 1494–1559 and existing PTY helpers | SGR ignored; glyph/hash/coverage tests do not prove colors or orientation; alleged loot fixture contains no real loot | AC1,6,7,10 |
Approved behavior (not evidence of implementation) #
Perspective movement is camera-relative; canonical replay/headless world-direction actions remain unchanged. Tab toggles FP/chase; M toggles playable north-up tactical; modes preserve their angles. x enters keyboard spatial look outside inventory. Look movement rotates/tilts, 0 resets; optional dedicated tilt/slice/recenter bindings do not inject keys into legacy files. Tactical movement is permitted only on player floor. Story tactical pauses between actions; Classic remains live. New/load presentation initially faces north without saved simulation changes.
Geometry retains upper/lower samples until packing; entities use shared camera projection and independent player-eye light/LOS eligibility. Camera rotation cannot reveal occluded actors via chase or map. Ground piles and authored active-location service/connector access points use actual authoritative IDs. No persistent reveal-memory policy is added. Range is fixed at 48m for this repair, not adaptive tiers.
Deferred boundaries and affected modules #
hexwork-core::light, State light ownership/cache anddocs/lantern-fuel-scope.md: ordinary position synchronization exists; dirty-only cache invalidation and lights[0] ownership remain risks. No save/light semantics silently changed here.hexwork-render::shade, palette and scene: existing exposure convention is provisional art direction, not proof of linear-authored assets. Source warmth provenance remains missing; zero light must remain dark.- Entry/scene: snapshot threading, adaptive quality and complete allocation elimination are not delivered by this scope. Measure render+encode costs; do not infer 60fps from unit tests.
- UI/worldgen: complete sound overlays, animation, directional lantern/fuel, full town art and accessibility certification remain outside this recovery.
Evidence ledger #
- Shared contract authored; disjoint term, App/Session, renderer and PTY implementations integrated into Entry. No change to canonical event tags.
cargo +stable test --locked -p hexwork-term: 62 passed (worker). Independent Python VT fixtures: 7 passed (worker). Initial renderer tranche: 99 passed (worker; subsequent review fixes still need gates). Nine named App camera/movement tests passed; selected exact restore/lifecycle regressions passed after fixture migration.- Parent
cargo +stable check --locked -p hexwork-cli: passed after fixing missing Input import; vendor bincode lifetime warnings separate from then-present new dead-code warnings (subsequently cleaned). - Parent
cargo +stable test --locked -p hexwork-core light:: --lib: 7 passed. - Parent Entry regression group: 26 passed / 15 failed on the initial integrated source. Obsolete keymap/camera/slice assumptions and physical-vs-canonical lifecycle routes under investigation; not a passing gate.
- Initial production timing test (stable opt1 with assertions/overflow checks enabled, seed140, 10 warmups + 100 samples, FP/chase, full truecolor): 80×24 median4.349ms/p956.042ms; 120×36 median9.932ms/p9512.891ms. Includes derived light, descriptors, gamma and encode; excludes terminal flush and App snapshot/catalog collection. Allocations unmeasured and known per-frame BTreeMap/Vec work remains. Source was changing concurrently; rerun on frozen release before performance acceptance.
- Independent read-only review found center-ray collision and entity footprint/packing defects, plus palette/ASCII/bounds gaps. Fixed with expanded-voxel sweep, validated own-column FP fallback, same-ray rectangular billboard intersections, visible-sample semantic anchors with partner terrain background, four-neighbor joins, shared palette role colors/ASCII twins and pre-DDA bounds clipping. Follow-up renderer suite:111 passed (worker), including oblique mixed-half and blocked-head fixtures. Fully blocked invalid actor columns cannot furnish a safe eye; fallback is finite/deterministic without world mutation. Session move/transition admission requires both body and head air (
session.rs::check_passable), independently of stance. - Four actual production-adapter semantic fixtures pass, including a real canonical Drop and real item ID; catalog service/exit projection uses genuine catalog anchors in explicitly synthetic clear geometry, not a walked service route. Nonplayer light and LOS must succeed on the same sample; player self-marker is the stated exception.
- Fresh executable PTY tranches passed10 physical cases: Story truecolor/indexed/no-color, Classic no-color, frozen legacy remaps, mouse/focus/90° camera-relative movement, seed0 truecolor, seed140 no-color, forced-ASCII truecolor and actual second-process resumed Story. Six-case decoded JSON/SVG exports are under opt-in
target/player-interface-evidence. Final naming changed after export; frozen re-run pending. Story perspective intentionally retains wall-clock ticks: PTY purity isolates paused tactical tick/hash equality and camera-only history/player-location equality rather than attributing elapsed-time ticks to camera actions. - New
terminal_color_referencetarget:2 passed (worker), independently decoding actual production full/diff encoder bytes with literal RGB/indexed/bold/reset oracles and lit/dark semantic scenes across six palettes/three modes. It is a subprocess byte-stream oracle, not a real PTY allocation despite the named test. Handcrafted line/half-color inputs certify encoding, not world illumination; CLI gamma matrix remains separate. - Metadata-derived partition auditor passed:13 command partitions covered the targets at that checkpoint (a new independent terminal-color oracle target requires re-audit). Non-CLI all-targets partition passed after renderer fixes. Routes and CLI bin partitions passed. Phase11 partition initial44pass/5fail: four stale centered-eye expectations, one old feedback PTY timeout; scoped migration underway. Old Contracts PTY hit bounded capture limit; old script synchronization/control migration underway, limits unchanged. Final independent state/input review found no actionable defect after confirming fixed north-up map vs legacy canonical direction naming; read-only review is not a test pass.
- Release binary identification and AC10
manual_normal_brightness_orientation_route: pending human execution. SVG and automated contrast are diagnostics only, not terminal font/monitor certification.
Do not close docs06 readability/orbit/collision/accessibility claims solely from historical hashes, brightness coverage or local worker reports. Append exact current commands, binary identity, test outcomes, benchmark conditions and manual pass/fail when obtained. Overall HEXWORK 1.0 remains a separate unfinished goal.