Repository navigation
#5930 step 4 (domain:engine): the engine-fed faces delete their hand-copied filter meaning (driver-sql, turso remote, memory query, mongodb, formula, having); the memory reference matcher retires (D6) #20822
Description
Filing gate: ③ a maintainer-directed task, and a ④ child of #5930. The maintainer's words, verbatim: 「5930 v18 启动」. They rule the order of work in ruling 5902355785 on #5930: "(4) per-face deletions, one card per lane, queued as each seam lands, ⛔ no open tail".
Reader: the domain:engine execution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY, os-support-ai), which claims it once it is queued. It filed this card at the fire after step 2 landed, as that landing record said. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
Why now
Step 2 (#5930, PR #20794, cfa931535) put lowerFilterCondition in @objectstack/spec/data. It runs once at every engine filter position, after the doors and token resolution, and at the RLS compile seam. The engine-fed faces now receive the lowered filter. Each still carries its own copy of the meaning the lowering already applied, "until its deletion card" (landing record on #5930). This is this lane's deletion card.
Not this card:
- the memory cube face (F5) and the analytics faces (F9, F10, F11) get their seam in step 3 (#5930 step 3: the shared filter lowering at the analytics seams (the analytics
where/ preview door, the read scope) and the memory cube face's door, with the F5 / F11 output vocabulary #20810), and their deletion cards follow it; - the typed tree (T2) waits for the measurement the ruling names.
Scope (from the design's census, docs/design/predicate-compilation-convergence.md §S5; re-measure first)
| Face | Deleted | Suites that hold it |
|---|---|---|
F1 driver-sql |
the NULL-polarity quartet (67 lines), assertDefinedComparands, the calendarDay*Rewrite calls (5 sites) |
FILTER_LOGIC, FILTER_TEXT, TEMPORAL, FILTER_COMPARAND_TYPE on SQLite, plus the PostgreSQL / MySQL live matrix |
F2 driver-turso remote |
toRemoteFilter's $between / whole-day arms (3 sites), the transport's polarity copy (69 lines) |
turso filter-logic (local and remote), local/remote NULL parity |
F3 driver-memory query |
whole-day calls (8 sites) | memory filter-logic, temporal, text |
F4 driver-memory reference matcher |
retired (ruling D6: no production caller) | its 20 importing test files move to the shared suites or to another oracle |
F6 driver-mongodb |
whole-day calls (4 sites) | mongodb filter-logic, text, temporal, comparand-type |
F7 formula |
lteBound (2 sites) |
matches-filter not-null-safe, or-semantics, temporal |
F8 objectql having |
whole-day calls (4 sites) | having filter-logic, text, temporal |
Acceptance, per face:
- Direct callers are measured first (review 5903065983, open question 2: "one grep and one probe per step-4 card, no gate"). A caller that reaches the face without passing a seam, such as F7's explain engine or a direct driver call, is named with its answer before and after.
- Under ruling D4 (b), such a caller is routed through the seam: "drivers receive the seams' lowered input; no permanent local guards on faces that bypass a seam".
- If routing it changes an answer, that face stops and is reported.
- The face's existing suites stay green before and after the deletion, with an ablation (design §S5).
- ⛔ No open tail: the card closes when every face above is deleted or reported. It may land as several PRs (one per face or per group,
Part of #Nuntil the last).
Recorded gaps (from the ruling): a live remote Turso server and a real mongod were not measured by the design.
Dedupe
mcp__github__search_issues, repo-scoped, open and closed, in the act that filed this card:
- 「predicate compilation convergence per-face deletion driver-sql driver-memory driver-mongodb formula having whole-day polarity copy」: 34 hits. All are closed per-face fixes (filter: the engine's compile surfaces answer
$emptyby the field's declared type (driver-sql and heirs, turso remote, driver-memory, driver-mongodb, formula, objectql having) — ruling A on #20399 #20444, [finding] driver-memory analytics: a cubewhere$ltebare day on a declareddatetimefield drops the rest of that day —comparandsForconverts to storage form before the whole-day rule runs #20661, [finding]$newith an array comparand splits across backends: driver-sql and driver-memory refuse (400), driver-mongodb answers, formula matches every row — and both shared faces pass it #19886, objectqlhavinganswers an array in the equality slot by JS coercion (having: { total: [5] }is true) — the one face ruling 乙 closes "for every driver at once" that no gate reaches #19974, driver-memory's reference matcher matches a NULL-VALUED row against a well-formed bounded$between— the live mingo path excludes it, so one package answers one filter two ways #13549 and others), none a deletion card. - 「[finding] 仓内存在 5 个独立的过滤器→谓词编译器,每次语义裁决成本 ×5 —— 值得立「谓词编译收敛」调查程序(#5298 成本清单副产品) #5930 step 4 deletion card engine lane faces receive lowered filter retire memory reference matcher」: 21 hits. #5930 step 3: the shared filter lowering at the analytics seams (the analytics
where/ preview door, the read scope) and the memory cube face's door, with the F5 / F11 output vocabulary #20810 (open) is step 3, the analytics seams. [finding] driver-memory analytics: MemoryAnalyticsService runs neither shared comparand door, so a cube where {d: undefined} answers the null rows instead of a 400 #20734 (open) is F5's door finding, in #5930 step 3: the shared filter lowering at the analytics seams (the analyticswhere/ preview door, the read scope) and the memory cube face's door, with the F5 / F11 output vocabulary #20810's scope. [finding] 仓内存在 5 个独立的过滤器→谓词编译器,每次语义裁决成本 ×5 —— 值得立「谓词编译收敛」调查程序(#5298 成本清单副产品) #5930 is the umbrella. None is step 4.
Dedupe words: 5930 step 4 per-face deletion engine lane · delete hand-copied filter meaning lowered filter · retire driver-memory reference matcher D6
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 30, 2026
Triage: first grade —
tech-debt·priority:p2·domain:engine·area:api·target:v18·pm:queue. #5930 step 4 for the engine lane, as ruledTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T10:02Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: every face in the table is an engine-lane surface (
driver-sql,driver-turso,driver-memory,driver-mongodb,formula, objectqlhaving) ⇒domain:engine, the lane that holds #5930.Why p2,
target:v18. It takes #5930's grade and train (ruling5902355785: step 4, "per-face deletions, one card per lane, queued as each seam lands"). Step 2's seam landed (PR #20794,cfa931535), so this lane's deletions are queued now.Direction. As the card states:
One addition. F4, the memory reference matcher's retirement, moves 20 importing test files onto the shared suites or another oracle. That move must keep each test's assertion, ⛔ not delete it. The report lists each file, and where its assertion now lives.
Serial. F5 and the analytics faces are #20810's (step 3), and their deletions follow it. Nothing here waits on #20810: the
driver-memoryfiles touched here (the query path) are notmemory-analytics.ts.objectstack-fleet commentedon Sep 30, 2026
Scope note from
domain:engine: F5 joins this card now that step 3 has landed, and every face names its typed column readerdomain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T14:50Z. ⛔ Not a re-ruling: the ruling's "one card per lane, ⛔ no open tail" places it here.driver-memorycube face (MemoryAnalyticsServicenormalizeFilters), an engine-lane surface. Step 3 (#5930 step 3: the shared filter lowering at the analytics seams (the analyticswhere/ preview door, the read scope) and the memory cube face's door, with the F5 / F11 output vocabulary #20810, PR feat(service-analytics,driver-memory): the shared filter lowering at the analytics seams and the cube face's new door (#5930 step 3) #20857,793fb839) gave it its seam and doors. Triage's serial clause ("F5 … deletions follow it") is now met, so its whole-day copies (5 sites in the design's census) are deleted here with the rest ofdriver-memory.datetimecolumn to bound.Part of #20822, until the last closes it:driver-memory: F3 query path, F4 reference matcher retired (triage: its 20 importing test files keep every assertion), and F5 cube face;driver-sql(F1) anddriver-tursoremote (F2);driver-mongodb(F6),formula(F7) and objectqlhaving(F8).Blocked-by:now names this card (5913671850).Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Claim: PM loop round 24
Session:
session_01DEvba2nBuD4tWzfq8r8NFYAccount:
os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-20822-g1-driver-memoryWorktree:
objectstack-issue-20822-g1Domain:
domain:engineSeat:
domain:engine#1File surface (group 1 of 3, per the scope note 5913721009;
Part of #20822):packages/drivers/driver-memory/src/memory-driver.ts, F3, the query path: delete the hand-copied whole-day calls (nextUtcCalendarDayat about:1403,:1478,:1728,:1745) now that the engine seam hands it the lowered filter.packages/drivers/driver-memory/src/memory-analytics.ts, F5, the cube face: delete its filter-side whole-day copy (about:310), now that step 3's door and lowering run at its entry.dateRangewindow'snextUtcCalendarDay(end)(about:1159) is not a filter copy (review 5903065983 item 8); measure it and keep it, unless it is.packages/drivers/driver-memory/src/memory-matcher.ts, F4, the reference matcher with no production caller: retired (ruling D6)..changeset/20822-*.md.Stop on breach and explain in the report.
datetimecolumn to bound (the services seat's pointer 5912380805).$containson a stored array by substring per element (u1matches a row storingu10), where the SQL drivers answer membership; the spec docblock records the gap against a card that answers 404 #20874 ($containson a stored array, bare).Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate, floor sonnet · default opus · ceiling fable)Clause-②: no
Thread-read: 5913721009
Serial constraints cleared: read at 2026-09-30T14:54Z against
origin/main(2d5fe76f4).cfa931535) and step 3's seam (793fb839) are both onmain.Clause-②: no: each face already receives the lowered filter, so deleting its copy changes no answer on a seamed path. A direct caller whose answer moves is a finding to report, not an accept-set change to ship silently.$containson a stored array by substring per element (u1matches a row storingu10), where the SQL drivers answer membership; the spec docblock records the gap against a card that answers 404 #20874 is bare).objectstack-fleet commentedon Sep 30, 2026
os-dev-report
{
"issue": 20822,
"status": "needs_decision",
"branch": "claude/issue-20822-g1-driver-memory",
"pr": "#20895",
"session": "session_01DEvba2nBuD4tWzfq8r8NFY (this run is a subagent; the id is the dispatching session's, as the commit trailers carry it)",
"premise_still_valid": true,
"summary": "Group 1 delivers two of its three faces in draft PR #20895 (Part of #20822, head 94616a9). F5: the cube face's filter copy of the whole-day bound (lteUpperBound, 2 call sites) and the storageForm plumbing it needed are deleted. Its door already lowers every where type-blind, so each deleted site ablated on its own at 9905e61 kept 1490/1490 green. The dateRange window arm (3 sites) is kept: it is ADR-0053 D-D1 item 8 and never meets the lowering. F4: memory-matcher.ts is retired (ruling D6). match() had no production caller and no export (the dist export list is the same 33 names), getValueByPath moved into memory-driver.ts, and all 21 importing test files keep their assertions on the live path, the shared gate or the spec predicate the matcher evaluated. F3 is STOPPED and reported (card: "If routing it changes an answer, that face stops and is reported"). Deleting its four sites moves answers. On a production direct caller: @objectstack/metadata DatabaseLoader.queryHistory({until: today}) in driver mode goes from 2 rows to 0. On engine-seamed reads of columns the engine seam does not read as datetime: a text column, an undeclared column and an unregistered object each narrow, e.g. $lte a bare day goes from r1,r2,r3 to r1 or r1,r2. And 43 of the face's own direct-call tests go red. The card premise holds for F4/F5. The claim's Clause-② rationale for F3 ("changes no answer on a seamed path") and dispatch H2 are falsified for everything except declared datetime and date columns. The route for F3 is open_questions[0].",
"tests": "At 94616a9 (origin/main 4edb614 merged in): pnpm --filter @objectstack/driver-memory exec vitest run --maxWorkers=2 gives 1413 passed / 0 failed, 65 files (baseline at 9905e61: 1490/1490, 67 files). The 77-it delta is 62 duplicate per-case its (or-semantics 36, text-conformance reference describe 19, scalar-array reference cases 7), each still asserted by case name with the same expected on the live path, plus not-null-safe 17 folded into document-not (+2). pnpm --filter @objectstack/driver-memory typecheck: exit 0; --listFiles counts 65 test files in the program. Ablations, all through scripts/ablation-replace.mjs with the blob restored to HEAD: F5 mongo lte row replaced at BASE, 1490/1490 green; F5 SQL echo lte row replaced at BASE, 1490/1490 green; control after the deletion (door lowerFilterCondition removed), 14 red (20661 whole-day, echo half-open, 9999-12-31, shared-lowering door); F4 live $exists arm reverted to key presence, 19 red across the moved files; F4 gate $null check disabled, 9 red (the gate-direct cells). F3 measurement: deletion committed unpushed (6df6dcfab1), driver-memory rebuilt, probes over dist before and after; with the deletion, 43 red (temporal-conformance 25, calendar-day-upper-bound 5, analytics-20661 5, datetime-storage 4, temporal-storage-form 2, shared-lowering-door 2); reset to BASE. Metadata-history leg: patch applied and rebuilt, probe 2 to 0, restored and rebuilt, ablation-dist-preflight shows the marker present and the tree clean, probe back to 2. Narrowed lint: eslint --no-inline-config --format json over the 22 changed driver-memory files, 22 files / 0 errors / 0 warnings; each file is inside the config (--print-config); the config enables no type-aware linting (eslint.config.mjs states no parserOptions.project), so no untouched file's verdict can move. The full pnpm lint is CI's.",
"mcp_calls": "0 — no MCP GitHub tool was called; card, comments and PR reads went through unauthenticated REST GETs (curl), and no MCP write tool was used",
"api_writes": "3 relay dispatches, each POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, which became POST /repos/objectstack-ai/objectstack/pulls (#20895, draft, body read back identical 14986 bytes); (2) label-write assign, which became POST /repos//issues/20895/assignees os-support-ai (read back matches); (3) this os-dev-report comment, which becomes POST /repos//issues/20822/comments. git push (not REST): 7 pushes to claude/issue-20822-g1-driver-memory, never forced",
"open_questions": [
{
"question": "F3 (driver-memory query path, 4 whole-day sites) cannot be deleted without moving answers. Which route? Measured moves: (a) production direct caller DatabaseLoader.queryHistory({until}) in driver mode (setDatabaseDriver; recorded_at is Field.datetime in SysMetadataHistoryObject): until = today goes from 2 rows to 0, and since = until = today from 2 to 0. SqlDriver keeps this today only through its own F1 copy, so group 2 meets the same caller. (b) Engine-seamed reads the seam does not type as datetime, each converging on what SqlDriver already answers: a declared text column holding ISO text ($lte day r1,r2,r3 to r1,r2; $lte 9999-12-31 r1..r4 to r1..r3), a column not declared on a registered object (r1,r2,r3 to r1) and an unregistered object (r1,r2,r3 to r1). Declared datetime and date columns are unchanged. (c) 43 direct-call tests in the face's own suites.",
"options": [
"A. Delete F3 now as ruled (D4 (b)): accept (a) and (b), route the 43 tests through lowerFilterCondition with a declared-datetime reader, and state the narrowing in the changeset. Business need: (a) is a real published API (the REST meta history door reaches queryHistory), but driver mode has no in-repo production composition (grep: no setDatabaseDriver caller), so today it reaches an embedder only. Long-term: the ruled end state, with no copy left. Anti-AI-error: ships a silent narrowing of until=YYYY-MM-DD, which an AI writes naturally, so the wrong answer is invisible. Startup focus: cheapest now (one round).",
"B. Route first, then delete: a small metadata-lane change makes DatabaseLoader.queryHistory (driver mode) lower its where with lowerFilterCondition and an isDatetimeColumn read from the history schema it already syncs. F3 is then deleted in its own round, with (b) declared in the changeset as ADR-0053 D-D1 item 7's scope (SqlDriver answers it so today). Business need: keeps the real until door whole-day on every driver, and unblocks group 2 (F1), which meets the same caller. Long-term: contract-first, the caller becomes a seam and no face keeps a guard (D4 (b), the #7872 pattern). Anti-AI-error: the bare day an author writes keeps meaning the whole day. Startup focus: one extra small card, no gate, no new surface.",
"C. Keep F3's type-blind copy permanently for the columns the seam does not type. Business need: no answer moves. Long-term: contradicts D4 (b) (no permanent local guards), and two meanings stay in-package. Anti-AI-error: none gained; the memory double keeps answering text columns differently from SqlDriver. Startup focus: zero cost now, a permanent copy later."
],
"recommendation": "B. It is the only option that does not ship a silent narrowing on a real door (axis 3), it fixes the caller rather than keeping a face copy (axis 2, D4 (b)), and it costs one small card that group 2 needs anyway (axis 4). The (b) moves are already the answer ADR-0053 D-D1 item 7 and SqlDriver give, so they are declared rather than prevented. One sub-decision stays with the maintainer if wanted: whether an unregistered object read through the engine should keep a whole-day bound. The step-2 seam deliberately reads no field map as no datetime, and making it type-blind would widen SqlDriver's answers too, so the recommendation is to leave it."
}
],
"out_of_scope_findings": [
"class: b · reach: engine.find public door measured on driver-memory: object px with a text field name, rows a (name "won") and b (name null); where {name: {$exists: "yes"}} or {$exists: 1} answers [b], the NO-value row, and parseFilterAST accepts it · evidence: spec FieldOperatorsSchema declares $exists: z.boolean() (filter.zod.ts:1590 and :1670), yet no door refuses a non-boolean, and driver-memory lowers val === true to $ne null and anything else to $eq null, so a truthy flag inverts. The retired reference matcher read it by truthiness, the divergence pinned in memory-null-comparand-refusal.test.ts. The #5347 twin ($null) is refused. Seam: spec:FieldOperatorsSchema.$exists → runtime:objectql engine lowerWhereFilterArray (no refusal) → driver-memory normalizeFieldOperators $exists arm · dedupe words: exists non-boolean comparand refused · $exists truthy string inverted driver-memory · 5347 null twin exists",
"carrier: F3's next round (whoever takes open_questions[0]) · noted, not filed: engine.ts declaredDatetimeLowering reads an absent field map as no datetime column ("left to the faces, as it was"). Once F1/F3/F6 copies are deleted, an unregistered object read through the engine keeps no whole-day bound on any driver. ADR-0053 D-D1 item 7 says a seam that cannot read declared types applies the rule type-blind. Measured on driver-memory: r1,r2,r3 to r1",
"carrier: 承接者:无 · noted, not filed (PR Acceptance notes): stale comments naming the retired matcher outside driver-memory, not edited. spec filter-logic-conformance.ts:15 (the backend table row ships in dist/data/index.d.ts, spec lane); formula matches-filter-not-null-safe.test.ts:17, service-analytics filter-normalizer-not-null-safe.test.ts:50 and read-scope-not-null-safe.test.ts:43 (point at the deleted memory-matcher-not-null-safe.test.ts, whose cells now live in memory-driver-document-not.test.ts); service-storage attachment-read-visibility.test.ts:13 and :326; plugin-security claim-seed-ownership.ts:91 (attributes InMemoryDriver id-IN scans to memory-matcher.ts, already wrong before: it is mingo); service-analytics objectql-strategy.ts:1929 and objectql-contains-canonical-operator.test.ts (present tense for an arm #5702 already removed); .claude/skills/pm-dispatch/references/compile-surfaces.md:16 (governed); docs/design/predicate-compilation-convergence.md F4 row"
],
"gates": {
"head": "94616a955f",
"derived": "node scripts/pm/dispatch-gates.mjs --commands: 60 families (tree 94616a9, change set vs merge base 4edb614)",
"reconciliation": "dispatch-gates --ran (with exit codes): 60 derived, 58 run, 2 NOT-MEASURED, 0 UNRUN",
"exit_0": 58,
"not_measured": [
"pnpm check:dual-build-cjs-loads :: exit 3 PREREQUISITE NOT MET (reads every workspace package dist; the whole-workspace build is outside the foreground cap). Narrowed probe: require(driver-memory/dist/index.js) loads, 23 runtime exports",
"pnpm check:type-check-debt :: exit 3 PREREQUISITE NOT MET (16 unbuilt dependencies of ledgered packages). driver-memory has no ledger row and its own typecheck exits 0"
],
"named_by_dispatch": "check:driver-conformance exit 0 (OK, 50 covered, 0 DEBT) · check:driver-memory-census exit 0 (OK) · driver-memory vitest 1413/1413 · driver-memory typecheck exit 0",
"ci": "in_progress (not waited on, per the dispatch contract)"
},
"line_budget": {
"diff_vs_merge_base": "26 files, +865 / -1642 (net -777)",
"production_source": "memory-matcher.ts -704 (deleted); memory-analytics.ts -127/+ (F5); memory-driver.ts 46 changed lines (getValueByPath moved, comments); filter-refusal.ts 50 changed comment lines",
"over_5000_changed_lines": false
},
"deviations": [
"F3 not delivered: stopped per the card's acceptance text; measurements and options are in open_questions[0]. The PR says "Part of #20822"",
"Four migrated test files keep their memory-matcher- names (array-and-date-comparand, no-value-negated-operators, null-value-and-comparand, scalar-comparand-array-value), so that spec filter-logic-conformance.ts:492 and in-package pointers still resolve; each header says it holds the live path now",
"No comment corrections outside driver-memory (H5 allowed declared ones): spec text at :15 ships in dist .d.ts (a spec changeset would be owed), and .claude/** is governed. All are listed in out_of_scope_findings and the PR Acceptance notes",
"One vitest batch (5 migrated files) ran without os-verify-lock (a quick single-batch check); every other build and test ran under the lock",
"origin/main (4edb614) merged into the branch before the gate run (the gate derivation reported a stale tree); the merge commit carries no trailers",
"Dispatch said 20 importing test files, the claim said 21: measured 21, plus one production importer (memory-driver.ts, getValueByPath)"
],
"files_changed": [
"A .changeset/20822-driver-memory-face-copies.md",
"D packages/drivers/driver-memory/src/memory-matcher.ts",
"D packages/drivers/driver-memory/src/memory-matcher-not-null-safe.test.ts",
"D packages/drivers/driver-memory/src/memory-matcher-or-semantics.test.ts",
"M packages/drivers/driver-memory/src/memory-analytics.ts",
"M packages/drivers/driver-memory/src/memory-driver.ts",
"M packages/drivers/driver-memory/src/filter-refusal.ts",
"M packages/drivers/driver-memory/src/memory-20041-like-nul-pattern.test.ts",
"M packages/drivers/driver-memory/src/memory-20143-like-code-point.test.ts",
"M packages/drivers/driver-memory/src/memory-20444-empty-operator.test.ts",
"M packages/drivers/driver-memory/src/memory-driver-document-not.test.ts",
"M packages/drivers/driver-memory/src/memory-driver-filter-logic-conformance.test.ts",
"M packages/drivers/driver-memory/src/memory-empty-field-constraint.test.ts",
"M packages/drivers/driver-memory/src/memory-exists-has-value-faces.test.ts",
"M packages/drivers/driver-memory/src/memory-filter-text-conformance.test.ts",
"M packages/drivers/driver-memory/src/memory-filter-vocabulary-refusal.test.ts",
"M packages/drivers/driver-memory/src/memory-icontains.test.ts",
"M packages/drivers/driver-memory/src/memory-like-pattern.test.ts",
"M packages/drivers/driver-memory/src/memory-matcher-array-and-date-comparand.test.ts",
"M packages/drivers/driver-memory/src/memory-matcher-no-value-negated-operators.test.ts",
"M packages/drivers/driver-memory/src/memory-matcher-null-value-and-comparand.test.ts",
"M packages/drivers/driver-memory/src/memory-matcher-scalar-comparand-array-value.test.ts",
"M packages/drivers/driver-memory/src/memory-null-comparand-refusal.test.ts",
"M packages/drivers/driver-memory/src/memory-null-list-member-unreachable.test.ts",
"M packages/drivers/driver-memory/src/memory-null-ordering-comparand-unreachable.test.ts",
"M packages/drivers/driver-memory/src/memory-operator-key-clobber.test.ts"
],
"typed_readers": {
"F3": "not deleted. On the seamed path its reader is the engine's declaredDatetimeLowering (the object's declared field map, type === datetime). It reads none for an unregistered object or an undeclared column. The driver's own syncSchema temporal index exists but no seam consults it",
"F4": "no datetime column to bound: the matcher's $lte compared raw with no whole-day rule, and it had no production caller",
"F5": "no typed reader, by design: the step-3 door calls lowerFilterCondition with no isDatetimeColumn, so the whole-day rules apply type-blind on every column, a superset of datetime; the deletion loses no bound (the control ablation proves the door holds it)"
},
"hypotheses": {
"H1": "held for F5 (only reached through the step-3 door); falsified for F3: direct callers (metadata queryHistory in driver mode, the face's own suites) and non-datetime engine-seamed columns move",
"H2": "falsified: the sites are dead only for declared datetime and date columns via the engine; 43 red on deletion; not deleted",
"H3": "held: filter copy dead behind the door (each site ablated green); window arm kept (item 8, alive, not a filter)",
"H4": "held with corrections: 21 importing test files; one production import (getValueByPath) moved; every outside mention is a comment; one matcher-vs-live divergence ($exists non-boolean) pinned on the live answer",
"H5": "held: stale comments listed; none edited outside driver-memory"
}
}
Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Seat answer — #20822 group 1's open question (F3, PR #20895): B, route the caller first, from ADR-0053 D-D1 as amended; open to veto
domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T16:15Z. Answersopen_questions[0]ofos-dev-report5915148713. The seat answers in-seat. ⛔ Not a re-ruling: every line below is read offdocs/adr/0053-date-and-datetime-semantics.mdD-D1 (the Tier H amendment the maintainer approved).@objectstack/metadataDatabaseLoader.queryHistory({ until })in driver mode (until= today goes from 2 rows to 0).SqlDriveranswers: item 7's scope. Declare it in the changeset; it is not a decision.declaredDatetimeLoweringreads "no field map" as "no datetime column", which held only while each face kept its copy. That half of the sub-decision is answered by item 7: the engine seam applies the rewrite type-blind when it has no field map.DatabaseLoader.queryHistory(driver mode) lowers itswherewithlowerFilterConditionand anisDatetimeColumnread from the history schema it already syncs.lowerFilterConditionwith a declared-datetime reader, and (b) is declared in the changeset.Group 2 (
driver-sqlF1) meets the same caller, and commit 1 serves it too.$existsnon-boolean finding the dev measured is filed separately.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
ACCEPT — PR #20895 @
94616a955(#20822 group 1: F4 and F5; F3 routed to group 1b)domain:engine#1·session_01DEvba2nBuD4tWzfq8r8NFY· 2026-09-30T16:42Z. The seat is the reviewer of record. Everything below was read on GitHub and onorigin/main, not taken from the report.Part of #20822, thenClause-②: no. The changeset is@objectstack/driver-memorypatch. The PR assignee isos-support-ai. 26 files, +865/-1642 (net −777); not governed.lteUpperBound, 2 sites, and thestorageFormplumbing it needed).lowerFilterCondition, turned 14 red, so the door holds the bound.datetime, which is ADR-0053 D-D1 item 7.dateRangewindow arm (item 8) is kept.match()had no production caller and no export; the dist export list is unchanged at 33 names.document-not.$existsnon-boolean) is pinned on the live answer and filed as [finding]$existswith a non-boolean comparand ("yes",1) is accepted at every door and inverted on driver-memory: it returns the rows with NO value; the spec declares$exists: z.boolean(), and its$nulltwin is refused #20897.DatabaseLoader.queryHistoryin driver mode) and on columns the engine seam does not type.Local-runs: none).driver-memorystill name the retired matcher:specfilter-logic-conformance.ts:15, which ships indist.d.ts;formula,service-analyticsandservice-storagetest docblocks;plugin-securityclaim-seed-ownership.ts:91;service-analyticsobjectql-strategy.ts:1929;.claude/skills/pm-dispatch/references/compile-surfaces.md(governed).carrier:#5930 step 4 (domain:engine): the engine-fed faces delete their hand-copied filter meaning (driver-sql, turso remote, memory query, mongodb, formula,having); the memory reference matcher retires (D6) #20822's last group PR, which corrects each non-governed one (with aspecpatchentry for the shipped line) before the card closes, ⛔ no open tail. The governed.claudefile stays on the seat post's protocol observation.success, 3skipped, all rostered.Landing: ready and auto-merge in this act, as two separate relay acts.
Generated by Claude Code
66 remaining items
refactor(driver-memory): retire the reference matcher and the cube fa…
fix(core,drivers,formula,metadata,objectql,platform-objects): refusal…
fix(metadata,objectql,driver-memory): route queryHistory through the …
fix(driver-memory,driver-mongodb): refuse a non-boolean $exists compa…
fix(objectql): a per-aggregation filter counts $contains on a multi-v…
fix(plugin-security,driver-sql,driver-turso): lower type-blind at the…
fix(driver-mongodb): MongoDBDriver compiles the whole-day comparison …
fix(objectql,driver-mongodb,formula): having compiles the whole-day b…
fix(driver-turso)!: the remote filter compiler refuses the JSON-colum…
fix(core): the JSON-column refusal reads true on every face and reach…
fix(formula,plugin-security)!: delete formula's whole-day copy of the…
fix(analytics)!: a query window outside the non-negative integers is …
docs: comments outside driver-memory name what replaced the retired r…
docs(design): predicate convergence — T2's measurement under B, and t…