Repository navigation
service-datasource: a missing optional @objectstack/driver-* package (turso, mongodb, sqlite-wasm) is refused with two contradictory fixes, the factory's install and the appended 'build precondition ... Run pnpm install && pnpm build' #24937
Description
① class a — release-fixed wrong text in a boot refusal, measured once on the published 18.0.0. It is the same family as #24909, found by that card's dev (report 6295846037, open question 2 and out-of-scope finding 2).
Filed by the domain:services PM seat, seat 1 (seat post #6021, session_011TdZ8GjixNZFLz1xJD9zzK). Unlabelled and ungraded for triage.
Reader, and what they do: a domain:services seat claims it and dispatches one service-datasource PR. The route is already ruled (below), so the card needs no decision box.
reach: os dev on a published create-objectstack@18.0.0 scaffold, with a declared non-default turso datasource, my_app_note bound to it, and no @objectstack/driver-turso installed. Exit 1.
The finding
- The refusal names two fixes:
- the factory's own
npm install @objectstack/driver-turso(missingTursoDriverMessage, from [finding][services] Themongodbandsqlite-wasmarms of the same factory still answer a missing optional package with the fault and no remedy #7385's line of work); - then the appended
UNBUILT_WORKSPACE_REMEDY: "… That is a build precondition … Runpnpm install && pnpm build, then start again."
- the factory's own
- The second fix does nothing for a scaffold reader. The package is an optional install the project adds itself (
content/docs/data-modeling/drivers.mdx). - Same shape on the other arms: the
sqlite-wasmandmongodbarms of the shared factory (real factory, ESM and CJS). On those two, a scaffold reaches it only after an omitted or stale install, because the CLI and runtime depend onmongodbandsqlite-wasmoutright. - Mechanism:
connectFailureRemedy()(packages/services/service-datasource/src/connect-failure-remedy.ts) picks the unbuilt remedy for every module-not-found except the three database clients. PR fix(service-datasource): a missing database client (pg, mysql2, better-sqlite3) is refused with its install, not the unbuilt-workspace build advice #24933 (A scaffolded app pointed at PostgreSQL is refused with "Run pnpm install && pnpm build", which does not fix it: the missing optional peer pg is reported as a build precondition #24909) added that client exception forpg,mysql2andbetter-sqlite3. A bare@objectstack/driver-*specifier still classifies as unbuilt, and three factory classifier pins assert that today.
Seat ruling (PM discretion; the maintainer's veto window applies)
The options are from the dev's four-axis reading.
- A. Leave it. The scaffold reader gets two fixes, and the workspace reading stays protected.
- B (ruled). A bare specifier naming one of the optional driver packages
service-datasourcedeclares ends on a sentence that defers to the install the factory text already names. A path stays on the unbuilt remedy.- Cost: the same file, plus revising the three factory classifier pins to path-shaped causes.
- C. As B, but
@objectstack/driver-tursoonly.
Why B:
- Governing text: the module note's "ONE correct fix, stated once" (
connect-failure-remedy.ts), and the decision frame's third axis. - Turso's case is measured reachable from a scaffold. One rule covers all three arms: a bare optional install is an install, and a path is unbuilt.
- The accepted trade-off: a workspace contributor with a stale install is pointed at the install, not at
pnpm install.- Premise to re-check first: in this monorepo, a missing
@objectstack/driver-*surfaces as a PATH (unbuiltdist/), not as a bareCannot find packagename, oncepnpm installhas run. - Re-check: on a fresh worktree,
pnpm installwithout a build, then boot a turso-bound datasource and read the specifier. - If the premise fails, report a fork rather than shipping B.
- Premise to re-check first: in this monorepo, a missing
Dedupe: queries run by this seat, hit count including closed
-
optional driver package not installed driver-turso boot refusal names two remedies npm install and pnpm build precondition→ 8 hits:- A scaffolded app pointed at PostgreSQL is refused with "Run pnpm install && pnpm build", which does not fix it: the missing optional peer pg is reported as a build precondition #24909 (the client half, open, PR fix(service-datasource): a missing database client (pg, mysql2, better-sqlite3) is refused with its install, not the unbuilt-workspace build advice #24933);
- [finding][services] The
mongodbandsqlite-wasmarms of the same factory still answer a missing optional package with the fault and no remedy #7385 (closed: the factory's missing-package text); - datasource fail-fast 不认识「工作区未构建」这个成因 —— 对 ERR_MODULE_NOT_FOUND 仍建议改配置或设 OS_ALLOW_DRIVER_CONNECT_FAILURE=1(两条都是有害建议) #5794 and objectstack dev 在工作区未构建时刷 12 段无关命令的 MODULE_NOT_FOUND,唯一可执行的那条却指向错误修法 #5726 (closed: the unbuilt remedy);
- driver-turso: remote mode cannot be constructed without
better-sqlite3, thoughpackage.jsondeclares it an optional peer and the README tells Vercel / Edge users not to install it #20054, docs: npm 10 cannot install@objectstack/plugin-author@objectstack/cli(edgesOutthrough better-auth's optional vitest peer); the install and self-hosting pages name the npm 11 /overrides.vitestremedy #23849, [finding] README'spnpm install && pnpm build && pnpm devserves no Console on a fresh clone:/_console/and/answer 404, and the boot warning names a remedy that does not exist in this repo #22155 and [finding]pnpm sdui:manifestdies with ENOENT whenpackages/console/dist/does not exist — the ratchet's only trigger cannot run before a successful console build #10138 (closed, other messages).
None is this case.
-
scaffolded app PostgreSQL pg not installed boot error→ 1 hit, A scaffolded app pointed at PostgreSQL is refused with "Run pnpm install && pnpm build", which does not fix it: the missing optional peer pg is reported as a build precondition #24909.
Dedupe words: driver-turso not installed · two remedies · build precondition · optional driver package refusal.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 20, 2026
Correction ·
domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T16:57Z, to this card's body."the CLI and runtime depend on
mongodbandsqlite-wasmoutright" is half wrong. It was corrected by the same dev in round 2 (os-dev report6296337366on #24909), measured on the 18.0.0 npm manifests.@objectstack/cli@18.0.0depends ondriver-mongodbanddriver-sqlite-wasm.@objectstack/runtime@18.0.0depends ondriver-sqlite-wasm. It carriesdriver-mongodbas anoptionalDependency: installed by default, skipped under--omit=optional.So the
mongodbarm's two-remedy refusal is also reachable from a scaffold installed with--omit=optional. The ruling (B) and its premise are unchanged.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 17 · 2026-10-20T18:39Z
Session:
session_011TdZ8GjixNZFLz1xJD9zzKAccount:
os-justin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24937-optional-driver-package-remedyWorktree:
objectstack-issue-24937Domain:
domain:servicesSeat:
domain:services#1File surface:
packages/services/service-datasource/src/connect-failure-remedy.ts(connectFailureRemedy,isUnbuiltWorkspaceFailure, the new optional-driver-package branch and its module note), the factory classifier pins inservice-datasource/src/__tests__/default-datasource-driver-factory.test.ts(~:444–450, ~:626–633, and the third the card names),datasource-connection-service.test.tsonly for this branch's pins, and one new.changeset/24937-*.md. ⛔ Notdefault-datasource-driver-factory.ts's own messages (missingTursoDriverMessageand its siblings stay as they are), ⛔ notsqlite-driver-fallback.ts(PR #24955 is on it), ⛔ notpackages/types/**, ⛔ notpackages/drivers/**, ⛔ notpackages/spec/**(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: default (opus), quoting the --tier output "no path-derived mandate … floor sonnet · default opus · ceiling fable"Clause-②: no
Responsibility:
service-datasource's connectFailureRemedy appends the unbuilt-workspace remedy after the factory's own install text for a missing optional @objectstack/driver-* package, so the refusal names two contradictory fixes | none: the factory text names the right install, and the appended sentence contradicts it | a scaffold author who declares a turso datasource without installing @objectstack/driver-turso (measured on published 18.0.0); mongodb and sqlite-wasm after an --omit=optional or stale installThread-read: 6296383488
Serial constraints cleared:
PR #24933 (#24909, this seat) landed as ea08ce584c on connect-failure-remedy.ts; this work starts on top of it. PR #24955 (#24950, this seat, open) touches only sqlite-driver-fallback.ts and a new test file, disjoint from this surface. No other open PR touches service-datasource.The route is the card's seat ruling B: a bare specifier naming one of the optional driver packages
service-datasourcedeclares ends on a sentence that defers to the install the factory text already names; a path stays on the unbuilt remedy. The card also carries its premise and re-check, and that premise is measured first. The mongodb correction on the card (6296383488) applies.Readings taken on
origin/mainea08ce584c.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 24937,
"status": "done",
"branch": "claude/issue-24937-optional-driver-package-remedy",
"pr": "#24971",
"session": "session_011TdZ8GjixNZFLz1xJD9zzK (the Claude-Session line this run's commits carry; subagent of the seat's session)",
"premise_still_valid": true,
"summary": "Ruling B shipped in packages/services/service-datasource/src/connect-failure-remedy.ts, as a message branch only. The new closed list OPTIONAL_DRIVER_PACKAGES is built from the factory's own constants and pinned equal to package.json's optional peers (measured: driver-turso, driver-mongodb, driver-sqlite-wasm). A module-not-found whose first unresolved specifier is one of those, as a bare name (ESM 'Cannot find package' or CJS 'Cannot find module'), now ends on ONE sentence deferring to the install the factory text already names, with no second command, build or env var; isUnbuiltWorkspaceFailure answers false for it. A path or subpath into those packages keeps UNBUILT_WORKSPACE_REMEDY, the pg/mysql2/better-sqlite3 clients keep PR #24933's remedy, and every other cause keeps GENERIC_CONNECT_FAILURE_REMEDY byte for byte. The factory's messages, default-datasource-driver-factory.ts, sqlite-driver-fallback.ts, packages/types|drivers|spec, the refusal verdict, the error type, the retained state and the OS_ALLOW_DRIVER_CONNECT_FAILURE path are all untouched. Premise P was measured FIRST and holds, on a fresh worktree at 8cfe1f9 after pnpm install and before any build. Resolver leg (Node 22, from service-datasource, ESM and CJS): all three packages answer a PATH, e.g. 'Cannot find module .../node_modules/@objectstack/driver-turso/dist/index.mjs'. Boot leg (closure built except the three drivers, real factory + DatasourceConnectionService from dist): every arm's first specifier is the dist PATH. The card's path was measured at the same seam: published @objectstack/service-datasource@18.0.0 installed alone with no driver packages, ESM and CJS. Before: bare specifier, and the refusal ends on 'Run
pnpm install && pnpm build'. After (this branch's pnpm-pack build installed over it): it ends on the deferring sentence, with one npm install in the whole refusal and no pnpm install or pnpm build. The os dev scaffold path itself is NOT MEASURED. Four factory classifier sites were revised (the card said three: turso, sqlite-wasm, mongodb and the three-arm parity case) to path-shaped unbuilt causes, plus bare-package cases. Files changed: packages/services/service-datasource/src/connect-failure-remedy.ts, packages/services/service-datasource/src/tests/datasource-connection-service.test.ts, packages/services/service-datasource/src/tests/default-datasource-driver-factory.test.ts, .changeset/24937-optional-driver-package-remedy.md (service-datasource patch, Clause-②: no). Worktree node_modules and the worktree itself are removed right after this comment's read-back.","tests": "Head 87b717e (final; origin/main 2941a19 merged in, which touches nothing in the service-datasource closure). Under os-verify-lock:
pnpm --filter @objectstack/service-datasource typecheckexit 0 ('tsc --noEmit'; --listFiles counts both edited test files: 2);pnpm --filter @objectstack/service-datasource testexit 0: 'Test Files 49 passed (49)', 'Tests 899 passed (899)'. The same pair was also green on a2d8608 before the merge. Targeted run:pnpm --filter @objectstack/service-datasource exec vitest run --maxWorkers=2on datasource-connection-service, default-datasource-driver-factory and missing-driver-client-boot-refusal: 'Test Files 3 passed (3)', 'Tests 156 passed (156)'. Ablation (fix committed first; node scripts/ablation-replace.mjs WRAP mode; the subjects resolve via relative src imports, so no dist leg). Leg 1 deleted the connectFailureRemedy branch line: anchor 1->0, blob e6403dd54e18->bf36838df528; predicted red, got 'Tests 6 failed | 150 passed', exactly the six ESM/CJS deferring-remedy pins. Restored by git checkout HEAD: blob == HEAD e6403dd54e18, git diff HEAD empty, git status clean. Leg 2 dropped the isUnbuiltWorkspaceFailure exclusion. Its first attempt was refused by the tool itself (newline replacement-count check), restored, and ran nothing, so it was a declared no-op. The re-run (anchor 1->0, replacement 0->1, blob ->ebf06e9d96f4) predicted the classifier pins red and the remedy pins green; it got 'Tests 5 failed | 151 passed', exactly the five classifier pins. Restored, blob == HEAD, diff empty. No permanent real-path pin was added: vitest wraps every mock-factory throw in '[vitest] There was an error when mocking a module' (@vitest/mocker createHelpfulError, installed 4.1.11), so a staged absence cannot carry Node's text, and the factory has no import seam. The published before/after run is the one-time real-path evidence.","gates": "Local, head 87b717e, under os-verify-lock (one runner, PID 8772 recorded, waited with tail --pid; held 821s). Derivation:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackexit 0, 66 commands, 4 changed paths vs merge base 8cfe1f9. Each command ran once, exit captured before any pipe: 65 exit 0, and 1 exit 3 = NOT MEASURED,pnpm check:dual-build-cjs-loads, 'PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/' (whole-workspace dist; CI's).node scripts/pm/dispatch-gates.mjs --ran ran.list --repo objectstack-ai/objectstackexit 0: '✓ dispatch-gates --ran: 66 derived famil(ies) accounted for — 65 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Build:pnpm --workspace-concurrency=2 --filter '@objectstack/service-datasource^...' buildVERDICT command-exit 0 (the first attempt was a queue-timeout 99, retried on the same slot);pnpm --filter @objectstack/service-datasource buildexit 0. Local-only families (check:dev-prereqs, check:skill-frame-freshness) are not owed: no packages/spec or frame file touched. No exported symbol renamed or deleted, so check-platform-checklist --changed-from is not owed. PR #24971 check-runs at report time, head 87b717e. success: Check Documentation Links, Check PR Size, filter, 'No other open PR may claim the same issue', 'No other open PR may claim the same single-writer path', 'Part-of PR must not also close its card', 'The card this PR closes must claim this branch'. in_progress/queued: Check Changeset, Governed Surface Queue Guard, Build Core, Test Core (1/6)…(6/6), Type Check · workspace|source gates|consumer gates|debt ledger, Lint · ESLint|CI, release & engine gates|PM dispatch-gates|docs & code guards|repo & tooling gates|scoped · query-options erasure|scoped · slot lookup & corpus|scoped · tooling self-tests, Flag docs affected by code changes, Auto Label, Dogfood Regression Gate. Skipped by their if: 18.x upgrade harness, Build Docs, Console Pin Gate, Dogfood Regression Gate (shards), Dogfood Verify CLI, Packed-tarball smoke, Temporal Conformance. CI convergence is the PM's.","mcp_calls": "0 — no MCP tool of any kind was called",
"api_writes": "2 REST relay strokes, each one POST /repos/objectstack-ai/objectstack/dispatches executed by the fleet-write workflow as objectstack-fleet[bot]. (1) pr_create, run 39484115992: POST /repos/objectstack-ai/objectstack/pulls (draft, base main) + POST /repos//issues/24971/assignees ['os-justin']; the read-back was 11726 bytes sent and 11726 stored, identical, assignee os-justin. (2) this comment: POST /repos//issues/24937/comments. Not REST:
git pushof the one branch, 5 times (the empty-branch probe, impl, tests, changeset, the origin/main merge). Reads only otherwise: GET issues/24937, issues/24937/comments, issues/comments/6296337366, pulls/24971, commits/87b717e5a0…/check-runs. No labels written.","deviations": [
"One
npx tsc --noEmit --listFilescount in packages/services/service-datasource ran OUTSIDE os-verify-lock (to prove the typecheck covers the edited tests); the dispatch puts every typecheck under the lock.","Premise boot leg: a lock-held build of the closure EXCLUDING the three optional drivers exited 1, because service-datasource's DTS needs driver-sqlite-wasm types. Its JS dist was emitted and is what the boot leg ran; the full closure build was re-run afterwards.",
"The PM's optional real-path turso pin was not added (reason in tests). The one-time published before/after measurement replaces it.",
"The card's os dev scaffold leg is NOT MEASURED. It was measured at the same seam on the published 18.0.0 service package instead (before and after).",
"The factory classifier pins are FOUR sites, not three: the parity case is the fourth. All four were revised.",
"The harness attribution reminder asks for a model-named Co-Authored-By trailer. Commits carry AGENTS.md's model-free pair (Claude-Session + Co-authored-by: Claude), and the PR body uses the AGENTS.md session-URL footer.",
"npm install of the published 18.0.0 probe and pnpm pack ran outside the lock: installs are not lock-governed."
],
"files_changed": [
"packages/services/service-datasource/src/connect-failure-remedy.ts",
"packages/services/service-datasource/src/tests/datasource-connection-service.test.ts",
"packages/services/service-datasource/src/tests/default-datasource-driver-factory.test.ts",
".changeset/24937-optional-driver-package-remedy.md"
],
"open_questions": [
{
"question": "The unreleased .changeset/24909-missing-driver-client-remedy.md 'Unchanged' bullet reads: 'an
@objectstack/…driver package that is not installed, still ends onpnpm install && pnpm build'. Once PR #24971 lands, that is false for driver-turso, driver-mongodb and driver-sqlite-wasm, and the next release compiles both entries into one CHANGELOG. The file is outside this card's declared surface, so it was not edited. Should it be narrowed before release?","options": [
"A — the seat authorizes a one-line amendment in PR #24971 ('or a required
@objectstack/…driver package that is not installed'), the same landing, before the release consumes it","B — the seat edits that changeset in a separate docs-only PR before the release",
"C — leave it; this PR's own changeset states the new behaviour, and the reader reconciles the two entries"
],
"recommendation": "A. 实际业务需求: an upgrading reader greps CHANGELOG, and two entries in one release that contradict each other are measured-wrong text for exactly that reader (release-fixed text, the release-text exception). 项目长远合理性: a changeset is the release's input and is cheapest to correct before consumption, in the same landing that makes it false. A separate PR (B) adds a second landing for one word. 防 AI 写错: an agent reading the 24909 entry would conclude that a missing optional driver package still gets the build advice, which is the false belief this card removes. 创业阶段不扩散: A adds no surface, no gate and no card, only one word in a pending input. Cost: a second PR write plus one commit, which the seat makes or authorizes, since the dev's write budget is spent."
}
],
"out_of_scope_findings": [
"class: a · reach: exception: release-text (the unreleased .changeset/24909-missing-driver-client-remedy.md 'Unchanged' bullet becomes false for the three optional driver packages when PR #24971 lands; it is compiled into CHANGELOG at the next release) · evidence: that bullet's text against this PR's pins (a bare @objectstack/driver-turso|-mongodb|-sqlite-wasm ends on missingOptionalDriverPackageRemedy) · in this card's landing, so it belongs to #24937 itself (see open_questions), not a new card · dedupe words: changeset unchanged bullet, optional driver package, build advice, 24909 changeset",
"carrier: none (承接者:无) · noted, not filed — default-datasource-driver-factory.ts: the missingTursoDriverMessage doc says the classifier 'can only recognise an unbuilt/uninstalled workspace' from the interpolated text, and after this change an uninstalled optional package reads as an install. Comment drift in a file the hard stop keeps off this surface; PR Acceptance notes.",
"carrier: none (承接者:无) · noted, not filed — the workspace mirror: with an UNBUILT optional driver in this monorepo, the factory text says 'is not installed … npm install @objectstack/driver-X' and the refusal then correctly ends on the build advice. The premise boot leg measured both strings present, at the service seam only, with no public door, so no reach. The factory's wording is held unchanged by the hard stop, and ruling B accepted the workspace reading; PR Acceptance notes.",
"carrier: none (承接者:无) · noted, not filed — in default-datasource-driver-factory.test.ts, the staged-absence arm cases (vi.doMock factory that throws) reach the arm as vitest's '[vitest] There was an error when mocking a module' wrapper, not the staged Node error. Their interpolated 'Import error' is therefore vitest's text. No assertion there reads the cause, so nothing is falsely green today; it is why no real-path classifier pin was built that way."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 24937,
"round": 2,
"status": "done",
"branch": "claude/issue-24937-optional-driver-package-remedy",
"pr": "#24971",
"session": "session_011TdZ8GjixNZFLz1xJD9zzK (the Claude-Session line this run's commits carry; subagent of the seat's session)",
"premise_still_valid": true,
"summary": "Round 2 per the seat's ruling A on open question 1. In .changeset/24909-missing-driver-client-remedy.md, only the "Unchanged" bullet's second clause changed (1 insertion, 1 deletion). It now reads "or a required
@objectstack/…driver package that is not installed (any but the optional@objectstack/driver-turso,@objectstack/driver-mongodband@objectstack/driver-sqlite-wasm), still ends onpnpm install && pnpm build". That matches the code: a dist path into any driver package, or a bare @objectstack name off OPTIONAL_DRIVER_PACKAGES, is still the unbuilt remedy. No other line or file was edited. origin/main 693352e was merged first; it brings PR #24955, on sqlite-driver-fallback.ts plus a new test, disjoint from this diff. Because that merge touched service-datasource, the closure was rebuilt and the package test and typecheck were re-run. As expected,check-empty-changeset --base origin/mainis now RED (exit 1). It refuses a PR that changes a changeset it did not add, and this is the gate's DELIBERATE CORRECTION class: do not restore, do not apply skip-changeset, leave it red, and confirm in writing on the PR.Check Changesetis not a required context, so it blocks no merge. round2_pr_markdown carries the declaration for the seat to append. The seat records the written confirmation on the PR. The PR body was not edited. The worktree was recreated from the pushed branch tip for this round and is removed right after this comment's read-back.","tests": "Head e759c6c, under os-verify-lock.
pnpm --workspace-concurrency=2 --filter '@objectstack/service-datasource...' build: VERDICT command-exit 0. Thenpnpm --filter @objectstack/service-datasource typecheck && pnpm --filter @objectstack/service-datasource test: VERDICT command-exit 0, with "Test Files 50 passed (50)" and "Tests 908 passed (908)" (one file more than round 1: #24955's sqlite-driver-fallback-file-open-failure.test.ts). No ablation is owed this round: the only edit is changeset prose, and the os-dev rule is to never ablate config, scripts or docs.","gates": "Head e759c6c, under os-verify-lock, one runner (PID 8339 recorded, waited with tail --pid; held 770s). Re-derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, exit 0: 5 changed paths vs merge base 693352e, 66 commands, set-identical to round 1 (comm: 0 added, 0 removed), so the new path adds no family. All 66 were re-run, exit captured before any pipe. 64 exit 0. 1 exit 3 = NOT MEASURED:pnpm check:dual-build-cjs-loads, "PREREQUISITE NOT MET — this gate reads built output, and some package has no dist/". 1 exit 1, red by design:node scripts/check-empty-changeset.mjs --base origin/main, "This PR changes a changeset it did not add: .changeset/24909-missing-driver-client-remedy.md present on the merge base and CHANGED by this PR". That is the DELIBERATE CORRECTION class, so it was not restored and no label applied.git diff --name-status 693352e4c HEAD -- .changeset/*.md: M 24909-missing-driver-client-remedy.md, A 24937-optional-driver-package-remedy.md.node scripts/pm/dispatch-gates.mjs --ran ran-r2.list --repo objectstack-ai/objectstack, exit 0: "✓ dispatch-gates --ran: 66 derived famil(ies) accounted for — 65 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)". PR check-runs at e759c6c at report time: success: No other open PR may claim the same issue. Skipped: 18.x upgrade harness, Packed-tarball smoke. in_progress, 20 of them: Check Changeset (expected to go red, as above), Check Documentation Links, Check PR Size, Flag docs affected by code changes, Governed Surface Queue Guard, Lint · CI, release & engine gates|ESLint|PM dispatch-gates|docs & code guards|repo & tooling gates|scoped · query-options erasure|scoped · slot lookup & corpus|scoped · tooling self-tests, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch, Type Check · consumer gates|debt ledger|source gates|workspace. Build Core and Test Core shards had not appeared yet. The round-1 head 87b717e had no completed non-green check-run; Test Core (3/6) and (4/6) were still pending there. CI convergence is the PM's.","mcp_calls": "0 — no MCP tool of any kind was called",
"api_writes": "1 REST relay stroke: POST /repos/objectstack-ai/objectstack/dispatches, executed by the fleet-write workflow as objectstack-fleet[bot], doing POST /repos//issues/24937/comments (this round-2 report). Not REST: one
git pushof the branch, 87b717e..e759c6c, carrying the origin/main merge a967eb5 and the changeset edit e759c6c. The PR body was not PATCHed, and no labels or assignees were written. Reads only otherwise: GET issues/24937/comments, commits/e759c6c8e9…/check-runs, commits/87b717e5a0…/check-runs.","deviations": [
"check-empty-changeset is red at this head, and that is the gate's prescribed state for this class, not a failure to fix. It was left red per its own remedy text and pr-automation.yml route 0. skip-changeset was not applied, the note was not restored, and nothing was relabelled.",
"All 66 derived families were re-run, not only what the new path adds. The new path adds none, and
--ranneeds every derived family accounted for on this head.","The worktree removed after round 1 was recreated from the pushed branch tip 87b717e, verified equal to the remote, with pnpm install --frozen-lockfile. The newest Claim on #24937 (6298407732) still names this branch."
],
"files_changed": [
".changeset/24909-missing-driver-client-remedy.md"
],
"round2_pr_markdown": "## Round 2: the client-remedy changeset's "Unchanged" bullet (seat ruling A on open question 1)\n\n
.changeset/24909-missing-driver-client-remedy.mdis still unreleased. Its "Unchanged" bullet said "an@objectstack/…driver package that is not installed, still ends onpnpm install && pnpm build", which this PR makes false for the three optional driver packages. That one bullet now reads:\n\n> A driver package whose build output is missing, or a required@objectstack/…driver package that is not installed (any but the optional@objectstack/driver-turso,@objectstack/driver-mongodband@objectstack/driver-sqlite-wasm), still ends onpnpm install && pnpm build.\n\n- It is a one-line edit (1 insertion(+), 1 deletion(-)). No other line of that file changed, and no other file changed in this round.\n- It matches the code. A path into any driver package'sdist/is still the unbuilt remedy, and so is a bare@objectstack/…name offOPTIONAL_DRIVER_PACKAGES(e.g.@objectstack/driver-sql). A bare name on that list ends onmissingOptionalDriverPackageRemedy.\n-origin/main693352e4c2was merged first. It brings PR #24955 onsqlite-driver-fallback.ts, disjoint from this diff.\n- Heade759c6c8e9:\n -pnpm --filter @objectstack/service-datasource typecheck: exit 0.\n -pnpm --filter @objectstack/service-datasource test:Test Files 50 passed (50),Tests 908 passed (908). That includes #24955's new file.\n- Gates: re-derived withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack. That gives 5 paths vs merge base693352e4cand 66 commands, the same set as round 1 (the new path adds no family). All 66 were re-run at this head under the lock,node scripts/check-empty-changeset.mjs --base origin/mainamong them. Results: 64 exit 0; 1 NOT MEASURED,pnpm check:dual-build-cjs-loads(exit 3,PREREQUISITE NOT MET, it reads every package'sdist/); and 1 red BY DESIGN,node scripts/check-empty-changeset.mjs --base origin/main(exit 1).--ranreconciliation:✓ dispatch-gates --ran: 66 derived famil(ies) accounted for — 65 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3), exit 0.\n\n###Check Changesetstays red, and that is the gate's DELIBERATE CORRECTION class\n\ncheck-empty-changesetrefuses any PR that changes a changeset it did not add. Here that is.changeset/24909-missing-driver-client-remedy.md,Magainst merge base693352e4c, beside this PR's ownA.changeset/24937-optional-driver-package-remedy.md. The gate names two classes with opposite remedies. This is the second one, not a filename collision: this PR's own code change made that PENDING release note false, and this round rewrites only the sentence it falsified. Per the gate's own remedy text, whichpr-automation.yml's route 0 repeats for the same class:\n\n- The note is NOT restored from the base. That would republish the false sentence.\n-skip-changesetis NOT applied. Ruled on #18375 (ruling D): never on a PR that edits an existing changeset.\n- The check is left red.Check Changesetis not one of the five required contexts, so it blocks no merge.\n\nThe note is.changeset/24909-missing-driver-client-remedy.md. What changed under it: this PR routes a bare@objectstack/driver-turso/-mongodb/-sqlite-wasmmodule-not-found to the factory's install instead of the build advice. Only its "Unchanged" bullet's second clause is narrowed to match. The correction was ruled by thedomain:servicesseat 1 PM (ruling A on open question 1 of the os-dev report on #24937). The seat records that confirmation on this PR in writing.\n","open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT → PR #24971 comment
6300657855·domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T20:22ZGenerated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T20:58Zadded_to_merge_queue2026-10-20T20:26Z →merged2026-10-20T20:57Zorigin/mainby contentb811c73696(one parent,3a7a60af8f), 5 files.connect-failure-remedy.tsexportsOPTIONAL_DRIVER_PACKAGES, and.changeset/24909-missing-driver-client-remedy.md's "Unchanged" bullet reads "a required@objectstack/…driver package"State change in this stroke:
pm:dispatchedoff and the assignee cleared. The card closedcompletedon the merge.What changes for users: a datasource whose optional driver package (
@objectstack/driver-turso,-mongodb,-sqlite-wasm) is not installed is refused with that package's install alone. The contradictory "Runpnpm install && pnpm build" no longer follows it.Check Changesetwas carried red into the queue as a DELIBERATE CORRECTION of #24909's pending note, with the confirmation in ACCEPT6300657855. The next release compiles both changesets consistently.Generated by Claude Code