Davao Transit has several release boundaries because not every artifact changes at the same time. The web application can deploy while the planner image stays the same. Bus tiles have immutable versioned keys and a short-lived manifest. The API can be deployed with AI disabled even when the prompt and evaluation files changed.

Release order

Start with a clear description of what changed. Then run the checks that cover that layer:

  1. Build and validate transit data with the scripts in @aidrecabrera/transit.
  2. Build the planner image if topology, stops, or geometry changed.
  3. Build, validate, and publish bus tiles if bus geometry changed.
  4. Run package typechecks and tests.
  5. Build the web, API, dashboard, and docs applications.
  6. Deploy the changed Worker or static application.
  7. Run the relevant smoke checks and read the public manifest or health response.

The planner image is published as planner-image.json plus a content-addressed planner-v1-.wayplan file. The web client checks the manifest byte length and SHA-256 before the worker mounts it. Bus tiles use bus-routes/manifest.json and versioned tile keys. A manifest is the pointer to a release, not the artifact itself.

Current commands

text
1pnpm --filter @aidrecabrera/transit validate-release
2pnpm --filter @aidrecabrera/transit build:planner-image
3pnpm --filter @aidrecabrera/transit build:bus-route-tiles -- --min-zoom <min> --max-zoom <max>
4pnpm --filter @aidrecabrera/transit validate:bus-route-tiles
5pnpm --filter @aidrecabrera/transit deploy:bus-route-tiles
6pnpm --filter @aidrecabrera/api deploy
7pnpm --filter dashboard deploy

Run the tile smoke check against the API after publication:

text
1pnpm --filter @aidrecabrera/transit smoke:bus-route-tiles

The exact API base URL can be supplied to the smoke script. Read the script's output rather than assuming that an upload succeeded because the command returned quickly.

Release gates

The AI release gate is data, not a slogan. The configured baseline was measured on 2026-08-23 and requires schema validity of 1, intent accuracy of 0.9, language accuracy of 0.9833, outcome accuracy of 0.95, and p95 latency no higher than 2582 ms. The 2026-08-24 regression run did not clear that gate: its outcome accuracy was 0.5952 and intent accuracy was 0.8571, although schema validity and language accuracy were 1 and p95 latency was 2171 ms. Keep AI disabled when the deployment policy requires a passing gate.

Rollback boundaries

Roll back the layer that failed. Restore a previous tile manifest when the tile artifact is wrong. Redeploy the previous Worker when the API behavior is wrong. Restore the previous web build when the client and planner image contract do not agree. Do not delete immutable artifacts to make a release appear rolled back; move the public pointer back to a known-good version and verify it through the public path.

Do and do not

Do verify the bytes and manifest that the browser will fetch. Do record the build version and the check that passed.

Do not call a package test run a release validation. Do not promote an AI model because its schema output is valid when the outcome metric still fails. Do not publish a data artifact without checking the application that reads it.