Skip to content

docs(changeset): date-note two pending entries whose option-description and rows refusals spec 17.3.0 lifted (objectui#10801) - #10828

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10801-changeset-boundary-correction
Sep 27, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10801-changeset-boundary-correction

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #10801
Clause-②: no

What this does

Two pending changesets still tell a reader that @objectstack/spec refuses options[].description and rows by name. Spec 17.3.0 declared both keys (the objectui#6140 / objectui#6153 ruling), and this repository installs 17.4.0. A pending changeset publishes verbatim into the CHANGELOG at the next release, so the text would ship stating the opposite of the installed contract.

Each file gains ONE appended dated note in the objectui#10533 form: a bold headline naming the date and the card, then what holds now, then a sentence keeping the rest as the reading of the change. The frontmatter is byte-identical (md5 of the frontmatter block, base to head: 6140 85cd680d, 7014-q1 ecedb10c, both unchanged), and zero lines are deleted (git diff is 35 insertions, 0 deletions).

File What the note corrects (quoted, not line-addressed)
.changeset/6140-field-metadata-rows-option-description.md "FieldSchema refuses rows BY NAME … on all four of textarea/markdown/html/richtext"; "SelectOptionSchema is strict over exactly {label, value, color, default, visibleWhen} and refuses description BY NAME"; "never in an object document sent to the platform"
.changeset/7014-q1-tier1-select-option-convergence.md the EXTENSION paragraph's five-key claim, "refuses each of those three by name" and "must never reach an authored object document" for description; plus "exactly one key, on one face" and "SelectOption identically"

Why the 7014-q1 note also corrects "What widened". It is the same cause in the same file. SelectOptionBase derives the spec's option keys by reference, so when 17.3.0 added description the SDUI form face SelectOption gained an optional description too. The entry's "exactly one key, on one face" and "SelectOption identically" therefore undercount what ships. Nothing narrowed. The note says so in the same paragraph, and no other sentence was touched.

Placement. The claim's file surface says "appended", so both notes sit at the end of their files. In 6140 that puts the note directly after the existing 17.2.0 correction paragraph, which reads as a chronological chain. The objectui#10533 precedent (6235-mergedsort-wrap.md) put its note after the opening paragraph; only the form is copied here, not the position.

Measured, not inherited

@objectstack/spec was resolved from packages/types in this worktree: 17.4.0, and pnpm-lock.yaml has exactly one entry, 17.4.0. To date the move, 17.2.0 and 17.3.0 were installed from the registry into a scratch directory. Every probe sits beside a control that differs only by the key. Option values are at least two characters long: a one-character value fails too_small at value for an unrelated reason. The first run hit that failure and was discarded.

Probe 17.2.0 17.3.0 17.4.0
SelectOptionSchema keys color, default, label, value, visibleWhen + description + description (catchall never, i.e. strict)
option with description unrecognized_keys accepted accepted
select FieldSchema / ObjectSchema whose option carries description unrecognized_keys at the option accepted accepted
option with icon (the lit control) unrecognized_keys unrecognized_keys unrecognized_keys
option with disabled unrecognized_keys unrecognized_keys unrecognized_keys
rows: 4 on textarea, markdown, html, richtext unrecognized_keys accepted accepted
rows: 4 on text unrecognized_keys custom at rows custom at rows
rows: 4 on every FieldType member not probed not probed 4 accept (the four above); the other 45 each add exactly one issue, custom at rows

A note on the triage reading: triage named textarea and markdown as accepting rows. The installed spec accepts it on all four multiline editor types, and the notes say four.

Form face, by type probe on the worktree sources at 17.4.0: keyof SelectOption equals label | value | color | default | description | visibleWhen | disabled | icon, and a negative control asserting the seven keys without description fails with TS2344. The convergence pin's own assertions compile (assertionFormFaceGainedOnlyDescription, assertionFormFaceKeptEveryMember, assertionMetadataFaceKeptEveryMember, assertionMetadataFaceGainedOnlyDefault). tsc -p packages/types/tsconfig.test.json --listFilesOnly lists both pin files, so the package type-check re-derives them.

Still pending: distinctive strings from both bodies (for example "refuses rows BY NAME", "The convergence is an EXTENSION", "consumed-but-undeclared field-metadata keys") have 0 hits across all 42 tracked CHANGELOG.md files. The lit control, the released entry "Adopt @objectstack/spec", hits packages/types/CHANGELOG.md.

The notes name the instruments that re-derive these facts instead of copying the answers: select-option-spec-extension-7014.test.ts covers the option key set, description accepted, icon / disabled refused, rows accepted on the four types, and custom on text / select. select-option-tier1-convergence-7014.test.ts covers the form face's gained key.

Gates (head 00a082a68, hand-derived from package.json and .github/workflows/; each exit captured by redirect-then-status)

Command Verdict line Exit
node scripts/check-changeset-presence.mjs ✅ No source or published contract of a released package changed in this range, so no changeset is owed. 0
node scripts/check-changeset-no-major.mjs ✅ No changeset declares a major bump. 0
node scripts/check-changeset-overwrite.mjs ⚠️ This change touches 2 changeset(s) it did not add (report-only). Declared packages are identical at base and head for both files, which is the prose-correction case its header calls legitimate. 0
node scripts/check-changeset-claims.mjs ✅ No pending changeset names a file this change touches. 0
node scripts/check-pending-changeset-literals.mjs ✅ No test source names a pending changeset. 0
node scripts/check-spec-symbol-derivation.mjs ✅ spec member citations: 1411 sources + 184 documentation pages; nothing cites a key its spec symbol does not declare. 0
node scripts/check-control-bytes.mjs ✅ check-control-bytes: OK 0
node scripts/check-changeset-fixed.mjs ✅ All workspace packages are in the changeset fixed group. 0
node scripts/check-new-cross-file-line-citations.mjs VERDICT new-cross-file-line-citations: 0 new citation(s) 0
node scripts/check-installed-spec-pin-claims.mjs OK (it excludes .changeset/ by design, so it is run for completeness only) 0

Tests, under the shared verify lock, from the repo root: the two .changeset/** readers node scripts/markdown-test-inputs.mjs --list names (check-changeset-no-major.test.ts, dollar-dialect-alias-census.test.ts), plus the changeset-gate suites that walk the real directory (check-changeset-presence, -claims, -overwrite, check-pending-changeset-literals, changeset-polarity-census, body-dialect-census, check-control-bytes) and the three @object-ui/types pins the notes cite or sit beside (select-option-spec-extension-7014, select-option-tier1-convergence-7014, field-metadata-rows-option-description-6140): Test Files 12 passed (12), Tests 427 passed (427), lock VERDICT command-exit 0, at 00a082a68.

No build: the diff touches no package source, and no gate above reads dist/.

Acceptance notes

  • Observation, not carded, owner: none. The SelectOptionBase docblock in packages/types/src/select-option.ts lists "WHAT COMES FROM THE SPEC, unchanged" as label, value, color, default. description also arrives from the spec by reference now. The list is incomplete, not false: nothing there says description is refused. The same docblock deliberately declines to re-enumerate the keys, so this is polish.
  • Scanned the other pending changesets, line-joined, for the same refusal claim about description or rows. The only other carrier is the sibling 7014-select-option-spec-claim-correction.md, which already carries its correction.

Session of this run: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk (the dispatching domain:ui seat #1; dev subagent).


Generated by Claude Code

…iption and rows refusals spec 17.3.0 lifted

Two pending changesets still told a reader that `@objectstack/spec` refuses
`options[].description` and `rows` by name. Spec 17.3.0 declared both, and
the repository resolves 17.4.0. Each file gains one appended dated note in
the form the retirement notes use, stating the boundary as measured on
17.2.0, 17.3.0 and 17.4.0. The frontmatter is byte-identical and the
corrected history is kept.

Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 00a082a686ce195841e304eb9ee4fd4fbdc5c0c3

Isolated, adversarial read of PR objectui#10828 for card objectui#10801. Inputs: the card and its three comments, the PR body, file list, diff and the head's check-runs (REST), the objectui#10533 precedent and the objectui#6140 / objectui#6153 rulings on GitHub, and the objectui tree at refs/review/pr-10828 (fetched read-only) against origin/main 12809a595 (merge-base 95bad1236; both files and packages/types/src/select-option.ts are byte-identical between the merge-base and current main, so the diff below is the whole change). The dev report on the card was treated as a set of claims to check, not as evidence.

Diff: 2 files, 35 insertions, 0 deletions, one commit. Each file gains exactly one appended paragraph.

① Derived judgments

Installed spec, read from the head. packages/types/package.json declares "@objectstack/spec": "^17.4.0"; pnpm-lock.yaml resolves exactly one version, 17.4.0 (integrity sha512-bOtSFih0…TmqoA==). I installed @objectstack/spec 17.2.0, 17.3.0 and 17.4.0 from the registry into a scratch directory; npm's 17.4.0 integrity is identical to the lockfile's, so the probes below ran on the bytes objectui installs. The registry's 17.x line is 17.0.0, 17.1.0, 17.2.0, 17.3.0, 17.4.0 with no 17.2.x patch, so "17.3.0 declared" is the exact boundary, not an approximation.

Measured, one probe beside one control per key, on all three versions (SelectOptionSchema, FieldSchema, ObjectSchema from @objectstack/spec/data, options with a two-character value):

Probe 17.2.0 17.3.0 17.4.0
SelectOptionSchema shape keys color, default, label, value, visibleWhen + description (six) + description (six); catchall never on all three
option +description unrecognized_keys[description] ACCEPTED ACCEPTED
select FieldSchema, option +description unrecognized_keys at options.0 ACCEPTED ACCEPTED
ObjectSchema, select option +description unrecognized_keys at fields.status.options.0 ACCEPTED ACCEPTED
option +icon (control) unrecognized_keys[icon] unrecognized_keys[icon] unrecognized_keys[icon]
option +disabled unrecognized_keys[disabled] unrecognized_keys[disabled] unrecognized_keys[disabled]
rows: 4 over all 49 FieldType members 49 refused by name unrecognized_keys[rows] 4 accepted (textarea, markdown, html, richtext); 45 add exactly one issue, custom at rows same 4 / 45 split

The bare controls (option, select field, object, each field type without the key) parse on every version. Every spec claim in both notes and in the PR's measurement table matches this table. The PR's aside that a one-character option value fails too_small at value also reproduces on 17.4.0.

6140 note, sentence by sentence. "17.3.0 declared rows and option description" true. "this repository resolves 17.4.0" true. "17.2.0 refuses both by name, as above" true (rows by name on all 49 types, description by name). "From 17.3.0 SelectOptionSchema declares description, so an option carrying it is accepted and a select field or an object whose options carry it parses whole" true. "icon is still refused by name" true. "accepts rows on the four multiline editor types" true from 17.3.0. "on 17.4.0 every other field type refuses it by a cross-field refinement (issue code custom at rows), not by name" true (45 of 49, zero unrecognized_keys). "both may be authored there, rows on those four types only" true. "select-option-spec-extension-7014.test.ts in @object-ui/types re-derives both boundaries" true: the pin at packages/types/src/__tests__/select-option-spec-extension-7014.test.ts asserts the six-key set, description accepted on an option and through a select field, icon / disabled refused by name, rows accepted on the four types and refused with custom (not unrecognized_keys) on text / select, and the four inert editor keys still refused by name.

7014-q1 note, sentence by sentence. "17.3.0 declared it" true. "strict over six keys, description among them" true. "an option carrying it is accepted and a field whose options carry it parses whole" true. "disabled and icon are still refused by name" true. "'must never reach' now holds for disabled and icon only" true of the three keys that paragraph names. "the spec's new key reached both faces with no edit here" true by construction: SelectOptionBase extends Omit of the spec's SelectOption on visibleWhen (select-option.ts:69), the spec's SelectOption is z.input of SelectOptionSchema, whose 17.4.0 declaration carries description: z.ZodOptional of z.ZodString (absent at 17.2.0), and the form face SelectOption extends Omit of SelectOptionBase on value (form.ts:412). "the SDUI form face SelectOption gains an optional description too (nothing narrowed)" true and pinned: select-option-tier1-convergence-7014.test.ts records PRE_CONVERGENCE_SelectOption without description and asserts assertionFormFaceKeptEveryMember, assertionFormFaceGainedOnlyDescription, assertionDescriptionIsOptional and assertionMetadataFaceGainedOnlyDefault; tsconfig.test.json includes src/**/*.test.ts and is chained from the package type-check script, and Type Check is green on the head. So "exactly one key, on one face" and "SelectOption identically" do undercount, and the note is right to say so. The last sentence naming the two pins is true.

Standing sentences. Every sentence the addition makes obsolete is named by the note rather than left under the umbrella: 6140's "refuses rows BY NAME", "is strict over exactly {…} and refuses description BY NAME", "must never reach authored object metadata" and "never in an object document sent to the platform" (all named as "the sentences above that call these keys NOT a spec key and keep them out of an object document sent to the platform"); 7014-q1's whole EXTENSION paragraph for description, plus "exactly one key, on one face" and "SelectOption identically". Sentences left standing that remain true at head: 6140's "the four inert editor keys stay deliberately undeclared and are pinned so" (field-types.ts:278-282; pin lines 172-176), the 17.2.0 re-measurement paragraph (dated by version), "RichTextField and TextAreaField now read through the declared types" (only a comment mentions as any at head); 7014-q1's derivation and value widening paragraphs. Residual nit, not a defect: 6140's 17.2.0 paragraph still says the keys were aligned with "a @objectstack/spec schema member that does not exist" in the present tense; the new headline "the spec has since declared both keys" is the sentence that dates it.

Still pending. 42 tracked CHANGELOG.md files at head; 0 hits for "refuses rows BY NAME", "The convergence is an EXTENSION", "consumed-but-undeclared field-metadata keys", "Converge the two named select-option types" and "Dated note, 2026-09-27"; the lit control "Adopt @objectstack/spec" hits packages/types/CHANGELOG.md and others. Both files are still in .changeset/ at head, beside the already-corrected sibling 7014-select-option-spec-claim-correction.md.

Frontmatter. md5 of the frontmatter block, computed by me at merge-base, origin/main and head: 6140 85cd680d4d100a0510146a1d8032b965 at all three; 7014-q1 ecedb10c5189b2c8841ea736b67c3cc6 at all three. Diff hunks start at body lines 35 and 37; 0 deletions.

② Semver level

Unchanged. 6140 stays '@object-ui/types': minor and '@object-ui/fields': patch; 7014-q1 stays '@object-ui/types': minor. No major in either file, nor anywhere in the diff. Changeset Bump Policy, Changeset Declaration, Changeset Fixed Group Check and Changeset Overwrite Report are all success on the head. Nothing about what is released moves.

③ Boundary flags

Form vs the objectui#10533 precedent. 6235-mergedsort-wrap.md on main: a bold "⚠️ Dated note, DATE — headline — objectui#NNNN." then what holds now, then "The rest of this entry is kept as the reading of this change". Both notes here copy that form exactly. Two stated departures: (a) position, appended at the file end rather than after the opening paragraph (in 6140 this reads as a chronological chain after the 17.2.0 correction; in 7014-q1 it follows the closing export sentence); (b) the precedent also re-tensed each falsified sentence ("At this change …"), which this PR does not do, so a top-down reader meets the present-tense refusals before the ⚠️ marker. Both are named in the PR body and the report, and (b) is offset by the note quoting the sentences it overrides instead of only the umbrella, which is the residual the objectui#10533 review itself recorded as non-blocking. Nit, not a defect.

Clause-②: no is honest. The diff is two Markdown bodies, 0 deletions, frontmatter byte-identical; no type, schema, export, runtime path or acceptance set moves. The prose is brought to the boundary the installed spec already draws.

Dev's deviations. (1) Widening the 7014-q1 note to "exactly one key, on one face" and "SelectOption identically": correct and necessary, since the form face gained description by the entry's own derivation and both sentences would otherwise publish false in the same entry the note sits in; same file, same paragraph, same cause. (2) "Four types, not two": the triage note named textarea / markdown; measured, rows is accepted on all four multiline editor types on 17.3.0 and 17.4.0, so four is the true reading and two would have shipped an undercount. (3) Placement at the file end: judged above.

PR body. Checked against the tree and the check-runs: the quoted sentences in the "What the note corrects" table are verbatim from the files; the frontmatter md5 prefixes match; "35 insertions, 0 deletions" true; the 17.2.0 / 17.3.0 / 17.4.0 table matches my measurements cell for cell; the keyof SelectOption eight-key claim follows from the sources and the pinned assertion; the 42-file pending check reproduces; check-changeset-overwrite.mjs does call a prose correction with identical declarations legitimate (its case 2), and check-installed-spec-pin-claims.mjs does exclude .changeset/ (:393); the SelectOptionBase docblock does list only label, value, color, default as "from the spec" with description absent, and deliberately declines a longer enumeration. Nothing false found. One loose phrase: "pnpm-lock.yaml has exactly one entry, 17.4.0" (the lockfile carries a packages entry and a snapshots entry for the same 17.4.0; one version, which is the point). Local gate and test counts in the body are the implementer's words; CI is the evidence used here.

Check-runs on the head (read after they settled, 2026-09-27 ~18:35Z). 41 check-runs: 38 success, 3 skipped (Test (coverage), Test (coverage shard …/4), dependabot), 0 failure. Successes include Build & E2E, Type Check, Lint, Test shards 1-8, Test (dist pins), Spec Main Shape Gate, Control Byte Scan, Line Citation Gate, Governed Surface Queue Guard and the four changeset gates. The PR is still a draft.

Measured vs reasoned. Measured: every spec cell above (three registry installs, integrity-matched to the lockfile at 17.4.0), the lockfile and manifest versions, the frontmatter md5s at three refs, the diff stat, the CHANGELOG grep and its lit control, the 17.x version list, and the check-runs. Reasoned from source, not executed: the form-face keyof SelectOption claim (from select-option.ts, form.ts, the spec's .d.mts at 17.2.0 vs 17.4.0, and the convergence pin's type assertions that CI type-checks). Not re-run: any repo gate family.

Implemented-by: claude/issue-10801-changeset-boundary-correction
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 27, 2026 18:40
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 27, 2026
Merged via the queue into main with commit 610819c Sep 27, 2026
43 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10801-changeset-boundary-correction branch September 27, 2026 18:54
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
…i#10793, objectstack-ai#10802 and objectstack-ai#10821 made false (objectui#10877) (objectstack-ai#10891)

Fixes objectstack-ai#10877
Clause-②: no. It is release-text hygiene, and no published type or
behaviour moves.

## What this does

Eight pending changesets each state a contract fact that a later PR in
this same unreleased batch made false: PR objectstack-ai#10793 (objectui#7924,
`densityMode` retired), PR objectstack-ai#10821 (objectui#7928,
`ObjectViewSchema.listViews` mirrored by reference, a named view's
`options` bag refused whole) and PR objectstack-ai#10802 (objectui#10770,
`ObjectChartSchema.series` became two arms). A pending changeset
publishes verbatim into the CHANGELOG at the next release, and the
release PR objectui#5400 is still open. So each false sentence now has a
dated supersession note beside it.

The note form is copied from the landed precedents, PR objectstack-ai#10533 (the
`6235-mergedsort-wrap.md` note) and PR objectstack-ai#10828 (objectui#10801): a bold
headline naming the date and the card whose change supersedes the
sentence, then what holds now, then the superseding entry by file and
PR, then "the text above is kept as the reading of this change".

- Zero lines deleted: `git diff --numstat` against the merge-base
`9f0c84a448` is 168 insertions, 0 deletions, over 8 files. The first
round added 10 notes in 6 files. Patch round 1 added 4 notes in 2 files
(below). Patch round 2 edited the 7779 note and added none, so there are
14 notes.
- The frontmatter is byte-identical in all nine entries the claim and
its addendum `5862987983` name. The md5 of the frontmatter block is
equal at the merge-base `9f0c84a448` and the head `50deccd71a` for each:
7924-retire `ecedb10c`, 8355 `8f322642`, 10321 `564c93d5`, 10584
`84f96a9a`, 8365 `379475b3`, 9242 `acef2a2c`, 8086 `e927372d`, 7779
`ecedb10c`, 7946 `2ffd8635`.
- The seventh entry, `8086-chart-series-type-arm.md`, is untouched
(whole-file md5 `7ea6b544` at base and head). Every sentence in it
measured STILL-TRUE (see the lit control below).
- No new changeset: the diff is `.changeset/` only, and
`check-changeset-presence` says none is owed.

| Entry | FALSE-NOW sentences, quoted | Superseding entry (PR) | Notes |
| --- | --- | --- | --- |
| `7924-named-list-view-retire.md` | "`NamedListView` (one entry of
`ObjectViewSchema.listViews`)"; "Two bucket-③ members are NOT retired"
and "They stay declared as they were." |
`7928-listviews-by-reference-fold.md` (objectstack-ai#10821);
`7924-density-mode-through-fold.md` (objectstack-ai#10793) | 2 |
| `8355-retire-calendar-date-aliases.md` | "it now names the key and the
remedy on all five authoring surfaces", for "a named view's two nestings
under `listViews`"; "plus a `.check()` on `ObjectViewSchema` for a named
view's two nestings"; "`ObjectViewSchema.listViews` stays UNMIRRORED"
and the rest of that paragraph; "`timeline.dateField` stays a live,
accepted alias", on a named view; "the structural guard that `listViews`
stays out of the object's `shape`" |
`7928-listviews-by-reference-fold.md` (objectstack-ai#10821) | 3 |
| `10321-named-view-kanban-groupby-refused.md` |
"`ObjectViewSchema.listViews` is unmirrored"; "and in its legacy
`options.kanban` bag" with the issue path under `options.kanban`;
"reports one issue per written key, naming the key and the replacement";
"Not changed, deliberately: `listViews` stays unmirrored" and the rest
of that paragraph | `7928-listviews-by-reference-fold.md` (objectstack-ai#10821) | 2 |
| `10584-object-chart-series-describe.md` | "It now says the copy is
that `{ dataKey }` arm minus its per-series `type`, and that the
per-series family override on an `object-chart` node is `chartType`";
"taking `type` up would widen a published accept set" |
`10770-object-chart-react-tier-node.md` (objectstack-ai#10802) | 1 |
| `8365-stray-kanban-groupby-refused.md` | "objectui#10321 gives that
route its own door, which refuses the key in either nesting with the
same message" | `7928-listviews-by-reference-fold.md` (objectstack-ai#10821) | 1 |
| `9242-stray-kanban-groupby-lane-second-route.md` | "which refuses the
key in either nesting with the same message"; "(a named view's `kanban`
is typed as the `list-view`'s), but not the key inside the untyped
`options.kanban` bag on either" | `7928-listviews-by-reference-fold.md`
(objectstack-ai#10821) | 1 |
| `object-view-unmirrored-keys-7779.md` (patch round 1) | the table's
"still unmirrored"; "`listViews` stays unmirrored, on the ruling's own
fallback clause."; "The declaration's value is the local
`NamedListView`"; the 21-read / 43-unread figures; "The key therefore
stays in the parity ledger … until the maintainer decides its value
type" | `7928-listviews-by-reference-fold.md` (objectstack-ai#10821) | 1 |
| `objectchart-schema-anchor-7946.md` (patch round 1) | the `series`
half of "value types taken from their READ sites (`ChartRendererProps`
for `xAxisKey` / `series`)" and of "two are INTERNAL, relay-composed
(`xAxisKey`, `series` …)"; "`series` entries must be `dataKey`-shaped.";
"`aggregate` is the exception, and only because the spec's own object is
strict." | `10770-object-chart-react-tier-node.md` (objectstack-ai#10802) | 3 |

**Placement.** Each note sits directly after the paragraph that holds
the false sentence. Where two false paragraphs are adjacent, one note
covers both: the first 10321 note, the 10584 note and the last 8355
note. The 8355 note after the UNMIRRORED paragraph also covers the
matching clause in the `@object-ui/types` bullet above it, because both
describe the same named-view check. No note cites a line address; source
facts are cited by symbol and test name, and `check:new-line-citations`
reads 0 new citations.

## Measured, not inherited (one-time probes, not committed)

The probes ran the worktree sources at base `b2683a2c0e`, with
`@objectstack/spec` 17.4.0 resolved from `packages/types`. The zod face
ran through `tsx`, and the TS face through `tsc --noEmit` against
`packages/types/src/index.ts`. Each probe sits beside a control that
differs only by the key. A named view is `listViews.v` with `columns`
set.

Zod face (`ObjectViewSchema.safeParse`; `safeValidateSchema` gives the
same issues on the two `kanban` rows):

| Probe | Result |
| --- | --- |
| control `kanban: { groupByField, columns }` | parses |
| `kanban.groupBy` | two issues: `unrecognized_keys` at
`listViews.v.kanban` naming `groupBy`, and `custom` at
`listViews.v.kanban.groupBy` |
| `options: { kanban: { groupBy } }` | one issue: `unrecognized_keys` at
`listViews.v` naming `options`; nothing at the `options.kanban.groupBy`
path |
| `calendar.dateField` | `unrecognized_keys` at `listViews.v.calendar`,
and `custom` at `listViews.v.calendar.dateField` |
| `options: { calendar: { dateField } }` | one issue: `options` refused
|
| `timeline.dateField` | `unrecognized_keys` at `listViews.v.timeline`;
control `timeline: { startDateField, titleField }` parses |
| each of the 16 retired `NamedListView` spellings, and `densityMode` |
`unrecognized_keys` at `listViews.v` naming the key (17 of 17); control
`userActions: { search: false }` parses |
| `listViews` in `ObjectViewSchema.shape` | present |
| list-view route: `kanban.groupBy`, `options.kanban.groupBy`,
`calendar.dateField`, `options.calendar.dateField`, `timeline.dateField`
| `invalid_type`, `custom`, `invalid_type`, `custom`, parses: unchanged
|

TS face (`tsc`):

| Probe | Result |
| --- | --- |
| named view `kanban.groupBy` in an `ObjectViewSchema` literal | TS2353,
excess property on the spec's kanban block |
| named view `options` | TS2353, `options` does not exist |
| named view canonical control | compiles |
| `list-view` `kanban.groupBy` | TS2322 (`never`): unchanged |
| `list-view` `options.kanban.groupBy` | compiles: unchanged |
| a `NamedListView` value as a `listViews` entry | TS2322, not
assignable |
| `NamedListView` with `densityMode`; with `allowExport` | TS2322;
compiles |

Chart series (`ObjectChartSchema.safeParse`): `{ name, type: 'line' }`
parses with `type` kept; `{ dataKey, type: 'line' }` parses with `type`
stripped; `{ name, chartType }` is refused (`invalid_union`). The series
`.describe()` string now names both arms.

The runtime fold was read, not probed: `normalizeListViewSchema` still
folds `densityMode` and the eight `show*` flags, and `ListView` still
merges `options.kanban` under `kanban`.

## Lit control: STILL-TRUE, left byte-identical

- `8086-chart-series-type-arm.md`, the whole entry. PR objectstack-ai#10802 changed no
`plugin-charts` source (its one file there is a test).
`ChartRendererProps.schema.series` still declares `type?: string` on
both arms. The `ObjectChartSchema.series` docblock still says the copy
of the internal arm omits `type`, and that internal arm's type is the
same literal as before PR objectstack-ai#10802.
- 8365, "takes the identical message through a check on that untyped
bag", and the distinguishing `options.kanban` fixture. Both are the
`list-view` route, measured unchanged.
- 9242, "a `list-view` document carrying the key, under `kanban` or
under the legacy `options.kanban` bag, is refused by
`safeValidateSchema`". Measured unchanged.
- 8355, the `@object-ui/types` bullet's "on the legacy
`options.calendar` nesting (a check, since an open record declares no
member". This is the list-view surface, measured unchanged.
- 7924-retire, "`densityMode` is folded onto `rowHeight` by
`normalizeListViewSchema`" and "Only the authoring face changes". The
fold still does both.
- 10584, "Wording only. The accepted shape does not move on either
face". This is a statement about that change's own delta, and it is
still true of that change.
- 7779 (patch round 1): `viewTabBar` retired; the eight keys enforced;
"64 declared top-level members"; the spec record requires `columns` and
refuses `options`, tuple filters and `default`; "not papered over with
`z.any()`"; "absent stays valid on all nine"; the ledger move 14/96 →
14/87 (that change's own delta). Each measured true at `0ea55c3701`.
- 7946 (patch round 1): the `xAxisKey` half of the INTERNAL sentence
(its `.describe()` still says all five producers compute it); `type:
'object-chart'` required; `chartType` must be the declared union;
`normalizeChartSchema` translates the `{ name }` arm; `aggregate`
`function` / `groupBy` required with unknown members refused; a
misspelled key on the node itself is not refused; `filter` keeps both
arms. Each measured true at `0ea55c3701`.

## Gates (re-taken at head `50deccd71a`; hand-derived from
`package.json` and `.github/workflows/`; each exit captured by
redirect-then-status)

| Command | Verdict line | Exit |
| --- | --- | --- |
| `pnpm check:pending-changeset-literals` | ✅ No test source names a
pending changeset. | 0 |
| `node scripts/check-changeset-claims.mjs` | ✅ No pending changeset
names a file this change touches. (Self-contradiction reading: every
declared package across the 8 bodies is not negated.) | 0 |
| `node scripts/check-changeset-presence.mjs` | ✅ No source or published
contract of a released package changed in this range, so no changeset is
owed. | 0 |
| `node scripts/check-changeset-no-major.mjs` | ✅ No changeset declares
a `major` bump. | 0 |
| `node scripts/check-changeset-overwrite.mjs` | report-only: this
change touches 8 changesets it did not add. The declared packages are
identical at base and head for all 8, which is the prose-correction
case. | 0 |
| `node scripts/check-changeset-fixed.mjs` | ✅ All workspace packages
are in the changeset fixed group. | 0 |
| `pnpm check:new-line-citations` | VERDICT
new-cross-file-line-citations: 0 new citation(s) | 0 |
| `pnpm check:control-bytes` | ✅ check-control-bytes: OK | 0 |
| `pnpm check:spec-symbols` | ✅ spec member citations: nothing cites a
key its spec symbol does not declare. | 0 |
| `pnpm check:test-path-roots` | ✅ check-test-path-roots: OK | 0 |
| `node scripts/check-installed-spec-pin-claims.mjs` | OK (it excludes
`.changeset/`, so it was run for completeness only) | 0 |
| `node scripts/check-governed-queue-guard.mjs --test` (the 8 paths) | ✅
NOT GOVERNED | 0 |

Tests, from the repo root under the shared verify lock: every
`scripts/__tests__` file that names `.changeset` (derived with `git grep
-l`: 24 test files, plus one fixture that is not a test), and the five
`@object-ui/types` pins that re-derive what the notes state
(`calendar-date-alias-refusal-8355`,
`named-view-kanban-stray-group-by-10321`,
`object-view-listviews-by-reference-7928`,
`object-chart-react-tier-node-10770`,
`object-view-unmirrored-keys-7779`). Result at `f5e0123f4b`: **Test
Files 29 passed (29), Tests 1193 passed (1193)**, lock `VERDICT
command-exit 0`. Re-taken at `0ea55c3701` with the 24
`scripts/__tests__` files and the four pins the new notes rest on
(`object-view-unmirrored-keys-7779`,
`object-chart-react-tier-node-10770`,
`object-view-listviews-by-reference-7928`, `zod-mirror-parity`): **Test
Files 28 passed (28), Tests 1200 passed (1200)**, lock `VERDICT
command-exit 0`. Re-taken at `50deccd71a` (patch round 2): the 24
`scripts/__tests__` files plus `object-view-unmirrored-keys-7779` gave
**25 files / 1146 tests**, and the four other pins
(`calendar-date-alias-refusal-8355`,
`named-view-kanban-stray-group-by-10321`,
`object-view-listviews-by-reference-7928`,
`object-chart-react-tier-node-10770`) gave **4 files / 48 tests**. Both
runs gave lock `VERDICT command-exit 0`.

Not applicable, with the reason:
- `@object-ui/types` type-check, package vitest runs and consumer
sweeps: the diff touches no package source, only `.changeset/`.
- The Spec Main Shape Gate: no touched type.
- ESLint `--no-inline-config` on the touched files: `eslint.config.js`
has no configuration that matches `.md`. All 8 files report "File
ignored because no matching configuration was supplied", so it judged
nothing (NOT MEASURED).

## Acceptance notes

- **Residue in the same family: closed by patch round 1.** The first
round stopped on two files outside the claimed surface,
`object-view-unmirrored-keys-7779.md` and
`objectchart-schema-anchor-7946.md`. Each is named by a superseding PR
itself. The seat extended the file surface (addendum `5862987983`,
option A), and patch round 1 (`80ee15eecb`) added one note to 7779 and
three to 7946, in the same form and measured the same way. `Fixes
objectstack-ai#10877` stays.
- **For the at-tier review.** The last 7946 note also names two changes
outside the three PRs: `drillDown` (objectui#8885, PR objectstack-ai#8895) and `xAxis`
/ `yAxis` (objectui#10518, PR objectstack-ai#10601). Both landed after the 7946 entry,
and both also make its "`aggregate` is the exception" sentence false.
That sentence of the note can be dropped if the review holds it out of
scope; the rest of the note stands without it.
- Not measured: the wider pending population that names `listViews` /
`NamedListView` or `ObjectChartSchema`. Only the entries the superseding
PRs name were read.
- **Source prose. These are observations and were not filed; carrier:
none.**
- The `ObjectChartSchema.series` TS docblock
(`packages/types/src/objectql.ts`) says "A `type` written on this arm
anyway is an excess property on a literal typed by this interface."
Since PR objectstack-ai#10802 that is false. `{ dataKey: 'amount', type: 'line' }`
compiles in an `ObjectChartSchema` literal, because the union's `{ name
}` arm declares `type` (tsc probe above). The zod mirror still strips
it.
- The zod docblock headed "WHERE THIS ARM IS INSTALLED — TWO ROUTES, TWO
NESTINGS EACH, ONE STRING" (`packages/types/src/zod/objectql.zod.ts`)
still says a named view's `listViews` "is unmirrored", and it still
names a `custom` issue under `options.kanban` on that route. The
docblocks of `checkNamedViewKanbanStrayGroupBy` and
`namedViewKindRefusals` are current.
- **A dispatch premise, corrected.** "Each one already states in its own
body that it supersedes the older entry" holds for
`7924-density-mode-through-fold.md` and
`7928-listviews-by-reference-fold.md`.
`10770-object-chart-react-tier-node.md` names no superseded entry. The
supersession is stated in PR objectstack-ai#10802's body ("Superseded pending
changesets"), which names the objectui#10584, objectui#7946-anchor and
objectui#8086 entries.
- **`main` merged, twice.** `origin/main` `4f38f39286` was merged as
`0ea55c3701`: the two merged commits touch none of the probed sources,
and the probes re-ran byte-identical. `origin/main` `9f0c84a448` was
merged as `bade176fff` (patch round 2), which carries `35d68c4c` (PR
objectstack-ai#10884, objectui#10758). That merge moved probed sources
(`objectql.zod.ts`, `objectql.ts`, `ChartRenderer.tsx`); the probes
re-ran at `50deccd71a`, byte-identical to round 1's head outputs.
Neither merge used a rebase or a force-push.
- **Patch round 2 (at-tier record `5864532186`, FAIL on one note).** The
7779 note said the renderer reads 20 members and leaves 44 unread. That
was true at `4f38f39286`, but PR objectstack-ai#10884 re-took the census to 43 / 21 on
`main`. Per the seat's decision (REWORK `5864543090`), the note now
states no figure. It says the split is no longer the 21 / 43 the entry
counted, names both changes that moved it (objectui#7928 and
objectui#10758), and cites the census pin in
`object-view-unmirrored-keys-7779.test.ts`, which re-derives the figures
on every run (`43 read + 21 unread = 64` at the head). No other note
moved.
- **The headline card.** Each note's headline names the card whose
change supersedes the sentence, as the PR objectstack-ai#10533 notes did. PR objectstack-ai#10828's
notes named their own card instead, because the cause there was a spec
release that has no pending entry.
- **Commit trailers are model-free** (`Co-Authored-By: Claude`), per the
dispatch. The harness offered a trailer that carries a model name, and
it was not used.

Implemented by a `domain:spec#1` dispatch (dev subagent). Session:
`https://claude.ai/code/session_014fWVhLzhxR8qrFsJ5o8TYW`.

---
_Generated by [Claude
Code](https://claude.ai/code/session_014fWVhLzhxR8qrFsJ5o8TYW)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants