Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(examples,docs): two component demos are titled for a behaviour their fixture does not carry #6251

Closed

Description

@yinlianghui

Observation recorded while implementing #6157. Not a broken build and not a type divergence — a naming residue, filed so it is not rediscovered as a mystery later.

⚠️ Dedup caveat: the GitHub search API was rate-limited for this session at filing time, so the "search before filing" step could not be completed for this card. Close as duplicate if one exists.

1. command-palette-with-shortcuts no longer shows shortcuts — caused by #6157

#6157 removed the invented shortcut key from the three CommandItem entries in examples/schema-catalog/src/schemas/components-form-command/command-palette-with-shortcuts.json. That removal is right: CommandItem declares only value / label / icon (form.d.ts:1329), and renderers/form/command.tsx reads only item.value and item.label — it never drew a shortcut.

The residue is that the catalog id, the catalog title ("Command Palette With Shortcuts") and the docs heading (content/docs/components/form/command.mdx:42, ### With Shortcuts) all still promise shortcuts. The demo now demonstrates a grouped palette.

Two ways to close it, and they are not equivalent:

  • rename the section/entry to what the fixture actually shows (mechanical, but a catalog id is referenced from the mdx page and from examples/schema-catalog/src/index.ts, which is generated by scripts/regenerate-catalog-index.py); or
  • implement command-item shortcuts for real — declare the key on CommandItem and render it. That is a capability expansion with no measured pull behind it, so under implementation-first it wants a decision rather than a fixture edit.

#6157 deliberately did neither: renaming and expanding are both outside "stop teaching keys the shipped types reject", and picking one silently inside that PR would have been scope creep.

2. success-toast sits under "### Success Message" with no success variant

examples/schema-catalog/src/schemas/components-feedback-toast/success-toast.json renders under content/docs/components/feedback/toast.mdx:49 and carries no variant at all, so the demo it anchors is a default toast. Its sibling error-toast does carry one (variant: "error" after #6157). Pre-existing, untouched, and mentioned here only because it is the same shape of defect: a heading naming a variant the fixture does not set.

Neither item is urgent. Both are the kind of thing a reader copies and is then confused by, which is the same reasoning #6157 was opened on.

#6157 is not addressed by this card and remains open on its own scope.

Filed unassigned by the #6157 execution seat, session session_01CSoz9uGhaaSgiq3hshtN7L.

Activity

  1. claude commented on Aug 25, 2026

    @claude
    Contributor

    Concentrated triage batch (final tail): finding → pm:queue + domain:ui, Task, S — naming residue: two demo fixtures are titled for behaviour they no longer (or never) carry, one caused by #6157's correct key removal. Retitle the demos to what the fixtures actually show (or extend the fixture where the titled behaviour is real and representable within declared keys — measure which per demo). Dedup caveat from the filing (search API was down): run the duplicate check at claim before opening a PR.


    Generated by Claude Code

  2. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Aug 25, 2026
  3. added theissue type on Aug 25, 2026
  4. claude commented on Aug 30, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 6251,
      "status": "done",
      "branch": "claude/issue-6251-demo-title-residue",
      "pr": "https://github.com/objectstack-ai/objectui/pull/6851",
      "premise_still_valid": "PARTIAL (deviates from the template's boolean on purpose - the card names two items and they diverge). Item 1 VALID and fixed. Item 2 FALSIFIED: success-toast.json already carries variant:'success' on origin/main, landed by d09e13fd7 (PR #6498, 2026-08-26), one day AFTER this card was filed (2026-08-25). No PR content for item 2.",
      "summary": "Item 1 - took the RENAME route, as fenced. Renamed the fixture components-form-command/command-palette-with-shortcuts -> file-command-palette; the catalog title follows automatically ('Command Palette With Shortcuts' -> 'File Command Palette') because the generator derives an uncurated title from the slug, and the docs heading '### With Shortcuts' became '### File Command Palette' plus one sentence naming what the demo shows. What the fixture actually renders (bytes unchanged, git records the rename at 100% similarity): a ui:command palette, placeholder 'Search commands...', ONE group headed 'File', three items - New File (file-plus), Open File (folder-open), Save (save). Nothing draws a shortcut: CommandItem declares only value/label/icon (packages/types/src/form.ts:1378) and renderers/form/command.tsx reads item.value, item.label, item.icon. I did NOT implement command-item shortcuts - see open_questions. Item 2 - NO CHANGE, premise dead: the fixture already carries variant:'success', and I verified the remaining half the dispatch asked about - 'success' IS real on both faces: ToastSchema.variant declares 'default'|'success'|'warning'|'error'|'info' (packages/types/src/feedback.ts:129) and renderers/feedback/toast.tsx dispatches schema.variant==='success' ? toast.success : ... So heading and fixture already agree and the heading did NOT need to change. PM-side half-state noted: issue 6251 has assignee os-sales and a triage comment, but no claim comment naming a branch; I did not write assignee.",
      "tests": "ALL AT HEAD bb416dece (the commit the PR ships); vitest run from the REPO ROOT per AGENTS.md ('pnpm --filter PKG exec vitest' is a false green here - guard confirms root: 'RUN v4.1.10 /home/user/objectui-6251'). TESTS: `pnpm exec vitest run --reporter=verbose` over 6 files -> 'Test Files 6 passed (6)' / 'Tests 1105 passed (1105)'. Executed files (verbose reporter, since the default reporter hides names on green): examples/schema-catalog/test/catalog-gallery-render.test.tsx, examples/schema-catalog/test/component-fixture-declared-keys.test.ts, examples/schema-catalog/test/smoke.test.tsx, packages/components/src/__tests__/command-item-icon.test.tsx, scripts/__tests__/catalog-index-regenerable-4633.test.ts, scripts/__tests__/check-lucide-icon-record-names.test.ts. The two lines proving the renamed id is LIVE in the registry rather than resolving by luck: 'OK smoke.test.tsx > components-form-command/file-command-palette has a valid structural schema' and 'OK catalog-gallery-render.test.tsx > components-form-command/file-command-palette renders without a red tile'. GATES (each quoted from its OWN printed verdict line, exit code captured before any pipe): regenerate:check -> 'examples/schema-catalog/src/index.ts is up to date (431 entries).' EXIT=0; check-changeset-presence -> '2 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)' EXIT=0; changeset:check -> 'No changeset declares a major bump.' EXIT=0; check:icon-record-names -> 'OK lucide icon names: 182 authored/declared names ... are live icons keys' EXIT=0; check:control-bytes -> 'check-control-bytes: OK (scanned 5648 tracked text file(s))' EXIT=0; check:doc-types -> 'Every documented component type is registered.' EXIT=0; check:doc-fences -> 'every TypeScript block in 223 document(s) is fenced ts/tsx/typescript' EXIT=0; docs:check-links -> 'Links are valid across 17 scan roots.' EXIT=0; pnpm lint FULL REPO (no narrowing needed, 2m32s) -> 'Tasks: 47 successful, 47 total', 0 errors / 2789 pre-existing warnings. REVERSE VERIFICATION: regenerate:check was measured RED BEFORE regenerating (EXIT=1, printing the exact rename diff and the derived title change) and green after - so the green is a reading, not a gate that cannot fail. NOT MEASURED (declared, not counted as green): check:doc-snippets exits 2 with its own words 'PRECONDITION NOT MET (exit 2) ... This is I could not run, NOT I ran and found errors', wanting a 21-package build; it provably cannot move on this diff - command.mdx holds exactly ONE fenced block, language 'plaintext', whose bytes are IDENTICAL between origin/main and the branch (verified by extracting fences from both revisions), contributing ZERO TypeScript snippets. TYPE-CHECK: first run of @object-ui/example-schema-catalog type-check exited 2 with 'Cannot find module ... type declarations' - that is the UNBUILT-CLOSURE signature, not my diff; proven by construction: built the closure (turbo run build --filter '@object-ui/example-schema-catalog^...' --concurrency=2 -> 'Tasks: 28 successful, 28 total') and re-ran -> EXIT=0 for both halves (tsc --noEmit && tsc -p tsconfig.test.json). @object-ui/components type-check EXIT=0. DANGLING-ID SWEEP: parsed all 431 registry keys against every SchemaExample usage in content/docs -> 421 usages, 0 dangling (the only 2 non-matches are literal syntax placeholders inside a fence in guide/schema-catalog.mdx). Note this PR edits content/, so ci.yml's site-build job runs on it and exercises getExample() for the renamed id.",
      "mcp_calls": "2 - issue_read(get) and issue_read(get_comments) on #6251. Everything else went over repo-scoped REST (reads, PR creation, this comment) or local git/grep. The GitHub SEARCH API is blocked for this seat by the proxy, not merely rate-limited: 'This GitHub API path is not available: sessions are bound to their configured repositories' (HTTP 403), so the dedup check used the sanctioned fallback - REST list endpoints + local grep.",
      "dedup_check": "REQUIRED BY THE CARD'S OWN CAVEAT (search API was down at filing, so 'search before filing' never ran). Listed all 302 open items via repo-scoped REST (4 pages), split to 270 issues / 32 PRs, grepped title+body locally. Target terms 'command-palette-with-shortcuts', 'success-toast', 'with shortcuts', 'success message' -> 1 hit each, and that hit is #6251 ITSELF. CONTROL TERM so a zero is a reading: 'schema-catalog' -> 12 open-issue hits (#3965, #5931, #6002, #6124, #6251, #6318, #6326, #6674, #6788, #6805, #6806, #6810); second control 'regenerate-catalog-index' -> 1 hit. Controls fired, so the zeros are measurements. NO DUPLICATE.",
      "contention_check": "Fetched the file list of all 32 open PRs before editing. NO open PR touches examples/schema-catalog/src/index.ts - the regenerated file is uncontended, so no race to coordinate. Three open PRs touch the same package on different files: #6832 (components-complex-scroll-area/*, components-basic-sidebar/sidebar-with-badges.json, test/catalog-authored-key-6805-6806.test.tsx) - the one the dispatch named; #6807 (components-overlay-context-menu/basic-context-menu.json, test/card-demo-content-6788.test.tsx); #6822 (test/deprecated-component-types.test.ts). All three edit fixture CONTENT or tests; none renames a fixture, so none regenerates the index. Zero file overlap with this PR.",
      "reader_enumeration": [
        "content/docs/components/form/command.mdx - HARD (SchemaExample id resolves through getExample(), which THROWS on an unknown id) - edited: heading + id",
        "examples/schema-catalog/src/index.ts - HARD (generated registry: import binding, REGISTRY key, id field, slug-derived title) - REGENERATED via scripts/regenerate-catalog-index.py, never hand-edited; diff is exactly the rename with zero collateral churn, entry stays in (category, slug) sort order",
        "examples/schema-catalog/test/component-fixture-declared-keys.test.ts:172 - HARD (schemaOf('...') string literal) - edited",
        "packages/components/src/renderers/form/command.tsx:13 - PROSE (comment naming the file) - edited",
        "packages/components/src/__tests__/command-item-icon.test.tsx:201 - PROSE (test name naming the file; it inlines its own item data and does not load the fixture) - edited",
        "scripts/check-lucide-icon-record-names.mjs:279 - PROSE (comment naming the file; the census keys on the 'command' TYPE with min:9, so it is path-agnostic and did not need a code change) - edited",
        "ALL OTHER catalog consumers iterate allExamples() and are rename-transparent (verified: only line 172 above named the id as a literal)",
        "catalog-meta.json - NOT a reader here: the id was never curated, which is why the title derives from the slug and followed the rename with no edit",
        "POST-CHANGE PROOF: `grep -rn command-palette-with-shortcuts` over the whole tree returns ZERO hits"
      ],
      "what_moved": "No test moved, was deleted, was skipped or was added. Two existing tests changed only a string they name: component-fixture-declared-keys.test.ts (the schemaOf id literal) and command-item-icon.test.tsx (a test title). Both still run and pass. The fixture file moved (git rename, 100% similarity, contents untouched). The changeset carries an EMPTY frontmatter - the presence gate's own text calls that 'the explicit exemption and a complete answer'; the only released-package files touched are a code comment and a test name, so this releases nothing. The skip-changeset label was deliberately NOT applied: in objectui no workflow or script reads that label, so applying it would hang a fake status on the PR.",
      "open_questions": [
        {
          "question": "Should command-item shortcuts be implemented for real - declaring a `shortcut` key on CommandItem and rendering it? I did NOT build it, as fenced. Filing this so it can become a decision card if the maintainer wants it.",
          "options": [
            "A - Leave it. The demo is now named for what it renders; no key is added. (What this PR does.)",
            "B - Declare `shortcut` on CommandItem (types + zod mirror) and render it in renderers/form/command.tsx, then restore a shortcuts demo."
          ],
          "recommendation": "A, and I do NOT think B is the right long-term answer today. Real business need: no measured pull - nothing in the repo authors a shortcut key (objectui#6157 removed the only three, which were invented), no renderer read one, and no example app or deployment asks for it; the demand evidence is an old demo TITLE, which is the weakest possible signal. Long-term soundness: adding a published key to satisfy a stale title is the tail wagging the contract - contract-first says the spec moves when the spec is wrong, not when a fixture name is. Also note a real design gap B would have to answer first: a shortcut is only useful if something BINDS the keystroke, and ui:command has no keybinding surface at all, so B as stated would ship a decorative glyph that lies about being functional - strictly worse than the name residue this card is about. Making AI-written metadata hard to get wrong: a decorative-only `shortcut` key is exactly the shape that teaches an AI author to emit a key which parses green and does nothing - the same class objectui#6157 spent a PR removing. Startup scope discipline: this is a capability expansion on a published surface with zero consumers; under implementation-first it wants a maintainer decision, and the cheap correct answer (rename) is already shipped. If the maintainer does want palette shortcuts, the card should be scoped to the KEYBINDING capability, with the visual key as its byproduct - not the reverse."
        }
      ],
      "out_of_scope_findings": [
        "NONE FILED - and this is a measurement, not a skipped step. Two candidates were examined and both dissolved on inspection: (1) 'no cheap gate cross-checks mdx SchemaExample ids against the catalog registry' - enforcement DOES exist: apps/site build calls getExample(), which throws on an unknown id, and ci.yml gates that site-build job on a diff touching 'apps/site/' or 'content/' (plus an early return that always builds on merge_group), so a dangling id cannot reach main; (2) 'file-command-palette overlaps command-menu, both being grouped palettes' - a judgment call about demo curation, not a defect, and deliberately not filed as a card. Dedup for both used the same REST-list + local-grep channel described in mcp_calls."
      ]
    }

    Generated by Claude Code

  5. claude commented on Aug 30, 2026

    @claude
    Contributor

    ACCEPT — PR #6851. No rework.

    ⭐ Item 2's premise died one day after the card was filed — and that was measured, not assumed

    The card said success-toast.json carries no variant. It does. variant: 'success' landed in d09e13fd7 (PR #6498, 2026-08-26) — one day after this card was filed (2026-08-25). No PR content was needed for item 2.

    ⭐ And the dispatch's conditional half was checked anyway rather than skipped once the premise fell: I said adding variant: "success" is only correct if success is a variant the renderer actually implements. Verified on both faces — ToastSchema.variant declares 'default'|'success'|'warning'|'error'|'info' (feedback.ts:129) and renderers/feedback/toast.tsx dispatches schema.variant === 'success' ? toast.success : …. So heading and fixture already agree, and the heading did not need to change either.

    That is the difference between "the premise is stale, nothing to do" and knowing why nothing is owed.

    The report also flags its own deviation from the template — premise_still_valid: "PARTIAL" with the reason, because a card with two items can have them diverge. Correct: a boolean there would have had to lie about one half.

    The rename is complete because every reader was enumerated and classified

    ⚠️ My order said a rename is only done when every reader follows. The enumeration splits HARD (breaks if stale) from PROSE (misleads if stale), which is the distinction that matters:

    reader kind handled
    content/docs/components/form/command.mdx HARD — getExample() throws on an unknown id edited
    examples/schema-catalog/src/index.ts HARD — generated registry regenerated, never hand-edited
    component-fixture-declared-keys.test.ts:172 HARD — schemaOf('…') literal edited
    command.tsx:13, command-item-icon.test.tsx:201, check-lucide-icon-record-names.mjs:279 PROSE edited
    catalog-meta.json ⭐ not a reader — the id was never curated, so the title derives from the slug and followed the rename by itself no edit

    Post-change proof: grep -rn command-palette-with-shortcuts over the whole tree returns zero hits. And the renamed id is proven live rather than resolving by luck — two named test lines exercise components-form-command/file-command-palette through the registry and the gallery renderer.

    Fixture bytes unchanged; git records the rename at 100% similarity.

    ⭐ The regenerate gate was proven capable of failing

    regenerate:check was measured RED before regenerating (EXIT=1, printing the exact rename diff and the derived title change) and green after.

    A generated-file gate that is green because it cannot see the change is worthless. Establishing it goes red on this diff first makes the green a reading. Same discipline as an ablation, applied to a gate.

    NOT MEASURED, declared with a proof of irrelevance

    check:doc-snippets exits 2 — quoted from the gate itself: "PRECONDITION NOT MET (exit 2) … This is I could not run, NOT I ran and found errors". ⭐ Rather than leaving it there, the report proves it cannot move on this diff: command.mdx holds exactly one fenced block, language plaintext, whose bytes are identical between origin/main and the branch (verified by extracting fences from both revisions) ⇒ zero TypeScript snippets contributed.

    Likewise the first type-check exit 2 was identified as the unbuilt-closure signature and proven by construction — closure built (28/28), re-run clean.

    Dedup (owed, since the card's own caveat says the search step never ran at filing) came back with controls firing: target terms 1 hit each — the card itself — against control schema-catalog → 12 open issues. Contention: all 32 open PRs' file lists fetched; no open PR touches index.ts, so the regenerated file is uncontended.

    ⛔ The implementation route was refused, with the strongest reason on the card

    I fenced "do not implement command-item shortcuts" as a capability expansion with no measured pull. The report agrees and adds an argument I did not have:

    a shortcut is only useful if something BINDS the keystroke, and ui:command has no keybinding surface at all, so B as stated would ship a decorative glyph that lies about being functional — strictly worse than the name residue this card is about.

    ⇒ the expansion is not merely unmotivated; the literal version of it would be a new instance of the defect class #6157 spent a PR removing — a key that parses green and does nothing. And the framing for any future card is right: scope it to the keybinding capability, with the visual key as its byproduct, ⛔ not the reverse. Recorded for the decision box; ⛔ not built.

    ⭐ Zero findings filed — as a measurement, not an omission

    Two candidates were examined and dissolved on inspection, which is stated rather than silently dropped:

    1. "no gate cross-checks mdx SchemaExample ids against the registry" — enforcement does exist: apps/site build calls getExample(), which throws on an unknown id, and ci.yml gates that job on any diff touching apps/site/ or content/. A dangling id cannot reach main.
    2. "file-command-palette overlaps command-menu" — a demo-curation judgment call, not a defect.

    Reporting why nothing was filed is worth as much as a filing; it stops the next reader re-deriving both.

    What moved: no test added, deleted, skipped or moved. Two existing tests changed only a string they name. skip-changeset deliberately not applied — in this repo no workflow reads it, so it would hang a fake status on the PR.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions