Skip to content

CI: the compiled-core parity battery gates every PR, with determinism fences proven to fire - #246

Merged
ctate merged 6 commits into
mainfrom
feat/compiled-core-ci
Aug 1, 2026
Merged

ctate merged 6 commits into
mainfrom
feat/compiled-core-ci

Conversation

@ctate

@ctate ctate commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

The compiled-core parity battery becomes a CI gate, and the determinism fences gain a pinned negative control proving they fire.

What changed

  • New compiled-core-parity CI job (ubuntu-latest, mirroring the existing setup steps): installs the pinned external core compiler from npm, verifies the installed version against the pin, stages the generated contracts, runs the fence check, builds all five fixture cores through build_core.sh, and runs the full parity battery. What was an env-gated local harness now guards every pull request.
  • The compiler pin lives in one file — tests/compiled-core/core_compiler_pin — read by the CI install step and enforced by build_core.sh itself, which refuses any other release with a teaching. The generated profiles' fence table is release-pinned data, so an unpinned compiler could silently change what the battery proves; a version bump is a one-line edit.
  • tests/compiled-core/fence_check.sh: the determinism fences now have both controls. The pristine markup compile must attest deterministic: true; a staged variant with an ambient wall-clock read injected into update must refuse — the fence names the surface and teaches the journaled-clock alternative — and emit no artifacts. The injection is anchor-verified: if the fixture is ever reshaped so the injection lands nowhere, the check fails with a teaching instead of passing vacuously. Without a compiler on PATH the check skips cleanly, like the battery.

Verification

  • Full five-fixture battery green locally through the new pin-enforcing path: 86/87 tests, 1 expected skip, exit 0.
  • Fence check both ways locally: pristine attests deterministic, injected read refuses naming the fenced surface, skip path exits 0.
  • Pin mismatch path verified: a compiler reporting a different version refuses with the teaching.
  • zig build, zig build test, zig build test-ts-core-e2e, zig build sidecar-conformance all pass; workflow yaml parses.
  • The one thing not provable locally is the job on a real runner — this pull request's own checks are that proof.

ctate added 4 commits July 31, 2026 17:34
- tests/compiled-core/core_compiler_pin is the one place the release pin lives
- build_core.sh verifies the supplied command reports that release and refuses any other, because the profile's fence table is release-pinned data
- fence_check.sh compiles the pristine markup fixture and asserts its co-emitted sidecar attests deterministic: true
- the same fixture with one injected ambient read (Date.now() in update) must refuse, naming the fenced surface id, with no archive or sidecar emitted
- skip-clean when no external toolchain is supplied, like the parity battery
- new ubuntu job installs the pinned external core compiler, stages the contract artifacts, and builds all five fixture cores through build_core.sh
- runs the determinism-fence negative control, then the full test-compiled-core-parity battery over the compiled archives
- the release pin is read from tests/compiled-core/core_compiler_pin, so a bump stays a one-line change
- one line per comment paragraph across the new CI job, the pin check, and the fence-check script
@vercel

vercel Bot commented Jul 31, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
native-sdk Ready Ready Preview Jul 31, 2026 11:45pm

- The parity battery runs its test binaries serially in CI: five suites racing on a two-core runner turn scheduler contention into dispatch-budget failures the budgets were never meant to catch.
- A budget failure now prints the measured whole-pipeline and core-only nanoseconds, so a real regression and a noisy runner are distinguishable from the log alone.
- The paired-core module declares paired_lanes, the staged root re-exports it, and the soundboard dispatch pin reads it: a dispatch that runs both lanes and byte-compares every seam gets half the frame budget, while the single-lane suite keeps the strict microseconds-class pin.
- The measured CI shape that set the number: core-only paired dispatch at just over the single-core budget on a shared runner, with the whole pipeline well inside its frame.
@ctate
ctate merged commit 8014e79 into main Aug 1, 2026
28 checks passed

This branch was successfully deployed

1 active deployment
Preview — 77180ae5 Deployed Jul 31, 2026 by vercel[bot]
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