Skip to content

release: release-pair fan-out to the app and compute targets (CR-194) - #83

Draft
luisleo526 wants to merge 5 commits into
mainfrom
release-pair-app-compute
Draft

luisleo526 wants to merge 5 commits into
mainfrom
release-pair-app-compute

Conversation

@luisleo526

Copy link
Copy Markdown
Contributor

CR-194 (CR-173 follow-up; L6 ruling 18:0x). The hub's consumer fan-out gains two targets for event release-pair, from the EXISTING hub App token (no new credential):

  • per-role event table: application + a new delivery-only role compute -> release-pair; offline/hosted/web/data/license keep pineforge-release byte for byte;
  • release-pair payload = the 8 neutral keys COMPUTE accepted (pair_id, engine_tag, codegen_tag, hpo_tag, receipt_url, receipt_sha256, source_sets, build{...}), one pure builder from the immutable manifest + candidate bytes;
  • compute: delivered state once delivery-compute.json exists; never superseded, not skipped for prereleases, no consumer receipt; planned only if compute is in RELEASE_READY_CONSUMERS AND RELEASE_COMPUTE_FIRST_PAIR is set and <= the pair (empty = off, no backfill);
  • the workflow's TARGET_REPOSITORY reads the new secret NAME RELEASE_COMPUTE_REPOSITORY (value set by L6); token mint untouched; a malformed RELEASE_COMPUTE_FIRST_PAIR never blocks the other roles (compute off for that run, deliveries still published, a separate final job reports the configuration error without printing the value).
    NOTHING IS ENABLED by this PR (RELEASE_READY_CONSUMERS = hosted today).

Proof: spot box on 7df7e8e: release_rules 368 OK, facts 47+24 OK, dry_run OK, controls OK. Independent Claude reads: round 1-3 REQUEST-CHANGES (all taken, incl. a P1: a non-zero exit before the deliveries output would have burned reserved attempts, the CR-187 path), read 4 APPROVE (P0/P1/P2 none).

DO NOT MERGE before: (1) COMPUTE's receiver (release-pair.yml) exists; (2) the owner's step O-1 (install the existing hub App on the private compute repository, with its full permission set) and L6's secret/policy/dry mint; (3) O-2 (L6 gate S-179): application stays out of RELEASE_READY_CONSUMERS until APP's receiver accepts release-pair.

🤖 Generated with Claude Code

luisleo526 and others added 5 commits October 19, 2026 18:55
…-194)

The hub's consumer fan-out gains a per-role event type and one new
delivery-only role, with no new credential and nothing enabled by default.

- scripts/release_contract.py: ROLES gains `compute`; EVENT_TYPES maps
  application and compute to `release-pair` and every other role to
  `pineforge-release` (unchanged bytes); DELIVERY_ONLY / RECEIPT_ROLES split
  the roles that report consumer receipts from the one that does not;
  pair_payload() builds the eight neutral top-level keys (pair_id, engine_tag,
  codegen_tag, hpo_tag, receipt_url, receipt_sha256, source_sets, build) from
  the same immutable manifest and candidate bytes, refusing a disagreeing pair.
- scripts/release_pipeline.py: dispatch sends the table's event type; a
  `release-pair` target gets the eight-key payload; compute is never refused
  as superseded; aggregate gives compute pending -> delivered (complete) and
  never skipped_by_policy; compute is planned only when it is in
  RELEASE_READY_CONSUMERS and RELEASE_COMPUTE_FIRST_PAIR is non-empty and the
  pair is at or above it (empty = off, no backfill). The delivery reservation
  path (plan_delivery, finalize_all order, the deliveries output) is untouched.
- scripts/release_receipts.py, release-receipts.yml: compute has no receipt
  policy and a consumer receipt for it is refused.
- .github/workflows/release-finalize.yml: TARGET_REPOSITORY reads the private
  target name of compute from the release-automation secret
  RELEASE_COMPUTE_REPOSITORY; the token mint (action pin, one target,
  contents: write) is unchanged.
- docs/release-chain.md: roles, event types, payload, the delivery-only role,
  the new variable and secret NAMES (no values).
- tests: role-enumerating tests iterate the six receipt roles with every
  assertion kept, plus new tests for the event table, the payload, dispatch,
  aggregation, planning and the compute receipt refusal.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ts (CR-194)

With compute off, the release incident text is again byte-identical to the
base. A malformed RELEASE_COMPUTE_FIRST_PAIR is validated once before the row
loop: compute is off for that run, every other role is planned, delivered
and reported as without it, and the run then ends non-zero with one message
naming the variable and its value. The pair builder now reuses the producer's
source-tag pattern instead of a stricter copy. The release-chain document
states that the existing App must be installed on the private compute
repository, how the application receipt derives event_id and where facts come
from, and restores a policy phrase an earlier edit removed. The workflow step
name and the six-role receipt tuple in the tests are back to the base.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…iling finalize (CR-194)

A malformed RELEASE_COMPUTE_FIRST_PAIR used to make the finalize script
exit non-zero after it had reserved delivery attempts for the other roles.
The workflow step stops on a non-zero exit before it writes the deliveries
output, so those attempts were never sent and were used up by the 15-minute
schedule. The script now exits 0 for that case, turns compute off for the
run, delivers every other role as without compute, and writes a fixed
compute_configuration_error output (it never prints the value). A final job
that needs finalize and notify-consumers runs with always() when that output
is set, prints one error naming the variable and exits 1. The release-chain
document now says that the existing App's full permission set applies to the
compute repository, gives the exact source-tag pattern, and describes the
new path.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Brings in the application post_merge receipt policy (#85), the pull-request
tier on hosted runners (#84), the CR-150 harness-list-free main and the
v1.6.2-rc.1 release commit. Two conflicts, both resolved by keeping both
sides: scripts/release_receipts.py (the receipt key set keeps the
RECEIPT_ROLES check of this branch and adds the post_merge field from main)
and docs/release-chain.md (the RELEASE_COMPUTE_REPOSITORY row of this
branch next to the corrected RELEASE_RECEIPT_POLICY row of main, with the
sentence that compute needs no entry).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Resolves the docs/release-chain.md conflict as a union: main's expanded
supervisor-configuration text (canonical authz job, release/ready as a
required status, the literal pf-ci-x64 runner array, the fork-approval
and merge_group rules) plus this branch's receipt-role / compute
first-pair gating and the receipt-role inventory wording.

No code change; workflow YAML auto-merged.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant