v0.8.0
[0.8.0] - 2026-07-04
The keystone client wave: the mutation channel now has a client-side state machine, a form binding, and a live-runtime adopt path; morph gains explicit opaque subtrees; the document graph node schema carries Standard Schema V1 interop.
Added
@czap/core—createGraphMutationClient. A DOM-free mutation-channel client that owns the current base, serializes submits, advances onapplied, never throws, and handles structuredstaleBase: truerefusals with a bounded host-ownedrefreshBaseretry.GraphMutationResponsenow distinguishes stale-base/lost-update refusals without string-matching messages, andverifyAppliedGraphis the shared applied-graph guard used by senders and live adopters.@czap/web—bindGraphForm. A form-submit binding for the mutation channel: captureFormData, let the host project it toPatchOp[], drive the mutation client, setdata-czap-mutation-state, and dispatchczap:mutation. LiteShip owns the rig; the host owns markup, domain projection, and error rendering.@czap/astro—adoptAppliedGraphand stale-base 409s.graphMutationRoutenow maps stale-base/lost-update refusals to HTTP 409 while other refusals remain 422.adoptAppliedGraphre-proves a server-applied graph throughverifyAppliedGraphbefore advancing a live graph runtime and re-casting the delta.@czap/web— morph-opaque subtrees.MorphOpaqueexports the presence markerdata-czap-morph-opaque; matched opaque nodes stay verbatim, unmatched old opaque nodes are kept, new opaque nodes insert after sanitization, and opaque roots are total no-ops.@czap/core— Standard Schema interop.DocumentGraphNodeSchemanow carries the Standard Schema V1~standardproperty via Effect's converter;isWellFormedNodekeeps the same behavior.
Fixed
@czap/web— morph callbacks now match their public type.beforeRemoveis threaded through nested removals and can veto non-opaque element removal;afterAddfires for inserted elements and text nodes, including nested insertions.examples/cloudflare-astro— Cloudflareastro devmodule URLs no longer 404. The example'srun_worker_firstconfig was routing Vite dev-infrastructure URLs (/@vite/*,/@id/*,/@fs/*,/src/*,/node_modules/*) into the worker, wherenot_found_handling: "none"made them 404. The config now excludes those dev prefixes while preserving worker-first app routes and/_czap/*asset-first boundary CSS.
Internal
- Spine conformance is broader. The conformance test now names its coverage and pins more of the core/design/edge spine surface; the pass root-fixed drift in the theme compile and edge cache-tag mirrors.
- Cloudflare dev path is covered.
pnpm run test:cloudflare-devboots the Cloudflare Astro example underastro dev, fetches the page's module URLs, classifies LiteShip-injected page scripts, fails on 404s, and cleans up the Astro/workerd daemon. - Example 06 proves the primitives.
examples/06-mutation-roundtripnow usescreateGraphMutationClient+bindGraphForm, keeps a raw-channel stale refusal demo, and demonstrates stale recovery through the client primitive.
Breaking
- None.