fix: raise Node minimum to the WAL-fixed SQLite runtime - #4960
Conversation
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
|
Update after current
I have not modified or pushed to this maintainer-owned branch. |
huangruiteng
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Exact head: 294e673
动机
旧公开最低 Node 22.18.0 的内置 SQLite 与已存在的 WAL-reset admission 不一致,导致默认 File 与可选 SQLite authority 实际需要不同运行时。Node 官方 22.22.3 release 记录 SQLite 3.51.3,选这个最低版本有上游依据。
改动思路
把现有 Python Effect runtime、native scheduler、package engine、脚本、文档和最低版本 CI 收敛到 22.22.3;SQLite 是否可用仍由现有 runtime identity 检查,默认 File、可选 SQLite 的权限和存储语义不变。
具体改动
关键代码讲解
MINIMUM_NODE_VERSION(loopx/control_plane/effect_runtime.py:32)在启动托管 control plane 前拒绝旧 Node。main(loopx/control_plane/scheduler/heartbeat_followup_cli.ts:307)补上直接 native follow-up 路径的数值版本门槛。node-minimum-compatibility(.github/workflows/python-tests.yml:215)改为在准确最低版本上强制 SQLite admission,并跑 File/SQLite lifecycle;不再以 skip list 掩盖 SQLite。
对主干的风险
本地 Node/SQLite 14/14 和相关 Python 78/78 通过;exact-head 最低 Node lane 通过,默认 File 不加载可选 SQLite 驱动的测试也通过。但 exact-head run 35896280427 的 shard 1/3、pytest、merge-gate 仍失败。PR 中已有定位:旧分支的 project-registry manifest 四行计数 301/542/646/756 与生成值 327/571/675/785 不一致,当前 main 的 d2bae5ade 已修。请同步该主干并重跑全部 required checks,不能只引用通过的 Node minimum lane。更高大版本是否带合格 SQLite 仍由 runtime admission 判断,不能仅靠 package.json 的 semver 范围推断。
语义与 CI 对齐
本 PR 有意改变机器强制的最低版本,不是纯文档建议;README/安装指南/脚本/CI 均披露。没有新增 authority 状态或迁移;相关未来向重构评估过,跨语言版本常量虽重复,但为这次局部变更加版本生成系统不划算。
我的整体评价
版本选择与 fail-closed 路径看起来正确且范围适度;阻塞是当前 head 的主干集成证据,而不是本地最小测试。同步主干后在新 exact head 读回 shard 1/3、pytest、merge-gate 和最低 Node lane 全绿,再复审。
English verdict: REQUEST_CHANGES - required exact-head CI remains red on stale manifest rows; sync current main and rerun the full gate.
Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
huangruiteng
left a comment
There was a problem hiding this comment.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: 8fe2cf3376a4bf3e3c633df512a14c12aa05577d.
动机
公开的 Node 22.18.0 下限内嵌 SQLite 3.50.2,而 SQLite 官方说明指出 WAL-reset 修复在 3.51.3 等版本;Node 22.22.3 官方发布记录列明内嵌 SQLite 3.51.3。此前“最低版本”CI 为此跳过 SQLite authority 测试,公开要求与可选存储的实际准入不一致。本 PR 有意把源码版本下限提升到 22.22.3,不迁移已有 Goal,也不默认启用 SQLite。
改动思路
沿用现有 Python Effect runtime readiness 与 SQLite 实际驱动资格检查,只同步 Node 最低版本;直接运行的 native scheduler follow-up 在读取请求前以数值版本门槛拒绝旧 Node。package engine、脚本和 doctor/安装说明同向更新。CI 最低版本 lane 改为在准确的 Node 22.22.3 上断言 SQLite 资格并运行 File/SQLite 生命周期,不再靠 skip list 维持绿色;完整 TypeScript 套件仍属 core lane。
具体改动
MINIMUM_NODE_VERSION 升为 (22, 22, 3);heartbeat_followup_cli.ts 新增早期 node_unsupported 错误;sqliteAuthorityRuntime 保留实际版本及 statement finalization 的 fail-closed 准入,仅更新修复提示。.github/workflows/python-tests.yml 删除最低版本的 SQLite 跳过名单,加入资格断言与 File/SQLite 测试。package/lock、POSIX/PowerShell 入口、README、双语书籍、安装/SQLite/RFC 与 benchmark 文档同步新要求,并保留 v1.1.0 历史要求的说明。测试更新旧版本拒绝、可选 SQLite、默认 File、工作流与文档断言;Showcase smoke 移除已过期的标题断言。
对主干的风险
这是机器强制的兼容性变化:旧 Node 22 用户必须升级;已启动的托管 runtime 需 loopx doctor --restart-runtime 才会换进程。package.json 的范围本身不证明高版本内嵌驱动安全,实际 SQLite 资格检查仍是权威。默认 File 在支持的 Node 上不加载可选 SQLite,显式选了不合格 SQLite 时也不会静默回退 File。旧 head 294e673 因过时 manifest 收到 REQUEST_CHANGES;当前 head 已合入新主干,本次本地验证通过,但没有把旧 head 的结论当成当前 head 的 CI 证据。
非阻断 P2:docs/book/en/index.md:82-83(中文首页同处)把 v1.1.0 发布锚点和 Node.js 22.22.3+ 前提并排,读者容易误以为历史 v1.1.0 也要求这个版本。建议像章节 reading guide 一样明确写成“此源码 checkout 的要求”;不影响当前代码准入。
独立验证:实际 Node 22.22.3 / SQLite 3.51.3 上 File/SQLite 聚焦测试 14/14、零跳过;另 67 个 provider/acceptance 测试通过,10 个仅 PostgreSQL 的用例因没有隔离服务器而跳过。Python readiness/CLI 聚焦测试 78/78、TypeScript typecheck、GitHub Actions/双语书籍/Showcase 四项 smoke 与 diff check 均通过。实际 Node 22.18.0 / SQLite 3.50.2 的 native follow-up 在处理请求前返回 node_unsupported。未重跑全量 TypeScript 套件;按 Goal 的 wait_for_ci=false 未轮询远端 CI。
语义与 CI 对齐
新下限是强制门槛,不是指导性文案;保留原有 runtime diagnostic 与 SQLite provider authority,没有新状态、receipt 格式或迁移。最低版本 CI 从“跳过危险分支”变成“资格不满足即失败”。相关前瞻性收敛是复用现有 typed driver 判定并删除 skip list;为这次版本修复新增跨语言版本生成框架不合比例。benchmark 文档的一行前提变化已经纳入本次 diff 审查,但主干合并仍需维护者决策。
我的整体评价
APPROVE。Node 版本与官方 SQLite 修复线一致,默认和显式 provider 的正反路径在准确最低版本上可运行,范围虽跨 42 个文件但主要是必要的兼容说明与测试同步。上述书籍首页文案值得小修,不阻断此次安全边界修复。本结论仅对应当前 head,不授权自行合并。
English verdict: APPROVE - exact head 8fe2cf3376a4bf3e3c633df512a14c12aa05577d; Node 22.22.3/SQLite 3.51.3 passed File and SQLite admission/lifecycle tests without skips, while Node 22.18.0 failed closed. Python 78/78, TypeScript typecheck and public smokes passed. Clarify the book index's release-versus-checkout prerequisite as a non-blocking P2; maintainer merge remains pending.
…readmodel-0924 Two conflicts. The effect-runtime handler registry conflicted on imports only, so both sides keep their handlers. The shared-authority RFC conflicted on the delivery-count checkpoint: main carries the 2026-09-23 seven-boundary decomposition while this branch recorded its own dependency reconciliation. Resolution keeps main's decomposition, updates the reconciliation with the now-merged #4922/#4960/#4961 and the still-in-review #4931, and states that the estimate is updated after the combined head is accepted instead of restoring the superseded five-to-eight package range. Signed-off-by: huangruiteng <14976749+huangruiteng@users.noreply.github.com>
Problem and result
Node 22.18.0 met LoopX's published minimum but embeds SQLite 3.50.2, which lacks the upstream WAL-reset fix. The minimum CI lane therefore skipped SQLite authority suites. This PR raises the public minimum to Node 22.22.3 (SQLite 3.51.3), rejects older Node in the managed runtime and native scheduler follow-up, and replaces the skip list with real SQLite admission and File/SQLite lifecycle tests. The core lane still runs the full TypeScript suite on the same 22.22.3 runtime.
SQLite remains opt-in, with the actual embedded driver and statement-finalization checks authoritative at provider admission. File authority remains the default; existing Goals are not migrated. Users on older Node 22 need to install 22.22.3 or newer, then restart an existing managed runtime with
loopx doctor --restart-runtime. README, install guidance, the bilingual book, compatibility notes and provider RFC distinguish the new source requirement from the historical v1.1.0 release.Validation and integration
cqr_b1d630f2a7036e843818is valid for the merged 42-file scope. Goal-scoped premerge rerun passed all 5 direct checks and 19 selected checks with a 180-second per-check timeout; the only gate is a manual-review hold for the benchmark-sensitive documentation touched by the Node minimum. The installer smoke also passed in isolation. An earlier premerge attempt timed out on that smoke at the default 120 seconds while another full suite was running; it did not reveal a code failure. The full TypeScript suite on the merged head was started locally but stopped after focused validation to avoid duplicating CI; the new CI run remains the full-suite authority.Future-facing boundary review reused existing Python readiness and typed SQLite driver checks, and removed the old CI skip list rather than adding an admission model. No frontend change is needed: the existing runtime requirement/doctor projection displays the new minimum and remediation. This runtime change remains for maintainer review and is not self-merged.
Upstream basis: SQLite WAL-reset fix, Node 22.22.3 release.