<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>V-Sekai Fire — Manuals</title>
<link>https://v-sekai-fire.github.io/manuals/changelog.html</link>
<atom:link href="https://v-sekai-fire.github.io/manuals/changelog.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.9.37</generator>
<lastBuildDate>Thu, 07 May 2026 13:27:30 GMT</lastBuildDate>
<item>
  <title></title>
  <link>https://v-sekai-fire.github.io/manuals/changelog/2026/20260507-deck-log.html</link>
  <description><![CDATA[ 





<section id="v-sekai-fire-deck-log-2026-05-07-thursday" class="level1">
<h1>V-Sekai Fire Deck Log — 2026-05-07 (Thursday)</h1>
<p>Date: 2026-05-07</p>
<section id="added" class="level2">
<h2 class="anchored" data-anchor-id="added">Added</h2>
<ul>
<li>Maglev cycle 0 (infra) <strong>verified pass</strong> — all 4 pass criteria confirmed against the live Fly API via the <code>verify_fly_state</code> workflow on <code>infra</code>. Gateway machine <code>e7845e1ef35768</code> started + IPv4 <code>213.188.205.180</code>; CRDB volume <code>crdb_data</code> 10GB iad attached; uro deploy succeeded; mTLS secrets present</li>
<li>Maglev cycle 1 (gateway handshake) <strong>verified pass</strong> — <code>cycle-tests/cycle-1-gateway-handshake/cycle1.gd</code> completes a real-internet WebTransport/QUIC handshake against <code>gateway.chibifire.com:443</code>, sends a ping datagram, receives the gateway’s pong reply (~880 ms round-trip), exits 0</li>
<li>New repo <code>cycle-tests</code> — minimal headless Godot <code>SceneTree</code> per cycle that exercises pass criteria against live infrastructure; registered as submodule</li>
<li>New repo <code>multiplayer-fabric-godot-maglev</code> — canonical engine source for the build repo’s <code>git subrepo</code>, holding the assembled <code>multiplayer-fabric-base</code> and <code>multiplayer-fabric</code> branches</li>
<li><code>observability</code> registered as submodule (previously missing — only ADRs existed)</li>
<li>Cycle 2 producer-side OTel export wired in three apps: gateway (<code>gateway.dispatch</code> span around <code>Gateway.Router.handle/1</code>), uro (auto-instrumented Phoenix + Ecto via <code>:opentelemetry_phoenix</code> + <code>:opentelemetry_ecto</code>), zone (engine’s <code>module_open_telemetry</code> initialized in bootstrapped <code>project/main.gd</code>); all ship to <code>observability.internal:4318</code></li>
<li>Bootstrapped zone Godot project — <code>project/project.godot</code> + <code>project/main.gd</code> (the directory was an empty stub before)</li>
<li><code>master</code> branch on <code>godot</code> pinned to merge-base <code>835e2dcbba</code> so future assemblies start from a stable upstream point</li>
<li>10 single-topic feature branches replacing the kitchen-sink <code>feat/engine-patches</code>: <code>feat/engine-misc</code>, <code>feat/tapered-capsule-shape</code>, <code>feat/crypto-extensions</code>, <code>feat/predictive-bvh</code>, <code>feat/uds-test-stability</code>, <code>feat/misc-cleanup</code>, <code>feat/lint-cleanup</code>, <code>feat/ci-fixes</code>, <code>feat/agents-docs</code>, <code>feat/fork-scaffolding</code> (last is now unused)</li>
<li>Read-only verification workflows on <code>infra</code>: <code>verify_fly_state.yml</code>, <code>start_fly_apps.yml</code>, <code>verify_observability.yml</code> — query Fly + Victoria* APIs and upload state as JSON artifacts so cycle verification doesn’t depend on log scraping or local flyctl auth</li>
</ul>
</section>
<section id="changed" class="level2">
<h2 class="anchored" data-anchor-id="changed">Changed</h2>
<ul>
<li><code>build/godot/.gitrepo</code> switched source from <code>godot @ multiplayer-fabric</code> (vendored via stale pinned SHA) to <code>multiplayer-fabric-godot-maglev @ multiplayer-fabric-base</code> (canonical assembled output)</li>
<li><code>build</code> test workflows consolidated: 6 per-feature-branch <code>test-*.yaml</code> files → one <code>test-feature-branches.yaml</code> with <code>{branch, platform}</code> matrix (396 → 73 lines)</li>
<li>Baker + zone GHCR Godot binary builders now track <code>build/main</code> instead of stale pinned commit <code>b27142e94c</code> — picks up engine updates on next cron tick or <code>workflow_dispatch</code></li>
<li><code>docker</code> zone-fabric image switched from Mono Godot (with <code>GodotSharp</code> + .NET 8 runtime) to non-Mono GDScript build (<code>precision=double</code>); matches the assembled engine</li>
<li>Branch protection on <code>godot/multiplayer-fabric</code> removed so <code>update_godot_v_sekai.exs</code> doesn’t trip the bypass warning on every assembly run</li>
</ul>
</section>
<section id="fixed" class="level2">
<h2 class="anchored" data-anchor-id="fixed">Fixed</h2>
<ul>
<li>Zone deploy “Pull Godot zone binary from GHCR” failure — was pulling <code>ghcr.io/v-sekai-fire/godot-zone-double:latest</code> (no workflow ever published this name); switched to <code>multiplayer-fabric-zone-godot:latest</code> which the build workflow actually publishes</li>
<li>Duplicate <code>Control::call_gui_input</code> declaration in <code>scene/gui/control.h</code> — the OTel branch declared it in the drag-and-drop section while engine-misc declared it in the input-events section; auto-merge kept both → compile error. Aligned both to declare it in input-events</li>
<li><code>Control::call_gui_input</code> body divergence — OTel branch had <code>set_input_handled</code> clobber-restore semantics, engine-misc had <code>local_input_handled</code> OR-restore. Aligned OTel to engine-misc verbatim so add/add merges produce identical content with no conflict</li>
<li>Cross-branch file overlap in the split feature branches — <code>feat/engine-misc</code> shed <code>tests/scene/test_fabric_zone.cpp</code> (belongs in <code>feat/module-multiplayer-fabric</code>); <code>feat/fork-scaffolding</code> shed <code>AGENTS.md</code>, <code>core/math/predictive_bvh_adapter.h</code>, <code>tests/scene/test_fabric_zone.cpp</code> (belong to agents-docs / predictive-bvh / fabric module respectively); <code>feat/uds-test-stability</code> shed the <code>5a2663346c</code> re-add of test_fabric_zone; <code>feat/lint-cleanup</code> rewrote its <code>.gitignore</code> commit to add only <code>.lake/</code> (was a kitchen-sink with sandbox/uro/keychain entries); <code>feat/fix-picosocks-cmsghdr-mingw</code> reset <code>.gitignore</code> to master and dropped <code>predictive_bvh_adapter.h</code></li>
<li><code>mbedtls/crypto_mbedtls.{cpp,h}</code> was orphaned in <code>feat/fork-scaffolding</code> despite being the implementation backing the API in <code>feat/crypto-extensions</code> — moved into <code>feat/crypto-extensions</code> so the API and impl ship together</li>
</ul>
</section>
<section id="removed" class="level2">
<h2 class="anchored" data-anchor-id="removed">Removed</h2>
<ul>
<li><code>stage multiplayer-fabric remotes/v-sekai-fire/multiplayer-fabric</code> line from <code>gitassembly</code> — <code>multiplayer-fabric-base</code> is now the canonical assembled output; the redundant publish stage is gone</li>
<li><code>feat/engine-patches</code> no longer referenced in <code>gitassembly</code> — superseded by the 10 split feature branches; kept as historical ref upstream</li>
<li>6 stale per-feature-branch test workflows on <code>build</code>: <code>test-engine-patches.yaml</code>, <code>test-module-http3.yaml</code>, <code>test-module-multiplayer-fabric.yaml</code>, <code>test-module-speech.yaml</code>, <code>test-multiplayer-fabric.yaml</code>, <code>test-open-telemetry.yaml</code> — replaced by the consolidated matrix workflow</li>
<li><code>feat/fork-scaffolding</code> from the active assembly path — <code>feat/fix-picosocks-cmsghdr-mingw</code> already provides equivalent CI/Docker scaffolding (14 of 16 files overlapped)</li>
</ul>


</section>
</section>

 ]]></description>
  <guid>https://v-sekai-fire.github.io/manuals/changelog/2026/20260507-deck-log.html</guid>
  <pubDate>Thu, 07 May 2026 13:27:30 GMT</pubDate>
</item>
<item>
  <title></title>
  <link>https://v-sekai-fire.github.io/manuals/changelog/2026/20260506-deck-log.html</link>
  <description><![CDATA[ 





<section id="v-sekai-fire-deck-log-2026-05-06-wednesday" class="level1">
<h1>V-Sekai Fire Deck Log — 2026-05-06 (Wednesday)</h1>
<p>Date: 2026-05-06</p>
<section id="added" class="level2">
<h2 class="anchored" data-anchor-id="added">Added</h2>
<ul>
<li>WebTransport gateway (Elixir) deployed at <code>gateway.chibifire.com</code> and <code>gateway-cdb4.chibifire.com</code></li>
<li>CockroachDB with mTLS deployed as <code>multiplayer-fabric-crdb</code>; admin UI accessible via <code>flyctl proxy</code></li>
<li>Uro zone backend deployed at <code>hub.chibifire.com</code> and <code>bake.chibifire.com</code></li>
<li>Observability stack: VictoriaMetrics (8428), VictoriaLogs (9428), VictoriaTraces (10428), OTEL Collector (4317/4318) on single Fly Machine</li>
<li>Baker (headless Godot asset exporter) deployed as <code>multiplayer-fabric-baker</code></li>
<li>Zone server pipeline: Godot <code>template_release</code> binary build in <code>multiplayer-fabric-zone</code></li>
<li>Terraform infra management in <code>multiplayer-fabric-infra</code> with state on <code>tfstate</code> branch</li>
<li>Daily CRDB backup to Tigris via restic</li>
<li>DNS records for <code>hub</code>, <code>bake</code>, <code>zone</code> subdomains on <code>chibifire.com</code></li>
<li>AGENTS.md documentation across all repos</li>
<li>This manuals repo was created</li>
<li>Proposal template (<code>decisions/present-proposal-template.md</code>) ported from v-sekai/manuals</li>
<li><code>references.bib</code> with networking, multiplayer, Godot, CockroachDB, and infrastructure entries migrated from v-sekai/manuals</li>
<li>References page wired into Quarto (<code>_quarto.yml</code> bibliography + <code>references.qmd</code>)</li>
</ul>
</section>
<section id="fixed" class="level2">
<h2 class="anchored" data-anchor-id="fixed">Fixed</h2>
<ul>
<li>Zone binary GHCR push: renamed image to <code>multiplayer-fabric-zone-godot</code> (package ownership tied to creating repo)</li>
<li>Terraform: renamed <code>my-crdb-node</code> to <code>multiplayer-fabric-crdb</code> throughout state, configs, and scripts</li>
<li>Baker deploy: dropped <code>curl</code> package (conflicts with <code>curl-minimal</code> pre-installed in AlmaLinux 9)</li>
<li>Build CI: excluded <code>web</code> from editor merge and release jobs (web only builds <code>template_release</code>)</li>
<li>Grafana Tempo v3: removed renamed <code>ingester</code>/<code>compactor</code> config keys; added <code>-target=all</code> (subsequently replaced by Jaeger, then VictoriaTraces)</li>
<li>Replaced Grafana Tempo (AGPL-3.0) with Jaeger all-in-one (Apache 2.0), then replaced Jaeger with VictoriaTraces (Apache 2.0) to unify storage under the VictoriaMetrics vendor; trace UI moved to port 10428</li>
<li>Deslopified observability ADRs against tropes.fyi: removed vague attribution (“claims”), marketing language (“unified vendor stack”, “natural replacement”, “standard pairing”), unicode arrows, and “ecosystem”</li>
</ul>


</section>
</section>

 ]]></description>
  <guid>https://v-sekai-fire.github.io/manuals/changelog/2026/20260506-deck-log.html</guid>
  <pubDate>Thu, 07 May 2026 13:27:30 GMT</pubDate>
</item>
<item>
  <title></title>
  <link>https://v-sekai-fire.github.io/manuals/changelog/2026/20260425-deck-log.html</link>
  <description><![CDATA[ 





<section id="v-sekai-fire-deck-log-2026-04-25-saturday" class="level1">
<h1>V-Sekai Fire Deck Log — 2026-04-25 (Saturday)</h1>
<p>Date: 2026-04-25</p>
<p>Backdated from <code>multiplayer-fabric/CHANGELOG.md</code> <code>[0.2.0]</code> through <code>[0.5.0]</code> — all four releases shipped on the same day.</p>
<section id="added" class="level2">
<h2 class="anchored" data-anchor-id="added">Added</h2>
<ul>
<li>taskweft HRR property tests (67 properties) — all green after fixes</li>
<li><code>Taskweft.Test.DBHelpers</code> — auto-detects <code>multiplayer-fabric-hosting/certs/crdb/</code> TLS certs; replaces hardcoded <code>sslmode=disable</code> URL in all three prop test files</li>
<li>Module-level Postgrex pool in each prop test module (<code>setup_all</code>) — eliminates per-<code>forall</code>-iteration TLS connection overhead that caused 60 s ExUnit timeouts during PropCheck shrinking</li>
<li>Zone backend <code>/api/v1</code> prefix moved into Phoenix router (<code>scope "/api/v1"</code>); Caddy no longer strips the prefix. 6/6 QA tests green on production</li>
<li>Playwright tests:
<ul>
<li><code>wt_browser.spec.ts</code> — browser WebTransport datagram echo PASS 1.4 s</li>
<li><code>godot_web_init.spec.ts</code> — threaded wasm64 engine loads PASS 1.1 s</li>
<li><code>godot_wt_e2e.spec.ts</code> — Godot web export WebTransportPeer end-to-end datagram echo PASS 3.3 s (4 C++ bugs fixed to reach green)</li>
</ul></li>
<li><code>operator_camera.gd</code> — 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 to <code>project.godot</code>. See <code>20260425-operator-camera-2-5d.md</code></li>
<li><code>window.__camera_state</code> exported via <code>JavaScriptBridge.eval()</code> for Playwright inspection without a full Godot web build</li>
<li>Playwright operator camera test (<code>operator_camera.spec.ts</code>) — Layer 1 JS simulation 7/7 pass; Layer 2 Godot web export test scaffolded (skipped until export built)</li>
<li><code>WasmEquiv.lean</code> — <code>vm_deterministic</code> proves compile-once libriscv VM correctness across native and Emscripten WASM hosts</li>
<li>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</li>
<li><code>headless_log_observer.gd</code> — corrected default port to UDP 7443; added <code>--host</code>, <code>--port</code>, <code>--dump-json</code>, <code>--frames</code> CLI flags. Exit 0 on entities received, exit 1 on timeout</li>
<li><code>fabric_client.gd</code> — <code>send_player_input(cmd, pos, extra)</code> generic CH_PLAYER write path. Default port corrected to 7443</li>
<li><code>observer.tscn</code> — <code>XROrigin3D</code> + <code>XRCamera3D</code> + left/right <code>XRController3D</code> added; port corrected to 7443</li>
<li><code>fabric_player_xr.gd</code> — OpenXR initialisation with silent desktop fallback</li>
<li><code>test_operator_camera.gd</code> — headless quaternion unit tests (4/4 pass): downward look, 90° twist, swing elevation constant, equivalence to old Euler hierarchy</li>
<li><code>headless_go.spec.ts</code> — Playwright Phase 1 GO spec; spawns <code>godot --headless</code> observer and asserts <code>entities.length &gt; 0</code> from <code>--dump-json</code> output</li>
<li><code>headless_tests.yml</code> — GitHub Actions workflow scaffolding for GO branch protection check (requires full Docker Compose stack to pass)</li>
<li>ADRs: Godot native headless observer (<code>20260425-godot-observer.md</code>), Godot native PCVR player (<code>20260425-godot-player.md</code>). Supersede Three.js ADRs</li>
<li>Lean proofs (<code>multiplayer-fabric-taskweft/lean/</code>): <code>ZoneProtocol</code> (port assignment, 100-byte packet layout), <code>ZoneObserver</code> (exit semantics, step monotonicity), <code>ZonePlayer</code> (CH_PLAYER cmd distinctness, camera swing invariant across all operator inputs)</li>
</ul>
</section>
<section id="changed" class="level2">
<h2 class="anchored" data-anchor-id="changed">Changed</h2>
<ul>
<li>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 <code>20260425-threejs-observer.md</code></li>
<li><code>observer.tscn</code> — <code>SpectatorRig</code> replaced by <code>OperatorRig</code> with <code>operator_camera.gd</code>; <code>StatusHUD</code> re-parented to new camera path</li>
<li><code>operator_camera.gd</code> — swing-twist orientation now built as a single <code>Quaternion</code> (<code>twist_q * swing_q</code>) on <code>CameraPivot</code> instead of Euler angles split across pivot and arm. <code>SpringArm3D</code> carries no rotation</li>
<li>Client strategy updated: Three.js ADRs superseded by Godot native observer and player. Three.js browser client moved to SOMEDAY</li>
<li><code>runner.yml</code> — <code>always()</code> added to <code>docker-images</code> and <code>headless-tests</code> so sibling job failures (android, ios, etc.) do not skip them</li>
<li><code>gitassembly</code> — checkpointed <code>multiplayer-fabric</code> stage to start from remote HEAD; reassembled and pushed via <code>update_godot_v_sekai.exs</code></li>
</ul>
</section>
<section id="fixed" class="level2">
<h2 class="anchored" data-anchor-id="fixed">Fixed</h2>
<ul>
<li><code>Storage.query_all/3</code> — <code>Enum.map(nil, ...)</code> crash on DML statements (INSERT/UPDATE/DELETE return <code>rows: nil</code> in Postgrex). Fixed with <code>rows || []</code></li>
<li>Four transaction rollback tests — <code>raise "rollback"</code> inside <code>rescue _ -&gt; :ok</code> committed instead of rolling back. Fixed with <code>Postgrex.rollback(conn, :rollback)</code></li>
<li><code>references.bib</code> — non-ASCII bytes (en dashes, smart quotes, invalid Win-1252 sequences) replaced with ASCII equivalents</li>
<li><code>_server_path_callback</code> — prefer <code>p_path_app_ctx</code> over <code>p_stream_ctx-&gt;path_callback_ctx</code> (proved by Lean <code>fixed_sctx</code> theorem)</li>
<li><code>wt_server_demo.gd</code> — mirror received packet’s <code>transfer_mode</code> before <code>put_packet</code> (default RELIABLE routed echo to streams; datagrams need UNRELIABLE)</li>
<li><code>transport_peer.spec.ts</code> shape mismatch: <code>data.zones</code> → <code>data.shards</code></li>
<li>Zone registration: <code>last_put_at</code> on create, <code>created_at</code> field fix, PubSub rescue in zone controller</li>
<li>Caddyfile: added <code>handle /socket/*</code> reverse proxy; socket path was 404</li>
<li><code>gescons</code> alias updated: <code>threads=yes arch=wasm64</code> to match GHA web build</li>
<li><code>quic_picoquic_backend.cpp:589</code> — <code>SESSION_H3_SETTINGS</code> reference after the enum value was removed in the WebTransport audit (<code>6feefaf0b9</code>)</li>
<li>WebTransport audit fixes: datagram reader exclusive-lock bug (new reader per iteration → single reader reuse); <code>incoming</code> queue mutex for picoquic cross-thread safety; <code>SESSION_H3_SETTINGS</code> dead state removed from <code>SessionState</code></li>
<li><code>quic_web_glue.js</code> — Lean 4 proofs (<code>WebTransport.lean</code>) for state machine acyclicity, queue discipline, and reader exclusivity invariant</li>
<li><code>operator_camera.gd</code> — <code>delta</code> parameter bug in <code>_apply_swing_twist</code> (was using <code>get_process_delta_time()</code> instead of passed <code>delta</code>)</li>
<li><code>multiplayer-fabric-godot</code> local branches — tracking corrected from <code>origin/master</code> to their own <code>origin/feat/*</code> remotes</li>
<li><code>multiplayer-fabric-base</code> local — reset to <code>origin/multiplayer-fabric-base</code> (local was stale reassembly before <code>scu_build=yes</code> fixes were applied)</li>
<li>Stale stashes dropped from <code>multiplayer-fabric-godot</code> (libriscv Win32 files already committed; openvr mode-change noise; empty archived-branch stash)</li>
</ul>
</section>
<section id="security" class="level2">
<h2 class="anchored" data-anchor-id="security">Security</h2>
<ul>
<li>Rotated Cloudflare Turnstile keys (were plaintext in <code>.env</code>)</li>
</ul>


</section>
</section>

 ]]></description>
  <guid>https://v-sekai-fire.github.io/manuals/changelog/2026/20260425-deck-log.html</guid>
  <pubDate>Thu, 07 May 2026 13:27:30 GMT</pubDate>
</item>
<item>
  <title></title>
  <link>https://v-sekai-fire.github.io/manuals/changelog/2026/20260421-deck-log.html</link>
  <description><![CDATA[ 





<section id="v-sekai-fire-deck-log-2026-04-21-tuesday" class="level1">
<h1>V-Sekai Fire Deck Log — 2026-04-21 (Tuesday)</h1>
<p>Date: 2026-04-21</p>
<p>Backdated from <code>multiplayer-fabric/CHANGELOG.md</code> <code>[0.1.0]</code>.</p>
<section id="added" class="level2">
<h2 class="anchored" data-anchor-id="added">Added</h2>
<ul>
<li>Infinite Aquarium (Jellyfish Game) proof-of-concept: zone networking, RECTGTN jellyfish behaviour planning, UGC asset pipeline, ReBAC permissions</li>
<li><code>quic_web_glue.js</code> — browser WebTransport glue for Godot web export</li>
<li><code>web_transport_peer.cpp</code> — <code>poll_incoming_func</code> + <code>_web_poll_incoming()</code></li>
<li><code>SCsub</code> — <code>env.Append(JS_LIBS=[...])</code> fix so the JS library reaches the linker</li>
<li>manuals ADR corpus: 517 ADRs tagged with filename slug; <code>tag_adrs.exs</code>, <code>linkify_adrs.exs</code>, <code>audit_tropes.exs</code>, <code>fix_bold_bullets.exs</code> scripts; bold-first bullet trope fixed across 104 files (578 labels stripped); verbatim template heading replaced with “Design” in 309 files</li>
</ul>


</section>
</section>

 ]]></description>
  <guid>https://v-sekai-fire.github.io/manuals/changelog/2026/20260421-deck-log.html</guid>
  <pubDate>Thu, 07 May 2026 13:27:30 GMT</pubDate>
</item>
</channel>
</rss>
