Skip to content

TimeUpdateInterval declares eight intervals while driver-memory answers 501 for three — the ADR-0049 enforce-or-remove question #17206's changeset promises a card for #17296

Description

@claude

Filed by the domain:engine execution PM seat, discharging a debt this seat incurred on #16178 and then did not pay.

⛔ Filed unassigned and unlabelled, as an observation for triage. Grade deliberately not asserted, domain deliberately not asserted — but note the subject is packages/spec, which SKILL.md:231 routes to the domain:spec seat regardless of who needs it.

Why this card exists at all

PR #17206's changeset asserts, as fact:

…the spec-side narrowing of TimeUpdateInterval is filed separately as a domain:spec card under ADR-0049 and is deliberately not performed here.

No such card exists. Measured 2026-09-10T04:2xZ: a semantic search over this repo returns one unrelated closed card (#14104) and nothing on this subject. The contract review of #17206 caught the same thing independently (verdict 5610525481, finding F2) and reached the same count.

⚠️ The claim was not idle text. Maintainer ruling 5583991002 said the seat would file it, and the sentence quoting that promise lands in three CHANGELOGs — @objectstack/core, @objectstack/objectql, @objectstack/driver-memory — where it becomes a published statement that a card exists. This card makes the statement true rather than having the changeset reworded to promise it again.

⭐ Recorded plainly: this is a seat failure, not the implementer's. The implementer wrote what the ruling told it, and the reviewer caught what the seat forgot.

The subject

TimeUpdateInterval (packages/spec/src/data/analytics.zod.ts, per export-origins/data.json:650; pinned at packages/spec/src/data/analytics.test.ts:41-45) declares eight intervals. driver-memory's analytics face now refuses three of them — second / minute / hour — as NOT_IMPLEMENTED / 501, because it cannot label a sub-day bucket.

So a value the spec declares as authorable is one that at least one shipped backend answers 501 for. That is the ADR-0049 enforce-or-remove shape: a declared value that is not honoured end to end is either enforced everywhere or retired from the declaration.

#17206 deliberately did not narrow the spec, and that restraint was correct — packages/spec is untouched there, AnalyticsQuery.timeDimensions[].granularity keeps its name, type and optionality, and every request body still parses byte-identically. This card is the piece that was consciously left out, not a regression.

What needs deciding, before any code

  1. Is this actually enforce-or-remove, or a legitimate capability gap? A backend answering 501 for a declared-but-unsupported value is the documented shape of a capability gap, not necessarily a false declaration. ADR-0049's question is whether TimeUpdateInterval is a contract every backend must honour or a vocabulary backends may partially implement. That is a ruling, not an implementation.
  2. If it is a vocabulary, the fix is likely documentation plus a capability probe, ⛔ not a narrowing — and this card closes not_planned with that reasoning recorded.
  3. If it is a contract, retiring three members of a published closed set is a packages/spec narrowing with an ADR-0087 disposition and an upgrade path for anyone authoring second/minute/hour today. The spec-property-retirement playbook covers that route.
  4. What do the OTHER backends answer? The SQL/ObjectQL face's position on sub-day granularity is not measured here. A narrowing decided from one backend's limits would be the wrong shape; ⛔ this should not be ruled on driver-memory alone.

Not to be conflated with

#16178 / PR #17206 itself, which narrows one backend's accept set at request time and touches no spec. The two are deliberately separate, and that separation is the reason this card is owed rather than optional.


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