fix: 게임 outbox 운영 시각을 UTC wall로 통일한다

KST 세션에서 ReadModel과 WebPush outbox의 producer provenance를 분리하고 due, lease, retention 비교를 UTC wall 계약으로 맞춘다.

기존 TIMESTAMP(3) 타입과 이전 DML 형태를 유지하면서 populated upgrade, pending requeue, delivered 보존과 두 번째 deploy no-op을 자동 검증한다.
This commit is contained in:
2026-08-24 07:40:45 +00:00
parent 3bda79ccf8
commit fa9cee36cf
9 changed files with 765 additions and 15 deletions
@@ -44,8 +44,11 @@ export class WebPushOutboxWorker {
SELECT "id"
FROM "web_push_outbox"
WHERE "delivered_at" IS NULL
AND "available_at" <= CURRENT_TIMESTAMP
AND ("locked_at" IS NULL OR "locked_at" <= CURRENT_TIMESTAMP - INTERVAL '30 seconds')
AND "available_at" <= (CURRENT_TIMESTAMP AT TIME ZONE 'UTC')
AND (
"locked_at" IS NULL
OR "locked_at" <= (CURRENT_TIMESTAMP AT TIME ZONE 'UTC') - INTERVAL '30 seconds'
)
ORDER BY "id"
FOR UPDATE SKIP LOCKED
LIMIT 50
@@ -116,7 +119,7 @@ export class WebPushOutboxWorker {
WITH expired AS (
SELECT "id"
FROM "web_push_outbox"
WHERE "delivered_at" < CURRENT_TIMESTAMP - INTERVAL '1 day'
WHERE "delivered_at" < (CURRENT_TIMESTAMP AT TIME ZONE 'UTC') - INTERVAL '1 day'
ORDER BY "id"
LIMIT 500
)
+1 -1
View File
@@ -39,7 +39,7 @@ describe('readReleaseManifest', () => {
await expect(readReleaseManifest(workspaceRoot)).resolves.toMatchObject({
controllerProtocol: RELEASE_CONTROLLER_PROTOCOL,
gatewaySchemaHead: '20260823010000_add_web_push_notifications',
gameSchemaHead: '20260823010000_add_web_push_outbox',
gameSchemaHead: '20260824070000_game_outbox_utc_wall_timestamps',
});
});