Every one of these was green. A scheduled job that fires, completes and records a success is indistinguishable from a job that works — and four of them were firing into an empty room. None of this showed up as a failure anywhere. The heartbeats were fine, the report rendered, the tests passed.
The regime read was scheduled 08:30 and the gap check 08:35, on the assumption that MarketSmith's pre-open note is written "around 08:00–08:15". It is written then. It arrives later. Eight arrivals out of the message store:
So the 08:30 regime read never once saw the day's own mail — it re-read the previous evening's note, which is the only reason a second regime job exists at all. And the gap check, which correctly refuses a quote that is not today's, reported nothing every single session while its heartbeat stayed green. The job ran. It had nothing to read.
Regime now fires at 09:05, after the latest observed arrival and before the 09:15 jobs that act on the snapshot. The gap check fires at 09:08, three minutes after the job that stores what it parses. Seven minutes before the bell to act by hand is thin. It is what the arrival times allow, and the alternative was the forty minutes the old schedule claimed and a report built on nothing.
STRIKE and REVERSAL were left out of the scheduled scan on the grounds that neither may be placed unattended: STRIKE is the intraday scanner and everything here is CNC, so its stop would be squared off the day it was placed; REVERSAL enters at the market rather than on a resting trigger. That reasoning is correct about placing orders and was applied to scanning.
Leaving them unscheduled stopped nobody taking an intraday product. What it did was leave the morning report's STRIKE and REVERSAL tables built from whatever hand-run happened last: real entries, real stops, arithmetically correct, priced off a close that could be several sessions old — and formatted identically to rows scanned that evening.
| list | holds | what it decides |
|---|---|---|
| SCHEDULED_STRATEGIES | 6 | what the nightly scan runs |
| TRADED_STRATEGIES | 4 | what may reach the placement path |
Stale rows are the failure that does not look like one. The numbers are right; the session is wrong; nothing about the row says so. The run timestamp was on the page, inside a sentence at the top of the section, which is not where anyone looks before reading a stop level.
Each table now carries a chip when its run is behind the newest scan on the page, saying how many days and what to do about it. The yardstick is the page rather than the clock, because the clock is wrong on exactly the mornings that matter: read on a Saturday it would call Friday's scan stale, and generated before an evening scan it would flag every table on the page.
Adding to winners was measured, written up and implemented on 16 September: add at +1R once the stop has reached breakeven, same rupee risk as the base, the add carrying its own stop, refused past +2R. It was a management command nobody invoked, so it fired zero times.
It is now scheduled every thirty minutes from 10:00 to 14:30 on weekdays and it is deliberately unarmed — it computes what has earned an add and places nothing. Arming it is a one-line change. The point of scheduling it unarmed first is to see it produce a correct list on live positions before it is allowed to act on one.
Three of these four were invisible for the same reason: the monitoring proves a job ran, and every one of them ran. Nothing anywhere asserts that a job that runs every weekday has ever produced a non-empty result. That is the check worth adding, and it is the same shape as the rule that produced zero setups for twenty sessions in September — a mechanism verified, an outcome never measured.
← Trading book · equity-service v157–v160 · 23 September 2026