From ede4f36bb6f32ada4f72a16864beae50f6ec118a Mon Sep 17 00:00:00 2001 From: Zach Shallbetter Date: Mon, 20 Jul 2026 13:14:29 -0700 Subject: [PATCH] release: 0.9.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seven published packages bumped together: core, create, dom, elements, react, three, vanilla. FIELD_VERSION bumped on all three planes (JS, Swift, Kotlin) to match, and the lockstep drift guard passes. The three private workspace apps are reverted rather than bumped. Note that this is now THREE, not two — apps/observatory was added this cycle and matches the @fundamental-engine/* filter, so the documented two-app revert step is out of date. RELEASING.md is updated accordingly in this commit. Patch, not minor: the protected-surface baseline was diffed across the whole cycle and no protected symbol was removed. Everything in this release is additive, internal, or documentation. The Swift and Kotlin constants were edited without a local toolchain to verify them; they are checked by their own planes' CI rather than by me. Today's work is JS-only, so those two bumps exist solely to hold lockstep. Full gate green on 1aec803f: typecheck, build, test, check:api, check:dist, check:readme, check:recipes, check:cem, check:docs, check:links. --- CHANGELOG.md | 4 +++- RELEASING.md | 10 +++++++++- .../com/fundamental/core/runtime/FieldSnapshot.kt | 2 +- packages/core/package.json | 2 +- packages/core/src/version.ts | 2 +- packages/create/package.json | 2 +- packages/dom/package.json | 2 +- packages/elements/package.json | 2 +- packages/react/package.json | 2 +- packages/three/package.json | 2 +- packages/vanilla/package.json | 2 +- .../Sources/FundamentalCore/Engine/FieldSnapshot.swift | 2 +- 12 files changed, 22 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6efb609..40acaad5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,11 @@ a git tag (see [RELEASING.md](RELEASING.md)). ## [Unreleased] +## [0.9.5] — 2026-07-20 + - **CI: replaced the third-party path-filter action with plain git.** GitHub began forcing Node 24 onto actions that target Node 20; the filter action dies silently mid-run and takes the whole gate with it via `conclusion`. A path filter is one `git diff` and does not need a dependency that can break underneath the repository. All nine original path patterns preserved and verified against a fixture of paths that must and must not match; the replacement also logs which files it saw and which way it decided. - **Retired the API "freeze" — it was never real.** The list was described as frozen for `0.x` and had been edited 40 times; a stability promise revised whenever it becomes inconvenient is not a promise, it is a claim that quietly stops being true. The check itself is kept and renamed to what it actually does: it protects listed symbols from **silent removal**. It has never failed on an addition and cannot — new exports land freely. Removing or renaming a listed symbol is allowed and expected; it just has to be deliberate, which means dropping the entry in the same change and adding a migration note so consumers are told. `FROZEN_*` → `PROTECTED_*` throughout, with failure messages that now say what happened and what to do. Three inaccuracies fixed in passing: the docs page claimed entries "fail the build if they change" (only removal fails); `api-stability.md` and `substrate-api.md` cited "the frozen 17" where the check reports **20**. `RELEASING.md`, `PUBLISHING.md` and three canonical docs updated to match. Freeze language remains in prose elsewhere in `docs/canonical/` and is tracked as follow-up — it is stale wording, not a wrong claim about the gate. -- **Documentation accuracy pass.** `docs/README.md` now indexes `docs/method/` (a whole top-level docs directory that was unlisted) and the `planning/world-substrate/` program. `PLAN.md`'s status header said *"Nothing in F1–F5 or C2 is built"* — false since Stage 1 landed — and the document contradicted itself, carrying both a current "Not started" line and a superseded one, plus a note calling F1.4 equivalence "pending" when it is measured. `CLAUDE.md` listed **17** frozen API entries where `check:api` reports **20**, and its layout table omitted `apps/observatory` entirely. Corrected, with the authoritative source named in each case so the next drift is self-diagnosing. +- **Documentation accuracy pass.** `docs/README.md` now indexes `docs/method/` (a whole top-level docs directory that was unlisted) and the `planning/world-substrate/` program. `PLAN.md`'s status header said *"Nothing in F1–F5 or C2 is built"* — false since Stage 1 landed — and the document contradicted itself, carrying both a current "Not started" line and a superseded one, plus a note calling F1.4 equivalence "pending" when it is measured. The repository guide listed **17** protected API entries where `check:api` reports **20**, and its layout table omitted `apps/observatory` entirely. Corrected, with the authoritative source named in each case so the next drift is self-diagnosing. - **Documentation and code now reference only tracked documents.** Nine files pointed at a repository-root file that is no longer version-controlled, so those references resolved for some checkouts and broke on a fresh clone. They now point at `docs/engineering-practices.md`, which is tracked and carries the same guidance. The site's `llms.txt` generator was also including that untracked root file in its published output; it now publishes `README.md` and `CHANGELOG.md` only. - **Documentation accuracy pass.** `docs/README.md` now indexes `docs/method/` (a whole top-level docs directory that was unlisted) and the `planning/world-substrate/` program. `PLAN.md`'s status header said *"Nothing in F1–F5 or C2 is built"* — false since Stage 1 landed — and the document contradicted itself, carrying both a current "Not started" line and a superseded one, plus a note calling F1.4 equivalence "pending" when it is measured. The repository guide listed **17** frozen API entries where `check:api` reports **20**, and its layout table omitted `apps/observatory` entirely. Corrected, with the authoritative source named in each case so the next drift is self-diagnosing. ### Added diff --git a/RELEASING.md b/RELEASING.md index 2e138222..273b1ed3 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -46,7 +46,15 @@ accidental breakage, not a freeze; the surface evolves pre-1.0 and additions nev ```sh pnpm --filter "@fundamental-engine/*" exec npm version --no-git-tag-version ``` - The private apps (`site`, `starter`) are versioned independently and are not published. + The filter also matches the **private** workspace apps, which version independently and are + never published — revert them after the bump: + ```sh + git checkout -- apps/site/package.json apps/starter/package.json apps/observatory/package.json + ``` + This list grows whenever a private app is added under `apps/` with an `@fundamental-engine/*` + name. `apps/observatory` joined in 0.9.5. Confirm with + `pnpm --filter "@fundamental-engine/*" exec node -e "const p=require('./package.json');console.log(p.name,p.private?'private':'PUBLISHED')"` + rather than trusting this list. 4. **Bump `FIELD_VERSION` on all three planes** — the constant is hand-maintained per plane, and a lockstep test on each fails CI if it drifts from `packages/core/package.json`: - JS: `packages/core/src/version.ts` (guard: `version.test.ts`) diff --git a/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt b/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt index da5c4532..45c54268 100644 --- a/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt +++ b/android/fundamental-core/src/main/kotlin/com/fundamental/core/runtime/FieldSnapshot.kt @@ -19,7 +19,7 @@ import com.fundamental.core.math.Vec3 * lockstep with the JS constant / the release version: `VersionLockstepTests` fails the build if this * drifts from `packages/core/package.json` (#923) — update it here on every release bump. */ -const val FIELD_VERSION: String = "0.9.4" +const val FIELD_VERSION: String = "0.9.5" /** * Options for [FieldHandle.snapshot] (JS `FieldSnapshotOptions`). Composes with the runtime privacy diff --git a/packages/core/package.json b/packages/core/package.json index e34d3e4f..4356c616 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/core", - "version": "0.9.4", + "version": "0.9.5", "description": "A reciprocal DOM-physics field — elements bend the field; the field's density bends them back.", "type": "module", "license": "MIT", diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index afb7ded3..82a2897e 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -4,4 +4,4 @@ * with `packages/core/package.json` by `version.test.ts` (the build fails if they drift), so the * release bump is the single source of truth. */ -export const FIELD_VERSION = '0.9.4'; +export const FIELD_VERSION = '0.9.5'; diff --git a/packages/create/package.json b/packages/create/package.json index 58e59822..d1b2eba4 100644 --- a/packages/create/package.json +++ b/packages/create/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/create", - "version": "0.9.4", + "version": "0.9.5", "type": "module", "description": "Scaffold a Fundamental starter — `npm create @fundamental-engine` — vanilla, React, or web-component, contained and signals-first by default.", "keywords": [ diff --git a/packages/dom/package.json b/packages/dom/package.json index c4ec6281..955ce154 100644 --- a/packages/dom/package.json +++ b/packages/dom/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/dom", - "version": "0.9.4", + "version": "0.9.5", "description": "The platform-adjacent layer for Fundamental — native-first registries for measurement, semantic state, feedback, relationships, visual-semantic bindings, and overlays. The browser primitives Fundamental wishes existed, built on the ones it has.", "type": "module", "license": "MIT", diff --git a/packages/elements/package.json b/packages/elements/package.json index 51b7da05..d1293207 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/elements", - "version": "0.9.4", + "version": "0.9.5", "description": "Web-component keystone for Fundamental — the custom element + declarative data-body bodies.", "type": "module", "license": "MIT", diff --git a/packages/react/package.json b/packages/react/package.json index 5fff9909..0d344ce6 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/react", - "version": "0.9.4", + "version": "0.9.5", "description": "React adapter for Fundamental — a reciprocal DOM-physics field as a component + useFieldField hook.", "type": "module", "license": "MIT", diff --git a/packages/three/package.json b/packages/three/package.json index 6aedd718..a36c2ab3 100644 --- a/packages/three/package.json +++ b/packages/three/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/three", - "version": "0.9.4", + "version": "0.9.5", "description": "Three.js authoring surface for Fundamental — run the reciprocal field engine headless and render its swarm as a THREE.Points layer (the particle bridge), plus threeHost() and threeBackend() (a RenderBackend) for binding the engine to a WebGL scene.", "type": "module", "license": "MIT", diff --git a/packages/vanilla/package.json b/packages/vanilla/package.json index 765b0baf..cf42b650 100644 --- a/packages/vanilla/package.json +++ b/packages/vanilla/package.json @@ -1,6 +1,6 @@ { "name": "@fundamental-engine/vanilla", - "version": "0.9.4", + "version": "0.9.5", "description": "Framework-free TypeScript wrapper for Fundamental — the reciprocal DOM-physics field as a typed FieldField class + mountField(), with no custom-element registration and no framework dependency.", "type": "module", "license": "MIT", diff --git a/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift b/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift index 44fe271b..e4ae5258 100644 --- a/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift +++ b/swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift @@ -21,7 +21,7 @@ import Foundation /// mirroring the Kotlin port. Kept in lockstep with the package version (npm `latest`) and the JS /// `FIELD_VERSION`: `VersionLockstepTests` fails the suite if this drifts from /// `packages/core/package.json` (#923) — update it here on every release bump. -public let FIELD_VERSION: String = "0.9.4" +public let FIELD_VERSION: String = "0.9.5" /// Options for ``FieldHandle/snapshot(_:)`` (JS `FieldSnapshotOptions`). Composes with the runtime privacy /// ``FieldPolicy`` and an optional ``SnapshotProfile``, always resolving to the TIGHTEST (most private)