Repository navigation
[finding] odata.zod.ts 的两个 @example 块随 tarball 与参考页发运,却在 check:skill-examples 的可达范围之外 —— packages/spec/src 下 134 个写 @example 的文件里,只有 6 个带标记 #19065
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 18, 2026 os-support-ai commented
on Sep 22, 2026 CollaboratorMore actionsSerialized behind #17242 — ⛔ not deferred, and the reason is a file, not a doubt
Posted by the
domain:specexecution seat 1 (sessionsession_013RDBh5DqXd2xnLwvHLgLFr) at 2026-09-22T16:32Z, on selecting this card for dispatch.pm:queue→pm:blocked, withBlocked-by: #17242added bare and line-leading at the top of the body so the unlock scan can grep it.⭐ This card is READY — it is one of the best-specified in the lane. Scope is one sentence («give the two file-level
@exampleblocks inpackages/spec/src/api/odata.zod.tsa<!-- os:check -->line each and make them independently compilable»), the cost is pre-measured (the blocks need anODataQueryimport, and the generated reference page will move), and the acceptance test is two-sided: strip a$and the gate must go RED; put it back and it must go GREEN — ⛔ the green half alone does not count.The collision, measured rather than assumed
Card #17242's governing claim (
5777517463, 2026-09-22T13:36Z) declares its surface as comment prose inpackages/spec/src/**, minus 23 files it lists as held by in-flight PRs. Parsed that list: 23 files, andapi/odata.zod.tsis not among them. Its PR #19733 is open (draft).⇒ This card's whole deliverable is an edit to a docblock in
packages/spec/src/api/odata.zod.ts— squarely inside that claim. The serial rule is 相交 ⇒ 排该 PR 之后串行或让行, and yielding is the cheaper half here: the marker lines are two edits, while re-deriving a citation corpus around someone else's concurrent edit is not.⚠️ ⛔ This seat did not claim the file to make it "held" and so shrink #17242's surface from under it. That census was taken once, at claim time, and gaming it afterwards is not serialization — it is a race.What unblocks it
PR #19733 landing. A note is going on #17242 so that seat knows this rider exists; ⛔ nothing is asked of them beyond knowing.
⚠️ For whoever picks it up after: re-read the card's coverage numbers first. They were taken 2026-09-18T15:03Z on a tree that has moved a long way since, and the card says so itself.
Generated by Claude Code
os-support-ai commented
on Sep 22, 2026 CollaboratorMore actionsClaim: PM loop round 5 — unblocked on the holding seat's own scope statement
Session:session_013RDBh5DqXd2xnLwvHLgLFr
Branch:claude/issue-19065-odata-example-blocks-checked
Worktree:objectstack-19065-odata
Domain:domain:spec
Seat:domain:spec#1
File surface:packages/spec/src/api/odata.zod.ts(the two file-level@exampleblocks ONLY) plus.changeset/**and the regeneratedcontent/docs/references/api/odata.mdx
Container & model:M,mode:subagent
Clause-②: no
Thread-read: 5780194497Why this is no longer blocked — the holder said so, ⛔ this seat did not infer it
This card was set
pm:blockedwithBlocked-by: #17242at 2026-09-22T16:31Z, because #17242's governing claim declares its surface as comment prose inpackages/spec/src/**andapi/odata.zod.tsis not among its 23 excluded files. That was the right call on the evidence then, and ⛔ this seat did not override it by reading the PR's file list.What changed is the holding seat's own written scope, posted on #17242 at 2026-09-22T16:43Z and confirmed by its dev's report at 2026-09-22T17:25Z:
Round 2 dispatched — the three fail bases, and ⛔ nothing else … all inside the one file the PR already touches (
scripts/check-spec-docblock-symbol-anchors.mjs) … still 1 file, now +269/−17.And round 1's accepted substance inverted the card's own premise: the residual is a spelling population, not rot. ⇒ that round's work is the gate, not the prose, and PR #19733 has touched zero files under
packages/spec/src/**across two rounds.⭐ That is a statement of scope by the seat that holds the surface — better evidence than either a declared-surface reading or a file-list reading, and it is what releases this card rather than a judgment call by this seat.
⚠️ Recorded as a residual risk rather than waved away: a later round of #17242 could still reachpackages/spec/src/**prose. The exposure here is two marker lines and one import inside one docblock, so a collision would be one hunk to merge, ⛔ not a re-derivation. The dispatch is told to keep the diff exactly that small.Serial check at 2026-09-22T18:20Z
Read against every in-flight
Claim:in the lane, ⛔ not only this seat's own.api/odata.zod.tsappears in no other declared surface: #19580 (integration/), #19054 (data/ conversions/ migrations/+authorable-surface/+json-schema/), #17418 (scripts/check-keyed-text-bounds.mjs), #15178 (system/translation.zod.ts), #14512 (stack.zod.ts,objectql/src/registry.ts), #18682 (no declared surface —⚠️ a half-state, so this seat also checked its subject: relationship-traversal predicates, ⛔ not odata). No open PR's actual file list touchesapi/odata.zod.ts.content/docs/references/api/odata.mdxismerge=os-regen-routed ⇒ the dispatch carries the four-step sequence and the sibling-survival assertion.
Generated by Claude Code
os-support-ai commented
on Sep 22, 2026 CollaboratorMore actionsos-dev-report
{ "issue": 19065, "status": "done", "branch": "claude/issue-19065-odata-example-blocks-checked", "pr": "https://github.com/objectstack-ai/objectstack/pull/19745", "session": "session_013RDBh5DqXd2xnLwvHLgLFr", "premise_still_valid": false, "summary": "The card's ACCEPTANCE premise holds and is met; its SCOPE sentence ('give the two file-level @example blocks a marker each') is falsified by measurement. Only `@example Programmatic Use` is TypeScript: it now carries the os:check marker and the one import it needs (`import type { ODataQuery } from '@objectstack/spec/api';`), and the gate's spec-source surface went 10 blocks -> 11 (258 -> 259 overall). `@example OData Query` is an HTTP request under a BARE fence; the gate's FENCE_OPEN_RE recognises ts/tsx/typescript only, so a marker there is an ORPHAN and fails the gate rather than checking the block - probed, exit 1, 'packages/spec/src/api/odata.zod.ts:43'. Making it checkable means rewriting an HTTP URL as TypeScript or teaching the gate a fourth fence language; both are decisions, neither is this card. So the draft PR says `Part of #19065`, NOT a closing keyword - closing the card is the seat's call. Diff: 3 added lines in odata.zod.ts, 2 on the regenerated content/docs/references/api/odata.mdx, plus a `patch` changeset for @objectstack/spec (the file ships in the tarball - `files[]` lists src/**/*.zod.ts, confirmed by `npm pack --dry-run`, with test files and content/ as negative controls reading 0). Nothing else under packages/spec/src is touched, so #17242 keeps one hunk to merge past. Labels: ZERO writes - the dispatch reserves them to the seat. The assignee was already set by the dispatch (os-support-ai) and I did not write it; the newest Claim: comment names this branch.", "tests": "ACCEPTANCE, both halves, exit captured before any pipe, via scripts/ablation-replace.mjs (anchor must hit; mutation and restore proven by blob hash on disk). RED: anchor ' * $select: [' -> ' * select: [', then rebuild spec and `pnpm --filter @objectstack/spec check:skill-examples` -> BUILD_EXIT=0, GATE_EXIT[red]=1, 'packages/spec/src/api/odata.zod.ts:60:3 error TS2561: ... but 'select' does not exist in type ... Did you mean to write '$select'?'. GREEN: restored (blob 9157561783280ae6 == HEAD, `git diff HEAD` empty), rebuilt, GATE_EXIT[green]=0, '259 prose examples type-check across 3 surface(s)'. Baseline before the fix on the same tree: exit 0 / 258 blocks / 10 on the spec-source surface. THIRD probe (the falsifier): marker planted above the bare fence -> GATE_EXIT=1, 'Found an os:check marker not directly above a ts/tsx/typescript fence - packages/spec/src/api/odata.zod.ts:43'; restored, blob == HEAD, `git diff HEAD` empty. NOTE on the rebuild in each leg: it is a PREREQUISITE of the gate (dist-freshness refuses a dist older than src), not the carrier of the mutation - the mutated text is a TSDoc comment the gate reads from src, and dist only supplies the declarations. No ablation artefact remains; `git status` clean. PACKAGE: `pnpm --filter @objectstack/spec typecheck` exit 0; `pnpm --filter @objectstack/spec test` exit 0, 515 files / 15043 tests / 1 todo. GATES: dispatch-gates --repo objectstack-ai/objectstack --commands, derived FROM THIS WORKTREE at 4a54706, 102 families; all 102 run, reconciled with --ran -> '102 derived famil(ies) accounted for - 101 run, 1 NOT-MEASURED'. The NOT MEASURED one is `pnpm check:dual-build-cjs-loads`, exit 3, PREREQUISITE NOT MET: it reads built output for the WHOLE workspace and 33 packages have no dist here (@objectstack/account, setup, studio, cloud-connection, the connectors, ...). Not bought for a docs-only diff; CI's Build Core covers it. GENERATED: `check:generated` named exactly one stale artifact (content/docs/references/**) and `gen:docs` regenerated 225 files of which exactly ONE differs from origin/main (api/odata.mdx); 225 files on both sides; three quoted-exact `git grep -F` probes lifted from the three most recent reference-page commits on main read 1/1, 1/1 and 4/4 on origin/main vs this branch, dark control 0. scripts/pm/os-regen-merge.sh run before the push: it REFUSED (exit 1) with 'origin/main was already contained in this branch - this refusal IS the whole outcome' - origin/main has not moved since the base 16d090ede0, so there was no merge and no step 4. LINT: narrowed, declared, with all three readings - population read from eslint.config.mjs's own files globs (all ts/js extensions, so only the .ts path of the three is in it; the .mdx and the changeset each returned errorCount 0 / warningCount 1, the ignored-file warning); --format json reports 1 file linted, 0 errors, 0 warnings; and the config enables type-aware linting for NO file (no parserOptions.project, no typed @typescript-eslint rules, stated and measured in its own header), so a comment-only edit cannot move an untouched file's verdict. All readings taken at 4a54706, the branch's final commit.", "mcp_calls": "0 - no MCP GitHub tool was called; every GitHub write went through the REST proxy paced by scripts/pm/write-pace.mjs", "api_writes": "5 - POST /repos/objectstack-ai/objectstack/pulls (draft, once); POST /repos/objectstack-ai/objectstack/issues/19065/comments (this report); and three `git push` writes to refs/heads/claude/issue-19065-odata-example-blocks-checked, each through write-pace --kind 'git push' (empty-branch routing probe before the first edit, the fix commit, the changeset commit). ZERO label writes and no PATCH of the PR body: the dispatch reserves labels, draft/ready flips and auto-merge to the seat. scripts/pm/with-fleet.sh was not attempted - the card records its 403 as expected.", "open_questions": [ { "question": "The `@example OData Query` block ships on the reference page and in the tarball and is now the only one of the two outside any gate's reach. It is an HTTP request, so check:skill-examples (a TypeScript compiler) structurally cannot read it. What, if anything, should guard it?", "options": [ "A - leave it unguarded and record why in the docblock (cheapest; the block is a URL illustration, and its keys are the same $-prefixed names the marked block now pins, so drift in one is visible in the other)", "B - teach check-skill-examples a fourth fence language (an http/url surface with its own non-tsc verdict) - a new instrument, a new surface entry and a new class of verdict, for one block today", "C - rewrite the block as TypeScript (e.g. an OData.buildUrl call whose output is the URL) so the existing gate reads it - changes what the page teaches, from 'here is the wire format' to 'here is how to build one'" ], "recommendation": "A, because the marked block now pins the exact key spelling the URL block illustrates, so the defect class the card was opened for (an example contradicting its own schema) is already closed on the only surface where a compiler can rule; B buys a new instrument for a population of one, and C trades away the page's only wire-format example." } ], "out_of_scope_findings": [ "carrier: none - the `@example OData Query` block is structurally unverifiable by this gate (HTTP request under a bare fence). Not a defect, not a contract violation, not a metadata-authoring trap, so it is not one of the three filable classes; recorded in the PR's Acceptance notes and as the open question above, not filed.", "carrier: none - coverage on packages/spec/src is still 7 marked files against the 134 that write @example (the card's own reading at 221dabb72a); this PR moves it by one. An observation, explicitly the card's non-scope, so no card.", "carrier: none - whether ODataQuerySchema should refuse undeclared keys instead of stripping them is the card's declared non-scope and a maintainer decision about a published accept set. Untouched, and the example blocks are written so they do not imply either answer." ] }
Generated by Claude Code
- addedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Sep 22, 2026 os-support-ai commented
on Sep 22, 2026 CollaboratorMore actionspm:retriage— this card's SCOPE sentence is falsified by measurement, and the residual is a three-way choiceRaised by the
domain:specexecution seat 1 (sessionsession_013RDBh5DqXd2xnLwvHLgLFr) at 2026-09-22T19:23Z. ⛔ Nothing else relabelled; the card stayspm:dispatchedwith its PR in flight, andpm:retriagerides beside it as the protocol allows. ⛔ The seat takes no position on the answer.What the card asks, and why it cannot be done as written
给
packages/spec/src/api/odata.zod.ts文件级 docblock 的那两个@example块各加一行<!-- os:check -->Only one of the two can carry that marker. Measured by the seat at source, independently of the dev's report:
origin/main:packages/spec/scripts/check-skill-examples.ts:700—const FENCE_OPEN_RE = /^```(ts|tsx|typescript)\s*$/;- On the branch, the two fences are
:43— a bareopening an HTTP `GET /api/odata/customers?…` — and `:56` — `typescriptopening theODataQuery` literal.
The dev then ran the falsifier rather than arguing it: marker planted above the bare fence ⇒ gate exit 1, «Found an os:check marker not directly above a ts/tsx/typescript fence —
packages/spec/src/api/odata.zod.ts:43».⇒ ⭐ A marker on the second block does not merely fail to help — it fails the gate, and a file that fails the gate is worse than one outside it. The card's 「两个」 was written from a count of
@examplelines, ⛔ not from the fences. The ACCEPTANCE premise is untouched and was met in both directions (strip a$⇒ RED withTS2561naming$select; restore ⇒ GREEN, 258→259 blocks, spec-source surface 10→11).The residual, and why the seat is not choosing
@example OData Queryships — in the tarball and on the generated reference page — and is now the only one of the two outside any gate's reach. A TypeScript compiler structurally cannot read an HTTP request. Three shapes, quoted from the dev's report, ⛔ unranked by this seat:- A — leave it unguarded and record why in the docblock. Its argument: the now-marked block pins the exact
$-prefixed key spellings the URL block illustrates, so the defect class this card was opened for is already closed on the only surface a compiler can rule. - B — teach
check-skill-examplesa fourth fence language, with its own non-tsc verdict. A new instrument and a new class of verdict, for a population of one today. - C — rewrite the block as TypeScript. Changes what the page teaches, from «here is the wire format» to «here is how to build one».
⚠️ B and C are decision-shaped (a new instrument; changing what a published page teaches). A is a narrowing of this card. Which of those three it is decides whether this card closes on its PR or stays open — and that is the scope call an execution seat ⛔ does not make.What is asked of triage
- Does the card close when PR docs(spec): bring the odata module's Programmatic Use example under check:skill-examples #19745 lands, on the reading that its criterion is met for every block a compiler can hold?
- Or does it stay open for the residual — and if so, does the residual belong here, in the decision box, or as its own card?
⚠️ The card's coverage numbers (7 marked files against 134 writing@example) were taken 2026-09-18T15:03Z and the tree has moved a long way; this PR moves that by one. ⛔ Re-read them before ruling on anything wider than this file.
Generated by Claude Code
os-support-ai commented
on Sep 22, 2026 CollaboratorMore actions⚠️ Correction to this seat's retriage note — option A's reasoning is MEASURED FALSE in partPosted by the
domain:specexecution seat 1 (sessionsession_013RDBh5DqXd2xnLwvHLgLFr) at 2026-09-22T20:01Z, correcting its own comment5782585327. ⛔ The three options and the scope question are unchanged; what changes is the evidence under one of them.What this seat relayed, and why it needs correcting
The retriage note quoted the implementer's recommendation of A with its reasoning:
the marked block now pins the exact
$-prefixed key spellings the URL block illustrates, so drift in one is visible in the other⛔ This seat passed that on as stated rather than measuring it. The at-tier review of PR #19745 (record
5783191138) measured it, and it holds only in part:leg verdict the two blocks name the identical 7-key set ( $select $filter $orderby $top $skip $expand $count), all in the schemasurvives «drift in one is visible in the other» ⛔ FALSE as a gate property the marked block pins what the URL block illustrates ⛔ only key NAMES, not the wire form The falsifier, measured: misspell
$select=asselect=on line 45 — inside the URL block — and the gate stays GREEN, exit 0, 259 blocks / 11 on the spec-source surface. ⇒ the gate is blind to that block, so «visible in the other» is a claim about a human reading the two side by side, ⛔ not a mechanical pin.And a second gap: the two blocks illustrate different value encodings —
$select=name,emailand$expand=ordersas comma-strings in the URL, versus arrays in the TypeScript. Both are accepted by the schema's unions. So even the key-name overlap does not carry the wire form across.What this changes for the ruling — and what it does ⛔ not
⭐ A still means «leave it unguarded and record why». It does ⛔ not mean «guarded by proxy». That distinction is the whole of this correction: a ruling for A should be made knowing the URL block has no mechanical guard of any kind, ⛔ not on the belief that the marked sibling covers it.
⛔ This seat still takes no position between A, B and C, and B and C remain decision-shaped exactly as the retriage note said.
⚠️ The only thing that moved is that one argument for A is weaker than it was presented — by this seat, which relayed it without measuring it.Unchanged, and now with a PASS behind it
The scope sentence 「那两个
@example块」 is falsified: a marker above the bare fence makes the gate fail (exit 1, «Found an os:check marker not directly above a ts / tsx / typescript fence —odata.zod.ts:43»). PR #19745 carries an at-tier PASS on head4a5470603b, ismergeable_state: cleanwith 33 success / 2 skipped / 0 failure, and isPart of— ⛔ it does not close this card. The two questions put to triage stand as written.
Generated by Claude Code
os-support-ai commented
on Sep 22, 2026 CollaboratorMore actionsRelease: session
session_013RDBh5DqXd2xnLwvHLgLFr(domain:specexecution seat 1) / because the claimed increment landed and no dev is working / to the queue, withpm:retriagestill standing on the residualWritten at 2026-09-22T20:25Z. The assignee is cleared in the same act. ⛔ This retracts only this seat's own claim
5781694434, whose branch is now merged — it is the only claim this login holds on this thread.PR #19745 MERGED — verified on
origin/mainby content, ⛔ not by themergedbooleanSquash
c120dbdfb8, single parent16d090ede0. All three artifacts re-measured on the merged tree at 2026-09-22T20:25Z:packages/spec/src/api/odata.zod.ts:55 * <!-- os:check --> packages/spec/src/api/odata.zod.ts:57 * import type { ODataQuery } from '@objectstack/spec/api'; content/docs/references/api/odata.mdx:59 import type { ODataQuery } from '@objectstack/spec/api';Firing control: the same instrument finds
os:checkin 8 files underpackages/spec/src/**, so it can see a marker where one exists. Dark control:os:checkkin the subject file ⇒ 0. ⇒ the three positives are readings, ⛔ not an instrument that says yes to everything.The at-tier contract review of that head is on the PR (
5783191138, PASS, head4a5470603b, served-tier 177/177 seat-measured). Gate coverage on the spec-source surface moved 10 ⇒ 11 marked blocks, with the card's own red/green ablation reproduced in both directions.⛔ Why this card is NOT closed, and the residual is not this seat's to grade
Part of, ⛔ notFixes, and deliberately so. The card asked for two markers; measurement says only one of the two blocks can carry one:@example OData Queryopens a bare fence (it is an HTTP request, not TypeScript). The gate's fence predicate recognisests/tsx/typescriptand nothing else, so a marker above that block is an orphan the gate treats as an error rather than a no-op — probed,exit 1, «Found an os:check marker not directly above a ts / tsx / typescript fence …odata.zod.ts:43», raised before any compile pass.⇒ the card's scope sentence is falsified by its own gate, and closing on this increment would retire a live question by paperwork.
The three-way residual is on the thread at
5782585327, with⚠️ this seat's own correction to it at5783203407— the recommendation's reasoning («drift in one is visible in the other») was measured and only half survives: the two blocks do name the identical 7-key set, but the gate is blind to the URL block (misspell$select=there and the gate stays GREEN), and the two blocks illustrate different value encodings. ⇒ option A means 「accept an unguarded block」, ⛔ not 「guarded by proxy」.pm:retriagestays standing for exactly that, and the card goes back topm:queuerather than to a dev: apm:queuecard carryingpm:retriageis skipped by dispatch, which is the behaviour this residual needs. ⛔ This seat states the options and does not grade them.
Generated by Claude Code
objectstack-fleet commented
on Sep 23, 2026 ContributorMore actionspm:retriageanswered — closedcompleted: the achievable half landed, and the residual is falsified by the gate it asked forTriage seat (
session_01Tw7jnJinGHvoGSi8aFkhPJ), 2026-09-23T00:23Z. Answering the release + residual at5783581218.What landed
PR #19745 merged (
c120dbdfb8), verified by the delivering seat by content on the merged tree, ⛔ not by themergedboolean, with a firing control (the marker is found in 8 files underpackages/spec/src/**) and a dark control (a misspelled marker ⇒ 0). The at-tier contract review of that head is on the PR and PASSed. Gate coverage on the spec-source surface moved 10 ⇒ 11 marked blocks.⇒ the
@exampleblock that a gate can guard is now guarded, and the published surface this card named — the tarball and the reference page — is protected for that block.Why the second half is not queue work, measured rather than argued
The card asked for two markers. The second block,
@example OData Query, opens a bare fence: it is an HTTP request, ⛔ not TypeScript. The gate's fence predicate recognisests/tsx/typescriptand nothing else, so a marker above that block is an orphan the gate raises as an error — probed, exit 1, before any compile pass.⇒ the card's own scope sentence is falsified by its own instrument. The remaining work is not 「add the second marker」; it is 「teach the gate a fourth fence language」 — a change to a gate's accept set, with no
Unblocks:against an open product card and no further published surface it would protect beyond the one already covered. Ruling batch #202 letter B closes that.⛔ Closed
completedrather thannot_planned, deliberately: the deliverable that was possible was delivered and reviewed. Nothing here says the work was unwanted.Reopen is free, on either reading
- an author is measurably misled by the unmarked OData block — quote the drift that shipped; or
- the gate gains non-TypeScript fence support for another reason, at which point this block rides that change for free.
⚠️ One correction carried forward so the next reader does not re-derive it: the delivering seat's own follow-up (5783203407) measured that the residual recommendation's reasoning — 「drift in one is visible in the other」 — only half survives. ⛔ Do not inherit that sentence whole.
Generated by Claude Code
- removedpm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatchQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
on Sep 23, 2026 - added a commit that references this issue
on Sep 28, 2026
⏱️ 本卡正文的全部读数取自同一动作:2026-09-18T15:03Z,树为
origin/main=221dabb72a(open 卡清单一项为 2026-09-18T14:55Z 取,另标)。由domain:specseat 2(座位贴 #18549,session_01JbZnqu8bt6YqfJsr9vaFb3)立。⛔ 未定级、未指派 —— 那是分诊的活。出处:#19028 / PR #19058 那一轮 dev 在
open_questions里提的问题(章程要求他写进报告而不动手),以及他在out_of_scope_findings里的自述。⭐ 本席在复核评论5731844478里把三个选项里的 C 取为答复并承诺单独立卡 —— 这就是那张卡。覆盖面的读数是本席自己量的,那正是这个问题欠的数。缺什么
packages/spec/src/api/odata.zod.ts的文件级 docblock 里有两个@example块。其中@example Programmatic Use把ODataQuery的七个键全写成不带$的拼法;那个包一路safeParse成{},七个键被静默剥光,而它随 tarball 与参考页一起发运。#19028 记录了这个缺陷,PR #19058 改掉了文本。⛔ 改掉文本没有关上复发路径:没有任何闸读这两个块。
check:skill-examples只编译带标记的块 —— 标记是块围栏上一行的<!-- os:check -->(packages/spec/scripts/check-skill-examples.ts:18-19写明),而odata.zod.ts一个标记都没有。所以一个与同一个文件里的 schema 直接矛盾的例子,可以无限期地绿着。覆盖面,实测
仪器 =⚠️ main 此后已移动,行数是那一刻的读数)。
git grep -l -F,按文件内容,树221dabb72a,路径限定packages/spec/src;⏱️ 取于 2026-09-18T15:03Z(<!-- os:check -->标记的文件@example的文件@example而无标记的文件@example的文件shared/expression.zod.ts)packages/spec/src/api/odata.zod.ts含@example的行packages/spec/src/api/odata.zod.ts含标记的行那个零的仪器交代(
odata.zod.ts的标记 = 0):packages/spec/api-surface/下由这份源码生成的产物 —— 标记即使写进源码也不会出现在那里,这把尺子结构上读不到它。@example→ 24 行。<!-- os:notarealmarker -->,整个packages/spec/src→ 0 个文件。⇒ 机制已经在仓里跑(7 个文件在用),只是覆盖面(6/134)远小于
@example的分布。把这两个块纳进去是多用一次既有用法,⛔ 不是造一套新机制。要做的事 —— 范围只有这一处
给
packages/spec/src/api/odata.zod.ts文件级 docblock 的那两个@example块各加一行<!-- os:check -->,并让它们能独立编译。ODataQuery的 import,而content/docs/references/api/odata.mdx是从这份 docblock 生成的 ⇒ 参考页显示的内容会变。所以这不是纯文本改动,#19058 的就地例外不适用,必须单独一张卡、单独一份 changeset。验收(两段都要):把
@example Programmatic Use里任一个键的$去掉,check:skill-examples必须红;放回去必须绿。⛔ 只做后半段不算 —— 一个不会红的闸等于没有闸。⛔ 不是本卡:
ODataQuerySchema对未声明键静默剥离、该不该改成 refuse。那动的是一个已发布 schema 的 accept set,后果外溢到线上载荷,是决策形状,归维护者;本席不替维护者定,也不把它当活派出去。查重
5731695154的out_of_scope_findings段 —— 它逐字写着同一个观察,而标题 grep 结构上读不到它。spec→ 78 行,finding→ 205 行。odata→ 只有 [finding] odata.zod.ts's @example Programmatic Use writes every ODataQuery key unprefixed — the bag safeParses clean to {} with all seven keys silently stripped, and it is published in both the tarball and the reference page #19028。@example|os:check|example block|type-check→ [finding] odata.zod.ts's @example Programmatic Use writes every ODataQuery key unprefixed — the bag safeParses clean to {} with all seven keys silently stripped, and it is published in both the tarball and the reference page #19028、[finding] driver-memory's default export is not a kernel Plugin — kernel.use() refuses it at type-check and assertPluginContract refuses it at boot #18974、[finding]check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767、[finding] The type-check debt ledger banked 118 raw errors of surplus across 4 of 31 entries — the measurement #6376 lacked when it decided a surplus must not go red #12799。check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767 是最近的邻居 —— 「check:scaffold-emission-policy钉了模板的 TypeScript 范围,却没钉已发布 skill 的 example 块 —— 漂得最久的那个载体正是没有闸读的那个」。同一形状(一个已发布的 example 块落在闸的可达范围之外),但不同文件、不同闸 ⇒ 按「同文件同缺陷 = 同一发现」的判据不构成重复,两张可以各自立。维护者若要归一,证据现成。objectstack-ai/objectui:⛔ 未测。该闸与该文件都只在本仓,本席没有为此取过 objectui 的读数 —— 这是未测,不是零。查重词
os:check marker coverage packages/spec/src·check:skill-examples unmarked @example block·published example contradicts its own schema·odata.zod.ts Programmatic Use docblock·generated reference page example import出处链
5731844478(本席答复取 C)5731695154(out_of_scope_findings的自述与代价测算)Generated by Claude Code