Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
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
10 changes: 10 additions & 0 deletions .changeset/13261-objectstack-pin-18-0-0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
---

No package released: the `@objectstack/*` pin moves to objectstack's 18.0.0 version commit `06cab4849a`, and nothing objectui publishes changes behaviour (objectui#13261).

`.objectstack-sha` and the packed manifests in `.objectstack-pin/` move with it; `pnpm-lock.yaml` does not (the packed manifests declare the same dependency names, and a frozen install accepts the lockfile). The publish floor `scripts/objectstack-floor.mjs` computes at this pin is 18.0.0.

The published sources touched are doc comments only. Sentences that state which `@objectstack/spec` is installed were re-measured against the 18.0.0 build, on the same probes as at the old pin with identical answers, and restamped `18.0.0` (`check:installed-pin-claims`). `tsc` keeps some of those comments in emitted `dist/` files, which are published, but they change no export, type or behaviour, so they release nothing and ship with the next release of the group.

The tests that moved with the pin follow the spec's retirement of the list view's `filterableFields` (objectstack#24640), whose reader objectui#13118 had already removed: the sixth census bucket of `object-view-unmirrored-keys-7779` empties into the protocol-retired ones, the `list-view` parity exemption leaves, and the live-e2e backend pin reads `18.0.0`.
30 changes: 15 additions & 15 deletions .objectstack-pin/client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/client",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "Official Client SDK for ObjectStack Protocol",
"main": "dist/index.js",
Expand All @@ -13,23 +13,23 @@
}
},
"dependencies": {
"@objectstack/core": "18.0.0-next.5",
"@objectstack/spec": "18.0.0-next.5"
"@objectstack/core": "18.0.0",
"@objectstack/spec": "18.0.0"
},
"devDependencies": {
"@hono/node-server": "^2.1.1",
"@objectstack/driver-sqlite-wasm": "18.0.0-next.5",
"@objectstack/hono": "18.0.0-next.5",
"@objectstack/metadata-core": "18.0.0-next.5",
"@objectstack/metadata-protocol": "18.0.0-next.5",
"@objectstack/objectql": "18.0.0-next.5",
"@objectstack/platform-objects": "18.0.0-next.5",
"@objectstack/plugin-auth": "18.0.0-next.5",
"@objectstack/plugin-hono-server": "18.0.0-next.5",
"@objectstack/rest": "18.0.0-next.5",
"@objectstack/runtime": "18.0.0-next.5",
"@objectstack/service-analytics": "18.0.0-next.5",
"@objectstack/service-automation": "18.0.0-next.5",
"@objectstack/driver-sqlite-wasm": "18.0.0",
"@objectstack/hono": "18.0.0",
"@objectstack/metadata-core": "18.0.0",
"@objectstack/metadata-protocol": "18.0.0",
"@objectstack/objectql": "18.0.0",
"@objectstack/platform-objects": "18.0.0",
"@objectstack/plugin-auth": "18.0.0",
"@objectstack/plugin-hono-server": "18.0.0",
"@objectstack/rest": "18.0.0",
"@objectstack/runtime": "18.0.0",
"@objectstack/service-analytics": "18.0.0",
"@objectstack/service-automation": "18.0.0",
"tsx": "^4.23.15",
"typescript": "^6.0.3",
"vitest": "^4.1.11"
Expand Down
8 changes: 4 additions & 4 deletions .objectstack-pin/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/core",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "Microkernel Core for ObjectStack",
"type": "module",
Expand All @@ -19,16 +19,16 @@
}
},
"devDependencies": {
"@objectstack/metadata-core": "18.0.0-next.5",
"@objectstack/metadata-core": "18.0.0",
"@objectstack/refd-timer-testkit": "0.1.0",
"@types/node": "^26.6.3",
"esbuild": "^0.28.2",
"typescript": "^6.0.3",
"vitest": "^4.1.11"
},
"dependencies": {
"@objectstack/spec": "18.0.0-next.5",
"@objectstack/types": "18.0.0-next.5",
"@objectstack/spec": "18.0.0",
"@objectstack/types": "18.0.0",
"zod": "^4.6.5"
},
"keywords": [
Expand Down
4 changes: 2 additions & 2 deletions .objectstack-pin/formula/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/formula",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "ObjectStack canonical expression engine — CEL (cel-js) + ObjectStack stdlib + dialect registry",
"main": "dist/index.js",
Expand All @@ -14,7 +14,7 @@
},
"dependencies": {
"@marcbachmann/cel-js": "^8.0.0",
"@objectstack/spec": "18.0.0-next.5"
"@objectstack/spec": "18.0.0"
},
"devDependencies": {
"@types/node": "^26.6.3",
Expand Down
8 changes: 4 additions & 4 deletions .objectstack-pin/lint/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/lint",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "Static, build-time validation for an ObjectStack metadata graph — dashboard widget bindings, CEL/predicate expressions, and more. Pure (stack) => Issue[] functions shared by the CLI's `os validate` and any other consumer (e.g. AI authoring). Depends on @objectstack/spec; never on a runtime.",
"type": "module",
Expand Down Expand Up @@ -39,9 +39,9 @@
}
},
"dependencies": {
"@objectstack/formula": "18.0.0-next.5",
"@objectstack/sdui-parser": "18.0.0-next.5",
"@objectstack/spec": "18.0.0-next.5",
"@objectstack/formula": "18.0.0",
"@objectstack/sdui-parser": "18.0.0",
"@objectstack/spec": "18.0.0",
"ajv": "^8.20.0",
"ajv-formats": "^3.0.1",
"sucrase": "^3.35.1",
Expand Down
2 changes: 1 addition & 1 deletion .objectstack-pin/sdui-parser/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/sdui-parser",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "ObjectStack constrained JSX-source → SDUI SchemaNode tree compiler (parse, never execute). Isomorphic, zero React. ADR-0080.",
"main": "dist/index.js",
Expand Down
2 changes: 1 addition & 1 deletion .objectstack-pin/spec/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/spec",
"version": "18.0.0-next.5",
"version": "18.0.0",
"description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations",
"license": "Apache-2.0",
"main": "dist/index.js",
Expand Down
4 changes: 2 additions & 2 deletions .objectstack-pin/types/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@objectstack/types",
"version": "18.0.0-next.5",
"version": "18.0.0",
"license": "Apache-2.0",
"description": "Shared interfaces describing the ObjectStack Runtime environment",
"main": "dist/index.js",
Expand All @@ -18,7 +18,7 @@
}
},
"dependencies": {
"@objectstack/spec": "18.0.0-next.5"
"@objectstack/spec": "18.0.0"
},
"devDependencies": {
"typescript": "^6.0.3",
Expand Down
2 changes: 1 addition & 1 deletion .objectstack-sha
Original file line number Diff line number Diff line change
@@ -1 +1 @@
f4755a68a797d5a000cb8bd1c942cb2a9862108e
06cab4849a8a616487d468a11dd370e929137990
13 changes: 7 additions & 6 deletions apps/console/src/__tests__/registry-inputs-spec-parity.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1654,14 +1654,15 @@ const UNPUBLISHED_EXEMPTIONS: Record<string, string> = {
* `requiredPermissions`, which `ListViewBlock` now honours on a page node
* (`ListViewBlock.inertKeys-13074.test.tsx`). objectui#13089 struck
* `addRecord`, whose Add button the console's page host now serves a create
* for (`PageView.listViewAddRecord-13089.test.tsx`).
* for (`PageView.listViewAddRecord-13089.test.tsx`). The pin move to
* `@objectstack/spec` 18.0.0 (objectui#13261) struck `filterableFields`: the
* row carries the spec's retirement tombstone there (objectstack#24640), so
* the key is a harvested tombstone, not an unpublished live key.
*/
'list-view.name':
'Unpublished by measurement (objectui#13047): read by nothing on a page `list-view` node. The node draws, queries and hands its view the same thing with and without it — the view\'s own `name` is its identity in metadata, which an embedded list has no use for.',
'list-view.sharing':
'Unpublished by measurement (objectui#13047): `sharing.type` draws a Share button with no click handler, and the sharing config is enforced nowhere in the renderer. Publishing it would advertise a dead control (objectui#13047\'s report).',
'list-view.filterableFields':
'Unpublished, and RETIRED (objectui#13118): the row declares it as the legacy shorthand of `userFilters.fields`, which nothing honours, and the list read it as the Filter panel\'s field list until `@objectstack/spec` retired the key in 18.0 (objectstack#24640, ruling C: no per-view Filter-panel whitelist replaces it). Nothing reads it now. The entry dies at the pin that carries the spec\'s tombstone, when the row stops declaring the key live.',
};

/**
Expand Down Expand Up @@ -3179,11 +3180,11 @@ const MEMBER_PINS: Record<string, MemberPin> = {
},
'object-grid.data': {
file: 'packages/plugin-grid/src/__tests__/gridDataInputContract.test.ts',
pins: 'The `object` arm is `ViewDataSchema` discriminated on `provider`: each of the three providers parses and the retired `api` one is refused (spec 18.0.0-next.5, objectui#12370, objectui#12971), none of them is an array, the declaration is one shape across both registered tags so the alias cannot drift, and it is pinned at compile time too (objectui#5090).',
pins: 'The `object` arm is `ViewDataSchema` discriminated on `provider`: each of the three providers parses and the retired `api` one is refused (spec 18.0.0, objectui#12370, objectui#12971, objectui#13261), none of them is an array, the declaration is one shape across both registered tags so the alias cannot drift, and it is pinned at compile time too (objectui#5090).',
},
'object-grid.conditionalFormatting': {
file: 'packages/plugin-grid/src/__tests__/gridRowDecorationMembers-8071.test.tsx',
pins: 'The members read inside ONE formatting rule, asserted on the `style` attribute of the `<tr>` the grid paints. THREE alternative predicate members with a PRECEDENCE between them — one rule carrying `condition`, `expression` and the native `field`/`operator`/`value` triple, each naming a DIFFERENT row, is decided by `condition`; drop it and `expression` decides; drop that and the triple does — so a renderer reading any two of them as equivalent is red in a specific direction rather than merely unpinned. FOUR style members, and the sharp one is a RENAME: `backgroundColor` and `borderColor` keep their authored names on the way to the DOM while `textColor` is read as the CSS `color`, so keeping the authored spelling hands React a key it silently drops — same rules, same background, the text colour gone with nothing thrown. `style` is pinned as the BASE the three colour members override rather than replace (a non-colour member of it survives alongside the override). Two rule-list facts complete it: FIRST-MATCH-WINS with no merge (the second matching rule\'s own `textColor` never lands) and a rule carrying NO predicate member is SKIPPED rather than read as always-true, with the rule after it still deciding. ⚠️ Since objectui#11533 the AUTHORED member is ONE dialect, `{ condition, style }`: `expression`, the native triple and the three top-level colour members are refused by name on `ObjectGridSchema` and the list view (`packages/types/src/__tests__/grid-list-view-conditional-formatting-11533.test.ts`), so the rows that write them pin STORED-rule reads, which the resolver keeps as compatibility arms; a last block pins the two facts side by side — the stored native rule refused at authoring and painted at render, with its respelling painting the same row. The registration is an `array` arm; the installed spec row (18.0.0-next.5, re-measured by objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971) takes the list view\'s own `{ condition, style }` rule and refuses the native members and any other key, so the spec fixes the AUTHORED shape and the read site is the rest of the member contract, the stored-rule compatibility arms included (objectui#8071 slice 12).',
pins: 'The members read inside ONE formatting rule, asserted on the `style` attribute of the `<tr>` the grid paints. THREE alternative predicate members with a PRECEDENCE between them — one rule carrying `condition`, `expression` and the native `field`/`operator`/`value` triple, each naming a DIFFERENT row, is decided by `condition`; drop it and `expression` decides; drop that and the triple does — so a renderer reading any two of them as equivalent is red in a specific direction rather than merely unpinned. FOUR style members, and the sharp one is a RENAME: `backgroundColor` and `borderColor` keep their authored names on the way to the DOM while `textColor` is read as the CSS `color`, so keeping the authored spelling hands React a key it silently drops — same rules, same background, the text colour gone with nothing thrown. `style` is pinned as the BASE the three colour members override rather than replace (a non-colour member of it survives alongside the override). Two rule-list facts complete it: FIRST-MATCH-WINS with no merge (the second matching rule\'s own `textColor` never lands) and a rule carrying NO predicate member is SKIPPED rather than read as always-true, with the rule after it still deciding. ⚠️ Since objectui#11533 the AUTHORED member is ONE dialect, `{ condition, style }`: `expression`, the native triple and the three top-level colour members are refused by name on `ObjectGridSchema` and the list view (`packages/types/src/__tests__/grid-list-view-conditional-formatting-11533.test.ts`), so the rows that write them pin STORED-rule reads, which the resolver keeps as compatibility arms; a last block pins the two facts side by side — the stored native rule refused at authoring and painted at render, with its respelling painting the same row. The registration is an `array` arm; the installed spec row (18.0.0, re-measured by objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971, objectui#13261) takes the list view\'s own `{ condition, style }` rule and refuses the native members and any other key, so the spec fixes the AUTHORED shape and the read site is the rest of the member contract, the stored-rule compatibility arms included (objectui#8071 slice 12).',
},
'object-grid.operations': {
file: 'packages/plugin-grid/src/__tests__/gridOperationsMembers-8071.test.tsx',
Expand Down Expand Up @@ -3259,7 +3260,7 @@ const MEMBER_PINS: Record<string, MemberPin> = {
},
'object-kanban.conditionalFormatting': {
file: 'packages/plugin-kanban/src/__tests__/ObjectKanban.structuredMembersReachTheirSinks-8313.test.tsx',
pins: 'Members are card STYLE RULES in ONE dialect since objectui#11522, the spec list view\'s `{ condition, style }`, and it reaches the sink: a rule colours the matching card and only it, a second rule aimed at the other card does the same, and the whole `style` map arrives, with the sibling card in the same render as the live non-matching control so a green cannot come from two unstyled cards agreeing. The retired native `{ field, operator, value }` and flat-colour dialects are refused by name on the types side (`packages/types/src/__tests__/kanban-conditional-formatting.test.ts`); these rows are their respellings, painting the same cards. ⛔ NOT an identity pin and not a wire pin: `ObjectKanban.tsx` never names this key at all (measured zero, against nine for `cardFields` in the same file) — it rides the `{ ...schema }` spread into `KanbanRenderer`, which forwards it to `KanbanImpl`\'s `getCardStyles`. That makes the pin load-bearing in a way the others are not: an edit replacing that spread with an explicit key list drops the key silently and nothing else in the repo would notice. The installed spec row (18.0.0-next.5, re-measured by objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971) takes the list view\'s own `{ condition, style }` rule, so the spec fixes the authored shape and the read site is the rest of the member contract (objectui#8313).',
pins: 'Members are card STYLE RULES in ONE dialect since objectui#11522, the spec list view\'s `{ condition, style }`, and it reaches the sink: a rule colours the matching card and only it, a second rule aimed at the other card does the same, and the whole `style` map arrives, with the sibling card in the same render as the live non-matching control so a green cannot come from two unstyled cards agreeing. The retired native `{ field, operator, value }` and flat-colour dialects are refused by name on the types side (`packages/types/src/__tests__/kanban-conditional-formatting.test.ts`); these rows are their respellings, painting the same cards. ⛔ NOT an identity pin and not a wire pin: `ObjectKanban.tsx` never names this key at all (measured zero, against nine for `cardFields` in the same file) — it rides the `{ ...schema }` spread into `KanbanRenderer`, which forwards it to `KanbanImpl`\'s `getCardStyles`. That makes the pin load-bearing in a way the others are not: an edit replacing that spread with an explicit key list drops the key silently and nothing else in the repo would notice. The installed spec row (18.0.0, re-measured by objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971, objectui#13261) takes the list view\'s own `{ condition, style }` rule, so the spec fixes the authored shape and the read site is the rest of the member contract (objectui#8313).',
},
'object-kanban.data': {
file: 'packages/plugin-kanban/src/__tests__/ObjectKanban.structuredMembersReachTheirSinks-8313.test.tsx',
Expand Down
2 changes: 1 addition & 1 deletion e2e/live/ci/backend.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#
# This file declares exactly ONE @objectstack pin, and that is the whole
# design: the commit is derived from it, see below.
OBJECTSTACK_VERSION=18.0.0-next.5
OBJECTSTACK_VERSION=18.0.0

# There is deliberately no OBJECTSTACK_REF key here. The objectstack-ai/objectstack
# commit the showcase app metadata is sparse-checked-out from is DERIVED at
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,12 @@ describe('control: a served schema with top-level properties renders as before (
);
expect(inputValue(`${SCOPE}name`)).toBe('crm_lead.compact');
expect(inputValue(`${SCOPE}label`)).toBe('Compact');
for (const field of ['type', 'filter', 'searchableFields', 'filterableFields']) {
for (const field of ['type', 'filter', 'searchableFields']) {
expect(byId(`${SCOPE}${field}`), field).not.toBeNull();
}
// `@objectstack/spec` 18.0.0 retired `filterableFields` (objectstack#24640)
// and the served `viewForm` stopped offering it (objectui#13261).
expect(byId(`${SCOPE}filterableFields`)).toBeNull();
expect(screen.getByRole('button', { name: /^#1 — name$/ })).toBeInTheDocument();
expect(screen.getByRole('button', { name: /^#2 — status$/ })).toBeInTheDocument();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -519,7 +519,7 @@ function loadRowCanon(): Promise<RowCanonModule | null> {
* not re-derived — and the engine's own message ships with it.
*
* ⚠️ The reason is NOT that the engine's message refuses a `record.<root>`
* rewrite. Measured against the installed 18.0.0-next.5 (objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971), it mostly PRESCRIBES one: the
* rewrite. Measured against the installed 18.0.0 (objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971, objectui#13261), it mostly PRESCRIBES one: the
* `current_user` text CONTAINS "To gate on record state, rewrite the predicate
* against `record`." — one of the three remedies it offers, and NOT where it
* ends (measured: `includes` true, `endsWith` false; every covered slot's text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ describe('boolean: a declared defaultValue seeds the control (objectui#8451, arm
// ⇒ `screen.waitForInput` is the offline undeclared boolean that sentence
// says does not exist — and it is undeclared CORRECTLY, so ⛔ do not read
// this as an objectui#9277-class omission waiting to be declared. Measured
// on the installed `@objectstack/spec` (18.0.0-next.5, objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971): `waitForInput` is typed
// on the installed `@objectstack/spec` (18.0.0, objectui#12030, objectui#12370, objectui#12626, objectui#12873, objectui#12971, objectui#13261): `waitForInput` is typed
// `z.boolean().optional()` with no `.default(...)`, so an omitted key
// materialises nothing and there is no spec answer for a declaration to
// mirror. Declaring one here would invent a default the runtime does not
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
*
* The table below is what `@objectstack/service-automation`'s
* `AutomationEngine` and the trigger packages read, at objectstack
* `18.0.0-next.5` (the installed `@objectstack/spec` line):
* `18.0.0` (the installed `@objectstack/spec` line):
*
* - `secret`: the API trigger arms from `config.secret` (`trigger-api`).
* - `objectName`: lifted into the `record_change` binding, which the
Expand Down
Loading
Loading