← All docs changelog/2026-W20.md

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)

  • d01837f ci: delegate beta test gate to dev/test_app.sh (+21/-36)
  • fc41327 static-site: per-env Supabase wiring + dynamic changelog cards (+189/-32)
  • d122751 bruno: skip Sync Project on prod-track + log TODOs (+86/-1)
  • 341c407 IMPROVE.md: 2026-05-11 review — 3 new findings (+52/-10)

May 14 (10 code commits)

  • a016d06 deploys: layer shared image bases + .dockerignore (+143/-171)
  • 4cecc74 livekit_agent dockerfile: build go binary before broad COPY (+8/-5)
  • cba0bbb ci: cap modal deploy at 30 min + add GitLab pip cache (+31/-3)
  • a54e645 session_to_splat: extract heavy base to AWS ECR (+130/-12)
  • 46e4e6d admins: local .admins file + sync script (+212/-0)
  • 64ba9d8 scripts: add audit_project_titles.py (+123/-0)
  • 1b9b010 traction: read actual DB column names in Plan view (+35/-10)
  • 97c05ff modal: default MODAL_PROFILE=silverbear-io (+29/-10)
  • e4d3fa9 gitignore: .claude/worktrees/ (+3/-1)
  • e62dff7 Add TradeSpark Design System zip snapshot (binary)

May 16 (3 code commits)

  • ca9ff8e splat-base: EC2 builder + minimal Modal setup_dockerfile_commands (+481/-2)
  • dedb19b ci: make build_splat_base manual-only (+36/-12)
  • 17958d8 IMPROVE.md N21: CI dev→beta auto-merge blocked on HTTP Basic auth (+21/-0)

May 18 (1 code commit)

  • 945e6d4 ci: migrate promotion DAG to Modal-driven pipeline (+1,339/-278)