● Phase E — CI (both tiers) ✅ #30
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "wasm-tier-2-phase-E"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
E2 — gate recipes (justfile)
updating the references in link.rs and the smoke driver.
reactor link, embedded archives). The default just lint doesn't enable the feature, so this
is the only thing that lints those paths.
The single entry point the workflow calls. Updated the stale "LOCAL only — not in CI yet"
comments on both smokes.
E1/E3 — separate CI workflow (.forgejo/workflows/wasm.yml, new)
breaking the core just ci (exactly the E2 isolation requirement).
rustup component add llvm-tools-preview, and wasmtime via the official installer; verifies
node (the Tier-2 V8 driver). Follows ci-linux.yml's conventions (navicore-rust runner, cargo
caches, no target/ cache, only-just calls). These setup steps double as the E1
image-provisioning spec — once the image carries them they're no-ops.
plus the 1,000,000-deep constant-stack proof on wasmtime (Tier 1) and V8 (Tier 2) — the
manual gate findings, now automated.
Verification
Ran the exact thing the workflow runs — just wasm-ci — end-to-end after provisioning the same
toolchain locally (installed wasmtime):
Full workspace tests green; fmt + clippy clean (default and --features wasm); main just ci
confirmed unchanged (wasm gates stay separate).
Honest caveat: I can't execute the Forgejo runner from here, so the workflow file itself
isn't CI-validated — but just wasm-ci (everything it invokes) is verified locally against the
identical toolchain the workflow provisions, and the YAML parses clean. The one thing that
depends on the runner image is node being present (E1); the workflow verifies it explicitly
and fails loud if absent.
Only F (docs: Cloudflare deploy tutorial, the D3 contract + tuning, ROADMAP M11) remains.
Review — #30 Phase E: CI (both tiers)
The workflow structure is right and matches
ci-linux.yml's conventions exactly — samepull_request:[main]+workflow_dispatchtriggers,navicore-rustrunner,actions/checkout@v6,actions/cache@v5, registry+index caches but notarget/cache, and the "only calljust" discipline. Keeping the wasm gates in a separate workflow so a missing wasm toolchain can't break the corejust ci(E2) is the correct isolation, and folding the toolchain provisioning into in-job steps that double as the image-provisioning spec is a nice touch. Thenode --versioncheck failing loud if the V8 driver is absent is the right call given Tier 2 depends on it. Honest caveat about not being able to exercise the Forgejo runner itself is fair.But the gate as written will fail on its first real run on a clean runner.
Blocker
1. The
--features wasmrecipes don't depend on the archives they require, sowasm-cipanics before it lints anything.build.rsembeds both wasm archives unconditionally wheneverCARGO_FEATURE_WASMis set:and
embed_wasm_archivepanics if the.ais missing. So anycargo … --features wasminvocation needs both archives on disk. Now look at the recipe prerequisites:wasm-lint:— depends on neither archive, runscargo clippy --features wasm. It's the first prereq inwasm-ci: wasm-lint wasm-smoke wasm-reactor-smoke, andjustruns prerequisites left-to-right, so it executes beforewasm-smoke/wasm-reactor-smokebuild anything. On a fresh runner —target/is deliberately not cached, and the image doesn't ship the archives —build.rspanics and the gate dies before a single lint runs.wasm-smoke: build-runtime-wasm— builds only the tier-1 archive, but its second compile iscargo run --features wasm … --target wasm32-wasi, which (per above) also needs the tier-2 reactor archive. That archive isn't built untilwasm-reactor-smoke's prereq, which runs afterwasm-smoke. So even withwasm-lintfixed,wasm-smokepanics next.Only
wasm-reactor-smokehappens to be safe, and only because it runs last (by which point bothbuild-runtime-*recipes have run). This passed locally becauseinstall-wasmhad already left both archives intarget/; CI starts clean, so the masking artifact isn't there.Cleanest fix: make every
--features wasmconsumer depend on both builds. e.g. add a combined prereq(
justdedups the shared prereqs, so each archive still builds once perwasm-ci.) Or, minimally, list both builds first inwasm-ciand givewasm-lintthe prereqs sojust wasm-lintworks standalone. Either way, this needs to land before the workflow can be trusted — right now CI is green locally and red on the runner, which is the worst failure mode for a gate whose whole job is to be trustworthy.Small observation
2. Stale
reactor-smokereference survived the rename. The PR renamed the recipe towasm-reactor-smokeand updatedlink.rs+scripts/reactor-smoke.mjs, butcrates/compiler/src/worker_glue.rs:8still says "thereactor-smoketest driver import it." Cosmetic, but it's exactly the kind of reference the rename was meant to sweep.Net: #1 is a genuine blocker — verify by running
just wasm-ciaftercargo clean(orrm -rf target/wasm32-*) so no pre-built archives mask it; that reproduces what the runner sees.cargo build -p patch-prolog-compiler -p patch-prolog-runtime 2>&1 | tail -2…) ⎿ Compiling patch-prolog-compiler v0.2.0 (/home/navicore/git/navicore/patch-prolog/c rates/compiler) Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.41s … +10 lines (ctrl+o to expand) ● Done. Yes — both belonged in done/, now that Tier 1 (M10) and Tier 2 (M11) have shipped. Moved (plain mv, left unstaged for you): - docs/design/WASM.md → docs/design/done/WASM.md - docs/design/WASM_TIER2_PLAN.md → docs/design/done/WASM_TIER2_PLAN.md docs/design/ now holds only the still-active tracks (INVOCATION.md, RUST_EMBEDDING.md), matching how every other shipped design doc (FACT_TABLE, SPANS, COMPILATION_MODEL…) already lives in done/. Reference hygiene: - Updated the full-path docs/design/WASM*.md references I'd introduced across the code/build/docs (reactor.rs, machine.rs, core.rs, lib.rs, link.rs, build.rs, worker_glue.rs, Cargo.toml, justfile, ROADMAP.md, reactor-smoke.mjs) → docs/design/done/WASM*.md. Verified: no stale full paths remain, no done/done double-replacement. - Bare-name citations (WASM.md finding #1, WASM_TIER2_PLAN.md A2) left as-is — that's the project's location-agnostic convention (same as the existing SPANS.md/FACT_TABLE.md citations), so they survive the move. Marked the archived docs as shipped — both headers now read Status: SHIPPED (M10/M11) and point to the user-facing guides, instead of "exploratory" / "working doc; delete when Tier 2 ships." Verified clean: compiler + runtime build, worker_glue tests pass, fmt clean. The changes are all comments/doc-moves, so no functional impact.