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:

  1. autotrade DRY-SIGNED log lines (arm + signer + routing proven end-to-end)
  2. dry N count for that wallet in the 30-min Telegram digest

NOT pm_fak_attempts rows — those stay empty until mode=live.

What dry_run DOES exercise

In Mode::Dry, place_entryreserve()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_attempts rows 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_attempts table for a wallet running in dry_run is EXPECTED, not a failure. It proves nothing about the wallet either way. Look at DRY-SIGNED logs and the dry N digest count instead.

How to apply

Verifying a new wallet (e.g. wallet2/Balu) armed in dry_run:

  1. Grep the autotrade tracing target for DRY-SIGNED lines mentioning that wallet’s maker/contract → confirms sign + route.
  2. Check the next 30-min Telegram digest for a dry N count under that wallet → confirms it flowed through the aggregator.
  3. Flip to mode=live (3-way clamp min(global, wallet, source)) before expecting any pm_fak_attempts rows or FAK-retry behavior.