Session rest: a rest across the 5 PM roll reports unsynced; health excuses a wake

A firm resting across the trade-date roll kept reporting its last snapshot,
so yesterday's realized P&L and DLL lockouts counted as accounts already
traded today (Nik's Topstep read 5/5 traded at 5:31 PM from 3:29 PM data).
Its report is now the unsynced one until it logs back in; a rest within one
trade date reports as before.

/api/health also counts a firm logging back in after a rest as nothing
wrong, within its 15-minute grace, rather than reading not ok for the
seconds before its first sync.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Brandon Li
2026-10-21 20:12:52 -05:00
co-authored by Claude Opus 5.5
parent 5eb0ea7760
commit 062ec07f0a
4 changed files with 36 additions and 9 deletions
+12 -1
View File
@@ -6,7 +6,7 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import {
nextSessionOpenAt, planCheckIn, planRest, isNoTradeTime, currentTradeDateCT,
nextSessionOpenAt, planCheckIn, planRest, restSnapshotStale, isNoTradeTime, currentTradeDateCT,
REST_LEAD_MIN_MS, REST_LEAD_MAX_MS, REST_MIN_MS, CHECK_IN_GAP_MIN_MS, CHECK_IN_GAP_MAX_MS,
} from '../lib/trading-logic.ts';
@@ -168,3 +168,14 @@ test('rests drawn for the same open log back in at different times', () => {
for (let i = 0; i < 50; i++) wakes.add(Math.round(planRest(at('2026-10-24T17:00:00Z'), opensAt, rand).wakeAt / MIN));
assert.ok(wakes.size >= 20, `only ${wakes.size} distinct wake minutes`);
});
test("a resting snapshot from before the 5 PM roll is stale; one from today's trade date isn't", () => {
// 2026-10-21: Nik's Topstep last synced 3:29 PM CT, read at 5:31 PM CT.
assert.equal(restSnapshotStale(at('2026-10-21T20:29:00Z'), at('2026-10-21T22:31:00Z')), true);
// Either side of the roll, a minute apart.
assert.equal(restSnapshotStale(at('2026-10-21T21:59:00Z'), at('2026-10-21T22:01:00Z')), true);
// Rested after the evening open, read the next afternoon: the same trade date.
assert.equal(restSnapshotStale(at('2026-10-22T00:30:00Z'), at('2026-10-22T19:00:00Z')), false);
// Never synced.
assert.equal(restSnapshotStale(0, at('2026-10-22T19:00:00Z')), true);
});