Skip to content

Spec changelog

This page is generated from the ## Changelog section of each file in /specs . Every substantive spec edit is a release: the version advances, the **Updated:** date is restamped, and an entry lands here. Record one with bun run spec:change <spec.md> <major|minor|patch> -m "<what changed>" , which the release branch mints in merge order; an entry marked unreleased below is one such release still waiting for the next release.

Versions are MAJOR.MINOR.PATCH — major for a breaking change to a documented contract, minor for additive behavior, patch for editorial changes. A -draft suffix marks a spec whose status is not yet Implemented .

ai.md

  • 0.1.33-draft (2026-10-06) — §3.4 the send path repairs tool-call pairs per request: a separated reply moves back to its request, a reused call id pairs with the right round, and a seal says when a call was cut off; §3.8 the turn engine runs the same repair at turn start and reports transcript_repaired.

  • 0.1.32-draft (2026-10-06) — §3.8 the turn engine: runTurn and its synchronous event stream, the six outcomes, the anchor, a system prompt fixed per turn with tools listed each round, the turn lock, the calls a Stop leaves unanswered, and invokeTool; §1 names ./harness Worker-safe.

  • 0.1.31-draft (2026-10-06) — §2.3 the neutral conversation model: messages as typed blocks, meta never sent, a lossless v1 conversion, the OpenAI-compatible projection stated once, and ToolSpec; §2.2 names the projection; §1 names ./messages Worker-safe.

  • 0.1.30-draft (2026-10-04) — §2.5 the system prompt opens with SYSTEM_PROMPT_STATIC_PREFIX (role, reference sections, error recovery) in every state, then the current mode, document, project and files, with the closing instructions last.

  • 0.1.29-draft (2026-10-04) — §2.1 action_required is a fourth managed probe state, answered 200 with detail and actions, whose primary action is offered rather than a connect flow; a bound project rides in the chat URL's project query.

  • 0.1.28-draft (2026-10-01) — §2.5 prompt caching: the proxy client sends the conversation id as X-Jx-Ai-Session, a backend forwards only affinityKey(scope, id) as the upstream's sessionAffinity, and each provider gets only its own hint (prompt_cache_key to OpenAI, x-session-affinity to Workers AI and AI Gateway, nothing to any other host). §2.4: the gateway's runtime imports outside itself now include ../cache-hints.ts.

  • 0.1.27-draft (2026-09-29) — Record how long the write ledger lasts (New Chat and leaving a project drop it) and require the file tools, create_page and create_component included, to refuse a path outside the project before writing.

  • 0.1.26-draft (2026-09-29) — Census against the code: §2 marked Partial because Studio shows nothing for a failed model listing that carries no message, §3 marked Partial because its overview places the tool schemas and edit path in the ai package, §4 marked Partial because the link-local host guard misses most of fe80::/10 and the IPv4-mapped metadata address, and §2.2 now leads with Partial for the native Anthropic provider it already admits.

  • 0.1.25-draft (2026-09-29) — §3.7 carries its status marker in the canonical form, so the section reads as Implemented to every page derived from the specs.

  • 0.1.24-draft (2026-09-29) — §3.7 a tool call carries its context: its own signal, unlinked once the call settles; its id; the turn's write ledger; the conversation's session facts; and progress. Wrapping registries forward it, and a definition declares interactive.

  • 0.1.23-draft (2026-09-29) — §3.2 partial success means a change was applied (the call succeeded and the write ledger grew by an ok write during it, not merely a summary; creating or importing a project is recorded as a disk write), and a turn that drew nothing ends on an error row saying so.

  • 0.1.22-draft (2026-09-29) — §3.0 ai.streaming is true for the whole turn, tools included, and one window runs one turn (a send during one starts nothing; a waiting question's answer outranks Stop, and a hand-off waits for a stopped turn to end rather than being refused); §3.4 the idle status belongs to the token stream, not the turn.

  • 0.1.21-draft (2026-09-29) — §2 Stop is armed before the send path's first await (the chat URL is resolved inside the first request); §3.5 a Stop later in a turn leaves a finished import's outcome as it was.

  • 0.1.20-draft (2026-09-29) — §3.2 a chip shows the result the loop recorded as its call finishes, a stream error removes only its round's partial message, and a turn's changes are filed under the last message it drew, or under nothing once another chat has replaced its transcript; §2 a Stop during a round's last call opens no further round; §3.1 arguments that are not a JSON object are a parse failure naming their type.

  • 0.1.19-draft (2026-09-29) — §2.4 one gateway implementation: @jxsuite/ai/gateway serves the chat and models routes for every backend (the server's normalizer moved verbatim, a fixed order of admission checks, problem refusals, SSE framing), and key provenance and the base-URL guard stay the host's policy; §1 names ./gateway Worker-safe.

  • 0.1.18-draft (2026-09-29) — §3.4 the chat is saved as a question is put; a restored question that was answered shows its answer and every restored chip its outcome, backfilled from the tool message; only an open question renders inert.

  • 0.1.17-draft (2026-09-29) — §1 depends on @jxsuite/protocol and through it on @jxsuite/schema; the streaming-client and tools leaves are Worker-safe and gated.

  • 0.1.16-draft (2026-09-29) — §2 the usage frame carries the provider's own token count before done, and a round runs the tool calls its stream carried whatever the finish reason, except a cancelled round, which runs none.

  • 0.1.15-draft (2026-09-18) — Document that model-listing is best-effort per BYOK endpoint and upstream failures must be surfaced distinctly from auth failures.

  • 0.1.14-draft (2026-09-14) — §3.6 open_document is the projection of document.open, the bridge holds an undo: project record to a project.json witness as it holds a document record to the document root, and a tool with an empty required enum is withheld from the round.

  • 0.1.13-draft (2026-09-13) — §3.6 Command tools: the two kinds of tool, strict: false and why, the empty- wrote no-op and the throwing-report answer, and the composite registry.

  • 0.1.12-draft (2026-08-31) — Provider contract §2.2: never send an empty assistant turn, and replay a thinking model's reasoning_content.

  • 0.1.11-draft (2026-08-30) — 2.1: a lapsed grant is not a completed connect; cf_account_required; probe invalidation; per-model toolSupport and contextWindow.

  • 0.1.10-draft (2026-08-26) — import_site adopts the project when it exists, not when the run ends; the run's log outlives it (§3.5).

  • 0.1.9-draft (2026-08-26) — ask_user suspends a turn on the author (§3.4); import_site bootstraps a project from a live site (§3.5).

  • 0.1.8-draft (2026-08-23) — 2.1 Managed providers: a platform may broker credentials, Studio offers that path before the key form, and the models endpoint is specified as a capability probe that must answer 200 for every credential state — with cf_not_connected, cf_reconnect_required and cf_upstream_error distinguished.

  • 0.1.7-draft (2026-08-20) — The Anthropic client yields an error event with code NOT_IMPLEMENTED; it does not throw (§2).

  • 0.1.6-draft (2026-08-16) — §2 failures are problem documents and the mid-stream frame carries one; gap closed.

  • 0.1.5-draft (2026-08-15) — Add §5 Standards Alignment: SSE, the IANA special-purpose address registries the SSRF guard uses, and the problem+json gap.

  • 0.1.4-draft (2026-08-12) — The assistant's six capabilities are command records, gated on ai.configured and ai.streaming.

  • 0.1.3-draft (2026-08-04) — §3.2 the turn is accountable (per-write disk marking, Restore to here, chip outcomes, partial success) and §3.3 the batch follows the document, not the tab.

  • 0.1.2-draft (2026-07-25) — Schema gate (§3.1): tool-level validation against the active project's entry documents, before-write for disk writes and after-apply on canvas, project.json included.

  • 0.1.1-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.0-draft (2026-07-22) — Reconcile spec with shipped behavior; document the eval surface ( c8d1d580 ).

collab.md

  • 0.2.9-draft (2026-10-21) — The desktop launchers section names the one desktop adapter, chromium/platform.ts, in place of the retired ElectroBun adapter.

  • 0.2.8-draft (2026-10-04) — §2 the collab socket reconnects on equal-jitter backoff, and a pending retry runs immediately on the online, back/forward-cache pageshow and visibilitychange wake signals.

  • 0.2.7-draft (2026-10-04) — §4 a negative capability probe may carry a detail, which the client reports as its refusal instead of calling the room disabled.

  • 0.2.6-draft (2026-09-29) — Census against the code: §1, §2, §3, §3.1 and §4 marked Partial, the §5 marker corrected to say that merge-granularity skew is unguarded, and the whole-spec marker updated to name the shipped modules the stub does not yet specify.

  • 0.2.5-draft (2026-08-20) — Presence that has ended must stop being published: a client leaving the code view clears its in-buffer text cursor, so peers stop drawing a caret for someone who is no longer there.

  • 0.2.4-draft (2026-08-16) — §2.1 subprotocol negotiation: jx.collab.v1 offered from the capability probe and echoed on the handshake; §5 wire-envelope skew closed; RFC 7692 non-adoption stated in §2.

  • 0.2.3-draft (2026-08-15) — Add §6 Standards Alignment; §5 separates wire-envelope skew from document-format skew and is marked Pending.

  • 0.2.2-draft (2026-08-05) — §4 project.json is excluded from replication, and why.

  • 0.2.1-draft (2026-08-04) — §4 the four session states, with failed distinguished from detached; freeze and read-only made visible; undo scoping stated in the UI.

  • 0.2.0-draft (2026-07-28) — Store prose as Y.Text and style/attributes/$props as nested Y.Maps so concurrent edits merge per character and per property; the op bridge diffs whole-value ops onto that structure.

  • 0.1.1-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.0-draft (2026-07-22) — Reconcile spec with shipped behavior; document the eval surface ( c8d1d580 ).

compiler.md

  • 0.4.6-draft (2026-10-17) — §8.1 a prerendered component instance places its children by slot name, and a live one carries data-jx-slots with named comment brackets so its element recovers them on upgrade.

  • 0.4.5-draft (2026-09-29) — Census against the code: §2, §2.2, §4.1, §4.3, §4.4, §5.2, §5.3, §5.4, §5.6, §6.1, §6.2, §6.3, §7.1, §7.2, §7.2.1, §7.3, §7.5, §7.7 and §11 marked Partial, §3's marker restated now that the opt-in CSP ships and widened to self-contained compiler-timed classes, the stale §6.3 and §7.7 markers corrected, and the §10 Pending Features ledger retired onto its feature sections except the three rows no other section yet tracks as open. §8.2 now leads with Partial, since the style handle keys rules on the author's first class rather than a generated one.

  • 0.4.4-draft (2026-09-13) — §8.1: a component instance nested inside another component's definition is expanded — props, host style, stamping — recursively, with a cycle diagnostic and a depth cap; a template host style resolves for every instance, props or not.

  • 0.4.3-draft (2026-09-01) — CSS extraction delegates its nesting to buildStyleRules, the one definition the runtime and the site builder also use; 4.5's example shows the emitted rule form.

  • 0.4.2-draft (2026-08-31) — CSS extraction emits the popover states and the declaration-body at-rules; attrHelperSource inlines the boolean-attribute rule for the generated-module targets.

  • 0.4.1-draft (2026-08-27) — §12: the client-runtime asset set is derived from the emitted HTML, so every import map a build ships names files it wrote.

  • 0.4.0-draft (2026-08-26) — Browser bundles are minified (§12); component CSS is inlined rather than linked (§8.2); image sizes derives from the container and variants stop at the configured ceiling (§7.2, §7.2.1).

  • 0.3.3-draft (2026-08-26) — §8: the boolean-attribute rule is shared with the runtime rather than restated, and covers the enumerated family.

  • 0.3.2-draft (2026-08-26) — Static output omits a false boolean attribute and emits a true one bare.

  • 0.3.1-draft (2026-08-18) — §4.3: separate the emitted-JavaScript accessor form from the pointer grammar it lowers.

  • 0.3.0-draft (2026-08-17) — §4.3: ref lowering goes through the shared tokenizer — identifier segments dot, all others bracket, so every emitted ref parses.

  • 0.2.1-draft (2026-08-15) — §3 Implemented — the tiers' inline blocks are hash-nameable and the site build emits the policy.

  • 0.2.0-draft (2026-08-15) — Client runtime is served from /assets/ instead of esm.sh; browser bundles resolve production export conditions under both backends (§3, §12).

  • 0.1.28-draft (2026-08-15) — §3: node_modules URLs resolved — bare $head/$elements specifiers land in /assets/.

  • 0.1.27-draft (2026-08-15) — Add §13 Standards Alignment; §3 marked Partial — inline scripts block a strict CSP and node_modules URLs 404 in production.

  • 0.1.26-draft (2026-08-14) — $switch compiles on dynamic pages (§9.2); branch subtrees hoisted out of $switch and chosen-tagName constructs (§4.8); prerender treats handler-written entries and computeds reading them as runtime-only, and keeps an array any surviving reader still references (§8.1).

  • 0.1.25-draft (2026-07-30) — Element modules: props.* attribute intake and $props template bindings, one effect registry stopped on disconnect, state.$map published for map handlers; prerender keeps a repeater whose build-time expansion is empty (§4.1, §4.2, §4.4, §4.7, §8.1).

  • 0.1.24-draft (2026-07-30) — Element modules: $export aliasing, Request auto-fetch on connect with effect teardown, $map bound in map callbacks, tagName-based output naming; prerender leaves runtime-only reads unresolved (§4.1, §4.7, §8.1).

  • 0.1.23-draft (2026-07-24) — §1 Overview: condition the generated Hono worker on build.adapter (per-page _server.js without one) and scope the static-build failure to active data/auth mounts; §6.3 document compileSiteServer's mounts/connectors parameters and extension mount emission.

  • 0.1.22-draft (2026-07-23) — Image src resolution consults extension asset mounts before public/ (§7.3).

  • 0.1.21-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.20-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.19-draft (2026-07-17) — Forced color-scheme contract — dual emission, color-scheme triplet, pre-paint script ( e629684d ).

  • 0.1.18-draft (2026-07-17) — Bundle the site worker self-contained per adapter ( 4096ba12 ).

  • 0.1.17-draft (2026-07-17) — Sidecar bundling, extension emit capability, heading anchors ( 07e28bc3 ).

  • 0.1.16-draft (2026-07-17) — Image pruning for persistent site build cache + github ci cache ( b45096ed ).

  • 0.1.15-draft (2026-06-10) — Update site architecture to reflect new changes ( c0bdba08 ).

  • 0.1.14-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.13-draft (2026-06-03) — Use .cache isntead of .jx-cache to support cloudflare build cache ( 1103d2d6 ).

  • 0.1.12-draft (2026-06-01) — Stronger typing ( fcbb5b5d ).

  • 0.1.11-draft (2026-06-01) — Convert to typescript ( e352e265 ).

  • 0.1.10-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.1.9-draft (2026-05-18) — Always emit worker.js for cloudflare ( 3dd37c2d ).

  • 0.1.8-draft (2026-05-15) — Image optimization specs ( 7d2ee67f ).

  • 0.1.7-draft (2026-05-15) — Provider-sepcific Site-Wide Bundling ( 51cb5cf6 ).

  • 0.1.6-draft (2026-04-23) — Rebrand to jxsuite ( 2897a4e8 ).

  • 0.1.5-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.4-draft (2026-04-20) — Text nodes support ( 4d45eeb7 ).

  • 0.1.3-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.2-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.1-draft (2026-04-10) — Finalize vision for site architecture ( da594993 ).

  • 0.1.0-draft (2026-04-10) — Consolidate specs ( 80ca313f ).

desktop.md

  • 0.6.5-draft (2026-10-23) — §7.7: the sandboxed build asks for the project folder, keeps a bookmark per folder, restores them before the backend starts, and restarts the backend for a pick no bookmark covers.

  • 0.6.4-draft (2026-10-23) — Adds §7.7, the Mac App Store channel: the mas target, the sandbox entitlements, no updater inside it, and the open question of the backend's access to a picked folder.

  • 0.6.3-draft (2026-10-23) — §7.7: every channel shares the appId com.jxsuite.studio, the identifier registered in the developer portal.

  • 0.6.2-draft (2026-10-23) — §7.7: the Mac App Store lane has uploaded a signed package to App Store Connect once; processing and the sandboxed launch are unmeasured.

  • 0.6.1-draft (2026-10-21) — §7.3: a declared collection source outside the project root is reachable for the file operations, as on the dev server.

  • 0.6.0-draft (2026-10-21) — ElectroBun is removed and the Electron application is the one desktop framework: section 7 becomes the packaging chapter (electron-builder, the staged backend and its smoke test, self-updates through electron-updater, signing and the release lanes), the shared services server and the updater, window and canvas-URL RPC requests are gone, the Windows installer is NSIS with a Store appx in place of the MSI, Linux ships an AppImage, and section 9.3 graduates.

  • 0.5.17-draft (2026-10-21) — Adds the Electron application: Electron as the root process owning every window, a Bun backend owning every project over a validated JSON IPC protocol, one session and server and token per window, single-instance launches, native dialogs and the macOS File menu.

  • 0.5.16-draft (2026-10-21) — The NixOS build draws its window with a frameless Electron shell, so Studio's own titlebar, window buttons and drag region now ship on Linux; records why Chrome 155's windowing controls cannot do this.

  • 0.5.15-draft (2026-10-21) — Records that the unpacked Linux arm64 application was built and run on Ubuntu 24.04, with its staged backend passing the smoke test, and that only the AppImages remain unrun.

  • 0.5.14-draft (2026-10-21) — The Nix package runs the Electron application: a build-time bundle, a wrapper that starts Electron on it, a bare project argument that works unpackaged, and the application's name and profile pinned before its single-instance lock; Electron's default native Wayland replaces the launcher's Ozone flags.

  • 0.5.13-draft (2026-10-21) — The snap runs the Electron application like every other channel (9.6); 9.7 is Implemented, and the snap's hardware-accelerated rendering is recorded as unmeasured rather than as a reason to keep a second shell.

  • 0.5.12-draft (2026-10-21) — The launcher's Electron shell also runs on macOS (opt-in through ELECTRON_BIN): an application menu, the Dock identity and AppleScript pickers; --class is Linux-only and ELECTRON_RUN_AS_NODE no longer leaks into the shell.

  • 0.5.11-draft (2026-10-17) — §6.1 names resolveCanvasDocument, not the removed collectTags.

  • 0.5.10-draft (2026-10-07) — Open Project on the cloud picks a project folder within the chosen repository (listRepoProjects, and importProject's dir), and a cloud project's root key, editor URL and session revision carry that folder in git's rev notation (§4.1, §4.2, §10.1).

  • 0.5.9-draft (2026-10-04) — §3.1 a backend that sets DirEntry.version may answer a documentBaseUrl request with an immutable cache lifetime only when ?v= is a version it issued and it returns exactly the bytes that version names, an older one included (the browser keeps that answer for good, so Studio keeps versions true); an unrecognized v and every unversioned URL keep the revalidating response. §10.1 the cloud adapter reports its event stream's first open as an "open" resync.

  • 0.5.8-draft (2026-10-04) — §10.1 the cloud /events socket reconnects on jittered backoff with wake triggers and reports onResync: reconnect on every open after the first, commit on a committed git notice; the dev server's EventSource and the Chromium shell's RPC socket report reconnect the same way.

  • 0.5.7-draft (2026-10-04) — §10.4 backend-directed access: an action-required refusal (HTTP 403, actions, heading, retry) reaches every adapter member intact, session refusals nobody caught are reported once and their actions offered, the AI and Cloudflare routes are told the bound project, AccountStatus carries platform account entries and notices, and the platform gains performAction.

  • 0.5.6-draft (2026-10-01) — §3.1 an optional protocol route may be an adapter-internal optimisation with no interface member, filesRead the first; §10.1 the cloud adapter coalesces the reads issued in one tick into POST /files/read, chunked at 200 paths with four in flight, re-asking omitted paths and falling back to one GET per path on an older platform (a 404, a 405, a 403 read_only refusal of a viewer, or a 200 that is not a ReadFilesResult object).

  • 0.5.5-draft (2026-10-01) — Snap Store package for Ubuntu: the Nix-built app tree with Canonical's Chromium build and the gnome runtime's hardware-accelerated graphics stack, in a strict snap (§9.6); the Nix package now ships only the desktop app's production dependencies, with every first-party extension declared and an install check that resolves the launcher (§9.3).

  • 0.5.4-draft (2026-09-29) — Project creation adopts what it creates itself — opening a new window when a different project is already showing, leaving it untouched.

  • 0.5.3-draft (2026-09-29) — Census against the code: §3.1, §3.3, §5.3, §6.1 to §6.5, §7.4 and §9.3 marked with what ships, §3.6 re-marked Partial because the webview is handed the GitHub token, §10 re-marked Implemented over its open §10.2, the header corrected to Partial, and the implementation roadmap retired onto its feature sections.

  • 0.5.2-draft (2026-09-29) — The nested style rules the generated class carries are spec.md §9.2, not this spec's §9.2.

  • 0.5.1-draft (2026-09-29) — §3.1 the PAL gains readFileBytes, an optional raw-bytes read, because readFile decodes UTF-8 and turns an image into replacement characters, and on the desktop the loopback asset URL taints a canvas while CORS is banned outright.

  • 0.5.0-draft (2026-09-29) — §3.3 a launcher announces itself on __jxLauncher from its boot module's first import, the build refuses an init bundle that resolved electrobun from node_modules (the 5.0.0 to 5.1.3 defect), and a document that declared a boot module never falls back to the dev-server adapter; §3.4 Studio shows a boot-failure state naming the recorded error; §4.5 and §8.2.1 pickDirectory resolves null only for a cancel and Browse shows any rejection under Location.

  • 0.4.16-draft (2026-09-29) — §7.3a the shared services server gates its AI route with the per-process token the import route already required, refuses non-loopback Hosts, and advertises the bound literal 127.0.0.1.

  • 0.4.15-draft (2026-09-29) — §10.1 names the cloud adapter's importSite and the /events WebSocket it uses, rather than an omission and SSE.

  • 0.4.14-draft (2026-09-12) — §7.1 webview box names @jxsuite/ui in place of Lit + Spectrum.

  • 0.4.13-draft (2026-09-02) — Only authored sizes are emitted: a block-level box in normal flow drops the width and height a browser measured, so an imported layout stays fluid instead of pinned to the capture viewport.

  • 0.4.12-draft (2026-09-02) — A control that declares which panel it expands becomes a native disclosure, with the flow deciding whether a pair is a details element or a popover.

  • 0.4.11-draft (2026-09-02) — Import pairs a control with the panel it opens from the accessibility contract a site already ships, and emits a popover whose closed state lives in rather than the base rule.

  • 0.4.10-draft (2026-09-01) — Import emits one file per image family, rewrites readable interactions to native markup, and samples each breakpoint twice so responsive styles carry declared values rather than measured ones.

  • 0.4.9-draft (2026-08-31) — The PAL member table names listExtensionCatalog, the extension catalogue a backend answers for itself (extensions.md §9.2).

  • 0.4.8-draft (2026-08-28) — Distinguish the window's own icon (favicon-driven, studio.md 11.2) from the taskbar/dock icon (StartupWMClass) in section 9.3.

  • 0.4.7-draft (2026-08-27) — The files route answers in stable path order, in every backend.

  • 0.4.6-draft (2026-08-27) — The PAL is project-relative in both directions; an adapter translates a request space or a reply space, never both.

  • 0.4.5-draft (2026-08-27) — Both launchers preview the working tree live at real routes; Build Site keeps the compiler, and leaving the webview is stated to be one-way.

  • 0.4.4-draft (2026-08-26) — the Import tab chooses how many breakpoints the project keeps, and what an import emits is normative (§4.5).

  • 0.4.3-draft (2026-08-26) — Typechecking resolves the ElectroBun SDK from the pinned vendor/electrobun submodule; .hutch/devkit stays the build sysroot.

  • 0.4.2-draft (2026-08-26) — Packages capability row: the registry seam is packageVersions? (each dependency's own latest), not outdatedPackages? .

  • 0.4.1-draft (2026-08-26) — the Import source hands its brief to the assistant, which runs the import; the git-init obligation moves to whatever creates the project (§4.5).

  • 0.4.0-draft (2026-08-25) — StudioPlatform writes user settings as patches (set/remove) rather than replacing the whole map, so one window cannot clear another's; and §3.6 states which store a credential belongs in.

  • 0.3.24-draft (2026-08-25) — §3.1: a platform declares assetSpace beside documentBaseUrl; §10.2 (Pending → Partial): what a storage backend must declare, including that stored bytes come back losslessly.

  • 0.3.23-draft (2026-08-25) — 10.1 removes discoverComponents from the cloud adapter's omissions: deriving component metadata from a JSON document executes nothing, and returning an empty registry left the canvas unable to register or fetch any component at all.

  • 0.3.22-draft (2026-08-24) — §7 records the ElectroBun 2 toolchain boundary: the electrobun npm devDependency selects Hutch, Cottontail and ElectroBun together (no machine-wide install and no release pin in hutch.config.ts), the SDK is projected into .hutch/devkit, the main process is pinned to bun explicitly, and stable installers drop the channel prefix that the updater feed keeps.

  • 0.3.21-draft (2026-08-24) — 3.1 states that documentBaseUrl may be absolute or root-relative, and that a root-relative value is resolved against the canvas origin because the canvas composes it as new URL(path, base) — a relative base throws and fails the whole canvas mount.

  • 0.3.20-draft (2026-08-23) — 3.1 adds the Canvas member family and states that the canvas needs project files at a URL rather than behind readFile: documentBaseUrl defaults to the canvas origin plus projectRoot and must be set by a platform whose root is an identifier rather than a served path.

  • 0.3.19-draft (2026-08-22) — 10 SaaS/Cloud is Partial rather than Future: the adapter shipped and is deployed (10.1 Implemented, with what it implements and what it deliberately omits), collaboration shipped as a CRDT rather than the sketched lock model (10.3), and 10.2's storage table is marked Pending because the deployed backend is git-backed.

  • 0.3.18-draft (2026-08-22) — 3.3 the init bundle loads through a declared boot slot rather than an exact-string replace on the shipped document.

  • 0.3.17-draft (2026-08-22) — §9.2: the session watches a project or nothing — a root with no project.json is declined rather than scanned recursively.

  • 0.3.16-draft (2026-08-22) — §9.2: the launcher adopts its working directory as a project root only when that directory holds a project.json — a named root is still taken at its word.

  • 0.3.15-draft (2026-08-21) — §9.3: released builds are published to jxsuite.cachix.org and the flake names it, so a consumer substitutes jx-studio instead of building it; verify-cache proves that after each release. The release also builds aarch64-linux as an advisory leg beside the x86_64 gate, and nix.yml runs on pushes to main so pull requests inherit a warm Actions cache for the npm tarball derivations cache.nixos.org cannot serve.

  • 0.3.14-draft (2026-08-20) — §9.3: the desktop entry ships under a stable id and claims the app_id Chromium actually gives an --app window, so the taskbar/dock can resolve the brand icon.

  • 0.3.13-draft (2026-08-20) — Chromium launcher reaches PAL parity: its own adapter over createProjectServer (§9.1), multi-window through a cross-process window registry (§9.4), a server-to-client push channel behind live sidebar sync and focus, buildSite behind View: Open in Browser, appInfo for the About screen, and an OS-opener fallback so preview links and sign-in leave the app at all (§3.5, §9.5). New Window becomes the view.newWindow command rather than a native-menu-only item, and the native menu drops its duplicate accelerators (§4.2a).

  • 0.3.12-draft (2026-08-19) — §9.3 documents the release branch as the ref a Nix consumer pins, and the nix build that gates it; corrects the install phase, which has used cp -r plus a dangling-symlink prune and src/chromium/index.ts since before this text was written.

  • 0.3.11-draft (2026-08-16) — §3.6 the desktop signs in with an RFC 8252 loopback redirect and PKCE; the token rests in a 0600 credential store, not localStorage. RFC 8414 and RFC 7519 recorded Rejected as vacuous. Closes gap and gap .

  • 0.3.10-draft (2026-08-16) — §5 the contract's failure half is specified — one RFC 9457 registry; gap closed.

  • 0.3.9-draft (2026-08-15) — Add §12 Standards Alignment; §5 marked Partial — the Backend API Contract specifies no failure shape.

  • 0.3.8-draft (2026-08-13) — Open Project asks where a project should open (§4.2a): New Window is routed through pickProject + openProjectInNewWindow, and the outcome is reported rather than the target.

  • 0.3.7-draft (2026-08-11) — Name the pane context bar's resolving-with popover rather than the tab bar, which P8 deleted.

  • 0.3.6-draft (2026-08-03) — §3.1/§5.1: findReferences? PAL member and the GET /__studio/references route — the read side of the rename refactor's walker.

  • 0.3.5-draft (2026-08-02) — searchFiles, gitShow and openExternal RPC handlers registered on both launchers; styles/ staged into the packaged app.

  • 0.3.4-draft (2026-07-31) — List the cfConnect? PAL member in the Publish/identity family — it ships in StudioPlatform and backs the hosted Cloudflare OAuth flow, but the table omitted it.

  • 0.3.3-draft (2026-07-29) — PAL: launcher-only capabilities (updater, windowControls) stay off the StudioPlatform interface; adapter factories infer their return type and assert conformance instead of annotating it away.

  • 0.3.2-draft (2026-07-29) — The desktop shell routes Studio preview links to the user's default browser via Utils.openExternal (§3.5).

  • 0.3.1-draft (2026-07-25) — Repo picker gains a repository-access footer: per-installation manage links, install-on-another-account, and Refresh.

  • 0.3.0-draft (2026-07-25) — New Project requires a user-chosen destination: StudioPlatform gains the required createDestination declaration, createProject takes a required destination (path parent or repo owner/name/visibility), and §4.5 defines the create flow. No backend picks a location.

  • 0.2.7-draft (2026-07-24) — Cloud platform registers inside studio.js via a window.__jxCloud signal (single yjs for collab).

  • 0.2.6-draft (2026-07-24) — Document packaged static-data staging into app/bun (create templates, starters) and postBuild bundle verification.

  • 0.2.5-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.2.4-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.2.3-draft (2026-07-17) — Align spec.md, site-architecture, desktop, server, extensions with reality ( c61ba567 ).

  • 0.2.2-draft (2026-07-13) — Run formatter ( 9e776783 ).

  • 0.2.1-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.2.0-draft (2026-05-17) — Remove auto-detection script and update documentation for NixOS desktop runtime ( 6b746644 ).

  • 0.1.6-draft (2026-05-16) — Update desktop spec ( 9453ea1f ).

  • 0.1.5-draft (2026-04-23) — Oxfmt ( af32c08c ).

  • 0.1.4-draft (2026-04-23) — Rebrand to jxsuite ( 2897a4e8 ).

  • 0.1.3-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.2-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.1-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.0-draft (2026-04-15) — Implement platform abstraction ( 962ba588 ).

embedding.md

  • 0.1.7 (2026-10-21) — §2.2: dispose() removes the root before it stops the render's effects and calls onUnmount, so style release writes to detached nodes; keyed $map rows and $switch cases are taken down in the same order.

  • 0.1.6 (2026-10-17) — setTemplateErrorHandler routes throwing template bindings to a host for one render (§5.2).

  • 0.1.5 (2026-10-11) — §6: preloadModule is the only way a server-timed entry runs in process.

  • 0.1.4 (2026-09-11) — preloadModule accepts a loader: a lazy registration that imports on first use, once, shared by concurrent resolvers, and retried after a failed load (§6).

  • 0.1.3 (2026-09-10) — §2.4 the node hooks: onNodeCreated fires before a node's bindings are applied, and there is no detach counterpart.

  • 0.1.2 (2026-09-02) — A second realm forwards redefineElement across its bridge and re-renders (§7).

  • 0.1.1 (2026-09-02) — redefineElement and elementDefinition: a definition is read through the registry at connection, so a host may replace it live (§7); every section is now implemented.

  • 0.1.0-draft (2026-09-02) — Initial release: mount() with dispose and AbortSignal, host scope, host functions through call, events out, per-mount context, preloadDocument and preloadModule.

extensions.md

  • 0.4.11-draft (2026-10-21) — §9.1: a $studio.settings block may declare group (general, integrations or advanced; integrations by default), which places the section in the studio's settings nav.

  • 0.4.10-draft (2026-10-21) — §9.1 $studio.settings gains intro (the section's own opening sentence) and entry.noun (what one map entry is called).

  • 0.4.9-draft (2026-10-17) — §8: projectData may be asked for a section on demand ( lazy ); on-demand data offers complete() , and a host completes it for any class that does not declare static projectOnDemand = true .

  • 0.4.8-draft (2026-10-07) — An exportTarget sidecar is advertised from its page with a link rel=alternate (site-architecture.md 8.4.3); a format with no mediaType is exported but not advertised.

  • 0.4.7-draft (2026-10-06) — §8 the resolvePaths context carries the expanding page's urlPattern and params and every dynamic page's pattern, discover takes an exclude option, an asset mount may carry a filter, and a host refuses a page URL that climbs out of the output directory.

  • 0.4.6-draft (2026-09-29) — Census against the code: thirteen unmarked sections (§3, §5.4, §6.1, §7, §8, §8.1, §8.4, §9, §9.1, §9.2, §10, §11.1 and §12) gain Partial markers naming what ships and what does not, §11 is marked Partial for its module fallback divergence, and the stale Implemented marker on §8.6 is corrected to Partial.

  • 0.4.5-draft (2026-09-13) — §8.4: an entry's frontmatter may say search: false, and @jxsuite/search emits nothing for it — page and sections alike; only the boolean opts out, a non-boolean value is indexed and reported once.

  • 0.4.4-draft (2026-09-10) — A settings section's icon is a key in the Jx UI kit's glyph manifest, never an element tag; the §9.1 example named a Spectrum element, which resolved to nothing.

  • 0.4.3-draft (2026-08-31) — The extension catalogue (§9.2): a host answers for what it can run, with bundled and installed probed rather than declared; §2 lists feed.

  • 0.4.2-draft (2026-08-29) — A format may declare rewrite: replace authored values in its own source text, for a format that is read but never round-tripped.

  • 0.4.1-draft (2026-08-27) — Studio conversion and creation are parse/serialize consumers; what parse returns is decided by documentKinds.

  • 0.4.0-draft (2026-08-26) — §8.4: an emitter must not emit the same content twice — the search index carries page preamble plus sections, not the corpus twice.

  • 0.3.11-draft (2026-08-25) — §8.5: record that a host which cannot execute extension code sees only content-section mounts.

  • 0.3.10-draft (2026-08-20) — §5.1 records the first-party fragment $id shape, https://jxsuite.com/schema/ext/ / /v .

  • 0.3.9-draft (2026-08-16) — §13.1 auth session cookies: __Host- prefix derived from the origin's scheme, rate limiting on everywhere, session lifetime stated, Partitioned never set. Closes gap .

  • 0.3.8-draft (2026-08-16) — §8 _meta is reserved in a resolvePaths result — it carries the source entry's facts, never a route parameter.

  • 0.3.7-draft (2026-08-15) — mediaType is validated against RFC 6838 and carries RFC 7763 variant parameters; mediaTypeEssence for callers that key on a type (§7).

  • 0.3.6-draft (2026-08-15) — Add §8.6 head: a section owner contributes entries from configuration, before the first page is built.

  • 0.3.5-draft (2026-08-15) — Add §16 Standards Alignment: JSON Schema composition, media-type registration, and why JSON Patch is declined for lower.

  • 0.3.4-draft (2026-08-08) — §5.4 states first-party schema resolution — an @jxsuite/*.json ref reads from the host workspace before any project-local file at the same path, with no fallback in that direction, so a stray install inside a starter can no longer answer for the core; and a validator composes a stale entry document in memory rather than writing over the one it is checking.

  • 0.3.3-draft (2026-07-25) — Composition is host-agnostic: one pure function with an injected loader, so the cloud session composes the same entry documents in-Worker with no filesystem (§5.5).

  • 0.3.2-draft (2026-07-25) — $schema bindings must be satisfied by by-id registration, never fetching — an in-document $schema overrides fileMatch and an unresolvable one voids validation entirely (§5.4).

  • 0.3.1-draft (2026-07-25) — $paths validates against the source union instead of accepting any object (§5.3).

  • 0.3.0-draft (2026-07-25) — Committed entry documents are single-resource: every $ref a root pointer (§5.2, §5.4).

  • 0.2.9-draft (2026-07-24) — §2 package layout: correct the auth package description, note that /_jx/auth serves the Better Auth routes while table permission rules are enforced at /_jx/data, and add the missing search extension to the tree.

  • 0.2.8-draft (2026-07-23) — Add the assets capability (§8.5): section owners publish source directories at site URLs.

  • 0.2.7-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.2.6-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.2.5-draft (2026-07-22) — Align specs and docs with the bundled-schema validation contract ( ae861ff6 ).

  • 0.2.4-draft (2026-07-17) — Sidecar bundling, extension emit capability, heading anchors ( 07e28bc3 ).

  • 0.2.3-draft (2026-07-17) — Align spec.md, site-architecture, desktop, server, extensions with reality ( c61ba567 ).

  • 0.2.2-draft (2026-07-11) — Better Auth extension — sessions, permissions, auth-gated data ( bf472285 ).

  • 0.2.1-draft (2026-07-08) — Shipped schema fragments + per-project schema emitters ( 9e4a8936 ).

  • 0.2.0-draft (2026-07-08) — Extensions v2 framework + docs ( 3fb8795f ).

  • 0.1.0-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

imports.md

  • 0.1.12-draft (2026-10-17) — GET /__studio/components entries carry uses, the custom-element tags a component renders, which the canvas follows transitively (§1.4, §4.1).

  • 0.1.11-draft (2026-09-29) — Census against the code: §1.1, §1.2, §1.4, §2, §4.2, §4.3, §5, §5.1 and §6 gain Partial markers for the studio canvas's unrebased project imports and elements and its narrower component discovery, the retired imports-based format discovery, Custom Elements Manifest discovery that only the dev server performs, the package route payloads, the Packages and Insert panels, and unenforced collection elements. §1.3 gains a Partial marker and §1.4 is corrected, because the build compiles only the top level of components/ and never reads a page's $ref elements.

  • 0.1.10-draft (2026-08-27) — Components a project defines are discovered from the tree rather than only declared.

  • 0.1.9-draft (2026-08-15) — Name where the emitted import map now points (§1).

  • 0.1.8-draft (2026-08-15) — Number the sections so they are addressable, and add §7 Standards Alignment.

  • 0.1.7-draft (2026-08-02) — Imports panel section renamed to Imported Modules in the UI.

  • 0.1.6-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.5-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.4-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.3-draft (2026-06-01) — Remove old glob-based content type references ( 6bcbfdaf ).

  • 0.1.2-draft (2026-05-19) — Reflect new content type transition ( 6eb3d2b6 ).

  • 0.1.1-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.0-draft (2026-04-22) — External web component support ( a9d0fbe4 ).

jx-markdown.md

  • 0.1.11-draft (2026-09-29) — Census against the code: §3.1, §6.5, §6.6, §7.3, §9 and §12.8 gain Partial markers. They record where the content-document root, the repeater example and its round trip, the HTML-attribute routing, the placeholder and selection pseudo-elements, reference links and the CommonMark note, and roundtrip serialization differ from the text.

  • 0.1.10-draft (2026-08-31) — popover-open, open and modal are recognized pseudo-classes; backdrop is a pseudo-element taking two colons.

  • 0.1.9-draft (2026-08-27) — 12.8: roundtrip serialization is lossless where expressible, not total.

  • 0.1.8-draft (2026-08-15) — Number the sections so they are addressable, and add §13 Standards Alignment.

  • 0.1.7-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.6-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.5-draft (2026-07-17) — Build-time syntax highlighting for markdown code fences ( b2e7a561 ).

  • 0.1.4-draft (2026-06-15) — Arrays as pseudo-element ( 0b8b3070 ).

  • 0.1.3-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.2-draft (2026-05-25) — Element annotations (title/description) ( c9137e50 ).

  • 0.1.1-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.1.0-draft (2026-05-11) — Jx markdown ( 7b102340 ).

parser.md

  • 0.3.3-draft (2026-10-21) — Roundtrip serialization writes an element as markdown only when markdown can say all of it: attributes markdown cannot spell, block-level images and tables GFM cannot read back stay directives, and frontmatter is written unfolded with YAML 1.1 quoting.

  • 0.3.2-draft (2026-10-21) — §5: serializeJxMarkdown takes the source text in roundtrip mode and keeps the spelling of every unchanged frontmatter key and the body's emphasis, strong and bullet markers.

  • 0.3.1-draft (2026-10-17) — §9: a lazily requested content section loads each collection on first use with frontmatter only, and parses an entry's body only when it is returned ( ContentStore ; Markdown.load deferBody , §3); §9.6: on-demand link reporting.

  • 0.3.0-draft (2026-10-06) — §3.3 callouts: GitHub alerts render as built-in accessible markup or a mapped component, on by default ( alerts: false leaves blockquotes), and an enabled-nowhere [!type] marker is reported; §3.5 template-looking text in content (a ${ in a code fence or prose) stays text instead of being evaluated; §3.4 the highlighted language set grows to sql, php, python, ruby, nix, nginx, caddyfile, toml, ini, diff, xml, dockerfile and jsonc; §9.4 exclude and where choose a content type's entries; §9.5 README ids (a subfolder README now has its folder's id), idField, route templates, route-driven $paths and ContentEntry, and an entry with no route is left out of the collection; §9.6 relative links between entries resolve to routes.

  • 0.2.11-draft (2026-09-29) — Census against the code: the §3 marker narrowed to heading slugs that strip combining marks, §7 marked Partial because a collection's $elements only switch directive parsing on and restrict no names, §9.1 marked Partial for the silent skip of a localized content type with an unsafe name, and §9.3 corrected to Partial for uncoerced JSON and remote dates and the markdown-only mtime.

  • 0.2.10-draft (2026-08-27) — roundtrip serialization is lossless where expressible, not total.

  • 0.2.9-draft (2026-08-16) — §3 heading slugs normalize to NFC before casing (UAX #15) and word counts segment rather than split on whitespace (UAX #29). Closes gap and gap .

  • 0.2.8-draft (2026-08-16) — §3 the markdown variant and YAML media type are what hosts serve, not only what the class declares; gap and gap closed.

  • 0.2.7-draft (2026-08-15) — §9.3 records _meta.mtime as the date fallback a feed uses.

  • 0.2.6-draft (2026-08-15) — Add §9.3 date coercion: schema-declared date fields normalize to RFC 3339, ambiguous values are refused rather than guessed.

  • 0.2.5-draft (2026-08-15) — Add §10 Standards Alignment; §3 marked Partial — heading slugs and word counts are correct only for Latin script.

  • 0.2.4-draft (2026-07-23) — Document the Content project-section class: asset mounts and content-relative reference rewriting (§9).

  • 0.2.3-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.2.2-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.2.1-draft (2026-07-17) — Sidecar bundling, extension emit capability, heading anchors ( 07e28bc3 ).

  • 0.2.0-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.6-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.1.5-draft (2026-05-08) — Pass markdown attributes as properties ( 407b70fc ).

  • 0.1.4-draft (2026-04-23) — Rebrand to jxsuite ( 2897a4e8 ).

  • 0.1.3-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.2-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.1-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.0-draft (2026-04-10) — Consolidate specs ( 80ca313f ).

relationships.md

  • 0.1.5-draft (2026-09-29) — Census against the code: §2, §4 and §5 gained Partial markers for to-one includes onto integer-id tables, includes on the node path, table-to-content includes, foreign-key constraints, the content-to-table warning, reference value and write-time existence checks, and the Studio pickers' content-only, to-one scope.

  • 0.1.4-draft (2026-08-15) — Add §6 Standards Alignment: JSON Schema 2020-12 for cardinality, and the JSON Pointer shape the reference form borrows.

  • 0.1.3-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.2-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.1-draft (2026-07-08) — Shipped schema fragments + per-project schema emitters ( 9e4a8936 ).

  • 0.1.0-draft (2026-07-08) — Extensions v2 framework + docs ( 3fb8795f ).

schema.md

  • 0.4.11-draft (2026-09-29) — Census against the code: §3.2, §3.4 and §3.5 re-marked Partial from Implemented because the project key list, padded language tags, the compiler's redirect table, exponent-form integers and the readers that bypass the parse boundary (Studio, jx validate) lag the text, and §3.1 and §4 marked Partial where the component schema and its generator diverge from it.

  • 0.4.10-draft (2026-09-29) — §2 exports doc-ops and json-layout; an op that cannot apply has no inverse, and a move into its own subtree is refused.

  • 0.4.9-draft (2026-09-02) — ArrayNamespace gains key, a $map/item pointer.

  • 0.4.8-draft (2026-08-16) — §3.5 documents, configs and class definitions cross the parse boundary in NFC (UAX #31 §R4).

  • 0.4.7-draft (2026-08-16) — §3.2 language-tag keys carry a BCP 47 pattern, so author-time and build-time agree; gap closed.

  • 0.4.6-draft (2026-08-16) — §3.2 and §7: BCP 47 validation exists in the build; the schema is the half that still lacks it.

  • 0.4.5-draft (2026-08-15) — I-JSON enforced at the parse boundary: duplicate names and unrepresentable integers are parse failures (§3.4).

  • 0.4.4-draft (2026-08-15) — The class method role enum gains head (extensions.md §8.6).

  • 0.4.3-draft (2026-08-15) — §3.1 records the root fields the 0.4.2 entry described.

  • 0.4.2-draft (2026-08-15) — Document $lang, $dir and the previously undeclared $sitemap; defaults.dir; HeadEntry.textContent admits an object.

  • 0.4.1-draft (2026-08-15) — build.headers declares the response-header output (site-architecture.md §14.3).

  • 0.4.0-draft (2026-08-15) — redirects admits the object form the compiler and Studio already write, with an RFC 9110 status enum and a distinct rewrite shape; §3.2's redirect defect is resolved.

  • 0.3.2-draft (2026-08-15) — Add §7 Standards Alignment; §3.2 marked Partial — redirects and i18n do not describe what the rest of the platform reads.

  • 0.3.1-draft (2026-08-10) — §3.1 ElementTagName admits a TagExpression on ElementDef alone — a closed two-branch def whose every result $refs TagName, so the pattern is kept and the candidates stay enumerable; $head items are pinned to HeadEntry so a head tag cannot become choosable.

  • 0.3.0-draft (2026-08-09) — §3.1 TagName gains a pattern — a tag name is a name, never an expression, because no consumer evaluates one and each failed differently and silently; SwitchNode is admitted as a child under ChildrenValue (anyOf, so a switch child may still carry its container tagName); ExternalClassDef.filter widened to a union like sort, since one flat property set is shared by every $prototype and was overriding extension classes' own declared parameters.

  • 0.2.8-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.2.7-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.2.6-draft (2026-07-22) — Align specs and docs with the bundled-schema validation contract ( ae861ff6 ).

  • 0.2.5-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.2.4-draft (2026-05-18) — Always emit worker.js for cloudflare ( 3dd37c2d ).

  • 0.2.3-draft (2026-05-15) — Provider-sepcific Site-Wide Bundling ( 51cb5cf6 ).

  • 0.2.2-draft (2026-04-23) — Site build ( ffe60ddc ).

  • 0.2.1-draft (2026-04-23) — Compiler cli + published site ( 4607ebbc ).

  • 0.2.0-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.3-draft (2026-04-20) — Text nodes support ( 4d45eeb7 ).

  • 0.1.2-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.1-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.0-draft (2026-04-10) — Consolidate specs ( 80ca313f ).

server.md

  • 0.2.39-draft (2026-10-21) — §3 static files: a bare npm specifier is resolved through the active project's node_modules before the server root's.

  • 0.2.38-draft (2026-10-21) — §4.1 DELETE file removes an empty folder and answers 409 for a folder that still holds files.

  • 0.2.37-draft (2026-10-21) — §4.1 GET /__studio/file accepts optional=1, answering a missing file as 200 { content: null } with no-store instead of a 404.

  • 0.2.36-draft (2026-10-21) — §4.1 a listing of a missing directory answers 404 notFound, and an entry beside the active project is reported relative to it (../../docs/…), as every response path already was to be.

  • 0.2.35-draft (2026-10-21) — §4.1: every source-control route takes the project it acts on as ?dir=, under the file routes' access rule, so two Studio sessions on one server never act on each other's project; status lists every untracked file.

  • 0.2.34-draft (2026-10-21) — §4.1 git log answers an unborn HEAD with an empty list.

  • 0.2.33-draft (2026-10-18) — §3.5 records that the static file lanes answer from the server's one active project root, so two Studio tabs on different projects read each other's media; the git routes' per-request dir parameter cannot carry over to authored site-absolute URLs, and an origin per project is what closes it (Pending). The spec returns to Partial.

  • 0.2.32 (2026-10-17) — §3.2: the resolve proxy requests sections on demand and completes them for classes that read them synchronously.

  • 0.2.31 (2026-10-17) — §3: the per-project context cache shares an in-flight load, and serving a file no longer loads the extension sections.

  • 0.2.30 (2026-10-11) — §3.3: the server-function proxy is the only interpreted call path, its env merges the project .dev.vars as the mounts do, it resolves a relative $src against the absolute-path base Studio's canvas sends or a file: URL while a single-slash path stays a site URL.

  • 0.2.29 (2026-10-04) — §4.1 the files listing may carry an optional opaque content version per entry; the dev server sets none.

  • 0.2.28 (2026-10-01) — §4.1 the AI proxy derives a prompt-cache affinity from the client's X-Jx-Ai-Session header under the local scope (ai.md §2.5).

  • 0.2.27 (2026-10-01) — §4.1 the reference server deliberately does not serve the optional batch read (POST /__studio/files/read): it exists for backends whose reads cross a network.

  • 0.2.26 (2026-09-29) — The Studio route count is no longer stated: the STUDIO_ROUTES table is the count, and the written figure had drifted from 60 to 71.

  • 0.2.25 (2026-09-29) — §4.1 GET /__studio/file/bytes answers a project file undecoded and no-store: the read side of file/upload, for a caller that must not go through UTF-8.

  • 0.2.24 (2026-09-29) — §4.1 the AI proxy runs the shared @jxsuite/ai/gateway for its wire and keeps key provenance, the environment-key fallback, the link-local guard and the model catalogue; §7 lists @jxsuite/ai.

  • 0.2.23 (2026-08-31) — The route-group summary names the extension catalogue the dev server serves (extensions.md §9.2).

  • 0.2.22 (2026-08-29) — A deployment base declared by the project's url is stripped from the request path at the edge, so the dev server answers both the bare and the based spelling.

  • 0.2.21 (2026-08-27) — A rename resets any co-editing room keyed to the old path, so a shutdown flush cannot recreate the moved file.

  • 0.2.20 (2026-08-27) — Directory listing and project-wide search answer in stable path order, in both implementations.

  • 0.2.19 (2026-08-27) — The Studio API's path space is written down: server-root-relative in, project-relative out; a refactor target outside the active project is a 400, not a zero-result 200.

  • 0.2.18 (2026-08-27) — The preview origin registers the project's own components without a declaration.

  • 0.2.17 (2026-08-27) — The preview origin composes non-JSON pages through the project's extension registry, built from its config.

  • 0.2.16 (2026-08-27) — The live site preview origin: an origin per project serving the working tree, with the overlay, the shared reload stream and its own resolver credential.

  • 0.2.15 (2026-08-26) — the import stream names its destination on a ready line, before the crawl finishes (§4.2).

  • 0.2.14 (2026-08-26) — Packages family: GET /__studio/packages/versions reports every dependency's newest published version, behind or not, replacing the outdated-only check.

  • 0.2.13 (2026-08-26) — the import stream's done line carries the run summary, and accepts an opt-in verify pass (§4).

  • 0.2.12 (2026-08-25) — §3: the static-file order now matches a build — public/ precedes the project root, which survives as a compatibility lane that warns.

  • 0.2.11 (2026-08-22) — §3.1: watch-policy.ts — watchers watch only directories and regular files, and contain symlinks to the root, so a socket cannot throw and a link out cannot walk the filesystem.

  • 0.2.10 (2026-08-20) — The loopback project server's RPC socket carries server-initiated frames (ProjectServerHandle.push) — the loopback twin of the dev server's named fs SSE event, and the channel a desktop launcher raises a window over (§4.2).

  • 0.2.9 (2026-08-18) — §4.2: the Studio shell's report-only Trusted Types header is removed — see spec.md §21.5.

  • 0.2.8 (2026-08-18) — §4.2: both entry points send the Studio shell a report-only Trusted Types policy, and nothing else.

  • 0.2.7 (2026-08-16) — §4.2 Fetch Metadata on every gated surface, the loopback block, a constant-time token, and the three ungated project-server routes closed; gap closed.

  • 0.2.6 (2026-08-16) — §4.3 every failure is an RFC 9457 problem document, guarded; gitPull produces the 409 the route table publishes; gap closed.

  • 0.2.5 (2026-08-16) — §5 and §8 record the source-map decision — a constant header offset is not a source map (ECMA-426, Rejected).

  • 0.2.4 (2026-08-16) — §3 static responses correct the two content types where the platform default disagrees with the registration.

  • 0.2.3 (2026-08-16) — §3.1 the SSE stream advertises retry: 500 and answers Last-Event-ID with one reload; gap closed.

  • 0.2.2 (2026-08-15) — Add §8 Standards Alignment; §4 and §4.2 marked Partial — the failure contract is unspecified and the project server does not gate uniformly.

  • 0.2.1 (2026-07-25) — Activation admits an existing project of the account's own (project.json under the home directory); a refused activation must surface as an error rather than fall back to the server root.

  • 0.2.0 (2026-07-25) — POST /__studio/create-project requires an explicit absolute destination parent — the server no longer falls back to its own root. Adds assertCreatableParent (root, allowedRoots, or home; absolute only), remembers created roots for a following activate, and returns an absolute root for projects outside the server root.

  • 0.1.9 (2026-07-23) — Serve extension asset mounts ahead of the project root in the static-file chain (§3).

  • 0.1.8 (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.7 (2026-07-22) — Fix failing tests ( 56e073f8 ).

  • 0.1.6 (2026-07-22) — Harden dev server and unify runtime/compiler evaluation ( 47a1d4c9 ).

  • 0.1.5 (2026-07-17) — Align spec.md, site-architecture, desktop, server, extensions with reality ( c61ba567 ).

  • 0.1.4 (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.3 (2026-04-23) — Rebrand to jxsuite ( 2897a4e8 ).

  • 0.1.2 (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.1 (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.0 (2026-04-10) — Consolidate specs ( 80ca313f ).

site-architecture.md

  • 0.6.26-draft (2026-10-21) — The usage engine answers every question from one per-tree-change index of the project's references.

  • 0.6.25-draft (2026-10-21) — §8.6: Search appearance has one button, on the Inspector's Page tab for a page and a collection entry alike, now that Edit draws no Document Header card.

  • 0.6.24-draft (2026-10-21) — §7.4: a CSV record opens in the form-only entry editor, and an image object is the media field with an alt text row.

  • 0.6.23-draft (2026-10-21) — A page's description property (a Markdown page's frontmatter description) is written as its description meta, below a description meta in the page's own $head.

  • 0.6.22-draft (2026-10-21) — §7.4 an array of single values in the entry form is a row per item with Add and Remove (pictures get the media field per row) rather than raw JSON text.

  • 0.6.21-draft (2026-10-21) — §9.4: an upload with no collection context lands in public/media/, and the Media workspace is the fourth upload surface, with Replace as the one overwrite (Implemented).

  • 0.6.20-draft (2026-10-21) — §7.4: a JSON entry file opens the form-only entry editor, and a file-backed collection's record opens its file's grid on that record's row.

  • 0.6.19-draft (2026-10-21) — §7.2, §7.4 and §7.5: the collection browser is the Content home, one collection at a time with its own view, and entry editing is canvas-first, with the form-only editor kept for JSON and file-backed entries.

  • 0.6.18-draft (2026-10-21) — §9.4: an upload with no collection context lands in public/media/, and the Media workspace replaces the Library as the fourth upload surface (Partial).

  • 0.6.17-draft (2026-10-16) — The /assets/ URLs the compiler writes into component and page modules for $src functions are re-rooted on the deployment base path (14.7).

  • 0.6.16-draft (2026-10-07) — The not-found page gets no Markdown twin: none is written and none is advertised (8.4.2, 8.4.3).

  • 0.6.15-draft (2026-10-07) — A page advertises each export sidecar it has with a link rel=alternate of the format's media type (new 8.4.3); only twins that were written, an author's own link wins, none on the not-found page.

  • 0.6.14-draft (2026-10-07) — Canonical link, og , sitemap loc and hreflang alternates take the served form of build.trailingSlash (reversing the earlier un-normalized form), the sitemap leaves out noindex pages and the not-found page, and a page at /404 is written to 404.html (new 8.4.2).

  • 0.6.13-draft (2026-10-06) — §4.3 a routed content type needs no param in $paths, and §6.1 names the exclude, where, idField, route, links and alerts options that publish a folder of Markdown as it is.

  • 0.6.12-draft (2026-09-29) — Census against the code: twenty-five unmarked sections gain leading Partial markers (ten for missing or broken behaviour, fifteen for divergent examples or prose), §7.4, §8.5, §8.6 and three §7.2 cells are corrected to Partial, §9.4, §13 and §14 close as Implemented with §13.6's reason corrected, and the implementation roadmap is retired onto its feature sections. §2.2 and §10.3 now say the build compiles only the top level of components/ and drops a page's or layout's $ref elements, and §8.1 says a layout-less page puts its title on the root element.

  • 0.6.11-draft (2026-09-10) — the CSV table-editor backlog item names a grid rather than a Spectrum element that no longer exists.

  • 0.6.10-draft (2026-08-29) — A site deployed under a subpath: url's path is the base every emitted reference resolves against, applied to every output a host reads and answered by the dev server alongside the bare path.

  • 0.6.9-draft (2026-08-29) — A reference inside a format that cannot round-trip is repaired through the rewrite capability rather than reported as a remainder.

  • 0.6.8-draft (2026-08-29) — Media reachable only through a cross-root asset mount has no project-relative name, which is why it has no usage count; addressing it is a host file-API question, not an engine one.

  • 0.6.6-draft (2026-08-29) — A copy map's keys and a directory content source are references the engine reads by name; a copy destination is not, and a rewritten reference keeps its trailing slash.

  • 0.6.5-draft (2026-08-29) — A media usage query asks about the file once; enumerating a file's authored spellings host-side is the engine's job, not a media surface's.

  • 0.6.4-draft (2026-08-27) — Record that collection discovery is recursive, so a subdirectory holds entries as well as co-located media.

  • 0.6.3-draft (2026-08-27) — Reference resolution through the asset lanes is the refactor engine's contract, in both directions: a rooted ref is counted through every lane, rewritten through the lanes a build publishes, and named in the report when it cannot be written.

  • 0.6.2-draft (2026-08-27) — Routing, layout, context and head-merge move to @jxsuite/site; standards evidence follows.

  • 0.6.1-draft (2026-08-27) — media files open in a viewer, which is the reader the usage query was missing (§9.4).

  • 0.6.0-draft (2026-08-26) — §12.4: component CSS inlined and modulepreload hints emitted; §14.3: name the hosts that read _headers, and warn when one will not.

  • 0.5.18-draft (2026-08-26) — Standards evidence follows head-merger to @jxsuite/schema.

  • 0.5.17-draft (2026-08-25) — §9.3: an editor whose host does not serve the site URL space MUST resolve references to the project files they name; §9.4: a parent-realm preview resolves in the same space, and an authored reference is not a file path.

  • 0.5.16-draft (2026-08-19) — §13.5: a translation key may name its route's parameters, so a collection's URLs can be localized; §13.3: a ContentEntry lookup is scoped to the route's language and a locale directory is matched case-insensitively; §6.7: a localized collection publishes one feed per language.

  • 0.5.15-draft (2026-08-18) — §13.5: a document declares its identity across languages with $translationKey, so a localized slug is a translation; two routes claiming one language are reported, as an error when declared.

  • 0.5.14-draft (2026-08-18) — §13.5 exposes the translation set to the page as $page.alternates, with each locale's autonym; §13.7 defaults a helper's locale to the page's own; §13.6 reports a prefix-always root no static deployment can answer.

  • 0.5.13-draft (2026-08-18) — §8.7: the subpath entry is bundled rather than externalised, and the shared core is reached through an emitted stub — a self-referential asset broke every page using a directive.

  • 0.5.12-draft (2026-08-18) — §8.7: subpaths resolve through a prefix key and an npm $elements set bundles as one self-contained module.

  • 0.5.11-draft (2026-08-18) — §8.7: bare specifiers resolve on page and layout too, npm-only pages get an import map, and the package-subpath gap is recorded.

  • 0.5.10-draft (2026-08-18) — §13: correct a status marker that contradicted §13.3 and §13.6 — {locale} expansion and Accept-Language negotiation both ship.

  • 0.5.9-draft (2026-08-16) — §13.7 blessed Intl helpers — one shared list, five new helpers, and a fixed en-US/UTC default so a build's output is a function of its input. Closes gap .

  • 0.5.8-draft (2026-08-16) — §13.3 {locale} sources expand and scope route expansion; §13.6 Accept-Language negotiation in the generated worker; prefix-always is checked; gap closed.

  • 0.5.7-draft (2026-08-16) — §8.4.1 a generated route's lastmod comes from the entry it was generated from; gap closed.

  • 0.5.6-draft (2026-08-16) — §8.3 link relations are checked against the IANA registry, warning once per build; gap closed.

  • 0.5.5-draft (2026-08-16) — §16: the RFC 9110 row states the five statuses B1 shipped instead of the two that predated it.

  • 0.5.4-draft (2026-08-16) — Optional service worker with a tombstone contract: off by default, network-first HTML, precache validated against the build's own output (§14.6).

  • 0.5.3-draft (2026-08-16) — Cascade layer 6 describes the scoping that exists — there is no shadow DOM.

  • 0.5.2-draft (2026-08-15) — Generate manifest.webmanifest and .well-known/security.txt (§14.5).

  • 0.5.1-draft (2026-08-15) — hreflang alternates in and sitemap xhtml for translated pages (§13, §13.5).

  • 0.5.0-draft (2026-08-15) — i18n: BCP 47 validation and canonicalization, route prefixes resolve to locales, per-page lang and script-derived dir, $page.locale (§13, §13.2, §13.4).

  • 0.4.1-draft (2026-08-15) — Emit a Content-Security-Policy derived from the built pages: strict script-src from constant inline-script hashes, style-src divergence recorded (§14.3.1).

  • 0.4.0-draft (2026-08-15) — Responsive images: per format, one owner for loading attributes, fetchpriority honoured, lazyLoad independent of optimize (§9.2, §9.2.7).

  • 0.3.3-draft (2026-08-15) — $head bare specifiers copy into /assets/ and $elements bundle there; an unresolvable one is a build error (§8.7).

  • 0.3.2-draft (2026-08-15) — §8.4.1 is a full RFC 3339 timestamp; the per-template lastmod wart is named rather than implied.

  • 0.3.1-draft (2026-08-15) — Add §6.7 syndication feeds: Atom and JSON Feed via @jxsuite/feed, RFC 5005 archives, RSS declined.

  • 0.3.0-draft (2026-08-15) — §8.3 link identity includes hreflang/type/media/sizes; §8.5 JSON-LD objects serialize; §8.4 lang and dir come from the page.

  • 0.2.1-draft (2026-08-15) — Add §14.3 response headers and §14.4 .nojekyll; §14's header gap is closed and vercel.json is declined.

  • 0.2.0-draft (2026-08-15) — §11.3 separates redirects from rewrites: an RFC 9110 status enum, a per-status HTML-fallback policy, and no file for a rewrite.

  • 0.1.45-draft (2026-08-15) — Add §16 Standards Alignment; §8.5 marked Pending — the JSON-LD object form is unimplemented — and §14 Partial: no _headers or .nojekyll is emitted.

  • 0.1.44-draft (2026-08-12) — Header status corrected from Pending to Partial — all seven marked sections were Implemented while the header claimed nothing was; §9.4's marker and its own Still-planned list contradicted each other (metadata and the delete warning ship; browsable usage does not); §12.3 and §13 marked Pending, having no dependency graph and no reader of the i18n config respectively.

  • 0.1.43-draft (2026-08-11) — Studio SEO previews move from a Document Header disclosure into the Search appearance modal (document.openSeo), reachable from the card, the Page panel and the palette; fields grouped by the preview each feeds.

  • 0.1.42-draft (2026-08-06) — §7.2 the Library and its window contract, §7.5 the CRUD table corrected — rename, delete and CSV editing already shipped and were listed Pending, §7.6 the draft pill, §8.6 merged-$head previews with no score, §9.4 usage keyed on the authored ref, §11.4 redirects as a GridSource with chain, loop and shadow validation.

  • 0.1.41-draft (2026-08-05) — §3.2 names the consequence of the cascade — every property reaches every route, which is why Studio states the blast radius and edits the file under undo.

  • 0.1.40-draft (2026-07-30) — A page uses a component when its tag appears in the prerendered HTML or in one of the page's island modules (§12.4).

  • 0.1.39-draft (2026-07-28) — §9.3: editors that open a collection entry standalone must apply the mount rewrite to their render representation only, with the browser-side existence-check divergence stated.

  • 0.1.38-draft (2026-07-28) — Media browser (§9.4) is Partial: upload ships on four Studio surfaces with content-collection destinations and collision-safe naming; metadata and usage tracking still pending.

  • 0.1.37-draft (2026-07-24) — Document the application tier and correct the static-only framing: §1 vision, §1.1 principles 1/3/5, §1.2 coverage, §14.1/§14.2 adapter output (worker generation is gated on build.adapter alone), and new §15 Application Tier covering server functions, auth, and data mounts.

  • 0.1.36-draft (2026-07-23) — Note the mounted-asset copy step in the build pipeline (§12.1).

  • 0.1.35-draft (2026-07-23) — Content entries address media relative to themselves; collections publish their directory at /content/ (§9.3).

  • 0.1.34-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.33-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.32-draft (2026-07-17) — Forced color-scheme contract — dual emission, color-scheme triplet, pre-paint script ( e629684d ).

  • 0.1.31-draft (2026-07-17) — Bundle the site worker self-contained per adapter ( 4096ba12 ).

  • 0.1.30-draft (2026-07-17) — Sidecar bundling, extension emit capability, heading anchors ( 07e28bc3 ).

  • 0.1.29-draft (2026-07-17) — Image pruning for persistent site build cache + github ci cache ( b45096ed ).

  • 0.1.28-draft (2026-07-17) — Align spec.md, site-architecture, desktop, server, extensions with reality ( c61ba567 ).

  • 0.1.27-draft (2026-06-25) — Sitemap generation ( 948c7a67 ).

  • 0.1.26-draft (2026-06-10) — Update site architecture to reflect new changes ( c0bdba08 ).

  • 0.1.25-draft (2026-06-10) — Use cloudflare cgi for image optimization ( 96228874 ).

  • 0.1.24-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.23-draft (2026-06-03) — Use .cache isntead of .jx-cache to support cloudflare build cache ( 1103d2d6 ).

  • 0.1.22-draft (2026-06-01) — Remove old glob-based content type references ( 6bcbfdaf ).

  • 0.1.21-draft (2026-05-28) — Separate directory + format for content type defs ( c43186ac ).

  • 0.1.20-draft (2026-05-25) — Element annotations (title/description) ( c9137e50 ).

  • 0.1.19-draft (2026-05-25) — Allow nested global styles ( 1159d585 ).

  • 0.1.18-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.1.17-draft (2026-05-19) — Reflect new content type transition ( 6eb3d2b6 ).

  • 0.1.16-draft (2026-05-18) — Always emit worker.js for cloudflare ( 3dd37c2d ).

  • 0.1.15-draft (2026-05-18) — Remove unused 'rendered' property from JSON and CSV entries ( 7478a87c ).

  • 0.1.14-draft (2026-05-15) — Image optimization specs ( 7d2ee67f ).

  • 0.1.13-draft (2026-05-15) — Provider-sepcific Site-Wide Bundling ( 51cb5cf6 ).

  • 0.1.12-draft (2026-05-04) — Longhand/shorthand property input sync ( 05c7da35 ).

  • 0.1.11-draft (2026-04-29) — Update site architecture progress ( 3305a8f0 ).

  • 0.1.10-draft (2026-04-29) — Project browser ( 11c1fe7c ).

  • 0.1.9-draft (2026-04-23) — Site build ( ffe60ddc ).

  • 0.1.8-draft (2026-04-23) — Compiler cli + published site ( 4607ebbc ).

  • 0.1.7-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.6-draft (2026-04-20) — Better project-level scoping ( 0cba233c ).

  • 0.1.5-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.4-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.3-draft (2026-04-15) — Importmap support ( c1b329d4 ).

  • 0.1.2-draft (2026-04-10) — WinterTC server-side conventions ( 60eba6dd ).

  • 0.1.1-draft (2026-04-10) — Site architecture update ( 86d1c515 ).

  • 0.1.0-draft (2026-04-10) — Enhanced font picker ( 9d388a32 ).

spec.md

  • 0.7.6-draft (2026-10-21) — The binding-bounce example names the build adapter picker, since the branch picker it cited was removed.

  • 0.7.5-draft (2026-10-21) — §16.4: a throwing ${…} template binding is not a failed render, since it survives its expression throwing (§6.1); the report covers throws elsewhere in the render.

  • 0.7.4-draft (2026-10-21) — §5.3 4c: the interpreter imports an npm: specifier through the host's resolver; §15.4: templates read $page and $site bare; §16.2: a $props binding of an HTMLElement-named prop reaches state after connection; §16.4: a render that threw is drawn again when its inputs change, and onMount runs with the host as this.

  • 0.7.3-draft (2026-10-21) — §16.4: a render that throws at connection is reported on the console and as a jx-error event instead of escaping as an unhandled rejection; onMount does not run for that instance.

  • 0.7.2-draft (2026-10-17) — §8.5 states one slot distribution rule (capture, group, place, forward) and the interpreter, the compiled component module and the static prerender all apply it: whitespace-only text is discarded, the first slot of a name takes its group, fallback follows a group with no content, a forwarded slot is grouped by its own slot attribute, and a prerendered instance recovers its bracketed children on upgrade; §16.6 names data-jx-slots among the hydration markers.

  • 0.7.1-draft (2026-10-17) — A throwing template binding renders nothing and re-runs when its data arrives (§6.1); self-target reactive declarations use positional --jx-s variables and share one rule set (§9.6); native-named props forward into state (§16.2).

  • 0.7.0-draft (2026-10-17) — §5.3 Shape 3: a single-expression template keeps its own type in every tier (was a string in the runtime and the compiled targets).

  • 0.6.28-draft (2026-10-16) — §16.8 status note: drop the stale remark that studio.ts imports exportCemManifest as _exportCemManifest; the unused import is gone and the generator still has no caller.

  • 0.6.27-draft (2026-10-11) — §11.3, §11.4: an interpreting host calls a server entry only through the dev proxy and never imports its module in the browser, so §11.3's marker drops the clause saying the function can run there.

  • 0.6.26-draft (2026-09-29) — §5.7 is marked Partial: the interpreter and the compiled targets use different predicates to decide that a state object is a pure type definition, so the same entry can hold a value in one tier and none in the other.

  • 0.6.25-draft (2026-09-29) — Census against the code: thirty-seven sections now lead with Partial where the interpreter, a compiled target or the text diverges, the stale Implemented cells of the §11.2 prototype table and the §11.3 timing table now read Partial and name their compiled gap, the §7.4, §8.6, §16.8 and §21.1 markers say what ships, and §21 closes as Implemented.

  • 0.6.24-draft (2026-09-29) — §8.4 is marked Partial: content spliced in by a computed-children template is evaluated as templates instead of kept literal.

  • 0.6.23-draft (2026-09-29) — §15.2 is marked Partial: built output renders the children written inside a page-level component instance with an empty scope, so their bindings and bound props are lost.

  • 0.6.22-draft (2026-09-14) — §16.9 Instantiation Limits: a definition that instantiates its own tag with the same props is refused and a 32-frame chain is the cap, with the same diagnostics on both sides of the build; the interpreter reports a refusal with a jx-error ErrorEvent.

  • 0.6.21-draft (2026-09-10) — a style declaration may bind a value the host measured, which two surfaces had worked around as impossible.

  • 0.6.20-draft (2026-09-10) — 8.8 gains custom-element-in-select: a select builds its own rows, so a custom element among them draws, reads convincingly and cannot be picked.

  • 0.6.19-draft (2026-09-10) — the shell's Trusted Types sink list is one shorter: sp-theme left with Adobe Spectrum rather than being allow-listed.

  • 0.6.18-draft (2026-09-10) — §4.3 listener options are not part of the on* grammar; §6.1 a binding writes when its source moves, so a document cannot re-assert or empty a bound control; §13.1 there is no document-local element fragment.

  • 0.6.17-draft (2026-09-09) — a style block may document itself: $description is prose carried on the rule, and every $-prefixed key is metadata rather than a declaration.

  • 0.6.16-draft (2026-09-09) — a declaration at-rule may be written more than once, as an array of blocks — the only spelling @font-face has for a family's second weight.

  • 0.6.15-draft (2026-09-03) — a style declaration value may be a ref; a reactive custom property on a self-target rule is written inline so rows share one rule; a static build reports what it drops; color-scheme lands on .

  • 0.6.14-draft (2026-09-03) — a custom element's call-site style merges with its definition's; a slot leaves no node; the display default is a rule decided by the base block, with display revert as the opt-out; onMount receives the host; #/$map resolves.

  • 0.6.13-draft (2026-09-02) — Removing an observed attribute restores the state entry's declared default (§16.5).

  • 0.6.12-draft (2026-09-02) — a linked area owes an accessible name, which its alt supplies (§8.8).

  • 0.6.11-draft (2026-09-02) — the container rules honour aria-owns.

  • 0.6.10-draft (2026-09-02) — @keyframes emits as one unscoped block, with keyframe selectors taken verbatim.

  • 0.6.9-draft (2026-09-02) — Accessibility rules (§8.8): nine static rules over the overlay walker, each citing its WCAG criterion, with WAI-ARIA, accname and WCAG alignment rows.

  • 0.6.8-draft (2026-09-02) — A nested style key or its scope may be a selector list; nested blocks distribute over every member (§9.2).

  • 0.6.7-draft (2026-09-02) — Overlays: popover, dialog and invoker commands (§8.7) — the dialog and command rules a document is held to, beside the popover ones; the WHATWG HTML row binds it.

  • 0.6.6-draft (2026-09-02) — A $switch whose discriminant re-resolves to the same key keeps its rendered case (§14.1).

  • 0.6.5-draft (2026-09-02) — A $switch may discriminate on the row's $map/item or $map/index inside a mapped array's template, and its container carries the slot its content needs (§14.1).

  • 0.6.4-draft (2026-09-02) — Statements gain stopPropagation and preventDefault (§20.2); a definition's root-level event handlers listen on the host (§16.1); an attribute value that resolves to null or undefined removes the attribute (§8.3).

  • 0.6.3-draft (2026-09-02) — §16.5: observed attributes present at connection are read into state before $props.

  • 0.6.2-draft (2026-09-02) — §10.4 Keys: mapped arrays reconcile by key, rows keep their nodes and effects, reconciliation is batched per microtask; §14.1 each switch case owns a scope.

  • 0.6.1-draft (2026-09-02) — Lifecycle hooks at the mount boundary (§16.4) and the Studio shell as an interpreter host (§21.3).

  • 0.6.0-draft (2026-09-01) — Styling: every declaration in a style object becomes a CSS rule; the runtime delivers them through document.adoptedStyleSheets (new 9.6). Nesting composes in either order to any depth, so 9.2's compiler limitation is gone.

  • 0.5.9-draft (2026-08-31) — popover is enumerated and emitted through the presence branch; declaration-body at-rules (@position-try, @property) emit verbatim; all four boolean-attribute writers now defer to booleanAttrValue.

  • 0.5.8-draft (2026-08-26) — §5.3: $lazy on a $src Function defers the module to first call.

  • 0.5.7-draft (2026-08-26) — §8.3: a boolean attribute value is emitted by family — presence for HTML boolean attributes, the written word for aria-* and the enumerated three.

  • 0.5.6-draft (2026-08-25) — Clarify that the parentheses in an @(condition) style key belong to the query, so a bare media type emits without them (§9).

  • 0.5.5-draft (2026-08-24) — 13.2 states that the runtime takes a prop from an instance only where the instance genuinely carries one — an own property or an attribute — because a state key colliding with a reflected DOM property otherwise reports an empty string and beats the component's declared default.

  • 0.5.4-draft (2026-08-18) — §21.5: Trusted Types enforcement is declined rather than deferred — the observation run answered its question and was removed with its header; no innerHTML write remains in code Jx ships.

  • 0.5.3-draft (2026-08-18) — §5.6: both tiers refuse a $props write against a private key, and a private entry gets no property accessor.

  • 0.5.2-draft (2026-08-18) — §21.5: ship the Trusted Types observation stage, and correct two claims its first boot disproved.

  • 0.5.1-draft (2026-08-18) — §7.1: state the one-separator rule without showcasing a dotted key; note that forbidding one would itself depart from RFC 6901.

  • 0.5.0-draft (2026-08-17) — $ref is JSON Pointer: / is the only separator and ~0 / ~1 are implemented; one shared tokenizer replaces five disagreeing ones.

  • 0.4.33-draft (2026-08-16) — §21.5 two CSP profiles, permanently: compiled output never needs 'unsafe-eval' and the interpreting canvas always will. A Trusted Types policy guards the shell's one injection sink and refuses to build scripts; the runtime's four innerHTML writes became replaceChildren().

  • 0.4.32-draft (2026-08-16) — §11.2a the Cookie prototype derives Secure/Path/Domain from a name prefix and from SameSite=None; HttpOnly and Expires are absent on purpose; a cookie name is data, never pattern syntax.

  • 0.4.31-draft (2026-08-16) — Shadow DOM opt-in: $shadow and defaults.shadow emit a declarative shadow root the element adopts; translation keeps one style object valid in both modes (§16.6).

  • 0.4.30-draft (2026-08-16) — §9.1 and §16.6: style scoping is a tag-name prefix and generated classes, not data-jx attribute selectors; cite the light-DOM divergence.

  • 0.4.29-draft (2026-08-15) — §18 becomes the machine-checked standards table; §2.5 renamed Platform Precedents to free the reserved title; §21 marked Partial — no Trusted Types policy is installed.

  • 0.4.28-draft (2026-08-10) — §19.6 $expression gains a third position — an element's tagName, narrowed to a TagExpression whose every branch is a literal TagName so the candidate set is enumerable without evaluating; it is the one $expression position that is not live, resolved once at element creation, and the document root's and $head entries' tagNames stay literal.

  • 0.4.27-draft (2026-07-30) — Clarify that a bare return; is an early-exit guard, not a value return, when classifying a Function body as a computed (§5.3 4b).

  • 0.4.26-draft (2026-07-30) — Define the handler-side iteration context: an event handler bound inside a map reads its row via state.$map (§10.2).

  • 0.4.25-draft (2026-07-30) — Define parameter binding by name at event call sites, and how a bodyless $src Function is classified as a computed or a callable (§5.3 4d).

  • 0.4.24-draft (2026-07-24) — §5.3 and §11.4: a timing: "server" route lands in the generated site worker only when build.adapter is set; without an adapter the compiler emits a per-page _server.js handler instead.

  • 0.4.23-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.4.22-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.4.21-draft (2026-07-22) — Reconcile spec with shipped behavior; document the eval surface ( c8d1d580 ).

  • 0.4.20-draft (2026-07-22) — Align specs and docs with the bundled-schema validation contract ( ae861ff6 ).

  • 0.4.19-draft (2026-07-17) — Forced color-scheme contract — dual emission, color-scheme triplet, pre-paint script ( e629684d ).

  • 0.4.18-draft (2026-07-17) — Sidecar bundling, extension emit capability, heading anchors ( 07e28bc3 ).

  • 0.4.17-draft (2026-07-17) — Align spec.md, site-architecture, desktop, server, extensions with reality ( c61ba567 ).

  • 0.4.16-draft (2026-07-17) — Clean up spec ( 897e8c1e ).

  • 0.4.15-draft (2026-07-15) — Pure method operators and the composite formula catalog (spec §19.4d) ( 58be3b1a ).

  • 0.4.14-draft (2026-07-15) — Conditional operators and editor evaluation trace (spec §19.4b, §19.9) ( 79926245 ).

  • 0.4.13-draft (2026-06-15) — Arrays as pseudo-element ( 0b8b3070 ).

  • 0.4.12-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.4.11-draft (2026-06-02) — Returns type in the class definition ( 32e4737a ).

  • 0.4.10-draft (2026-06-01) — Declarative expressions ( 472aeb15 ).

  • 0.4.9-draft (2026-05-25) — Element annotations (title/description) ( c9137e50 ).

  • 0.4.8-draft (2026-05-20) — "format" on fields for image fields ( 02f87d29 ).

  • 0.4.7-draft (2026-05-20) — Release 0.11.0 ( 4a0e17ed ).

  • 0.4.6-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.4.5-draft (2026-05-18) — Always emit worker.js for cloudflare ( 3dd37c2d ).

  • 0.4.4-draft (2026-05-15) — Add markdown prototypes at top-level ( 24020906 ).

  • 0.4.3-draft (2026-05-15) — Provider-sepcific Site-Wide Bundling ( 51cb5cf6 ).

  • 0.4.2-draft (2026-04-23) — Oxfmt ( af32c08c ).

  • 0.4.1-draft (2026-04-23) — Rebrand to jxsuite ( 2897a4e8 ).

  • 0.4.0-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.3.7-draft (2026-04-22) — External web component support ( a9d0fbe4 ).

  • 0.3.6-draft (2026-04-22) — Init new site ( f33d319b ).

  • 0.3.5-draft (2026-04-20) — Text nodes support ( 4d45eeb7 ).

  • 0.3.4-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.3.3-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.3.2-draft (2026-04-15) — Importmap support ( c1b329d4 ).

  • 0.3.1-draft (2026-04-15) — Require json based entrypoints for external class integration ( 86dc4383 ).

  • 0.3.0-draft (2026-04-10) — Consolidate specs ( 80ca313f ).

  • 0.2.3-draft (2026-04-07) — Custom element spec ( 4f377be3 ).

  • 0.2.2-draft (2026-04-06) — Server-side timing (scaffolding) ( 23932590 ).

  • 0.2.1-draft (2026-04-06) — Transition to vue reactivity ( 70cb8445 ).

  • 0.2.0-draft (2026-04-06) — Pure js in defs and strings ( 6494999d ).

  • 0.1.3-draft (2026-04-06) — External/md parser ( 5161ec0e ).

  • 0.1.2-draft (2026-04-04) — Declarative media breakpoints ( 3142b64e ).

  • 0.1.1-draft (2026-04-04) — Rebrand as JSONsx ( 0daa94f7 ).

  • 0.1.0-draft (2026-04-04) — Init ( a93852ac ).

standards.md

  • 0.1.19-draft (2026-09-29) — Census against the code: §2.1 and §2.2 marked Partial for the catalog's issuing bodies outside the recognized eight, §5.2 marked Partial for the canonical-URL patterns that admit a second spelling or skip a body entirely, and §5.3 marked Partial because nothing stops a numbering body's document from taking a title-cased identifier or two catalog entries from sharing a URL.

  • 0.1.18-draft (2026-09-14) — §9.2 the standards page is a gitignored build output the site writes before it builds, not a committed file diffed by docs .

  • 0.1.17-draft (2026-09-02) — §1 no longer links the deleted adoption plan.

  • 0.1.16-draft (2026-09-02) — §11: CSS Cascade Layers, Media Queries 5 and CSS Shadow Parts moved to ui.md §11.

  • 0.1.15-draft (2026-08-17) — §4.1: the Standards Alignment heading is matched tolerantly and a visual-editor escape is reported as heading-escaped.

  • 0.1.14-draft (2026-08-16) — §11 WebDriver BiDi leaves the adoption backlog — the pipeline speaks it, and studio-ui-guidelines.md §15 owns it.

  • 0.1.13-draft (2026-08-16) — §11 RFC 8414 leaves the adoption backlog — the flow it would configure now exists, and it is recorded Rejected in desktop.md for the reason that remains.

  • 0.1.12-draft (2026-08-16) — §12 declares the BCP 14 normative keywords for the whole corpus, gated by docs ; BCP 14 graduates off the backlog.

  • 0.1.11-draft (2026-08-16) — §4.4 worked examples use a reserved gap slug so an illustration cannot squat on a real gap id.

  • 0.1.10-draft (2026-08-16) — §1 is Implemented — both ratchets are empty; BCP 14 moves to the backlog, since no section declares the corpus's keyword convention.

  • 0.1.9-draft (2026-08-16) — Service Workers graduates to a bound row in site-architecture.md §14.6.

  • 0.1.8-draft (2026-08-16) — CSS Shadow Parts backlog entry now waits on part attributes, not on shadow roots.

  • 0.1.7-draft (2026-08-16) — Retarget the CSS Shadow Parts backlog entry at spec.md §16.6, which now owns the shadow-DOM question.

  • 0.1.6-draft (2026-08-15) — Web App Manifest, RFC 9116 and RFC 8615 graduate to bound rows in site-architecture.md §14.5.

  • 0.1.5-draft (2026-08-15) — UAX #9 and UTS #35 graduate to bound rows in site-architecture.md §13.4.

  • 0.1.4-draft (2026-08-15) — RFC 4287, JSON Feed 1.1 and RFC 5005 graduate to bound rows in site-architecture.md §6.7.

  • 0.1.3-draft (2026-08-15) — Three backlog entries graduate to bound rows in site-architecture.md §14.3 (HSTS, Referrer-Policy, Permissions-Policy).

  • 0.1.2-draft (2026-08-15) — Add §11 Adoption Backlog: standards whose owning section does not exist yet, each naming the spec that will own it.

  • 0.1.1-draft (2026-08-15) — A Subset may name a gap for the half it omits; a non-standard is prose rather than a Rejected row.

  • 0.1.0-draft (2026-08-14) — Initial specification: the conformance vocabulary, the ## N. Standards Alignment table contract, citation and canonical-URL rules, gap tiers derived from section status, and governance for declining a standard.

studio-ui-guidelines.md

  • 0.8.28-draft (2026-10-21) — The block action bar's step-aside rule no longer names the removed Document Header card, and §4.4's debounce status no longer cites its deleted panel module.

  • 0.8.27-draft (2026-10-21) — §12.5 names what is left of the second action list now that Source Control is the Publish workspace and its no-repository bypass is gone, and §12.3 finds the renamed Create GitHub repository button in Publish › Review changes.

  • 0.8.26-draft (2026-10-21) — §8.4 and §12.1 name the Command Bar's ⚙ Settings menu, which moved off the rail's foot.

  • 0.8.25-draft (2026-10-21) — The waits-on-a-person set loses content.newEntry and library.newEntry, and file.new is named as the record that projects by never awaiting its dialog.

  • 0.8.24-draft (2026-10-21) — §3.1: the pane's tab strip is drawn in Design and Content only, taken out of every cell by the tabs-hidden class in Media, Styles and Publish, whose context bar leads with a Back control instead.

  • 0.8.23-draft (2026-10-21) — The Inspector dock admits document-level tabs beside selection ones, and its Element tab's sub-switch ships as a control inside the tab's body; §3.1 states which parts of the per-workspace frame ship.

  • 0.8.22-draft (2026-10-21) — §3.1 draws the shell grid as it ships and the docks each workspace hides by an #app class, §3.2 gives each of the three docks its own anatomy with a three-tab Inspector, and §12.2 states that a tab's sub-switch and the workspace switcher are not dock tabs.

  • 0.8.21-draft (2026-10-16) — §4.4 status note: seo-modal and settings-head now share HEAD_EDIT_DEBOUNCE (300ms) from ui/timing.ts instead of each keeping a local EDIT_DEBOUNCE_MS; the delay is unchanged.

  • 0.8.20-draft (2026-10-06) — §3.1 The status bar's centre field is the breadcrumb trail, silenced in the live region; the 10px breadcrumb exception is gone (crumbs inherit the status bar's 11px).

  • 0.8.19-draft (2026-09-29) — §9.3 is Partial: the name-to-callback renderer registry in store.ts, and the callers that repaint it by name, have not yet retired in favour of effects over reactive state.

  • 0.8.18-draft (2026-09-29) — §13.3 is marked Partial: a failed project.json write from Settings is announced twice, once by its Problem and again by the section's own live region.

  • 0.8.17-draft (2026-09-29) — §9.4, §11, §12 and §13 carry their status markers in the canonical blockquote form, so §12 and §13 now read as Partial and §9.4 and §11 as Implemented on every page derived from the specs.

  • 0.8.16-draft (2026-09-29) — §1 names the shell redesign that preceded the kit instead of an unnamed plan.

  • 0.8.15-draft (2026-09-29) — Census against the code: the stale Partial markers on §8, §12 and §13 are closed, §11 and the non-drag subsection of §8.2 are corrected from Implemented to Partial, and twenty-five sections gain leading Partial markers where the text diverges from what ships or a part is unbuilt.

  • 0.8.14-draft (2026-09-29) — §4.6 binds every dock's rows, including the Navigator's; a row's leading icon and its text form one group so the icon is never orphaned.

  • 0.8.13-draft (2026-09-29) — §10: a form's commit pair is drawn only while there is something to commit.

  • 0.8.12-draft (2026-09-29) — §8.8: chrome text is not selectable; the root sets user-select none, a modal dialog restates it against the UA rule, and only named content parts opt back in.

  • 0.8.11-draft (2026-09-29) — §8.8: the boot refusal's diagnostics are selectable, and the criterion is content against interface rather than the absence of a Copy button.

  • 0.8.10-draft (2026-09-29) — §8.7: a sheet with a section list claims initial focus for the section it opened on, not the platform's first focusable.

  • 0.8.9-draft (2026-09-29) — §10: a surface names its own refusal failure or section-error, never error, because the kit's fields keep a permanent [part=error] in the same light-DOM tree.

  • 0.8.8-draft (2026-09-18) — The tab strip and the pane grid's right-edge zone are pragmatic drag targets too; Split Right and Open to the Side are their non-drag equivalents.

  • 0.8.7-draft (2026-09-14) — §12.4 a surface runs a command through runReported, which files a synchronous refusal and a later rejection alike in Problems under the surface's name, and a crash also reaches the console.

  • 0.8.6-draft (2026-09-13) — §12.4 the agent's tool IS the command: the projection contract, the four deletion rules and the three review rules; the argument corollary names the schema coercion; §12.2 gains the assistant tool cap.

  • 0.8.5-draft (2026-09-11) — §8.4: a menu opened from a named opener with no coordinates is hung below it by anchor positioning; origin, place and floor keep their coordinates.

  • 0.8.4-draft (2026-09-11) — §9.3: a saved kit component reaches every live canvas frame at the file's URL under the project and renders every pane; measured in Chrome.

  • 0.8.3-draft (2026-09-11) — §9.3 records the live chrome lane: a saved surface or kit component re-mounts the roots it draws in the shell, keyed on the path under packages/studio or packages/ui, and names the canvas half that waits on the frame seeding the kit's modules.

  • 0.8.2-draft (2026-09-10) — Both Studio trees are jx-tree: the role, the counts, the roving tab stop and the arrow keys are the element's, and the two hand-written copies of that contract are gone; §8.2's drop highlight is named as the element's data-drop.

  • 0.8.1-draft (2026-09-10) — The bound on surviving lit templates is a gate (LIT_TEMPLATE_AUTHORS) rather than prose (§9.3).

  • 0.8.0-draft (2026-09-10) — Adobe Spectrum is removed: one element family, styles/spectrum.css re-homed into the token source, and the inventory in 6.1 replaced by a ban with an empty allow-list.

  • 0.7.0-draft (2026-09-10) — Studio owns no custom elements: §6.2 graduates as the last LitElement (jx-value-selector) is deleted with its two retired callers, and the checklist item that governed them names the kit instead.

  • 0.6.1-draft (2026-09-10) — showDialog and its slot helper are gone: Open Project's three-way question was never bespoke and calls openDialogSurface, so the last lit dialog body converted; the empty-state pattern is one spec with two renderers and no class of its own; the inspector row vocabulary drops .style-row/.field-row with ui/field-row.ts.

  • 0.6.0-draft (2026-09-10) — renderPopover is gone: the tab strip's overflow list and context/tab menu are projections handed to the kit menu, which leaves the lit popover helper with no caller and takes its row out of the layers API table.

  • 0.5.1-draft (2026-09-10) — The pane tab strip is a Jx document over jx-tabs; every strip in the shell now carries real tab semantics (gap ).

  • 0.5.0-draft (2026-09-10) — openModal and the hand-rolled Tab trap are deleted with their last caller; a persistent modal is a jx-dialog surface document (§8.7).

  • 0.4.21-draft (2026-09-10) — The dock tab strips carry real tab semantics; the pane strip waits on a slot in jx-tab (gap ).

  • 0.4.20-draft (2026-09-10) — The Files tree's per-row menu is the kit menu: the tree's own verbs and the declared context/file records in one list, and the hand-written viewport clamp gone with the sp-popover.

  • 0.4.19-draft (2026-09-09) — The migrated-surface list is the src/surfaces directory rather than an enumeration in the prose (§9.3).

  • 0.4.18-draft (2026-09-09) — the About dialog is a document: the pattern a converted surface follows, and the readiness trap it hit.

  • 0.4.17-draft (2026-09-09) — the shell frame is a Jx document, and mounting it is asynchronous because initShellRefs reads its cells on the next line.

  • 0.4.16-draft (2026-09-09) — the shell frame's stylesheet is generated from a style block; its markup waits because initShellRefs reads the hosts synchronously.

  • 0.4.15-draft (2026-09-09) — forced-colors.css is generated from a style block with its reasoning intact; the keyframes stay put and gain the duplicate-name gate.

  • 0.4.14-draft (2026-09-09) — tokens.css is a build output generated from tokens.json, and stays a linked stylesheet because everything in it is pre-paint.

  • 0.4.13-draft (2026-09-09) — the styling gate reads a surface document's style object and the classes it names, so a converted surface cannot leave the rules behind.

  • 0.4.12-draft (2026-09-08) — the prompt's format choice is jx-select, and its projection names the chosen value rather than marking a row.

  • 0.4.11-draft (2026-09-08) — the prompt's format select is a named defect rather than a pending promise: jx-select has landed and that control carries both spellings ui.md forbids.

  • 0.4.10-draft (2026-09-02) — A surface that rewrites what the reader typed must make the rewrite visible to the binding.

  • 0.4.9-draft (2026-09-02) — The command palette is a Jx document projected by panels/quick-search.ts (§9.3).

  • 0.4.8-draft (2026-09-02) — The toast stack is a Jx document projected by ui/layers.ts (§9.3).

  • 0.4.7-draft (2026-09-02) — The confirm, save-or-discard and prompt dialogs are a Jx document over jx-dialog, opened modally on the native substrate (§8.7, §9.3).

  • 0.4.6-draft (2026-09-02) — The Command Bar is a Jx document: surfaces/commandbar.json over the registry's projections, with the Studio menu on the menu surface (§9.3).

  • 0.4.5-draft (2026-09-02) — The Start pane is a surface: the first whole pane as a document (§9.3).

  • 0.4.4-draft (2026-09-02) — The status bar is a surface: three projected fields, buttons where an item names a command (§9.3).

  • 0.4.3-draft (2026-09-02) — The Navigator rail is a surface: stacked jx-action-buttons held by the shell, the gear a menu button, panel icons as kit glyph names (§9.3).

  • 0.4.2-draft (2026-09-02) — The rail's Settings menu is the second surface on the menu document: sections as a child jx-menu, live rows through a reactive scope, the rail's bottom as the stack's floor (§8.4, §9.3).

  • 0.4.1-draft (2026-09-02) — The element context menu is the first surface built as a Jx document: surfaces/menu.json over a jx-menu, mounted through a popover layer slot (§8.4, §9.3).

  • 0.4.0-draft (2026-09-02) — The chrome moves to the Jx UI kit: §1 foundation and the recorded reversal, §1.1 aliases of kit tokens, §6 target, §8.4 and §8.7 native overlays, §9.3 surfaces as documents, §9.4 document conventions, §10 checklist.

  • 0.3.16 (2026-08-27) — showPromptDialog carries an optional choice control beside its field.

  • 0.3.15 (2026-08-26) — §8.4 becomes Menus: menu-button triggers, submenus and the APG deviation; §12.1 gains the settings/menu placement.

  • 0.3.14 (2026-08-22) — Template conventions (9.4) and the gate behind them; render orchestration described as it is; custom components corrected to the two that exist.

  • 0.3.13 (2026-08-21) — Chrome ships two themes; a theme in CHROME_THEMES must have its Spectrum colour fragment registered, and the semantic token table documents the dark fallbacks with the light ramp resolved from the brand fragment.

  • 0.3.12 (2026-08-16) — §15 the documentation screenshot pipeline drives Chromium over WebDriver BiDi rather than CDP — byte-identical captures, and the one behavioural difference (a pointer move outside the viewport) fixed rather than worked around.

  • 0.3.11 (2026-08-16) — §14 ATAG is Subset: Part A is §13.1a and §8.2, Part B is studio.md §16.6.

  • 0.3.10 (2026-08-16) — §1.1 the token table's fallbacks are corrected and gated against tokens.css; §8.2 cut/paste is the stated alternative to every drag (SC 2.5.7); §13.1a one live region, called from notify() itself, so a failure that lands in the Problems panel is announced.

  • 0.3.9 (2026-08-15) — Add §14 Standards Alignment; §8 marked Partial — drag and drop has no non-dragging alternative (WCAG 2.2 SC 2.5.7).

  • 0.3.8 (2026-08-13) — A row wraps and never overflows (§4.6); the floating bar's visibility rule.

  • 0.3.7 (2026-08-12) — blockbar/format joins the level × placement matrix, with its own chrome budget.

  • 0.3.6 (2026-08-10) — §12.4 the agent counts as a surface — an assistant tool that writes what a command writes binds to the command's rule by reading the same CommandContext, not by recomputing it; the element-tree writers move to a document-tree tier gated on the registry's own editor.kind.

  • 0.3.5 (2026-08-10) — §12 a command family over one surface declares ONE availability rule — six families disagreed with themselves, and in each the loose member was the one that wrote: git.createGithubRepository created a remote repository where its disabled peer git.push would not, publish.deploy pushed on a host with no Cloudflare API, the Outline's movers and the element menu's mutating rows spliced elements into project.json where Delete was correctly refused, view.setActivity persisted a gated-off panel, and the inspector.focus chords half-applied.

  • 0.3.4 (2026-08-05) — §9.2 history covers project documents — a settings mistake undoes like a document mistake, and a failed write leaves no entry.

  • 0.3.3 (2026-08-05) — §8.1 corrects where accumulate is authored — the canvas toggles a node into the selection too; only the marquee is absent.

  • 0.3.2 (2026-08-04) — §4.2 the set dot is the provenance chip's set-here state, in four states with the donor named; §8.1 selection is a list, with the anchor/primary rule and the one-transaction requirement.

  • 0.3.1 (2026-08-04) — §13 Notification Tiers — choosing a tier by the action required, the rendering rules, and the four rules that keep feedback from becoming a fourth surface.

  • 0.3.0 (2026-08-02) — Empty States and Copy (§11); Command and Menu Rendering Rules incl. the level × placement matrix (§12).

  • 0.2.3 (2026-08-02) — One teaching empty-state pattern (new §11); focus-visible rings replace bare outline ; settings writes surface failure at the control.

  • 0.2.2 (2026-08-02) — openModal shares showDialog's focus machinery: role/label at the wrapper, focus trap, focus restore, centralised Escape (§8.7).

  • 0.2.1 (2026-07-28) — Drag-and-drop conventions for external OS file drags (§8.2): copy dropEffect, the Files-type guard, tree highlights, and the canvas replace-vs-insert affordance.

  • 0.2.0 (2026-07-26) — Canvas caret replaces the inline-edit session (§8.3); click selects and places the caret (§8.1); canvas drags start only from the bar handle (§8.2); single-shape action bar (§8.6).

  • 0.1.8 (2026-07-26) — Modal surfaces own the keyboard: showDialog focus handoff, Escape dismissal, and the isModalOpen() shortcut gate (§8.7).

  • 0.1.7 (2026-07-26) — Dialogs and overlay layers (§8.7): the ui/layers.ts contract, showPromptDialog as the replacement for window.prompt(), and a ban on native browser dialogs.

  • 0.1.6 (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.5 (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.4 (2026-07-17) — Color-scheme canvas preview — Auto/Light/Dark tab-bar control ( ccdc1d3e ).

  • 0.1.3 (2026-06-01) — Convert to typescript ( e352e265 ).

  • 0.1.2 (2026-04-22) — External web component support ( a9d0fbe4 ).

  • 0.1.1 (2026-04-22) — Init new site ( f33d319b ).

  • 0.1.0 (2026-04-18) — Ui guidelines ( 91f2b29e ).

studio.md

  • 0.15.1-draft (2026-10-23) — §6.2: the size and colour-scheme choices are segmented groups on the pane context bar's Context axis; the language, feature queries, layout switch and Manage contexts stay in a More rendering context popover whose label names only what is set away from rest.

  • 0.15.0-draft (2026-10-23) — §3: Diff is an implicit mode, entered from Publish's changed files or version history and left by Back; the Editor axis never offers it and canvas.setMode no longer accepts git-diff.

  • 0.14.2-draft (2026-10-23) — §7.1 and §22.7: the switch between the project.json tab's Elements, Variables and Code views is named as the pane context bar's Editor switch, a segmented group at the bar's leading end rather than a dropdown.

  • 0.14.1-draft (2026-10-23) — §5.7, §7.2: an image a component preview or a Project Styles specimen has no source for is drawn as a neutral placeholder rather than hidden or broken; document previews still hide an empty image.

  • 0.14.0-draft (2026-10-23) — §5.7, §7.2: component previews and Project Styles cards use only the definition's declared examples, and Templates rows show no usage count, so neither panel asks the reference index once per item.

  • 0.13.53-draft (2026-10-21) — §22.5: a file-backed collection's records are counted by the Site panel from the file, dated by their own date field in the Calendar, and opened in the file's grid on the record's own row; the form-only entry editor is the fallback for JSON entry files.

  • 0.13.52-draft (2026-10-21) — §22.1–§22.3 ship: five workspaces with view.setWorkspace and the workspace.focus.* chord records on ⌘1–⌘5, derived tab ownership with a strip filter every pane follows, a Command Bar switcher with the Publish count and the ⚙ Settings menu, and per-workspace frames applied on every entry; §3.1, §5.1, §9.1.2, §14.8 and §17 drop the named layouts and the rail foot.

  • 0.13.51-draft (2026-10-21) — Site panel and Content Pages name a locale folder's page with its locale (Home (ar)) and list only files the build routes; component previews render in an inert shadow root; a canvas drop selects the dropped node and a dropped image carries no alt; a page has one Description bound where the build reads it; the pin is drawn only on the current or a pinned chip; command records gain order.

  • 0.13.50-draft (2026-10-21) — §22.6 Media workspace ships its library (filters, lazy Unused, search, sort, keyboard grid, detail pane with Replace and Delete) and its pick dialog; §9.3 public/media/ default, Replace and one picker are Implemented; §5.7 Site panel media scans collections' images/; media.browse, media.upload, media.replace and media.delete (destructive) are records; a replacement must keep its format, the pick dialog uploads where its field's document does, media surfaces upload only listed kinds, and Unused is re-asked when usages are invalidated.

  • 0.13.49-draft (2026-10-21) — §6: the Page tab shows a page's URL as a readout and Edit template on the Layout row, and a component's tab draws no page form but points at its root's tag and props. §22.1: Media and Publish keep their home tab beside another of their tabs. §22.5: nested layouts are drawn on the canvas. §22.8: a project inside another repository's ignored folder is not a repository.

  • 0.13.48-draft (2026-10-21) — §22.8 the Review changes checks are marked by kit-manifest icons whose accessible name states each check's state in words, not by text glyphs.

  • 0.13.47-draft (2026-10-21) — The Publish workspace ships: Review changes, Deploys, Branches and Hosting replace the Source Control panel, quick publish opens from the chevron beside the Publish tab, and capability.publish joins the context keys. A change is included the first time Review changes shows it, Send for review is refused on the default branch of a host whose commits land live, Deploys words each deployment's state and re-reads after a deploy, and the Hosting source policy is Pending.

  • 0.13.46-draft (2026-10-21) — The Content home titles an entry by its title-like field, lists the collection's own fields as Table columns and groups its Board by a shared field.

  • 0.13.45-draft (2026-10-21) — §7.2 component cards in Project Styles are drawn with the Site panel preview's sample props or list row, or the placeholder box, never a bare instance that throws.

  • 0.13.44-draft (2026-10-21) — §7.1 the Variables view states its save rule with undo as the named exception; §7.4 a tag rule shows what it inherits from body and its ancestor tags; §22.7 the selected tag is the address in the Command Bar, Inspector header and status bar, and a tree pick outlines its specimen.

  • 0.13.43-draft (2026-10-21) — §4.1: the canvas injects $site and $page through injectContext, draws a component's bound props live (a repeater's template with its first item), resolves extension classes and npm: sidecars as the build does; §5.7: previews render with the project's stylesheet and sample props; §14.8: the restored active document is activated; §20.2: $page.locale follows the route.

  • 0.13.42-draft (2026-10-21) — A file-backed collection is listed by its records and owned by Content; an entry's page URL honours $paths.field; a component's import shares its insert's undo step; a block dropped on a paragraph lands beside it.

  • 0.13.41-draft (2026-10-21) — §22 Workspaces (new): five workspaces (Design, Content, Media, Styles, Publish) replace the named layouts, with a Command Bar switcher, derived tab ownership and a frame per workspace; §3.1, §5.1, §5.5, §5.7 Site Panel (new), §6 Page · Element · Assistant, §7.1 Styles workspace and Variables view, §9.1.1 Add new, §9.1.2 Library becomes Content, §9.3 public/media default, Replace and one picker, and §17.1 Project Settings as a dialog are rewritten to the target state, each marked Pending or Partial.

  • 0.13.40-draft (2026-10-21) — §7.1, §22.7: the Styles workspace ships with three views of project.json, Elements (stylebook), Variables (tokens, the CSS custom-property editor moved out of Project Settings, its rows named by their real --names) and Code; styles.open is a scripted alias of view.setWorkspace with an optional view, not a palette row; the Outline follows the view and points the Variables view at a property; the Variables view states that its edits save as they are made and that an undo waits for Save; the Style tab beside it says where the work is; §17.1's Moved footnote opens the Variables view.

  • 0.13.39-draft (2026-10-21) — The Design workspace ships: the Site panel lists pages by route, templates, components and media; the rail holds Site, Outline and Data with Files and Packages behind Show developer panels; the Inspector is Page, Element and Assistant with a contextual Page title, Element's Content, Style and Logic switch and a selection-driven switch; and component insertion imports the component from every door, a package component included. The Site panel lists installed packages' components after the project's, and the Page tab's header names the document.

  • 0.13.38-draft (2026-10-21) — The Site panel's Media section is a strip of eight with Show all N in Media; a $paths.values page reading one entry by its route parameter is its collection's page; the Unused sweep stops when no library shows the filter.

  • 0.13.37-draft (2026-10-21) — §17.1: Project Settings opens as a dialog over every workspace, its nav grouped into General, Integrations and Advanced with a Moved footnote; the settings editor of the project.json tab is deleted, and Raw JSON's Edit as code opens the source editor in Styles. The Integrations and Advanced groups open the body with an intro sentence, the Moved footnote's Page tab row also shows the Inspector's Page tab, document undo is stated as unavailable inside the modal dialog, and §7.1 and §22.8 say the CSS Variables editor and the adapter picker have left Settings without a host yet.

  • 0.13.36-draft (2026-10-21) — §4.2: Edit draws no Document Header card; a document's settings (title, URL, layout, frontmatter, description, Search appearance) live only in the Inspector's Page tab, the fold preference is dropped on boot, and the writing banner over an entry is the one band Edit draws (§4.4, §6, §18, §22.5 follow); §6: a Markdown page's Layout picker writes its frontmatter $layout , which the canvas redraws at once and undo reverts as one step; the Entry tab carries the same door to Search appearance a page's tab does.

  • 0.13.35-draft (2026-10-21) — §22.6 media search matches names, the detail pane follows the grid, an upload is revealed, a delete prunes an emptied upload folder and SVG sizes come from the file; §9.3 the compact picker's Show N more and a scan that skips absent roots; §22.1 a Navigator-less stage falls back to its home; PAL deleteFile removes an empty folder.

  • 0.13.34-draft (2026-10-21) — §9.1.2, §22.3 and §22.5: the Content workspace ships, with the Collections panel, a per-collection Content home (views that name entries by title, status and date, and Edit in grid) and its header line, entries written on the canvas inside their template's layout under a writing-mode banner, and the Entry tab; library.* and the manage editor kind are deleted (the automation state's editor.kind loses library and gains home , the kind of every workspace home), and §3.1, §6, §9.1.1, §9.1.2 and §22.3 are Implemented.

  • 0.13.33-draft (2026-10-21) — §20.2 every artboard draws in its pane's rendering language from its first paint: the render message carries the language and its direction, a pane with no choice draws in the document's own language (a page's or a collection entry's), and a stored tag the project no longer declares falls back to it.

  • 0.13.32-draft (2026-10-21) — Tab strips are drawn in the Design and Content workspaces only (§22.3, §14.4): Media, Styles and Publish draw their home alone, and a view opened beside the home (a media viewer, a comparison, project.json as Code) is left through the pane context bar's Back to control or Escape (pane.backToHome), a close there landing on the home; the Styles workspace's Navigator is the new Styles panel (§7.3), listing the CSS custom properties first by group with counts and swatches, then the element defaults by tag name, then the color schemes, and the workspace opens on the Variables view and remembers the last of Variables and Elements for the session (§7.1, §22.7). Escape leaves a viewer or a comparison but stands down in the code editor, a text field and an open popover, and is never forwarded by a canvas frame; Back returns the keyboard to what opened the view, and a strip-less pane holds its home and one view (a new viewer replaces the last). A derived pane keeps its chip row, and its Close Side Pane, in every workspace, and closing it keeps the workspace. Styles' Inspector is drawn only beside the Elements view (§22.3, §22.7), and an element picked from the Variables view is panned to once the Elements canvas renders.

  • 0.13.31-draft (2026-10-21) — §22.8: Review changes lists untracked files one by one and groups them by site area (Pages, each collection, Components, Layouts, Styles, Media, Other); Deploys and Hosting read the production URL from the host, else project.json url, and offer Deploy and the dashboard only once a provider is connected.

  • 0.13.30-draft (2026-10-21) — §16.2 a pathless tab names itself in the jump bar and the Stylebook rule is stated only while the Stylebook is focused; §17.1 a menu-opened Settings dialog returns focus to the gear and a section may carry its own intro; §22.1 a home tab draws no Context axis or preset menu; §22.3 no project open never shows a workspace-only Navigator panel.

  • 0.13.29-draft (2026-10-21) — Add new ships: one dialog creates pages, collections, templates, components, entries and uploads through file.new, with a pure derivation, the shared New File name rules and one custom element name validator; library.newEntry and content.newEntry are removed.

  • 0.13.28-draft (2026-10-21) — §9.1.1 Add new asks for a language in an i18n project (Page, Entry of a localized collection) and localizes a new Collection by default; §5.7 and §22.5 pick the template page per language and nest every page of a collection under its row.

  • 0.13.27-draft (2026-10-21) — §17.1: the settings dialog and its editor are built once per session and kept closed between opens; a reopen redraws the current section in the same frame, into a fresh section container so no form state or save error survives a close.

  • 0.13.26-draft (2026-10-21) — §5.7 component cards are named in words and drawn at half size on the light document surface; §6 the Entry tab titles fields in words and types a date field in a date input; §7.2 Project Styles draws one artboard at the active breakpoint; §22.5 the Content scan walks every directory collection source (beside the project, or declared after it opened), a missing source is empty, a declared format lists only its own files, a stale scan is discarded, a save restates its entry's row, and the Pages Table reads Title, URL, Template, Status, Language and Edited in route order.

  • 0.13.25-draft (2026-10-21) — §22.5: a CSV record opens in the form-only entry editor over its row of the file's grid; Board groups a list field by each value, never by a number or date, and a Filter narrows to one of its values; the Table draws a declared Date once, Locale only for several languages, and floors its column widths; Cards show an entry's schema picture; collections are named in words with a sensible item; a multilingual collection's entries list states each entry's language and keeps to the view's, the header names every language's page, and an entry its $paths.values page does not list has no URL. §9.1.1: a page starts in its language's layout, a localized collection gets a template page per language. §5.7: the Templates count refreshes when usages are dropped.

  • 0.13.24-draft (2026-10-21) — The desktop platform is described as the Electron application over a Bun backend, and the RPC and deferred canvas URL notes no longer name ElectroBun.

  • 0.13.23-draft (2026-10-17) — Outline rows name a node by its own identity and never a descendant's text (§5.2); the canvas injects $site, $page and project state for a page through injectContext (§3.6, §4.1).

  • 0.13.22-draft (2026-10-17) — Edit and Design render bindings live, except a bound textContent, a repeater-row binding and a $switch expression (§4.1).

  • 0.13.21-draft (2026-10-11) — §4.3: every zoom holds a point still (cursor for the wheel, stage middle for buttons and chords; Edit re-measures the hovered element after reflow). §4.4: the Block Action Bar rests on the element box, not the caret. §5.1: Library button in the rail foot above Settings. §7.2/§7.4: the link specimen keeps its href, and the state menu offers the tag's own states. §9.1.2: five doors to the Library; previews draw placeholders for images that cannot load. §10: Save is enabled only while the document is dirty.

  • 0.13.20-draft (2026-10-06) — §6.2 the button-group row is a single-select radiogroup whose buttons bind checked and never toggle, so the document is the only writer of the drawn choice.

  • 0.13.19-draft (2026-10-06) — §16.2 The status bar's DOCUMENT field is now the jump bar: a breadcrumb trail of the focused pane's address (file › ancestors › element), every step a button, replacing the path, view and save readouts; §18.3 pane cells no longer draw a per-pane jump bar.

  • 0.13.18-draft (2026-10-06) — §11.1 Bundle Layout: the repo dev server moved from the root server.js to scripts/dev.ts.

  • 0.13.17-draft (2026-10-04) — §3.4 a listing entry may carry an opaque content version; repo-space media a listing vouched for is requested with a ?v= query naming that version, the version map is forgotten on every file event before the echo filter and on Studio's own mutations, a listing begun before a forget cannot restore it, a gap in the event stream (a reconnect, or the stream's first open) forgets every version at once and ignores listings begun before it, an authored v (matched by its decoded name) is replaced when Studio appends a version and left untouched otherwise, a host may answer a versioned URL immutably only when v is a version it issued and it returns exactly the bytes that version names, the Library's document previews use the map too, and the canvas iframe receives the media versions as one assetVersions message rather than on every render. §9.2 a new "open" resync reason forgets the content versions and re-lists the loaded tree.

  • 0.13.16-draft (2026-10-04) — §9.2 a file-event resync: a reconnect drops the derived caches and re-reads the .gitignore rules, every loaded listing and the clean non-collab open tabs that hold a parsed document (left untouched when unchanged, and never over an edit made during the read); a listing overtaken by a newer change is read again rather than applied; a commit re-lists the loaded directories.

  • 0.13.15-draft (2026-10-04) — §15 Preferences Accounts draws rows the platform adds, with the actions it offers, re-read on every open.

  • 0.13.14-draft (2026-10-01) — §11.1: the release build's entry passes define process.env.NODE_ENV as production, dropping the development build of @vue/reactivity from both entries.

  • 0.13.13-draft (2026-10-01) — §11.1 and §11.2: the release build records the editor entry's static import closure as preload in dist/manifest.json, studioPreload() reads it back, and studioShellHtml({ preload }) emits opt-in modulepreload hints; the no-options document is unchanged. The dev server rewrites the manifest without preload at startup, so a watcher-rebuilt checkout yields no stale hints, and studioPreload drops entries that are not on disk.

  • 0.13.12-draft (2026-10-01) — §11.1: release bundles and the Monaco workers are minified with linked source maps; the dev watcher is not, and a survey of the unminified bundle, not the keepNames flag Bun 1.4.2 ignores, is what makes renaming safe. The worker maps, like the chunks', stay out of the npm tarball: package.json publishes dist/workers/*.js, and check-studio-package.ts fails a files entry that would publish a dist/ source map.

  • 0.13.11-draft (2026-10-01) — §4.2: the Document Header card folds to its bar; folded or open is per document, and the reader's last choice persists as the default for every document opened after it.

  • 0.13.10-draft (2026-09-29) — Citations of the deleted Studio redesign plan now name the section that holds each rule: Contexts is §17.1, idempotence is §13.5, the shot contract is scripts/screenshots/README.md, and the Bottom dock is §16.3; cross-spec citations name their spec.

  • 0.13.9-draft (2026-09-29) — §11.2 carries its status marker in the canonical form, so the section reads as Implemented to every page derived from the specs.

  • 0.13.8-draft (2026-09-29) — §9.1.1 cites the findReferences PAL member in desktop.md §3.1 alone, no longer a deleted plan document.

  • 0.13.7-draft (2026-09-29) — Census against the code: twenty sections newly marked Partial where the code diverges or is unbuilt, §6.8, §13, §15 and §20.2 made specific, §6.5's three stale cells corrected, §20 closed onto §20.2, and the §12 feature-status ledger retired onto the sections that specify each feature. §4.1, §6.4 and §8.1 gain Partial markers for the canvas that injects no page context, the desktop app that runs no code services, and the format registry built from extensions rather than imports, and §3.6 names the missing page context.

  • 0.13.6-draft (2026-09-29) — §6.2 names the button-group input and its glyph source; §13.5 names css-meta $icons as a manifest key held by the metadata test.

  • 0.13.5-draft (2026-09-29) — §5.1: a panel record may declare a short railLabel for its rail button; Source Control's is Source, and its title stays the header, the accessible name and the tooltip.

  • 0.13.4-draft (2026-09-29) — §21.3: the code half of a comparison draws no zoom pod.

  • 0.13.3-draft (2026-09-29) — §5.5: the sync bar and the Active branch row are wrapping rows; the remote verbs and the branch picker take a line of their own whenever the status cannot share one, which at the Navigator's default width they already do, and the layout list names the rows and sub-tabs the panel actually draws.

  • 0.13.2-draft (2026-09-29) — §4.2: the Document Header card is Edit-only and docks above the page's scroller at the pane's width; Design and lenses draw none.

  • 0.13.1-draft (2026-09-29) — §15: a credentials form offers Save and Cancel only while its drafts differ from what is stored, and an untouched draft follows the store.

  • 0.13.0-draft (2026-09-29) — §3.4 pickDirectory resolves null only for a cancel and a rejection is shown under Location on every platform; §11.2 a non-empty boot writes the jx-boot marker, which turns the dev-server default off so an unregistered launcher boots into the failure state.

  • 0.12.5-draft (2026-09-29) — §9.4 the layout-preserving JSON serializer lives in @jxsuite/schema/json-layout, so any host writes a document the way Studio does.

  • 0.12.4-draft (2026-09-22) — The Assistant tab binds its surface document on first show; the panel machinery mounts at boot — pending prompts queued before the bind project when the body first appears.

  • 0.12.3-draft (2026-09-18) — Tabs move between panes by drag, by ⌘\ or by Open to the Side; drill-in and Open to the Side focus the pane they open into.

  • 0.12.2-draft (2026-09-14) — §13.1 open_document and set_canvas_mode are projections of document.open and canvas.setMode, and a record whose required argument's derived enum is empty is withheld from the round.

  • 0.12.1-draft (2026-09-14) — §17.2 a project.json the assistant writes is adopted together with its text, so the layout record and the top-level key order the next settings commit uses are the file's as written.

  • 0.12.0-draft (2026-09-13) — aiTool is a complete projection: declaring it makes a tool, report is required, coerceArgs runs in registry.run for every caller, an idempotent run answers wrote: [] (§13.1, §13.5); the Languages panel addresses a row by path (§20.4).

  • 0.11.5-draft (2026-09-13) — §9.4 a JSON document is saved in the layout its file was read in — inline objects, blank lines and escapes preserved by pointer, arrays and everything else laid out as the formatter would, the print width measured in display columns; §17.2's settings commit goes through the same serializer with the file's record, so an edit is a one-line diff, and §17 is Implemented (#308).

  • 0.11.4-draft (2026-09-13) — §4.1 the canvas site-style sheet emits selector-keyed blocks (element, list, class) unscoped and the color-scheme hint triplet, byte-for-byte what jx build writes from project.json#/style; it used to drop element-selector rules (#296).

  • 0.11.3-draft (2026-09-12) — The Style tab's font row is a jx-combobox whose rows are their own specimens over the project's font tokens (site and document) and the unminted presets, minting on the commit only; the typography keyword rows draw each value as itself in the element's own face; the colour chip is handed the literal behind a token.

  • 0.11.2-draft (2026-09-11) — §7.1 no longer claims a token picker on every Style field; the dual-mode row is the unit and font rows only, and the keyword rows are jx-combobox (§7.1, §6).

  • 0.11.1-draft (2026-09-10) — 9.1.1 a refused file-tree drop is refused rather than delegated to the project root: the innermost target decides, one shared predicate answers the affordance and the monitor, and a directory may not be moved into its own descendant.

  • 0.11.0-draft (2026-09-10) — Adobe Spectrum is removed: the dependency row goes, the colour picker is jx-color-field, the dual-mode row is a composition rather than a class, and check-icons keeps one of its two element rules.

  • 0.10.19-draft (2026-09-10) — The Props widget's enum control is jx-select and the Logic tab's event name is the kit menu plus the prompt dialog; both named jx-value-selector, which no surface had rendered since its callers converted.

  • 0.10.18-draft (2026-09-10) — The pane tab strip is a real tablist: one stop in the tab order, arrows with wrap, Home and End, Delete closing a document, and its three marks as slots on jx-tab (§14.4).

  • 0.10.17-draft (2026-09-09) — The Logic tab's read-only CSS Properties list is drawn by surfaces/logic-panel.json; renderStaticKvRow is gone (§16.5).

  • 0.10.16-draft (2026-09-02) — the overlay lints take a custom-element scope (16.6); the canvas de-link reaches a stamped instance's own internals (4.2.2).

  • 0.10.15-draft (2026-09-02) — the canvas UA-substitute overlay rules are installed wherever the de-link runs, not only in design/edit.

  • 0.10.14-draft (2026-09-02) — a canvas invoker command aimed at the other kind of overlay is ignored, not thrown (§4.2.3).

  • 0.10.13-draft (2026-09-02) — 16.6 a Problems key is per finding, so several defects of one rule on one node are several rows.

  • 0.10.12-draft (2026-09-02) — [inert] is transposed to [data-jx-inert] with the attribute rename, so an author's inert rule still applies on the canvas (§4.2.3).

  • 0.10.11-draft (2026-09-02) — the canvas [open] transpose follows the selector's subject, not the styled element.

  • 0.10.10-draft (2026-09-02) — a hide invoker closes its own target, not whichever popover is open (4.2.2, 4.2.3).

  • 0.10.9-draft (2026-09-02) — A selection move fires the reveal rule, and an explicit close stays closed: the rule must not observe the open state it writes (§4.2.2).

  • 0.10.8-draft (2026-09-02) — Dialogs, invoker commands and inert on the canvas: de-linked on stamped nodes, one open dialog per tab, canvas.setDialogOpen and the commandTargetClick report (§4.2.3).

  • 0.10.7-draft (2026-09-02) — §1, §2 self-hosting and §11 name the UI kit; §11.2 states the shell's unsafe-eval requirement.

  • 0.10.6-draft (2026-09-01) — Change review: node-level diff marks on both artboards, a change stepper, a code comparison for every changed file, and revalidation after a save.

  • 0.10.5-draft (2026-08-31) — the canvas de-popovers so an open popover lays out in place and grows the artboard (4.2.2); the selector axis is element-aware and choosing changes the rendering (6.2); a third document report checks popover correctness (16.6).

  • 0.10.4-draft (2026-08-31) — Edit's canvas column is drag-resizable, and the active breakpoint is derived from its width.

  • 0.10.3-draft (2026-08-30) — 15: a brokered credential row reads from the broker, and carries reconnect, account choice and a disconnect that reaches it.

  • 0.10.2-draft (2026-08-29) — A format declaring rewrite rather than serialize has its references repaired by the rename refactor, so it is no longer a reported remainder.

  • 0.10.1-draft (2026-08-28) — studioShellHtml() now links a favicon for hosts whose window chrome has no native icon of its own.

  • 0.10.0-draft (2026-08-27) — New File chooses a format rather than an extension (Other... preserves arbitrary names); a document converts between formats in place; creating in a collection source routes to New Entry.

  • 0.9.53-draft (2026-08-27) — A rename or drag-move whose refactor report names references it could not rewrite reports a warning, not a plain success; a drag-move invalidates the usage cache like its siblings.

  • 0.9.52-draft (2026-08-27) — Open in Browser previews the working tree through the runtime; Build Site keeps the compiler under its own verb.

  • 0.9.51-draft (2026-08-27) — a media file opens in a Media mode that shows it and says what uses it (§4.2, §9.3, §13.4); a long run's log is a feed that outlives the run (§6).

  • 0.9.50-draft (2026-08-26) — the gear's project rows disable rather than hide, and the menu is bottom-anchored to its trigger's region.

  • 0.9.49-draft (2026-08-26) — the rail foot is a Settings menu over both settings families; styles.open names the Project Styles editor.

  • 0.9.48-draft (2026-08-26) — buildSite may serve a live rendering of the working tree rather than build output; SiteBuildResult.mode says which.

  • 0.9.47-draft (2026-08-26) — 9.1.4 the Files tree hides what .gitignore masks — rules from every level, filtered where rows are built, a per-user toggle that defaults to hiding, and no .git/info/exclude or core.excludesFile.

  • 0.9.46-draft (2026-08-26) — the Assistant tab draws a running import and the agent's questions (§6).

  • 0.9.45-draft (2026-08-25) — Preferences §15: a blank field never deletes, a default is never a stored value, and every preference roams between windows.

  • 0.9.44-draft (2026-08-25) — Declare assetSpace: the canvas origin serves either the site URL space or repo paths under documentBaseUrl (§3.4/§4.1/§11.2); media resolves at render rather than by a document walk (§4.1); typed UploadResult and declared asset capabilities (§9.3).

  • 0.9.43-draft (2026-08-25) — §13.5 names all seven quiescence sources, and adds the grid: a table still building, or built but not yet showing its selection range, is not settled.

  • 0.9.42-draft (2026-08-24) — 8.2.6 refuses a prop delivered by any route the property bridge reads — a data-jx-props payload or a top-level key on the instance node, alongside the two attribute shapes — because $props is not the only place a value lives.

  • 0.9.41-draft (2026-08-24) — 8.2.6 refuses a prop delivered through attributes — the props.* JSON shorthand or a name colliding with a reflected DOM property — because reading $props alone reports it unset, and committing would leave two sources for one rendered value; and 8.2 re-enters a prop host after a $props patch rebuilds the instance.

  • 0.9.40-draft (2026-08-24) — 8.2.6 refuses a non-string prop for inline editing (the session commits textContent, so a number or boolean would be retyped) and states that a session which changes nothing writes nothing, with Escape a real cancel that also undoes an idle commit made during the session.

  • 0.9.39-draft (2026-08-24) — 8.2.1 records that a prop-bound host is classified before positions are resolved: it has no document path, so the unresolvable-position rule would otherwise reject every keystroke in it, and only the paragraph split and line break are prevented there.

  • 0.9.38-draft (2026-08-24) — 8.2 states that a component island covers the component's internals and never the document slotted into it: a child with a stamped path is re-opened, a nested instance stays frozen, and connectedCallback internals are never re-opened.

  • 0.9.37-draft (2026-08-22) — 11.2 Hosting the Studio: the asset manifest, the two layout modes, generated documents, the boot slot and the layering rule; 11.1 states the entry-rooted asset rule; 3.4's stale member names and file extensions corrected.

  • 0.9.36-draft (2026-08-21) — Preferences → Appearance states what the theme repaints: the chrome, the overlays and an open code view, with the canvas a light document in both.

  • 0.9.35-draft (2026-08-20) — Declare the Monaco editor feature set in monaco-setup (one register import per capability, and the measured caveat that 0.56.0's contrib graph does not yet honour the exclusions); drop the Monaco de-duplication plugin now that the first-party collab binding leaves one importer.

  • 0.9.34-draft (2026-08-19) — A stage with no pan/zoom surface leaves the wheel to the scroll container under it, and blocks ctrl/cmd+wheel page zoom instead of handing it to the browser.

  • 0.9.33-draft (2026-08-19) — §20.4: the parity grid keys on the document's $translationKey, so a localized slug is one row rather than two half-translated ones.

  • 0.9.32-draft (2026-08-19) — §20 Internationalization Surfaces — the locale reader, the rendering-language axis, the locale companion, the Languages parity panel and the Locales settings section; §18.4 gains the locale preset and its probe.

  • 0.9.31-draft (2026-08-19) — §13.5 lists the three behaviours ?automation=1 may change, and makes booting with an uninvited modal a refusal — an underlay swallows the viewport, so a dialog nobody scripted scrims the capture.

  • 0.9.30-draft (2026-08-18) — §15: the Keyboard sheet is no longer read-only — rebinding ships, Editor and Updates/About remain pending.

  • 0.9.29-draft (2026-08-18) — §16 and §19: the notify announcement ships — correct a marker and a WAI-ARIA note that both described the gap it closed.

  • 0.9.28-draft (2026-08-18) — §6.8: the From data… picker addresses only what it can list — nested paths and tokens holding a dot or slash are legal pointers it cannot author.

  • 0.9.27-draft (2026-08-16) — §16.6 reports about the author's own content — an ATAG Part B accessibility check and the SEO warnings both file Problems, each finding naming its WCAG criterion, and each run naming what it could not check. Closes gap .

  • 0.9.26-draft (2026-08-16) — §16 one Problem reader over every backend failure shape; gap closed.

  • 0.9.25-draft (2026-08-15) — Add §19 Standards Alignment; six bare Status: lines converted to the blockquote form no tool could read, and §16 marked Partial — the one status channel has no live region for the error tier.

  • 0.9.24-draft (2026-08-13) — Open in Browser serves the built site on its own origin; the build reports the URL.

  • 0.9.23-draft (2026-08-13) — Open in Browser opens the page's route on a server that serves the built site there, and builds it first.

  • 0.9.22-draft (2026-08-13) — The slash menu is recognised at the editing host and gains a named door (insert.openSlashMenu).

  • 0.9.21-draft (2026-08-13) — The block action bar steps aside when parent chrome takes the pointer, and returns on a selection change or a canvas pointerdown.

  • 0.9.20-draft (2026-08-12) — The canvas iframe resolves keystrokes against the host keymap; inline formatting, Select All and the caret's chords become records.

  • 0.9.19-draft (2026-08-12) — Preview is a toggle over an edit/design base in the View control rather than a third radio value; it honours the chosen breakpoint like Edit and Design; and canvas.html's clip is lifted in preview so the pane-height frame can actually scroll its document.

  • 0.9.18-draft (2026-08-11) — §12's status table re-read against the code: collection browser, entry editor, component library management and the redirect editor were shipped and still marked Pending; the CSS properties/parts panels are read-only reflections, not declaration forms; the CEM exporter is complete and unreachable; media usage is computed but only the delete confirmation reads it.

  • 0.9.17-draft (2026-08-11) — SEO panel status is Partial — Search appearance ships the previews, counters and warnings; the schema.org editor is still pending.

  • 0.9.16-draft (2026-08-11) — The resolving-with values move into their own popover, and each becomes a command (canvas.setTestProp / setRouteParam).

  • 0.9.15-draft (2026-08-11) — The size switcher resizes the Edit column to the chosen breakpoint, and each rendering-context verb repaints the pane it wrote.

  • 0.9.14-draft (2026-08-11) — §9.1.3 — one service decides what belongs in $elements, for all four writers of it.

  • 0.9.13-draft (2026-08-11) — The Library has four doors including ⌘⇧E (§9.1.2), and the assistant's context budget is rendered.

  • 0.9.12-draft (2026-08-11) — A field's uncommitted draft is keyed by node path, not by field name alone.

  • 0.9.11-draft (2026-08-11) — Event names are a free-form combobox, and a bound provenance chip opens its source on every tab.

  • 0.9.10-draft (2026-08-11) — §14.8 — a project reopens with the documents, panes and view settings it was left with.

  • 0.9.9-draft (2026-08-11) — The rendering context's three axes are commands (canvas.setBreakpoint / setColorScheme / setLayoutVisible), and an empty-canvas right-click keeps the browser's menu.

  • 0.9.8-draft (2026-08-11) — Project Settings carries ⌘⇧,, the other half of the pair §5.3 declares.

  • 0.9.7-draft (2026-08-11) — Data rows: truncation markers are controls, Refresh reports the render rather than a timer, and an entry that cannot hold a value keeps its definition summary.

  • 0.9.6-draft (2026-08-11) — The Activity Bar names the panels that ship, in their two rail groups; the Data panel is one list of definitions and the values they resolve to (§5.6), taking over the State panel's editor.

  • 0.9.5-draft (2026-08-11) — §6.6 the value-source ladder gains a fourth rule — a position whose schema narrows which operators it admits seeds its own Formula rung, because the generic bare-?? seed is an invalid document there; an element's tagName joins the ladder, deriving to Fixed value + Formula with no template rung because TagName carries a pattern.

  • 0.9.4-draft (2026-08-09) — §16.3 Problems leaves the Navigator rail — no Bottom-dock tab has a rail button, the count lives in the status bar and runs view.setBottomTab, and panel.focus.problems is gone with the ⌘1-8 roster that follows the rail; §16.1 restates where a Problem is surfaced.

  • 0.9.3-draft (2026-08-09) — §13.5 corrects check-icons — an icon key on a record is resolved through a map, not registered as a tag, and the two spaces fail differently; the previous text asserted the opposite and licensed a fix that replaced a working hand-drawn glyph with a key nothing resolved.

  • 0.9.2-draft (2026-08-08) — §13.5 adds scripts/check-icons.ts — an sp-icon-* tag no element registers, or a registered element Spectrum does not ship, is now a red PR; the command record's icon field described accurately as a tag name rather than a key into a map.

  • 0.9.1-draft (2026-08-08) — §18.4 derived panes ship — a pane chosen by a standing rule rather than a document; a preset is a projection (Code, Diff — one document, two sessions), a follow (Layout, Component definition — genuinely different documents) or a filter (a breakpoint of the board already drawn); §14.1 holds because following is dispose-and-open, with four exclusions keeping one document to one tab; a pane holds a derivation or tabs, never both.

  • 0.9.0-draft (2026-08-07) — §18 Panes rewritten for two live panes — the grid draws a keyed cell per pane and the stage handover is deleted; the editor-kind cap on the side pane is gone and a split is a real side-by-side; clicking into a pane focuses it; nothing drawn for a pane may resolve the focus, enforced by check-pane-singletons; §18.4 derived panes named as not built.

  • 0.8.0-draft (2026-08-07) — Sub-documents withdrawn (§14.3) — the stack had no push, so nothing could enter it; §14.7 closing over unsaved work, and §4.2 source is batched so every exit settles first; the Bottom dock is three tabs and Diff is a pane editor kind (§16.3); §18 Panes — the two-pane cap as one predicate, one stage handed between panes, and no pane zoom until there is a grid to zoom.

  • 0.7.0-draft (2026-08-06) — §18 Panes — the two-pane cap as one predicate, the three lifecycle rules each defect taught, what a second pane costs and what no fan-out removes, and the single stage handed between panes.

  • 0.6.0-draft (2026-08-05) — §7 Stylebook becomes Project Styles (name only — "stylebook" stays the wire value) and §17 Project Documents: project.json as a Tab under the transaction log, one write chokepoint, a no-op edit that writes nothing, and the collab exclusion.

  • 0.5.2-draft (2026-08-05) — §5.2 the move buttons follow the primary selection and stay single-target under a multiple selection.

  • 0.5.1-draft (2026-08-05) — §6.2 corrects the Target Line illustration — the selector is the last segment and a scheme variant appears only at Base — and retires the breakpoint-tabs, inline-selector-picker and Active-toggle subsections the Target Line replaced.

  • 0.5.0-draft (2026-08-04) — §6.2 the Target Line and its scope chip; §6.6 the one value-source ladder; §6.7 provenance chips naming the donor, and selection as a JxPath[] with Mixed values and one transaction per batch; §7.4 scheme declaration moves to Contexts.

  • 0.4.4-draft (2026-08-04) — §16 Feedback, Problems and Progress — the three notification tiers, the Bottom dock, Activity, and the status bar as ambient state only.

  • 0.4.3-draft (2026-08-03) — §9.1.1: destructive confirmations state the reference count — what a delete breaks, what a rename rewrites, and the three states (counted / uncountable / unsupported) that are never collapsed.

  • 0.4.2-draft (2026-08-03) — The Inspector's fourth tab (§3.1, §6): the assistant is Content · Style · Logic · Assistant, not a fifth column; two docks, one persisted record. Application Preferences (§15) — Appearance, Assistant, Accounts (listed and revocable) and a registry-generated Keyboard sheet.

  • 0.4.1-draft (2026-08-02) — Automation surface is a projection of the command registry (§13.5): the projection, idempotence and Remote rules; probe.idle() as a failing predicate; pointAt in top-document coordinates.

  • 0.4.0-draft (2026-08-02) — Command Registry and Context Keys (§13); Tabs and Document Identity (§14) — drill-in opens a real tab, labels disambiguate by route.

  • 0.3.8-draft (2026-08-02) — Layout chrome is selectable and inert to the caret; Preview gates editing and scrolls for real; Design opens fitted; caret.active is a bridge fact; Open in Browser (Cmd+Shift+O); assistant column defaults closed.

  • 0.3.7-draft (2026-07-29) — Share one bundler contract between the release build and the dev-server watcher; nothing may fetch Monaco at startup; restrict preview navigation to http/https/mailto/tel.

  • 0.3.6-draft (2026-07-28) — Preview link clicks open the target in a real browser tab instead of navigating the canvas iframe away.

  • 0.3.5-draft (2026-07-28) — IME composition suspends canvas commits; the editable region gets textbox/aria-multiline/label (§8.2.8).

  • 0.3.4-draft (2026-07-28) — Document the two-entry code-split bundle layout and the on-demand Monaco load (§11.1).

  • 0.3.3-draft (2026-07-28) — Layer-row actions follow selection rather than hover; edit/design gate automatic Request fetches; structural splices escalate on the immediate parent only.

  • 0.3.2-draft (2026-07-28) — Canvas maps a content entry's entry-relative media onto its asset mount (§4.1) so the preview matches the built site; render-only, source doc untouched.

  • 0.3.1-draft (2026-07-28) — Media upload across four surfaces (§9.3): image-field Upload button, canvas file drop with replace-vs-insert, Files-tree and Manage destinations; collision-safe naming; binary uploadFile on every platform.

  • 0.3.0-draft (2026-07-27) — Derive the caret's editable tag set from the document's element vocabulary (§8.2.2): the format class decides per tag and can say no, so a Markdown blockquote holds paragraphs and a link is markup within a block; subsections after it renumber (nothing referenced them).

  • 0.2.0-draft (2026-07-26) — Fluid document editing: the canvas carries a live caret (§8.2), one block action bar (§4.4), both editable modes behave identically for text (§4.2), and a rewritten keyboard contract (§10).

  • 0.1.29-draft (2026-07-26) — File create/rename/delete naming dialogs (§9.1.1); branch, clone, and nested-selector flows now open Spectrum dialogs instead of native prompts.

  • 0.1.28-draft (2026-07-25) — The Cloud platform target composes per-project schemas server-side (§3.4).

  • 0.1.27-draft (2026-07-25) — Source-mode schema validation contract: per-project entry documents, offline $schema-id registration, worker self-location (§4.2.1); fetchProjectSchemas in the PAL table (§3.4).

  • 0.1.26-draft (2026-07-25) — PAL table records the destination members: createDestination, createProject's user-chosen destination, and pickDirectory.

  • 0.1.25-draft (2026-07-22) — Proper spec versioning ( fb0f3ec7 ).

  • 0.1.24-draft (2026-07-22) — Machine-readable spec status vocabulary + generated status page ( 79daba23 ).

  • 0.1.23-draft (2026-07-17) — Scheme-variant editing — token overrides, scheme-layer routing, live feedback ( 49f0c525 ).

  • 0.1.22-draft (2026-07-17) — Color-scheme canvas preview — Auto/Light/Dark tab-bar control ( ccdc1d3e ).

  • 0.1.21-draft (2026-07-17) — Consolidated field mode switcher ( 0a135ed1 ).

  • 0.1.20-draft (2026-06-10) — Consolidate markdown and csv handling to the parser package ( 8b1ba6da ).

  • 0.1.19-draft (2026-05-25) — Allow nested global styles ( 1159d585 ).

  • 0.1.18-draft (2026-05-20) — "format" on fields for image fields ( 02f87d29 ).

  • 0.1.17-draft (2026-05-20) — Run formatter ( 8ba47930 ).

  • 0.1.16-draft (2026-05-15) — Git sidebar ( 79663844 ).

  • 0.1.15-draft (2026-04-23) — Include global styling ( d8d25640 ).

  • 0.1.14-draft (2026-04-23) — Site build ( ffe60ddc ).

  • 0.1.13-draft (2026-04-23) — Compiler cli + published site ( 4607ebbc ).

  • 0.1.12-draft (2026-04-22) — Consolidate project config schema and rename as such ( e3523dbf ).

  • 0.1.11-draft (2026-04-22) — External web component support ( a9d0fbe4 ).

  • 0.1.10-draft (2026-04-22) — Init new site ( f33d319b ).

  • 0.1.9-draft (2026-04-20) — Text nodes support ( 4d45eeb7 ).

  • 0.1.8-draft (2026-04-20) — Better project-level scoping ( 0cba233c ).

  • 0.1.7-draft (2026-04-18) — Dedicated combo/picker component for style preview ( d8d07921 ).

  • 0.1.6-draft (2026-04-18) — Fix the test path handling on windows ( 26ea0d70 ).

  • 0.1.5-draft (2026-04-17) — Update studio specs ( d0e5475a ).

  • 0.1.4-draft (2026-04-17) — Reorganize code tree ( d5ee04c4 ).

  • 0.1.3-draft (2026-04-16) — Landing site + working exports + release-it + linting ( a8409b5f ).

  • 0.1.2-draft (2026-04-15) — Rebrand to Jx / Jx Platform ( abc63f2d ).

  • 0.1.1-draft (2026-04-10) — Finalize vision for site architecture ( da594993 ).

  • 0.1.0-draft (2026-04-10) — Consolidate specs ( 80ca313f ).

ui.md

  • 0.1.61-draft (2026-10-21) — The jx-inline-edit rationale names the Page tab's title field rather than the removed Document Header card.

  • 0.1.60-draft (2026-10-21) — The window-drag platform class is named app-region-drag, and the hint fallback note refers to the Electron build's bundled Chromium.

  • 0.1.59-draft (2026-10-17) — Bound kit props render live in Design mode (§10).

  • 0.1.58-draft (2026-10-07) — jx-dialog gains confirm-disabled and an xl size, and when open is a column whose body scrolls under a pinned header and footer (§5.2).

  • 0.1.57-draft (2026-09-29) — Census against the code: §3, §5, §5.3, §9 and §10 are marked Implemented (§9 with the compiled distribution as a Future remainder), the overview markers on §1 and §4 are removed, §2, §5.1, §5.2, §5.4, §5.5, §6 and §7 are re-marked to name what is actually short, and §3.1, §3.2, §3.3 and §4.1 gain Partial markers for where the code and the text disagree.

  • 0.1.56-draft (2026-09-29) — §4.3/§5.4: only contain: layout satisfies the outset hit area rule and jx-tab's close button carries it; a compact jx-action-group is one line (a wrapping row is compact=false), dims a disabled segment's ink rather than its share of the frame, fills a vertical group's stretched hosts, and keeps the system selection pair for an emphasized chosen segment.

  • 0.1.55-draft (2026-09-29) — §3.2/§5.1/§5.3: the fields' empty error region is inert (box model reset, clipped, pointer-transparent) whatever a consumer's [part=error] rule sets, and consumers name their own banners with names the kit does not use.

  • 0.1.54-draft (2026-09-29) — §8: css-meta $icons values are manifest names, held to the manifest by Studio's metadata test.

  • 0.1.53-draft (2026-09-29) — §5.4: a compact jx-action-group draws the segmented control itself (frame, shared borders, accent-edged selected segment, text padding) whatever its members' quiet; a row of quiet tools is compact=false.

  • 0.1.52-draft (2026-09-29) — §4.3: every outset hit area is layout-contained so it adds nothing to a scrolling ancestor's overflow; a small button, action button or checkbox therefore has no baseline and is centred in a row.

  • 0.1.51-draft (2026-09-22) — jx-split memoizes the resolved track's identity per element — length still measured per call, walked invalidation on containment/connectivity/axis change — after profiling traced per-boot forced recalcs to the walk.

  • 0.1.50-draft (2026-09-14) — §5.1 the hint contract covers jx-switch (a jx-tooltip child wired by for to the wrapping label while enabled, the label's title while disabled) and jx-menu-item's requires is the row's title only while disabled; §5.2 records both.

  • 0.1.49-draft (2026-09-14) — §4.3 size=sm controls accept the pointer over the 24px floor through a ::before hit area inset past the 20px picture, the field-internal buttons carry the same, and §11 records the WCAG 2.5.8 claims and non-claims per element.

  • 0.1.48-draft (2026-09-13) — jx-action-button and jx-button draw an enabled hint as a jx-tooltip child wired by id from a stem the tooltip sidecar mints (mintHintId), and keep it as the control's title while disabled; §5.2 says how a control declares a tip, and what the bound path owes the desktop app (Chromium 147): keyboard-only focus, one Escape listener per root, a moved tip keeps its binding (#299).

  • 0.1.47-draft (2026-09-13) — Compact density draws controls at 24px, the WCAG 2.2 SC 2.5.8 floor, at every density; §4.3 records what compact buys instead and §11 claims the criterion for the control height, naming the sub-control targets it does not size as the non-claims (#309).

  • 0.1.46-draft (2026-09-13) — jx-tooltip keeps reading which side the platform placed it on while it shows, so the arrow follows a later flip (#310).

  • 0.1.45-draft (2026-09-12) — jx-option and jx-select rows carry five typographic channels (weight, slant, variant, transform, decoration) beside face, swatch and line; jx-color-field takes resolved, the colour behind a reference the page cannot resolve, for its chip and its picker; the Style tab's font row is a jx-combobox of specimen rows and the unit row is the last menu composite.

  • 0.1.44-draft (2026-09-11) — §11: WCAG 2.2 is a Subset with a test per criterion, and SC 2.4.7 is a gate (every focusable control has the kit's focus ring); CSS Scoping is a Subset now that the light-DOM decision is held by the conformance test, and gap is retired (§11).

  • 0.1.43-draft (2026-09-11) — jx-tooltip is anchor-positioned against the control it was shown from, flipped through a named @position-try option so the arrow's gap moves with it; every overlay that hangs from something is the platform's to place, and §11 retires gap (§5.2, §6, §11).

  • 0.1.42-draft (2026-09-11) — jx-menu is anchor-positioned under placement, and a submenu anchors beside its row on its own; jx-tooltip is what is left (§5.1, §5.2, §6, §11).

  • 0.1.41-draft (2026-09-11) — jx-popover is placed by CSS anchor positioning against the platform's implicit anchor whenever it was shown from a source (placement prop, flips, anchor-size), with the measured coordinate as the fallback; §6's marker catches up with the dialog, invoker and discrete-transition halves that were built; §11 moves CSS Anchor Positioning and CSS Transitions 2 to Subset (§5.2, §6, §11).

  • 0.1.40-draft (2026-09-11) — §10 records the canvas as the kit's second realm: elements from the project's files, behaviours from @jxsuite/ui/loaders on first use, measured on the combobox stylebook page, and a saved component reaching both realms.

  • 0.1.39-draft (2026-09-11) — The Style tab's keyword rows are jx-combobox with allows-custom-value (the unit and font rows stay the menu composite, because their rows are verbs); the commit judges the control's text and closes the list, as does Enter with nothing highlighted; §2 gains a light-DOM check and a sidecar scan as its evidence and is Partial, §8 is Implemented, §10 is Partial, and §2's cascade claim is corrected: element rules are unlayered (0,1,0) and adopted last; §11 retires gap (every control forwards its name) and gap (a decision, not a gap) and binds both rows to the sections the elements live in; §10 names the canvas realm's unresolved jx-ui: behaviours as the one gap outside the kit (§2, §5.3, §5.5, §8, §10, §11).

  • 0.1.38-draft (2026-09-11) — jx-split reports each step's modifiers as the detail of input and change, and the Edit column's snapping handles are jx-split beside the column; setupHandle is deleted (§5.5).

  • 0.1.37-draft (2026-09-11) — jx-combobox lands a gesture-opened list on the row the field already holds, shows no empty list, closes on Tab either way and matches its field's width, and ai-credentials-form is one jx-combobox with allows-custom-value over the fetched catalogue rather than two controls bound to one draft (5.3).

  • 0.1.36-draft (2026-09-11) — jx-color-field declares the property-only tabindex, landing on the swatch (now part=control) and parking the text field, eyedropper and system well while roved, so a colour well is one stop in a jx-toolbar; §5.5 no longer names it as the gap and records the shape of the nested-composite fix.

  • 0.1.35-draft (2026-09-11) — The five unbuilt builder elements are audited rather than pending: jx-dimension-field and jx-token-field fold onto the Style tab's kit-menu composite and jx-color-field's tokens slot, jx-box-editor is the shorthand row, jx-breakpoint-bar is three surfaces studio.md split on purpose, and jx-inline-edit has one consumer while every other rename is the prompt dialog (§5, §5.5).

  • 0.1.34-draft (2026-09-11) — §5's catalogue catches up with the kit: the intro names the seven entries still pending rather than the three first built, jx-action-button's row describes haspopup/expanded and the checked radio segment in place of a hold prop that never shipped, jx-divider's row matches its stylebook, §5.3 records jx-field as built, and §1 and §9 stop calling the catalogue and the stylebook pending.

  • 0.1.33-draft (2026-09-11) — The three dock edges are jx-split; only the Edit column's snapping handle remains pointer-only (§5.5).

  • 0.1.32-draft (2026-09-10) — jx-tree keeps the keyboard across a handed-off caret move: it focuses the revealed row once the roving tabindex is on it, and abandons the request if the reader has moved on.

  • 0.1.31-draft (2026-09-10) — jx-split: a window splitter with role=separator, a tab stop, aria-valuenow, the arrows of its own axis and a collapse toggle on Enter or a double click; Studio's pane grid and rail no longer hand-roll a separator.

  • 0.1.30-draft (2026-09-10) — jx-toolbar ships: one tab stop over a row of mixed controls, a text field that keeps the arrows until its caret runs out, and overflow left with the host that already answers it (5.1, 5.5, 7).

  • 0.1.29-draft (2026-09-10) — jx-tree dispatches typeahead for a host to resolve against the model while it is windowed, and the APG's * key is recorded as a named deviation.

  • 0.1.28-draft (2026-09-10) — jx-combobox, jx-listbox and jx-option ship: the highlight is one id the field and the row are both told, a listbox that never takes focus, and a lint replaces the absence that guarded the select (5.1, 5.3, 7, 11).

  • 0.1.27-draft (2026-09-10) — jx-tree and jx-tree-item ship: a flat projected row list so the tree can be windowed, ARIA counts that describe the full set, multi-select as an intent the host resolves, and cut and paste kept reachable beside the drag island (5.5, 7, 11).

  • 0.1.26-draft (2026-09-10) — the authoring model in 3 is enforced over every element by conformance.test.ts, and WAI-ARIA and WHATWG HTML are cited Subsets rather than promises.

  • 0.1.25-draft (2026-09-10) — jx-toast and jx-toast-host ship: the stack owns the live region, the clock pauses on attention and resumes with what was left, and a hotkey is the way into a status message (§5.2, §7, §11).

  • 0.1.24-draft (2026-09-10) — a value the colour field cannot decompose is kept and drawn rather than refused, so a project's own tokens live in the same field as a colour.

  • 0.1.23-draft (2026-09-10) — the colour elements are built: two transparent native ranges behind a 2D square, a styled range over a gradient, a contrast-measured swatch, a roving swatch group, and a composed colour field that dispatches from itself.

  • 0.1.22-draft (2026-09-10) — §5.1 jx-select cannot draw an unlabelled separator between projected rows, and jx-menu is a list of actions rather than a media browser.

  • 0.1.21-draft (2026-09-10) — the layers façade no longer lists showDialog: a bespoke dialog body is a named flow with an island.

  • 0.1.20-draft (2026-09-10) — jx-tab takes slotted content in three named slots (icon, status, actions); label becomes required once anything is slotted, because aria-label is what keeps a slotted mark out of the tab's name.

  • 0.1.19-draft (2026-09-10) — The Studio facade list drops openModal: a persistent modal is a jx-dialog surface document (§6).

  • 0.1.18-draft (2026-09-08) — jx-select: the default slot and its once-at-mount distribution, the slotted hr separator, and the property-only rows.

  • 0.1.17-draft (2026-09-04) — jx-select is a native select under appearance: base-select — the four things a document must never author, the sidecar that keeps selectedness alive, and why the kit ships no jx-option.

  • 0.1.16-draft (2026-09-04) — the theme layer is an authored key, so themeCSS writes no CSS text and agrees with the site builder about the same block (4.2).

  • 0.1.15-draft (2026-09-03) — the recipe kind is gone: 3.1 decides element or part by how many definitions draw the box, 3.5 states host position, and the catalogue rows are redistributed.

  • 0.1.14-draft (2026-09-03) — slots leave no node, and an overlay opts out of the display default with display revert (3.2).

  • 0.1.13-draft (2026-09-03) — jx-tabs, jx-tab, jx-tab-panel, jx-accordion-item and jx-action-group ship (5.4); jx-accordion becomes a recipe.

  • 0.1.12-draft (2026-09-02) — the loading button's refusal is stopPropagation as well as preventDefault; the spinner and popover override tokens join the semantic list.

  • 0.1.11-draft (2026-09-02) — jx-popover, jx-tooltip and jx-spinner ship (5.2); the anchor prop is dropped with its reason; SC 1.4.13 joins the WCAG subset.

  • 0.1.10-draft (2026-09-02) — jx-checkbox, jx-switch and jx-number-field ship (5.3); the value-stepping amendment to principle 5; jx-textfield gains clearable, grows and rows (5.1).

  • 0.1.9-draft (2026-09-02) — jx-textfield gives its control a default value, so a form reset cannot desync it.

  • 0.1.8-draft (2026-09-02) — the textfield's error live region is permanent, so the first refusal is announced.

  • 0.1.7-draft (2026-09-02) — jx-textfield names its error and help sentences in aria-describedby, and forwards labelledby and describedby.

  • 0.1.6-draft (2026-09-02) — jx-dialog claims focus on open (confirm, or cancel when destructive) and jx-button forwards autofocus (§5.1, §5.2).

  • 0.1.5-draft (2026-09-02) — jx-dialog and jx-textfield are built (§5.1, §5.2, §6).

  • 0.1.4-draft (2026-09-02) — jx-action-button gains stacked, haspopup/expanded and badge (§5.1).

  • 0.1.3-draft (2026-09-02) — jx-button and jx-action-button are built: one native button each, invoker attributes forwarded, loading and toggling states (§5.1).

  • 0.1.2-draft (2026-09-02) — jx-menu takes a floor and a submenu flips to its parent's left when it would overflow (§5.1).

  • 0.1.1-draft (2026-09-02) — jx-menu and jx-menu-item are built (§5.1), with the popover half of the overlay model (§6) and the menu keyboard contract (§7).

  • 0.1.0-draft (2026-09-02) — Initial release: principles, authoring model, theme and tokens, element catalogue, overlay and keyboard models, icons, build and distribution, Studio integration.