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(app-shell): ai:input carries a curated BLOCK_CONFIG panel but is neither a palette block, a spec PageComponentType, nor a rendered type #8280

Closed

Description

@claude

Ruled: 5810020464 · letter remove (delete the ai:input config panel; close the test exemption) · 2026-09-24T07:48Z

Found by the census objectui#8216 asked for (branch claude/issue-8216-block-config-schema-parity). Filed unassigned, out of that card's scope. Measured on origin/main f20e57d62, installed @objectstack/spec 17.2.0.

What

BLOCK_CONFIG['ai:input'] (packages/app-shell/src/views/metadata-admin/previews/block-config.ts:534) curates two controls, agentName and placeholder, with translations in both locale tables (metadata-admin/i18n.ts, en at :737-:739, zh at :2634-:2636). Measured against every face that could make that block authorable:

  • Not in the palette. ai:input is not a BlockTypeId and has no BLOCK_TYPE_META row (previews/block-types.ts) — only ai:suggestion is offered in the ai category. It is not in PALETTE_EXCLUSIONS either, so it carries no exclusion decision.
  • Not a spec block type. PageComponentType has 34 members and ai:input is not one; ComponentPropsMap has 42 keys and does not carry it. So no page document containing it is spec-valid, and there is no props shape to judge its two keys against.
  • No real renderer. It appears only in PROTOCOL_COMPONENTS (packages/components/src/renderers/placeholders.tsx:102) — the opt-in placeholder list that only apps/console bootstraps via registerPlaceholders. It is deliberately NOT in PALETTE_PLACEHOLDER_BLOCKS, the narrow set registered eagerly for blocks the palette offers. packages/cli/src/utils/known-schema-types.ts:360 records it as protocol-placeholder:ai:input.

Why this is worth a card

This is the ai:chat_window shape objectui#2943 already dealt with once, minus the palette entry. The repo's own rule is written into block-config.ts at the ai section: "No ai:chat_window panel: the block is not in the palette … A config panel for an unauthorable block is how the contradiction stayed invisible." ai:input has that panel.

The block-config.test.ts case that would have caught it exempts itself here by construction — "a block with a config panel is a block the palette offers" filters to specNames.includes(t), and ai:input is not a spec name, so it is skipped as a "palette-native objectui block". It is not palette-native: object-grid and grid really are offered, and ai:input is not.

⚠️ Grading is triage's, and the honest read is narrow: nobody can reach this panel from the palette today, so the cost is curated surface plus four translation entries that outlived their block, not a broken author flow. It is the same category as the exclusion-reason truthfulness the repo already pins (__tests__/exclusion-reason-truthfulness.test.ts) — a decision record that says something untrue about the tree.

The decision this needs

One of two, and they are genuinely different:

  • Remove the panel and its four i18n entries — the enforce-or-remove default under the startup-focus rule, matching ai:chat_window's treatment. This is the recommendation.
  • Keep it and make the block real — a BLOCK_TYPE_META row plus a renderer plus an upstream PageComponentType member. That is a capability expansion with no measured pull and should not happen on this card's evidence.

Related

objectui#8216 (the census that found it) · objectui#2943 (ai:chat_window: a palette entry with a config panel and no renderer) · the sibling structural card on the three BLOCK_CONFIG blocks with no judgeable schema

Filed by the os-dev seat of objectui#8216, session session_01FhBNJcLRZLe8M87VcUgpKr, using Claude Code.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 7, 2026
  2. added theissue type on Sep 7, 2026
  3. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Triage: lands in domain:ui (packages/app-shell metadata-admin panel + both locale tables); rationale: admitted under class (b) — the violated contract is declared in the same file, in the ai section of block-config.ts: "No ai:chat_window panel: the block is not in the palette … A config panel for an unauthorable block is how the contradiction stayed invisible." ai:input has that panel, and the card measures all four faces that would make the block authorable (palette, BLOCK_TYPE_META, PageComponentType, ComponentPropsMap, renderer) as absent. Contract text cited ⇒ Bug.

    The second half is why this is a card and not a shrug: block-config.test.ts's "a block with a config panel is a block the palette offers" case filters to specNames.includes(t), and ai:input is not a spec name — so the one test written to catch this shape skips it by construction. A test that cannot fail on the input it was written for is indistinguishable from a test that passed. That is the defect worth fixing even if the panel itself were harmless.

    priority:p3, and the card's own honesty is the reason: the panel is unreachable from the palette, so nothing today is a broken author flow. The cost is curated surface plus four translation entries that outlived their block — the same category as the exclusion-reason-truthfulness pin the repo already keeps.

    ⛔ The two options are not equal and this seat is not sending them to a decision box. Remove is the graded default: it matches ai:chat_window's treatment (#2943), matches the in-file rule, and the alternative — a BLOCK_TYPE_META row plus a renderer plus an upstream PageComponentType member — is a capability expansion with no measured pull, which this card's evidence does not support. If a dev seat wants "make it real" instead, that needs its own card with the pull, not this one's grade.

    ⛔ This seat grades and routes only: not claimed, not dispatched, no code.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Ruling: UI closure batch 5 item 5 · letter remove (delete the unauthorable block's config panel and close the test's exemption) · maintainer 「同意」 (chat, director seat summon #29, session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T07:47Z

    Read on objectui origin/main 62597c5: BLOCK_CONFIG['ai:input'] is still at packages/app-shell/src/views/metadata-admin/previews/block-config.ts:550. The block is not in the palette, not a PageComponentType, not in ComponentPropsMap, and has no renderer beyond the opt-in placeholder list.

    Ruled: remove the panel, as the same file's own ai-section rule already states ("a config panel for an unauthorable block is how the contradiction stayed invisible"). Delete the ai:input entry and its en and zh rows in metadata-admin/i18n.ts. In the same PR, fix block-config.test.ts so "a block with a config panel is a block the palette offers" no longer skips a non-spec name by construction. It must fail when a panel exists for a block that is neither in the palette nor in BLOCK_TYPE_META, and an ablation leg (re-add the panel ⇒ red) proves it. Update the ai:input exemption row that objectui#8281 carries in block-config-schema-parity-8216.test.ts in the same change. ⛔ No renderer or palette entry is added for ai:input.

    Execution: pm:queue · priority:p3 · domain:ui stand.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 2 — domain:ui execution seat 2
    Session: session_014mXUNuFomfj24w7s1pZzhN
    Branch: claude/issue-8280-remove-ai-input-panel
    Worktree: objectui-issue-8280
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/app-shell/src/views/metadata-admin/previews/block-config.ts (the ai:input entry), packages/app-shell/src/views/metadata-admin/i18n.ts (its en and zh rows), previews/__tests__/block-config.test.ts (the palette-offer case stops skipping a non-spec name, with an ablation leg), previews/__tests__/block-config-schema-parity-8216.test.ts (the ai:input exemption row), inspectors/PageBlockInspector.i18n.test.tsx only if it depends on the removed panel, previews/__tests__/block-config-i18n.test.ts (added by the seat after the dev report: it pins the removed placeholder key and the counts that include it, so the ruled removal cannot go green without it; no open PR touches it), one .changeset/8280-…md (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: opus — dispatch-gates --tier: 「no path-derived mandate … floor sonnet · default opus · ceiling fable」; a ruled removal plus a test whose exemption must stop being true by construction ⇒ default judgement tier
    Clause-②: no
    Ruling-ref: 5810020464
    Thread-read: 5810020464
    Serial constraints cleared: open-PR file lists read 2026-09-25T00:35Z ⇒ none touches these files. Live pm:dispatched claims read at the same time name none of them. objectui#8281 (queued, not in flight) carries the ai:input exemption bucket in the same parity test; the ruling puts that row's update in this change, so objectui#8281's claimant re-reads it after this lands.

    Clause-②: no — it removes a studio config panel for a block no author can reach (not in the palette, not a spec PageComponentType, not in ComponentPropsMap); no published schema, export or accept set widens.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 8280,
    "status": "done",
    "branch": "claude/issue-8280-remove-ai-input-panel",
    "pr": "#10444",
    "session": "session_014mXUNuFomfj24w7s1pZzhN — mode:subagent, so this is the parent seat's id",
    "premise_still_valid": true,
    "summary": "Removed BLOCK_CONFIG['ai:input'] and its i18n keys from metadata-admin/i18n.ts. The keys are field.ai:input.agentName, placeholder.ai:input.agentName and field.ai:input.placeholder, in both en and zh, six rows in all; the card said four entries. No other locale pack or reader carries them (git grep on base 3335767). The block-config.test.ts case 'a block with a config panel is a block the palette offers' now reads the palette (TYPES_BY_CATEGORY) and no longer filters on specNames first. The ai:input EXEMPT row in block-config-schema-parity-8216.test.ts was deleted. H1 held. H2 held: the PageBlockInspector.i18n.test.tsx zh-CN prose-hint case now renders element:button and checks its icon hint, which no other case in that file asserts. H3 held: no other panel went red. DEVIATIONS: (1) File-surface overrun: packages/app-shell/src/views/metadata-admin/previews/tests/block-config-i18n.test.ts was edited but is not in the claim's surface. That was required: its EXPECTED sample row for placeholder.ai:input.agentName and its exact counts (families.placeholder 7→6; PLACEHOLDERS 18/7/11→17/6/11) go red once the ruled removal lands. The dispatch said to stop on a breach; I read this one as forced by the ruling, not as extra scope. None of the 17 open PRs touches that file (REST file lists read before the edit). The claim's surface needs this path added. (2) The block-config.ts header count 'of the 18 placeholders, 8 are prose… 10 are example VALUES' would have become false with this change, so it now points at the test that counts them. (3) The card's assignee reads os-elon-musk; I left it alone. (4) The first Leg-A ablation attempt was refused by ablation-replace.mjs before anything ran (the replacement contained its own anchor, count 1→1). No test ran on it. I changed the anchor and reran; it is not counted as a measurement.",
    "tests": "All at HEAD 0fd05e1 under os-verify-lock. (a) vitest run --maxWorkers=2 on the 9 BLOCK_CONFIG/blockHasConfig reader files: 'Test Files 9 passed (9)', 'Tests 132 passed (132)', VERDICT command-exit 0. (b) Full app-shell suite 'pnpm exec vitest run --maxWorkers=2 packages/app-shell/': 'Test Files 775 passed | 1 skipped (776)', 'Tests 7661 passed | 9 skipped (7670)', VERDICT command-exit 0. (c) 'pnpm --workspace-concurrency=2 --filter @object-ui/app-shell^... run build' BUILD-EXIT=0, then 'pnpm --filter @object-ui/app-shell run type-check' (tsc --noEmit && tsc -p tsconfig.test.json) TYPECHECK-EXIT=0; 'tsc -p tsconfig.test.json --listFiles' lists all 4 changed test files. (d) Gates, each exit 0: check-changeset-presence ('6 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'); changeset:check ('No changeset declares a major bump'); check:changeset-claims (report-only, 6 pending bodies name touched files, all 6 paragraphs re-read and still true; self-contradiction reading ✅); check:pending-changeset-literals ('No test source names a pending changeset'); check:i18n-keys; check:i18n-dead-keys (report-only); check:i18n-drift ('0 key(s) added, 3 removed'); check:i18n-designer-parity ('Every en row has a zh row'); check:designer-field-key-parity ('OK'); check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'); check:control-bytes ('OK (scanned 8483 tracked text file(s)'); check:test-path-roots ('OK'). The gate families were derived by hand from objectui package.json and .github/workflows; dispatch-gates.mjs was not used because it is objectstack-only. (e) Lint narrowed and declared, pnpm lint left to CI: 'eslint --no-inline-config --format json' on the 6 changed lintable files gave 6 files in the JSON output, 0 errors and 6 no-explicit-any warnings on unchanged lines (the diff adds or removes 0 'any' lines). Invariance: eslint.config.js has no parserOptions.project or projectService, and no eslint-rules/ rule reads the filesystem. (f) ABLATION with ablation-replace.mjs, fix committed first. Leg A re-adds the ai:input panel: anchor 1→0, blob ce23c9e4be50→bbc867e2bd2f, PLANTED-ENTRY-COUNT=1. block-config.test.ts 'Tests 1 failed | 42 passed (43)'; the failure is 'a block with a config panel is a block the palette offers', 'expected [ 'ai:input' ] to deeply equal []'. Restored: blob == HEAD ce23c9e4be50, git diff HEAD empty. Leg B (control) plants the same panel and restores the old specNames.includes(t) filter (OLD-FILTER-COUNT=1): that case 'Tests 1 passed | 42 skipped', which proves the old test skipped this shape. Both files were restored to their HEAD blobs (ce23c9e4be50, 50eec9b0c251) and git status was clean. No build or dist step is involved, because vitest aliases these paths to src.",
    "mcp_calls": "0",
    "api_writes": "2 REST writes, plus git push (not REST, 2 pushes: the empty-branch probe and 0fd05e1). (1) POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay request fw-20260925T011514Z-08f5ed; run 36081203666 conclusion success). It executed op pr_create = POST /repos/objectstack-ai/objectui/pulls with draft forced true and created PR #10444; the body read back byte-identical, 7688 bytes, no first differing byte. (2) POST /repos//issues/8280/comments, this os-dev-report, via post-stamped.mjs. Label writes: 0.",
    "open_questions": [
    {
    "question": "The claim comment 5824651169's file surface leaves out previews/tests/block-config-i18n.test.ts, which the ruled removal had to edit (it pins the removed key and the counts that include it). Should the seat amend the claim's surface?",
    "options": [
    "A: the seat adds the path to the claim's surface in this round (no open PR touches it)",
    "B: split the edit into its own PR (not possible: the removal is red without it)"
    ],
    "recommendation": "A, because the edit follows mechanically from the ruling. The PR cannot go green without it, and no in-flight PR overlaps it."
    }
    ],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · Stale placeholder-count prose that predates this branch: PageBlockInspector.i18n.test.tsx #3979 describe comment 'Ten of the seventeen placeholders are example VALUES', and block-config-i18n.test.ts literal-side describe comment 'ten English-looking strings remain'. Base has 11 literal placeholders, per that file's 'collects all N placeholders' pin. Not class a/b/c (a comment, not a defect) · noted in the PR's Acceptance notes, not filed"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    ✅ ACCEPT: objectui#10444 at 0fd05e1; ready, merge queue waits on auto-merge

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN. Checked against the diff and CI, not against the report's own account. Ruling 5810020464 ("remove the panel") is met at every point.

    Implemented-by:  claude/issue-8280-remove-ai-input-panel
    Reviewed-by:     session_014mXUNuFomfj24w7s1pZzhN
    
    item reading
    removal BLOCK_CONFIG['ai:input'] is gone, with its 6 i18n rows (three keys × en/zh; the card said four). No reader of those keys remains in objectui. The PROTOCOL_COMPONENTS placeholder and the CLI record are unchanged, as ruled
    the test's exemption "a block with a config panel is a block the palette offers" now reads TYPES_BY_CATEGORY, the list the Add-block picker renders, instead of filtering on the spec enum first. Ablation: re-adding the panel ⇒ 1 failed with expected [ 'ai:input' ] to deeply equal []. Control leg with the old filter ⇒ the case was skipped, which proves the hole
    8216 parity the ai:input exemption row is removed (it had to go: that test requires every exemption to have a panel). The two objectui#8281 rows are untouched
    file surface one path beyond the original claim: previews/__tests__/block-config-i18n.test.ts. It pinned the removed key and the counts that included it, so the ruled removal cannot go green without it. The seat added it to the claim (5824651169, edited after the report) and no open PR touches it
    Clause-②: no BLOCK_CONFIG is not reachable from @object-ui/app-shell's exports map (the reviewer checked index.ts and the map); no published schema, export or accept set moves
    contract review PASS at CONTRACT_REVIEW_TIER on this head, record 5825157986 (the seat read the reviewer transcript: 64/64 at tier)
    semver '@object-ui/app-shell': patch
    governed NOT GOVERNED (7 paths)
    CI 43 check-runs on 0fd05e1: 40 success, 3 skipped by design, 0 red. Lint and Type Check both success
    closing keywords the body's only closing reference is Fixes #8280

    Findings, each with its disposition

    • Two comments already stale on the base about placeholder counts ("Ten of the seventeen…", "ten English-looking strings…"; the real literal count is 11) ⇒ Acceptance notes. These are comments, not defects.
    • objectui#8281's body still names ai:input as its third block. The ruling told its claimant to re-read after this lands ⇒ no action here.
    • Reviewer nit: the retargeted zh-CN test's name slightly overstates ("prose sites no other case here renders") ⇒ Acceptance notes.

    State

    ready_for_review is done in this act. ⛔ Auto-merge is not set: this session's classifier refused that call (objectui#9933 comment 5824437727), and the seat does not re-issue it. The PR waits for the maintainer to enable auto-merge.


    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

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpackage: app-shellpriority:p3

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions