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
Filed unassigned by the os-dev seat working #15768 (session https://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y). Not graded, no domain:* — routing and priority are the triage seat's. This is the sibling population of that card, deliberately left out of its PR rather than absorbed.
The rule, and the half that landed
min and max return a value of the aggregated field's own type. #15768's services half implements exactly that for the TEMPORAL family: a min/max over a date / datetime / time field is now described as time in AnalyticsResult.fields[].type instead of number (measureResultType in packages/services/service-analytics/src/measure-result-type.ts, applied in queryDataset's ADR-0021 enrichment).
The rule is not temporal-specific. The same aggregate over a string-valued column also returns a string:
min / max over a text / textarea / email / url field
min / max over a select / radio field (the stored option value)
min / max over a lookup / user field (the stored id)
Every one of those columns is still described as type: "number" today. That is the same defect the card records — column metadata contradicting the value beside it — over a different set of field types.
The card and its triage ruled on the temporal population. The measured evidence is a min over a Field.datetime, and the triage seat's ruling is about that response. Widening the fix's behavioural surface past the population that was measured is a scope decision, not the card's.
So the honest shape is: land the population that is certain, and file this one so the uncertain members get decided rather than guessed.
What deciding it needs
An enumerated verdict per FieldType member for min/max — the same treatment AggregationFunction got in #15768 — pinned by a test that walks the enum so a new field type cannot fall through silently. measureResultType already has the shape for it: it answers undefined for "no correction", so widening it is adding rows to one table, not a second mechanism.
Note the wire vocabulary for this position is DimensionType (string / number / boolean / time / geo), not FieldType — a text-valued measure column would be string, the same word a string dimension column already carries.
Related
#15768 (the temporal half, where this rule and its one home were introduced) · #11455 (the driver-level envelope for sum/avg/min/max over a boolean column, closed).
Filed unassigned by the
os-devseat working #15768 (sessionhttps://claude.ai/code/session_01XpTx2tbq3pZRYAdoGt6E6Y). Not graded, nodomain:*— routing and priority are the triage seat's. This is the sibling population of that card, deliberately left out of its PR rather than absorbed.The rule, and the half that landed
minandmaxreturn a value of the aggregated field's own type. #15768's services half implements exactly that for the TEMPORAL family: amin/maxover adate/datetime/timefield is now described astimeinAnalyticsResult.fields[].typeinstead ofnumber(measureResultTypeinpackages/services/service-analytics/src/measure-result-type.ts, applied inqueryDataset's ADR-0021 enrichment).The rule is not temporal-specific. The same aggregate over a string-valued column also returns a string:
min/maxover atext/textarea/email/urlfieldmin/maxover aselect/radiofield (the stored option value)min/maxover alookup/userfield (the stored id)Every one of those columns is still described as
type: "number"today. That is the same defect the card records — column metadata contradicting the value beside it — over a different set of field types.Why it was scoped out rather than folded in
Two reasons, both stated in #15768's PR:
minover aField.datetime, and the triage seat's ruling is about that response. Widening the fix's behavioural surface past the population that was measured is a scope decision, not the card's.minover anautonumberdepends on whether the value is stored as an integer or a formatted string;min/maxover abooleanhas nominat all on Postgres (see the closed driver-sql (PG): sum/avg/min/max over a boolean column throw the raw PostgreSQL 42883 with no ADR-0112 envelope (status undefined) #11455) while SQLite answers 0/1;formulaandsummaryresolve to whatever they compute. A correction table covering those would be inventing answers, which is precisely what A dataset measure over a datetime is typednumberin the analytics response, and a metric tile ignores theformatstyle it is handed — measured on 17.3.0 #15768's dispatch ruled against.So the honest shape is: land the population that is certain, and file this one so the uncertain members get decided rather than guessed.
What deciding it needs
An enumerated verdict per
FieldTypemember formin/max— the same treatmentAggregationFunctiongot in #15768 — pinned by a test that walks the enum so a new field type cannot fall through silently.measureResultTypealready has the shape for it: it answersundefinedfor "no correction", so widening it is adding rows to one table, not a second mechanism.Note the wire vocabulary for this position is
DimensionType(string/number/boolean/time/geo), notFieldType— a text-valued measure column would bestring, the same word a string dimension column already carries.Related
#15768 (the temporal half, where this rule and its one home were introduced) · #11455 (the driver-level envelope for
sum/avg/min/maxover a boolean column, closed).