Skip to content

ci: admit a hosted form for the release jobs with protected credentials - #771

Merged
luisleo526 merged 5 commits into
mainfrom
hosted-release-rules
Nov 7, 2026
Merged

luisleo526 merged 5 commits into
mainfrom
hosted-release-rules

Conversation

@luisleo526

Copy link
Copy Markdown
Collaborator

The release and notify-hub jobs hold release credentials, so the preflight rules require them to run where nothing else runs. This change keeps that guarantee in a second, hosted form instead of skipping it.

A release job may now run on the GitHub-hosted ubuntu-24.04 runner only when:

  • it takes its secrets from the protected release environment,
  • it carries no self-hosted label, and
  • no other job in the workflow gets the release environment or a credential surface.

Both release jobs must use the same form. The existing isolated-runner form keeps every finding it had before, byte for byte. The prebuilt archive contract follows the chosen form.

Tests: the old isolated form passes; the hosted form with all three conditions passes; the hosted form without the environment, with a self-hosted label, or beside a credentialed job is refused; the whole test_ci_preflight.py module passes, and the same module against the previous rules fails only on the new hosted-form rows.

This change touches only scripts/ci_preflight.py and its tests; the workflow change that uses the hosted form follows separately.

🤖 Generated with Claude Code

Teach preflight the hosted release/notify-hub form while retaining the legacy
isolated form and pin the hosted released-archive comparison contract.
Add negative rows for missing environment, wrong runners, credential sharing,
and archive-contract mutations.
Keep the workflow snippet byte-faithful in the hosted admission rows so the
candidate/control proof exercises the real release text.
Keep the synthetic hosted release fixture byte-faithful to the reviewed
released-archive step contract.
Keep isolated runner diagnostics and prebuilt contract text byte-compatible
while admitting the paired hosted release form.

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Graphify reviewed this change.

Worth a look — the grounded gate found no coupling regressions or blocking issues, but 3 advisory finding(s) below merit a look before merge.

Not checked: tests were not run; no formal proof of the changed code.


Graphify review — findings

Adds a hosted release form to the preflight: release and notify-hub may run on ubuntu-24.04 instead of the isolated GKP labels, but only as a matched pair, and the legacy form stays a valid exact contract. Adds release_credential_findings, which refuses the protected release environment or any release credential on every job other than release and notify-hub, with _job_environment_is matching the environment name by exact literal comparison. Defines a hosted prebuilt step list that replaces the glibc floor check with a comparison against the sha256-pinned v1.10.0 release archive, and keeps both the hosted and legacy step lists closed to extra or reordered steps.

Worth a look

  • Release environment check is case-sensitive despite GitHub environment names being case-insensitive — scripts/ci_preflight.py:2394 · Escalate · high
    • NOT verified (no proof, no reproducing execution) — needs human review
  • Flow-mapping or expression environment bypasses the protected release environment check — scripts/ci_preflight.py:2382 · Escalate · medium
    • NOT verified (no proof, no reproducing execution) — needs human review
  • Self-hosted/larger runner refusal test is vacuous because only one job is mutated — scripts/test_ci_preflight.py:1782 · Escalate · medium
    • NOT verified (no proof, no reproducing execution) — needs human review
Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 902 functions depend on the 874 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: ci_workflow_findings() — 82 callers, 24 callees
  • worse: _job_values() — 31 callers, 3 callees
  • worse: _job_block() — 18 callers, 3 callees
  • worse: runner_findings() — 2 callers, 26 callees
  • worse: _holds_credentials() — 4 callers, 7 callees

Verification — 902 functions in the blast radius were not formally verified this run (proofs are advisory here).

Gate & verification

graphify gate

PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.

Advisory (not blocking):

  • verification_scope: 902 function(s) in the blast radius were not formally verified this run

· 1 grounded finding(s) anchored inline below; 4 more finding(s) on lines outside this diff (see the check run).

Comment thread scripts/ci_preflight.py
@@ -2828,7 +2869,7 @@ def visit(name: str, inputs: dict[str, str], multiplier: int, stack: tuple[str,


def runner_findings(workflows: dict[str, str]) -> list[str]:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Health regression — runner_findings()

fans out to 26 callees (efferent coupling).

Grounded coupling-delta finding (deterministic), not an LLM guess.

@luisleo526
luisleo526 merged commit a43b0ae into main Nov 7, 2026
17 checks passed
luisleo526 added a commit that referenced this pull request Nov 7, 2026
Plain merge of main into this branch. Main now has #771 (ci: admit a hosted
form for the release jobs with protected credentials), which changes
scripts/ci_preflight.py and scripts/test_ci_preflight.py. This branch changes
neither file, so the merge has no conflict and the resulting tree is this
branch's previous tree plus exactly that change.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
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