Skip to content

Commit bf16ad1

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-20749-test-strings-f
2 parents 89c4b30 + 18c2ddc commit bf16ad1

31 files changed

Lines changed: 1490 additions & 387 deletions
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
"@objectstack/metadata-protocol": minor
3+
---
4+
5+
fix(metadata-protocol)!: an item's lock is the strictest lock among the stored rows in scope for its address, at the write doors and on both reads (#21761)
6+
7+
Clause-②: no (narrowing)
8+
9+
ADR-0048 lets one item (type, name, organization scope) hold several stored `sys_metadata` rows: one per package (`?package=` saves) and a package-less one. The ADR-0010 `_lock` gate asked for the item with no package and bound whichever row the store returned first, while `getMetaItem` and `getMetaItemLayered` naming a package reported that package's row. So a read and the door could state two different locks for one item, and the door's answer depended on row order.
10+
11+
Now every caller selects the lock from the item's address through one function: the strictest lock among the item's stored rows in scope. The scope is ADR-0005's (the organization's rows when it holds any row of the item, else the env-wide rows), and within it every row of the item counts, whichever package it is bound to. The strictest lock refuses a write when any of those rows refuses it, and a delete likewise; two rows that refuse different verbs (`no-overlay` and `no-delete`) give `full`. Both reads report that lock in `lock`, `editable` and `deletable`, the served body carries its `_lock` family, and the list item and the `getMetaDiagnostics` locked count follow it. Content stays prefer-local: a read naming a package is still served that package's own row.
12+
13+
**What moves for consumers.** The door now refuses where it used to depend on which row the store returned first:
14+
15+
- a package-less row declaring no lock and a package's row declaring `full`: a save or delete, with or without `?package=`, is refused `403 ITEM_LOCKED` in every row order, where it was admitted when the package-less row came back first;
16+
- a package's row declaring `none` and a package-less row declaring `full`: refused in every row order, where it was admitted when the package's row came back first. A package row's explicit `none` is not a grant over another row's lock;
17+
- two rows refusing different verbs (`no-overlay`, `no-delete`): both a save and a delete are refused, where each was admitted under the row order that bound the other row;
18+
- another package's row of the same name declaring a lock binds a save naming this package too, as it did under the row order that returned it first.
19+
20+
No write the door refused before is admitted now. Both reads become stricter in exactly those arrangements: a read naming a package whose own row declares `none` now reports `editable: false` when another row in scope declares `full`. No key, export, status or error code changes.
21+
22+
<!-- adr-0087: not-required (no-migration-prescription) the write doors refuse, by the strictest lock among the stored rows in scope, writes they used to admit when the store returned a looser row first. No authorable key, spelling, export or stored shape moves: every stored row keeps parsing, nothing is read or rewritten at rest, and which row an administrator meant to lock is not something a ledger entry can rewrite. The other categories are closed on facts: the package publishes (not unpublished); no ADR-0087 id covers the lock gate (not already-registered); and the change is a door verdict, not a declaration (not runtime-interface-only or type-surface-only). -->

‎.changeset/console-9dfaca654311.md‎

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
---
2+
"@objectstack/console": minor
3+
---
4+
5+
Console (objectui) refreshed to `9dfaca654311`. Frontend changes in this range:
6+
7+
Derived from the changesets objectui declared over the range — 24 releasing of 24 changesets added across 17 non-merge commits.
8+
9+
- **minor** — **BREAKING** — The default (`simple`) `object-form` draws a self-describing inline section entry, as the `tabbed`, `wizard`, `split`, `drawer` and `modal` forms already did (objectui#11615). Bef… (objectui `9dfaca654`)
10+
- **minor** — The `record:related_list` registration no longer declares `columns` required, so the page compile accepts a related list that lists no columns of its own (objectui#11613). (objectui `4c127cdef`)
11+
- **minor** — The record page header draws the record's picture beside its title, from the field the object names in its object-level `imageField` (`@objectstack/spec` 17.6.0, objectstack#21182… (objectui `c096f0327`)
12+
- **minor** — **BREAKING** — A form view's `subforms[].columns` entry is judged by `@objectstack/spec`'s `InlineGridColumnSchema` now, by reference, so `objectui validate` and `os validate` give one verdict o… (objectui `9db9ff3f9`)
13+
- **minor** — **BREAKING — `PartialSchema<T>` is RETIRED from `@object-ui/types`** (objectui#11608, enforce-or-remove). The utility type leaves the `.` entry, the one entry that published it, w… (objectui `8b14aecbd`)
14+
- **minor** — **BREAKING** — The `grid` field's eight field-level keys are camelCase now, and their snake_case spellings are retired and refused by name on every face (objectui#11610). (objectui `2abec3a96`)
15+
- **minor** — **`BaseSchema` no longer declares `[key: string]: any`** (objectui#8347, executing the objectui#7927 ruling: the TypeScript face is a contract). Every node type extends `BaseSchem… (objectui `b403bb36f`)
16+
- **minor** — All ten locale packs gain `view.noObject`, the hint an object-bound block shows when its node names its object in neither place (objectui#11605). (objectui `fd060f076`)
17+
- **minor** — The `object-chart` and `view:chart` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a ch… (objectui `fd060f076`)
18+
- **minor** — The `object-metric` and `object-pivot` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a… (objectui `fd060f076`)
19+
- **minor** — The `object-form`, `view:form`, `embeddable-form` and `object-master-detail-form` registrations no longer declare `objectName` required, so the page compile accepts a node whose `… (objectui `fd060f076`)
20+
- **minor** — The `object-grid` and `view:grid` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object (objectui#1… (objectui `fd060f076`)
21+
- **minor** — The `object-kanban` registration no longer declares `objectName` required, so the page compile accepts a board whose `dataSource` binding names the object, and a board that names… (objectui `fd060f076`)
22+
- **minor** — The `list-view` and `view:list` registrations no longer declare `objectName` required, so the page compile accepts a node whose `dataSource` binding names the object, and a list t… (objectui `fd060f076`)
23+
- **minor** — `ElementDataSourceGate` takes a `requiresObject` prop: when a placement opts in and its node names its object in neither place, the gate renders a short "no object named" hint ins… (objectui `fd060f076`)
24+
- **minor** — A Studio form field that declares the `ref:dataset` widget now renders a dataset picker instead of the JSON editor fallback (objectui#11601). (objectui `b508ac50d`)
25+
- **minor** — The console asks `GET /api/v1/usage/storage` only when the runtime serves it (objectui#11002). On a self-hosted or open-source runtime, an environment admin's console used to requ… (objectui `d2e859936`)
26+
- **minor** — The `record:line_items` registration no longer declares `childObject` required, so the page compile accepts a node whose `dataSource` binding names the child object (objectui#1156… (objectui `902ebab63`)
27+
- **patch** — `deriveColumns`, the default columns of a master-detail inline grid whose author listed none, now takes which columns it draws, their order and which of them are `defaultHidden` f… (objectui `15f67025b`)
28+
- **patch** — An object page's view tab, and the breadcrumb that names the open view, draw the label of a view the object document embeds as the server served it (objectui#11336). (objectui `6e9090c26`)
29+
- **patch** — The docs portal's book sidebar now shows what the book resolver answers, with nothing narrowing the docs in front of it (objectui#11340, ADR-0046 §6.4). The resolver decides book… (objectui `7c9a6b194`)
30+
- **patch** — Studio's "Organization flows" page no longer says its drafts publish atomically, and a deep link to a flow that is not on the page no longer says no metadata designers are registe… (objectui `b92329c89`)
31+
- **patch** — On a read-only package, a click on a flow canvas node in Studio Automations selects the node and opens its inspector read-only again (objectui#11546). (objectui `278d2444e`)
32+
- **patch** — fix(plugin-detail): `record:details` read mode shows a `textarea` value with its line breaks (objectui#11577) (objectui `b61c116b2`)
33+
34+
⚠️ 4 of these carry a breaking change: 4 by the author's own breaking annotation in the changeset body — objectui declares no `major` inside a launch window (`scripts/check-changeset-no-major.mjs`). Each is marked **BREAKING** in the list above — read them before compiling the release record.
35+
36+
<!-- adr-0087: not-required (no-migration-prescription)
37+
This diff moves `.objectui-sha` and the artefacts that travel with it: this console
38+
changeset, the regenerated `sdui.manifest.json` and its record
39+
`scripts/sdui-manifest.record.json`, the re-recorded
40+
`packages/sdui-parser/objectui-lockstep.json` (objectui's `packages/sdui-parser/src` is
41+
byte-identical across the range) and the re-measured pin citations in `packages/spec/src`,
42+
which carry their own `@objectstack/spec` patch changeset. It adds, removes or renames no
43+
ObjectStack-authorable key: no Zod schema, no spec declaration and no stored
44+
`sys_metadata` shape moves in it, so `objectstack migrate meta` has nothing here to
45+
rewrite, and this body carries no FROM/TO prescription of its own.
46+
The range carries five declared-breaking objectui changes: four changesets carry the
47+
author's breaking annotation, and a fifth commit's subject carries `!` (objectui#8347,
48+
`b403bb36f`, whose changeset states `Clause-②: yes (narrowing)` without the word). Each
49+
is objectui's own package surface, with its upstream record, and each is answered here:
50+
(1) objectui#11615 (`9dfaca654`): `ObjectFormSection.fields` gains the spec's
51+
`FormFieldInput` arm, which breaks TypeScript readers of that objectui type; no code in
52+
this repository imports `@object-ui/types`. The default `simple` form now draws a
53+
self-describing inline section entry, as the other five form types already did; no
54+
example in this repository authors a `simple` `object-form` with an inline section
55+
entry, and no authored document has to change.
56+
(2) objectui#11266 (`9db9ff3f9`): objectui's zod and TypeScript faces judge a form
57+
view's `subforms[].columns` entry by `@objectstack/spec`'s own `InlineGridColumnSchema`,
58+
the closed shape this repository has enforced since objectstack#20927, so objectui's
59+
validator now gives the verdict `os validate` already gave; the ObjectStack accept set
60+
does not move.
61+
(3) objectui#11608 (`8b14aecbd`): `PartialSchema` leaves `@object-ui/types`; nothing in
62+
this repository names it.
63+
(4) objectui#11610 (`2abec3a96`, objectui#11614): the `grid` widget's eight field-level
64+
keys are camelCase, and the snake_case spellings are refused by name. The ObjectStack
65+
runtime form field (`buildObjectFormRuntimeField`, `ui/component.zod.ts`) already refuses
66+
the snake_case spellings by name, with guidance naming objectui#11610, so no document
67+
this contract admits carries them. The camelCase spellings are not declared there yet:
68+
until objectstack#21768 declares them, an ObjectStack-authored `grid` field takes its
69+
`columns` and the widget's own defaults. That declaration widens a closed field and
70+
carries its own record.
71+
(5) objectui#8347 (`b403bb36f`): `BaseSchema` loses its index signature, a TypeScript
72+
narrowing of objectui's node types; no code in this repository compiles against them,
73+
and objectui's zod faces keep their accept sets for every key but `visibleWhen`, which
74+
widens on both to the `{ dialect, source }` envelope this repository's own parse writes.
75+
Where an entry mirrors an ObjectStack key, the ledger entry belongs to the
76+
`packages/spec` PR that lands it, never to the pin bump.
77+
Scope of the claim, stated rather than implied: it is a claim about THIS diff, not a
78+
per-entry re-measurement of the upstream declared-breaking entries.
79+
-->
80+
81+
objectui range: `2e818d0b51ec...9dfaca654311`
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
The spec's objectui citations, and the shipped description text that names the `.objectui-sha` pin (the `FormField.span` describe and six migration-entry descriptions), are re-measured against the new console pin, objectui `9dfaca654311`.
6+
7+
Clause-②: no
8+
9+
Every anchor was mapped through the objectui diff `2e818d0b51ec..9dfaca654311` and re-read at the new pin. One cited line changed: `ObjectKanban.tsx:10`, the type import, gained `SortConfig` beside the `ObjectKanbanSchema` the record cites. Every other change in a cited file sits outside the cited lines, and the anchors moved with their text byte-identical:
10+
11+
- `plugin-grid/src/ObjectGrid.tsx`, `plugin-tree/src/ObjectTree.tsx`, `plugin-gantt/src/ObjectGantt.tsx`, `plugin-calendar/src/ObjectCalendar.tsx`, `react/src/SchemaRenderer.tsx`, `plugin-map/src/index.tsx`, `plugin-gantt/src/index.tsx` and `plugin-view/src/ObjectView.tsx`: objectui#8347 re-worded docblocks that described `BaseSchema`'s index signature. Anchors below those docblocks moved by at most three lines.
12+
- `plugin-kanban/src/ObjectKanban.tsx`: objectui#8347 added a private `GateBoundKanbanSchema` read type above the board's fetch, so the fetch, the navigation reads and the spread into `KanbanBoardCore` moved by 30 lines. The board still reads `limit` and `navigation` as `ObjectKanbanSchema` declares them.
13+
- `plugin-kanban/src/index.tsx`, `plugin-dashboard/src/index.tsx` and `react/src/element-data-source/ElementDataSourceGate.tsx`: objectui#11605 made `objectName` a non-required input and added the "no object named" hint. The `object-metric` icon input moved from `:281` to `:299`, and it is still `{ name: 'icon', type: 'string' }`.
14+
- `components/src/renderers/layout/containers.tsx`: objectui#11619 added the record picture to the record chrome. The `page:tabs` and `page:accordion` icon anchors moved by three lines.
15+
- `packages/types/src/objectql.ts` and `packages/types/src/zod/objectql.zod.ts`: objectui#11615, objectui#11266 and objectui#8347 grew declarations above the cited members. `ObjectKanbanSchema.limit`, `ObjectMapConfigSchema` and `LIST_VIEW_LOCAL_OVERRIDES` moved with their text byte-identical.
16+
17+
The six migration entries' corpus counts were re-taken with `git grep -o -F`, the method that first reproduced every `2e818d0b51ec` number. The corpus is now 7632 tracked files. Every zero still reads zero; the three new `Span` hits are a `colSpan` in an objectui test.
18+
19+
No key, default, enum member or export moves.

‎.objectui-sha‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6
1+
9dfaca654311cddd81714153c4f82c241d7cdc54

0 commit comments

Comments
 (0)