Recorded by the domain:spec seat (session_0174WZTU6XcFcS7g2kykC53i, seat post #6017) at the contract-review ACCEPT of PR #15102 (#14104, maintainer ruling A 5507665791), from the dev's open question in report 5532978940. Bare finding for triage's first-touch; the answer is a ruling, not a queue position.
What is measured (PR #15102 head b45c0785, 2026-09-03T22:35Z)
Why it is worth recording
The reporting application (objectstack-ai/duly) authors grace_days on duly_catalog_item, propagates it to duly_duty, and the task carries duty as a relation. On a SQL deployment its on-time measure, spelled as the ruling spells it, is a loud 400 — honest, but the measure still cannot ship unless grace_days is propagated one more hop onto the task (a second writer that drifts when the duty's grace is edited — the very workaround the card refused) or unless push-down learns the dataset's own join chain: a dataset already compiles joins for its included dimensions (ADR-0071, ≤3 hops), so a cross-field reference naming a column of an included relation is conceivable through the same chain.
Not a decision
Whether the 2026-08-06 same-table ruling is widened to included relations for cross-field comparands (and their offsets), or duly carries grace_days on the task, is the maintainer's. Dedup (22:36Z): search_issues on the same-table / join push-down question — no open card; positive control returned #5222 (closed) and the FK-introspection family.
Refs: #14104 · PR #15102 · #5222 (PR #7582, the same-table rulings) · ADR-0071 (dataset joins) · #5146 ($not NULL shape)
Recorded by the
domain:specseat (session_0174WZTU6XcFcS7g2kykC53i, seat post #6017) at the contract-review ACCEPT of PR #15102 (#14104, maintainer ruling A 5507665791), from the dev's open question in report 5532978940. Barefindingfor triage's first-touch; the answer is a ruling, not a queue position.What is measured (PR #15102 head
b45c0785, 2026-09-03T22:35Z)@objectstack/formulamatchesFilter) resolves a dotted$fieldand a dottedaddDaysreference by walking the record (duty.grace_daysanswers when the row carries the relation).driver-sql,driver-sqlite-wasm) refuses a dotted reference — bare or as the offset — withINVALID_FILTER(HTTP 400), under the maintainer's 2026-08-06 same-table ruling on the cross-field arm ([spec] SqlDriver 将$field编译为列对列比较(cross-field comparison push-down) #5222: no JOIN planning, no alias contract). PR feat(spec,driver-sql,formula): addDays whole-day offset on a field reference, compiled on SQL and evaluated in memory #15102 makes the offset inherit that rule rather than reopen it, pins the asymmetry in the shared conformance corpus (a loud refusal, never a wrong count) and documents it incontent/docs/protocol/objectql/query-syntax.mdx.completed_at <= due_date + duty.grace_days— a relation path — and requires the dataset pin on both paths. The PR's dataset pin uses the same-table spelling (grace_dayson the task row); the dotted spelling answers in memory and refuses on SQL.Why it is worth recording
The reporting application (
objectstack-ai/duly) authorsgrace_daysonduly_catalog_item, propagates it toduly_duty, and the task carriesdutyas a relation. On a SQL deployment its on-time measure, spelled as the ruling spells it, is a loud 400 — honest, but the measure still cannot ship unlessgrace_daysis propagated one more hop onto the task (a second writer that drifts when the duty's grace is edited — the very workaround the card refused) or unless push-down learns the dataset's own join chain: a dataset already compiles joins for itsincluded dimensions (ADR-0071, ≤3 hops), so a cross-field reference naming a column of anincluded relation is conceivable through the same chain.Not a decision
Whether the 2026-08-06 same-table ruling is widened to
included relations for cross-field comparands (and their offsets), ordulycarriesgrace_dayson the task, is the maintainer's. Dedup (22:36Z):search_issueson the same-table / join push-down question — no open card; positive control returned #5222 (closed) and the FK-introspection family.Refs: #14104 · PR #15102 · #5222 (PR #7582, the same-table rulings) · ADR-0071 (dataset joins) · #5146 (
$notNULL shape)