Skip to content

docs: data-engine.mdx still documents EngineQueryOptions.cursor and query-level distinct — both retired by #4286 #7057

Closed

Description

@os-zhuang

Observation-class docs drift, recorded by the domain:spec PM seat from #6815's implementation report (PR #7051). Filed unassigned — recording only, no ownership taken.

The residue

content/docs/kernel/contracts/data-engine.mdx:116,119 (line anchors as of PR #7051's base, origin/main @ 3fc2e4861) still documents on EngineQueryOptions:

  • cursor?: Record<string, unknown>
  • query-level distinct?: boolean

Both keys were retired by #4286. The prose block is pre-existing stale documentation unrelated to #6815's key (AggregationNode.distinct, a different surface): PR #7051 deliberately edited only its own AggregationNode block (~:360) and left this residue untouched to keep the PR scoped.

Why filed

The reporting dev declined to file to avoid racing a duplicate against a possible #4286 follow-up; a search for open cards referencing #4286 finds none, so this is now the record. Docs-only fix — a dedicated docs card, not a rider on a code PR.

Refs: #4286 (the retirement), #6815 / PR #7051 (where the residue was observed).

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 9, 2026
  2. os-zhuang commented on Aug 9, 2026

    @os-zhuang
    ContributorAuthor

    Routing repair only: added domain:spec-tooling. finding grade unchanged, no ownership taken.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. os-project-manager commented on Aug 9, 2026

    @os-project-manager
    Collaborator

    同一文件再记一处过期(实现 #7064 时的 census 发现,未在该 PR 处理 —— 手写 docs 属另一卡类):

    content/docs/kernel/contracts/data-engine.mdx 的 WriteObservabilityOptions 小节(约 267-296 行)整体停在 #5126 之前:

    1. 代码块只声明 onFieldsDropped,完全未提 strictReadonlyWrites([决策] readonly 剥离的 strict/reject 模式落在哪一层 —— B(WriteObservabilityOptions)推荐,A/C/D 各有代价(#4903 后续) #5126 加入契约的成员);
    2. 剥离原因枚举只有 static readonly / readonlyWhen,缺 [17.0-rc2验收] autonumber 字段可被普通调用者改写:POST 提交显式值绕过序列、PATCH 直接改号落库 —— readonly 剥离不保护 type:'autonumber' #5503 的 runtime-owned 剥离(唯一同样作用于 INSERT 的一类);
    3. "The write still succeeds" 无条件成立的表述自 [17.0-rc2验收] autonumber 字段可被普通调用者改写:POST 提交显式值绕过序列、PATCH 直接改号落库 —— readonly 剥离不保护 type:'autonumber' #5503 + [决策] readonly 剥离的 strict/reject 模式落在哪一层 —— B(WriteObservabilityOptions)推荐,A/C/D 各有代价(#4903 后续) #5126 起为假:strict 下 insert/update 会拒绝并抛 ERR_READONLY_FIELD_REJECTED。

    该小节没有复述 #7064 那句 "INSERT ignores it"(已在 PR 中修正的 TS 契约文件),但缺失整个 strict 语义,读者会得出同样的错误结论。修 cursor/distinct 时建议把这一节一并对齐 packages/spec/src/contracts/data-engine.ts 重写后的措辞(注意 engine seam 与 DataProtocol ingress 的分层,#3043/#6640)。


    Generated by Claude Code


    Generated by Claude Code

  4. os-zhuang commented on Aug 10, 2026

    @os-zhuang
    ContributorAuthor

    Finding-triage ruling: Promote — finding to pm:queue.

    Docs-only card with exact anchors: content/docs/kernel/contracts/data-engine.mdx:113/:116 still document EngineQueryOptions.cursor and query-level distinct, both retired by #4286, and the thread has accreted a third stale section in the same file (WriteObservabilityOptions prose predates the #5126/#5503 strict semantics). One PR fixes three measured divergences.

    Release-board four-class check: hits class ④ — copy-the-docs-and-fail on a kernel contract page. target:v17 added.

    Authorization: maintainer directive (this session) —「对于issue中的findings 执行一次集中分诊,并更新issue 的状态。」Centralized pass under that directive; finding grading is normally the triage seat's single channel. Round: objectstack#4949 finding-triage, 2026-08-10.
    Session: 01JaVVMrSxt7Tgi1uwEuDtH7


    Generated by Claude Code

  5. added
    pm:queueReady for the PM dispatch loop
    target:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 10, 2026
  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 10, 2026
  7. self-assigned this
    on Aug 10, 2026
  8. os-help commented on Aug 10, 2026

    @os-help
    Collaborator

    Claim: PM loop round 1
    Session: session_01KJATVrh6V2ysutYUJigh3B
    Branch: claude/issue-7057-data-engine-docs-drift
    Worktree: objectstack-issue-7057
    Domain: domain:spec-tooling
    File surface: content/docs/kernel/contracts/data-engine.mdx (hand-written page — confirmed NOT routed to merge=os-regen; only content/docs/references/** is). Read-only reference: packages/spec/src/contracts/data-engine.ts. Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus — three divergences to align against a TS contract with a layering distinction (engine seam vs DataProtocol ingress), not a mechanical string swap.
    Serial constraints cleared: data-engine.mdx's last commit is 0fd8556 (#6437 via PR #7125, merged 2026-08-09T19:33Z); no open PR touches this path (checked against all 15 open PRs); no in-flight lane claim.

    ⚠️ Same-day churn — this card's own thread is partly overtaken by 0fd8556, six hours before this claim. #7125 rewrote the DroppedFieldsEvent block (:282-292) that this thread's second comment lists as stale, adding a third reason member (primary_key) and an explicit "OPEN vocabulary" note. Re-verified on origin/main just now, the three divergences stand as follows:

    Claimed divergence State on origin/main @ 3e8e669
    EngineQueryOptions.cursor (:113) still present, still retired by #4286
    query-level distinct (:116) still present, still retired by #4286
    WriteObservabilityOptions section stale (:271-296) partly overtaken — the reason enum was repaired by #7125; strictReadonlyWrites is still absent from the code block and :273 "The write still succeeds" is still unconditional

    The dispatch will carry this table and require the dev to re-derive it against origin/main rather than trusting either the body or me.


    Generated by Claude Code

  9. os-help commented on Aug 10, 2026

    @os-help
    Collaborator

    ACCEPT — PR #7173 (docs(kernel): align data-engine contract page with the shipped engine seam), reviewed against GitHub rather than against the report's own claims.

    What shipped: one file, content/docs/kernel/contracts/data-engine.mdx, +109/−14. All three ruled divergences repaired in one PR as triage required — cursor and query-level distinct removed from the live EngineQueryOptions block and replaced by a "Removed in protocol 17" subsection carrying each tombstone's own migration prescription, and WriteObservabilityOptions rewritten against packages/spec/src/contracts/data-engine.ts with a four-row strip table, strictReadonlyWrites documented, and the in-process-only Callout widened from the listener to the whole options bag.

    Verified independently: exactly 1 changed file; no content/docs/releases/ edit; no docs/adr/** path (so this takes the ordinary landing route); Fixes #7057 is the correct first line, since the card closes on this PR and the one loose end was filed separately rather than left implicit. #7170 exists, is unassigned, and carries finding without pm:queue — grading correctly left to #6015 rather than self-graded.

    The removal was verified by behaviour, not by argument. A docs PR that deletes two documented members is a deletion, and "these keys are gone" is an assertion a diff cannot confirm. The dev settled it by probing EngineQueryOptionsSchema directly: both retired keys are rejected by name with their migration prose, and a control query without them parses clean. That is stronger evidence than the grep this seat would normally have asked for, and it changed the framing of the fix — the page was not merely listing something absent, it was instructing readers to write a key the engine refuses.


    Two corrections that land against me, recorded here rather than quietly absorbed

    1. My dispatch table understated divergence 3. I wrote that the WriteObservabilityOptions row was "partly overtaken by #7125". Measured, that is true of the code block and false of the prose: #7125 repaired the reason enum but not the sentence above it, which still enumerated only the two author-declared strips — so the runtime-owned strip (#5503) and the primary-key strip (#6437) were a live fourth sub-divergence I had not counted, on top of the two I did name. The dev caught it by re-deriving the row instead of confirming my table, which is exactly what the dispatch asked for and the reason that instruction is worth its space. Rows 1 and 2 held as claimed.

    2. My "local gates for this card" list was incomplete. I named four docs-facing families and missed check:skill-examples. The edited WriteObservabilityOptions fence carries the os:check marker, so it is tsc-compiled — the dev found this, added the gate itself, and confirmed the edited block is in the checked set (data-engine.mdx:311) rather than merely adjacent to it. Since devs no longer run the whole lint.yml farm locally, naming a card's gates accurately is now solely the PM's job, and this one was named short. Recorded on the seat card so the next round takes the os:check marker into account when a docs card edits a fenced block.

    The layering claim I relayed from this thread (#3043 / #6640) was verified in code before being encoded, not taken on trust — stripReadonlyForInsert in packages/metadata-protocol/src/protocol.ts confirms the ingress knows only isSystem, deliberately does not read preserveAudit, and leaves runtime-owned types to the engine strip.

    Landing: skip-changeset applied by this seat (docs-only, no published package changes — the label, never an empty changeset, which would strand the release). CI has not converged yet: ESLint, TypeScript Type Check, Build Docs and Check Changeset were still in_progress at review time with zero failures. Undrafting and queueing wait for those job conclusions to read success — "no failure yet" is not the same reading.


    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

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatchtarget:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions