Week 20 — May 12 – 18, 2026
Summary
A foundational infrastructure week focused on CI/CD migration and deploy optimization. The entire promotion DAG (dev→beta→main) was migrated from GitLab CI shell scripts to Modal-driven functions, with a new webhook dispatcher (ci/webhook.py), remote deploy/test runners, and scheduled cleanup jobs. Heavy Docker base images for five services were pre-baked to AWS ECR, slashing Modal deploy times. The static site gained per-env Supabase wiring, and the Bruno test runner was hardened with prod-track skip guards and credential cleanup.
18 code commits | 37 unique files changed | +3,793 / -489 lines
Highlights
CI/CD Migration to Modal (May 18)
The monolithic GitLab CI pipeline was replaced by a Modal-driven promotion DAG. New modules: ci/webhook.py (HTTP dispatch), ci/deploy_in_modal.py (remote deploys), ci/bruno_in_modal.py (remote test execution), ci/_git_in_modal.py (git operations in Modal), and ci/scheduled_cleanup.py (cron for non-prod cleanup + canary tests). The Justfile gained deploy-remote, test-remote, promote, and approve-prod recipes. .gitlab-ci.yml was simplified to webhook triggers.
ECR Base Image Extraction (May 14, 16, 21)
Heavy base images for session_to_splat (COLMAP/fastgs), core, livekit-server, livekit-agent, and ml-training were extracted to AWS ECR Dockerfiles. Modal images now FROM the ECR bases, avoiding repeated pip installs of torch/CUDA/transformers during deploys. An EC2-based builder script (build_splat_base_on_ec2.py) handles the docker builds since no GitLab docker runner is available.
Deploy Image Layering (May 14)
Introduced shared Modal image bases (grizzlebearImage, aiImage) that downstream services extend, replacing per-service full image definitions. Added dev/.dockerignore to exclude test fixtures, archives, and non-essential files. Reordered the livekit-agent Dockerfile for better cache hits. Added a 30-minute deploy timeout and GitLab pip cache.
Admin Tooling (May 14)
A local .admins file + sync_admins.py script replaces manual Modal Secret dashboard edits for the TradesparkAdmins email allowlist. The Traction admin's Plan view was fixed to use actual Supabase column names. Added audit_project_titles.py as a Modal-run diagnostic.
Static Site & Test Hardening (May 11)
Per-env Supabase wiring for the static site's auth flow. Dynamic latest-changelog cards on the landing page. The CI beta test gate was delegated to dev/test_app.sh (single source of truth). Bruno's Sync Project test was skipped on prod-track environments.
Daily Breakdown
May 11 (4 code commits)
d01837fci: delegate beta test gate to dev/test_app.sh (+21/-36)fc41327static-site: per-env Supabase wiring + dynamic changelog cards (+189/-32)d122751bruno: skip Sync Project on prod-track + log TODOs (+86/-1)341c407IMPROVE.md: 2026-05-11 review — 3 new findings (+52/-10)
May 14 (10 code commits)
a016d06deploys: layer shared image bases + .dockerignore (+143/-171)4cecc74livekit_agent dockerfile: build go binary before broad COPY (+8/-5)cba0bbbci: cap modal deploy at 30 min + add GitLab pip cache (+31/-3)a54e645session_to_splat: extract heavy base to AWS ECR (+130/-12)46e4e6dadmins: local .admins file + sync script (+212/-0)64ba9d8scripts: add audit_project_titles.py (+123/-0)1b9b010traction: read actual DB column names in Plan view (+35/-10)97c05ffmodal: default MODAL_PROFILE=silverbear-io (+29/-10)e4d3fa9gitignore: .claude/worktrees/ (+3/-1)e62dff7Add TradeSpark Design System zip snapshot (binary)
May 16 (3 code commits)
ca9ff8esplat-base: EC2 builder + minimal Modal setup_dockerfile_commands (+481/-2)dedb19bci: make build_splat_base manual-only (+36/-12)17958d8IMPROVE.md N21: CI dev→beta auto-merge blocked on HTTP Basic auth (+21/-0)
May 18 (1 code commit)
945e6d4ci: migrate promotion DAG to Modal-driven pipeline (+1,339/-278)