Skip to content

release(rc): an RC is not shipped until every fleet host runs it (install before or with publish) #4327

Closed as not planned

Description

@noahgift

OPERATOR, verbatim (2026-09-24): "THE INSTANT we do a release candidate it needs to be on all hardware either before or same time. change process"

Part of EPIC #4288. Today v0.69.3-rc.2 shipped while lambda still runs rc.1, plus a ~/.cargo/bin/apr "+no-git" shadow. The fleet install runs on an hourly timer, separate from the cut.

New process

  1. Stage before publish. The rc-cut (release(rc): cut rc on green, promote rc bytes to final, publish gate at the rc — batch #4285 #4275 #4286 #4287 #4314 / PMAT-4285-rc-cut) builds the assets, then calls fleet-install <tag> <asset-dir> on every fleet host: lambda, gx10 (aarch64), yoga, intel, mini, and jetson when reachable. The install is atomic, verifies sha256 and quarantines shadows.
  2. Verify. On each host, the apr --version that PATH resolves must equal <tag> (<sha>) (apr --version from crates.io install prints +no-git: build.rs ignores .cargo_vcs_info.json #4110/release assets print (vX+no-git): apr_bin.sh STRICT refuses every published apr binary #4256). pv is checked the same way.
  3. Publish only on N/N. gh release create runs only after every reachable host passes. An unreachable host is recorded as a named RED row, never skipped silently.
  4. Backstop. The fleet-bins poller checks releases every ≤2 min and installs any newer rc or release it finds, for manually cut releases.
  5. The "SHIPPED" receipt must include a per-host table: host, arch, tag, sha, and path resolved.

Acceptance

  • A mutation proves it: a cut where one host fails verify does NOT publish.
  • The next RC (rc.3 or 0.69.4-rc.1) ships with 6/6, or with the unreachable hosts named RED.

Activity

  1. added this to the 0.69.4 milestone on Sep 24, 2026
  2. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    Measured 17:58Z (infra-64, evidence/fleet-versions.md): mini (Darwin arm64) cannot take rc.2 because the release ships no aarch64-apple-darwin asset. "All hardware" means the rc-cut must build darwin-arm64 too; otherwise mini is RED on every RC. intel still runs pre-rc.2 apr and pv 0.69.1, because fleet-bins is not deployed there yet (infra-64 is on it). jetson: no route to host.

  3. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    Host list update. OPERATOR, verbatim, 2026-09-24: "jetson is not online anymore update records". jetson is RETIRED and dropped from the fleet-install host set. Active hosts: lambda, gx10, yoga, intel, mini.

  4. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    infra side landed on paiml/infra branch fleetbins/measure (to be folded into infra#1052): 66e41e84, 32d0b796.

    Entrypoint machines/fleet-hosts/fleet-bins/fleet-install.sh <tag> <asset-dir> [<commit>]. It runs on lambda-labs, the host with the fleet ssh mesh.

    For each active host (lambda-labs gx10 yoga intel mini), it:

    1. Runs uname -sm. No answer is a RED unreachable row, never a skip.
    2. Copies only that arch's *-<triple>.tar.gz + .sha256. None for the arch is a RED no-asset-for-<triple> row. This is mini today, until an aarch64-apple-darwin asset exists.
    3. Runs fleet-bins install there. That step verifies the sha256, swaps the binary in atomically, refuses a downgrade, and checks that the apr on PATH is the same bytes reporting the tag and commit.

    Exit 0 only when every host answered, every install exited 0 and every row is ok. Anything else is nonzero, so the rc-cut must not publish.

    Receipt: stdout is a TSV table (host arch bin tag sha path verdict). Set FLEET_INSTALL_RECEIPT=<file> to also write it as a markdown table with hosts ok N/M.

    rc-cut wiring (aprender side, needs quorum): after assets are built and before gh release create / cargo publish:

    FLEET_INSTALL_RECEIPT=fleet-install-$TAG.md \
      ssh lambda-labs "~/.local/bin/fleet-install $TAG <staged-asset-dir> $SHA" || exit 1
    

    It is an ordering change only; the build itself does not change.

    Poller (backstop for a host that missed the push): fleet-bins-poll.timer fires 2 min after the previous poll finishes (OnUnitActiveSec=2min). It runs git ls-remote per catalogue row and runs the resolver only when a tag moved. It is live on lambda-labs, gx10, yoga and intel.

    Tests: make -C machines/fleet-hosts test-fleet-bins gives fleet-install 12 rows with 10 mutants killed, and fleet-bins 25 mutants killed.

    Known RED today: mini (no darwin asset). Also, the aprender nightly is 35h stale, so the hourly run exits 1 by design.

  5. noahgift commented on Sep 24, 2026

    @noahgift
    MemberAuthor

    Live run against the published v0.69.3-rc.2, all 5 active hosts: 0/5, exit 1. Receipt: paiml/infra docs/audits/fleet-bins/*-fleet-install-v0.69.3-rc.2.md on branch fleetbins/measure (a7cec34d).

    • RED no-sha on lambda, gx10, yoga and intel. rc.2's apr --version / pv --version name no commit, because it was built without git metadata. aprender#4256 now blocks every rc from passing this gate, as intended. Fix the build and the same run turns green.
    • RED no-asset on mini. No aarch64-apple-darwin asset exists.
    • The first live run caught a real hole before any cut depended on it. apr's assets are named -gnu-cpu/-gnu-cuda, so the exact-triple match copied pv alone, and the host skipped apr and exited 0. Now every OS+arch variant ships, and a repo's bin missing from the cut is RED (fd54de65, with 2 new mutants).
  6. added 2 commits that reference this issue on Sep 24, 2026
  7. modified the milestones: 0.69.4, 0.70.0 on Sep 25, 2026
  8. noahgift commented on Sep 25, 2026

    @noahgift
    MemberAuthor

    Parked by APR-EPIC-001: over E1 budget (rank 50/93). Reopen = pull. Applied by aprender-d1: claude+agy both said close, apr shadow row recorded (handoff/close-quorum-2026-09-25.json).

  9. modified the milestones: 0.70.0, backlog on Sep 25, 2026
  10. added
    parkedClosed over epic budget (APR-EPIC-001 rule 5). Reopen = pull.
    on Sep 25, 2026
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

    parkedClosed over epic budget (APR-EPIC-001 rule 5). Reopen = pull.

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions