forked from heavy-duty/ceremony
labels: name what the hourly cron uniquely covers (#199 round)
The trigger comments, CONSUMERS stub, changelog, and reusable labels.yml comment said "events carry every real state change in seconds; the cron only backstops a forgotten handoff." That is backwards: no subscribed event wakes this sweep for a review verdict landing (no pull_request_review trigger), blocker:ci-red set/cleared, blocker:conflict when another PR merges, or the time-based stale/48h-reclaim. The hourly cron is the sole discovery path for those four classes, not a forgotten-handoff net — so the comments now name them and warn against deleting the cron (AC5). codex-2 / kimi-2 (both blocking, round 2 @0a812c4b).
This commit is contained in:
parent
0a812c4b19
commit
8cf3c335df
4 changed files with 31 additions and 19 deletions
14
.github/workflows/labels.yml
vendored
14
.github/workflows/labels.yml
vendored
|
|
@ -10,12 +10,14 @@ name: labels
|
|||
# and reconcile checks out the BASE branch only. Keep it that way.
|
||||
#
|
||||
# There is no pull_request_review_target, so a review landing cannot wake this
|
||||
# workflow directly — and the caller's cron is a backstop, not the wake (#199
|
||||
# relaxed it from */15 to hourly): GitHub deprioritises short intervals anyway,
|
||||
# so a quiet repo goes a while between ticks. The handoff wakes the sweep
|
||||
# itself: the author sets state:needs-human, and the caller's `labeled` event
|
||||
# confirms or corrects that optimistic write within seconds. The cron stays as
|
||||
# the last resort for a forgotten handoff.
|
||||
# workflow directly — which is why the caller's cron is load-bearing, not a
|
||||
# safety net (#199 relaxed it from */15 to hourly, but did NOT drop it). The
|
||||
# cron is the sweep's only discovery path for every transition no subscribed
|
||||
# event carries: a verdict landing, blocker:ci-red set/cleared, a
|
||||
# blocker:conflict when another PR merges under this one, and the time-based
|
||||
# stale / 48h claim-reclaim. Where an event IS subscribed the wake is direct —
|
||||
# the handoff sets state:needs-human and the caller's `labeled` event confirms
|
||||
# or corrects that optimistic write within seconds.
|
||||
#
|
||||
# This cannot loop: reconciler writes use GITHUB_TOKEN, and GitHub does not
|
||||
# create workflow runs from GITHUB_TOKEN-triggered events. Agent writes use a
|
||||
|
|
|
|||
14
.github/workflows/self-labels.yml
vendored
14
.github/workflows/self-labels.yml
vendored
|
|
@ -5,11 +5,15 @@ name: labels
|
|||
# unpinned — correct only for the repo that IS the source). Consumers write:
|
||||
# uses: heavy-duty/ceremony/.github/workflows/labels.yml@<pinned-tag>
|
||||
on:
|
||||
# Hourly, not */15 (#199): the cron is a BACKSTOP, not the wake. Events below
|
||||
# carry every real state change in seconds; the cron only catches a FORGOTTEN
|
||||
# handoff, so a quiet repo loses at most the forgotten case, and only by ≤1h —
|
||||
# while */15 fired a full-board sweep four times an hour at GitHub's 1-minute
|
||||
# billing floor, 52% of one private consumer's runs for near-zero real work.
|
||||
# Hourly, not */15 (#199): the cron is the sweep's ONLY wake for the four
|
||||
# transition classes no subscribed event carries — a review verdict landing
|
||||
# (there is no pull_request_review trigger here), blocker:ci-red set or cleared
|
||||
# (no check_suite/check_run/workflow_run), a blocker:conflict when ANOTHER PR
|
||||
# merges under this one, and the time-based stale / 48h claim-reclaim. The
|
||||
# events below carry the rest in seconds. So hourly trades ≤1h of latency on
|
||||
# those four for dropping */15's four full-board sweeps an hour at GitHub's
|
||||
# 1-minute billing floor — 52% of one private consumer's runs. Do NOT delete
|
||||
# this cron — it is the discovery path for those four, not a forgotten-handoff net.
|
||||
schedule: [{cron: "0 * * * *"}]
|
||||
workflow_dispatch: # bootstraps missing labels on a fresh repo
|
||||
# Narrowed (#199) to the actions that carry a queue-state change the hourly
|
||||
|
|
|
|||
|
|
@ -1,9 +1,12 @@
|
|||
### Changed
|
||||
|
||||
- `labels` — the advisory reconcile cron relaxes from `*/15` to hourly (#199).
|
||||
Events still carry every state change in seconds; the cron only backstops a
|
||||
forgotten handoff, so a full-board sweep is billed far less often without
|
||||
delaying any real transition past one cadence.
|
||||
- `labels` — the reconcile cron relaxes from `*/15` to hourly (#199), cutting a
|
||||
private consumer's schedule-triggered full-board sweeps ~4× at GitHub's
|
||||
1-minute billing floor.
|
||||
- `labels` — the hourly cron is the sweep's only wake for transitions no
|
||||
subscribed event carries — a verdict landing, blocker:ci-red, a
|
||||
blocker:conflict when another PR merges, the time-based stale/reclaim — so it
|
||||
bounds their latency to ≤1h, delaying no event-carried transition (#199).
|
||||
- `labels` — the caller's `issues:` trigger narrows to
|
||||
`[opened, closed, edited, reopened]` (#199), the actions that carry a
|
||||
queue-state change the cron cannot wait a cadence for. The churn/validation
|
||||
|
|
|
|||
|
|
@ -296,10 +296,13 @@ The complete caller is:
|
|||
```yaml
|
||||
name: labels
|
||||
on:
|
||||
# Hourly, not */15 (#199): the cron is a BACKSTOP. Events below carry every
|
||||
# real state change in seconds; the cron only catches a forgotten handoff, so
|
||||
# a quiet repo loses at most that case, and by ≤1h. */15 billed a full-board
|
||||
# sweep four times an hour at GitHub's 1-minute floor for near-zero work.
|
||||
# Hourly, not */15 (#199): the cron is the sweep's only wake for the
|
||||
# transitions no subscribed event carries — a review verdict landing (no
|
||||
# pull_request_review trigger), blocker:ci-red set/cleared, a blocker:conflict
|
||||
# when another PR merges under this one, and the time-based stale / 48h
|
||||
# claim-reclaim. Events below carry the rest in seconds. Hourly trades ≤1h of
|
||||
# latency on those four for dropping */15's four sweeps an hour at GitHub's
|
||||
# 1-minute floor. Keep the cron — it is the discovery path, not a safety net.
|
||||
schedule: [{cron: "0 * * * *"}]
|
||||
workflow_dispatch: # bootstraps missing labels on a fresh repo
|
||||
pull_request_target:
|
||||
|
|
|
|||
Loading…
Reference in a new issue