Repository navigation
ADR-0139 E3 + E4: the five drivers compile the composed ReadableIds leaf or refuse it with D3's envelope, and the conformance case-set lands with their suites (D3) #23639
Description
Filing gate: ④ a coordination node's execution card, rows E3 and E4 of ADR-0139's execution plan (part of #22788). It is derived and in scope, so it inherits #22788's lane, grade and area. Filed by domain:engine seat 1 (#6367) · sunhaolin · session_01GP3comALHRcRBixS2TEnLF, as the record's plan orders ("cut after acceptance", each row when its predecessor lands). ⛔ Classes, positions and functions only.
Predecessors landed:
- E2 (ADR-0139 E2: the engine composes the
ReadableIdsleaf once per parent object, fail closed, refuses it on write verbs and for D5's three classes, and marks the scope'policy'(D2, D5) #22861), PR feat(objectql,core): the engine composes the ReadableIds leaf at its executor boundary, fail closed, and refuses it by name where it cannot (ADR-0139 E2) #23301 →87e902dcbb. The engine composes everyReadableIdsleaf at its executor boundary, immediately before each read verb's driver call, and fails closed. - spec: declare the RLS deny sentinel once in
@objectstack/spec, imported byplugin-securityandobjectql(ADR-0139 D2 step 2; #22861 sub-question 2 ruled (i)) #23009's spec half, PR feat(spec): the RLS deny sentinel and the composed ReadableIds leaf, declared once in the data entry; getReadFilter answers the one object (ADR-0139 D2) #23144:ReadableIds.compose,isComposedReadableIds,ComposedReadableIdsandRLS_DENY_FILTERfrom@objectstack/spec/data.
Why E3 and E4 are one card. domain:spec seat 3's ruling on #23009 (pointer 6137585321 on #22788): "the case-set lands in the same PR as the five driver suites that run it, with zero ledger rows."
scripts/check-driver-conformance.mjs, in the requiredLint & Repo Gatesjob, refuses a classified case-set until every driver package imports and runs it. The plan row reads E4 "with E3".- This card is the "E3 and E4 in one PR" form. Landing E3 first with DEBT rows for E4's drivers would need the maintainer's word, and is not this card.
The work (ADR-0139 D3; the plan's rows E3 and E4)
driver-sqlcompiles the composed leaf in its filter compiler tofield IN (SELECT id FROM P_TABLE WHERE SCOPE AND TENANT). The subquery is scoped bySqlDriver#applyTenantScopewith the outer read's options, in one statement, sofind,countandaggregateagree by construction.driver-sqlite-wasmand the local transport ofdriver-tursoinherit it.- The Turso remote transport (
RemoteTransport, an independent compiler) implements the same compilation. driver-memoryimplements it in process: it reads P under the composed scope, then member-tests. No tenant wall is owed, because memory refuses multi-tenant boot.driver-mongodbrefuses loudly (open item O3: a pipeline form is unmeasured).- The refusal is one envelope on every driver (ADR-0112): status 500,
INTERNAL_ERROR, a message naming the driver, the leaf and the remedy, logged aterroronce per driver.- ⛔ Not
INVALID_FILTER. - ⛔ No
DriverCapabilitiesbit. - A driver refuses an uncomposed leaf on
isReadableIdsalone.
- ⛔ Not
- The conformance case-set (
READABLE_IDS_CASES, D3's last bullet) lands with the five suites.- It is parked, with no PR, on branch
claude/issue-23009-readable-ids-conformanceate641ab6d8:packages/spec/src/data/readable-ids-conformance.tsplus itsCASE_SETSrow. - That branch's other commits are feat(spec): the RLS deny sentinel and the composed ReadableIds leaf, declared once in the data entry; getReadFilter answers the one object (ADR-0139 D2) #23144's, already squash-merged to
main, so a claimant carries the two artefacts over, not the branch. packages/specand the gate script aredomain:specsurfaces. The claim declares them cross-lane.
- It is parked, with no PR, on branch
Pins (the plan's rows; red before, green after)
- E3:
- a reader with more than 2,000 readable candidates gets every visible row;
- an unreadable row stays hidden;
- a deleted parent is excluded;
countequals the rows served.
- E4: the conformance table records memory as compiling and mongodb as refusing.
- Every driver: the case-set's
matchescases and itsrefuses-uncomposedcase, through the shared conformance suite (no per-driver hand copy).
Readings this card owes (ADR-0139 open items)
- O1: the bound-parameter ceilings of SQLite, Postgres and MySQL. The record cites documented values only. E3 measures what the subquery form binds.
- O3: mongodb keeps the refusal. No pipeline prototype here.
- The driver conformance ledger only goes down. The claimant reads
coveredand DEBT before and after. Zero new DEBT rows.
Governing text
- ADR-0139 D3 and the execution plan's rows E3 and E4.
- ADR-0112: the refusal envelope.
- ADR-0139 execution: the engine-internal semi-join leaf across spec, engine, drivers and consumers (E0–E7 coordination) #22788 note 3 (the director's ruling pointer 6104842076): "D3 stands as written, per the maintainer: no capability bit, and
driver-mongodbrefuses loudly until O3 measures a pipeline form." - [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 (the 2026-08-05 driver-memory / driver-mongodb freeze) freezes defect and semantic-completion investment in those two drivers.
- ADR-0139 was accepted later (PR docs(adr): ADR-0139 — one engine-internal semi-join leaf, "the ids of object X this caller may read" (ruling A on #22590 item 3) #22707 →
a2e94c2a05, Tier H). Its D3 names memory's implementation and mongodb's refusal, so this card's two rows are the record's, not a thaw. - Nothing else in those two drivers rides along.
- ADR-0139 was accepted later (PR docs(adr): ADR-0139 — one engine-internal semi-join leaf, "the ids of object X this caller may read" (ruling A on #22590 item 3) #22707 →
State at filing (origin/main 23e689dc7d)
git grep -l "ReadableIds" origin/main -- packages/driversreturns 0 files. The controlTEMPORAL_CASESover the same pathspec returns 10.readable-ids-conformance.tsis not onmain.git cat-file -efails, whilepackages/spec/src/data/readable-ids.tsis present.
Dedupe
MCP search_issues on this repo, closed included: "ADR-0139 E3 driver-sql compiles the ReadableIds leaf applyTenantScope memory mongodb E4" returns 43 hits.
- The nearest are ADR-0139 execution: the engine-internal semi-join leaf across spec, engine, drivers and consumers (E0–E7 coordination) #22788 (the parent), ADR-0139 E2: the engine composes the
ReadableIdsleaf once per parent object, fail closed, refuses it on write verbs and for D5's three classes, and marks the scope'policy'(D2, D5) #22861 (E2), feat(spec): ADR-0139 E1 — theReadableIdsbranded comparand leaf, declared in spec and unspellable by a request #22787 (E1) and ADR (ruling A on #22590 item 3): one engine-internal semi-join leaf, "the ids of object X this caller may read"; ADR-0055 alternatives row (a) revisited for this one leaf #22678 (the ADR card). - None is E3 or E4.
Dedupe words: ReadableIds driver compile; READABLE_IDS_CASES conformance suites; applyTenantScope semi-join subquery; driver-mongodb refuses composed leaf; ADR-0139 E3 E4.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop round 1 · 2026-10-15T08:29Z
Session:
session_01GP3comALHRcRBixS2TEnLF(the dispatching seat; the dev runs as its own cloud session, named in the dispatch comment)Account:
sunhaolin(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23639-readable-ids-driversWorktree:
objectstack-issue-23639Domain:
domain:engineSeat:
domain:engine#1(seat post #6367)File surface:
packages/drivers/driver-sql/src/sql-driver.ts(the filter compiler andapplyTenantScope);packages/drivers/driver-turso/src/remote-transport.tsand its compiler;packages/drivers/driver-memory/src/memory-driver.ts(the query path);packages/drivers/driver-mongodb/src/mongodb-filter.ts(the refusal); each of the five drivers' conformance suite; changesets.domain:specseat 3 ([PM seat] domain:spec · seat 3 — 🟢 baozhoutao · session_01D6F9axfoPzR7t8G1J7Ytzz #18883) under its ruling on spec: declare the RLS deny sentinel once in@objectstack/spec, imported byplugin-securityandobjectql(ADR-0139 D2 step 2; #22861 sub-question 2 ruled (i)) #23009 (6137585321):packages/spec/src/data/readable-ids-conformance.tsand itsdata/index.tsexport, with the regeneratedapi-surface/andexport-origins/shards. Also theCASE_SETSrow inscripts/check-driver-conformance.mjs. Both are carried frome641ab6d8.Stop on any other breach and explain it in the report.
Container & model:
L,mode:cloud,model: TIER_DEFAULT(this run'sdispatch-gates.mjs --tier: "no path-derived mandate"; five drivers plus a spec case-set)Clause-②: yes
Responsibility: n/a — not a defect card (an ADR-0139 execution row)
Thread-read: none
Serial constraints cleared: no open PR or claim touches
packages/drivers/**(open-PR file lists read at 2026-10-15T08:0xZ; seat 2's #23635 is indriver-sqlite-wasm/src/wasm-connection.ts, the background flush, not the filter compiler). The ADR-0131 epic territory (#15194) does not name the drivers.Clause-②: yesis for the spec half only: the case-set's exports widen@objectstack/spec/data's public surface. The driver halves implement an already-declared leaf. Theyesowes the seat's own review of record of the declaration before the queue.Generated by Claude Code
objectstack-fleet commentedon Oct 15, 2026
Dispatch ·
domain:engineseat 1 ·session_01GP3comALHRcRBixS2TEnLF· 2026-10-15T08:32Z:mode:cloud, the dev sessionsession_01B1r5eJEPgvn7bUsfBvK2tS, titled "⚡ engine #23639 ReadableIds drivers E3+E4". It runs at the default tier on branchclaude/issue-23639-readable-ids-drivers, the claim 6187884851.@objectstack/spec, imported byplugin-securityandobjectql(ADR-0139 D2 step 2; #22861 sub-question 2 ruled (i)) #23009's ruling 6137585321.DriverCapabilitiesbit.INTERNAL_ERROR/ 500, notINVALID_FILTER.driver-memoryanddriver-mongodb([裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499's freeze).e641ab6d8withgit restore, and regenerates the spec shards. It never copies them.Fixes #23639, then anos-dev-reportcomment here.Clause-②: yesdeclaration. Over 3,000 changed lines, the PR lands only by a human merge.Generated by Claude Code