Development record
Outside contributors reserve work through a draft pull request that abcd honours
Press Release
Someone outside the project can reserve a piece of work too. They cannot push the claim branch abcd lists, which the project's own people use, so their agent opens a draft pull request named after the item instead, and everyone sees it on the website. abcd treats that draft as taken, so no agent of yours starts the same item, and a check refuses a second draft for the same item. When the draft is merged or closed, the item is free again.
Why This Matters
On 2026-10-03, with a second person joining the project and the repository public, the product thinker chose a claim branch abcd lists, on the shared remote, as the way the project's own people reserve work (itd-2609150819440345, decision 4, narrowed to a branch by itd-2609091034175565 decision 10). People outside the project cannot place that marker, so without this their agents would start items the project's agents already hold, the duplicate work iss-2609020716570699 records. The product thinker asked for this follow-up the same day, marked not urgent.
State of the art (2026-10-03, 2026-10-03-multi-agent-coordination-sota-and-run-lessons.md): forge-native claiming, such as the Rust project's bot that assigns an issue on a "claim" comment, or a draft pull request keyed to the item with a check refusing a second; projects taking agent contributions increasingly accept them only for issues accepted beforehand. Text an outside contributor writes (a title, a description) is untrusted input, read by its shape and never followed as instructions.
Typed links: Builds on itd-2609091034175565 (reserving an item with a claim branch abcd lists; its decision 10); the wider register is itd-2609150819440345; refines iss-2609020716570699 (duplicate work and duplicate pull requests).
Mechanism
Prompted (the claim-recording gradient): why the authors expect this to work, as a falsifiable "we expect X because Y" — not the outcome restated. Replace this line with the claim, or with the exact token
None stated.alone on its line to record the claim as considered and declined.
Scope Conditions
Required (the claim-recording gradient): the population, platform, scale, or assumptions this claim holds under, one per top-level bullet —
abcd intent planstamps each with a persistent identity. Replace this line with those bullets, or with the exact tokenNone stated.alone on its line.
Acceptance Criteria
Required (the itd-1 discipline): add at least one Given-When-Then bullet describing the verifiable bar for "shipped" before this draft can be planned.
Decisions
- 2026-10-03, the product thinker: filed as a follow-up to the claim branch abcd lists (itd-2609091034175565, decision 10), not urgent.
SOTA
Surveyed on 2026-10-03 in the multi-agent coordination note (its item 6 is this intent's case, S3: a writer without push access); the forge-side mechanics were re-checked on 2026-10-23.
- A claim is a compare-and-swap with a lease, re-checked at land (Kubernetes Lease fields; Kleppmann on fencing tokens). A draft pull request is the outside writer's version of the claim branch. It carries the same four fields (record id, holder, footprint, expiry) once the expiry is set by rule, because the forge sets none.
- The forge-native precedent is a bot turning a comment into an
assignment. On Rust's repositories
@rustbot claimassigns the issue to the commenter. A user without write access cannot be assigned, so the bot assigns itself and edits the issue's top comment to say who claimed it. "Only the current assignee or a team member can release an assignment" (triagebot issue assignment). This is the comment-plus-bot option in the open questions. It needs a running bot, where a draft pull request needs only a CI check. - Neither precedent expires on its own. The triagebot page states no
inactivity release. The forge's stale action defaults to 60 idle days before
marking and 7 more before closing. It can set pull requests apart
(
days-before-pr-stale,days-before-pr-close), and it exempts drafts only when told to (exempt-draft-pr, defaultfalse) (actions/stale). An outside reservation's expiry is a number this project chooses, and the stale action is a ready enforcer of it. - Overlapping footprints are common. Xu et al. measured a 41.7% conflict rate between different agents' concurrent pull requests (2026-10-03 note), so the draft's duplicate check should key on the record id and also compare the draft's changed paths with live reservations.
- A draft's title and body are untrusted input (the 2026 incidents in the 2026-10-03 note). The check reads only the record id from a fixed position, never free text.
Path 2: native, the draft pull request mapped onto the existing claim record (id from the branch name or title prefix, holder from the pull request's author, expiry by rule), with the duplicate check as one CI job, the stale action as the expiry enforcer, and a comment bot as a later backend behind the same record. No dependency. The independent fit-challenge runs at plan time.
Open Questions
- Whether a draft pull request, a claim comment that a bot turns into an assignment, or both reserve an item.
- Whether outside contributors may reserve any item, or only items the project has marked as open to them.
- How long an outside reservation lasts with no activity before the item is free again.
Audit Notes
Empty. Populated by intent-auditor when intent moves to shipped/.
Frontmatter
| id | itd-2610031259176838 |
|---|---|
| type | intent |
| lifecycle | drafts |
| severity | minor |
.abcd/development/intents/drafts/itd-2610031259176838-someone-outside-the-project-can-reserve.md
open on GitHub ↗ · commit history ↗
References1
- itd-2609091034175565Before an agent starts on an item, it reserves it on the shared remote, and everyone who works on the project sees the reservationbuilds on
Referenced by3
- adr-2610031352212697Claims are branches on the shared remote; nothing kept on one computer is the register; claim text is datarelated
- iss-2610262043379064itd-2610031259176838 tells people about 'the claim branch'; itd-2609091034175565 ruled the person-facing word is reservation and the branch prefix abcd-reserved/related
- itd-2609091034175565Before an agent starts on an item, it reserves it on the shared remote, and everyone who works on the project sees the reservationrelated
mentions5
- dcn-26100300000000012026-10-03 — Reserving work across people (product thinker, at an interactive interview, with a second person now working on this public repository). Rulings: anything kept on one computer (the local tier, a desktop note, same-account messaging) is never the record of who works on what, because the other person never sees it; an item is reserved by a reservation branch on the shared remote, `abcd-reserved/<record-id>`, which abcd lists and nobody merges, chosen over a hidden ref because a hosted cloud session can push branches only (probe of 2026-10-03 and the host's documentation); a hosted cloud session takes part exactly as a second person's machine does; itd-2609091034175565 is planned and built today with every acceptance criterion, and the session register itd-2609150819440345 stays a draft for later; outside contributors, who cannot push a claim branch, are the follow-up itd-2610031259176838, not urgent. The ruling of 2026-09-22 ("Cross-account and cross-machine agent communication stays out of the run") covered the run of 2026-09-23 only, confirmed by the product thinker today, so nothing is overturned. The 2026-09-09 ruling's two-release migration for a `claimed_by` stamp does not arise, because no stamp is written on any record (decided without a question: one defensible answer). The research and both reviews are filed as research/notes/2026-10-03-multi-agent-coordination-sota-and-run-lessons.md.
- iss-2609020716570699Nothing tells an agent that a record it is about to fix has been claimed or resolved by another session until the resolution gate refuses the push. In one night a peer session re-fixed two issues a paused branch also fixed, and two of its open PRs duplicate merged work. The claim signal that worked in every published multi-agent run is the repository itself: a claim written into the open record (claimed_by: account and harness, branch) and pushed alone through the queue before any fix starts, so a losing race is a push rejection; plus a duplicate-guard required check that fails a PR whose Resolves trailer names a record already resolved on origin/main; plus capture resolve refusing a record that is already terminal on the fetched origin/main. Folder membership is already the status signal, so the claim extends the one canonical primitive rather than adding a lock file that rots. Refines iss-2608220750029993.
- itd-1Every Intent Has Acceptance Criteria; Every Audit Verifies Them
- itd-2609150819440345Which session holds which worktree, branch or record is coordinated entirely by conversation, so every new session repeats a handshake that nothing records. A session joining work in progress has no way to ask what is already claimed: it messages the peers it can see, waits for replies, and rebuilds a picture that the sessions before it had already built and did not write down. One measured encounter cost four messages and about fifteen minutes before any work began, and the picture it produced is not durable, so the session after that pays again. The convention that a diff you did not make is a peer's work depends on knowing who the peers are and what they hold, which is precisely the thing no artefact carries. The repository already records this gap for the narrow case of detecting a peer session before mutating git state; the wider case is claim rather than presence, and the two want the same substrate. Whatever holds it should be as cheap to write as it is to read, because a coordination record nobody updates is worse than the chat it replaced.
- spc-2610031753359849Reservations on the shared remote: `abcd reserve`, one liveness judgement, and the build, drain and land integration