// What was hard
Every fix made it more willing to say no.
The dangerous failures here don't crash. They agree with you.
"Running" isn't "working." A database restart killed the market-data loop, but a quote stream in the same process kept it alive, so Azure showed Running for two days while crypto prices sat frozen. The strategies rightly refused to trade. Now both halves fail together and exit, and a fleet-wide monitor watches every worker's heartbeat.
A reconciliation that could never fail. The simulator was checked against the platform's own records, so a missing position could vanish from both sides and understate risk. A clean result proved nothing. Now two independently built sets of books must agree, and I formally invalidated nine of my own earlier reports built on the old ones.
No peeking at the future. Backtests see only data up to the decision bar and must clear five bias checks, including look-ahead and survivorship. Paper fills needed the same rule: a regression test caught a simulated buy priced from a newer quote from another source. Now each fill is bound to, and stored with, the exact quote it was admitted on.
"Typically" is not a deadline. The broker posts crypto fees later, and its docs say only "typically" the next day. Inferring one from leftover cash would be easy and unprovable, so a missing fee opens an incident that blocks new risk on that account alone. One paper account has stayed blocked for weeks rather than guess.
Keeping models honest. The platform fills in every ID and rejects any quantity, price, or credential a model writes; models never grade themselves. The first real model run took four tries, each exposing a test fixture that didn't match the real service, and each fix kept it failing closed. Still open: a provider-enforced dollar ceiling per request.