← All docs changelog/2026-W19.md

Week 19 — May 5 – 11, 2026

Summary

A big week across three fronts: brand, ML tooling, and platform infrastructure. The TradeSpark Design System was checked in as the canonical brand spec and adopted across the static site — all 8 demo pages were restyled with the new tokens, eyebrow → .spark-text headline pattern, and shared nav chrome. The ML eval pipeline gained non-blocking multi-model runs with a full dashboard (golden-set picker, progress bars, comparison table, record diff drawer), and the Traction admin demo surfaced live Supabase user/project analytics behind an email-allowlist gate. The livekit-recorder was overhauled with AES-CBC encrypted writes and depth-track support, and a new video-to-3D reconstruction pipeline (ffmpeg → COLMAP → fastgs) was added. The repo's docs/ corpus was exposed at /docs/* through the static site for convenient browsing.

19 code commits | 107 unique files changed | +8,572 / -1,145 lines


Highlights

TradeSpark Design System Adoption (May 7–8)

The canonical brand spec was checked into /design/TradeSpark Design System/ (README, SKILL.md, colors_and_type.css, preview HTML components, JSX UI kit) and wired as a Claude Code skill. dev/static_site/ was restyled with the new tokens (navy #183e6d, spark #e45125, bg #f4f8fb), plus .eyebrow, .spark-text, .btn-arrow, .hero-glow utilities. All 8 demo pages were then restyled with brand tokens, with ML demos sharing a consolidated fullscreen header.

Non-Blocking Eval Pipeline + Dashboard (May 7)

POST /ml/eval/run is now non-blocking: spawns one eval worker per model, returns immediately. The /demos/ml-eval dashboard provides golden-set picker, task-type/judge filters, multi-model comparison table (metrics + judge subscores), per-record diff drawer, and recent-runs list. Zombie self-heal mirrors the training pipeline's probe pattern. Follow-up polish added metric tooltips, judge-score legend, and project titles in records.

Traction Admin Demo (May 7)

New admin-only /demos/traction page showing live Supabase analytics: user totals with registered/anonymous split, homeowner vs pro counts, per-month calendar heatmaps for daily signups and project creation, and a paginated project list with AI-plan drawer. Gated by a new TradesparkEmailAdmin dependency (email allowlist via Modal Secret, decoupled from Supabase roles). A follow-up commit fixed a crashloop where the traction module's top-level tsweb import crashed every non-users service.

LiveKit Recorder Overhaul — Encrypted Writes + Depth Support (May 5)

The Go livekit-recorder's S3 uploader package was removed. Recordings (RGB + depth) are now encrypted via encryptAndWriteFile (AES-CBC) before being written to the S3 path. Encryption round-trip tests verify the encrypt-decrypt path. The recording bot, clip handling, and REST handler were refactored for the new flow.

Video-to-3D Reconstruction Pipeline (May 5)

New session_to_splat.video_3d_reconstruction.py implements the full video-to-3D pipeline: decrypt recordings → ffmpeg frame extraction → COLMAP SfM → fastgs Gaussian splatting. Comes with its own Dockerfile. The existing session_to_splat.py was refactored for pipeline variant routing.

ml-generation Rename + Detail Pane Restructure (May 8)

The ML dashboard demo was renamed from ml-dashboard to ml-generation to better reflect its purpose. A DEMO_REDIRECTS map 301-redirects the old slug. The detail pane was restructured from a 2-col split to a top-row project description + bottom-row 2-col refinement/plan layout.

Docs Exposed at /docs/* (May 9)

The repo's docs corpus (architecture, services, 25 changelog files) and IMPROVE.md are now browsable at /docs/* on the static site. Runtime markdown rendering via markdown-it-py, login-required auth, path-traversal protection. FastAPI's built-in Swagger UI was disabled to free the /docs route.

Zombie Training Job Self-Heal (May 6)

A new _probe_running_job helper asks Modal whether running FunctionCalls are still alive — reaper kills and OOMs now surface as failed with the exception captured. Progress bars gained proportional fill with step/epoch tick overlays.


Daily Breakdown

May 5 (2 code commits)

  • 631cb8a Added crypto to livekit recorder, updated agent instructions, depth track handling, session recordings to splatting work (+2,253/-688)
  • 4f0d119 Add livekit-recorder encryption tests, add fastgs splatting impl (+771/-156)

May 6 (1 code commit)

  • 1efeee9 Self-heal zombie training jobs and finer-grained progress bar (+117/-29)

May 7 (9 code commits)

  • 972012a Add Traction admin demo with email-allowlist gate (+990/-2)
  • 8e7ef69 Add non-blocking eval pipeline + multi-model comparison dashboard (+1,096/-23)
  • 3dd7a0c Defer traction router import so non-users services don't crashloop (+14/-2)
  • 363987f Update Synthetic Generate test for non-blocking response shape (+2/-3)
  • 570201f Adopt TradeSpark Design System across dev/static_site/ + wire skill (+2,290/-392)
  • 1d0edb6 ml-eval: tooltips on metrics, judge-score legend, project titles in records (+338/-16)
  • 87df64e traction: brand restyle — tokens, voice, eyebrow + spark-text headline (+36/-21)
  • b9aace7 traction: regrade calendar ramp to 0.20/0.40/0.60/0.80/solid navy (+11/-11)
  • 27ec5f6 mobile-session: brand restyle — tokens, eyebrow + spark-text headline (+9/-8)

May 8 (5 code commits)

  • 4cd33ee ml-generation: rename from ml-dashboard + restructure detail pane (+79/-49)
  • 0ec07e0 ml demos: share site-header chrome + brand restyle (tokens, badges) (+96/-195)
  • 063e103 traction: convert to non-fullscreen, drop legacy topbar (+9/-42)
  • 66a88bf model-proxy: brand restyle — tokens, chip palette, eyebrow + spark headline (+8/-7)
  • 41e4c91 websocket-test: brand restyle — tokens + eyebrow / spark-text headline (+4/-3)

May 9 (1 code commit)

  • cb6674a static-site: expose internal docs/ + IMPROVE.md at /docs/* (+298/-1)

Modified Files

May 5

  • dev/livekit-recorder/pkg/participant/data.go — AES-CBC encrypt/decrypt, encryptAndWriteFile
  • dev/livekit-recorder/pkg/participant/data_test.gonew: encryption round-trip tests
  • dev/livekit-recorder/pkg/participant/processing.go — encrypted writes for RGB + depth
  • dev/livekit-recorder/pkg/participant/participant.go — restructured lifecycle, depth awareness
  • dev/livekit-recorder/pkg/recording/bot.go — bot refactored
  • dev/livekit-recorder/pkg/recording/clip.go — clip handling updated
  • dev/livekit-recorder/pkg/recording/service.go — service restructured
  • dev/livekit-recorder/main.go — simplified entry point
  • dev/livekit-recorder/pkg/http/rest/recording.go — REST handler trimmed
  • dev/livekit-recorder/pkg/upload/s3.goremoved (replaced by encrypted writes)
  • dev/livekit-recorder/pkg/upload/uploader.goremoved
  • dev/livekit_ts/agent/agent.py — depth-track detection, session lifecycle rework
  • dev/livekit_ts/agent/instruction_sets.py — agent instructions expanded
  • dev/livekit_ts/agent/recorder.py — DEK passing, subprocess config
  • dev/livekit_ts/agent/room_agent_worker.py — worker adjustments
  • dev/livekit_ts/agents/livekit_agent_helpers.py — image + helper rework
  • dev/livekit_ts/agents/dockerfile.livekit_agentnew: agent Dockerfile
  • dev/livekit_ts/agents/dockerfile.livekit_agent.entrypoint.shnew: agent entrypoint
  • dev/livekit_ts/agents/dockerfile.entrypoint.shremoved (replaced)
  • dev/queues/session_to_splat.py — refactored for pipeline variants
  • dev/queues/session_to_splat.video_3d_reconstruction.pynew: video-to-3D pipeline (fastgs)
  • dev/queues/dockerfile.session_to_splat — updated build
  • dev/queues/dockerfile.session_to_splat.video_3d_reconstructionnew: 3D reconstruction Dockerfile
  • dev/queues/dockerfile.session_to_splat.entrypoint.shnew: entrypoint
  • dev/queues/colmap_undistorted_sfm_export.sh — COLMAP with checkpoints
  • dev/queues/video_to_gsplat.sh — end-to-end splatting script
  • dev/queues/__init__.pynew: package init
  • dev/core/core.py — image and config updates
  • dev/core/data.py — DEK and encryption adjustments
  • dev/core/mls.py — MLS module updates
  • dev/core/models/__init__.py — new models export
  • dev/core/models/jobs.pynew: job models
  • dev/core/models/telemetry.py — telemetry model changes
  • dev/app.py — app composition updates
  • dev/deploy.sh — deploy script adjustments
  • dev/users/auth.py — auth refinements
  • dev/requirements.txt, dev/requirements_full.txt, requirements.txt — dependency updates
  • dev/tests/test_core/test_mls.py — MLS test updates

May 6

  • dev/ml/ml_endpoint.py_probe_running_job helper for zombie detection
  • dev/ml/training/trainer.py — emit total_steps on epoch/step events
  • dev/static_site/templates/demos/ml-training.html — proportional progress bar with tick overlays

May 7

  • dev/users/traction.pynew: Traction admin endpoints (296 lines)
  • dev/core/admin.pynew: TradesparkEmailAdmin auth dependency
  • dev/core/__init__.py — export TradesparkEmailAdmin
  • dev/core/core.py — add TradesparkAdmins Modal Secret
  • dev/users/users_endpoint.py — include traction router, deferred import fix
  • dev/ml/eval/eval_runner.py — progress_callback, event emission, project titles
  • dev/ml/ml_endpoint.py — eval worker, eval_jobs/eval_runs Dicts, non-blocking POST, zombie probe
  • dev/static_site/endpoint.py — register traction + ml-eval in FULLSCREEN_DEMOS
  • dev/static_site/templates/demos/traction.htmlnew: Traction dashboard UI
  • dev/static_site/templates/demos/ml-eval.htmlnew: ML eval dashboard UI
  • dev/static_site/templates/index.html — add Traction + ML eval cards
  • design/TradeSpark Design System/new: canonical brand spec (53 files)
  • .claude/skills/tradespark-designnew: skill symlink
  • dev/static_site/assets/css/site.css — TradeSpark brand tokens + utilities
  • dev/static_site/assets/img/ — brand logo assets + favicon
  • dev/static_site/templates/_header.html, _fullscreen_header.html, login.html, posts_index.html — brand restyle
  • dev/static_site/DESIGN.md — replaced with canonical spec pointer
  • CLAUDE.md, dev/CLAUDE.md — cross-reference design spec
  • dev/static_site/templates/demos/mobile-session.html — brand restyle
  • bruno/.../Synthetic Generate.bru — response shape assertion update

May 8

  • dev/static_site/templates/demos/ml-dashboard.htmlml-generation.html — renamed + restructured
  • dev/static_site/endpoint.py — slug update, DEMO_REDIRECTS with 301 redirect
  • dev/static_site/templates/index.html — link target update
  • dev/static_site/README.md — migration table
  • dev/static_site/templates/_fullscreen_header.html — shared ML nav header
  • dev/static_site/templates/demos/ml-comparison.html — brand restyle
  • dev/static_site/templates/demos/ml-eval.html — brand restyle
  • dev/static_site/templates/demos/ml-training.html — brand restyle
  • dev/static_site/templates/demos/traction.html — convert to non-fullscreen
  • dev/static_site/templates/demos/model-proxy.html — brand restyle
  • dev/static_site/templates/demos/websocket-test.html — brand restyle

May 9

  • dev/static_site/docs.pynew: docs corpus loader (158 lines)
  • dev/static_site/templates/docs_index.htmlnew: docs index page
  • dev/static_site/templates/_doc_layout.htmlnew: doc detail layout
  • dev/core/core.py — mount docs/ + IMPROVE.md onto image
  • dev/static_site/endpoint.py — /docs routes, disable Swagger UI
  • dev/static_site/templates/_fullscreen_header.html, _header.html — Docs nav link
  • dev/static_site/templates/index.html — "Browse all docs" card