spec: Darwin cache population and a requireable Darwin PR gate (#795, #785) - #821
spec: Darwin cache population and a requireable Darwin PR gate (#795, #785)#821NickSeagull wants to merge 1 commit into
Conversation
…#785) Contract-delta spec + ADR-0075 for closing the aarch64-darwin cache gap: a trusted-push-only cachix push in test-macos.yml, a requireable Darwin PR gate (changes + always() aggregate), and an aarch64-apple-darwin leg on neo-ci.yml's cache-populate for the released-neo consumer closure. Spec only — no implementation. Broad scope per gate nh-5rh: #795 AC1-AC3 plus #785's macOS/Linux onboarding-SLO evidence; #795 AC4-AC6 stay with nh-5dz / #810. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Closing: this spec draft belongs to the retired pre-ADR-0075 process (20-step formula, draft-PR spec gate). The beads state was reset and the change process rebuilt (#837) — if this work is still wanted, it re-enters as a fresh request through the change formula v2. |
Gate 1 — spec only. The diff is the contract:
docs/changes/007-darwin-cache-population-and-pr-gating.md+ADR-0075. No implementation, no workflow edits yet.Closes the aarch64-darwin cache gap that #795 step 1–2 and #785 both report, in one coherent caching change. Scope is broad per gate nh-5rh (Nick, 2026-08-17): this change owns both the CI dev-shell closure and the released-
neoconsumer closure. #795 AC4–AC6 (scheduled flake updates, cadence, auto-merge policy) stay with nh-5dz / #810.What the spec promises
test-macos.ymlpushes the aarch64-darwin dev-shell closure — via a newcachix-push-macosjob gated at job level onpush+ exactrefs/heads/main+ same repository. The token is never materialized in a job that runs PR-controlled code (GitHub won't letsecretsbe read from a step-levelif:, so the honest-skip idiom needs a job-levelenv:— hence a separate job, following thecache-populate/check_release_rehearsalprecedent).paths:gainflake.nix+flake.lock— otherwise the one event that invalidates the whole Darwin cache is the one event that never repopulates it.paths:onpull_request, diff-scoping in achangesjob, and anif: always()test-macos-gateaggregate. Third instance of theneo-ci-gate/installer-ci-gatepattern.core/**is deliberately out of PR scope.neo-ci.yml'scache-populategains anaarch64-apple-darwinleg (matrix,fail-fast: false, both./dev neo-consumer-contractand./dev cache-primeretained per leg, trust guard untouched) — the Neo onboarding SLO misses Cachix and exceeds 600s on clean runners #785 half.scripts/workflow-checkfreezes the new credential surface —check_test_macos()plus matrix assertions oncheck_cache_populate().test-macos.ymlis referenced nowhere else in the repo and is about to hold a secret; every other token-bearing workflow already has a freeze check.Criteria
12 criteria: C1–C7
unit(all provable in CI on this PR, via./dev workflow-check --self-testfixtures with a mutation per clause), C8–C12integration(operational evidence — post-merge run pairs and an SLO dispatch evidence artifact). Each names the exact artifact that discharges it.The spec enumerates the full event space (fork PR / same-repo PR / draft / push main / push elsewhere / dispatch) as the token-isolation argument, nine failure modes (F-1…F-9), and four concurrency cases (X-1…X-4). No property-based criterion applies, and the spec says why: the contract is a finite set of static assertions over a fixed YAML document, and the one quantified claim ranges over a closed six-element event space, so C2 discharges it exhaustively.
Two things a maintainer must decide or do
test-macos-gatemust be marked a required check, or Flake inputs are unmanaged and drifting — close the macOS cache gap before automating updates #795 AC3 ships as decoration. Agents can't change repo settings.ci-cdcarries nosecurity-sensitivetag, so./dev spec-check --planrouted no design review for a change that moves a cache-write credential onto a new runner platform. That's a gap in the tagging, not a clearance — the spec requests a manualneohaskell-security-design-review(local-only record, ADR-0069) and recommends taggingci-cdas a follow-up.Known residual (named, not hidden)
cache-primeprimes the closure of theneobuilt from the branch; the SLO measures a releasedneopinned to its own embedded compatibility revision. If those differ,cachix.observed_usestaysfalseon both platforms no matter how much is pushed (F-9). Diagnosis path is in the spec; the fix is a separate change tocache-prime.Gates
./dev spec-check— OK (8 specs valid)./dev spec-check --criteria-tests origin/main— OK./dev spec-drift— OK (empty signature delta; no Haskell surface)./dev adr-check— OK (75 ADRs indexed)./dev workflow-check— OK (17 workflows)Continue signal: a maintainer
@claudecomment approving the spec.🤖 Generated with Claude Code