TA9 Same-Tick Snapshot Contract implementation
- Observer call site: OnTick after BEFORE_HARDSTOP_EVALUATION trace and before CheckPreHardStopS2StrictGuardExit.
- One snapshot id is built from run_id + basket_uid + runtimeEvalTickSequenceId + shadow eval cycle + stage index.
- Snapshot uses the existing PositionState ps and hardStop bool passed from OnTick; it does not call GetPositionState.
- HardStop threshold, floating loss, distance, and snapshotHardStopNow are calculated in one build function.
- Runtime hardStop and snapshot hardStop are both logged; mismatch emits SNAPSHOT_PARITY_ERROR.
- distance_raw > 0 is required for safe; distance==0 and distance<0 suppress. No epsilon is used.
- Commission and separated swap are NOT_COLLECTED / NOT_SEPARATELY_COLLECTED rather than zero-filled.
