Skip to content

test(temporal): D-A3 storage-form 轴补齐 SQL 系——Field.time 遗留扫描 + wasm 驱动两条遗留扫描 (#4191) - #4205

Merged
os-zhuang merged 2 commits into
mainfrom
claude/storage-form-time-locking-xkcdgc
Jul 30, 2026
Merged

test(temporal): D-A3 storage-form 轴补齐 SQL 系——Field.time 遗留扫描 + wasm 驱动两条遗留扫描 (#4191)#4205
os-zhuang merged 2 commits into
mainfrom
claude/storage-form-time-locking-xkcdgc

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

#4191 的建议形状落地 storage-form 轴的 SQL 系格子(sibling PR:cloud 侧 turso 消费者,见下)。

改动

1. spec —— 把轴正式化,但不加新导出temporal-conformance.ts

  • 模块文档新增「The storage-form axis」一节:遗留扫描 = 同一批行绕过写入路径、按 pre-convention 写者留下的原始形态注入、读修复路径必须回答同一张表;writerForm 标签兼作逐行的遗留播种判定依据(native → 平台原生 instant 的裸形态,wire → 未被改写的文本拼写),并钉死 Field.time 两处歧义(native = epoch 日的 INTEGER epoch ms,a_midnightField.time repeats the #3912 pattern: writes unnormalised, repaired only on read — window filters and ORDER BY are silently wrong on SQLite #3994 实测的 INTEGER 0;wire = 携带 fixture 边界日 2026-07-28 的全量时间戳文本),让每个消费者播出同样的字节
  • 刻意不加新导出/新字段legacyFormwriterForm 1:1 可推导,加字段是冗余;且 cloud 仓按 .objectstack-sha pin 消费 spec,新导出会让 sibling PR 依赖本 PR 先合并。物理拼写留在各驱动自己的套件里(issue 的「不下沉方言拼写」)。check:docs(250 files in sync)与 check:api-surface(unchanged)均绿。

2. driver-sql —— Field.time 遗留格(issue 表格里 :150 缺失的那格)

seedLegacyTimeRows / forgetCanonicalTime#3994 起就躺在 testkit 里无人消费;现在 TEMPORAL_TIME_CASES 全量跑在未回填的遗留存储上(INTEGER epoch ms + 全量时间戳 TEXT,marker 已清),修复 #3994 的那条读取路径(sqliteCanonicalTimeSql)从此有了自己的回归锁。

3. driver-sqlite-wasm —— datetime + time 两条遗留格

本地 LegacyStorageWasmDriver 子类(driver-sql 的 testkit 刻意不出包,跨包复用要么发布测试工具、要么违反 import 规范,故各消费者自带 ~20 行播种子类,与 issue「各驱动注入手法不同」的形状一致)。继承使人默认修复路径「白拿」——这两条 describe 钉的正是「wasm 侧覆盖 knex seam 丢掉修复表达式」只会在这里红的那种回归。

验收即轴规则:遗留形态与 canonical 形态的行 id 集合逐格相同

测试

  • sql-driver-temporal-conformance.test.ts:61 passed(新增 9 个 time 遗留格)
  • sqlite-wasm-temporal-conformance.test.ts:61 passed(新增 15 datetime + 9 time 遗留格)
  • driver-sql 全量 583 passed / 38 skipped;driver-sqlite-wasm 全量 191 passed

修改清单综合评估(#4191 全表,本 PR 之后的余量)

格子状态注入手法 / 备注
driver-sql datetime✅ 已有(:107
driver-sql Field.time本 PRseedLegacyTimeRows
driver-sqlite-wasm ×2本 PR本地遗留子类
cloud turso ×4sibling PRcanonical + 遗留各两条,另实测出 remote 模式三类缺陷 → cloud#937
driver-mongodb❌ 最尖的一格(唯一永久持有遗留形态、失败最安静的后端)collection.insertMany 直塞 string/Date 混合,绕过 syncSchema 收敛;建议下一个 PR 单独做
driver-memory在 schema 声明initialData / 持久化恢复形态,测的是 D-E3 的 schema-到达收敛本身
formula (matchesFilterCondition)❌ 需先做设计裁决类型盲评估器没有「存储」;「遗留」= post-image 携带 Date/epoch 值。哪些格子应当共享、哪些像 $gt-on-datetime 一样是不可共享格,得先按 D-A3.1 的 scope rule 议定,不宜闷头写断言
service-analytics (native-sql / preview)native-sql 可复用 driver-sql 的遗留播种(它经 StrategyContext 借道 driver 的 coercion);preview 与 formula 同属类型盲,同样先裁决
server-timezone 三方错开轴不在本 issue 范围issue 已建议单开立项

顺带

Closes 无(#4191 分步落地,本 PR 只封 SQL 系格子)。

🤖 Generated with Claude Code

https://claude.ai/code/session_01SWHvwFgUU2U8M9nbV1g1iQ


Generated by Claude Code

…he wasm driver (#4191)
The legacy-storage sweep — the same rows injected below the write path in
the raw pre-convention forms, answered through the read-repair — existed
only for driver-sql's datetime cell. Formalize the axis in the spec module
doc (the writerForm tag doubles as the per-row legacy seeding basis:
native → raw platform-native instant, wire → raw text spelling; no new
exports, so consumers pinned to older spec SHAs stay buildable) and add
the missing SQL-family cells:
- driver-sql: Field.time on un-backfilled legacy storage — INTEGER epoch
ms of the epoch-day wall clock (a_midnight = the measured #3994 hazard,
INTEGER 0) and full-timestamp TEXT pinned to the boundary day. The
seedLegacyTimeRows testkit half existed since #3994 with no consumer;
the repair path that closed#3994 now has its own regression lock.
- driver-sqlite-wasm: datetime + time legacy sweeps via a local
LegacyStorage subclass — the inherited repair seam gets pinned where an
inheritance-breaking override would actually surface.
Same acceptance rule as the canonical sweeps, cell for cell: identical
expected row-id sets. Any cell that differs is a repair-path drift — the
signal #3773 / #3994 / #4047 all lacked.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SWHvwFgUU2U8M9nbV1g1iQ
@vercel

vercelBot commented Jul 30, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 30, 2026 3:20pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

106 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 packages/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/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/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/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/spec)
  • content/docs/kernel/services.mdx(via @objectstack/spec)
  • 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/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @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/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @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/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/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude