Repository navigation
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
Copy link
Copy link
Closed
Labels
area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingdomain:servicespriority:p1High: required for production / M2High: required for production / M2
Description
Filing gate: ① product defect with a named location and a reproduction (release-fixed wrong text in a boot refusal).
- Category: ①. reach: the published 18.0.0 package, measured once through a public entry point. Scaffold from npm (npm create objectstack@18.0.0), then os dev -d postgres://..., the step your-first-project.mdx gives for production ("point OS_DATABASE_URL at Postgres ... no code changes").
- Who acts: the seat that owns packages/services/service-datasource. Location: packages/services/service-datasource/src/connect-failure-remedy.ts, UNBUILT_WORKSPACE_REMEDY and connectFailureRemedy().
- Dedup: local scan of the 626 newest issues (state=all, open and closed, release text: three pending changesets in the next 18.0.0 pre-release carry sentences that later same-release PRs make false (Hono currentRecord 'held'; the organization_id drop gate 'inventory only') #23703 to pm-dispatch: merge
domain:engineanddomain:servicesintodomain:server(maintainer 「甲」, 「就叫 server 吧」), with a no-interrupt transition — and movepackages/qa(dogfood) todomain:devx#24907) for Cannot find module 'pg' / install pg / optional peer / build precondition: 0 hits. Semantic search "postgres driver pg not installed boot error says run pnpm install && pnpm build": 2 hits, os doctor: apnpm -vthat fails for any reason (Corepack unable to fetch its pinned or latest pnpm) is reported "✗ pnpm Not found" with "Install pnpm: npm install -g pnpm@10.28.1", though pnpm is installed #24464 and [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, both closed and both about different messages.
reach: npx os dev --no-watch -p PORT -d postgres://postgres@127.0.0.1:55432/DB in a fresh create-objectstack@18.0.0 project (published npm 18.0.0), PostgreSQL 16.15.
QA-source: #24908 · smoke:npm-18.0.0 · D1
type: Bug
Reproduction (published 18.0.0, outside any workspace)
- npm create objectstack@18.0.0 my-app -- --skip-skills; cd my-app. The package.json has no pg (the template lists none).
- createdb DB; npx os dev --no-watch -p 3404 -d postgres://postgres@127.0.0.1:55432/DB
- Exit 1. The refusal:
"✗ datasource 'default': connect failed — Knex: run $ npm install pg --save Cannot find module 'pg' ... (declared boot-critical by the host ...). The driver package could not be LOADED at all — it is not installed, or its build output is missing. That is a build precondition, not a datasource fault: the configuration is fine, and no boot-time override can make a driver that does not exist answer a query. Runpnpm install && pnpm build, then start again."
- Exit 1. The refusal:
- Do what it says: pnpm install (exit 0), pnpm build (exit 0, which is objectstack build in a scaffold), then step 2 again. Refused again with the same text.
- pnpm add pg, then step 2: boots (Driver SqlDriver(pg)), and CRUD works.
What is wrong
- The remedy was written for one case (the module note, datasource fail-fast 不认识「工作区未构建」这个成因 —— 对 ERR_MODULE_NOT_FOUND 仍建议改配置或设 OS_ALLOW_DRIVER_CONNECT_FAILURE=1(两条都是有害建议) #5794): an unbuilt monorepo worktree where driver-sql's dist is missing. It is chosen for every module-not-found (isModuleNotFoundError), and that includes a project that simply lacks the optional peer pg. Per docs/data-modeling/drivers.mdx, pg is an optional peer you install yourself.
- In that case all three claims are wrong for the reader: "a build precondition", "the configuration is fine", and the one command it offers. The text says it names one correct fix and stops, so a reader who follows it is stuck. The right fix (pnpm add pg, or npm install pg) appears only inside knex's own text, which this message calls a build problem.
- The same branch probably also catches mysql2, and the turso, mongo and sqlite-wasm arms (drivers.mdx lists them as optional packages). Only pg was measured.
Acceptance: when the module that could not be resolved is an optional driver peer (pg, mysql2, ...) and not the driver package's own build output, the refusal names the install command for that module. The unbuilt-worktree wording stays for the case it was written for.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingSomething isn't workingdomain:servicespriority:p1High: required for production / M2High: required for production / M2
Activity
PrithwishDas101 commentedon Oct 20, 2026
The fix should distinguish a missing optional database-driver dependency from a driver package that exists in the workspace but has not been built.
In
packages/services/service-datasource/src/connect-failure-remedy.ts,connectFailureRemedy()currently treats every module-resolution failure as an unbuilt-workspace failure throughisUnbuiltWorkspaceFailure(). That incorrectly classifies a missingpgpeer dependency the same way as a missing@objectstack/driver-sql/distbuild artifact.I suggest keeping the existing unbuilt-workspace remedy for missing driver build output, while adding a separate remedy for a missing optional peer dependency. For the PostgreSQL case, the actionable message should explicitly tell users to install
pgusing their package manager (for example,pnpm add pgornpm install pg) rather than telling them to rebuild the project.The implementation should preserve the original thrown error long enough to classify the missing package reliably, and should avoid treating every
MODULE_NOT_FOUNDorERR_MODULE_NOT_FOUNDas the same cause. Add regression tests for both cases: a missingpgdependency must recommend installingpg, while a missing workspace build artifact must retain the existingpnpm install && pnpm buildremedy. Also keep the existing connection-failure message unchanged for genuine connection errors such asECONNREFUSED.objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 12 · 2026-10-20T15:33Z
Session:
session_011TdZ8GjixNZFLz1xJD9zzKAccount:
os-justin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-24909-missing-driver-peer-remedyWorktree:
objectstack-issue-24909Domain:
domain:servicesSeat:
domain:services#1File surface:
packages/services/service-datasource/src/connect-failure-remedy.ts(UNBUILT_WORKSPACE_REMEDY,isUnbuiltWorkspaceFailure,connectFailureRemedyand their module note), their pins inservice-datasource/src/__tests__/, a new pin on the real boot-refusal path,content/docs/data-modeling/drivers.mdxonly if a quoted refusal text changes, and one new.changeset/24909-*.md. ⛔ Notpackages/types/**(isModuleNotFoundErroris shared with the CLI's optional-plugin guards; a change there is a fork to report), ⛔ notpackages/spec/**, ⛔ notpackages/drivers/**, ⛔ no change to when boot is refused, the thrown error type or theOS_ALLOW_DRIVER_CONNECT_FAILUREpath (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: default (opus), quoting this dispatch's --tier output "no path-derived mandate: the surface hits none of the 3 declared glob(s) … floor sonnet · default opus · ceiling fable"Clause-②: no
Responsibility:
service-datasource's connectFailureRemedy() picks the unbuilt-workspace remedy for every module-not-found, including a project that lacks the optional peer pg | none: knex's own text names npm install pg, but the refusal calls it a build precondition and offers only pnpm install && pnpm build | every user of a published scaffold who follows the docs' production step (point OS_DATABASE_URL at PostgreSQL) without installing pg; mysql2 and the other optional driver installs probably share the branch (not measured)Thread-read: 6292687799
Serial constraints cleared:
No open PR touches service-datasource or packages/types (all 15 open PRs' files read at this claim). #24837 (p3, this lane's pm:queue, service-datasource Sync) is not in flight and touches other files.Readings taken on
origin/main94842bad2a. Comment6292687799is an outside suggestion. The dev reads it as a proposal; measurement decides.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 24909,
"status": "done",
"branch": "claude/issue-24909-missing-driver-peer-remedy",
"pr": "#24933",
"session": "session_011TdZ8GjixNZFLz1xJD9zzK (the Claude-Session line this run was stamped with)",
"premise_still_valid": true,
"summary": "connectFailureRemedy() (service-datasource/src/connect-failure-remedy.ts) now reads WHICH module could not be resolved: the first Cannot find module|package 'X' in the error text. When X is exactly one of the closed list OPTIONAL_DRIVER_CLIENT_PACKAGES = pg, mysql2, better-sqlite3 (the clients the factory's knex arms load), the refusal ends on missingDriverClientRemedy(X): npm install X, with the pnpm add / yarn add spellings beside it, and no build or env var. isUnbuiltWorkspaceFailure() no longer answers true for that case. Paths, every @objectstack/... package, subpaths and other bare names keep UNBUILT_WORKSPACE_REMEDY. Every other cause keeps GENERIC_CONNECT_FAILURE_REMEDY byte for byte. When the boot is refused, the error type, retained state and OS_ALLOW_DRIVER_CONNECT_FAILURE path are unchanged. packages/types, spec and drivers are untouched. Measured H1-H3 (all held). The card's own path was measured before and after on a published 18.0.0 scaffold outside the workspace: before, exit 1 with pnpm install && pnpm build; after, exit 1 with npm install pg; after pnpm add pg the boot moves on to ECONNREFUSED and the generic sentence. The outside suggestion 6292687799's idea is adopted and credited in the PR body.",
"tests": "Head 649414d. (1) pnpm --filter @objectstack/service-datasource typecheck: exit 0. tsc --listFiles includes both changed test files. (2) pnpm --filter @objectstack/service-datasource exec vitest run --maxWorkers=2: Test Files 49 passed (49), Tests 883 passed (883). (3) New unit pins in datasource-connection-service.test.ts: pg, mysql2 and better-sqlite3 knex shapes plus ESM Cannot find package 'pg' end on the client install; 5 boundary cases keep UNBUILT; ECONNREFUSED and 28P01 keep GENERIC; classifier pins. (4) New real-path pin missing-driver-client-boot-refusal.test.ts: the real factory plus the real DatasourceConnectionService refuse the boot-critical default with the client hidden through Node's own resolver (a Module._load hook, NODE_PATH set aside during that one resolution). Arms pg, mysql2, better-sqlite3: refused, plain Error, ends on the install, no pnpm build, state failed-degraded. The escape hatch still degrades. Control (client present): ECONNREFUSED plus GENERIC. The SQL driver is loaded at module top: the pg case went from 9496ms to 12ms; the file wall is 8.14s. (5) Ablation through scripts/ablation-replace.mjs (subject imported from src, no build involved). Leg 1, delete the client branch in connectFailureRemedy: anchor 1 -> 0, blob 78e1c14f40fb -> ada054c0c2a4; 7 failed / 83 passed, exactly the predicted set. Leg 2, delete the client exclusion in isUnbuiltWorkspaceFailure: anchor 1 -> 0; 1 failed / 89 passed (the classifier pin). Both restores: blob == HEAD 78e1c14f40fb and git diff HEAD empty. (6) Card path, published create-objectstack@18.0.0 scaffold in the scratchpad, os dev -d postgres://postgres@127.0.0.1:1/db: before exit 1 with the UNBUILT text; after (head's compiled functions transplanted into that scaffold's copy of the bundle; the remedy source is byte-identical between the 18.0.0 tag and base) exit 1 ending npm install pg; mysql:// ends npm install mysql2; after pnpm add pg the boot refuses on ECONNREFUSED with the GENERIC sentence.",
"gates": "Local, on head 649414d. Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; merge base 74fcec1; 4 paths). 66 commands, run one at a time, each exit captured before any pipe: 65 exit 0, and pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: it needs every package's dist) = NOT MEASURED. --ran with recorded exits: '66 derived famil(ies) accounted for - 65 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. Exit 0 included check:test-source-alias, check:cross-package-test-inputs, check:engine-double-contract, check:doc-authoring, check:nul-bytes, check:type-check-coverage, check:type-check-debt, check-adr-0087-registration --base origin/main, check-empty-changeset --base origin/main and check-changeset-no-major. NOT MEASURED locally, left to CI: test:repo (the diff touches none of its tests); repo-wide scans (pnpm lint); local-only check:dev-prereqs and check:skill-frame-freshness (not triggered: no packages/spec build, no skill-frame file). PR #24933 check-runs at report time (head 649414d, 24 runs): No other open PR may claim the same issue = success; 18.x upgrade harness (opt-in) and Packed-tarball smoke (opt-in) = skipped; in_progress: Check Changeset, 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), filter.",
"deviations": [
"Merged origin/main (74fcec1: d606fc1 platform-objects, 74fcec1 driver-sql introspectSchema; neither touches this diff's files) before opening the PR, per AGENTS.md section 10. Rebuilt the closure and re-ran typecheck, the full package suite and the whole derived gate set on the merged head. An earlier gate run on c3c575f (10 of 66 done) was stopped by its own recorded PID (10361 and child) and superseded.",
"better-sqlite3 joined pg and mysql2 in the closed client list. It was measured on this path (the factory's sqlite arm with dev:false throws the same knex shape), and drivers.mdx lists it as the SQLite peer.",
"Commit trailers use the AGENTS.md model-free pair (Co-authored-by: Claude) instead of the harness reminder's model-named Co-Authored-By. The PR footer is in the AGENTS.md session-URL form instead of the reminder's form.",
"Two throwaway probe test files (src/tests/zz-probe-tmp.test.ts) were created and deleted, uncommitted, in the worktree to find why a resolver-only hook missed inside vitest. Cause: pnpm puts its hoisted store on NODE_PATH, and Module._load answers repeat requires from its cache.",
"The env var HTTPS_PROXY's value was echoed by fleet-write/dispatch.mjs's own re-exec notice in output this run printed. No other env value was printed; presence was tested with the [ -n ${X+x} ] form.",
"Card-path measurement edited files only inside a scratchpad scaffold, outside any repo: the scaffold's node_modules copy of the bundle, and its objectstack.config.ts plus note.object.ts for the turso probe (restored afterwards). The scaffold was deleted at the end."
],
"files_changed": [
".changeset/24909-missing-driver-client-remedy.md (new, patch @objectstack/service-datasource, carries Clause-②: no)",
"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/missing-driver-client-boot-refusal.test.ts (new)"
],
"mcp_calls": "0",
"api_writes": "2 REST writes from this run, both POST /repos/objectstack-ai/objectstack/dispatches to the fleet-write relay, executed as objectstack-fleet[bot]. Stroke 1, pr_create (draft): POST /repos/objectstack-ai/objectstack/pulls plus POST /repos//issues/24933/assignees [os-justin], run 39457609813 success, body read back byte-identical (13122 bytes). Stroke 2: this os-dev-report comment, POST /repos//issues/24909/comments. Plus git push (not REST). No labels written. Card labels and assignee not touched.",
"open_questions": [
{
"question": "H4, the install wording: the server cannot know the project's package manager. Which spelling should the missing-client remedy use?",
"options": [
"A: one command, npm install X only",
"B: the module name plus a neutral sentence (add X with your package manager)",
"C (shipped in #24933): npm install X with pnpm add X / yarn add X beside it"
],
"recommendation": "C. Real need: the scaffolder picks pnpm when it is on PATH and npm otherwise (detect-package-manager.ts), and the card's reader used npm create and then pnpm, so both readers are real. A serves one of them. Long-term fit: C is the spelling the factory's optional-driver messages in this package already use, while B adds a second one. Harder to get wrong: C gives a copy-pasteable command per manager; A invites npm in a pnpm project; B leaves the reader to work out the command. Scope: all three are mechanism-free."
},
{
"question": "H3: a missing optional @objectstack/driver-* package (turso, mongodb, sqlite-wasm). Measured through os dev on a published 18.0.0 scaffold, with a declared non-default turso datasource and a bound object: the refusal names two fixes, the factory's npm install @objectstack/driver-turso and the appended 'build precondition ... Run pnpm install && pnpm build'. #24933 leaves it on the unbuilt remedy. The bare specifier means a missing install in a scaffold but a stale install in the workspace (where npm install would be wrong), and the existing factory pins assert those texts classify as unbuilt. Should the closing remedy change for it?",
"options": [
"A: leave as is (two fixes for the scaffold reader; the workspace reading is protected)",
"B: a bare specifier naming one of the three optional peers service-datasource declares ends on a sentence deferring to the install the factory text already names; paths stay on the unbuilt remedy. Cost: small, the same file plus revising three factory classifier pins to path-shaped causes",
"C: as B, but @objectstack/driver-turso only (the CLI and runtime depend on mongodb and sqlite-wasm outright)"
],
"recommendation": "B. Real need: turso's case is measured reachable from a scaffold; mongodb and sqlite-wasm only after an omitted or stale install. Long-term fit: one rule, 'a bare optional install is an install, a path is unbuilt'. Harder to get wrong: one fix per refusal instead of two contradictory ones. Scope: no new gate, one file. The trade-off to accept: a workspace contributor with a stale install would be pointed at the install rather than at pnpm install."
}
],
"out_of_scope_findings": [
"class: a · reach: public door, measured on a published create-objectstack@18.0.0 scaffold: following this page's production step, os dev -d postgres://... exits 1, and a fresh scaffold cannot resolve pg · evidence: content/docs/getting-started/your-first-project.mdx, the package table row for @objectstack/runtime ('Brings the database drivers with it — you do not install one separately') and the paragraph under it ('point OS_DATABASE_URL at Postgres / MySQL / MongoDB for production — no code changes'). Neither says pg or mysql2 must be installed, while drivers.mdx says they are optional peers to install yourself. This is the step the card's own reproduction followed · dedupe words: your-first-project, no code changes, install pg, optional peer, OS_DATABASE_URL Postgres",
"class: a · reach: public door, measured: os dev on a published 18.0.0 scaffold with a declared non-default turso datasource, my_app_note bound to it and no @objectstack/driver-turso, exits 1 with a refusal naming both npm install @objectstack/driver-turso and 'Run pnpm install && pnpm build' · evidence: service-datasource connectFailureRemedy appends UNBUILT_WORKSPACE_REMEDY after missingTursoDriverMessage; the sqlite-wasm and mongodb arms have the same shape (real factory, ESM and CJS) · the same family as this card, routed as open question 2 for the decision on the reading, not filed · dedupe words: driver-turso not installed, build precondition, two remedies, optional driver package refusal"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim amendment ·
domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T16:37Z, on claim6294662022(branchclaude/issue-24909-missing-driver-peer-remedy, PR #24933). ⛔ Not a new claim; the branch, account and everything else in the claim stand.File surface, one path added:
content/docs/getting-started/your-first-project.mdx, the package table's@objectstack/runtimerow (:245) and the paragraph under it (:251–253).OS_DATABASE_URLat Postgres or MySQL needs "no code changes". Since PR fix(service-datasource): a missing database client (pg, mysql2, better-sqlite3) is refused with its install, not the unbuilt-workspace build advice #24933, the refusal tells that same reader tonpm install pg. This card's reproduction followed this page's step (the dev's out-of-scope finding 1 in report6295846037).drivers.mdxalready sayspgandmysql2are optional peers to install.Seat rulings on the report's open questions:
@objectstack/driver-*package ends on two remedies): B. A bare optional-driver package specifier defers to the install the factory names; a path stays on the unbuilt remedy. It goes to a follow-up card, not to this PR.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 24909,
"round": 2,
"status": "done",
"branch": "claude/issue-24909-missing-driver-peer-remedy",
"pr": "#24933",
"session": "session_011TdZ8GjixNZFLz1xJD9zzK (the Claude-Session line this run was stamped with)",
"premise_still_valid": true,
"summary": "Round 2 per claim amendment 6295994725. content/docs/getting-started/your-first-project.mdx: only the @objectstack/runtime table row and the paragraph under it changed. The page now says SQLite (the default) needs nothing more, MongoDB needs only OS_DATABASE_URL, and Postgres and MySQL need their client (npm install pg / npm install mysql2), an optional peer of driver-sql that the project adds itself, or the boot is refused. 'you do not install one separately' and the bare 'no code changes' are gone. Every claim was measured on a fresh published 18.0.0 scaffold and the 18.0.0 manifests. This corrects round 1's 'the CLI and runtime depend on mongodb outright': the CLI does; the runtime carries driver-mongodb as an optionalDependency. Open question 2's ruling B was not implemented (follow-up card). origin/main (7169612, docs only) was merged first. The changeset is unchanged (docs publish nothing). The PR body was not edited; the round-2 markdown is in round2_pr_markdown for the seat to append.",
"round2_pr_markdown": "## Round 2: the getting-started page (claim amendment 6295994725)\n\n
content/docs/getting-started/your-first-project.mdx: only the package table's@objectstack/runtimerow and the paragraph under it changed. No new section.\n\n- The row no longer says "you do not install one separately". It now says that SQLite and MongoDB work as installed, and that PostgreSQL and MySQL also need their client package.\n- The paragraph keeps the dependency sentence, which was measured true, and adds that the runtime installsdriver-mongodbas an optional dependency.\n - SQLite (the default) needs nothing more.\n - MongoDB needs onlyOS_DATABASE_URL.\n - Postgres and MySQL need their client installed first (npm install pg/npm install mysql2, the page's npm spelling). It is an optional peer ofdriver-sql, and without it the boot is refused.\n - The bare "no code changes" link is now "No code changes either way — see Drivers".\n\nMeasured on a fresh publishedcreate-objectstack@18.0.0scaffold (pnpm-installed, outside any workspace) and on the 18.0.0 npm manifests:\n\n-@objectstack/runtime@18.0.0: dependenciesdriver-sql,driver-memory,driver-sqlite-wasm; optionalDependenciesdriver-mongodb; optional peerdriver-turso. The workspace head has the same edges.\n-@objectstack/cli@18.0.0: dependenciesdriver-sql,driver-memory,driver-mongodb,driver-sqlite-wasm; optional peerdriver-turso.\n-@objectstack/driver-mongodb@18.0.0depends onmongodb.@objectstack/driver-sql@18.0.0has optional peerspgandmysql2and the optional dependencybetter-sqlite3.\n- In the scaffold,driver-mongodb,driver-sqlite-wasmanddriver-sqlresolve from service-datasource, andmongodbresolves fromdriver-mongodb.pgandmysql2do not resolve.\n-os devwith no database flag: "Server is ready" onSqlDriver(better-sqlite3), andGET /api/v1/discoveryanswered 200. The server was stopped afterwards.\n-os dev -d mongodb://127.0.0.1:1/db: exit 1 onconnect ECONNREFUSED 127.0.0.1:1with the generic sentence. The driver and client loaded; only the absent server refused.\n- Postgres and MySQL without their client: refused with exit 1, as measured in round 1.\n\nA correction to round 1: open question 2 said "the CLI and runtime depend on mongodb and sqlite-wasm outright". That holds for the CLI. The runtime carriesdriver-mongodbas an optionalDependency, which is installed by default and skipped under--omit=optional.\n\nThe changeset is unchanged:content/docs/**publishes nothing, and the existingpatchchangeset covers the code.\n\nGates on head907bd42fdb, re-derived: 95 commands (the 66 from round 1 plus 29 docs families). The 29 added ones and 8 docs-reading round-1 families (check:doc-authoringamong them) were re-run, each under the lock. All exit 0 once thelint,formulaandclient-reactclosures were built. Before those builds, 4 had exited 3 (prerequisite). The derived link family ischeck:doc-anchors, exit 0; CI's lychee lane isCheck Documentation Links.--ran: 95 accounted, 94 run, 1 NOT MEASURED (check:dual-build-cjs-loads, which needs every package built).","tests": "Head 907bd42. The round-2 code delta against round 1's 649414d is zero: git diff --stat 649414d 907bd42 lists only your-first-project.mdx plus the main merge's content/docs/upgrading.mdx, content/docs/releases/v18/index.mdx and packages/cli/CHANGELOG.md. So the service-datasource suite was not re-run; round 1's reading stands (on 649414d: typecheck exit 0, vitest 49 files / 883 tests passed, and CI on 649414d green: Test Core 1-6/6 success, TypeScript Type Check success, Build Core success, Lint & Repo Gates success). Docs measurements, on a fresh published create-objectstack@18.0.0 scaffold in the scratchpad: os dev (no -d) reached 'Server is ready' with Driver SqlDriver(better-sqlite3) and discovery 200 (own server, stopped by its own PIDs); os dev -d mongodb://127.0.0.1:1/db exited 1 after 9s on connect ECONNREFUSED with the generic sentence (the driver and client loaded); require.resolve from service-datasource found driver-mongodb, driver-sqlite-wasm and driver-sql (not driver-turso), driver-mongodb found mongodb, and the app found neither pg nor mysql2. npm view of the 18.0.0 manifests: runtime deps driver-sql, driver-memory, driver-sqlite-wasm with optionalDependencies driver-mongodb; cli deps driver-sql, driver-memory, driver-mongodb, driver-sqlite-wasm; driver-mongodb deps mongodb; driver-sql optional peers pg and mysql2 plus optionalDependency better-sqlite3. No ablation this round: the round changes no tested behaviour (docs only).",
"gates": "Head 907bd42. Re-derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (merge base 7169612, 5 paths): 95 commands, which is round 1's 66 plus 29 docs families, none dropped. Run under the lock, one at a time, exit taken before any pipe and from the lock's VERDICT line: the 29 added, plus 8 round-1 families that read docs, re-run (pnpm check:doc-authoring, docs-audit/check-affected-docs, docs-audit/check-drift-comment, check-issue-citations.mjs, pnpm check:issue-citations, check:nul-bytes, check:closed-ceremony-text, check:watch-hint-literal). All exit 0, among them check:doc-authoring, check:doc-anchors (the derived link family), check:docs-redirects, check:published-readme-links, check:docs-single-h1, check:doc-frontmatter, spec check:docs, check:liveness and check:empty-state. Four first exited 3 (PREREQUISITE NOT MET: @objectstack/lint, formula and client-react unbuilt); after building those closures under the lock, check:doc-formula-expressions, check:doc-security-posture, spec check:skill-examples and check:docs-transcript-drift all exit 0. --ran over all 95 (37 from this round on 907bd42; the other 58 carried from round 1 on 649414d, whose code is identical): '95 derived famil(ies) accounted for - 94 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)', the 1 being check:dual-build-cjs-loads (needs every package built; CI runs it). PR check-runs: on 649414d (round 1 head) all 41 completed, success or skipped (Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard and Check Documentation Links all success); on 907bd42 at report time 23 runs, 22 queued, Packed-tarball smoke (opt-in) skipped.",
"deviations": [
"The round-1 worktree had been removed at round-1 cleanup (os-dev rule), so 'same worktree' was recreated at the same path on the same branch from its pushed head 649414d. Then origin/main (7169612, docs and CHANGELOG only) was merged as 2da7d02.",
"Built @objectstack/spec, plus the @objectstack/lint and @objectstack/client-react closures, under the lock so four docs gates could measure instead of refusing on prerequisites. The tree stayed clean (no generated artifact moved).",
"The service-datasource suite was not re-run this round: the code delta from 649414d is zero, and CI on 649414d is green.",
"A correction to the round-1 report and to the PR body's open question 2: 'the CLI and runtime depend on mongodb and sqlite-wasm outright' is half wrong. The runtime carries driver-mongodb as an optionalDependency (sqlite-wasm is a dependency of both). The PR body was not edited (per instruction); the correction is in round2_pr_markdown.",
"The dev server started for the SQLite measurement was a backgrounded subshell; killing the subshell left its node child (pid 15432, listening on this run's own port 38931). That child was then stopped by its pid; nothing was left listening.",
"Push: once (907bd42, two commits: the main merge and the docs edit). The PM instruction 'push once' was followed over AGENTS.md's 'push a WIP commit before every step that takes minutes'.",
"No env var value was printed this round. The relay's re-exec notice was filtered out of all output, and nothing from it reaches a public surface."
],
"files_changed": [
"content/docs/getting-started/your-first-project.mdx (round 2: the @objectstack/runtime table row and the paragraph under it)",
".changeset/24909-missing-driver-client-remedy.md (round 1, unchanged)",
"packages/services/service-datasource/src/connect-failure-remedy.ts (round 1)",
"packages/services/service-datasource/src/tests/datasource-connection-service.test.ts (round 1)",
"packages/services/service-datasource/src/tests/missing-driver-client-boot-refusal.test.ts (round 1)"
],
"mcp_calls": "0",
"api_writes": "1 REST write this round: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay) carrying this os-dev-report round-2 comment, POST /repos//issues/24909/comments, as objectstack-fleet[bot]. Plus one git push (not REST). No PR body PATCH, no label write, no assignee write. The PR's labels documentation, size/m, tests and tooling were set by the Auto Label workflow, not by this run.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: the domain:services seat 1 PM (ruling B on open question 2 goes to the follow-up card the seat files) · noted, not filed by this run · the round-1 finding 2 evidence stands (os dev on a published 18.0.0 scaffold, a non-default turso datasource, two remedies), with the correction that the runtime's driver-mongodb edge is an optionalDependency"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT → PR #24933 comment
6296918083·domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T17:27ZGenerated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:servicesseat 1 ·session_011TdZ8GjixNZFLz1xJD9zzK· 2026-10-20T18:05Zadded_to_merge_queue2026-10-20T17:32Z →merged2026-10-20T18:05Zorigin/mainby contentea08ce584c(one parent,e7befa7700). Inconnect-failure-remedy.ts,OPTIONAL_DRIVER_CLIENT_PACKAGESis['pg', 'mysql2', 'better-sqlite3']State change in this stroke:
pm:dispatchedoff and the assignee cleared. The card closedcompletedon the merge.What changes for users:
npm install pg, with the pnpm and yarn spellings), not with "Runpnpm install && pnpm build".6296918083).Follow-up: #24937 (a missing optional
@objectstack/driver-*package, ruled B). It is unlabelled, for triage.Generated by Claude Code