Public: anyone can read this; the crew can change it.

A pull can be held: it never lands by rule until a person releases it #780

Merged opened this in answer to

Check · Review · Land · Live done — Landed and live in production.

Merged

Closes #773

shipped production is serving it for issue #773 — its issue is already done deploy e61e234

opened this

Closes #773

In progress. Here now: how a hold is kept (migration 49, pull_hold, and src/core/holds.ts). Coming in this pull, pushed once when it is ready: a person who writes the repository holds and releases a pull; a held pull is never sent to the reviewer by rule and never lands by rule, while a person's own merge still works; a release restarts the review clock, so holding and releasing is no way past the review; the hold shows on the pull, the change page and the map with who and why; a button, PUT/DELETE …/pulls/:n/hold and an MCP tool that runs dry by default; no ask for the person who set it. The refusing tests come first. The full description will be a comment, since a pull's body cannot be edited.

🤖 Generated with Claude Code

commented

A pull can be held (#773)

A person who writes the repository says "not this one yet" about an open pull, with one line of why, and lets it go later. While the hold stands, no rule touches the pull.

What a hold stops, and what it does not

  • Stops the rules. landIfGreen does nothing with a held pull and sendToReview sends nothing, whoever asks: the check event, an approval, the sweep. A held pull is not brought up to date by the crew and not parked either (parking would close it and hand its issue back to be built again beside the one told to wait).
  • Does not stop a person. Whoever may merge the pull still may; the merge path is untouched.
  • Releasing restarts the review clock. Review is owed from when the head went green or from when the pull was last let go, whichever is later. A pull held past the hour and released goes to the reviewer like any newly green one; it is never landed as "lapsed".
  • Who. A person who can write the repository. An agent is refused even on the crew, with any token; a reader and a stranger are refused as everywhere (a pull they cannot see answers exactly like one that does not exist). Any person who writes may release, not only the one who held it: the issue's acceptance says so, and a hold nobody else can lift would outlive a person's holiday.

Where it is reached

DoorHow
Change page"Hold this change" (one line of why) and, on a held change, "Release"
APIPUT / DELETE /api/v1/repos/:owner/:name/pulls/:number/hold; GET …/pulls/:number now carries `hold: null \{ by, why, at }`
MCPhold { app, pull, why?, release?, dryRun? }, a dry run unless dryRun: false; a read-only token may plan, never act

Where it shows

  • The change page and the pull's own page: who holds it, since when, and why.
  • The map: the issue the pull answers says held (its own word and colour, counted in the summary and in the map's JSON as heldBy).
  • The activity feed: pull.held, pull.released.
  • Asks: a held pull asks nothing of the person who holds it; other people who write are still asked. In the asks ledger the holder's ask ends as acted, not as noise.

How it is kept

One table, pull_hold (migration appended last; 53 on today's main). A release is kept, not deleted: that is what the review clock restarts from. At most one hold stands per pull.

Tests (test/holds.test.ts, 20, in the gate)

Refusing tests were written first: a reader, a stranger, a person who cannot see the repository, a crew agent and a read-only token cannot hold or release, by the API, the MCP tool, the form or the action. Then: a held green pull does not land, with or without an approving review; it is not sent to the reviewer by the landing rule, a direct ask or the sweep; hold-then-release is not a way past the review; a held pull is not parked; a person's merge still works; the API, the MCP dry run, the pages, the map and the asks.

Each guard was removed once to see its test fail: the landing guard, the review guard, the clock restart and the ledger rule.

Not in this pull

  • A held pull whose check goes red still gets its builder's fix runs, up to the usual limit; then it waits for a person instead of being parked.
  • Nothing wakes the rules the moment a pull is released: the next tick's sweep picks it up.

🤖 Generated with Claude Code

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs