Skip to content

docs(citations): re-point the last dead bare objectstack numbers and re-qualify objectstack#3546 (objectui#10803, batch 8) - #11012

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10803-dead-citations-eighth-batch
Sep 28, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10803-dead-citations-eighth-batch

Conversation

@objectstack-fleet

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

Copy link
Copy Markdown
Contributor

Fixes #10803
Clause-②: no

Dispatched implementation of the domain:ui seat #1 claim (comment 5873413663) on objectui#10803, batch 8, session https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk. Citations only: no sentence's claim moves, the one edited pending changeset keeps a byte-identical frontmatter, and no runtime string moves, so the only new changeset is an empty-frontmatter sweep. No test pins any changed text (The literal-anchor sweep), so no test file is edited.

This batch carries release 5872268200's two lists (the seat's ruling A in ACCEPT 5870953708, which review 5870922323 read the same way):

  • the 10 in-class lines that cite a dead objectstack number written bare: #9934 seven times, "PR #6281" twice, "objectstack PR #8452" once;
  • the 6 live-but-wrong #3546 lines that mean objectstack#3546: five written bare, one written with this repository's name.

Numbers are written in code spans in this body when they are the dead or wrong spelling, so GitHub does not link them to the unrelated objectui items they would resolve to.

Why Fixes

Both lists read 0 after this batch (Census), and the closure census over the card's two classes (pending .changeset/*.md prose and non-test packages/*/src) finds nothing else dead:

  • Bare numbers, batch 7's instrument (printed under Census): 965 distinct at the branch point, 961 at this head. The 916 between 100 and 25000 at the branch point were each read once as objectstack issues: 877 answer 200 and 39 answer 404. The 39 were read again as objectstack issues and as pulls (404 each) and as objectui issues (200 each). Three of them are this batch's (#9934, #6281, #8452), gone at this head. The other 36 remain, and each sentence was read: every one cites an objectui card or pull request, and each answers 200 in objectui with the subject its sentence names.
  • The instrument's blind spot (a number written after /, - or ., as in objectui#9469/#8649): 46 numbers between 100 and 25000 appear only in that form at this head. Read as objectstack issues: 45 answer 200; one answers 404, #8649, which sits in two lines as objectui#9469/#8649 and means objectui#8649 (200).
  • Qualified citations at this head: every distinct objectui#N and objectui issue or pull URL (2723 numbers) answers 200; every distinct objectstack#N and objectstack issue or pull URL (345 numbers) answers 200, except objectstack#14026, which answers 301 (transferred to objectui#10102, re-qualified by batch 6).

So nothing dead is left in the card's classes, and nothing in them resolves to the wrong repository as far as these instruments see. Acceptance notes 1 and 2 record what is outside the classes, and what could not be measured.

Premise, re-measured on origin/main 665025908 (the branch point)

Census (the enumeration pin for this batch)

The two lists (REF = a commit or tree):

git grep -nP '(?:^|(?<=[^\w#&/.\-]))#(9934|6281|8452|3546)(?![0-9A-Za-z_])' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | wc -l
git grep -n 'objectui#3546' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' ':!packages/i18n/src/locales/**' | wc -l
REF bare four objectui#3546 outside the locale packs
665025908 (branch point) 15: #9934 7, #6281 2, #8452 1, #3546 5 2: the plugin-detail line and the i18n card's own line in 3880-es-done-listo.md
8fe632d96 (this head) 0 1: the 3880-es-done-listo.md line, which is the i18n card and stays
  • Lit controls at this head: objectstack#3546 reads 10 lines against 3 at the branch point (the 6 re-qualified here, and one in this PR's sweep changeset); the 96 objectui#3546 lines in the locale packs are unchanged.
  • The bare-number instrument, batch 7's (the census of Why Fixes):
git grep -hoP '(?:^|(?<=[^\w#&/.\-]))#\d+(?![0-9A-Za-z_])' REF -- '.changeset/*.md' 'packages/*/src/**' ':!**/__tests__/**' ':!**/*.test.*' ':!**/*.spec.*' ':!**/test/**' ':!**/tests/**' | sort -u | wc -l

965 at the branch point, 961 at this head: exactly #3546, #6281, #8452 and #9934 are gone, and nothing is new. The blind-spot reading replaces the lookbehind class with [^\w#&].

Citation form

  • An objectstack commit is written as batches 6 and 7 wrote their stand-ins: objectstack and the 9-character backticked sha of the commit on objectstack main that landed the change the sentence rests on.
  • A bare #3546 becomes objectstack#3546, including inside the [#3546] tags that open four comments; the one written with this repository's name is re-qualified the same way.

Mapping

site before after
.changeset/7980-agent-key-envelope-read.md "(the #9934 channel, whose presence is the marking)" "(the objectstack 79c46da90 channel, …)"
app-shell index.ts, the note above the readEnvelopeFailureText export "(the #9934 channel, which rides through the 5xx prose withhold untouched)" "(the objectstack 79c46da90 channel, …)"
app-shell utils/apiErrorEnvelope.ts, the userMessage bullet "the END USER (#9934)" "the END USER (objectstack 79c46da90)"
app-shell utils/apiErrorEnvelope.ts, the errorFromThrown bullet "… has emitted the channel since #9934" (a quotation) "… has emitted the channel since [objectstack 79c46da90]" (Special cases 1)
app-shell PackageFormDialog.tsx, readEnvelopeUserMessage's docblock "(error.userMessage, #9934)" "(error.userMessage, objectstack 79c46da90)"
app-shell StudioDesignSurface.tsx, the package-switcher failure read "the producer's #9934 channel" "the producer's channel (objectstack 79c46da90)"
app-shell packages-io.ts, duplicatePackage's failure arm "has emitted since #9934" "has emitted since objectstack 79c46da90"
components containers.tsx, the PageCardRenderer body read "objectstack#5775 (PR #6281, ADR-0087 D2)" "objectstack#5775 (objectstack 85ec26d28, ADR-0087 D2)"
components containers.tsx, the card registration's children input "objectstack#5775 (PR #6281)" "objectstack#5775 (objectstack 85ec26d28)"
plugin-grid hooks/useRecordCrudVerdicts.ts "shipped in objectstack PR #8452" "shipped in objectstack 27358d517"
app-shell RecordDetailView.tsx, two comments "[#3546] …" "[objectstack#3546] …"
app-shell RelatedRecordActionsBridge.tsx "[#3546] Intersect the child object's …" "[objectstack#3546] …"
plugin-detail renderers/record-details.tsx "[#3546] Also AND inline-editability …" "[objectstack#3546] …"
plugin-form fieldWriteGate.ts "#3546 intersects that with the server's effective API operation set" "objectstack#3546 intersects …"
plugin-detail index.tsx, the inlineEdit input comment "(objectui#3546)" "(objectstack#3546)"

Each #9934 sentence is about the userMessage channel that 79c46da90 added; each #6281 sentence is about the page:card body retirement that 85ec26d28 carries; the #8452 sentence is about the batch recordIds form that 27358d517 shipped.

Special cases (the judgement calls)

  1. A quotation. The apiErrorEnvelope.ts bullet quotes the note beside sendThrownError in objectstack's packages/rest/src/package-routes.ts, verbatim. That note still reads "since finding(ci): every push silently removes needs:contract-review — the label objectui's own merge-queue guard treats as its exit-6 stop sign #9934" on objectstack main (e956924 at the time of this PR); there the number means objectstack's card, which answers 404, and here it resolves to the unrelated objectui item. The quote keeps its words and takes the commit in square brackets, the editorial mark for a substituted word. The note's claim is the one 79c46da90 carries: its http-dispatcher.ts hunk adds the userMessage spread to the dispatcher door's extra.
  2. Line breaks moved only where the stand-in made a line markedly longer: app-shell index.ts, StudioDesignSurface.tsx and packages-io.ts. Elsewhere the one line just grows, as batch 7's objectstack#3391/objectstack#3546 lines did.
  3. Wording kept. "the #9934 channel" becomes "the objectstack 79c46da90 channel" in two places, and "the producer's channel (objectstack 79c46da90)" in StudioDesignSurface.tsx, where "the producer's objectstack … channel" would read as if the producer were objectstack. No other word moves.

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

  • Instrument. Every string, template and regex literal in the 4108 tracked test and script files (104609 distinct strings, 2339 regexes), read with the TypeScript scanner.
  • Test. Does its occurrence count DROP between 665025908 and this head in any of the 14 changed files, raw or comment-flattened?
  • Result. 30 distinct literals drop, every one generic: digits, punctuation, whitespace and character classes (#\d+, \d{3}, [:#], \s+), the bare words objectui and objectui#, /objectui#\d+/, and comma-and-line-break fragments. None is a changed phrase, a dead number or a #3546 tag. A search of tests for the changed spellings finds them only in test doc comments (listed in Acceptance notes 1), which no assertion reads.

Held

By the serial rule: nothing. Open PRs were mapped at the branch point before the first edit (7 open) and again before the push (7 open; objectui#11003 and #10997 have since merged, and objectui#11010 and #11006 have opened).

Changesets

  • .changeset/10803-dead-citation-sweep-eighth-batch.md, EMPTY frontmatter. It covers the comment-only edits in 5 released packages (app-shell, components, plugin-detail, plugin-form, plugin-grid) and the one edited pending changeset; no published behaviour changes through them. It writes no bare number itself.
  • No runtime string moves, so there is no patch changeset (amendment 5860244997 Q1 = A applies to none of these lines: the plugin-detail index.tsx line is a comment beside the inlineEdit input, not its description string).

Proof of prose-only (C4), against 665025908

  • Source. Each of the 12 touched .ts / .tsx files was parsed at 665025908 and at this head with TypeScript 6.0.3's createSourceFile, and re-printed by createPrinter({ removeComments: true }): 12 of 12 prints are identical, with 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 .changeset/7980-agent-key-envelope-read.md is byte-identical at 665025908 and this head (md5); the overwrite gate below agrees.
  • Scope of the diff: 14 files, +39 / −20: 1 edited and 1 new changeset, and 12 non-test source files in 5 released packages. No test file.

Gates, on this head 8fe632d96

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

  • node scripts/check-changeset-presence.mjs, exit 0: "12 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s): .changeset/10803-dead-citation-sweep-eighth-batch.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: "1 changeset(s) added, 1 modified, 0 deleted"; for the modified one, declared at base equals declares now ("@object-ui/app-shell: minor, @object-ui/console: patch").
  • pnpm check:changeset-claims (report-only), exit 0: "Every package declared across those 1 body(ies) is either not negated …", and the standing notice "15 pending changeset(s) describe a file this change touches". Read against the diff: a pending changeset quoting a replaced spelling would carry a bare number the census sees, and the census reads 0 in .changeset/.
  • pnpm check:control-bytes, exit 0: "check-control-bytes: OK (scanned 9291 tracked text file(s); skipped 85 binary)." A grep -P control-byte self-scan of the 14 files finds none.
  • 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, on the tree this head carries: pnpm check:spec-symbols exit 0 ("spec member citations: 1424 sources + 184 documentation pages; nothing cites a key its spec symbol does not declare."); 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); node scripts/check-hand-rolled-comment-mask.mjs exit 0 ("OK every carrier is a DEBT entry, and every DEBT entry still carries one."); pnpm check:handler-key-reads exit 0 ("every judged read is a declared member of its arm").
  • The governed-surface predicate over the 14 paths, exit 0: "NOT GOVERNED — 14 path(s) checked against 5 governed surface(s); none matched." Lit control AGENTS.md: exit 3.

Tests and type-check, through the shared verify lock, on 8fe632d96.

  • scripts/__tests__/, the whole directory, whose whole-tree scanners read the touched files and changesets: Test Files 177 passed | 2 skipped (179), Tests 5350 passed | 2 skipped (5352), VERDICT command-exit 0.
  • packages/components/, plugin-detail/, plugin-form/ and plugin-grid/, whole packages, in one run: Test Files 847 passed | 2 skipped (849), Tests 8441 passed | 33 skipped (8474), VERDICT command-exit 0; the source files were byte-identical to this head's.
  • packages/app-shell/, whole package: Test Files 1 failed | 863 passed | 1 skipped (865), Tests 1 failed | 8835 passed | 9 skipped (8845). The one failure is AppContent.inaccessibleAppStrand.test.tsx, 'bounces to the DECLARED landing where the deployment declares one', a network-escape guard trip (a real socket at localhost:3000/api/v1/meta) under the full suite on a shared box. That file is not in this diff, and C4 shows no code token moves; re-run alone three times on this head it reads Tests 6 passed (6) each, and the CI test shards are green on this head.
  • Type-check: turbo run build of the 28-package dependency closure (Tasks: 28 successful, 28 total), then pnpm --workspace-concurrency=2 with the 5 package filters run type-check: 5 script echoes, 5 Done, VERDICT command-exit 0.
  • No red leg: the sweep found no anchor to move, so there is no pin whose old copy should fail.

CI on 8fe632d96: 43 check-runs, 39 success, 3 skipped, 1 failure; Spec Main Shape Gate success. The failure is Bundle Analysis, step "Check console performance budget", which fails the same way on main at this PR's branch point 665025908 and at d6d8fb9d7 and 2049b03df after it; this diff moves no code token.

Acceptance notes

  1. Outside the card's two classes, as it stands (whole tree at this head, bare spelling): #9934 in 3 test doc-comment lines in 2 files and in 1 apps/console source line (AgentConnectSection.tsx, "the finding(ci): every push silently removes needs:contract-review — the label objectui's own merge-queue guard treats as its exit-6 stop sign #9934 channel"); #6281 in 1 test doc-comment line; #8452 in 1 test doc-comment line; bare #3546 in 23 test lines in 14 files and 19 published CHANGELOG.md lines in 8 files. apps/console, tests and CHANGELOG history are outside the classes this card carries (triage 5858031244; release 5861553562: recorded, not carried).
  2. Not measured: framework#N and cloud#N. The two classes also cite 82 distinct framework#N and 43 distinct cloud#N numbers. Neither repository is on this card's lists, and both answer 403 through this container's proxy, so no reading of them is offered.
  3. Left as the brief allows. The two test comments that call objectui#8652 pm:blocked (it reads pm:on-hold) and batch 7's sweep-changeset phrase "declared separately below" are in files this PR does not touch, and stay.

Generated by Claude Code

…re-qualify objectstack#3546 (objectui#10803, batch 8)

Batch 8 of the family closure card, the last two lists of release
5872268200 (seat ruling A in ACCEPT 5870953708):

- ten in-class lines that cited a dead objectstack issue or pull
  request by a bare number now cite the landing commit in objectstack:
  the userMessage channel (seven lines) -> objectstack 79c46da90; the
  page:card body retirement pull request (two lines, containers.tsx)
  -> objectstack 85ec26d28; the batch recordIds pull request
  (useRecordCrudVerdicts.ts) -> objectstack 27358d517. The one inside a
  quotation of an objectstack source comment takes the commit in square
  brackets.
- six comment lines that meant objectstack's detail/form effective
  operation set card (five bare, one written objectui#3546) now read
  objectstack#3546.

Comment and pending-changeset prose only: every touched .ts/.tsx prints
identically with comments removed, and the edited changeset keeps its
frontmatter byte-identical. One empty-frontmatter sweep changeset.

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

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 15 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/10612-form-arms-managed-lock.md

  • names fieldWriteGate.ts → packages/plugin-form/src/fieldWriteGate.ts — edited by this change

    Clause-②: no. No exported symbol, type or prop changes. The shared step lives in fieldWriteGate.ts, an internal module that index.tsx does not re-export. What changes is which inputs the drawer, modal, tabbed, split and wizard layouts draw enabled.

.changeset/6238-object-payload-enabled.md

  • names packages/app-shell/src/index.ts → packages/app-shell/src/index.ts — edited by this change

    No published type changed. ObjectMetadataPayload is exported from its module but that module is not re-exported by packages/app-shell/src/index.ts, the package's only entry, so the removed enabled?: boolean was never on the published surface and no **/src/index.ts is touched. What consumers can observe is behaviour: MetadataService is reachable through the published useMetadataService() hook, both method signatures are unchanged (PromiseANGLE-BRACKETS(void)), and the HTTP request they issue changes from a PUT with a body to a DELETE.

.changeset/6559-expression-user-input-contract.md

  • names packages/app-shell/src/index.ts → packages/app-shell/src/index.ts — edited by this change

    WHAT BREAKS, AND FOR WHOM. This tightens a signature published from the package entry (packages/app-shell/src/index.ts), so an external caller that passes an unchecked or under-declared value stops compiling on upgrade. That is accepted (maintainer ruling 2026-08-27, option A): the only calls it refuses are calls that were never conformant with the contract the module already declared. It ships as minor, not major — objectui's major tracks @objectstack's, so its own breaking changes ship as a minor with the break written down (scripts/check-changeset-no-major.mjs). ⛔ Keeping unknown and ⛔ adding a second, wider entry point were both declined.

.changeset/6681-declared-lazy-marketplace-routes.md

  • names views/studio-design/StudioDesignSurface.tsx → packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx — edited by this change

    Both marketplace chunks were held by CHUNK CO-TENANCY, not by any import of the page: rolldown had parked components/SuggestedBindingsPanel.tsx (statically imported by the eager views/studio-design/StudioDesignSurface.tsx) in the first, and console/marketplace/InstalledListWidget.tsx (bare-imported by the package barrel for its SDUI registration) in the second. An app-shell-eager-leaves group in apps/console/vite.config.ts isolates those co-tenants so the three declared-lazy pages chunk by their own dynamic-only reachability. The console eager closure moves 3180.2 KB → 3171.5 KB gzipped (−8,888 bytes, 48 → 45 eager chunks) with the three per-chunk ceilings unmoved.

.changeset/6771-retire-body-child-list-dialect.md

  • names renderers/layout/containers.tsx → packages/components/src/renderers/layout/containers.tsx — edited by this change

    Non-rendering readers keep their arm on the same rule, and none of them renders anything: while a renderer still reaches stored body content, a reader that must see the SAME content keeps its arm, or the renderer draws what the reader cannot find. Those are the two tab-subtree walkers in renderers/layout/containers.tsx, app-shell's pageSchemaIntrospect (CONTAINER_KEYS) and PageBlockInspector (STRUCTURAL_PROP_KEYS, the inspector half of a stored properties.body), and the CLI's OBJECTUI_STRUCTURAL_KEYS — a file-IDENTIFICATION marker, where keeping body is what lets an old file still be recognised as an ObjectUI node and therefore refused, instead of silently not judged.

.changeset/7182-declared-action-ids-one-rule.md

  • names containers.tsx → packages/components/src/renderers/layout/containers.tsx — edited by this change

    New on @object-ui/types, beside actionRendersAt: the pure resolveDeclaredActionIds(elements, registeredActions), with the DeclaredActionsResolution / DeclaredActionsRefusal result types (the shape classifier stays module-internal: called with no registry, the function already returns the registry-independent verdict a renderer needs before its lookup). Both renderers call it; the whole-array switch in record-quick-actions.tsx and the per-element normalisation in containers.tsx are gone. The rule is closed: a string is an id, a non-null non-array object is an inline definition, and any other element (null, a number, a nested array) is refused at its index too. An all-id array resolves by name in authored order, first registration winning on a duplicate name; ids that name nothing are reported back with their index for the caller to warn about once its lookup has settled.

.changeset/7979-package-form-dialog-envelope-reader.md

  • names utils/apiErrorEnvelope.ts → packages/app-shell/src/utils/apiErrorEnvelope.ts — edited by this change

    The read now comes from the one shared rule, readEnvelopeFailureText (utils/apiErrorEnvelope.ts), which prefers the mark over the diagnostic and appends the declared code behind whichever prose won. Create and edit are exactly where an author meets a refusal that names what to fix — a namespace rule, a version already published — and in the 5xx band the door substitutes the generic Internal server error into message while the mark rides through untouched, so on a marked 500/503 the dialog used to show the generic sentence and discard the specific one.

.changeset/7997-detail-view-related-retired.md

  • names RecordDetailView.tsx → packages/app-shell/src/views/RecordDetailView.tsx — edited by this change

    Why it retired. @objectstack/spec declares no DetailView schema at all — every DetailView occurrence in packages/spec/src is prose about this repo's own RecordDetailView.tsx — so this array mirrored no protocol schema and drifted freely: it declared columns as TableColumn[] while the renderer it fed also accepted bare field names, { field, label } and legacy { name, label } spellings. The axis that carried the ruling was measured zero pull: no application code authored the member, both internal producers of a detail-view node (RecordDetailDrawer, renderers/record-details.tsx) synthesize it without related, and the only in-tree authorings carrying real columns were two documents — both rewritten here.

  • names renderers/record-details.tsx → packages/plugin-detail/src/renderers/record-details.tsx — edited by this change

    Why it retired. @objectstack/spec declares no DetailView schema at all — every DetailView occurrence in packages/spec/src is prose about this repo's own RecordDetailView.tsx — so this array mirrored no protocol schema and drifted freely: it declared columns as TableColumn[] while the renderer it fed also accepted bare field names, { field, label } and legacy { name, label } spellings. The axis that carried the ruling was measured zero pull: no application code authored the member, both internal producers of a detail-view node (RecordDetailDrawer, renderers/record-details.tsx) synthesize it without related, and the only in-tree authorings carrying real columns were two documents — both rewritten here.

.changeset/8155-app-root-residue-swept.md

  • names containers.tsx → packages/components/src/renderers/layout/containers.tsx — edited by this change

    Swept as a class, not as two coordinates. Every other place in this tree that stated app was a bound expression-scope root is corrected in the same change — the diagnostic copy and its byte-pin, the ambient-scope docblocks in @object-ui/react (SchemaRenderer, useExpression), @object-ui/core (ActionRunner.ParamDef.visible, RowPredicateOptions.scope), @object-ui/components (form.tsx, containers.tsx), @object-ui/plugin-detail, @object-ui/plugin-form (docblock and README), @object-ui/app-shell and the console app, plus fourteen test fixtures that transcribed the old bag with an app key. The fixtures in @object-ui/app-shell now call buildExpressionScope instead of transcribing it, so that pair cannot drift again.

.changeset/8400-kanban-name-field-skip-set.md

  • names record-details.tsx → packages/plugin-detail/src/renderers/record-details.tsx — edited by this change

    Deliberately one rung, unlike the same dedupe in record-details.tsx, which also carries deriveTitleField: that ladder filters a synthesized field list, whereas this one filters an author-declared cardFields, where dropping a field the author asked for is a worse failure than a repeated title. A regression test pins both directions, including an object whose declared and derived pointers disagree.

.changeset/8649-detail-renderer-undeclared-keys.md

  • names record-details.tsx → packages/plugin-detail/src/renderers/record-details.tsx — edited by this change

    @object-ui/plugin-detail — the annotation-erasing destructure default is gone from three renderers. record-details.tsx, record-highlights.tsx and record-related-list.tsx each annotated schema correctly and then wrote schema = {} as any. A destructuring default's type joins the annotated property type at the binding, so any erased the annotation for every read site in the file — declared keys and undeclared ones alike read any. No published surface moves: the exported annotations were always correct.

.changeset/9174-interpolate-fastpath-trim.md

  • names packages/components/src/renderers/layout/containers.tsx → packages/components/src/renderers/layout/containers.tsx — edited by this change

    At this change page:header's title/subtitle (and the record-title titleFormat) all went through interpolate() in packages/components/src/renderers/layout/containers.tsx. When the template contained a {token} the function collapsed and trimmed whitespace before returning; when it contained no { at all it returned the raw string untouched. A whitespace-only authored title (e.g. ' ') has no token, so it came back unchanged — truthy — and PageHeaderRenderer's {explicitTitle && ANGLE-BRACKETS(h1)} gate drew a blank h1. Because literalTitleText (page.tsx), which decides whether PageRenderer delegates its own heading to the authored header, already trimmed and correctly read "no title", PageRenderer also drew its own implicit heading — two ANGLE-BRACKETS(h1) elements on one document, the broken outline objectui#3434 closed, arriving through a different door.

.changeset/9280-record-highlights-entry-icon-retired.md

  • names packages/plugin-detail/src/index.tsx → packages/plugin-detail/src/index.tsx — edited by this change

    • packages/types/src/record-components.ts — RecordHighlightsComponentProps.fields[]'s object arm: { name; label?; icon?; type?; readonly? } → { name; label?; type?; readonly? }. The key is removed, not tombstoned: the contract's arm is $strict, so the refusal an author needs already exists upstream and arrives named (invalid_union at the entry). A ?: never tombstone buys nothing here — it is the remedy for a non-strict mirror that would otherwise strip in silence, which is not this arm. - packages/plugin-detail/src/renderers/record-highlights.tsx — the entry normalizer stops copying icon: f?.icon into the normalized entry. That read was unreachable, not merely unused: no author could feed it past the $strict arm, and HeaderHighlight renders no .icon on the far side either, so the copy had no consumer in either direction. - packages/plugin-detail/src/index.tsx — the registry manifest's fields input description sketched the entry as {name,label?,icon?,type?,readonly?} → {name,label?,type?,readonly?}. The inputs ARE the published contract (gen-manifest.ts serializes them into sdui.manifest.json and sdui-intrinsics.d.ts), so leaving the sketch standing would have gone on teaching AI and human authors a key that gets the whole document refused at publish.

.changeset/record-alert-cta-label-i18n-4998.md

.changeset/record-picker-label-placeholder-i18n-5637.md

  • names renderers/layout/containers.tsx → packages/components/src/renderers/layout/containers.tsx — edited by this change

    KNOWN GAP, unchanged by this release: the sibling label read sites in renderers/layout/containers.tsx compose translateLabel(pickLocalized(…), language), and that second helper is not applied here — translateLabel and its KNOWN_LABEL_DICT are module-private to that file. Only the locale-map resolution lands in this change; a plain-English string label is still rendered verbatim in every language, exactly as before.

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.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 2049b03df (merge-base with origin/main): 12 file(s) changed outside .changeset/, read against 1705 pending declaration(s) that publish a body (2307 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 330 chunks) 3104.5 KB 3104.5 KB
Main entry chunk (gzip) 149.8 KB 350 KB
Entry file index-DWEeN4tb.js —
Status FAIL —

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ✅ pass
Per-chunk membership (declared packages) ✅ pass
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.60KB 6.18KB
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.17KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
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) 558.92KB 133.97KB
core (index.js) 9.93KB 3.94KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 227.62KB 63.16KB
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.35KB 9.18KB
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.53KB 4.89KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.25KB 2.17KB
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) 52.39KB 14.98KB
plugin-charts (index.js) 84.09KB 22.93KB
plugin-chatbot (index.js) 198.22KB 46.97KB
plugin-dashboard (index.js) 137.56KB 36.67KB
plugin-designer (index.js) 215.78KB 44.42KB
plugin-detail (index.js) 233.49KB 61.79KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 162.67KB 41.95KB
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.07KB 9.15KB
plugin-tree (index.js) 11.21KB 3.89KB
plugin-view (index.js) 89.44KB 22.41KB
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.28KB 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: 8fe632d9602ecad64e803a8ea9b31fcd97d4343f

Isolated adversarial re-derivation of PR objectui#11012 (card objectui#10803, batch 8, the last; claim 5873413663, release 5872268200, ACCEPT 5870953708, amendment 5860244997, triage 5858031244 item 3, release 5861553562). Read: the card and all 37 comments, PRs objectui#10962 / #10914 and their reviews 5870922323 / 5865956027, objectui#10996 and its comments, this PR's body, its 14-file diff (git diff origin/main..., +39 / −20, file set equal to REST), the head's check-runs and job steps, the trees at the head, the branch point 665025908 and origin/main ad0310fb5 (moved past the body's 2049b03df: objectui#11010 has merged), and objectstack over REST plus the local objectstack origin/main 8cdbe0c6e. The dev report 5874970600 was treated as a claim; every figure below is my own measurement unless marked REASONED.

CI on the head: 43 check-runs, 39 success, 3 skipped (the two coverage legs, dependabot), 1 failure (Bundle Analysis, not required). The main ruleset's required contexts are exactly Lint, Type Check, Build & E2E, Build Docs, Changeset Declaration, Test, Spec Main Shape Gate and Governed Surface Queue Guard: all 8 success. REST mergeable true, mergeable_state unstable (the non-required red). Draft, assigned os-steve, one commit whose trailers are the model-free Co-Authored-By: Claude and the session URL; a model-name scan of the message finds none.

① Derived judgments

Premise, re-read over REST. objectstack issues/N and pulls/N answer 404 for 9934, 6281 and 8452 (6 of 6). Lit controls in the same run: objectstack issues 3546, 3391, 5775 and 8326 answer 200; pulls/13267 and pulls/16920 answer 200. objectstack#3546 is the closed issue "detail/form 面的 edit/delete 按钮接入服务端 effective 操作集"; objectui#3546 is the closed missing-t()-keys card (258 call sites), unrelated. What the three dead numbers resolve to here: objectui#9934 is the needs:contract-review CI finding, objectui PR #6281 the Studio grid field-select change, objectui#8452 the not_contains bug, none what its sentence meant, as the body says.

Mapping, all 16 lines read in their diff context against the landing commits (REST commits/SHA, files and patches):

The verbatim quote. objectstack main packages/rest/src/package-routes.ts line 228, inside sendThrownError (opens at 179): "Byte for byte the dispatcher twin's expression (errorFromThrown, packages/runtime/src/http-dispatcher.ts), which serves this same path and has emitted the channel since #9934." The objectui bullet elides the parenthetical with an ellipsis and lowercases "byte"; otherwise exact, and e956924 (the body's reading) is 5 behind main with the line unchanged. The substitution is honest: the door the sentence names is errorFromThrown, and 79c46da90 is the commit that put the channel there (the hunk above). Square brackets are the right editorial mark for a substituted word inside a quotation.

#3546, all 6 lines read in context. Each names the server-resolved effective API operation set (/me/permissions apiOperations) intersected with the object's bucket affordance on a detail header, record body, related list or form: objectstack#3546's subject. The 4 [#3546] tags (RecordDetailView.tsx 216 and 1193, RelatedRecordActionsBridge.tsx 337, record-details.tsx 803) become [objectstack#3546]; fieldWriteGate.ts 193 and plugin-detail/src/index.tsx 562 are re-qualified in line. The index.tsx site is a // comment inside the inputs array above the inlineEdit entry; that entry's description string names no number and is unchanged (C4 below). The locale packs read 96 objectui#3546 lines at both refs, and .changeset/3880-es-done-listo.md line 22 (the i18n card's "slice seven") is untouched: right.

Prose-only. My own C4 instrument (TypeScript 6.0.2 from /opt/node22, createSourceFile plus createPrinter({ removeComments: true }), sources read with git show at 665025908 and the head): 12 of 12 prints identical, 0 parse diagnostics; lit controls: mutating the first string-literal token moves the print, re-spacing a comment does not. The frontmatter block of .changeset/7980-agent-key-envelope-read.md is md5-identical at both refs (b5010263…), and the file is present on origin/main. No test pins a replaced string: a grep of the old spellings over tests and scripts finds only doc comments and two describe titles that mean the i18n card; no assertion reads any; no test file is in the diff; Test, the 8 shards and Test (dist pins) are green on the head.

Census, re-run as the body prints it. Bare four: 15 at 665025908 and on today's origin/main, 0 at the head, 0 on the trial-merge tree with origin/main (git merge-tree --write-tree, clean, tree c6253203a). objectui#3546 outside the locale packs: 2 at the branch point, 1 at the head (the 3880 line). Lit controls: objectstack#3546 in the classes 3 at the branch point, 10 at the head; distinct bare numbers 965 at the branch point, 961 at the head. The 912 bare numbers in 100..25000 at the head, each read once as an objectstack issue: 876 × 200, 36 × 404, and the 36 are exactly the dev's 36; re-read, 36 of 36 answer 404 as objectstack pulls and 200 as objectui issues. I read all 36 in context (not 10): every one sits in an objectui family, beside an objectui PR or in an objectui changeset table, and its objectui subject fits the sentence (for example #6124 beside "refusal arms" is the z.function() mirror finding; #8519, #8529, #8562 sit in the 8542 chunk-attribution table with objectui shas; #10255 is "contract review on PR #10255"; #6311 is "objectui#5306 / PR #6311", the Node floor). Blind spot, re-derived with the [^\w#&] lookbehind: 46 in-range numbers appear only after /, - or .; 45 answer 200 in objectstack, 1 answers 404, #8649, on the two objectui#9469/#8649 lines, and objectui#8649 (200) is the record-renderers annotation decision that objectui PR #9469 executed. Qualified: every distinct objectstack#N / objectstack URL number in the classes (345): 344 × 200, 1 × 301 (objectstack#14026). Every distinct objectui#N / objectui URL number in the classes (2723, read by me too): 2723 × 200.

Fixes #10803. Both of release 5872268200's lists read 0 at the head and on the trial merge. Out of the classes at the head, whole tree, re-measured and equal to the body's note 1: bare #9934 in 3 test doc-comment lines in 2 files and in apps/console/src/pages/developer/AgentConnectSection.tsx (a // comment, "the #9934 channel"); #6281 in 1 test line; #8452 in 1 test line; bare #3546 in 23 test lines in 14 files and 19 CHANGELOG.md lines in 8 files; nothing else. Release 5861553562 names apps/console, package READMEs, content/docs and CHANGELOG history as "out of these classes, recorded and not carried", and triage puts tests out, so none is an in-class miss and closing is right by the card's own definition. Two things worth saying plainly: the class boundary is drawn by path (packages/*/src), not by "released package" (@object-ui/console is in the fixed group and not private), so that console line is shipped source carrying a dead pointer that no card owns; and the body's note 1 omits one same-kind test leftover, recordDetailsInputs.spec-parity.test.ts line 472, which repeats the index.tsx sentence with objectui#3546. Both out of class; neither a hold.

CI, the one red. Head job 109032476177 fails at step "Check console performance budget" and passes every other step; the gate's own comment on this PR reads eager closure 3104.5 KB against a 3104.5 KB ceiling. main's push runs fail at the same step at 665025908 (run 36445522812, job 109006899981), d6d8fb9d7, 2049b03df and ad0310fb5; objectui#10996 (p1, pm:queue, triage 5874625537) carries it: main alone is 17 B over the aggregate ceiling. This diff moves no code token (C4), so its closure is main's. Same failure, same carrier.

② Semver level

  • .changeset/10803-dead-citation-sweep-eighth-batch.md, empty frontmatter: right for comment-only edits. Every sentence true as measured: its 5 named packages are the 5 packages/* roots in the diff; the bare numbers answer 404 in objectstack and resolve to unrelated objectui items (①); the stand-in is objectstack plus a 9-character sha, the one inside the quotation in square brackets; the objectstack#3546 sentence is the ① reading; "moves a claim or changes a code or type token" is the C4 result; "declares no release" and the frontmatter sentence are ①. It writes no bare number itself (measured).
  • No patch is owed: no runtime string moves (C4), and the edited 7980 changeset keeps its app-shell: minor / console: patch declaration byte for byte. check-changeset-presence run by me in a --shared clone of the head with --base 665025908: exit 0, "12 source file(s) of 5 released package(s) changed, and this change declares 1 changeset(s): .changeset/10803-dead-citation-sweep-eighth-batch.md", "EMPTY frontmatter … the explicit exemption", the body's verdict.

③ Boundary flags

Implemented-by: claude/issue-10803-dead-citations-eighth-batch
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 28, 2026 17:43
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 28, 2026
Merged via the queue into main with commit 5d689c3 Sep 28, 2026
44 of 45 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10803-dead-citations-eighth-batch branch September 28, 2026 17:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants