diff --git a/.claude/knowledge/hhtl-pr-x4-splat-cascade-pre-sprint-prompt.md b/.claude/knowledge/hhtl-pr-x4-splat-cascade-pre-sprint-prompt.md index ae03a90e..2cbfa19e 100644 --- a/.claude/knowledge/hhtl-pr-x4-splat-cascade-pre-sprint-prompt.md +++ b/.claude/knowledge/hhtl-pr-x4-splat-cascade-pre-sprint-prompt.md @@ -235,7 +235,7 @@ the level-4 fix is the only blocker. **PR-X4 must NOT re-introduce its own Hilbert-3D encode** — wait for the A12b fix, then consume `linalg::hilbert::hilbert3d_encode`. -## Schedule slot — W4-W5 (5 workers), no new Q-marker +## Schedule slot — W4-W5 (6 workers), no new Q-marker The 8-week schedule from `hhtl-substrate-execution-prompt.md`:76-91 already places PR-X4 at W4-W5 alongside PR-X12 (codec, 8 workers): @@ -245,7 +245,7 @@ already places PR-X4 at W4-W5 alongside PR-X12 (codec, 8 workers): | W1-W2 | PR-X10 (linalg-core foundation) | 12 | | **W2.5/W3** | **PR-X1 + PR-X2 (GridLake) + PR-X14′ (contract)** ← Q-NEW-1/Q-NEW-2 pending | 4-10 depending on cell | | W3 | PR-X11 (jc consolidation) + PR-X13 (OGIT bridge) | 6 + 4 | -| **W4-W5** | **PR-X12 (codec, 8) + PR-X4 (splat cascade, 5)** | **13** | +| **W4-W5** | **PR-X12 (codec, 8) + PR-X4 (splat cascade, 6)** | **14** | | W6-W7 | PR-X9 (basin-codebook) | 6 | | W8 | Integration + canary | 3 | @@ -266,7 +266,7 @@ If GridLake + X14′ slip past W3 (e.g., Cell A-β extension), PR-X4 starts late by the same margin. **No schedule extension owed by PR-X4 itself.** -## Worker spawn shape (5 workers) +## Worker spawn shape (6 workers) ``` A1: TileInstance v2 + BlockedGrid refactor (chain dep) @@ -279,14 +279,25 @@ A1: TileInstance v2 + BlockedGrid refactor (chain dep) │ ├──→ A4: G2 INT4×32 packed dot (3 backends + parity test) │ - └──→ A5: G3 NARS truth-revision kernel + G4 fast_exp_x16 - precision audit (combined; A5 verdict determines if - precise_exp_x16 follow-up needed) + ├──→ A5: G3 NARS truth-revision kernel + G4 fast_exp_x16 + │ precision audit (combined; A5 verdict determines if + │ precise_exp_x16 follow-up needed) + │ + └──→ A6: Railway smoke deployment — splat4d::cascade::frame_pipeline + wired to HLS over a minimal axum/warp service, Prom metrics + endpoint, FPS + jitter histogram surfaced in the player UI. + Depends on A1 + A5 only (no cross-deps to A2/A3/A4) so the + banal smoke test can ship even if A12b's L4 Hilbert fix + slips past W3 — A6 exercises L1-L3 cascade and the + composition closure, which is enough to falsify a latency + regression. ``` -A1 is the only chain dep. A2-A5 are parallel after A1 lands. +A1 is the only chain dep. A2-A6 are parallel after A1 lands. A2 has an additional gate dep on PR-X10 A12b's L4 fix landing on -master (not just PR-X10 W2 completion). +master (not just PR-X10 W2 completion). A6 has an additional dep on +A5's composition closure being callable from the pipeline (needed for +SG4); the alpha-only branch of A6 can ship without A5. ## Done criteria @@ -343,6 +354,60 @@ The sprint is done when ALL of the following hold: union currently green on master) still passes after the refactor. `cargo clippy -- -D warnings` clean. +7. **Smoke gates pass on Railway** (see § "Smoke acceptance gates"): + SG1 ≥ 60 fps median, SG2 ≤ 20 ms p95, SG3 zero stutter events + over 10 minutes, SG4 same envelope under the `splat4d-nars-compose` + feature flag. A6 must be deployed and metrics scraped before the + sprint closes. + +## Smoke acceptance gates — Railway-hosted video player + +The cascade ships not just as a refactor but as a service: a small +Railway-deployed binary that streams a video through the splat4d +pipeline. **Banality is the test.** If the cascade can stream a 1080p +video on a Railway hobby tier without stuttering, every bundle is +honoring its latency contract under sustained load — and any cliff +that hides on a workstation surfaces in the deployment envelope. + +### Why this beats synthetic benchmarks (PSNR, throughput-only) + +- **PSNR is a number; stuttering is a sensation.** A dropped frame is + unfalsifiable: you either see it or you don't. PSNR averages across + frames and hides lane-traffic spikes — exactly the pathology bundle + contracts are designed to prevent. +- **Railway adds the deployment envelope for free.** Hobby-tier CPU + caps, real network egress, container memory limits. Anything that + hides on a workstation surfaces here. +- **60 fps × 10 minutes = 36,000 frames each inside a 16.6 ms budget.** + No batch averaging, no "we'll catch up." The harshest possible test + of per-bundle latency dressed up as the most boring deliverable. + +### What ships in A6 + +- **Service**: minimal Railway-deployed binary (axum or warp), HTML5 + player + FPS counter + jitter histogram in the UI +- **Server path**: video frames flow through + `splat4d::cascade::frame_pipeline` — decode → B-Interleave-Transpose + → cascade L1..L4 (L1-L3 only if A12b slipped) → B-Compose (alpha) → + emit +- **Client**: stock `