Skip to content

Publish the todomvc spike on Pages - #145

Merged
lannbot merged 2 commits into
mainfrom
pages/spike-todomvc
Sep 5, 2026
Merged

Publish the todomvc spike on Pages#145
lannbot merged 2 commits into
mainfrom
pages/spike-todomvc

Conversation

@lannbot

@lannbot lannbot commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

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.


Commit is unsigned — an agent's commit should not carry a signature asserting a human author.

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
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.
@lannbot
lannbot merged commit 09a8c64 into main Sep 5, 2026
3 checks passed
@lannbot
lannbot deleted the pages/spike-todomvc branch September 5, 2026 18:29
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.

2 participants