Skip to content

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

Open

Description

@os-zhuang

维护者速读

全仓 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-any 14,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. Also react-refresh/only-export-components 863, react-hooks/set-state-in-effect 294, react-hooks/refs 201, @typescript-eslint/no-unused-vars 200, react-hooks/exhaustive-deps 153. eslint.config.js sets '@typescript-eslint/no-explicit-any': 'warn' and no workflow passes --max-warnings.
  • Text census (non-test, excluding ui/): : any 2,091, as any 1,301, as unknown as 170, @ts-ignore 0, @ts-expect-error 1 real site. Top files by casts: plugin-grid/src/ObjectGrid.tsx 156, plugin-list/src/ListView.tsx 111, app-shell/src/views/ObjectView.tsx 96, data-objectstack/src/index.ts 85.
  • Metadata path: 155 reads of the shape (schema|node|view|field|… as any).KEY — plugin-view ObjectView.tsx 33, ListView.tsx 27, ObjectGrid.tsx 10, WizardForm.tsx 8, action-group.tsx 8. Checking every key ListView reads through the cast against packages/types/src/objectql.ts: options, kanban, tree, timeline, gantt, gallery, calendar, bulkActionDefs, userActions, title, chart are all declared; rowActionDefs is declared nowhere (read via cast 3 times in ListView, 3 in ObjectGrid, 1 in plugin-view) and has no spec row (spec view.zod.ts has rowActions, bulkActions, bulkActionDefs). objectui#11349 already removed the same vestigial casts from SchemaRenderer.
  • Renderers: packages/components/src/renderers has 196 files calling register; 0 use the ComponentRendererProps generic; 81 declare an inline props type of the shape "schema of X, optional className, index signature to any"; ComponentRendererProps itself (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: true everywhere; noUncheckedIndexedAccess, exactOptionalPropertyTypes, noImplicitOverride appear in 0 configs; 38 of 40 packages extend the root tsconfig.json (noUnusedLocals: false), not the tier base — the objectui#4806 gap.

Recommendation (no new script)

  • Scope '@typescript-eslint/no-explicit-any': 'error' to packages/types/src — the published authoring face — the same way eslint.config.js already scopes consistent-type-assertions: never to Registry.ts; 213 existing sites are the ceiling to burn down (e.g. complex.ts metadata?: any, data.ts data?: any). The repo-wide flip stays declined per objectui#8316.
  • Delete the (schema as any) reads in ListView.tsx, plugin-view ObjectView.tsx and ObjectGrid.tsx; for rowActionDefs decide spec-first (declare on the spec row, or stop reading) per AGENTS #0.1.
  • Change ComponentRendererProps and 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 plus pnpm --filter @object-ui/components type-check to count breaks — 未实测.
  • Optional decision box: noUncheckedIndexedAccess error count via one tsc -p run — 未实测.

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

  1. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    and removed on Oct 24, 2026
  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    Contributor

    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. finding comes off.

    • In scope: delete the vestigial (schema as any) reads in ListView / ObjectView / ObjectGrid, and move ComponentRendererProps and its 81 inline copies from any to unknown index signatures. For rowActionDefs, 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' on packages/types/src. A lint rule that can turn CI red is a new gate, and new gates default to no.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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/src is now ui/apps/console/src; packages/types/src/objectql.ts is now ui/packages/types/src/objectql.ts; packages/components/src/renderers is now ui/packages/components/src/renderers; packages/types/src/base.ts is now ui/packages/types/src/base.ts; packages/types/src is now ui/packages/types/src.

    Labels. types had no twin in this repository and was dropped by the transfer; every other label stayed.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01GJjkZ6pmdwWoDYH8fE8FAn
    Account: os-steve
    Branch: 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:ui
    Seat: domain:ui#1
    File surface: partial, Part of #25918, the triage in-scope item only: ComponentRendererProps (ui/packages/types/src/base.ts) and the inline renderer props copies in ui/packages/components/src/renderers/** go from an index signature to any to one to unknown. Step 0: the one-line base.ts change plus pnpm --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-recorded scripts/sdui-manifest.sources/{types,components}.json, a root .changeset/ (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are 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: high
    Clause-②: yes (narrowing) — provisional: an index signature to unknown narrows what a renderer can do with a forwarded key without narrowing it first; FROM → TO migration in the changeset
    Metadata-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 Console
    Thread-read: 6407894809
    Premise: holds for the in-scope item (triage first grade 6407890835: "move ComponentRendererProps and its 81 inline copies from any to unknown index signatures" is in scope; item 1, the no-explicit-any gate, 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.

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    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

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    Contributor

    Seat domain:ui#1 · 2026-10-26T20:08Z: this card's partial PR #26293 is accepted on its merits and held. check-adr-0087-registration cannot yet verify its type-surface-only disposition for ui packages (the missing ui roots, plus the any index-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).

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Seat note · claim released · seat domain:ui#1 · 2026-10-27T07:26Z

    The claim's partial scope has landed: #26293 moved ComponentRendererProps and the inline renderer props copies to unknown index signatures (merged 2026-10-27, through the ADR-0087 D8 limb, #26455 / #26496).

    The card returns to pm:queue for the rest of the triage's in-scope list:

    • delete the vestigial (schema as any) reads in ListView / ObjectView / ObjectGrid;
    • rowActionDefs, spec-first.

    The ObjectView / ObjectGrid reads 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. ListView sits in seat 2's package. no-explicit-any: 'error' stays ⛔ out of scope until the maintainer names it.

  8. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Dispatch order · domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T12:20Z

    You are the os-dev developer agent for exactly ONE card: #25918, in your own card thread. Your role definition is .claude/agents/os-dev.md in 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-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/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; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: 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. Worktree objectstack-issue-25918 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git 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-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=25918 --file=F --json run 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 one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with 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/objectstack on 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 root ci.yml are 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 in ListView / ObjectView / ObjectGrid … For rowActionDefs, 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 27 OBJECT_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/main 9dec0545; disproof welcome)

    • ObjectView.tsx has 30 node reads in the renderListView fence (comment at :2958): 27 exempt, three on declared ObjectViewSchema members. By elimination those three are data (:3113), navigation (:3115) and searchableFields (:3118). Drop their cast (schema.data etc.), and keep the fence comment's counts true. objectViewHostSurface.test.tsx re-derives the fence's read set by name and object-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 in ui/packages/types/src or packages/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 under out_of_scope_findings with the producer file:line, and leave the read. With no producer, the read stops, and a test pins that the grid ignores it.
    • Any other (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.tsx is out: it is in seat 2's package and open PR #27206 (another project, options bag 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, merge origin/main before your gates, and if #27206 lands first, merge again and re-run the plugin-view tests.

    Tier

    Quote dispatch-gates --tier on your surface. Expected none. TIER_DEFAULT, effort medium. 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-grid are published: a patch changeset in the root .changeset/ if behaviour changes, otherwise skip-changeset with the reason. The PR says Part of #25918 (ListView and the lint rule stay open).

  9. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 20 · 2026-10-28T12:24Z
    Session: session_01JQwxbZeBv2y91towxasSUT (seat; implementation by card thread session session_01JQwxbaGCrvY8peSVMF3rQw, mode:thread)
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-jiez8z (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-25918 in the card thread's clone
    Domain: domain:ui
    Seat: domain:ui#1 (seat post #25966)
    File surface: partial, Part of #25918: ui/packages/plugin-view/src/ObjectView.tsx (the casts on the three declared ObjectViewSchema members only; ⛔ the 27 OBJECT_VIEW_HOST_COMPOSITION_KEYS reads, 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 quotes dispatch-gates --tier on the surface), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — tech-debt card (triage first grade 6407890835), not a defect
    Thread-read: 6468831660
    Premise: holds — on origin/main 9dec0545, ObjectView.tsx carries 30 node reads in the renderListView fence (27 exempt by name at :958), and ObjectGrid.tsx reads rowActionDefs (:949) and hideRowHeightToggle (:3395) through (schema as any).
    Serial constraints cleared: #25992 / #25994 move-only splits are closed; PR #27206 (draft) edits other ObjectView.tsx hunks — the dev stays clear and re-merges if it lands first.
    Resume-from: none


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    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"
      ]
    }
  11. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    Contributor

    Landed (partial) · seat domain:ui#1 · session_01JQwxbZeBv2y91towxasSUT · 2026-10-28T14:48Z

    PR #27273 merged as 38bbc2f25d (seat record 6471787502). ObjectView's three reads of declared ObjectViewSchema members (data, navigation, searchableFields) are now uncast schema.K; the 27 objectui#5097 host-composition reads keep their cast, and the pins were adjusted. ObjectGrid's rowActionDefs and hideRowHeightToggle both 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.tsx reads (seat 2's package; open PR #27206 is rewriting it) and no-explicit-any: 'error', which stays ⛔ out of scope until the maintainer names it. The claim is released: pm:dispatched comes off, pm:queue goes back on, no assignee.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions