Repository navigation
chore: version packages - #21352
Merged
Merged
chore: version packages#21352
Conversation
This was referenced Oct 2, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 2, 2026 12:17
1fa5bd4 to
bf57f54
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 2, 2026 18:15
bf57f54 to
f872ccf
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 3, 2026 00:26
f872ccf to
5ca0351
Compare
This was referenced Oct 3, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 3, 2026 06:20
5ca0351 to
de11620
Compare
This was referenced Oct 3, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 3, 2026 13:44
de11620 to
ee5871f
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 3, 2026 18:41
ee5871f to
015a5e3
Compare
This was referenced Oct 3, 2026
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 4, 2026 01:08
015a5e3 to
9ae87d8
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 4, 2026 08:05
9ae87d8 to
8cb64e4
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 4, 2026 13:59
8cb64e4 to
08f741b
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
October 6, 2026 10:29
51a5344 to
d9af53a
Compare
Contributor
Author
📓 Docs Drift Check
What this run could not see
Coarse fallback — 168 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-zhuang
approved these changes
Oct 6, 2026
os-zhuang
enabled auto-merge
October 6, 2026 10:37
This was referenced Oct 6, 2026
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
… and ADR that decided them (stage 4 of objectstack-ai#20595) (objectstack-ai#21357) Part of objectstack-ai#20595 Clause-②: no ## What changed Stage 4 of the `domain:engine` lane of the dead-citation sweep: `packages/drivers/driver-sql/**`, comment and docblock prose only, per the claim (`5946343111`). Stages 1 to 3 landed as `a7d9768ec`, `d150c3039` and `4bf4e7e70`; objectstack-ai#20595 stays open for the next stage. Every comment or docblock site in the package that cited a tracker number answering 404 is rewritten in ruling C+D's form C (record `5749154545` on objectstack-ai#19123): the ADR when one records the decision, otherwise the commit in this repository's history that made it. That is **291 sites on 287 lines in 54 files, covering 39 numbers**, plus one dead comment-id citation on two lines: - **126 census sites** (122 lines, 6 files under `src/`): the whole `allocated-but-absent` population of the gate's own census in this package at the base, the slash-joined `objectstack-ai#7737/objectstack-ai#10629` and `objectstack-ai#14079/objectstack-ai#15683/objectstack-ai#17343` from the post-landing census (`5923084795`, now at `sql-driver.ts:12236` and `:16167`) included. That census's third driver-sql site, the URL-spelled `objectstack-ai#17590` at `:3933`, left the file in `58a77dbde2` before this base; - **165 test-comment sites** (165 lines, 48 test files), which the census defers. They carry 37 numbers: 24 the census itself reads as dead in this package's `src`, 5 more it reads as dead elsewhere in the repository, and 8 it never judges (they stand only in test files), which the board and a single read each settle; - **the dead comment id `5448627494`** (on objectstack-ai#11152, which is live), on two test-comment lines. **Anchors: 38 numbers by commit, 1 by ADR (ADR-0104's 2026-09-05 addendum), 0 by words alone; the comment id by commit.** 16 numbers reuse the anchor another lane or stage already measured for them, 23 were measured here (one of them split across two commits), and the comment id was measured here. 39 distinct shas. Only comments changed. Every file keeps its line count (291 lines out, 291 in, plus the changeset), so no line citation into any of them moves. No code token moves (the guard below). **No citation number is added**: on every changed line, the numbers on the new text are a subset of those on the old, and the diff-scoped gate judged the 10 citations left on changed lines: all 10 resolve. **A `patch` changeset**: 57 of the 122 rewritten non-test lines are in the published `dist` (the `.d.ts` keeps JSDoc on exported members, and esbuild keeps some comments in the JS), and `dist` is not byte-identical with the base text (see Changeset). ## Census: `driver-sql`, before and after **Instrument (A1).** The gate's own `node scripts/check-issue-citations.mjs --census --json`, read-only and unchanged. The count is its `allocated-but-absent` findings under `packages/drivers/driver-sql/`. | reading | tree | board | whole-repo `allocated-but-absent` | sites | lines | files | numbers | |---|---|---|---|---|---|---|---| | before | base `222ecc27f`, run 05:52:18Z to 05:55:43Z | enumerated, 192 pages, frontier objectstack-ai#21345, 19,166 records (newest number read before and after the run: objectstack-ai#21345) | 456 | **126** | 122 | 6 | 26 | | after | `286316ebd`, run 06:17:50Z to 06:21:10Z | enumerated, 192 pages, frontier objectstack-ai#21352, 19,173 records (newest before: objectstack-ai#21351, after: objectstack-ai#21352) | 330 | **0** | 0 | 0 | 0 | The whole-repo drop is 126, and the two finding sets differ by exactly the 126 rows of this package, removed; none was added. `resolves` (34,789), `resolves-as-pull-request` (2,378) and `cross-repo-unjudged` (1,155) did not move. The card's 128 was taken at `f11b5f20a2` with the older extractor; the base here reads 126. The head's later commits are a merge of `main` that touches no file under `packages/drivers/driver-sql` and the changeset (outside the census surface). **Supplementary instrument, the whole package.** The census reads neither test files nor strings nor files outside `src`. A second reading runs the gate's own exported `extractCitations` (whole-file and comment-prose projections) over every tracked file in the package (238 `.ts`, `package.json`, `tsconfig.json`, `README.md`, `CHANGELOG.md`, `LICENSE`), and classifies each citation with the gate's `classifyCitation` against one board enumerated by the gate's `enumerateBoard` (192 pages, frontier objectstack-ai#21346, 19,167 records, 05:56:41Z to 05:59:55Z). Every one of the 39 numbers in the population was then read on its own over the issues endpoint: **all 39 answer 404**, and the lit controls `objectstack-ai#5286` and `objectstack-ai#12624` answer 200. | reading | citations | dead | src comment | test comment | test string | changelog | |---|---|---|---|---|---|---| | before, `222ecc27f` | 4,920 | **411** | 126 | 165 | 51 | 69 | | after, working tree at `286316ebd` | 4,629 | **120** | 0 | 0 | 51 | 69 | The drop of 291 citations is exactly the rewritten sites, and the live counts did not move (src comment: 1,352 resolve, 24 as pull requests; test comment: 1,545 and 69). A third, raw reading (every `#` followed by 2 to 6 digits, whatever surrounds it) counts 4,939 before and 4,654 after: a drop of 285, which is the 291 less the 6 URL-spelled sites that carry no `#`. **Comment ids.** Nine distinct comment-id citations stand on 19 sites in this package (`CHANGELOG.md` aside). Each was read over the issue-comments endpoint: `5448627494` answers 404 (it was a comment on objectstack-ai#11152, which itself answers 200), and the other eight answer 200 (`5302931807`, `5404884704`, `5556979386`, `5618311630`, `5861435168`, `5865693155`, `5881556735`, `5934879010`; control `5946343111`, 200). So the one dead id is in the population. `5642107998`, the ruling record `e04a0aff2`'s message names for objectstack-ai#17590, also answers 404; it is not cited in this package. ## Per-number table `src` counts census sites, `test` counts test-comment sites. Every sha below matches exactly one commit (`git rev-parse --disambiguate`, count 1) and is an ancestor of the merge base `04f0cc499` (`git merge-base --is-ancestor`, exit 0 for all 39 shas; the clone is not shallow). The `+` lines introduce exactly these 39 nine-hex spans and no other. The message or the diff of each one names the number it replaces: 23 in the message and the diff, 11 in the diff alone (`objectstack-ai#11065`, `objectstack-ai#11374` for `d0e3a885b`, `objectstack-ai#12978`, `objectstack-ai#12999`, `objectstack-ai#13015`, `objectstack-ai#13324`, `objectstack-ai#14438`, `objectstack-ai#14628`, `objectstack-ai#16649`, `objectstack-ai#16711`, `objectstack-ai#17586`), 3 only in the subject's squash suffix (`objectstack-ai#6076`, `objectstack-ai#14434`, `objectstack-ai#17876`, where the dead number was that pull request's own and the commit is its squash), and one exception, `objectstack-ai#10629`, explained under Wordings to check. `f6fa22ce1`'s diff names the comment id three times. Where a sentence credits a ruling, a measurement, a review or a note to the number, the anchor's own message or diff carries it (checked per site; the ones that needed a reworded sentence are listed below). `source` says whether another lane or stage already used this anchor for this number (`reused`) or it was measured here (`measured`). | number | src | test | anchor | kind | source | what it decided | |---|---|---|---|---|---|---| | `objectstack-ai#6075` | 1 | 3 | `d367f03d6` | commit | measured | five drivers' query parameters follow `DriverQuery` | | `objectstack-ai#6076` | 0 | 1 | `6513c1749` | commit | measured | `IDataDriver`'s query parameter becomes `DriverQuery` (that pull request's squash) | | `objectstack-ai#8778` | 0 | 2 | `7901b2dd2` | commit | reused | stamp-only `tenancy.organizationField` | | `objectstack-ai#8823` | 0 | 3 | `4dfa369a9` | commit | reused | drop the caller value MySQL inlines in its duplicate-entry diagnostic | | `objectstack-ai#9542` | 5 | 6 | `8bbf45947` | commit | measured | bound the metadata-lock wait on boot schema-sync's MySQL widening ALTER too, keeping boot's swallow | | `objectstack-ai#10165` | 0 | 1 | `801296050` | commit | reused | lifecycle `ttl.onlyWhen` row filter with the canonical null predicate | | `objectstack-ai#10629` | 1 | 0 | `199ec4712` | commit | reused | bind federated objects whatever the boot order (stage 3's anchor; the live objectstack-ai#7737 carries the citation) | | `objectstack-ai#10836` | 0 | 2 | `7ab286e44` | commit | measured | live pg + mysql legs for the `ttl.onlyWhen` `$null` suite | | `objectstack-ai#11065` | 0 | 1 | `20950404c` | commit | reused | count a boolean aggregand as 1/0 in avg and sum | | `objectstack-ai#11067` | 10 | 10 | `479fba50d` | commit | measured | stamp `updated_at` when the driver never ran DDL | | `objectstack-ai#11374` | 16 | 7 | `d0e3a885b` + `107bb4ba4` | commit | measured | emit `varchar(maxLength)` for a text field a declared index keys on / carry an over-long UNIQUE index on a hash-shadow column, the route the 2026-08-24 ruling chose | | `objectstack-ai#12380` | 9 | 13 | `4045b954d` | commit | reused | make the SQLite `Field.json` codec injective, one encoding across all three dialects | | `objectstack-ai#12978` | 0 | 2 | `e4902d2b9` | commit | reused | declare sourced `maxLength` on the keyed text columns of the `sys_notification_*` objects | | `objectstack-ai#12998` | 19 | 7 | `df1c75c4b` | commit | measured | hash-shadow UNIQUE indexes carry the NULL-safe organization key part (ADR-0120 D3) | | `objectstack-ai#12999` | 3 | 1 | `ebcc34e89` | commit | measured | name the real remedy when a bounded field sits over a stale TEXT column | | `objectstack-ai#13015` | 17 | 6 | `cd1348802` | commit | measured | a shadow-carried UNIQUE is not index drift, and its remedy dropped the constraint | | `objectstack-ai#13279` | 1 | 1 | `6a180e42d` | commit | reused | fail loud when a permission-store read fails; it moved the classifier pins into `driver-error-classification.test.ts` | | `objectstack-ai#13324` | 1 | 4 | `4cda78c9b` | commit | reused | require a missing-table error to name the table that was read | | `objectstack-ai#14434` | 0 | 1 | `93940d492` | commit | measured | declare the not-found arm on `IDataDriver.update()` (that pull request's squash) | | `objectstack-ai#14438` | 1 | 3 | `2200f8ec8` | commit | measured | `update()` publishes the contract's record-or-null, not `any` (the squash of PR objectstack-ai#15280) | | `objectstack-ai#14628` | 1 | 1 | `6392b9c2b` | commit | measured | budget the 8th live-cell hook, reached through `rawDriver()` | | `objectstack-ai#14902` | 7 | 9 | `61821e54c` | commit | reused | a plain unique index over duplicate rows is loud and non-fatal (the squash of PR objectstack-ai#15477) | | `objectstack-ai#15041` | 2 | 5 | ADR-0104, 2026-09-05 addendum | ADR | reused | the media family's column holds the bare `sys_file` id; the step's abort requirement, its SQL sketch, and the generator as the side that does not move | | `objectstack-ai#16570` | 0 | 5 | `b72226f48` | commit | measured | declare the `indexes` key `initObjects` / `registerObjectMetadata` already read | | `objectstack-ai#16609` | 1 | 5 | `78bc4ad58` | commit | measured | `findWithWindowFunctions` presents its rows like every other read door, and the alias-collision ruling | | `objectstack-ai#16619` | 2 | 1 | `45cfa1b88` | commit | measured | canonical ISO-Z read presentation (that pull request's squash; its message records the contract review) | | `objectstack-ai#16649` | 1 | 0 | `613bfbd3d` | commit | reused | register the remaining `door: 'none'` codes, re-registering `MONGODB_MULTI_TENANT_UNSUPPORTED` | | `objectstack-ai#16657` | 0 | 1 | `5a95b0e93` | commit | reused | read the dialect text out of `cause` for operator-facing records | | `objectstack-ai#16711` | 2 | 5 | `7862fb711` | commit | reused | object-definition parameters declare the keys they are read for | | `objectstack-ai#16729` | 1 | 1 | `0f38ab084` | commit | reused | an explicit tenancy opt-out survives a partial `syncSchema` re-registration | | `objectstack-ai#17343` | 3 | 8 | `82cb69fed` | commit | measured | a `multiple: true` boolean column keeps its `$contains` membership filter | | `objectstack-ai#17586` | 4 | 2 | `d46deba19` | commit | measured | keep multi-valued boolean/toggle columns out of the read-coercion registry | | `objectstack-ai#17590` | 5 | 20 | `e04a0aff2` | commit | reused | compile `$contains` on a JSON column as a per-dialect MEMBERSHIP test; its message records the director's 2026-09-12 Ruling A | | `objectstack-ai#17639` | 5 | 10 | `7c2c5aedd` | commit | measured | envelope the `distinct()` backend fault | | `objectstack-ai#17690` | 4 | 8 | `be5c60291` | commit | measured | eight more `IDataDriver` doors publish their declared return type | | `objectstack-ai#17857` | 4 | 2 | `9ccc4179e` | commit | measured | attribute an unresolvable `distinct()` column to the clause the caller named | | `objectstack-ai#17876` | 0 | 2 | `be5c60291` | commit | measured | that pull request's squash, which installed the `ContainsAny` detector | | `objectstack-ai#17879` | 0 | 4 | `eb9334915` | commit | measured | measure the `ContainsAny` phantom-leg sweep across eight door pins | | `objectstack-ai#17970` | 0 | 2 | `47e6601c5` | commit | measured | collapse `ContainsAny`'s distributivity so union-shaped doors assert | | comment `5448627494` | 0 | 2 | `f6fa22ce1` | commit | measured | the 2026-08-28 maintainer ruling: min/max over booleans answer numbers on every face, superseding objectstack-ai#11249's false/true | ## Wordings to check Most rewrites swap a tag in place (`[#N]` to `[commit SHA]`, `(#N)` to `(commit SHA)`, `#N's X` to `commit SHA's X`, `PR #N` to its squash commit, a URL `@see` to `@see commit SHA`), the form the landed stages use. These say more than the tag: - **`objectstack-ai#10629`, one site** (`sql-driver.ts:12236`): 「the same ruling objectstack-ai#7737/objectstack-ai#10629 already made for FEDERATED objects」 became 「the same ruling objectstack-ai#7737 already made for FEDERATED objects (commit 199ec47)」, stage 3's judged form (contract review `5943182373`): `199ec4712` is objectstack-ai#7737's fix and its message states the ruling; it names objectstack-ai#7737, not objectstack-ai#10629. - **`objectstack-ai#11374`, split by subject.** 20 sites describe the keyed-text rule (`varchar(maxLength)` for a field a declared index keys on, the shard path, `boundedObject()`, the named refusal): `d0e3a885b`, the driver commit whose diff names objectstack-ai#11374 fourteen times and introduced `explainUnkeyableTextColumn` and `boundedObject()`. 3 sites credit 「the maintainer's 2026-08-24 ruling」 that chose the hash route: `107bb4ba4`, whose message moves 「objectstack-ai#11374's refusal pins」 and records 「the ruling deliberately replaced」 and 「the prefix constraint the ruling rejected」. Its message does not carry the date, so those sites keep their date and read 「landed as commit 107bb4b」 / 「recorded in commit 107bb4b」 (stage 1's `objectstack-ai#9741` precedent). Other lanes anchored objectstack-ai#11374 to their own packages' bound declarations (`e4902d2b9`, `f64668d3c`, `3954fb7df`), a different subject; the driver's own rule is `d0e3a885b`. - **`objectstack-ai#15041`, seven sites**: 「the objectstack-ai#15041 addendum」 / 「the ruling on objectstack-ai#15041」 became 「the ADR-0104 2026-09-05 addendum」 / 「the ruling in ADR-0104's 2026-09-05 addendum」, the spelling stage 3 and the cli lane used. The addendum names objectstack-ai#15041 as its provenance and carries each claim the sites make: the abort-on-the-first-non-JSON-string requirement, the `USING (col #>> '{}')` sketch, and 「the driver is the side that moves」 for the generator. `sql-driver-15989-file-family-bare-id.test.ts:7` keeps the maintainer's verbatim quote untouched (it carries no `#`). - **The comment id** (`sql-driver-11635-boolean-aggregand-answers.test.ts:9`, `sql-driver-11782-boolean-row-read-presentation.test.ts:36`-`:37`): 「applied in its comment 5448627494」 became 「landed as commit f6fa22c」. `f6fa22ce1` applies 「the 2026-08-28 maintainer ruling (option A, superseding objectstack-ai#11249's false/true)」 to driver-sql's result presentation, and its diff names the comment id. objectstack-ai#11152 stays. - **`objectstack-ai#17590` where it was written while the card was open** (the `17639` and `17857` suites, `sql-driver.ts:11060`, `sql-driver-17586-…test.ts:101`): those sentences park the json-column `distinct()` question 「with objectstack-ai#17590」. `e04a0aff2` closed that card with Ruling A on `$contains` only, so a bare swap would credit it with a `distinct()` verdict it never made. They now read 「the card commit e04a0af closed, which owned the sibling divergence」, 「if a card after commit e04a0af rules that a json column should ANSWER a distinct read」 (both retirement clauses), 「the ruling commit e04a0af records cannot move it」, 「that question belonged to the card commit e04a0af closed」, 「Nothing here touches the card commit e04a0af closed」 and 「the divergence commit e04a0af ruled on the filter side」. `sql-driver-17639-distinct-fault-envelope.test.ts:206` is the **one changed line that carries no number**: its verb (「owns」 to 「owned」) had the number on `:205` as its subject. - **Where the number named the defect, not the change**: 「## Not objectstack-ai#11067」 became 「## Not the defect commit 479fba5 fixed」; 「objectstack-ai#13015 was the price of the split」 became 「The defect commit cd13488 fixed was the price of the split」; 「objectstack-ai#17343: a `multiple: true` BOOLEAN column lost …」 became 「The defect commit 82cb69f fixed: …」; 「The defect that produced the table (objectstack-ai#12380)」 became 「(fixed in commit 4045b95)」 and 「let objectstack-ai#12380 survive」 became 「let the defect commit 4045b95 fixed survive」; 「family as objectstack-ai#11067 / objectstack-ai#11176 / objectstack-ai#11223」 became 「family as objectstack-ai#11176 / objectstack-ai#11223 / the one commit 479fba5 fixed」. - **`pre-` / `post-` spellings**: 「a pre-objectstack-ai#12998 shadow」 became 「a shadow from before commit df1c75c」 (and the same shape for `objectstack-ai#12380` and `objectstack-ai#17590`); 「post-objectstack-ai#12998」 became 「since commit df1c75c」; 「The pre-objectstack-ai#12998 shadow over RAW columns」 became 「The older (before commit df1c75c) shadow over RAW columns」. - **Reviews and reports**: 「the contract review of PR objectstack-ai#16619」 became 「the contract review recorded in commit 45cfa1b」 (and 「measured in the contract review commit 45cfa1b records」, 「commit 45cfa1b's contract review's finding」); `45cfa1b88` is that pull request's squash, and its message records FINDING-1 to FINDING-3 and the hand-made TEXT-affinity measurement. 「the objectstack-ai#17879 report」 became 「commit eb93349's message」 (two sites); that message records that both repair candidates were measured. - **`objectstack-ai#16649`** (`dialect-emission-refusal.ts:66`): 「a removal objectstack-ai#16649 reversed」 became 「a removal that commit 613bfbd reversed」. `613bfbd3d` re-registered `MONGODB_MULTI_TENANT_UNSUPPORTED` 「under the ruling」; the runtime lane's `44c917a47` is objectstack-ai#16649's vocabulary-gate half, a different subject. - **`objectstack-ai#14628`** (`live-dialect-matrix.testkit.ts:451`, `sql-driver-datetime-mysql-storage.test.ts:57`): `6392b9c2b` budgeted the eighth live-cell hook and wrote the `(objectstack-ai#14628)` line itself; the seven before it were `13b520069` (PR objectstack-ai#14629), which cites objectstack-ai#14213, the number kept beside it. - **Squash rewrites**: 「after objectstack-ai#6076 merged」 became 「after commit 6513c17 landed」; 「objectstack-ai#13878 / PR objectstack-ai#14434」 became 「objectstack-ai#13878 / commit 93940d4」; 「`ContainsAny` (objectstack-ai#17876)」 became 「(commit be5c602)」, the squash that installed it; 「objectstack-ai#14438 (PR objectstack-ai#15280)」 became 「Commit 2200f8e (PR objectstack-ai#15280)」, the live pull-request number kept beside its squash as a convenience. - **Slash pairs**: 「[objectstack-ai#9542/objectstack-ai#9609]」 became 「[commit 8bbf459, objectstack-ai#9609]」; 「objectstack-ai#5181/objectstack-ai#6075」 became 「objectstack-ai#5181 and commit d367f03」; 「objectstack-ai#11374/objectstack-ai#11627 exist to end」 became 「objectstack-ai#11627 and commit d0e3a88 exist to end」; 「the objectstack-ai#11627/objectstack-ai#12998 suites」 became 「the objectstack-ai#11627 and commit df1c75c suites」; 「[objectstack-ai#14079/objectstack-ai#15683/objectstack-ai#17343]」 became 「[objectstack-ai#14079/objectstack-ai#15683, commit 82cb69f]」; 「(objectstack-ai#11374, objectstack-ai#12999)」 became 「(commits d0e3a88 and ebcc34e)」. - **Other single rewrites**: 「(objectstack-ai#16711 验收口径 item 4)」 became 「(验收口径 item 4 of the card commit 7862fb7 closed)」, whose message records the TS2353 negative control; 「the defect objectstack-ai#8287 removed and objectstack-ai#8778 must not reintroduce」 became 「… and commit 7901b2d's stamp-only key must not reintroduce」; 「the gap objectstack-ai#17639 left FILED」 became 「the gap commit 7c2c5ae left FILED」 (`9ccc4179e`'s message: 「the attribution arm objectstack-ai#17639 deliberately left filed」); 「See the ruling recorded on objectstack-ai#12380.」 became 「See the decision recorded in commit 4045b95's message.」 (that message records the posture, 「refuses to guess at the two that the pre-fix encoding made ambiguous」, and calls it no ruling). - **Capitalisation**: where the number opened a sentence, the new text opens with 「Commit」. - No line was reflowed, so some are longer than their block's wrap (`eslint.config.mjs` declares no line-length rule, and a reflow would move neighbouring lines and every line citation into the file). ## Sites left - **In comments (src, test, `vitest.config.ts`): none.** - **String literals: 51 test-string sites, 24 numbers, 26 files** (`describe` and `it` titles, assertion arguments): `objectstack-ai#11374` 5, `objectstack-ai#12380` 4, `objectstack-ai#17590` 4, `objectstack-ai#17639` 4, `objectstack-ai#12998` 3, `objectstack-ai#13015` 3, `objectstack-ai#16609` 3, `objectstack-ai#17343` 3, `objectstack-ai#17586` 3, `objectstack-ai#17857` 3, `objectstack-ai#11067` 2, `objectstack-ai#14902` 2, and 12 more once each. Every one of the 24 is in this stage's population, so the table above holds an anchor for each. Non-test strings carry none. Strings are outside this stage's surface. - **Outside `src`:** the release-owned `CHANGELOG.md` names dead numbers on 69 sites (31 numbers); left. `package.json`, `tsconfig.json`, `vitest.config.ts`, `README.md` and `LICENSE` cite no dead number. ## Mechanical guard: no code token moves The guard (stages 2 and 3's) compares base `222ecc27f` against the working tree over all 55 touched files, with TypeScript 6.0.3: - **Reading 1**: the parser's leaf nodes, from a `forEachChild` walk. Comments are trivia there, and JSDoc is never visited. A leaf that is not itself a token (an empty block) is re-scanned with trivia skipped. - **Reading 2**: the full token stream in parser context, from a `getChildren` walk, JSDoc nodes skipped. String, template and numeric literals are compared in full on both readings. Results: - Real run at the head: 165,798 base tokens, **0 files with a token change** (exit 0). - Comment control (「which IS its value」 to 「which IS ITS value」, `sql-driver.ts`): 0 files changed (exit 0). - Positive control, an identifier (`hashShadowColumnFor` to `hashShadowColumnForX`, `schema-drift.ts`): DIFFER on both readings (exit 1). - Positive control, a string literal (`'storage'` to `'storageX'` in `FieldKeyClass`, `builtin-column-collision.ts`): DIFFER on both readings (exit 1). - Positive control, a numeric literal (`MEDIA_ID_MOVE_WIDTH = 2048` to `2049`, `media-column-move.ts`): DIFFER on both readings (exit 1). Each mutation went through `scripts/ablation-replace.mjs` (wrap mode, anchor hit 1 to 0, replacement 0 to 1) under a shell trap that restores by absolute path from `HEAD`. Each restore was proven equal to its `HEAD` blob (`cd55a4ca44f3`, `72e45a83968f`, `86ebb324c1b6`, `fe0ce2c4d5bd`), with `git diff HEAD` empty and a clean tree afterwards. ## Changeset: `patch` (`dist` measured) `files[]` is `dist`, `README.md` and `CHANGELOG.md`, and the package is not private. The whole workspace was built first (`turbo run build` over `./packages/*` and `./packages/*/*`, 71 of 71 tasks, VERDICT command-exit 0). Then the package's own `build` (tsup plus `check-dts-emitted`) ran three times in one script under the shared verify lock (VERDICT command-exit 0): - **Leg 1**, at `02d2a034a`: 6 `dist` files hashed. Of the 122 rewritten non-test lines, 57 appear verbatim in `dist`: 52 from `sql-driver.ts`, 3 from `schema-drift.ts`, 1 each from `media-column-move.ts` and `dialect-emission-refusal.ts`; in `index.d.ts` / `index.d.mts` (51) and `index.js` / `index.mjs` (52). - **Leg 2**, the base text put back in the 6 non-test files (6 of 6 proven equal to their base blob): 4 of the 6 files differ from leg 1 (`index.d.ts`, `index.d.mts`, `index.js`, `index.mjs`). - **Leg 3**, after the proven restore (6 of 6 equal to their `HEAD` blob, `git diff HEAD` empty): all 6 files are byte-identical to leg 1, so the build is deterministic and the difference is the rewrite. So the rewrite ships, and `.changeset/20595-driver-sql-provenance-anchors.md` declares a `patch` for `@objectstack/driver-sql`, comment text only, with the claim's `Clause-②: no` line. ## Gates (head `fad95aff7`) - **Derived gates:** `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` at `fad95aff7` (56 paths against merge base `04f0cc499`) derived 63 commands. All 63 ran, each exit code captured before any pipe: 63 exit 0. `--ran` reports 「63 derived, 63 run, 0 NOT-MEASURED, 0 UNRUN」 (a derived zero) and exits 0. The roster families the derivation flags under a touched directory also ran, each exit 0: `node scripts/check-changeset-fixed.mjs`, `pnpm check:authz-resolver`, `pnpm check:error-code-casing`, `pnpm check:filter-alias-parity`. - **Against the newer `main`:** `main` moved six commits after the merge, none touching a file here. A probe tree at `origin/main` `f9bcd08be` with this diff applied derived 64 commands, the one addition being `node scripts/check-dts-emitted.mjs --self-test` (that script is unchanged across the range). It ran, exit 0, and `--ran` on the probe reports 「64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN」. - **Named in the dispatch:** `node scripts/check-issue-citations.mjs` exits 0 (「every citation this change adds resolves」, 10 judged across 6 files); `pnpm check:issue-citations` exits 0 (self-test, 173 cases, 9 batteries); `pnpm check:doc-authoring` exits 0 (the sibling-package prose-id baseline holds, no growth); `pnpm check:nul-bytes` exits 0 (9,641 files, no raw control bytes). - **Tests and typecheck, under the verify lock, at `fad95aff7`:** `pnpm --filter @objectstack/driver-sql test`: 215 test files pass and 11 skip (226); 3,594 tests pass and 202 skip. The 11 skipped files are the live-dialect suites (PostgreSQL and MySQL cells), declared un-run locally; CI's `Temporal Conformance (live PG + MySQL)` job runs them. `pnpm --filter @objectstack/driver-sql typecheck` exits 0; `tsc --listFiles` puts all 226 tracked test files and all 55 changed files in its program. - **Lint, as a proven narrowing:** eslint with inline config disabled, over the 55 touched `.ts` files plus `dist/index.js` as the control: 56 results, 0 errors and 1 warning, the control's ignore notice; none of the 55 is reported ignored. `eslint.config.mjs` never enables type-aware linting (its lines 327-328 say so), so a comment edit cannot move the verdict on an untouched file. The repo-wide `pnpm lint` is CI's run. ## Acceptance notes - **Base.** The branch was cut at `222ecc27f` and merged with `main` once, at `04f0cc499`, before the gates (merge `02d2a034a`, no conflict, no file under `packages/drivers/driver-sql`, and neither `check-issue-citations.mjs` nor `dispatch-gates.mjs`). Tests, typecheck and gates ran on the head after it. The net diff against `main` is the 55 rewritten files (+291/−291) and the changeset. - **Two sentences now state something that is no longer true, and this stage changes only their citation.** `sql-driver-12998-shadow-null-safe-key.test.ts:266` says `initObjects`' parameter type does not declare `indexes`; `b72226f48` declared it, and the citation now reads 「(the gap commit b72226f closed)」. `sql-driver.ts:18142` says 「objectstack-ai#11374's remaining half may still reshape the text side」; it was written on 2026-08-24 (`c49afd0886`), a day before `107bb4ba4` settled that half, and now reads 「the half commit d0e3a88 left open」. Comment accuracy, outside a citation sweep. - **The token guard's first reading-1 run was wrong, and was replaced.** It reported `sql-driver.ts` as DIFFER on reading 1 alone: an empty `catch { }` block has no child nodes, so its leaf text carried the comment inside it (`// Pre-objectstack-ai#12380 row: …`). Reading 2 agreed with no change throughout. Reading 1 now re-scans such a leaf with trivia skipped; the real run and all four controls above are from the corrected guard. - **Wording only:** no line without a number was changed, except `sql-driver-17639-distinct-fault-envelope.test.ts:206`, listed above. --- _Generated by [Claude Code](https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…runtime, not declared only (objectstack-ai#21652) Fixes objectstack-ai#21415 Clause-②: no ## What changed `skills/objectstack-ai/SKILL.md`, Common Pitfalls 1, told an AI author that `memory` is "declared only — no runtime reads it". Since the agent memory contract landed on `main` (spec commit 22c2d6f, ruling A′ on objectstack-ai#20274), that sentence is false in the published catalog, and the open Version Packages PR (objectstack-ai#21352) ships that contract in the next release — the skill must not go out contradicting it. One clause is rewritten; nothing else in the pitfall changes. The new text states the three facts the contract makes true and keeps the pitfall's point that none of this is a gate: - `memory` is enforced by the AI runtime ☁️ — long-term notes are recalled and reflected on; - `maxEntries` and `reflectionInterval` are required once `longTerm.enabled` is true; - there is no storage backend to choose. The sentence that follows ("For a gate that is **enforced**, use …") is untouched. The three other `memory` mentions in the file (:218–247) are the knowledge adapter id `'memory'`, a different thing, and are left alone. ## Evidence read from the spec (at `origin/main` 15fe567, `packages/spec/src/ai/agent.zod.ts`) - :185–188, header comment: "The one runtime that executes agents, cloud's AI service, enforces long-term memory from `enabled`, `maxEntries` and `reflectionInterval`". - :196 `LONG_TERM_STORE_RETIRED`: "`agent.memory.longTerm.store` was removed in @objectstack/spec 17.7.0 (ADR-0049 enforce-or-remove) — the memory store is platform infrastructure, not agent metadata". - :210 `MAX_ENTRIES_REQUIRED`: "`agent.memory.longTerm.maxEntries` is required when `agent.memory.longTerm.enabled` is true". - :217 `REFLECTION_INTERVAL_REQUIRED`: "`agent.memory.reflectionInterval` is required when `agent.memory.longTerm.enabled` is true". - :224 `REFLECTION_INTERVAL_WITHOUT_LONG_TERM`: "`agent.memory.reflectionInterval` requires `agent.memory.longTerm.enabled: true`". - :242–259 `checkAgentMemoryContract`, the refinement on `memory` that issues those three. - PR objectstack-ai#21413's commit 22c2d6f is an ancestor of `origin/main` (`git merge-base --is-ancestor`, exit 0) and of the Version PR's base 36ad321 (REST compare: ahead 112, behind 0). ## Readings - Branch cut at `origin/main` 15fe567 (the dispatch read 0c50b5d; the one commit between touches `packages/spec/src` only, and the skill file is byte-identical across the two). - Changed file, whole file: 418 → 421 lines (net +3; budget ≤ +3). - Whole package (every `skills/**/SKILL.md` summed): 4397 → 4400 lines. - Token ratchet `node scripts/check-skills-token-ratchet.mjs`: `skills/objectstack-ai/SKILL.md` 5486 → 5539 tokens, ceiling 6806 unchanged, headroom 1320 → 1267. Self-test: 65 cases pass. ## Verification (all at f85f008, the only commit on the branch) Gate list derived in the worktree with `node scripts/pm/dispatch-gates.mjs --commands` (no paths; change set off merge base 15fe567): 24 commands, identical to the dispatch's list. Every one exited 0; `--ran` reconciliation with exit codes recorded: "24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN … a DERIVED zero — all 24 recorded an exit code and none of them is 3". - `pnpm --filter @objectstack/spec build` under `scripts/pm/os-verify-lock.sh` — "VERDICT command-exit 0" (held 127s, waited 134s), before `check:skill-docs` — "✅ Skill docs in sync". - `check:doc-formula-expressions` first answered exit 3 (PREREQUISITE NOT MET: `@objectstack/formula` / `@objectstack/lint` unbuilt — nothing measured); after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the lock (VERDICT command-exit 0) it reads "✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 460 files / 1381 TS blocks judged clean". - `check:skill-identifier-liveness` — "OK — Leg 1: 457 citation(s) over 53 published file(s) checked against 118371 implementation word tokens (0 ledgered exemption(s)); Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)". - `check:doc-authoring` — "17369 customer-facing string(s) across 1256 spec sources clean — no internal issue-id references". - `check:nul-bytes` — "OK (scanned 10022 text file(s) … no raw ASCII control bytes)"; control-character grep over the edited file: 0 hits. - `check:skill-compatibility` — "10 SKILL.md file(s) reconciled against 80 workspace packages"; `check:corpus-claim-drift`, `check:role-word`, `check:closing-keyword-parity` (+ self-test, 40 assertions), `check-doc-route-spelling --advisory` (+ self-test), `check:comment-mask-corpus` (8119 files, 0 disagree), `check:ci-filter-parity`, `check:agent-test-spelling`, `check:cross-package-test-inputs`, `check:driver-memory-census`, `check:gitlink-declared`, `check:pm-governed-merges`, `check:refd-timer-probe`, `check:skill-frame-sync`, `check:watch-hint-literal` — all green. Changeset: none — `skills/**` is not shipped by any workspace package's `files[]`; `skip-changeset` is requested on this PR. ## 维护者速读(草稿) **改了什么。** 只改 `skills/objectstack-ai/SKILL.md` 的 Common Pitfalls 第 1 条里关于 `memory` 的那半句:原文说「`memory` 只是声明、没有运行时读它」,现在改成「`memory` 由 AI 运行时 ☁️ 强制执行 —— 长期记忆会被回忆与反思;`longTerm.enabled` 为 true 时 `maxEntries` 与 `reflectionInterval` 必填;存储后端不可选」,并保留「这些都不是 gate」的要点。其余一字未动。净增 3 行(预算 ≤ 3),token 读数 5486 → 5539(上限 6806 未动)。 **为什么改。** 这份 skill 随 `npx skills add` 发到客户项目,AI 作者照它写元数据。spec 的 `agent.memory` 契约已经在 `main` 上落地(PR objectstack-ai#21413),开着的 Version Packages PR 会把它随下一版一起发出去;若 skill 仍说「没有运行时读它」,AI 作者会漏写必填的 `maxEntries` / `reflectionInterval`,或继续写已退役的 `longTerm.store`,发布时被拒。写给 AI 的文档说错一句等于产品缺陷,且必须与契约同版发运,这是 p1 的由来。 **风险与代价(含回滚)。** 纯文档改动,不发运任何包,无 changeset;本地 24 个派生门禁全绿。风险仅在措辞:三件事实均逐条对照 `packages/spec/src/ai/agent.zod.ts` 的拒收文案核过。回滚 = revert 这一个 commit(f85f008),无其它依赖。 **席位意见。** (留空,由席位定稿) **你要做的。** 这是 Tier H 受管面(`skills/**`),需要你一次授权的 APPROVED review;之后由席位落地。不需要你操作 Version Packages PR。 ## Acceptance notes - Out-of-scope findings: none. The `knowledge` adapter id `'memory'` at :218–247 of the same file is unrelated to `agent.memory` and was not touched. - The Version Packages PR (objectstack-ai#21352) head moved since the dispatch's reading (f872ccf → 015a5e3); its base 36ad321 still carries 22c2d6f (REST compare: ahead 112, behind 0). The Version PR and all changeset files are untouched by this PR. - Governed surface (Tier H): this PR stays draft; landing waits for an authorized approval and then the owning seat. Not flipped to ready, no auto-merge armed. - Writes spent by this run: `git push` (2: the empty branch probe, then f85f008), one `pr_create` through the fleet-write relay, one `label-write` (`skip-changeset` + assignee), one report comment. No MCP calls. --- _Generated by [Claude Code](https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk)_ Co-authored-by: objectstack-fleet[bot] <objectstack-fleet[bot]@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…ui#11466, objectstack-ai#11574, objectstack-ai#11578, objectstack-ai#11581 and objectstack-ai#11583) (objectstack-ai#21710) Fixes objectstack-ai#21696 Clause-②: no This moves the bundled Console's objectui pin from `ab1879721595` (objectstack-ai#21625) to objectui `main` as of the write time, `2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6`, which is past `973fc20f3`. The Console now carries objectui#11574 (the phantom "(empty)" groups fix), objectui#11578, objectui#11581, objectui#11576, objectui#11583 and objectui#11466 (V1 declared node slot). It also carries objectui's own 17.7.0 package release. ⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag, publish or Release was made. Whether 17.7.0 ships with this pin is the maintainer's call. ## Range `ab1879721595..2e818d0b51ec` has 22 non-merge commits. `git merge-base --is-ancestor` exits 0 against objectui `origin/main` for `973fc20f3`, and `2e818d0b51ec` was objectui `main` when it was read (`git ls-remote` just before this PR). From the changesets objectui declared over the range: - 17 releasing changesets, 1 release-nothing, and 6 commits that carry no changeset. - 12 of the 18 changesets were already consumed by objectui's release `b493919c7`. Each was read from the commit that added it. - 2 breaking entries, both annotated by the author and both from one commit. The range was listed by measurement, not copied from the card. Exactly one commit subject in the range carries `!`: `git log --format='%h %s' ab187972..2e818d0b5 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` gives `83e3f8377 feat(types,react,core,plugin-dashboard)!: … (objectui#11466)`. | objectui landing | commit | note | |---|---|---| | objectui#11466: node slot and `SchemaRenderer`'s `schema` take `DeclaredNode`; the dashboard producers name declared nodes; an envelope's object-metric retires | `83e3f8377` | **declared breaking**, both breaking entries | | objectui#11574: a grouping-field switch paints only the server's groups | `2f54dca53` | smoke below | | objectui#11581 / objectstack-ai#11578 / objectstack-ai#11576: Create View doors share one builder; a refused save is said; chart views bind an ADR-0021 dataset | `b65aa5e65`, `f1c937966`, `d0097af2e` | | | objectui#11583: a refused metadata write on the view, report and draft surfaces is said | `e8c0b9614` | past the card's `973fc20f3` | | objectui#11598: dashboard slot-entry and chart-producer reads compile without `BaseSchema`'s index signature | `2e818d0b5` (the pin itself) | | | objectui#11572 / objectstack-ai#10380: interface and object page relay stored view config | `09036173c`, `068564691` | | | objectui#11588: grid summary footer reads currency/precision from the object field only | `d768c3178` | | | objectui#11216: `object-kanban` declares `grouping` as the spec's `GroupingConfig` | `a7557a7d4` | | | objectui#11573, objectstack-ai#11564: `AnyComponentSchema` / flex child typing | `bdc9049ed`, `b10c68e58` | | | objectui release 17.7.0 | `b493919c7` | removes 2726 consumed `.changeset/*.md` files | ## ADR-0087 disposition of the declared-breaking entries Both entries are `not-required (no-migration-prescription)`. The disposition is in `.changeset/console-2e818d0b51ec.md`, which replaces the script's `adr-0087: TODO` placeholder. | objectui PR | commit | entry | disposition | |---|---|---|---| | objectui#11466 (PR objectui#11512) | `83e3f8377` | A node slot and `SchemaRenderer`'s `schema` prop take `DeclaredNode` | not-required (no-migration-prescription). This is objectui's own TypeScript face (`@object-ui/types` / `@object-ui/react`). No ObjectStack schema declares or references it. | | objectui#11466 (PR objectui#11512) | `83e3f8377` | An `object-metric` node in a dashboard widget's legacy `component` envelope draws the retired-format prompt | not-required (no-migration-prescription). An ObjectStack author cannot write that envelope: `ui/dashboard.zod.ts` refuses a widget's `component` key by name as objectui-internal, and no example authors one. The showcase's `object-metric` page tiles still draw their numbers (smoke below). | `check-adr-0087-registration --base origin/main` gives "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` gives "This diff introduces no `major` bump". ## What changed here - **`.objectui-sha` and `.changeset/console-2e818d0b51ec.md`** were written by `scripts/bump-objectui.sh 2e818d0b51ecdf8fdd9fcbf4b916bcd7fe9a9cf6 --no-commit` with `OBJECTUI_ROOT` set to a read-only clone of objectui. The level was auto-set to `minor`. No `../objectui` sibling exists in this container. - **`scripts/sdui-manifest.record.json`** was re-recorded by `node scripts/gen-sdui-manifest-node.mjs` over the tree that `pnpm objectui:build` built at the pin. **`sdui.manifest.json` is byte-identical**: 107 components, sha256 `0ead67c1111d…` at both pins, so no component input moved. The record moves its pin, its `modulesRoot` and objectui's workspace version (17.6.0 to 17.7.0). - **`packages/sdui-parser/objectui-lockstep.json`** was re-recorded with `pnpm gen:sdui-lockstep` against `OBJECTUI_ROOT=.cache/objectui-2e818d0b51ec`. It records 214 grammar lines (blob `0131f27cf86d`), 25 codes and containment predicate `76c18fb95d1f`. All are unchanged, so no port is owed. objectui's `packages/sdui-parser/src` is byte-identical across the range; only its CHANGELOG and package.json moved. - **The 54 asserting pin citations in `packages/spec/src`** were re-measured at the new pin, not restamped: - Every anchor in each asserting record was resolved against objectui's tree at the old pin and mapped through `git diff -U0 ab187972 2e818d0b5`. - Four cited files changed: - `plugin-dashboard/src/index.tsx` (+13/-1, objectui#11466). Lines were added above the `object-metric` registration, so its start moves `244` to `256` and the icon input moves `269` to `281`. Both lines are byte-identical, still `{ name: 'icon', type: 'string' }`. - `packages/types/src/objectql.ts`. objectui#11216's `grouping` member landed below the cited `limit` member, so `:4720` did not move. - `content/docs/plugins/plugin-kanban.mdx`. A `grouping` row landed below the `limit` row, and the page still teaches `limit: 250`. - `packages/react/src/SchemaRenderer.tsx` (+21/-20, objectui#11466). Only the type import, the `SchemaRendererProps` docblock and the `schema` type changed. The `properties.*` hoist, its strip list and the `createElement` spread did not, so `object-timeline`'s prop channel still carries `data`. - Every other cited file is byte-identical across the hop. - Each record gains a dated 2026-10-04 hop sentence and keeps its `ab1879721` history. - **The six migration entries' corpus counts** were re-taken with `git grep -o -F`. That method first reproduced every `ab1879721` number: 10267 files, `objectstack` 16377, `@objectstack/spec` 6665, `timeout` 1348, `useState` 2476, `TTL` 180, `tenant` 1238, `Span` 491. - The new numbers are 7579 files, 17227, 7134, 1351, 2477, 182, 1317 and 505. The file count drops because objectui's 17.7.0 release removed 2726 consumed changesets. - Every zero is still zero: 98 tokens were checked, the export lists of the three cited spec files plus every named key. The only non-zero tokens are the expected `Span` / `SpanSchema`. The 14 new `Span` hits are `Spanish` prose. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-2e818d0b51ec.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. - **`main` was merged** (`7e0066af7a`) with `scripts/pm/os-regen-merge.sh` in merge commit `a0a35cb30f`, with no conflict hunk. Afterwards: - `check:generated` reports all 15 artifacts current. - main's three new semantic entries (`ui-object-form-fields-names-typed`, `ui-object-gantt-markers-typed`, `ui-object-timeline-mapping-typed`) are present in the regenerated registry. - The pin-citation gate still counts 54 asserting citations. main added historical ones only (108 to 118). No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Browser smoke: `examples/app-showcase` with the Console built at `2e818d0b51ec` The Console was built by `pnpm objectui:build`. The build log reports: "Console dist matches the objectui pin (objectui@2e818d0b51ec)", "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}" and "Console bundle carries THIS tree's @objectstack/spec, and only it". The server ran `pnpm dev -- --fresh --ui --no-watch -p 41853` (with `OS_PORT=41853`) on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, with console messages, page errors and every non-2xx response captured. Only the PIDs this run started were stopped. **Dashboards.** objectui#11466 touches the dashboard producers. There are no page errors and no "retired" prompt on any of the four dashboards. | dashboard | metric tiles (value read in the DOM) | charts drawn | console errors | |---|---|---|---| | Delivery Operations `showcase_ops_dashboard` | Active Projects 2, At-Risk (Red) 1, Awaiting Review 2, Total Budget 1,090,000 | 4 | 404 `/api/v1/usage/storage`, 404 `/favicon.ico` | | Revenue Pulse `showcase_revenue_pulse` | Invoices 7, Invoiced Subtotal 1,920, Accounts Signed 3, Accounts (all time) 14, Paid Rate 42.9% | 4 | 404 `/api/v1/usage/storage` | | Chart Gallery `showcase_chart_gallery` | Total Tasks 10, Avg Progress 47.0, Total Spent 616,000 | 13 | 404 `/api/v1/usage/storage` | | System Overview `system_overview` (setup) | Total Users 3, Active Sessions 3, Login Events 3, Config Changes 0 | 2 | 404 `/api/v1/usage/storage` | The Delivery Operations tiles match the REST data on the same server: - `showcase_project?status=active` returns 2 rows, `?health=red` returns 1, and the budget sum is 1,090,000. - `showcase_task?status=in_review` returns 2 rows. - `showcase_task` has 10 rows, matching the Chart Gallery's Total Tasks. - `showcase_account` has 14 rows, matching Revenue Pulse's all-time count. The `object-metric` page tiles that this repo authors also draw: - My Work shows Open Tasks 8, In Review 2 and At-Risk Projects 1. - Command Center (大屏) shows 2 / 8 / 2 / 1 / 14 / 1.1M. Neither page has a page error. **Grouping-field switch (objectui#11574).** The drive was Tasks list, then Group, then Add group field (it selects Title). The select then switched to Priority, Status and Priority. The painted groups are counted from the DOM, and the server answers are each `POST /api/v1/data/showcase_task/query` with `groupBy`, all 200: | step | painted groups | server rows | "(empty)" groups | stuck "Loading grid…" | |---|---|---|---|---| | Title | 10 (one per task) | 10 | 0 | 0 | | Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 | | Status | 5: Backlog 2, Done 2, In Progress 2, In Review 2, To Do 2 | 5 | 0 | 0 | | Priority | 4: High 3, Low 1, Medium 4, Urgent 2 | 4 | 0 | 0 | The same sequence painted 13, 8 and 8 groups (9, 3 and 4 phantom) at `ab1879721595`, as objectstack-ai#21625's acceptance notes recorded. **No phantom "(empty)" groups appear at this pin.** **Console errors across the run.** The only ones are the browser's "Failed to load resource: 404" lines for `/api/v1/usage/storage` and `/favicon.ico`, and the run has 0 page errors. The `usage/storage` 404 was already recorded in objectstack-ai#21625's smoke. ## objectstack-ai#21671 lockstep reading - objectui's `packages/sdui-parser/src/validate.ts` at `2e818d0b5` is byte-identical to `ab1879721595`. - `checkType` (`:450-466`) still grades `type-mismatch` with `severity: arms.includes('enum') ? 'error' : 'warning'`. `checkMemberTypes` (`:407-419`) grades `member-type-mismatch` the same way. - This repo grades both `error` since PR objectstack-ai#21678 (`packages/sdui-parser/src/validate.ts:446`, `:506`). **The gap still stands at this pin.** - This repo's "Known lead" note (`packages/sdui-parser/src/validate.ts:336-340`) names objectui's copy "at the `.objectui-sha` pin" without a sha, so it is still true and needs no update. The bump route regenerates nothing there, and `validate.ts` is not edited. - `check:sdui-lockstep` does not compare severity, so this is a reading, not a gate result. ## Gates and tests (head `a0a35cb30f`) - `node scripts/pm/dispatch-gates.mjs --commands` derived 127 commands from the 21-path diff. That is the same set before and after the merge. - At `378d424915` (pre-merge) and again at `a0a35cb30f`, all 127 exited 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with objectui at the pin: 54 asserting citations match `2e818d0b5`, and 7 content assertions are verified. - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest`, `check:console-sha`, `check:console-injection`, `check:migration-registry`. - `@objectstack/spec check:generated`: all 15 artifacts current after the merge. - `pnpm --filter @objectstack/spec test`: 612 files, 18185 passed, 1 todo. - `pnpm --filter @objectstack/spec typecheck`: exit 0. - `pnpm --filter @objectstack/sdui-parser test`: 225 passed. - `eslint --no-inline-config` on the 15 changed TS files: 0 errors and 0 warnings. The lint population is `**/*.{ts,…}` (`eslint.config.mjs:971`). The config enables no type-aware linting (`:328`), so this diff cannot move a judgment on an untouched file. Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - `ui/component.zod.ts`'s `object-grid` `columns` record (the⚠️ paragraph on `plugin-grid/src/useColumnSummary.ts:558-568`) says, about `ab1879721595`, that the footer summary reads `currency` / `defaultCurrency` / `precision` / `scale` off an authored column. objectui#11588 (`d768c3178`, inside this pin) retires that read. The record is in the historical spelling and stays true of the pin it names, so it is left as is. - Two anchors in records that cite no sha are outside the pin-citation gate's population and were not re-measured: - `ObjectView.tsx:882`, in `ui/view.zod.ts`'s [objectstack-ai#5074] block and two view tests. - `plugin-dashboard/src/index.tsx:204`, in the `ObjectMetricPropsSchema icon liveness` test. - Both already read an unrelated line at `ab1879721595`, and they shift to `:936` and `:214` here. - Writes: no PR assignee or label was written. This dispatch's write budget names neither. --- _Generated by [Claude Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…ui#11611, objectstack-ai#11614 and objectstack-ai#11619) (objectstack-ai#21800) Fixes objectstack-ai#21772 Clause-②: no This moves the bundled Console's objectui pin from `2e818d0b51ec` (objectstack-ai#21710) to objectui `main` as of the write time, `9dfaca654311cddd81714153c4f82c241d7cdc54`, which is past `c096f03`. The Console now carries objectui#11611 (the `ref:dataset` spec-form widget), objectui#11614 (the grid widget's camelCase keys) and objectui#11619 (the record chrome's picture). Those are the three merges objectstack-ai#21714, objectstack-ai#21768 and objectstack-ai#21765 wait on. ⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag, publish or Release was made. The card's "release first" hold is lifted by the maintainer's order recorded in the claim: 「浏览器测试已经在运行,还有很多问题在处理,服务端开发不应该被阻塞」. ## Range - objectui `git ls-remote origin refs/heads/main` read `9dfaca654311cddd81714153c4f82c241d7cdc54` at 2026-10-05T00:51:29Z, just before the bump, and the same sha again before this PR was opened. - `git merge-base --is-ancestor` exits 0 against `9dfaca654311` for all three carried merges: `b508ac50d9` (objectui#11611), `2abec3a96c` (objectui#11614) and `c096f03279` (objectui#11619). The objectui clone is shallow, but exit 0 proves itself there. - `2e818d0b51ec..9dfaca654311` has 17 commits and 0 merges. - objectui declared 24 changesets over the range, and all 24 release. There are 0 release-nothing changesets and 0 commits without a changeset. None declares `major`. Four carry the author's breaking annotation, and the highest declared level is `minor`, so the console changeset is `minor`. These counts come from `scripts/objectui-range.mjs --from 2e818d0b51ec --to 9dfaca654311 --json` and from the bump's own digest. They were measured, not copied from the card. - Four commit subjects carry `!`. `git log --format='%h %s' 2e818d0b5..9dfaca654 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` gives `9db9ff3f9`, `8b14aecbd`, `2abec3a96` and `b403bb36f`. | objectui commit | landing | changesets | declared disposition | |---|---|---|---| | `9dfaca654` | objectui#11615: the default `simple` form draws a self-describing inline section entry; `ObjectFormSection.fields` gains the form view's `{ field }` arm | 1, minor, **BREAKING** (for TypeScript readers) | releasing; declared breaking, answered below | | `15f67025b` | objectui#11345: the inline grid's default columns derive through the spec rule `deriveInlineGridColumns` | 1, patch | releasing | | `4c127cdef` | objectui#11613: `record:related_list` stops requiring `columns` | 1, minor | releasing; moves the manifest | | `c096f0327` | objectui#11383 (PR objectui#11619): the record chrome draws the record's picture from the object's `imageField` | 1, minor | releasing; smoke below; unlocks objectstack-ai#21765 | | `6e9090c26` | objectui#11336: an object document's served listViews count as served views | 1, patch | releasing | | `9db9ff3f9` `!` | objectui#11266: a form view's `subforms[].columns` entry is the spec's `InlineGridColumnSchema`, by reference | 1, minor, **BREAKING** | releasing; declared breaking, answered below | | `7c9a6b194` | objectui#11340: the docs portal renders the book resolver's answer | 1, patch | releasing | | `8b14aecbd` `!` | objectui#11608: `PartialSchema` is retired from `@object-ui/types` | 1, minor, **BREAKING** | releasing; declared breaking, answered below | | `2abec3a96` `!` | objectui#11610 (PR objectui#11614): the grid widget's eight field-level keys are camelCase; the snake_case spellings are refused by name | 1, minor, **BREAKING** | releasing; declared breaking, answered below; unlocks objectstack-ai#21768 | | `b403bb36f` `!` | objectui#8347: `BaseSchema` loses its index signature | 1, minor (`Clause-②: yes (narrowing)`, no BREAKING word) | releasing; declared breaking by its `!`, answered below | | `fd060f076` | objectui#11605: bound registrations stop requiring `objectName`, and a node with neither shows a no-object hint | 8, minor | releasing; moves the manifest | | `b508ac50d` | objectui#11601 (PR objectui#11611): the `ref:dataset` spec-form widget, fed by the report inspector's dataset catalog | 1, minor | releasing; unlocks objectstack-ai#21714 | | `d2e859936` | objectui#11002: the console asks `GET /usage/storage` only when the runtime serves `features.storageUsage` | 1, minor | releasing; smoke below | | `b92329c89` | objectui#11591: the Organization flows page copy | 1, patch | releasing | | `902ebab63` | objectui#11569: `record:line_items` stops requiring `childObject` | 1, minor | releasing; moves the manifest | | `278d2444e` | objectui#11546: a node click on a read-only flow canvas opens the inspector read-only | 1, patch | releasing | | `b61c116b2` | objectui#11577: `record:details` read mode keeps a textarea's line breaks | 1, patch | releasing | ## Declared-breaking changes, and how this repo answers each The ADR-0087 disposition is `not-required (no-migration-prescription)`. It replaces the bump's `adr-0087: TODO` placeholder in `.changeset/console-9dfaca654311.md`, and it covers all five entries below. `check-adr-0087-registration --base origin/main` gives "1 declared-breaking changeset(s), each carrying an ADR-0087 disposition". `check-changeset-no-major --base origin/main` gives "This diff introduces no `major` bump". 1. **objectui#11610 / PR objectui#11614 (`2abec3a96`): the grid widget's eight keys.** `min_rows`, `max_rows`, `allow_add`, `allow_delete`, `allow_reorder`, `total_field`, `add_label` and `sort_field` become `minRows` … `sortField`. objectui has no dual read: its zod faces refuse a snake_case key by name, and its `GridField` draws an inline alert instead of the grid. - **This repo, today.** `@objectstack/spec`'s runtime form field (`buildObjectFormRuntimeField`, `packages/spec/src/ui/component.zod.ts`) already refuses the eight snake_case keys by name, with guidance that names objectui#11610. The camelCase keys are not declared there yet. - **The interim, stated plainly.** Between this PR and objectstack-ai#21768, an ObjectStack-authored `grid` form field can spell the keys neither way. Measured on this head's built spec: `object-form` with `customFields: [{ name: 'items', type: 'grid', min_rows: 1 }]` is refused with `unrecognized_keys` at `customFields.0` and the grid-key guidance. The same field with `minRows: 1` is refused with `unrecognized_keys` at `customFields.0`, as an undeclared key. So a `grid` field takes its `columns` and the widget's own defaults. The refusal's prescription says these keys "come in once the widget reads a camelCase spelling". At this pin the widget does, and objectstack-ai#21768 declares the keys and retargets that prescription. - **Nothing here carries the retired spelling.** `git grep` over `examples/` and `packages/` finds no authored snake_case grid key. The only hits are the spec's own refusal list and its pin test, migration prose, and one historical note about objectui's internal master-detail adapter. 2. **objectui#11615 (`9dfaca654`): the `simple` form's inline section entries.** For TypeScript readers of `ObjectFormSection.fields`, the type gains the spec's `FormFieldInput` arm. No code in this repo imports `@object-ui/types`; the only `@object-ui/*` import is `scripts/gen-sdui-manifest-node.mjs` reading `@object-ui/core` from the built tree. The behaviour change is that the default `simple` form now draws an inline `{ name, … }` entry, as the other five form types already did. The showcase's `object-form` nodes are `wizard`, `drawer` and `modal` forms whose sections list field names, so none of them draws differently. 3. **objectui#11266 (`9db9ff3f9`): `subforms[].columns`.** objectui's validator now judges a column by `@objectstack/spec`'s own `InlineGridColumnSchema`. This repo has enforced that closed shape since objectstack-ai#20927. objectui's verdict now matches `os validate`, and the ObjectStack accept set does not move. 4. **objectui#11608 (`8b14aecbd`): `PartialSchema`.** It leaves `@object-ui/types`. Nothing in this repo names it (`git grep PartialSchema`: 0). 5. **objectui#8347 (`b403bb36f`): `BaseSchema` loses its index signature.** This narrows the TypeScript face of objectui's node types, and nothing here compiles against them. objectui's zod faces keep their accept sets for every key except `visibleWhen`. That key widens to the `{ dialect, source }` envelope this repo's own parse writes. ## The three cards this unblocks - **objectstack-ai#21714**: objectui#11601's `ref:dataset` widget (PR objectui#11611, `b508ac50d`) is now in the pinned build, so `report.form.ts`'s joined-block `dataset` row can declare `widget: 'ref:dataset'`. - **objectstack-ai#21768**: objectui#11610's camelCase keys (PR objectui#11614, `2abec3a96`) are now what the pinned widget reads, so the spec's runtime form field can declare them. - **objectstack-ai#21765**: objectui#11383's record picture (PR objectui#11619, `c096f0327`) is now in the pinned build, so `object.imageField`'s liveness row can move to `live`. The smoke below observes that read in the browser. The reader is `packages/components/src/renderers/layout/containers.tsx`, in the `page:header` record chrome. ## What changed here - **`.objectui-sha` and `.changeset/console-9dfaca654311.md`.** `scripts/bump-objectui.sh 9dfaca654311cddd81714153c4f82c241d7cdc54 --no-commit` wrote both, with `OBJECTUI_ROOT` set to the container's objectui clone after `git fetch origin main`. The range walked completely without a deepen, and the level was auto-set to `minor`. - **`sdui.manifest.json` and `scripts/sdui-manifest.record.json`.** `node scripts/gen-sdui-manifest-node.mjs` regenerated them over the tree that `pnpm objectui:build` built at the pin. There are 107 components at both pins, and the sha256 moves from `0ead67c1111d…` to `6f921896ffac…`. **This time the manifest moves**: - Eleven inputs lose `required: true` and gain a description. Nine are `objectName`, on `object-grid`, `list-view`, `object-form`, `embeddable-form`, `object-master-detail-form`, `object-kanban`, `object-metric`, `object-chart` and `object-pivot` (objectui#11605). The other two are `record:related_list` `columns` (objectui#11613) and `record:line_items` `childObject` (objectui#11569). - `object-master-detail-form`'s `fields` description is rewritten for objectui#11615's inline entries. - Where the spec has a `ComponentPropsMap` row, these inputs are already optional there. Measured on the built spec: `object-grid`, `object-form`, `object-kanban`, `object-metric` and `object-master-detail-form` `objectName`, `record:related_list` `columns` and `record:line_items` `childObject`. So the manifest now agrees with the spec rows. The JSX page compile reads the manifest, and it stops refusing a node whose `dataSource` binding names the object. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0. - **`packages/sdui-parser/objectui-lockstep.json`.** `pnpm gen:sdui-lockstep` re-recorded it against `OBJECTUI_ROOT=.cache/objectui-9dfaca654311`. It records 214 grammar lines (blob `0131f27cf86d`), 25 codes and containment predicate `76c18fb95d1f`. All are unchanged, and objectui's `packages/sdui-parser` has no diff over the range, so no port is owed. - **The 54 asserting pin citations in `packages/spec/src`.** They were re-measured at the new pin, not restamped: - Each asserting record's anchors were resolved in objectui at `2e818d0b5`, mapped through `git diff -U0 2e818d0b5 9dfaca654`, and re-read at the new pin. Each record gains a dated 2026-10-05 hop sentence and keeps its earlier history. - In every cited file that changed, the cited lines moved with their text byte-identical: - objectui#8347 re-worded docblocks in `ObjectGrid.tsx`, `ObjectTree.tsx`, `ObjectGantt.tsx`, `ObjectCalendar.tsx`, `SchemaRenderer.tsx`, `plugin-view/src/ObjectView.tsx`, `plugin-map/src/index.tsx` and `plugin-gantt/src/index.tsx`. - In `ObjectKanban.tsx`, objectui#8347 added a private `GateBoundKanbanSchema` read type, so its fetch, navigation reads and spread moved +30. - objectui#11605 touched `plugin-kanban/src/index.tsx`, `plugin-dashboard/src/index.tsx` and `ElementDataSourceGate.tsx`. The `object-metric` icon input moved `281` → `299` and is still `{ name: 'icon', type: 'string' }`. - objectui#11619 moved the `page:tabs` and `page:accordion` icon anchors in `containers.tsx` by +3. - objectui#11615, objectui#11266 and objectui#8347 moved `ObjectKanbanSchema.limit`, `ObjectMapConfigSchema` and `LIST_VIEW_LOCAL_OVERRIDES` in `objectql.ts` and `objectql.zod.ts`. - objectui#11605 added `view.noObject` to the `en`, `zh` and `de` locale packs. Their cited `calendar.configRequired` strings did not change or move. - One cited line changed content. `ObjectKanban.tsx:10`, the type import, gained `SortConfig` beside the `ObjectKanbanSchema` the record cites. - Two counts were re-taken by their records' own methods, and both read the same: the `keyboardNavigation` hit lines (15, against the `schema.editable` control's 3) and the `ElementDataSourceGate` occurrences in five `src/index.tsx` shells (0, 3, 3, 3 and 4). - The three quoted anchors in `ui/view.zod.ts`'s map record redded at this pin, and each was re-read and re-pointed: `case 'map':` moved `2299` → `2300`, `ObjectMapConfigSchema` `2370` → `2388`, and `LIST_VIEW_LOCAL_OVERRIDES` `1419` → `1437`. - **The six migration entries' corpus counts** were re-taken with `git grep -o -F`. That method first reproduced every `2e818d0b5` number: 7579 files, `objectstack` 17227, `@objectstack/spec` 7134, `timeout` 1351, `useState` 2477, `TTL` 182, `tenant` 1317 and `Span` 505. - The new numbers are 7632 files, 17313, 7186, 1360, 2477, 182, 1318 and 508. The other controls read `RuntimeConfig` 276 → 293, `resourceLimits` 2 → 2, `window` 4175 → 4193, `period` 238, `interval` 195 and `metrics` 374 → 401. - Every zero is still zero: 98 tokens were checked, the export lists of the three cited spec files plus every named key. The only non-zero tokens are the expected `Span` (508) and `SpanSchema` (57). The three new `Span` hits are `colSpan` in objectui's `object-form-section-field-entry-11615.test.ts`. Both `resourceLimits` hits are still prose in `packages/app-shell`. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-9dfaca654311.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build and canaries `build-console.sh` ran locally under the verify lock, after `turbo run build --filter=@objectstack/client...`, the same two steps the `Console Pin Gate` job runs. Exit 0, 9m02s on a shared four-core box. The build log reports: - "Bundle canary 'import/jobs' present". - "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - "Console bundle carries THIS tree's @objectstack/spec, and only it". - "@objectstack/console dist ready (64192 KB) from objectui@9dfaca654311". `check:console-sha` and `check:console-injection` exit 0 against that dist. ## Browser smoke: `examples/app-showcase` with the Console built at `9dfaca654311` The server ran `pnpm dev -- --fresh --ui --no-watch --compile -p 41877` with `OS_PORT=41877`, on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, signing in through the console's own login form, with console messages, page errors and every 4xx/5xx response captured. Only the PIDs this run started were stopped. **No showcase object declares `imageField`, so the record picture needs one to exist.** `git grep imageField examples` gives 0 hits. To exercise objectui#11619's read, the smoke made a temporary local edit: - It added `imageField: 'f_image'` to `showcase_field_zoo`, through `node scripts/ablation-replace.mjs --hold`. - It compiled and booted the server. - It restored the file at once with `--restore`. The tool reports the blob back to HEAD's `4130858b8f8b` and `git diff HEAD` empty, and `git status --porcelain` is empty. - After the run, the showcase `dist/` was restored from turbo's cache for the clean source: sha256 `cc1034dd9d23…`, as before the smoke. The stray runtime bundle of the edited compile was deleted. Nothing of the edit is in this diff. A real `sys_file` was uploaded through `/api/v1/storage/upload/presigned` → `PUT` → `/upload/complete` (a 64×64 red PNG) and written to "Specimen — Full"'s `f_image`. | record page | `[data-record-picture]` | image | |---|---|---| | Field Zoo "Specimen — Full" (`f_image` set) | 1, beside the title in the record header, `rounded-md` (an `image` field, not `avatar`) | `src="/api/v1/storage/files/b1f4e384-…"`, `alt=""`, loaded, `naturalWidth` 64 | | Field Zoo "Specimen — Minimal" (`f_image` empty) | 0 | none, as objectui#11619 specifies for an empty value | **Verdict:** at this pin the record header draws the record's picture from the object's `imageField`, drawing the stored file through `/api/v1/storage/files/:id`, and draws nothing when the value is empty. `showcase_task`'s record page is the custom `task-detail` page, which has no `page:header`, so it draws no record chrome to put a picture in. That page was smoked too: it renders its path bar, highlights and sections with 0 page errors. **Console messages across the run:** 0 page errors. The only failed loads are a 401 on `GET /api/v1/auth/get-session` (the pre-login probe) and a 404 for `/favicon.ico`. There is no `/api/v1/usage/storage` 404. objectstack-ai#21625's and objectstack-ai#21710's smokes both recorded one, and objectui#11002 (`d2e859936`) stopped the request on a runtime that does not serve it. ## Gates and tests (head `4b9519ea23`) - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 127 commands from the 22-path diff, and all were run at `4b9519ea23`. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. - Two exited 3 (`PREREQUISITE NOT MET`) on the first pass: `check:skill-examples` (no `client-react` dist) and `check:dual-build-cjs-loads` (no dist for 34 packages). - Both exited 0 after `turbo run build --filter=!@objectstack/docs` (71 of 72 tasks were cache hits), and those are the codes recorded. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with objectui at the pin: 54 asserting citations match `9dfaca654`, and 7 anchor content assertions are verified. - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest`, `check:console-sha`, `check:console-injection`, `check:migration-registry`. - `@objectstack/spec check:generated`: all 15 artifacts current after the `--fix`. - `pnpm --filter @objectstack/spec exec vitest run` (both projects, `local` and `repo`): 668 files, 19259 passed, 1 todo. `pnpm --filter @objectstack/spec typecheck`: exit 0. - `@objectstack/sdui-parser` test (14 files, 225 passed) and typecheck: exit 0. - These suites read the regenerated manifest: - `@objectstack/lint` test: 119 files, 5627 passed. It declares `sdui.manifest.json` as a test input. - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts`: 70 passed. - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts` and `test/validate-build-gate-parity.test.ts`: 2 files, 79 passed. - `test/jsx-gate-manifest-notice.e2e.test.ts` belongs to neither CLI tier; it runs nightly, so it is NOT MEASURED here and is left to CI. - `eslint --no-inline-config --format json` on the 15 changed TS files: 15 files, 0 errors and 0 warnings. The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). The config enables no type-aware linting (`:327-328`), so this diff cannot move a verdict on an untouched file. Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - `main` moved two commits past this branch's base (objectstack-ai#21783, objectstack-ai#21780). Neither touches a path this diff touches, so no merge was made. The merge queue rebuilds on the current `main`. - Anchors in records that cite no asserting sha are outside the pin-citation gate's population and were not re-measured. Several point into files that changed here: `containers.tsx` anchors in `ui/component.zod.ts` docblocks with no sha, and `component.test.ts`'s `plugin-dashboard/src/index.tsx:204` (the `ObjectMetricPropsSchema icon liveness` test, already reading an unrelated line at `ab1879721595`, as objectstack-ai#21710 noted). - After this pin, the spec's snake_case grid-key prescription ("these come in once the widget reads a camelCase spelling") describes a condition that now holds. objectstack-ai#21768 retargets it when it declares the camelCase keys. It is left as is here, because the pin bump changes no accept set. - Writes: one draft PR through the relay and the report comment. No label, no PR assignee, no ready flag and no auto-merge were written, because this dispatch's write budget names none of them. --- _Generated by [Claude Code](https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…ui#11636, objectstack-ai#11637, objectstack-ai#11635, objectstack-ai#11624 and objectstack-ai#11640) (objectstack-ai#21827) Fixes objectstack-ai#21807 Clause-②: no This moves the bundled Console's objectui pin from `9dfaca654311` (objectstack-ai#21772, PR objectstack-ai#21800) to `0abd4f9f8769fc4c19ad2f96707684876f74c09f`, which was objectui `main` at write time and is past `39a3e91fad`. The Console now carries objectui#11636, the fix for objectui#11092: the screen-flow runner names the flow by its served label, translated. That merge is what objectstack-ai#20318 waits on. The range also carries objectui#11637 (objectui#11170), objectui#11635 (objectui#11095), objectui#11624 (objectui#11396) and objectui#11640 (objectui#11628). ⛔ This is not a release act. Version PR objectstack-ai#21352 is untouched, and no tag, publish or Release was made. ## Range - objectui `git ls-remote origin refs/heads/main` read `0abd4f9f8769fc4c19ad2f96707684876f74c09f` at 2026-10-05T04:53:29Z, just before the bump. - Re-read at 05:37:53Z, it reads `59917c4b2` (objectui#11639, a served view's toolbar change written inside `config`), one commit past the pin. This PR does not carry it. - The objectui clone is full (`--is-shallow-repository`: false). `git merge-base --is-ancestor` exits 0 against `0abd4f9f8` for `39a3e91fa`, `c4c506b9e`, `22ddcd5c5` and `1c2e2c46c`. - `9dfaca654311..0abd4f9f8769` has 5 commits and 0 merges. - objectui declared 5 changesets over the range: 3 release and 2 release nothing. Every commit carries a changeset. None declares `major`, and none carries the breaking annotation. The highest declared level is `minor`, so the console changeset is `minor`. These counts come from the bump's own digest and were re-read from the changeset blobs. - **No commit subject in the range carries `!`.** `git log --format='%h %s' 9dfaca654..0abd4f9f8 | grep -E '^[0-9a-f]+ [a-z]+(\([^)]*\))?!:'` matches nothing (exit 1). | objectui commit | landing | changeset | note | |---|---|---|---| | `1c2e2c46c` | objectui#11624 (objectui#11396): `MasterDetailDetailConfig` is derived from the spec's `details` entry by reference, member for member the same | release-nothing | moves the manifest (below) | | `22ddcd5c5` | objectui#11635 (objectui#11095): a dataset-bound KPI tile's re-read on the data-invalidation bus gets a pin; tests and a doc comment only | release-nothing | | | `39a3e91fa` | objectui#11636 (objectui#11092): the flow runner names the flow by `flows.FLOW.label`, then the served `flowLabel`, then the API name | minor (`Clause-②: yes (widening)`) | smoke below; unlocks objectstack-ai#20318 | | `c4c506b9e` | objectui#11637 (objectui#11170): one declaration of per-type NODE SLOTS; `objectui check`, core `validateSchema`, the SDUI parser's `validateTree` and the `kind:'html'` compile walk them | minor (`Clause-②: yes (narrowing)`) | answered below | | `0abd4f9f8` | objectui#11640 (objectui#11628): the External Datasource panel unwraps the `{ success, data }` envelope | patch | smoke below | ## Declared-breaking entries and the ADR-0087 disposition **There are none to dispose of.** No commit subject carries `!`, no changeset declares `major` or the breaking annotation, and the bump wrote no `adr-0087: TODO` placeholder. `check-adr-0087-registration --base origin/main` reports "this PR adds no declared-breaking changeset". `check-changeset-no-major --base origin/main` reports "This diff introduces no `major` bump". One entry narrows by its own declaration, so here is how this repo answers it. **objectui#11170 (`c4c506b9e`, `Clause-②: yes (narrowing)`)** widens the reach of four objectui validators: each now judges nodes held in a renderer's declared slots, not only in `children`. It adds, removes or renames no ObjectStack-authorable key, and no Zod schema or stored `sys_metadata` shape moves. Its sdui-parser half only takes effect when a manifest is built with `slotsFor`. This repo's `scripts/gen-sdui-manifest-node.mjs` calls `manifestFromConfigs(configs)` without that option, and the regenerated `sdui.manifest.json` carries 0 `slots` keys. So the save gate's walk does not move with this bump. The lockstep reading is in Acceptance notes. ## What changed here (22 files, +255 / -93) - **`.objectui-sha` and `.changeset/console-0abd4f9f8769.md`.** `scripts/bump-objectui.sh 0abd4f9f8769fc4c19ad2f96707684876f74c09f --no-commit` wrote both, with `OBJECTUI_ROOT` set to a read-only objectui clone in the scratchpad. The range walked completely and the level was auto-set to `minor`. - The digest rendered objectui#11170's bullet as its first line, the bare `**Clause-②: yes (narrowing)**`. That bullet is rewritten to say what landed. - A closing paragraph states the range has no declared-breaking entry and names the release-nothing pair. - **`sdui.manifest.json` and `scripts/sdui-manifest.record.json`.** `node scripts/gen-sdui-manifest-node.mjs` regenerated them over the tree that `pnpm objectui:build` built at the pin. It still has 107 components, and the sha256 moves from `6f921896ffac…` to `f95d406a584e…`. - One input moved: `object-master-detail-form`'s `details` gains `of: "object"` and a description of the spec's closed entry (objectui#11396). `"of": "object"` occurrences go from 12 to 13. - The record moves its pin and `modulesRoot`. objectui's workspace version stays 17.7.0, confirmed against the pin by `check-sdui-manifest --require-objectui`. - **`packages/sdui-parser/objectui-lockstep.json`.** `gen:sdui-lockstep` re-recorded it from the clone at the pin. It records 214 grammar lines (blob `0131f27cf86d`), 25 diagnostic codes and containment predicate `76c18fb95d1f`, all unchanged, so no port is owed by that gate. - **The 54 asserting pin citations in `packages/spec/src`, re-measured, not restamped.** - **Method.** The range changes 50 paths. Each asserting record's cited objectui paths were resolved against the tree at `9dfaca654`. Ambiguous bare names were disambiguated by the record's own directory. Each `index.tsx` and `types.ts` cited is a `plugin-kanban`, `plugin-dashboard`, `plugin-map`, `plugin-gantt`, `plugin-grid`, `plugin-tree` or `plugin-timeline` file. None is `plugin-form/src/index.tsx` or `sdui-parser/src/types.ts`, the two same-named files the range touches. - **Result.** No asserting record cites a changed path. So every cited file is byte-identical across the hop, and every anchor held unmoved. - **Records.** Each of the 41 hand-written records gains a dated 2026-10-05 hop sentence and keeps its earlier history. - **Counts.** Three records carry a count, and each was re-taken by its own method; all three read the same at `2e818d0b5`, `9dfaca654` and `0abd4f9f8`: - the `keyboardNavigation` hit lines: 15, against 3 for the `schema.editable` control; - `ObjectKanban.tsx`'s `quickAdd` / `onQuickAdd`: 2 each, against 11 for `onCardClick`; - the `ElementDataSourceGate` occurrences in the five `src/index.tsx` shells: 0, 3, 3, 3 and 4. - **Corpus counts.** The six migration entries' counts were re-taken with `git grep -o -F`. That method first reproduced every `9dfaca654` number: 7632 files, `objectstack` 17313, `@objectstack/spec` 7186, `timeout` 1360, `useState` 2477, `TTL` 182, `tenant` 1318, `RuntimeConfig` 293, `resourceLimits` 2, `window` 4193, `period` 238, `interval` 195, `metrics` 401 and `Span` 508. - The new readings are 7650 files, `objectstack` 17390, `@objectstack/spec` 7209 and `useState` 2478. `window` reads 4194. Every other control is unchanged. - All 98 checked tokens (the export lists of `plugin-lifecycle-advanced.zod.ts`, `tracing.zod.ts` and `metrics.zod.ts`, plus every named key) read the same at both pins: every zero is still zero, and `Span` / `SpanSchema` read 508 / 57. - `packages/spec/src/migrations/registry.ts` was regenerated with `gen:migration-registry`. - **`.changeset/objectui-pin-citations-0abd4f9f8769.md`** is a `@objectstack/spec` patch, because the `FormField.span` describe and six migration descriptions name the pin. `content/docs/references/ui/view.mdx` was regenerated by `check:generated --fix`. No example, test or gate needed adapting, and no code changed outside generated records, citations and changesets. ## Console build (the local Console Pin Gate equivalent) `turbo run build --filter=@objectstack/client... --filter=@objectstack/spec...` and then `pnpm objectui:build` ran as one command under the verify lock. That is a clean build: mode 3 shallow-cloned objectui at the pin into `.cache/objectui-0abd4f9f8769`. Exit 0, 10m51s on the shared box. The build log reports: - "Bundle canary 'import/jobs' present". - "Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:5}". - **"Console bundle carries THIS tree's @objectstack/spec, and only it"**: the spec-injection check passes. - "@objectstack/console dist ready (64232 KB) from objectui@0abd4f9f8769". `check:console-sha` and `check:console-injection` (self-test 67 assertions, then the dist check) exit 0 against that dist. ## Browser smoke: `examples/app-showcase` with the Console built at `0abd4f9f8769` The server ran `pnpm dev -- --fresh --ui --no-watch -p 41907` with `OS_PORT=41907`, on its own ephemeral DB with the seeded admin. Headless Chromium (`/opt/pw-browsers/chromium`) drove it, signing in through the console's login form. Page errors, console errors and every 4xx/5xx response were captured. Only the PIDs this run started were stopped. **Flow label (objectui#11636 / objectui#11092).** The launch was Tasks list, select a row, then the toolbar's "Reassign…" (`showcase_bulk_reassign`, which targets the screen flow `showcase_reassign_wizard`, label "Reassign Task"). | leg | trigger answer | runner header line | dialog title (accessible name) | API name shown | completion toast | |---|---|---|---|---|---| | `en` | 200, `status: paused`, `flowLabel: "Reassign Task"` | `Reassign Task` | `New Assignee` (the screen's own title) | no | `Flow "Reassign Task" completed` | | `zh-CN`, with a bundle entry `flows.showcase_reassign_wizard.label` | 200, `flowLabel: "Reassign Task"` | `重新分配任务` | `New Assignee` | no | `流程「重新分配任务」已完成` | - The resume answered 200 with `flowLabel` on both legs. - **The showcase bundle declares no `flows` translations** (`git grep` finds none), so the `zh-CN` leg needed one to exist. It was made by a temporary local edit, as objectstack-ai#21800's smoke did for `imageField`: - `node scripts/ablation-replace.mjs --hold` added `flows: { showcase_reassign_wizard: { label: '重新分配任务' } }` to the `zh-CN` block of `examples/app-showcase/src/system/translations/index.ts`. - The server booted with `--compile`. - The file was restored at once with `--restore`. The tool reports the blob back to HEAD's `f0517049b565` and `git diff HEAD` empty, and `git status --porcelain` is empty. - `GET /api/v1/i18n/translations/zh-CN` served the entry, and the session's `html[lang]` read `zh-CN`. - The showcase `dist/` was rebuilt afterwards (`turbo run build --filter=@objectstack/example-showcase --force`), and the held string has 0 hits in `dist/objectstack.json`. Nothing of the edit is in this diff. - **Verdict:** at this pin the runner header and the completion toast name the flow by the active language's `flows.FLOW.label`, then the served label, and never by the API name. The launcher button still reads the ACTION's label ("Reassign…"), which is the action's own string and not the flow's. **The range's other landings.** | landing | surface | observed | |---|---|---| | objectui#11640 (objectui#11628) | Setup → `metadata/datasource/showcase_external` | The External Datasource panel lists the remote tables `customers` (7 columns) and `orders` (7), each with Import. "Refresh catalog" (`POST …/external/refresh-catalog` 200) shows `snapshot 10/5/2026, 5:25:23 AM`. "Run validation" (`POST …/external/validate` 200) renders "All 2 objects match the remote schema." with `showcase_ext_customer` and `showcase_ext_order`, and no render error. | | objectui#11624 (objectui#11396) | `page/showcase_project_workspace` (`object-master-detail-form`, `details: [{ title: 'Tasks', childObject: 'showcase_task', addLabel: 'Add task' }]`) | The master form draws its 6 fields. The Tasks section draws, and "Add task" opens the child's inline form with 14 more fields (Title*, Assignee, Priority, …). 0 page errors. | | objectui#11637 (objectui#11170) | the three `kind:'html'` pages: `showcase_start_here`, `showcase_capability_map`, `showcase_command_center_jsx` | All three render (1563 / 2426 / 882 characters of text), with no compile or validation text and 0 page errors. | | objectui#11635 (objectui#11095) | `dashboard/showcase_ops_dashboard`, `showcase_revenue_pulse`, `showcase_chart_gallery` | The ops tiles read Active Projects 2, At-Risk (Red) 1, Awaiting Review 2 and Total Budget 1,090,000, matching objectstack-ai#21710's REST cross-check. All three dashboards have 0 page errors. This landing changes no executable code (its changeset: tests and one doc comment). An out-of-band REST `PATCH` of a task to `in_review` did not re-read the open tile: it stayed 2 with 0 dataset queries in 6s, and read 3 after a reload. That mutation never travels the console's own invalidation bus, so this is no reading of objectui#11095's pin. **NOT MEASURED** there. | **Console messages across the run:** 0 page errors. The failed loads are the pre-login `401 GET /api/v1/auth/get-session`, one `404` per page load that the response listener did not attribute (`/favicon.ico` answers 404 on this server, as objectstack-ai#21800 recorded), and `404 GET /api/v1/meta/datasource/showcase_external?state=draft`, the panel's draft probe for a datasource that has no draft. ## Gates and tests (head `e40526e564`) - `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 127 commands from the 22-path diff, and all 127 were run at `e40526e564` and exited 0. `--ran` reports "127 derived, 127 run, 0 NOT-MEASURED, 0 UNRUN", with every exit code recorded. The full workspace build (`turbo run build --filter=!@objectstack/docs`) ran first, so no dist-reading gate met a missing prerequisite. - Also exit 0: - `check:objectui-pin-citations --verify-anchors` with `OBJECTUI_ROOT` at the pin: "54 asserting objectui pin citation(s) match .objectui-sha (0abd4f9f8)", and "7 anchor content assertion(s) verified against objectui at 0abd4f9f8". - `check:objectui-bump` (20 assertions across 5 cases), `check:sdui-lockstep`, `check-sdui-manifest --require-objectui`, `check:console-sha`, `check:console-injection`. - `check-adr-0087-registration --base origin/main` and `check-changeset-no-major --base origin/main`. - `@objectstack/spec check:generated`: all 15 artifacts current after the `--fix`. - `pnpm --filter @objectstack/spec exec vitest run`: 668 files, 19261 passed, 1 todo. `pnpm --filter @objectstack/spec typecheck`: exit 0. - `@objectstack/sdui-parser` test (14 files, 225 passed) and typecheck: exit 0. - These suites read the regenerated manifest: - `@objectstack/lint` (119 files, 5627 passed); - `@objectstack/metadata-protocol` `src/protocol.runtime-authoring-gate.test.ts` (70 passed); - `@objectstack/cli` unit tier `src/utils/sdui-manifest.test.ts` and `test/validate-build-gate-parity.test.ts` (2 files, 79 passed). - The CLI integration tier is declared to CI. - `eslint --no-inline-config --format json` on the 15 changed TS files: 15 files, 0 errors and 0 warnings. - The lint population is `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` (`eslint.config.mjs:971`). - The config enables no type-aware linting (`:328`), so this diff cannot move a verdict on an untouched file. - Repo-wide `pnpm lint` is left to CI. ## Acceptance notes - **Lockstep, a reading and not a gate result.** objectui#11170 gives objectui's `validateTree` a slot walk: `slotElements` plus the `comp?.slots` loop in `packages/sdui-parser/src/validate.ts`. This repo's port has none (`git grep -n slots packages/sdui-parser/src`: 0). - The walk only fires for a manifest built with `slotsFor`, and this repo's committed manifest carries no `slots`. So the save gate and objectui's runtime parser still agree on that manifest. - objectui's `kind:'html'` compile (`getJsxManifest`) is now built with `slotsFor`. A slot-held node that fails validation could fail the renderer's compile while this repo's save gate accepts it. - `check:sdui-lockstep` compares the grammar region, the codes and the containment predicate, so it cannot see a walk-depth change. That class is outside its reach by its own header ("CANNOT see … WHEN a code fires" beyond the predicate). - Not measured through a public door here, so it is noted rather than filed. Carrier: none. - `main` moved three commits past this branch's base (objectstack-ai#21810, objectstack-ai#21808, objectstack-ai#21809). `git merge-tree --write-tree HEAD origin/main` is clean. Two of them touch files this diff touches: `api-methods-batch-conformance.test.ts` (test titles) and `component.test.ts` (objectstack-ai#21808 re-points a non-asserting anchor). The merged tree still carries 1 and 6 citations at the new pin and 0 at the old one. No merge was made; the merge queue rebuilds on the current `main`. - objectui `main` reached `59917c4b2` (objectui#11639) after the pin was read. It is not in this range. - Writes: one draft PR through the relay and the report comment on objectstack-ai#21807. No label, PR assignee, ready flag or auto-merge was written; this dispatch's write budget names none of them. --- _Generated by [Claude Code](https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…ed decision in words instead of a tracker number (stage 26) (objectstack-ai#21987) Part of objectstack-ai#20749 Clause-②: no Stage 26 of this card: the next area of class (e), the test strings shipped under `packages/spec/src`, as ruled in `5902360492` on objectstack-ai#20513. This stage takes the first name-ordered `system/` group: the 18 id-bearing test files under `packages/spec/src/system/` from `auth-config.test.ts` to `metadata-form-declared-rows.pin.test.ts`, with `constants/system-names.test.ts` in its path position. Those files carried 91 messages and 97 tracker ids, citing 54 records. All 97 now either state what their record decided, in words (form D), or are dropped where the title already says it. No needle sits in this group. Text only: no assertion, identifier, test count or code comment changes, and no file is renamed. ## Census at the base (`dcf3eb494a`) Instruments: `census10.cjs` (md5 `9d08602ab972b4b8643c90d64d40fa41`), `census.cjs` (md5 `6e42a45a926d375013c32d62f16a296e`), `census-wide.cjs` (md5 `c98410a19529c439adb0afbfb00026a2`) and `dirtable.cjs` (md5 `dda605c54745b4a60cc14c9a686e4eff`), byte-identical to the copies stages 10 to 25 used. A literal counts as a test title when its folded message is argument 0 of a `describe` / `it` / `test` call, `.each` / `.skip` / `.only` chains included. Everything else is an "other" string. The worktree was cut from `origin/main` at `dcf3eb494a`, the claim's base and stage 25's landing. Both instruments read **282 messages / 297 ids in 71 files**, the seat's reading and stage 25's head reading. | directory | files | messages / ids | titles | other | |:--|--:|--:|--:|--:| | `system/` (this PR: 18 of its 34 files) | 34 | 154 / 167 | 128 / 138 | 26 / 29 | | (files directly in `src/`) | 30 | 118 / 120 | 117 / 119 | 1 / 1 | | `ui/` | 5 | 7 / 7 | 0 | 7 / 7 | | `ai/` | 1 | 2 / 2 | 0 | 2 / 2 | | `contracts/` | 1 | 1 / 1 | 0 | 1 / 1 | | **total** | **71** | **282 / 297** | **245 / 257** | **37 / 40** | The group reads **91 messages / 97 ids in 18 files**, the seat's figures file for file: | file (under `system/`) | messages / ids | titles | other | |:--|--:|--:|--:| | `auth-config.test.ts` | 2 / 2 | 2 / 2 | 0 | | `book.test.ts` | 2 / 2 | 2 / 2 | 0 | | `cache.test.ts` | 1 / 1 | 1 / 1 | 0 | | `collaboration.test.ts` | 1 / 1 | 1 / 1 | 0 | | `compliance-families-retirement.test.ts` | 7 / 7 | 4 / 4 | 3 / 3 | | `constants/system-names.test.ts` | 1 / 1 | 1 / 1 | 0 | | `core-service-provider.test.ts` | 1 / 1 | 1 / 1 | 0 | | `data-migration-flag-column-move.pin.test.ts` | 2 / 3 | 2 / 3 | 0 | | `disaster-recovery.test.ts` | 1 / 1 | 1 / 1 | 0 | | `email-config.test.ts` | 2 / 2 | 2 / 2 | 0 | | `email-template-floor-locale-parity.pin.test.ts` | 1 / 1 | 1 / 1 | 0 | | `environment-artifact.test.ts` | 5 / 5 | 5 / 5 | 0 | | `http-server.test.ts` | 2 / 2 | 2 / 2 | 0 | | `i18n-resolver.test.ts` | 53 / 56 | 50 / 53 | 3 / 3 | | `job.test.ts` | 4 / 4 | 4 / 4 | 0 | | `logging.test.ts` | 1 / 3 | 1 / 3 | 0 | | `message-queue-retirement.test.ts` | 3 / 3 | 1 / 1 | 2 / 2 | | `metadata-form-declared-rows.pin.test.ts` | 2 / 2 | 2 / 2 | 0 | | **18 files** | **91 / 97** | **83 / 89** | **8 / 8** | Ten more test files sit in the same name range and carry no id (`constants/platform-object-names`, `constants/platform-tool-names`, `core-services`, `deploy-bundle`, `doc`, `encryption`, `i18n-resolver.nav-label-identity`, `i18n-resolver.object-list-views`, `job-pull-organization`, `license`). The eight "other" strings are expect failure messages, rewritten and declared to the text-only tool: `compliance-families-retirement.test.ts:159` (a template literal), `:210` and `:494`; `message-queue-retirement.test.ts:87` (a template literal) and `:127`; `i18n-resolver.test.ts:3288` (the second leaf of a `+` chain), `:3299` and `:3303`. - **Controls.** Lit: `system/metrics.test.ts` (4 / 5) and `system/translation.test.ts` (12 / 12), outside the group, read the same at the base and at the head. Dark: `i18n-resolver.test.ts` reads 0 at the head while 47 of its lines still carry `#` plus digits: 45 comment lines and the two `(batch objectstack-ai#58)` titles below. Planted in a scratch tree: an id put into the rewritten `i18n-resolver.test.ts` "per-component copy" title reads 1 / 1 (`title:describe`), and an id put into a `job.test.ts` comment reads 0. - **A wider pattern** (any `#` plus digits) reads the same as the gate pattern in 17 of the 18 files at the base. In `i18n-resolver.test.ts` it reads two more: `:1744` and `:1757` end in "(batch objectstack-ai#58)", a two-digit decision-batch label that the gate's three-to-five-digit pattern does not count. Neither literal carries a counted id, so both stay, in the form earlier stages kept batch labels (stage 21's `批 17`, stage 22's `批 14` / `batch 13`). At the head the wider pattern reads 0 in 17 files and those 2 in `i18n-resolver.test.ts`. - **At the head:** 191 messages / 200 ids in 53 files. The 18 files read 0 / 0, `system/` reads 63 / 70 in 16 files, and no other file moved. ## How the area was chosen `system/` is taken in path-ordered file groups near the ~100-id bound, the rule stages 20 to 25 used, with `constants/system-names.test.ts` sorting at `constants/`. Stage 25's cut named this group at 97 ids, and this census reads 97, so no re-cut was needed. `i18n-resolver.test.ts` (56 ids; objectstack-ai#21948 landed into it at `bab76850cd`, and its titles were read at this base) fits one PR and one text-only proof, so it is not split. **Named for the next stages** (cut from the head census, 191 / 200): - **the second `system/` group:** `metadata-form-zod-reconciliation.test.ts` through `worker.test.ts`, 16 files, 63 messages / 70 ids (45 / 49 titles, 18 / 21 other). Its first file alone carries 21 / 24, 17 of them "other" strings (its ledger `why` entries). - The files directly in `src/`, 120, one stage. - The needles: one stage, with an at-tier review. The four colour literals stay, as stage 21 decided. ## What each id became - **23 literals (25 ids)** now state a decision in words. - **11 literals (12 ids)** get their subject back in words, where the number stood for a thing. - **57 literals (60 ids)** drop a number the title already explains. Every cited record was fetched with all its comments through REST, and its decision was read from its ruling, ACCEPT and landing comments: a keyword digest of every record, and full reads wherever the new words carry a decision. 54 records are cited: 51 answer 200 (objectstack-ai#15514 is a PR, merged as `bf1054a4c0`) and 3 answer 404. The three that answer 404 were read from what landed, through the commits endpoint (this checkout is shallow), each found through its CHANGELOG entry or the file's own commit anchor: - **objectstack-ai#10926**, from `d173125fb8` (objectstack-ai#11438): the component-translation `submitLabel` copy key is retired (maintainer ruling 2026-08-22, option A); - **objectstack-ai#12961**, from `901355c3bc` (objectstack-ai#13111): `translatePage` descends into declared `properties.children` ("Ruled 2026-08-29 (option A)"; region-level id wins a collision); - **objectstack-ai#13218**, from `c45d8e6b4e` (objectstack-ai#13641): `walkAddressedPageComponents` is exported as the one addressed-component walk, consumed by `translatePage` and the CLI extractor alike. **The same-id title stage 25 listed:** `book.test.ts:413` "ResolvedBookSchema is the book-tree response contract (objectstack-ai#12038)". Its body parses the real `resolveBookTree()` output, accepts the honest-empty tree and pins each Zod schema type-identical to its interface: a describe-only transcription, which the five-part ruling's implementation plan names (`5434804846`). None of 1C · 2C · 3A · 4A · 5A is pinned, so no letter is named; the title already says the decision, and only the number goes. **"ruled:" appears in two titles,** each on a record that carries a ruling: - `data-migration-flag-column-move.pin.test.ts:72`: "(ruled: one nullable datetime on the flag row)". objectstack-ai#15989's comment `5556979386`, headed "The four questions — ruled", answers Q1 with A: a new nullable datetime field on `DataMigrationFlagSchema`, whose failure mode is absence. objectstack-ai#16185's body restates it ("The mechanism was ruled on objectstack-ai#15989 as A"). - `i18n-resolver.test.ts:4944`: "(ruled: the authored label is the default-locale text)". objectstack-ai#15711's maintainer ruling A, recorded in `5549577889`. **Stated in words** (23 literals): | record | literal (under `system/`) | now reads | the decision | |:--|:--|:--|:--| | objectstack-ai#11739 | `auth-config.test.ts:423` | "AudienceConfigSchema — one closed audience posture, invite_only when undeclared" | One declared posture, a closed vocabulary (`invite_only` / `email_domain` / `open`), `invite_only` when undeclared, as the body records it ruled. | | objectstack-ai#15679 (objectstack-ai#14478 ruling B) | `cache.test.ts:336`, `collaboration.test.ts:1005`, `disaster-recovery.test.ts:235` | "… carry their unit in the key name" / "… carries its unit in the key name" | The `system/` duration keys carry their unit in the key name, stage 25's objectstack-ai#15677 reading. | | objectstack-ai#15513 | `compliance-families-retirement.test.ts:210`, `:494` (expect messages) | "… being undone — the three families were retired whole, none roadmapped" | Maintainer ruling A (`5548577921`): the three compliance-shaped families are retired whole; none is roadmapped. | | objectstack-ai#15989 Q1, via objectstack-ai#16185 | `data-migration-flag-column-move.pin.test.ts:72` | "columns_moved_at — absence is the contract (ruled: one nullable datetime on the flag row)" | Above. | | objectstack-ai#16185 constraint 2 | `data-migration-flag-column-move.pin.test.ts:126` | "the ONE arbiter is unchanged by the new member — read beside it, never inside it" | `isDataMigrationFlagVerified` is not touched; the new field is read in addition to the arbiter, never inside it. | | objectstack-ai#19184 | `job.test.ts:881` | "JobSchema's own @example — copied verbatim, it parses" | The example stops opening with the retired `id`, so a verbatim copy is accepted. | | objectstack-ai#8075 | `message-queue-retirement.test.ts:127` (expect message) | "… being undone — the family had no consumer and carried an inline credential" | Fork (b): exported but unconsumed, the credential-bearing shape is retired whole. | | objectstack-ai#16772 | `i18n-resolver.test.ts:1207` | "translateDashboard — global filters, addressable from a bundle" | Finding B: `dashboards.NAME.globalFilters` becomes a bundle group. | | objectstack-ai#6080 | `:1573` | "per-component copy, keyed by component id" | Page component copy gets a bundle address by component id. | | objectstack-ai#13218 (404) | `:2215` | "walkAddressedPageComponents — the one addressed-component walk, shared by the resolver and the CLI extractor" | What landed in `c45d8e6b4e`. | | objectstack-ai#5377 | `:2652` | "resolveTabLabel — filter-preset tab labels, keyed under `_tabs`" | Tab labels get the `objects.OBJECT._tabs.TAB.label` key and a resolver. | | objectstack-ai#3370 | `:3049` | "translateObject inline actions — served with their `_actions` translations" | Declared action labels are translated, not served as English literals. | | objectstack-ai#3833, objectstack-ai#3847 | `:3131` | "resolveObjectFieldLabels — the declared rich entries, read from the nested translation shape" | objectstack-ai#3833: the nested shape, never the retired flat dialect; objectstack-ai#3847: the rich `label` / `help` / `options` entries the response declares. | | objectstack-ai#7679 | `:3308` | "normalizeSupportedLocales — the declared supportedLocales narrow the advertised set" | `/i18n/locales` reports the app's declared locales, not every loaded bundle. | | objectstack-ai#11287 | `:3732`, `:4134` | "translateFlow — screen-flow copy from the `flows` bundle group" / "resolveFlowScreenTitle — a screen title from the `flows` bundle group" | The resolver half that reads `TranslationData.flows`. | | objectstack-ai#3786 | `:4726` | "… the REST boundary follows — one derived list, no hand-kept copy" | Derive from the one source instead of hand-copying a "keep in sync" list. | | objectstack-ai#14882 | `:4853` | "a declared fallback chain, not a literal `en`, at the resolver" | The chain honours the declared `fallbackLocale`, not a hard-wired `['en']`. | | objectstack-ai#15711 | `:4944` | "… for a default-locale request (ruled: the authored label is the default-locale text)" | Above. | | objectstack-ai#16458 | `:5011` | "resolveMetadataFormSchemaTitles — bundle labels overlaid as JSON Schema titles, repeater rows included" | Item-level property names get a translated title through the array's `items`. | **Subject back in words** (11 literals): - the two "zero holders after objectstack-ai#15513" / "after objectstack-ai#8075" template messages become "after the families' retirement" / "after the family's retirement", stage 25's form; - "[objectstack-ai#15513] ADR-0087 registration" becomes "compliance families retirement — ADR-0087 registration"; - "keeps PR objectstack-ai#15514's fourteen deadline-key registrations" becomes "keeps the earlier deadline-key retirement's fourteen registrations": PR objectstack-ai#15514 retired the fourteen inert deadline keys before the families went whole; - "shipped by plugin-email since objectstack-ai#5087" becomes "shipped by the SMTP transport in plugin-email": objectstack-ai#5087 implemented that transport; - "objectstack-ai#17614 — the published "must stay equal" claim" becomes "EMAIL_TEMPLATE_FLOOR_LOCALE — the published "must stay equal" claim", the constant whose docblock carries it; - "(objectstack-ai#4666 pin)" becomes "(pinned here: a type change the key-level gates cannot see)": objectstack-ai#4666's maintainer ruling chose direction B, fingerprinting defaults only, so the checksum object-to-string type change stays invisible to the key-level gates, and these parses are its gate; - the three "pre-objectstack-ai#20680" / "pre-objectstack-ai#8284" / "pre-objectstack-ai#20731" control titles become "the behaviour before the override rule", the rule their describes name ("the catalog loses to an explicit override"); - "the contract call the objectstack-ai#12961 line left open, made by objectstack-ai#16772" becomes "the contract call the `children`-descent ruling left open, made for tab and accordion panels": the 2026-08-29 ruling (`901355c3bc`) named `properties.children` only, and objectstack-ai#16772 made the `items[].children` call. **Dropped where already stated** (57 literals, 60 ids). A number goes only where the title already says its decision. Examples: `[objectstack-ai#15513]` x2 and `[objectstack-ai#8075]` retirement describes and `[objectstack-ai#4740]`; the four other `[objectstack-ai#15711]` prefixes, once the ruling is stated in the first; the tails `(objectstack-ai#18124)`, `(objectstack-ai#4667)` x2, `(objectstack-ai#12038)`, `(objectstack-ai#4611)`, `(objectstack-ai#4451)`, `(objectstack-ai#5307)`, `(objectstack-ai#14865)`, `(objectstack-ai#4938)`, `(objectstack-ai#5295)`, `(objectstack-ai#16292)`, `(objectstack-ai#19085)`, `(objectstack-ai#20439)`, `(objectstack-ai#4854)`, `(objectstack-ai#21257)`, `(objectstack-ai#10926)`, `(objectstack-ai#12961)`, `(objectstack-ai#5775)`, `(objectstack-ai#20940)` x3, `(objectstack-ai#16772)` x4, `(objectstack-ai#5377)` x2, `(objectstack-ai#5728)` x2, `(objectstack-ai#3847)` x2, `(objectstack-ai#7634)` x4 (one title and three expect messages), `(objectstack-ai#8284)`, `(objectstack-ai#11745)`, `(objectstack-ai#14253)` x6; the `objectstack#14972` tail with its repository qualifier; the ADR-bearing tails `(objectstack-ai#4740, ADR-0049)`, `(objectstack-ai#20680, ADR-0029 D9.2a)`, `(objectstack-ai#20731, ADR-0029 D9.2a)`, `(objectstack-ai#14478, ADR-0087 …)`, which keep their ADR; `pre-objectstack-ai#4740` before "v0 artifact"; and `(objectstack-ai#17782, objectstack-ai#15939, objectstack-ai#14478)` on "logging duration keys → *Ms", whose title shows the rename. The two 404 numbers among them (objectstack-ai#10926, objectstack-ai#12961) go only where the title already states what landed. **No file is renamed.** ## Readers - **Needles:** none. The eight declared strings are assertion failure messages (the second argument of `expect`), none is an expected value. The three `.pin.test.ts` files read source text, and none reads an id: `data-migration-flag-column-move.pin.test.ts` reads `isDataMigrationFlagVerified`'s body for `verified_at`, `blocking` and the absence of `columns_moved_at`; `email-template-floor-locale-parity.pin.test.ts` reads `DEFAULT_TEMPLATE_LOCALE` and "must stay equal"; `metadata-form-declared-rows.pin.test.ts` reads registered form rows. `job.test.ts`'s `@example` pin reads the anchor "@example Metadata Sync Job (Cron)". No title or message in the group is matched against a source docblock or another file's text. - **Test-name filters:** none. No tracked script, workflow or package config passes `-t` / `--testNamePattern` to vitest; the one vitest `-t` hit is a README example under `packages/qa/dogfood` filtering its own fixture. - **Snapshots:** none. No `__snapshots__` directory is tracked under `packages/spec`, and none of the 18 files calls a snapshot matcher. - **Projects:** `compliance-families-retirement.test.ts` and `email-template-floor-locale-parity.pin.test.ts` are in the `repo` project (`packages/spec/vitest.repo-tests.json`); the other 16 run in `local`. The base-versus-head run below takes both projects. - **By substring:** every old literal, its id-bearing fragment and a window around each id (272 needles) was searched with `git grep` at the base, across the tracked tree outside its own file. No gate, doc, filter, snapshot, QA checklist entry or `scripts/check-*.mjs` self-test reads one. The 12 hits are sibling test titles: the three `(objectstack-ai#15679)` titles in this group hit each other (all rewritten here) and the five `(objectstack-ai#15679)` titles of the second `system/` group (`metrics`, `object-storage`, `registry-config`, `tracing`, `worker`), which go with that stage. ## Text-only proof Stage 10's scratch tool (`textonly10.cjs`, md5 `d5e4801dbb4329ab1984da91e92fc47c`) compares base and head file by file on three legs: 1. **Skeleton:** the full AST, with string pieces masked. It must be identical. 2. **Comments:** every comment, byte-equal. 3. **Strings:** each changed string leaf must sit in a test-call title position or on a declared line, must carry a tracker id before, and must carry no `#` plus digits after. This stage declares the eight expect-message lines named above. - **Result:** 18 of 18 files SAME on all three legs, with the per-file counts predicted in writing before any edit. - **Totals:** 91 changed string leaves in 91 literals: 83 titles and 8 declared. The diff's `+` and `-` lines are exactly the 91 planned lines as multisets, and every file keeps its line count. - **Controls (14 of 14 as predicted on the first run, on scratch copies, each anchor hit once):** identifier rename DIFF; numeric literal DIFF; comment edit COMMENT DIFF; a non-title string given an id VIOLATION; a rewritten title given a new id VIOLATION; a title that was id-free at base edited VIOLATION; one title reverted to base SAME; an `it.each` row given an id VIOLATION; an undeclared expect message changed VIOLATION; a title re-split into a `+` chain DIFF; a declared expect message reverted to base SAME; a declared template expect message given a new id VIOLATION; a declared `+`-chain leaf given a new id VIOLATION; a template-literal title given a new id VIOLATION. - **Templates and tables:** no `.each` title and no `$name` placeholder changes. The two template literals change only their text after the `${…}` span. **Test counts:** the 18 files were run at the base, before the edit, and at the head, in the same worktree, with `--project local --project repo`. Both sides read 783 tests in 18 files, all passed, with the same count and status sequence per file in 18 of 18. 354 full test names change, and each changed name equals the base name with the planned replacements applied: 0 mismatches. No full name repeats on either side. No head name carries a gate-pattern id (354 base names did); two head names carry the kept "(batch objectstack-ai#58)". No source escape sits in a planned anchor, so the comparison tool met none. ## Changeset: `skip-changeset` Measured, not assumed: - `npm pack --dry-run` of `@objectstack/spec` lists 2068 files. 0 of the 18 touched files are in it, and no `*.test.ts` at all (`files[]` ships `src/**/*.zod.ts`, not tests). The controls `src/system/job.zod.ts`, `src/system/translation.zod.ts` and `dist/index.mjs` are in it. - In the built `dist/`, two new phrases and an old one each read in 0 files. The control `Unrecognized key` reads in 42. So this PR publishes nothing, and no changeset is added. ## Verification (at `ed2bc649f3`) - `pnpm turbo run build` over all packages: 71 / 71, through the shared verify lock (turbo exit 0, recorded to a file; `VERDICT batch-last-exit 0`). - `@objectstack/spec`: - `vitest run --project local`: 619 files, 18485 passed, 1 todo. - `typecheck`: exit 0, including `check:test-typecheck` (52 files / 246 errors / 135 pinned signatures held). Its program holds all 18 group files, counted by path with `tsc --listFilesOnly -p tsconfig.test.json`. - `check:generated`: all 15 generated artifacts up to date, against the `dist/` the build above wrote. - **Gates:** `dispatch-gates --commands` derived 79 families, the same 79 as stage 25. All 79 exit 0. `--ran` reconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN, every family with its exit code recorded. The same 79 derive from `origin/main` `4e4e881427` with this diff applied. The five roster families marked as sharing a directory with this diff (`check:meta-url-spelling`, `check:spec-changes`, `check:authz-resolver`, `check:error-code-casing`, `check:filter-alias-parity`) each exit 0. - **ESLint, a proven narrowing:** `--no-inline-config` over the 18 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 18 configured, 0 ignored. No file sets `parserOptions.project` or `projectService`, so no untouched file's verdict can move. - `check-governed-merges --test`: NOT governed, 182 changed lines (+91 / -91). - A control-byte scan over the 18 changed files finds none. ## `main` since the base Re-fetched just before this PR opened, `origin/main` was three commits past the base (`4e4e881427`: objectstack-ai#21976, objectstack-ai#21977, objectstack-ai#21352). They touch 490 files, none of the 18 and none under `packages/spec/src/system/`, so `main` was not merged. The census of `4e4e881427` with this diff applied reads 191 / 200, file for file the same as the head. `git merge-tree` onto `4e4e881427` is clean, and none of the 5 open PRs touches any of the 18 files. ## Acceptance notes - **Same-id test titles in this card's later stages** go with those stages: 22 lines, among them the five `(objectstack-ai#15679)` titles of the second `system/` group, `system/translation.test.ts`'s six (`objectstack-ai#16772`, `objectstack-ai#6080`, `objectstack-ai#10926`, `objectstack-ai#21257`, `objectstack-ai#11287`, `objectstack-ai#4667`) and `stack-email-template-locale-floor.test.ts`'s four `objectstack-ai#17614` titles. - **Same-id test titles in other packages** stay: 78 lines in 14 packages (`driver-sql` 13, `cli` 12, `objectql` 10, `rest` 10, `lint` 8, `platform-objects` 6, `plugin-auth` 6, `core` 3, `runtime` 3, `service-i18n` 3, and one each in `client`, `plugin-approvals`, `qa/dogfood` and `sdui-parser`), each package's share under the objectstack-ai#20513 lane children. - **The two "(batch objectstack-ai#58)" titles** (`i18n-resolver.test.ts:1744`, `:1757`) stay: a two-digit decision-batch label outside the gate's pattern, with no counted id in the literal. - **Code comments with live ids** remain in these files, among them the `// objectstack-ai#18124 — step 3 of ruling A on objectstack-ai#18115` header in `auth-config.test.ts`, the `[objectstack-ai#16185]` docblock in `data-migration-flag-column-move.pin.test.ts`, the `[objectstack-ai#17614]` docblock in `email-template-floor-locale-parity.pin.test.ts` and the `// ─── [objectstack-ai#8075]` / `[objectstack-ai#15513]` banners. Code comments are not this card's share. --- _Generated by [Claude Code](https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ)_ Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Oct 7, 2026
…objectstack-ai#21994) Fixes objectstack-ai#21989 Clause-②: no ## What this is This PR adds the curated release page for 17.7.0, `content/docs/releases/v17/17-7.mdx` (1,402 lines). It was written after the publish: npm `latest` moved on 2026-10-06, and `@objectstack/spec@17.7.0` went out at 12:22:14Z. It also wires the page in: - `content/docs/releases/v17/meta.json`: `17-7` comes ahead of `17-6`. - `content/docs/releases/v17/index.mdx`: the status blockquote, the minors warning, the per-release list and the checklist links now name 17.7.0 as current. This is the same shape objectstack-ai#21362 used for 17.6.0. - `scripts/docs-audit/handwritten-docs.json`: the page joins the docs-accuracy audit scope. - `content/docs/releases/v17/17-6.mdx`: one dated correction (2026-10-06) on the anonymous-endpoints known issue. objectstack-ai#21158 was closed as not planned on 2026-10-04. The page follows the 17.6 page's structure: 1. Highlights. 2. What's new: the counts, and the runtime changes that happen silently. 3. Breaking changes and migration, triaged by door and subject. It includes a coverage table that names the section carrying the migration for every ADR-0087 entry added since 17.6.0 (8 conversions, 41 D3 entries). 4. New capabilities. 5. Notable fixes. Security fixes are described only as classes and doors. 6. New in Console: each objectui declared-breaking change, with this repo's answer. 7. The code that shipped but is not listed. 8. The upgrade checklist. Every line is marked *Not exercised.* ## Sources and counts - The version commit `4e4e881427` (objectstack-ai#21352) consumed 323 changesets. 322 are new. One, `748b240` (objectstack-ai#21270), shipped in 17.6.0 and is listed again; the page explains this in its own section. - 69 CHANGELOGs carry a 17.7.0 section, and 48 of them have entries. Their 444 entries (194 minor, 250 patch) de-duplicate to the 323 changesets. - Two commits landed on `main` after the Version Packages PR's last refresh and before it merged: - `8a399b2b15` (objectstack-ai#21977, for objectstack-ai#21923) - `04e776b39a` (objectstack-ai#21976, for objectstack-ai#21968) Both are ancestors of the version commit (exit 0 for each), so the 17.7.0 packages carry their code. But the version commit did not consume their changesets, so no 17.7.0 CHANGELOG line names them. The release-integrity audit named both in a warning. - objectui: the pin moved five times and ends at `0abd4f9f8769`: - `89cad75d5570` (objectstack-ai#21380) - `ab1879721595` (objectstack-ai#21625) - `2e818d0b51ec` (objectstack-ai#21710) - `9dfaca654311` (objectstack-ai#21800) - `0abd4f9f8769` (objectstack-ai#21827) Across 173 commits, 254 changesets were added and 229 of them release something. 65 are declared breaking, plus one commit marked `!`. The Console table answers each. - `PROTOCOL_VERSION` is still 17.0.0. ## Premise corrections - The dispatch named two pin moves ending at `9dfaca654311`. The tree has five, ending at `0abd4f9f8769` (`8832655`, objectstack-ai#21827). The page covers all five. - One new D3 id contains a word that `check:role-word` refuses on docs pages, and release pages are not in its baseline. The coverage table therefore names that entry by its subject and points at `os migrate meta --from 17`. ## Fact-check A second pass checked every cited SHA, PR number, key name and behavioural claim against the commits, changesets and registry entries. It corrected **31 claims** (commit `e4a6280b46`). Two more corrections came earlier, while drafting: - objectstack-ai#21361 is closed; it is not tracking the issue. - There are seventeen `ui-object-*` members, not eighteen. Mechanical checks on the final page: - All 276 cited SHAs resolve, in objectstack or in an objectui clone carrying the final pin's history. - Each of the 216 distinct sha–PR pairs matches its commit subject. - Every printable new D3 id (40) and all 8 conversions appear on the page. - The MDX for 17-7, 17-6 and index compiles with @mdx-js/mdx 3.1.1 and remark-gfm 4.0.1. After the fact-check, `main` gained `1abfc58` (objectstack-ai#21985), which lands the read half of objectstack-ai#21922. It is not an ancestor of the version commit: the test returned exit 1, and the control commit `753e7a1` returned exit 0. So in 17.7.0, the metadata door's reads still serve a stored row under a code-defined datasource name. Commit `8347e0d172` says so in the datasource migration bullet. ## Independent fact-check and fix round An independent, read-only fact-check of head `8347e0d172` returned **FAIL** with 13 findings (record: objectstack-ai#21989 comment 6018402030): 2 wrong facts (a flow's `get_record` node still reads the stored-metadata tables, in projected form), 1 security line that named the filter shapes and depth threshold evading 17.6.0's refusal, 1 breaking change missing from the Breaking section (`0fc8087`, objectstack-ai#21626), 1 link whose label did not match its target, 4 overstatements, 1 missing security fix (`49524f6`, objectstack-ai#21420), 1 missing rollback caveat on `os secret rewrap --apply`, and 2 minor wording issues. All 13 were re-verified against their sources and applied in `a53c972fa7`; none was refuted. A scan for any other line naming a bypass shape of a fixed issue reduced two more lines to their class (`0728cbf`, `fb69825`). ## Measured on `a53c972fa7` - Derived gates: `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derives 57 commands; all 57 exited 0 (`--ran`: "57 run, 0 NOT-MEASURED (a DERIVED zero)"). The verdicts include: - check-doc-anchors: 458 links resolve. - check-issue-citations: 305 resolve as a PR, 9 resolve, 15 are cross-repo; every citation this change adds resolves. - `check:role-word`, `check:release-notes` and `check:release-page-status`: OK. - check-release-section-coverage: OK, both plain and with `--strict` (10 minors). - The docs-audit scope check and `check:nul-bytes`: OK. - Docs production build: `TURBO_FORCE=true pnpm turbo run build --filter=@objectstack/docs`, run under the verify lock, reports `Tasks: 2 successful, 2 total` and `Cached: 0 cached`. The built `releases/v17/17-7.html` carries the corrected text and none of the removed text. - Mechanical checks: 231 distinct sha–PR pairs, 0 unresolved, 0 subject mismatches; the MDX of 17-7, 17-6 and index compiles. - Not measured locally: the repo-wide lint and the CI-only families. CI owns them. ## Not in this PR - No changeset. The PR touches only docs and a docs-audit list, nothing a package ships (`skip-changeset`). - Nobody has walked the 17.6.0 → 17.7.0 upgrade. The checklist says so on each line. --- _Generated by [Claude Code](https://claude.ai/code/session_016tKoy8NJa35Yih1FdzrVmn)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@objectstack/cli@17.7.0
@objectstack/cloud-connection@17.7.0
@objectstack/console@17.7.0
@objectstack/core@17.7.0
create-objectstack@17.7.0
@objectstack/driver-sql@17.7.0
@objectstack/driver-turso@17.7.0
@objectstack/formula@17.7.0
@objectstack/lint@17.7.0
@objectstack/mcp@17.7.0
@objectstack/metadata@17.7.0
@objectstack/metadata-core@17.7.0
@objectstack/metadata-protocol@17.7.0
@objectstack/objectql@17.7.0
@objectstack/platform-objects@17.7.0
@objectstack/organizations@17.7.0
@objectstack/plugin-approvals@17.7.0
@objectstack/plugin-audit@17.7.0
@objectstack/plugin-auth@17.7.0
@objectstack/plugin-security@17.7.0
@objectstack/plugin-sharing@17.7.0
@objectstack/runtime@17.7.0
@objectstack/sdui-parser@17.7.0
@objectstack/service-analytics@17.7.0
@objectstack/service-automation@17.7.0
@objectstack/service-datasource@17.7.0
@objectstack/service-knowledge@17.7.0
@objectstack/service-settings@17.7.0
@objectstack/service-storage@17.7.0
@objectstack/spec@17.7.0
@objectstack/trigger-api@17.7.0
@objectstack/trigger-record-change@17.7.0
@objectstack/trigger-schedule@17.7.0
@objectstack/types@17.7.0
@objectstack/hono@17.7.0
@objectstack/account@17.7.0
@objectstack/setup@17.7.0
@objectstack/studio@17.7.0
@objectstack/client@17.7.0
@objectstack/client-react@17.7.0
@objectstack/connector-mcp@17.7.0
@objectstack/connector-openapi@17.7.0
@objectstack/connector-rest@17.7.0
@objectstack/connector-slack@17.7.0
@objectstack/driver-memory@17.7.0
@objectstack/driver-mongodb@17.7.0
@objectstack/driver-sqlite-wasm@17.7.0
@objectstack/metadata-fs@17.7.0
@objectstack/observability@17.7.0
@objectstack/embedder-openai@17.7.0
@objectstack/knowledge-memory@17.7.0
@objectstack/knowledge-ragflow@17.7.0
@objectstack/plugin-dev@17.7.0
@objectstack/plugin-email@17.7.0
@objectstack/plugin-hono-server@17.7.0
@objectstack/plugin-pinyin-search@17.7.0
@objectstack/plugin-webhooks@17.7.0
@objectstack/rest@17.7.0
@objectstack/service-cache@17.7.0
@objectstack/service-cluster@17.7.0
@objectstack/service-cluster-redis@17.7.0
@objectstack/service-i18n@17.7.0
@objectstack/service-job@17.7.0
@objectstack/service-messaging@17.7.0
@objectstack/service-package@17.7.0
@objectstack/service-queue@17.7.0
@objectstack/service-realtime@17.7.0
@objectstack/service-sms@17.7.0
@objectstack/verify@17.7.0
@objectstack/example-crm@4.0.99
@objectstack/example-multi-package@0.0.6
@objectstack/example-showcase@0.3.21
@objectstack/example-todo@4.0.99
@objectstack/example-embed-objectql@0.0.39
@objectstack/dogfood@0.0.47
@objectstack/downstream-contract@0.0.45
@objectstack/http-conformance@0.1.7