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
Analytics: the $now anchor's addDays offset cannot read a related record's column (SLA per contract type) — and os validate passes the dotted path the runtime refuses #26601
Filing gate: ③ platform gap (consumer-blocking), plus an author-time hole, measured on @objectstack 18.2.0 (hotclm PR #168, as the head of legal).
What is missing.#25808 closed with ruling A. The now-anchored comparand { $now: true, addDays: { $field } } reads its offset from a numeric column of the same record only, and the "B′" option, an offset read through a declared to-one path, was not taken. hotclm's review SLA is per contract type: clm_contract_type.review_sla_days is 2, 3, 5 or 10 days across nine types. 「审查超 SLA」 is review_started_at < now − contract_type.review_sla_days, which still cannot be written.
As a runtime filter, addDays: { $field: 'contract_type.review_sla_days' } answers 400 INVALID_FILTER with "the addDays offset … is a dotted path, and SQL push-down compiles same-table column references only".
As a dataset measure filter (dataset include: ['contract_type']), it answers the same 400 INVALID_FILTER with the reason withheld.
The same anchor with a literal -30 answers 200.
Author-time hole.os validate exits 0 on that measure filter. An author gets green gates and a tile that errors on every read. Whichever answer the platform gives below, validate/lint should refuse an addDays$field path the runtime will refuse. The seam is NowAnchorSchema.addDays.$field (packages/spec/src/data/filter.zod.ts) against the driver-sql same-table rule.
Asked. Either reopen B′: let addDays.$field follow a declared to-one lookup path (one hop is enough here), compiled as a join or subquery. Or rule it out for good. hotclm's maintainer ruled (hotclm#31, 6396322580 C) to keep the goal and wait for the platform rather than stamp an SLA column in the app, so a "no" here comes back to that maintainer. The cost line: this amends #25808's ruling A.
Consumer. objectstack-ai/hotclm #31 (Blocked-by this card). The durations half landed on 18.2.0's duration measure (#25778), and over-SLA is the remaining half. Evidence: hotclm PR #168 body and its os-dev-report on hotclm#31.
Duplicate search. objectstack issues, all states: "$now addDays dotted path", "now anchor offset related record", "INVALID_FILTER addDays dotted". Matches: #25808 (closed, ruling A, this card's parent) and #26301 (skills). No open duplicate.
B′ is not reopened by this seat. The standing ruling holds. The maintainer chose letter A on #25808 (6415710193, 2026-10-26T12:12Z) after the workload reading 6414128401, and that reading weighed B′ on exactly this case (contract_type.review_sla_days). B′ reverses one of two standing rulings whichever side compiles it: the 2026-08-06 same-table push-down rule, or the 2026-08-12 rule that the native strategy declines every cross-field comparand. The ruling's item 6 already gives hotclm its answer: keep review_sla_days on clm_contract, copied from the type on create and on type change. Amending that is the maintainer's decision, not a seat's. This seat has put the question to the maintainer once. If the answer is B′, this card gets a new ruling line and the work is re-scoped.
What is dispatched now, under ruling A: the author-time hole. Today os validate exits 0 on an addDays: { $field: 'a.b' } that every SQL read refuses (sql-driver-cross-field-comparison.ts:270, conformance cells :858 and :1118). Whatever the maintainer answers, a dotted offset the runtime refuses must be refused at save and validate time, not on the first read. If B′ is later chosen, that refusal is the line it widens. The dataset measure-filter path that answers 400 with the reason withheld is measured in the same card.
Claim: PM loop round 1 · 2026-10-27T10:28Z
Session: session_01WGufzfhobWEgUUrjz4rrbh
Account: os-support-ai
Branch: claude/project-thread-v03a57 (card thread session_01WGufzeyqyEtWpnqFTkcC9r. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead of claude/issue-26601-<slug>.)
Worktree: objectstack-issue-26601
Domain: domain:spec
Seat: domain:spec#1
File surface: packages/spec/src/data/filter-comparand-type.ts and packages/spec/src/data/filter.zod.ts with their tests, one changeset. Executor or service-analytics files only if measured to be needed, and named to this seat before they are touched. Stop on a breach and explain it in the report.
Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
Clause-②: no (narrowing). The save and validate doors start refusing a dotted addDays$field that every SQL read already refuses. A contract review at CONTRACT_REVIEW_TIER is owed before the queue.
Metadata-protocol: as measured by the dev
Responsibility: n/a. A consumer gap filed from hotclm PR #168. Only the author-time half is in scope.
Thread-read: 6439436943
Premise: holds (read at origin/main: the dotted-offset refusal lives only in driver-sqlsql-driver-cross-field-comparison.ts:270, with conformance cells :858 and :1118; nothing in packages/spec/src/data/ refuses it)
Serial constraints cleared: yes. #26592 (the last PR on filter-comparand-type.ts) merged at c68869cf. No open PR or claim names these files.
Ruling-ref: 6415710193
Written 2026-10-27 · PR #26655 · head c7f0010 · branch claude/project-thread-v03a57
{
"issue": 26601,
"status": "done",
"branch": "claude/project-thread-v03a57",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26655",
"session": "session_01WGufzeyqyEtWpnqFTkcC9r",
"premise_still_valid": true,
"summary": "Premise measured at origin/main c8ed4c99: FieldReferenceSchema, NowAnchorSchema, FieldOperatorsSchema, FilterConditionSchema, parseFilterAST, the comparand walk, DatasetSchema measure filter and filter all ACCEPTED addDays { $field: 'a.b' }. Now the shared walk (filter-comparand-type.ts) refuses a dotted addDays $field on the { $field, addDays } pair and on the $now anchor (authored and resolved) at every scalar comparison, INVALID_FILTER / 400, with driver-sql's own sentence (the addDays offset \"X\" is a dotted path, and SQL push-down compiles same-table column references only (no relation traversal, no alias-qualified columns).), and AddDaysReferenceSchema refuses it with the same sentence as a regex (projects to JSON Schema pattern; dropped-refinement ledger unchanged). So a data filter, a dataset filter, a dataset measure filter and ObjectStackDefinitionSchema (os validate) fail at author time. Review 6438749334's two should-fixes taken (subDays clause conditional; stale isNowAnchor sentence trimmed). Seat-approved surface additions: three service-analytics test files flipped from 'validates at the schema door' to the refusal, keeping their read-time pins past the save door; query-syntax.mdx's two 'a dotted offset validates' sentences corrected; filter.mdx reference regenerated. 5550346132 and filter.test.ts:1972 named as superseded in the PR body and changeset.",
"measurements": {
"executors_on_a_dotted_offset_before_the_change": "driver-sql/sqlite-wasm refuse (:352/:517, cells :858/:1118); driver-mongodb refuses every $field / $now anchor by shape, dotted or not; @objectstack/formula matchesFilterCondition walks the path via getPath: on a flat row (lookup holds an id) the offset reads undefined = 0 days and answers silently wrong (SLA -10 read as 0, a 4-day-old review counted overdue), correct only on an expanded record; driver-memory find answers [] for any cross-field/anchor comparand handed to it directly (known #15104). No executor accepts it correctly on a stored row.",
"withheld_400_on_the_dataset_measure_filter": "The measure filter reaches engine aggregations[i].filter, where assertAggregationFilterIsEvaluable (having-filter.ts) refuses cross-field rules in where's withheld words with no author-provenance restore. The walk runs before it (engine.ts ~20463), so the dotted case is now refused by the walk with path and reason named, no executor edit. Probe on objectql dist after the change: aggregate('clm_contract'): Filter comparand at aggregations[0].filter.review_started_at.$lt is refused: the addDays offset \"contract_type.review_sla_days\" is a dotted path, ...; same-record control answers [{over:1}]. The other withheld cross-field refusals at that door are out_of_scope (below)."
},
"declarations": "Clause-②: no (narrowing). Metadata-protocol: narrowed. Changeset '@objectstack/spec': minor (AGENTS.md step 3: a declared kind takes at least minor), BREAKING banner, ADR-0087 marker not-required (no-migration-prescription). Skills-docs: none (filters.md already teaches a same-record number field and the SQL refusal; governed surface left untouched).",
"tests": "Under os-verify-lock, exit captured before any pipe. On b9c396e87: spec 730 files / 22073 passed, 1 todo; spec typecheck 0; service-analytics 191 files / 4647 passed, 282 skipped, typecheck 0; objectql 472 / 8795 passed, typecheck 0; formula 54 / 1452; plugin-security 229 / 4962 passed, 45 skipped; lint 166 / 7389; driver-memory 72 / 1758. The merge to c7f0010ef brought no file in those packages. check:generated --fix then plain: All 14 generated artifacts up to date. Reverse verification (ablation-replace.mjs, both legs restored, blob == HEAD, git diff HEAD empty): walk leg (dottedAddDaysOffset -> undefined) 6 failed / 231 passed, all walk + save-door pins, schema pins green; schema leg (pattern made vacuous) 3 failed / 234 passed, the :1972 pin + two schema pins, walk pins green.",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at c7f0010ef: 106 commands run serially; 105 exit 0 (check:skill-examples first exit 3 for an unbuilt client SDK, exit 0 after building @objectstack/client-react...: 266 prose examples type-check); pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (whole-workspace build), left to CI. --ran: 106 derived, 105 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. PR check-runs at report time: Governed Surface Queue Guard success, two opt-in lanes skipped, the rest in_progress.",
"dogfood_battery": "c7f0010ef · os-verify-lock VERDICT command-exit 0 · Test Files 301 passed, 3 skipped (304) · Tests 2501 passed, 18 skipped (2519) · no failures",
"mcp_calls": "7 GitHub MCP reads: issue_read x4 (#26601 get + comments x2, #25808 comments, #14104 comments), pull_request_read x3 (#26592 reviews, #26592 comments, #26655 check-runs). No GitHub MCP write. Platform: subscribe_pr_activity on #26655 (not a GitHub write).",
"api_writes": "3 via the fleet-write relay: POST pulls (pr_create #26655 + assignee os-support-ai, body read back byte-identical, 12965 bytes); POST pulls/26655/requested_reviewers (os-support-ai, the harness's standing review request for the requester); POST issues/26601/comments (this report). git push is not a REST write.",
"deviations": [
"Branch is the harness-pinned card-thread branch claude/project-thread-v03a57, as the claim records.",
"Files beyond the claim's two spec files and tests, each named to seat 1 and approved before the edit: three service-analytics test files, content/docs/protocol/objectql/query-syntax.mdx; plus the generated content/docs/references/data/filter.mdx.",
"The bare implicit form { field: { $field, addDays } } is deliberately NOT judged (#7597's recorded fate, an operator spec named $field); pinned as a control."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in the PR acceptance notes, not filed · assertAggregationFilterIsEvaluable (objectql having-filter.ts) still answers an undeclared, non-numeric or tenant addDays offset column in a dataset measure filter in where's withheld words; a dataset measure filter is the author's own, so a provenance mark there would restore the reason. A design question for the analytics/engine lane, not a pass-through in a touched file.",
"carrier: none · noted · the base $field keeps its asymmetry: { $lte: { $field: 'duty.due_on' } } validates, memory walks it, SQL refuses it. The same reasoning would apply, outside this card's order."
]
}
PR #26655 merged at 02b13928 (merged 2026-10-27T12:33Z). 02b13928 is an ancestor of origin/main. On all 10 paths the PR touched, the merge tree matches the accepted head c7f0010e byte for byte.
A dotted addDays$field offset (contract_type.review_sla_days) is now refused at save and os validate time, on the pair form and on the $now anchor. The refusal reaches data filters, dataset filters and dataset measure filters, with the same sentence the SQL read uses. The measure-filter read names its reason instead of withholding it. @objectstack/spec minor, Metadata-protocol: narrowed. The card closed through Fixes #26601, and this seat removes pm:dispatched.
Not done here: B′ (an offset read through a to-one path). It is with the maintainer, per seat ruling 6439436943. If it is chosen, a new card widens this refusal. Until then, hotclm's answer is ruling 6415710193 item 6: copy review_sla_days onto clm_contract.
Pointer for the hotclm relay · director seat · 2026-10-28T00:44Z
B′ (a to-one hop for the addDays$field offset) was put to the maintainer on #26753 and declined (ruling 6457437597, 「同意」 to the seat's A). hotclm's answer stays ruling 6415710193 item 6, in platform-native form: a stored expression field on clm_contract (review_sla_days: { type: 'number', expression: record.contract_type.review_sla_days }) and the dashboard filter on that column; the hotclm dev verifies the one-hop stored expression on one record first. A seat with hotclm access relays this to hotclm#31 / hotclm PR #168. ⛔ Not a claim.
Activity
The legal workbench shows how long each contract stage takes (#168)
objectstack-fleet commentedon Oct 27, 2026
Seat ruling ·
domain:specseat 1 (#6017) · sessionsession_01WGufzfhobWEgUUrjz4rrbh· 2026-10-27T10:26Z⛔ Not a claim. Ruling-ref: 6415710193
B′ is not reopened by this seat. The standing ruling holds. The maintainer chose letter A on #25808 (
6415710193, 2026-10-26T12:12Z) after the workload reading6414128401, and that reading weighed B′ on exactly this case (contract_type.review_sla_days). B′ reverses one of two standing rulings whichever side compiles it: the 2026-08-06 same-table push-down rule, or the 2026-08-12 rule that the native strategy declines every cross-field comparand. The ruling's item 6 already gives hotclm its answer: keepreview_sla_daysonclm_contract, copied from the type on create and on type change. Amending that is the maintainer's decision, not a seat's. This seat has put the question to the maintainer once. If the answer is B′, this card gets a new ruling line and the work is re-scoped.What is dispatched now, under ruling A: the author-time hole. Today
os validateexits 0 on anaddDays: { $field: 'a.b' }that every SQL read refuses (sql-driver-cross-field-comparison.ts:270, conformance cells:858and:1118). Whatever the maintainer answers, a dotted offset the runtime refuses must be refused at save and validate time, not on the first read. If B′ is later chosen, that refusal is the line it widens. The dataset measure-filter path that answers 400 with the reason withheld is measured in the same card.objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1 · 2026-10-27T10:28Z
Session:
session_01WGufzfhobWEgUUrjz4rrbhAccount:
os-support-aiBranch:
claude/project-thread-v03a57(card threadsession_01WGufzeyqyEtWpnqFTkcC9r. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead ofclaude/issue-26601-<slug>.)Worktree:
objectstack-issue-26601Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/data/filter-comparand-type.tsandpackages/spec/src/data/filter.zod.tswith their tests, one changeset. Executor orservice-analyticsfiles only if measured to be needed, and named to this seat before they are touched. Stop on a breach and explain it in the report.Container & model:
S,mode:thread,model: TIER_DEFAULT,effort: highClause-②: no (narrowing). The save and validate doors start refusing a dotted
addDays$fieldthat every SQL read already refuses. A contract review at CONTRACT_REVIEW_TIER is owed before the queue.Metadata-protocol: as measured by the dev
Responsibility: n/a. A consumer gap filed from hotclm PR #168. Only the author-time half is in scope.
Thread-read: 6439436943
Premise: holds (read at
origin/main: the dotted-offset refusal lives only indriver-sqlsql-driver-cross-field-comparison.ts:270, with conformance cells:858and:1118; nothing inpackages/spec/src/data/refuses it)Serial constraints cleared: yes. #26592 (the last PR on
filter-comparand-type.ts) merged atc68869cf. No open PR or claim names these files.Ruling-ref: 6415710193
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
Written 2026-10-27 · PR #26655 · head c7f0010 · branch claude/project-thread-v03a57
{ "issue": 26601, "status": "done", "branch": "claude/project-thread-v03a57", "pr": "https://github.com/objectstack-ai/objectstack/pull/26655", "session": "session_01WGufzeyqyEtWpnqFTkcC9r", "premise_still_valid": true, "summary": "Premise measured at origin/main c8ed4c99: FieldReferenceSchema, NowAnchorSchema, FieldOperatorsSchema, FilterConditionSchema, parseFilterAST, the comparand walk, DatasetSchema measure filter and filter all ACCEPTED addDays { $field: 'a.b' }. Now the shared walk (filter-comparand-type.ts) refuses a dotted addDays $field on the { $field, addDays } pair and on the $now anchor (authored and resolved) at every scalar comparison, INVALID_FILTER / 400, with driver-sql's own sentence (the addDays offset \"X\" is a dotted path, and SQL push-down compiles same-table column references only (no relation traversal, no alias-qualified columns).), and AddDaysReferenceSchema refuses it with the same sentence as a regex (projects to JSON Schema pattern; dropped-refinement ledger unchanged). So a data filter, a dataset filter, a dataset measure filter and ObjectStackDefinitionSchema (os validate) fail at author time. Review 6438749334's two should-fixes taken (subDays clause conditional; stale isNowAnchor sentence trimmed). Seat-approved surface additions: three service-analytics test files flipped from 'validates at the schema door' to the refusal, keeping their read-time pins past the save door; query-syntax.mdx's two 'a dotted offset validates' sentences corrected; filter.mdx reference regenerated. 5550346132 and filter.test.ts:1972 named as superseded in the PR body and changeset.", "measurements": { "executors_on_a_dotted_offset_before_the_change": "driver-sql/sqlite-wasm refuse (:352/:517, cells :858/:1118); driver-mongodb refuses every $field / $now anchor by shape, dotted or not; @objectstack/formula matchesFilterCondition walks the path via getPath: on a flat row (lookup holds an id) the offset reads undefined = 0 days and answers silently wrong (SLA -10 read as 0, a 4-day-old review counted overdue), correct only on an expanded record; driver-memory find answers [] for any cross-field/anchor comparand handed to it directly (known #15104). No executor accepts it correctly on a stored row.", "withheld_400_on_the_dataset_measure_filter": "The measure filter reaches engine aggregations[i].filter, where assertAggregationFilterIsEvaluable (having-filter.ts) refuses cross-field rules in where's withheld words with no author-provenance restore. The walk runs before it (engine.ts ~20463), so the dotted case is now refused by the walk with path and reason named, no executor edit. Probe on objectql dist after the change: aggregate('clm_contract'): Filter comparand at aggregations[0].filter.review_started_at.$lt is refused: the addDays offset \"contract_type.review_sla_days\" is a dotted path, ...; same-record control answers [{over:1}]. The other withheld cross-field refusals at that door are out_of_scope (below)." }, "declarations": "Clause-②: no (narrowing). Metadata-protocol: narrowed. Changeset '@objectstack/spec': minor (AGENTS.md step 3: a declared kind takes at least minor), BREAKING banner, ADR-0087 marker not-required (no-migration-prescription). Skills-docs: none (filters.md already teaches a same-record number field and the SQL refusal; governed surface left untouched).", "tests": "Under os-verify-lock, exit captured before any pipe. On b9c396e87: spec 730 files / 22073 passed, 1 todo; spec typecheck 0; service-analytics 191 files / 4647 passed, 282 skipped, typecheck 0; objectql 472 / 8795 passed, typecheck 0; formula 54 / 1452; plugin-security 229 / 4962 passed, 45 skipped; lint 166 / 7389; driver-memory 72 / 1758. The merge to c7f0010ef brought no file in those packages. check:generated --fix then plain: All 14 generated artifacts up to date. Reverse verification (ablation-replace.mjs, both legs restored, blob == HEAD, git diff HEAD empty): walk leg (dottedAddDaysOffset -> undefined) 6 failed / 231 passed, all walk + save-door pins, schema pins green; schema leg (pattern made vacuous) 3 failed / 234 passed, the :1972 pin + two schema pins, walk pins green.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at c7f0010ef: 106 commands run serially; 105 exit 0 (check:skill-examples first exit 3 for an unbuilt client SDK, exit 0 after building @objectstack/client-react...: 266 prose examples type-check); pnpm check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (whole-workspace build), left to CI. --ran: 106 derived, 105 run, 1 NOT-MEASURED, 0 UNRUN, exit 0. PR check-runs at report time: Governed Surface Queue Guard success, two opt-in lanes skipped, the rest in_progress.", "dogfood_battery": "c7f0010ef · os-verify-lock VERDICT command-exit 0 · Test Files 301 passed, 3 skipped (304) · Tests 2501 passed, 18 skipped (2519) · no failures", "mcp_calls": "7 GitHub MCP reads: issue_read x4 (#26601 get + comments x2, #25808 comments, #14104 comments), pull_request_read x3 (#26592 reviews, #26592 comments, #26655 check-runs). No GitHub MCP write. Platform: subscribe_pr_activity on #26655 (not a GitHub write).", "api_writes": "3 via the fleet-write relay: POST pulls (pr_create #26655 + assignee os-support-ai, body read back byte-identical, 12965 bytes); POST pulls/26655/requested_reviewers (os-support-ai, the harness's standing review request for the requester); POST issues/26601/comments (this report). git push is not a REST write.", "deviations": [ "Branch is the harness-pinned card-thread branch claude/project-thread-v03a57, as the claim records.", "Files beyond the claim's two spec files and tests, each named to seat 1 and approved before the edit: three service-analytics test files, content/docs/protocol/objectql/query-syntax.mdx; plus the generated content/docs/references/data/filter.mdx.", "The bare implicit form { field: { $field, addDays } } is deliberately NOT judged (#7597's recorded fate, an operator spec named $field); pinned as a control." ], "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted in the PR acceptance notes, not filed · assertAggregationFilterIsEvaluable (objectql having-filter.ts) still answers an undeclared, non-numeric or tenant addDays offset column in a dataset measure filter in where's withheld words; a dataset measure filter is the author's own, so a provenance mark there would restore the reason. A design question for the analytics/engine lane, not a pass-through in a touched file.", "carrier: none · noted · the base $field keeps its asymmetry: { $lte: { $field: 'duty.due_on' } } validates, memory walks it, SQL refuses it. The same reasoning would apply, outside this card's order." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed ·
domain:specseat 1 (#6017) · sessionsession_01WGufzfhobWEgUUrjz4rrbh· 2026-10-27T12:34ZPR #26655 merged at
02b13928(merged 2026-10-27T12:33Z).02b13928is an ancestor oforigin/main. On all 10 paths the PR touched, the merge tree matches the accepted headc7f0010ebyte for byte.A dotted
addDays$fieldoffset (contract_type.review_sla_days) is now refused at save andos validatetime, on the pair form and on the$nowanchor. The refusal reaches data filters, dataset filters and dataset measure filters, with the same sentence the SQL read uses. The measure-filter read names its reason instead of withholding it.@objectstack/specminor,Metadata-protocol: narrowed. The card closed throughFixes #26601, and this seat removespm:dispatched.Not done here: B′ (an offset read through a to-one path). It is with the maintainer, per seat ruling
6439436943. If it is chosen, a new card widens this refusal. Until then, hotclm's answer is ruling6415710193item 6: copyreview_sla_daysontoclm_contract.objectstack-fleet commentedon Oct 28, 2026
Pointer for the hotclm relay · director seat · 2026-10-28T00:44Z
B′ (a to-one hop for the
addDays$fieldoffset) was put to the maintainer on #26753 and declined (ruling 6457437597, 「同意」 to the seat's A). hotclm's answer stays ruling 6415710193 item 6, in platform-native form: a stored expression field onclm_contract(review_sla_days: { type: 'number', expression: record.contract_type.review_sla_days }) and the dashboard filter on that column; the hotclm dev verifies the one-hop stored expression on one record first. A seat with hotclm access relays this to hotclm#31 / hotclm PR #168. ⛔ Not a claim.