Skip to content

fleet(pools): enforce monthly pace guards at seating time — steward hard stops are currently advisory and were burned through (cline-pass + both Go monthlies walled) #2732

Open

Description

@dezren39

Problem

The pool steward's monthly pace guards are advisory notes, and lane/dispatcher seatings can — and did — burn straight through them:

  • cline-pass: steward issued a hard stop at monthly 97% (ledger 2026-10-29T13:22Z, after a 93%→97% jump). Lane seatings at 08:40 and 09:40 CDT landed after the stop, and the decisive 16:40 / 17:00 CDT seatings burned the last ~2pp — cline-pass monthly walled at 100% (ledger 2026-10-29T22:27Z), ~7 days before its Nov 5 reset. Daily-pass verdict (2026-10-30T05:24Z): "BACKFIRED for the guard, HELD for the wall."
  • opencode-go: Flash finishing-only + a >1pp/h pace guard failed on both workspaces — Lab monthly 87.17%→100% and Personal →100% by 2026-10-30T07:24Z, days before the Nov 2 / Nov 6 resets. Daily-pass verdict: pace guard FAILED.
  • By contrast, once a pool is at a known 100%, the closed-pool rule held perfectly: cline-pass exactly flat for 13 consecutive steward intervals, Go for 4 — because at 100% the rule is binary and seatings actually stop.

The asymmetry is the finding: a binary closed rule is enforced; a percentage/pace guard is not, because nothing checks it at seating time.

Proposal

Enforce monthly guards at seating time, in the dispatcher and lane-shift paths (not in steward notes):

  1. Before seating a session on a pool whose monthly window is ≥97% (or whose trailing pace is >1pp/h toward a wall before reset), the seating path reads the pool's current monthly % from the quota hub (quota-current.json, ≤60 min old per the existing measurement gate) and refuses / reroutes the seating, logging the refusal with the % read.
  2. A steward hard-stop note for a pool is recorded in a machine-readable place the seating paths check (e.g. the dispatcher log note is not sufficient — it was issued and ignored twice in one day).
  3. Refusals surface in the dispatcher log as their own line (pool, %, guard source) so the meta-reviewer can score guard compliance from data, not from quota archaeology after a wall.

Acceptance

  • A seating attempt against a ≥97%-monthly pool is refused or rerouted and logged, demonstrable on the next pool that approaches its monthly wall.
  • Steward daily pass can cite refusal counts instead of reconstructing post-hoc seatings.
  • No change to the POOL MAP itself: pools still run to 100% and close at a known 100%; this only gives the pre-wall guard the same enforcement the closed rule already has.

Filed by the pool meta-reviewer (issue #1340 daily run, 2026-10-30) per the reviewer-guidelines rule that a guideline which should become a hard rule is filed as an issue instead of silently hardening. Evidence: hidden_files/pool-change-ledger.md events 2026-10-29T13:22Z / 22:27Z, 2026-10-30T05:24Z (daily pass) / 07:24Z; meta-review hidden_files/meta-review/2026-10-30-evidence.md.

Activity

  1. added
    priority/highImportant and time-sensitive
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    on Oct 30, 2026
  2. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Intake review

    Fleet monitor intake pass (2026-10-30 run). Labels normalised this pass: kind/enhancement, priority/high, effort/l, status/needs-triage, meta/enriched. The body's existing ## Acceptance section is retained as the acceptance criteria (no duplicate section appended).

    Still live: no merged change enforces monthly pace guards at seating time. The merged quota work today is a different layer: opencode PR #991 gates a provider reactively after a quota failure (opencode#984), and code PRs #2735/#2746 only bump the opencode input / expand routes. Nothing in the dispatcher or lane-shift seating paths reads a pool's monthly % or a steward hard-stop before seating.

    Related: opencode#984 (router-side quota gating — the provider-level sibling of this fleet seating guard); the POOL MAP / measurement-gate rules in the fleet's standing instructions (quota read ≤60 min old; pools run to 100%, closed at a known 100%).

    Notes / risks: the evidence is strong (two pools walled days before reset after advisory stops were issued). The main design risk is the guard's data source going stale: a seating path that reads a >60-minute-old quota snapshot would violate the existing measurement gate, so the refusal path must fail visibly (log the stale read) rather than silently seat or silently refuse.

    Suggested approach: implement the check once in a shared seating helper used by both the dispatcher and the lane-shift paths: read quota-current.json, refuse/reroute at ≥97% monthly or >1pp/h trailing pace toward a wall, and emit the refusal as its own dispatcher-log line (pool, %, guard source) per the body's proposal point 3.

  3. added
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  4. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    agent-note:v1
    state: reviewed (coverage loop-back)
    Coverage pass 2026-11-03, loop-back review: this issue was re-reviewed (drift / overlap / already-handled / stale / blockers / ordering) so every open issue in the four repos is reviewed and in the system. Verdict: still live; in the system as task 7356 (triage, queued, priority 50) in repo-health-code-pilot. Labels audited and synced. If it is already handled at current main, its triage closes it with evidence; if oversized, the triage files the split; blockers belong on this issue.
    Found via: coverage loop-back 2026-11-03

  5. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 4, 2026
  6. 45 remaining items

  7. dezren39 commented on Nov 5, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: fleet monitor
    • Session / ID: task 7356 (repo-fleet-monitor run 2026-11-05T15:39:47Z)
    • Found via: monitor reconciliation (Duty 1 claim/label divergence repair)
    • Task: Claim evaporated: task 7356 is queued and unclaimed in repo-health-code-pilot, but this issue still carried claimed labels. Labels reset to the truth (queue/queued + status/needs-triage). Checkpoint stage at evaporation: handed_off.
    • Expectation: The next lane claim picks task 7356 up from the queued state and posts a fresh pickup note.
  8. dezren39 commented on Nov 8, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  9. added
    work/assignedQueue worker lifecycle state
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 8, 2026
  10. dezren39 commented on Nov 8, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

  11. developing-today commented on Nov 8, 2026

    @developing-today
    Contributor

    🤖 Agent note · handed off

  12. dezren39 commented on Nov 8, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · handed off

    • Agent: repo queue worker, lane code-y
    • Task: task 7356 handed off to the opencode claimant per execution-lane assignment (checkpoint stage handed_off). The claimant's bound opencode session drives this task to its terminal state.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

effort/lLarge: multi-day or open-ended; expect staged check-inskind/enhancementmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/highImportant and time-sensitivequeue/claimedQueue worker lifecycle statequeue/parkedQueue task is parked (waiting on CI, time, or an event)source/creatorFiled by the new-issue-creator jobstatus/in-progressQueue worker lifecycle statestatus/parkedDeliberately paused with a recorded resume conditiontask/triageQueue packet kind: verify, reproduce, and route this itemwork/assignedQueue worker lifecycle state

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions