You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When claim-release.yml reports success, the claim is actually released — or the job goes red. A green run must never leave the assignee and claim:* label in place, because nothing downstream re-checks a run that said it succeeded.
Current violation (observed 2026-08-16, first org-repo field failure)
ponderousdev/lawnomator-site#100 was closed COMPLETED by merging PR #110. claim-release.yml ran, concluded success, and left both markers on the issue:
ponderousdev/lawnomator-site#100 has no trusted claim comment — nothing to release
That is exit 3, which the workflow deliberately treats as benign ([ "$rc" -eq 0 ] || [ "$rc" -eq 3 ] || exit "$rc") — correct for a genuinely unclaimed issue, and exactly what makes this failure silent.
A trusted claim comment did exist, posted by the claimant:
Same file (.agents/skills/track-work is a symlink to .claude/skills/track-work; md5 173443cc0e059da4adf77132d5c396ba both). Same flags. Opposite verdict. The only difference is the token.
Root cause (strong hypothesis — the one thing I could not mint a token to prove)
The trust predicate requires write-shaped author_association:
author_association is not absolute — GitHub computes it against what the requesting token may see. evanharmon1's membership in the ponderousdev org is private:
gh api orgs/ponderousdev/public_members/evanharmon1
# → HTTP 404: not a public member
A PAT with read:org therefore sees MEMBER (verified above). A bare secrets.GITHUB_TOKEN has no org-membership visibility, so it sees NONE, writeauth fails, the comment is filtered out, and the script correctly concludes there is no trusted claim.
On an org repo the owner prong (ponderousdev) never matches a user, so trust rests entirely on the assignee prong — and that prong is silently disarmed for every private org member. That is every claim this repo will ever make.
217 documents the org-repo trust gate stranding claims when the claimant is unassigned. This is a different trigger of the same gate: the claimant was a current assignee the whole time, and the trust still failed because the association degraded under the workflow's token
217's stated prerequisite — "an org repo actually adopting claim-release.yml" — is now met: ponderousdev/lawnomator-site has adopted it, and this is its first real close event. Distinct from #434 (markers with no claim record), since here the record is present and well-formed
Acceptance criteria
Confirm the hypothesis by reading author_association for this comment from a workflow running under secrets.GITHUB_TOKEN (log it, don't infer it) — release-claim.sh now logs every distinct author_association value a run actually sees, one line, per PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869
Stop exit 3 from being indistinguishable from success when markers survive. A run that finds live claim:*/assignee markers but no trusted claim should not exit green and silent — that is what let this pass unnoticed — PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869 adds a distinct exit 5
# The predicate that filters the comment out:
grep -n -A3 "def writeauth" .claude/skills/track-work/assets/release-claim.sh
# Is the claimant's org membership private (so a bare GITHUB_TOKEN sees NONE)?
gh api orgs/<org>/public_members/<claimant> --silent &&echo public ||echo private
# The end-to-end symptom, on any org repo that adopted the workflow:
gh issue list --repo <org>/<repo> --state closed --label claim:claude --limit 50
Any closed issue still carrying claim:claude means claims are being stranded under green runs.
Found while shipping ponderousdev/lawnomator-site#100. That claim was released by hand; the underlying gate is unchanged.
Invariant
When
claim-release.ymlreports success, the claim is actually released — or the job goes red. A green run must never leave the assignee andclaim:*label in place, because nothing downstream re-checks a run that said it succeeded.Current violation (observed 2026-08-16, first org-repo field failure)
ponderousdev/lawnomator-site#100was closedCOMPLETEDby merging PR #110.claim-release.ymlran, concludedsuccess, and left both markers on the issue:The run log (31920664204) says:
That is exit 3, which the workflow deliberately treats as benign (
[ "$rc" -eq 0 ] || [ "$rc" -eq 3 ] || exit "$rc") — correct for a genuinely unclaimed issue, and exactly what makes this failure silent.A trusted claim comment did exist, posted by the claimant:
…with a well-formed v1 claim record naming
claim:claudeandassignee added by this claim: yes.The same script, with the workflow's exact flags, releases it correctly when run locally:
Same file (
.agents/skills/track-workis a symlink to.claude/skills/track-work; md5173443cc0e059da4adf77132d5c396baboth). Same flags. Opposite verdict. The only difference is the token.Root cause (strong hypothesis — the one thing I could not mint a token to prove)
The trust predicate requires write-shaped
author_association:author_associationis not absolute — GitHub computes it against what the requesting token may see.evanharmon1's membership in theponderousdevorg is private:gh api orgs/ponderousdev/public_members/evanharmon1 # → HTTP 404: not a public memberA PAT with
read:orgtherefore seesMEMBER(verified above). A baresecrets.GITHUB_TOKENhas no org-membership visibility, so it seesNONE,writeauthfails, the comment is filtered out, and the script correctly concludes there is no trusted claim.On an org repo the owner prong (
ponderousdev) never matches a user, so trust rests entirely on the assignee prong — and that prong is silently disarmed for every private org member. That is every claim this repo will ever make.Relationship to #217
217 documents the org-repo trust gate stranding claims when the claimant is unassigned. This is a different trigger of the same gate: the claimant was a current assignee the whole time, and the trust still failed because the association degraded under the workflow's token
217's stated prerequisite — "an org repo actually adopting
claim-release.yml" — is now met:ponderousdev/lawnomator-sitehas adopted it, and this is its first real close event. Distinct from #434 (markers with no claim record), since here the record is present and well-formedAcceptance criteria
author_associationfor this comment from a workflow running undersecrets.GITHUB_TOKEN(log it, don't infer it) —release-claim.shnow logs every distinctauthor_associationvalue a run actually sees, one line, per PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869author_association— e.g. resolve membership/permission explicitly viarepos/{owner}/{repo}/collaborators/{user}/permission, or grant the workflow the scope needed to see private membership, or trust durable evidence (assignee at claim time via timeline events) as (claim): Org-repo trust gate strands claims when the claimant is #217 suggests — PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869 takes the timeline-evidence pathclaim:*/assignee markers but no trusted claim should not exit green and silent — that is what let this pass unnoticed — PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869 adds a distinct exit 5claim-release.ymlfor already-stranded claims — swept all 7 (lawnomator-site,ponderous-docs,ponderous-site,ponderous-infra,ponderous-content,foreman,omator) via PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869;ponderousdev/omator#659and#491are currently stranded (reported for the maintainer to release by hand, not released by the sweep) and the other 6 are clean — see PR fix(track-work): trust a self-assigned claimant in release-claim.sh #869's body for the full reportVerify
Any closed issue still carrying
claim:claudemeans claims are being stranded under green runs.Found while shipping ponderousdev/lawnomator-site#100. That claim was released by hand; the underlying gate is unchanged.