Skip to content

feat(types)!: refuse both content channels on input (objectui#9256, family D input slice) - #10907

Merged
objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-9256-input-slice
Sep 28, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-9256-input-slice

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Part of #9256
Clause-②: yes

Clause-② yes, as the claim declared: input accepted an authored children on both published faces and rendered nothing, with no render-time error or warning and no element; only the parser tier's not-a-container warning (objectui#9910) noticed it. It now refuses it by name. A published accept set narrows, so a contract review is owed before landing.

This is the family-D slice that release 5864147075 on objectui#9256 lists, and nothing else: input, the family-D test header's superseded remarks, and PartialSchema's docblock claim about generic Omit re-spellings. br, hr and img are not touched. objectui#9256 stays open.

What changed

  • input narrowed in the family-D shape PRs objectui#9589 and objectui#10897 used:
    • TypeScript face (InputSchema in packages/types/src/form.ts): body?: never and children?: never, each with a docblock saying what the renderer reads and what it renders instead.
    • zod mirror (InputSchema in zod/form.zod.ts): two retirementTombstone members fed one string, INPUT_NEITHER_CHANNEL, built by neitherContentChannelGuidance. Both stay MEMBERS, so zod-mirror-parity's key sets stay equal.
    • body was already refused on both faces by BaseSchema (objectui#6771). It is restated because that refusal names children as the remedy, and input does not read children either.
  • email / password (InputShorthandSchema): no type or accept-set change. See "The shorthand's own pair" below.
  • Texts (comments only):
    • The family-D test header: 「family E, frozen」 (the InputSchema bullet), 「unattributable」 (the DetailViewSchema bullet) and the two ui:calendar remarks that still said plain Omit (the header bullet on the six bare-name hold-outs, and the comment above the slice-2 rows) now say what is true. No assertion in that file moved.
    • PartialSchema's docblock in packages/types/src/index.ts: the sentence reading every generic re-spelling as collapsing is marked false, with OmitDeclared named as the counter-example.
    • Bounded in-place fix, declared: partial-schema-collapse-pin.test.ts's header carried the same false claim, and even named the key-remapping spelling as one that collapses. It is corrected the same way, comment only. See "Texts" below for the four conditions and the evidence.
  • New pin file packages/types/src/__tests__/content-channel-input-9256.test.ts.
  • One changeset .changeset/9256-input-content-channels.md: @object-ui/types minor with an explicit BREAKING note and a migration line, the spelling PRs objectui#9589 and objectui#10897 used under this repo's no-major rule.
  • Four pending changesets are corrected, prose only.
    • Round 2 added a dated note to 6397-partial-schema-collapse-pin.md, 9256-content-channel-family-d.md and 8499-node-slot-registered-arms.md.
    • Round 3 added a second note to the family-D entry and reworded the E3 entry's render claim in place.
    • Each carries a sentence a later change in this same release made false, or an overstatement, and each ships verbatim into the CHANGELOG. Every frontmatter block is byte-identical. See "Round 2" and "Round 3" below.

Measurement, taken on origin/main 244d516df before any edit

Instrument. The TypeScript compiler API (6.0.3), ⛔ not grep. It builds one program per tsconfig.json: the 40 workspace packages, apps/console and the three examples, 44 programs over 2015 non-test source files. It ran on a BUILT tree (turbo run build 43/43, 0 cached) with 0 unresolved-module diagnostics. It files every .body / .children read (property access, string element access, object destructuring) under the declared type of its receiver: 520 channel reads were filed.

  • InputSchema: 0 body / 0 children reads. InputShorthandSchema is never a receiver: the email / password wrappers are any-typed and hand the node to the input renderer, which reads it as InputSchema.
  • Lit controls fire in the same run: ButtonSchema 1, DivSchema 1, CardSchema 1, ContainerSchema 1 (each children).
  • Receiver reachability: the same programs see InputSchema as the receiver of 23 reads over 17 keys: defaultValue, description, error, id, inputType, label, max, maxLength, min, name, pattern, placeholder, readOnly, required, step, value, wrapperClass. Neither channel is among them, so the zero is a reading, not blindness.

Every registration that claims input, bare and namespaced (check:registry-bare-names --json, 1657 files, 424 claims, 0 contested):

  • input: sole claimant ui:input, a literal ComponentRegistry.register('input', InputRenderer, …) in renderers/form/input.tsx. The hop is typed (InputRenderer takes schema: InputSchema), not any. No field:input or other claimant exists; ai:input is a different key, a guarded protocol placeholder.
  • email / password: ui:email / ui:password own the bare keys; field:email / field:password stand down with skipFallback: true.

Does any path pass the node's content through? No.

  • SchemaRenderer destructures children and body out of the props bag before the spread.
  • The only pass-through InputRenderer gives the native element is toFormControlDomProps(inputProps), a whitelist pick of SDUI_DOM_PASS_THROUGH_KEYS plus name / disabled; children is not on it.
  • The email / password wrappers only spread props and props.schema into InputRenderer.
  • The registration declares no children slot input (objectui#9910).
  • No in-source host builds an input node by spreading another node. The literal input nodes in form.tsx, cli's init scaffold and the dashboard / designer config panels are assembled key by key, and none carries a channel.
  • The 75 any-typed channel reads were attributed file by file. None can receive an input node's channel:
    • app-shell nav / search trees, and HTTP request, error or email body payloads;
    • React children destructured off component props (view:simple's renderer, react-page's wrapper), which SchemaRenderer never fills from a node;
    • the metadata-admin preview canvases, which read a page block's properties.children or a page draft's root children to list and append blocks for selection, not to render a node's channel;
    • the page-container and sectioning registrations in containers.tsx, page.tsx and semantic.tsx, and the html-elements factory, whose tag list excludes input by name (its own comment lists input among the tags it never registers);
    • core's schema builder (card / grid / flex builders; InputBuilder has no children setter);
    • record:alert's own props.body, the runner's nav items, and the vscode validator.
  • Generic traversers (validateChildren in core, sdui-parser's parse / validate, cli validate) walk children to validate. They render nothing and are node-agnostic, as for every family-D row already landed.

Producers. pnpm census:body-dialect --keys input,email,password,ui:input,ui:email,ui:password,div,card,page,button read 9016 files. The key population is printed by the tool itself, so objectui#9545's blindness does not apply.

  • Nodes on the six input keys: input 321, email 75, password 60, ui:email 1, ui:password 17, ui:input 0. 0 author body, 0 author children.
  • The controls fire in the same pass: children on div 172, card 183, page 51, button 5.
  • Real producers: 0. Nothing was migrated.

The shorthand's own pair: type-redundant now, kept on purpose

InputShorthandSchema inherits InputSchema through OmitDeclared on the TypeScript face and .omit() on the mirror, so it now inherits the new pair. It already declared its own (PR objectui#10897).

  • Redundant as a type: on the built d.ts both are the same ?: never, and the new Eq pin makes tsc hold that.
  • Not redundant as text. The repo's rule for a restated tombstone is the one neitherContentChannelGuidance's docblock gives for restating body over BaseSchema: restate when the inherited message misdirects this node's author. The helper's contract spells the node and its route into the message. The inherited string names input and the ui:input route; the shorthand's names email / password and the wrapper route.
  • Decision: keep both members and rewrite their docblocks (TS) and comment (zod) to say they are type-redundant and why they stay. The shorthand's old body docblock gave a reason that became false with this change (that the inherited refusal names children as the remedy), and it is replaced.
  • Pinned: a CONTROL row asserts that an author of email / password reads the message naming those two nodes and not the input one, so deleting the restatement turns it red.
  • Counter-precedents, noted: UiCalendarSchema restates nothing and inherits calendar's message, which names it. objectui#8072 deleted the shorthand's wrapperClass restatement once InputSchema carried the key; that was a live key with one description, not a refusal message naming a node.

The OmitDeclared propagation, measured on the BUILT d.ts

A compiler-API probe over packages/types/dist/form.d.ts reads the heritage of InputShorthandSchema on its own: the base type the checker gives for OmitDeclared of InputSchema minus type / inputType, before the interface's own members.

built d.ts InputSchema.children heritage .children shorthand face .children
base 244d516df SchemaNode | SchemaNode[] SchemaNode | SchemaNode[] undefined (its own restated tombstone)
this branch undefined undefined undefined

A consumer-side probe resolves @object-ui/types the way packages/components does (--traceResolution: packages/types/dist/index.d.ts). There, input + children, input + body and email + children each answer their @ts-expect-error, and a lit control (const n: number = 'x') fires.

Red on base, then green — one-shot, the restore proven by state

The predictions were written to a file BEFORE the mutation. The mutation was git checkout 244d516df of the two declaration files (form.ts, zod/form.zod.ts), with every test at HEAD. It was proven by both blob hashes equal to BASE and by anchor counts: INPUT_NEITHER_CHANNEL 0, the new TS docblock marker 0. The run sat under trap … EXIT INT TERM with absolute paths.

reader mutated (BASE declarations) restored (HEAD 72dba894a)
vitest, content-channel-input-9256.test.ts RED exit 1: 6 failed / 13 passed GREEN 19 / 19
tsc -p packages/types/tsconfig.test.json RED exit 2: TS2578 on the inputChildren pin, TS2322 on the Eq pin for children; 0 elsewhere (zod-mirror-parity included) GREEN exit 0
built d.ts probe (types rebuilt; dist markers 0 then 2) InputSchema and heritage children accepted refused
  • The 6 red rows: input.children refused at its path, its message, .describe() equality, every-value, and the root + nested AnyComponentSchema row; plus the input.body message row. The base message is BaseSchema's Did you mean pointer.
  • Green on base, by design: input.body refused at its path, every-value and AnyComponentSchema (BaseSchema already refused body), and the shorthand message CONTROL (its own pair is unchanged).
  • One prediction was recorded as uncertain and read, not assumed: input.body .describe() equality is GREEN on base, because BaseSchema's alias refusal also describes with its own message.
  • ⚠️ ?: never is erased before vitest runs: the TypeScript half is read by tsc alone. tsc --listFiles counts the new pin file 1 under tsconfig.test.json and 0 under tsconfig.json, so it is a real assertion under the type-check script.
  • Restore: proven by both blob hashes equal to HEAD, git diff HEAD empty and git status clean.

Texts

  • Family-D test header. The InputSchema bullet now records the plain-Omit hold-out ground in the past tense, the E3 slice's OmitDeclared repair, and this slice's narrowing, pinned in the new file. The DetailViewSchema bullet records that the E3 slice attributed the any hop directly and narrowed it there. The two ui:calendar remarks name OmitDeclared for the TS face, .extend() for the mirror, and say which file pins which half. The third ui:calendar remark (the old TRIPWIRE note) was already in the past tense and is unchanged.

  • PartialSchema's docblock. The triage's reading is kept as the triage's. The re-spelling claim is marked FALSE, with OmitDeclared as the counter-example. The docblock now says that re-spelling the alias would narrow a published type, a contract change not made in a comment correction, and that objectui#6397 is closed. The alias itself is unchanged.

  • Bounded in-place fix: partial-schema-collapse-pin.test.ts header (comment only; its assertions are about the alias as written and do not move). All four conditions hold:

    1. It is the same defect as the carried item: the same sentence, one hop away. The corrected docblock points readers at this file.
    2. The fix is mechanical, and its shape is pinned by the carried correction.
    3. No open PR touches the file.
    4. Same gate family: types tsc and vitest, no new verification surface.

    Evidence, a one-shot probe against the built d.ts (not shipped): the exact spelling the header named as collapsing, { type } & { [K in keyof T as K extends 'type' ? never : K]?: T[K] }, declares 62 properties at ObjectGridSchema and 28 at ButtonSchema, where the shipped PartialSchema declares 1 at each. It refuses label: 42 on ButtonSchema and objectName: 42 on ObjectGridSchema (both @ts-expect-error used; tsc exit 0).

Gates at HEAD 72dba894a (round 1; round 2's are above) (exit codes captured by redirect-then-capture; heavy runs through the shared verify lock)

gate result
@object-ui/types build (tsc + vite + dist completeness) exit 0, 134 emitted files verified
@object-ui/types type-check (tsc --noEmit + examples + tsconfig.test.json) exit 0
pnpm exec vitest run packages/types/ (parity, the family-D / E3 / input pins, the 8072 and 8762 shorthand pins) 265 files / 5873 tests, exit 0
pnpm exec vitest run scripts/ (every scripts/__tests__ gate suite, a superset of those whose corpus holds a touched file) 177 passed + 2 skipped of 179 files / 5322 tests, exit 0
downstream consumer type-check: the packages naming InputSchema (components, core) plus those authoring input nodes or configs (cli, plugin-dashboard, plugin-designer) and fields, react, types, against the rebuilt dist 8 × type-check: Done, exit 0
@object-ui/types lint (eslint ., JSON) 338 files, 0 errors; the 9 form.ts warnings sit outside every added hunk
check:handler-key-reads exit 0; 128 arms, 50 / 50 reads judged, 0 unjudged
check:control-bytes · check:new-line-citations (0 new) · changeset:check · check-changeset-presence · check:changeset-claims · check:pending-changeset-literals exit 0 each
check:spec-symbols · check:component-surface-parity · check:readme-exports · check:registry-bare-names · check:prompt-keys · check:doc-types · check:test-path-roots · check:esm-specifiers · check:vi-mock-* · type-check:coverage exit 0 each
check:doc-snippets (678 / 678) · check:doc-examples · check:skill-examples · check:doc-fences · check:doc-example-ids · check:sdui-registration-pins · pnpm check (CLI self-check) exit 0 each
governed guard --test over the 7 paths NOT GOVERNED (lit control AGENTS.md: exit 3)
  • The gate list was derived by hand. objectstack's dispatch-gates.mjs refuses an objectui answer by design (exit 2), so the list comes from objectui's package.json and .github/workflows/.
  • check:changeset-claims is report-only. It names 18 pending changesets that mention a touched file; each was read, and none is falsified as a record of its own change. The two that carry a claim this slice bears on are in the Acceptance notes.
  • NOT MEASURED, left to CI: the 8-way pnpm test shards beyond packages/types and scripts/, test:dist, and E2E. check:sdui-registration-pins read the console built at base; this diff touches no registration and no sideEffects array.

Round 2: four prose edits, head 6eb3397b4

These come from contract review 5865087439 ③. The seat took them into this PR because each ships verbatim into the CHANGELOG. They are prose only: no code, no test logic, and every frontmatter block is byte-identical (the name: bump lines at base and head compare equal).

  1. .changeset/9256-input-content-channels.md, and the Clause-② sentence above.
    • Old: "an authored child list on it rendered nothing: no error, no warning, no element."
    • New: "an authored child list on it rendered nothing, with no render-time error or warning and no element; only the parser tier's not-a-container warning (objectui#9910) noticed it."
    • Measured with a one-shot probe, not committed. It built the manifest from the live registry the way container-declaration-ratchet.test.tsx does, then ran validateTree and compile.
      • input, ui:input, email and password carrying children: each draws exactly not-a-container.
      • The same four without children: none.
      • div carrying children (control): none.
      • The JSX input tag with a child: not-a-container, severity warning.
  2. .changeset/6397-partial-schema-collapse-pin.md. A dated note follows the "Why a pin and not a repair or a retirement" paragraph: a generic re-spelling of this Omit does not collapse, objectui#9256.
    • Spelling: OmitDeclared is spelled exactly as quoted, in packages/types/src/form.ts.
    • Counts: the re-spelled alias declares 28 properties at ButtonSchema and 62 at ObjectGridSchema on this head and on main 733fd5ac6. The shipped alias declares 1 at each.
    • "Not true when written": at that entry's own commit (c8ea8af9c), under the same TypeScript 6.0.3 its lockfile pins, the same spelling declares 27 and 61. Those are the source counts in that entry's own table. Both re-spellings refuse label: 42 (the @ts-expect-error is used), and a lit control on the shipped alias admits it.
    • "Later in this same release": the E3 entry and the 6397 entry are both pending on main (git cat-file -e exit 0 for each; control on an absent path: exit 128).
  3. .changeset/9256-content-channel-family-d.md. A dated note follows the AMENDED paragraph, in that file's own convention, naming the hold-outs this card later narrowed in this release.
    • Six of the nine names, in nine-holdouts-six-narrow.md.
    • list and timeline, in 9256-list-timeline-content-channels.md. This is one more than the reviewer's draft, measured.
    • DetailViewSchema and the shorthand faces, in the E3 entry.
    • InputSchema, in this PR.
    • A compiler-API probe over the source reads body / children as undefined with their own ?: never members on TextSchema, ImageSchema, IconSchema, TabsSchema, AccordionSchema, CalendarSchema, ListSchema, TimelineSchema, DetailViewSchema, InputShorthandSchema and InputSchema. The zod faces are pinned in the family-D, E3 and input pin files.
    • ButtonSchema and AppComponentSchema still resolve children to SchemaNode | SchemaNode[] (ButtonSchema's zod mirror declares its own children union; AppComponentSchema's extends BaseSchema, which declares one). That is the note's "still accept children" sentence.
  4. .changeset/8499-node-slot-registered-arms.md. "inputType is deliberately NOT declared on this arm" is false on main.
    • form.zod.ts declares inputType: retirementTombstone(SHORTHAND_INPUT_TYPE_REFUSAL) on InputShorthandSchema, and form.ts declares inputType?: never. Both files are identical on main and at the base.
    • A runtime probe: inputType is a member of the mirror shape. { type: 'password', inputType: 'text' } is refused with invalid_type at path inputType, the message opening with the objectui#8762 guidance. Bare { type: 'password' } (control) parses.
    • objectui#8762's entry landed a day after 8499's (2026-09-10 against 2026-09-09), and both are pending on main.
    • A dated note in the file's own form follows the InputShorthandSchema bullet, the same place its objectui#10756 note sits under the HtmlElementSchema bullet.
gate at 6eb3397b4 result
check-changeset-overwrite exit 0 (report-only), "1 changeset(s) added, 3 modified, 0 deleted". Each of the three modified entries prints the same declaration at base and now (@object-ui/types: patch, minor, minor), so no declaration is lost: its case 2, a correction on purpose.
changeset:check · check-changeset-presence · check:changeset-claims · check:pending-changeset-literals · check:control-bytes · check:new-line-citations exit 0 each
the 24 scripts/__tests__ suites that name .changeset (the changeset gates' own suites, the polarity census, control bytes, pending literals, docs and workflow suites) 24 files / 913 tests, exit 0

Round 3: two more prose edits, head 876f6d7ea

These come from delta review 5865466392 ③ flags 2 and 3. They are prose only, and both frontmatter blocks are byte-identical.

  1. .changeset/9256-content-channel-family-d.md: a second dated note, directly after the AMENDED paragraph and before round 2's note. The headline is "the two twins no longer take body — objectui#6771".
    • Old, still in the AMENDED paragraph: "The two twins are unchanged and go on inheriting body as the content slot".
    • New note: objectui#6771 retired body on BaseSchema itself, so both twins refuse body on both faces. The TypeScript face does it through BaseSchema's body?: never; each mirror does it by name, pointing at requestBody.
    • Measured, TypeScript: a compiler-API probe over the source gives BaseSchema its own body?: never. ChatbotEnhancedSchema and ChatbotFloatingSchema resolve body to undefined and declare only children?: never themselves.
    • Measured, zod, with a one-shot runtime probe (deleted): each twin's mirror refuses body with invalid_type at path body, and the message names requestBody. requestBody parses (control).
    • Provenance, from git log -S: BaseSchema's body?: never and both twins' mirror tombstones were introduced by 2acd8e109 (objectui#6771, 2026-09-19). The AMENDED paragraph was written on 2026-09-17 (c42554e94), and 6771-retire-body-child-list-dialect.md is pending on main. So "later in this same release" holds.
    • The reviewer's draft also cited objectui#9659. That card did not introduce the twin refusals, so the note cites objectui#6771 alone.
    • Round 2's note opens "most of the hold-outs above have since been narrowed". It is still true beside the new one: it names what this card narrowed, and it ends with button and AppComponentSchema, which still accept children.
  2. .changeset/9256-e3-residual-content-channels.md, in place.
    • Old: "an authored child list on them rendered nothing: no error, no warning, no element."
    • New: "an authored child list on them rendered nothing, with no render-time error or warning and no element; only the parser tier's not-a-container warning (objectui#9910) noticed it."
    • Measured for all twelve keys, not just the two in round 2. A one-shot runtime probe (deleted) loaded every plugin registration (plugin-grid, -form, -kanban, -map, -tree, -view, -gantt, -calendar, -charts, -detail, and components). It built the manifest from the live registry and ran validateTree.
    • Each of the twelve is known to the registry, and none declares a children input.
    • Carrying children, each draws not-a-container (severity warning). Without it, none does. div carrying children (control) draws nothing.
    • object-chart, email and password also draw one unknown-prop in both legs, from the probe's own objectName fixture key. It is not part of the difference.
gate at 876f6d7ea result
check-changeset-overwrite exit 0 (report-only), "1 changeset(s) added, 4 modified, 0 deleted". Each modified entry prints the same declaration at base and now, so no declaration is lost.
changeset:check · check-changeset-presence · check:changeset-claims · check:pending-changeset-literals · check:control-bytes · check:new-line-citations exit 0 each
the 24 scripts/__tests__ suites that name .changeset 24 files / 913 tests, exit 0

Serial constraints

Acceptance notes: out of scope, not fixed here

  • The PartialSchema docblock and its pin file still sequence the alias's repair on objectui#5155. That card is closed as a duplicate of objectui#5250, whose ruling keeps the tolerant face on renderer props. objectui#8347 (open) is the card on removing the index signature from the authoring face. "Once objectui#5155 removes the root index signature" therefore names a card that will not do it. Noted, not edited: rewriting the sequencing is a judgement about objectui#5250 / spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347, not a comment correction. Carrier: none.
  • The same "no error, no warning, no element" sentence lives in published refusal messages and docblocks, not only in changesets. Examples: the family-D retirementTombstone strings on the zod mirrors (the chatbot twins' included) and the matching TypeScript docblocks. Wherever the node's registration declares no children input, the parser tier's not-a-container warning did fire. Correcting those strings is a published-message change, not prose, and it is not this PR's. Noted, not edited. Carrier: none.

Generated by Claude Code

… family D input slice)

The `input` renderer reads neither `body` nor `children` (compiler-API
read-site sweep on a built tree: no channel read filed under InputSchema,
lit controls firing, InputSchema seen as the receiver of every key the
renderer reads). Both keys are now `?: never` on the TypeScript face and a
by-name retirementTombstone refusal on the zod mirror, fed one
neitherContentChannelGuidance string, each kept a member.

InputShorthandSchema now inherits the pair through OmitDeclared and keeps
its own restated pair, which carries the message naming email / password;
its docblocks say so. The family-D test header's superseded remarks and
PartialSchema's docblock claim about generic Omit re-spellings are
corrected (comments only). New pin file content-channel-input-9256.test.ts;
one @object-ui/types minor changeset with a breaking note.

Part of objectui#9256.

Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk
Co-authored-by: Claude <noreply@anthropic.com>
…pelling claim; correct it (objectui#9256)

partial-schema-collapse-pin.test.ts's header named the key-remapping
spelling itself as collapsing. It does not: the same spelling instantiated
at ObjectGridSchema / ButtonSchema keeps the named members (one-shot probe
against the built d.ts, reported on the PR). Comment only; no assertion in
that file moves. Also tightens the PartialSchema docblock wording.

Part of objectui#9256.

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

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 17 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/5905-componentinput-inputtype-tombstone.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    The write was measured as a no-op before it was deleted, and re-measured on this branch's base rather than inherited from the card. A structural census over every inputs: array in the repository (211 regions, all tracked TS/TSX/JS sources) scores inputType at exactly ONE authoring site — the plugin-markdown registration — against name 953, type 969, label 966, description 194, enum 119, required 86 and binding 4 in the same pass over the same regions, so the instrument was not blind. The other 192 in-repo inputType hits are a DIFFERENT face: FormField.inputType (zod/form.zod.ts), the text-input renderer's prop, and SchemaBuilder.inputType, none of which sit on a ComponentInput. The publication path is unchanged and was re-confirmed: packages/sdui-parser/src/index.ts forwards exactly seven keys per input — name, type, of, required, enum, binding, description — so an authored inputType could not reach the published sdui.manifest.json even in principle.

.changeset/6051-gantt-flat-config-declared-keys.md

  • names packages/types/src/index.ts → packages/types/src/index.ts — edited by this change

    GanttConfig itself gains nine members and is a published type, exported by name from packages/types/src/index.ts: lockField, objectField, summaryExtent, defaultCollapsedDepth, borderColorField, dependencyTypes, timeZone, exportFileName, interactions. The entry file's diff is empty only because the export list already named the type — the widening happened at the declaration.

.changeset/6349-name-authority-batch-3.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    @object-ui/components — ComboboxOption now IS @object-ui/types' declaration. The component declared its own { value, label }, a strict subset of the ComboboxOption that @object-ui/types declares for ComboboxSchema.options and mirrors in form.zod.ts ({ value, label, disabled? }). The component now re-exports the types declaration (through the @object-ui/types/form subpath — the root barrel does not publish the name), so the name ComboboxOption exported from @object-ui/components gains the optional disabled?: boolean member. Every value that type-checked before still does — nothing narrows and no key changes type; the one thing that moves is keyof ComboboxOption, so a consumer that EXHAUSTS the type (a Record over its keys) will need the new key. Note that the Combobox component itself does not read option.disabled — that member was already declared on the @object-ui/types face and is now visible on this one too; it is recorded as a separate finding, not changed here.

.changeset/6396-previous-values-dom-leak.md

  • names packages/types/src/form.ts → packages/types/src/form.ts — edited by this change

    Scope is the runtime leak only. The declared key stays exactly as declared (packages/types/src/form.ts, packages/types/src/zod/form.zod.ts are untouched): it has a live consumer, so there is nothing here for the enforce-or-remove channel.

  • names packages/types/src/zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    Scope is the runtime leak only. The declared key stays exactly as declared (packages/types/src/form.ts, packages/types/src/zod/form.zod.ts are untouched): it has a live consumer, so there is nothing here for the enforce-or-remove channel.

.changeset/6938-checkbox-wrapper-class.md

  • names packages/types/src/form.ts → packages/types/src/form.ts — edited by this change

    packages/components/src/renderers/form/checkbox.tsx:36 reads cn("flex items-center space-x-2", schema.wrapperClass) — classes on the wrapper div around the box and its label — and neither the TypeScript interface in packages/types/src/form.ts nor the zod mirror in zod/form.zod.ts declared the key. It compiled through BaseSchema's index signature and parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on FileUploadSchema and FilterBuilderSchema (objectui#6150); the checkbox was left out only because its doc page's schema block is a six-line summary.

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    packages/components/src/renderers/form/checkbox.tsx:36 reads cn("flex items-center space-x-2", schema.wrapperClass) — classes on the wrapper div around the box and its label — and neither the TypeScript interface in packages/types/src/form.ts nor the zod mirror in zod/form.zod.ts declared the key. It compiled through BaseSchema's index signature and parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on FileUploadSchema and FilterBuilderSchema (objectui#6150); the checkbox was left out only because its doc page's schema block is a six-line summary.

.changeset/7113-chart-data-model.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    .extend() with a NEW key still works and preserves the fold and the refinement; .optional(), z.discriminatedUnion, z.toJSONSchema and safeValidateSchema are all unaffected. Nothing in this repository calls the throwing combinators on either const, and the published surface already ships refined mirrors (objectql.zod.ts, complex.zod.ts, form.zod.ts, app.zod.ts), so the class is not new — but it is a real behaviour change on a published export and it belongs in the release note rather than in a reviewer's file.

.changeset/7530-predicate-envelope-declared.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • ExpressionWire (type, main entry) — the TypeScript wire union, in packages/types/src/expression.ts. - ExpressionWireSchema (@object-ui/types/zod) — its runtime twin, hoisted out of zod/form.zod.ts (where it was module-private) into zod/expression.zod.ts and imported by both base.zod.ts and form.zod.ts. One envelope type, reused by reference; no second spelling.
  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • ExpressionWire (type, main entry) — the TypeScript wire union, in packages/types/src/expression.ts. - ExpressionWireSchema (@object-ui/types/zod) — its runtime twin, hoisted out of zod/form.zod.ts (where it was module-private) into zod/expression.zod.ts and imported by both base.zod.ts and form.zod.ts. One envelope type, reused by reference; no second spelling.

.changeset/7697-combobox-option-root-barrel.md

  • names src/form.ts → packages/types/src/form.ts — edited by this change

    Additive only. ComboboxOption is added to the root barrel's existing named re-export list from ./form.js, next to the sibling option types that were already there (SelectOption, RadioOption). Nothing is removed, retyped or narrowed: the declaration stays in src/form.ts, its three members (value, label, disabled?) are unchanged, and the @object-ui/types/form subpath spelling keeps working exactly as before. Both spellings now resolve to the same declaration.

.changeset/7722-wrapper-class-five-more.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    Each of renderers/form/switch.tsx, textarea.tsx, date-picker.tsx, select.tsx and renderers/data-display/list.tsx reads schema.wrapperClass onto its wrapper element, and neither the TypeScript interface (form.ts, data-display.ts) nor the zod mirror (zod/form.zod.ts, zod/data-display.zod.ts) declared the key. The reads compiled through BaseSchema's index signature (objectui#5155) and the values parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on CheckboxSchema (b74a8598d), FileUploadSchema and FilterBuilderSchema (objectui#6150); these five were left out only because their doc pages never listed it.

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    Each of renderers/form/switch.tsx, textarea.tsx, date-picker.tsx, select.tsx and renderers/data-display/list.tsx reads schema.wrapperClass onto its wrapper element, and neither the TypeScript interface (form.ts, data-display.ts) nor the zod mirror (zod/form.zod.ts, zod/data-display.zod.ts) declared the key. The reads compiled through BaseSchema's index signature (objectui#5155) and the values parsed through .passthrough(), admitted unexamined. The same key, on the same class of read, is declared on CheckboxSchema (b74a8598d), FileUploadSchema and FilterBuilderSchema (objectui#6150); these five were left out only because their doc pages never listed it.

.changeset/7735-zod-mirrors-stop-authoring-defaults.md

  • names form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    What changed. All 41 .default() call sites under packages/types/src/zod/ are removed — layout.zod.ts 22, crud.zod.ts 11, form.zod.ts 5, views.zod.ts 2, app.zod.ts 1. @object-ui/components reconciles the third face objectui#8229 found: flex's registration defaultProps.align seeded 'center', the value its own renderer never applies, so a designer-made node laid out differently from a hand-authored one; it now seeds 'start'.

.changeset/8072-input-wrapper-class-mirrored.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    packages/components/src/renderers/form/input.tsx reads cn("grid w-full items-center gap-1.5", schema.wrapperClass) onto the wrapper div around the input and its label. The TypeScript face has declared the key all along (form.ts, docblock "Input wrapper CSS class"); the zod mirror never did, so the value rode through .passthrough() and { type: 'input', wrapperClass: 42 } validated GREEN — while the identical document on any of the other eight schema.wrapperClass readers (checkbox, file-upload, filter-builder — objectui#6150 / b74a8598d; switch, textarea, date-picker, select, list — objectui#7722) was refused at the key.

.changeset/8478-describe-line-addresses.md

.changeset/8478-zod-pins-form-layout.md

.changeset/9067-zod-barrel-named-arms.md

  • names zod/form.zod.ts → packages/types/src/zod/form.zod.ts — edited by this change

    • InputShorthandSchema (zod/form.zod.ts) — the email / password shorthand arm. - UiCalendarSchema (zod/form.zod.ts) — ui:calendar, the date-picker primitive renderers/form/calendar.tsx registers, a different component from the calendar plugin view that owns the bare literal.

.changeset/9406-types-root-barrel-two-names.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    form-barrel-mirror-9406.test.ts keeps it closed, and it is DERIVED rather than a pair of presence assertions: it reads form.ts's export list and the root barrel's ./form.js re-export list on every run and names whatever is in the first and not the second. A pin asserting "these two names are present" would pass on the day the next declaration lands in form.ts and is forgotten, which is this class reopening yet again. Names deliberately left off the list get a ledger row carrying the reason instead, and a row goes red once its name reaches the barrel or stops being declared.

.changeset/9526-types-root-barrel-command-element-types.md

  • names form.ts → packages/types/src/form.ts — edited by this change

    The change is purely additive: the two names join the root barrel's existing named re-export list from ./form.js, beside CommandSchema. Nothing is removed, renamed or narrowed, the declarations stay in form.ts, and the /form subpath keeps working. It is the third instance of one class, repaired by the same route each time: objectui#7697 for ComboboxOption, and objectui#9406 (director decision batch 133, item 2, letter (a)) for InputShorthandSchema and UiCalendarSchema.

.changeset/9659-node-recursion-point-inert-clause.md

  • names content-channel-family-d-9256.test.ts → packages/types/src/__tests__/content-channel-family-d-9256.test.ts — edited by this change

    One reading in a neighbouring table got a line, not a rewrite. In content-channel-family-d-9256.test.ts the plain chatbot row lists children only, which on the two TWIN faces still means "body held out and live" — and objectui#9639 had to re-point that table's LIVE CONTROL at a twin precisely because the plain face refuses body now, for objectui#8572's reason rather than this table's. Measured at the time: body ACCEPTED on chatbot-enhanced and chatbot-floating, REFUSED on chatbot. ⚠️ That hold-out has since ended and not by a decision on either card: objectui#6771 retired body on BaseSchema itself, so the twins had no content channel left to inherit and each now declares the same NEITHER-channel tombstone its children sentence already asserted, pointing at requestBody. The row is annotated as one-sided so the next reader does not take it for a two-sided reading. ⛔ No assertion in that table moved.

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with 29c76e573 (merge-base with origin/main): 6 file(s) changed outside .changeset/, read against 1665 pending declaration(s) that publish a body (2260 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3095.6 KB 3104.5 KB
Main entry chunk (gzip) 148.4 KB 350 KB
Entry file index-hE4_L-SI.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.58KB 6.17KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.17KB 10.58KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 557.59KB 133.60KB
core (index.js) 9.93KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 226.44KB 63.00KB
fields (index.js) 261.01KB 66.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.32KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.96KB 14.83KB
plugin-charts (index.js) 83.99KB 22.86KB
plugin-chatbot (index.js) 197.67KB 46.90KB
plugin-dashboard (index.js) 136.93KB 36.48KB
plugin-designer (index.js) 215.03KB 44.21KB
plugin-detail (index.js) 233.48KB 61.79KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 161.21KB 41.41KB
plugin-gantt (index.js) 170.35KB 42.19KB
plugin-grid (index.js) 228.33KB 62.59KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.86KB 28.64KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.17KB 12.20KB
plugin-timeline (index.js) 31.00KB 9.09KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 88.55KB 22.21KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.16KB 39.05KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 7.50KB 3.05KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.16KB 2.71KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.22KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 3.83KB 1.49KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.27KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 72dba894ab46ab843d3fbd97ca2f2b96f793e1fe

Isolated adversarial review of PR objectui#10907 (objectui#9256, family D, the input slice, Part of). Read: the card body and all 26 comments (release 5864147075, claim 5864167045, dev report 5864693299, the ACCEPTs 5863676575 / 5864002584), PR objectui#10897 with records 5863631182 / 5863978167, this PR's body, diff, file list and check-runs, the branch as refs/review/pr-10907 against origin/main 8522396c0 (merge-base 244d516df), the gate comment 5864659100, and the open PRs at their current heads. The dev report was treated as a claim; every figure below was re-derived. CI on the head, read at 2026-09-28T07:00Z: 43 check-runs, 40 success, 3 skipped (dependabot and the two coverage rows), 0 failure; Type Check, Lint, Test and all eight shards, Test (dist pins), Build & E2E, Changeset Bump Policy, Line Citation Gate among the successes; last completion 06:40:23Z. The PR is draft, head unchanged since the report.

① Derived judgments

input reads neither channel — re-derived at the source.

  • InputRenderer (renderers/form/input.tsx) types the node as InputSchema and reads exactly wrapperClass, label, id, required, inputType, name, placeholder, readOnly, value, defaultValue, min, max, step, maxLength, pattern, description, error: 17 keys, 23 reads, the set the docblock and the report name. No body / children token in the file.
  • SchemaRenderer (packages/react) destructures children: _children, body: _body out of the props bag before the spread, so neither key reaches the renderer as a prop. The only native pass-through is toFormControlDomProps(inputProps): SDUI_DOM_PASS_THROUGH_KEYS (id, className, role, tabIndex, autoFocus, onClick, onBlur, onFocus) plus name / disabled and the aria-* / data-* prefixes. children is not on it.
  • The ui:email / ui:password wrappers are (props: any) ⇒ InputRenderer {...props} schema={{ ...props.schema, inputType }}: they add a key and hand the node to the same reader.
  • Claimants, measured with check-registry-bare-name-collisions.mjs --json at the head (1657 files, 424 claims, 0 contested, the report's figures): input verdict sole, owner ui:input, a literal ComponentRegistry.register('input', InputRenderer, …), no stand-down; email / password sole ui:* with field:email / field:password standing down (FIELD_TYPES_SKIP_FALLBACK holds both). The field roster carries no input; element:text_input is a different key with skipFallback; ai:input is a placeholder key in placeholders.tsx. The registration declares no children slot.
  • Hosts: every in-source input node is a key-by-key literal (form.tsx's demo fields, cli init, the vscode scaffold, WidgetConfigPanel / DashboardConfigPanel, the site playground, the types examples); PageDesigner's palette drop seeds no channel; no ...node spread into an input node exists. The form renderer's own input branch draws the native Input directly, never a node.
  • Producers: my own scan of the head tree (8909 files under packages, apps, examples, docs, content, skills, scripts, .changeset) finds 553 input / email / password / ui:* nodes and 0 carrying a top-level body or children. content/docs/components/form/input.mdx mentions neither key. The census of 0 is right.

Shape. PR objectui#10897's family-D shape on both faces: TS body?: never and children?: never with docblocks; zod two retirementTombstone(INPUT_NEITHER_CHANNEL) members kept as members, one string from neitherContentChannelGuidance('input', route, renders). The message names both keys, the node, the card, NEITHER content channel and What it renders instead: and never Did you mean. The renders list (label, placeholder, inputType, value / defaultValue, description, error, required) is true against the renderer. The body restatement over BaseSchema follows the helper's own docblock rule (BaseSchema's aliasKeyRefusal points at children, dead here too).

InputShorthandSchema's own pair — keeping it is right. On the built face both body and children resolve to undefined on InputSchema and on the shorthand (compiler API over the worktree sources: InputSchema 34 declared members, InputShorthandSchema 34, index signature kept on both); the Eq pin holds that and would read false against the base (children was SchemaNode | SchemaNode[] there). The zod .omit() now carries input's tombstones and the .extend() overrides them by key, so the string an email / password author reads names those two nodes and the wrapper route; the CONTROL pins that with not.toContain('input reads NEITHER'), which is a new claim and is not restated from the E3 file (that file pins only not.toContain('Did you mean')). The two faces agree in effect: TS restates a member whose type it already inherits, zod restates a member whose message it changes, and both docblocks say so. The counter-precedents (objectui#8072's wrapperClass deletion, a live key with one description; UiCalendarSchema, whose inherited message already names it) are the right ones and do not bind here. zod-mirror-parity is untouched and green: no ledger figure moves, because both faces gain the same two keys.

Texts.

  • Family-D header: 「family E, frozen」 and 「unattributable」 are gone; the InputSchema and DetailViewSchema bullets record the E3 derivation the 5863631182 record made (DetailView renders header / footer / a tab's content); the two ui:calendar remarks now say .extend() for the mirror (UiCalendarSchema = CalendarObjectSchema.extend(…), true) and OmitDeclared for the TS face, and point the TS half at the E3 file, which holds uiCalendar satisfies UiCalendarSchema and the pair the tripwire asked for. The third remark beside the slice-3 rows was already past tense. toHaveLength(31) and every assertion are unmoved.
  • PartialSchema docblock and the pin-test header: the claim that the OmitDeclared spelling does not collapse is measured. Standalone tsc 6.0.2 probe (every directive used, exit 0): a key-remapping mapped type over an interface with [key: string]: any keeps every named member with its modifiers (required stays required, ?: never stays undefined), drops exactly K, and keeps the index signature; the alias as written admits label: 42, the re-spelled one refuses it and still admits an unknown key. Over the real declarations at the head: the re-spelled alias declares 28 members at ButtonSchema and 62 at ObjectGridSchema where the shipped PartialSchema declares 1 at each, the dev's figures exactly. objectui#6397 is closed (completed). The pin header's correction is the same sentence one hop away, comment only, and no assertion in that file moves.

Producers census: 0, confirmed above. Clause-②: yes sits on the body's second line and is right: a published accept set narrows on input on both faces.

② Semver level

@object-ui/types: minor with the explicit BREAKING note is the spelling PRs objectui#9589 and #10897 used and objectui AGENTS.md's no-major rule requires (check-changeset-no-major.mjs enforces it; Changeset Bump Policy passed). The migration line is right: label, placeholder and description are read; nothing else on input takes a node. Sentence by sentence, the changeset checks true — children parsed green through BaseSchema's children member and type-checked through its TS declaration; body was refused on both faces by BaseSchema and its message pointed at children; the shorthand faces accept and refuse exactly what they did, with the same message (the override) and the same ?: never — with one imprecision to fix in wording: "an authored child list on it rendered nothing: no error, no warning, no element" is true of the render path only. The parser tier already warned: validateTree (sdui-parser/src/validate.ts, objectui#9910) pushes a not-a-container warning for any node whose registration declares no children slot, and ui:input declares none, so objectui check named the tag. The same sentence rode the 9589 and E3 entries; it should read "rendered nothing, with no render-time error or warning and no element; only the parser tier's not-a-container warning (objectui#9910) noticed". Not a contract defect.

③ Boundary flags

  1. .changeset/6397-partial-schema-collapse-pin.md — yes, this PR should carry the dated note, and neither ground for leaving it holds. The sentence "every generic re-spelling collapses for the same keyof T reason" publishes verbatim into the CHANGELOG beside the E3 entry that says the opposite of OmitDeclared; this PR corrects that sentence in the two source comments and leaves the one copy that publishes. The dev's four bounded-fix conditions hold for it as they held for the pin header: same defect, mechanical, no open PR touches the file (checked across all ten open PRs; docs(changeset): date-note six pending entries that PRs #10793, #10802 and #10821 made false (objectui#10877) #10891's eight entries are others), same gate family. "Another card's changeset" is exactly what the precedents edit: PR objectui#10533 (five entries), the objectui#8284 closing PR fix(types,components,docs): correct the texts objectui#6771 left false about body (objectui#8284) #10879 (four entries, 2026-09-28) and the open docs(changeset): date-note six pending entries that PRs #10793, #10802 and #10821 made false (objectui#10877) #10891 (eight). "PR objectui#5400 deletes it" distinguishes nothing: that PR deletes all 1651 pending changesets and is regenerated on every push to main. Drafted, in the fix(types,components,docs): correct the texts objectui#6771 left false about body (objectui#8284) #10879 form, to sit after the "Why a pin and not a repair or a retirement" paragraph: ⚠️ Dated note, 2026-09-28 — a generic re-spelling of this Omit does not collapse — objectui#9256. Later in this same release the E3 slice of objectui#9256 spelled a key-remapping OmitDeclared ({ [P in keyof T as P extends K ? never : P]: T[P] }, packages/types/src/form.ts) and repaired InputShorthandSchema and UiCalendarSchema with it: such a mapped type iterates the named members and the index signature separately, so it drops exactly K and keeps every other named member, modifiers and index signature included. The same spelling of this alias declares 28 properties at ButtonSchema and 62 at ObjectGridSchema where the shipped alias declares 1. "Every generic re-spelling collapses" was therefore not true when written. The alias is still left as written, because re-spelling it would narrow what every instantiation accepts, a contract change and not a pin's business; the PartialSchema docblock and partial-schema-collapse-pin.test.ts record the correction. The rest of this entry is kept as the reading of this change. — One prose-only commit, frontmatter untouched; a delta read suffices.
  2. The objectui#5155 sequencing. Stale, confirmed: objectui#5155 closed 2026-09-24 as a duplicate of objectui#5250 (strict variant on the parse / validate boundary; renderer props keep the tolerant face), and the open card for removing the index signature from the authoring face is objectui#8347 (pm:blocked). "Once objectui#5155 removes the root index signature" in the docblock, and the pin header's "Removal condition — the objectui#5155 sequencing note", both name a card that will not do it. The dev's reason for not rewriting is fair: whether spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347's authoring-face removal reaches PartialSchema's T extends BaseSchema bound is a judgement about finding: JSON doc snippets are checked by nothing — the ts/tsx gate cannot see them, and BaseSchema.passthrough() makes objectui validate accept arbitrary undeclared keys #5250 / spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347, not a comment correction. It has no carrier; the seat should give it one (a line on objectui#8347 or a card). Not a defect of this diff.
  3. The pending 9256-content-channel-family-d.md hold-out list names InputSchema and DetailViewSchema (and the nine bare names, six of which slice 2 narrowed). As a record it reads "held out at this change" and is not false; the same file already carries an AMENDED paragraph for the chatbot hold-out that objectui#8572 ended in this release, so a dated note is the file's own convention, and this PR is the one that ends the InputSchema hold-out. Recommended, lower priority than flag 1, in the same commit or at the card's close: ⚠️ Dated note, 2026-09-28 — the hold-outs above have since moved — objectui#9256. Later in this same release slice 2 narrowed six of the nine bare names once check:registry-bare-names measured their owners, the E3 slice re-spelled the shorthand heritage as OmitDeclared and narrowed DetailViewSchema and the email / password faces, and the input slice narrowed InputSchema itself; each is measured in its own entry. The rest of this entry is kept as the reading of this change.
  4. Serial at current heads. All ten open PRs mapped: none touches the seven paths. PR fix(types,cli): element:number validates, with the spec's dataSource waiver (objectui#10872, batch 2) #10908 (opened 06:29Z, after this PR's last push at 06:09Z) edits zod-mirror-parity.test.ts and zod/index.zod.ts; this PR moves no ledger figure and touches neither file, and its pins read input and div through AnyComponentSchema, which fix(types,cli): element:number validates, with the spec's dataSource waiver (objectui#10872, batch 2) #10908 only widens. docs(changeset): date-note six pending entries that PRs #10793, #10802 and #10821 made false (objectui#10877) #10891 edits eight changesets, neither of the two named here. origin/main moved three commits past the base (fix(plugin-view,plugin-dashboard): object-view's non-grid views and a dashboard filter's optionsFrom options re-read on the data-invalidation bus (objectui#10887) #10898, fix(auth): sign-up carries the invitation redirect into the verification mail (objectui#10893) #10904, fix(app-shell)!: SchemaForm resolves a { group } form section instead of crashing, and the form-section types match the spec (objectui#8725) #10902), none under packages/types; git merge-tree onto 8522396c0 is clean. The body's map was complete when written (fix(types,cli): element:number validates, with the spec's dataSource waiver (objectui#10872, batch 2) #10908 / feat(app-shell): the environment admin's storage-capacity banner, from the served verdict (objectui#10439) #10910 / fix(app-shell): read the single AI quota pool and draw one ring (objectui#8524) #10911 opened later; fix(auth): sign-up carries the invitation redirect into the verification mail (objectui#10893) #10904 / fix(app-shell)!: SchemaForm resolves a { group } form section instead of crashing, and the form-section types match the spec (objectui#8725) #10902 have merged).
  5. PR body. No line address (scanned for file:NNN, line NNN and numeric ranges), no angle bracket, Clause-②: yes on line 2, the instrument, claimant, pass-through, host, producer, d.ts and serial claims all read true against the measurements above. Two sentences are now stale rather than false: "origin/main moved one commit" (three) and the open-PR list (two merged, three opened). The "no error, no warning" wording of ② is the body's as well.
  6. Pre-existing, not this PR's doing: among the 18 pending entries the gate named, 8499-node-slot-registered-arms.md's "inputType is deliberately NOT declared on this arm" was falsified by objectui#8762 (8762-shorthand-input-type-refusal.md, same release), not by this diff; carrier: the seat.

Implemented-by: claude/issue-9256-input-slice
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

…, and word the input entry's render claim exactly (objectui#9256)

Prose only; every frontmatter block byte-identical.

- 9256-input-content-channels: "no error, no warning, no element" was
  true of the render path only; the parser tier's not-a-container
  warning (objectui#9910) fired for an input carrying children
  (measured through validateTree and compile on the live registry).
- 6397-partial-schema-collapse-pin: dated note, the key-remapping
  re-spelling does not collapse (28 / 62 on this release's tree, 27 / 61
  at that entry's own commit under the same TypeScript, 1 shipped).
- 9256-content-channel-family-d: dated note naming the hold-outs later
  slices of objectui#9256 narrowed in this release.
- 8499-node-slot-registered-arms: dated note, objectui#8762 declared
  inputType on the shorthand arm as a by-name refusal.

Part of objectui#9256.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3096.1 KB 3104.5 KB
Main entry chunk (gzip) 148.6 KB 350 KB
Entry file index-CXe0iCYr.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.58KB 6.17KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.70KB 2.23KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 557.59KB 133.60KB
core (index.js) 9.93KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 226.44KB 63.00KB
fields (index.js) 261.01KB 66.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.32KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.96KB 14.83KB
plugin-charts (index.js) 83.99KB 22.86KB
plugin-chatbot (index.js) 197.67KB 46.90KB
plugin-dashboard (index.js) 136.93KB 36.48KB
plugin-designer (index.js) 215.03KB 44.21KB
plugin-detail (index.js) 233.48KB 61.79KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 161.21KB 41.41KB
plugin-gantt (index.js) 170.35KB 42.19KB
plugin-grid (index.js) 228.33KB 62.59KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.86KB 28.64KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.17KB 12.20KB
plugin-timeline (index.js) 31.00KB 9.09KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 88.55KB 22.21KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.16KB 39.05KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 7.50KB 3.05KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.16KB 2.71KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.22KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 3.83KB 1.49KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.27KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 6eb3397b4d6f0fab4e4dd9fdd1e4614ed1a2cc11

Delta review of PR objectui#10907 at the round-2 head, after record 5865087439 (PASS on 72dba894a). Isolated and adversarial; REST reads only; one write, this comment. Read: the r2 PR body, the branch as refs/review/pr-10907, origin/main at 733fd5ac6, every open PR's file list at its current head, PR objectui#10914's head as refs/review/pr-10914, and the check-runs on the head. The dev's Round 2 section was treated as a claim; every figure below was re-derived. CI on the head, polled every 60 s until settled and read at 2026-09-28T07:29Z: 43 check-runs, 39 success, 3 skipped (dependabot and the two coverage rows), 1 failure — Spec Main Shape Gate, a required context, attributed under ③ flag 0 to an objectstack main move that this diff cannot touch. Every other required context is green (Lint, Type Check, Build & E2E, Build Docs, Changeset Declaration, Test, Governed Surface Queue Guard), with the eight test shards, Test (dist pins), Changeset Bump Policy, Changeset Overwrite Report, Changeset Claim Re-read, Changeset Fixed Group Check, Line Citation Gate and Control Byte Scan among the successes; last completion 07:28:45Z. The PR is draft, mergeable_state behind against a main that moved four commits, none of them on a path here.

① Derived judgments

The delta itself. One commit, 6eb3397b4, whose sole parent is the reviewed head 72dba894a (the old head is an ancestor: no rebase, no force-push). git diff --stat 72dba894a..6eb3397b4 is exactly four files under .changeset/, +35 / −2; the only two deleted lines are the reworded sentence in this PR's own entry. The frontmatter block of each of the four files hashes identically at the old and the new head. No source, test or pin moved. git merge-tree onto origin/main 733fd5ac6 is clean.

Item 1 — the input entry and the body's Clause-② sentence. Re-measured, not inherited. packages/sdui-parser/src/validate.ts and its four local modules import nothing but types from ./types.js, so they were emitted with tsc 6.0.2 into the scratch dir and validateTree was run against a manifest built by hand from the registrations' own inputs arrays (input.tsx's three; div.tsx's className plus the children slot). input, ui:input, email and password carrying children each draw exactly one diagnostic, warning: not-a-container; the same input without children and div with children draw none; input carrying body draws the same code through body-dialect.ts. acceptsChildren reads only a declared children input and nothing else, SchemaRenderer strips both keys before its spread, and core's validateChildren only recurses, so "only the parser tier's not-a-container warning (objectui#9910) noticed it" is exact, and "no render-time error or warning and no element" is true. The body's Clause-② sentence carries the same words.

Item 2 — the dated note on 6397-partial-schema-collapse-pin.md. The mapped-type spelling quoted in the note is byte-exact against OmitDeclared in form.ts. Counts re-measured with the compiler API over the worktree sources: at this head the re-spelled alias declares 28 members at ButtonSchema and 62 at ObjectGridSchema while the shipped PartialSchema declares 1 at each; at c8ea8af9c, the entry's own commit, 27 and 61 against 1 and 1, which are the source counts in that entry's own table. So "was not true when it was written" is a measurement. In both trees the re-spelled alias refuses label: 42 (the @ts-expect-error is used) and the shipped alias admits it. "Later in this same release" holds: 9256-e3-residual-content-channels.md is pending at the head and on main. The note is in the #10879 form (dated bold headline naming the card, what holds now, the carriers by file, "The rest of this entry is kept as the reading of this change") and sits after the "Why a pin and not a repair or a retirement" paragraph, the sentence it corrects.

Item 3 — the dated note on 9256-content-channel-family-d.md. Every name checked on the TypeScript face at the head (compiler API): TextSchema 25 members, ImageSchema 26, IconSchema 24, TabsSchema 26, AccordionSchema 28, CalendarSchema 27, ListSchema 26, TimelineSchema 32, DetailViewSchema 56, InputShorthandSchema 34, InputSchema 34, and each resolves body and children to undefined; at c8ea8af9c every one of them resolved both to SchemaNode | SchemaNode[]. The zod halves are the rows of the family-D, E3 and input pin files. ButtonSchema (28) and AppComponentSchema (34) still resolve children to the node union: ButtonSchema's mirror declares its own children union and AppComponentSchema's mirror extends BaseSchema with no tombstone, so "still accept children" is true on both faces. "Each is its own entry in this release": nine-holdouts-six-narrow.md names exactly text, image, icon, tabs, accordion, calendar; 9256-list-timeline-content-channels.md, 9256-e3-residual-content-channels.md and 9256-input-content-channels.md carry the rest; all four are pending. "once check:registry-bare-names (objectui#9264) measured one owner for each" is what the family-D header records. Form right; placement after the AMENDED paragraph is the file's own convention.

Item 4 — the dated note on 8499-node-slot-registered-arms.md. form.zod.ts declares inputType: retirementTombstone(SHORTHAND_INPUT_TYPE_REFUSAL) on InputShorthandSchema and form.ts declares inputType?: never; the refusal string points at { "type": "input", "inputType": "email" }; the ui:email / ui:password wrappers still spread inputType last, so "the reason does" hold. 8762-shorthand-input-type-refusal.md is pending; the two landings read off git log as 2026-09-09 (#8763) and 2026-09-10 (#9051), as the body says. Form right; the note sits inside the InputShorthandSchema bullet, where the objectui#10756 note sits inside the HtmlElementSchema bullet.

Nothing outside prose moved. Confirmed by the diff: no path outside .changeset/.

② Semver level

Unchanged: @object-ui/types: minor with the explicit BREAKING note. The three edited entries keep their declarations (6397 patch, family-D minor, 8499 minor) with byte-identical frontmatter, so no bump moves. Changeset Bump Policy, Changeset Declaration, Changeset Fixed Group Check, Changeset Overwrite Report and Changeset Claim Re-read are green on the head; the gate comment, refreshed for this head at 07:16Z against merge-base 733fd5ac6, names 17 pending entries (the 8499 entry is no longer among them), and none of the 17 is falsified by this diff.

③ Boundary flags

  1. One required context is red on this head, and it is not this diff's. Spec Main Shape Gate compiles this repository against @objectstack/spec built from objectstack main at job time; its workflow header says its subject is the drift between two repositories, not the pull request's diff, which is why it carries no path filter. Its own annotation on this head reads packages/types/src/__tests__/report-chart-query-spec-parity.test.ts, TS1360 「Type 'true' does not satisfy the expected type 'false'」, 「spec@main shape break (df3ba164a588)」. That line is the pin _specJoinedReportBlockIsStillUntyped = true satisfies IsUnknown over SpecJoinedReportBlock, whose own header says that the pin, not the state of any upstream issue, is what says when the ledger row 「JoinedReportBlock stays in the ledger — still untyped upstream (objectui#3162)」 is burnable. objectstack 681868ca7 (PR objectstack#20369, closing objectstack#19920: 「JoinedReportBlock, a ViewItem config and the overlay viewKind carry the shapes their doors accept」, packages/spec/src/ui/report.zod.ts) typed the symbol, and df3ba164a588 is the objectstack main head carrying it. The pin fired by design. The objectui file is byte-identical to origin/main and untouched by this PR; the identical annotation sits on PR objectui#10915's head 2e09f293e (red at 07:24Z, two docs files), while main 733fd5ac6 (06:50Z), fix(types,cli): element:number validates, with the spec's dataSource waiver (objectui#10872, batch 2) #10908 (07:04Z), docs: cite landing commits where pending changesets and source comments name 23 objectui issues that answer 404, and re-qualify 19 bare objectstack numbers (objectui#10803, batch 6) #10914 (07:08Z) and this branch's previous head (06:40Z) went green against the earlier objectstack main. Every step before 「Type-check objectui against it」 succeeded, so this is a reading and not an infrastructure failure. Consequence: the context is in main's required set, so nothing lands until objectui burns the pin and takes the typed shape (a domain:spec / types card, objectui#3162's ledger row) or objectstack moves again; a bare re-run of this gate will not go green. The verdict below is on the diff.
  2. r2 PR body. Every Round 2 claim read true against the measurements above: the four-case probe and its controls, the 28 / 62 and 27 / 61 counts, the git cat-file -e reading of the pending set, the eleven narrowed faces and the two that still accept children, the inputType refusal at its path, the 2026-09-09 / 2026-09-10 dates, the byte-identical frontmatter, and "three of the four" among PR objectui#5400's deletions (verified in its 1732-file list: 6397, 8499 and the family-D entry are removed there; this PR's own entry is not in it). No line address, no angle bracket. Serial: eleven open PRs now (docs(core): state the ruled reference-day rule on FormulaFunctions TODAY() (objectui#10903) #10915 opened after the r2 body, two files, disjoint); PR objectui#10914's two form.zod.ts hunks sit on the wrapperClass comment and .describe() in InputSchema and on the restatement note in InputShorthandSchema, adjacent to but disjoint from this PR's three hunks, and git merge-tree of the two heads is clean (re-run); fix(types,cli): element:number validates, with the spec's dataSource waiver (objectui#10872, batch 2) #10908 edits zod-mirror-parity.test.ts and index.zod.ts, disjoint. origin/main moved four commits (fix(plugin-view,plugin-dashboard): object-view's non-grid views and a dashboard filter's optionsFrom options re-read on the data-invalidation bus (objectui#10887) #10898, fix(auth): sign-up carries the invitation redirect into the verification mail (objectui#10893) #10904, fix(app-shell)!: SchemaForm resolves a { group } form section instead of crashing, and the form-section types match the spec (objectui#8725) #10902, docs(changeset): date-note six pending entries that PRs #10793, #10802 and #10821 made false (objectui#10877) #10891), none under packages/types or the four changesets.
  3. The family-D AMENDED paragraph ("The two twins are unchanged and go on inheriting body as the content slot") is false on the pending tree. Measured: ChatbotEnhancedSchema and ChatbotFloatingSchema resolve body to undefined on the TypeScript face (through BaseSchema's body?: never), and the family-D test itself pins each twin's mirror refusing body with a message naming requestBody. It was ended by objectui#6771 (6771-retire-body-child-list-dialect.md, pending in this same release), not by this card, and the dev's reading of that is right. Should it ride this PR? Yes, and in this PR rather than a carrier: the round-2 note sits directly under that paragraph and opens "most of the hold-outs above have since been narrowed", so a reader of the CHANGELOG takes the twins' body as the one hold-out that survives — the read-the-paragraph hazard the changeset gate names — and the file is already under this PR's hand with the fact measured. One more note, in the same form, after the AMENDED paragraph: ⚠️ Dated note, 2026-09-28 — the twins no longer inherit body — objectui#6771. Later in this same release objectui#6771 retired body as a child-list spelling on BaseSchema itself, so chatbot-enhanced and chatbot-floating had no content channel left to inherit; each now refuses body by name on both faces and points at requestBody (objectui#9659). The paragraph above is kept as the reading of that amendment. — Not a defect of this diff; the verdict does not turn on it.
  4. 9256-e3-residual-content-channels.md's "no error, no warning, no element" is false in exactly the way this PR's own entry was: measured here for email / password (two of its twelve keys), and by the same acceptsChildren rule for every arm the manifest carries without a children input, which the E3 review found true of all twelve registrations. It is this card's own entry, the identical sentence, and the seat has just corrected it one file over; it should ride this PR as the same in-place wording ("rendered nothing, with no render-time error or warning and no element; only the parser tier's not-a-container warning (objectui#9910) noticed it"). Not a defect of this diff.
  5. Still owed from the prior record: the objectui#5155 sequencing in the PartialSchema docblock and the pin header (closed as a duplicate of finding: JSON doc snippets are checked by nothing — the ts/tsx gate cannot see them, and BaseSchema.passthrough() makes objectui validate accept arbitrary undeclared keys #5250; the open card is spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347) has no carrier yet.

Implemented-by: claude/issue-9256-input-slice
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

…try's render claim worded exactly (objectui#9256)

Prose only; both frontmatter blocks byte-identical.

- 9256-content-channel-family-d: dated note after the AMENDED paragraph.
  objectui#6771 (pending in this release) retired body on BaseSchema, so
  chatbot-enhanced / chatbot-floating refuse body on both faces (TS
  through BaseSchema's body?: never; each mirror by name, naming
  requestBody), which the paragraph's "go on inheriting body" no longer
  describes.
- 9256-e3-residual-content-channels: "no error, no warning, no element"
  becomes the wording this slice's own entry uses. not-a-container was
  measured through validateTree on the live registry for all twelve keys
  (every plugin registration loaded; none declares a children input).

Part of objectui#9256.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3096.1 KB 3104.5 KB
Main entry chunk (gzip) 148.6 KB 350 KB
Entry file index-CXe0iCYr.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.58KB 6.17KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.70KB 2.23KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 557.59KB 133.60KB
core (index.js) 9.93KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 226.44KB 63.00KB
fields (index.js) 261.01KB 66.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.32KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.96KB 14.83KB
plugin-charts (index.js) 83.99KB 22.86KB
plugin-chatbot (index.js) 197.67KB 46.90KB
plugin-dashboard (index.js) 136.93KB 36.48KB
plugin-designer (index.js) 215.03KB 44.21KB
plugin-detail (index.js) 233.48KB 61.79KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 161.21KB 41.41KB
plugin-gantt (index.js) 170.35KB 42.19KB
plugin-grid (index.js) 228.33KB 62.59KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.86KB 28.64KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.17KB 12.20KB
plugin-timeline (index.js) 31.00KB 9.09KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 88.55KB 22.21KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.16KB 39.05KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 7.50KB 3.05KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.16KB 2.71KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.22KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 3.83KB 1.49KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.27KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 876f6d7eab170592343169409aaf9fd272db62e2

Delta review of PR objectui#10907 at the round-3 head, after records 5865087439 (PASS on 72dba894a) and 5865466392 (PASS on 6eb3397b4). Isolated and adversarial; REST reads only; one write, this comment. Read: the r3 PR body, the branch as refs/review/pr-10907, origin/main at 733fd5ac6 (unmoved since the last record), every open PR's file list at its current head, PR objectui#10914's head as refs/review/pr-10914, and the check-runs on the head. The dev's Round 3 section was treated as a claim; every figure below was re-derived. CI on the head, polled every 60 s until settled and read at 2026-09-28T07:54Z: 43 check-runs, 39 success, 3 skipped (dependabot and the two coverage rows), 1 failure. The one red is Spec Main Shape Gate, and its annotation is byte-for-byte the one record 5865466392 attributed: packages/types/src/__tests__/report-chart-query-spec-parity.test.ts, TS1360, 「spec@main shape break (df3ba164a588)」 — objectui#10916's reason (that card is open and pm:dispatched), a file this PR does not touch. Nothing else is red: every other required context is green (Lint, Type Check, Build & E2E, Build Docs, Changeset Declaration, Test, Governed Surface Queue Guard), as are the eight test shards, Test (dist pins), Changeset Bump Policy, Changeset Claim Re-read, Changeset Fixed Group Check, Changeset Overwrite Report, Line Citation Gate and Control Byte Scan; last completion 07:53:45Z. The PR is draft.

① Derived judgments

The delta itself. One commit, 876f6d7ea, whose sole parent is the reviewed head 6eb3397b4 (ancestor: no rebase, no force-push). git diff --stat 6eb3397b4..876f6d7ea is exactly two files under .changeset/, +12 / −2; the only two deleted lines are the E3 entry's reworded sentence. Both frontmatter blocks hash identically at the old and the new head. git diff --stat over packages/ between the two heads is empty: no source, test or pin moved, so every source measurement in the two prior records holds verbatim at this head. git merge-tree onto origin/main is clean.

Item 1 — the second dated note on 9256-content-channel-family-d.md. Every sentence re-measured.

  • TypeScript: BaseSchema declares body?: never; ChatbotEnhancedSchema and ChatbotFloatingSchema (extends BaseSchema, Pick of the plain face) declare only children?: never themselves and resolve body to undefined (compiler API over the sources: 46 and 45 members).
  • zod: each twin's mirror carries body: retirementTombstone(…) whose string opens 「chatbot-enhanced reads NEITHER content channel」 / 「chatbot-floating reads NEITHER content channel」 and says 「The chat API body params go on requestBody, which the registration forwards to the chat runtime」 — so "each mirror by name, with a message pointing at requestBody, the key the registration forwards to the chat runtime" is the string's own words. The family-D test pins the chatbot-enhanced refusal at path body with toContain('requestBody') and the requestBody control, and the eight test shards are green on this head.
  • Provenance, re-read with git log -S on origin/main: the twins' body strings and BaseSchema's body?: never were all introduced by 2acd8e109 (objectui#6771, PR refactor(types,components,sdui-parser): retire the body child-list dialect — children is the one spelling (objectui#6771) #9895, 2026-09-19); the AMENDED paragraph's commit is c42554e94 (objectui#8572, PR feat(types)!: retire ChatbotSchema.body on both published faces (objectui#8572) #9639, 2026-09-17). 6771-retire-body-child-list-dialect.md is pending on main, so "Later in this same release" is true.
  • The dev's correction of my draft is right: objectui#9659's commit 06611e448 (2026-09-17) touched only .changeset/8344-node-recursion-point-redirect.md and the family-D test's comments; it introduced no refusal. Citing objectui#6771 alone is the accurate attribution, and my draft's (objectui#9659) was wrong.
  • Form: dated bold headline naming the card, what holds now, the sentence it supersedes quoted, and a closing "kept as the reading of" sentence — the fix(types,components,docs): correct the texts objectui#6771 left false about body (objectui#8284) #10879 form. One nit, not a defect: unlike PR refactor(plugin-view,plugin-grid,types): retire table.defaultSort / object-grid defaultSort (ADR-0049) #10533's note on 6235-mergedsort-wrap.md, it does not name the superseding entry by file (6771-retire-body-child-list-dialect.md, which states the migration); a reader can find it by the card. Placement directly after the AMENDED paragraph and before round 2's note is right, and round 2's note still reads true beside it.

Item 2 — the E3 entry's render sentence, in place. The new wording is the same as this slice's entry, and it is true for all twelve keys, re-measured here rather than taken from the report: the ten plugin registrations (plugin-grid, -form, -kanban, -map, -tree, -view, -gantt, -calendar, -charts, -detail) and the two input.tsx wrappers declare no children input (0 name: 'children' in each registration site). validateTree, emitted from sdui-parser/src/validate.ts with tsc 6.0.2 and run against a manifest built from those declarations, draws exactly warning: not-a-container for every one of the twelve carrying children (12 / 12), nothing for any of the twelve without it (12 / 12), and nothing for the div control carrying children. acceptsChildren reads only a declared children input, so the result is the rule and not the fixture.

Nothing outside prose moved. Confirmed by the diff.

② Semver level

Unchanged: @object-ui/types: minor with the explicit BREAKING note. The two entries edited in this round keep their declarations (both minor, frontmatter byte-identical), so no bump moves; Changeset Bump Policy, Changeset Declaration, Changeset Fixed Group Check, Changeset Overwrite Report and Changeset Claim Re-read are green on the head.

③ Boundary flags

  1. r3 PR body. Every Round 3 claim read true: the twins' faces and provenance, the twelve-key measurement, the check-changeset-overwrite figure "1 added, 4 modified, 0 deleted", the replaced acceptance note, "three of the four edited here among them (not the E3 entry)" against PR objectui#5400's 1732-file list, "main has not moved since", and "git merge-tree of this head (876f6d7ea) against docs: cite landing commits where pending changesets and source comments name 23 objectui issues that answer 404, and re-qualify 19 bare objectstack numbers (objectui#10803, batch 6) #10914's head is clean" (re-run against 2b3d2061a: clean, base 244d516df). No line address, no angle bracket. Serial at current heads: fifteen open PRs; none touches any of the five changesets or the six source paths except PR objectui#10914's two wrapperClass hunks in form.zod.ts, disjoint from this PR's three. Stale by minutes, not false: PRs docs(agents): port objectstack's model-free commit-trailer rule into the multi-agent section (objectui#9441) #10922 (07:39Z) and test(plugin-detail): gate RelatedList's client-mode sort-button case on the object schema (objectui#10895) #10923 (07:44Z) opened after the body's map was taken and before the body was applied at 07:45Z, and fix(app-shell, plugins): hosted-console UX defects from the 2026-09-28 cloud E2E (six of seven) #10924 after; each is one to thirty-nine files with nothing under packages/types or .changeset/9256-*.
  2. The same overstatement in published refusal strings — a view. Re-counted at the head: the literal 「no error, no warning, no element」 occurs 126 times under packages/types/src/zod (63 tombstone pairs across twelve mirror files), once more split across two lines in neitherContentChannelGuidance (so the 13 helper-fed arms — the E3 twelve and input — publish it at runtime too), and 139 times in the matching TypeScript docblocks under packages/types/src (twelve declaration files, form.ts 27 and data-display.ts 20 the largest). They are false the same way and to the same degree as the two changeset sentences this PR corrected: wherever the registration declares no children input, validateTree's not-a-container did warn, and for a "reads neither" arm that is by construction — a registration declaring a children slot for a renderer that reads none would itself be the objectui#9910 defect. No pin asserts the substring (the family-D, E3 and input pins read NEITHER content channel, What it renders instead: and .describe()-equals-message), so a rewording moves no assertion; but .describe() text and issue messages are published surface, so it is a patch changeset and a card, not a prose commit. The seat should file it rather than leave "carrier: none": one mechanical sweep (the helper sentence, the 126 literals, the 139 docblocks) with the wording this PR settled on, low priority, types seat. It is not this PR's, and the verdict does not turn on it.
  3. Still owed from the first record: the objectui#5155 sequencing in the PartialSchema docblock and the pin header (closed as a duplicate of finding: JSON doc snippets are checked by nothing — the ts/tsx gate cannot see them, and BaseSchema.passthrough() makes objectui validate accept arbitrary undeclared keys #5250; the open card is spec(types)!: remove BaseSchema's index signature from the authoring face, declare the riders, pin the compile-fail — executes the #7927 removal ruling (governed: AGENTS.md #0.1) #8347) has no carrier yet.
  4. Landing. Blocked only by Spec Main Shape Gate, which objectui#10916 owns; this diff cannot move it, and once that card lands on main a re-run of the gate on this head is what remains.

Implemented-by: claude/issue-9256-input-slice
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3096.1 KB 3104.5 KB
Main entry chunk (gzip) 148.6 KB 350 KB
Entry file index-CXe0iCYr.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.58KB 6.17KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.70KB 2.23KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.70KB 10.94KB
auth (createAuthenticatedFetch.js) 8.52KB 3.45KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.13KB 7.95KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 557.59KB 133.60KB
core (index.js) 9.93KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 226.44KB 63.00KB
fields (index.js) 261.01KB 66.28KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.24KB 2.27KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.40KB 12.91KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 39.32KB 11.09KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.01KB 3.93KB
plugin-calendar (index.js) 51.96KB 14.83KB
plugin-charts (index.js) 83.99KB 22.86KB
plugin-chatbot (index.js) 197.67KB 46.90KB
plugin-dashboard (index.js) 136.93KB 36.48KB
plugin-designer (index.js) 215.03KB 44.21KB
plugin-detail (index.js) 233.48KB 61.79KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 161.21KB 41.41KB
plugin-gantt (index.js) 170.35KB 42.19KB
plugin-grid (index.js) 228.33KB 62.59KB
plugin-kanban (index.js) 48.43KB 15.11KB
plugin-list (index.js) 115.86KB 28.64KB
plugin-map (index.js) 22.90KB 7.62KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 44.17KB 12.20KB
plugin-timeline (index.js) 31.00KB 9.09KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 88.55KB 22.21KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.81KB 3.58KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 119.16KB 39.05KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.03KB 1.86KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.78KB 2.09KB
sdui-parser (codegen.js) 7.50KB 3.05KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 6.16KB 2.71KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 18.27KB 6.22KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 3.83KB 1.49KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.26KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 17.15KB 6.32KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.27KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 28, 2026 09:14
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 28, 2026
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 28, 2026
…ts name 23 objectui issues that answer 404, and re-qualify 19 bare objectstack numbers (objectui#10803, batch 6) (objectstack-ai#10914)

Part of objectstack-ai#10803
Clause-②: no

Dispatched implementation of the `domain:ui` seat objectstack-ai#1 claim (comment
`5864334310`) on objectui#10803, batch 6, session
`https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk`. Citations
only: no sentence's claim moves, and every edited pending changeset's
frontmatter is byte-identical. The one runtime string that moves is
`InputSchema.wrapperClass`'s zod `.describe()` text in
`@object-ui/types`, which loses its dead pointer and nothing else
(amendment `5860244997`, Q1 = A; `patch` changeset). No test pins any
changed text: the literal-anchor sweep below finds no specific anchor,
so no test file is edited.

This batch carries the release note `5863776648`'s three lists:
- the last **23 family numbers**;
- the **18 bare objectstack numbers above 10900** from PR
objectui#10892's C0 census, plus **#13086**, a 404 the C0 instrument
cannot see because it shares a token with #13337 (**Premise**);
- the live-but-wrong bare `objectstack-ai#3391` at the two `rowCrudAffordances.ts`
sites beside `objectstack#3720`.

## Why `Part of`, not a closing line

The order says `Part of`. With this PR the family list (all 115 numbers
of amendment `5860244997` Q2) and the C0 above-10900 list both read 0.
Whether the card now closes, or carries the dead `objectstack#N` class
measured in **Acceptance notes** 1, is the seat's call.

## Premise, re-measured on `origin/main` `9f0c84a44` (the branch point)

- **The 23 family numbers.** REST `GET
/repos/objectstack-ai/objectui/issues/N`: 23 of 23 answer 404, and a
second read of each answers 404 again. `GET .../pulls/N` answers 404 for
all 23. Lit controls: objectui#10533 and objectui#7714 answer 200.
- **No new family member.** The distinct `objectui#N` citations in the
two in-scope classes at the branch point, less those at batch 1's head
`6c3ad7c80`, are 24 numbers. Each was read once: 24 of 24 answer 200. So
the family list is still batch 5's 23.
- **#14026 was a sister-repo card written as objectui's.**
objectui#14026 answers 404 as an issue and as a pull. objectstack#14026
answers 301 to objectui#10102, the card it was transferred to. That
card's measurement-round claim (branch
`claude/issue-14026-import-mapping-selector-probe`) is the session of
`ecf14190e`, the commit that added `14026-list-import-mappings-pin.md`,
and six sibling in-scope lines already write `objectstack#14026` for the
same card.
- **C0, the bare-number census** (the instrument of PRs objectui#10875
and objectstack-ai#10892, at the branch point):

```
git grep -hoP '(?:^|(?<=[^\w#&/.\-]))#\d+(?![0-9A-Za-z_])' 9f0c84a -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | sort -u | wc -l
```

- 984 distinct at `9f0c84a44`, against 998 at batch 5's `b2683a2c0`. The
14 that batch 5 re-pointed are gone, and none is new.
- Above 10900 there are 23: the same 5 CSS colours and the same 18
numbers. Each of the 18 answers 404 as an objectui issue and as an
objectui pull on two reads.
- In objectstack, 16 of the 18 answer 200 with the sentence's own
subject (the **C0 mapping** below). #13033 and #13413 answer 404 there
too, as issues and as pulls. Their squash commits exist in objectstack's
history (a full, not shallow, clone): `c459da6bc` "narrow the per-option
`default` key out of the form-view options vocabulary … (#13033)" and
`89448a52b` "remove the inert AUTH_SSO_PROVIDER_SCHEMA export (#13413)".
Both are ancestors of objectstack `main` (`git merge-base
--is-ancestor`, exit 0).
- **The C0 instrument's blind spot.** Its lookbehind refuses a `#`
preceded by `/`, `-`, `.` or `&`. That form (`#A/#B`, `-#N`) carries 109
distinct numbers at the branch point. The 17 that no earlier batch read
were each read once. 16 answer 200. **#13086 answers 404**, as an issue
and as a pull, in objectui and in objectstack. It sits in
`6985-wizard-card-r-alignment.md` as "the #13337/#13086 fence", in the
same token as #13337, so it rides here. objectstack's
`check-yaml-examples.ts` header, at its landing `2ebfe7e9f` (PR
objectstack#13267, which answers 200), reads "Check YAML Examples
(anti-drift for the AUTHORING format, #13086)" and "Ruled 2026-08-29
(#13086)".
- **objectstack-ai#3391.** objectui#3391 answers 200 with an unrelated subject (a
record-header api action placeholder). objectstack#3391 answers 200 as
the apiMethods whitelist contract card ("跟踪:UI 操作按钮与 apiMethods
白名单一致性契约落地"), and objectstack#3720's own title calls itself "objectstack-ai#3391
遗漏的第四个面".
- Every edited changeset is pending: it is present in `.changeset/` on
`main`. The checkout is not shallow.

## Census (the enumeration pin for this batch)

The instrument PR objectui#10854 printed and PRs objectui#10869 / objectstack-ai#10875
/ objectstack-ai#10892 reused, with this batch's 23 numbers substituted (REF = a
commit or tree):

```
git grep -nE '(objectui#|#|issues/)(8072|8127|8137|8204|8229|8248|8307|8408|9231|9241|9244|9365|9373|9375|9542|9553|9585|10117|10119|10120|10129|10132|14026)([^0-9]|$)' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | grep -v 'objectstack#' | wc -l
```

- REF = `9f0c84a44` (branch point): **104** lines.
- One more line is hidden by the `grep -v 'objectstack#'` filter:
`9943-viewtype-totals-page-row-retired.md` names objectui#8127 beside an
`objectstack#` citation.
- So the true population is **105** lines: 28 changeset lines in 26
files, and 77 src lines in 42 files.
- Unfiltered, REF reads 111. The other 6 lines are live
`objectstack#14026` lines.
- REF = `2b3d2061a` (this head): **0**. Unfiltered it reads 7, all live:
the six `objectstack#14026` lines and the re-qualified one.
- This head merged with a fresh `main` (`8522396c0`, `git merge-tree
--write-tree`, clean, tree `f19d17884`): **0**. REF = `8522396c0` alone:
104.
- **C0**, the 19 numbers, bare and not `objectstack#`-qualified: 28
lines in 23 files at the branch point; 0 at this head. At this head C0
reads 966 distinct numbers, and above 10900 only the five CSS colours
are left.
- Lit control, the printed instrument over live objectui#7714 at this
head: 17 lines. Hex-colour false positives (a number followed by a hex
letter) at the branch point: 0.
- **Out of scope, as it stands** (the 23 numbers, filtered, whole tree
at this head):
  - 94 test lines in 36 files;
  - 5 `.github` lines in 1 file (`ci.yml`, objectui#9241);
  - 2 `apps/console` lines in 1 file (`FormPage.tsx`, objectui#8408);
  - 1 line of the root `vitest.config.mts`;
  - 0 scripts, 0 governed, 0 `CHANGELOG.md`.
- For the 19 C0 numbers: 13 test lines in 10 files, and 1 line of
`packages/plugin-tree/README.md`.

## Citation form

- **Landing shas.** The 9-character backticked sha of the commit on
`main` that landed the change the sentence rests on, as in the earlier
batches. All 15 distinct objectui shas below are ancestors of `main`:
`git merge-base --is-ancestor`, exit 0 each. Control legs in the same
checkout: the head of PR objectui#10902 (`496c63c06`) answers exit 1,
and the known ancestor `5f789538d` answers exit 0. `git rev-parse
--short=9` returns the same 9 characters for each.
- **Own-card pointers** in a changeset are dropped, not replaced. The
configured changelog generator (`@changesets/cli/changelog`, per
`.changeset/config.json`) prefixes each released entry with the hash of
the commit that added the file, which is that landing.
- **The claim lived only on the card.** Where the sentence rests on
something that lived only on the dead card, the sha only locates it:
"the card behind SHA".
- **Nothing answers.** The pointer is dropped and the sentence names the
card by role (objectstack-ai#9553 only).
- **Sister-repo numbers.**
- A bare sister-repo number becomes `objectstack#N` after reading it
there.
- "objectstack PR #N" becomes "PR objectstack#N", since the qualifier
now carries the repository. "framework #N", "upstream #N" and "spec #N"
keep their word, as batch 4 kept "framework PR objectstack#6942".
- Where the objectstack pull request itself answers 404, the sentence
cites its commit in that repository as objectstack `SHA`, the spelling
the tree already uses for an objectstack commit ("Measured on
objectstack `9bd4344e4`").
- **Runtime text** carries no sha: see **Special cases** 6.

## Mapping, the 23 family numbers

Lines / files are the branch-point census for that number. "Method" is
how the landing was found; for every source site, `git log -S
'objectui#N' -- FILE` names the commit that wrote the citation, and it
is the landing below unless the row says otherwise.

| dead number | resolution | method | lines / files | why the commit
carries it |
|:--|:--|:--|:--|:--|
| objectstack-ai#8072 | `c974edf14`; own-card pointer dropped; runtime pointer dropped
| changeset's adding commit, subject "(objectui#8072)" | 5 / 3 | it
mirrors `wrapperClass` on `InputSchema`, which is what both comments and
the `7722` changeset say happened |
| objectstack-ai#8127 | `ca3942729`; "the card behind `ca3942729`" twice (**Special
cases** 2) | `git log -S` names `ca3942729` for the first citation in
all 10 source files; `05a49f2ee` (objectui#9880) and `8a7e09fa1` (the
`9943` changeset's landing) wrote three later sentences that cite the
same fix | 17 / 11 | it derives `ViewType` from `@objectstack/spec`
instead of re-declaring it, and its message records the
`page`-degrades-like-a-typo measurement the sentences cite |
| objectstack-ai#8137 | own-card pointer dropped (landing `0fa7a9c83`) | changeset's
adding commit | 1 / 1 | the only site is its own changeset's pointer |
| objectstack-ai#8204 | own-card pointer dropped (landing `580b0fdf4`) | changeset's
adding commit | 1 / 1 | the pointer opened a paragraph as its own
sentence |
| objectstack-ai#8229 | "a separate finding" (changeset); "the finding `8b7ea3945`
reconciled" (`flex.tsx`) | `8b7ea3945`'s message: "Reconciles the third
face objectui#8229 found" | 2 / 2 | the finding lived on the dead card;
`8b7ea3945` is the commit that reconciled it, and it is the `7735`
changeset's own landing |
| objectstack-ai#8248 | own-card label dropped from the second list item (landing
`d02942b0e`) | changeset's adding commit; its message covers
objectui#8458 and objectui#8248 | 1 / 1 | the changeset lists the two
cards its one landing closed |
| objectstack-ai#8307 | `5591f03bd`; own-card pointer dropped | changeset's adding
commit | 11 / 4 | it makes a lane header over a windowed fetch say
`77+`, and it wrote every comment that cites the card |
| objectstack-ai#8408 | own-card pointer dropped; "seam 2 of the card behind
`8241a4400`" | changeset's adding commit; `8241a4400`'s message names no
seams | 2 / 2 | the seam list lived on the dead card |
| objectstack-ai#9231 | `383502b23`; own-card pointer dropped | changeset's adding
commit | 3 / 2 | it gives the create dialog's confirm control its own
accessible name, the rule both `i18n.ts` comments state |
| objectstack-ai#9241 | own-card pointer dropped (landing `250429c8f`) | changeset's
adding commit | 1 / 1 | the only site is its own changeset's heading |
| objectstack-ai#9244 | `bd0995738` | `git log --grep`: its message names the card; it
wrote all three comments | 3 / 2 | it emits one col-span class per
breakpoint tier, not one for the widest |
| objectstack-ai#9365 | own-card pointer dropped (landing `0970a0e00`) | changeset's
adding commit | 1 / 1 | the only site is its own changeset's pointer |
| objectstack-ai#9373 | `c1006ed8e`; own-card pointer dropped | changeset's adding
commit | 2 / 2 | it resolves the inline locale map before the
interpolation options, the `ListView` comment's subject |
| objectstack-ai#9375 | own-card pointer dropped (landing `e427e9c00`) | changeset's
adding commit | 1 / 1 | the only site is its own changeset's pointer |
| objectstack-ai#9542 | `43c0d1710`; own-card pointer dropped; "filed as a separate
card" (**Special cases** 3) | changeset's adding commit; `git log -S`
names it for the `action-button` / `action-icon` comments too | 9 / 6 |
it accepts and resolves an inline `I18nLabel` on `resultDialog` and
makes `ResultDialogSpec` derive its label members |
| objectstack-ai#9553 | nothing answers: "a separate card carried that census" | `git
log --grep` finds only `40f34b4ba`, which points at the card; no commit
lands it | 1 / 1 | see **Special cases** 4 |
| objectstack-ai#9585 | "`ee70287e4`'s pin measures it NOT GATED"; in its own
changeset, "a pin in this change measures it" | no commit names it;
`ee70287e4` adds the test "NOT GATED: the renderer paints the very node
the mirror refuses, without parsing it" | 2 / 2 | see **Special cases**
5 |
| objectstack-ai#10117 | `4c6f549ef`; own-card pointer dropped | changeset's adding
commit | 3 / 2 | it resolves a lookup title candidate in `page:header`
and adds the record-key safety net both comments describe |
| objectstack-ai#10119 | `73a3c89af`; own-card pointer dropped | changeset's adding
commit | 4 / 2 | it makes a nav ancestor's gates reach its subtree and
stops a group outliving its children |
| objectstack-ai#10120 | `80c54122e`; own-card pointer dropped | changeset's adding
commit; for each file `git log -S` names it, or a later commit that
cites its gate: `e0f820246` (objectui#10563) or `b809375ac`
(objectui#10163) | 16 / 13 | it makes a form neither submit nor offer a
field the caller may read but not edit, the FLS half every site names |
| objectstack-ai#10129 | `6cc910b6d`; own-card pointer dropped | changeset's adding
commit | 10 / 5 | it routes a field-backed action param to its record
picker and refuses an unreadable one |
| objectstack-ai#10132 | `061f5e829`; own-card pointer dropped | changeset's adding
commit | 8 / 4 | it makes the two declared-translatable dashboard
surfaces resolve, including the axis `title` forward |
| #14026 | re-qualified `objectstack#14026` | see **Premise** | 1 / 1 |
it is the card the pin's measurement answered |

## Mapping, the 19 bare sister-repo numbers

| number | resolution | what objectstack says | lines / files |
|:--|:--|:--|:--|
| #11289 | `objectstack#11289` ("upstream") | "record:details sections
cannot survive an empty record: `hideEmpty` / `collapsible` /
`showBorder` are honoured by the renderer but undeclared" | 2 / 2 |
| #11662 | PR `objectstack#11662` | "feat(spec): declare hideEmpty /
collapsible / showBorder on record:details sections" | 1 / 1 |
| #12616 | PR `objectstack#12616` | "feat(spec): declare record:details
section headerColor as a closed six-token enum" | 1 / 1 |
| #12718 | PR `objectstack#12718` | "feat(spec): retire preview mode —
the RuntimeMode 'preview' value and the whole PreviewModeConfig block" |
1 / 1 |
| #13033 | objectstack `c459da6bc` | the pull request answers 404; its
squash commit narrows the per-option `default` key out of the form-view
options vocabulary, the ruling `form-spec.ts` says was executed upstream
| 1 / 1 |
| #13337 | `objectstack#13337` | "docs(objectui): layout-dsl teaches
only shapes the live schemas accept" | 1 / 1 |
| #13086 | `objectstack#13267` | the card answers 404; PR
objectstack#13267 landed its ruled YAML-examples gate (see **Premise**)
| the same line |
| #13413 | objectstack `89448a52b` | the pull request answers 404; its
squash commit removes an inert schema export and leaves a note recording
the absence as a choice, the shape the `base.zod.ts` note cites as
precedent | 1 / 1 |
| #13632 | `objectstack#13632` | "[spec] `FieldSchema` accepts a
`lookup`/`master_detail` with no `reference` target …", the card
17.3.0's refinement answered | 3 / 3 |
| #13733 | PR `objectstack#13733` | "feat(spec): wizard view v1 —
declaration-and-refusal tightening of FormViewSchema type:'wizard' (Card
S)" | 1 / 1 |
| #13855 | `objectstack#13855` | the field-grouping decision card whose
option B is a section `group` reference, landed by `39404f3d9` (#13897)
"a layout section can reference a declared field group" | 1 / 1 |
| #13906 | `objectstack#13906` ("framework") | "two more
`computeExecCtx` seams read "failed" and "not wired" as one value …" | 6
/ 3 |
| #14274 | PR `objectstack#14274` | "fix(sdui-parser): refuse an
authored `type` attribute on the html tier …" | 1 / 1 |
| #14945 | `objectstack#14945` | "A flow cannot REFUSE with per-record
text …", honoured by `cca699149` "the flow `end` node honours `outcome:
'refused'`" | 1 / 1 |
| #15469 | `objectstack#15469` ("spec") | "`GanttConfigSchema` is
`strictObject(...).passthrough()` …", landed as `9c270bba0` "close the
gantt/tree config .passthrough() windows … (#15469)" | 2 / 2 |
| #15948 | `objectstack#15948` | "fix(plugin-auth)!: session payload
`positions[]` is the security axis, not the better-auth role scalar" | 1
/ 1 |
| #17493 | `objectstack#17493` | "three residues of #17322's node-door
refusal …", landed as `2c1011b01` "refuse a blank string in a flow
node's predicate slot" | 1 / 1 |
| #20051 | `objectstack#20051` | "judge a flattened view overlay's
top-level `options.KIND` …", whose door half is `6a4aec71d` | 1 / 1 |
| #20160 | PR `objectstack#20160` | "fix(spec): a joined report refuses
a top-level dataset / rows / columns / values, pointing each onto
blocks[]" | 2 / 2 |

The live-but-wrong number: "(`/me/permissions` `apiOperations`, objectstack-ai#3391)"
becomes "… `apiOperations`, objectstack#3391)" at the two
`rowCrudAffordances.ts` sites.

## Special cases (the judgement calls)

1. **#14026 is re-qualified, not dropped as an own-card pointer.** The
card behind `14026-list-import-mappings-pin.md` was never an objectui
card: it was objectstack#14026, now objectui#10102. Dropping the pointer
would lose which hypothesis the pin refuted. Re-qualifying it matches
the six sibling lines.
2. **objectstack-ai#8127, the card by role twice.**
- `CreateViewDialog.tsx`: "one of the sites the card records as
"drifted, …"" becomes "one of the sites the card behind `ca3942729`
records as …". That record lived on the card.
- `plugin-list` `ViewSwitcher.tsx`: "objectui#8127 was filed against the
two in `@object-ui/types`, and the maps below were described there as
total …" becomes "the card behind `ca3942729` was filed against …".
- `normalize-list-view.ts`: "The bug objectui#8127 records" becomes "The
bug `ca3942729` records". That commit's message carries the measurement:
`page` resolved "to exactly what it resolved a typo to".
3. **objectstack-ai#9542 in `8648-ui-action-four-undeclared-keys.md`.**
- The superseded paragraph keeps its pre-landing voice: "so it is filed
as a separate card and ⛔ not guessed at here".
- The superseding paragraph reads "`43c0d1710` landed the derivation".
- "(Noted here by the objectui#9542 seat, …)" becomes "(Noted here by
the seat that landed `43c0d1710`, …)".
4. **objectstack-ai#9553, nothing answers.** `base.zod.ts` said "No count of authored
`events` keys is stated here — objectui#9553 carries that census." No
commit landed that card. `40f34b4ba` only points at it, and the
`AGENTS.md` fix `7550728a6` names a different card. So the sentence now
reads "— a separate card carried that census". The census is not
restated, per AGENTS.md objectstack-ai#9.
5. **objectstack-ai#9585, the measurement's instrument.** The card measured the render
path NOT GATED, and no commit names it. But the commit that wrote both
citing sentences, `ee70287e4`, adds a pin that re-measures exactly that:
"NOT GATED: the renderer paints the very node the mirror refuses,
without parsing it".
- `disclosure.ts` now reads "(`ee70287e4`'s pin measures it NOT GATED)".
- Its own changeset, `8236-collapsible-open-intercept-retire.md`, whose
landing is `ee70287e4`, reads "(a pin in this change measures it NOT
GATED)".
6. **The runtime string.** Only the listed text moves.

| file | member | before | after |
|:--|:--|:--|:--|
| `types/src/zod/form.zod.ts` | `InputSchema.wrapperClass` `.describe()`
| "Classes on the wrapper div around the input and its label
(objectui#8072)" | "Classes on the wrapper div around the input and its
label" |

No test, doc or changeset quotes it: a whole-tree search for the old
string returns only the source line.
7. **objectstack-ai#8229 in `flex.tsx`.** "(objectui#8229, folded into objectui#7735's
ruling)" becomes "(the finding `8b7ea3945` reconciled, folded into
objectui#7735's ruling)". objectui#7735 answers 200 and stays.
8. **#13413's sentence.** "Precedent of the same shape:
objectstack#12009 / PR #13413." becomes "… objectstack#12009 /
objectstack `89448a52b`." objectstack#12009 answers 404 too, but it is a
qualified sister-repo number outside this batch's lists, so it is left
and listed (**Acceptance notes** 1).
9. **#20160 across a line break.** In
`10746-joined-report-clears-binding.md`, "(objectstack PR" ends one line
and "#20160: …" opens the next. They become "(PR" and
"objectstack#20160: …".

## The literal-anchor sweep (both test-pin classes, ruling `5861900779`)

- **Instrument.** Every string, template, numeric and regex literal in
all 4068 tracked test and script files (119016 distinct literals),
parsed with TypeScript.
- **Candidate filter.** A literal is a candidate only if it matches the
diff's removed lines with two lines of context, raw or
comment-flattened. That leaves 2839.
- **Test applied to each candidate.** Does its occurrence count DROP
between `9f0c84a44` and `2b3d2061a` in any of the 92 files this PR
changes, in raw text or in a comment-flattened form? 229 distinct
literals drop.
- **Every one is a generic token.** Digits and short numbers,
punctuation, single letters, `objectui#`, `objectui#1`, and whole-tree
scanners such as `/#\d+/` and `/objectui#\d+/`. The three `objectui#\d+`
matchers (`ActionRunner.disabledGate`, `registry-inputs-spec-parity`,
`catalog-gallery-render`) assert over their own test data and read no
changed file.
- **No specific anchor.** None is a batch number, a changed phrase, or
the changed `.describe()` string. So no test pins changed runtime text
(class one), and no source-reading test pins a changed comment or
docblock citation (class two).
- Test titles and comments that name these numbers are out of the card's
classes and stay (**Census**, out of scope).

## Held

**By the serial rule: nothing.** Re-mapped before the push, on 9 open
PRs: objectui#10910, objectstack-ai#10908, objectstack-ai#10907, objectstack-ai#10906, objectstack-ai#10901, objectstack-ai#10891, objectstack-ai#10777,
objectstack-ai#10278 and the release PR objectstack-ai#5400 (objectstack-ai#10902 and objectstack-ai#10904 had merged since the
claim).

Two of them share files with this PR. Their hunks were read against
their merge-bases; each file is identical at its merge-base and at
`9f0c84a44`, so the lines map directly.
- **objectui#10907, `types/src/zod/form.zod.ts`.** It inserts a refusal
constant before `InputSchema`, two tombstone members further down
`InputSchema`, and a comment in the `InputShorthandSchema` arm. This
PR's three edited lines (the `wrapperClass` comment and description, and
the arm's "shrank that row" comment) sit outside every one of its hunks
and their 3-line context.
- **objectui#10906, `metadata-admin/i18n.ts` and
`previews/ViewPreview.tsx`.** Its `i18n.ts` insertions are far from the
two `createDraft` comments, and its `ViewPreview.tsx` hunks are far from
the `options` fold docblock.

Trial merges with this head (`git merge-tree --write-tree`):
- clean for objectstack-ai#10910, objectstack-ai#10908, objectstack-ai#10907, objectstack-ai#10906, objectstack-ai#10901, objectstack-ai#10891 and objectstack-ai#10777;
- objectstack-ai#10278 (`eab4c8e52`) conflicts in `ObjectGrid.tsx`,
`plugin-grid/README.md` and `content/docs/plugins/plugin-grid.mdx`, and
conflicts identically against `9f0c84a44` alone;
- objectstack-ai#5400 (Version Packages) regenerates and is not a hold.

objectui#10891 shares no file with this PR.

## Changesets

- `.changeset/10803-dead-citation-sweep-sixth-batch.md`, EMPTY
frontmatter. It covers the comment-only edits in 15 released packages;
no published behaviour changes through them. It points at the second
file for `@object-ui/types`' runtime text.
- `.changeset/10803-sixth-batch-runtime-strings.md`,
`'@object-ui/types': patch`: the `wrapperClass` description loses its
pointer. No key, path, issue code, accept set, refusal or severity
moves.

## Proof of prose-only (C4), against `9f0c84a44`, on this head
`2b3d2061a`

- **Source.** Each of the 53 touched `.ts` / `.tsx` files was parsed at
`9f0c84a44` and at this head with TypeScript 6.0.3's `createSourceFile`,
and re-printed by `createPrinter({ removeComments: true })`.
  - 52 of 53 prints are identical.
- `form.zod.ts` is equal once the one listed substitution (**Special
cases** 6) is applied to the base print, matched once.
  - 0 parse diagnostics.
- Lit controls on the same instrument: editing a string literal moves
the print; re-spacing a comment does not.
- **Changesets.** The frontmatter block of every one of the 37 edited
changesets is byte-identical at `9f0c84a44` and this head (37 of 37, by
md5). The overwrite gate below agrees.
- **Scope of the diff:** 92 files, +175 / −140. That is 37 edited and 2
new changesets, and 53 non-test source files in 15 released packages. No
test file.

## Gates, on this head `2b3d2061a`

Each line is the gate's own verdict and exit code, captured by
redirect-then-`$?`.

- `node scripts/check-changeset-presence.mjs`, exit 0: "53 source
file(s) of 15 released package(s) changed, and this change declares 2
changeset(s): .changeset/10803-dead-citation-sweep-sixth-batch.md,
.changeset/10803-sixth-batch-runtime-strings.md."
- `pnpm changeset:check`, exit 0: "All workspace packages are in the
changeset fixed group." / "No changeset declares a `major` bump."
- `node scripts/check-changeset-overwrite.mjs` (report-only), exit 0: "2
changeset(s) added, 37 modified, 0 deleted". `declared at base` equals
`declares now` for 37 of 37.
- `pnpm check:changeset-claims` (report-only), exit 0:
- "Every one of those 1 address(es) either names the tree it was read
from, or points at a line this change does not move";
- "Every package declared across those 31 body(ies) is either not
negated …";
- the standing notice "75 pending changeset(s) describe a file this
change touches".
- Read against the diff: a pending changeset quoting a replaced pointer
would itself carry the dead number and sit in the census, which reads 0.
No pending changeset quotes the changed description.
- `pnpm check:control-bytes`, exit 0: "check-control-bytes: OK (scanned
9178 tracked text file(s); skipped 85 binary)."
- `pnpm check:new-line-citations`, exit 0: "VERDICT
new-cross-file-line-citations: 0 new citation(s), enforcement
report-only -> exit 0".
- `pnpm check:pending-changeset-literals`, exit 0: "No test source names
a pending changeset."
- Also run over the touched comments:
  - `pnpm check:installed-pin-claims`, exit 0 ("OK");
- `pnpm check:comment-mask-corpus`, exit 0 (1 disagreeing file, within
the ceiling objectui#7882 holds open);
- `pnpm check:handler-key-reads`, exit 0 ("every judged read is a
declared member of it").
- The governed-surface predicate over the 92 paths, exit 0: "NOT
GOVERNED — 92 path(s) checked against 5 governed surface(s); none
matched." Lit control `AGENTS.md`: exit 3.

**Tests**, through the shared verify lock, on `2b3d2061a`. Each is
`VERDICT command-exit 0`.
- `scripts/__tests__/`, the whole directory, whose whole-tree scanners
read the touched files: `Test Files 177 passed | 2 skipped (179)`,
`Tests 5322 passed | 2 skipped (5324)`. The two skipped files are the
network-escape fixtures that run only as a child.
- `packages/types/`, the whole package, whose runtime text moved: `Test
Files 264 passed (264)`, `Tests 5854 passed (5854)`. `pnpm --filter
@object-ui/types type-check`, exit 0.
- **The pins nearest the re-pointed text:**
- in `types`: `input-wrapper-class-mirrored-8072`, `zod-mirror-parity`,
`wrapper-class-declared-7722`, `zod-mirror-authors-no-defaults-7735`,
`collapsible-open-refusal-8236`, `tree-view-config-readers-8253` and
`layout-default-jsdoc-7361`;
- in `components`: `collapsible-open-intercept-8236`,
`registration-defaults-match-renderer-8229` and
`action-undeclared-keys-8648`;
- in `plugin-view`: `ViewSwitcher` and
`ViewSwitcher.viewTypeTotalsBothLegs-9943`;
  - in `plugin-kanban`: `laneCountHonesty-8307`;
  - in `plugin-grid`: `rowCrudAffordances` and `rowCrudEffectiveOps`.
  - Result: `Test Files  15 passed (15)`, `Tests  381 passed (381)`.
- No red leg: the sweep found no anchor to move, so there is no pin
whose old copy should fail.

**Declared narrowing.** NOT MEASURED locally:
- the full suites and type-check of the 14 other touched packages, and
eslint.
- Reason: the comment-stripped syntax tree of 52 of 53 touched source
files is identical to `main`, and the 53rd differs only by the listed
literal.
- CI runs the full farm.

## Acceptance notes

1. **A sister-repo class of the same defect: 30 `objectstack#N`
citations answer 404 in objectstack.**
- **Measurement.** Every distinct `objectstack#N` in the two in-scope
classes at the branch point is 359 numbers. Each was read once: 328
answer 200, 1 answers 301 (objectstack#14026 to objectui#10102), and 30
answer 404, each confirmed by a second read.
- **The 30:** objectstack-ai#5970 objectstack-ai#5976 objectstack-ai#6038 objectstack-ai#6124 objectstack-ai#6281 objectstack-ai#6331 objectstack-ai#6450 objectstack-ai#6483 objectstack-ai#6515
objectstack-ai#9933 objectstack-ai#9934 objectstack-ai#10354 objectstack-ai#10485 objectstack-ai#10695 #11330 #11507 #11513 #11658 #11703
#11753 #11846 #12009 #12868 #13117 #13670 #16126 #17147 #17762 #17987
#18012.
- **Sites at this head:** 82 lines in 63 files, 26 of them changeset
lines.
- **Three of them sit in sentences this PR edits, and are left as they
are:**
- objectstack#11846, "(objectstack#11846, landed as PR
objectstack#12718)" in `6748-preview-mode-provenance-ratchet.md`;
     - objectstack#12009, in `base.zod.ts`'s precedent line;
- objectstack#12868, in `form-spec.ts`'s "RULED 2026-08-28
(objectui#6263 / objectstack#12868, …)".
- **Why left.** They were not in this batch's lists, and the class is
the seat's to scope. objectstack's own card for dead tracker citations
in its tree is objectstack#19123, whose landing `66e266c93` counts
#12868 among the dead numbers it measured. Triage item 3 would put a
dead number in these classes on this card. The fix shape measured here
for such a number is the objectstack commit, as with `c459da6bc`.
2. **The rest of the bare `objectstack-ai#3391` population.** Only the two sites the
claim names were re-qualified. 28 more in-scope lines in 10 files write
the apiMethods whitelist card as a bare `objectstack-ai#3391`, which resolves to the
unrelated objectui#3391:
   - `ObjectDataPage.tsx`, `ObjectView.tsx` (app-shell);
   - `managedBy.ts`;
- `MePermissionsProvider.tsx`, `PermissionContext.ts`,
`PermissionProvider.tsx`;
   - `fieldWriteGate.ts`;
   - `ImportWizard.tsx`, `ObjectGrid.tsx`;
   - `ListView.tsx`.

It is live, not a 404, so it is outside the family pin. Two of those
lines pair it with a bare 3546 that means objectstack#3546 ("detail/form
面的 edit/delete 按钮接入服务端 effective 操作集"), while objectui#3546 is an
unrelated i18n card. Carrier: none.
3. **A stale claim beside a re-pointed sentence.** The same
`base.zod.ts` paragraph says "AGENTS.md's abridged protocol sketch shows
`events?: Record…` and its action-system commandment authors one".
`7550728a6` removed both from `AGENTS.md`, so that sentence is now
false. It is not a citation, and this PR does not touch it. Carrier:
none.
4. **The C0 blind spot, for any later census.** The bare-number
instrument's lookbehind hides a number written after `/`, `-`, `.` or
`&` (`#13337/#13086`, `-objectstack-ai#2231`). This batch read the 17 such numbers no
batch had read, and #13086 was the only 404. A later census can narrow
the lookbehind to refuse only a word character, `#` or `&` before the
`#`, and drop URL fragments by hand.
5. **Filenames are not citations.** Pending changeset and test FILENAMES
carry several of these numbers. They stay, as in PRs objectui#10707,
objectstack-ai#10797, objectstack-ai#10854, objectstack-ai#10869, objectstack-ai#10875 and objectstack-ai#10892.

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

Co-authored-by: Claude <noreply@anthropic.com>
Merged via the queue into main with commit 7e8b3c0 Sep 28, 2026
45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-9256-input-slice branch September 28, 2026 09:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants