--- name: qualify-oliphaunt-change description: Select, run, and diagnose Oliphaunt local and GitHub CI qualification for code, package, extension, SDK, policy, workflow, or release changes. Use before merge/release, when checks are slow or duplicated, or when an exact commit must be proven publishable. --- # Qualify Oliphaunt Change Use the repository graph to select work and require exact-SHA qualification for releases. CI's `release_products_json` input selects stable product IDs and their Moon task/dependency closure. Keep platform selectors at `all`; a focused platform debug run cannot qualify publication. Empty product selection remains the exhaustive audit. Selected-product records must cover every published product; producer evidence still comes from the same candidate run. Generated same-repository Release PRs and their merged main release commits derive scope automatically from Release Please manifest changes. Main push qualifies only after Plan and Required succeed; PR results cannot be published. ## Local feedback 1. Inspect the diff and ask Moon for affected projects/tasks. Do not infer affected products from directory names alone. 2. Run affected formatting (`format-check`, `js-format-check`, or `rust-format-check`), `lint`, `typecheck`, and `test` tasks as applicable. Inspect the owner's actual task definitions before selecting `build`, `package`, `test-consumer`, `test-integration`, `test-browser`, or installed device tests. Let Moon build declared prerequisites; task names alone do not justify running every available lane. 3. If the diff changes a WASIX producer's source pins, patches, recipes, toolchain or code, qualify that owner's affected portable/AOT output. Reuse compiler outputs only when their declared source, dependency and toolchain identities still match. A package envelope or test-only edit alone does not justify rebuilding unrelated core, tools or extension producers. 4. Select release-policy checks by the contract that changed: ```sh # Product/release metadata only: moon run release-tools:metadata # Release implementation changes: moon run release-tools:test # Release Please candidate ownership/version selection changes: moon run release-tools:graph-unit # Workflow and CI planning changes: moon run ci-workflows:check # Release metadata and release implementation tests: bash tools/release/release-check.sh # Extension catalog, recipe, carrier, or generated extension metadata only: moon run extensions:lint extensions:test ``` Select only the checks whose inputs changed. `release-tools:metadata` validates product versions, compatibility, carrier declarations and derived files; `release-tools:test` exercises release behavior; `graph-unit` exercises the pinned Release Please candidate integration. `release-tools:check` is their local Moon aggregate. There is no separate policy test project. The Shell aggregate runs metadata and release tests, not product compilation or installed consumer qualification. CI's `Checks / Policy` job runs on Ubuntu and sets up only capabilities needed by its selected tasks. Workflow planning, affectedness, artifact-transfer and security checks belong to `ci-workflows:check`. Publishers consume source qualification and frozen artifacts instead of replaying source-only suites. Do not schedule both aggregates and their constituent checks in the same lane. `tools/ci/ci_plan.mts` writes `target/graph/ci-plan.json`; there is no `graph-tools` Moon project. The adapter consumes Moon's selected tasks; its behavioral tests do not replace planning against the actual candidate tree. Ordinary source pushes, PR preparation and CI qualification do not select the protected `release-bootstrap` environment. Bootstrap-token lifecycle findings from the optional release-controls audit are setup/publication findings, not source-qualification blockers. Preserve the actual CI ref, permission and artifact checks; do not provision, remove or relabel registry credentials to make an unrelated source run pass. For source-acquisition policy or a source `mirror_url`, run `bash src/third-party/tools/source-fetch-core.test.sh` and `bash src/third-party/tools/fetch-sources.sh production-all --validate-only`, or the complete owner task `moon run source-inputs:test`. The paired Shell test owns actual Git/archive operations and invokes its TypeScript assertions once. Prove a new endpoint with a live exact-commit fetch, but keep reachability out of the deterministic unit gate. Qualification must show bounded canonical-to-mirror failover, exact-pin rejection, canonical durable origin, and transactional preservation of an existing checkout when every endpoint fails. 5. For any workflow or local-action change, run `bash tools/ci/check-workflows.sh` before waiting for CI. This is the repository's exact pinned `actionlint` plus `zizmor` gate and its workflow behavior tests; running `actionlint` alone is not sufficient. A disposable credential-free workflow compiler probe is needed only when a release candidate changes hosted-only job topology, permissions, protected environments, or dispatch inputs. The local gate cannot prove hosted environment-secret resolution or dispatch-time graph compilation. Exercise macOS-executed Shell paths with the Bash actually selected by that job, recording `command -v bash` and `bash --version`. `shell: bash` alone does not establish a version. Normal release/Apple setup does not install another Bash; the WASIX postmaster target job explicitly installs Homebrew Bash. Keep focused Bash 3.2 behavioral checks for scripts claiming macOS `/bin/bash` compatibility, including `set -u` empty-array behavior. Do not impose the entire Linux release-tool suite on Bash 3.2. Syntax checks do not replace actual Apple transport or publication-path behavior. 6. Declare runner capabilities on the narrowest Moon task that needs them. Use `requires-rust` for Cargo, rustc, rustfmt, or another Rust-toolchain command; `requires-maintainer-tools` for the pinned tools installed by `tools/dev/bootstrap-tools.sh`; and `requires-android-sdk` for Android SDK work. Use `requires-swift` for the portable Swift compiler; add `requires-apple` only for Xcode, Apple frameworks, simulators or other Apple-only work. Portable Swift source checks use the pinned Linux Swift setup. Capabilities propagate through task dependencies. The planner keeps capability-bearing checks grouped only with tasks requiring the same setup. 7. Treat a hosted runner-image pin as a toolchain dependency. Never introduce a mutable `*-latest` alias; after changing an explicit runner pin, inspect the image delta and run the platform binary contract for every affected release target. For a WASIX Docker, APT snapshot, or bootstrap trust change, also run the product-owned fault test and source verifier before the expensive build: ```sh bash src/third-party/tools/fetch-sources.sh wasix-runtime --verify-only moon run liboliphaunt-wasix:build-orchestration-test liboliphaunt-wasix:test ``` Then use `liboliphaunt-wasix:compiler-output`, `runtime-portable` and `runtime-aot` for the actual selected producer proof. Optional PostgreSQL tools and extensions have separate owner producers; do not restore those as core runtime build prerequisites. For a Docker trust change, build the pinned Dockerfile from a clean builder context. Require a successful TLS-verified snapshot transaction and the exact declared wasixcc, Clang, and Binaryen versions; a source/static check alone does not prove that the pinned trust chain still reaches the snapshot service. For an SDK change, run each affected SDK's relevant source checks, `test`, and `package` tasks in one Moon invocation. Their declared dependencies remain necessary; `package` does not silently rerun unrelated source qualification. Set `MOON_BASE` and `MOON_HEAD`, inspect affected SDK projects, and pass the exact targets to `moon run`; a workspace-wide selector also selects non-SDK products. Confirm ownership with `moon query tasks --project ` when changing task topology. Never replace the product task with a narrower native command: for example, `cargo test -p oliphaunt --lib` omits other Cargo targets selected by the owner task. Carrier producers copy the canonical C header; real consumers compile against it instead of running a separate layout gate. Add the product's explicit runtime or installed-host tests when that proof is needed, and run `moon run extensions:lint extensions:test` when an extension catalog or generated SDK extension surface changes. Put new guarantees in a parsed schema/generated contract where consumers require one, a clean-consumer package check, or a product-owned behavioral test. Do not qualify SDK behavior by grepping prose, test names, or implementation-source spellings. ## GitHub qualification - Identify runs by workflow plus exact `headSha`; never accept “latest successful on branch.” - A manual exact-main dispatch compares against `format('{0}^', github.sha)`, the dispatched commit's immutable sole parent. Never fall back to `origin/main` for a main dispatch: after a merge that moving ref is the dispatched head itself and turns release-intent validation into an invalid self-comparison. Non-main diagnostic dispatches retain their explicit comparison to current `origin/main`. - The `pull_request.closed` event is a runnerless cancellation tombstone. It shares the PR concurrency group so merging cancels obsolete PR work, while every root and `always()` aggregate job skips before runner allocation. It cannot refund PR work that already completed. For an explicitly authorized one-hosted-run recovery, keep CI disabled through every intermediate update and the final merge, then enable it and manually dispatch exactly once from the final `main` SHA. Do not also create a push run: non-PR runs for the same SHA serialize rather than cancel one another. - The release prerequisite is the non-cancelled `Qualified` gate for that SHA, including required checks, builds, policy, tests, and selected E2E. - When WASIX or an extension is selected, require the same-run full lifecycle evidence artifact. It must cover every catalogued extension in direct, server, restart, materialization, and physical backup/restore modes and satisfy `--require-current-evidence` for the candidate source digest. - Ensure artifact attestations and the publication lock reference the same SHA/tree. - Require artifact evidence for the compatibility floors in `src/docs/maintainers/release.md`: inspect Mach-O load commands, Android API/ELF metadata, and Linux ELF symbol versions rather than inferring support from a runner or package label. - Do not rerun duplicate downstream E2E workflows when the same evidence is already part of the required gate. - On failure, inspect the failing job log and earliest causal error. Fix the cause, push a new SHA, and restart qualification; do not reuse artifacts from the failed SHA. ## Report List commands and outcomes, skipped lanes with reasons, exact GitHub run/SHA, required gate state, produced artifact/lock evidence, WASIX lifecycle evidence when selected, and residual platform gaps. “Green CI” without exact-SHA and gate names is not release evidence.