Skip to content

E1 D6: release pass runner rule — 10-min hold, 60-min cap, read+print only (C354 3, C357 1) #4929

Closed

Description

@noahgift

Retargeted 2026-10-10. Under the operator's rulings, main no longer freezes for a release from 0.71.0 on. So the freeze this row was going to automate is gone. The --ship GO check stays where it is, tracked under #5060. This row now covers the release pass's runner-wait rule:

Fix. While a release pass is open, a pass job that waits more than 10 minutes for a runner triggers a stop: nothing is armed and no PR gets a push until that job starts. Each trigger is logged with the job and the minutes waited. A pass open more than 12 hours, or one with more than 3 triggers, stops and asks for a go/stop. When the pass ends it prints the merges to main during it, the runner-wait p50 and p90 for its jobs, and the trigger count.

Done when. A case table, each case shown red on a mutant, covers: a wait under 10 min (no trigger), one over 10 min (trigger, logged), 4 triggers or 12h open (stop and ask), and the end-of-pass print. The freeze code for the old scope is not written.


Previous scope, kept for history (superseded):

Row D6 of the E1 Fast Build plan (Refs #3998).

Defect. scripts/release/prepare_bump.sh:13 says the freeze (06x release schedule §4 step 1: open milestone items move to the next milestone with slipped_from:, then the milestone holds only its release epic) "is done by hand before this". A hand step blocks rule b (one unattended pass from the bump to live).

Fix. prepare_bump.sh <version> runs the freeze itself before it makes the bump worktree: the same three reads autopilot.sh cut_tag() makes at the tag, in the same order (check_milestone_cut.sh --must-carry, carry_milestone_items.sh, strict check_milestone_cut.sh). Any refusal or unjudged read stops the bump. The first freeze of the train writes its time and origin/main sha to the train state dir (the start anchor for freeze-to-publish).

Done when. The script's --self-test (run by check_release_bump_pr_body.sh in guard-tree) carries a case table for the freeze (order, refusals, rc 2 never a pass, freeze before the worktree), each case shown red on a mutant, and the header line and spec step 1 name the script, not a hand step.

Activity

  1. added this to the 0.71.0 milestone on Oct 10, 2026
  2. changed the title [-]E1 D6: the release freeze runs inside prepare_bump.sh, not by hand[/-] [+]E1 D6: release pass runner rule — 10-min hold, 60-min cap, read+print only (C354 3, C357 1)[/+] on Oct 10, 2026
  3. noahgift commented on Oct 10, 2026

    @noahgift
    ContributorAuthor

    Scope replaced by the release-runner rule: a pass job waiting more than 10 minutes for a runner holds arming and pushes, a hold lifts at most 60 minutes later, and the pass reads and prints only. The freeze automation in the old scope is dropped because main no longer freezes for a release. Done-when: case-table rows for 11 min (holds), 9 min (no hold), lift on job start, and lift at 60 min with the job still waiting.

  4. modified the milestones: 0.71.0, 0.72.0 on Oct 14, 2026
  5. noahgift commented on Oct 14, 2026

    @noahgift
    ContributorAuthor

    Done-when check against main @ 909b977 (Refs #4929). Merged in PR #5078 (scripts/release/pass_runner_wait.sh, merge 07b4238).

    done-when row (10-10 scope) self-test row result
    11 min holds "a job waiting 11 min holds, logged once as job + minutes" ok
    9 min no hold "a job waiting 9 min does not hold" ok
    lift on job start "the hold lifts when the job starts" ok
    lift at 60 min, job still waiting "the hold lifts at 60 min with the job still waiting" (+ 59m59s still held) ok

    Extra rows: the 600 s / 601 s boundary, a lifted job never holds twice, the end-of-pass print, rc 2 on no pass start or an unreadable read.

    --self-test: PASS (rc 0). --mutants: 12/12 killed (rc 0). Every done-when row is covered by a passing row on main. Closing is the cop's call.

    Agent: aprender-w4664

  6. noahgift commented on Oct 14, 2026

    @noahgift
    ContributorAuthor

    Live evidence (Refs #4929): the rule ran in every 0.71 release pass that got past its start. autopilot.sh on main calls it inside the clean-room and asset waits (lines 471 and 497) and prints the report on exit (trap at line 127).

    pass PASS-REPORT lines last report
    v0.71.0 10 merges 0; runner wait p50 0 / p90 0 min over 8 jobs; triggers 0
    v0.71.1 1 merges 1; 0 jobs; triggers 0
    v0.71.2 1 merges 0; 0 jobs; triggers 0
    v0.71.2 (window 3) 2 merges 0; p50 0 / p90 0 min over 4 jobs; triggers 0
    v0.71.3 0 the pass stopped on "cannot resolve milestone" before its start was recorded, so there was no pass to report on

    No real pass has had a job wait more than 10 min, so no HOLD has fired live yet. The HOLD and LIFT paths are covered by the self-test (PASS) and the mutants (12/12) on main @ 909b977.

    All four done-when rows are met. Closing is the cop's call.

    Agent: aprender-w4664

  7. noahgift commented on Oct 14, 2026

    @noahgift
    ContributorAuthor

    Closed by the cop batch (aprender-96, 18:3xZ): the evidence comment above shows the runner rule wired on main (autopilot.sh lines 471/497, trap at 127) and PASS-REPORT printed in v0.71.0–v0.71.2 release passes; self-test PASS, mutants 12/12. 0.72.0 floor F4 done.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Critical priorityowner:aprender-w4664Owner session aprender-w4664

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions