You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
objectql read path: a declared column the driver did not return stays an absent key, so mongo/memory rows are sparse where SQL rows are not #29408
Filing gate: ① a measured cross-driver gap, named as follow-up D.1 of the #29094 ruling (option A, maintainer 「同意」, ruling comment 6579342813). Non-blocking, so it is filed as p3.
Reader: domain:server, packages/objectql/src/declared-read-columns.ts and the engine's read path that calls it.
Dedupe (open AND closed): "materializeDeclaredFields null driver" → #8489, #9276 and #4953 (all closed; #9276 is the undefined-valued own key, a different shape). "declared column absent mongo read null" → none. None fills an absent declared column on read.
reach: any object served by the mongo or memory driver whose row was inserted without a value for a declared field, read through REST or the engine.
type: Bug
Business reason: the same record reads differently by driver. SQL answers a declared column as null, while mongo and memory leave the key out. A client predicate such as an action visible faults on the missing key and hides the button. #29094 keeps that surface sparse by ruling, but a column the read named, and whose persisted state is in hand, has no reason to be absent.
What the code does on main
withDeclaredColumnsOnly / rowsWithDeclaredColumnsOnly (packages/objectql/src/declared-read-columns.ts, around line 106) only remove keys outside the declared set. They never add a declared key the driver left out.
packages/drivers/driver-mongodb/src/mongodb-driver.ts (around lines 83–85) says nothing is stored for a field given no value, so the row has no key for a field that was never written. The memory driver keeps stored null and absent key apart in the same way.
Wanted
When the read selects a declared column (an explicit $select that names it, or a whole-record GET), and the driver returns no key for it, the engine answers null. That matches the "IN HAND" rule of materializeDeclaredFields: the persisted state is in hand, so null is honest. Columns the read did not select stay absent, and so do columns that field-level security refused. Pin the result across SQL, mongo and memory.
Claim: PM loop round 9 · 2026-11-02T15:36Z
Session: session_01ADHkmQjPiXgNoSaEpqeGvY (seat); the dev is the card thread, and its first report names its session
Account: os-steve
Branch: the card thread's harness-pinned branch, named in its first report (it names no issue, so this claim is the identity record)
Worktree: the card thread's own
Domain: domain:server
Seat: domain:server#1
Ruling-ref: 6579342813 (#29094 option A; this card is its follow-up D.1)
File surface: packages/objectql/src/declared-read-columns.ts and the engine read path that calls it, tests, and an @objectstack/objectql patch changeset. ⛔ No packages/spec/**, no skills/**, no client binding, no new error code.
Container & model: S, mode:thread, model as the thread was opened, effort: medium
Clause-②: no (expected: only a read answer gains a null key for an in-hand declared column; the dev measures, and stops if anything else moves)
Metadata-protocol: none (expected)
Responsibility: the code is the engine's declared-column read filter · one record reads differently by driver (SQL null, mongo/memory absent key) · reached by every mongo- or memory-backed object with an unwritten declared field
Thread-read: 6579342813
Premise: as filed; the dev re-measures on current main first
Serial constraints cleared: no in-flight card of this seat touches declared-read-columns.ts or the engine read path. #29241 (PR #29384) edits validation/record-validator.ts only.
Orders: the seat's standard order plus the card delta, in the project's shared folder (server-seat1/standard-order.md, server-seat1/29408-delta.md).
Claim: PM loop round 9 (revised: branch and dev session named) · 2026-11-02T15:38Z (supersedes 6581219297)
Session: session_01ADHkmQjPiXgNoSaEpqeGvY (seat); the dev is the card thread, session_01ADHkmRKR6AV3yXf6HimS9d
Account: os-steve
Branch: claude/project-thread-p5djpl (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
Worktree: the card thread's own
Domain: domain:server
Seat: domain:server#1
Ruling-ref: 6579342813 (#29094 option A; this card is its follow-up D.1)
File surface: packages/objectql/src/declared-read-columns.ts and the engine read path that calls it, tests, and an @objectstack/objectql patch changeset. ⛔ No packages/spec/**, no skills/**, no client binding, no new error code.
Container & model: S, mode:thread, model as the thread was opened, effort: medium
Clause-②: no (expected: only a read answer gains a null key for an in-hand declared column; the dev measures, and stops if anything else moves)
Metadata-protocol: none (expected)
Responsibility: the code is the engine's declared-column read filter · one record reads differently by driver (SQL null, mongo/memory absent key) · reached by every mongo- or memory-backed object with an unwritten declared field
Thread-read: 6579342813
Premise: as filed; the dev re-measures on current main first
Serial constraints cleared: no in-flight card of this seat touches declared-read-columns.ts or the engine read path. #29241 (PR #29384) edits validation/record-validator.ts only.
Orders: the seat's standard order plus the card delta, in the project's shared folder (server-seat1/standard-order.md, server-seat1/29408-delta.md).
{
"issue": 29408,
"status": "done",
"branch": "claude/project-thread-p5djpl",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29528",
"session": "session_01ADHkmRKR6AV3yXf6HimS9d",
"premise_still_valid": true,
"summary": "Measured on base aca58cdb6 through the engine: SQLite answers an unwritten declared column as null on whole/list/naming-projection reads, memory and mongo (driver fake Db) return no key. The engine now answers every stored declared column the read selected as null when the driver returned no key (selectedStoredColumns + withSelectedColumnsAnswered beside withDeclaredColumnsOnly, called once in find and findOne on driverAst.fields). Unselected, formula, undeclared and federated-unprovisioned columns stay absent; an FLS-refused column stays absent because the security mask runs after the verb body. Clause-2 measured no: same rows and values base vs head, only null keys added.",
"tests": "head b38c2360: objectql 534/534 files 10328/10328; rest 371/371 files 7032 passed 332 skipped; driver-mongodb 725 passed 190 skipped (mongod-gated); driver-memory 1767/1767; new files selected-declared-columns-answered 14/14, declared-column-null-on-read (runtime, SQLite + SecurityPlugin) 6/6, mongodb-declared-column-null-on-read 4/4. Ablations via ablation-replace, each red then restored with git diff HEAD empty: A1 projection ignored -> 3 red; A2 declared intersection removed -> 1 red; A4 federated exclusion removed -> 1 red; A3 fill moved after the security mask (objectql rebuilt, dist-preflight marker present in 4 files, absent from 14 after restore) -> 2 red incl FLS-REFUSED stays absent, green leg 6/6.",
"gates": "dispatch-gates --commands on b38c2360 after the last commit: 64/64 exit 0; --ran: 64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN. Prerequisites: git fetch of the teardown fixture commit 621a4876, build of the 7 packages check:dual-build-cjs-loads reads. lint (root eslint --no-inline-config on objectql, runtime, driver-mongodb): exit 0. typecheck objectql, runtime, driver-mongodb: exit 0. CI check-runs: in_progress at report time.",
"dogfood_battery": "7daf9652 (final head adds only a driver-mongodb test-file commit, outside the dogfood closure) · VERDICT command-exit 1 · Test Files 2 failed/395 passed/3 skipped (400) · Tests 4 failed/3261 passed/28 skipped (3293) · failures: flow-runas.dogfood.test.ts x3 (member flow trigger answers 404 RECORD_NOT_FOUND), declarative-endpoint-anonymous-guest.dogfood.test.ts x1; control with the new fill disabled at both call sites (objectql rebuilt) fails the same 4 of 12, so not this change",
"mcp_calls": "3 — issue_read get, issue_read get_comments, pull_request_read get (all reads)",
"api_writes": "2 — relay pr_create (PR #29528), relay post-stamped comment on #29408 (this report)",
"files_changed": [
".changeset/29408-selected-declared-column-null.md",
"packages/objectql/src/declared-read-columns.ts",
"packages/objectql/src/engine.ts",
"packages/objectql/src/selected-declared-columns-answered.test.ts",
"packages/objectql/src/engine.test.ts",
"packages/objectql/src/engine-formula-projection-trim.test.ts",
"packages/objectql/src/federated-injected-column-readers.test.ts",
"packages/runtime/src/declared-column-null-on-read.test.ts",
"packages/drivers/driver-mongodb/src/mongodb-declared-column-null-on-read.test.ts"
],
"line_budget": "+693 / -7 across 9 files (source +113 incl. docblocks in declared-read-columns.ts and engine.ts; the rest tests and changeset); under the 3000 human-merge threshold",
"deviations": [
"Real mongod NOT MEASURED: conda-forge mongodb-8.3.7 downloaded and matched its sha256, but running it was refused by this session's permission layer; mongo measured and pinned through the driver's fake Db, as the delta's fallback allows.",
"driver-memory has no committed real-driver pin: a first version bound InMemoryDriver in the runtime test and check:driver-memory-census refused it as a new consumer (a maintainer ruling); the binding was removed. Memory was measured once with an uncommitted probe; its shape is pinned by the objectql sparse driver.",
"Forced test edits: engine.test.ts five Expand Related Records cases gain created_at/updated_at null; engine-formula-projection-trim.test.ts CONTROL gains queue null; federated-injected-column-readers.test.ts gains one census row (excludes).",
"Dogfood ran on 7daf9652, one commit before the final head (that commit touches only the driver-mongodb test file).",
"A3 first attempt was a no-op: the marker spelling failed the objectql DTS build, tree restored by trap, re-run with a statement marker; A3 was then run again after the runtime test dropped driver-memory.",
"The first gate run was stopped mid-way because later commits moved the head; the full list was re-run on b38c2360.",
"PR opened with no assignees (relay ruling); the harness asks for os-steve as assignee and reviewer via MCP writes, which the standard order forbids."
],
"open_questions": [
{
"question": "Should driver-memory get a real-driver pin for this read shape?",
"options": ["A: leave it pinned by objectql's sparse driver (today)", "B: rule a new driver-memory census consumer for packages/runtime/src/declared-column-null-on-read.test.ts and add the memory leg back"],
"recommendation": "A, because the census exists to stop new driver-memory consumers and the engine seam is driver-agnostic; the sparse driver reproduces the measured memory shape."
},
{
"question": "The write echoes (insert/update answers) stay sparse on mongo/memory while SQL echoes null. Follow-up card?",
"options": ["A: no card; out of this read scope", "B: seat files a follow-up for the write echoes"],
"recommendation": "B if the #29094 D-list wants every record body alike; otherwise A."
}
],
"security_findings": "none",
"out_of_scope_findings": [
"class: a · reach: dogfood battery on base-equivalent code (fill disabled) · flow-runas.dogfood.test.ts 3 cases and declarative-endpoint-anonymous-guest.dogfood.test.ts 1 case fail with 404 RECORD_NOT_FOUND on the member/guest flow trigger in this container; CI main status not checked · dedupe words: flow-runas RECORD_NOT_FOUND trigger, runAs system elevates 404, anonymous guest flow endpoint dogfood"
]
}
{
"issue": 29408,
"round": 2,
"status": "done",
"branch": "claude/project-thread-p5djpl",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29528",
"head": "b55451a4568c13e077880b6a1dec7281f0b2a684",
"session": "session_01ADHkmRKR6AV3yXf6HimS9d",
"premise_still_valid": true,
"summary": "Round 2 on review issuecomment-6584622486. M1: plugin-audit sys-audit-log-record-views-columns.test.ts takes the stamped keys from the stub driver's stored row (new storedRows on the stub), not an engine read-back; the it.each and the ip_address assertion are unchanged and strict. S2: selectedStoredColumns also leaves out a PLATFORM_PROVISIONED_COLUMNS timestamp on a federated object whose field map does not declare it (systemFields false / audit false), via isFederatedObject; id stays, an author-declared (remote-mapped) timestamp is still answered null; census row added. S1: the changeset and PR body say a formula over an unwritten field on mongo/memory used to fault to null and now evaluates against null, as on SQL, under Who sees it; the Clause-② line keeps 'no' and no longer claims same values. origin/main merged (a3cdd97a, includes #29451).",
"tests": "Suites on a3cdd97a, all exit 0: objectql 535 files/10409; rest 373/7057 passed 332 skipped; runtime 525/8490 passed 19 skipped; driver-mongodb 725 passed 190 skipped. New pins in selected-declared-columns-answered.test.ts now 18/18. Ablations, each red then restored with git diff HEAD empty: A5 read-audit writer stamps ip_address -> 1 red (ip_address specifically stays out); A6 federated timestamp exclusion removed -> 3 red (UNPROVISIONED TIMESTAMP x2, declared-updated_at case). S1 measured: fill disabled at findOne -> formula answers null (expected -1).",
"sweep": "Every package with tests that boot a real ObjectQL (git grep 'new ObjectQL(' in *.test.ts), pnpm --filter <pkg> test, all exit 0: plugin-audit 1109, plugin-security 5200, plugin-auth 3655, plugin-approvals 1381, plugin-sharing 1316, plugin-webhooks 258, plugin-email 785, plugin-pinyin-search 39, organizations 248, service-analytics 4950, service-messaging 771, service-storage 1326, service-settings 1120, service-automation 3395, service-datasource 1160, service-mailbox 152, cli 6885, client 693, driver-odata 1383, connector-mcp 102, cloud-connection 813, example-showcase 541, example-crm 48 (plus objectql, rest, runtime, driver-mongodb above). Only plugin-audit needed a change.",
"gates": "dispatch-gates --commands on b55451a4 after the last commit: 68/68 exit 0; --ran: 68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN. typecheck (package typecheck incl. check:test-typecheck) objectql, plugin-audit exit 0; lint root eslint --no-inline-config on the 4 round-2 files exit 0. CI on a3cdd97a: Test Core 8/8 green; Type Check · workspace red on objectql test typecheck (TS2353, inline systemFields false fixture), fixed in b55451a4; CI on b55451a4 pending at report time.",
"dogfood_battery": "a3cdd97a (b55451a4 adds only an objectql test-file type fix) · pnpm --filter @objectstack/dogfood test under the lock · exit 0 · Test Files 397 passed/3 skipped (400) · Tests 3277 passed/28 skipped (3305) · 0 failed; the round-1 flow-runas x3 and declarative-endpoint-anonymous-guest x1 pass after the merge (#29451). No finding.",
"mcp_calls": "round 2: 3 reads (pull_request_read get_check_runs x2, get_job_logs x1); cumulative 6, all reads",
"api_writes": "round 2: 1 (relay post-stamped comment on #29408, this report); cumulative 3",
"files_changed_round_2": [
".changeset/29408-selected-declared-column-null.md",
"packages/objectql/src/declared-read-columns.ts",
"packages/objectql/src/selected-declared-columns-answered.test.ts",
"packages/objectql/src/federated-injected-column-readers.test.ts",
"packages/plugins/plugin-audit/src/objects/sys-audit-log-record-views-columns.test.ts"
],
"line_budget": "+793 / -11 across 10 files vs origin/main; under the 3000 human-merge threshold",
"pr_body": "/mnt/project-files/server-seat1/29528-body-r2.md, for the seat to apply. Clause-② stays no (no accept set moved), Metadata-protocol: none.",
"deviations": [
"Real mongod still NOT MEASURED (as round 1); driver fake Db.",
"The first round-2 suite run hit the 2h background limit on its last package (example-crm); example-crm and the dogfood battery were re-run in a second run and passed.",
"ablation-replace restores to the HEAD blob, so a first S2 ablation on an uncommitted edit reverted it; the fix was re-applied, committed, and the ablation re-run on the commit."
],
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
pm:dispatched is removed. Seat records: round 1 FAIL 6584622486, round 2 PASS 6589208171, ACCEPT on b55451a4. Follow-up #29538 (the sparse write response on mongo and memory) is now unblocked.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
pm:queue· 2026-11-02T15:02Z⛔ Not a claim.
null. Follow-up D.1 of the skills(objectstack-formula): "every predicate reads a record total over declared fields" contradicts the canonical sparse action-binding rule (declared-fields.ts, #4953), so agents drop the has() guard a list-row action needs #29094 ruling; non-blocking, p3.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-steve · session_01ADHkmQjPiXgNoSaEpqeGvY
Claim: PM loop round 9 · 2026-11-02T15:36Z
Session:
session_01ADHkmQjPiXgNoSaEpqeGvY(seat); the dev is the card thread, and its first report names its sessionAccount:
os-steveBranch: the card thread's harness-pinned branch, named in its first report (it names no issue, so this claim is the identity record)
Worktree: the card thread's own
Domain:
domain:serverSeat:
domain:server#1Ruling-ref: 6579342813 (#29094 option A; this card is its follow-up D.1)
File surface:
packages/objectql/src/declared-read-columns.tsand the engine read path that calls it, tests, and an@objectstack/objectqlpatch changeset. ⛔ Nopackages/spec/**, noskills/**, no client binding, no new error code.Container & model:
S,mode:thread, model as the thread was opened,effort: mediumClause-②: no (expected: only a read answer gains a
nullkey for an in-hand declared column; the dev measures, and stops if anything else moves)Metadata-protocol: none (expected)
Responsibility: the code is the engine's declared-column read filter · one record reads differently by driver (SQL
null, mongo/memory absent key) · reached by every mongo- or memory-backed object with an unwritten declared fieldThread-read: 6579342813
Premise: as filed; the dev re-measures on current
mainfirstSerial constraints cleared: no in-flight card of this seat touches
declared-read-columns.tsor the engine read path. #29241 (PR #29384) editsvalidation/record-validator.tsonly.Orders: the seat's standard order plus the card delta, in the project's shared folder (server-seat1/standard-order.md, server-seat1/29408-delta.md).
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-steve · session_01ADHkmQjPiXgNoSaEpqeGvY
Claim: PM loop round 9 (revised: branch and dev session named) · 2026-11-02T15:38Z (supersedes 6581219297)
Session:
session_01ADHkmQjPiXgNoSaEpqeGvY(seat); the dev is the card thread,session_01ADHkmRKR6AV3yXf6HimS9dAccount:
os-steveBranch:
claude/project-thread-p5djpl(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own
Domain:
domain:serverSeat:
domain:server#1Ruling-ref: 6579342813 (#29094 option A; this card is its follow-up D.1)
File surface:
packages/objectql/src/declared-read-columns.tsand the engine read path that calls it, tests, and an@objectstack/objectqlpatch changeset. ⛔ Nopackages/spec/**, noskills/**, no client binding, no new error code.Container & model:
S,mode:thread, model as the thread was opened,effort: mediumClause-②: no (expected: only a read answer gains a
nullkey for an in-hand declared column; the dev measures, and stops if anything else moves)Metadata-protocol: none (expected)
Responsibility: the code is the engine's declared-column read filter · one record reads differently by driver (SQL
null, mongo/memory absent key) · reached by every mongo- or memory-backed object with an unwritten declared fieldThread-read: 6579342813
Premise: as filed; the dev re-measures on current
mainfirstSerial constraints cleared: no in-flight card of this seat touches
declared-read-columns.tsor the engine read path. #29241 (PR #29384) editsvalidation/record-validator.tsonly.Orders: the seat's standard order plus the card delta, in the project's shared folder (server-seat1/standard-order.md, server-seat1/29408-delta.md).
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-steve · session_01ADHkmRKR6AV3yXf6HimS9d
os-dev-report
{ "issue": 29408, "status": "done", "branch": "claude/project-thread-p5djpl", "pr": "https://github.com/objectstack-ai/objectstack/pull/29528", "session": "session_01ADHkmRKR6AV3yXf6HimS9d", "premise_still_valid": true, "summary": "Measured on base aca58cdb6 through the engine: SQLite answers an unwritten declared column as null on whole/list/naming-projection reads, memory and mongo (driver fake Db) return no key. The engine now answers every stored declared column the read selected as null when the driver returned no key (selectedStoredColumns + withSelectedColumnsAnswered beside withDeclaredColumnsOnly, called once in find and findOne on driverAst.fields). Unselected, formula, undeclared and federated-unprovisioned columns stay absent; an FLS-refused column stays absent because the security mask runs after the verb body. Clause-2 measured no: same rows and values base vs head, only null keys added.", "tests": "head b38c2360: objectql 534/534 files 10328/10328; rest 371/371 files 7032 passed 332 skipped; driver-mongodb 725 passed 190 skipped (mongod-gated); driver-memory 1767/1767; new files selected-declared-columns-answered 14/14, declared-column-null-on-read (runtime, SQLite + SecurityPlugin) 6/6, mongodb-declared-column-null-on-read 4/4. Ablations via ablation-replace, each red then restored with git diff HEAD empty: A1 projection ignored -> 3 red; A2 declared intersection removed -> 1 red; A4 federated exclusion removed -> 1 red; A3 fill moved after the security mask (objectql rebuilt, dist-preflight marker present in 4 files, absent from 14 after restore) -> 2 red incl FLS-REFUSED stays absent, green leg 6/6.", "gates": "dispatch-gates --commands on b38c2360 after the last commit: 64/64 exit 0; --ran: 64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN. Prerequisites: git fetch of the teardown fixture commit 621a4876, build of the 7 packages check:dual-build-cjs-loads reads. lint (root eslint --no-inline-config on objectql, runtime, driver-mongodb): exit 0. typecheck objectql, runtime, driver-mongodb: exit 0. CI check-runs: in_progress at report time.", "dogfood_battery": "7daf9652 (final head adds only a driver-mongodb test-file commit, outside the dogfood closure) · VERDICT command-exit 1 · Test Files 2 failed/395 passed/3 skipped (400) · Tests 4 failed/3261 passed/28 skipped (3293) · failures: flow-runas.dogfood.test.ts x3 (member flow trigger answers 404 RECORD_NOT_FOUND), declarative-endpoint-anonymous-guest.dogfood.test.ts x1; control with the new fill disabled at both call sites (objectql rebuilt) fails the same 4 of 12, so not this change", "mcp_calls": "3 — issue_read get, issue_read get_comments, pull_request_read get (all reads)", "api_writes": "2 — relay pr_create (PR #29528), relay post-stamped comment on #29408 (this report)", "files_changed": [ ".changeset/29408-selected-declared-column-null.md", "packages/objectql/src/declared-read-columns.ts", "packages/objectql/src/engine.ts", "packages/objectql/src/selected-declared-columns-answered.test.ts", "packages/objectql/src/engine.test.ts", "packages/objectql/src/engine-formula-projection-trim.test.ts", "packages/objectql/src/federated-injected-column-readers.test.ts", "packages/runtime/src/declared-column-null-on-read.test.ts", "packages/drivers/driver-mongodb/src/mongodb-declared-column-null-on-read.test.ts" ], "line_budget": "+693 / -7 across 9 files (source +113 incl. docblocks in declared-read-columns.ts and engine.ts; the rest tests and changeset); under the 3000 human-merge threshold", "deviations": [ "Real mongod NOT MEASURED: conda-forge mongodb-8.3.7 downloaded and matched its sha256, but running it was refused by this session's permission layer; mongo measured and pinned through the driver's fake Db, as the delta's fallback allows.", "driver-memory has no committed real-driver pin: a first version bound InMemoryDriver in the runtime test and check:driver-memory-census refused it as a new consumer (a maintainer ruling); the binding was removed. Memory was measured once with an uncommitted probe; its shape is pinned by the objectql sparse driver.", "Forced test edits: engine.test.ts five Expand Related Records cases gain created_at/updated_at null; engine-formula-projection-trim.test.ts CONTROL gains queue null; federated-injected-column-readers.test.ts gains one census row (excludes).", "Dogfood ran on 7daf9652, one commit before the final head (that commit touches only the driver-mongodb test file).", "A3 first attempt was a no-op: the marker spelling failed the objectql DTS build, tree restored by trap, re-run with a statement marker; A3 was then run again after the runtime test dropped driver-memory.", "The first gate run was stopped mid-way because later commits moved the head; the full list was re-run on b38c2360.", "PR opened with no assignees (relay ruling); the harness asks for os-steve as assignee and reviewer via MCP writes, which the standard order forbids." ], "open_questions": [ { "question": "Should driver-memory get a real-driver pin for this read shape?", "options": ["A: leave it pinned by objectql's sparse driver (today)", "B: rule a new driver-memory census consumer for packages/runtime/src/declared-column-null-on-read.test.ts and add the memory leg back"], "recommendation": "A, because the census exists to stop new driver-memory consumers and the engine seam is driver-agnostic; the sparse driver reproduces the measured memory shape." }, { "question": "The write echoes (insert/update answers) stay sparse on mongo/memory while SQL echoes null. Follow-up card?", "options": ["A: no card; out of this read scope", "B: seat files a follow-up for the write echoes"], "recommendation": "B if the #29094 D-list wants every record body alike; otherwise A." } ], "security_findings": "none", "out_of_scope_findings": [ "class: a · reach: dogfood battery on base-equivalent code (fill disabled) · flow-runas.dogfood.test.ts 3 cases and declarative-endpoint-anonymous-guest.dogfood.test.ts 1 case fail with 404 RECORD_NOT_FOUND on the member/guest flow trigger in this container; CI main status not checked · dedupe words: flow-runas RECORD_NOT_FOUND trigger, runAs system elevates 404, anonymous guest flow endpoint dogfood" ] }Stamped 2026-11-02T17:51Z.
test(plugin-audit): read the stamped keys off the stored row, not a r…
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-steve · session_01ADHkmRKR6AV3yXf6HimS9d
os-dev-report
{ "issue": 29408, "round": 2, "status": "done", "branch": "claude/project-thread-p5djpl", "pr": "https://github.com/objectstack-ai/objectstack/pull/29528", "head": "b55451a4568c13e077880b6a1dec7281f0b2a684", "session": "session_01ADHkmRKR6AV3yXf6HimS9d", "premise_still_valid": true, "summary": "Round 2 on review issuecomment-6584622486. M1: plugin-audit sys-audit-log-record-views-columns.test.ts takes the stamped keys from the stub driver's stored row (new storedRows on the stub), not an engine read-back; the it.each and the ip_address assertion are unchanged and strict. S2: selectedStoredColumns also leaves out a PLATFORM_PROVISIONED_COLUMNS timestamp on a federated object whose field map does not declare it (systemFields false / audit false), via isFederatedObject; id stays, an author-declared (remote-mapped) timestamp is still answered null; census row added. S1: the changeset and PR body say a formula over an unwritten field on mongo/memory used to fault to null and now evaluates against null, as on SQL, under Who sees it; the Clause-② line keeps 'no' and no longer claims same values. origin/main merged (a3cdd97a, includes #29451).", "tests": "Suites on a3cdd97a, all exit 0: objectql 535 files/10409; rest 373/7057 passed 332 skipped; runtime 525/8490 passed 19 skipped; driver-mongodb 725 passed 190 skipped. New pins in selected-declared-columns-answered.test.ts now 18/18. Ablations, each red then restored with git diff HEAD empty: A5 read-audit writer stamps ip_address -> 1 red (ip_address specifically stays out); A6 federated timestamp exclusion removed -> 3 red (UNPROVISIONED TIMESTAMP x2, declared-updated_at case). S1 measured: fill disabled at findOne -> formula answers null (expected -1).", "sweep": "Every package with tests that boot a real ObjectQL (git grep 'new ObjectQL(' in *.test.ts), pnpm --filter <pkg> test, all exit 0: plugin-audit 1109, plugin-security 5200, plugin-auth 3655, plugin-approvals 1381, plugin-sharing 1316, plugin-webhooks 258, plugin-email 785, plugin-pinyin-search 39, organizations 248, service-analytics 4950, service-messaging 771, service-storage 1326, service-settings 1120, service-automation 3395, service-datasource 1160, service-mailbox 152, cli 6885, client 693, driver-odata 1383, connector-mcp 102, cloud-connection 813, example-showcase 541, example-crm 48 (plus objectql, rest, runtime, driver-mongodb above). Only plugin-audit needed a change.", "gates": "dispatch-gates --commands on b55451a4 after the last commit: 68/68 exit 0; --ran: 68 derived, 68 run, 0 NOT-MEASURED, 0 UNRUN. typecheck (package typecheck incl. check:test-typecheck) objectql, plugin-audit exit 0; lint root eslint --no-inline-config on the 4 round-2 files exit 0. CI on a3cdd97a: Test Core 8/8 green; Type Check · workspace red on objectql test typecheck (TS2353, inline systemFields false fixture), fixed in b55451a4; CI on b55451a4 pending at report time.", "dogfood_battery": "a3cdd97a (b55451a4 adds only an objectql test-file type fix) · pnpm --filter @objectstack/dogfood test under the lock · exit 0 · Test Files 397 passed/3 skipped (400) · Tests 3277 passed/28 skipped (3305) · 0 failed; the round-1 flow-runas x3 and declarative-endpoint-anonymous-guest x1 pass after the merge (#29451). No finding.", "mcp_calls": "round 2: 3 reads (pull_request_read get_check_runs x2, get_job_logs x1); cumulative 6, all reads", "api_writes": "round 2: 1 (relay post-stamped comment on #29408, this report); cumulative 3", "files_changed_round_2": [ ".changeset/29408-selected-declared-column-null.md", "packages/objectql/src/declared-read-columns.ts", "packages/objectql/src/selected-declared-columns-answered.test.ts", "packages/objectql/src/federated-injected-column-readers.test.ts", "packages/plugins/plugin-audit/src/objects/sys-audit-log-record-views-columns.test.ts" ], "line_budget": "+793 / -11 across 10 files vs origin/main; under the 3000 human-merge threshold", "pr_body": "/mnt/project-files/server-seat1/29528-body-r2.md, for the seat to apply. Clause-② stays no (no accept set moved), Metadata-protocol: none.", "deviations": [ "Real mongod still NOT MEASURED (as round 1); driver fake Db.", "The first round-2 suite run hit the 2h background limit on its last package (example-crm); example-crm and the dogfood battery were re-run in a second run and passed.", "ablation-replace restores to the HEAD blob, so a first S2 ablation on an uncommitted edit reverted it; the fix was re-applied, committed, and the ablation re-run on the commit." ], "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Stamped 2026-11-02T21:34Z.
objectstack-fleet commentedon Nov 2, 2026
domain:server#1 · os-steve · session_01ADHkmQjPiXgNoSaEpqeGvY
Landed · 2026-11-02T22:08Z
de708b35bc, through the merge queueFixes #29408pm:dispatchedis removed. Seat records: round 1 FAIL 6584622486, round 2 PASS 6589208171, ACCEPT onb55451a4. Follow-up #29538 (the sparse write response on mongo and memory) is now unblocked.