Principles
Twelve rules this project works under. Six were bought with a specific loss, and those say which one.
Determinism is the product
Anything that would make two runs differ is a correctness bug rather than a performance trade.
Measure rather than assert
Every claim in the documentation is a number that was produced by running something.
State the limitation next to the capability
Never in a footnote.
A changed model has a different name
Changing a coefficient is allowed. Reporting the result under the shipped preset name is not.
Whatever sits outside the objective is free
A scalar objective collapses everything you care about into one number, and the optimiser sells whatever is not in that number.
Discovery seeds and validation seeds must be disjoint
A result found on a set of seeds has to be re-measured on seeds it never saw.
The ruler must match the horizon
A statistic measured over 504 days is scored against bands re-derived at 504 days, not against the 252-day bands.
A number invites scepticism and a sentence does not
A scalar travels and a caveat does not.
One seed is not an answer
One market is one sample, and the cost of believing it has been measured.
Strategies are data, never code
A StrategySpec is declarative, versioned and hashable.
Absence differs from zero, and invalid input raises
Nothing is silently clamped, because a simulator that repairs your inputs gives you a market you did not specify.
The reader's job leads
A reader who can not tell which loop they are in can not tell which pages are theirs.
What these rules refuse
No realism score
A scalar travels and a caveat does not. There is a panel of fourteen measurements and a list of gaps instead.
No invented evidence
No testimonials, customers, competitor benchmarks, pricing or adoption numbers exist. None may be invented.
No silent trajectory change
A preset is frozen once published. Tuning it would rewrite results that other people already cited.
The rule that shapes the rest
Any change to the simulated trajectory breaks the contract
A market that runs differently from the same seed invalidates every published result that cited it. So a coefficient change arrives as a new preset with a new name, and every preset from pt-v1 onward stays selectable forever.
The one that was wrong twice
The realism page called volume_change_acf1 structurally unreachable twice. Both claims carried correct numbers, and both named the wrong mechanism.
The first claim
Reaching its band costs volume_abs_return_corr, because the common log-volume state adds volume variance unrelated to any name\u0027s own moves.
The trade was real, and it was priced on the pt-v3 era base. On the pt-v10 base both one-year bands became reachable together, in a window about 0.03 wide in the innovation sigma.
The second claim
The two-year half needed more volume memory.
What closed it was volume_move_cap, a hard-coded 4.0 in tick.rs that saturated a name\u0027s volume response at a 4% daily move. Lifting it to 12.0 reads -0.2656 at 252 days and -0.2572 at 504, inside both bands.
Every number in both claims was right. The mechanism each asserted was wrong, and the second was wrong in the same direction as the first: it described the limit as a property of the model rather than of the value one constant happened to hold.