feat: exempt offsite claims from reclaim clock #70
No reviewers
Labels
No labels
attention
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-ruling
needs-triage
offsite
post-merge
ready
release
scope:docs
scope:guards
scope:labels
scope:release-flow
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/ceremony#70
Loading…
Reference in a new issue
No description provided.
Delete branch "build/68-offsite-claim-exemption"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #68
Summary
offsitetaxonomy labeloffsiteandneeds-rulingthrough one claim-clock exemption gateAcceptance criteria
claimed+offsiteissue with no linked open PR and over 48h inactivity is not reclaimed.offsiteis reclaimed.claimed+offsiteissue with no assignee still gets theclaimed-unassignedflag.claimed+offsitedoes not tripFLAG_CONFLICT;offsitealone getsneeds-triage.needs-rulingexemption tests remain unchanged and green.offsite.core_label_rows()carriesoffsite|CFD3D7.test/run.shgreen; shellcheck- and actionlint-clean.Worklog
LABELS.md,BUILDER.md, andCHANGELOG.md.hygiene.shspecification on #68.@danmt — operator ask: after this PR lands, please run the labels workflow via
workflow_dispatchso bootstrap creates the coreoffsitelabel (CFD3D7). The triage identity cannot dispatch that workflow (gh workflow runreturns 403), and bootstrap is dispatch-only. Please link the workflow run here once it happens.🔎 reviewing head
4b7747a2f5🔎 reviewing head
4b7747a2f5Verdict: approve
Reviewed head
4b7747a2f572fcc29b14d29f396344c150cebdbfagainst #68's acceptance criteria and decisions D1–D8.Acceptance criteria
claimed+offsite, no local open PR, ≫48h quiet → not reclaimedclaim_clock_exempt→ age 0; fixture "a 10-day-quiet offsite claim is not reclaimed"offsite→ reclaimedclaimed+offsitestill getsclaimed-unassignedclaimed+offsitedoes notFLAG_CONFLICT; bareoffsite→needs-triagequeue_decisionignoresoffsiteas a queue categoryneeds-rulingexemption still behaves as #52 left itruling_stale_exemptgrep -c offsiteon issueflow-reconcile is 1 (insideclaim_clock_exempt)offsite(D4)core_label_rows()offsite|CFD3D7blockedtest/run.shgreen; shellcheck-/actionlint-cleanDesign fit
claim_clock_exemptgate at the claimed branch;lib/ruling.shstill owns the ruling rule; no duplicated flag list.hygiene.shspec comment on #68 are present as required tasks.Verification
./test/run.shall green (including the new offsite pure-function and fixture rows).shellcheck -xclean on the issueflow change; GitHub checks all pass.No blocking findings. Non-blocking: the "offsite + open PR" fixture documents intent but does not isolate the exemption (open_pr alone already yields KEEP) — fine as a regression guard.
Approve.
🔎 reviewing head
4b7747a2f5Approve — head
4b7747a2f572fcc29b14d29f396344c150cebdbf, reviewed against #68's acceptance criteria and decisions D1–D8.Verified by running, not reading:
test/run.sh. My sandbox lacksnode(and initiallyjq); after supplyingjq, the only failures are the node-dependentpackage-jsonversion tests, which fail identically onorigin/main— environmental, not this PR. Every issueflow test, including all new offsite rows, passes.testjob's Shellcheck, Actionlint, and Tests steps — covering the "shellcheck- and actionlint-clean" criterion my sandbox cannot.offsitearm ofclaim_clock_exemptin a scratch copy → exactly the guard tests went red (offsite exempts the claim clock, the 10-day-quiet reclaim fixture, the unassigned-flag fixture, the named-once grep). The guard is load-bearing, not vacuous.Acceptance criteria walk:
claimed+offsite, no local PR, 10 days quiet → not reclaimed; flag-free control is reclaimed — both pinned by fixtures drivingreconcile_issuethrough a stub. ✓issueflow:claimed-unassigned(exempt runs the decision at age 0, per D5/#52's shape). ✓queue_decision:claimed\noffsite→ KEEP,offsitealone → ADD_NEEDS_TRIAGE; #52's ruling rows re-run unmodified and green. ✓claim_clock_exempt()sits besideclaim_decision(), delegates the ruling half toruling_stale_exempt, and is the branch's single consult; the test greps thatoffsiteis named exactly once in the reconciler. ✓offsite— grep-pinned across both reconcilers. ✓offsite|CFD3D7lands incore_label_rows()next toblocked, not inlabels.conf. ✓hygiene.shspec comment is on #68. ✓Non-blocking nit:
claim_clock_exempt's comment says cross-repo silence "must share the one claim-clock gate with rulings" — accurate, though a reader has to openruling_stale_exemptto learn the ruling half's why. Fine as-is; the function name carries the intent.Approve — head
4b7747a2f572fcc29b14d29f396344c150cebdbf, reviewed whole against #68's spec.Verified, not opined
test/run.sh— 15 test files, 0 failures..github/scripts/shellcheck-all.shclean (33 scripts),actionlintclean.offsitearm ofclaim_clock_exemptand re-ran: 4 checks fail, including "a 10-day-quiet offsite claim is not reclaimed" and "an unassigned offsite claim is still flagged" — so both the exemption and the age-0FLAG_UNASSIGNEDbehavior are genuinely pinned to this gate, not passing for an unrelated reason. Restored cleanly.claim_clock_exempt()sits besideclaim_decision(), folds inruling_stale_exempt(whichlib/ruling.shstill owns, untouched), and is theclaimedbranch's single consult.grep -c offsiteon the reconciler = 1, and the test pins that.offsite; the grep-level test covers both reconcilers, matching #52's precedent.FLAG_UNASSIGNEDstill runs (age-0 re-run, #52's shape);queue_decisiononclaimed+offsite→KEEP,offsitealone →ADD_NEEDS_TRIAGE;labels-reconcile.shPR-side stale logic untouched.issue_probeharness gained optional assignee/open-PR params with defaults preserving every existing call; no #52 fixture row was edited.offsite|CFD3D7incore_label_rows()next toblocked(D6, D7 — not inlabels.conf); LABELS.md cross-cutting row plus the paragraph afterneeds-ruling's; BUILDER.md's two edits land in the existing Claiming/Building prose; changelog line inserted above the heading below, and it does not cite the polling saving (D8).hygiene.shspec comment is on #68 and correctly claims only the spec, not the change.Non-blocking nits (builder's discretion)
#50 D10citation the old one carried. The rationale still lives inruling_stale_exempt's own comment inlib/ruling.sh, so nothing is lost from the tree — but the branch comment is now the only one in that block with no incident number, against the repo's comments-carry-the-incident convention.claimed offsite, 1h →KEEP"for the ordinary reason") is pinned asclaim_decision 1 false 3600— the pure function without the label. It demonstrates the ordinary-age keep, which is the row's intent, but a probe through the exempt path at 1h would have matched the table literally. Not worth a round on its own.Closing round summary
What shipped
offsitelabel (CFD3D7) to bootstrap taxonomy.offsiteandneeds-rulingthrough one claim-clock exemption gate, while preserving unassigned-claim flags and the ordinary queue invariant.BUILDER.mdandLABELS.md, and recorded the behavior change inCHANGELOG.md.Rounds
6a9b501, then added4b7747ato keep the new fixture shellcheck-clean before review began.4b7747a2f572fcc29b14d29f396344c150cebdbf): @grok-bot-andresmgsl, @kimi-bot-andresmgsl, and @claude-bot-andresmgsl approved. No blocking findings or requested changes; no post-review code changes were needed.Verified
test/run.shpassed at head (15 test files, 0 failures); ShellCheck and Actionlint are clean.offsiteexemption arm—made the intended guard checks fail, confirming the new gate is load-bearing.needs-rulingexemption rows remain green;offsiteappears at one decision point; neither reconciler adds or removes it.Post-merge residue
offsite, then link the run here. The operator ask is already recorded above.hygiene.shexemption specified on #68; that file is outside this repository and was intentionally not changed by this PR.