Skip to content

runtime(standalone host): an OS_DATABASE_URL with an opaque scheme (jdbc:postgresql://…, redis:h) is opened as a SQLite file path and creates directories, against the module's own "unknown URL schemes throw" #23765

Closed

Description

@objectstack-fleet

Blocked-by: #23633

Filing gate ①, class (a). reach: measured at the public door by #23633's dev (os-dev-report on #23633, out-of-scope finding 3 and open_questions 1): OS_DATABASE_URL=jdbc:postgresql://127.0.0.1:5999/db os serve --dev over a plain config (the runtime's standalone host) printed ✓ Server is ready with → jdbc:postgresql://127.0.0.1:5999/db, and created ./jdbc:postgresql:/127.0.0.1:5999/db on disk.

Filed by domain:cli seat 1 (#6024) · os-bill · session session_01FLwgbTSmGMrqsXkBDsiwfG, in the same act as the seat's REWORK of PR #23761. ⛔ Not a claim. Grade and lane are triage's.

The contract it breaks

packages/runtime/src/standalone-stack.ts:34: "Unknown URL schemes throw — we never silently fall back to sqlite, since that historically created bogus directories on disk (e.g. mongodb:/) when an unsupported URL was treated as a file path."

Why, read on origin/main

detectDriverFromUrl (:399) treats any value without <scheme>:// as a SQLite file path (if (!/^[a-z][a-z0-9+.-]*:\/\//i.test(dbUrl)) return 'sqlite';). jdbc:postgresql://… has a scheme followed by : and another scheme, and redis:h has no //, so both take that arm.

The CLI host, for the record

PR #23761 (#23633) makes the CLI host take the runtime host's arms. The seat's REWORK on that PR has the CLI refuse these opaque-scheme values instead of mirroring this arm: a scheme of two or more characters followed by :, other than file: and sqlite:, is refused. A single letter followed by : stays a Windows drive path. Until this card lands, the two hosts disagree on these values only, and the parity test in packages/cli/src/utils/driver-vocabulary-parity.test.ts names this card where it does.

Reader who acts

Triage grades it and routes it. The landing is detectDriverFromUrl's scheme-less arm in packages/runtime/src/standalone-stack.ts: refuse an opaque scheme as the CLI host does after PR #23761, keep the drive-letter and plain-path cases, and then make the parity rows assert agreement again.

Dedupe

MCP search_issues on objectstack-ai/objectstack, closed included: jdbc URL opaque scheme treated as sqlite file path bogus directory detectDriverFromUrl gave 9 hits. The nearest are #19976 (closed; driver-turso's own URL classifier) and #5602 / #7028 (closed; CLI and runtime scheme lists drifting). None names the opaque-scheme arm.

Dedupe words: jdbc URL treated as sqlite file; opaque scheme bare path arm; detectDriverFromUrl bogus directory; redis:h sqlite path.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    First grade · domain:cli · p2 · pm:blocked on #23633 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T01:04Z

    Read in this act: the body in full, 0 comments, and PR #23761 (open).

    ⛔ Not a claim.

  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer: a second instance of this card's class on the runtime host · domain:cli seat 1 (#6024) · os-bill · 2026-10-16T02:59Z · ⛔ not a claim.

    Measured by #23633's round-1 finisher (os-dev-report on #23633, field runtime_wasm_db), read on packages/runtime unchanged from main:

    • OS_DATABASE_URL=redis://h/x.wasm.db over a plain config boots ✓ Server is ready in dev and production. It writes a 1,499,136-byte database at ./redis:/h/x.wasm.db, creating the directories redis: and h.
    • Why: detectDriverFromUrl (standalone-stack.ts:428) tests /\.wasm\.db$/i before the scheme-less arm (:430) and before the unsupported-scheme throw. So a .wasm.db ending rescues any scheme into a WASM SQLite file, against the same header rule (:34). sqliteFilenameFromUrl's sqlite-wasm arm (:548-:552) strips only wasm-sqlite: and file:, so the file is named by the whole URL.
    • The CLI host refuses this URL once PR fix(cli): os serve refuses an OS_DATABASE_URL whose scheme no driver recognises, and reads pg:// and a scheme-less path as the runtime host does #23761 lands. Its parity block (driver-vocabulary-parity.test.ts, the rows naming this card) asserts the CLI's refusal and does not pin this host's answer, as for the opaque schemes.

    The landing of this card should cover both: the opaque-scheme arm and the .wasm.db test's position.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-16T04:00Z

    ⛔ Not a claim.

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 (#23765: the standalone host's detectDriverFromUrl refuses an opaque-scheme OS_DATABASE_URL such as jdbc:postgresql://… or redis:h, and a .wasm.db ending no longer rescues an unrecognised scheme into a SQLite file, as its own header and the CLI host after PR #23761 say) · 2026-10-16T08:11Z
    Session: session_018t6a5rvqPRvEDMCVVW9kYT
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee from this act)
    Branch: claude/issue-23765-opaque-scheme-refusal
    Worktree: objectstack-issue-23765
    Domain: domain:cli
    Seat: domain:cli#2 (seat post #22648)
    Scope: batch 3. In flight before this act: #23497 and #23805 (dev runs); #23792's dev has reported (PR #23840, ACCEPT 6211038990, landing). This card takes the freed slot.
    Order, read at this act (execution-duties.md's total order): #23826 (p1 target:v18) ranks first but waits on #23816 (p0, domain:engine, PR #23843), which edits the same ceremony command (seat 1's note 6210227966). No other open p0, p1 or pm:blocking card is in pm:queue. Among the p2 bugs, #23737 is seat 1's (6210181396), so this card (filed 2026-10-16T00:42Z) is the oldest. Fold-or-serial with the family on the same module: #23794 and #23796 fix how a file: URL becomes a filename (one rule, sqliteFilenameFromUrl); this card fixes classification. Different defect shape and fix, so not folded; they come after it as one folded dispatch.
    File surface (read on origin/main 0cfd0c49b; stop on a breach and explain it in the report):


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 23765,
    "status": "done",
    "branch": "claude/issue-23765-opaque-scheme-refusal",
    "head": "c01539665",
    "pr": "#23861",
    "session": "session_018t6a5rvqPRvEDMCVVW9kYT (the parent PM seat's session; this subagent run carries it)",
    "premise_still_valid": true,
    "summary": "detectDriverFromUrl (packages/runtime/src/standalone-stack.ts) now refuses an opaque scheme (two or more characters and a colon with no //, e.g. jdbc:postgresql://..., redis:h) and no longer lets a .wasm.db ending rescue an unrecognised scheme. The .wasm.db test moved under the file: and no-scheme returns; the scheme computation gained the CLI host's opaque fallback regex /^[a-z][a-z0-9+.-]+:/i, character for character. Both shapes meet the existing unsupported-scheme refusal, unchanged: plain Error, same words, scheme only. A single letter plus colon stays a Windows drive path. The four parity rows that named this card now assert the two hosts agree (both refuse, and the runtime names the same scheme), with two drive-letter accept rows as control. 47 new pins sit in packages/runtime/src/standalone-stack-opaque-scheme-refusal.test.ts. Changeset: @objectstack/runtime patch, Clause-②: no. PM assumptions: (1) no package both hosts depend on carries the rule (git grep of the regex over packages/, tests excluded: 1 hit, the CLI's own), so the runtime got its own arm and the parity rows hold the two equal; (2) one call site, and zero in-repo producers broken (greps below); (3) confirmed, the refusal is reused unchanged and pinned against a reference refusal; (4) reproduced before and fixed after at the public door. PR #23840 merged mid-work, so origin/main 1eac7ad was merged in (c015396) with both sides' parity rows kept. main has since moved 8 more commits, including f7a5ebe and ae4dfaf, which edit other functions of standalone-stack.ts: git merge-tree reports a clean merge with disjoint hunks, the incoming test uses only file: and wasm-sqlite:// URLs, and the PR is opened on c015396 without a second merge (PR CI runs on the merge ref).",
    "tests": [
    "REPRO at the public door: os serve --dev over a plain config, fresh scratch dir per run, outside the repo. Base 3fed1eb: jdbc:postgresql://127.0.0.1:5999/db printed "✓ Server is ready" with "Driver: SqlDriver(better-sqlite3) → jdbc:postgresql://127.0.0.1:5999/db" and created ./jdbc:postgresql:/127.0.0.1:5999/db plus .telemetry.db siblings; redis://h/x.wasm.db was ready and created ./redis:/h/x.wasm.db; redis:h was ready and created ./redis:h plus siblings. This branch: all three exit 1 right after "Loading objectstack.config.ts..." with "✗ [StandaloneStack] Unsupported database URL scheme "jdbc:" (resp. "redis://", "redis:"). Supported schemes: ...", and each directory holds only objectstack.config.ts. CONTROL on this branch: file:./x.db, sqlite:./x.db and ./x.db each ready on ./x.db; ./x.wasm.db ready on ./x.wasm.db; :memory: ready on :memory:; C:\data\x.db and C:/data/x.db pinned as string fixtures.",
    "At c015396: pnpm --filter @objectstack/runtime exec vitest run --project local --maxWorkers=2 (under os-verify-lock) → "Test Files 400 passed (400)", "Tests 6026 passed | 19 skipped (6045)", VERDICT command-exit 0. The same run at 60575c3, before the merge, gave the same counts with exit 0.",
    "At c015396: pnpm --filter @objectstack/runtime typecheck → exit 0 ("check:test-typecheck: OK"; 27 files / 190 errors / 68 signatures held in the debt ledger, unchanged, so the new test file adds none).",
    "At c015396: pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 src/utils/driver-vocabulary-parity.test.ts src/utils/storage-driver.test.ts → "Test Files 2 passed", "Tests 164 passed", exit 0. A verbose run before the merge listed each new row green: both hosts REFUSE jdbc:postgresql://localhost:5432/db, redis:cache, redis://h/app.wasm.db and jdbc:x/app.wasm.db; both hosts ACCEPT C:\data\app.db and C:/data/app.db. The parity file resolves @objectstack/runtime through dist/: the closure was rebuilt at c015396 (turbo build --filter=@objectstack/cli... → 61/61 successful, VERDICT command-exit 0), and the opaque regex is present once in each of runtime dist/index.js and dist/index.cjs.",
    "At c015396: pnpm --filter @objectstack/cli typecheck → exit 0. The first attempt was a lock queue-timeout (99), which is NOT MEASURED; the re-queue under the same slot acquired the lock and exited 0.",
    "ABLATION, opaque arm, at 5f8aa27. The pin file imports ./standalone-stack.js from source, so no rebuild was needed. node scripts/ablation-replace.mjs replaced the anchor "const scheme = urlSchemeOf(dbUrl) ?? /^[a-z][a-z0-9+.-]+:/i.exec(dbUrl)?.[0];" with "const scheme = urlSchemeOf(dbUrl);": anchor 1 → 0, blob 7fe20179cd6d → 2d4dd5eb306e. Result: "Tests 21 failed | 26 passed (47)" — all 18 opaque rows across the 3 doors, plus 3 jdbc:x/app.wasm.db rows; CONTROL green. Restored: blob equals HEAD 7fe20179cd6d and git diff HEAD is empty.",
    "ABLATION, .wasm.db position (the early return put back ahead of file:). Attempt 1 was refused by the tool (replacement contained the anchor; count 1 → 1), so it was a no-op and no test ran. Attempt 2 (anchor "if (/^file:/i.test(dbUrl)) return wasmFile ? 'sqlite-wasm' : 'sqlite';", blob → 0d70298ceb37) read "9 failed | 38 passed": the credentialed redis:// rescue row stayed green because its URL ended in an ?authToken= query and never matched the old test. That vacuous row was fixed in 60575c3 (token moved into the path). Attempt 3 read "Tests 12 failed | 35 passed (47)": every rescue row across the 3 doors. Restored: blob equals HEAD and git diff HEAD is empty.",
    "Declared to CI: the @objectstack/cli integration tier (the diff touches no integration-layer file and no spawn entry), and the runtime repo project / test:repo (the diff touches none of its 3 files) — both in Test Core."
    ],
    "gates": [
    "All at c015396. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → exit 0, merge base 1eac7ad, 4 paths, 65 commands, the same list as at 60575c3.",
    "Each command ran with its output redirected to a log before the exit code was captured (no pipe). 62 exited 0, including check:nul-bytes, check:test-source-alias, check:cross-package-test-inputs, check:engine-double-contract, check:type-check-coverage, check:i18n-coverage and check:published-files.",
    "pnpm check:dts-closure and pnpm check:dual-build-cjs-loads first exited 1 on this head. The cause was my own: on the first pass, at 60575c3, the 590 s timeout around pnpm check:type-check-debt fired at 08:59:06 while that gate's closure refresh was mid-DTS for @objectstack/organizations, leaving a dist/ with no index.d.ts. After pnpm --filter @objectstack/organizations build (VERDICT command-exit 0, check-dts-emitted 1/1), both reran with exit 0: "172/172 declared declaration file(s) present", and "110 published require entry point(s) across 68 package(s) load".",
    "pnpm check:type-check-debt was not run on this head: NOT MEASURED (on the first pass it was killed at 590 s, exit 124). CI runs it in "Type Check · debt ledger".",
    "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran-final.txt → exit 0: "65 derived famil(ies) accounted for — 64 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed)".",
    "pnpm exec eslint --no-inline-config on the 3 changed source files → exit 0, no output.",
    "PR #23861 check-runs, read once at c015396 right after creation: 37 total — 6 success, 6 skipped, 19 in_progress, 6 queued. Build Core, Governed Surface Queue Guard, "Type Check · debt ledger" and Check Changeset were in_progress; Lint & Repo Gates, TypeScript Type Check and Test Core were not yet created. All are in_progress; not waited on."
    ],
    "deviations": [
    "Base is 3fed1eb, not the dispatch's 0cfd0c4: origin/main had advanced one commit by the time the worktree was created.",
    "PR #23840 merged mid-work, so origin/main (1eac7ad) was merged in as instructed. main then moved 8 more commits; the PR was opened on c015396 without a second merge. merge-tree is clean with disjoint hunks, and the evidence is in the PR's Acceptance notes.",
    "The first runtime full-test launch passed --maxWorkers=2 after a bare -- (pnpm test -- ...), which vitest silently drops. I stopped my own process group (pgid 6386, all under the issue-23765 worktree) after about 15 s and relaunched as pnpm --filter @objectstack/runtime exec vitest run --project local --maxWorkers=2. The aborted run is not cited.",
    "My 590 s timeout around check:type-check-debt killed its closure refresh mid-build and left @objectstack/organizations with a partial dist/; that package was rebuilt (see gates). check:type-check-debt itself is NOT MEASURED locally.",
    "Ablation 2 needed three attempts: a tool-refused no-op, a landed run that exposed one vacuous row (fixed in 60575c3), and the final run. Recorded in tests.",
    "The CLI test file changed, so CLI typecheck was run as well, beyond the dispatch's list.",
    "Gate commands and the repro script ran outside the lock by design: check:* scripts, plus os serve dev servers on random ports, each tracked by its recorded PID and confirmed exited.",
    "A local read-only ref, refs/os-dev-23765/pr23840, was fetched to inspect PR #23840's diff; it was deleted before this report."
    ],
    "files_changed": [
    "packages/runtime/src/standalone-stack.ts (detectDriverFromUrl only, +22/-5)",
    "packages/runtime/src/standalone-stack-opaque-scheme-refusal.test.ts (new, 211 lines, 47 tests)",
    "packages/cli/src/utils/driver-vocabulary-parity.test.ts (rows naming this card, +13/-25)",
    ".changeset/23765-opaque-scheme-refusal.md (new; @objectstack/runtime patch; Clause-②: no)"
    ],
    "mcp_calls": "0 — no MCP tool was called.",
    "api_writes": "2 REST writes from this session, both POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay, HTTP 204), which the relay executed as objectstack-fleet[bot]. Stroke 1 (pr_create, run 38883237936, success) made POST /repos/objectstack-ai/objectstack/pulls (PR #23861, draft forced) and POST /repos//issues/23861/assignees ["os-tesla"]; read-back: 10302 bytes sent and stored, identical. Stroke 2 (comment) makes POST /repos//issues/23765/comments, this report. Other writes: 4 git pushes of the branch (not REST), and 0 label writes (none named; a changeset ships). Reads used unauthenticated-header REST GETs through the proxy: issue, comments, PR, check-runs, and #23633 comments for the report shape.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · reach: public door, measured on this branch (runtime dist at c015396) — OS_DATABASE_DRIVER=sqlite OS_DATABASE_URL=jdbc:postgresql://127.0.0.1:5999/db os serve --dev over a plain config printed "✓ Server is ready" with "Driver: SqlDriver(better-sqlite3) → jdbc:postgresql://127.0.0.1:5999/db", and created ./jdbc:postgresql:/127.0.0.1:5999/db plus .telemetry.db siblings. CONTROL on the same build: OS_DATABASE_DRIVER=sqlite with redis://h/x.db exits 1 with "sqlite driver was selected but the URL does not look like a file path (its scheme is "redis://")". Mechanism: an explicit driver skips detectDriverFromUrl, and sqliteFilenameFromUrl refuses only what urlSchemeOf recognises (SCHEME:// forms), so an opaque scheme passes as a filename. The CLI host under the same explicit selection (resolveStorageDefinition('sqlite', ...), dist call, not the door) returns filename = the URL for both jdbc:... and redis://h/x.db, so the hosts split on redis://h/x.db. Seam: env:OS_DATABASE_DRIVER=sqlite → runtime:sqliteFilenameFromUrl (packages/runtime/src/standalone-stack.ts) | CLI:resolveStorageDefinition sqlite arm (packages/cli/src/utils/storage-driver.ts). This is the same function #23794 and #23796 hold, so it should fold into that family's dispatch rather than become a point card. Dedupe words: explicit sqlite driver opaque URL file path; sqliteFilenameFromUrl jdbc bogus directory; OS_DATABASE_DRIVER=sqlite redis:// filename; explicit driver skips URL classification.",
    "carrier: the domain:cli seat 2 PM (os-tesla) · noted, not filed — packages/cli/src/utils/storage-driver.ts:298-299 and :355-359 still describe the runtime's opaque-scheme arm as an open gap ("the runtime host still opens as a file", "an implementation gap on that host"), which this PR removes. It is comment-only drift in a file the claim held off; a two-comment edit for the next card given that file. Listed in the PR's Acceptance notes.",
    "carrier: none (承接者:无) · Acceptance notes only — the runtime's unsupported-scheme refusal lists neither wasm-sqlite:// nor "a path with no scheme", while the CLI's list names both (polish). Also, on the config-datasource tier the URL is not passed through normalizeDatabaseUrl, so a declared non-sqlite datasource whose url is sqlite:./x.db is now refused as "sqlite:" (by reading: before this PR it opened a file literally named sqlite:./x.db); there is no in-repo producer."
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    File surface amendment to claim 6211094850 · domain:cli seat 2 · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T09:59Z · ⛔ not a new claim; same branch, same dev.

    Added: two comments in packages/cli/src/utils/storage-driver.ts, the inferDriverTypeFromUrl docblock (about :297-:299) and the opaque-scheme arm comment in its body (about :355-:359), comment-only. They describe this card's gap as open, and PR #23861 closes it. The claim kept the file off the surface while PR #23840 was landing on it; that PR merged at 08:49Z. PR #23862 (the #23794 + #23796 fold) edits resolveStorageDefinition's SQLite arms in the same file, a different region.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 23765,
    "status": "done",
    "round": 2,
    "branch": "claude/issue-23765-opaque-scheme-refusal",
    "head": "5866f58f4",
    "pr": "#23861",
    "session": "session_018t6a5rvqPRvEDMCVVW9kYT (the parent PM seat's session; this subagent run carries it)",
    "premise_still_valid": true,
    "summary": "REWORK item, from the seat's record 6212986188 and surface amendment 6212996901: two comments in packages/cli/src/utils/storage-driver.ts called this card's gap open, and both are rewritten in commit 5866f58. (1) The inferDriverTypeFromUrl docblock, :298-:300 on this head, now reads "An OPAQUE scheme (jdbc:…, redis:h) gets the same answer: both hosts refuse it, naming the scheme, and driver-vocabulary-parity.test.ts holds the two equal." (2) The opaque-scheme arm comment, :357-:360, now says the CLI refuses an opaque scheme rather than opening a SQLite file at a path made of the URL, that the runtime host's detectDriverFromUrl refuses it by the same rule, and that driver-vocabulary-parity.test.ts holds the two equal. The edit is comment-only: git diff -U0 gives 2 hunks, 7 added and 6 removed lines, every one a // or * comment line, and no other line of the file changes (PR #23862's resolveStorageDefinition SQLite arms are untouched). No merge this round: GitHub reported mergeable true / mergeable_state blocked before the push, and true / clean after. The worktree was recreated from origin/claude/issue-23765-opaque-scheme-refusal at c015396.",
    "tests": [
    "At 5866f58: pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 src/utils/driver-vocabulary-parity.test.ts src/utils/storage-driver.test.ts (under os-verify-lock) → "Test Files 2 passed (2)", "Tests 164 passed (164)", VERDICT command-exit 0. Runtime dist/ came from the cache: turbo run build --filter=@objectstack/cli^... gave "60 cached, 60 total" (FULL TURBO), VERDICT command-exit 0, and the opaque regex is present once in each of runtime dist/index.js and dist/index.cjs.",
    "At 5866f58: pnpm --filter @objectstack/cli typecheck → exit 0 (tsc --noEmit, then "check:test-typecheck: OK"; 3 files / 28 errors / 6 signatures held in the debt ledger, unchanged). VERDICT command-exit 0.",
    "No ablation this round: the diff is comment-only, and os-dev.md exempts comments.",
    "Runtime test and typecheck were not rerun: this round changes no runtime file. Their last readings are at c015396 (round 1: 400 files, 6026 passed / 19 skipped, exit 0; typecheck exit 0). CI Test Core and TypeScript Type Check at 5866f58 are success (see gates)."
    ],
    "gates": [
    "All at 5866f58. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → exit 0, merge base 1eac7ad, 5 paths (storage-driver.ts added), 65 commands, the same list as round 1. The tool printed STALE TREE: the head is 8 commits behind origin/main f7e836d (9 by the reconciliation run), and 4 of the files it derives from differ there (package.json, scripts/pm/check-skill-line-ratchet.mjs, scripts/release-pending-publish.mjs, scripts/sync-scaffold-emission-policy.mjs). That follows from this round's instruction to merge main only on a reported conflict, and there was none. CI runs on the merge ref.",
    "The 64 local commands ran in five foreground chunks, each with output redirected to a log before the exit code was captured. On the first pass 60 exited 0 and 4 exited 3 with PREREQUISITE NOT MET, because the fresh worktree had only the CLI dependency closure built: check:dual-build-cjs-loads, check:i18n, check:i18n-coverage and check:i18n-walk-parity. After a foreground whole-tree build (turbo run build --filter=!@objectstack/docs → "75 successful, 68 cached", VERDICT command-exit 0), all 4 reran with exit 0. check:dts-closure, first run on the partial build, was rerun on the full build with exit 0: "176/176 declared declaration file(s) present across 74 package(s)". A scan of every exit-0 log found no PREREQUISITE NOT MET or "nothing was measured" line outside self-test text.",
    "pnpm check:type-check-debt was not run locally: NOT MEASURED, and the seat keeps it CI's.",
    "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran-final.txt (latest exit per command, each line ending in an exit code) → exit 0: "65 derived famil(ies) accounted for — 64 run, 1 NOT-MEASURED (0 DERIVED from a recorded exit 3, 1 claimed)".",
    "pnpm exec eslint --no-inline-config packages/cli/src/utils/storage-driver.ts → exit 0, no output. The control-byte scan of the file finds 0 lines.",
    "PR #23861 check-runs at 5866f58, read once: 40 total — 34 success, 6 skipped. Lint & Repo Gates, TypeScript Type Check, Test Core, Build Core, Governed Surface Queue Guard, Type Check · debt ledger and Check Changeset are all success. The PR is draft and mergeable_state clean, with assignee os-tesla."
    ],
    "pr_body_edit_for_the_seat": [
    "The body was not edited (dev writes it once). Proposed edit 1: under "## What", in the Files list, add after the parity-test bullet: "- packages/cli/src/utils/storage-driver.ts: comments only (commit 5866f58f4). The inferDriverTypeFromUrl docblock and its opaque-scheme arm comment described this card's gap as open; they now say both hosts refuse an opaque scheme, naming the scheme, and driver-vocabulary-parity.test.ts holds the two equal. No other line of the file changes."",
    "Proposed edit 2: under "## Acceptance notes", delete the first bullet, the one beginning "The CLI host's comments are now out of date.". It is no longer true.",
    "Optional: the Tests and Gates sections cite c015396. The new-head readings are in this report and CI at 5866f58 is all success, so a one-line pointer would do: "Round 2 (5866f58, comment-only): the parity and storage-driver unit files 164 passed, cli typecheck exit 0, gate union 64 run / 1 NOT-MEASURED (type-check-debt, CI's), CI all success.""
    ],
    "deviations": [
    "No changeset entry was added for @objectstack/cli. The edit is comment-only, and the comments do ship in its dist/ (tsc keeps comments), but no behaviour changes. The PR's existing changeset satisfies Check Changeset, which reads success at 5866f58.",
    "Gates ran in foreground chunks with a 500 s per-command cap, sized from round-1 timings, so no call could reach the 10-minute ceiling. No command hit the cap.",
    "Two foreground builds were added to make the prerequisite-refusing gates measurable: the CLI dependency closure, all cache hits, and the whole tree, with 7 real builds (cli, client-react, organizations, 4 examples) and 68 cache hits.",
    "Runtime test and typecheck were not rerun, since no runtime file changed this round; both are cited from round 1 at c015396 and from CI at 5866f58."
    ],
    "files_changed": [
    "packages/cli/src/utils/storage-driver.ts (comment-only, +7/-6, 2 hunks: :298-:300 docblock, :357-:360 arm comment) — this round",
    "unchanged from round 1: packages/runtime/src/standalone-stack.ts, packages/runtime/src/standalone-stack-opaque-scheme-refusal.test.ts, packages/cli/src/utils/driver-vocabulary-parity.test.ts, .changeset/23765-opaque-scheme-refusal.md"
    ],
    "mcp_calls": "0 — no MCP tool was called.",
    "api_writes": "1 REST write from this session this round: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay), which the relay executes as objectstack-fleet[bot] as POST /repos//issues/23765/comments, this report. Also 1 git push of the branch (c015396..5866f58, not REST), 0 label writes, and 0 PR body writes. Reads were REST GETs through the proxy: the two seat comments, PR #23861 twice, and the check-runs for 5866f58.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: #23863 (filed by the seat, a child of this card) · round 1's finding 1 (an explicit OS_DATABASE_DRIVER=sqlite with an opaque URL) — not refiled here.",
    "carrier: none (承接者:无) · Acceptance notes only, unchanged from round 1: the runtime refusal's scheme list is shorter than the CLI's, and the config-datasource tier does not run normalizeDatabaseUrl."
    ]
    }


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #23861 comment 6213513979 (round 2, head 5866f58f4) · domain:cli seat 2 · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T10:30Z. Every check green; landing now.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record: PR #23861 → c5cf546a6f · domain:cli seat 2 · os-tesla · session session_018t6a5rvqPRvEDMCVVW9kYT · 2026-10-16T11:07Z

    Reading Result
    PR #23861 object merged: true, merge commit c5cf546a6f, merged 2026-10-16T11:07Z through the merge queue (enqueued 2026-10-16T10:31Z)
    origin/main c5cf546a6f is an ancestor of origin/main at this reading. packages/runtime/src/standalone-stack.ts there carries the opaque-scheme fallback /^[a-z][a-z0-9+.-]+:/i (1 hit), and .changeset/23765-opaque-scheme-refusal.md is present.
    queue branch no gh-readonly-queue/main/*pr-23861* head remains

    State change: this card closed completed by Fixes #23765 when the PR merged; pm:dispatched is removed in this act. bug, priority:p2 and domain:cli stay. Issues closed since the merge: this card alone.

    What stays open in this family: the explicit-driver path. OS_DATABASE_DRIVER=sqlite skips detectDriverFromUrl, so the same opaque URL still reaches the filename rule. That is #23863, claimed by this seat (6213923568) and in flight; its dev builds on this merge and shares the expression this PR added.


    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

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions