diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d0871c..16523f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ so entries say what changed, cite the issue, and stop. - `needs-ruling` — the cross-cutting flag for a pending human decision, excluded from `state:needs-human` and from the staleness sweep (#51). - Cross-repo doctrine: the panel is the PR's repo's roster, a review request is authorization but not panel membership, and `Part of #N` replaces the `Closes #N` that cannot cross repos (#57). - `actions/runner-isolated` — a `pull_request`-triggered job may never run on a self-hosted runner (#58). +- The sweep's `needs-ruling` invariants, one implementation for both surfaces: the issue-side staleness exemption, the bare-flag check (comment-only, the label is never removed), and the 7-day nudge to the decider (#52). ## 0.1.0 — 2026-07-22 diff --git a/LABELS.md b/LABELS.md index d617129..5d3def5 100644 --- a/LABELS.md +++ b/LABELS.md @@ -89,7 +89,15 @@ disagrees that agreement was reached, the label goes back on. The machine reads it and never writes it: the reconciler refuses `state:needs-human` while it stands (the PR falls to `state:addressing` — the ball on the PR is the builder's, who carries the ruling in), and the staleness sweep skips -it, because waiting on a human is legitimately quiet. +it, because waiting on a human is legitimately quiet. Quiet, but not +unwatched (#52, both surfaces): a flag set with no escalation comment from +its setter is called out by the sweep — comment-only, scoped to the labeled +event, the label never removed — and a ruling with no real activity for 7 +days draws a comment-only nudge addressed to the decider, linking the +escalation. The nudge carries no marker on purpose: the comment is itself +activity, so it resets its own window and never repeats within a quiet +week. Label churn is not activity — the clock reads comments, reviews and +commits, or the sweep would reset itself. ## Scope — which surface? (PRs and issues, any number) diff --git a/docs/CONSUMERS.md b/docs/CONSUMERS.md index 1f38c91..bea4151 100644 --- a/docs/CONSUMERS.md +++ b/docs/CONSUMERS.md @@ -226,9 +226,12 @@ build (#15) and incubator's GHCR image push (#16). ## Labels automation The reusable labels workflow owns two independent jobs: additive path-based -`scope:*` labels and reconciliation of PR state, blockers, handoff, and stale -status. The consumer keeps its path mapping in `.github/labeler.yml` and its -review panel plus scope taxonomy in `.github/labels.conf`. +`scope:*` labels and reconciliation of PR state, blockers, handoff, stale +status, and the `needs-ruling` invariants on both surfaces — the bare-flag +check and the 7-day comment-only nudge (#52; the sweep reads that flag and +never writes it). The consumer keeps its path mapping in +`.github/labeler.yml` and its review panel plus scope taxonomy in +`.github/labels.conf`. The complete caller is: @@ -253,6 +256,8 @@ jobs: `pull_request_target` is intentional: fork PRs need the base repository's token to write labels. The reusable workflow executes no PR code. It checks out only the consumer's base branch and the pinned ceremony implementation. +The #52 ruling invariants ride exactly these triggers — the caller above is +unchanged since #18, so adopting them is a pin bump, not a stub edit. `.github/labels.conf` has one mandatory panel setting, one mandatory `triage-actors` setting, and then zero or more scope rows: