0.4.11
Release notes for 0.4.11.
Released: 2026-08-19
Features
feat(autoload): give
${storagePrefix}:autoloada provenance value —enableAutoload()keeps writing'1'(explicit owner) while auto-remember writes'auto', never downgrading an existing'1'. zdtp's own gate honours both, so owner behaviour is unchanged; the split lets a host's own lazy-load probe test=== '1'and stop eagerly fetching the bundle for visitors who merely opened the panel once. Pre-existing'1'values cannot be reclassified, so the discrimination applies going forward only (#591) (ca3bb3e)feat(config): add
PanelConfig.autoRememberOnOpen(defaulttrue) — setfalseso opening the panel never persists owner-mode, letting a public site keep a panel button visible to every visitor.enableAutoload()stays available as the explicit owner opt-in (#591) (2b442fa)feat: add a mounted-shell slot registry with spawn ordinals — tracks currently-mounted shells per
storagePrefix(mount order, lowest-free-slot reuse) so concurrent instances can be told apart for spawn placement (#595) (07eefc3)
Fixed
fix: derive the default panel position from the clamped default size —
defaultPosition()anddefaultSize()independently computed different panel widths, so at a 320px viewport the panel spawned atleft 32withwidth 320and hung 32px off-screen. Geometry is now derived once, size first, so the two cannot drift apart (#595) (bb080b8)fix: cascade concurrent instances apart with a spawn containment clamp — two live panels no longer spawn at identical geometry with the second exactly covering the first. Each additional mounted shell offsets 24px through a new spawn clamp; the permissive drag-recovery clamp is unchanged, a persisted position always wins, and containment beats distinctness per axis when the viewport has no room (#595) (fea74c2)
fix: center the first-open position against the size actually rendered — an instance with a persisted (resized) size but no persisted position was centered as if it were the default width, spawning up to 88px off-screen (#595) (c2b6bc3)
fix(astro): content-check the persisted-override probe and match the
-statefamily exactly — an empty{}envelope no longer triggers an eager bundle fetch that applies nothing, the v1 key (${storagePrefix}-state) is now covered instead of being skipped, malformed JSON still fails open so the panel can migrate or reject it, the${storagePrefix}-openmirror joined the gate's signals, and an exact family regex keeps a sibling instance's keys from satisfying another instance's probe (#591) (7506a96)fix(zdtp): publish
PORTABLE-CONTRACT.mdand fix the duplicate README§5.3heading — the contract file existed in the repo but was absent fromfiles[], so every README cross-reference to it was a dead link for npm consumers (#589) (6602596)fix(doc): make
check:linksactually crawl the built site — it reportedSuccessfully scanned 0 linksand exited 0, a silent no-op gate. linkinator serves local paths through its ownhttp:crawl server, so the/ / localhost: <port> -meant for external URLs was swallowing the entry point. Now scans the whole site; enabling it surfaced and fixed three site-wide favicon 404s (#589) (2bdfab4)- skip '^https? : / / '
Other Changes
docs: document the revised lazy-load gate contract in the package docs — README §5/§9/§10/§10.1 and
PORTABLE-CONTRACT.md§1/§2/§6.2/§6.5 (#591) (bbdf5bb, 6f036b7)docs(site): document
:autoloadprovenance andautoRememberOnOpenin the owner-autoload recipe (EN + JA) (#591) (7baa165)docs: document the first-open spawn-geometry contract — README §5.6 and
PORTABLE-CONTRACT.md§2.1 (#595) (6f10ffc)docs: correct the persisted position shape to
{ top, left }— README §9 andPORTABLE-CONTRACT.md§2 documented it as{ top, right }, which matters now that the contract file ships to npm (#595) (9f6494f)docs(host-adapter): correct the sibling-prefix collision example (#591) (bc137cd)
test: complete the lazy-load gate decision-matrix coverage (#591) (76cb4a3)
test: confirm multi-instance spawn geometry in a real browser (#595) (11988d6)