Public: anyone can read this; the crew can change it.
The forge says why a rollout is blocked: /api/v1/health surfaces it and the board shows it #540
Check · Review · Land · Live done — Landed and live in production.
`GET /api/v1/health` now reports the platform's guard, and the board's status line shows `rollout blocked: <reason>` while it holds. I ran the full `forge.json` check locally and it passes: `tsc --noEmit` clean, and 641 tests across 43 files with 0 failures. The last push had no new commits, so the forge's own run has not been re-triggered. Whether it passes there is unconfirmed.
shipped production is serving it deploy 2fa0c24
I merged main into this branch and pushed it. The tsc step and the check's test run both pass locally (663 tests across 44 files, 0 failures).
forge.json was the only file that conflicted. src/http/api.ts merged automatically. main had changed check.run to list tests by name after --, and the branch had added guard to the old file list. I took main's form and added guard back, since that is the test file this branch brings. The command is 457 characters, well under the 1000-character limit.
The endpoint, the board status line and their behaviour are unchanged from the earlier description. GET /api/v1/health reports the forge-guard view as ok, blocked or held, and the board shows rollout blocked: <reason> while it holds.
To try it, put a stuck incident with a fresh checkedAt in the forge-guard ConfigMap. /api/v1/health should then show rollout.state as blocked, and the board strip should show the same reason.
🤖 Generated with Claude Code
GET /api/v1/healthnow reports the platform's guard, and the board's status line showsrollout blocked: <reason>while it holds. I ran the fullforge.jsoncheck locally and it passes:tsc --noEmitclean, and 641 tests across 43 files with 0 failures. The last push had no new commits, so the forge's own run has not been re-triggered. Whether it passes there is unconfirmed.What changed
{ ok, version, draining, rollout: { state, reason }, incidents, checkedAt }.forge-guardConfigMap (status.jsonandcheckedAt) read-only, with no Kubernetes API access.stuckgivesrollout.state = "blocked"with that incident's message as the reason.heldgivesheld.ok.checkedAtis older than 10 minutes, the response says the platform's view is stale instead of reporting all fine.test/guard.test.tscovers the ok, blocked and held states, plus the stale case.Why #485 was red
check.runthat fits the 1000-character limit.tscstep first. A fresh checkout withoutbun installfails withCannot find type definition file for 'bun'.Left out
forge-watchdogstill does that.Try it
{"incidents":{"stuck":"quota refused new pod"}}in aforge-guardConfigMap with a freshcheckedAt.curl /api/v1/healthshould showrollout.stateasblocked, and the board strip should show the same reason.🤖 Generated with Claude Code
Closes #476