Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 9 additions & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <patch|minor|major> --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`)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
2 changes: 1 addition & 1 deletion packages/create/package.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion packages/dom/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/elements/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@fundamental-engine/elements",
"version": "0.9.4",
"version": "0.9.5",
"description": "Web-component keystone for Fundamental — the <field-root> custom element + declarative data-body bodies.",
"type": "module",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/react/package.json
Original file line number Diff line number Diff line change
@@ -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 <FieldField> component + useFieldField hook.",
"type": "module",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/three/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion packages/vanilla/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion swift/Sources/FundamentalCore/Engine/FieldSnapshot.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading