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
ci(temporal): the non-SQL backends run under a skewed process zone too (#4180)
The temporal-conformance job pinned TZ: America/New_York on the live
Postgres/MySQL sweep only. core, formula, driver-memory, driver-mongodb and
service-analytics kept running in the runner's default UTC, where every offset
bug is invisible because the offset is zero.
They now run in the same skewed zone, and both TZ-skewed steps carry a
non-vacuity guard that fails the job if the process zone is UTC or the offset
is zero, so the coverage cannot silently evaporate if the runner image changes.
# The axis is only real if the zone actually took. Without this, a
332
+
# dropped `TZ:` line silently returns the job to UTC coverage and
333
+
# everything still passes — the same vacuous-pass hole the live-server
334
+
# suites close by asserting a non-UTC SERVER.
335
+
node -e "const tz=Intl.DateTimeFormat().resolvedOptions().timeZone,off=new Date().getTimezoneOffset();if(!tz||tz==='UTC'||off===0){console.error('process zone is '+tz+' (offset '+off+') — this job must run skewed');process.exit(1)}console.log('process zone: '+tz+' (offset '+off+')')"
336
+
pnpm --filter @objectstack/driver-sql test
337
+
338
+
# The non-SQL half of the same axis. `driver-sql` has run under a skewed
339
+
# process zone since #3979, but the other backends the temporal
340
+
# conformance matrix holds to that standard never did — and they are the
341
+
# ones whose correctness rests ENTIRELY on process-zone independence,
342
+
# since they have no server to blame: `storageDatetimeValue` /
343
+
# `storageTimeValue` fold an instant through UTC getters, the filter-token
344
+
# resolver derives "today" from UTC calendar parts, and the analytics
345
+
# bucketer does the same. Swap one `getUTC*` for its local twin and every
346
+
# one of those silently shifts by the host's offset — the exact defect
347
+
# ADR-0053 D-C1 records for a `Date` bound to a Postgres TIME column.
348
+
#
349
+
# Measured before adding this: all five suites already pass under
350
+
# America/New_York (-5/-4, with DST), Asia/Kolkata (+05:30) and
351
+
# Pacific/Chatham (+12:45). So this found nothing on the day it landed,
352
+
# which is what a ratchet is for — it makes the property enforced rather
353
+
# than incidental.
354
+
- name: Build the non-SQL temporal backends
355
+
run: >-
356
+
pnpm exec turbo run build
357
+
--filter=@objectstack/service-analytics...
358
+
--filter=@objectstack/driver-memory...
359
+
--filter=@objectstack/driver-mongodb...
360
+
--filter=@objectstack/formula...
361
+
--concurrency=4
362
+
363
+
- name: Run the non-SQL temporal backends under the skewed process zone
364
+
env:
365
+
TZ: America/New_York
366
+
run: |
367
+
# The axis is only real if the zone actually took. Without this, a
368
+
# dropped `TZ:` line silently returns the job to UTC coverage and
369
+
# everything still passes — the same vacuous-pass hole the live-server
370
+
# suites close by asserting a non-UTC SERVER.
371
+
node -e "const tz=Intl.DateTimeFormat().resolvedOptions().timeZone,off=new Date().getTimezoneOffset();if(!tz||tz==='UTC'||off===0){console.error('process zone is '+tz+' (offset '+off+') — this job must run skewed');process.exit(1)}console.log('process zone: '+tz+' (offset '+off+')')"
372
+
pnpm \
373
+
--filter @objectstack/core \
374
+
--filter @objectstack/formula \
375
+
--filter @objectstack/driver-memory \
376
+
--filter @objectstack/driver-mongodb \
377
+
--filter @objectstack/service-analytics \
378
+
test
321
379
322
380
dogfood:
323
381
# Sharded 2-way: the suite is ~60 independent test files, each booting its
0 commit comments