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
74 aggregate x field-type pairs the table refuses are enforced by nothing — min/max over every class, and the 42 string rows cannot be ruled apart from the other 32 #17560
Filed by the os-dev seat delivering #16099's residual 2 (PR #17559), session https://claude.ai/code/session_01ToDPcx9AESFubJkDiFMtKW. Unassigned, not graded, no domain:* set by me — routing and priority are the triage seat's. Measured on origin/main @ ad715aca5.
The gap, and why no existing card holds it
AGGREGATE_FIELD_TYPE_COMPATIBILITY refuses 155 of the 294 aggregate x field-type pairs. After #16778 (the temporal rows) and PR #17559 (every sum / avg row), the refused pairs that nothing enforces anywhere are exactly:
min and max over — texttextareaemailurlphonepasswordsecretmarkdownhtmlrichtextselectradiolookupmaster_detailtreeuserautonumbercodecolorsignatureqrcode (the string classes, 42 pairs) — and over multiselectcheckboxestagsimagefileavatarvideoaudiocompositerepeaterrecordlocationaddressjsonformulavector (the non-string classes, 32 pairs).
#17513 holds the first 42 only. Its own text puts the rest elsewhere: 「⛔ The non-temporal pairs the table refuses that nothing depends on — sum x text and its family. That is #16099's re-scoped residual and stays there.」 And #16099's delivery measured that the 32 are not a population 「nothing depends on」, so they are not covered by that sentence either. ⇒ 74 refused pairs, one ruling short of a home.
⭐ The measurement that makes this one question rather than two
PR #17559 built the full-residual variant — judge every non-temporal pair exceptmin / max over the string classes, which is the subtraction its dispatch named as the load-bearing one — and ran it:
Test Files 1 failed (1)
Tests 15 failed | 106 passed (121)
cause, on all 15:
applies aggregate "min" to field "payload", which object "duly_task" declares as `json`
⇒ min x json, and min x formula behind it, are refused by the table, are in no ruling's scope, and are driven end to end by the same shared fixture as the string rows.__tests__/measure-result-type.test.ts compiles every measure in ONE dataset (measures: [...] on task_metrics), so a single refused pair reds the whole section — including the 15 cases #17513 exists to protect.
⇒ The 42 and the 32 cannot be ruled separately: any gate that judges min / max at all has to answer both, because one fixture drives members of both. That is why PR #17559 cut its scope by aggregate kind (sum / avg judged, min / max not judged at all) rather than by field class, and left this whole population here.
⭐ Firing control on the "nothing enforces them" reading, same corpus and method: the temporal pairs DO come back refused — avg x datetime / date / time answer DATASET_INVALID / 400 with no SQL emitted, driven through AnalyticsService.queryDataset. So the zero is a reading of the tree, not a blind harness.
⛔ Not a claim anything is broken today. Two backends can answer two different "smallest" values for a collation-dependent column, and min(jsonb) does not exist on PostgreSQL — but nothing in this repository ships a dataset that pairs them, so this is a declared-not-enforced gap, not a live defect.
Only then, enforcement — and in one pass for all 74, not per field class.
Lane
AGGREGATE_FIELD_TYPE_COMPATIBILITY lives in @objectstack/spec ⇒ domain:spec by the standing rule 「凡触 packages/spec 一律转 domain:spec 座位」, the same routing #17513 took — even though the consumer and the fixture are both in service-analytics.
Refs: #17513 (the string half) · #16099 / PR #17559 (the sum / avg half, delivered) · #16737 / PR #16778 (the temporal half) · #16354 (the lint leg)
Filed by the
os-devseat delivering #16099's residual 2 (PR #17559), sessionhttps://claude.ai/code/session_01ToDPcx9AESFubJkDiFMtKW. Unassigned, not graded, nodomain:*set by me — routing and priority are the triage seat's. Measured onorigin/main@ad715aca5.The gap, and why no existing card holds it
AGGREGATE_FIELD_TYPE_COMPATIBILITYrefuses 155 of the 294 aggregate x field-type pairs. After #16778 (the temporal rows) and PR #17559 (everysum/avgrow), the refused pairs that nothing enforces anywhere are exactly:minandmaxover —texttextareaemailurlphonepasswordsecretmarkdownhtmlrichtextselectradiolookupmaster_detailtreeuserautonumbercodecolorsignatureqrcode(the string classes, 42 pairs) — and overmultiselectcheckboxestagsimagefileavatarvideoaudiocompositerepeaterrecordlocationaddressjsonformulavector(the non-string classes, 32 pairs).#17513 holds the first 42 only. Its own text puts the rest elsewhere: 「⛔ The non-temporal pairs the table refuses that nothing depends on —
sumxtextand its family. That is #16099's re-scoped residual and stays there.」 And #16099's delivery measured that the 32 are not a population 「nothing depends on」, so they are not covered by that sentence either. ⇒ 74 refused pairs, one ruling short of a home.⭐ The measurement that makes this one question rather than two
PR #17559 built the full-residual variant — judge every non-temporal pair except
min/maxover the string classes, which is the subtraction its dispatch named as the load-bearing one — and ran it:⇒
minxjson, andminxformulabehind it, are refused by the table, are in no ruling's scope, and are driven end to end by the same shared fixture as the string rows.__tests__/measure-result-type.test.tscompiles every measure in ONE dataset (measures: [...]ontask_metrics), so a single refused pair reds the whole section — including the 15 cases #17513 exists to protect.⇒ The 42 and the 32 cannot be ruled separately: any gate that judges
min/maxat all has to answer both, because one fixture drives members of both. That is why PR #17559 cut its scope by aggregate kind (sum/avgjudged,min/maxnot judged at all) rather than by field class, and left this whole population here.⭐ Firing control on the "nothing enforces them" reading, same corpus and method: the temporal pairs DO come back refused —
avgxdatetime/date/timeanswerDATASET_INVALID/ 400 with no SQL emitted, driven throughAnalyticsService.queryDataset. So the zero is a reading of the tree, not a blind harness.What is NOT claimed
min/maxrows may be exactly right; the string rows are ruled C (amend the table to accept them) perAGGREGATE_FIELD_TYPE_COMPATIBILITYrefusesmin/maxover the string classes while 15 shipped end-to-end cases depend on them working — the table or the uses must give #17513, and this card does not pre-judge the non-string ones.min(jsonb)does not exist on PostgreSQL — but nothing in this repository ships a dataset that pairs them, so this is a declared-not-enforced gap, not a live defect.What a taker has to decide
AGGREGATE_FIELD_TYPE_COMPATIBILITYrefusesmin/maxover the string classes while 15 shipped end-to-end cases depend on them working — the table or the uses must give #17513 proposes for the string classes?minxjsonandminxformulaspecifically:measureResultTypealready answersundefinedfor both — a declared verdict ("no single backend-independent value"), not a gap. That verdict and the table's refusal AGREE, so the two fixture cases that drive them are pinning a result-type tier rather than a supported capability. Whoever enforces these rows re-aims those two measures; the precedent is in the same file, where service-analytics:AVG()over aField.datetimemeasure returns SQLite's text→numeric coercion (an average YEAR) with no error, andderived: { op: 'difference' }renders the difference of two of them as a clean plausible number #16737 moved twosum/avgmeasures off a temporal column for exactly this reason and left a comment saying why.Lane
AGGREGATE_FIELD_TYPE_COMPATIBILITYlives in@objectstack/spec⇒domain:specby the standing rule 「凡触packages/spec一律转domain:spec座位」, the same routing #17513 took — even though the consumer and the fixture are both inservice-analytics.Refs: #17513 (the string half) · #16099 / PR #17559 (the
sum/avghalf, delivered) · #16737 / PR #16778 (the temporal half) · #16354 (the lint leg)Generated by Claude Code