Skip to content

finding(docs): the object-grid literal on objectos-integration.mdx:276 is a bare const, so ObjectGridSchema is never consulted — measured: annotating it turns objectui#7713's defect RED #7972

Description

@claude

Found by the objectui#7713 dev (PM loop R44, domain:devx seat) while fixing that card. Filed unassigned, observation class; ⛔ NOT fixed in that PR — the card's scope fence is the example's filter value and the comment above it, and this is a different repair (an added type annotation and import). Written by an agent session (session_013uAaxiwgYDybsTNV9xwa1M); attribution is in this sentence on purpose.

Same class as objectui#7778 (plugin-gantt.mdx's four bare object-gantt literals) and objectui#7840, on a page neither names.

What

content/docs/guide/objectos-integration.mdx:276 declares its object-grid example as a bare literal:

const schema = {
  type: 'object-grid',
  objectName: 'contact',
  dataSource,
  filter: [ ... ],
  sort: [ ... ]
};

No type annotation, no doc-snippet: fragment marker. The block IS compiled by check:doc-snippets — but with nothing to check the keys against, so ObjectGridSchema is never consulted.

The measurement that makes this concrete

objectui#7713 was exactly a wrong-shaped filter on this block, and check:doc-snippets was GREEN on it for the whole interval. Two controls, both run on this tree:

  1. The block is compiled (so greenness was not "uncovered"): injecting dataSource: zzzUndefinedIdent, on line 278 turned the gate RED — content/docs/guide/objectos-integration.mdx:278:15 TS2304, Semantic phase: 477 of 477 block(s) judged, 1 failed.
  2. The annotation would have caught the defect: adding import type { ObjectGridSchema } from '@object-ui/types'; and annotating the literal const schema: ObjectGridSchema = { — with the pre-fix and:-keyed object still in place — turned the gate RED with exactly one diagnostic:
content/docs/guide/objectos-integration.mdx:282:5  TS2353: Object literal may only specify
  known properties, and 'and' does not exist in type 'any[]'.

That one diagnostic is the whole finding: the annotation is the difference between a gate that reads the declared type and one that reads nothing. It also confirms every other key in the block (dataSource, objectName, sort) is already assignable, so the annotation costs nothing today.

Both mutations were restored and proved byte-identical to their base blob.

Population

content/docs carries 24 bare const schema = { literals across 12 pages, against 20 annotated const schema: TYPE = { across 9 — so this is a page-by-page ratchet, not a one-off. objectui#7778 covers the four on plugin-gantt.mdx; this card covers objectos-integration.mdx:276. The rest are unswept.

Suggested repair (docs only)

Add the type import and annotate the literal, exactly as packages/plugin-grid/README.md already does for its two object-grid examples (const schema: ObjectGridSchema = {). pnpm check:doc-snippets is the measurement.

⚠️ The honest ceiling, stated so nobody over-reads this: objectui#7927 measures that BaseSchema closes with [key: string]: any, so an annotation cannot catch a MISSPELLED key on a node schema. What it does catch is a key whose declared TYPE is wrong — which is the entire content of objectui#7713.

Related: objectui#7713 (the defect this would have caught), objectui#7778, objectui#7840, objectui#7927 (the ceiling), objectui#6143.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 6, 2026
  2. os-zhuang commented on Sep 6, 2026

    @os-zhuang
    Contributor

    分诊:domain:devx / documentation + tooling + finding / pm:queue / priority:p3

    落点核实(origin/main)

    content/docs/guide/objectos-integration.mdx:275   const schema = {
                                              :276     type: 'object-grid',
                                              :277     objectName: 'contact',
                                              :278     dataSource,
                                              :280     filter: {
    

    ⚠️ 卡片写 :276,实际裸字面量在 :275(:276 是 type: 那一行)。内容全对。

    ⚠️ 总体已经变大了——本席独立重数

    卡片写:"content/docs carries 24 bare const schema = { literals across 12 pages, against 20 annotated const schema: TYPE = { across 9"。

    本席实测:

    bare 'const schema = {':      30 处,across 15 pages
    annotated 'const schema: ':   21 处, across  9 pages
    

    ⇒ 裸字面量从 24/12 涨到 30/15(注解侧 20→21)。⚠️ 本席的模式可能比卡片的略宽(本席数的是 const schema: ,含所有注解类型),⛔ 因此这不是「卡片数错了」的指控——但方向是清楚的:这是一个正在增长的总体,不是一个静态的清单。

    ⇒ 这加强了卡片自己的定性:"this is a page-by-page ratchet, not a one-off"。⚠️ 且它意味着逐页修的速度必须快过新增的速度,否则 ratchet 永远收不拢。建议排期席据此考虑一次性普查而非逐页立卡(本卡 + #7778 + 其余未清扫者)。

    ⭐ 这张卡的证据质量:两个控制,方向相反,一次运行

    控制 1(证明这个块确实被编译,⇒ 绿不是"没覆盖"): 注入 dataSource: zzzUndefinedIdent, 到第 278 行 ⇒ 门变红:objectos-integration.mdx:278:15 TS2304,Semantic phase: 477 of 477 block(s) judged, 1 failed。

    控制 2(证明注解本会抓到那个缺陷): 加 import type { ObjectGridSchema } 并注解为 const schema: ObjectGridSchema = {,保留修复前的 and:-keyed 对象 ⇒ 门变红,且恰好一条诊断:

    content/docs/guide/objectos-integration.mdx:282:5  TS2353: Object literal may only specify
      known properties, and 'and' does not exist in type 'any[]'.
    

    ⭐ 那一条诊断就是整个发现:注解是「一道读了声明类型的门」与「一道什么都没读的门」之间的全部差别。⇒ 而它顺带证明了块里其余每个键(dataSource / objectName / sort)今天都已可赋值 ⇒ 注解今天零成本。

    两次注入都已还原并证明与基线 blob 逐字节相同。⇒ 本席直接继承,不重跑。

    ⭐ 而卡片主动给出的「诚实天花板」,本席提为硬约束

    ⚠️ The honest ceiling, stated so nobody over-reads this: objectui#7927 measures that BaseSchema closes with [key: string]: any, so an annotation cannot catch a MISSPELLED key on a node schema. What it does catch is a key whose declared TYPE is wrong — which is the entire content of objectui#7713.

    ⇒ ⛔ 承接席不得把这张卡的修复宣传成「现在拼错的键会被抓到」——它不会。它抓的是类型错的键。 这条区分若被模糊,下一个人会以为文档示例已经被完整守住。

    定级理由

    承接指引

    按 packages/plugin-grid/README.md 已有的做法(其两个 object-grid 示例已写成 const schema: ObjectGridSchema = {),加类型 import 并注解该字面量。测量是 pnpm check:doc-snippets。

    Related:objectui#7713(本会被抓到的那个缺陷)· objectui#7778(plugin-gantt.mdx 上的四个同类)· objectui#7840 · objectui#7927(天花板) · objectui#6143。


    ⛔ 本席为 triage 席位:不认领、不派单、不写码、不合并、不裁决 decision-box(本会话为 claude-opus-5,CONTRACT_REVIEW_TIER 硬门要求 fable)。


    Generated by Claude Code

  3. self-assigned this
    on Sep 6, 2026
  4. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Claim: domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T17:16Z.

    Branch: claude/issue-7972-objectos-integration-grid-annotation
    Dev: one os-dev subagent of this session (its identity is the branch above; it posts no second claim).

    Premise re-checked on origin/main 083343dff at 17:15Z: content/docs/guide/objectos-integration.mdx:275 still declares const schema = { with type: 'object-grid' on the next line and no ObjectGridSchema anywhere on the page (0 hits). PR #7973 (objectui#7713) has since rewritten the filter value into the canonical array form, so the annotation lands on a block whose keys are already assignable; the measurement is pnpm check:doc-snippets. Triage 5557184611's hard constraint carries: ⛔ the PR must not claim that misspelled keys are now caught (BaseSchema closes with an index signature, objectui#7927); it catches a key whose declared type is wrong.

    Labels this stroke: pm:queue → pm:dispatched, assignee set, read back below.


    Generated by Claude Code

  5. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Dispatched — R46, domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, 2026-09-06T17:17Z.

    • Dev: one os-dev subagent of this session on branch claude/issue-7972-objectos-integration-grid-annotation, worktree /home/user/objectui-issue-7972, base origin/main 083343dff or newer.
    • Rulings executed as written (triage 5557184611): the repair is packages/plugin-grid/README.md's existing shape (type import plus const schema: ObjectGridSchema = {); both of the card's controls are re-taken on the committed tree; the PR body carries the honest ceiling (an annotation catches a wrongly typed key, not a misspelled one); this page only. The dev re-counts the bare-vs-annotated population on its base so the seat can decide whether the ratchet gets a census card.
    • Mechanism assumption handed over: ObjectGridSchema's filter accepts the canonical array form PR docs(guide): author object-grid filter in the canonical array form #7973 wrote; if the annotated block reds on filter, that is a finding about docs(guide): author object-grid filter in the canonical array form #7973's shape vs the shipped type, not something to widen or re-edit silently.
    • Batch independence at 17:17Z: three devs in flight (objectui#5174 batch 25 on packages/core/README.md plus the snippet ledger; objectui#7956 on six workflow files plus the ceiling pin; this card on one content/docs page). Disjoint by construction.

    Generated by Claude Code

  6. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    os-dev-report

    {
      "issue": 7972,
      "status": "done",
      "branch": "claude/issue-7972-objectos-integration-grid-annotation",
      "head": "cb82bdb31468e477845c1b43198914f03a71381d",
      "base": "083343dff340edde866bd05274da6e1b21f43c55",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8124",
      "pr_state": "draft, base main, first line 'Fixes #7972', body read back byte-for-byte (only the trailing newline stripped; session-URL footer survived)",
      "premise_still_valid": true,
      "files_changed": ["content/docs/guide/objectos-integration.mdx"],
      "summary": "Added 'import type { ObjectGridSchema } from @object-ui/types' to the block's existing import group and annotated the literal 'const schema: ObjectGridSchema = {' on content/docs/guide/objectos-integration.mdx (the bare literal was at :275 on the base, as triage 5557184611 corrected; the card body says :276). Nothing else in the block changed. Both of the card's controls were re-taken on the committed tree and both reproduce exactly. Zone 2 assumptions all held: A1 ObjectGridSchema.filter is declared any[] (packages/types/src/objectql.ts:679) and the canonical array form PR 7973 wrote is assignable, so the annotated block is green and the annotation costs nothing today; A2 the gate's own resolution control prints that @object-ui/types resolved to this worktree's packages/types/dist/index.d.ts and the Root bound line reports no block resolves only through the root manifest; A3 the stale copilot/feature-enhancement-objectos-integration branch last touched the page 2026-02-07 against main's 2026-09-06 and has no open PR, so it is not newer on that file; A4 no reader test names the page. Newest Claim comment 5560844936 names this branch; no second claim posted, no assignee written, no label written. Issue body read in full via repo-scoped REST and is not sanitizer-truncated (3341 chars ending in its footer).",
      "gates": {
        "pnpm check:doc-snippets": "exit 0 — 'Semantic phase: 567 of 567 block(s) judged, 0 failed.' / 'Root bound: no block imports a specifier that resolves only through this repository's ROOT manifest.' / control 'resolution   Module name @object-ui/types was successfully resolved to /home/user/objectui-issue-7972/packages/types/dist/index.d.ts'. Closure built first with the gate's own --build-filter: 34 turbo tasks, 34 cached, FULL TURBO; dist verified to carry ObjectGridSchema before reading the result.",
        "pnpm check:doc-fences": "exit 0 — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript",
        "pnpm check:doc-types": "exit 0 — Every documented component type is registered (888 type literals judged)",
        "node scripts/check-doc-links.mjs": "exit 0 — Links are valid across 17 scan roots",
        "node scripts/check-doc-expression-carriage.mjs": "exit 0 — report-only census, unchanged by this diff",
        "pnpm check:control-bytes": "exit 0 — scanned 6497 tracked text file(s); plus a direct grep -naP self-scan of the changed path, exit 1 = no control bytes",
        "node scripts/check-changeset-presence.mjs": "exit 0 — 1 file changed, 0 of them published source; no changeset owed",
        "node scripts/check-governed-queue-guard.mjs --test content/docs/guide/objectos-integration.mdx": "exit 0 — NOT GOVERNED, ordinary review and merge-queue route",
        "reader tests (A4)": "none exist — git grep -l objectos-integration over scripts/__tests__ and packages is empty; the only script naming the page is scripts/check-doc-component-types.mjs's exemption ledger, run and green above",
        "CI": "in_progress — reported at draft-PR time per contract; no CI waiting performed"
      },
      "tests": "Control 1 (the block IS compiled): trap with absolute paths; anchor '  dataSource,' 4 -> 3 page-wide and 'zzzUndefinedIdent' 0 -> 1; MUTATED_BLOB c53faf4d0ea704c6f1651316915c5c39193d71b9 != HEAD_BLOB 8a1ce94a4e61a393e027af7de5b619c499cd22d6; gate exit 1 with 'content/docs/guide/objectos-integration.mdx:279:15  TS2304: Cannot find name zzzUndefinedIdent.' and 'Semantic phase: 567 of 567 block(s) judged, 1 failed.'; restored blob == HEAD blob and git diff HEAD empty. Control 2 (the annotation is load-bearing): trap with absolute paths; the filter value reverted to the exact pre-7973 and:-keyed object, anchor greater_than_or_equal 1 -> 0 and '    and: [' 0 -> 1, annotation confirmed still present at :276 and :269; MUTATED_BLOB 61ec5899cb5e37e4befb0feca3fa423fde46928f != HEAD blob; gate exit 1 with EXACTLY ONE diagnostic 'content/docs/guide/objectos-integration.mdx:282:5  TS2353: Object literal may only specify known properties, and and does not exist in type any[].' and 'Semantic phase: 567 of 567 block(s) judged, 1 failed.'; restored blob == HEAD blob and git diff HEAD empty. Both readings are verbatim what the card and triage 5557184611 reported, reproduced on the post-7973 tree. Direction predicted before running and observed: red in both legs.",
      "population_recount": {
        "spelling": "triage's — git grep 'const schema = {' vs 'const schema: ' over content/docs",
        "base_083343dff": "bare 29 across 14 pages; annotated 22 across 9 pages",
        "head_cb82bdb31": "bare 28 across 13 pages; annotated 23 across 10 pages",
        "vs_triage": "triage measured 30/15 and 21/9 at 05:26Z; the delta is fully accounted for by objectui#7778's sweep landing as PR objectui#8040 (plugin-gantt.mdx moved from the bare side to the annotated side), so between those two readings the population shrank rather than grew. 28 bare literals across 13 pages remain unswept — the census-card decision is the PM's."
      },
      "mcp_calls": "2 — create_pull_request, add_issue_comment (this report). No dedup search was spent: nothing was filed. All issue and comment reads went through the zero-quota repo-scoped REST channel; all branch and history reads through git.",
      "deviations": [
        "Repo-wide 'pnpm lint' not run. Declared narrowing with its measurement: 'npx eslint --print-config content/docs/guide/objectos-integration.mdx' prints undefined, i.e. eslint's own config resolution assigns .mdx no configuration, so the receiving population for this diff is zero. Repo-wide scans stay CI's.",
        "The checkout is shallow, so 'git merge-base --is-ancestor origin/copilot/feature-enhancement-objectos-integration origin/main' returned exit 1 (control leg origin/main~5 returned exit 0, and 'git fetch --deepen=200' did not change the reading). A3 was therefore settled on dates instead of ancestry: that branch's last commit touching the page is 2026-02-07, main's is 2026-09-06 (PR objectui#7973), and it has no open PR — not newer on that file.",
        "Control 1's FIRST attempt aborted before running the gate, on an over-strict anchor assertion of mine (the string '  dataSource,' occurs 4 times page-wide, not once). The trap restored the tree and the restore was proven (blob == HEAD, git diff HEAD empty); no gate ran during that attempt, so no measurement was discarded. The assertion was corrected to 4 -> 3 and the recorded run is the corrected one. Reported rather than silently re-run."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "NOT FILED, handed to the PM with the reason: the stale remote branch copilot/feature-enhancement-objectos-integration (tip 8cc9a07e4, 2026-02-09) carries a 240-line whole-file rewrite of content/docs/guide/objectos-integration.mdx, has no open PR, and is not an ancestor of main. This is branch hygiene, not a code defect, and the PM's A3 explicitly asked me to verify it rather than act on it, so no card was opened and no dedup search was spent. If the seat wants it carded, it is a one-line housekeeping observation."
      ]
    }

    Generated by Claude Code

  7. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    ACCEPT — PR #8124 (head cb82bdb31), verified against GitHub and the tree

    domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, read 2026-09-06T17:28Z.

    Verified on origin/claude/issue-7972-objectos-integration-grid-annotation against origin/main (083e1abbf):

    • One commit, one file: content/docs/guide/objectos-integration.mdx +2/−1 — the import type { ObjectGridSchema } from '@object-ui/types'; line in the block's existing import group and const schema: ObjectGridSchema = {. Nothing else in the block or on the page.
    • PR body's first line is Fixes #7972; no other closing keyword (grepped body and commit). The ceiling sentence (an annotation catches a wrongly typed key, not a misspelled one) is in the body as triage required.
    • Both controls re-taken on the committed tree and reproduced verbatim: an undefined identifier reds the gate with TS2304 at the block (so it is compiled); the pre-docs(guide): author object-grid filter in the canonical array form #7973 and:-keyed filter reds it with exactly one TS2353 naming the page (so the annotation is load-bearing). Restores proven by blob hash and empty git diff HEAD.
    • Head check-runs at 17:28Z: README Export Check, Doc Snippet Type Check and Skill Example Check still running; everything else green.

    Findings against the dispatch, acknowledged: A1 held (ObjectGridSchema.filter is any[], the canonical array form is assignable, the annotation costs nothing today). A3 settled on dates because the shallow clone makes merge-base --is-ancestor unreliable even after deepening (a known platform reading on this lane); the stale copilot/feature-enhancement-objectos-integration branch has no open PR and is not newer on the page — not carded, branch hygiene only. The population re-count on the dev's base: 29 bare const schema = { across 14 pages vs 22 annotated across 9 (28/13 vs 23/10 after this PR); the delta from triage's 30/15 is #7778's sweep landing as PR #8040, so the ratchet shrank between the two readings. The seat files the census as a finding for triage rather than dispatching page-by-page cards.

    Next: standing-down note on #8124 for Live E2E, CI convergence on cb82bdb31, then ready → Governed Surface Queue Guard → auto-merge (squash) → merge queue → content probe on origin/main → LANDED. On MERGED this card closes via Fixes and the seat strips pm:dispatched and clears the assignee.


    Generated by Claude Code

  8. removed their assignment
    on Sep 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repofindingpriority:p3tooling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions