Skip to content

Remove the release scan and orchestrator; release by manual stage dispatch - #209

Merged
leehack merged 3 commits into
mainfrom
chore/manual-release-scan
Nov 7, 2026
Merged

leehack merged 3 commits into
mainfrom
chore/manual-release-scan

Conversation

@leehack

@leehack leehack commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner

Outcome

Bridge releases are fully manual. The owner dispatches three workflows in order: Build Exact Bridge Candidate, then Qualify Exact Bridge Candidate, then Publish Exact Qualified Bridge Assets. The release scan workflow and the orchestrator behind it are deleted.

Why

Every llama.cpp or native bump needs manual work first, so automatic upstream release pipelines are unwanted. llamadart-native#178 made the same decision. The orchestrator existed only to run the three stages unattended. Every stage already verifies all of its inputs itself, so the orchestrator added no safety of its own.

Removed

What Why it could go
.github/workflows/auto_llama_cpp_update.yml Scan and dispatch only
scripts/release/orchestrator/ (11 modules) and tests/release/orchestrator/ (19 files) Backlog planning, tag picking, run recovery and dispatch: orchestration only
python_compat.mjs re/split/tuple/datetime helpers, json.mjs pyStrptimeUtcOrRaise, qualification.mjs loadPublishedCandidate, publication_state.mjs validatePublishedCandidate Only the orchestrator used them (for run-history windows and identical-release comparison)
contract.mjs subcommands validate-native, scan-native, compare-upstream, select-stable-native-release, and selectStableNativeRelease No workflow calls them any more. The functions the stages use are kept
verify_ci_reliability.mjs checkOrchestration, the orchestrator import walk, and the literal-dispatch-boolean scan They checked only the deleted workflow and modules
Orchestrator entries (current .mjs and deleted .py) in the ci_scope.mjs TOOLING allowlist Those paths no longer exist

Kept, and why

  • All three stage workflows and all of their checks are unchanged:

    • owner-only, first-attempt-only dispatch from the default branch;
    • exact upstream and native tag/commit resolution, plus the native assets.json digest and inventory;
    • candidate run and artifact proof by immutable ID;
    • qualification bound to the candidate's correlation ID;
    • attestation re-verified against every input in both publish jobs;
    • environment policy validated twice;
    • live immutable-release governance checked before any mutation, with readback and gh release verify;
    • forward-only, never-overwrite output tags (publication_state.mjs validateTransition).
  • Only comments and input descriptions changed. No safety check had to move, because no stage relied on the orchestrator to verify anything.

  • The orchestrator_correlation_id input and manifest field keep their name. Published manifests and release notes record it, and publication recovery compares it.

  • The CI reliability contract now allows WEBGPU_BRIDGE_ASSETS_PAT only in publish_assets.yml. Before, it also allowed the scan workflow. A new test case covers this.

  • Candidate and publish reject non-stable (bNNNN) native tags via validate-native-request (the one check only the orchestrator enforced); the CI contract now requires it in both workflows.

Manual release

The full steps, with the input-gathering commands, are in CONTRIBUTING.md, "Publish Process". Run everything from main as the owner, and use one correlation ID for all three stages (for example manual-v0.1.83).

  1. Dispatch bridge_candidate.yml with:
    • orchestrator_correlation_id;
    • bridge_source_sha: the main SHA;
    • upstream_tag and upstream_commit: from the native assets.json fields llama_cpp_tag and llama_cpp_commit;
    • native_release_tag, and native_manifest_sha256 (the SHA-256 of assets.json);
    • release_tag: the next patch above the newest published tag;
    • release_rebuild=0 and assets_immutable_releases_enabled=true.
  2. Dispatch bridge_qualification.yml with orchestrator_correlation_id and candidate_run_id.
  3. Dispatch publish_assets.yml with the step 1 inputs except assets_immutable_releases_enabled, plus candidate_run_id, qualification_run_id and publish_approved=true.

Secrets and settings

  • No secret can be deleted. ORCHESTRATOR_DISPATCH_TOKEN was never created. The only secret is the environment-scoped WEBGPU_BRIDGE_ASSETS_PAT, and publication still needs it.
  • Optional: the PAT no longer needs Actions write on leehack/llama-web-bridge, which only the orchestrator's dispatch used. It still needs:
    • read access to the provenance repositories;
    • write access on leehack/llama-web-bridge-assets;
    • Administration read on leehack/llama-web-bridge-assets, for the immutable-releases check.
  • The disabled scan workflow disappears from Actions once this merges. GitHub settings were not changed.

Validation

  • npm run check:js: 603 tests, 599 pass, 0 fail, 4 skipped. The test count is lower than before because the orchestrator suites were removed.

  • node scripts/ci/verify_ci_reliability.mjs passes.

  • I added a probe workflow that references the PAT, and the contract rejected it.

  • An independent auditor reviewed this exact diff and found no blocking findings. It covered:

    • each orchestrator proof against the stage that now enforces it;
    • verifier mutations;
    • the documented inputs, run through the real contract CLIs against native v0.8.0-1.

    I addressed its three non-blocking doc notes:

    • the PAT's Administration read permission;
    • use the newest stable native release;
    • pick the newest tag by version, not by creation date.

Size

Against main: 48 files, +153 / -11,691 lines.

…patch

Bridge releases are now three owner dispatches: Build Exact Bridge
Candidate, Qualify Exact Bridge Candidate, then Publish Exact Qualified
Bridge Assets. Each stage already verifies every input it consumes, so the
scan workflow, the orchestrator, its tests and the helpers only it used are
deleted. The CI reliability contract now allows the publication PAT only in
publish_assets.yml, and CONTRIBUTING documents the exact dispatch inputs.
@leehack leehack changed the title Make the native release scan manual-only Remove the release scan and orchestrator; release by manual stage dispatch Nov 7, 2026
@leehack
leehack merged commit a298d9d into main Nov 7, 2026
5 checks passed
@leehack
leehack deleted the chore/manual-release-scan branch November 7, 2026 14:01
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