Early divergence (tick 1069) was driven by replay input reconstruction mismatch (rewrite firing where native did not).
tick 3624 “missing perk RNG” was a tooling false-positive: those draws happened in replay events, outside world-step RNG marks.
Per-tick rng.outside_before_calls replay must special-case tick 0 (bootstrap draws already baked into inferred seed).
Native bonus_update clamps double_xp/freeze to 0.0 when timer <= 0.0; missing this caused -8ms carry and tick 4311 timer drift.
Reload timing is float-boundary sensitive: using float32-style reload math plus native preload ordering moved ammo parity to native at tick 4396.
Strict float32 sequencing in creature AI distance/orbit paths fixed a corpse-hit timing miss at tick 6958 and moved the frontier to tick 7466.
The current tick 7466 XP divergence is downstream of RNG stream drift:
first clear native-only RNG tail is at tick 7336 (perk_select_random shortfall 2 draws),
by tick 7440 RNG values are already offset at the first draw in player_fire_weapon,
rewrite then resolves a kill at tick 7466 that native does not.
Local diagnostic replay with +2 synthetic draws before tick 7337 moves first mismatch to tick 8593, confirming the 7336 missing-tail branch as the dominant blocker.
Existing capture lacks explicit perk-apply IDs, so we cannot faithfully replay native perk selections for this SHA family.
Added strict float32 AI distance/orbit intermediates in src/crimson/creatures/ai.py.
Added perk-apply capture telemetry (perk_apply, perk_apply_outside_before) and replay-side event support (orig_capture_perk_apply_v1) so future captures can replay explicit perk picks.
docs(frida): renumber sessions and fold same-sha updates (90f5637e)
Blocked on missing perk-selection identity in this capture: the replay can observe pending/menu transitions but cannot know which perk native applied at each menu close.
Record a new capture with the updated script (perk-apply telemetry enabled by default), then verify that replayed orig_capture_perk_apply_v1 events remove the tick 7336 RNG tail and push the first mismatch beyond tick 7466 using event/RNG anchors (not absolute-tick equality).
Next session cleanup: once a fresh capture confirms stable key-state telemetry, remove temporary replay fallbacks in src/crimson/original/capture.py that synthesize/mix input from partial fields.