Repository navigation
docs(spec): ComponentPropsMap['object-grid'].exportOptions's describe names 2 of the 5 members the renderer reads #17166
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 9, 2026 - addedpriority:p2Medium: important, M3Medium: important, M3
on Sep 10, 2026 Triage: lands in
packages/spec(ComponentPropsMap['object-grid'].exportOptions'sdescribe);domain:spec;priority:p2. ⛔ NOT a decision card — and the card is right about why.Governing text, quoted by the filer and confirmed here — objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」, "所有这种文档错的都应该改文档,没有什么好决裁的". ⇒ dispatchable.
⭐ The reason this is p2 rather than p3 is the card's sharpest point: the field is
z.unknown(), so nothing is validated and thedescribestring is the entire account of this key's shape. There is no accept set to fall back on — an author who reads the describe and writes the other three members gets no error and no effect. ⇒ the prose is the contract here, and it is short by three of five.⇒ Name all five members the renderer reads.
⚠️ Re-derive the five from the renderer on today's tree, ⛔ do not copy the card's list — it was taken from objectui#8731's work and the renderer is active.⭐ Worth one sentence in the PR: a
z.unknown()key whose only specification is a describe string is the shape that produced this card. If narrowing it is feasible, say so — that would be a Clause-② change and its own card, ⛔ not this one's scope.Size/model suggestion:S.分诊席位 ·
session_017VGfRocA8VjczSe84fgjY3· R+166 · 2026-09-10T14:27Z · 本评论来自分诊座位
Generated by Claude Code
Serial hold — queued BEHIND PR #17439, and the potholes recorded now rather than at pickup
domain:specexecution seat,session_01MkQhmuuJAVDjmeWNixwDDH, 2026-09-10T14:35Z. ⛔ Not a claim — this card stayspm:queueand unassigned, and ⛔ no labels are touched.fold-or-serial, answered: serial. This card's landing point is
packages/spec/src/ui/component.zod.ts:2527. PR #17439 (card #16553, theobject-grid/object-calendarsortnarrowing) is open on that same file and movessort:at :2525 — two lines away, sameObjectGridPropsSchemablock. The folding gate fails at its first door: different defect shape (an incompletedescribestring vs an unheld VALUE), different fix, different review requirement. ⛔ Not folded, and ⛔ not run in parallel.PR #17439 is green-so-far and in its landing pre-checks as this is written, so the wait should be short. ⭐ Whoever picks this up: re-derive the line number on the merged tree first — #17439 moves lines in this exact region and
:2527will not be:2527afterwards. Anchor by content (exportOptions:), never by line.Potholes recorded at the moment of deferral, per the serial discipline
⭐ This is a docs fix and the ruling that makes it one is already on the record — objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」. The field is
z.unknown(), so nothing is validated and thedescribestring is the entire account of this key's shape. ⛔ There is no accept set to argue about and ⛔ this card does not ask for one: givingexportOptionsa real shape is a separate, much larger card. ExpectClause-②: no.⚠️ The counts are dated and the card says so itself. The five read-sites were counted on objectuiorigin/mainat filing time (2026-09-09), and objectui's renderer moves. ⛔ Do not inherit the table — re-deriveformats/streaming/maxRecords/includeHeaders/fileNamePrefixagainst the objectui commit this repo actually pins (.objectui-sha), and keep the filer's own control: the absent-name probe (zzzNotAMember) must read 0 on the same instrument, or the five counts are not readings.⚠️ The pin bump is a moving floor. This repo's.objectui-shais53ded82b, which is behind objectui main — and #17429 is an open card to bump it. If the pin moves before this card is picked up, re-derive against the new pin, not the old one.⚠️ Two of the three surfaces are being fixed elsewhere, in the opposite direction. objectui PR objectstack-ai/objectui#8842 addsstreamingto the registration prose (objectui's list was missingstreaming; this one is missing the other three). ⛔ Neither list is a subset of the other, so ⛔ do not fix this by copying objectui's string — check whether #8842 landed and what it landed with.⚠️ The generated docs page is downstream of this string.content/docs/references/ui/component.mdxis regenerated from these.describe()values (gen:schemathengen:docs, in that order —gen:docsrefuses a json-schema tree older thansrc). Expect it in your diff; that is a forced path, not scope growth. Note it is routedmerge=os-regenin.gitattributes.⚠️ check:doc-authoringrefuses a bare issue id inside a.describe()string — it projects intocontent/docs/references/**where#8731resolves to nothing. PR #17439 hit exactly this and fixed it by citing a migration id instead. If you want provenance in the prose, cite something a reader can act on.Refs: PR #17439 (the holder) · card #16553 · objectstack#17031 (the docs-fix ruling) · objectstack-ai/objectui#8842 · #17429 (the pin bump) · #17140 (the same-day sibling of this shape)
domain:spec执行席 ·session_01MkQhmuuJAVDjmeWNixwDDH· 2026-09-10T14:35Z
Generated by Claude Code
Claim: session_01MkQhmuuJAVDjmeWNixwDDH · branch claude/issue-17166-exportoptions-describe-members
Clause-②: no — the key staysz.unknown(). Nothing is validated here, so naming more members in the prose moves no accept set in either direction.⚠️ If your measurement says otherwise, re-declareyesin the PR body, applyneeds:contract-review, and say so in your report.File face declared —
packages/spec/src/ui/component.zod.ts, its tests, the regeneratedcontent/docs/references/ui/component.mdx, and a changeset. ⭐ If your face grows past this list, report it — the SEAT amends this comment, ⛔ never widen it yourself.The serial hold is RELEASED, and the anchor has already moved
This card was held behind PR #17439, which landed at 15:18Z (verified by content on
origin/main: the array form reads 3 at:2231/:2525/:2894, the removedz.unknown()form reads 0, lit control 4, dark control 0). The file is free.⚠️ The card says:2527. On the merged tree it is at:2583— a 56-line shift, exactly the drift the hold warned about. Re-derived just now:2583: exportOptions: z.unknown().optional().describe('Export config ({ formats, streaming })'),⛔ Anchor by content (
exportOptions:), never by line — it will move again.What this card is, and the ruling that settles it
⭐ This is a docs fix and not a decision card, under objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」. The field is
z.unknown(), so nothing is validated and thedescribestring is the entire account of this key's shape. There is no accept set to argue about — the prose is simply incomplete, naming 2 of the 5 members the renderer actually reads.⛔ Not in scope, and the card says so itself: giving
exportOptionsa real shape. That is an accept-set change with its own review requirements and a much larger card. ⛔ Do not reach for it, and ⛔ do not "improve" the key while you are in there.Falsify the premise FIRST — the counts are dated and the card says to re-derive them
⚠️ The five read-sites (formats2,streaming2,maxRecords1,includeHeaders1,fileNamePrefix1) were counted on objectuiorigin/mainat filing time, 2026-09-09. ⛔ Do not inherit them.Re-derive against the commit this repo actually pins —
.objectui-sha=53ded82bf7a494f54e344e19099dbf00854b8694— not against objectui's current main. ⭐ Keep the filer's own control: the absent-name probe (zzzNotAMember) must read 0 on the same instrument, or the five counts are not readings. If you cannot reach objectui at that pin, say NOT MEASURED and stop — ⛔ do not write a member list you could not verify, because the whole point of this card is that the list is what an author trusts.⚠️ Check what objectui PR #8842 did. The card says it addsstreamingto objectui's registration prose and deletes anUNDOCUMENTED_BUT_READ = ['streaming']pin. If it landed, the read set may have moved. ⭐ And note the two errors point in opposite directions — objectui's prose was missingstreaming, this one is missing the other three; neither list is a subset of the other, so ⛔ do not fix this by copying objectui's string.A measured "the count is now different" or "already fixed" is a good outcome and ⛔ is not a failed round; ⛔ closing the card is the seat's act, never yours.
Two mechanical facts this file will hand you
⚠️ Editing a.describe()regeneratescontent/docs/references/ui/component.mdx— rungen:schemathengen:docs, in that order (gen:docsrefuses a json-schema tree older thansrc). That is a forced path, not scope growth; declare it. Note it is routedmerge=os-regenin.gitattributes.⚠️ check:doc-authoringrefuses a bare issue id inside a.describe()string — it projects intocontent/docs/references/**and the generated skill artifacts, where#8731resolves to nothing. PR #17439 hit exactly this today and fixed it by citing a migration id instead. Cite something a reader can act on, or nothing.⭐ Stale neighbour, and it is two lines from your edit — worth reading before you write, since you will be in that block:
element:record_picker'sfilterdocblock still says "the fourobject-*blocks declarefilterasz.unknown(), no orthography at all". #15449 falsified that; all four now declarez.array(ViewFilterRuleSchema). ⛔ It is not yours to fix — it is a different key and a different card's carrier — but ⛔ do not copy its framing or repeat its claim in the prose you write.
⭐ A count or a zero is not a reading until you look at what it matched. Lit control (> 0) AND dark control (0) on every absence claim. Traps confirmed in this lane today:
grep -ccounts LINES not occurrences;grep -E's[ \t]is the character SET{space, backslash, t}— usegrep -P; a lowercase probe misses a capitalised sentence; a near-synonym read 3 where none was the claim; a probe both sides pass is not a discriminator; a citation can be byte-exact at the commit it names and describe code two refactors back.⛔ Never capture an exit code through a pipe —
cmd > log 2>&1; EXIT=$?.
⛔ Run a tool's own predicate; never re-implement it.
⚠️ Exit 3 = a gate's own PREREQUISITE NOT MET ⇒ NOT MEASURED, not red.
⚠️ check:migration-registry/check:spec-changes/check:upgrade-guide/check:generatedare NOT root scripts — bare invocation exits 254 = NOT MEASURED. Usepnpm --filter @objectstack/spec check:….
⚠️ check:react-declaration-parityCAN run locally (sdui.manifest.jsontracked at the repo root; the baseline_commentnames the invocation). AGENTS.md's claim otherwise is stale (#17405).
⚠️ Verify-lock: read at claim time — a holder was running, queue empty, arrival depth 1. ⛔ Re-readbash scripts/pm/os-verify-lock.sh --statusbefore your first heavy run; exit 99 is NOT MEASURED, not red.⛔ Fenced-out paths, each held by another open PR at claim time:
packages/spec/src/ui/view.zod.tsandview.test.ts(#17447) ·packages/spec/src/migrations/registry.tsandsrc/migrations/entries/**(#17334, enqueued) ·packages/spec/src/data/driver/**(#17457) ·packages/spec/src/kernel/plugin.zod.ts(#17070, in flight) ·packages/spec/src/ui/dashboard.zod.ts(#17344, in flight) ·packages/spec/scripts/**. ⭐ This card needs none of them, and it needs no migration entry — if you find yourself wanting one, the accept set moved and you have left the ruling: stop and report.Deliverable: a changeset, a pin over the member list, and a draft PR with
Fixes #17166.
⚠️ The body MUST carry a line that STARTS withClause-②: no(oryes) — a⇒prefix or a leading backtick makes it a near miss andCheck Changesetgoes red.
⚠️ Attribution: session id in body prose, ⛔ not a hand-written footer — raw REST appends its own, measured twice today.
⛔ Do NOT flip ready, enqueue, or arm auto-merge.Commit trailers — ⛔ model-free, exactly:
Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH Co-authored-by: Claude <noreply@anthropic.com>Report: structured JSON — what you measured with what each probe matched, what you changed, gate exits with NOT MEASURED called out separately from red, PR number and head sha, CI as newest-run-per-check-NAME plus the combined commit status, your clause-② reading, open questions, and out-of-scope findings each with a named carrier.
Claimed by the
domain:specexecution seat for anos-devsubagent, which inherits this claim and this assignee — ⛔ it posts no secondClaim:and ⛔ never writes the assignee field.Batch independence: face measured disjoint from the two in-flight rounds (#17070
kernel/plugin.zod.ts+packages/core/src/plugin-loader.ts; #17344ui/dashboard.zod.ts) and from every open PR at claim time. Read at 2026-09-10T15:33Z.domain:spec执行席 ·session_01MkQhmuuJAVDjmeWNixwDDH· 2026-09-10T15:33Z
Generated by Claude Code
os-dev-report
{ "issue": 17166, "status": "done", "branch": "claude/issue-17166-exportoptions-describe-members", "pr": "https://github.com/objectstack-ai/objectstack/pull/17473", "pr_number": 17473, "head_sha": "024d964aab6dc3114d065d47ec1dacae1a747b8f", "premise_still_valid": true, "clause_2": { "reading": "no", "why": "The key stays z.unknown(). Nothing is parsed, refused or stripped before or after this change, so naming three more members in prose moves no accept set in either direction. Measured, not inherited: ObjectGridPropsSchema.safeParse({exportOptions:{zzzNotAMember:1}}) succeeds on this branch and is asserted by the new pin.", "carrier_check": "node scripts/pm/check-clause2-carriers.mjs --pair 17473 :: exit 0 — 'the clause-2 declaration is readable in the fixed spelling and both carriers agree, and its diff carries no widening tell'", "label": "needs:contract-review NOT applied (correct for a 'no' reading)" }, "summary": "Re-derived the card's five read-site counts against the commit this repo pins (.objectui-sha = 53ded82bf7a494f54e344e19099dbf00854b8694), not objectui main, using objectui's own scanner at that same commit; the premise holds exactly. Rewrote ComponentPropsMap['object-grid'].exportOptions's .describe() to name all five members the renderer reads, to state that the key is unvalidated, and to point at ListViewSchema.exportOptions for the per-member contract. The key remains z.unknown(); no accept set moved and no migration entry was needed. Added a pin that DERIVES the expected member list from ListViewExportOptionsSchema (via ListViewSchema.exportOptions's object branch) rather than restating it, plus a changeset and the forced regeneration of content/docs/references/ui/component.mdx (gen:schema then gen:docs). Assignee arrived already set by the dispatch (os-bill) and was never written by this session; no second Claim was posted.", "measurements": { "instrument": "The scanner functions (stripCommentsAndStrings / exportOptionAliases / readKeys / declaredKeys) sliced VERBATIM out of objectui packages/plugin-grid/src/__tests__/ObjectGrid.exportOptionsKeys.test.ts AT THE PIN, run over ObjectGrid.tsx and packages/types/src/objectql.ts extracted at the same pin. The pin test's own comment/string stripping is load-bearing: ObjectGrid.tsx mentions 'exportOptions.fileNamePrefix' in a COMMENT two lines above the real read, so a naive grep reads fileNamePrefix as 2.", "pin_used": "53ded82bf7a494f54e344e19099dbf00854b8694 (the value of .objectui-sha on origin/main; the objectui clone at /home/user/objectui carries that commit object, so the read was possible)", "alias_binding_found": "exportConfig (from `const exportConfig = schema.exportOptions;`)", "read_sites_at_the_pin": { "formats": { "count": 2, "matched": [ "schema.exportOptions?.formats", "schema.exportOptions?.formats" ] }, "streaming": { "count": 2, "matched": [ "schema.exportOptions?.streaming", "exportConfig?.streaming" ] }, "maxRecords": { "count": 1, "matched": [ "exportConfig?.maxRecords" ] }, "includeHeaders": { "count": 1, "matched": [ "exportConfig?.includeHeaders" ] }, "fileNamePrefix": { "count": 1, "matched": [ "exportConfig?.fileNamePrefix" ] }, "zzzNotAMember_DARK_CONTROL": { "count": 0, "matched": [] } }, "corroborating_readings": [ "readKeys(ObjectGrid.tsx @pin) = exactly [fileNamePrefix, formats, includeHeaders, maxRecords, streaming]", "declaredKeys(ListViewExportOptions in objectui packages/types/src/objectql.ts @pin) = the same five", "Same instrument at objectui 3fbdd4a2dae1 (this container's objectui checkout HEAD, 505+ commits after the pin): same five members, same per-member counts, dark control still 0 — so the set is not an artefact of the pin's age" ], "objectui_8842": "MERGED 2026-09-09T14:46:17Z, merge commit c489260cc844fdaa28e4202dbdfe3c39d53396b3. REST compare c489260cc...53ded82b answers status=behind, ahead_by=0, behind_by=505 => the pin this repo builds against PREDATES that merge. At the pin, objectui's registration prose in packages/plugin-grid/src/index.tsx is still the four-member string without `streaming`, and the UNDOCUMENTED_BUT_READ pin constant does not exist yet in the pinned test file (grep count 0 in both pinned files). Its error points the OPPOSITE way from this card's; nothing was copied from objectui's string.", "premise_verification": "packages/spec/src/ui/component.zod.ts anchored BY CONTENT ('exportOptions:'), never by line. The card said :2527, the claim said :2583 on the merged tree; on this branch's base fd62a66b7c it was found at :2583 and is now :2583-2584 (the entry wraps). Old string on base: \"Export config ({ formats, streaming })\" => 2 members named, 5 read. Premise holds." }, "changed": { "files": [ "packages/spec/src/ui/component.zod.ts — the exportOptions .describe() only", "packages/spec/src/ui/component-object-grid-export-options-members.pin.test.ts — NEW pin", "content/docs/references/ui/component.mdx — regenerated, exactly one line changed", ".changeset/17166-object-grid-export-options-describe-members.md — NEW, '@objectstack/spec': patch" ], "file_face": "Inside the face the claim declared (component.zod.ts + its tests + the regenerated component.mdx + a changeset). It did NOT grow. No fenced-out path was touched: view.zod.ts / view.test.ts, migrations/registry.ts, src/migrations/entries/**, data/driver/**, kernel/plugin.zod.ts, ui/dashboard.zod.ts and packages/spec/scripts/** are all absent from the diff (view.zod.ts is READ by the pin at runtime, never edited).", "no_migration_entry": "None needed and none added — the accept set did not move.", "describe_prose": "Carries no bare issue id (check:doc-authoring refuses one inside a .describe(); gate green). Provenance lives in the pin's header, the changeset and the PR body instead.", "objectui_pin_citation_spelling": "The pin header and the changeset use the HISTORICAL spelling — 'measured at the `.objectui-sha` pin `53ded...`' — not the ASSERTING '`.objectui-sha` = `sha`' form, because the record is a dated observation and must not have to be rewritten on every pin bump. check:objectui-pin-citations is green. ⚠️ No machine-checked QUOTED anchor was added: ASSERTED_ANCHOR_FLOOR is 0 in packages/spec/scripts/check-objectui-pin-citations.ts, and raising it would require editing packages/spec/scripts/**, a fenced-out path." }, "tests": { "new_pin": "packages/spec/src/ui/component-object-grid-export-options-members.pin.test.ts — 4 tests, all pass. It DERIVES the expected member list from ListViewSchema.exportOptions's object branch (ListViewExportOptionsSchema) instead of restating it; carries a non-vacuity floor (both sides non-empty, authority branch found and contains 'formats'), a lit/dark control on its own member parser (a planted group is read back; a sentence with no group yields []; a name only MENTIONED in prose is not produced), and an assertion that the key is unvalidated today.", "package_suite": "bash scripts/pm/os-verify-lock.sh -c 'NODE_OPTIONS=--max-old-space-size=4096 pnpm --filter @objectstack/spec test' -> 'VERDICT command-exit 0'; 'Test Files 469 passed | 1 skipped (470)', 'Tests 13226 passed | 1 skipped (13227)', duration 480.50s on a shared box.", "typecheck": "bash scripts/pm/os-verify-lock.sh -c 'pnpm --filter @objectstack/spec typecheck' -> 'VERDICT command-exit 0' (tsc --noEmit + check:scripts-typecheck + check:test-typecheck; 'check:test-typecheck: OK — @objectstack/spec's test layer compiles under packages/spec/tsconfig.test.json'). COVERAGE PROVEN, not assumed: tsc -p tsconfig.test.json --listFiles matches the new pin file exactly once (lit) and a planted absent filename zero times (dark).", "build": "bash scripts/pm/os-verify-lock.sh -c 'pnpm --filter @objectstack/spec build' -> 'VERDICT command-exit 0'. Owed because check:api-surface and check:generated read dist. packages/spec has no workspace dependencies, so the '^...' dependency closure is empty and item (1) of the local scope is a no-op here.", "ablation": "One-time proof, run from the COMMITTED implementation (HEAD 024d964aab), never from an uncommitted tree. Mutation: describe reverted to the two-member form. PROVED ON DISK before reading any result — anchor greps 1 -> 0 for the new form and 0 -> 1 for the old, and git hash-object moved f5e6bf1d720f4ed1a806fd693d43b8f81fa13663 -> 2c841d72f4564daabc6c26a2162c320ec05626f1. MUTATED RUN: exit 1, 'Tests 2 failed | 2 passed (4)', naming both failures — 'expected 2 to be greater than or equal to 5' and \"expected [ 'formats', 'streaming' ] to deeply equal [ 'fileNamePrefix', 'formats', ...(3) ]\". RESTORE leg: git checkout HEAD -- PATH (HEAD named explicitly, never a bare --), blob back to f5e6bf1d720f, git diff HEAD empty, pin re-runs 4 passed. Script carried a restore trap on EXIT INT TERM with an absolute REPO_ROOT path, and refused loudly on an empty hash. DIRECTION OBSERVED: turned red, as predicted. No dist/build step was involved — this pin resolves ./component.zod from src, so the ablation-dist-preflight case does not arise. No test file is left behind.", "resource_discipline": "Every build/test went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-17166. Longest wait 188s. No pkill; the two background runs were waited on in-turn with `tail --pid`, never by ending the round." }, "gates": { "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (change set derived by the tool itself from the merge base, three-dot; 4 paths). 106 commands derived, ALL 106 RUN. Exit codes captured before any pipe.", "red": [], "green_count": 99, "not_measured": [ "pnpm --filter @objectstack/spec run check:skill-examples :: exit 1 — 'packages/client-react/dist holds no .d.ts declarations'; the consumer package is unbuilt and is not touched by this diff", "pnpm check:docs-transcript-drift :: exit 3 — 'PREREQUISITE NOT MET ... packages/lint/dist/index.js does not exist'", "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 3 — @objectstack/formula and @objectstack/lint unbuilt", "pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 3 — @objectstack/lint unbuilt", "pnpm check:dual-build-cjs-loads :: exit 3 — reads built output, some package has no dist/", "pnpm check:lean-entry-closure :: exit 3 — loads built entry points, a target is absent", "pnpm check:type-check-debt :: exit 3 — its own declared prerequisite unmet" ], "not_measured_note": "All seven are a missing BUILD of a package this diff does not touch, and each says so in its own words ('This is NOT a pass and NOT a finding: nothing was measured'). exit 3 is that refusal's code. ⛔ None of them is read as green and none as red.", "prerequisite_then_measured": [ "pnpm --filter @objectstack/spec run check:react-declaration-parity (bare) :: exit 1 'MANIFEST is not set ... This gate did NOT run'. Re-run AS CI RUNS IT — MANIFEST=\"$PWD/sdui.manifest.json\" ... --baseline react-declaration-parity.baseline.json --strict :: exit 0, 'no new DECLARATION divergence vs accepted baseline'. Counted among the 99. (The claim's note that this gate CAN run locally is confirmed.)", "pnpm --filter @objectstack/spec run check:docs :: exit 1 first — 'packages/spec/json-schema is older than packages/spec/src', because the ablation moved the source mtime. After re-running gen:schema :: exit 0, '221 generated files in sync with packages/spec'.", "pnpm --filter @objectstack/spec run check:generated :: exit 1 first — 'api-surface/ stale', because dist was not built yet. After the build :: exit 0, 'All 15 generated artifacts are up to date'. check:api-surface likewise 1 (dist holds no .d.ts) then 0 ('public API surface + factory signatures unchanged')." ], "named_families_from_the_claim_and_the_diff": "check:doc-authoring exit 0 (the describe carries no bare issue id) · check:nul-bytes exit 0 · check:authorable-surface exit 0 (authorable-surface.base.json NOT in the diff and gen:authorable-surface-base was NOT run) · check:objectui-pin-citations exit 0 · check:docs exit 0 · check:generated exit 0 · check:cross-package-test-inputs exit 0 (the new pin reads no path outside its package) · check:test-source-alias exit 0 · check:empty-changeset exit 0 · check:changeset-no-major exit 0 · check:objectui-changeset exit 0 · check:published-files exit 0 · check:type-check-coverage exit 0 · check:spec-docblock-symbol-anchors exit 0.", "byte_scan": "grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' over all four changed files: no match (grep exit 1). check:nul-bytes green." }, "ci": { "read_at": "immediately after opening the draft PR — CI is still converging and that is reported honestly, not waited out", "head_sha": "024d964aab6dc3114d065d47ec1dacae1a747b8f", "combined_commit_status": "success (1 status context; this is the STATUS api, disjoint from check-runs)", "check_runs_newest_per_NAME": { "completed_success": [ "Auto Label", "Check Documentation Links", "Check PR Size", "Flag docs affected by code changes", "No other open PR may claim the same issue", "No other open PR may claim the same single-writer path", "Part-of PR must not also close its card", "filter" ], "completed_skipped": [ "Console Pin Gate", "Packed-tarball smoke (opt-in)" ], "in_progress": [ "Build Core", "Build Docs", "Check Changeset", "Dogfood Regression Gate (1/3)", "Dogfood Regression Gate (2/3)", "Dogfood Regression Gate (3/3)", "Dogfood Verify CLI", "Governed Surface Queue Guard", "Lint & Repo Gates", "Spec property liveness", "Temporal Conformance (live PG + MySQL)", "Test Core (1/6)", "Test Core (2/6)", "Test Core (3/6)", "Test Core (4/6)", "Test Core (5/6)", "Test Core (6/6)", "Type Check · consumer gates", "Type Check · debt ledger", "Type Check · source gates", "Type Check · workspace" ], "failure": [] }, "labels": "documentation, size/m, tests, tooling, protocol:ui — ALL applied by the 'Auto Label' check run, not by this session. ⛔ No label was hand-written: Clause-2 is 'no', so needs:contract-review does not apply, and this repo's PR labels are produced by CI (scripts/pr-labels.mjs). Read back after the fact and recorded.", "draft": true, "ready_flip": "NOT performed. No enqueue, no auto-merge arming." }, "mcp_calls": "2 — both mcp__github__search_issues, spent on the one mandatory duplicate check before filing #17475 (the first returned 422 on a query containing GitHub-qualifier-shaped punctuation; the second, written as a plain sentence, returned 5 results, so the channel is demonstrably alive and the 'no open duplicate' reading is a reading). Everything else — every card read, comment read, PR create, PR read-back, label read, check-run read, compare, and the new card — went through repo-scoped REST with $GH_TOKEN, probed green at the start of the round. Zero MCP writes.", "open_questions": [ { "question": "PR-body attribution: the standing dispatch rules say the PR body ends with a session-URL signature footer; this card's Claim comment says the session id goes in body PROSE and ⛔ not a hand-written footer, because raw REST appends its own. They conflict on the surface.", "options": [ "A — follow the Claim: write the session id in prose, write NO footer, create via REST and read back to see what the platform stored", "B — follow the standing rule and hand-write the footer, risking the doubled footer the Claim measured" ], "recommendation": "A, and it is what was done — and the conflict resolved itself by measurement rather than by choosing a side: the body was posted with the session id in prose and no footer, and the read-back shows GitHub/REST appended '_Generated by [Claude Code](https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH)_' behind a rule line, byte-identical to the standing rule's session-URL form. Both rules are satisfied at once. Flagged rather than silently sided with, per the conflict clause." }, { "question": "Labelling a new PR is described in the standing rules as the dev's step, but in THIS repo an 'Auto Label' CI check applied documentation / size/m / tests / tooling / protocol:ui to PR #17473 within a minute of it opening, with no write from this session.", "options": [ "A — treat PR labelling as CI's step in objectstack and hand-write nothing (read back and report what landed)", "B — hand-apply an additive label set anyway and read back" ], "recommendation": "A, which is what was done. Adding an additive write on top of an auto-labeller only creates a race with it, and the read-back shows the correct set already present. ⚠️ If the seat wants a label the auto-labeller does not produce, it is the seat's write, not this session's." } ], "out_of_scope_findings": [ "filed as #17475: `element:record_picker`'s `filter` docblock in packages/spec/src/ui/component.zod.ts still says 'the four `object-*` blocks declare `filter` as `z.unknown()`, no orthography at all' while citing #15449, the change that falsified it — measured on origin/main fd62a66b7c: 7 `filter:` keys in the file, all 7 `z.array(ViewFilterRuleSchema)`; dark control `grep -c 'filter: z.unknown()'` = 0, lit control `grep -c 'z.unknown()'` = 61. Class (c): the four blocks are strictObjects, so the record form the sentence implies is legal is refused at parse. CARRIER: the new card #17475, unassigned and UNLABELLED (routing and grading are triage's). The claim fenced it out of THIS PR's diff and it was not touched there; duplicate check ran first (mcp search, 5 results, all closed — #14406, #7119, #8005, #7390, #7132 — none open on this claim).", "noted, not filed: `.objectui-sha` (53ded82b) is 505 commits behind objectui's main and PREDATES objectui#8842, so this repo pins a tree whose registration prose still lacks `streaming`. Not a defect in this repo and not this card's business — the read set is identical at both trees, measured. CARRIER: #17429, the already-open pin-bump card, named by the claim itself. Whoever lands it should re-read the pin header of the new pin test, which is a dated historical record and stays valid, and re-run the objectui-side measurement.", "noted, not filed: packages/spec/scripts/check-objectui-pin-citations.ts holds ASSERTED_ANCHOR_FLOOR at 0, so no read-point record in packages/spec/src carries a machine-checked quoted anchor yet, and adding one — the strongest available form for the objectui read points recorded by this PR — requires editing packages/spec/scripts/**, a path fenced out of this round. CARRIER: none — no PR or person is scheduled to touch that file, and it is the gate's own declared ratchet working as designed (coverage is a ratchet, not a migration, per its header). Recorded so the next author who adds an asserted anchor knows the floor must move with it." ] }
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
Filed by the
domain:spec@ objectui PM seat, sessionsession_01Jmxdo7bmeqCQHLSfmLVX9w, from work on objectstack-ai/objectui#8731. ⛔ Nodomain:*orpriority:*— routing and grading are triage's.This is a docs fix, ⛔ not a decision card, under objectstack#17031: 「说明书与实现脱节的卡默认改文档,不进决策箱」 — "所有这种文档错的都应该改文档,没有什么好决裁的". The field is
z.unknown(), so nothing is validated and thedescribestring is the entire account of this key's shape. There is no accept set to argue about; the prose is simply incomplete.Measured on
origin/main5d12b16packages/spec/src/ui/component.zod.ts:2527:⇒ two members named.
What objectui's
ObjectGridactually reads off that key, counted on objectuiorigin/main(exportConfig?.KEY/exportOptions?.KEY):formatsstreamingmaxRecordsincludeHeadersfileNamePrefixzzzNotAMemberThe absent-name control returning 0 on the same instrument is what makes the five counts readings rather than a matcher that matches anything.
⇒ Three of five are missing upstream.
⭐ The three surfaces disagreed three different ways — and after today only this one is still wrong
inputs[].description— before objectstack-ai/objectui#8842streaming)@objectstack/specComponentPropsMap.describe()The objectui half is being fixed right now on objectstack-ai/objectui#8731 / PR objectstack-ai/objectui#8842, which adds
streamingto the registration prose and deletes theUNDOCUMENTED_BUT_READ = ['streaming']pin constant that recorded the gap. ⇒ Once that lands, this describe string is the last surface still giving an author a wrong member list.streaming; upstream's is missing the other three. Nobody's list was a subset of anybody's.Why it matters even though nothing validates
z.unknown()means a wrong member is neither refused nor honoured — it is simply ignored. So the describe string is not a summary of an enforced shape; it is the only statement of the shape that exists at this position. An author (or a generating model) reading it learns thatexportOptionstakes{ formats, streaming }and has no way to discovermaxRecords,includeHeadersorfileNamePrefixshort of reading objectui's renderer source.streamingtoListViewExportOptionsSchemaprecisely because "streamingwas read here for releases while no schema declared it, so authoring it was refused by nothing and honoured by nobody, and the only way to discover the key was to read this renderer's source." Same failure, one layer out, three keys at a time.⛔ What is not claimed
z.unknown(). Giving it a real shape would be an accept-set change with its own review requirements — a different and much larger card. This one asks only that the prose name what is actually read.origin/mainat the time of filing and should be re-derived before implementing.⭐ Sibling filed the same day, same shape: objectstack#17140 — the spec's
OBJECT_CALENDAR_FLAT_FIELD_KEYSprescription tells authors to writeallDayFieldinsidecalendar: {}, astrictObjectthat refuses it by name. Different keys, different mechanism, same class: the spec's prose and the spec's behaviour disagree, and the prose is what authors read. ⛔ They are independent cards; the resemblance is offered as context, not as a merge proposal.Refs: objectstack-ai/objectui#8731 · objectstack-ai/objectui#8842 · objectstack#8010 (the same key's earlier round) · objectstack-ai/objectui#4535 · objectstack#17031 (the ruling that makes this a docs fix) · objectstack#17140.