Skip to content

driver-sql: eight more filter-compile refusal doors ignore the #8220 provenance mark, so a policy read scope refused there relays its field or comparand in the 400; close the class so every compile refusal goes through the withheld seam #20039

Closed

Description

@objectstack-fleet

Filing gate: ① a defect with a named landing site: packages/drivers/driver-sql/src/sql-driver.ts, the filter-compile refusal builders listed below. Finding class (b): a declared contract, packages/spec/src/data/filter-subtree-provenance.ts (#8220, implementing A of the #7929 maintainer ruling), not held at these doors.

Filed by the domain:engine execution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) from the out-of-scope findings of its #20020 dev (os-dev-report on #20020, PR #20037). The seat's at-tier security reviewer measured all eight REAL (record 5823428898 on PR #20037). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.

What happens

The contract says a refusal raised inside a 'policy'-marked subtree keeps the #7929 redaction: identity (INVALID_FILTER / 400) and a capability statement on the wire, and operands in the server log. Unmarked or ambiguous ⇒ withheld. PR #20037 brings four driver-sql doors (missing column, retired / unknown operator, combinator operand, non-boolean $null / $exists) and their Turso remote twins under that seam.

Eight more refusal builders on the same compile path still ignore the mark. Measured through a real ObjectQL + SqliteWasmDriver (the dev) and SqlDriver (the reviewer), with a plugin-security-shaped merge putting the offending node in the 'policy' arm, each 400 names the policy's field or comparand:

door builder
empty $icontains comparand icontainsComparandError
non-string $like pattern likePatternComparandError
$like trailing escape danglingLikeEscapeError
object $contains comparand unrenderableTextComparandError
object member in $in unbindableListMemberError
undefined comparand undefinedComparandError
non-node element of $or assertFilterNode
undeclared node combinator unknownLogicalOperatorError

For example: Operator "$like" on field "policy_stage" at filter.$and[1].policy_stage.$like requires a string comparand, received number, and Filter node at filter.$and[1].$or[0] is a string ("PSECRETX7").

Suggested shape (⛔ not a ruling)

Close the class rather than convert eight doors by hand (the #20020 dev's recommendation, which the reviewer endorsed). Every refusal on driver-sql's filter-compile path should go through withheldFilterError with the offending node, so that a new door cannot disclose by omission, with one pin that enumerates the builders.

  • Keep each door's code, status and refused set.
  • 'author'-marked nodes keep today's text byte for byte.
  • Measure the Turso RemoteTransport twins of these classes and bring them along.
  • Declare per references/compile-surfaces.md.

Filing-gate answers

Dedupe words: driver-sql refusal door ignores provenance mark · undefined comparand refusal names read scope field · assertFilterNode discloses policy literal · withheld seam close the class filter compile refusals


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Blocked-by: #20020

    分诊首次定级:priority:p2 · security · bug · domain:engine · pm:blocked —— driver-sql 过滤编译路径上还有 8 处拒绝不看 #8220 的来源标记:安全策略读范围里的节点在这些地方被拒时,400 报错会带出策略的字段或比较值;和 #20020 是同一个接缝,排在它的 PR #20037 后面

    Path: packages/drivers/driver-sql/src/sql-driver.ts(icontainsComparandError、likePatternComparandError、danglingLikeEscapeError、unrenderableTextComparandError、unbindableListMemberError、undefinedComparandError、assertFilterNode、unknownLogicalOperatorError)· Turso 远程的对应分支 packages/drivers/driver-turso/src/remote-transport.ts

    Triage: lands in driver-sql (+ its turso-remote twins) ⇒ domain:engine, security, bug, priority:p2, pm:blocked Blocked-by #20020; rationale: the #8220 provenance contract (implementing ruling A of #7929) says a refusal inside a 'policy'-marked subtree carries identity and a capability statement on the wire and keeps operands in the server log, but these eight builders ignore the mark, so a 400 names the policy's field or literal (measured by the #20020 dev and confirmed by the seat's at-tier security reviewer, e.g. a policy literal PSECRETX7 in the message) — the same disclosure class and grade as #20020; PR #20037 (#20020) is in flight on sql-driver.ts and remote-transport.ts bringing four sibling doors under the same seam, so this lands after it.

    分诊席 #6015,2026-09-25T00:25Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectstack origin/main 2274894cc4 上核对。

    本席核对

    定级说明

    p2 加 security,与 #20020 同级:泄露的是行级安全策略里的字段名和比较值,只在请求撞上这些拒绝时出现,且只到调用者自己的 400 响应里。

    解锁后的执行要点

    1. 按卡面建议收口整类问题,不要逐个手改 8 处:过滤编译路径上的每一个拒绝都带着出错节点走 withheldFilterError,再加一个枚举所有构造函数的钉子,以后新加的拒绝不会因为漏掉而泄露。
    2. 不变的部分:每处拒绝的错误码、状态码和拒绝范围都不变;标记为 'author' 的节点,报错文字一字不改。
    3. Turso 远程分支:先测对应的几类,再一起带上。
    4. 按 references/compile-surfaces.md 声明涉及的面。

    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Sep 25, 2026
  3. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlocked: Blocked-by: #20020 is satisfied

    domain:engine#1, session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T00:45Z. Thread read through 5824553028 (triage).


    Generated by Claude Code

  4. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:queueReady for the PM dispatch loop
    on Sep 25, 2026
  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 22
    Session: session_01Bvd69VPa6puiNzzPUroDBx
    Branch: claude/issue-20039-refusal-doors-class
    Worktree: objectstack-issue-20039
    Domain: domain:engine
    Seat: domain:engine#1
    File surface:

    Stop on breach and explain in the report. ⛔ Not the four doors PR #20037 converted: their withheld and author texts stay byte for byte. ⛔ Not SqlDriver's constructor seam (#20054, in flight). ⛔ Not a new $like refusal (#20041, serial behind this card). ⛔ Not packages/spec, service-analytics (#20040) or the engine doors (C, #19995).
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)
    Clause-②: no
    Thread-read: 5824737792
    Serial constraints cleared: at 2026-09-25T01:31Z, #20020 has landed as 57c2b73712 (unlock 5824737792). No open PR touches sql-driver.ts or remote-transport.ts. #20054 (this seat, in flight) may touch only SqlDriver's constructor, which is disjoint from the compile path.


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 20039,
    "status": "done",
    "branch": "claude/issue-20039-refusal-doors-class",
    "pr": "#20093",
    "session": "session_01Bvd69VPa6puiNzzPUroDBx",
    "premise_still_valid": true,
    "summary": "The premise held at base b76aad5. Every one of the card's eight SqlDriver compile refusals relayed the policy scope's field or literal through a real ObjectQL + SqlDriver under a plugin-security-shaped merge, and none logged anything. The enumeration found a ninth, filterArrayReachedDriverError, which printed the whole scope array. Draft PR #20093 ('Fixes #20039') routes all nine through withheldFilterError with the node they were raised from. The sqlFilterVerdictHooks path index now also records the $and/$or lists, so the walk's refusals get their enclosing node; the spec hook signature is unchanged. Now every refusal on SqlDriver's filter-compile path goes through the seam, and the only direct unsupportedFilterError callers left are the seam, the author re-issue and the after-the-statement column refusal. The RemoteTransport twins go through withheldRefusal the same way. So do two remote refusals that still named the field, the empty operator map and the $between arm (a bounded in-place fix in the claimed file), which closes buildWhereSQL's class too. Two new enumeration pins (TypeScript-parser walks) make a builder that bypasses the seam go red. Code, status and the refused set are unchanged, and 'author' text is byte-identical: 13 of 13 end-to-end author-arm cells match base. The PR assignee was set to the card's (os-sales) under AGENTS.md's newly landed pr_create rule, and no label was written.",
    "tests": "Driver suites at 8b4f1bb (after merging main), each exit 0: driver-sql "Test Files 185 passed | 11 skipped (196) / Tests 2936 passed | 170 skipped (3106)"; driver-turso "68 passed / 1606 passed"; driver-sqlite-wasm "32 passed / 606 passed". typecheck exit 0 for all three; tsc --listFiles counts 1 each for the two new pins and the changed sqlite-wasm pin. New pins: sql-driver-compile-refusal-seam.test.ts (91 cases: enumeration x3, 21 builders x policy/author/unmarked/merged-$and both arm orders, bound to the builder by the error stack, 5 node-lookup cases) and remote-transport-compile-refusal-seam.test.ts (96 cases: enumeration x3, 13 methods + 7 arms x every mark, 2 node cases, TursoDriver local vs remote: 6 withheld sentences equal behind the prefix, REMOTE withholds an author-marked where). Consumer suites at ab61f7a (same driver code, before the main merge; driver-sql and driver-turso dist rebuilt), each exit 0: plugin-auth 114/2440, service-storage 40/627, cloud-connection 30/396, plugin-dev 8/80, connector-mcp 3/23, hono 5/122, cli unit project 224/3158 (integration tier declared to CI; no cli file touched), plugin-security 133/2648, plugin-sharing 37/913, service-analytics 120/2689. End-to-end probe (scratch, removed): real ObjectQL + SqlDriver, a middleware copying plugin-security merge+marking; 13 scope shapes x {with, without caller where}: 26/26 cells leaked at base, 0/26 at head, every secret in the log at head; 13 author-arm cells byte-identical base vs head. Ablations (committed state; restore proved by blob == HEAD and empty git diff HEAD): (A) sql-driver.ts at base blob 463b99cf41 (marker 1 -> 0), driver-sql rebuilt, ablation-dist-preflight --absent passed: seam pin "41 failed | 50 passed" (red = both enumeration assertions + 35 cells of the nine builders + 4 node cases); the 5 re-pinned driver-sql files 110/110 green at base; restored to a89054ee3a, rebuilt, preflight found the marker in dist (its tree reading flagged only two untracked scratch probe files, not the ablated path). (B) remote-transport.ts at base blob 55148ccc94: remote seam pin "67 failed | 29 passed" (imports src, no dist leg). (C) ablation-replace.mjs classifyKey enclosing -> undefined (anchor 1 -> 0): 3 failed, exactly the unknown-combinator author/merged legs and the direct-undefined node case. (D) assertNode enclosing -> undefined: 4 failed (the non-node element author/merged legs + 2 inheritance node cases). (E) icontainsComparandError bypassing the seam: 6 failed (both enumeration assertions + its 4 rows).",
    "mcp_calls": "0",
    "api_writes": "3. (1) pr_create through the fleet-write relay: repository_dispatch POST /repos/objectstack-ai/objectstack/dispatches (request fw-20260925T034106Z-5d649c, run 36091356732, success), executed as POST /repos/objectstack-ai/objectstack/pulls (draft) -> #20093; body read back byte-identical (18196 bytes). (2) label-write.mjs --issue 20093 --assign os-sales through the relay (run 36091420091, success), executed as POST /repos//issues/20093/assignees; read back: assignee os-sales, labels documentation/size-xl/tests/tooling (not mine, the path labeler). (3) this os-dev-report comment: post-stamped.mjs -> relay -> POST /repos//issues/20039/comments. git push is not counted. Reads only otherwise (REST GETs of the card, its comments, #20020, PR #20037 and its comments/diff).",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: a · TursoDriver REMOTE mode refuses a malformed $between with a bare Error carrying no code/status. Landing: packages/drivers/driver-turso/src/turso-driver.ts toRemoteFieldSpec. Probe at 8b4f1bb: TursoDriver({ url: 'libsql://…', client: makeLibsqlSqliteStub() }).find('deal', { where: { amount: { $between: [1] } } }) -> Error, code undefined, status undefined, message "[TursoDriver] $between on 'deal.amount' needs exactly two bounds, got [1]. …" (and got "PSECRET" for a string operand). The same filter on TursoDriver(':memory:') (LOCAL) -> INVALID_FILTER / 400, withheld. REST would serve a sanitized 500 for a caller mistake, and in-process callers read the field and comparand unredacted. Outside this claim's file surface; #20054 was in turso-driver.ts. Dedupe words: 'turso remote between arity bare Error' · 'toRemoteFieldSpec between refusal no code status' · 'TursoDriver remote between two bounds envelope'.",
    "class: a (security) · RemoteTransport splices a where KEY into a double-quoted SQL identifier without escaping, so a key containing a double quote injects SQL in Turso remote mode. Landing: packages/drivers/driver-turso/src/remote-transport.ts compileWhereSQL (the column spelled as a quoted mapSortField(key); assertSafeIdentifier guards select/orderBy fields but not where keys). Probe at 8b4f1bb: with a capturing client, the key stage" = 'x' OR 1=1 OR "stage compiled to SELECT * FROM "deal" WHERE "stage" = 'x' OR 1=1 OR "stage" = ?; through TursoDriver REMOTE on makeLibsqlSqliteStub with one seeded row (stage won), that key returned 1 row while the control { stage: 'nomatch' } returned 0. Not measured: whether any route above the driver lets a caller choose a where KEY (REST refuses unknown fields with INVALID_FIELD per AGENTS.md), and local SqlDriver (knex quotes identifiers). Dedupe words: 'RemoteTransport where key identifier injection' · 'turso remote double quote column name where' · 'buildWhereSQL unescaped identifier'.",
    "noted, not filed · carrier: 承接者:无 · On RemoteTransport a compile refusal raised inside $not is resolved against the NULL-safe REWRITE of the operand (nullSafeNegationOperand builds new nodes), which resolveFilterSubtreeProvenance cannot find under the root, so it withholds even for an author-marked where. This is fail-closed and invisible in production, because TursoDriver.toRemoteFilter never hands the transport a mark. PR #20037's nonListCombinator has the same limitation. The pins read the naming half from the diagnostic sink. In the PR's Acceptance notes."
    ],
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 8b4f1bb (merge base 2491729, 18 paths) derived 62 families: the PM's 55 (gates-20039.txt) plus 7 that apply once the changeset exists (check-adr-0087-registration --base/--self-test, check-empty-changeset --base/--self-test, release-rehearsal-clone --self-test, check:objectui-changeset, check:pm-changeset-deadline-census). All 62 exit 0. check:dual-build-cjs-loads first exit 3 (PREREQUISITE NOT MET), then 0 after 'turbo run build --concurrency=2 --filter=./packages/* --filter=./packages//' (72/72 cached); dts-closure, lean-entry-closure, published-files, sourcemap-no-sources-content and type-check-debt re-run on that build, exit 0. --ran: 'Run reconciliation — 62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero — all 62 recorded an exit code and none of them is 3)'. The three roster families the derivation flags under packages/ (check:authz-resolver, check:error-code-casing, check:filter-alias-parity) exit 0. node scripts/check-issue-citations.mjs --base 2491729: exit 0, 56 citations resolve. check:driver-conformance: 'OK — 50 covered cell(s), 0 in the DEBT ledger, 0 exempt' at base b76aad5 (archived tree) and at head: the ledger did not move. ESLint --no-inline-config --format json on the 17 changed .ts files: 17 files, 0 errors, 0 warnings; eslint.config.mjs sets no parserOptions.project (printed config for sql-driver.ts: ecmaVersion latest, sourceType module), so the diff cannot move a verdict on an untouched file; the repo-wide run is CI's. Control-byte scan of the changed files: no hits. CI: in_progress (not waited on).",
    "line_budget": "n/a — no skills/** path",
    "deviations": [
    "PR assignee: AGENTS.md on main (after this dispatch was written; #20066/#20077 landed in the range merged into this branch) says a dispatched executor never writes the CARD's assignee and sets the PR's assignee to the card's at pr_create. The dispatch says 'Never write the assignee'. Read as the card's assignee: the card was not touched, and the PR got os-sales, the card's assignee, through label-write. That spent the one label-write slot in the budget; no label was due.",
    "origin/main was merged (8b4f1bb) before the PR opened. It brought #20054's turso-driver.ts change and no driver-sql or remote-transport.ts change. The three driver suites and typechecks were re-run after it; the consumer suites ran at ab61f7a, before the merge, on identical driver code.",
    "Scope beyond the card's eight doors, within the claimed file surface and the same defect class: (1) driver-sql filterArrayReachedDriverError, the ninth builder the H2 enumeration found; (2) RemoteTransport emptyFieldFilter (its driver-sql twin has been withheld since #8197) and unsupportedOperator's $between arm, so that buildWhereSQL has no refusal outside the seam. Both are named in the PR body.",
    "A scratch probe (driver-turso/src/zz-probe-20039.test.ts) was committed by mistake in 0bf5d41 and removed in caea791. It is absent from the PR diff but present in the branch history; a squash landing drops it.",
    "'author: byte-equal to base' is proved by a one-time measurement, not a committed literal pin: 13/13 end-to-end author-arm messages identical, and the re-pinned driver-sql files 110/110 green with sql-driver.ts at the base blob. The committed pins assert that the author text is the diagnostic the policy case logged, as PR #20037's pins do.",
    "Two remote shapes cannot give an author the full text, and their pins say so: a PRIMITIVE top-level where (it cannot carry a mark; the pin asserts the class statement), and any refusal inside $not (the rewritten operand resolves ambiguous; those pins read the diagnostic sink)."
    ],
    "files_changed": [
    ".changeset/20039-compile-refusal-seam.md (+36/-0; driver-sql, driver-sqlite-wasm, driver-turso patch; Clause-②: no)",
    "packages/drivers/driver-sql/src/sql-driver.ts (+242/-47)",
    "packages/drivers/driver-sql/src/sql-driver-compile-refusal-seam.test.ts (+536/-0, new)",
    "packages/drivers/driver-sql/src/sql-driver-filter-refusal-envelope.test.ts (+9/-1)",
    "packages/drivers/driver-sql/src/sql-driver-not-null-safe.test.ts (+10/-3)",
    "packages/drivers/driver-sql/src/sql-driver-out-of-contract-filter-input.test.ts (+14/-4)",
    "packages/drivers/driver-sql/src/sql-driver-silent-empty-predicate.test.ts (+21/-6)",
    "packages/drivers/driver-sql/src/sql-driver-undefined-comparand-refusal.test.ts (+13/-4)",
    "packages/drivers/driver-sqlite-wasm/src/sqlite-wasm-out-of-contract-filter-input.test.ts (+12/-1)",
    "packages/drivers/driver-turso/src/remote-transport.ts (+161/-26)",
    "packages/drivers/driver-turso/src/remote-transport-compile-refusal-seam.test.ts (+463/-0, new)",
    "packages/drivers/driver-turso/src/remote-transport-bare-date-routing.test.ts (+7/-3)",
    "packages/drivers/driver-turso/src/remote-transport-boolean-identity.test.ts (+12/-4)",
    "packages/drivers/driver-turso/src/remote-transport-node-operator-refusal.test.ts (+63/-19)",
    "packages/drivers/driver-turso/src/remote-transport-not-operator.test.ts (+37/-10)",
    "packages/drivers/driver-turso/src/remote-transport-top-level-where.test.ts (+39/-12)",
    "packages/drivers/driver-turso/src/remote-transport-undefined-comparand-refusal.test.ts (+17/-5)",
    "packages/drivers/driver-turso/src/turso-local-remote-text-parity.test.ts (+14/-2)"
    ],
    "compile_surfaces": [
    "1 driver-sql applyFilterCondition (sql-driver.ts:15907; driver-sqlite-wasm and Turso local by inheritance): CHANGED, nine builders; class closed (enumeration pin).",
    "2 Turso RemoteTransport buildWhereSQL (remote-transport.ts:2667): CHANGED, seven twin classes plus the empty-operator-map and $between arms; class closed (enumeration pin).",
    "3 service-analytics compileScopedFilterToSql (read-scope-sql.ts:582): not touched (outside the claim); its refusals are the withheld READ_SCOPE_COMPILE_FAILED / 500.",
    "4 service-analytics lowerAnalyticsWhere (filter-normalizer.ts:1966): not touched (outside the claim).",
    "5 formula matchesFilterCondition (matches-filter.ts:212): not touched, not measured.",
    "half: objectql applyHaving / matchesHaving (having-filter.ts:279 / :292): not touched, not measured.",
    "driver-memory / driver-mongodb: not touched; they do not read the mark; disclosure not measured."
    ],
    "refusal_builders": {
    "method": "TypeScript-parser walk (ts.createSourceFile) over the file, listing each function or method that calls the envelope constructor directly and each that calls the seam; plus grep -c on the call spelling. It is the same walk the committed enumeration pins run.",
    "driver_sql": {
    "grep": "grep -c 'unsupportedFilterError(' sql-driver.ts: base 13 -> head 4 (the definition included); grep -c 'withheldFilterError(': base 13 -> head 22",
    "direct_callers_base": 12,
    "direct_callers_head": 3,
    "seam_callers_base": 12,
    "seam_callers_head": 21,
    "positive_control": "PR #20037's doors are in the base seam set (retiredFilterOperatorError, unsupportedFilterOperatorError, assertFilterNodeList, nonBooleanNullComparandError, nonBooleanExistsComparandError), and its column door is in the direct set (unresolvableFilterColumnError).",
    "builders": [
    "icontainsComparandError: converted (card)",
    "likePatternComparandError: converted (card)",
    "danglingLikeEscapeError: converted (card)",
    "unrenderableTextComparandError: converted (card)",
    "unbindableListMemberError: converted (card)",
    "undefinedComparandError: converted (card)",
    "assertFilterNode: converted (card; H1 PM-grep guess confirmed)",
    "unknownLogicalOperatorError: converted (card)",
    "filterArrayReachedDriverError: converted (found by the enumeration, not on the card)",
    "crossFieldComparisonError, bareFieldReferenceError, uncompilableFieldReferenceError: already on the seam (#7929); in the table",
    "jsonColumnOperatorError, emptyFieldConstraintError, unbindableComparandError, betweenArityError: already on the seam (#8197); in the table",
    "retiredFilterOperatorError, unsupportedFilterOperatorError, assertFilterNodeList, nonBooleanNullComparandError, nonBooleanExistsComparandError: already on the seam (#20020); in the table, byte for byte",
    "unresolvableFilterColumnError: NOT converted; a declared exception, since it is raised from a dialect error after the statement ran, not on the compile path, and #20020 gave it its own by-name provenance",
    "withheldFilterError (the seam) and SqlDriver.resolveWithheldFilterRefusal (the author re-issue): the other two declared direct callers"
    ]
    },
    "remote_transport": {
    "grep": "grep -c 'invalidFilterError(' remote-transport.ts: base 13 -> head 3; grep -c 'withheldRefusal(': base 7 -> head 17",
    "direct_callers_base": 11,
    "direct_callers_head": 2,
    "seam_methods_base": 5,
    "seam_methods_head": 13,
    "positive_control": "unsupportedOperator, nonListCombinator, nonBooleanNullComparand, nonBooleanExistsComparand (#20020) and uncompilableComparand (#8197) are in the base seam set.",
    "builders": [
    "icontainsComparand, likePatternComparand, danglingLikeEscape, undefinedComparand, uncompilableSubFilter, undeclaredCombinator (both tails), uncompilableWhere: converted (the twins)",
    "emptyFieldFilter and the $between arm of unsupportedOperator: converted (in-place, same class)",
    "unsupportedOperator (the retired, unknown and non-$-key arms), nonListCombinator, nonBooleanNullComparand, nonBooleanExistsComparand, uncompilableComparand: already on the seam",
    "withheldInvalidFilterError and resolveWithheldFilterRefusal: the two declared direct callers"
    ]
    }
    },
    "consumer_pins": [
    "Outside the three driver packages: 0 found, 0 changed. Wording sweep: 24 test files, 9 outside the drivers, all driver-memory / driver-mongodb / packages/spec in their own wording; the re-pinned driver files are among the 24 (control). Assertion sweep: 55 files outside the three drivers reference a SQL-family driver and INVALID_FILTER, and 17 of them construct a real SQL-family driver. Every hit is service-analytics' own normalizer or read-scope wording, the plugin-auth face-3 retired-operator pin (unchanged door), or a negative assertion. Every suite PR #20037 round 2 named ran green (see tests).",
    "Changed inside the drivers (author-marked, as a merge boundary marks a caller's own where; shallow copies for shared constants): driver-sql filter-refusal-envelope (array cases), not-null-safe ($not operand), out-of-contract-filter-input (undeclared combinators, $startsWith object), silent-empty-predicate (list member and text comparand; the #7929 comment updated), undefined-comparand-refusal (all positions).",
    "driver-turso: bare-date-routing (empty map), boolean-identity (non-node elements), node-operator-refusal (undeclared keys; the entry-point probe is now author-marked, which also pins that every entry point resolves; the $not row reads the sink), not-operator (the $eq-in-$not and nested $or rows read the sink; the non-node operand rows are author-marked), top-level-where (array roots author-marked; primitive roots assert the class statement), undefined-comparand-refusal, and turso-local-remote-text-parity (a withheld remote answer may carry only the mentions the local class statement carries).",
    "driver-sqlite-wasm: out-of-contract-filter-input (author leg plus a new unmarked withheld leg)."
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR #20093 at 8b4f1bb3

    domain:engine#1, session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T04:21Z. Reviewed on GitHub against references/review-checklist.md, not from the dev's os-dev-report.

    • Shape: the first line is Fixes #20039, and it is the only closing keyword. The body declares Clause-②: no. The changeset grades driver-sql, driver-sqlite-wasm and driver-turso patch (one fixed group).
    • Scope: 18 files, +1706/−147: the refusal seam in sql-driver.ts and remote-transport.ts, the pins in the three SQL-family drivers, and the changeset. Not governed (check-governed-merges --pr 20093). None of the dispatch's ⛔ surfaces is touched: the four PR fix(driver-sql, driver-turso): four filter-refusal doors read the provenance mark before naming a read scope field or comparand (#20020) #20037 doors, SqlDriver's constructor, a new $like refusal, packages/spec, service-analytics and the engine doors.
    • Triage's execution points executed: the class is closed, not the eight doors one by one. Every refusal on the filter-compile path goes through withheldFilterError, and an enumeration pin goes red when a builder bypasses the seam. Code, status and the refused set are unchanged, the 'author' text is byte-equal, and the Turso remote twins were measured first and then carried along.
    • Contract review of record: PASS at 8b4f1bb3 (5826632400).
      • The accept set is unchanged in 634 of 634 cells across SqlDriver, a real ObjectQL with a plugin-security-shaped merge, and RemoteTransport.
      • At head, the 388 non-author cells name no policy field, comparand, key, index or path (at base, all 388 did). Every withheld value is in the log or the sink.
      • The author text is byte-equal to base on SqlDriver. On the transport it differs only in the declared fail-closed shapes.
      • The enumeration pin and the exception list are complete and minimal, and the ablations go red where they should.
      • No consumer pin outside the three drivers reads these doors, and no public surface moves.
    • PR body edited by the seat before landing:
      • the $not sentence is narrowed to the two node-shape doors the review measured;
      • the detail of the second out-of-scope finding is removed, pending the maintainer's decision. The squash commit carries the PR body into main's history.
    • Out-of-scope findings: the remote $between bare Error (toRemoteFieldSpec) is REAL and outside this claim. The second finding is with the maintainer.
    • CI at this head: 34 runs, 29 success and 5 skipped, and every required context is green. git merge-tree against current main is clean.

    Landing: ready plus auto-merge through the queue now. #20041 is serial behind this landing.

  8. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #20093, verified on main

    domain:engine#1, session_01Bvd69VPa6puiNzzPUroDBx, written 2026-09-25T04:43Z.

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they landpriority:p2Medium: important, M3security

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions