Lossless Changelog
product

Three Competing Design Directions for Multiphasic, Built in Parallel Against One Narrative Spine

New site scaffolded for Multiphasic Corporation — a materials-state-control deep tech company — from a single five-slide deck. Rather than picking a direction on a mood board, we wrote the eight narrative beats once into markdown and had three agents build three complete sites against them concurrently: Phase Diagram (instrument readout), Lattice (the material itself), and Before the Beam (a two-column argument). Because the argument is held constant in the content layer, the comparison is purely about form. All three ship light, dark, and vibrant modes and six flare components, and the whole thing typechecks clean at 12 routes.

Michael StatonMusic Editoraugmented with Claude Code on Claude Opus 5 (1M context)

Changelog — 2026-08-26 (#1)

What shipped

A new Astro Knots site at sites/multiphasic-site, holding three complete design directions for the same company, all live at once:

RouteDirectionHero it argued for
/instrumentPhase Diagram — the site as a scientific instrument readout"From materials processing to materials programming."
/latticeLattice — the site as the material itself"Program the state of matter."
/diptychBefore the Beam — a sustained argument in two columns"From materials processing to materials programming." (split across the seam)

12 routes total, including /brand-kit, /design-system, and a demo page for each of the six flare components. astro check: 0 errors, 0 warnings.

The method: hold the argument constant, vary only the form

The usual way to compare design directions is to compare mockups that also happen to say different things, which makes the comparison unfalsifiable — you cannot tell whether you prefer the layout or the copy.

Instead the eight narrative beats were written once, into src/content/beats/*.md, with a deliberately permissive schema. All three directions read the same collection. The differences are entirely in the semantic token layer and the section components.

The measurable result: Phase Diagram renders 81 KB of HTML, Lattice renders 47 KB — from identical source content. Lattice's agent reported 542 words across eight full-bleed screens. That is the "manifesto, not brochure" mandate showing up as a number instead of as an adjective.

Each direction was pointed at its own hardest problem

Rather than letting three agents each build a comfortable dark-mode landing page, each brief named the specific place that direction wanted to fail:

  • Lattice is built on glow — so it had to survive light mode. It solved it by inverting the metaphor rather than dimming the design: in dark, order reads as light (screen blend, annealed lattice brightens); in light, order reads as ink (multiply blend, bonds darken as they anneal, glow tokens set to zero).

  • Before the Beam is built on a paper-vs-navy opposition — so it had to survive dark mode, where both halves want to collapse into the same darkness. It re-founded the opposition on a rule that survives every mode: the past half is the page ground, the future half departs from it, carried by texture and temperature rather than luminance.

  • Phase Diagram had the opposite risk — being tasteful and forgettable. Its constraint was scarcity: coral appears exactly once per screen, and four of the eight beats have none at all.

Flare: the physics is real, not decorative

  • EnergyLandscape — both curves are sampled from one analytic potential at the same 140 points and emitted as beziers with identical command counts, so the browser interpolates the CSS d property directly. The metastable-well deformation is a CSS transition — no tween library, no WebGL, no GSAP.

  • LatticeExcitation — canvas 2D. The defective side carries a real edge dislocation using the (b/2π)·atan2 displacement field, a ~11° misoriented grain, and ~5% vacancies. Verified numerically: ordered-side bond-length sd 0.0 vs ≈17px on a 64px mean. Atoms hard-capped at 620; rAF gated on IntersectionObserver and visibilitychange.

  • OverdesignMass — the geometry is solved, not eyeballed: given a ratio it bisects for the thickness scale making the hedge area exactly ratio × the core, and the readout is measured off the paths actually drawn.

Every flare component honors prefers-reduced-motion with a meaningful static fallback rather than a frozen first frame.

Two real bugs caught by verifying instead of assuming

  1. The site was not independently deployable. The initial pnpm add calls resolved against the parent workspace: no site-local pnpm-lock.yaml, node_modules hoisted to the monorepo root, and the astro-knots lockfile modified as a side effect. It built fine from inside the monorepo and would have failed on Vercel, which clones the site repo alone. Fixed by reverting the parent lockfile and reinstalling with --ignore-workspace.

  2. exclude: [".astro"] silently untyped the whole site. Added while excluding the per-agent dist-* verification dirs from astro check. Because include pulls .astro/types.d.ts — the generated astro:content collection types — excluding the directory won, getCollection() degraded to any, and 13 type errors surfaced across all three variant pages at once. The three pages looked broken; the tsconfig was.

Worth remembering: an error that appears simultaneously in three independently-authored files is almost never in those three files.

Notes

  • The source deck is CONFIDENTIAL and lives in context-v/extra/private/ (verified gitignored). The site ships noindex, nofollow until that is lifted.

  • / is an internal chooser, not the shipping homepage. When a direction is picked it is promoted to / and the other two are retired.

  • Nothing has been committed — the repo is initialized but has no commits and no remote.