Releases: freebatteryfactory/LiteShip
Release list
v0.10.0
[0.10.0] - 2026-07-13
The completion cut — a semantic-truth pass over the 25-package system,
moving several seams from structural completion (a field is read, a fallback exported) to
semantic completion (the correct state / bytes / DOM / cache variant / timeline behaviour
survives end to end). Every change is red-first, root-caused, propagated to examples & docs, and
independently QA'd; the full node vitest suite is green (7786/7809). Resolves #126, #130, #140,
#141, #146; tidies #145; parks #129 with a reopen condition; fixes #142's breadcrumb depth.
Added
- Graph-native stream recovery, end to end (#133) — a typed, value-bearing
DiscreteStateTransition@1
receipt (minted through the one existing hash law), attestation-checked SSE ingestion (hash + subject +
chain), a generation-rollback guard, and a production astro host wiring + reference emit route + integration
test that drives a real crossing through a reconnect. Retires the latent substrate. - Continuous motion runtime floor (#126) —
client:motionscrubs a scroll/time signal through the JS
floor when nativeanimation-timelineis unavailable; the floor and CSSlinear()provably sample one
Easing.springkernel. Adds thecolorinterpolation kind. - Multi-transition algebra (#141) — an explicit
TransitionProgram(seq/par/choice) with real duration
composition and branch selection (ADR-0039), replacing the collapsed routing label. - Cross-target motion parity (#130) — one authored program renders identically across browser CSS,
browser runtime, scene, stage, remotion, and worker, proven by a differential oracle (ADR-0040). - Responsive-media effective-candidate law (#140) —
selectCandidatesso Save-Data is honoured across
src/srcset/<source>/preload/image-set()/cache-key; wired into Astro and Cloudflare hosts. - Answer-first npm
description/keywordsfor all 25 packages from one canonical catalog, with a
release-gated prepublish metadata check (#146).
Changed / Fixed
- CSS: bare declarations inside
@supports/@mediaconditional groups are now wrapped in the boundary
selector (were silently dropped by the browser). - Astro:
Varytokens are merged, not clobbered (protectsCookie/Accept-Encodingcache axes). - MCP: the docs route returns JSON-RPC failures as a top-level
errormember (was laundered into a 200result). - CLI/doctor: deployed-header checks validate actual COOP/COEP/Client-Hint values (not mere presence);
value-taking flags no longer swallow the next flag; the Workers module-scopeDatescan is AST-based. #145MCP dispatch-matrix timeouts refactored to a documented lookup table;#142sharded-docs breadcrumb
depth fixed (sharded builder stays experimental).
Removed (breaking — pre-1.0 aggressive break policy)
discreteSignalPayloadsFromPatch(@czap/core) — replaced by the typedDiscreteStateTransitionreplay path.keyframesForRouting(@czap/core) — replaced by theTransitionProgramlowering.
v0.9.0
[0.9.0] - 2026-07-09
The 0.9 keystone wave — Phase B gap closure plus the hardening cut: HTTP QUERY read-leg,
DPU adopt-under, motion/security/tooling fixes, and a workstation-safe local accept bar.
Added
- HTTP QUERY read-leg (#119) — typed query surface for the motion/stream spine keystone.
applyVerifiablePatchAndAdopt(#120) — DPU patch apply wires throughmutationClient.adoptafter CAS verification; refuses onresultGraphmismatch without mutating the DOM.- Deployed doctor DNS pin-and-connect — resolve A/AAAA, fail-closed on private/special-use ranges, pin undici connect per hop (rebinding-safe), multi-address fallback, agent cleanup.
local-safegauntlet profile — build → capsule:compile → typecheck → lint → structural → invariants → gates → audit:floor → test → standards/capability gates (omits memory-hungrydocs:check; run separately when API inputs change).memberSinkstaint channel —document.write/document.writelnclassified receiver-qualified (nostream.writefalse positives).examples/07-stagger-reveal— committed stagger preset + dogfood test (#124).- ADR-0038 — monolith TypeDoc canonical; sharded build experimental only (#136).
- Docs MCP
computeBundleId— recompute/reject at load for sealed bundle integrity.
Fixed
- Responsive media DPR —
minPositiveWidthfor unsorted variant lists (#125). - Workers module-scope Date scan — project-level wrangler
mainresolution (#115). - Taint
document.writeregistry (#121); scroll-progresswarnOncebuffer-sink regression (#104). - HTML trust / B5b cage — nested-template/srcset hardening; adversarial SSRF/DNS/HMR/recovery gaps from Phase B QA.
- IPv6 special-use DNS guard — multicast, documentation, site-local, and 6to4 ranges blocked in deployed probes.
Internal
- cut9 meta-tests — local-safe profile law, DNS pin law, B5b cage, skip-law pins.
- Architecture/docs cross-links — README AEO, ROADMAP ledger, ADR 0036/0037 issue links.
Closes #104, #105, #115, #119, #120, #121, #123, #124, #125, #127, #128, #136 (among others in the Phase B wave). Follow-ups: #140–#142; epic #130 remains open.
Breaking
- None.
v0.8.1
[0.8.1] - 2026-07-08
Test, bench, and CI hardening — honest gates, parallel truth-linux, and catalog-driven coverage.
Added
- Parallel truth-linux CI lane — setup fan-out, four test shards, bench/mutating/integration/mid lanes, coverage merge, and a
ci-parallel-finalprofile that runsreport:runtime-seamsagainst stitched artifacts. check:gatesin gauntlet — Tier 0.2czap checkgates (early-return detection, sanctioned skips, capability linkage) wired into the full gauntlet phase list.- Catalog-driven bench execution — generated bench tests honor capability probes and sanctioned skips instead of lying about coverage.
scripts/mint-gauntlet-context.ts— onegauntletRunIdminted in parallel setup and propagated through fan-out jobs for runtime-seams coherence.
Fixed
- Bench harness —
ecs-compositionmigrated to tinybench; wasm bench lane installs the stable Rust toolchain beforebuild:wasm. - Parallel artifact handoff — capsule manifest, benchmark tarballs, coverage shard layout, and gauntlet context ship in setup artifacts; final job restores them at repo root.
- WebKit WebCodecs — broaden the
webcodecs-absentprobe so Playwright WebKit on Linux skips encode instead of crashing the browser process.
Internal
- Standards sign-offs — traceability snapshot/waivers updated for new sanctioned skips and gate wiring.
Breaking
- None.
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.
v0.7.0
[0.7.0] - 2026-07-03
The client→server mutation channel — the return leg of the stream. SSE pushes
server→client; this is the other direction, and it rides the AI-cast refuse-seam so a
human client's edit is validated exactly like a model's proposal.
Added
@czap/core— the client→server graph-mutation channel.handleGraphMutation(request, { loadGraph, saveGraph })is the transport-agnostic server core: decode a client-proposed
GraphPatch→validateGraphPatchProposal→ compare-and-swapapplyValidatedPatch→
persist, returningapplied(new graph),refused(invalid patch — validation or a
concurrent-write CAS miss), orerror(a server-side store failure, retryable).
sendGraphMutation(url, patch)is the client sender: it validates the response shape, then re-seals
and re-validates the applied graph — it must be the NORMALIZED form the server emits (deduped unique
nodes/edges, id and digest addressing its content, no dangling edge or cycle) — before adopting it (a
forged, miswired, or malformed base is refused, not stamped against), and maps a transport failure or
a non-JSON body toerror— one shape to consume, never a raw throw. A patch cast against a stale base is
refused (optimistic concurrency for free); only a validated patch mutates the graph, which
re-addresses. The host owns theGraphStore(the authority boundary, ADR-0015); LiteShip owns
the gate. Full rationale: ADR-0030.@czap/astro—graphMutationRoute(store). The host route adapter: a plain
(request) => Response(theczapFetchLayershape) that drops into an Astro API route
(export const POST: APIRoute = ({ request }) => graphMutationRoute(store)(request)). 200
on apply, 422 on refusal, 400 on a malformed JSON body, 415 on a non-application/jsonbody.
@czap/astroinjects no route — the endpoint, store, and authority are the host's.examples/06-mutation-roundtrip— a runnable SSR app proving the round-trip end to end
(client proposes → server validates + applies + persists → the stale re-proposal is refused).
Security
- CSRF hardening on the route.
graphMutationRouterequiresContent-Type: application/json
(415 otherwise), forcing cross-origin POSTs through a CORS preflight so a simple-request can't
smuggle a patch to a cookie-authed mount.Request.json()would otherwise parse atext/plain
body just fine. Host session/origin auth remains the host's. - Refuse-seam hardening — off-contract nested edge fields. The AI-cast validator now enforces
additionalProperties: falseon the edge object (from/to/type), not just the op envelope. Before,
a patch could smuggle an extra field onto an edge (a blob, or a__proto__key); the graph digest
addresses only[from, to, type], so the field rode into the sealed graph un-addressed — the
persisted bytes diverging from the content address. Now rejected at every schema depth, on both
the channel and the AI-apply paths. - Fail-closed reader rejects invalid edge types.
decodeDocumentGraphnow validates an edge's
typeagainst theEdgeTypeenum (seq/par/choice_then/choice_else), not just that it is a
string — closing a shape gap for ANY host lowering an untrusted graph, not only the mutation channel. - Policy-grant corruption closed at the root. A policy node's
grantsis now a validated,
canonical CapSet schema (was opaque): a malformed or non-canonical grants is rejected by
isWellFormedNodeon the channel and AI-apply paths alike, so an untrusted client cannot seal a
wire-ordered CapSet under a divergent content address. (See Breaking — the underlying type change.)
Breaking
CapSet.levelsis a canonical array, was aSet. ASetJSON.stringifys to{}(so a
policy patch over the channel silently lost its grants) and its insertion order mis-addressed the
same logical set.levelsis now a deduped, ladder-sorted array: JSON-faithful and
content-address-deterministic.Cap's combinators (has/union/intersection/…) are unchanged;
only direct.levelsaccess moves fromSet(.has/.size) to array (.includes/.length).
Internal
- Bench directive-overhead gate: window-invariant estimator. The hot-path overhead ratio is now
the median of per-sample PAIRED ratios (each pair timed adjacently), not the ratio of medians —
robust to the whole-sample load bursts on contended CI runners where the old estimator false-positived.
v0.6.0
[0.6.0] - 2026-07-01
"Make-it-loud, round 2": a second dogfooding pass that turns more silent
degradations into loud diagnostics through the existing channel, unifies the
Vite boundary-discovery seam, and adds vector WGSL uniforms so the WebGPU cast
reaches GLSL parity.
Added
@czap/edge— spreadable tier attributes.EdgeTier.tierDataAttributesMap
andEdgeHostResolution.htmlAttributesMapexpose the rootdata-czap-*
attributes as aRecordkeyed by the full attribute name, built from the
CAP_AXESregistry so a new axis appears automatically.tierDataAttributes
(the pre-serialized string) is now derived from the map, so the two forms
cannot drift. See ADR-0018.@czap/compiler/@czap/astro— vector WGSL uniforms. Authored@wgsl
values acceptvec2/vec3/vec4(emittedvec2f/vec3f/vec4f); the WebGPU
runtime derives its uniform-buffer byte layout from the bound struct declaration
(WGSL alignment, 16-byte stride, bounded 64-byte buffer).u_resolutionis a
realvec2<f32>, closing the GLSL/WGSL parity gap; an overflowing declaration
warns once (wgsl-uniform-buffer-full) instead of silently truncating.
See ADR-0029.@czap/astro— directives boot on plain elements.client:stream/
client:llm/client:gpu/client:wasm/client:graphnow activate on
plain elements, not only framework islands, via a scanner whose selectors derive
fromDIRECTIVE_ATTRIBUTE_REGISTRY(a new directive is scannable by construction).
A baredata-czap-boundary— also a satellite/worker payload — stays explicit and
warns once when found bare instead of silently doing nothing. See ADR-0028.
Fixed
@czap/vite— unified boundary discovery. The@quantizeCSS transform
resolves boundary names from the same module-graph discovery as the manifest
(previously onlydirs.boundary), and an unknown@quantize <name>is now a
hard error naming the boundary instead of a generic lightningcss "Unknown at
rule". A manifest-covered boundary with no precompiled outputs warns
(manifest-boundary-empty-outputs) instead of silently serving empty CSS.@czap/audit— consumer mode.czap audit --consumerskips the internal
structure pass entirely (previously ~437 info findings against a consumer's own
app);czap audit --findingsstreams parseable NDJSON to stdout for tooling.@czap/quantizer— shader outputs in the change stream.outputChanges
surfacesglslandwgsloutput tables alongsidecss— previously only css
reached the stream and shader outputs sidestepped it.@czap/edge/@czap/astro—Sec-CH-Viewport-Widthis now aCritical-CH
hint, single-sourced. The production middleware asks for it critically, so a cold
browser resends the viewport hint before the first render and server-side
resolveInitialStatepicks the right initial state instead of a User-Agent estimate.
@czap/astro'sCLIENT_HINTS_HEADERSnow derives from@czap/edge's single
Accept-CH/Critical-CHsource rather than a hand-kept copy that had silently
diverged (dev asked for viewport-width critically, production did not); a drift guard
pins that the two can never disagree again.
Changed
@czap/compiler/@czap/edge— WGSL binding value type widened.
CompiledWGSLOutput.bindingValues(and the compiler'sWGSLCompileResult) now
carryWGSLUniformValue(number | readonly number[]) end to end — manifest,
edge KV cache, satellite payload, boundary eventdetail, WebGPU writer — to
represent vectors. Pre-1.0 minor; a consumer that narrowed the type tonumber
must widen it.
Internal
driveUniformFromSignalcontinuous-signal tracking on theSharedArrayBuffer
worker (off-thread) path is now pinned by a non-vacuous gate. api-surface
snapshot regenerated for the new exports.
Docs / DX
- Front door. The README opens with an
## I want to…router and a single canonical
signal → boundary → graph → cast → patchdiagram, placed byte-identically in README,
GLOSSARY.md, andAUTHORING-MODEL.mdand pinned by a drift guard so the three copies
can't diverge.DOCS.mdgains a four-layer routing preamble (Use / Author / Extend /
Engine-room). The demoted package table now lives inARCHITECTURE.md, generated from
the workspace and drift-gated. - Examples ladder.
examples/README.mdorders the examples as a learning path
(author → cast-to-ARIA → cast-to-GPU → the AI-patch keystone → cast-to-video); the
showcase is banner-marked "not the starting point." - Two new keystone examples.
examples/05-ai-patch-refused(a model's invalid
GraphPatchis refused; only a validated proposal mutates the graph) and
examples/03-cast-aria(one@quantizeblock casts a boundary to CSS and ARIA). - New gates. A relative-link checker across root/docs/package READMEs and a front-door
aperture gate (≤3@czap/*package names above the first install line) — both caught
real drift on arrival.
v0.5.0
[0.5.0] - 2026-06-30
A "make-it-loud" release: every fix turns a silent degradation into a loud
diagnostic through the existing channel, plus a packaging hardening and a
DAG-compaction feature — surfaced by dogfooding the framework on real apps, and
hardened by an adversarial review pass.
Added
@czap/core— receipt-DAG compaction.DAG.checkpoint(dag, { below })+
DAG.spliceCheckpointreclaim a long-lived receipt DAG's dominated prefix into
a content-addressed checkpoint attestation (drop-only; the spliced DAG equals a
fresh reload).Receipt.validateChaingainsChainValidationOptions { base, checkpoint }for cross-boundary validation (a compacted tail is verifiable only
against its checkpoint). See ADR-0026.@czap/web— SSE overflow policy.SSEConfig.overflow
(drop-newest | drop-oldest | coalesce-by-id, defaultcoalesce-by-id) + an
enrichedBackpressureHint(policy/droppedCount/coalescedCount) + a
stateChangesedge stream. See ADR-0005 (SSE addendum).create-liteshipnow scaffoldseffect(^4.0.0-beta.32), fixing an
unmet peer on a fresh project.
Fixed
client:gpuwarns once (canvas-default-size) when its host has no layout
at boot and the canvas falls back to the 300×150 default — previously a silent
tiny render.- Signal directives warn once when a boundary input is recognized but has no
live producer on that surface (signal-input-unserved-here) — previously a
silent freeze; theuniform-signal"likely a typo" mislabel is split into two
disjoint codes. @czap/genuirejects an unsupported registered handler prop (on*≠
onClick, or a non-stringonClick) at validation instead of silently dropping
it at render.@czap/webSSE no longer silently drop-newests under saturation (see
Added), and the heartbeat watchdog now reconnects on timeout.client:stream/client:llmnow run on the hardenedSSE.create
connection (unified reconnect/resumption + the heartbeat reconnect fix),
processing each message synchronously in the dispatch turn with clean teardown
(dispose / VT-swap single-boot);client:llmterminal frames close the live
connection.
Changed
effectpeer range capped to>=4.0.0-beta.32 <5across all@czap/*
packages (was an unbounded>=4.0.0-beta.0), pinned bypnpm.overrides.effect
and a drift guard.
Security
Receipt.validateChainDetailednow requires a verified checkpoint to
validate a compacted tail; abasewatermark alone is rejected
(checkpoint_invalid) — previously a truncated chain could validate with no
proof of compaction.
Internal
- Cell↔DOM boundary committed as a guarded law (ADR-0027). Audit consumer-mode
disallowed-edge coverage. Fixed two Effect-beta issues uncovered during review
(Scope.usefinalizing immediately; an overflow-buffer CPU spin). api-surface
snapshot regenerated for the new exports.
Breaking
@czap/genuirenderFromCatalognow returns a tagged
RenderFromCatalogResult({ ok }union) instead ofboolean. Callers using
if (renderFromCatalog(...))must switch to.ok.
v0.4.1
[0.4.1] - 2026-06-29
A patch release: a consumer-audit scoping fix, two runtime DX/behavior fixes
surfaced by downstream dogfooding, and a dev-toolchain refresh.
Added
@czap/astro— directive-collision diagnostic. The client-directive scanner now warns
once when an element is claimed by more than one czap directive — e.g.client:gpuand
satelliteAttrs()on the same canvas, where the satellite silently wins and the GPU shader
never boots. Activation is unchanged; the warning names both directives and the fix (put each
on its own element), turning a silent directive fight into a loud, actionable signal.
Fixed
@czap/audit— consumer-audit scoping regression.czap audit --consumerno longer emits
falseunknown-internal-packageerrors (98 on a real 0.4.0 upgrade) for a discovered package
importing an internal@scope/*package that isn't in the discovery seed (transitive/pnpm-hoisted
deps like the new@czap/error/@czap/gauntlet). In consumer mode (profile.packageRootsset)
the structure pass keeps its dependency-graph output but suppresses that rule — it's the vendor's
own published wiring, which a consumer can't act on and LiteShip's own CI already audits. Source-
monorepo audits still flag it.@czap/audit— the "internalPackagePrefix cannot be derived" error (hit when the direct
runAuditPasses({ repoRoot })API runs in an unscoped consumer app) now points at
czap audit --consumeras the correct consumer entry point. (A silent no-op prefix is
deliberately NOT introduced: a clean audit must never mean "nothing was checked".)@czap/astro— WGSLu_timeis now advanced every frame. Hand-authored animated WGSL
shaders that declareu_timewere frozen: the WebGPU runtime only wrote the uniform buffer on
boundary crossings, never a clock. It now feeds the monotonic elapsed-seconds clock per-frame
(merged with the live signal snapshot so signal fields are preserved), at parity with the GLSL
path.u_resolution(avec2) is fed per-frame too — the WGSL uniform buffer now lays fields
out by WGSL alignment rules (so avec2lands on its required 8-byte offset) rather than a flat
scalar layout. (u_stateis already fed as the compiler'sstate_index.)
Changed
- Node floor + dev toolchain. Raised
engines.nodeto>=22.13.0(the minimum for
eslint 10) across all packages; CI continues on Node 22. Bumped eslint 9→10, prettier 3.9,
typescript-eslint 8.62, fast-check 4.8, jsdom 29.1, playwright 1.61, and related dev tooling,
and aligned the@remotion/*override to 4.0.484. Tailwind is held at 4.2.1 (4.3 regresses the
showcase example build) and Node 24 is deferred (its V8 breachesINV-COMPOSITOR-ZERO-ALLOCvia
Effect's Queue in the compositor's live-subscriber publish path) — both tracked for a later release.
v0.4.0
[0.4.0] - 2026-06-25
The live-runtime cut: the framework primitives that 0.3.0 left built-but-test-only
are now plumbed into the live cast pipeline — and a new gate makes "built-not-plumbed"
a CI failure so it can't happen silently again.
This cut also hard-cuts the Astro host substrate to Astro 7 / @astrojs/cloudflare v14:
czapFetchLayer() is the front-of-pipeline fetch layer, @czap/cloudflare/cache-provider
bridges Astro cache.invalidate() into the CZAP boundary KV tag index, czap astro dev/status/stop delegates to Astro background dev-server management, and czap doctor --target astro probes the Astro dev status endpoint.
Added
@czap/astro— runtime DocumentGraph loader.loadGraphRuntime(serialized, resolve)
lowers a sealedDocumentGraphonto the live boundary cast pipeline (CSS/ARIA/GPU),
with a surgicalcastGraphDeltare-cast seam (only changed cells re-lower; untouched
observers survive). Newclient:graphdirective. The loader is the seam an authoring
producer feeds; the producer itself is downstream.@czap/astro— scene→live-runtime bridge.bridgeSceneToGraph(scene, handle, …)
drives a signal-indexed@czap/sceneagainst the live runtime: a DISCRETE state crossing
emits aGraphPatch→recast, while the CONTINUOUS tween writes a leaf CSS var / GPU
uniform each frame and never patches the graph.@czap/sceneis now a live runtime
consumer (was video/offline-only).@czap/astro— AI-apply seam.castGraphContext(cast the live graph OUT to a
model-facingAIContext) +admitGraphPatchProposal(admit a candidate IN through the
un-bypassablevalidateGraphPatchProposal→applyValidatedPatchtoken-witness chain,
then re-cast the delta). LiteShip exposes the seam; the model producer is downstream.@czap/astro— SVG last-mile directive (client:svg): resolvesdata-czap-entity → SVGElementand applies@czap/scene'sapplySvgAttrsto the live DOM each frame.@czap/stage— headless node video encode.dualExportNode(graph, ffmpegFrameEncoder())
runs the graph→page+video dual-export proof in node/CI via an injected ffmpeg/libx264
FrameEncoder(was browser/WebCodecs-gated). The frame-source digest == page digest
invariant holds headless (frames addressed, bytes injected).@czap/quantizer— AnimatedQuantizer frame-clock injection.AnimatedQuantizer.make(…, { scheduler })
takes an optional@czap/coreScheduler.Shape(raf/fixedStep/audioSync) so the output
interpolation rides the display refresh (or a deterministic render/test clock) instead of its internal
fixed 16ms sleep. Omitted, the 16ms loop is byte-unchanged — existing callers are untouched.@czap/astro— continuous signal→uniform bridge.driveUniformFromSignal(element, input, uniform)
(from@czap/astro/runtime) drives the existingczap:uniform-updateevent continuously from a
continuous signal (e.g.scroll.progress), writing the value into the GLSL/WGSL uniform the GPU runtime
already consumes each (rAF-throttled) frame. Replaces the hand-rolled scroll→uniform glue and its
0..1-vs-0..100 scale footgun.@czap/vite—@quantizecontainer-target opt-out. Newquantize.containerplugin option
retargets the auto-emitted viewport@containercontainment off:rootto a named selector
(e.g.'.czap-vp') for hosts whose layout can't have a size-contained:root. Default:root
unchanged; applies to both the CSS transform and emitted boundary assets.@czap/astro— convention-file watch battery. The integration now calls Astro'saddWatchFile
for the convention primitive sources (boundaries / tokens / themes / styles, via the resolver's own
primitiveSearchPatterns), so editing a definition restarts the dev server and re-collects the
manifest — even for definitions not yet imported by a CSS block.@czap/cli—czap audit --consumer --profile <p>now combines (was mutually exclusive): the
profile becomes the consumer discovery base, so a downstream can run the audit engine against THEIR
OWN installednode_modulestopology, not just LiteShip's@czap/*. The engine seam
(consumerDevopsProfile(cwd, base)) was already there; this wires it to the CLI.- Plumb-completeness gate (
plumb:gate, gauntlet phase 37). A package-plumb ledger
classifies every published packageruntime/tooling/deferred(an unclassified package
fails CI, so a test-only subsystem can't ship hidden) + an unwired-capsule floor. Closes
the hole where built-not-plumbed primitives passed green (the audit's orphan findings were
info-only; no phase asserted producer→consumer plumbing). - Determinism hardening: an ast-grep guard banning re-implemented threshold reverse-scans
outside the canonical f32 kernels, + aBlendTree.computeBlendaccumulation-order-independence
property test (run against the fresh wasm in CI). - New package
@czap/error— a composable tagged-error algebra (a closed variant coproduct
over an openTaggedErrorcontract, value AND type, Effect- and throw-compatible) the whole
stack now adopts as its foundational zero-dep leaf. - New package
@czap/gauntlet— the self-proving rigor engine (ADR-0023): gates, findings,
assurance levels (L0–L4), and the authority ratchet (a gate earns blocking power only by
self-proving against its own red/green/mutation fixtures). Lean (notypescript; the
triangulated repo-IR + the mutation / MC-DC / taint / coverage-guided-fuzz / claim-vs-reality /
traceability / agent-safety gate families are host-injected via@czap/audit, ADR-0012). This
is the rigor work the small live-runtime cut grew into when it exposed the gaps. - FactGate — evidence-bound gates (ADR-0019). Gates can be defined as DATA (
defineFactGate—
requires+decide) instead of arbitrary closures, closing the stale-green hole where arun
body could read undeclared evidence. Cache identity derives from the declared facts; the
discriminant is an unforgeableWeakSet. The always-blocking no-skipped-test gate has a
proven-equivalent FactGate form. - API-docs source-of-truth. Every publishable package is in the TypeDoc roster (guarded), and
a broken{@link}now fails the build (treatWarningsAsErrors) — zero dead links, enforced. - Astro 7 (hard-cut). The workspace targets Astro 7 +
@astrojs/cloudflarev14 (Vite 8 /
Rolldown).@czap/astroneeds no code changes — the integration hooks, middleware, and
client:*contracts are unchanged — and the batteries Astro 7 ships are now consumed:@czap/astro—czapFetchLayer()(ADR-0024): request-time adaptation as a layer in
FRONT of Astro viasrc/fetch.ts. Shares the onecreateEdgeHostAdapter().resolve()with
czapMiddleware; on an opt-inserveFromEdgepath it serves boundary CSS from the edge and skips Astro
entirely.serializeBoundaryCssexposed. Astro'sFetchable/ Hono-compatible.@czap/astro— Diagnostics → Astro logger bridge.bridgeDiagnosticsToAstroLogger/
installDiagnosticsBridgeroute@czap/*runtime diagnostics through Astro's logger
(structuredastro dev --jsonoutput); wired inastro:config:setup.@czap/edge/@czap/cloudflare— active cache invalidation.BoundaryCache.invalidateByPath
(purge by content address) +invalidateByTag(Astro.cache tag parity, index-backed) close
ADR-0017's passive-TTL gap;KVNamespacegains optionaldelete/list, forwarded by the
Cloudflare adapter, degrading to a diagnostic when a provider omits them.@czap/cli—czap doctor --target astro: an Astro 7/_astro/statusdev-server
liveness probe for agent-run background dev sessions.
Changed
@czap/core— factored the DocumentGraph node well-formedness reader (isWellFormedNode,
DocumentGraphNodeSchema) out ofai-cast.tsintodocument-graph-schema.tsso the
runtime loader and the AI seam share one trust gate.
v0.3.1 — czap ship fails closed on unknown flags
[0.3.1] - 2026-06-19
Fixed
@czap/cli—czap shipnow fails closed on unrecognized flags. The arg
parser silently ignored any unknown-/--flag (including--help), so
czap ship --help— or any typo'd flag — fell through to "no--filter→
publish EVERY workspace package."--help/-hnow print usage and exit
without shipping, and any unrecognized flag is refused (exit 1) before a single
package is packed or published. Long-latent (present since ≥0.2.3), auth-gated;
hardened here so a flag typo can never trigger a publish.