Repository navigation
test(spec): the first data/ file group's test titles state each cited decision in words instead of a tracker number (stage 15) - #21810
Merged
Conversation
… decision in words instead of a tracker number (stage 15) Twenty test files directly under packages/spec/src/data/, name-ordered from aggregate-field-type-compatibility.test.ts through date-range-presets.test.ts: 94 messages / 102 ids. Each id becomes a statement of the decision the cited record made, or is dropped where the title already says it. Text only: no assertion, identifier, code comment or non-test file changes, and every file keeps its line count. Claude-Session: https://claude.ai/code/session_01T9u38rswFp5Rw8DswRUReJ Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 5, 2026
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>
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.
Part of #20749
Clause-②: no
Stage 15 of this card: the next area of class (e), the test strings shipped under
packages/spec/src, as ruled in5902360492on #20513. This stage takes the first name-ordered file group directly underpackages/spec/src/data/: the 20 test files fromaggregate-field-type-compatibility.test.tstodate-range-presets.test.ts. They carried 94 messages and 102 tracker ids, citing 60 records. Every one of those ids now either states what its record decided, in words (form D), or is dropped where the title already says it. Text only: no assertion, identifier, test count or code comment changes.Census at the base (
0a3480311a)Instruments:
census10.cjs(md59d08602ab972b4b8643c90d64d40fa41),census.cjs(md56e42a45a926d375013c32d62f16a296e),census-wide.cjs(md5c98410a19529c439adb0afbfb00026a2) anddirtable.cjs(md5dda605c54745b4a60cc14c9a686e4eff). They are byte-identical to the copies stages 10 to 14 used. A literal counts as a test title when its folded message is argument 0 of adescribe/it/testcall,.each/.skip/.onlychains included. Everything else is an "other" string.Both instruments read 1325 messages / 1406 ids in 282 files, the seat's reading at
0a3480311a(stage 14's head).data/(this PR: the first 20 files)ui/api/system/src/)ai/contracts/The group reads 94 messages / 102 ids in 20 files, the seat's figures, file for file:
data/)aggregate-field-type-compatibility.test.tsanalytics-date-range-closed-vocabulary.test.tsanalytics-date-range-two-bound-window.test.tsanalytics-query-window-integer.test.tsanalytics-strictness-batchd.test.tsanalytics.test.tsapi-derivation.test.tsapi-methods-batch-conformance.test.tsauthoring-key-lint.test.tsautonumber-format.test.tsautonumber-unanchored-boundary.test.tsbulk-write-hook-conformance.test.tscalendar-day.test.tscontext-tokens.test.tscurrency-mode-family-closure.pin.test.tscurrency-precision-iso4217.test.tsdata-engine.test.tsdatasource-credential-redaction.test.tsdatasource.test.tsdate-range-presets.test.tsdata/document.test.tsreads 2 / 2 at the head. Lit, "other" strings: the two indata/external-lookup-retirement.test.ts(:89,:130) still read at the head. Dark: the file comment atdata/analytics-strictness-batchd.test.ts:4(it names the strictness batch by its number) reads 0. Planted in a scratch copy of the headdata/calendar-day.test.ts: an id put into a title reads 1 / 1, and an id put into a comment reads 0.#plus digits) reads the same totals in 19 of the 20 files. Inaggregate-field-type-compatibility.test.tsit reads one more, a decision-batch number at:150that sits beside a cited record in the same literal. The gate's pattern needs three to five digits, so it is not counted there.How the area was chosen
data/has no subdirectory to split by (449 ids directly under it,data/driver/52), so its stages take name-ordered file groups near the ~100-id bound, as stage 14's report proposed. This census reads the first group at exactly 102, the claim's figure, so the rule needed no re-cut.Named for the next stages (re-cut from the head census, 1231 / 1304;
data/374 / 399 left):data/in four more stages, name-ordered:default-value-shape.test.tstofilter-comparand-shape.test.ts: 20 files, 94 messages / 100 ids;filter-comparand-type.test.tstofilter-view-operator-parity.test.ts: 20 files, 95 / 99;filter.test.tstoobject.test.ts: 17 files, 103 / 114.object.test.tsalone carries 42, so no cut lands nearer the bound;query-transport.test.tstovalidation.test.ts(11 files, 34 / 34) withdata/driver/(7 files, 48 / 52): 86 ids.ui/416, about four stages.api/201, two.system/165, two. The files directly insrc/, 120, one.ai/build-progress.test.ts:236,:237,contracts/approval-service.test.ts:274), one stage with their docblocks.What each id became
24 literals (28 ids) now state a decision in words. 2 literals (2 ids) get their subject back in words where the number stood in for it. 69 literals (72 ids) drop a number the title already explains. (95 literals in 94 messages: the
sys_organizationreason string is one message over two lines.)Every cited record was read with its comments through REST: 55 answer 200. #6345, #8876, #9040, #10194 and #17014 answer 404, and their decisions were read from what landed:
e2798fa(one driver vocabulary for start and migrate),d634e66(the username half of the URL userinfo grammar),2420641(a credential in the mongooptionspassthrough is refused),2306a76(theme/analytics_cubevalidated at the/metawrite door) and80aef80(a one-day window for the one-day presets), each with its CHANGELOG entry. No cross-repo record is cited in this group.data/)aggregate-field-type-compatibility.test.ts:150sum/avg/min/maxover booleans — numbers on every backend, a ruling that outranks the refused-by-default rule". The maintainer ruled that booleans aggregate as numbers on every backend; decision batch 80 held that ruling over batch 59's blanket refusal of unnamed pairs. That batch number went with the id.analytics-strictness-batchd.test.ts:83,:248,:306analytics-strictness-batchd.test.ts:270,:297AnalyticsQuery; the{ cube, query }envelope was retired with tombstones, and the entry answers 400 with a hint atwhere.analytics.test.ts:314sql/relationshipare stripped (ADR-0087 D2)".api-derivation.test.ts:16api-derivation.test.ts:286api-methods-batch-conformance.test.ts:221update; both are column-clamped per row by ADR-0092 D2)". Option (a), decision batch 64.authoring-key-lint.test.ts:37autonumber-format.test.ts:23{0000}became the contract default, and both fallbacks went away.bulk-write-hook-conformance.test.ts:114bulk-write-hook-conformance.test.ts:119currency-mode-family-closure.pin.test.ts:348defaultCurrencyholds only underfixed".currency-precision-iso4217.test.ts:163currencyConfig.precisionat rest: a stored row carrying the bakedprecision: 2is served canonical".currency-precision-iso4217.test.ts:224data-engine.test.ts:1185data-engine.test.ts:1198datasource-credential-redaction.test.ts:70datasource-credential-redaction.test.ts:232datasource-credential-redaction.test.ts:243datasource.test.ts:673external.credentialsRef, and only it, on managed rows.date-range-presets.test.ts:14Subject restored (2 ids): #20126 at
currency-mode-family-closure.pin.test.ts:403("currency-mode closure controls — each rule can fail, and passes what it must") and #7918 atcurrency-precision-iso4217.test.ts:311("carries the measured anchors — 0 digits for JPY, 2 for USD, 3 for KWD"). That literal moved from double to single quotes, since it no longer holds an apostrophe.Dropped only (72 ids): #1603, #2377, #3026, #3391, #3543, #3545, #3795 (9), #4001 (2), #4286, #4346 (2), #4538, #4583, #5586, #6345, #6555, #6560, #7178 (5), #7265, #7287 (2), #7802 (2), #8032, #8057 (2), #8153 (7), #8336, #8337, #9040, #10194, #10414, #13802, #16041, #16632, #17014, #17296, #17598 (2), #18278, #19992 (3), #20011, #20300 (2), #20550, #20600, #20808 (3), #21365 (2).
EngineQueryOptionsSchema.searchrejects the bare query string that ADR-0061 D1 calls canonical — so every engine caller that wants it mustas any, losing the whole query's checking #7178, or "currencyConfig.precisionis removed: refused with the prescription, whatever its value" for [finding] currencyConfig.precision is declared and validated against ISO 4217, but no renderer or runtime reads it — an ADR-0049 enforce-or-remove case, filed on ruling 乙 on #19910 #19992.analytics-strictness-batchd.test.ts:307reads "are CLOSED now" where it named the record;autonumber-unanchored-boundary.test.ts:51reads "(ruled: mixed content is out of contract)";datasource.test.ts:553reads "(the happy path)". The circled part numbers afterAnalyticsDateRangeSchema's array arm admits shapes every consumer now refuses, and the one shared refusal sentence is false for them #17598 went with the id.api-methods-batch-conformance.test.tsreason strings (sys_api_key,sys_organization) end "rather than hitting /batch." now. The table is read only through!== undefined, so no assertion reads their text.Readers
-tand--testNamePatternfinds onlypackages/qa/dogfood/README.md:142(-t "owner-scoped"), which is unrelated.__snapshots__directory exists underdata/, and no.snapfile is tracked underpackages/spec.packages/spec/vitest.repo-tests.json:api-methods-batch-conformance.test.tsandcurrency-mode-family-closure.pin.test.ts. Both were run in therepoproject at the base and at the head, and the other 18 inlocal.scripts/check-*.mjsself-test reads one. The 14 hits are:service-analyticsaggregate-nontemporal-measure-refusal.test.ts:344andobjectqlengine-autonumber-default-format.test.ts:248;data/stage:data/driver/postgres.test.ts:169, the same "placeholders are not resolved here" title, already in the census;lintvalidate-dataset-measure-aggregates.test.ts:179,service-analyticsdataset-compiler.ts:227,objectqlengine.ts:6206and:6272,analytics.zod.ts:1002,docs/audits/2026-07-unknown-key-strictness-ledger.md:728, twopackages/spec/CHANGELOG.mdentries and theliveness/field.json:218evidence string, which quotes theengine.tscomment. None reads a test title.(#15680),(#5955),#3896 close-out): none falls in this group.Text-only proof
Stage 10's scratch tool (
textonly10.cjs, md5d5e4801dbb4329ab1984da91e92fc47c) compares base and head file by file on three legs:#plus digits after. The declared lines are the three reason-string leaves inapi-methods-batch-conformance.test.ts.+and-lines are exactly the 95 planned lines, and every file keeps its line count.expectmessage changed VIOLATION; a title re-split into a+chain DIFF.Test counts: the 20 files were run at the base, in a separate base worktree, and at the head, with
--project local --project repo. Both sides read 553 / 553 passed, with the same count and status sequence per file in 20 of 20. 291 full test names change, and each equals the base name with the planned replacements applied (0 mismatches). No full name repeats on either side.mainmerged in, once#21800 (the console pin bump) landed while this branch was being verified, and it rewrites the comment block at
:61-77ofapi-methods-batch-conformance.test.ts. This PR edits only string literals in that file, more than 100 lines below the block, soorigin/main(18c2ddc1ec, which also carries #21801) was merged in with a plain merge, no rebase, and no conflict. The PR's delta againstmainis still exactly the 20 files, +95 / -95. Every reading in this body was re-taken on the merged headbf16ad1190, against18c2ddc1ecas the base: the census (1325 / 1406 there, 1231 / 1304 here, unchanged by the two commits), the text-only proof and its controls (the three declared lines now sit at:202,:230and:235), the 20-file runs, the full build, the suite, the typecheck and the gates. Re-fetched just before this PR opened,origin/mainwas one commit further (75ddcd1b41, #21805, incloud-connection,metadata-coreandruntime). It touches nopackages/specpath and no file here, so it was not merged.Changeset:
skip-changesetMeasured, not assumed:
npm pack --dry-runof@objectstack/speclists 2068 files. 0 of the 20 touched files are in it, and no*.test.tsat all. Ofsrc/, only the*.zod.tssources ship: the controlssrc/data/analytics.zod.ts,src/data/data-engine.zod.tsanddist/data/index.jsare in it.dist/, five new phrases and four old literals each read in 0 files. The controlUnrecognized key(s) onreads in 42.So this PR publishes nothing, and no changeset is added.
Verification (at
bf16ad1190)pnpm turbo run buildover all packages: 71 / 71 (also 71 / 71 at the pre-merge head89c4b300c2).@objectstack/spec:vitest run --project local: 615 files, 18360 passed, 1 todo.typecheckexit 0, includingcheck:test-typecheck(52 files / 246 errors / 135 pinned signatures held). Its program holds all 20 touched files, counted withtsc --listFilesOnly -p tsconfig.test.json.check:generated: all 15 generated artifacts up to date after the merge.dispatch-gates --commandsderived 79 families, the same set as stages 13 and 14, and all 79 exit 0.--ranreconciles: 79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN.check:meta-url-spelling,check:spec-changes,check:authz-resolver,check:error-code-casingandcheck:filter-alias-parity.--no-inline-configover the 20 files reads 0 errors and 0 warnings. The population comes from ESLint's own config: 20 configured, 0 ignored. No file setsparserOptions.projectorprojectService, so no untouched file's verdict can move.check-governed-merges --test: NOT governed, 190 changed lines.Acceptance notes
describe/it/testlines outsidepackages/specfinds 156 lines citing ids this PR handled, in 79 files of 23 packages:objectql73 (29 files),rest18 (7),runtime7 (4),plugin-security6 (5),cli6 (3),lint6 (4),service-datasource6 (3),driver-sql4 (4),platform-objects4 (2),plugin-approvals3 (2),service-automation3 (2),driver-mongodb3 (1),plugin-auth3 (1),service-analytics3 (3),metadata-core2 (1),plugin-hono-server2 (1), and one each inclient,triggers,core,metadata-protocol,qa/dogfood,typesanddriver-memory.src/carry same-id titles:packages/spec/scripts/file-description.test.ts:66andpackages/spec/scripts/format-type.test.ts:85. They are outside class (e) as ruled ("the test strings shipped undersrc/").bulk-write-hook-conformance.test.ts:115-116and:129-130assertengineDeliveryIssue: 5038/5574, numbers in the source contract table. They are not strings, the gate's pattern cannot see them, and they are not this card's share.analytics-strictness-batchd.test.tsand theSINGLE_RECORD_WRITE_ONLYcomments inapi-methods-batch-conformance.test.ts. Comments are not this card's share, and none is touched here.Generated by Claude Code