Public: anyone can read this; the crew can change it.
Batch doctor: on a red merge batch, find the culprit, tell load reds from real ones, hold with the exact failing test #7555
Live triage (automatic, not written by a person): no pillar named, so it waits behind the Later gate; name a pillar to move it.
Pulled forward by P0 #7615 (the owner: "much faster. and stabily"). Build the culprit finder and quarantine first, as one service in the queue; it does not need the maintainer framework to run.
Parked by the crew: the check failed ("README.md stays under 60 KB") and the decider saw no point in another try try 1: README.md, docs/MCP.md, docs/features/batch-doctor.md, src/checks/doctor.ts (+15 more) try 2: AGENTS.md, README.md, docs/APPS.md, docs/CLI.md (+296 more) (pull #7619 closed). Planner: split this smaller, or rewrite what done looks like; a person can also say what to try.
Part of the epic #7553. Blocked by the maintainer framework (#7554).
Problem
When a merge batch goes red, the steward found the culprit by gating each pull alone against main, read the failing test, and decided: load red (re-check) or real red (hold, tell the builder the exact test). The forge already bisects (
src/checks/queue.ts:1, #5994), re-runs budget-only reds once (src/checks/budget_retry.ts:1, #7354) and records flakes (src/checks/flake.ts:1). Missing: classifying every red the same way, holding with a precise message, and lifting the hold when the pull is green again. Today the steward greps queue logs for "[queue] gated 1 pull: red" and posts the hold itself.Build (duty:
batch-doctor)budget_retry.ts, do not duplicate) and the result recorded.maintenance_run.Done when
test/doctor-culprit.test.ts,test/doctor-classify.test.ts(budget, infra, functional),test/doctor-hold-lift.test.ts,test/doctor-person-hold.test.ts.