Skip to content

Releases: freebatteryfactory/LiteShip

v0.10.0

Choose a tag to compare

@github-actions github-actions released this 14 Jul 01:39

[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:motion scrubs a scroll/time signal through the JS
    floor when native animation-timeline is unavailable; the floor and CSS linear() provably sample one
    Easing.spring kernel. Adds the color interpolation 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)selectCandidates so Save-Data is honoured across
    src/srcset/<source>/preload/image-set()/cache-key; wired into Astro and Cloudflare hosts.
  • Answer-first npm description/keywords for all 25 packages from one canonical catalog, with a
    release-gated prepublish metadata check (#146).

Changed / Fixed

  • CSS: bare declarations inside @supports/@media conditional groups are now wrapped in the boundary
    selector (were silently dropped by the browser).
  • Astro: Vary tokens are merged, not clobbered (protects Cookie/Accept-Encoding cache axes).
  • MCP: the docs route returns JSON-RPC failures as a top-level error member (was laundered into a 200 result).
  • 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-scope Date scan is AST-based.
  • #145 MCP dispatch-matrix timeouts refactored to a documented lookup table; #142 sharded-docs breadcrumb
    depth fixed (sharded builder stays experimental).

Removed (breaking — pre-1.0 aggressive break policy)

  • discreteSignalPayloadsFromPatch (@czap/core) — replaced by the typed DiscreteStateTransition replay path.
  • keyframesForRouting (@czap/core) — replaced by the TransitionProgram lowering.

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 19:44

[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 through mutationClient.adopt after CAS verification; refuses on resultGraph mismatch 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-safe gauntlet profile — build → capsule:compile → typecheck → lint → structural → invariants → gates → audit:floor → test → standards/capability gates (omits memory-hungry docs:check; run separately when API inputs change).
  • memberSinks taint channeldocument.write / document.writeln classified receiver-qualified (no stream.write false 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 DPRminPositiveWidth for unsorted variant lists (#125).
  • Workers module-scope Date scan — project-level wrangler main resolution (#115).
  • Taint document.write registry (#121); scroll-progress warnOnce buffer-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

Choose a tag to compare

@github-actions github-actions released this 08 Jul 10:17
a2b85ef

[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-final profile that runs report:runtime-seams against stitched artifacts.
  • check:gates in gauntlet — Tier 0.2 czap check gates (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 — one gauntletRunId minted in parallel setup and propagated through fan-out jobs for runtime-seams coherence.

Fixed

  • Bench harnessecs-composition migrated to tinybench; wasm bench lane installs the stable Rust toolchain before build: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-absent probe 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

Choose a tag to compare

@github-actions github-actions released this 04 Jul 13:09

[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/corecreateGraphMutationClient. A DOM-free mutation-channel client that owns the current base, serializes submits, advances on applied, never throws, and handles structured staleBase: true refusals with a bounded host-owned refreshBase retry. GraphMutationResponse now distinguishes stale-base/lost-update refusals without string-matching messages, and verifyAppliedGraph is the shared applied-graph guard used by senders and live adopters.
  • @czap/webbindGraphForm. A form-submit binding for the mutation channel: capture FormData, let the host project it to PatchOp[], drive the mutation client, set data-czap-mutation-state, and dispatch czap:mutation. LiteShip owns the rig; the host owns markup, domain projection, and error rendering.
  • @czap/astroadoptAppliedGraph and stale-base 409s. graphMutationRoute now maps stale-base/lost-update refusals to HTTP 409 while other refusals remain 422. adoptAppliedGraph re-proves a server-applied graph through verifyAppliedGraph before advancing a live graph runtime and re-casting the delta.
  • @czap/web — morph-opaque subtrees. MorphOpaque exports the presence marker data-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. DocumentGraphNodeSchema now carries the Standard Schema V1 ~standard property via Effect's converter; isWellFormedNode keeps the same behavior.

Fixed

  • @czap/web — morph callbacks now match their public type. beforeRemove is threaded through nested removals and can veto non-opaque element removal; afterAdd fires for inserted elements and text nodes, including nested insertions.
  • examples/cloudflare-astro — Cloudflare astro dev module URLs no longer 404. The example's run_worker_first config was routing Vite dev-infrastructure URLs (/@vite/*, /@id/*, /@fs/*, /src/*, /node_modules/*) into the worker, where not_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-dev boots the Cloudflare Astro example under astro 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-roundtrip now uses createGraphMutationClient + bindGraphForm, keeps a raw-channel stale refusal demo, and demonstrates stale recovery through the client primitive.

Breaking

  • None.

v0.7.0

Choose a tag to compare

@github-actions github-actions released this 03 Jul 22:12

[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
    GraphPatchvalidateGraphPatchProposal → compare-and-swap applyValidatedPatch
    persist, returning applied (new graph), refused (invalid patch — validation or a
    concurrent-write CAS miss), or error (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 to error — 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 the GraphStore (the authority boundary, ADR-0015); LiteShip owns
    the gate. Full rationale: ADR-0030.
  • @czap/astrographMutationRoute(store). The host route adapter: a plain
    (request) => Response (the czapFetchLayer shape) 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/json body.
    @czap/astro injects 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. graphMutationRoute requires Content-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 a text/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: false on 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. decodeDocumentGraph now validates an edge's
    type against the EdgeType enum (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 grants is now a validated,
    canonical CapSet schema (was opaque): a malformed or non-canonical grants is rejected by
    isWellFormedNode on 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.levels is a canonical array, was a Set. A Set JSON.stringifys to {} (so a
    policy patch over the channel silently lost its grants) and its insertion order mis-addressed the
    same logical set. levels is now a deduped, ladder-sorted array: JSON-faithful and
    content-address-deterministic. Cap's combinators (has/union/intersection/…) are unchanged;
    only direct .levels access moves from Set (.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

Choose a tag to compare

@github-actions github-actions released this 03 Jul 13:20

[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
    and EdgeHostResolution.htmlAttributesMap expose the root data-czap-*
    attributes as a Record keyed by the full attribute name, built from the
    CAP_AXES registry 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 accept vec2/vec3/vec4 (emitted vec2f/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_resolution is a
    real vec2<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:graph now activate on
    plain elements, not only framework islands, via a scanner whose selectors derive
    from DIRECTIVE_ATTRIBUTE_REGISTRY (a new directive is scannable by construction).
    A bare data-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 @quantize CSS transform
    resolves boundary names from the same module-graph discovery as the manifest
    (previously only dirs.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 --consumer skips the internal
    structure pass entirely (previously ~437 info findings against a consumer's own
    app); czap audit --findings streams parseable NDJSON to stdout for tooling.
  • @czap/quantizer — shader outputs in the change stream. outputChanges
    surfaces glsl and wgsl output tables alongside css — previously only css
    reached the stream and shader outputs sidestepped it.
  • @czap/edge / @czap/astroSec-CH-Viewport-Width is now a Critical-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
    resolveInitialState picks the right initial state instead of a User-Agent estimate.
    @czap/astro's CLIENT_HINTS_HEADERS now derives from @czap/edge's single
    Accept-CH/Critical-CH source 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's WGSLCompileResult) now
    carry WGSLUniformValue (number | readonly number[]) end to end — manifest,
    edge KV cache, satellite payload, boundary event detail, WebGPU writer — to
    represent vectors. Pre-1.0 minor; a consumer that narrowed the type to number
    must widen it.

Internal

  • driveUniformFromSignal continuous-signal tracking on the SharedArrayBuffer
    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 → patch diagram, placed byte-identically in README,
    GLOSSARY.md, and AUTHORING-MODEL.md and pinned by a drift guard so the three copies
    can't diverge. DOCS.md gains a four-layer routing preamble (Use / Author / Extend /
    Engine-room). The demoted package table now lives in ARCHITECTURE.md, generated from
    the workspace and drift-gated.
  • Examples ladder. examples/README.md orders 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
    GraphPatch is refused; only a validated proposal mutates the graph) and
    examples/03-cast-aria (one @quantize block 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

Choose a tag to compare

@github-actions github-actions released this 01 Jul 09:27

[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.spliceCheckpoint reclaim a long-lived receipt DAG's dominated prefix into
    a content-addressed checkpoint attestation (drop-only; the spliced DAG equals a
    fresh reload). Receipt.validateChain gains ChainValidationOptions { 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, default coalesce-by-id) + an
    enriched BackpressureHint (policy / droppedCount / coalescedCount) + a
    stateChanges edge stream. See ADR-0005 (SSE addendum).
  • create-liteship now scaffolds effect (^4.0.0-beta.32), fixing an
    unmet peer on a fresh project.

Fixed

  • client:gpu warns 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; the uniform-signal "likely a typo" mislabel is split into two
    disjoint codes.
  • @czap/genui rejects an unsupported registered handler prop (on*
    onClick, or a non-string onClick) at validation instead of silently dropping
    it at render.
  • @czap/web SSE no longer silently drop-newests under saturation (see
    Added), and the heartbeat watchdog now reconnects on timeout.
  • client:stream / client:llm now run on the hardened SSE.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:llm terminal frames close the live
    connection.

Changed

  • effect peer range capped to >=4.0.0-beta.32 <5 across all @czap/*
    packages (was an unbounded >=4.0.0-beta.0), pinned by pnpm.overrides.effect
    and a drift guard.

Security

  • Receipt.validateChainDetailed now requires a verified checkpoint to
    validate a compacted tail; a base watermark 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.use finalizing immediately; an overflow-buffer CPU spin). api-surface
    snapshot regenerated for the new exports.

Breaking

  • @czap/genui renderFromCatalog now returns a tagged
    RenderFromCatalogResult ({ ok } union) instead of boolean. Callers using
    if (renderFromCatalog(...)) must switch to .ok.

v0.4.1

Choose a tag to compare

@heyoub heyoub released this 29 Jun 22:13

[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/astrodirective-collision diagnostic. The client-directive scanner now warns
    once when an element is claimed by more than one czap directive — e.g. client:gpu and
    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/auditconsumer-audit scoping regression. czap audit --consumer no longer emits
    false unknown-internal-package errors (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.packageRoots set)
    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 --consumer as the correct consumer entry point. (A silent no-op prefix is
    deliberately NOT introduced: a clean audit must never mean "nothing was checked".)
  • @czap/astroWGSL u_time is now advanced every frame. Hand-authored animated WGSL
    shaders that declare u_time were 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 (a vec2) is fed per-frame too — the WGSL uniform buffer now lays fields
    out by WGSL alignment rules (so a vec2 lands on its required 8-byte offset) rather than a flat
    scalar layout. (u_state is already fed as the compiler's state_index.)

Changed

  • Node floor + dev toolchain. Raised engines.node to >=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 breaches INV-COMPOSITOR-ZERO-ALLOC via
    Effect's Queue in the compositor's live-subscriber publish path) — both tracked for a later release.

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 29 Jun 00:35

[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/astroruntime DocumentGraph loader. loadGraphRuntime(serialized, resolve)
    lowers a sealed DocumentGraph onto the live boundary cast pipeline (CSS/ARIA/GPU),
    with a surgical castGraphDelta re-cast seam (only changed cells re-lower; untouched
    observers survive). New client:graph directive. The loader is the seam an authoring
    producer feeds; the producer itself is downstream.
  • @czap/astroscene→live-runtime bridge. bridgeSceneToGraph(scene, handle, …)
    drives a signal-indexed @czap/scene against the live runtime: a DISCRETE state crossing
    emits a GraphPatchrecast, while the CONTINUOUS tween writes a leaf CSS var / GPU
    uniform each frame and never patches the graph. @czap/scene is now a live runtime
    consumer (was video/offline-only).
  • @czap/astroAI-apply seam. castGraphContext (cast the live graph OUT to a
    model-facing AIContext) + admitGraphPatchProposal (admit a candidate IN through the
    un-bypassable validateGraphPatchProposalapplyValidatedPatch token-witness chain,
    then re-cast the delta). LiteShip exposes the seam; the model producer is downstream.
  • @czap/astroSVG last-mile directive (client:svg): resolves data-czap-entity → SVGElement and applies @czap/scene's applySvgAttrs to the live DOM each frame.
  • @czap/stageheadless 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/quantizerAnimatedQuantizer frame-clock injection. AnimatedQuantizer.make(…, { scheduler })
    takes an optional @czap/core Scheduler.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/astrocontinuous signal→uniform bridge. driveUniformFromSignal(element, input, uniform)
    (from @czap/astro/runtime) drives the existing czap:uniform-update event 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@quantize container-target opt-out. New quantize.container plugin option
    retargets the auto-emitted viewport @container containment off :root to 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/astroconvention-file watch battery. The integration now calls Astro's addWatchFile
    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/cliczap 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 installed node_modules topology, 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 package runtime/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, + a BlendTree.computeBlend accumulation-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 open TaggedError contract, 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 (no typescript; 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 a run
    body could read undeclared evidence. Cache identity derives from the declared facts; the
    discriminant is an unforgeable WeakSet. 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/cloudflare v14 (Vite 8 /
    Rolldown). @czap/astro needs no code changes — the integration hooks, middleware, and
    client:* contracts are unchanged — and the batteries Astro 7 ships are now consumed:
    • @czap/astroczapFetchLayer() (ADR-0024): request-time adaptation as a layer in
      FRONT of Astro via src/fetch.ts. Shares the one createEdgeHostAdapter().resolve() with
      czapMiddleware; on an opt-in serveFromEdge path it serves boundary CSS from the edge and skips Astro
      entirely. serializeBoundaryCss exposed. Astro's Fetchable / Hono-compatible.
    • @czap/astroDiagnostics → Astro logger bridge. bridgeDiagnosticsToAstroLogger /
      installDiagnosticsBridge route @czap/* runtime diagnostics through Astro's logger
      (structured astro dev --json output); wired in astro:config:setup.
    • @czap/edge / @czap/cloudflareactive cache invalidation. BoundaryCache.invalidateByPath
      (purge by content address) + invalidateByTag (Astro.cache tag parity, index-backed) close
      ADR-0017's passive-TTL gap; KVNamespace gains optional delete/list, forwarded by the
      Cloudflare adapter, degrading to a diagnostic when a provider omits them.
    • @czap/cliczap doctor --target astro: an Astro 7 /_astro/status dev-server
      liveness probe for agent-run background dev sessions.

Changed

  • @czap/core — factored the DocumentGraph node well-formedness reader (isWellFormedNode,
    DocumentGraphNodeSchema) out of ai-cast.ts into document-graph-schema.ts so the
    runtime loader and the AI seam share one trust gate.

v0.3.1 — czap ship fails closed on unknown flags

Choose a tag to compare

@heyoub heyoub released this 19 Jun 11:45
d9ef0ec

[0.3.1] - 2026-06-19

Fixed

  • @czap/cliczap ship now 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/-h now 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.