docs(spec): qualify the four datasource pool.* liveness rows by driver (#6214) - #7242
Conversation
…ver (#6214) The spec half of the #5931 ruling. `packages/spec/liveness/datasource.json` recorded `pool.min` / `pool.max` / `pool.idleTimeoutMillis` / `pool.connectionTimeoutMillis` as unqualified `live`, which overstated the landed state on three counts: three built-in driver arms now REJECT the block loudly, `mongodb` reads only `min`/`max` out of it, and `turso` still drops it in silence. Each row now names its own qualification, and the `pool` block carries the full record (the `ssl` block's precedent): - honoured: `postgres` / `mysql` via `buildSqlPool(spec)` (default-datasource-driver-factory.ts:188-198, applied :403 / :458), and `mongodb` for `min`/`max` only → `minPoolSize`/`maxPoolSize` (:477-483); - loudly rejected on `memory` / `sqlite` / `sqlite-wasm` — `POOL_UNSUPPORTED_DRIVER_IDS` (datasource-pool-support.ts:79), thrown at all four doors (#5714 for the SQLite pair, #5931 for `memory`); - still dropped silently on `turso` (datasource-pool-support.ts:90-99) and for the two timeouts on `mongodb` — both named as such rather than left implicit. Stale evidence line numbers on the four rows re-cited against the current `buildSqlPool` body at the same time. Ledger-only diff, zero behaviour change, no schema change. No changeset, per the ledger-only precedent (#7133). Closes #6214 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SsK4ETGEY1wKe2nmR4bXi4
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
|
My error, not a flake. The gate offers two routes and I took neither: I concluded "no changeset" (correct — ledger prose releases nothing) but missed that route 2 requires the The precedent I cited in the original body was also cited imprecisely. PR #7179 — Route 3 (an empty-frontmatter changeset) was not taken and is closed anyway — #5471 rejects newly added ones, because an all-empty set makes Label applied. It fired a No code change was needed and none was made — Generated by Claude Code |
The spec half of the #5931 ruling. Ledger-only diff — one file,
packages/spec/liveness/datasource.json, ten lines. Zero behaviour change, no schema change.Premise check (fresh
origin/main@f40c5b4)Both halves verified before any edit:
pool.min/pool.max/pool.idleTimeoutMillis/pool.connectionTimeoutMilliseach read"status": "live"with a one-clause note ("knex pool floor.","passed through to knex verbatim.", …) and no mention of any driver arm. Not already repaired.pool声明在 memory 驱动臂同样被静默丢弃(#5714 的姊妹臂,裁决未覆盖) #5931 / datasourcepool声明在 sqlite / sqlite-wasm 驱动臂被静默丢弃(pg / mysql 生效) #5714 landed state is as the card describes, with one addition the card could not have known.POOL_UNSUPPORTED_DRIVER_IDSis['memory', 'sqlite', 'sqlite-wasm']— thememoryarm did join the rejection set, so the card's fallback ("if it did not, name the silent drop") does not apply tomemory. It applies toturso, which the landed module names itself.packages/services/service-datasource/src/__tests__/datasource-pool-support.test.ts— 40/40 pass, including the pinexpect([...POOL_UNSUPPORTED_DRIVER_IDS]).toEqual(['memory', 'sqlite', 'sqlite-wasm'])(:46).#5931's final state, with file:line evidence
Read off
origin/main, not paraphrased from the issue bodies:poolpostgresbuildSqlPool(spec)→SqlDriverpackages/services/service-datasource/src/default-datasource-driver-factory.ts:188-198, applied:403mysql:458mongodbmin/maxonly →minPoolSize/maxPoolSize; nothing else in the block is readdefault-datasource-driver-factory.ts:477-483memorydatasource-pool-support.ts:79, reason:142-146sqlite/sqlite-wasmdatasource-pool-support.ts:79, shared reason:122-126tursodatasource-pool-support.ts:90-99com.vendor.snowflake)datasource-pool-support.ts:101-105The rejection is thrown at every door a
poolblock can enter through: the Setup wizard's create/update (datasource-admin-service.ts:243,:314), the boot-time auto-connect pre-pass (datasource-connection-service.ts:508), and the factory's last door (default-datasource-driver-factory.ts:374).The four rows, before → after
Every row keeps
"status": "live"— the verdict was never wrong, only unqualified. What changes is that each row now states where it is live, and thepoolblock gains a containernotecarrying the full record (thesslblock's existing precedent in this same file).pool.min"knex pool floor. Live only since #4465 …"postgres/mysql(:191) and as Mongo'sminPoolSize(:482); authoring ERROR onmemory/sqlite/sqlite-wasm(#5714/#5931); silent ontursopool.max"knex pool ceiling; also mapped onto the Mongo client's maxPoolSize (#4465)."minpool.idleTimeoutMillis"passed through to knex verbatim."mongodbtakesmin/maxand nothing else, so this key reaches nothing there; authoring ERROR on the three rejected arms; silent ontursopool.connectionTimeoutMillis"mapped onto knex'sacquireTimeoutMillis…"idleTimeoutMillisTwo deliberate choices worth review:
:memory:-splits-one-datasource-across-several-stores rationale, the "no connection to pool at all" rationale, and the three measured rows (postgres → {min:3,max:9},sqlite → {min:1,max:1},memory → pool undefined) are the datasourcepool声明在 memory 驱动臂同样被静默丢弃(#5714 的姊妹臂,裁决未覆盖) #5931 body's own measurements anddatasource-pool-support.ts's own sentences.tursofor the whole block, andmongodbfor the two timeout keys. Both are recorded in the ledger as needing their own ruling, matching how the landed module records thetursogap. Filed separately as [finding][services] datasourcepool还有两处静默丢弃:turso 整块、mongodb 的两个 timeout 键(#5714/#5931 拒绝集合覆盖不到的剩余面) #7243 rather than fixed here: tightening either is a new rejection on a public authoring surface.Stale
evidenceline numbers were re-cited at the same time — the four rows pointed at:181-184, which is now the JSDoc abovebuildSqlPool; the real reader lines are:191-196. The liveness gate resolves paths, not lines, so this was silently rotting.Gates
packages/speccheck:liveness(the liveness author-lint)datasource 30 classified (live 30); 349/349 repo-local evidence paths resolvepackages/speccheck:generated@objectstack/service-datasourcedatasource-pool-support.test.tsSpec property livenessNo changeset —
skip-changesetlabel instead. Ledger prose releases nothing, which is route 2 of theCheck Changesetgate's own two routes. The label was missing on the first push and the gate went red for exactly that reason; applied after, per the precedent this PR follows: PR #7179 (fix(spec): re-cite measured readers for 11 stale liveness-ledger rows, #7132/#7133, merged 2026-08-10) landed three ledger files the same way — no changeset,skip-changesetlabel. Route 3 (an empty-frontmatter changeset) is closed under #5471/#4898 and was not taken.content/docs/releases/anddocs/adr/**untouched. No.zod.tstouched — no schema change was needed.Closes #6214