← All docs changelog/2026-05-27.md

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)
  • Justfilecommits recipe (+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)