Skip to content

finding(changeset): a pending entry says SpinnerSchema declares icon/size/color — it declared type+size at the ref that wrote the sentence and still does, and it publishes at the next release #9753

Closed

Description

@os-sales

Filed by the domain:spec @ objectui execution seat, session session_01UanLVj6xvbS6puBCewLr8L. Found by the rebuilt polarity census on card objectui#9727 (PR objectui#9752) — the one true positive out of ten entries adjudicated, and it is BORN FALSE.

⚠️ Closing window. The entry publishes verbatim into the CHANGELOG at the next release, and release PR objectui#5400 is open now. ⛔ That release PR is never touched from this lane; the repair happens in the pending body, before it merges.

The claim

.changeset/5632-svg-host-dom-passthrough.md:10-12:

IconSchema and SpinnerSchema declare only icon / size / color, and both renderers already consume all three by name, so the SDUI pass-through list withholds nothing they need.

BORN FALSE — established at the write-time ref, which is the only place it can be

At e304a4ef7, the commit that wrote the sentence, packages/types/src/feedback.ts declared SpinnerSchema as:

export interface SpinnerSchema extends BaseSchema {
  type: 'spinner';
  size?: 'sm' | 'md' | 'lg' | 'xl';
}

⇒ type and size. No icon. No color. The sentence was false the moment it landed.

⚠️ And it is still false today — origin/main, same file:

export interface SpinnerSchema extends BaseSchema {
  type: 'spinner';
  size?: 'sm' | 'md' | 'lg' | 'xl';
  body?: never;
  children?: never;
}

⇒ ⛔ this is not ROTTED and must not be repaired by dating it. Born false takes the opposite repair: corrected outright.

⭐ What the sentence actually did

It attributed IconSchema's members to both interfaces. IconSchema is declared at packages/types/src/layout.ts:337 — a different file and a different interface from SpinnerSchema in packages/types/src/feedback.ts.

⇒ this is the lane's standing "a name is not a key — a key is (interface, name)" error one level up: a claim that names two interfaces and describes only one of them. The icon/color half belongs to IconSchema alone.

Class and size

Class (b) — a declared contract contradicted by its own published face, in text that publishes. The repair is prose in one pending body, frontmatter untouched (check-changeset-overwrite's documented case 2). The surrounding conclusion — that the SDUI pass-through list withholds nothing the renderers need — is ⛔ not assessed here and may well still hold; only the members attributed to SpinnerSchema are wrong.

⚠️ Whoever takes it: ⛔ do not write today's member list into the replacement as a bare figure. Name where the declaration is derived, or date the reading. That is the whole subject of the family this card comes from.

Provenance

The rebuilt census re-ran with both its corpus and its type universe taken from e304a4ef7, so the adjudication was made at the write-time ref rather than against today's tree. ⭐ That run was only trustworthy because the dev first found and fixed a defect in the instrument's own control: the member lit control had been ObjectKanbanSchema.groupBy, a member objectui#7322 added — so every historical run exited 2 and voided itself, which is exactly the run a BORN FALSE verdict depends on. Repinned to BaseSchema.type and pinned with its reason.

Refs: objectui#9727 (the census) · PR objectui#9752 (the rebuild) · objectui#9713 (the ROTTED vs BORN FALSE distinction this applies)

Dedupe words: 5632 svg host passthrough · SpinnerSchema declares only · icon color not on spinner · born false at write-time ref · pending changeset present-tense claim


Generated by Claude Code

Activity

  1. added
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    and removed on Sep 18, 2026
  2. os-sales commented on Sep 18, 2026

    @os-sales
    CollaboratorAuthor

    Claim: card objectui#9753, by the domain:spec @ objectui execution seat.

    • Session: session_01UanLVj6xvbS6puBCewLr8L
    • Seat: domain:spec#1
    • Branch: claude/issue-9753-spinner-schema-born-false
    • Worktree: /home/user/wt/9753 (the dev creates its own; ⛔ never the shared checkout)
    • Domain: domain:spec · Clause-②: no (prose in one pending changeset body; no declaration face moves, no accepted set is relaxed)
    • Container & model: this container; the dispatch seat serves claude-opus-5, the dev runs as an os-dev subagent in the same container.
    • Thread-read: read to the last page at the stamp below — body plus the triage grading comment, which is the only comment on the card.

    File surface declared: .changeset/5632-svg-host-dom-passthrough.md (prose only, ⛔ frontmatter untouched). Read-only reference surface: packages/types/src/feedback.ts, packages/types/src/layout.ts.

    Serial constraint — taken over the OPEN-PR 全集, ⛔ not this round's branches. Nine open PRs enumerated (objectui#9759 · #9592 · #9584 · #9540 · #9488 · #9391 · #9378 · #8941 · #5400, the last paginated to its end at 400 files). FILE-level intersection with the declared surface: empty. In particular ⛔ no open PR holds .changeset/5632-svg-host-dom-passthrough.md — release PR objectui#5400 does not carry it either, checked across all four pages of its file list.

    ⚠️ The window is the whole reason this is p1. Release PR objectui#5400 is open as of the stamp below. ⛔ That PR is never touched from this lane — the repair happens in the pending body while it is still pending. If #5400 merges first the card goes back to triage, per the grading comment; it does ⛔ not get repaired on the release tree from here.

    ⚠️ For the dev: BORN FALSE, ⛔ not ROTTED — the repairs are opposite. ⛔ Do not date the sentence, do not keep it with a falsifier note. It was false at the ref that wrote it (e304a4ef7) and is false today; it gets corrected outright. Establish that yourself at the write-time ref, ⛔ do not inherit this card's quotation of it.

    ⚠️ And ⛔ do not write today's member list in as a bare figure — that is the defect this whole family treats. Name where the declaration is derived, or date the reading.

    Read at 2026-09-18T02:57Z.


    Generated by Claude Code

  3. os-sales commented on Sep 18, 2026

    @os-sales
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 9753,
      "status": "done",
      "branch": "claude/issue-9753-spinner-schema-born-false",
      "pr": "https://github.com/objectstack-ai/objectui/pull/9763",
      "session": "session_01UanLVj6xvbS6puBCewLr8L",
      "premise_still_valid": true,
      "summary": "Corrected the BORN FALSE sentence in the pending body .changeset/5632-svg-host-dom-passthrough.md outright — no dating, no falsifier note, frontmatter untouched (check-changeset-overwrite case 2). Established the write-time ref myself: git log -L 10,12 on the file shows the lines added against /dev/null by e304a4ef7 (sole entry in the walk) and git blame -L 10,12 on origin/main agrees; SpinnerSchema at e304a4ef7 declares type+size and no icon/color, and on origin/main the same plus the refuse-by-name never pair — still no icon, no color. The icon/color half belongs to IconSchema (packages/types/src/layout.ts) alone, which I verified independently: the SAME commit e304a4ef7 wrote both renderer docblocks correctly per interface, and the changeset body collapsed them into one. The replacement names where each declaration is derived (file + symbol) instead of writing down a member list, and preserves the surrounding pass-through conclusion verbatim without assessing it. Release PR objectui#5400 re-read immediately before the push: open, merged=false, so the pending-body channel is still the sanctioned one and #5400 is untouched.",
      "tests": "No test suite owed (diff touches no source; measured, not asserted). Gates, exit codes captured to disk BEFORE any pipe: check-changeset-overwrite EXIT=0 (report-only; prints 'declared at base: @object-ui/components: patch' identical to 'declares now: @object-ui/components: patch', which is the mechanical proof the frontmatter is untouched); check-changeset-presence EXIT=0; check-changeset-claims EXIT=0; check-pending-changeset-literals EXIT=0; check-changeset-no-major EXIT=0; check-changeset-fixed EXIT=0; check-control-bytes EXIT=0 (7855 tracked text files); check-new-cross-file-line-citations EXIT=0 (VERDICT: 0 new citations); check-governed-queue-guard --test EXIT=0 (NOT GOVERNED). BEFORE/AFTER PROBE, wrap-tolerant (whitespace flattened before counting), HEAD~1 versus working file: SUBJECT-OLD false claim 1 → 0; SUBJECT-NEW correction 0 → 1; LIT CONTROL, an unchanged sentence that spans a wrap, 1 → 1; LIT CONTROL 2, the preserved conclusion, also spanning a wrap, 1 → 1; ABSENT CONTROL 'DATED READING' 0 → 0. The line-anchored grep -F matcher the seat warned about was run on the same corpus and read 0 → 0 on the same sentence, i.e. structurally blind, which is why it is not the instrument used. CHANGESET GRADE, measured on this same corpus with both controls: absent control = this change as it stands, check-changeset-presence EXIT=0, 'no changeset is owed'; lit control = a marker line appended to packages/types/src/feedback.ts (published source of @object-ui/types), same script EXIT=1, '1 source file(s) of 1 released package(s) changed, and this change adds no changeset'. Mutation proved on disk before the leg was read (marker grep -cF 0 → 1, git hash-object bc911354e against HEAD blob 6c8e6083d); restore ran under trap on EXIT INT TERM with an absolute REPO_ROOT path and 'git checkout HEAD -- PATH', and is proved by STATE not by an exit code: git diff HEAD empty, git status --porcelain empty, git hash-object back to 6c8e6083d026ba18d999341f241c9058086ab2c7, equal to git rev-parse HEAD:packages/types/src/feedback.ts.",
      "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read and write went through the REST proxy with curl",
      "api_writes": "2 REST writes — POST /repos/objectstack-ai/objectui/pulls (draft PR 9763), POST /repos/objectstack-ai/objectui/issues/9753/comments (this report). Plus 2 git pushes (empty branch as the write-route probe, then the commit). No labels written: objectui reads no skip-changeset label and needs:contract-review belongs to the seat; the diff is NOT GOVERNED per the guard.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: packages/components/src/renderers/basic/icon.tsx still states 'IconSchema declares exactly icon, size and color' and packages/components/src/renderers/feedback/spinner.tsx still states 'SpinnerSchema declares exactly one key beyond the SDUI base, size' — both written by e304a4ef7 and both CORRECT then, but on origin/main each interface has since gained the refuse-by-name never pair (objectui#9256 / ADR-0049). Same family as this card but on the ROTTED side, in published source rather than in a changeset. Carrier: whoever next edits those two pass-through docblocks. Reported to the seat rather than filed, per the dispatch. Dedupe words: renderer docblock declares exactly, IconSchema declares exactly icon size color, SpinnerSchema one key beyond SDUI base, refuse-by-name never keys rot, pass-through docblock member list",
        "noted, not filed: boundary case, not widened — the original sentence's 'declare only' was also loose for IconSchema itself (it inherits BaseSchema and declares type). The replacement drops 'declare only' for both interfaces and asserts attribution instead, so this resolves incidentally; recorded only so the narrowing is visible. Carrier: none."
      ]
    }

    Generated by Claude Code

  4. os-sales commented on Sep 18, 2026

    @os-sales
    CollaboratorAuthor

    ACCEPT — PR objectui#9763. Verified by the domain:spec @ objectui seat (session session_01UanLVj6xvbS6puBCewLr8L), independently of the dev's report, on origin/main c0b68d14d.

    Reading taken 2026-09-18T03:09Z.

    1. The write-time ref, re-established here

    ⛔ Not taken from the card and ⛔ not taken from the report. git log -L 10,12 on the file, walked against the real history:

    e304a4ef7 fix(components): route the SVG-hosted renderers' spread through `toDomProps` (#7564)
    --- /dev/null
    +++ b/.changeset/5632-svg-host-dom-passthrough.md
    @@ -0,0 +10,3 @@
    

    ⭐ Two things make this conclusive rather than suggestive: the hunk is an ADD against /dev/null, so the commit that wrote the lines is the commit that created the file; and it is the only entry in the whole walk, so nothing has touched those lines since. ⇒ write-time ref = e304a4ef7, established, not assumed.

    2. BORN FALSE — confirmed at both refs

    SpinnerSchema at e304a4ef7 (packages/types/src/feedback.ts):

    export interface SpinnerSchema extends BaseSchema {
      type: 'spinner';
      size?: 'sm' | 'md' | 'lg' | 'xl';
    }

    ⇒ type and size. ⛔ No icon. ⛔ No color. The sentence was false the moment it landed.

    Same symbol on origin/main: the same two, plus body?: never and children?: never (the objectui#9256 / ADR-0049 refuse-by-name pair). ⇒ still ⛔ no icon, ⛔ no color.

    ⭐ So nothing moved under the sentence — which is exactly what separates this from ROTTED, and why the repair is outright correction. I probed the diff for a DATED READING block: absent, correctly.

    3. The attribution — and the dev found a stronger proof than the card's

    IconSchema at e304a4ef7 (packages/types/src/layout.ts) declares type · icon · size · color. ⇒ the icon / color half is IconSchema's alone.

    ⭐ The decisive evidence is inside e304a4ef7 itself, and I confirmed it: the same commit wrote both renderers' pass-through docblocks, and each is correct per interface — icon.tsx says IconSchema declares icon/size/color, spinner.tsx says SpinnerSchema declares one key beyond the base, size. ⇒ the changeset body collapsed two correct per-interface statements into one and applied the icon side to both. That is a better account than the card's inference, taken from the write-time commit rather than around it, and it is the lane's 「a name is not a key — a key is (interface, name)」 one level up.

    4. The replacement

    Diff is confined to the one paragraph. ⭐ It names where each declaration is derived (file + symbol) and copies no member list — and says so in its own text. That is the instruction that mattered most on this card, since it belongs to the family about written-down figures, and it was followed rather than nodded at.

    The surrounding conclusion is preserved verbatim and ⛔ not assessed, as the card drew the line.

    Frontmatter byte-identical, checked by me on both sides: '@object-ui/components': patch on origin/main and on the PR head. check-changeset-overwrite's finding is its documented case 2, exit 0.

    The pointers resolve. Both cited docblocks exist on origin/main (renderers/basic/icon.tsx, renderers/feedback/spinner.tsx) — I checked, because prose that points somewhere is only as good as the target.

    5. The instrument note, which is the part worth keeping

    The dev reproduced the lane's line-anchored blindness on this very corpus: grep -cF on the changed sentence read 0 → 0 across a change that demonstrably happened. Re-drawn whitespace-tolerantly it reads 1 → 0 on the old claim and 0 → 1 on the new one, with two lit controls that themselves span a line wrap reading 1 → 1 and an absent control reading 0 → 0.

    ⭐ The lit controls spanning a wrap is the detail that makes the pair mean something: a permissive matcher would light on everything, and a wrap-blind one would miss the controls too. This is the fourth time this shift that changeset prose has defeated a line-anchored probe.

    6. Scope and window

    • Fixes #9753 — correct; the card's whole scope is that one sentence and nothing is left undone. ⛔ No closing keyword anywhere near objectui#5400, checked.
    • Clause-②: no — correct; no declaration face moves.
    • ⛔ objectui#5400 untouched, re-read by the dev immediately before the push as open and unmerged. The window held, so the pending-body channel stays the sanctioned one and this card does ⛔ not need re-triage.

    7. The finding handed back, ⛔ not fixed

    The two renderer docblocks this changeset now points at carry member claims whose population moved under them — body?: never / children?: never were added to both interfaces after e304a4ef7. ⭐ Same family, same source commit, same pair of interfaces, opposite polarity: ROTTED, so it takes the dating repair, not this card's correction repair.

    Declining to fix it here was right — the card's surface is one changeset body and source comments are a different surface. The seat files it: objectui#9764, with the judgement the dev deliberately did not make (whether a never-typed refusal counts as a declared key for "exactly") left open on the card rather than settled in passing.


    PR objectui#9763 goes ready + queue once its checks are green. Card closes with the PR.


    Generated by Claude Code

  5. os-sales commented on Sep 18, 2026

    @os-sales
    CollaboratorAuthor

    Release: branch claude/issue-9753-spinner-schema-born-false · PR objectui#9763 MERGED as d18322415 — verified on origin/main by symbol, ⛔ not from merged / merged_at.

    Reading taken 2026-09-18T03:44Z.

    Landing

    BEFORE = 8d9a351d836799f5dc0b19310c00d7a44ac6e948 · AFTER = d183224156cf3a0826aa96a1aa641619578793f8 · git merge-base --is-ancestor exit 0.
    Landing commit: d18322415 docs(changeset): correct the SpinnerSchema member attribution in the 5632 pending body (#9763).

    The prose, probed WHITESPACE-TOLERANTLY on .changeset/5632-svg-host-dom-passthrough.md

    probe before after
    SUBJECT-OLD — the false claim 1 0
    SUBJECT-NEW — icon and color are IconSchema's alone 0 1
    SUBJECT-NEW 2 — "this paragraph deliberately copies no member list" 0 1
    [LIT CTRL] the preserved conclusion (spans a wrap) 1 1
    [LIT CTRL] an untouched sentence (spans a wrap) 1 1
    [ABSENT CTRL] DATED READING — the wrong repair 0 0

    Frontmatter compared directly: identical. The absent control staying 0 is the one that says the repair applied was correction, ⛔ not dating — the wrong repair for BORN FALSE would have left a trace here.

    ⭐ And the instrument note, reproduced on my own probe

    grep -cF '<the old claim, exactly as written>' BEFORE  -> 0
    grep -cF '<the same needle>'                    AFTER  -> 0
    

    0 → 0 across a change that demonstrably happened. ⭐ Changeset prose wraps near eighty columns, so a line-anchored matcher is structurally blind to it; the two lit controls above span a wrap and read 1 → 1, which is what proves the working instrument sees across the wrap rather than merely matching everything. Fifth instance this shift. ⛔ Never take a 0 on changeset prose without a wrap-spanning lit control.

    Window

    ⛔ Release PR objectui#5400 was never touched, and it is still open — so the correction landed inside the window, which is the whole reason this card was graded p1. The sentence will not publish into a CHANGELOG in its false form.

    Card

    Closed completed by the PR's Fixes #9753. pm:dispatched and the assignee cleared in the same act as this comment — a closed card carrying a live dispatch label is a half-state.

    The ROTTED finding handed back from this work — the two renderer pass-through docblocks whose member lists moved under them, opposite polarity to this card — is filed as objectui#9764.


    Generated by Claude Code

  6. added a commit that references this issue on Sep 28, 2026
    d183224
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p1

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions