Resolve labels from the org, and never touch a held issue #4
Labels
Clear labels
Compat
Breaking
Breaking change that won't be backward compatible
Kind
Documentation
Documentation changes
Kind
Enhancement
Improve existing functionality
Kind
Feature
New functionality
Kind
Question
A question that has to be answered before the work can be specified
Kind
Security
This is security issue
Kind
Testing
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
4
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
On Hold
3
Deliberately deferred. Not blocked by a dependency and not waiting on a fact
Status
Abandoned
4
Somebody has started to work on this but abandoned work
Type
Bug
Something is not working
Type
Chore
Infrastructure, CI, tooling or packaging. No user-visible change
Type
Epic
An umbrella issue with sub-issues. Never worked directly
Type
Meta
About how work is done here rather than about the code
Type
Spike
The deliverable is a measurement or a decision, not merged code
Type
Task
An ordinary unit of work with a deliverable. The default
Milestone
No items
No Milestone
Notifications
Due Date
No due date set.
Reference: weblib/weblib-ci#4
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #3. Two fixes — the first is a live regression I caused today, the
second stops one before it arms.
1. The reconciler was a silent no-op
label_id()resolved the label fromrepos/{repo}/labelsonly. Labels movedto the organisation today (weblib-archive#63), that endpoint now returns
[]in all five repos, so it returned
Noneeverywhere:It failed safe — skipping rather than mislabelling, which is exactly what
that docstring was written for — but a job running every 15 minutes was
reporting success while doing nothing at all. Now it tries the repo, then the
org, so it does not care how a given instance is arranged.
2.
HANDS_OFF— never touch a held issueImplemented literally: neither add nor remove, and the issue is skipped
before its dependencies are even fetched.
This is not cosmetic.
Status/*is becoming exclusive again, and under that anadd does not sit beside an existing status — it replaces it. So the
reconciler would silently delete a deliberate
Status/On Holdon its nextpass. And
On Holdis precisely what makes the backlog sweep skip an issue, soa parked issue would quietly become an available one, with nothing in the log
to explain it.
Status/Need More Infois deliberately not inHANDS_OFF, because that iswhat bit specified. Worth knowing that under exclusive
Status/*it can stillbe evicted by an automatic
Blocked— flagged rather than silently widened,since it is bit's rule to set.
Verified against the live forge, not by reading
Add path, org-resolved — stripped
Status/Blockedoff cfbypass#8, which isgenuinely blocked by #9 and #7:
Hands-off, as a control — one issue, one open blocker, changing only the
label:
Same issue, same dependency, opposite outcome — so the guard is doing the work
and not merely coinciding with a no-op run. The temporary dependency was
removed afterwards and #62's labels are intact.
Note on the log line
A skipped issue now prints
hands off <repo>#<n> (Status/On Hold). The failurethis replaces was invisible; anything the reconciler declines to do should say
so, or the next person debugging it is back where I was ten minutes ago.
Two fixes. The first is a live regression I caused today; the second stops one before it arms. 1. `label_id()` looked the label up in `repos/{repo}/labels` only. Labels moved to the organisation today (weblib-archive#63) and that endpoint now returns `[]` in all five repos, so it returned None everywhere and the whole script became a silent no-op: $ sync_blocked_label.py --repo weblib/weblib-archive --dry-run skipped: no 'Status/Blocked' label in this repo --> 0 change(s) It failed *safe* - skipping rather than mislabelling, which is what that docstring was written for - but a job that runs every 15 minutes reported success while doing nothing. It now tries the repo, then the org, so it does not care how an instance is arranged. 2. bit, 2026-09-07: "the reconciler must not touch issues that are already on hold or abandoned". Implemented literally - neither add nor remove. This matters because `Status/*` is becoming exclusive again. Under that, adding `Status/Blocked` does not sit beside an existing status, it *replaces* it - so the reconciler would silently delete a deliberate `Status/On Hold` on its next pass. And since On Hold is exactly what makes the backlog sweep skip an issue, a parked issue would quietly become an available one, with nothing in the log to say why. Verified against the live forge rather than by reading: * add path, org-resolved: stripped Status/Blocked off cfbypass#8, dry-run said "would add", the real run added it back * hands-off, as a control on ONE issue with ONE open blocker, changing only the label: without Status/On Hold -> "would add Status/Blocked ... (blocked by #54)" with Status/On Hold -> "hands off", 0 changes, label intact Closes #3 Co-authored-by: bit <bit@das-labor.org>Needs your approval — I cannot merge this one.
mainis protected here and weblib-ci has nodevelopmentbranch, so every PRin this repo targets
mainand needs you. Review requested.Until it merges the reconciler does nothing, in all five repos, and says so
only in its own log:
The 15-minute job keeps reporting success. Nothing is being corrupted — it
fails safe — but
Status/Blockedhas not tracked the dependency graph sincethe label migration earlier today, and will not until this lands.
Both fixes are verified against the live forge, and the second one is the rule
you gave me:
Implemented literally — neither add nor remove, skipped before its dependencies
are even fetched. The control test is on the PR body: same issue, same open
blocker, only the label differing —
would addwithoutStatus/On Hold,hands offwith it.