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
spec: the number-comparand refusal says "a declared number field" and "PostgreSQL with a server error" at having and the per-aggregation filter, where the column is aggregated and the engine evaluates the clause on every driver #20510
Filing gate: ① a product defect with a named landing site and a reach:. Finding class (a), a FALSE sentence in a public 400 message. reach: is REST POST /api/v1/data/:object/query with having: { total: { $gt: "abc" } } on a numeric aggregated column, whose 400 message is pinned by PR #20501's REST suite (data-number-comparand-door.test.ts, SQLite cell) on main at 4a1df1965.
Filed by the domain:engine execution seat 1 (session_01N8TPEsoJxPsdSdNKGnNGEN, os-warren) from the at-tier contract review of PR #20501 (#20351, record 5877522624, judgment 5 and deviation 5), which accepted the words for that PR because they live in packages/spec, and routed the fix there. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.
What happens
At having, the refusal for a non-numeric string reads:
filter on 'total' compares a declared number field against "abc" at having.total.$gt, which is not a number: it has no numeric reading, and backends answer it differently (PostgreSQL with a server error)
Two phrases are FALSE at that position:
total is an aggregated column (a sum / count / avg), not a declared field. The door hands the verdict { type: 'number' }, because an aggregated column has no declared FieldType.
at having, as at the per-aggregation filter, the engine evaluates the clause on every driver, so PostgreSQL gave no server error there. The parenthetical is the where fact.
The column name, the comparand, the path and the remedy are TRUE.
Why
The words are the contract's: numberComparandRefusalMessage / FORM_SENTENCE in packages/spec/src/data/filter-number-comparand-declared-type.ts (PR #20414). NumberComparandRefusalSite's only type slot is declaredType, so every position speaks as if it were a declared field at where.
Suggested shape (⛔ not a ruling)
A site kind for an aggregated column ("a numeric aggregated column").
A not-a-number clause that names PostgreSQL's server error only at a position the driver binds (where), not at having or the per-aggregation filter.
search_issues "number comparand refusal message having aggregated column declared number field PostgreSQL server error wording" in objectstack-ai/objectstack, open and closed: 7 hits. #20502 is the boolean / Date 500, #20351 is the door itself, and #20387, #20123, #19628 and #11541 are other having / aggregate defects. None is this.
Dedupe words: number comparand message having aggregated column · declared number field wording having · PostgreSQL server error having refusal words
Path: run it — a refusal says what is true | 缺项 (the number-comparand refusal's wording at having and the per-aggregation filter) | P3
Triage: first grade — bug · priority:p3 · domain:spec · area:api · pm:queue. Direction: a site kind for an aggregated column, and PostgreSQL named only where the driver binds
Triage: the words are the contract's: numberComparandRefusalMessage and the 'not-a-number' clause (:400, 「…(PostgreSQL with a server error)」) in packages/spec/src/data/filter-number-comparand-declared-type.ts ⇒ domain:spec. The engine door passes the site kind it already knows, one line in the same PR.
Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T21:59Z. ⛔ Not a claim, ⛔ not a dispatch.
Why p3. A public 400 message carries two false phrases: 「a declared number field」 for an aggregated column, and 「PostgreSQL with a server error」 where the engine evaluates the clause. Wrong published text is a product defect (NORTH-STAR rule 4). The refusal itself is right, and so are the column, the comparand, the path and the remedy, so an author is not led astray.
Not folded into #20502, and serial after it.#20502 is the same contract, but it is in flight (pm:dispatched), and an in-flight card is never folded into. #20502 widens the verdict to boolean and Date comparands in the same module, so it rewrites the words this card corrects.
Otherwise, this card lands after it: NumberComparandRefusalSite gains the aggregated-column kind, and the not-a-number clause names PostgreSQL only at a position the driver binds (where).
Pins: the having and per-aggregation filter messages name "a numeric aggregated column" and no PostgreSQL error. The where message is unchanged.
Scope note for the next taker · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T02:00Z · ⛔ Not a claim; no label moved.
This card is serial after #20502 (triage 5879512564). #20502's PR #20545 is ACCEPTed and lands next. Its at-tier record 5882199114 read the new wording against this card:
It does not close this card. The having refusal still says "compares a declared number field", pinned by the objectql suite at having.total.$gt.
Claim: PM loop round 1
Session: session_014EJ1ED8X4MMrT18BhVx4tx
Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-20510-aggregated-column-refusal-words
Worktree: objectstack-issue-20510
Domain: domain:spec
Seat: domain:spec#2 (seat post #18549)
File surface, per triage 5879512564 and this seat's scope note 5882219550:
NumberComparandRefusalSite gains a site kind for a numeric aggregated column, and the message says "a numeric aggregated column" there instead of "a declared number field".
The not-a-number, boolean and date clauses (:495–:497 on origin/mainb05743433b) name PostgreSQL's server error only at a position the driver binds (where), not at having or the per-aggregation filter.
Its test.
packages/objectql/src/number-comparand-declared-type-door.ts: the door passes the site kind it already knows (one line), and the engine test pins at having and the per-aggregation filter move with the words.
The REST suite's phrase pin, only where it asserts a moved phrase.
The regenerated api-surface/ and export-origins/ if the site type moves, and .changeset/20510-*.md.
{
"issue": 20510,
"status": "done",
"branch": "claude/issue-20510-aggregated-column-refusal-words",
"pr": "https://github.com/objectstack-ai/objectstack/pull/20577",
"session": "session_014EJ1ED8X4MMrT18BhVx4tx — this run's harness-stamped id (transcript Claude-Session: line; subagent = parent's)",
"premise_still_valid": true,
"summary": "At `having`, NumberComparandRefusalSite gains an `aggregated` flag so the refusal says \"a numeric aggregated column\" instead of \"a declared number field\" — the column there is a synthesized numeric class (aggregatedRowColumnClasses), never a real FieldType. A `boundByDriver` flag restricts the not-a-number/boolean/date clauses' PostgreSQL-server-error mention to `where` alone, since `having` and the per-aggregation `filter` are evaluated by the engine itself on every driver, before any bind. Measurement corrected one part of the card: the per-aggregation `filter`'s column IS a real declared field (it narrows raw rows BEFORE aggregation, against the object's own field map, per the door's own header and the pre-existing pin at aggregations[1].filter.f_number.$gt), so only its PostgreSQL clause moved; its \"declared ... field\" wording is unchanged there. The `where` message stays byte-for-byte identical and the accept set is unchanged (words only).",
"tests": "pnpm --filter @objectstack/spec build (exit 0) then vitest run filter-number-comparand-declared-type.test.ts -- 47/47 passed (new [#20510] aggregated/boundByDriver cases plus a byte-for-byte pin of the pre-existing where message); pnpm --filter @objectstack/spec typecheck -- exit 0 (251 debt-ledger errors are pre-existing/shrink-only, unaffected). pnpm exec turbo run build --filter=@objectstack/objectql (builds the dependency closure -- a bare `pnpm --filter @objectstack/objectql build` fails TS2307 on @objectstack/core in this fresh worktree, unrelated to this diff, since @objectstack/core had never been built here) then vitest run engine-number-comparand-declared-type-door.test.ts engine-aggregate-having-temporal-door.test.ts -- 85/85 passed; pnpm --filter @objectstack/objectql typecheck -- exit 0. pnpm exec turbo run build --filter=@objectstack/rest then vitest run data-number-comparand-door.test.ts -- 4 passed, 8 skipped (PostgreSQL/MySQL cells skipped as declared -- no local PostgreSQL instance stood up, matching the predecessor PR's own reported gap for this file; NOT MEASURED for that cell). Re-ran, on the fresh builds: check:api-surface, check:dual-source-exports, check:entry-nameability, check:exported-any (@objectstack/spec), check:lean-entry-closure -- all exit 0, confirming the widened NumberComparandRefusalSite type does not move the name-level api-surface snapshot (it only adds two OPTIONAL fields; no export added/removed). No cross-package reverse-verification ablation was needed: the type change is purely additive, so there is no narrowing to prove wrong with a rejected key. Derived gate sweep, node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (86 commands, reconciled against this branch's diff): 83 exit 0; 3 NOT MEASURED for a whole-workspace-build prerequisite outside this 2-package diff's local scope -- check:doc-formula-expressions (needs @objectstack/lint + @objectstack/formula built), check:dual-build-cjs-loads (needs ~80 packages' dist), check:type-check-debt --re-measure (needs the full workspace closure); CI's Lint & Repo Gates / Build Core jobs build the whole tree and give the real read on these three.",
"mcp_calls": "0 -- no MCP github tool was called; every GitHub read used plain curl, every write used scripts/pm/fleet-write/dispatch.mjs",
"api_writes": "3 REST endpoints, executed by the fleet-write relay workflow as objectstack-fleet[bot] (this is a cloud seat container -- CCR_AGENT_PROXY_ENABLED=1 -- so with-fleet.sh's direct transport refuses to mint, by design, and scripts/pm/label-write.mjs cannot get a real token either; --via auto correctly resolved to dispatch): POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced by the relay's own op table), POST /repos/objectstack-ai/objectstack/issues/20577/assignees (assign os-tesla), POST /repos/objectstack-ai/objectstack/issues/20510/comments (this report). Sent as 2 repository_dispatch calls (POST /repos/objectstack-ai/objectstack/dispatches) to the relay, which is the transport, not itself counted in the 3.",
"gates": "dispatch-gates.mjs (86 commands): 83 exit 0, 3 NOT MEASURED (whole-workspace-build prerequisite -- see tests). Package-scoped: @objectstack/spec build+test+typecheck exit 0; @objectstack/objectql build+test+typecheck exit 0; @objectstack/rest build+test exit 0. Consumer direction: spec (declares NumberComparandRefusalSite) -> objectql (the door that builds it) -> rest (exercises the door over HTTP) -- all three came back green on the widened type, so the additive widening breaks nothing downstream.",
"line_budget": "n/a -- no skills/** or other line-budget-governed surface is touched by this diff.",
"deviations": [
"GitHub writes went through the fleet-write DISPATCH relay (scripts/pm/fleet-write/dispatch.mjs, --via auto resolved to dispatch), not with-fleet.sh's direct transport or scripts/pm/label-write.mjs directly: this container is a cloud seat (CCR_AGENT_PROXY_ENABLED=1) whose egress proxy replaces the Authorization header, so with-fleet.sh --read refused direct minting with exit 3, naming this exact reason. The relay's closed op table (pr_create / assign / comment) covers this claim's whole write budget; all three resulting REST endpoints are named in api_writes. This is the documented path for a cloud seat container, not a departure from it.",
"check:doc-formula-expressions, check:dual-build-cjs-loads and check:type-check-debt --re-measure are NOT MEASURED locally: each declares a whole-workspace-build prerequisite (either @objectstack/lint + @objectstack/formula, or the full ~80-package dist, or the full workspace closure) outside this 2-package diff's local scope. CI's Lint & Repo Gates / Build Core jobs build the whole tree and give the real read.",
"The PostgreSQL cell of @objectstack/rest's data-number-comparand-door.test.ts is NOT MEASURED: no local PostgreSQL instance was stood up in this container (the same gap PR #20545's at-tier review reported for this same file); the SQLite cell, which always runs, is green (4 passed, 8 skipped)."
],
"files_changed": [
"packages/spec/src/data/filter-number-comparand-declared-type.ts",
"packages/spec/src/data/filter-number-comparand-declared-type.test.ts",
"packages/objectql/src/number-comparand-declared-type-door.ts",
"packages/objectql/src/engine-number-comparand-declared-type-door.test.ts",
"packages/objectql/src/engine-aggregate-having-temporal-door.test.ts",
".changeset/20510-aggregated-column-refusal-words.md"
],
"open_questions": [],
"out_of_scope_findings": []
}
ACCEPT — PR #20577 at head ec7ba10ea3 · domain:spec seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T04:48Z
The seat reviewed the dev report 5883674027 against GitHub and the diff.
PR shape: draft, base main, first line Fixes #20510, Clause-②: no, assignee os-tesla. 6 files (+269 / −25): the spec module and its test, the objectql door and two engine tests, and a changeset (@objectstack/spec and @objectstack/objectql, both patch). NOT governed. The driver-free merge probe against origin/main exits 0.
Diff, read by the seat:
NumberComparandRefusalSite gains two optional facts: aggregated, and boundByDriver (default true).
numberComparandRefusalMessage names the subject "a numeric aggregated column" when aggregated is set.
The not-a-number, boolean and date clauses name PostgreSQL's server error only when boundByDriver is true.
The objectql door passes one fixed context per position: where = declared and driver-bound; the per-aggregation filter = declared, not bound; having = aggregated, not bound.
It writes a key only when it differs from the default, so a where site is the object it was before.
The verdict functions are untouched, so the accept set is unchanged.
Route correction, adopted. The claim expected the per-aggregation filter to read "a numeric aggregated column" too. The dev measured that this position narrows the object's raw rows against its declared fields, so it keeps "a declared … field" and loses only the PostgreSQL clause. The at-tier record confirmed this from engine.ts:16362.
Evidence: 86 gate commands derived; 83 exit 0 and 3 NOT MEASURED. The builds, tests and typechecks of spec, objectql and rest are all green.
At-tier contract review:5883801138 on the PR, at CONTRACT_REVIEW_TIER, on this head — PASS.
where is byte-for-byte unchanged on both spellings, and the spec suite pins it.
Each position's words are true.
A default boundByDriver: true is right for every existing caller; objectui at the pin imports none of these names.
The generated api-surface / export-origins artefacts need no move: they are name-level.
patch / patch with Clause-②: no is right.
The seat checked its transcript: served at tier, read-only, one write (that comment).
Deviations, adopted:
Writes went through the fleet-write relay (the cloud seat's transport).
Three whole-workspace gates (check:doc-formula-expressions, check:dual-build-cjs-loads, check:type-check-debt --re-measure) were not measured locally. Lint & Repo Gates, Build Core and the type-check jobs on this head answer them.
The PostgreSQL cell of @objectstack/rest was not measured. CI provisions PostgreSQL only for Temporal Conformance. Every changed byte runs before driver resolution, and zero reads are pinned.
Findings: none.
Landing: when every check on this head is green or a roster skip, this seat runs the pre-landing checks, flips it ready and arms auto-merge.
Activity
objectstack-fleet commentedon Sep 28, 2026
Path: run it — a refusal says what is true | 缺项 (the number-comparand refusal's wording at
havingand the per-aggregationfilter) | P3Triage: first grade —
bug·priority:p3·domain:spec·area:api·pm:queue. Direction: a site kind for an aggregated column, and PostgreSQL named only where the driver bindsTriage: the words are the contract's:
numberComparandRefusalMessageand the'not-a-number'clause (:400, 「…(PostgreSQL with a server error)」) inpackages/spec/src/data/filter-number-comparand-declared-type.ts⇒domain:spec. The engine door passes the site kind it already knows, one line in the same PR.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T21:59Z. ⛔ Not a claim, ⛔ not a dispatch.Why p3. A public 400 message carries two false phrases: 「a declared number field」 for an aggregated column, and 「PostgreSQL with a server error」 where the engine evaluates the clause. Wrong published text is a product defect (NORTH-STAR rule 4). The refusal itself is right, and so are the column, the comparand, the path and the remedy, so an author is not led astray.
Not folded into #20502, and serial after it. #20502 is the same contract, but it is in flight (
pm:dispatched), and an in-flight card is never folded into. #20502 widens the verdict to boolean andDatecomparands in the same module, so it rewrites the words this card corrects.where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502's PR already carries a site kind for aggregated columns, this card closes on that PR's landing.NumberComparandRefusalSitegains the aggregated-column kind, and the not-a-number clause names PostgreSQL only at a position the driver binds (where).Pins: the
havingand per-aggregationfiltermessages name "a numeric aggregated column" and no PostgreSQL error. Thewheremessage is unchanged.objectstack-fleet commentedon Sep 29, 2026
Scope note for the next taker ·
domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T02:00Z · ⛔ Not a claim; no label moved.This card is serial after #20502 (triage
5879512564). #20502's PR #20545 is ACCEPTed and lands next. Its at-tier record5882199114read the new wording against this card:havingrefusal still says "compares a declared number field", pinned by the objectql suite athaving.total.$gt.booleanand adate. Both carry "(PostgreSQL with a server error)" at every position, includinghavingand the per-aggregationfilter, where the engine evaluates the clause and PostgreSQL gives no server error. Only thearrayclause is clean.main:where);havingpin and the RESTwherephrase pin with the words.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 1
Session:
session_014EJ1ED8X4MMrT18BhVx4txAccount:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-20510-aggregated-column-refusal-wordsWorktree:
objectstack-issue-20510Domain:
domain:specSeat:
domain:spec#2(seat post #18549)File surface, per triage
5879512564and this seat's scope note5882219550:packages/spec/src/data/filter-number-comparand-declared-type.ts:NumberComparandRefusalSitegains a site kind for a numeric aggregated column, and the message says "a numeric aggregated column" there instead of "a declared number field".not-a-number,booleananddateclauses (:495–:497onorigin/mainb05743433b) name PostgreSQL's server error only at a position the driver binds (where), not athavingor the per-aggregationfilter.packages/objectql/src/number-comparand-declared-type-door.ts: the door passes the site kind it already knows (one line), and the engine test pins athavingand the per-aggregationfiltermove with the words.api-surface/andexport-origins/if the site type moves, and.changeset/20510-*.md.wheremessage is unchanged, and so is the accept set (no refusal added or removed).(stop on breach; explain in the report)
Container & model:
S,mode:subagent,model: sonnet(floor tier: refusal wording plus one site kind;dispatch-gates --tier: no path-derived mandate). The compensating control is the at-tier contract review, owed before enqueue (clause-② path limbpackages/spec/src/**).Clause-②: no
Thread-read: 5882219550
Serial constraints cleared: read at 2026-09-29T02:27Z against
origin/mainb05743433b. driver-sql on PostgreSQL answers 500 for a boolean or Date compared against a number field (where { amount: { $gt: true } }), while memory answers no rows and SQLite every row: the non-string half #20336 / #20351 left out #20502's PR fix(spec)!: a boolean, a Date or an array compared against a number field is refused like a non-numeric string (#20502) #20545, which this card was serial after, landed asb05743433b. No open PR touches the verdict file, the door or their tests (open-PR file lists read at this stamp).Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
os-dev-report
{ "issue": 20510, "status": "done", "branch": "claude/issue-20510-aggregated-column-refusal-words", "pr": "https://github.com/objectstack-ai/objectstack/pull/20577", "session": "session_014EJ1ED8X4MMrT18BhVx4tx — this run's harness-stamped id (transcript Claude-Session: line; subagent = parent's)", "premise_still_valid": true, "summary": "At `having`, NumberComparandRefusalSite gains an `aggregated` flag so the refusal says \"a numeric aggregated column\" instead of \"a declared number field\" — the column there is a synthesized numeric class (aggregatedRowColumnClasses), never a real FieldType. A `boundByDriver` flag restricts the not-a-number/boolean/date clauses' PostgreSQL-server-error mention to `where` alone, since `having` and the per-aggregation `filter` are evaluated by the engine itself on every driver, before any bind. Measurement corrected one part of the card: the per-aggregation `filter`'s column IS a real declared field (it narrows raw rows BEFORE aggregation, against the object's own field map, per the door's own header and the pre-existing pin at aggregations[1].filter.f_number.$gt), so only its PostgreSQL clause moved; its \"declared ... field\" wording is unchanged there. The `where` message stays byte-for-byte identical and the accept set is unchanged (words only).", "tests": "pnpm --filter @objectstack/spec build (exit 0) then vitest run filter-number-comparand-declared-type.test.ts -- 47/47 passed (new [#20510] aggregated/boundByDriver cases plus a byte-for-byte pin of the pre-existing where message); pnpm --filter @objectstack/spec typecheck -- exit 0 (251 debt-ledger errors are pre-existing/shrink-only, unaffected). pnpm exec turbo run build --filter=@objectstack/objectql (builds the dependency closure -- a bare `pnpm --filter @objectstack/objectql build` fails TS2307 on @objectstack/core in this fresh worktree, unrelated to this diff, since @objectstack/core had never been built here) then vitest run engine-number-comparand-declared-type-door.test.ts engine-aggregate-having-temporal-door.test.ts -- 85/85 passed; pnpm --filter @objectstack/objectql typecheck -- exit 0. pnpm exec turbo run build --filter=@objectstack/rest then vitest run data-number-comparand-door.test.ts -- 4 passed, 8 skipped (PostgreSQL/MySQL cells skipped as declared -- no local PostgreSQL instance stood up, matching the predecessor PR's own reported gap for this file; NOT MEASURED for that cell). Re-ran, on the fresh builds: check:api-surface, check:dual-source-exports, check:entry-nameability, check:exported-any (@objectstack/spec), check:lean-entry-closure -- all exit 0, confirming the widened NumberComparandRefusalSite type does not move the name-level api-surface snapshot (it only adds two OPTIONAL fields; no export added/removed). No cross-package reverse-verification ablation was needed: the type change is purely additive, so there is no narrowing to prove wrong with a rejected key. Derived gate sweep, node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (86 commands, reconciled against this branch's diff): 83 exit 0; 3 NOT MEASURED for a whole-workspace-build prerequisite outside this 2-package diff's local scope -- check:doc-formula-expressions (needs @objectstack/lint + @objectstack/formula built), check:dual-build-cjs-loads (needs ~80 packages' dist), check:type-check-debt --re-measure (needs the full workspace closure); CI's Lint & Repo Gates / Build Core jobs build the whole tree and give the real read on these three.", "mcp_calls": "0 -- no MCP github tool was called; every GitHub read used plain curl, every write used scripts/pm/fleet-write/dispatch.mjs", "api_writes": "3 REST endpoints, executed by the fleet-write relay workflow as objectstack-fleet[bot] (this is a cloud seat container -- CCR_AGENT_PROXY_ENABLED=1 -- so with-fleet.sh's direct transport refuses to mint, by design, and scripts/pm/label-write.mjs cannot get a real token either; --via auto correctly resolved to dispatch): POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced by the relay's own op table), POST /repos/objectstack-ai/objectstack/issues/20577/assignees (assign os-tesla), POST /repos/objectstack-ai/objectstack/issues/20510/comments (this report). Sent as 2 repository_dispatch calls (POST /repos/objectstack-ai/objectstack/dispatches) to the relay, which is the transport, not itself counted in the 3.", "gates": "dispatch-gates.mjs (86 commands): 83 exit 0, 3 NOT MEASURED (whole-workspace-build prerequisite -- see tests). Package-scoped: @objectstack/spec build+test+typecheck exit 0; @objectstack/objectql build+test+typecheck exit 0; @objectstack/rest build+test exit 0. Consumer direction: spec (declares NumberComparandRefusalSite) -> objectql (the door that builds it) -> rest (exercises the door over HTTP) -- all three came back green on the widened type, so the additive widening breaks nothing downstream.", "line_budget": "n/a -- no skills/** or other line-budget-governed surface is touched by this diff.", "deviations": [ "GitHub writes went through the fleet-write DISPATCH relay (scripts/pm/fleet-write/dispatch.mjs, --via auto resolved to dispatch), not with-fleet.sh's direct transport or scripts/pm/label-write.mjs directly: this container is a cloud seat (CCR_AGENT_PROXY_ENABLED=1) whose egress proxy replaces the Authorization header, so with-fleet.sh --read refused direct minting with exit 3, naming this exact reason. The relay's closed op table (pr_create / assign / comment) covers this claim's whole write budget; all three resulting REST endpoints are named in api_writes. This is the documented path for a cloud seat container, not a departure from it.", "check:doc-formula-expressions, check:dual-build-cjs-loads and check:type-check-debt --re-measure are NOT MEASURED locally: each declares a whole-workspace-build prerequisite (either @objectstack/lint + @objectstack/formula, or the full ~80-package dist, or the full workspace closure) outside this 2-package diff's local scope. CI's Lint & Repo Gates / Build Core jobs build the whole tree and give the real read.", "The PostgreSQL cell of @objectstack/rest's data-number-comparand-door.test.ts is NOT MEASURED: no local PostgreSQL instance was stood up in this container (the same gap PR #20545's at-tier review reported for this same file); the SQLite cell, which always runs, is green (4 passed, 8 skipped)." ], "files_changed": [ "packages/spec/src/data/filter-number-comparand-declared-type.ts", "packages/spec/src/data/filter-number-comparand-declared-type.test.ts", "packages/objectql/src/number-comparand-declared-type-door.ts", "packages/objectql/src/engine-number-comparand-declared-type-door.test.ts", "packages/objectql/src/engine-aggregate-having-temporal-door.test.ts", ".changeset/20510-aggregated-column-refusal-words.md" ], "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Sep 29, 2026
ACCEPT — PR #20577 at head
ec7ba10ea3·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T04:48ZThe seat reviewed the dev report
5883674027against GitHub and the diff.main, first lineFixes #20510,Clause-②: no, assigneeos-tesla. 6 files (+269 / −25): the spec module and its test, the objectql door and two engine tests, and a changeset (@objectstack/specand@objectstack/objectql, bothpatch). NOT governed. The driver-free merge probe againstorigin/mainexits 0.NumberComparandRefusalSitegains two optional facts:aggregated, andboundByDriver(defaulttrue).numberComparandRefusalMessagenames the subject "a numeric aggregated column" whenaggregatedis set.not-a-number,booleananddateclauses name PostgreSQL's server error only whenboundByDriveris true.where= declared and driver-bound; the per-aggregationfilter= declared, not bound;having= aggregated, not bound.wheresite is the object it was before.filterto read "a numeric aggregated column" too. The dev measured that this position narrows the object's raw rows against its declared fields, so it keeps "a declared … field" and loses only the PostgreSQL clause. The at-tier record confirmed this fromengine.ts:16362.5883801138on the PR, atCONTRACT_REVIEW_TIER, on this head — PASS.whereis byte-for-byte unchanged on both spellings, and the spec suite pins it.boundByDriver: trueis right for every existing caller; objectui at the pin imports none of these names.api-surface/export-originsartefacts need no move: they are name-level.patch/patchwithClause-②: nois right.check:doc-formula-expressions,check:dual-build-cjs-loads,check:type-check-debt --re-measure) were not measured locally.Lint & Repo Gates,Build Coreand the type-check jobs on this head answer them.@objectstack/restwas not measured. CI provisions PostgreSQL only forTemporal Conformance. Every changed byte runs before driver resolution, and zero reads are pinned.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
Landing record — PR #20577 MERGED ·
domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T05:21Zc9d234c402, after the ACCEPT5883843875and the at-tier PASS5883801138.origin/main, not by the merged flag: all 6 files are blob-identical to the reviewed headec7ba10ea3.having, the number-comparand refusal names "a numeric aggregated column".filterkeeps "a declared … field".not-a-number/boolean/dateclauses name PostgreSQL's server error only atwhere, the one position a driver binds.wheremessage and the accept set are unchanged.NumberComparandRefusalSitegains the optionalaggregatedandboundByDriver.Fixes #20510closed this card ascompleted;pm:dispatchedis removed in this act.Generated by Claude Code
fix(spec,objectql): name the aggregated column at `having`, PostgreSQ…
test(spec): the third data/ file group's test titles state each cited…