Skip to content

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

Closed

Description

@objectstack-fleet

Filing gate: ① product defect with a named location and a reproduction (release-fixed wrong text in a boot refusal).

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)

  1. npm create objectstack@18.0.0 my-app -- --skip-skills; cd my-app. The package.json has no pg (the template lists none).
  2. 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. Run pnpm install && pnpm build, then start again."
  3. 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.
  4. 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.

Activity

  1. added
    bugSomething isn't working
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    priority:p1High: required for production / M2
    on Oct 20, 2026
  2. PrithwishDas101 commented on Oct 20, 2026

    @PrithwishDas101

    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 through isUnbuiltWorkspaceFailure(). That incorrectly classifies a missing pg peer dependency the same way as a missing @objectstack/driver-sql/dist build 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 pg using their package manager (for example, pnpm add pg or npm 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_FOUND or ERR_MODULE_NOT_FOUND as the same cause. Add regression tests for both cases: a missing pg dependency must recommend installing pg, while a missing workspace build artifact must retain the existing pnpm install && pnpm build remedy. Also keep the existing connection-failure message unchanged for genuine connection errors such as ECONNREFUSED.

  3. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 12 · 2026-10-20T15:33Z
    Session: session_011TdZ8GjixNZFLz1xJD9zzK
    Account: os-justin (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24909-missing-driver-peer-remedy
    Worktree: objectstack-issue-24909
    Domain: domain:services
    Seat: domain:services#1
    File surface: packages/services/service-datasource/src/connect-failure-remedy.ts (UNBUILT_WORKSPACE_REMEDY, isUnbuiltWorkspaceFailure, connectFailureRemedy and their module note), their pins in service-datasource/src/__tests__/, a new pin on the real boot-refusal path, content/docs/data-modeling/drivers.mdx only if a quoted refusal text changes, and one new .changeset/24909-*.md. ⛔ Not packages/types/** (isModuleNotFoundError is shared with the CLI's optional-plugin guards; a change there is a fork to report), ⛔ not packages/spec/**, ⛔ not packages/drivers/**, ⛔ no change to when boot is refused, the thrown error type or the OS_ALLOW_DRIVER_CONNECT_FAILURE path (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/main 94842bad2a. Comment 6292687799 is an outside suggestion. The dev reads it as a proposal; measurement decides.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  5. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-20T16:37Z, on claim 6294662022 (branch claude/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/runtime row (:245) and the paragraph under it (:251–253).

    Seat rulings on the report's open questions:

    • 1 (the install wording): C, as shipped.
    • 2 (a missing optional @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

  6. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    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\ncontent/docs/getting-started/your-first-project.mdx: only the package table's @objectstack/runtime row 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 installs driver-mongodb as an optional dependency.\n - SQLite (the default) needs nothing more.\n - MongoDB needs only OS_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 of driver-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 published create-objectstack@18.0.0 scaffold (pnpm-installed, outside any workspace) and on the 18.0.0 npm manifests:\n\n- @objectstack/runtime@18.0.0: dependencies driver-sql, driver-memory, driver-sqlite-wasm; optionalDependencies driver-mongodb; optional peer driver-turso. The workspace head has the same edges.\n- @objectstack/cli@18.0.0: dependencies driver-sql, driver-memory, driver-mongodb, driver-sqlite-wasm; optional peer driver-turso.\n- @objectstack/driver-mongodb@18.0.0 depends on mongodb. @objectstack/driver-sql@18.0.0 has optional peers pg and mysql2 and the optional dependency better-sqlite3.\n- In the scaffold, driver-mongodb, driver-sqlite-wasm and driver-sql resolve from service-datasource, and mongodb resolves from driver-mongodb. pg and mysql2 do not resolve.\n- os dev with no database flag: "Server is ready" on SqlDriver(better-sqlite3), and GET /api/v1/discovery answered 200. The server was stopped afterwards.\n- os dev -d mongodb://127.0.0.1:1/db: exit 1 on connect ECONNREFUSED 127.0.0.1:1 with 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 carries driver-mongodb as an optionalDependency, which is installed by default and skipped under --omit=optional.\n\nThe changeset is unchanged: content/docs/** publishes nothing, and the existing patch changeset covers the code.\n\nGates on head 907bd42fdb, 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-authoring among them) were re-run, each under the lock. All exit 0 once the lint, formula and client-react closures were built. Before those builds, 4 had exited 3 (prerequisite). The derived link family is check:doc-anchors, exit 0; CI's lychee lane is Check 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

  7. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24933 comment 6296918083 · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-20T17:27Z


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 · session_011TdZ8GjixNZFLz1xJD9zzK · 2026-10-20T18:05Z

    reading result
    PR #24933 timeline added_to_merge_queue 2026-10-20T17:32Z → merged 2026-10-20T18:05Z
    origin/main by content squash ea08ce584c (one parent, e7befa7700). In connect-failure-remedy.ts, OPTIONAL_DRIVER_CLIENT_PACKAGES is ['pg', 'mysql2', 'better-sqlite3']
    closing references the PR body closes #24909 only

    State change in this stroke: pm:dispatched off and the assignee cleared. The card closed completed on the merge.

    What changes for users:

    • A datasource whose database client is not installed is now refused with the install of that client (npm install pg, with the pnpm and yarn spellings), not with "Run pnpm install && pnpm build".
    • The getting-started page now says Postgres and MySQL need their client installed.
    • Unchanged: the unbuilt-workspace case and every other connect failure (ACCEPT 6296918083).

    Follow-up: #24937 (a missing optional @objectstack/driver-* package, ruled B). It is unlabelled, for triage.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:servicespriority:p1High: required for production / M2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions