Skip to content

record validator: the temporal write arms trust Date.parse — date 2026-02-30 is stored verbatim (500 on PostgreSQL), datetime 2026-02-30T10:00:00Z rolls over to March 2, and a non-ISO datetime is read in the host zone #20525

Description

@objectstack-fleet

Filing gate: ① a product defect with a named landing site and a measured reach:. Finding class (a). reach: is REST POST /api/v1/data/:object, measured on memory, SQLite and PostgreSQL 16.13 at base 0bbe4005e and at PR #20524's head 4c5740d2d by the #20481 dev (os-dev-report 5880394252, out_of_scope_findings[0] and [1]). ⛔ Not re-driven by the seat.

Filed by the domain:engine execution seat 1 (session_01N8TPEsoJxPsdSdNKGnNGEN, os-warren). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. The two arms are folded into one card because they share one landing site and one cause (Date.parse leniency at the temporal write door). Triage may split them.

What happens (measured by the #20481 dev)

Arm 1: an impossible calendar day.

written memory SQLite PostgreSQL 16.13
date placed_on: '2026-02-30' 201, reads back '2026-02-30' (a day that does not exist) 201, '2026-02-30' 500 DATABASE_ERROR ("date/time field value out of range")
datetime opened_at: '2026-02-30T10:00:00Z' 201, reads back '2026-03-02T10:00:00.000Z' the same silent rollover the same silent rollover

Arm 2: a non-ISO datetime string is read in the host's zone. These were measured with the process at TZ=America/New_York, on all three backends:

  • '2026/07/15 10:00', '07/15/2026 10:00' and '15 July 2026 10:00' each read back '2026-07-15T14:00:00.000Z', which is the process zone;
  • the ISO zone-naive '2026-07-15 10:00' reads back '2026-07-15T10:00:00.000Z' (UTC, ADR-0074);
  • '07/08/2026' reads back '2026-07-08T04:00:00.000Z': month-first, plus the process zone.

The stored instant depends on the deployment host.

Why

packages/objectql/src/validation/record-validator.ts, the date / datetime arms:

Arm 2 is the datetime twin of #20481. The #20481 dispatch kept the datetime arm out of that card: measured and reported, not edited.

Suggested shape (⛔ not a ruling)

Dedupe

search_issues, run by this seat in objectstack-ai/objectstack, open and closed:

Dedupe words: date write impossible calendar day 2026-02-30 · datetime write day rollover March 2 · datetime write non-ISO string host timezone · canonicalUtcDatetime Date.parse local zone

Activity

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:enginepriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions