May 27, 2026
Commits
a7c71e1 — dashboard: local deploys record deploy-state + toast shows pipeline stage
Local deploys via deploy.sh now write a deploy-state record so the dashboard picks them up. The action toast shows the current pipeline stage (deploying → testing → done).
Changed:
dev/deploy.sh— write deploy-state on local deploys (+30/-1)dev/static_site/templates/deploy-dashboard/index.html— stage-aware toast (+25/-11)
6667aa4 — deploy-dashboard: toast matches card width + per-stage elapsed + merge phase
Toast notifications now match the width of their parent env card. Each pipeline stage shows its own elapsed timer. A new "merging" phase appears during promote actions.
Changed:
ci/_git_in_modal.py— merge phase tracking (+56/-7)dev/static_site/templates/deploy-dashboard/index.html— card-width toast + stage timers (+40/-2)
caa3405 — deploy-dashboard: split bootstrap phase + show "waiting for CI" step
The promote flow now shows a distinct "bootstrap" phase while the webhook fires, then transitions to "waiting for CI" until the Modal workers pick up the job.
Changed:
ci/_git_in_modal.py— bootstrap phase detection (+53/-2)ci/bruno_in_modal.py— phase reporting (+5/-1)dev/static_site/deploy_dashboard.py— phase routing (-2/+1)dev/static_site/templates/deploy-dashboard/index.html— bootstrap + waiting UI (+3/-1)
88a5b9e — ci: unify promote-to-dev as an inline dispatcher (matches dev→beta)
Refactors dispatch_promote_to_dev to use the same inline dispatcher pattern as dispatch_dev_to_beta: merge → deploy → test, all in one Modal function call. Previously dev promotion was a two-step webhook→GitLab→webhook dance.
Changed:
CLAUDE.md— update promotion DAG docs (+2/-1)ci/_git_in_modal.py— inline merge for dev promotion (+59/-?)ci/webhook.py— unified dispatcher (+97/-?)dev/static_site/deploy_dashboard.py— promote-to-dev endpoint (+25/-3)dev/static_site/templates/deploy-dashboard/index.html— button updates (+8/-1)
29a22c1 — docs+just: no ad-hoc compound commands rule + just commits recipe
Adds a rule to CLAUDE.md prohibiting ad-hoc compound shell commands (pipes, &&, ;). Adds a just commits recipe as the sanctioned alternative for viewing recent commits with diffstats.
Changed:
CLAUDE.md— compound commands rule (+10)Justfile—commitsrecipe (+11)
9344550 — deploy-dashboard: serve the shell no-store so deploys take effect on refresh
Adds Cache-Control: no-store to the dashboard HTML shell response so browser refreshes always fetch the latest version after a deploy.
Changed:
dev/static_site/deploy_dashboard.py— no-store header (+11/-2)
b1c3a20 — deploy-dashboard: always-on elapsed timer in the pending toast
The action toast now shows a continuously updating elapsed timer from the moment the action was triggered, not just per-stage.
Changed:
dev/static_site/templates/deploy-dashboard/index.html— global elapsed timer (+33/-31)
8be5249 — deploy-dashboard: clear destination-card chips while a promotion is in flight
When a promote action is in flight, the destination card's status chips (last deploy, last test) are cleared to avoid showing stale data.
Changed:
dev/static_site/templates/deploy-dashboard/index.html— clear chips on promote (+29/-3)
297c8ad — deploy.sh: skip deploy-state record in --ci mode (worker owns it)
When deploy.sh runs in --ci mode (inside a Modal worker), it skips writing the deploy-state record because the CI worker manages that state itself.
Changed:
dev/deploy.sh— skip state record in CI mode (+5/-2)
9f1ac96 — ci: keep deploy + bruno workers warm (min_containers=1)
Sets min_containers=1 on the deploy and Bruno test runner Modal functions to eliminate cold-start latency for CI operations.
Changed:
ci/bruno_in_modal.py— min_containers=1 (+2)ci/deploy_in_modal.py— min_containers=1 (+5)
2c647fc — ci/deploy_in_modal: slim the deploy image — drop torch/CUDA/transformers/opencv
The CI deploy worker's image no longer includes ML dependencies (torch, CUDA, transformers, opencv) since it only needs modal and git. Cuts image size significantly.
Changed:
ci/deploy_in_modal.py— minimal image definition (+16/-2)
1345a94 — ci: drop warm pins on deploy + bruno workers
Reverts min_containers=1 on deploy and Bruno workers — the cost of keeping them warm wasn't justified by the cold-start savings for infrequent CI operations.
Changed:
ci/bruno_in_modal.py— remove min_containers (-2)ci/deploy_in_modal.py— remove min_containers (-5)