chore(contributing): make issue claims visible and expire them - #859
Open
s-annam wants to merge 1 commit into
Open
chore(contributing): make issue claims visible and expire them#859s-annam wants to merge 1 commit into
s-annam wants to merge 1 commit into
Conversation
Two contributors independently implemented #681 while it was assigned to a third, and two more collided on #832 the same day. The assignment was not missing — it had been in place for 17 days. It was invisible. `gh issue list` prints labels and not assignees, and the web list renders the assignee as a small right-margin avatar. Both collisions landed on issues labelled `good first issue`, which is the filter used by exactly the people least likely to open an issue and read its sidebar first. Claim state was being stored in a field nobody browsing the backlog can see. So put the claim in the channel people actually read: - `status:claimed` (created on the repo) rides alongside the assignee and shows up inline in every list view, including `gh issue list`. - CONTRIBUTING.md gains a "Claiming an issue" section — check the label before starting, comment to claim, and what happens when a claim lapses. The repo had no claim protocol documented at all. - `stale-claims.yml` releases a claim after 7 days with no linked PR and no activity, because a claim that never expires reads as abandoned and people route around it, which is the failure this is meant to prevent. The job is deliberately narrow: it never closes an issue, never edits a body, and never touches a claim with an open linked PR. Any activity resets the clock, so a one-line "still on it" holds a claim indefinitely. It comments whenever it releases one, and everything it does is undone by re-assigning. `workflow_dispatch` takes a `dry_run` input for checking its selection before trusting the cron.
Deploying offlinecv with
|
| Latest commit: |
56a683f
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://77ff5f4a.offlinecv.pages.dev |
| Branch Preview URL: | https://chore-claim-visibility-and-e.offlinecv.pages.dev |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Claim state for an issue lived only in the assignee field, which is invisible in every channel a contributor browses. This puts it in a label, documents the protocol, and expires claims that go quiet.
No product code is touched —
CONTRIBUTING.mdand one new workflow.Why
On 2026-08-16, four PRs arrived for two issues:
The #681 case is the interesting one. The assignment wasn't missing; @rohithgollapalli self-assigned on 2026-07-30. Two contributors still built it independently, because:
gh issue listprints labels, not assignees. The default table is number / state / title / labels / updated. A contributor scanning the backlog from the CLI sees no claim signal at all.good first issue. That label selects for newcomers and for tooling that scans the backlog — precisely the population least likely to open an issue and read its sidebar before starting. One of the four PRs arrived onmanus/*branches, which points at agent-driven contribution; that reads labels and issue text, not avatars.CONTRIBUTING.mdhad no claim protocol. 193 lines on setup, branches, commits, PRs, tests, style, filing and the board — nothing on how to pick up work. The onlyassignmatch in the file is an env-var assignment.Storing the claim where nobody looks is the whole defect. Three contributors lost an evening to it in one day.
What changes
1.
status:claimedlabel — already created on the repo and applied to #681 and #832. It rides alongside the assignee and appears inline in every list view:That line is what both contributors saw before; it now carries the claim.
2.
CONTRIBUTING.md→ "Claiming an issue" — check the label before starting, comment to claim, a maintainer assigns and labels, what happens when a claim lapses. Also states that a maintainer-initiated assignment is a request, not an obligation.3.
.github/workflows/stale-claims.yml— daily job releasing a claim after 7 days with no linked PR and no activity.A claim that never expires is worse than no claim: it reads as abandoned, so people route around it and the label stops meaning anything. A 17-day-old claim is exactly what this incident ran into.
The job is deliberately narrow:
status:claimed-with-no-assignee state tooworkflow_dispatchtakes adry_runinput so its selection can be inspected before the cron is trusted.Verification
npm run verifygreen (pre-push gate): typecheck, lint, gates, tests, build, fallow.github-scriptbody passesnode --check.gh issue list --label "good first issue"— see the table above.The scheduled job has not run yet. Recommend one
workflow_dispatchwithdry_run: trueafter merge to confirm its selection before the first real cron; it writes nothing in that mode.Deliberately not included
good first issuewhile claimed. It attacks the magnet more directly but churns labels and loses the newcomer-friendly signal on an issue that may be released a week later. Worth revisiting if collisions continue.Follow-up
@rohithgollapalli's claim on #681 has been released and they've been notified on the issue; #681 and #832 are now assigned to @shubhransh-gupta, who has approved work on both.