V-Sekai Fire Deck Log — 2026-04-25 (Saturday)
Date: 2026-04-25
Backdated from multiplayer-fabric/CHANGELOG.md [0.2.0] through [0.5.0] — all four releases shipped on the same day.
Added
- taskweft HRR property tests (67 properties) — all green after fixes
Taskweft.Test.DBHelpers— auto-detectsmultiplayer-fabric-hosting/certs/crdb/TLS certs; replaces hardcodedsslmode=disableURL in all three prop test files- Module-level Postgrex pool in each prop test module (
setup_all) — eliminates per-forall-iteration TLS connection overhead that caused 60 s ExUnit timeouts during PropCheck shrinking - Zone backend
/api/v1prefix moved into Phoenix router (scope "/api/v1"); Caddy no longer strips the prefix. 6/6 QA tests green on production - Playwright tests:
wt_browser.spec.ts— browser WebTransport datagram echo PASS 1.4 sgodot_web_init.spec.ts— threaded wasm64 engine loads PASS 1.1 sgodot_wt_e2e.spec.ts— Godot web export WebTransportPeer end-to-end datagram echo PASS 3.3 s (4 C++ bugs fixed to reach green)
operator_camera.gd— 2.5D top-down operator camera with twist/swing [0, 1] per axis (Survey mode: Q/E snap, scroll zoom, WASD pan; Follow mode: Blue Archive smooth entity tracking). Input actions added toproject.godot. See20260425-operator-camera-2-5d.mdwindow.__camera_stateexported viaJavaScriptBridge.eval()for Playwright inspection without a full Godot web build- Playwright operator camera test (
operator_camera.spec.ts) — Layer 1 JS simulation 7/7 pass; Layer 2 Godot web export test scaffolded (skipped until export built) WasmEquiv.lean—vm_deterministicproves compile-once libriscv VM correctness across native and Emscripten WASM hosts- ADRs: Three.js WebGPU observer (Stage 1), Three.js player (Stage 2), dual-client test, headless test matrix, build cache pipeline, CRIS scoring, jellyfish game, jellyfish pass condition, operator overlay, operator camera
headless_log_observer.gd— corrected default port to UDP 7443; added--host,--port,--dump-json,--framesCLI flags. Exit 0 on entities received, exit 1 on timeoutfabric_client.gd—send_player_input(cmd, pos, extra)generic CH_PLAYER write path. Default port corrected to 7443observer.tscn—XROrigin3D+XRCamera3D+ left/rightXRController3Dadded; port corrected to 7443fabric_player_xr.gd— OpenXR initialisation with silent desktop fallbacktest_operator_camera.gd— headless quaternion unit tests (4/4 pass): downward look, 90° twist, swing elevation constant, equivalence to old Euler hierarchyheadless_go.spec.ts— Playwright Phase 1 GO spec; spawnsgodot --headlessobserver and assertsentities.length > 0from--dump-jsonoutputheadless_tests.yml— GitHub Actions workflow scaffolding for GO branch protection check (requires full Docker Compose stack to pass)- ADRs: Godot native headless observer (
20260425-godot-observer.md), Godot native PCVR player (20260425-godot-player.md). Supersede Three.js ADRs - Lean proofs (
multiplayer-fabric-taskweft/lean/):ZoneProtocol(port assignment, 100-byte packet layout),ZoneObserver(exit semantics, step monotonicity),ZonePlayer(CH_PLAYER cmd distinctness, camera swing invariant across all operator inputs)
Changed
- Client strategy: Godot wasm32/wasm64 web export dropped. Two clients replace it — Godot native PCVR (VR + entity control) and Three.js WebGPU (browser observer + WebXR). See
20260425-threejs-observer.md observer.tscn—SpectatorRigreplaced byOperatorRigwithoperator_camera.gd;StatusHUDre-parented to new camera pathoperator_camera.gd— swing-twist orientation now built as a singleQuaternion(twist_q * swing_q) onCameraPivotinstead of Euler angles split across pivot and arm.SpringArm3Dcarries no rotation- Client strategy updated: Three.js ADRs superseded by Godot native observer and player. Three.js browser client moved to SOMEDAY
runner.yml—always()added todocker-imagesandheadless-testsso sibling job failures (android, ios, etc.) do not skip themgitassembly— checkpointedmultiplayer-fabricstage to start from remote HEAD; reassembled and pushed viaupdate_godot_v_sekai.exs
Fixed
Storage.query_all/3—Enum.map(nil, ...)crash on DML statements (INSERT/UPDATE/DELETE returnrows: nilin Postgrex). Fixed withrows || []- Four transaction rollback tests —
raise "rollback"insiderescue _ -> :okcommitted instead of rolling back. Fixed withPostgrex.rollback(conn, :rollback) references.bib— non-ASCII bytes (en dashes, smart quotes, invalid Win-1252 sequences) replaced with ASCII equivalents_server_path_callback— preferp_path_app_ctxoverp_stream_ctx->path_callback_ctx(proved by Leanfixed_sctxtheorem)wt_server_demo.gd— mirror received packet’stransfer_modebeforeput_packet(default RELIABLE routed echo to streams; datagrams need UNRELIABLE)transport_peer.spec.tsshape mismatch:data.zones→data.shards- Zone registration:
last_put_aton create,created_atfield fix, PubSub rescue in zone controller - Caddyfile: added
handle /socket/*reverse proxy; socket path was 404 gesconsalias updated:threads=yes arch=wasm64to match GHA web buildquic_picoquic_backend.cpp:589—SESSION_H3_SETTINGSreference after the enum value was removed in the WebTransport audit (6feefaf0b9)- WebTransport audit fixes: datagram reader exclusive-lock bug (new reader per iteration → single reader reuse);
incomingqueue mutex for picoquic cross-thread safety;SESSION_H3_SETTINGSdead state removed fromSessionState quic_web_glue.js— Lean 4 proofs (WebTransport.lean) for state machine acyclicity, queue discipline, and reader exclusivity invariantoperator_camera.gd—deltaparameter bug in_apply_swing_twist(was usingget_process_delta_time()instead of passeddelta)multiplayer-fabric-godotlocal branches — tracking corrected fromorigin/masterto their ownorigin/feat/*remotesmultiplayer-fabric-baselocal — reset toorigin/multiplayer-fabric-base(local was stale reassembly beforescu_build=yesfixes were applied)- Stale stashes dropped from
multiplayer-fabric-godot(libriscv Win32 files already committed; openvr mode-change noise; empty archived-branch stash)
Security
- Rotated Cloudflare Turnstile keys (were plaintext in
.env)