diff --git a/CHANGELOG.md b/CHANGELOG.md index bfcfd272..db91f232 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ a git tag (see [RELEASING.md](RELEASING.md)). ## [Unreleased] +- **Homepage leads with the artifact instead of the abstraction.** The hero opened with 227 words before anything moved, and asked a reader to hold six unfamiliar concepts — "a readable behavior layer for host objects" appeared in the kicker, the page title, the meta description *and* the first sentence, all before any evidence. The standfirst is now two sentences that are checkable on the page itself, the strongest of which is **"nothing on this page is animated."** Kicker and title become "a physics engine for interfaces" — a category people already have a slot for. +- **New `#shipped` section: four doors, one core.** [Habitat](https://habitat.fundamental-engine.com) (WebGL, `@fundamental-engine/three`), [Ascent](https://ascent.guide) (iOS, `` + elements, on the App Store), [zachshallbetter.com](https://zachshallbetter.com) (`@fundamental-engine/vanilla`), and the [native parity matrix](https://fundamental-engine.com/docs/api/parity). The renderer-agnostic claim was previously asserted in prose; it is now four links you can open. +- **Cross-plane parity surfaced in the hero meta** — `js · swift · kotlin`, six forces, identical output, checked in CI. It was one clause in a dense paragraph and the word "parity" appeared once on the entire page, despite being the least common thing the project can claim. +- Maturity line corrected: it read *"no external users yet"* while shipping in a published iOS app and a live WebGL game. It now reads "shipping in production apps, no third-party adopters yet" — which is both truer and stronger. + - **`FieldHandle.guarantees` — the reproducibility envelope is now queryable.** The runtime's determinism classification, its controlled and **uncontrolled** inputs, the requirements for repeatability, and the cross-plane numeric tolerance were previously stated only inside an unexported experimental module. The first external integrator concluded the runtime was byte-identical across environments and designed replay and shared-state features on that — a reasonable inference from unavailable information. It is `conditionally-deterministic`, `host-geometry` and `body-ordering` are **not** controlled, and cross-plane agreement is a tolerance (`1e-6`), never bit-equality. A drift test asserts the published envelope matches the internal contract declaration, because two statements of one fact diverge unless something checks them. - **New canonical doc: [`coupling-discipline.md`](docs/canonical/coupling-discipline.md).** The rung discipline — couple at the lowest rung that achieves the effect — arrived at independently by two consumer projects that each hit the same wall. Covers rung selection, sampling cadence, the measured cost (fill-rate-bound, not particle-bound; ~1ms against a 16.7ms budget), and **when not to use the field at all**: high-frequency domain telemetry belongs in your own arrays, not in bodies. - **README: the WebGL door is signposted where architecture decisions get made.** `@fundamental-engine/three` was fully documented in the packages table three-quarters of the way down; two independent readers still recommended hand-building the headless-to-`THREE.Points` bridge that ships in it. diff --git a/apps/site/src/pages/index.astro b/apps/site/src/pages/index.astro index 34d865a1..10e7500f 100644 --- a/apps/site/src/pages/index.astro +++ b/apps/site/src/pages/index.astro @@ -84,13 +84,13 @@ const sourceLd = { ---
- +

Elements have .

- Fundamental is a readable behavior layer for host objects. It turns elements, records, - views, and relationships into bodies in a shared field — where importance pulls, signal - routes, relation binds, and change decays. The DOM is the first host, not the boundary: - the same renderer-agnostic core runs on the web, in WebGL, natively on Apple and Android, - and headlessly. You author semantic structure; the field returns measurement — live - --field-* variables you style with. + Elements attract, repel and settle like real matter, so a layout shows its + relationships instead of listing them. Nothing on this page is animated — every motion + you can see is the field resolving. You add a data-body attribute; the + runtime measures and hands back live --field-* variables you style with.

@@ -126,13 +124,15 @@ const sourceLd = { {/* Resting mass: ungate the default attention-gated vessel (data-when="") and lead with a continuous attract so the CTAs pull the field at rest — they read as live, moving call-to- actions, not inert until hovered. Engagement still amplifies on hover. */} - + +

Category  add a data-* attribute, get --field-* back For  design engineers · AI-product builders · component-library authors - Maturity  0.x preview — a substrate to build on, no external users yet + Parity  js · swift · kotlin — six forces, identical output, checked in CI + Maturity  0.x preview — shipping in production apps, no third-party adopters yet
{/* The substrate, made visible — a live reading of THIS page's field (density/bodies/particles @@ -176,6 +176,49 @@ const sourceLd = { + {/* Shipped work. The inline demos prove the mechanism; these prove it survives a real product. + Each entry names the door it went through, because the renderer-agnostic claim is only + interesting if the same core is reachable four different ways. */} +
+ +
+ {/* Hands-on: touch the engine — rewrite a body's data-* and watch the field answer live. */} @@ -553,6 +596,15 @@ const sourceLd = { .lp-explore-grid a span { display: block; opacity: 0.7; font-size: 0.9rem; line-height: 1.45; } @media (max-width: 640px) { .lp-verbs li { grid-template-columns: 1fr; gap: 0.15rem; } } + /* Shipped work — the same card grammar as lp-explore-grid, with the door named in mono so the + "four doors, one core" claim is legible at a glance rather than only in prose. */ + .lp-shipped-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(16.5rem, 1fr)); gap: 0.75rem; margin-top: 1.5rem; } + .lp-ship { display: block; padding: 1.1rem 1.2rem; border: 1px solid color-mix(in oklch, currentColor 12%, transparent); border-radius: 0.85rem; text-decoration: none; transition: border-color 0.15s ease; } + .lp-ship:hover { border-color: color-mix(in oklch, var(--cat, currentColor) 45%, transparent); } + .lp-ship b { display: block; margin-bottom: 0.3rem; font-size: 1.02rem; } + .lp-ship span { display: block; opacity: 0.72; font-size: 0.9rem; line-height: 1.5; } + .lp-ship code { display: inline-block; margin-top: 0.7rem; font-size: 0.76rem; letter-spacing: 0.01em; opacity: 0.6; } + /* P4 — the "field reading" motif: a live, calm read-out of this page's own field. */ .field-readout { display: flex; flex-wrap: wrap; gap: 0.35rem 1.6rem; margin-top: 2.4rem;