Skip to content

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.