Publish the todomvc spike on Pages - #145
Merged
Merged
Conversation
THE SPIKE HAD A LIVE-DEMO LINK TO A DEAD SITE. Its README pointed at a former polymorph-apps Pages root that 404s, and claimed the built demo was committed under docs/spike-todomvc/ — which stopped being true when docs/ moved to CI builds, and is doubly false now that the directory is gitignored. pages.yml built only docs/demo/. So the re-targeted dioxus guest (#143) had no URL anyone could open, and a demo nobody can open is most of how the surface guests stayed broken for fifteen days. Now pages.yml runs `just build` in spikes/todomvc after the demo build and checks its key outputs exist before uploading, so a silently empty build fails the job rather than deploying a hole. It deploys to https://polymorph-components.github.io/polyvisor/spike-todomvc/ on every push to main; PRs build and stop at the artifact, as before. WHAT THE BUILD NEEDS THAT CI LACKED. The dioxus guest depends on the polyengine-dioxus renderer BY PATH, as a sibling of the repo root — the same layout setup.sh already uses for polymorph-webrtc-datachannels — so setup.sh now pins it (lannbot/polyengine-dioxus @ fdc0d52) through the existing pin_repo helper. That sibling in turn carries its own .deps/polyengine checkout plus a translator shim, which the spike's deno.json and translate step reach into; setup.sh clones and pins the former in the siblings phase (reading POLYENGINE_REV out of the sibling's justfile rather than duplicating it, so a sibling bump carries it) and builds the shim in the tools phase, mirroring the sibling's own `just deps`. wasm32-wasip2 arrives through the spike's rust-toolchain.toml with no setup change. rust-cache gains the spike's three workspaces; the shared key already hashes setup.sh, so this diff rotates it. Verified against a throwaway siblings dir and a disposable worktree, never the real checkouts: setup.sh pins the right shas, produces the shim, and is idempotent on re-run; `just build` then succeeds end to end in ~28s warm. Cold-cache CI cost is estimated at three to five minutes inside a job the engine composite already dominates. Also: guest-preact's recipe now runs `npm ci` before `npm run build` — a fresh checkout without node_modules failed `just build` regardless of CI. And the README's harness and bench links, also dead, now point at the new site.
lannbot
enabled auto-merge
September 5, 2026 17:19
THE E2E SUITE WENT FROM ~20 CONSECUTIVE FIRST-ATTEMPT PASSES TO ONE PASS IN SEVEN, starting at #143, and the failures never repeated a scenario: firefox-smoke's browser process gone, solo-erase's page load timing out, cross-engine-pairing's sync never arriving, store-outage-recovery's PUTs failing after three attempts. Different scenario each time is the shape of a runner under load, not of a broken test. WHAT #143 ACTUALLY CHANGED FOR THE DEMO: nothing in its build, and one line in spikes/todomvc/rust-toolchain.toml. But all three workflows key the shared cargo cache on `**/rust-toolchain.toml`, which matches every spike's toolchain file though no spike is among the cached workspaces — so that edit rotated the key, the E2E job restored nothing ("No cache found" from that run on, "full match: true" on every run before), and each run built the engine composite cold. And because the E2E job never saves and CACHE_ON_FAILURE is off, a red main run could not seed the new key either; only the Pages build on main eventually did. The key now hashes engine/rust-toolchain.toml alone — the only toolchain file belonging to a workspace any of these jobs caches — in pages.yml, e2e.yml and soak.yml alike, since they must match. The spike workspaces Pages additionally caches carry no toolchain file of their own. A spike may change its compiler without the demo paying for it. The mechanism linking a cold build to a browser crash is plausible (disk and time on a shared runner) and not proven; the correlation is exact and the fix is right regardless.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
THE SPIKE HAD A LIVE-DEMO LINK TO A DEAD SITE. Its README pointed at a
former polymorph-apps Pages root that 404s, and claimed the built demo
was committed under docs/spike-todomvc/ — which stopped being true when
docs/ moved to CI builds, and is doubly false now that the directory is
gitignored. pages.yml built only docs/demo/. So the re-targeted dioxus
guest (#143) had no URL anyone could open, and a demo nobody can open is
most of how the surface guests stayed broken for fifteen days.
Now pages.yml runs
just buildin spikes/todomvc after the demo buildand checks its key outputs exist before uploading, so a silently empty
build fails the job rather than deploying a hole. It deploys to
https://polymorph-components.github.io/polyvisor/spike-todomvc/
on every push to main; PRs build and stop at the artifact, as before.
WHAT THE BUILD NEEDS THAT CI LACKED. The dioxus guest depends on the
polyengine-dioxus renderer BY PATH, as a sibling of the repo root — the
same layout setup.sh already uses for polymorph-webrtc-datachannels — so
setup.sh now pins it (lannbot/polyengine-dioxus @ fdc0d52) through the
existing pin_repo helper. That sibling in turn carries its own
.deps/polyengine checkout plus a translator shim, which the spike's
deno.json and translate step reach into; setup.sh clones and pins the
former in the siblings phase (reading POLYENGINE_REV out of the sibling's
justfile rather than duplicating it, so a sibling bump carries it) and
builds the shim in the tools phase, mirroring the sibling's own
just deps. wasm32-wasip2 arrives through the spike's rust-toolchain.toml withno setup change. rust-cache gains the spike's three workspaces; the
shared key already hashes setup.sh, so this diff rotates it.
Verified against a throwaway siblings dir and a disposable worktree,
never the real checkouts: setup.sh pins the right shas, produces the
shim, and is idempotent on re-run;
just buildthen succeeds end to endin ~28s warm. Cold-cache CI cost is estimated at three to five minutes
inside a job the engine composite already dominates.
Also: guest-preact's recipe now runs
npm cibeforenpm run build— afresh checkout without node_modules failed
just buildregardless ofCI. And the README's harness and bench links, also dead, now point at
the new site.
Commit is unsigned — an agent's commit should not carry a signature asserting a human author.