Skip to content

refactor(spec,drivers)!: retire IDataDriver.findStream (#4484) - #4652

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-4484-retire-findstream
Aug 2, 2026
Merged

refactor(spec,drivers)!: retire IDataDriver.findStream (#4484)#4652
os-zhuang merged 3 commits into
mainfrom
claude/issue-4484-retire-findstream

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4484

背景

IDataDriver.findStream 是驱动契约上的必需方法,文档承诺它是"面向大数据集优化、避免内存溢出"的读取路径。但三件事同时成立:

  • 没有任何生产代码调用它。 全仓检索,除了声明处和三个驱动实现之外,命中的全部是测试替身——其中约 20 个为了满足"必需方法"直接 throw new Error('not implemented')。没有任何测试会因此变红。
  • SqlDriverInMemoryDriver 做的恰好是承诺的反面。 两者都先 await find() 取回完整结果集,再逐行 yield——它承诺要避免的内存峰值,在第一次 yield 之前就已经达到了。SqlDriver 里还留着 TODO: Use Knex .stream()
  • MongoDBDriver._findStream 确实在流式读取,但它是那里唯一没有走 buildFindOptions 的读路径,硬编码 projection: { _id: 0 },静默丢弃 query.fields(即 fix(objectql,driver-mongodb)!: findOne must say which record it wants, and executes every option it declares (#4419) #4459 记录的分叉;此处一并消解,而非修复)。

一个必需的、零调用方的、且在三分之二实现里语义反转的契约方法,正是 ADR-0049「enforce-or-remove」要处理的对象。PM 在 issue 上的裁定是 REMOVE

改动

  • IDataDriverpackages/spec/src/contracts/data-driver.ts)与 DriverInterfaceSchemapackages/spec/src/data/driver.zod.ts)中移除 findStream
  • 删除三个实现:SqlDriverInMemoryDriverMongoDBDriver._findStream
  • 删除约 20 个仅为满足必需方法而存在的测试桩(not implemented 抛错)。
  • 在 protocol-17 迁移链步骤上登记 data-driver-find-stream-retired 语义条目(ADR-0087 D3),并同步 spec-changes.jsondocs/protocol-upgrade-guide.md
  • 新增 pin 测试:data-driver.test.ts / driver.test.ts 断言 findStream 已不在契约与 Schema 上,防止回潮。

关于 tombstone

这里刻意不加 tombstonefindStream 是 TS/API 表面,从来不是被存储的元数据——没有任何代码对驱动对象做过 .parse(),因此 Zod 的 tombstone 通道无处生效。tsc 是唯一能承载这条禁令的通道,而它在调用点就已经承载了(移除后任何残留调用直接编译失败)。

关于 DriverCapabilities.streaming

这个从未被读取的能力位、其唯一指涉对象就是本方法,本 PR 保留不动,已单独立 #4634。原因:删掉它会打断每一个驱动的 capability 字面量(含第三方驱动),这类清理应当把全部约 30 个 flag 放在一次审计里做,而不是搭本 PR 的便车。

验证

本地在受影响包上跑 test / typecheckcheck:generated,详见 PR 评论中的输出摘录。


Generated by Claude Code

…called, and inverted in two of three impls (#4484)

`findStream` was a REQUIRED method on the driver contract, documented as the read
"optimized for large datasets to avoid memory overflow". Three things were true of
it at once:

- Nothing called it. Repo-wide, outside the declaration and the three driver
  implementations, every hit was a test double — and ~20 of those satisfied the
  required method by throwing `not implemented`. No test ever went red.
- `SqlDriver` and `InMemoryDriver` awaited `find()` for the ENTIRE result set and
  then yielded row by row, so the memory peak it promised to avoid was reached
  before the first yield. SqlDriver carried a `TODO: Use Knex .stream()`.
- `MongoDBDriver._findStream` did stream, but was the one read there never routed
  through `buildFindOptions`, hardcoding `projection: { _id: 0 }` and silently
  dropping `query.fields` (the divergence #4459 recorded; subsumed, not fixed).

Removed from `IDataDriver` and `DriverInterfaceSchema`, all three implementations
deleted, and the ~38 stub lines that existed only to satisfy a required method.
Registered as the `data-driver-find-stream-retired` semantic entry on the
protocol-17 chain step (ADR-0087 D3) — a TS/API surface, never stored metadata,
so no source rewrite and, deliberately, no tombstone: nothing ever `.parse()`d a
driver object, so tsc is the only channel that can carry the prescription, and it
carries it at the call site.

`DriverCapabilities.streaming`, the unread flag whose only referent was this
method, is left standing and filed as #4634 — removing it breaks every driver's
capability literal, third-party included, and that audit should cover all ~30
flags in one pass.

Fixes #4484

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
@vercel

vercel Bot commented Aug 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 2, 2026 2:15pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling size/m and removed documentation Improvements or additions to documentation protocol:data tests tooling labels Aug 2, 2026
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec.

111 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/driver-memory)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/glossary.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/driver-memory)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/anatomy.mdx (via @objectstack/driver-sql)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/driver-memory, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling labels Aug 2, 2026
…dStream stub

Two defects found reviewing the retirement against the `spec-property-retirement`
checklist:

- The changeset declared `minor` for all four packages. Removing a REQUIRED
  method from a published contract interface is breaking — the skill says
  `major` for `@objectstack/spec`, and it is the house convention for every
  other `!` spec change in this major (`session-dual-source-c4`,
  `notification-dual-source-c3`). The driver packages drop a public method too,
  so they go major with it.
- `protocol-batch-atomic.test.ts` still carried a `findStream() { throw new
  Error('not implemented'); }` stub. It is typed `any`, so it compiles and is
  simply dead — but it is exactly the stub this issue exists to sweep, and
  leaving one behind lets the next reader infer the method still exists.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5
@os-zhuang
os-zhuang marked this pull request as ready for review August 2, 2026 14:31
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit c6d1cb4 Aug 2, 2026
22 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4484-retire-findstream branch August 2, 2026 14:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

IDataDriver.findStream 没有任何调用方,两个 driver 的实现还正好做了它承诺要避免的事(ADR-0049 enforce-or-remove)

2 participants