Repository navigation
lint/types: 14,366 no-explicit-any warnings can never red CI — make it an error on packages/types/src, delete the vestigial (schema as any) reads, and type ComponentRendererProps with unknown #25918
Description
维护者速读
全仓 pnpm exec eslint packages/*/src apps/console/src:7,339 文件,0 error,16,183 warning,其中 @typescript-eslint/no-explicit-any 14,366(非测试源码 4,457)、react-hooks/set-state-in-effect 294、react-hooks/refs 201、no-unused-vars 200。规则是 warn 且无 --max-warnings,与 objectui#4806 同一结构:什么都不能让 CI 红。元数据路径上 155 处 (schema as any).KEY 读取,逐键核对后几乎全是遗留壳——真被藏住的只有 rowActionDefs。196 个注册渲染器 0 个用 ComponentRendererProps 泛型,81 份内联 [key: string]: any 签名。不做全仓翻转(objectui#8316 已拒),只在发布的授权面上加严。
Measured (2026-10-24, HEAD 7981384)
- ESLint census (5m26s wall): 7,339 files, 0 errors, 16,183 warnings.
@typescript-eslint/no-explicit-any14,366 — in non-test source 4,457: app-shell 1,188, components 415, plugin-detail 376, core 304, plugin-grid 267, fields 257, plugin-form 226, types 213. Alsoreact-refresh/only-export-components863,react-hooks/set-state-in-effect294,react-hooks/refs201,@typescript-eslint/no-unused-vars200,react-hooks/exhaustive-deps153.eslint.config.jssets'@typescript-eslint/no-explicit-any': 'warn'and no workflow passes--max-warnings. - Text census (non-test, excluding
ui/):: any2,091,as any1,301,as unknown as170,@ts-ignore0,@ts-expect-error1 real site. Top files by casts:plugin-grid/src/ObjectGrid.tsx156,plugin-list/src/ListView.tsx111,app-shell/src/views/ObjectView.tsx96,data-objectstack/src/index.ts85. - Metadata path: 155 reads of the shape
(schema|node|view|field|… as any).KEY— plugin-viewObjectView.tsx33,ListView.tsx27,ObjectGrid.tsx10,WizardForm.tsx8,action-group.tsx8. Checking every keyListViewreads through the cast againstpackages/types/src/objectql.ts:options,kanban,tree,timeline,gantt,gallery,calendar,bulkActionDefs,userActions,title,chartare all declared;rowActionDefsis declared nowhere (read via cast 3 times in ListView, 3 in ObjectGrid, 1 in plugin-view) and has no spec row (specview.zod.tshasrowActions,bulkActions,bulkActionDefs). objectui#11349 already removed the same vestigial casts fromSchemaRenderer. - Renderers:
packages/components/src/renderershas 196 files callingregister; 0 use theComponentRendererPropsgeneric; 81 declare an inline props type of the shape "schema of X, optional className, index signature to any";ComponentRendererPropsitself (packages/types/src/base.ts) is an index signature to any by design (#0.1 keeps renderer props tolerant).PluginScopeImpl.registerComponent(type: string, component: any, meta?: any)in core. - tsconfig:
strict: trueeverywhere;noUncheckedIndexedAccess,exactOptionalPropertyTypes,noImplicitOverrideappear in 0 configs; 38 of 40 packages extend the roottsconfig.json(noUnusedLocals: false), not the tier base — the objectui#4806 gap.
Recommendation (no new script)
- Scope
'@typescript-eslint/no-explicit-any': 'error'topackages/types/src— the published authoring face — the same wayeslint.config.jsalready scopesconsistent-type-assertions: nevertoRegistry.ts; 213 existing sites are the ceiling to burn down (e.g.complex.tsmetadata?: any,data.tsdata?: any). The repo-wide flip stays declined per objectui#8316. - Delete the
(schema as any)reads inListView.tsx, plugin-viewObjectView.tsxandObjectGrid.tsx; forrowActionDefsdecide spec-first (declare on the spec row, or stop reading) per AGENTS #0.1. - Change
ComponentRendererPropsand the 81 inline copies from an index signature to any to an index signature to unknown: forwarded keys stay admitted (the SchemaRenderer forward path in AGENTS §9 is untouched) but a renderer must narrow before use. Step 0 is the one-line change pluspnpm --filter @object-ui/components type-checkto count breaks — 未实测. - Optional decision box:
noUncheckedIndexedAccesserror count via onetsc -prun — 未实测.
Benefit: the published types face can no longer grow new any; props.foo.bar in renderers stops compiling silently; one undeclared metadata read (rowActionDefs) gets a contract.
Refs: objectui#4806, objectui#11349, objectui#8316, objectui#8347.
Filed by the read-only whole-repo review session https://claude.ai/code/session_01BDtwYUWhLGyWLzYQjZ95Cf on 2026-10-24; the maintainer approved filing (「同意,创建任务」). Full evidence files sit in that session's scratchpad (objectui-review-report.md, findings-*.md). ⛔ Not a claim; for triage to grade and route.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 24, 2026
Triage: first grade —
tech-debt·priority:p3·domain:ui·area:devpath·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-24T14:56Z⛔ Not a claim, ⛔ not a dispatch.
findingcomes off.(schema as any)reads inListView/ObjectView/ObjectGrid, and moveComponentRendererPropsand its 81 inline copies fromanytounknownindex signatures. ForrowActionDefs, go spec-first (AGENTS #0.1): it either becomes a spec card or the read stops.no-explicit-any: 'error'onpackages/types/src. A lint rule that can turn CI red is a new gate, and new gates default to no.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T03:58Z from objectstack-ai/objectui#13456, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. Read every repository path in the body with a
ui/prefix:apps/console/srcis nowui/apps/console/src;packages/types/src/objectql.tsis nowui/packages/types/src/objectql.ts;packages/components/src/renderersis nowui/packages/components/src/renderers;packages/types/src/base.tsis nowui/packages/types/src/base.ts;packages/types/srcis nowui/packages/types/src.Labels.
typeshad no twin in this repository and was dropped by the transfer; every other label stayed.No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01GJjkZ6pmdwWoDYH8fE8FAnAccount:
os-steveBranch:
claude/project-thread-r8hdni(platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)Worktree: the card thread's own container
Domain:
domain:uiSeat:
domain:ui#1File surface: partial,
Part of #25918, the triage in-scope item only:ComponentRendererProps(ui/packages/types/src/base.ts) and the inline renderer props copies inui/packages/components/src/renderers/**go from an index signature toanyto one tounknown. Step 0: the one-linebase.tschange pluspnpm --filter @object-ui/components type-check, reporting the break count before editing further. ⛔ No ESLint rule change, and no(schema as any)reads in ListView/ObjectGrid/ObjectView (seat 2 files, separate slice). Re-recordedscripts/sdui-manifest.sources/{types,components}.json, a root.changeset/(stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root.changeset/.Container & model:
medium,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: yes (narrowing) — provisional: an index signature to
unknownnarrows what a renderer can do with a forwarded key without narrowing it first; FROM → TO migration in the changesetMetadata-protocol: none
Responsibility:
n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public ConsoleThread-read: 6407894809
Premise: holds for the in-scope item (triage first grade 6407890835: "move
ComponentRendererPropsand its 81 inline copies fromanytounknownindex signatures" is in scope; item 1, theno-explicit-anygate, is ⛔ out of scope until the maintainer names it and is NOT claimed here; 2026-10-26T18:51Z)Serial constraints cleared: types: check #25917 before landing; components: #25917 may change 4 files' type imports
Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25918, "status": "done", "branch": "claude/project-thread-r8hdni", "pr": "https://github.com/objectstack-ai/objectstack/pull/26293", "session": "session_01GJjkZ6pmdwWoDYH8fE8FAn", "premise_still_valid": true, "summary": "Partial, Part of #25918, the claim 6424620547 surface only: ComponentRendererProps (ui/packages/types/src/base.ts) and 77 renderer props annotations in 74 files under ui/packages/components/src/renderers move from an index signature to any to one to unknown. Step 0 (base.ts alone) broke 0 sites; flipping the inline copies broke 65 (49 files) on components tsc, cleared by a package-local RendererHostProps (data-obj-id, data-obj-type, style, the host keys renderers read by name) plus per-renderer declarations (onPageChange, input-otp onChange/value, button loading, text className, form RenderFieldProps ref/field/emptyHint) and one visible cast in filter-builder. No ESLint change, no ListView/ObjectGrid/ObjectView edits. Changeset patch on both packages, Clause-②: yes (narrowing), Metadata-protocol: none, FROM → TO migration. sdui types/components sources re-recorded (manifest unchanged). #25917 (PR #26292) touches neither types nor components.", "tests": "At code commit 67418d8f (later commits: changeset + sdui records only), base origin/main 617f27eb. pnpm --filter @object-ui/components type-check exit 0 (tsc --noEmit and tsc -p tsconfig.test.json); @object-ui/types, @object-ui/react, @object-ui/core type-check exit 0 (step 0 tree). pnpm --dir ui exec vitest run packages/components/ packages/types/ packages/react/src/__tests__/ComponentRendererProps.reconciliation.test.ts --maxWorkers=2 under os-verify-lock: VERDICT command-exit 0, Test Files 826 passed | 1 skipped (827), Tests 14866 passed | 24 skipped. Downstream: no renderer props type is exported from components src/index.ts and ComponentRendererProps has no consumer beyond the two type pins, so no downstream package type-check reads the change. No ablation: no tested runtime behaviour changed (type-only).", "gates": "dispatch-gates --commands at e349c832: 40 derived, 39 exit 0, node scripts/check-adr-0087-registration.mjs --base origin/main exit 1. dispatch-gates --ran: 40 run, 0 NOT-MEASURED, 0 UNRUN. The adr-0087 red is a gate gap, not this change: predicate 1 finds no workspace manifest for @object-ui/* (PACKAGE_ROOTS omits ui/, #26220); predicate 4 refuses type-surface-only on ComponentRendererProps because the interface was concrete at base and the gate counts only a whole-symbol any as erased, not an any index-signature member. no-migration-prescription and runtime-interface-only refuse a FROM → TO block, which this changeset owes, so the changeset keeps the true type-surface-only disposition. CI check-runs on #26293: in_progress at report time (not waited on).", "dogfood_battery": "e349c832 · os-verify-lock VERDICT command-exit 0 (21m43s, shared box) · Test Files 297 passed | 3 skipped (300) · Tests 2527 passed | 18 skipped (2545) · no failures", "mcp_calls": "6 — all reads: issue_read get #25918, issue_read get_comments #25918 x2, issue_read get #26220, search_pull_requests (25917), pull_request_read get_files #26292. No MCP write.", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/26293/assignees os-steve, one action, run 40389039640, read-back identical), this os-dev-report comment via post-stamped.mjs (POST /issues/25918/comments). git push x5 not REST.", "open_questions": [ { "question": "How should #26293 clear check-adr-0087-registration?", "options": [ "A: hold #26293 Blocked-by #26220 and widen #26220 so predicate 4 also treats an any index-signature member of a concrete interface as erased (type-surface-only then verifies)", "B: land it red on that gate with the gap stated (only if the CI job that runs it does not block the queue; not measured here)", "C: rewrite the changeset to no-migration-prescription with the migration in prose (misstates the change: a TypeScript consumer does rewrite code; the detector-miss shape ADR-0087 D9 retires)" ], "recommendation": "A, because type-surface-only is the true disposition and only the gate cannot verify it for ui/ packages; C would game the detector." } ], "out_of_scope_findings": [ "class: b · reach: named producer: filter-builder renderer hands schema.value (authored FilterGroup, @object-ui/types) to FilterBuilder typed on FilterBuilderRowGroup; FilterBuilderRow and the authored row are assignable in neither direction (operator vocabulary one way, value requiredness the other), previously hidden by the any index signature; now one visible cast in complex/filter-builder.tsx · dedupe words: filter-builder FilterGroup FilterBuilderRowGroup schema.value cast", "carrier: none · noted, not filed: ActionGroupSchema / ActionMenuSchema (exported schema interfaces in action-group.tsx / action-menu.tsx) and html-elements AnyProps schema: any still carry any; outside the claim surface, in PR Acceptance notes", "carrier: #26220 · the adr-0087 gate gap above (ui roots, plus the index-signature predicate-4 case to add)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Seat
domain:ui#1· 2026-10-26T20:08Z: this card's partial PR #26293 is accepted on its merits and held.check-adr-0087-registrationcannot yet verify itstype-surface-onlydisposition for ui packages (the missing ui roots, plus theanyindex-signature case widened in 6426092534).Blocked-by: #26220
#26220 is unowned, so seat 1 takes it over as the blocked seat (execution-duties: an unowned blocker is claimed by the seat it blocks).
objectstack-fleet commentedon Oct 27, 2026
Seat note · claim released · seat
domain:ui#1· 2026-10-27T07:26ZThe claim's partial scope has landed: #26293 moved
ComponentRendererPropsand the inline renderer props copies tounknownindex signatures (merged 2026-10-27, through the ADR-0087 D8 limb, #26455 / #26496).The card returns to
pm:queuefor the rest of the triage's in-scope list:(schema as any)reads inListView/ObjectView/ObjectGrid;rowActionDefs, spec-first.The
ObjectView/ObjectGridreads should be picked up after the move-only splits finish (#25992's last slice is in the queue; #25994 has slices 6–8 left), so they don't collide with them.ListViewsits in seat 2's package.no-explicit-any: 'error'stays ⛔ out of scope until the maintainer names it.objectstack-fleet commentedon Oct 28, 2026
Dispatch order ·
domain:ui#1·session_01JQwxbZeBv2y91towxasSUT· 2026-10-28T12:20ZYou are the os-dev developer agent for exactly ONE card: #25918, in your own card thread. Your role definition is
.claude/agents/os-dev.mdin the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-rootAGENTS.mdandui/AGENTS.mdbefore your first edit, and pm-dispatchreferences/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/NNNNN" -H "Authorization: Bearer $GH_TOKEN"and/comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with[ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.Identity and branch: the seat's
Claim:comment on this card is your identity; itsBranch:line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWESTClaim:on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Dispatch the ui lane" one message with your branch name and wait. Worktreeobjectstack-issue-25918on that branch from a freshorigin/main;pnpm install(frozen lockfile); push withgit push -u origin <branch>(⛔ no force).Writes: PR only through the relay op
pr_create(node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array[{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced;--dry-runfirst); your report comment throughnode scripts/pm/post-stamped.mjs --comment=25918 --file=F --jsonrun ONCE with output captured to a file (timestamps only as{{NOW}}/{{WAS:…}}). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and onerun_rerun_failedthrough the relay. Report both counts (api_writeswith endpoints,mcp_callswith tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, then## 维护者速读six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon your diff, run each, record exits before any pipe, reconcile with--ran. Changeset in the root.changeset/when a published package changes. ⛔ui/.github/**and the rootci.ymlare out of bounds. Hand back: when the PR and report are up, send the seat thread "Dispatch the ui lane" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.Ruling (cannot be re-ruled)
Triage first grade 6407890835 (2026-10-24): "delete the vestigial
(schema as any)reads inListView/ObjectView/ObjectGrid… ForrowActionDefs, go spec-first (AGENTS #0.1): it either becomes a spec card or the read stops." ⛔ Out of scope until the maintainer names it:no-explicit-any: 'error'. Binding on top, in the code itself: the objectui#5097 maintainer ruling (2026-08-18, 「同意」) fixed 27OBJECT_VIEW_HOST_COMPOSITION_KEYS(ui/packages/plugin-view/src/ObjectView.tsx:958) as HOST-COMPOSITION surface: "⛔ do not delete a read as a tidy-up — a deleted read silently blanks a stored app-shell document." "Vestigial" therefore means a cast on a key the type already declares, never one of those 27 reads.PM mechanism assumptions (measure on
origin/main9dec0545; disproof welcome)ObjectView.tsxhas 30 node reads in therenderListViewfence (comment at:2958): 27 exempt, three on declaredObjectViewSchemamembers. By elimination those three aredata(:3113),navigation(:3115) andsearchableFields(:3118). Drop their cast (schema.dataetc.), and keep the fence comment's counts true.objectViewHostSurface.test.tsxre-derives the fence's read set by name andobject-view-unmirrored-keys-7779.test.ts(@object-ui/types) censuses the file; run both, and adjust a pin only where it counted a cast that no longer exists.ObjectGrid.tsx(ui/packages/plugin-grid) has two reads.rowActionDefs(:949) is declared on the data-table surface (ui/packages/types/src/data-display.ts:1476) but not on the grid's schema type.hideRowHeightToggle(:3395) is declared nowhere inui/packages/types/srcorpackages/spec/src. For each, measure whether any producer writes it onto an object-grid node (examples, apps, platform-objects, ListView/ObjectView hand-offs). With a producer, it is a spec gap: file nothing yourself, report it underout_of_scope_findingswith the producerfile:line, and leave the read. With no producer, the read stops, and a test pins that the grid ignores it.(schema as any)read in these two files outside the fence follows the same test: declared ⇒ drop the cast; undeclared ⇒ producer check as above.Scope
File surface:
ui/packages/plugin-view/src/ObjectView.tsx,ui/packages/plugin-grid/src/ObjectGrid.tsx, and their tests/pins. ⛔ListView.tsxis out: it is in seat 2's package and open PR #27206 (another project,optionsbag retirement) rewrites it. ⛔ No ESLint rule change. Ablation: for any read you stop, restoring it turns the new test red. Stay under 300 changed lines.Serial: PR #27206 (draft) also edits
ObjectView.tsx(hunks near:227,:2058–2105,:3031–3043). Keep clear of those lines, mergeorigin/mainbefore your gates, and if #27206 lands first, merge again and re-run the plugin-view tests.Tier
Quote
dispatch-gates --tieron your surface. Expected none.TIER_DEFAULT, effortmedium.Clause-②: no(a cast removal on a declared key changes no type; a stopped read on an undeclared key with no producer narrows nothing authored),Metadata-protocol: none.@object-ui/plugin-view/plugin-gridare published: a patch changeset in the root.changeset/if behaviour changes, otherwiseskip-changesetwith the reason. The PR saysPart of #25918(ListView and the lint rule stay open).objectstack-fleet commentedon Oct 28, 2026
Claim: PM loop round 20 · 2026-10-28T12:24Z
Session:
session_01JQwxbZeBv2y91towxasSUT(seat; implementation by card thread sessionsession_01JQwxbaGCrvY8peSVMF3rQw,mode:thread)Account:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-jiez8z(the card thread's harness push branch, self-reported — the measured platform exception toclaude/issue-N-slug)Worktree:
objectstack-issue-25918in the card thread's cloneDomain:
domain:uiSeat:
domain:ui#1(seat post #25966)File surface: partial,
Part of #25918:ui/packages/plugin-view/src/ObjectView.tsx(the casts on the three declaredObjectViewSchemamembers only; ⛔ the 27OBJECT_VIEW_HOST_COMPOSITION_KEYSreads, objectui#5097) +ui/packages/plugin-grid/src/ObjectGrid.tsx(rowActionDefs,hideRowHeightToggle: producer check, then cast drop or read stop) + their tests/pins; ⛔ListView.tsx(seat 2 package, open PR #27206); ⛔ any ESLint rule (stop on breach; explain in the report)Container & model:
S,mode:thread(the maintainer's word: 3 card threads per seat, 2026-10-28 10:00Z; threads idle on contract review do not count, 12:11Z),model: TIER_DEFAULT(the dev quotesdispatch-gates --tieron the surface),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — tech-debt card (triage first grade 6407890835), not a defect
Thread-read: 6468831660
Premise: holds — on
origin/main9dec0545,ObjectView.tsxcarries 30 node reads in therenderListViewfence (27 exempt by name at:958), andObjectGrid.tsxreadsrowActionDefs(:949) andhideRowHeightToggle(:3395) through(schema as any).Serial constraints cleared: #25992 / #25994 move-only splits are closed; PR #27206 (draft) edits other
ObjectView.tsxhunks — the dev stays clear and re-merges if it lands first.Resume-from: none
Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
os-dev-report
{ "issue": 25918, "status": "done", "branch": "claude/project-thread-jiez8z", "pr": "https://github.com/objectstack-ai/objectstack/pull/27273", "session": "session_01JQwxbaGCrvY8peSVMF3rQw", "premise_still_valid": true, "summary": "Partial, Part of #25918. ObjectView.tsx: the three OBJECT_VIEW_DECLARED_FORWARDED_KEYS reads (data, navigation, searchableFields) in the renderListView fence are now uncast schema.K; the 27 objectui#5097 host-composition reads keep their cast. PM assumption 1 measured true at 9dec0545 and at 1e8e5296 (no other (schema as any) read outside the fence; the remaining hits are comments). ObjectGrid.tsx unchanged: both rowActionDefs and hideRowHeightToggle have producers writing them onto object-grid nodes, so per the order the reads stay and go to out_of_scope_findings. Pins adjusted only where they counted or quoted a cast that no longer exists: objectViewHostSurface.test.tsx (cast set = 27, declared keys asserted uncast; named-view section count 30 to 27) and object-view-unmirrored-keys-7779.test.ts (three literal source-text pins). Also corrected a stale comment that called node data one of the 27.", "tests": "Head 4c0dabbb (merge of origin/main 1e8e5296). Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-view^...' build under os-verify-lock: VERDICT command-exit 0. pnpm --dir ui exec vitest run --maxWorkers=2 packages/plugin-view/ plus every out-of-package test reading plugin-view ObjectView.tsx off disk (6 types census files, plugin-form affordanceGrantMap-12082, plugin-list ViewSwitcher.i18n-4024, 2 plugin-map files, react navigationOverlayConsumers.onRowClickArity-9357, schema-catalog catalog-gallery-render): VERDICT command-exit 0, Test Files 89 passed (89), Tests 1738 passed (1738). pnpm --filter @object-ui/plugin-view run type-check exit 0; pnpm --filter @object-ui/types run type-check exit 0 (both include tsc -p tsconfig.test.json). No ablation: no read stopped, no runtime behaviour changed (removing as any emits identical JS); the existing forwards-all-30-reads render test pins the values.", "gates": "dispatch-gates --commands at 4c0dabbb: 24 derived, 24 run, all exit 0; dispatch-gates --ran: 24 run, 0 NOT-MEASURED, 0 UNRUN. Extra: ui check:new-line-citations exit 0 (0 new). dispatch-gates --tier: no path-derived mandate. CI check-runs on #27273: not yet reported at report time (not waited on).", "dogfood_battery": "n/a: no ! in the PR title and Clause-2 no without a narrowing arm", "line_budget": "76 changed lines at 60eae038 (+50 / -26, 3 files), under the order's 300", "files_changed": [ "ui/packages/plugin-view/src/ObjectView.tsx", "ui/packages/plugin-view/src/__tests__/objectViewHostSurface.test.tsx", "ui/packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts" ], "deviations": "Changeset: skip-changeset declared in pr_create labels (no emitted-code change in either published package). Worktree install: first pnpm install failed on better-sqlite3 node-gyp header download (TLS abort through the proxy); reinstalled with npm_config_nodedir pointing at the local node headers, exit 0. The PR body follows the repo template headings merged with the os-dev order sections, and carries the platform attribution comment on line 1.", "mcp_calls": "0", "api_writes": "2: relay pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + assignee os-warren + label skip-changeset, run 40703886617, read-back 6017 bytes identical); this os-dev-report comment via post-stamped.mjs (POST /issues/25918/comments). git push not REST.", "open_questions": [], "out_of_scope_findings": [ "class: none (already ruled, not a new spec gap) · reach: named producers · ObjectGrid rowActionDefs read stays: producers write it onto object-grid nodes in DevRowActions.tsx (console dev page node literal), ListView grid hand-off, RelatedList and app-shell objectViewListRenderer; declared on DataTableSchema, not ObjectGridSchema; ComponentPropsMap object-grid refuses it; ruled non-author surface on objectui#5091 and pinned by gridNonAuthorKeys.test.tsx · dedupe words: rowActionDefs object-grid spec row · carrier: none, noted, not filed", "class: none (already ruled) · reach: named producer · ObjectGrid hideRowHeightToggle read stays: ListView baseProps sets it true on the object-grid node it builds; declared nowhere; ruled non-author surface on objectui#5091 and pinned by gridNonAuthorKeys.test.tsx · dedupe words: hideRowHeightToggle host signal · carrier: none, noted, not filed", "noted only: (activeView as any)?.data and (activeView as any)?.rowActionDefs in the same fence cast the host views prop entry, not schema; outside this card's surface · carrier: none" ] }objectstack-fleet commentedon Oct 28, 2026
Landed (partial) · seat
domain:ui#1·session_01JQwxbZeBv2y91towxasSUT· 2026-10-28T14:48ZPR #27273 merged as
38bbc2f25d(seat record 6471787502).ObjectView's three reads of declaredObjectViewSchemamembers (data,navigation,searchableFields) are now uncastschema.K; the 27 objectui#5097 host-composition reads keep their cast, and the pins were adjusted.ObjectGrid'srowActionDefsandhideRowHeightToggleboth have producers onto object-grid nodes and are already ruled non-author on objectui#5091, so they stay; that also answers the triage's "rowActionDefs, spec-first" item for the grid read.Still open on this card: the
ListView.tsxreads (seat 2's package; open PR #27206 is rewriting it) andno-explicit-any: 'error', which stays ⛔ out of scope until the maintainer names it. The claim is released:pm:dispatchedcomes off,pm:queuegoes back on, no assignee.Generated by Claude Code