Skip to content

ci: run release and notify-hub hosted and compare glibc with the v1.10.0 archive - #768

Merged
luisleo526 merged 4 commits into
mainfrom
ci-release-runner-929
Nov 7, 2026
Merged

luisleo526 merged 4 commits into
mainfrom
ci-release-runner-929

Conversation

@luisleo526

@luisleo526 luisleo526 commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

Release and notification jobs use ubuntu-24.04 while retaining their protected release environment. The x86_64 prebuilt route keeps the pinned Bookworm image, and aarch64 keeps ubuntu-22.04-arm.

The GLIBC check compares staged libraries with the matching v1.10.0 archive after verifying its published SHA256. A higher requirement fails; the fixed ceiling and _isoc23* rejection also remain active. Admission retains both legacy and hosted release contracts and rejects containers or services on protected release jobs.

The preflight fixtures cover both forms, keep malformed actionlint configurations refused, and register all 43 GLIBC tests. Validation on the updated branch includes the complete 515-test preflight module, main-checker negative controls and real-workflow admission. Hosted CI and parity evidence remain required before merge.

…0.0 archive

release and notify-hub move to ubuntu-24.04 and keep their release
environment. The x86_64 prebuilt cell stays on its protected scale set and
still builds inside the pinned Bookworm image; the arm64 cell keeps
ubuntu-22.04-arm.

The prebuilt glibc gate now also compares the highest numeric GLIBC_ tag of
the staged libraries with the same triple's v1.10.0 release archive. The
workflow downloads that archive, checks its sha256 and unpacks it, and
check_prebuilt_glibc.py --baseline-root reads both trees with the same strict
inspection: equal or lower passes, higher fails. The fixed 2.36 ceiling and
the __isoc23_* rule still apply to the staged tree; the baseline is read, not
judged, because the released x86_64 archive predates both.

Preflight pins the new step and the hosted pins, still refuses removing the
release environment from either job, and now also refuses a job container or
services on the environment-gated release jobs, which the protected
scale-set route refused before.

The runner sentences in docs/ci.md (introduced by bd1fa2f) and in
docs/reference/ci-runner-routing.md (introduced by e7fa559) follow the move.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

@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 1 advisory finding(s) below merit a look before merge.

Not checked: tests were not run; formal verification proved 0 of 4 changed function(s) (1 sampled, not proven, 3 not verified).

Formal verification. PR-changed functions: 1/4 verified (0 proven, 1 may-equivalent, 0 distinguished) · 3 not verified (3 vacuous).

Not verified on this run: inspect\_target (vacuous: never exercised), main (vacuous: never exercised), runner\_findings (vacuous: never exercised).


Graphify review — findings

Moves the release and notify-hub jobs onto hosted ubuntu-24.04 (keeping the release environment) and leaves only the x86_64 prebuilt cell on a protected gkp-od-* runner, with actionlint.yaml and the runner-routing docs updated to match. Adds a release step that downloads the v1.10.0 archive for the triple, verifies its pinned sha256, unpacks it, and passes it to check_prebuilt_glibc.py --baseline-root, which fails if the staged libraries' highest glibc tag exceeds the baseline's; the baseline is read only, never judged against the fixed ceiling, and a missing, empty or overlapping baseline fails closed, though the overlap check is lexical and does not resolve symlink aliases. Extends the preflight native-workflow findings and the release-gate and preflight tests to pin the new runner routing, shard-matrix and action-pin rules.

Worth a look

  • Baseline/staging overlap check is lexical and misses symlink aliases — scripts/check_prebuilt_glibc.py:333 · Escalate · medium
    • NOT verified (no proof, no reproducing execution) — needs human review

Review partial — this diff was larger than one review pass covers, so later files were not reviewed; some findings may be missing.

Analysis details — impact, health, verification

Impact & health

Graphify review

Impact — 1666 functions depend on the 1494 functions this change touches.

Health — this change adds coupling hotspots:

  • worse: ci_workflow_findings() — 82 callers, 24 callees
  • worse: main() — 1 callers, 9 callees
  • new: inspect_tree() — 1 callers, 8 callees

Verification — 1666 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: 1649 function(s) in the blast radius were not formally verified this run

Docs that may be stale (advisory)

…and 10 more.

Formal verification

No difference found (not proven): No behavior difference found in emit (not a proof).

The verifier ran both versions of emit on many inputs and saw identical behavior every time. Strong evidence the change is safe, but evidence, not a proof.

Guarantee: Empirical: differential testing (both versions run on many generated inputs). A divergence on an untested input remains possible, so this is 'no counterexample found', not 'proven equivalent'.

Note: An input the sampler did not try could still differ.

Could not verify: Could not verify inspect\_target.

The verifier did not have enough to check inspect\_target, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: not verifiable: all 242 sampled inputs raised on both versions — the function never executed, so 'no divergence' would be vacuous (mostly KeyError — names the real obstacle, not a sampling gap)

Could not verify: Could not verify main.

The verifier did not have enough to check main, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: non-vacuity: domain too small (only 1 distinct inputs exercised, need 3) — 'no divergence' would be near-vacuous

Could not verify: Could not verify runner\_findings.

The verifier did not have enough to check runner\_findings, so it is saying so rather than guessing. No false assurance is the whole point.

Guarantee: No guarantee either way, this is an honest abstention, not a pass.

Note: Reason: non-vacuity: domain too small (only 2 distinct inputs exercised, need 3) — 'no divergence' would be near-vacuous

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

parser.add_argument("staging_root", type=Path, help="explicit installed prebuilt staging root")
args = parser.parse_args(argv)
issues = []
def inspect_tree(root: Path, issues: list[dict], policy: bool) -> tuple[list[dict], list[dict]]:

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 — inspect_tree()

fans out to 8 callees (efferent coupling).

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

return targets, results


def main(argv: list[str] | None = None) -> int:

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 — main()

fans out to 9 callees (efferent coupling).

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

Keep the admitted legacy and hosted release contracts from main while
retaining the reviewed workflow, archive checker and documentation changes.
Resolve the two preflight script conflicts in favor of main's rules; the
targeted guard and test adaptations are prepared in a following edit.
Reject containers and services on protected release jobs and adapt the
preflight tests to the hosted release workflow. Keep legacy admission
coverage and repair the actionlint label mutation fixtures.
@luisleo526
luisleo526 merged commit b09f79d into main Nov 7, 2026
16 checks passed
luisleo526 added a commit that referenced this pull request Nov 7, 2026
Plain merge of main into this branch, with no conflicts. Main now has the
hosted release and notify-hub jobs and the glibc comparison with the v1.10.0
archive (#768), which edit the release workflow, the CI documents and the
preflight and glibc scripts; this branch changes none of those files.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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