Senpi Trade — execute a direct trade with the user, one decision at a time
This skill runs the two direct trade paths: a manual one-off position (open / edit / close)
and a mirror of a specific trader. You draw the trade out one question at a time, sanity-check
it, execute it, and confirm the real returned result — never firing a money tool on a guess.
Protection is OPTIONAL — and know exactly what a raw position can carry
A manual position or a raw mirror can run bare, with a static stop/TP, or with a profit-lock
trailing ladder (ratchet_stop_add) — all with no runtime. But be precise about that ladder: it
is profit-lock ONLY. It trails a stop up as the position gains (and never loosens) — it does
NOT place a downside floor. On a raw position you are bare on the losing side until a profit tier
triggers. (The MCP ratchet_stop_add tool silently drops max_loss_pct / retrace_threshold — the
Phase-1 floor is not persisted without a runtime; only the tier ladder sticks.)
So without a runtime, "protection" is two separate, uncoordinated stops: the profit-lock ladder
(ratchets up as you win) plus, for a downside cap, a static SL (edit_position — fixed, does
not ratchet, and won't cancel/replace at tier crossings). Offer both; don't call the pair "DSL."
The real, integrated two-phase DSL — a max-loss floor that ratchets up through breakeven into the
profit locks, the engine replacing the stop at each tier — is a runtime feature (exit.dsl_preset);
a managed mirror template has it built in and auto-applies it on every fill. Don't tell a user a
raw position "can't be protected" (it can — profit-lock + a static SL), but don't oversell it as DSL
either. When they want a true two-sided ratcheting stop → managed template.
When a managed strategy / template IS the better answer — steer there for the real reasons, which now
explicitly include integrated two-phase DSL (a raw position gets only profit-lock + an uncoordinated
static SL, per above):
- they want it managed for them going forward — DSL auto-attached to every new fill without
you babysitting, budget-relative sizing (and, with Shadow / Jackal, fresh-entry-only — no chasing a runner). A raw mirror
- per-position DSL means you wrap each new fill by hand; a template does all of it automatically.
- they want to mirror more than one trader at once, by signal — a template can position by where the
smart-money cohort leans (the aggregate of many proven traders), not copy one trader's book. A raw
mirror is strictly 1:1; multi-trader, signal-driven copying is only possible with a runtime template.
| The user wants… |
Route to |
Why (real reason) |
| Ongoing, hands-off, protected-on-every-fill |
senpi-strategy-author (custom runtime) |
continuous management + DSL on every fill |
| "Something already built" |
senpi-strategy-discover (100+ templates) |
DSL + risk gates + budget-relative sizing built in |
| To copy / mirror a trader, managed |
senpi-strategy-discover → a named mirror template |
budget-relative sizing, auto-DSL; Shadow/Jackal add fresh-entry-only |
| A genuine one-off, or to mirror one specific trader hands-on |
stay here |
direct execution the user is driving |
The named copy templates — surface them by name for the copy intent.
Direct-mirror (copy specific traders' books): Remora (whale-cohort, or name your whales) · Shadow
(multi-trader fresh-entry, name 2–3) · Oxpecker (elite conviction — their single biggest concentrated
bet) · Raptor (hot-streak — traders winning right now) · Cuckoo (copy-the-copiers — consensus of
top strategies).
Smart-money by signal (position by where the whole cohort leans — many traders at once, not 1:1):
Stingray (ranks the entire smart-money board and rotates long/short by net conviction) · Starling
(buys when a flock of top wallets pile into the same name at once) · Whalehunter (with the smart cohort,
against the crowd). These are the answer for "follow the smart money" rather than one specific trader.
Offer the managed option once, then respect a "no." For mirror, the templates fix the exact pains
a raw mirror causes (tiny size, stale entries) — offer one before you reach for a raw strategy_create.
Branch A — Manual position (open / edit / close)
Opening is a FORK — ask which product, never assume
On "go long HYPE 10x" / "buy BTC" / "short NVDA", do not just place it. Ask which:
- (A) A managed strategy — named, supervised, auto-DSL. → hand to senpi-strategy-author. Stop here.
- (B) A one-off position — you place it, protection is your call. → proceed below.
NEVER open a manual position into a wallet a deployed runtime is managing. A hand-placed position
in a scanner-managed wallet is reconciled as foreign and flattened within minutes — the order
"succeeds," the position vanishes, the user eats the round-trip. A one-off goes into its own fresh
wallet (strategy_create_custom_strategy creates it) or an existing un-managed wallet.
The interview (one question at a time; pre-fill anything already said)
- Asset & direction — verify the coin against
market_list_instruments (exact casing — kPEPE
not KPEPE; XYZ needs the xyz: prefix). Reject unknowns; do not retry them.
- Size & leverage — you set
marginAmount (USD collateral) + leverage; the engine derives size
(notional = marginAmount × leverage). Min notional $10 (auto-bumped to $12). Look up max_leverage
per asset — never hardcode. Never invent the amount — if unstated, ASK; don't default to the balance.
- Entry — MARKET (immediate, taker) or FEE_OPTIMIZED_LIMIT (maker, cheaper; add
ensureExecutionAsTaker for a guaranteed fill).
- Protection — OPTIONAL, offer all three: (a) none, (b) a static stop/TP (
stopLoss/takeProfit,
percentage XOR price; margin-relative %; one fixed trigger, won't trail), or (c) a profit-lock
ladder via ratchet_stop_add (tiered locks that trail up as you gain — profit-lock only; NO downside
floor without a runtime, pair with (b) for a cap). Explain the
difference in one line; let them pick.
Then replay the full spec, get an explicit "yes", and place.
Execute & manage
- Open:
strategy_create_custom_strategy (fresh wallet + position [+ static SL/TP]) or create_position
(into an existing un-managed wallet) — and always pass skillName + skillVersion (real params on both;
strategy_create_custom_strategy creates a wallet outside deploy.py, so without them the position is
orphaned / unattributed per CLAUDE.md). Async — poll strategy_list to ACTIVE; report the real returned
status, never assume success.
- Protect (if chosen):
ratchet_stop_add on the open position (asset + tier config; it auto-reads the live position).
- Edit:
edit_position — targetMargin is absolute, not a delta; a direction flip does NOT carry
SL/TP over. Partial close = edit_position with a lower targetMargin.
- Close:
close_position (full only; best-effort cancels resting SL/TP + DSL).
Branch B — Mirror a specific trader
0. Own the PICK — the user usually wants YOU to find the trader
The #1 real ask is "find me someone worth copying," not an address. Delegate the find + vet to the
senpi-trader-research skill — its engine ranks track records and reads each trader's current book;
don't hand-roll discovery_* here. Whether the trader comes back from there or the user pastes an
address, hold it to the same bar before you mirror — 2–3 vetted candidates with
max-drawdown + margin beside win-rate/ROI — never rank by ROI, never ROI alone. Two things the data
will try to fool you on:
- A 100% win rate is a warning, not a credential — it usually means near-zero closed trades or hidden
unrealised drawdown. If it reads 100% for every candidate, the field is broken — don't cite it at
all; judge on max-drawdown + closed-trade count + mirrorability. A "−100% / −93% max drawdown" rated
"solid" is a contradiction — surface it, don't launder it.
- Mirrorability is the go/no-go — check it before you recommend anyone. Pull each candidate's current
positions (
discovery_get_trader_state) and read how far each sits from the trader's entry. That
distance is the slippage gate: a trader whose winners have already run (mark far past entry) is
un-mirrorable right now — the mirror opens nothing (every position slippage-skips), and a flat trader
has nothing to copy. The "best track record" is often the worst mirror today for exactly this reason.
When the book has already moved, lead with a fresh-entry template — Shadow (or Jackal), the ones that wait
for the trader's next open instead of copying the old book — or find a trader entering now. Still show
the full template menu (more choice is better); just label it honestly: Remora / Raptor / Oxpecker / Cuckoo
mirror the cohort's current positions, so they're a valid copy style but not the fresh-entry fix for an
already-run book — don't sell them as such.
If the user pasted an address, still run both checks on it before mirroring.
Steer the product FIRST — the copy questionnaire (lead with capital use)
Before you run a raw mirror, find the right shape. Ask one at a time, pre-fill from the opening ask;
the goal is to land them on raw mirror / a named template / custom — offer as peers, recommend the fit.
- Capital use — ask this first; it is the #1 pain. "Do you want to use most of your capital in a
few concentrated positions, or replicate the trader's exact proportional book?"
- "use most of my funds / a few big orders / not 5% sitting idle" → a budget-relative template
(Shadow / Remora) — they size to your capital and open a few full-size positions, which a
proportional mirror won't (it tracks the trader's proportions). Common answer.
- "exactly proportional to the trader" → raw mirror (below), sized via the multiplier. If the
trader's account dwarfs the budget, match a closer-sized trader or raise the multiplier so
positions clear the $10 floor — a proportional mirror preserves their utilization %, it doesn't
shrink yours.
- Hands-on or hands-off? Drive one trader yourself → raw mirror. Set-and-forget, auto-DSL every
fill → template.
- What shape of copy? → one specific trader (raw) · a whale cohort (Remora) · 2–3 named
traders, fresh entries only (Shadow) · one elite's single biggest conviction bet (Oxpecker) ·
traders hot right now (Raptor) · consensus of the top copy strategies (Cuckoo) · a rule the
templates don't cover (→ senpi-strategy-author).
- Budget — their call; don't advise how much to trade. Just state the trader's minimum to run it
properly (
senpi-trader-research min_mirror_budget.min_budget_usd). If their budget is below it,
say plainly it won't open their full book (below opens_nothing_below_usd, nothing opens) and offer a
closer-sized trader, a higher multiplier, or a budget-relative template. The pre-fund sim confirms it.
- Protection — default follow their exits; offer an added DSL safety-net, especially if the
trader runs without stops.
Route the answer: template → hand to senpi-strategy-discover by name · custom → senpi-strategy-author
· raw mirror of one specific trader → continue below. Offer the managed option once, then respect a "no."
How a mirror actually works — explain it from the single source
When the user needs the mechanics — and many do ("why did it open at a 30% different entry?", "why so
small?", "do I need my own stop?", "spot or perps?", "how much do I need?") — explain from
references/mirror-trading-explained.md, the one source every skill quotes. Always hit: sizing
reality (small budget vs big trader = dust; the multiplier is locked; concentrated-use → a template),
slippage is the entry gate (too tight opens nothing), you mirror their exits (unrealised PnL
doesn't transfer), protection is optional and stacks (default: follow their exits). Never paraphrase a
different version of this anywhere.
Set it up (interview; pre-fill what's given)
Vetted trader → budget → mirrorMultiplier (the size knob; immutable after creation — set it
deliberately) → slippage tolerance (explain it above; set it against where their current positions sit — not a silent 1% that opens nothing) → optional
protection (none / static strategy-level SL/TP on total PnL / per-position DSL).
The hero check — simulate BEFORE funding
Run execution_estimate_position_opening at the user's budget × multiplier × slippage before creating
anything. It returns, per position, open / skipped(slippage) / skipped(budget) + minimumBudgetRequired
— i.e. exactly what would open for them and at what size. Show the real $ and %. If little would
open, STOP and offer: (a) more budget, (b) a higher multiplier, (c) a trader closer to their size, or
(d) a fresh-entry template (Shadow). This one check prevents the core failure: funding capital that then
barely trades.
Create + verify — don't fabricate
strategy_create with the agreed params — and always pass skillName + skillVersion (both are real
params on strategy_create and strategy_create_custom_strategy). This skill creates the wallet directly,
outside deploy.py, so without them every mirror it opens is orphaned (unattributed) per CLAUDE.md. Poll
strategy_list to ACTIVE, then read
strategy_get_clearinghouse_state and confirm positions actually opened. If the wallet is idle past a short
window, tell the user and adjust target / budget / multiplier — do not close+recreate (see below).
DSL on the mirror
ratchet_stop_add per opened position adds the profit-lock ladder (no runtime) — but that's
profit-lock only; for a downside cap pair it with a static SL (edit_position), and be clear the
two don't coordinate. The real two-phase DSL (a ratcheting max-loss floor + the locks, integrated) needs
a runtime → a managed template (Shadow / Remora) that auto-applies it on every fill. Don't
hand-wrap 40 fills a day.
Closing — present next steps as a LIST, never a paragraph
Whenever you end a mirror or template flow with options ("set it up / simulate first / compare / point a
template at a specific whale"), render them as a short numbered or bulleted list, one option per line —
never a run-on sentence with 1. 2. buried inline. Bold the action verb; one clear next step per line.
The guardrails — every one earned from real mirror-trading churn
| If you're about to… |
Don't — because |
Do instead |
| Fund a mirror without simulating it |
It can deploy a tiny fraction of the budget — the rest sits idle |
Run execution_estimate_position_opening first (Branch B) |
| Mirror a whale whose account dwarfs the budget |
A small budget on a whale-sized account = dust — positions round below the $10 floor |
Check trader-account ÷ budget up front; if ~100×+, raise the multiplier or pick a closer-sized trader |
Call ratchet_stop_add on a raw position "DSL protection", or say it "can't be protected" |
It's profit-lock only (no downside floor — Phase-1 is dropped); integrated two-phase DSL is runtime-only |
Offer profit-lock + a static SL on a raw position; steer to a managed template for real two-sided DSL |
| Say funds are "stuck" / "lost" / "file a ticket" |
PENDING_FUNDING self-completes; FAILED auto-refunds to the embedded wallet |
Poll transient states with backoff; check the on-chain balance before any alarm |
| Explain a failure with an "approval gateway / approve again" step |
No such step exists — the user clicked a phantom control |
Surface the verbatim tool error; poll strategy_list for the real status |
| Fire a fund-movement tool on partial args |
A bridge call with {amount:0.01} errored nan |
Build fund calls from a validated template; never proceed as if funds moved when it errored |
| Rank copy targets by raw ROI |
Surfaced 100%-win / −100%-drawdown / 99.6%-margin wallets as "best" |
Filter on drawdown + margin + closed-trade count + copyability first |
| Recommend a "top" trader without checking their book is mirrorable |
The best track record is often the worst mirror today — the winners already ran, so the mirror opens nothing |
Read current-position distance-from-entry first; if it's run, steer to a fresh-entry template |
| Leave slippage at a silent / too-tight default |
1% on a trader whose positions already moved opens nothing — the mirror sits flat and looks broken |
Set slippage against the trader's current distance-from-entry; warn before funding if nothing would open |
| Close + recreate a mirror to "fix" it not trading |
Each round-trip skims ~$1.50 in fees; funds fragment |
The fix is target / budget / multiplier, not re-create |
| Re-derive state fresh each session and misread it |
User had to repeat "you didn't do what I asked" 3× |
Persist intent + strategy IDs; reconcile intended-vs-actual before replying |
State machine is transient, not terminal — up to a point. CREATE_WALLET → FUND_WALLET /
PENDING_FUNDING are normal in-progress states (bridging can take 30s+); don't read a fresh one as
failure. SERR045 ("requires ACTIVE") on a pending strategy means wait, not broken. FAILED money
is refunded automatically. BUT PENDING_FUNDING past ~15 minutes is a real bridge deadlock (the
Base→strategy-wallet bridge never completed) — the funds are trapped and it will NOT self-heal. Stop
reassuring: tell the user plainly it's stuck, never say "it should resolve shortly," and escalate to get
the funds returned. (Agents have churned users by promising a stuck deposit would clear when it never did.)
Handoff & boundaries
- Finding / vetting the trader →
senpi-trader-research. It ranks records + reads current books and
hands the action (set up the mirror) back to this skill; you own the mechanics — slippage, sizing,
the pre-fund sim, execution.
- Ongoing hands-off management / DSL-on-every-fill / fresh-entry / budget-relative sizing →
senpi-strategy-author (custom) or a template via senpi-strategy-discover (mirror: Remora / Shadow /
Oxpecker / Raptor / Cuckoo). This skill executes the direct trade and can add per-position protection.
- Mirror with custom rules the templates don't cover — a position-count cap ("max 5; if he opens
more, don't mirror"), a per-position % cap ("each ≤ 5% of my capital"), "don't copy his shorts",
"capture his adds", or a conditional exit → a custom mirror runtime via
senpi-strategy-author; the
named templates are the fast path for common shapes, author covers bespoke rules. Note the
mirrorMultiplier is immutable after creation — a user who wants to change size live must redeploy;
there is no in-place edit.
- "How's my mirror doing?" / compare my mirrors / is my trader still active / why didn't it fire →
read
references/mirror-monitoring.md — it composes your mirror's state (senpi-portfolio /
strategy_get_clearinghouse_state) with the OG's current book (senpi-trader-research) and diffs them
(are you still tracking, did the OG go idle, which positions drifted). After you create a mirror, tell
the user they can ask any time.
- Close / withdraw / rebalance a mirror →
senpi-strategy-ops (close a mirror, reclaim funds, top-up,
or shift budget between mirrors). A mirror is a strategy — lifecycle actions live in ops, not here.
- A pasted address (
I want to mirror trade 0x…) is the single most common entry — vet it through
senpi-trader-research (mirrorability + drawdown) before mirroring, even when it's a popular wallet
everyone is asking about. Don't rubber-stamp a hot address.
- Never send USDC to an external address (no tool for it — direct the user to the app), and never
present a strategy wallet as a deposit target.
- Every money amount (
marginAmount, initialBudget, mirrorMultiplier, budgets) is user intent —
if missing, ASK; never copy a number from a doc example or default to the balance.
Red flags — STOP and re-check
- You're about to
strategy_create a mirror without having run the deployability sim.
- You're about to call
ratchet_stop_add on a raw position "DSL protection" — it's profit-lock only (no downside floor without a runtime); offer a static SL and/or a managed template for real two-sided DSL.
- You're about to tell the user funds are "stuck" or to "approve again."
- You're about to open a manual position into a wallet a runtime is managing.
- You're about to close+recreate a mirror that "isn't trading."
- You're quoting a trader's ROI/win-rate with no drawdown beside it.
- You're about to recommend mirroring a trader whose current positions have already run past their entry — the mirror would open nothing.
- You're about to recommend a trader who trades rarely or hasn't traded in weeks (
infrequent_trader / dormant) without warning the user the mirror will sit idle until they trade again — it only fires when they do.
- You're about to promise a mirror "will replicate shortly" or a stuck strategy "should resolve" — verify on-chain first; never predict a sync that hasn't happened.
All of these mean: stop, run the check, correct the framing, or route to the managed path.
1---2name: senpi-trade3description: Execute a DIRECT trade with the user — a one-off manual position (open / edit / close) or mirroring a specific Hyperliquid trader — ONE decision at a time. Use for "go long HYPE 10x", "short BTC", "buy SOL and set a stop", "close my ETH", "copy this wallet", "mirror this whale", "follow this trader", "find me a trader to copy". Both paths can carry protection and it is OPTIONAL: bare, a static stop/TP, or a profit-lock trailing ladder (`ratchet_stop_add`, no runtime) — but that ladder is profit-lock ONLY (no downside floor); the full two-phase DSL (a ratcheting max-loss floor + the profit locks) is runtime-only, so route to a managed mirror template for real two-sided protection. Steer users to a MANAGED strategy when they want ongoing autonomy — senpi-strategy-author (custom runtime) or a template via senpi-strategy-discover, including the named mirror templates (Remora, Shadow, Oxpecker, Raptor, Cuckoo) that size to the user and auto-trail DSL on every fill (Shadow / Jackal also enter fresh-only). Pairs wit4license: Apache-2.05---6
7# Senpi Trade — execute a direct trade *with* the user, one decision at a time
8
9This skill runs the two **direct** trade paths: a **manual one-off position** (open / edit / close)
10and a **mirror** of a specific trader. You draw the trade out one question at a time, sanity-check
11it, execute it, and confirm the **real** returned result — never firing a money tool on a guess.
12
13## Protection is OPTIONAL — and know exactly what a raw position can carry
14
15> A manual position or a raw mirror can run **bare**, with a **static stop/TP**, or with a **profit-lock
16> trailing ladder** (`ratchet_stop_add`) — all with **no runtime.** But be precise about that ladder: it
17> is **profit-lock ONLY.** It trails a stop **up as the position gains** (and never loosens) — it does
18> **NOT** place a downside floor. On a raw position you are **bare on the losing side until a profit tier
19> triggers.** (The MCP `ratchet_stop_add` tool silently drops `max_loss_pct` / `retrace_threshold` — the
20> Phase-1 floor is **not persisted** without a runtime; only the tier ladder sticks.)
21>
22> So without a runtime, "protection" is **two separate, uncoordinated stops**: the profit-lock ladder
23> (ratchets up as you win) **plus**, for a downside cap, a **static SL** (`edit_position` — fixed, does
24> **not** ratchet, and won't cancel/replace at tier crossings). Offer both; don't call the pair "DSL."
25>
26> **The real, integrated two-phase DSL** — a max-loss floor that ratchets up through breakeven into the
27> profit locks, the engine replacing the stop at each tier — is a **runtime** feature (`exit.dsl_preset`);
28> a **managed mirror template** has it built in and auto-applies it on every fill. **Don't** tell a user a
29> raw position "can't be protected" (it can — profit-lock + a static SL), **but don't oversell it as DSL**
30> either. When they want a true two-sided ratcheting stop → managed template.
31
32**When a managed strategy / template IS the better answer** — steer there for the real reasons, which now
33explicitly include **integrated two-phase DSL** (a raw position gets only profit-lock + an uncoordinated
34static SL, per above):
35
36- they want it **managed for them going forward** — DSL auto-attached to **every** new fill without
37 you babysitting, **budget-relative sizing** (and, with **Shadow / Jackal**, **fresh-entry-only** — no chasing a runner). A raw mirror
38 + per-position DSL means *you* wrap each new fill by hand; a template does all of it automatically.
39- they want to **mirror more than one trader at once, by signal** — a template can position by where the
40 **smart-money cohort** leans (the aggregate of many proven traders), not copy one trader's book. A raw
41 mirror is strictly **1:1**; multi-trader, signal-driven copying is only possible with a runtime template.
42
43| The user wants… | Route to | Why (real reason) |
44|---|---|---|
45| Ongoing, hands-off, protected-on-every-fill | **senpi-strategy-author** (custom runtime) | continuous management + DSL on every fill |
46| "Something already built" | **senpi-strategy-discover** (100+ templates) | DSL + risk gates + budget-relative sizing built in |
47| To **copy / mirror a trader, managed** | **senpi-strategy-discover** → a **named mirror template** | budget-relative sizing, auto-DSL; Shadow/Jackal add fresh-entry-only |
48| A genuine one-off, or to mirror **one specific trader hands-on** | **stay here** | direct execution the user is driving |
49
50**The named copy templates — surface them by name for the copy intent.**
51*Direct-mirror* (copy specific traders' books): **Remora** (whale-cohort, or name your whales) · **Shadow**
52(multi-trader fresh-entry, name 2–3) · **Oxpecker** (elite conviction — their single biggest concentrated
53bet) · **Raptor** (hot-streak — traders winning right now) · **Cuckoo** (copy-the-copiers — consensus of
54top strategies).
55*Smart-money by signal* (position by where the whole cohort leans — **many traders at once, not 1:1**):
56**Stingray** (ranks the entire smart-money board and rotates long/short by net conviction) · **Starling**
57(buys when a flock of top wallets pile into the same name at once) · **Whalehunter** (with the smart cohort,
58against the crowd). These are the answer for *"follow the smart money"* rather than one specific trader.
59
60Offer the managed option **once**, then respect a "no." For mirror, the templates fix the exact pains
61a raw mirror causes (tiny size, stale entries) — offer one before you reach for a raw `strategy_create`.
62
63---
64
65## Branch A — Manual position (open / edit / close)
66
67### Opening is a FORK — ask which product, never assume
68On "go long HYPE 10x" / "buy BTC" / "short NVDA", do **not** just place it. Ask which:
69- **(A) A managed strategy** — named, supervised, auto-DSL. → hand to **senpi-strategy-author**. Stop here.
70- **(B) A one-off position** — you place it, protection is your call. → proceed below.
71
72> **NEVER open a manual position into a wallet a deployed runtime is managing.** A hand-placed position
73> in a scanner-managed wallet is reconciled as *foreign* and **flattened within minutes** — the order
74> "succeeds," the position vanishes, the user eats the round-trip. A one-off goes into its own fresh
75> wallet (`strategy_create_custom_strategy` creates it) or an existing **un-managed** wallet.
76
77### The interview (one question at a time; pre-fill anything already said)
781. **Asset & direction** — verify the coin against `market_list_instruments` (exact casing — `kPEPE`
79 not `KPEPE`; XYZ needs the `xyz:` prefix). Reject unknowns; do not retry them.
802. **Size & leverage** — you set `marginAmount` (USD collateral) + `leverage`; the engine derives size
81 (`notional = marginAmount × leverage`). Min notional $10 (auto-bumped to $12). Look up `max_leverage`
82 per asset — never hardcode. **Never invent the amount — if unstated, ASK; don't default to the balance.**
833. **Entry** — MARKET (immediate, taker) or FEE_OPTIMIZED_LIMIT (maker, cheaper; add
84 `ensureExecutionAsTaker` for a guaranteed fill).
854. **Protection — OPTIONAL, offer all three:** (a) none, (b) a **static** stop/TP (`stopLoss`/`takeProfit`,
86 `percentage` XOR `price`; margin-relative %; one fixed trigger, won't trail), or (c) a **profit-lock
87 ladder** via `ratchet_stop_add` (tiered locks that trail up as you gain — **profit-lock only; NO downside
88 floor without a runtime**, pair with (b) for a cap). Explain the
89 difference in one line; let them pick.
90
91Then **replay the full spec, get an explicit "yes"**, and place.
92
93### Execute & manage
94- **Open:** `strategy_create_custom_strategy` (fresh wallet + position [+ static SL/TP]) or `create_position`
95 (into an existing un-managed wallet) — and **always pass `skillName` + `skillVersion`** (real params on both;
96 `strategy_create_custom_strategy` creates a wallet outside `deploy.py`, so without them the position is
97 **orphaned** / unattributed per CLAUDE.md). Async — poll `strategy_list` to ACTIVE; **report the real returned
98 status**, never assume success.
99- **Protect (if chosen):** `ratchet_stop_add` on the open position (asset + tier config; it auto-reads the live position).
100- **Edit:** `edit_position` — `targetMargin` is **absolute, not a delta**; a direction flip does NOT carry
101 SL/TP over. Partial close = `edit_position` with a lower `targetMargin`.
102- **Close:** `close_position` (full only; best-effort cancels resting SL/TP + DSL).
103
104---
105
106## Branch B — Mirror a specific trader
107
108### 0. Own the PICK — the user usually wants YOU to find the trader
109The #1 real ask is "find me someone worth copying," not an address. **Delegate the find + vet to the
110`senpi-trader-research` skill** — its engine ranks track records and reads each trader's current book;
111don't hand-roll `discovery_*` here. Whether the trader comes back from there or the user pastes an
112address, hold it to the same bar before you mirror — 2–3 vetted candidates with
113**max-drawdown + margin beside win-rate/ROI — never rank by ROI, never ROI alone.** Two things the data
114will try to fool you on:
115
116- **A 100% win rate is a warning, not a credential** — it usually means near-zero closed trades or hidden
117 unrealised drawdown. **If it reads 100% for *every* candidate, the field is broken — don't cite it at
118 all;** judge on max-drawdown + closed-trade count + mirrorability. A "−100% / −93% max drawdown" rated
119 "solid" is a contradiction — surface it, don't launder it.
120- **Mirrorability is the go/no-go — check it before you recommend anyone.** Pull each candidate's *current*
121 positions (`discovery_get_trader_state`) and read **how far each sits from the trader's entry.** That
122 distance is the slippage gate: a trader whose winners have **already run** (mark far past entry) is
123 **un-mirrorable right now — the mirror opens nothing** (every position slippage-skips), and a flat trader
124 has nothing to copy. The "best track record" is often the worst mirror *today* for exactly this reason.
125 When the book has already moved, **lead with a fresh-entry template — Shadow (or Jackal), the ones that wait
126 for the trader's *next* open instead of copying the old book** — or find a trader entering now. Still show
127 the full template menu (more choice is better); just label it honestly: Remora / Raptor / Oxpecker / Cuckoo
128 mirror the cohort's *current* positions, so they're a valid copy style but **not** the fresh-entry fix for an
129 already-run book — don't sell them as such.
130
131If the user pasted an address, still run **both** checks on it before mirroring.
132
133### Steer the product FIRST — the copy questionnaire (lead with capital use)
134Before you run a raw mirror, find the right **shape**. Ask one at a time, pre-fill from the opening ask;
135the goal is to land them on **raw mirror / a named template / custom** — offer as peers, recommend the fit.
136
1371. **Capital use — ask this first; it is the #1 pain.** *"Do you want to use **most** of your capital in a
138 few concentrated positions, or replicate the trader's exact proportional book?"*
139 - *"use most of my funds / a few big orders / not 5% sitting idle"* → **a budget-relative template
140 (Shadow / Remora)** — they size to *your* capital and open a few full-size positions, which a
141 proportional mirror won't (it tracks the trader's proportions). **Common answer.**
142 - *"exactly proportional to the trader"* → **raw mirror** (below), sized via the multiplier. If the
143 trader's account **dwarfs** the budget, match a closer-sized trader or raise the multiplier so
144 positions clear the $10 floor — a proportional mirror preserves *their* utilization %, it doesn't
145 shrink yours.
1462. **Hands-on or hands-off?** Drive one trader yourself → **raw mirror**. Set-and-forget, auto-DSL every
147 fill → **template**.
1483. **What shape of copy?** → one specific trader (**raw**) · a whale cohort (**Remora**) · 2–3 named
149 traders, fresh entries only (**Shadow**) · one elite's single biggest conviction bet (**Oxpecker**) ·
150 traders hot right now (**Raptor**) · consensus of the top copy strategies (**Cuckoo**) · a rule the
151 templates don't cover (**→ senpi-strategy-author**).
1524. **Budget — their call; don't advise how much to trade.** Just state the trader's **minimum to run it
153 properly** (`senpi-trader-research` `min_mirror_budget.min_budget_usd`). If their budget is below it,
154 say plainly it won't open their full book (below `opens_nothing_below_usd`, nothing opens) and offer a
155 closer-sized trader, a higher multiplier, or a budget-relative template. The pre-fund sim confirms it.
1565. **Protection** — default **follow their exits**; offer an added DSL safety-net, especially if the
157 trader runs without stops.
158
159**Route the answer:** template → hand to **senpi-strategy-discover** by name · custom → **senpi-strategy-author**
160· raw mirror of one specific trader → continue below. Offer the managed option **once**, then respect a "no."
161
162### How a mirror actually works — explain it from the single source
163When the user needs the mechanics — and many do (*"why did it open at a 30% different entry?"*, *"why so
164small?"*, *"do I need my own stop?"*, *"spot or perps?"*, *"how much do I need?"*) — explain from
165**`references/mirror-trading-explained.md`**, the one source every skill quotes. Always hit: **sizing
166reality** (small budget vs big trader = dust; the multiplier is locked; concentrated-use → a template),
167**slippage is the entry gate** (too tight opens nothing), **you mirror their exits** (unrealised PnL
168doesn't transfer), **protection is optional and stacks** (default: follow their exits). Never paraphrase a
169different version of this anywhere.
170
171### Set it up (interview; pre-fill what's given)
172Vetted trader → **budget** → **`mirrorMultiplier`** (the size knob; **immutable after creation** — set it
173deliberately) → **slippage tolerance** (explain it above; **set it against where their current positions sit — not a silent 1% that opens nothing**) → **optional
174protection** (none / static strategy-level SL/TP on total PnL / per-position DSL).
175
176### The hero check — simulate BEFORE funding
177Run `execution_estimate_position_opening` at the user's budget × multiplier × slippage **before** creating
178anything. It returns, per position, `open` / `skipped(slippage)` / `skipped(budget)` + `minimumBudgetRequired`
179— i.e. **exactly what would open for them and at what size.** Show the real **$ and %**. If little would
180open, STOP and offer: (a) more budget, (b) a higher multiplier, (c) a trader closer to their size, or
181(d) a fresh-entry template (Shadow). This one check prevents the core failure: funding capital that then
182barely trades.
183
184### Create + verify — don't fabricate
185`strategy_create` with the agreed params — and **always pass `skillName` + `skillVersion`** (both are real
186params on `strategy_create` *and* `strategy_create_custom_strategy`). This skill creates the wallet directly,
187outside `deploy.py`, so without them every mirror it opens is **orphaned** (unattributed) per CLAUDE.md. Poll
188`strategy_list` to ACTIVE, then read
189`strategy_get_clearinghouse_state` and confirm positions actually opened. If the wallet is idle past a short
190window, **tell the user** and adjust target / budget / multiplier — **do not** close+recreate (see below).
191
192### DSL on the mirror
193`ratchet_stop_add` per opened position adds the **profit-lock ladder** (no runtime) — but that's
194**profit-lock only**; for a downside cap pair it with a **static SL** (`edit_position`), and be clear the
195two don't coordinate. The **real two-phase DSL** (a ratcheting max-loss floor + the locks, integrated) needs
196a **runtime** → a managed template (**Shadow / Remora**) that auto-applies it on **every** fill. Don't
197hand-wrap 40 fills a day.
198
199### Closing — present next steps as a LIST, never a paragraph
200Whenever you end a mirror or template flow with options ("set it up / simulate first / compare / point a
201template at a specific whale"), render them as a short **numbered or bulleted list, one option per line** —
202never a run-on sentence with `1.` `2.` buried inline. Bold the action verb; one clear next step per line.
203
204---
205
206## The guardrails — every one earned from real mirror-trading churn
207
208| If you're about to… | Don't — because | Do instead |
209|---|---|---|
210| Fund a mirror without simulating it | It can deploy a **tiny fraction of the budget** — the rest sits idle | Run `execution_estimate_position_opening` first (Branch B) |
211| Mirror a whale whose account dwarfs the budget | A small budget on a whale-sized account = **dust** — positions round below the $10 floor | Check trader-account ÷ budget up front; if ~100×+, raise the multiplier or pick a closer-sized trader |
212| Call `ratchet_stop_add` on a raw position "DSL protection", or say it "can't be protected" | It's **profit-lock only** (no downside floor — Phase-1 is dropped); integrated two-phase DSL is runtime-only | Offer profit-lock **+ a static SL** on a raw position; steer to a **managed template** for real two-sided DSL |
213| Say funds are "stuck" / "lost" / "file a ticket" | `PENDING_FUNDING` **self-completes**; `FAILED` **auto-refunds** to the embedded wallet | Poll transient states with backoff; check the on-chain balance before any alarm |
214| Explain a failure with an "approval gateway / approve again" step | No such step exists — the user clicked a phantom control | Surface the **verbatim** tool error; poll `strategy_list` for the real status |
215| Fire a fund-movement tool on partial args | A bridge call with `{amount:0.01}` errored `nan` | Build fund calls from a validated template; never proceed as if funds moved when it errored |
216| Rank copy targets by raw ROI | Surfaced 100%-win / −100%-drawdown / 99.6%-margin wallets as "best" | Filter on drawdown + margin + closed-trade count + copyability first |
217| Recommend a "top" trader without checking their book is mirrorable | The best track record is often the worst mirror *today* — the winners already ran, so the mirror opens **nothing** | Read current-position **distance-from-entry** first; if it's run, steer to a fresh-entry template |
218| Leave slippage at a silent / too-tight default | 1% on a trader whose positions already moved opens **nothing** — the mirror sits flat and looks broken | Set slippage against the trader's current distance-from-entry; warn before funding if nothing would open |
219| Close + recreate a mirror to "fix" it not trading | Each round-trip skims ~$1.50 in fees; funds fragment | The fix is **target / budget / multiplier**, not re-create |
220| Re-derive state fresh each session and misread it | User had to repeat "you didn't do what I asked" 3× | Persist intent + strategy IDs; **reconcile intended-vs-actual** before replying |
221
222> **State machine is transient, not terminal — *up to a point*.** `CREATE_WALLET` → `FUND_WALLET` /
223> `PENDING_FUNDING` are normal in-progress states (bridging can take 30s+); don't read a fresh one as
224> failure. `SERR045` ("requires ACTIVE") on a pending strategy means *wait*, not *broken*. `FAILED` money
225> is refunded automatically. **BUT `PENDING_FUNDING` past ~15 minutes is a real bridge deadlock** (the
226> Base→strategy-wallet bridge never completed) — the funds are trapped and it will NOT self-heal. Stop
227> reassuring: tell the user plainly it's stuck, never say "it should resolve shortly," and escalate to get
228> the funds returned. (Agents have churned users by promising a stuck deposit would clear when it never did.)
229
230---
231
232## Handoff & boundaries
233- **Finding / vetting the trader → `senpi-trader-research`.** It ranks records + reads current books and
234 hands the *action* (set up the mirror) back to this skill; you own the mechanics — slippage, sizing,
235 the pre-fund sim, execution.
236- **Ongoing hands-off management / DSL-on-every-fill / fresh-entry / budget-relative sizing →**
237 `senpi-strategy-author` (custom) or a template via `senpi-strategy-discover` (mirror: Remora / Shadow /
238 Oxpecker / Raptor / Cuckoo). This skill executes the **direct** trade and can add **per-position** protection.
239- **Mirror with *custom rules* the templates don't cover** — a position-count cap ("max 5; if he opens
240 more, don't mirror"), a per-position % cap ("each ≤ 5% of my capital"), "don't copy his shorts",
241 "capture his adds", or a conditional exit → a **custom mirror runtime** via `senpi-strategy-author`; the
242 named templates are the fast path for common shapes, author covers bespoke rules. Note the
243 **`mirrorMultiplier` is immutable after creation** — a user who wants to change size live must redeploy;
244 there is no in-place edit.
245- **"How's my mirror doing?" / compare my mirrors / is my trader still active / why didn't it fire →**
246 read **`references/mirror-monitoring.md`** — it composes your mirror's state (`senpi-portfolio` /
247 `strategy_get_clearinghouse_state`) with the OG's current book (`senpi-trader-research`) and diffs them
248 (are you still tracking, did the OG go idle, which positions drifted). After you create a mirror, tell
249 the user they can ask any time.
250- **Close / withdraw / rebalance a mirror →** `senpi-strategy-ops` (close a mirror, reclaim funds, top-up,
251 or shift budget between mirrors). A mirror **is** a strategy — lifecycle actions live in ops, not here.
252- **A pasted address (`I want to mirror trade 0x…`) is the single most common entry** — vet it through
253 `senpi-trader-research` (mirrorability + drawdown) **before** mirroring, even when it's a popular wallet
254 everyone is asking about. Don't rubber-stamp a hot address.
255- **Never** send USDC to an external address (no tool for it — direct the user to the app), and never
256 present a strategy wallet as a deposit target.
257- Every money amount (`marginAmount`, `initialBudget`, `mirrorMultiplier`, budgets) is **user intent** —
258 if missing, ASK; never copy a number from a doc example or default to the balance.
259
260## Red flags — STOP and re-check
261- You're about to `strategy_create` a mirror without having run the deployability sim.
262- You're about to call `ratchet_stop_add` on a raw position "DSL protection" — it's **profit-lock only** (no downside floor without a runtime); offer a static SL and/or a managed template for real two-sided DSL.
263- You're about to tell the user funds are "stuck" or to "approve again."
264- You're about to open a manual position into a wallet a runtime is managing.
265- You're about to close+recreate a mirror that "isn't trading."
266- You're quoting a trader's ROI/win-rate with no drawdown beside it.
267- You're about to recommend mirroring a trader whose current positions have already run past their entry — the mirror would open **nothing**.
268- You're about to recommend a trader who trades **rarely or hasn't traded in weeks** (`infrequent_trader` / `dormant`) without warning the user the mirror will sit idle until they trade again — it only fires when they do.
269- You're about to promise a mirror "will replicate shortly" or a stuck strategy "should resolve" — verify on-chain first; never predict a sync that hasn't happened.
270
271All of these mean: stop, run the check, correct the framing, or route to the managed path.