chore(contributing): make issue claims visible and expire them - #859
Merged
Conversation
Deploying offlinecv with
|
| Latest commit: |
bc2ed4a
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://82a342a5.offlinecv.pages.dev |
| Branch Preview URL: | https://chore-claim-visibility-and-e.offlinecv.pages.dev |
s-annam
commented
Aug 16, 2026
s-annam
left a comment
Contributor
Author
There was a problem hiding this comment.
Review Summary
Verdict: APPROVE (0 Blocking findings; mechanism is sound, safe-by-construction, and fully non-destructive).
This PR introduces status:claimed visibility and an automated expiry workflow (.github/workflows/stale-claims.yml) to resolve issue-claiming collisions (like the #681 / #832 incidents). The design is clean, conservative, and reversible.
Gates & Quality Pass
- Verification Suite:
npm run verifypassed cleanly (5,864 tests green, typecheck clean, lint clean, fallow clean). - Fixture PII: N/A (no fixture files touched).
- Design System / Style Tokens: N/A (no frontend code touched).
- Dead Code / Fallow: Clean (0 issues in changed files).
- Description Audit: Accurate claims; correctly documents behavior and manual dry-run workflow.
Findings Summary
- Blocking: 0
- Secondary: 2 (cross-repo timeline scoping, loop error resilience)
- Nits: 2 (workflow concurrency group, self-assignment doc polish)
Reviewed by: Gemini 3.7 Flash (high)
Two contributors independently built #681 while it was assigned to a third, because the claim was invisible: `gh issue list` prints labels and not assignees, and on the web list the assignee is a small avatar in the right margin. Pair the assignee with a `status:claimed` label so a claim is readable without opening the issue, and document the two-signal rule in CONTRIBUTING — including the corollary that a contributor with write access who self-assigns must add the label themselves, since self-assignment skips the maintainer step that would otherwise attach it. 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. Add a daily `stale-claims.yml` job that drops the assignee and the label after 7 days with no activity and no linked PR, commenting to say what happened and how to take the claim back. It never closes an issue, never edits a body, and everything it does is reversible by re-assigning and re-adding the label. The open-PR exemption is scoped to this repository on purpose. `cross-referenced` timeline events fire for a reference from any public repo on GitHub, including a PR opened on a personal fork against the fork's own `main` and never submitted here; unscoped, any of those would exempt a claim forever. Per-issue mutations run under try/catch so one locked issue or concurrently-removed label cannot halt the batch, and a queueing concurrency group keeps a manual dispatch from double-commenting over the scheduled run.
s-annam
force-pushed
the
chore/claim-visibility-and-expiry
branch
from
August 17, 2026 00:13
18e7093 to
bc2ed4a
Compare
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.