Bot Titles
PLS-EMP-SCAN-V1Performance So Far
PLS-EMP-SCAN-V1Recent Fire Attempts
PLS-EMP-SCAN-V1Token Reverters (24h)
PLS-EMP-SCAN-V1Biggest Block
PLS-EMP-SCAN-V1CURRENT WALL: the strategy is structurally non-viable in its current form. There is no incremental fix that flips the win curve from 0/5306 to any-positive sample. The oracle-driven thesis cannot be patched — the speed-of-execution gap to the underlying pools (where every other bot operates) is too wide. Restarting under the same architecture would resume the same 0% pattern at the same gas cost.
Sub-wall: the bot is also operationally retired — no tmux session since 2026-04-21, no process running. Formally Decommissioned 2026-05-21 on the fleet grid (alongside PLS-PLSX-GRIND-V1), promoted from Paused after the dedicated-page postmortem stood for 30+ days unchanged. Restoring it requires a tmux launch + sentinel-grade slowness assumption + acceptance of the gas burn. None of those are net-positive moves. Until/unless the strategy is rewritten around a mempool feed (in which case it's a different bot), this row stays Decommissioned; the postmortem in pulsechain/notes/pulse-empseal-postmortem.md is the canonical "do not resurrect" reference.
Fantasy
PLS-EMP-SCAN-V1If we had a direct subscription to every relevant DEX pool's Swap event on PulseChain (instead of round-tripping through EmpSeal's queryAdapter), we'd see liquidity moves at block-time instead of oracle-poll-time, and our spread detection would be at parity with the bots that actually win these races. Closest real-world thing: pulse-sentinel already peers with 25 PulseChain nodes via devp2p and exposes mempool subscriptions at ws://127.0.0.1:9876. Subscribing the empseal scanner to per-pool Swap logs + mempool pending-trade signals (instead of polling queryAdapter) would close the latency gap. But that's a different bot — same input (cross-DEX spread) wired through a different signal path. Worth doing as a NEW bot; not worth rebuilding empseal in place.
Suggestions for Improvement
PLS-EMP-SCAN-V1- 01CRITICALDo not redeploy. The 5,306 / 0 sample is decisive; the strategy as encoded has no edge. Any "improvement" to the existing scanner is a sunk-cost fallacy. Archive logs/pulse-empseal-trades.ndjson and remove the bot from active rotation if not already.
- 02HIGHSalvage the lessons, not the bot. EmpSeal as a price source is fine — but only as an INPUT to a mempool-aware executor, not as the trigger. Fold the use case into backrun-exec (event-triggered) or tri-backrun (block-aware) — both already operate closer to the venue than queryAdapter() can.
- 03HIGHDisable the 11+ L0/L1/L4/L8 decomposer scripts that exist purely to RCA this dead bot every cycle. They consume LLM context + CPU on a permanently-shelved target. List in pulsechain/notes/pulse-empseal-postmortem.md.
Conclusion
PLS-EMP-SCAN-V1Verdict: 14 days, 5,306 attempts, 0 wins ever, −574K WPLS. Strategy never had edge. Currently shelved; recommend permanent decommission. Active 2026-04-07 → 2026-04-21. The thesis (EmpSeal aggregator as a price-discrepancy oracle) was empirically falsified by the operating data: 4,257 sim-fails (80%) + 1,049 thin (20%) = zero net-positive trades across the entire lifespan.
Failure mode #1 — the oracle was always slower than the venue. EmpSeal's queryAdapter() reads from the same pools we'd execute against, with at least one round-trip of latency. By the time the bot consumes the quote, parses it, sims, and submits, the spread either (a) has been claimed by a competitor with direct pool subscriptions or (b) drifted in normal pool state. Top revert reasons confirm the pattern: 2,265 "call failed" + 1,988 InsufficientProfit reverts — the contract's minProfit guard rejecting because actual output dropped below the encoded floor between sim and execution. Same disease as Monad cross-agg's "Return amount is not enough", same fix-class: only solvable by being closer to the venue than the oracle is.
Failure mode #2 — the addressable universe collapsed to zero. Final 9 scans (2026-04-21 14:51–14:53) show signals=0 / sim=0/0 / blacklisted=9. By end-of-life the bot was scanning 17 tokens × 10 adapters per cycle with 9 tokens already self-blacklisted, and producing zero signals for 5 consecutive cycles. The strategy effectively ran out of pairs it was willing to attempt before it ran out of capital.
Failure mode #3 — gas burned without ROI. 714,794 PLS lifetime gas spent (~$5–6 at PLS prices over the period) for zero return. That gas was paid on simulation overhead + the few sims that reached on-chain revert. Every additional day the bot ran was strictly negative.
Fixable? No — not as encoded. The decommission verdict stands. Replacing EmpSeal-as-oracle with mempool intel is a different bot (use backrun-exec / tri-backrun, which already do that). Tightening minOut, smaller bet sizes, more adapters — all bandaids on a strategy where the input signal is structurally too slow. The lesson kept from this bot: whenever a bot's signal source isn't the execution venue itself, you have a sim-vs-live gap that scales with latency. The bot itself, no. See pulsechain/notes/pulse-empseal-postmortem.md for the full forensic.
---
## Theoretical resurrection paths — and why none are "resurrection"
Every plausible path either turns it into a different bot, depends on something outside our control, or reduces it to a passive logger.
1. Rewire signal source: polling → mempool + pool Swap events. The only path with a realistic edge. But it's a complete rewrite — different daemon, different code, different state machine. EmpSeal contracts get used only as a fallback execution route. That's backrun-exec / tri-backrun v2, not empseal v2.
2. Repurpose EmpSeal's 10-adapter queryAdapter as INTEL, not as a TRIGGER. Run a stripped-down empseal cycle as a price-snapshot service: every cycle writes JSON of "cross-DEX gaps detected." Feed that into tri-backrun so when mempool sees a victim trade on token X, it already knows the current cross-DEX gap before pricing the arb. Genuinely useful and the lowest-cost way to recover value from the codebase. ~1 day of work. Not resurrection — empseal becomes a library, not a bot. This is the recommended salvage path.
3. Private mempool / Flashbots-style bundles on PulseChain. Would close the sim→land latency gap by atomically including the trigger and the arb. Doesn't exist on PulseChain today. If pulse-sentinel adds bundle submission (it has the relay infrastructure), revisit. Not actionable now.
4. Market structure shift — competition collapses. Wins would resume only if we're the only bot left running this surface. Counterfactual; not a strategy.
5. Different output thesis: empseal-detected spreads → momentum signal, not arb. "When 9X price diverges from PulseX V2 by >X bps, token Y is about to move." Feed into a directional bot. Untested hypothesis — would need 30+ days of backtest data; the existing trade log doesn't have the right shape (logs sim_fail / thin, not "did the token move in the next 30s").
Recommendation: Path 2 (intel-not-trigger). Path 1 is the "right" rewrite but a week of work for unproven uplift over tri-backrun, which already does the mempool-trigger thing. Paths 3–5 are theoretical. Don't restart the daemon. If we want to recover value: extract queryAdapter calling code into lib/empseal-quoter.js and let tri-backrun consume it. The daemon stays decommissioned.
Decommission status: PERMANENT as of 2026-05-19. The bot's place in the fleet is the Decommissioned row of the Bot Fleet Summary, not the active rotation.
Active Tests & Monitors
PLS-EMP-SCAN-V1| Test / Monitor | Started | Key Metric | Decision Criteria |
|---|---|---|---|
| Bot status (DEAD — no tmux since 2026-04-21) | 2026-04-21T14:53Z | tmux has-session -t empseal-scanner + mtime of pulse-empseal-scanner.log | Both confirm dead. The bot has not run for ~28+ days. No restart planned per Decommissioned verdict. Monitor only for stray restart attempts. |
| Trade-log freshness | 2026-04-21 | tail mtime of logs/pulse-empseal-trades.ndjson | Frozen at 2026-04-21T14:48 with 5,306 entries. Any new entry would indicate a manual restart against the postmortem. |
| Self-blacklist count | 2026-04-19 (final week) | [SCAN] blacklisted=X count in scanner log | End-of-life value: 9 of 17 tokens. The bot was shrinking its addressable universe before stopping; nothing to monitor going forward. |
| L0-L8 decomposer cycle cost | 2026-04-21 (post-stop) | Per-cycle LLM cost of empseal-specific scripts (11+ found in scripts/ dir) | ✅ COMPLETE 2026-05-19 — Two-layer disable shipped: (a) lib/auto-improve-exclusions.js EXCLUDED.pulse_empseal entry; (b) every l0/l1/l3/l4/l8-empseal-*.js script has an early-exit guard on line 2 that returns immediately when the exclusion is active. Scripts also removed from green-scan registry (crypto-dashboard.js ~line 10870). Verified 2026-05-27 still in effect. Zero ongoing LLM cost. |
Compromises
PLS-EMP-SCAN-V1| Decision | Aggressive ← | Current Position | → Conservative | Notes |
|---|---|---|---|---|
| Signal source (aggregator queryAdapter vs mempool subscription) | Mempool/event subscription · venue-time signals | EmpSeal queryAdapter polling · oracle-time signals | The strategy was hard-coded to oracle polling. Latency to underlying pools was non-negotiable in this architecture — every spread the bot saw was already stale by sim-time. This was THE structural compromise that killed the bot. | |
| Execution path (PulseAtomicArb vs EmpSeal swapNoSplit) | PulseAtomicArb · 0% fee, direct pair | EmpSeal swapNoSplit · 0.09% fee, fallback | Bot tried atomic first then fell back to swapNoSplit. Atomic's 0% fee was the intended winning leg; fallback was admission the atomic path failed. In practice both paths reverted at sim — the fee structure was never the binding constraint. | |
| Blacklist policy (auto-add after 1 sim-fail vs N) | Aggressive auto-blacklist · shrink universe fast | Lenient · keep retrying | Bot self-blacklisted 9 tokens out of 17 by end-of-life. The aggressive policy was correct given the strategy never won — but it accelerated the bot toward universe=0 instead of letting us see structural failure earlier. | |
| Live-only mode (no paper) | Strict live · pay real gas to learn | Paper-first · cheap data | LIVE_MODE = true hardcoded 2026-04-17 per board directive. Bot paid 714,794 PLS in gas to prove 0/5306. Paper would have produced the same conclusion at near-zero cost. | |
| Adapter universe (10 fixed DEXes) | Static 10-adapter list · simple | Dynamic · all routable DEXes | Bot polled EmpSeal's exposed 10 adapters. Wider coverage was structurally available via EmpSeal's full route set but never wired. Moot given strategy failed at sim-time — more adapters would just have produced more stale signals. |
Parameters
PLS-EMP-SCAN-V1| Parameter | Value | Reasoning | Potential Adjustment(s) |
|---|---|---|---|
| Status | DECOMMISSIONED (paused per Trevor 2026-05-19) | No tmux, no process, no trade-log writes since 2026-04-21. Postmortem at pulsechain/notes/pulse-empseal-postmortem.md. | Do not adjust — strategy archived. |
| ADAPTERS | 10 (EmpSeal queryAdapter) | Hardcoded set: PulseX V1/V2, 9inch, 9mm V2/V3, EmpSeal internal, plus 4 others. Polled each scan cycle. | No tuning value — strategy decommissioned. |
| SCAN_INTERVAL_MS | ~3500 ms (observed median) | ~24 scan cycles/minute when alive. Final log shows cycle times of 3530-3585 ms. | N/A — bot stopped. |
| TOKENS_PER_SCAN | 17 (end-of-life) | Live token universe at last scan. Universe shrank as auto-blacklist self-removed losers (9 blacklisted at end-of-life). | N/A. |
| BLACKLIST_THRESHOLD | aggressive (auto-add after low N sim-fails) | Bot self-blacklisted 9 of 17 tokens by end-of-life. Aggressive policy was correct given 0/5306 hit rate. | N/A. |
| EXECUTION_PATH_PRIMARY | PulseAtomicArb (0% fee) | Direct pair atomic via PulseAtomicArb (0x03E2...6D66, deployed 2026-04-10 per contracts/pulse-atomic-arb-address.json). Intended winning leg during the bot lifetime. Never landed a net-positive in 5,306 attempts. | N/A. |
| EXECUTION_PATH_FALLBACK | EmpSeal swapNoSplit emergencyCall (0.09% fee) | Fallback when atomic path rejected the route shape. Also never landed. | N/A. |
| LIVE_MODE | true (paper mode removed 2026-04-17) | Board directive: live-only, no paper. Bot paid 714,794 PLS in lifetime gas to prove the 0/5306 result. In hindsight, paper would have been cheaper for the same conclusion. | N/A. |
Revisions
PLS-EMP-SCAN-V1| Revision | Summary |
|---|---|
| V1.0 (launch) | 2026-04-07 launch — EmpSeal queryAdapter as price oracle across 10 DEX adapters, 2-hop atomic execution via PulseAtomicArb (0% fee) with EmpSeal swapNoSplit emergencyCall (0.09%) fallback. Live-only from day one. |
| V1.1 | Auto-blacklist policy added: tokens accumulating low-N sim-fails get pruned from the live universe. End-of-life the bot blacklisted 9 of 17 tokens — aggressive policy was correct given the 0/5306 hit rate. |
| V1.2 | Tightened MIN_NET_WPLS floor after 1,049 candidates classified `thin` (sim passed but profit below floor); raising the floor only increased the thin-skip rate, did not produce wins. |
| V1.3 (FINAL) | 2026-04-21 14:53 UTC — last trade-log write. Bot stopped passively (no tmux, no process). 5,306 attempts produced 4,257 sim_fail (80%) + 1,049 thin (20%) + 0 net-positive trades. Lifetime −574,672 PLS realized loss on 714,794 PLS gas. Strategy empirically falsified. |
| DECOMMISSIONED 2026-05-19 current | Postmortem authored (pulsechain/notes/pulse-empseal-postmortem.md) after the L3 wins-only classifier fix exposed the true rank (#10, compositeScore 12). Root cause: EmpSeal queryAdapter is a stale oracle — by the time the bot quoted-sim-built-submitted, the spread had already evaporated. Recommendation: do not resurrect; reclaim the 11 L0-L8 RCA scripts dedicated to this dead bot. |