Skip to content

fix(driver-turso)!: refuse timeout beside an UPPERCASE WSS:// url in forced remote mode - #16848

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-16637-turso-uppercase-ws-scheme-timeout
Sep 8, 2026
Merged

fix(driver-turso)!: refuse timeout beside an UPPERCASE WSS:// url in forced remote mode#16848
os-zhuang merged 2 commits into
mainfrom
claude/issue-16637-turso-uppercase-ws-scheme-timeout

Conversation

@os-musk

@os-musk os-musk commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Fixes #16637

Folds case in ridesWebSocketTransport alone — the triage ruling's option (b), and only (b). TursoDriver.detectMode is not touched.

Clause-②: yes

Deliverable 1 — the expandConfig reading REPRODUCES

Triage recorded that the card's case-folding reading was a single execution it had not re-run (the package was not in its node_modules). Re-run here against @libsql/core@0.17.4, resolved out of this worktree's own install:

@libsql/core version: 0.17.4
"WSS://db.example.turso.io" -> scheme = "wss"
"Ws://127.0.0.1:8080"      -> scheme = "ws"
"wss://db.example.turso.io" -> scheme = "wss"
"HTTPS://db.example.turso.io" -> scheme = "https"
"LIBSQL://db.example.turso.io" -> scheme = "https"

The premise holds. The mechanism is one line — lib-esm/config.js: const originalUriScheme = uri.scheme.toLowerCase(); — and the last two rows are the control that makes the first two a reading rather than a coincidence: the same call observably answers something other than the input's own letters.

And the chain that makes it reachability rather than trivia, read on this tree: @libsql/client@0.17.4's node entry is _createClient(expandConfig(config, true)), and only then if (config.scheme === "wss" || config.scheme === "ws") return _createWsClient(config). So the switch that matches the literal lowercase never sees the original casing.

⭐ This is the correction triage carried forward from the director seat's review note on the earlier card. The observation "the switch matches the literal lowercase" is true and survives re-checking; the conclusion drawn from it — that an uppercase url cannot reach the WebSocket arm — is false, because a step upstream of the switch was missed. Nothing in this PR reasons from that switch to reachability.

Red before, green after — both legs, measured

Same pin file, same command, same box. The only difference between the two columns is the two-line body of ridesWebSocketTransport.

before the fix after the fix
vitest summary 6 failed, 14 passed (20) 0 failed, 20 passed (20)
new TursoDriver({ url: 'WSS://…', mode: 'remote', timeout: 30000 }) constructs, transportMode: 'remote', no envelope to read throws VALIDATION_ERROR / 400

The six red assertions before the fix were exactly the refusal ones, and all fourteen controls were already green — which is what makes the green column mean "the corner was closed" rather than "that combination never reached there anyway":

× WSS:// + explicit remote + timeout is refused as VALIDATION_ERROR / 400
× Wss:// + explicit remote + timeout is refused as VALIDATION_ERROR / 400
× WS://  + explicit remote + timeout is refused as VALIDATION_ERROR / 400
× Ws://  + explicit remote + timeout is refused as VALIDATION_ERROR / 400
× is the SAME message the lowercase refusal produces, differing only in the echoed scheme
× createTursoDriver() is the same constructor, and refuses the same pair
Tests  6 failed | 14 passed (20)

The explicit mode: 'remote' is load-bearing and stays in the repro: without it an uppercase url falls through detectMode to 'local', which is pre-existing behaviour and out of scope here.

Reverse verification, re-run from the committed state (so the numbers come off a tree that really contains the implementation). Direction predicted before running: the six refusal cases go red, all three controls stay green.

HEAD blob for packages/drivers/driver-turso/src/turso-driver.ts = 7527c78a1af256255735f5fc2a764ada3d3bcbd2
ablation anchor matched exactly once; written
ON-DISK PROOF: injected-literal count = 1 (expect 1) ; deleted-literal count = 0 (expect 0)
mutated blob beb6b9b10e72e6c2b4b3d79256a9671f30e6dfb6 != HEAD blob 7527c78a1af256255735f5fc2a764ada3d3bcbd2 : yes
=== ABLATION RUN (no rebuild: if resolution were dist-mediated this would stay GREEN) ===
Tests  6 failed | 14 passed (20)
RESTORE OK: hash 7527c78a1af256255735f5fc2a764ada3d3bcbd2 == HEAD blob, git diff HEAD empty

Two notes on that block. The mutation was proved to reach disk by counting the injected and the deleted text separately, plus a blob-hash change — an editor's exit code proves nothing. And the ablation going red without a rebuild is itself the evidence that this suite resolves its subject through src and not through the package's built dist/, so the dist-preflight hazard has no purchase here; that was measured, not assumed. The restore leg is proved by hash equality against the HEAD blob together with an empty git diff HEAD, never by an exit code.

The three negative controls, all measured

  1. detectMode is completely unchanged. WSS://, Ws://, HTTPS:// and LIBSQL:// with no explicit mode still detect as 'local', with and without a timeout. ⚠️ Worth flagging: the ruling states turso-driver.test.ts already pins this. On this tree it does not — that file pins only :memory: and file: for local, and a repo-wide search finds no test anywhere asserting the uppercase fall-through. So the control is now written down rather than assumed; without it, an accidental option (a) in a later PR was more likely than the ruling supposed, not less.
  2. The existing lowercase refusals still fire. turso-driver-ws-timeout-refusal.test.ts is green unchanged, and the two lowercase cases are repeated in the new file as the immediate neighbour of the widened predicate.
  3. https:// remote + timeout is still ACCEPTED — in every casing (https://, HTTPS://, Https://, LIBSQL://, HTTP://), plus timeout: 0 and the no-timeout case on an uppercase WebSocket url. An implementation that refused timeout on every remote would have turned the red-to-green leg green while deleting the whole option; these controls are what forbid it.

The deliberate inconsistency, written into the code

Triage item 3, verbatim as it now stands on ridesWebSocketTransport:

⚠️ DELIBERATE INCONSISTENCY, and it is deliberate: TursoDriver.detectMode matches the same two schemes CASE-SENSITIVELY and is left that way. Folding case there as well would delete its uppercase → 'local' fall-through — a mode-detection change on a published driver that predates this refusal entirely and is out of scope here; it must be argued on its own, not slipped in as a tidy-up. So the two readers of one url disagree on purpose: this one answers "does the WINDOW reach anything", detectMode answers "which transport is this", and only the first question is settled by the scheme the libsql client will actually route on. ⛔ Do not "unify" them without that argument.

Fossil read before the guard moved, and what it said

ridesWebSocketTransport was itself put there by the earlier PR, and its docblock ended:

So these two spellings are the whole population that reaches the WebSocket arm from this driver.

That sentence is the falsified claim — the same missed-upstream-step conclusion, recorded in the code. It does not say the case-sensitivity is deliberate and give a reason, so the fossil does not outrank this order; it is an instance of the very error the order warns about. It is corrected in place, in the docblock of the function being changed, because leaving a sentence that asserts the opposite of the new code would be worse than writing no comment at all.

The neighbouring contract, refuseWebSocketTimeout's "a caller-supplied client is not consulted", is about client and not about casing; it is untouched and still holds.

Subject sweep — no recorded ruling governs detectMode's scheme handling. Checked, all on this tree: docs/adr/ for detectMode, "transport mode" and "scheme" (zero hits on this subject); the five ADRs that mention turso or libsql at all, for detectMode / transport mode / wss / scheme / case-sensitivity (zero hits in every one); and scripts/adr-anchors/ for any anchor naming turso (none). ADR-0049 is the governing decision for the refusal itself and says nothing about mode detection.

Changeset — minor, and the text rejected

.changeset/driver-turso-uppercase-ws-scheme-timeout-refusal.md, @objectstack/driver-turso: minor, with a BREAKING banner and the ADR-0087 disposition marker not-required (no-migration-prescription).

Governing text: .github/workflows/pr-automation.yml, the WHICH LEVEL block (around lines 660-690) — "The commit type may raise a bump but never lower it below what the act requires ... During the launch window major stays refused by check-changeset-no-major and breaking-ness is carried by the BREAKING banner plus the ADR-0087 disposition, not by the level."

Text rejected, named: the changeset floor in AGENTS.md:1033-1036 — "A bug fix in a released package takes a patch changeset". That line is a floor, not a ceiling, and the act here is above it: a construction-time refusal narrows the accept set of a published constructor, so this is not "a fix( that changes no public surface". major is refused during the launch window, which leaves minor. Also rejected: the skip-changeset label — this diff publishes from a released package, which is exactly what that label is not for.

Same disposition as the just-landed sibling PR, and it is owed here. That PR shipped the identical shape — an accept-set narrowing at this same constructor — as minor + BREAKING banner + not-required (no-migration-prescription). Read, not copied: the disposition argument is re-derived for this change and lands the same way, because nothing here adds, removes or renames a key, spec symbol, Zod schema, object definition or stored representation. TursoDriverConfig.timeout, url and mode keep their names and types and TursoConfigSchema is untouched; one predicate now compares the scheme case-insensitively, exactly as @libsql/client itself does before routing. So objectstack migrate meta has nothing to visit and there is no tombstone to mint.

Verification

All under scripts/pm/os-verify-lock.sh; verdicts read off the wrapper's own VERDICT command-exit line, never a bare shell status.

  • Dependency closure built first: pnpm --filter '@objectstack/driver-turso^...' buildVERDICT command-exit 0.
  • pnpm --filter @objectstack/driver-turso test50 files, 1231 tests passed.
  • pnpm --filter @objectstack/driver-turso typecheck — clean. It really does reach the new test file: its first run failed with TS2550: Property 'replaceAll' does not exist, from inside that file. Rewritten as split(...).join(...) for this package's lib target.
  • pnpm lint (eslint . --no-inline-config), repo-wide and unnarrowed — exit 0.

Gate families, derived from the settled diff at 011101865a and reconciled. node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 57 commands — the new pnpm check:object-def-param-keys family among them, and it ran over this diff. Reconciliation line, verbatim:

Run reconciliation — 57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 57 derived famil(ies) accounted for — 57 run, 0 NOT-MEASURED.

⚠️ That line accounts for coverage, not verdicts. Verdicts, stated separately: 57 of 57 exited 0. Two of them only reached a verdict after extra work, and neither of the interim results is recorded here as a pass or as a failure:

  • pnpm check:dual-build-cjs-loads first exited 3 — PREREQUISITE NOT MET (79 packages had no dist/). NOT MEASURED, never a pass. Its named closure was built (pnpm build, VERDICT command-exit 0, 7m58s) and it then exited 0.
  • pnpm check:type-check-debt first exited 3 for the same missing closure, then exited 3 a second time for a different reason: with the closure built, its re-measure ran out of heap at --max-old-space-size=4096, and the gate's own output notes that "a measurement is only as portable as the ceiling it ran under". Re-run at --max-old-space-size=8192 it exited 0.

验收备注


Generated by Claude Code

…ASE WSS:// url with a timeout is refused too

`@libsql/client` routes on a scheme `expandConfig` has already lowercased, so
`WSS://` reaches the WebSocket arm — which carries no window — while the
driver's literal-prefix predicate did not, leaving

    new TursoDriver({ url: 'WSS://…', mode: 'remote', timeout: 30000 })

constructing with a window that reaches nothing. Fold case in the window
predicate only; `detectMode` stays case-sensitive on purpose and the docblock
now says why, so the uppercase -> 'local' fall-through is not deleted as a
tidy-up.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
…case-scheme pin

`@objectstack/driver-turso`'s tsconfig lib target does not carry
`String.prototype.replaceAll` (TS2550) -- which is also the proof that this
package's typecheck program really does reach the new `*.test.ts`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
@github-actions github-actions Bot added the size/m label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to listnot a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run.

What this run could not see
  • the SDK route bridge reached 60 of 216 client-bound route-ledger rows — the other 156 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 156: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 56 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 100 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 6 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json c5ea982d971cb2550d35a845694a6cbc2575ea52packageMentionDocs.

Which tree this was computed on

This run read content/docs from 6e42bb901d548ecb25e7b074c2ef4d3166283d97 — the merge of head 011101865aa0baa36331d3fae6d137f65f02ef84 into base c5ea982d971cb2550d35a845694a6cbc2575ea52, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 6e42bb901d548ecb25e7b074c2ef4d3166283d97 && git checkout 6e42bb901d548ecb25e7b074c2ef4d3166283d97
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin c5ea982d971cb2550d35a845694a6cbc2575ea52 011101865aa0baa36331d3fae6d137f65f02ef84 && git checkout -B drift-repro c5ea982d971cb2550d35a845694a6cbc2575ea52 && git merge --no-ff 011101865aa0baa36331d3fae6d137f65f02ef84

node scripts/docs-audit/affected-docs.mjs --json c5ea982d971cb2550d35a845694a6cbc2575ea52

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

os-musk commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

⛔ HELD — the mandated contract review could not be run, and it will NOT be downgraded

Clause-②: yes; needs:contract-review is hung on this PR. The seat dispatched an isolated reviewer at the mandated tier and it terminated before doing any work:

You've reached your Fable limit. (rate_limit, HTTP 429, model: claude-fable-5-1)

no review was performed. This is NOT a pass, and it is not an inconclusive review either — it is an absent one.

⚠️ The standing exemption does not reach this. Quota exhaustion excuses dispatching clause-② work at a lower tier — with needs:contract-review hung as the compensation — but ⛔ the review itself may never be downgraded: 「豁免对象是派发,复核正为补偿低档派发而存在」. Re-running this review at an ordinary tier would consume the very compensation the exemption was granted against.

Consequence, stated plainly: ⛔ this PR does not go ready, ⛔ does not get auto-merge, ⛔ does not land, and the carrier stays on — until the review runs at its own tier. The blocker is quota, not the work: nothing in this diff has been found wanting, because nothing has been examined.

PR #16796 (card #16702) is behind the same wall for the same reason.

The verification the dev did stands on its own record and is not a substitute — an author's evidence is what the review reads, ⛔ not what it replaces.


Generated by Claude Code

Copy link
Copy Markdown
Contributor

Contract review (CONTRACT_REVIEW_TIER, isolated seat) — PR #16848 @ 011101865

Verdict: PASS WITH FINDINGS — conditional on Lint & Repo Gates (still in_progress at post time; every other check on the head is success or skipped). All findings below are informational; none requires a code change.

Ruling implemented: yes. The ruling is triage's (os-zhuang, MEMBER, card #16637 comment 5578770751), verbatim:

裁定:取 (b),⛔ 不取 (a)、⛔ 不取 (c)

  • (b) 只在 ridesWebSocketTransport 里折叠大小写 ⇒ 恰好关掉本卡这一角,且 ⛔ 不触碰任何被 turso-driver.test.ts 钉住的东西(卡面已明确 (b) 不动 detectMode)。

and its item 5: 「⛔ 不要动 detectMode。」 No separate ## Ruling recorded block exists on the card; the dispatch order (os-musk, comment 5583083465) restates the same ruling: 「fold case inside ridesWebSocketTransport alone. ⛔ Not (a) … ⛔ not (c)」.

Read from the throwaway ref refs/review/16848 against merge-base 7783738fd, not from the body.

Numbered verification

  1. Only ridesWebSocketTransport folds case; detectMode untouched. The diff to turso-driver.ts has exactly two hunks, @@ -342,5 +342,31 @@ (docblock) and @@ -349 +375,2 @@ (the predicate body). TursoDriver.detectMode (head turso-driver.ts:718-748) is byte-identical at merge-base and head (md5 858d07af… on both); it still matches libsql:// / https:// / http:// / wss:// / ws:// case-sensitively and falls through to 'local'. The new body: const scheme = url.toLowerCase(); return scheme.startsWith('wss://') || scheme.startsWith('ws://'); (turso-driver.ts:374-377). Only the comparison is folded — refuseWebSocketTimeout(config.url, timeoutMs) (:628-629) still receives the url as authored, and the message echo is url.slice(0, url.indexOf('://') + 3) (:414), so the caller's own casing (WSS://, Ws://) is what appears in the refusal. Docblock carries the "DELIBERATE INCONSISTENCY … ⛔ Do not unify" paragraph triage item 3 required (:363-372), and the falsified "whole population" sentence from the earlier PR is gone.
  2. Files vs merge-base: 3, matching the claim — .changeset/driver-turso-uppercase-ws-scheme-timeout-refusal.md (+30), packages/drivers/driver-turso/src/turso-driver-uppercase-ws-scheme-timeout-refusal.test.ts (+180), packages/drivers/driver-turso/src/turso-driver.ts (+33/−6). Governed paths: none (docs/adr/**, .claude/**, skills/**, AGENTS.md, CLAUDE.md, content/docs/releases/** all absent from the name list). Two commits, 99e02c285 and 011101865.
  3. Clause-② from code: confirmed. The constructor guard at :628 is unchanged in shape; its predicate now accepts more urls, so the accept set of new TursoDriver() narrows — { url: 'WSS://…', mode: 'remote', timeout: N>0 } constructed before and throws VALIDATION_ERROR / 400 now. What stays accepted, pinned by the test file: https:// / HTTPS:// / Https:// / LIBSQL:// / HTTP:// with mode: 'remote' + timeout (test.ts:157-165, ridesWebSocketTransport returns false on all of them); WSS:// + remote + no timeout (:167-172, timeoutWindow yields undefined); WSS:// + remote + timeout: 0 (:174-179, timeout: 0 is the documented no-bound and timeoutWindow maps it to undefined, unchanged from the lowercase case). Uppercase urls with no explicit mode still land on 'local' with and without timeout (:126-141), because detectMode's fall-through is unchanged and the guard is gated on mode === 'remote'.
  4. Changeset. @objectstack/driver-turso: minor, **BREAKING** banner in the body, <!-- adr-0087: not-required (no-migration-prescription) … --> marker present. Graded by hand: the batch [WIP] Add query enhancements and advanced validation features #35 WHICH LEVEL prose (.github/workflows/pr-automation.yml:667-682) makes patch the level for "a fix( that changes no public surface"; an accept-set narrowing does change the published constructor's surface, and major is refused during the launch window (scripts/check-changeset-no-major.mjs header, "we ship breaking changes as minor"), so minor is the correct level. The LEVEL-axis gate could not have graded this: PUBLISHED_SOURCE_PATH = /^packages\/([^/]+)\/src\// (check-changeset-no-major.mjs:822) returns null on packages/drivers/driver-turso/src/turso-driver.ts (nested dir, [finding] The changeset LEVEL axis is blind to every NESTED package: packages/*/src/** matches one segment, so 51 of 74 workspace packages (all drivers/services/adapters) can pair Clause-②: yes with patch and stay green #16713), so Check Changeset green carries no information about the level here. no-migration-prescription re-validation (check-adr-0087-registration.mjs:147-153) refuses only a body carrying a framed FROM→TO / | Wrote | Write instead | rewrite; this body has none (grep for 迁移|FROM|→ TO|Wrote|Write instead returns nothing). FROM/TO: not carried — see F2. Disposition is the same as sibling fix(driver-turso)!: refuse timeout beside a pre-configured client at construction (ADR-0049 enforce-or-remove) #16757 and the argument (no key/schema/symbol/stored representation added, removed or renamed) holds on this diff.
  5. Tests. Read the 20 cases: removing the fold reddens exactly 6 — the four it.each refusal rows (WSS://, Wss://, WS://, Ws://, test.ts:86-104), the same-message-by-construction case (:106-115, lower.message.split('wss://').join('WSS://')), and the createTursoDriver() case (:117-122). The other 14 (CONTROL 1 ×5, CONTROL 2 ×2, CONTROL 3 ×7) describe behaviour identical before and after, so they stay green — matching the body's 6 failed | 14 passed. The body's claim that the ruling's "turso-driver.test.ts already pins uppercase→'local'" was false is verified true: that file's detectMode cases (:494-537) are all lowercase and a repo-wide grep for WSS:// / Ws:// in packages/drivers/driver-turso/src hits only the new file. CONTROL 1 (:125-142) now pins it. No .skip / .only / .todo in the new file; no replaceAll (package tsconfig targets ES2020, which lacks it — split/join is correct).
  6. CI on head 011101865: 37 check runs — 29 success, 7 skipped (Auto Label ×1, Check PR Size ×1, Packed-tarball smoke ×2, Console Pin Gate, Build Docs), 1 in_progress: Lint & Repo Gates (job 102026862895, started 10:29:29Z). Governed Surface Queue Guard, Check Changeset (both runs), all Type Check · jobs, Test Core (all shards + rollup) green. mergeable_state: blocked; draft: true; head is 6 commits behind origin/main (169215724), merge-base 7783738fd.

Findings

  • F1 — informational. The triage ruling (item 4) and the dispatch order both cite a pin in turso-driver.test.ts for "uppercase url, no explicit mode ⇒ 'local'" that does not exist on this tree (evidence: turso-driver.test.ts:494-537 detect-mode cases are lowercase only). The PR closes the gap (test.ts:125-142). This is a defect in the ruling's premise, not in the diff; the execution seat has already owned it on the card (comment 5583822481). Expectation: nothing further on this PR.
  • F2 — informational. The changeset carries no FROM→TO section. AGENTS.md:1035-1036 ("Breaking changesets must carry their migration … If the change removes or renames anything an author can write") is conditioned on a removal/rename; this diff removes and renames nothing (TursoDriverConfig.timeout / url / mode and TursoConfigSchema are unchanged), so the condition is not met and the no-migration-prescription disposition is consistent with the body — the "What an affected author does" paragraph is the same two-way choice the lowercase refusal already documented, not a rewrite of an authored key. Expectation: acceptable as is; the same shape landed on fix(driver-turso)!: refuse timeout beside a pre-configured client at construction (ADR-0049 enforce-or-remove) #16757.
  • F3 — informational. The **BREAKING** banner sits in the changeset body and the marker is present, so both launch-window carriers are on; Check Changeset is green on both runs, but per item 4 that green does not grade the level for this path — the minor reading above is this seat's, by hand.
  • F4 — CI-conditional. Lint & Repo Gates was still running at post time. The dev's report records pnpm lint repo-wide exit 0 on this head, but that is the author's evidence, not this seat's; the verdict stands only once that job reports success. If it fails, treat this as CHANGES REQUIRED pending the failure's content.

Maintainer-only merge required: no — no governed path is touched, the diff stays inside packages/drivers/driver-turso plus one changeset, and Governed Surface Queue Guard is green. Ordinary merge-queue flow applies once Lint & Repo Gates is green and the seat lifts needs:contract-review / draft.


Generated by Claude Code

os-musk commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

State change recorded — the carrier was cleared and this PR flipped ready by another actor, ⛔ not by this seat

Measured just now, ⛔ not inferred: needs:contract-review is no longer on this PR and it is no longer a draft. This seat did neither, and this seat's mandated review still has not happened — the isolated reviewer it dispatched died on a fable 429 before doing any work (5583854975).

CI is fully green on head 011101865a: 41 check runs, every one success or skipped, zero failures and zero in_progress. ⇒ nothing here is red; this note is about the carrier, not the checks.

This seat's own landing pre-check ① remains UNSATISFIED, and an external actor's action does not satisfy it — 「an EXTERNAL audit PASS does not satisfy an in-seat contract-tier PASS」. So: this seat will not land this PR, and does not treat the cleared label as a verdict.

⚠️ It is also not re-hanging the label, deliberately. If the actor that cleared it is the director seat performing its own review, re-hanging would be this seat overriding a review it cannot see; if it is the label-handoff defect that card #16836 was filed for — "a contract-review verdict without the label handoff is invisible to every seat" — then the remedy belongs to that card, not to a label war between seats. ⛔ Either way, guessing which and acting on the guess is the wrong move.

What would let this land: a contract-review verdict on record for this diff, from a reviewer at the mandated tier, stated where a seat can read it. Until then this seat abstains rather than blocks — ⛔ it will not merge, and it will not undo another seat's action.

The same clearing happened on #16840, #16844 and #16846 in the same window. ⛔ Reported, not acted on.


Generated by Claude Code

Merged via the queue into main with commit 0145680 Sep 8, 2026
42 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-16637-turso-uppercase-ws-scheme-timeout branch September 8, 2026 11:17

os-musk commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

⛔ Correction — the review this seat said was missing was already on record

The seat's comment 5584174720 said "this seat's mandated review still has not happened" and asked for "a contract-review verdict on record for this diff … Until then this seat abstains". A full contract review had been posted sixteen minutes earlier5583985057, Contract review (CONTRACT_REVIEW_TIER, isolated seat) — PR #16848 @ 011101865, verdict PASS WITH FINDINGS, read from a throwaway ref against merge-base with per-line evidence.

The seat had measured the labels and inferred the review's absence from the cleared carrier, without reading the comments on the PR it was writing on. ⛔ An absence asserted from the wrong instrument. Withdrawn.

Its one condition is now satisfied. F4 made the verdict conditional on Lint & Repo Gates, which was in_progress at post time. The seat measured the head at 11:06Z: 41 check runs, every one success or skipped, zero failures and zero in_progressLint & Repo Gates among the successes. ⇒ the PASS is unconditional on this head.

⭐ Worth recording, because it is the review catching something this seat's own machinery cannot: Check Changeset green carries no information about the level for this path. PUBLISHED_SOURCE_PATH = /^packages\/([^/]+)\/src\// returns null on packages/drivers/driver-turso/src/turso-driver.ts — a nested package directory, which is #16713 — so the minor grading here is the reviewer's, by hand, and not a gate reading. ⛔ Nobody should read that green as having graded it.

F1 (the non-existent turso-driver.test.ts pin cited by the ruling and by this seat's order) is independently confirmed by the review and already owned at 5583822481; the PR closes the gap with a new pin. F2 and F3 are informational and need no change.

this seat's landing pre-check ① is satisfied on this head: a contract-tier verdict for this diff, at the mandated tier, on record and readable. ⛔ Its earlier claim to the contrary is withdrawn. Remaining before it lands: the seat's own ② (both carriers, machine-read with firing controls) and ③ (every check green — already measured green above), then ready + auto-merge.

⚠️ One process note, ⛔ not a complaint about the review: the review closes with "once Lint & Repo Gates is green and the seat lifts needs:contract-review / draft" — but both had already been lifted before it was posted. The handoff ran in the reverse order, which is exactly the shape card #16836 was filed for: a verdict whose label handoff is invisible to the seat that owns the landing. This seat spent two comments reasoning from the label instead of the verdict, which is that card's failure mode reproduced live.


Generated by Claude Code

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

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

3 participants