What a wallet in dry_run (Mode::Dry) actually exercises vs live in PM (pmv2), and which signals to trust when verifying a newly-added trading wallet (e.g. wallet2/Balu). Verified from crates/position_manager/src/execute.rs and tg_digest.rs at commit a405d28, 2026-07-03.
Verification Signals (TL;DR)
When verifying a new wallet in
dry_run, the ONLY valid signals are:
autotradeDRY-SIGNED log lines (arm + signer + routing proven end-to-end)dry Ncount for that wallet in the 30-min Telegram digestNOT
pm_fak_attemptsrows — those stay empty untilmode=live.
What dry_run DOES exercise
In Mode::Dry, place_entry → reserve() → dry_rehearse() (execute.rs:145-205). dry_rehearse:
- Builds AND signs the order against the wallet’s proxy (
signer.build_order) - Runs
assert_amounts - Logs
tracing::info!(target:"autotrade"):DRY-SIGNED maker <m> taker <t> hash <h> contract <c>
So a clean DRY-SIGNED line proves the full arm + signer + routing chain works end-to-end for that wallet — the same signing path a live order would take, minus submission.
dry_run also records Category::DryRehearse into the Telegram digest aggregator via self.record. The 30-min digest renders it per wallet as dry <count> (label "dry", tg_digest.rs:88). dry_run wallets DO appear in the digest.
What dry_run does NOT exercise
dry_run does not reach the FAK telemetry path. log_fak_attempt — which writes to pm_fak_attempts (ts_ms, best_ask_at_snap, fill_status, fill_price, filled_size) — is only called from the LIVE place_buy path (execute.rs:404-419).
Consequences in dry_run:
- NO
pm_fak_attemptsrows are written - The FAK v2 re-priced-retry logic is NOT exercised
Both only happen once mode=live.
Don't wait on pm_fak_attempts for a dry_run wallet
An empty
pm_fak_attemptstable for a wallet running indry_runis EXPECTED, not a failure. It proves nothing about the wallet either way. Look at DRY-SIGNED logs and thedry Ndigest count instead.
How to apply
Verifying a new wallet (e.g. wallet2/Balu) armed in dry_run:
- Grep the
autotradetracing target forDRY-SIGNEDlines mentioning that wallet’s maker/contract → confirms sign + route. - Check the next 30-min Telegram digest for a
dry Ncount under that wallet → confirms it flowed through the aggregator. - Flip to
mode=live(3-way clampmin(global, wallet, source)) before expecting anypm_fak_attemptsrows or FAK-retry behavior.
Related
- pmv2-multi-signer-wallet-2026-07-01 — the wallet axis / per-wallet signing being verified here
- pmv2-fak-no-match-reject-single-line-2026-06-30 — FAK path (live-only) not exercised in dry_run
- pmv2-pm-live-real-money-status-2026-07-02 — the live mode + Telegram 30-min digest this dry signal shares
- pmv2-crypto-source-rename-gotcha-2026-06-24 —
off/dry_run/livemode semantics - position_manager