alpha5: 6-agent perf wave (pipeline + compressed-blocks + pebble + peers + profile + mem-default)

16 commits across 6 parallel worktrees. Highlights ranked by impact:

PIPELINE (#1+#2): Parallel within-block tx-sig recovery on the per-peer
receive goroutine, plus a tx-sig cache (8K-entry LRU) to dedupe
duplicate deliveries from multiple peers. +44% bps avg (855→1193,
920→1494 best). Tried separate decode/sig worker pool + singleflight
on signerCache — both regressed because back-pressure stalled the TCP
receive loop and triggered peer drops.

COMPRESSED BLOCKS (#3+#8): proto v106→v107 + advertise zstd dict
catalogue in hello user_data so peers send compressed_block_message
(5002) instead of block_message (1001). 100% inbound traffic switched
(0 → 55,972 compressed deliveries in 60s). Decompression via existing
internal/blocklog/zstd. Lazy-decompress cache in chain/recent_blocks.

PEERS (#6+#7): max-outbound 8→32, max-concurrent-dials →24. Fixed
LegacyAddressMessage (5010) wire-encoding bug — fc::ip::address packs
as LE uint32 — that was causing peerdb to never fill past the 8 seeds.
Per-peer adaptive FetchBatch sized to recent blocks/sec, bounded
[50, 5000]. Result: 8→22 peers verified in mainnet runs (2.6× fan-out).

PEBBLE (#4): --cache-mb=1024 (was 256MB hard-coded). SoftCommit +
chain-driven N-block batched commits + auto-replay crash recovery
(restart compares persisted DGPO head vs block_log head, replays gap).
Per-batch fsync via --commit-batch-fsync. Honest finding: per the
profile, secp256k1 is 88% of CPU and pebble fsync is 0.6%, so the
batching framework is for crash safety not throughput.

PROFILE (#10): Full pprof report at docs/perf/sync-profile.md.
Top hotspot: secp256k1 RecoverPublicKey 88.4% cum. Top alloc:
state.Session.Put overlay copies 168MB / 200K blocks. Recommendations
for the next round (skip-sig on trusted self-replay → 5-7×; per-tx
parallel sig recovery — already in pipeline agent's work). Small wins:
state.Range backend-only fast path (3% gain). pprof flag wiring.

MEM DEFAULT for --verify-against (separate 1-line commit before
fan-out). Verify-against runs throw away state — pebble fsync wasted.
Now defaults to mem; explicit --backend=X overrides.

State-commit batching (#9, agent-commit-batch) was developed in
parallel but skipped at merge as duplicate-concept with pebble's
already-merged batching framework. Worktree preserved if we want
to revisit the deeper Database.BatchSize design.

All ./internal/p2p/... + ./internal/chain/ + ./cmd/ghive-sync/ tests
green. Replay regression: 2M blocks, 0 errors. Bottleneck has moved
off network/peers and into per-block apply CPU; next round of work
should target sig recovery itself (decred/secp256k1 has FieldVal as
35-30-10% leaves of ECDSA recovery).