Skip to content

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

Description

@claude

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 — text textarea email url phone password secret markdown html richtext select radio lookup master_detail tree user autonumber code color signature qrcode (the string classes, 42 pairs) — and over multiselect checkboxes tags image file avatar video audio composite repeater record location address json formula vector (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 except min / 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.

What is NOT claimed

What a taker has to decide

  1. For the 32 non-string pairs: does the table keep refusing them (and something must then enforce them), or does it accept them the way AGGREGATE_FIELD_TYPE_COMPATIBILITY refuses min/max over 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?
  2. For min x json and min x formula specifically: measureResultType already answers undefined for 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 a Field.datetime measure returns SQLite's text→numeric coercion (an average YEAR) with no error, and derived: { op: 'difference' } renders the difference of two of them as a clean plausible number #16737 moved two sum / avg measures off a temporal column for exactly this reason and left a comment saying why.
  3. Only then, enforcement — and in one pass for all 74, not per field class.

Lane

AGGREGATE_FIELD_TYPE_COMPATIBILITY lives in @objectstack/specdomain: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)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions