Repository navigation
finding(spec): ai:chat_window is a declared page component type with no renderer — the console answers a page that uses it with "Unknown component type", and no app authors it #21504
Description
Activity
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsTriage: first grade —
bug·priority:p3·domain:spec·area:ai·pm:queue. Retireai:chat_window, refused by nameTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-03T01:01Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. The failure is loud: the console answers "Unknown component type". It has no writer.
Routing:
packages/spec, sodomain:spec.Ruling: retire, under ADR-0049 enforce-or-remove. Zero producers, measured at
origin/main:- none in objectstack beyond spec tests and type lists;
- none in
objectstack-ai/cloud; objectstack-ai/hotcrmonly names it in a comment as dropped (src/sales/pages/account_detail.page.ts).
The console omits it on purpose (objectui
packages/components/src/renderers/placeholders.tsx). The floating chat overlay is the entry point.The landing follows the
user:profileprecedent (#14159):- the type leaves the page component list and its
ComponentPropsMaprow; - it is refused by name through
RETIRED_PAGE_COMPONENT_TYPES, with a message that names the chat overlay; - the retirement kit is included: a D3 entry and a changeset.
- ⛔ De-advertising it alone is not enough. The open string arm would still accept it.
Not here:
ai:suggestion. It has a placeholder renderer, which is a different class.
Generated by Claude Code
- addedarea:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesbugSomething isn't workingSomething isn't workingand removed
on Oct 3, 2026 objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01YDt3PzwfrkuFzUBF89WPmM
Account:os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-21504-retire-ai-chat-window
Worktree:objectstack-issue-21504
Domain:domain:spec
Seat:domain:spec#2
File surface (at529d9711fb), per triage5963897014(retire, refused by name, theuser:profileprecedent #14159):packages/spec/src/ui/page.zod.ts:'ai:chat_window'leaves the page component-type list, and joinsRETIRED_PAGE_COMPONENT_TYPESwith a message that names the floating chat overlay as the entry point.packages/spec/src/ui/component.zod.ts: theComponentPropsMaprow'ai:chat_window'andAIChatWindowPropsgo, unless the census finds another consumer; then the dev reports first.packages/spec/src/ui/component-props-unknown-members.pin.test.ts: itsai:chat_windowcontext{}"no-reader" line goes with the row (PR feat(spec)!: object-map, object-gantt and object-tree type navigation by reference, and one pin enumerates every z.unknown() member of ComponentPropsMap (#21464, stage 1) #21502, landed).- The retirement kit, as the precedent did: a D3 entry, whatever conversion or retired-def registration the precedent used, the regenerated artifacts, and one changeset.
- ⛔ Not
ai:suggestion(triage: a different class). - Stop on breach and explain in the report.
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tierat529d9711fb: no path-derived mandate; floor sonnet · default opus · ceilingCONTRACT_REVIEW_TIER).packages/spec/src/**, a narrowing, so the at-tier contract review runs as a separate isolated subagent after the PR opens.
Clause-②: yes (narrowing)
Thread-read: 5963897014
Serial constraints cleared: PR #21502 (#21464 stage 1), which added the pin line this removes, landed as529d9711fb. At 2026-10-03T02:06Z, no open PR touchesui/component.zod.ts,ui/page.zod.ts, the pin, their references pages ormigrations/registry.ts. #21464's next stage (S-list) waits for this one.Seat terms: p3, under the maintainer's 「p3 的卡也可以派了」 (
5952442849). The PR isFixes #21504.
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21504,
"status": "done",
"branch": "claude/issue-21504-retire-ai-chat-window",
"pr": "#21531",
"session": "session_01YDt3PzwfrkuFzUBF89WPmM — the parent session (mode:subagent), from the Claude-Session line this run commits under",
"premise_still_valid": true,
"summary": "Retired the ai:chat_window page component type under ADR-0049, refused by name through RETIRED_PAGE_COMPONENT_TYPES, per triage ruling 5963897014 and the user:profile precedent (#14159, PR #15112). The type left PageComponentType and joined the map. Its message names the floating chat overlay as the supported entry point, carries no tracker number, and points agentId's intent at the app's defaultAgent. AIChatWindowProps was deleted, and the ComponentPropsMap row stays as retiredComponentProps (a z.never refusing every bag), as the precedent's row did. The kit: the D3 semantic entry ui-ai-chat-window-retired, a STEP18_RATIONALE fragment, RETIRED_DEFS_BY_MAJOR[18] ui/AIChatWindowProps, the regenerated artifacts, the pages.mdx list, the enumeration pin's ai:chat_window line removed, and one minor BREAKING changeset. Draft PR #21531 is open and assigned to os-tesla. ai:suggestion is untouched and is the pinned control.",
"tests": "All at 3f17d52 unless noted. The merge of origin/main 88fb5e8 touched no spec, lint or docs input, and git diff 26ae681..3f17d52 over packages/spec, packages/lint and content/docs is empty. (1) @objectstack/spec build: VERDICT command-exit 0, with the build gate printing '1 baseline deletion(s) ... ui/AIChatWindowProps:* (4 line(s)) — def no longer emitted by this build'. (2) check:generated: '✓ All 15 generated artifacts are up to date'. (3) spec test --project local, at 26ae681 (inputs byte-identical to head): 'Test Files 603 passed (603) / Tests 17845 passed | 1 todo'. (4) spec typecheck: exit 0, 'check:test-typecheck: OK'. (5) Targeted run: component.test.ts, the vocabulary test, the enumeration pin, migrations.test.ts and step18-rationale-merge.test.ts gave '5 passed / 611 passed'. Verbose -t 'ai:chat_window' gave '8 passed' (7 in the new describe plus 1 vocabulary pin). (6) @objectstack/lint, after building its closure (lint^...): 'Test Files 119 passed / Tests 5615 passed | 5 skipped'. 'flags ai:chat_window' runs off the map. lint typecheck exit 0. (7) ABLATION, implementation committed first, mutated with scripts/ablation-replace.mjs (an anchor that must hit, on-disk counts and blobs), subject resolved by relative import to src, so no dist was involved. Leg A, the dispatch's ablation, removed the map entry: anchor x1 → x0, blob 7d2faf0b1f79 → 501c4251ee90. Observed direction LOUDER than the pin: component.test.ts fails at collection, 'Error: retiredComponentProps:ai:chat_windowhas no RETIRED_PAGE_COMPONENT_TYPES entry (page.zod.ts)', 1 file failed, no tests. Leg B removed the entry and turned the row into emptyProps so the module loads: 5 failed | 360 passed. The 5 are the map pin, the row pin, PageComponentSchema by name, PageSchema at the element path, and the enum error map. Restore: ablation-replace 'ok restored: blob == HEAD' for both files (page 7d2faf0b1f79, component 891d947a3232), a script-level hash-object check against HEAD, git diff HEAD empty, status clean. Post-restore run: '1 passed / 365 passed'. (8) NOT MEASURED: spec test:repo (--project repo), reason: one vitest worker idle under 2% CPU for 10 minutes with no output on the shared box, stopped by its task id. CI runs it.",
"gates": [
{ "command": "pnpm --filter @objectstack/spec build", "exit": 0, "verdict": "os-verify-lock: VERDICT command-exit 0 · held the lock 79s" },
{ "command": "pnpm --filter @objectstack/spec check:generated", "exit": 0, "verdict": "✓ All 15 generated artifacts are up to date" },
{ "command": "pnpm --filter @objectstack/spec run check:liveness", "exit": 0, "verdict": "✓ packages/spec/liveness/state-counts/ is current" },
{ "command": "pnpm --filter @objectstack/spec run check:migration-registry", "exit": 0, "verdict": "✓ src/migrations/registry.ts is current (354 semantic, 246 retired-key, 218 retired-def)" },
{ "command": "pnpm --filter @objectstack/spec test (vitest --project local)", "exit": 0, "verdict": "Test Files 603 passed (603); Tests 17845 passed | 1 todo" },
{ "command": "pnpm --filter @objectstack/spec typecheck", "exit": 0, "verdict": "check:test-typecheck: OK — 52 file(s) / 246 error(s) / 135 pinned signature(s) held" },
{ "command": "pnpm --filter @objectstack/lint test + typecheck", "exit": 0, "verdict": "Test Files 119 passed; Tests 5615 passed | 5 skipped; check:test-typecheck: OK" },
{ "command": "node scripts/check-adr-0087-registration.mjs --base origin/main", "exit": 0, "verdict": "✓ 1 declared-breaking changeset(s) ... registered ui-ai-chat-window-retired (new here: ui-ai-chat-window-retired)" },
{ "command": "node scripts/check-changeset-no-major.mjs --base origin/main --event (the PR body)", "exit": 0, "verdict": "✓ LEVEL AXIS: this PR declares clause-② yes (narrowing), and no package whose packages//src/ it moves is graded patch" },
{ "command": "node scripts/check-empty-changeset.mjs --base origin/main", "exit": 0, "verdict": "✓ No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added)" },
{ "command": "pnpm check:doc-authoring", "exit": 0, "verdict": "✓ doc authoring guard: 17291 customer-facing string(s) across 1249 spec sources clean" },
{ "command": "pnpm check:nul-bytes", "exit": 0, "verdict": "check-nul-bytes: OK (scanned 9872 text file(s) ... no raw ASCII control bytes)" },
{ "command": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran-final.list", "exit": 0, "verdict": "✓ dispatch-gates --ran: 114 derived famil(ies) accounted for — 112 run, 2 NOT-MEASURED (1 DERIVED from a recorded exit 3, 1 claimed)" },
{ "command": "pnpm check:dual-build-cjs-loads", "exit": 3, "verdict": "NOT MEASURED: PREREQUISITE NOT MET — needs a whole-repo pnpm build; declared to CI" },
{ "command": "pnpm check:type-check-debt", "exit": 124, "verdict": "NOT MEASURED: killed by the 420s per-gate timeout on the shared box (repo-wide tsc); spec and lint typecheck green; declared to CI" }
],
"gates_note": "The derived list (114 commands from dispatch-gates --commands at 3f17d52) ran byte for byte, and each exit code went to disk before any pipe. Five gates first answered exit 3 (lint, client-react and objectql not built). After building those closures under the lock, all five were re-run and exited 0: lint check:doc-formula-expressions, lint check:doc-security-posture, spec check:skill-examples, check:docs-transcript-drift and check:lean-entry-closure. The other 107 gates exited 0 on the first sweep.",
"line_budget": "22 files, +393 -74 against merge base 88fb5e8. Hand-written: page.zod.ts +35/-3, component.zod.ts +18/-13, component.test.ts +118/-4, vocabulary test +17, pin -4, D3 entry +51, retired-def entry +17, rationale fragment +14 of registry.ts's +77 (the rest are generated regions), changeset +43, pages.mdx +1/-1, lint comment +1/-1. Generated: references docs, api-surface, export-origins, declaration-map, authorable-surface (-4), authorable-defaults, json-schema.manifest, docs-import-surface baseline, strictness counts. Well under the 5,000-line human-merge threshold. No governed surface is touched (no .claude/, skills/, docs/adr/**, AGENTS.md), so no tier record is needed.",
"files_changed": [
".changeset/ai-chat-window-retired.md",
"content/docs/references/index.mdx (generated)",
"content/docs/references/ui/component.mdx (generated)",
"content/docs/references/ui/page.mdx (generated)",
"content/docs/ui/pages.mdx",
"docs/audits/2026-07-unknown-key-strictness-ledger.counts/ui.md (generated)",
"packages/lint/src/validate-page-field-bindings.ts (comment only)",
"packages/spec/api-surface/ui.json (generated)",
"packages/spec/authorable-defaults/ui.json (generated)",
"packages/spec/authorable-surface/ui.json (4 def lines deleted as the build gate prescribes; proof accepted)",
"packages/spec/declaration-map/ui.json (generated)",
"packages/spec/docs-import-surface.baseline.json (generated, --update-import-baseline)",
"packages/spec/export-origins/ui.json (generated)",
"packages/spec/json-schema.manifest/ui.json (1 key deleted as the build gate prescribes)",
"packages/spec/src/migrations/entries/retired-defs/18.ui__AIChatWindowProps.ts",
"packages/spec/src/migrations/entries/semantic/18.ui-ai-chat-window-retired.ts",
"packages/spec/src/migrations/registry.ts (fragment by hand, regions by gen:migration-registry)",
"packages/spec/src/ui/component-props-unknown-members.pin.test.ts",
"packages/spec/src/ui/component-type-vocabulary.test.ts",
"packages/spec/src/ui/component.test.ts",
"packages/spec/src/ui/component.zod.ts",
"packages/spec/src/ui/page.zod.ts"
],
"census_a1": "At 529d971, counted with git grep -c -F. 'ai:chat_window': skills 0, examples 0, packages/apps 0, apps 0, content/docs 3 (2 in the generated references page.mdx, 1 in the ui/pages.mdx list), packages 9. The 9 are page.zod.ts:164, the component.zod.ts row and surface string, component.test.ts x3, the pin x2, and the scripts/format-type.test.ts frozen fixture (left as is, like user:profile in the same fixture). 'AIChatWindowProps': the def, the generated artifacts, the references docs, and one illustrative comment in packages/lint/src/validate-page-field-bindings.ts:29. The comment is not a consumer and was updated. Control in the same query shape: 'element:divider' examples 3, 'record:details' examples 12, apps 1. 'ai:suggestion' is also 0 in examples, skills and apps. objectui at the .objectui-sha pin 89cad75d55: no renderer (placeholders.tsx omits it), a palette exclusion, a parity-ledger entry, tests and comments. No non-test source imports AIChatWindowProps or indexes the row, so the Console Pin Gate build references nothing removed. No producer and no non-test consumer, so there was no stop.",
"precedent": "PR #15112 (97a2263), #14159 user:profile. Matched: the enum value removed. The map entry, the enum error map and the PageComponentSchema.type check share one string. The ComponentPropsMap row is kept as retiredComponentProps (z.never, whole bag refused). Pins at the three doors with code, path, params and the first sentence, a positive control, and the open arm. A vocabulary pin. Regenerated artifacts, the hand-written pages.mdx list, a minor changeset. Beyond #15112, as the ruling and the gates required: the D3 semantic entry (in the shape of #17592/#17845's element-filter-and-form-node-refused) with its STEP18 fragment, and RETIRED_DEFS_BY_MAJOR[18] ui/AIChatWindowProps. That entry is required because a published def leaves, which user:profile's empty row never did, and it follows the ui/FormFieldPublicPicker / ui/Theme entries. No D2 conversion, as in the precedent: the only edit is deleting an authored page node.",
"ablation": "See tests (7). The dispatch's ablation (Leg A, the map entry removed) went red more loudly than predicted: a module-load error from retiredComponentProps's guard, not a pin assertion. Leg B (the entry removed plus a non-throwing row) turned exactly the 5 by-name pins red. Restore was proven by blob for both files, and the post-restore run was 365/365 green.",
"semver": "@objectstack/spec minor with a BREAKING banner, 'Clause-②: yes (narrowing)' in both the changeset and the PR body, a FROM → TO table, and the ADR-0087 marker 'registered ui-ai-chat-window-retired'. The judging lines: check-changeset-no-major '✓ This diff introduces nomajorbump.' and '✓ LEVEL AXIS: this PR declares clause-②yes (narrowing)'. check-adr-0087-registration: '[BREAKING+bang+clause-②-narrowing] registered ui-ai-chat-window-retired (new here: ui-ai-chat-window-retired)'. No gate refused, and the level was not changed.",
"deviations": [
"The ComponentPropsMap row is KEPT as retiredComponentProps('ai:chat_window'), not deleted. The claim and A3 said 'the row ... go[es]'. The precedent's shape keeps the row; its docblock says deleting it demotes a loud retirement to a silent skip. Two tests require the row: component-type-vocabulary.test.ts asserts every RETIRED_PAGE_COMPONENT_TYPES member stays isKnownComponentType, and objectui's registry-inputs-spec-parity.test.ts classifies retired types through the kept row. AIChatWindowProps (the row's props def) is deleted as A3 said. A3 was a Zone 2 assumption, falsified by the precedent itself. Zone 1's 'leaves ... its ComponentPropsMap row' is satisfied in the precedent's sense.",
"The kit goes beyond PR #15112 in two items: the D3 entry (ruling-mandated) and a RETIRED_DEFS_BY_MAJOR entry (build-gate-mandated, because a published def leaves).",
"Files outside the claim's file surface: packages/lint/src/validate-page-field-bindings.ts (a one-line comment whose example named the deleted AIChatWindowProps.agentId; it now names ElementImagePropsSchema.alt; no publish change), content/docs/ui/pages.mdx (A5), and the generated docs/audits strictness counts.",
"The prescription also points agentId's intent at app.defaultAgent. Verified at the objectui pin: ChatDock.tsx:242 forwards app.defaultAgent to the one resolver, and hooks/surfaceAgent.ts:127-128 bounds it to ask/build.",
"Merged origin/main 88fb5e8 into the branch before opening the PR (merge commit 3f17d52). It touched none of this PR's inputs.",
"spec test:repo was stopped after 10 idle minutes, to free the shared lock (another agent was queued). NOT MEASURED, declared to CI.",
"Commit trailers use AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude) instead of the harness reminder's model-named Co-Authored-By. AGENTS.md says the pre-push hook refuses a model identifier in that pair, and the repo instructions take precedence.",
"PR body footer uses AGENTS.md's session-URL form, not the harness reminder's emoji form, for the same precedence reason."
],
"ci": "in_progress at report time: head 3f17d52, 32 check runs, 14 completed and 18 in_progress, 0 failures so far. Not waited on, per the dispatch contract.",
"hot_files_a7": "Rechecked before pr_create. All 8 open PRs were listed by REST and the 6 non-bot ones had their files read (control: #21521 lists 11 files, 6 under packages/spec). None touches ui/component.zod.ts, ui/page.zod.ts, the pin, migrations/registry.ts or entries, the references pages, or the ui shards.",
"mcp_calls": "0 — no MCP GitHub tool was called, read or write",
"api_writes": "3 relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, draft, run 37093182473, read back 9864 bytes sent and 9864 stored, identical. (2) label-write --assign os-tesla, POST /repos//issues/21531/assignees, run 37093224814, read back matches. (3) this os-dev-report, POST /repos//issues/21504/comments via post-stamped.mjs. git push (not REST): the empty-branch probe plus 3 pushes (b61a181, 26ae681, 3f17d52), no force. Everything else was a REST GET.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: the next objectui @objectstack/spec bump PR (its reconciliation step, as objectui#7122 did for user:profile / element:form). At the pin 89cad75d55, two objectui tests will flip when objectui installs a spec carrying this retirement, because both still treat ai:chat_window as a live enum member. They are packages/app-shell/src/views/metadata-admin/previews/tests/block-config.test.ts ('every exclusion names a real spec type', via PALETTE_EXCLUSIONS) and apps/console/src/tests/registry-inputs-spec-parity.test.ts (UNJUDGED_SPEC_BLOCKS 'NOT REGISTERED, DELIBERATELY', exclusive with 'RETIRED UPSTREAM'). They are objectui tests against its installed spec, not objectstack CI and not the Console Pin Gate build. Noted in the PR's acceptance notes, not filed.",
"carrier: #21464's next stage (S-list), which edits component-props-unknown-members.pin.test.ts. The ledger's 'no-reader' Reason kind has no user now that the ai:chat_window line is gone; it is left as vocabulary. Noted, not filed."
],
"cleanup": "Removed the worktree /home/user/objectstack-issue-21504 with git worktree remove, no --force, after confirming HEAD 3f17d52 equals the remote branch and git status --porcelain is empty. Root node_modules was removed first. Both background runs (the stopped spec test:repo and the gate sweep) had ended, confirmed by PID. No dev server or monitor was started."
}
Generated by Claude Code
objectstack-fleet commented
on Oct 3, 2026 ContributorAuthorMore actionsLanded: PR #21531 →
48eb9c193fdomain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM), holder of claim5964418092· 2026-10-03T04:28Z- Landed: PR feat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (#21504) #21531 went through the merge queue as
48eb9c193f, with one parent (31d2255f5c).Fixes #21504closed this card ascompleted. - Blob check against the ACCEPTed head
3f17d522: 22 of 22 files are blob-equal. - Delivered:
ai:chat_windowis retired under ADR-0049, on theuser:profileprecedent.- It left
PageComponentType, and the page node refuses it by name throughRETIRED_PAGE_COMPONENT_TYPES. The message names the floating chat overlay as the AI chat entry point and pointsagentId's intent at the app'sdefaultAgent. - The
ComponentPropsMaprow stays asretiredComponentPropsand refuses every bag. AIChatWindowPropsleft the public surface and is registered inRETIRED_DEFS_BY_MAJOR[18].- The D3 entry is
ui-ai-chat-window-retired. - Release:
@objectstack/specminorwith the BREAKING banner. It publishes with the next Version Packages release. - The review is
5965171663and the ACCEPT is5965292733.ai:suggestionis untouched.
- It left
- For objectui, at the
@objectstack/specbump that resolves a release carrying this change: two objectui tests still treatai:chat_windowas a live spec member (at the pin89cad75d55), and that bump's own CI will fail on them.packages/app-shell/src/views/metadata-admin/previews/__tests__/block-config.test.ts:PALETTE_EXCLUSIONSnames it, and "every exclusion names a real spec type" will fail.apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:UNJUDGED_SPEC_BLOCKSlists it as "not registered, deliberately". It moves to "retired upstream", as objectui#7122 did foruser:profile.
- Carried to spec(ui): the
ComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464's next stage, which edits the neighbouring enumeration pin:- the
KNOWN_COMPONENT_TYPESdocblock incomponent-type-vocabulary.tsis one member short (comment only); - the pin's
no-readerreason kind has no user now.
- the
pm:dispatchedcomes off in this act.
Generated by Claude Code
- Landed: PR feat(spec)!: ai:chat_window is retired — refused by name at the schema door, the floating chat overlay is the AI chat entry point (#21504) #21531 went through the merge queue as
- added 3 commits that reference this issue
on Oct 7, 2026
Filing gate: ① a defect with a measured
reach:, finding class: declared, not enforced. A component type the spec accepts on a page is one the console refuses to draw.reach:read at objectstackmainand objectui's.objectui-shapin89cad75d55, by the #21464 stage-1 dev (os-dev report5963737459,open_questions[2]). This seat verified each position at the pin. Filed bydomain:specseat 2 (session_01YDt3PzwfrkuFzUBF89WPmM, seat post #18549). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.Measured
packages/spec/src/ui/page.zod.ts:164lists'ai:chat_window'among the page component types, andpackages/spec/src/ui/component.zod.ts:6662maps it toAIChatWindowPropsinComponentPropsMap.packages/components/src/renderers/placeholders.tsx:109-113(at89cad75d55) says'ai:chat_window' intentionally omitted. The floating chat overlay (plugin-chatbot) is the canonical entry point, and a page that references the type gets a loud "Unknown component type".The fix direction (⛔ not a ruling)
Retire
ai:chat_windowfromComponentPropsMapand the page component-type list under ADR-0049 enforce-or-remove, with the retirement kit (tombstone or value-level refusal, a D3 entry, a changeset). Retiring a declared type may need a ruling first. That is triage's call.Dedupe
The 1,000 most recently updated issues and PRs here, open and closed, were listed by REST and grepped for
ai:chat_window,chat_windowandAIChatWindowProps. 1 hit: PR #21502, which names this as out of its scope. No card covers it.Dedupe words:
ai:chat_window renderer retire·chat_window ComponentPropsMap no reader·page component type no rendererGenerated by Claude Code