Skip to content

Commit 00a798b

Browse files
committed
Merge origin/main (6158e4c, objectui#11531) into objectui#10813's slice
main's 17.6.0 squash has the same tree as the old trunk tip 0507d67. Three paths conflicted against the squash's parent as merge base: - .changeset/11438-objectstack-17-6-bump.md: main's corrected sentence. - FilterConditionField.operators.test.ts: the slice's version, since main carries no change to it past the trunk the slice already holds. - pnpm-lock.yaml: main's copy regenerated with pnpm install. Only the fields and app-shell @objectstack/spec specifiers differ from main. The merged tree equals git merge-tree of 0507d67 and 20770e4. Claude-Session: https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn Co-authored-by: Claude <noreply@anthropic.com>
2 parents 20770e4 + 6158e4c commit 00a798b

6 files changed

Lines changed: 91 additions & 5 deletions

File tree

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@object-ui/types': patch
3+
---
4+
5+
Raise `@object-ui/types`' declared `@objectstack/spec` floor from `^17.5.0` to
6+
`^17.6.0` (objectui#11227). The package's published types now read
7+
`EmptyState` from `@objectstack/spec/ui`, because the `object-grid`
8+
`emptyState` member is typed by reference to the protocol's own shape, and its
9+
published zod mirror reads `EmptyStateSchema` from the same subpath. Neither
10+
export exists in `@objectstack/spec` 17.5.0, which the old range admitted; both
11+
ship from 17.6.0. A consumer resolution landing on 17.5.0 therefore got types
12+
and a mirror that name exports their declared spec dependency does not have.
13+
14+
Nothing moves at runtime in this repository: the lockfile already resolves
15+
`@objectstack/spec` 17.6.0 for this specifier, so only the declared range was
16+
stale. For a consumer, the range now refuses `@objectstack/spec` 17.5.0. The
17+
instrument that re-derives this floor is `pnpm check:spec-floors`, read over a
18+
full workspace build.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Test-only change in `@object-ui/core`; no published behaviour changes. Under objectui#11438 ruling A″, row 5 of the `@objectstack/spec` 17.6.0 bump, `ActionSchema.outcomeMessages`, is booked as owed to objectui#11344 in `actionKeys.pin.test.ts`, with an expiry (2026-11-02, or when objectui#11344's slice lands, whichever is first). The file's spec-inventory row now requires its `missing` set to equal that one-entry ledger exactly, and a new row asserts today's difference: the spec declares the key, and neither `SPEC_ACTION_KEYS` nor `KNOWN_ACTION_KEYS` knows it. The file sits under `packages/core/src/actions/__tests__/`, which the package's `tsconfig.json` excludes from the build program, so the published `dist` does not carry it.

‎.changeset/11438-objectstack-17-6-bump.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
'@object-ui/console': patch
55
---
66

7-
objectui now resolves `@objectstack/*` 17.6.0 (objectui#11438). No declared range moves: every `@objectstack/*` range already admits 17.6.0, and `check:spec-floors` finds no floor that has to rise. Everything below is a contract move 17.6.0 made, and it already reaches any consumer that resolves `@objectstack/spec ^17.6`.
7+
objectui now resolves `@objectstack/*` 17.6.0 (objectui#11438). One declared range moves: `@object-ui/types` raises its `@objectstack/spec` floor to `^17.6.0` in objectui#11227's own changeset, because its published types read `EmptyState` / `EmptyStateSchema`, which 17.5.0 does not export. Every other `@objectstack/*` range already admits 17.6.0 and stays as it was, and `check:spec-floors` names no other floor that has to rise. Everything below is a contract move 17.6.0 made, and it already reaches any consumer that resolves `@objectstack/spec ^17.6`.
88

99
- `@object-ui/components`: the `page:header` registration no longer publishes a `breadcrumb` input. 17.6.0 retires the key (objectstack#20758) and refuses it by name; the renderer has ignored it since objectui#11166.
1010
- `@object-ui/i18n`: a served translation document is recognised as a spec payload when it carries only the `picklists` group, which 17.6.0's `GetTranslationsResponseSchema` adds. Such a bundle used to be returned untransformed, so nothing read it. The group is now namespaced under `app` like every other group.

‎packages/core/src/actions/__tests__/actionKeys.pin.test.ts‎

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313
* Discrimination proof for the guard below: with `ACTION_DEF_KEYS` complete these
1414
* pass; dropping any single entry (e.g. `target`) fails with
1515
* "ActionDef declares keys the inventory is missing: target".
16+
*
17+
* ## OWED TO objectui#11344 — a bounded ledger, not a skip
18+
*
19+
* `@objectstack/spec` 17.6.0's `ActionSchema` declares `outcomeMessages`, and
20+
* objectui does not read it yet: objectui#11344 builds the reader and lists the
21+
* key with it. Until then the key is booked in `OWED_TO_OBJECTUI_11344` below.
22+
* Its row asserts today's difference, and "lists every key the spec
23+
* ActionSchema declares" requires `missing` to EQUAL the ledger exactly, so a
24+
* new spec key is red, and so is the booked key once objectui lists it.
1625
*/
1726
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
1827
import { readFileSync } from 'node:fs';
@@ -87,6 +96,38 @@ function specActionKeys(): string[] {
8796
return keys;
8897
}
8998

99+
/**
100+
* ⚠️ OWED TO objectui#11344 — the spec `ActionSchema` keys objectui's inventory
101+
* does NOT list yet, booked rather than skipped.
102+
*
103+
* `@objectstack/spec` 17.6.0 declares `outcomeMessages` on `ActionSchema`
104+
* (objectstack#21095): success copy per handler outcome, and the spec's own
105+
* landing order names objectui#11344 as its console reader. objectui does not
106+
* read it yet, so `SPEC_ACTION_KEYS` does not list it and the runner's
107+
* unknown-key warning still names it. objectui#11344 owns the reader, and lists
108+
* the key in the same change.
109+
*
110+
* Booked by objectui#11438 ruling A″ (record 5968177777), which applies
111+
* objectui#11111 decision 3 = B (record 5902351047) to the bump. The listed
112+
* key's row asserts TODAY's difference (the spec declares it; objectui's
113+
* inventory does not know it), and "lists every key the spec ActionSchema
114+
* declares" requires `missing` to EQUAL this list, with `stale` still empty. A
115+
* new spec key is red, and so is a listed key objectui starts knowing: the
116+
* entry goes stale, by name, when objectui#11344's reader lands, and that change
117+
* strikes it.
118+
*
119+
* EXPIRES when objectui#11344's slice lands, or 2026-11-02, whichever is first.
120+
* The landing is caught by the rows below going red; the date is read by
121+
* objectui#11344, not by a clock.
122+
*/
123+
const OWED_TO_OBJECTUI_11344 = ['outcomeMessages'];
124+
125+
/** The reason every owed row prints when it fails. */
126+
const OWED_REASON =
127+
'OWED TO objectui#11344: objectui does not read the spec ActionSchema key yet, so the inventory does not list it. ' +
128+
'Booked by objectui#11438 ruling A″ (record 5968177777), applying objectui#11111 decision 3 = B ' +
129+
'(record 5902351047). Expires when objectui#11344\'s slice lands, or 2026-11-02, whichever is first.';
130+
90131
describe('action key inventory (objectstack#4075 step 1)', () => {
91132
it('ActionDef has NO index signature, and ActionContext still does', () => {
92133
// The successor to step 1's inverted pin. That one asserted the index
@@ -124,8 +165,13 @@ describe('action key inventory (objectstack#4075 step 1)', () => {
124165
const stale = (SPEC_ACTION_KEYS as readonly string[]).filter((k) => !spec.includes(k));
125166
// `missing` means the spec grew a key objectui does not know about; `stale`
126167
// means it dropped one. Either way the inventory has to be re-derived, and
127-
// the diff names exactly which key moved.
128-
expect({ missing, stale }).toEqual({ missing: [], stale: [] });
168+
// the diff names exactly which key moved. The one exception is the booked
169+
// ledger: `missing` must EQUAL `OWED_TO_OBJECTUI_11344`, not merely contain
170+
// it, so the booking cannot outlive the reader that strikes it.
171+
expect({ missing: [...missing].sort(), stale }, OWED_REASON).toEqual({
172+
missing: [...OWED_TO_OBJECTUI_11344].sort(),
173+
stale: [],
174+
});
129175
});
130176

131177
it('`execute` is still a live spec tombstone, so it must not count as known', () => {
@@ -181,6 +227,24 @@ describe('action key inventory (objectstack#4075 step 1)', () => {
181227
});
182228
});
183229

230+
describe('objectui#11344 — OWED: the spec ActionSchema declares these keys and objectui does not know them today', () => {
231+
it.each(OWED_TO_OBJECTUI_11344)('OWED TO objectui#11344: `%s` is declared by the spec ActionSchema, and neither the inventory nor the runner knows it', (key) => {
232+
// All three halves are asserted together. The first keeps the ledger
233+
// honest: a key the spec does not declare is not owed to anyone. The other
234+
// two are the difference: `SPEC_ACTION_KEYS` is the inventory the cap row
235+
// reads, and `KNOWN_ACTION_KEYS` is what the unknown-key warning reads, so a
236+
// reader that lists the key on either side turns this row red.
237+
expect(
238+
{
239+
declaredBySpec: specActionKeys().includes(key),
240+
inSpecActionKeys: (SPEC_ACTION_KEYS as readonly string[]).includes(key),
241+
knownToTheRunner: KNOWN_ACTION_KEYS.has(key),
242+
},
243+
OWED_REASON,
244+
).toEqual({ declaredBySpec: true, inSpecActionKeys: false, knownToTheRunner: false });
245+
});
246+
});
247+
184248
describe('unknown-key warning', () => {
185249
let warn: ReturnType<typeof vi.spyOn>;
186250

‎packages/types/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
"directory": "packages/types"
9494
},
9595
"dependencies": {
96-
"@objectstack/spec": "^17.5.0",
96+
"@objectstack/spec": "^17.6.0",
9797
"zod": "^4.6.1"
9898
},
9999
"devDependencies": {

‎pnpm-lock.yaml‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)