v0.68.0
This release rolls up the six minors held since 0.62.2: the dev-package split, a pre-Part-B DX pass, the Waymark showcase design foundation, the additive Contract v2 field vocabulary, and the two pre-cutover engine-hardening passes. Every change is additive. Upgrading from 0.62.2 needs no code changes.
0.68.0: engine-misc hardening
The second pre-cutover hardening pass clears eight engine-misc items. The component picker dialog caps at 85vh and scrolls its catalog within a held header and footer. A repeated content-lifecycle error in the concept list re-announces to a screen reader through one polite live region. The component registry ships a default role-to-glyph fallback, DEFAULT_ICON_BY_ROLE, which a component's own defaultIconByRole overrides.
Three gates and one doc tightened. The admin-prose gate now scans the .ts copy modules it skipped. A new check:dev-package gate type-checks and comment-lints packages/** in CI. The two rehype-dispatch helpers gained real doc contracts, and the friction log marks its resolved items.
0.67.0: validator parity
The Contract v2 fieldset validator reaches constraint parity with defineFields. Both validators call one shared constraint module, so they cannot drift, and a v1-vs-v2 parity matrix proves they agree. The validator now enforces text min/max/length/pattern and date min/max, and it compiles a malformed pattern at fieldset() call time. It also reads a parsed value as well as a form string, and it coerces a lone multiselect scalar to a single-element list.
0.66.0: the additive fields.* field vocabulary
Contract v2 begins with an additive field vocabulary beside defineFields. A concept declares its fields as a record of fields.* constructors, and fieldset(record) derives a validator with Standard Schema conformance and an inferred type. The new root-barrel exports are fields, fieldset, initialValues, FieldDescriptor, Fieldset, InferFieldset, FieldsetOptions, and BehaviorTable. The vocabulary is not yet wired live. The contract-v2 cutover, a later breaking release, migrates concepts off defineFields.
0.65.0: build-time highlighting and the Waymark showcase
The render pipeline highlights fenced code at build time. It runs Shiki and emits role-bound .cairn-tok-* token classes with no client highlighter, so the colors come from the site's theme. GFM task-list checkboxes gain an aria-label from their item text. The broader Waymark design foundation ships in examples/showcase, the deployable starter, not the published engine: the oklch token layer, the bespoke reading surface, the chrome, the /styleguide route, and the dual-gamut, token-resolution, and re-skin CI gates. This version adds shiki and hast-util-to-string.
0.64.0: a pre-Part-B DX pass
readCommittedManifest, exported from /media, degrades a missing media manifest to empty, so a fresh site no longer fails its build on an absent media.json. A new media.resolver_absent log event, at level warn, makes a silently broken public-image setup diagnosable.
0.63.0: the dev-package split
The local-development fake backend moves into a separate dev-only package, @glw907/cairn-cms-dev. It holds the in-memory GitHub, R2, D1, and Anthropic doubles and a devBackendHandle() that runs /admin locally with no cloud accounts. The auth guard gains a fail-closed tripwire: when CAIRN_DEV_BACKEND is set in a deployed runtime, the guard refuses the request with a 503 and logs guard.rejected with reason: "dev_backend_in_prod".
🤖 Generated with Claude Code