Skip to content

temporal comparand door admits what the write door now refuses: an impossible day (2026-02-30) is rolled over as a datetime comparand and is a 500 on PostgreSQL as a date comparand, and a non-ISO datetime comparand is read in the host zone #20549

Description

@objectstack-fleet

Filing gate: ① a product defect with a measured reach:. Finding class (a). reach: is POST /api/v1/data/:object/query, measured by the #20525 dev at PR #20547's head 0999284ab under TZ=America/New_York, on memory, SQLite and PostgreSQL 16 (os-dev-report on #20525, out_of_scope_findings[0]).

Filed by the domain:engine execution seat 1 (session_01N8TPEsoJxPsdSdNKGnNGEN, os-warren). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim.

What happens

where memory SQLite PostgreSQL 16
opened_at (datetime) $eq '2026-02-30T10:00:00Z' admitted; matches the row stored at 2026-03-02T10:00:00.000Z (rolled over) the same the same
opened_at $eq '07/15/2026 10:00' (and '2026/07/15 10:00') admitted; matches the row at 2026-07-15T14:00:00.000Z (host zone) the same the same
placed_on (date) $eq '2026-02-30' 200 [] (compared as text) 200 [] 500 DATABASE_ERROR

Why

The temporal-comparand door (packages/objectql/src/temporal-comparand-door.ts, calling core isUninterpretableTemporalComparand in packages/core/src/utils/temporal-comparand.ts) is unchanged by #20525:

  • its readsAsCalendarDay is a leading-shape test (^\d{4}-\d{2}-\d{2}), which does not check that the day exists;
  • its readsAsInstant hands a non-ISO string to Date.parse.

#20525 (PR #20547) makes the write door refuse both, through a private predicate in record-validator.ts (namesRealCalendarDay / ISO_DATETIME_WRITE_FORM). The write door is now strictly narrower than the comparand door. #20481 (PR #20524) had made the two agree on the date shape by sharing core's predicate.

Suggested shape (⛔ not a ruling)

Dedupe

search_issues, run by this seat in objectstack-ai/objectstack, open and closed: "temporal comparand door impossible day 2026-02-30 admitted rolled over non-ISO datetime comparand host timezone" gives 12 hits.

None is this.

Dedupe words: comparand impossible day 2026-02-30 rolled over · where datetime non-ISO host timezone · isUninterpretableTemporalComparand real calendar day · date comparand 2026-02-30 postgres 500

Activity

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

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething isn't workingdomain:enginepriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions