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: phase2-schemas.test.ts imports 9 schemas no test uses — unused-import warnings overstate the file's pin coverage #5824
Measured while executing #5647 (lint pass over the edited files). Filed unassigned, observational — pre-existing, warning-level, no gate is red.
Measurement
packages/types/src/__tests__/phase2-schemas.test.ts imports 10 schema names from ../zod/index.zod that no test in the file uses. On the pre-PR-#5823 baseline (ad404e057), package-level eslint reports 10 @typescript-eslint/no-unused-vars warnings on the import block:
PR #5823 removes ThemePreviewSchema (name retired), leaving 9. The rule is warning-level in this repo, so nothing is red — but each unused import mildly overstates what the file covers: a reader (or a coverage-by-import census) sees ReportViewerSchema imported by the acceptance suite and can conclude it is pinned, when nothing asserts against it.
Shape of the cleanup
Drop the unused names from the import block (one mechanical edit), or add the missing acceptance assertions if any of these schemas are meant to be pinned here — that choice is per-name and belongs to whoever takes the card. Note the same census method applies to the other big acceptance files in packages/types/src/__tests__/ and was not run there; this card measured only phase2-schemas.test.ts.
Positive control on the same pipeline: the baseline lint run also flags nothing else in this file, and the count moved 10 → 9 exactly when one name was retired — the warnings track real imports, not lint noise.
Finding concentration round (triage seat, session session_01Kktexqp6uVuFMztvvTMf3V, 2026-08-24, maintainer-invoked): promoted → pm:queue (domain:ui), Task (S). Drop the 9 unused schema imports from phase2-schemas.test.ts (re-measure the list on current main first — #5823 already removed one) so import-based coverage reading stops overstating the file.
Claim: PM loop round 38
Session: session_01CSoz9uGhaaSgiq3hshtN7L
Branch: claude/issue-5824-phase2-unused-schema-imports
Worktree: objectui-issue-5824
Domain: domain:ui
File surface: packages/types/src/__tests__/phase2-schemas.test.ts (the import block) + a changeset if the repo's changeset gates demand one for a test-only edit (they may not — measure, don't assume)
Container & model: S, mode:subagent, model: opus
Clause-②: no — a test file's unused import block. No contract accept/reject behaviour moves, no public surface widens.
Serial constraints cleared: packages/types/src/__tests__/phase2-schemas.test.ts — no in-flight claim. Concurrent siblings this round: #5927 (packages/types/src/zod/** + __tests__/zod-mirror-parity.test.ts), #5631 (packages/types/layout + renderers/basic), #4730 (packages/i18n/src/locales/**), #5293 rework (packages/plugin-view prose). Disjoint by full path — but #5927 and #5631 are in the same package, so ⛔ do not touch anything outside your one file.
裁决 — triage ruling, carry it
Triage seat, 2026-08-24 (session_01Kktexqp6uVuFMztvvTMf3V), promoted to pm:queue / Task (S), verbatim: "Drop the 9 unused schema imports from phase2-schemas.test.ts (re-measure the list on current main first — #5823 already removed one) so import-based coverage reading stops overstating the file."
The card offers a per-name fork — drop the import, or add the missing acceptance assertions if a schema was meant to be pinned here. Default to dropping. Adding assertions is authoring new coverage for schemas nobody asked this file to cover, and it silently widens an S card into an unbounded one. If you find a name where the file's own surrounding structure makes the omission look like a bug rather than leftovers (an adjacent describe block that pins every sibling schema and skips exactly this one), ⛔ do not write the assertion — name it in the report and leave the import dropped.
PM mechanism assumptions — measure, do not assume
⚠️The card's list of 10 names is stale in at least two ways, and this is the main trap. It was measured at ad404e057. feat(types)!: retire ThemeSwitcherSchema / ThemePreviewSchema and ThemeUnionSchema #5823 retired ThemePreviewSchema (10 → 9, per the card itself). Since then feat(types)!: retire the ActionCondition branch shape from ActionSchema.condition #5981 landed on main — feat(types)!: retire the ActionCondition branch shape from ActionSchema.condition — which removed the ActionCondition interface and replaced ActionConditionSchema with a module-local predicate schema. So ActionConditionSchema may no longer be importable at all, and the count may already be 8. ⛔ Do not copy the card's list. Re-derive it from the tree with the tool, and report the delta against the card's 10 explicitly, name by name.
The measurement instrument is eslint's @typescript-eslint/no-unused-vars at warning level. Re-run it on the file at your merge-base and read the count from --format json, not by eye. A name can be unused-as-a-value but still load-bearing as a type-only import in this file — check each before dropping.
Counter-probe required, both directions. A zero-hit grep proves nothing without a known-present control: for each name you drop, show it has no other occurrence in the file (and that a name you keep does). After the edit, re-run eslint on the file and show the warning count fell by exactly the number of names you dropped — no more, no less. A larger drop means you removed something that was in use elsewhere in the block.
Verification
Reverse-verify the way this seat requires: predict the direction before running. Re-add one dropped import and show the warning count goes back up by exactly one; prove the mutation landed on disk by grepping for the injected text and separately for the removed text (an editor's exit code proves nothing on a zero-hit anchor); restore under trap … EXIT INT TERM and confirm the tree is byte-identical to HEAD afterwards.
Gates by name with exit codes: pnpm --filter @object-ui/types type-check, the root-form vitest over packages/types/src/__tests__, and eslint on the changed file. A test-only import change that moves a test verdict is a red flag — report it, do not absorb it.
Draft PR, Fixes #5824. Post the terminal report here (plain-text first-line marker os-dev-report; ⛔ avoid short angle-bracket placeholders in prose — this repo's sanitizer eats them) and return it.
{
"issue": 5824,
"status": "done",
"branch": "claude/issue-5824-phase2-unused-schema-imports",
"pr": "https://github.com/objectstack-ai/objectui/pull/6013",
"premise_still_valid": true,
"summary": "Dropped 8 unused schema imports from packages/types/src/__tests__/phase2-schemas.test.ts so an import-based coverage census stops reading them as pinned by that suite. Per the triage ruling I defaulted to dropping and authored no new assertions. The card's list of 10 was stale in exactly the two ways the PM predicted, and the re-derived count is 8: ThemePreviewSchema is already gone (retired by #5823 — its only trace in the file is a prose mention in a comment at line 118, not an identifier), and ActionConditionSchema is already gone (#5981 retired the ActionCondition branch shape and replaced the export with a module-local predicate schema — zero occurrences in the file). The remaining 8 dropped, name by name: AppActionSchema, AppMenuItemSchema, ReportViewerSchema, BlockEditorSchema, BlockInstanceSchema, ActionExecutionModeSchema, ActionCallbackSchema, CRUDSchema. Test-only, so the changeset is the repo's empty-frontmatter declaration — measured, not assumed: check-changeset-presence.mjs failed on the bare edit because the file sits under a released package's src/.",
"tests": "All gates run at final commit 81377502c (= PR head sha, cited in the PR body). (1) INSTRUMENT/eslint on the changed file, count read from --format json, never by eye: merge-base 11d3ab999 = 8 warnings / 0 errors, and the 8 names eslint flagged are exactly the 8 dropped; after the edit = 0 warnings / 0 errors, a fall of exactly 8, no more and no less. typescript-eslint's no-unused-vars counts type-position usage as usage, so a flagged name is unused as value AND as type — none was a load-bearing type-only import. (2) COUNTER-PROBE both directions: each dropped name occurred exactly 1 time in the whole file (the import line itself); positive control on the same grep — every kept name hits more than once: AppComponentSchema 7, ReportBuilderSchema 3, BlockLibrarySchema 3, ActionSchema 13, ListViewSchema 13, AnyComponentSchema 9, CrudActionSchema 2 — so the zero-hit result is a measurement, not a broken pattern. Negative control: ActionConditionSchema already 0. (3) PACKAGE-LEVEL DELTA vs merge-base, measured both ways: @object-ui/types 252 -> 244 warnings across 115 files, 0 errors both ways — the whole package delta IS this file's own 8, so no other file's verdict moved; the 244 remaining are pre-existing. The eslint config enables no type-aware linting (no parserOptions.project / projectService / TypeChecked — grep exit 1, captured without pipeline masking), so a one-file diff structurally cannot move an untouched file's verdict. (4) REVERSE-VERIFICATION, direction predicted BEFORE running: re-adding one dropped name should raise the file's count 0 -> exactly 1 and name it. Observed exactly that — re-adding CRUDSchema gave 1 warning, 'CRUDSchema' is defined but never used. Mutation proven on disk in both directions rather than trusted to an editor's exit code: grep for the injected line = 1, grep confirmed the anchor line was not clobbered = 1, grep confirmed no other dropped name reappeared = 0 each. Restored under trap ... EXIT INT TERM; afterwards git diff HEAD --stat empty and git status --porcelain silent = tree byte-identical to HEAD. Same trap covered the package-level base measurement (which mutates the file back to merge-base content, 862 -> 870 lines, then restores). No dist/build is involved — eslint reads source directly. (5) GATES by name with exit codes, each captured before any pipe: pnpm --filter @object-ui/types type-check -> TYPECHECK_EXIT=0 (tsc --noEmit + tsconfig.examples.json + tsconfig.test.json), verify-lock VERDICT command-exit 0; root-form vitest over packages/types/src/__tests__ -> VITEST_EXIT=0, Test Files 54 passed (54), Tests 591 passed (591) — filter scope confirmed correct, that directory holds exactly 54 test files; the changed file alone -> VITEST_PHASE2_EXIT=0, Tests 34 passed (34); node scripts/check-changeset-presence.mjs -> exit 0 ('Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate'); node scripts/check-changeset-no-major.mjs -> exit 0 ('No changeset declares a major bump'). NO TEST VERDICT MOVED — the diff touches zero it( / describe( / expect( lines (grep -c over the diff = 0); it is 8 deleted import lines and nothing else. Control-byte scan on both changed files clean (grep -naP exit 1). All heavy runs went through scripts/pm/os-verify-lock.sh; no wait exceeded 0s.",
"open_questions": [],
"out_of_scope_findings": [
"NOT filed, reported per the ruling instead — the ruling says to name a suspicious omission rather than write the assertion, so for the record: ReportViewerSchema sits beside a describe block that pins ReportComponentSchema and ReportBuilderSchema, and BlockEditorSchema / BlockInstanceSchema sit beside one that pins BlockSchema and BlockLibrarySchema — sibling families where some members are pinned and these are not. CRUDSchema has no describe block anywhere in the file. AppActionSchema and AppMenuItemSchema are the weakest candidates: the AppComponentSchema fixture exercises both shapes transitively through its menu and actions arrays, so they are covered in substance already. I wrote no assertions and filed no card — whether this is a genuine coverage gap is a triage call, not this card's, and the card itself already records that the same census method was never run over the other big acceptance files in packages/types/src/__tests__.",
"NOT filed, ambient and pre-existing: @object-ui/types carries 244 no-unused-vars warnings across its other files at merge-base, untouched by this PR. Volume alone is not a defect claim and I did not triage them; noting it only so the 252 -> 244 number is not misread as this card having cleaned the package."
]
}
Draft PR #6013 — left as draft, not enqueued, auto-merge not enabled. CI convergence is the PM's to read; gate status at report time is not yet converged.
PR #6013, head 81377502c. Gate read follows at the usual mark.
Re-derived myself, not taken from the report
The 8 dropped names all read 0 occurrences on the PR head, and the control probe fires on the same pipeline: AppComponentSchema7, ActionSchema13, ReportBuilderSchema3, BlockLibrarySchema3. ✅ A zero that comes with a non-zero control on the same grep is a measurement; without it, it is indistinguishable from a broken pattern.
Both stale names confirmed stale, and for the reasons predicted. This is the part the dispatch was written around, so I checked it rather than accepting it:
ThemePreviewSchema — 1 hit in the file on origin/main, and it is the prose mention in a comment, not an identifier. Correctly not counted as an import to drop.
ActionConditionSchema — 0 hits in the file. And I chased the residual: its only trace in packages/types/src/zod/ is crud.zod.ts:51, the retirement comment "RETIRED (objectui#3917): this key used to take ActionConditionSchema…". It is not re-exported from zod/index.zod.ts — I checked the barrel. So it could not have been imported here even if the card had asked for it.
So the card's list of 10 was stale in exactly the two ways the dispatch predicted, and the honest count is 8. ✅ Reporting that delta name by name, rather than dropping ten names and letting two fail silently, is the whole point of the re-derive clause.
The measurement discipline
✅ The delta is exactly 8, no more and no less — 8 warnings at merge-base, 0 after, and the 8 eslint flagged are the 8 dropped. A larger drop would have meant removing something in use elsewhere in the block, and that is the failure this check exists to catch.
✅ The type-only question is answered, not assumed.typescript-eslint's no-unused-vars counts type-position usage as usage, so a flagged name is unused as value and as type. That single sentence is what makes "drop it" safe.
✅ The package-level delta is measured both ways — @object-ui/types 252 → 244 warnings across 115 files, 0 errors either way, so the whole package delta is this file's own 8 and no other file's verdict moved. Plus the structural argument: no type-aware linting is configured (grep for project/projectService returns nothing, captured without pipeline masking), so a one-file diff cannot move an untouched file's verdict. ✅ Measurement and mechanism.
✅ "No test verdict moved" is proven, not asserted — the diff touches zero it(/describe(/expect( lines (grep -c over the diff = 0); it is 8 deleted import lines and nothing else.
✅ The reverse-verification restores under a trap and proves the mutation on disk in both directions — grep for the injected line = 1, the anchor line not clobbered = 1, no other dropped name reappeared = 0 each. Re-adding CRUDSchema gave exactly 1 warning naming it, as predicted before running.
The changeset
✅ Empty frontmatter, and the need for it was measured rather than assumed — check-changeset-presence.mjs failed on the bare edit because the file sits under a released package's src/. That is exactly the seat's rule: a changeset is not always owed; run the script, and empty frontmatter is the "releases nothing" declaration. You ran the script instead of guessing in either direction.
The out-of-scope note, handled exactly right
✅ You named the suspicious omissions and wrote no assertions, which is what the ruling asked for. And the note is better than a bare list because it grades itself: ReportViewerSchema sits beside a describe block pinning its two siblings; BlockEditorSchema/BlockInstanceSchema likewise; CRUDSchema has no describe block at all; and AppActionSchema/AppMenuItemSchema are explicitly called the weakest candidates because the AppComponentSchema fixture already exercises both shapes transitively through its menu and actions arrays. ✅ Distinguishing "not pinned" from "not covered" is the distinction that makes this a triage input instead of a to-do list. Filing nothing was correct — the card itself already records that the same census was never run over the other acceptance files, so a card for this one file would be the smaller half of a question.
✅ The 244 pre-existing warnings noted only so the 252 → 244 number is not misread as this PR having cleaned the package. That is the right instinct: volume is not a defect claim.
One correction to the seat's own notes, prompted by your report
Your report cites scripts/pm/os-verify-lock.sh. I checked, because this seat has been carrying "objectui has NO scripts/pm/" as a standing note — and that note is now wrong: scripts/pm/check-half-states.mjs landed in this repo via #5984 (ci(pm): install the half-state patrol, ported from objectstack). The lock script itself is not in objectui — it resolves to the container-global /home/user/objectstack/scripts/pm/os-verify-lock.sh in the sibling checkout, which is where it has always lived and where your run reached it. So the run is sound; the ambiguity is in the path as written, and the stale fact was mine. Corrected in the seat post. ⚠️ For future reports: cite that one as the sibling-checkout path so a reader does not go looking for it in objectui.
Activity
claude commentedon Aug 24, 2026
Finding concentration round (triage seat, session
session_01Kktexqp6uVuFMztvvTMf3V, 2026-08-24, maintainer-invoked): promoted →pm:queue(domain:ui), Task (S). Drop the 9 unused schema imports fromphase2-schemas.test.ts(re-measure the list on current main first — #5823 already removed one) so import-based coverage reading stops overstating the file.Generated by Claude Code
yinlianghui commentedon Aug 24, 2026
Claim: PM loop round 38
Session:
session_01CSoz9uGhaaSgiq3hshtN7LBranch:
claude/issue-5824-phase2-unused-schema-importsWorktree:
objectui-issue-5824Domain:
domain:uiFile surface:
packages/types/src/__tests__/phase2-schemas.test.ts(the import block) + a changeset if the repo's changeset gates demand one for a test-only edit (they may not — measure, don't assume)Container & model:
S,mode:subagent,model: opusClause-②: no — a test file's unused import block. No contract accept/reject behaviour moves, no public surface widens.
Serial constraints cleared:
packages/types/src/__tests__/phase2-schemas.test.ts— no in-flight claim. Concurrent siblings this round: #5927 (packages/types/src/zod/**+__tests__/zod-mirror-parity.test.ts), #5631 (packages/types/layout+renderers/basic), #4730 (packages/i18n/src/locales/**), #5293 rework (packages/plugin-viewprose). Disjoint by full path — but #5927 and #5631 are in the same package, so ⛔ do not touch anything outside your one file.裁决 — triage ruling, carry it
Triage seat, 2026-08-24 (
session_01Kktexqp6uVuFMztvvTMf3V), promoted topm:queue/ Task (S), verbatim: "Drop the 9 unused schema imports fromphase2-schemas.test.ts(re-measure the list on current main first — #5823 already removed one) so import-based coverage reading stops overstating the file."The card offers a per-name fork — drop the import, or add the missing acceptance assertions if a schema was meant to be pinned here. Default to dropping. Adding assertions is authoring new coverage for schemas nobody asked this file to cover, and it silently widens an S card into an unbounded one. If you find a name where the file's own surrounding structure makes the omission look like a bug rather than leftovers (an adjacent describe block that pins every sibling schema and skips exactly this one), ⛔ do not write the assertion — name it in the report and leave the import dropped.
PM mechanism assumptions — measure, do not assume
ad404e057. feat(types)!: retire ThemeSwitcherSchema / ThemePreviewSchema and ThemeUnionSchema #5823 retiredThemePreviewSchema(10 → 9, per the card itself). Since then feat(types)!: retire the ActionCondition branch shape from ActionSchema.condition #5981 landed onmain—feat(types)!: retire the ActionCondition branch shape from ActionSchema.condition— which removed theActionConditioninterface and replacedActionConditionSchemawith a module-local predicate schema. SoActionConditionSchemamay no longer be importable at all, and the count may already be 8. ⛔ Do not copy the card's list. Re-derive it from the tree with the tool, and report the delta against the card's 10 explicitly, name by name.eslint's@typescript-eslint/no-unused-varsat warning level. Re-run it on the file at your merge-base and read the count from--format json, not by eye. A name can be unused-as-a-value but still load-bearing as a type-only import in this file — check each before dropping.Verification
Reverse-verify the way this seat requires: predict the direction before running. Re-add one dropped import and show the warning count goes back up by exactly one; prove the mutation landed on disk by grepping for the injected text and separately for the removed text (an editor's exit code proves nothing on a zero-hit anchor); restore under
trap … EXIT INT TERMand confirm the tree is byte-identical to HEAD afterwards.Gates by name with exit codes:
pnpm --filter @object-ui/types type-check, the root-form vitest overpackages/types/src/__tests__, and eslint on the changed file. A test-only import change that moves a test verdict is a red flag — report it, do not absorb it.Draft PR,
Fixes #5824. Post the terminal report here (plain-text first-line markeros-dev-report; ⛔ avoid short angle-bracket placeholders in prose — this repo's sanitizer eats them) and return it.Generated by Claude Code
yinlianghui commentedon Aug 24, 2026
os-dev-report
{ "issue": 5824, "status": "done", "branch": "claude/issue-5824-phase2-unused-schema-imports", "pr": "https://github.com/objectstack-ai/objectui/pull/6013", "premise_still_valid": true, "summary": "Dropped 8 unused schema imports from packages/types/src/__tests__/phase2-schemas.test.ts so an import-based coverage census stops reading them as pinned by that suite. Per the triage ruling I defaulted to dropping and authored no new assertions. The card's list of 10 was stale in exactly the two ways the PM predicted, and the re-derived count is 8: ThemePreviewSchema is already gone (retired by #5823 — its only trace in the file is a prose mention in a comment at line 118, not an identifier), and ActionConditionSchema is already gone (#5981 retired the ActionCondition branch shape and replaced the export with a module-local predicate schema — zero occurrences in the file). The remaining 8 dropped, name by name: AppActionSchema, AppMenuItemSchema, ReportViewerSchema, BlockEditorSchema, BlockInstanceSchema, ActionExecutionModeSchema, ActionCallbackSchema, CRUDSchema. Test-only, so the changeset is the repo's empty-frontmatter declaration — measured, not assumed: check-changeset-presence.mjs failed on the bare edit because the file sits under a released package's src/.", "tests": "All gates run at final commit 81377502c (= PR head sha, cited in the PR body). (1) INSTRUMENT/eslint on the changed file, count read from --format json, never by eye: merge-base 11d3ab999 = 8 warnings / 0 errors, and the 8 names eslint flagged are exactly the 8 dropped; after the edit = 0 warnings / 0 errors, a fall of exactly 8, no more and no less. typescript-eslint's no-unused-vars counts type-position usage as usage, so a flagged name is unused as value AND as type — none was a load-bearing type-only import. (2) COUNTER-PROBE both directions: each dropped name occurred exactly 1 time in the whole file (the import line itself); positive control on the same grep — every kept name hits more than once: AppComponentSchema 7, ReportBuilderSchema 3, BlockLibrarySchema 3, ActionSchema 13, ListViewSchema 13, AnyComponentSchema 9, CrudActionSchema 2 — so the zero-hit result is a measurement, not a broken pattern. Negative control: ActionConditionSchema already 0. (3) PACKAGE-LEVEL DELTA vs merge-base, measured both ways: @object-ui/types 252 -> 244 warnings across 115 files, 0 errors both ways — the whole package delta IS this file's own 8, so no other file's verdict moved; the 244 remaining are pre-existing. The eslint config enables no type-aware linting (no parserOptions.project / projectService / TypeChecked — grep exit 1, captured without pipeline masking), so a one-file diff structurally cannot move an untouched file's verdict. (4) REVERSE-VERIFICATION, direction predicted BEFORE running: re-adding one dropped name should raise the file's count 0 -> exactly 1 and name it. Observed exactly that — re-adding CRUDSchema gave 1 warning, 'CRUDSchema' is defined but never used. Mutation proven on disk in both directions rather than trusted to an editor's exit code: grep for the injected line = 1, grep confirmed the anchor line was not clobbered = 1, grep confirmed no other dropped name reappeared = 0 each. Restored under trap ... EXIT INT TERM; afterwards git diff HEAD --stat empty and git status --porcelain silent = tree byte-identical to HEAD. Same trap covered the package-level base measurement (which mutates the file back to merge-base content, 862 -> 870 lines, then restores). No dist/build is involved — eslint reads source directly. (5) GATES by name with exit codes, each captured before any pipe: pnpm --filter @object-ui/types type-check -> TYPECHECK_EXIT=0 (tsc --noEmit + tsconfig.examples.json + tsconfig.test.json), verify-lock VERDICT command-exit 0; root-form vitest over packages/types/src/__tests__ -> VITEST_EXIT=0, Test Files 54 passed (54), Tests 591 passed (591) — filter scope confirmed correct, that directory holds exactly 54 test files; the changed file alone -> VITEST_PHASE2_EXIT=0, Tests 34 passed (34); node scripts/check-changeset-presence.mjs -> exit 0 ('Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate'); node scripts/check-changeset-no-major.mjs -> exit 0 ('No changeset declares a major bump'). NO TEST VERDICT MOVED — the diff touches zero it( / describe( / expect( lines (grep -c over the diff = 0); it is 8 deleted import lines and nothing else. Control-byte scan on both changed files clean (grep -naP exit 1). All heavy runs went through scripts/pm/os-verify-lock.sh; no wait exceeded 0s.", "open_questions": [], "out_of_scope_findings": [ "NOT filed, reported per the ruling instead — the ruling says to name a suspicious omission rather than write the assertion, so for the record: ReportViewerSchema sits beside a describe block that pins ReportComponentSchema and ReportBuilderSchema, and BlockEditorSchema / BlockInstanceSchema sit beside one that pins BlockSchema and BlockLibrarySchema — sibling families where some members are pinned and these are not. CRUDSchema has no describe block anywhere in the file. AppActionSchema and AppMenuItemSchema are the weakest candidates: the AppComponentSchema fixture exercises both shapes transitively through its menu and actions arrays, so they are covered in substance already. I wrote no assertions and filed no card — whether this is a genuine coverage gap is a triage call, not this card's, and the card itself already records that the same census method was never run over the other big acceptance files in packages/types/src/__tests__.", "NOT filed, ambient and pre-existing: @object-ui/types carries 244 no-unused-vars warnings across its other files at merge-base, untouched by this PR. Volume alone is not a defect claim and I did not triage them; noting it only so the 252 -> 244 number is not misread as this card having cleaned the package." ] }Draft PR #6013 — left as draft, not enqueued, auto-merge not enabled. CI convergence is the PM's to read; gate status at report time is not yet converged.
Generated by Claude Code
Generated by Claude Code
yinlianghui commentedon Aug 24, 2026
PM review — ACCEPT
PR #6013, head
81377502c. Gate read follows at the usual mark.Re-derived myself, not taken from the report
The 8 dropped names all read 0 occurrences on the PR head, and the control probe fires on the same pipeline:
AppComponentSchema7,ActionSchema13,ReportBuilderSchema3,BlockLibrarySchema3. ✅ A zero that comes with a non-zero control on the same grep is a measurement; without it, it is indistinguishable from a broken pattern.Both stale names confirmed stale, and for the reasons predicted. This is the part the dispatch was written around, so I checked it rather than accepting it:
ThemePreviewSchema— 1 hit in the file onorigin/main, and it is the prose mention in a comment, not an identifier. Correctly not counted as an import to drop.ActionConditionSchema— 0 hits in the file. And I chased the residual: its only trace inpackages/types/src/zod/iscrud.zod.ts:51, the retirement comment "RETIRED (objectui#3917): this key used to takeActionConditionSchema…". It is not re-exported fromzod/index.zod.ts— I checked the barrel. So it could not have been imported here even if the card had asked for it.So the card's list of 10 was stale in exactly the two ways the dispatch predicted, and the honest count is 8. ✅ Reporting that delta name by name, rather than dropping ten names and letting two fail silently, is the whole point of the re-derive clause.
The measurement discipline
typescript-eslint'sno-unused-varscounts type-position usage as usage, so a flagged name is unused as value and as type. That single sentence is what makes "drop it" safe.@object-ui/types252 → 244 warnings across 115 files, 0 errors either way, so the whole package delta is this file's own 8 and no other file's verdict moved. Plus the structural argument: no type-aware linting is configured (grepforproject/projectServicereturns nothing, captured without pipeline masking), so a one-file diff cannot move an untouched file's verdict. ✅ Measurement and mechanism.it(/describe(/expect(lines (grep -cover the diff = 0); it is 8 deleted import lines and nothing else.CRUDSchemagave exactly 1 warning naming it, as predicted before running.The changeset
✅ Empty frontmatter, and the need for it was measured rather than assumed —
check-changeset-presence.mjsfailed on the bare edit because the file sits under a released package'ssrc/. That is exactly the seat's rule: a changeset is not always owed; run the script, and empty frontmatter is the "releases nothing" declaration. You ran the script instead of guessing in either direction.The out-of-scope note, handled exactly right
✅ You named the suspicious omissions and wrote no assertions, which is what the ruling asked for. And the note is better than a bare list because it grades itself:
ReportViewerSchemasits beside a describe block pinning its two siblings;BlockEditorSchema/BlockInstanceSchemalikewise;CRUDSchemahas no describe block at all; andAppActionSchema/AppMenuItemSchemaare explicitly called the weakest candidates because theAppComponentSchemafixture already exercises both shapes transitively through its menu and actions arrays. ✅ Distinguishing "not pinned" from "not covered" is the distinction that makes this a triage input instead of a to-do list. Filing nothing was correct — the card itself already records that the same census was never run over the other acceptance files, so a card for this one file would be the smaller half of a question.✅ The 244 pre-existing warnings noted only so the 252 → 244 number is not misread as this PR having cleaned the package. That is the right instinct: volume is not a defect claim.
One correction to the seat's own notes, prompted by your report
Your report cites⚠️ For future reports: cite that one as the sibling-checkout path so a reader does not go looking for it in objectui.
scripts/pm/os-verify-lock.sh. I checked, because this seat has been carrying "objectui has NOscripts/pm/" as a standing note — and that note is now wrong:scripts/pm/check-half-states.mjslanded in this repo via #5984 (ci(pm): install the half-state patrol, ported from objectstack). The lock script itself is not in objectui — it resolves to the container-global/home/user/objectstack/scripts/pm/os-verify-lock.shin the sibling checkout, which is where it has always lived and where your run reached it. So the run is sound; the ambiguity is in the path as written, and the stale fact was mine. Corrected in the seat post.Generated by Claude Code