You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
D-A3's conformance matrix should gain a storage-form axis (canonical, legacy-epoch, legacy-naive) and a server-timezone axis, since both are now known to have produced dialect-divergent row results.
—— docs/adr/0053-date-and-datetime-semantics.md,D-B3 的 Consequences
现状(已逐条核对,不是推测)
packages/plugins/driver-sql/src/sql-driver-temporal-conformance.test.ts 是共享矩阵的 driver-sql 消费者。它的三个 describe 全部硬编码client: 'better-sqlite3'(:63、:112、:155),也从不读 OS_TEST_POSTGRES_URL / OS_TEST_MYSQL_URL。真正连 live server 的只有三个专用套件:
driver 轴(D-A3 原文 driver {SQLite, Postgres at minimum})
❌ 对矩阵不成立
附带:一处 declared ≠ enforced
该文件头注写着:
Runs against a real SQLite, and — through the Temporal Conformance (live PG + MySQL) CI job, which runs this package's whole suite under TZ=America/New_York against servers on Asia/Shanghai — against real Postgres and MySQL too, with no workflow change needed.
A bare YYYY-MM-DD comparand (what a {30_days_ago} token expands to) meant midnight in the SERVER's timezone, so the identical query over the identical instant put a row on a different calendar day than it did on SQLite.
—— D-B2,对 PG 16 @ Asia/Shanghai 的实测
Activity
os-zhuang commentedon Aug 2, 2026
🔒 认领
session_015Br2xsJsczFsTR9bvbh2Ny(PM 循环,2026-08-02 19:50Z 轮)claude/issue-4245-temporal-matrix-driver-axisobjectstack-issue-4245assignee无法区分认领人。若你读到本条且你的 session ID 不是上面那个,本单已被占,请另选。PM 复核:前提成立,但范围比正文大一格
对
origin/main@bbb1192实测:正文写的是三个 describe(
:63/:112/:155),现在是四个(行号也整体下移)。第四个是本单提出后新增的,同样硬编码 —— 参数化必须覆盖全部四处,漏一处就是矩阵里留一个永远只跑 SQLite 的格子,而那正是本单要消灭的形状。开工请自行再核一遍,别照抄这里的行号。OS_TEST_POSTGRES_URL/OS_TEST_MYSQL_URL在该文件仍是零命中,live 三套件的 skip-guard 范式照旧可抄。边界
OS_TEST_*_URL时 skip 必须可见,且连上后要断言服务器时区 ≠ 进程时区 ≠ UTC 三方错开确实生效。没有这条守卫,矩阵可以在「连上了但时区没错开」的情况下假绿。Generated by Claude Code
os-zhuang commentedon Aug 2, 2026
✅ PM 验收通过 —— PR #4713,CI 全绿(20/20),入合并队列
复核是对着 PR 本身做的,不是对着报告:
范围(5 文件,全部在界内):新增
live-dialect-matrix.testkit.ts、参数化后的sql-driver-temporal-conformance.test.ts、legacy-datetime-storage.testkit.ts上 19 行的规则暴露、ci.yml一行 env、一份 changeset。packages/spec/**零改动(本轮硬约束,与另一 PM 的 spec 串行车道不冲突);⛔content/docs/releases/未碰。changeset 是空 frontmatter +Releases nothing,test-only 的正确形态,Check Changeset已绿。验收逐条:四处硬编码
client: 'better-sqlite3'全部消灭(实测确为四处,不是正文写的三处);四个 sweep 按DIALECT_CELLS跑同一批TEMPORAL_CASES/TEMPORAL_TIME_CASES并断言逐格相同的行 id 集合;server-timezone 成了真正的it()(assertThreeWayZoneSkew:服务器 ≠ UTC、进程 ≠ UTC、服务器 ≠ 进程);未 provision 的格是具名 skip,OS_EXPECT_LIVE_DIALECT_MATRIX=1把它变红;头注改写成代码实际做的事。这次交付里最值钱的一处,不是参数化本身:legacy sweep 仍只在 SQLite 跑,但理由从注释升级成断言 —— 每个 cell 拿 driver 自己的
needsLegacy*Repair规则核对hasLegacyStorageForm。哪天某方言长出 repair path,缺的那一格会自己红着喊出来。这正是本单要消灭的「声明 ≠ 执行」在下一层的预防。守卫做了 sabotage 五连,其中第一条当场测出守卫自身的洞:
expect(x).not.toBe(0)走Object.is,而Object.is(-0, 0)为 false —— 取负的getTimezoneOffset()在 UTC 下产出-0,于是TZ=UTC原本是绿的。已用eastOfUtc折叠并复测转红。守卫自己能被证伪才算守卫,这一条做到了。结论:三方言在 141 条用例上行 id 集合完全一致 —— 没有方言分歧要另开单。 且这不是放宽断言换来的:上面五条 sabotage 证明断言会咬人。CI 的
Temporal Conformance (live PG + MySQL)在 MySQL 8.0 上复跑亦绿(本地那条腿是 MariaDB 10.11)。顺带发现已按 Prime Directive #10 单开 #4714(未认领):
PAGINATION_CASES/FILTER_LOGIC_CASES两条共享矩阵的消费者仍钉死 SQLite,同一形状。那一单打开后 PG/MySQL 很可能真的红(无 tiebreaker 的分页在真服务器上会重排)—— 按其验收,交付的是「格子存在且会红」。已进队列候选,不搭本单顺风车。Generated by Claude Code
test(driver-sql): run the D-A3 temporal matrix across the driver axis…
test(driver-sql): run the pagination and filter-logic matrices across…