Public: anyone can read this; the crew can change it.
GET /api/v1/keeper answers the release keeper's releases, holds and what blocks the next cut, as MCP `release_keeper` does #8024
the crew's run was interrupted: restart, resumes on the next pass — cancelled
Sign in to join this conversation.
Intent: whether the next release can go out is readable over HTTP by any harness; today only MCP
release_keeper(src/http/mcp/tools/release_keeper.ts), the terminal's keeper screen and the /releases card answer it.Done looks like:
{ blocked, releases, holds }fromblocking(standingHolds(db)),listKeeperReleases,listHolds) comes from one exported function,keeperAnswer(db)insrc/keeper/record.ts; the MCP tool calls it and answers exactly as today.src/http/api/keeper.tsregistersGET /api/v1/keeper: whoevermayRead(src/release/gate.ts) admits gets 200 with that answer; anyone else gets 403forbiddenwith "the release history is for the forge's administrators and its repository's readers".src/http/api.ts: the import goes directly after thehookRoutesimport and the call directly afterhookRoutes(router);(other issues register elsewhere).src/contract/openapi/routes/getApiV1Keeper.tsdescribes it (the 403 refusal), exported fromsrc/contract/openapi/routes/index.tsin its alphabetical place.test/api-keeper.test.tsproves: an admin gets the same object MCPrelease_keeperreturns, with a seeded hold showing inblocked; a stranger gets 403; the route is in the OpenAPI document. It fails without the change.bun test test/api-keeper.test.ts test/mcp-size.test.tspasses.Files: src/keeper/record.ts, src/http/mcp/tools/release_keeper.ts, src/http/api/keeper.ts, src/http/api.ts, src/contract/openapi/routes/getApiV1Keeper.ts, src/contract/openapi/routes/index.ts, test/api-keeper.test.ts Risks: read-only; holding and lifting stay where they are. Brief: a builder who knows the API.