[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GTF9MT04E1XJM3J5AVVB2W":3,"skill-same:01M6GTF9MT04E1XJM3J5AVVB2W":116},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":24,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":67,"ownerDescription":68,"updatedAt":69,"install":70,"resources":83},"01M6GTF9MT04E1XJM3J5AVVB2W","senpi-trade",null,"Execute a DIRECT trade with the user — a one-off manual position (open \u002F edit \u002F 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\u002FTP, 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 strategy for real two-sided protection. Any question about a stop or a ladder, and any change to one, runs the protection protocol: read it in the same turn, quote the engine's floor (never compute one), say what a change replaces and get a yes, read it back. Steer users to a MANAGED strategy when they want ongoing autonomy — senpi-strategy-author builds their own (a managed mirror included: sized to the user, DSL on every fill), forking the closest template when one fits. Pairs with senpi-trader-research, which finds and vets the trader (this skill runs the mirror once one is chosen). NOT for authoring a strategy or deploying a template yourself.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002FSKILL.md",[19],{"categoryNo":20,"categoryName":21,"taxonomyType":22,"taxonomyTypeDesc":23},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"trade","senpi trade","phase","whale","static","full","go","autonomy","authoring","paths","edit","read","at","close","change","fresh","lock","auto","question","open","time","Wallet","which","2026-11-10 10:12:30",false,"---\nname: senpi-trade\ndescription: >-\n  Execute a DIRECT trade with the user — a one-off manual position (open \u002F edit \u002F\n  close) or mirroring a specific Hyperliquid trader — ONE decision at a time. Use for\n  \"go long HYPE 10x\", \"short BTC\", \"buy SOL and set a stop\", \"close my ETH\", \"copy this\n  wallet\", \"mirror this whale\", \"follow this trader\", \"find me a trader to copy\". Both\n  paths can carry protection and it is OPTIONAL: bare, a static stop\u002FTP, or a profit-lock\n  trailing ladder (`ratchet_stop_add`, no runtime) — but that ladder is profit-lock ONLY (no\n  downside floor); the full two-phase DSL (a ratcheting max-loss floor + the profit locks) is\n  runtime-only, so route to a managed strategy for real two-sided protection. Any question\n  about a stop or a ladder, and any change to one, runs the protection protocol: read it in the same\n  turn, quote the engine's floor (never compute one), say what a change replaces and get a yes, read\n  it back. Steer users to a MANAGED strategy when they want ongoing autonomy —\n  senpi-strategy-author builds their own (a managed mirror included: sized to the user,\n  DSL on every fill), forking the closest template when one fits. Pairs with senpi-trader-research, which finds and vets the trader\n  (this skill runs the mirror once one is chosen). NOT for\n  authoring a strategy or deploying a template yourself.\nlicense: Apache-2.0\nmetadata:\n  author: Senpi\n  version: \"1.12.0\"\n  platform: senpi\n  exchange: hyperliquid\n  requires:\n    - senpi-trader-research\n    - senpi-strategy-discover\n---\n\n# Senpi Trade — execute a direct trade *with* the user, one decision at a time\n\nThis skill runs the two **direct** trade paths: a **manual one-off position** (open \u002F edit \u002F close)\nand a **mirror** of a specific trader. You draw the trade out one question at a time, sanity-check\nit, execute it, and confirm the **real** returned result — never firing a money tool on a guess.\n\n## Protection is OPTIONAL — and know exactly what a raw position can carry\n\n> A manual position or a raw mirror can run **bare**, with a **static stop\u002FTP**, or with a **profit-lock\n> trailing ladder** (`ratchet_stop_add`) — all with **no runtime.** But be precise about that ladder: it\n> is **profit-lock ONLY.** It trails a stop **up as the position gains** (and never loosens) — it does\n> **NOT** place a downside floor. On a raw position you are **bare on the losing side until a profit tier\n> triggers.** (The MCP `ratchet_stop_add` tool silently drops `max_loss_pct` \u002F `retrace_threshold` — the\n> Phase-1 floor is **not persisted** without a runtime; only the tier ladder sticks.)\n>\n> So without a runtime, \"protection\" is one of two things, never a pair you can promise: the profit-lock\n> ladder (ratchets up as you win) **or** a **static SL** (`edit_position` — fixed, does **not** ratchet).\n> **A position has one stop order, and once a ratchet is active the engine owns it: `ratchet_stop_add`\n> REPLACES a static SL.** Name the stop the user gives up, get a yes, then read `strategy_get_open_orders`\n> back and report what actually rests. Don't call either one \"DSL.\"\n>\n> **The real, integrated two-phase DSL** — a max-loss floor that ratchets up through breakeven into the\n> profit locks, the engine replacing the stop at each tier — is a **runtime** feature (`exit.dsl_preset`);\n> a **managed strategy** has it built in and auto-applies it on every fill. **Don't** tell a user a\n> raw position \"can't be protected\" (it can — profit-lock + a static SL), **but don't oversell it as DSL**\n> either. When they want a true two-sided ratcheting stop → a managed strategy (author).\n\n## The protection protocol — reading and changing a stop on a position\n\nEvery question about a stop or a ladder (\"show my DSL levels\", \"is it protected\", \"which is tighter\") and\nevery change to one runs the same six rules. Each one was broken on a live short, and it was the user's own\narithmetic that caught it.\n\n1. **Read in the same turn, or say you haven't.** A claim about a live stop or ladder needs\n   `ratchet_stop_get` (the ratchet) and `strategy_get_open_orders` (what actually rests) in the turn that\n   makes the claim. Never describe a ladder from memory, from an earlier turn, or from a rule that says one\n   \"should\" exist. `status: DELETED` (or no row) means no ratchet protection: no tier, no floor, no\n   order — say exactly that; `PAUSED` means the engine has stopped updating it — what still rests is\n   whatever `strategy_get_open_orders` shows.\n2. **Quote, never compute.** The floor is `tierFloorPrice`. `lockRoe` is a share of the **high-water** ROE\n   (`floorRoe = highWaterRoe × lockRoe \u002F 100`) — never a share of margin, never an absolute ROE. Dollars\n   kept at a stop are `(entry − stop) × size` for a short and `(stop − entry) × size` for a long, nothing\n   else. If the engine did not print a number, do not print it either.\n3. **A short's stop sits above the price.** Closer to the price is tighter, so for a short a LOWER trigger\n   is tighter and keeps more; a higher trigger is looser and keeps less. A long is the mirror image. Before\n   any \"tighter \u002F looser \u002F locks more\" sentence, work out which trigger the price reaches first.\n4. **Leverage is the exchange's.** `strategy_get_clearinghouse_state` → `leverage.value` and `.type`, never\n   the strategy's name or a stale ratchet record; say it when they differ. The engine's ROE is on\n   notional ÷ that leverage, not on the margin actually posted — name the base whenever you quote ROE.\n5. **A change is read → say → yes → act → read back.** State what will change and what it replaces (a\n   ratchet replaces a static SL; a leverage change does not move a stop), get an explicit yes, act, then\n   read `strategy_get_open_orders` and `ratchet_stop_get` again and quote them. The read-back is the\n   confirmation; a tool's `success: true` is not.\n6. **Consent comes from this conversation.** A saved instruction (\"always add the ratchet\", \"mandatory on\n   every position\") is neither evidence a ratchet exists nor consent to add one — it is a reminder to ask.\n   A spoken \"no DSL\" \u002F \"forget about it unless I ask\" stands until the user says otherwise, in any later\n   session. A status check (\"did you finish?\", \"how's it going?\", \"run a health check\") is not a yes, and\n   a health check never changes protection.\n\nWorked example, a short: entry $80,890, price $77,300, manual stop $77,500, ratchet floor $78,370. The\nprice reaches $77,500 first, so the manual stop is the tighter one and it keeps `(80,890 − 77,500) × size`;\nthe floor keeps less. Adding the ratchet would replace that stop — say so before it happens. The five\nregression cases behind these rules, with the expected answers, are in\n[`references\u002Fprotection-cases.md`](references\u002Fprotection-cases.md).\n\n**When a managed strategy \u002F template IS the better answer** — steer there for the real reasons, which now\nexplicitly include **integrated two-phase DSL** (a raw position gets only profit-lock + an uncoordinated\nstatic SL, per above):\n\n- they want it **managed for them going forward** — DSL auto-attached to **every** new fill without\n  you babysitting, **budget-relative sizing** (and, if they want it, **fresh-entry-only** — no chasing a runner). A raw mirror\n  + per-position DSL means *you* wrap each new fill by hand; a managed strategy does all of it automatically.\n- they want to **mirror more than one trader at once, by signal** — a managed strategy can position by where the\n  **smart-money cohort** leans (the aggregate of many proven traders), not copy one trader's book. A raw\n  mirror is strictly **1:1**; multi-trader, signal-driven copying is only possible with a runtime strategy.\n\n| The user wants… | Route to | Why (real reason) |\n|---|---|---|\n| Ongoing, hands-off, protected-on-every-fill | **senpi-strategy-author** (their own runtime) | continuous management + DSL on every fill |\n| To browse what's already built | **senpi-strategy-discover** | DSL + risk gates + budget-relative sizing built in |\n| To **copy \u002F mirror a trader, managed** | **senpi-strategy-author** → a managed mirror of their own (author forks the closest template when one fits) | budget-relative sizing, auto-DSL, fresh-entry-only if they want |\n| A genuine one-off, or to mirror **one specific trader hands-on** | **stay here** | direct execution the user is driving |\n\nOffer the managed option **once**, then respect a \"no.\" For mirror, a managed mirror fixes the exact\npains a raw mirror causes (tiny size, stale entries) — offer to build one before you reach for a raw `strategy_create`.\n\n---\n\n## Branch A — Manual position (open \u002F edit \u002F close)\n\n### Opening is a FORK — ask which product, never assume\nOn \"go long HYPE 10x\" \u002F \"buy BTC\" \u002F \"short NVDA\", do **not** just place it. Ask which:\n- **(A) A managed strategy** — named, supervised, auto-DSL. → hand to **senpi-strategy-author**. Stop here.\n- **(B) A one-off position** — you place it, protection is your call. → proceed below.\n\nNo coin named — \"deploy whatever you think is profitable\", \"trade for me\", \"be aggressive\" — is not a\none-off at all; it is a **mandate**, and a mandate is a strategy: hand to **senpi-strategy-discover**.\nNever pick the coins yourself and open them here.\n\n> **NEVER open a manual position into a wallet a deployed runtime is managing.** A hand-placed position\n> in a scanner-managed wallet is reconciled as *foreign* and **flattened within minutes** — the order\n> \"succeeds,\" the position vanishes, the user eats the round-trip. A one-off goes into its own fresh\n> wallet (`strategy_create_custom_strategy` creates it) or an existing **un-managed** wallet.\n\n### The interview (one question at a time; pre-fill anything already said)\n1. **Asset & direction** — turn what the user said into a ticker (Nvidia → `NVDA`, gold → `GOLD`), then\n   look it up: `market_list_instruments(query=\"\u003Cticker>\", fields=[\"max_leverage\",\"only_isolated\"])`.\n   **Always pass `query`** — the no-argument list is cut off long before the XYZ rows (stocks, metals,\n   indices), so \"not in the list I got\" proves nothing. `query` matches tickers only, any case, with or\n   without the prefix; a company name matches nothing. **Copy the returned `name` verbatim into every\n   later call** — the other tools need it exact (`kPEPE` not `KPEPE`, `xyz:NVDA` not `NVDA`). Zero\n   matches → one more lookup with a shorter or alternate ticker; only then say it isn't listed. A row with\n   `is_delisted: true` is not tradeable — say so, never open it. More than one live match and none equal\n   to the ticker → ask which one; never pick for the user. Never\n   call an asset unavailable — or a whole class, like stocks — without a `query` lookup that came back\n   empty. A name a tool rejected as unknown is never retried as-is.\n2. **Size & leverage** — you set `marginAmount` (USD collateral) + `leverage`; the engine derives size\n   (`notional = marginAmount × leverage`). Min notional $10 (auto-bumped to $12). Look up `max_leverage`\n   per asset — never hardcode. **Never invent the amount — if unstated, ASK; don't default to the balance.**\n   **Then the three numbers, before the replay:** the **share of the account** this margin takes\n   (`marginAmount ÷ withdrawable`), the **dollars at the stop** (`|entry − stop| × size`, and as a share of\n   the account), and the **leverage that will actually apply** (the asset's `max_leverage` when it is lower\n   than asked — say the clip; never name a strategy after a leverage the venue will not give). Above\n   **50% of the account in one position** or **20% of the account at the stop**, put the number in its own\n   sentence and get a fresh yes to that sentence — a yes to the setup is not a yes to the concentration.\n   Re-run the three numbers on every add, every stop move and every leverage change, not only at open.\n3. **Entry** — MARKET (immediate, taker) or FEE_OPTIMIZED_LIMIT (maker, cheaper; add\n   `ensureExecutionAsTaker` for a guaranteed fill).\n4. **Protection — OPTIONAL, offer all three:** (a) none, (b) a **static** stop\u002FTP (`stopLoss`\u002F`takeProfit`,\n   `percentage` XOR `price`; margin-relative %; one fixed trigger, won't trail), or (c) a **profit-lock\n   ladder** via `ratchet_stop_add` (tiered locks that trail up as you gain — **profit-lock only; NO downside\n   floor without a runtime**; it replaces (b) if one exists — say so). Explain the\n   difference in one line; let them pick.\n   **A `price` you send must be on the correct side of the live mark — check before the call.** A long's\n   stop sits BELOW the mark and a short's ABOVE; a take-profit is the mirror. The venue refuses the wrong\n   side (`SL trigger price 56.695 >= current price 56.180 for LONG position - would execute immediately`),\n   and on `edit_position` **the size change commits first**, so a refused stop leaves the position open and\n   UNPROTECTED — the error says so in its own last line. Read the mark price from\n   `strategy_get_asset_trading_limits` (wallet + coin) at the moment you build the call, never from entry, a\n   percentage you applied in your head, or a price quoted earlier in the conversation.\n   Re-sending the same price is the one thing that cannot work; recompute it from the mark. `percentage`\n   picks the side but is measured from ENTRY, so once the mark is already past that level it is refused\n   too — say so, and let the user choose between closing and a stop on the right side of the mark.\n\nThen **replay the full spec, get an explicit \"yes\"**, and place.\n\n### Execute & manage\n- **Open:** `strategy_create_custom_strategy` (fresh wallet + position [+ static SL\u002FTP]) or `create_position`\n  (into an existing un-managed wallet) — and **always pass `skillName` + `skillVersion`** (real params on both;\n  `strategy_create_custom_strategy` creates a wallet outside `deploy.py`, so without them the position is\n  **orphaned** \u002F unattributed per CLAUDE.md). Async — **report the real returned status**, never assume success.\n  Poll `strategy_list` to ACTIVE only when a next step needs the new wallet live: you will `create_position`\n  into it, protect or read back the position it opened (below), or the user asked to wait. Never poll just to\n  confirm the create.\n- **Protect (if chosen):** `ratchet_stop_add` on the open position (asset + tier config; it auto-reads the live position).\n- **Read back the leverage:** the position's `leverage.value` from `strategy_get_clearinghouse_state` is\n  the one that applies — quote it, not the request; when the venue clipped it, say so and fix any name or\n  label that carries the asked-for number.\n- **\"Watch it for me\" on a raw position is the ladder, never a cron:** `ratchet_stop_add` is the engine-side\n  watcher at zero model cost (profit-lock only — say it has no downside floor without a runtime); a cron is\n  a full agent turn per firing, and it is not a stop.\n- **Edit:** `edit_position` — `targetMargin` is **absolute, not a delta**; a direction flip does NOT carry\n  SL\u002FTP over. Partial close = `edit_position` with a lower `targetMargin`.\n- **Close:** `close_position` (full only; best-effort cancels resting SL\u002FTP + DSL).\n- **\"Why did it close?\" is a record question.** Read the close before naming a reason —\n  `execution_get_closed_position_details`, or the wallet's `discovery_get_trader_history`. **A position\n  you closed with `close_position` did not hit its take-profit:** an agent close, a stop fill and a TP\n  fill are three different outcomes and only the record says which. Never report a TP or stop as \"hit\"\n  from the protection you configured, or from what you remember doing — a realized return far below the\n  TP you set is the tell that something else closed it.\n\n---\n\n## Branch B — Mirror a specific trader\n\n### 0. Own the PICK — the user usually wants YOU to find the trader\nThe #1 real ask is \"find me someone worth copying,\" not an address. **Delegate the find + vet to the\n`senpi-trader-research` skill** — its engine ranks track records and reads each trader's current book;\ndon't hand-roll `discovery_*` here. Whether the trader comes back from there or the user pastes an\naddress, hold it to the same bar before you mirror — 2–3 vetted candidates with\n**max-drawdown + margin beside win-rate\u002FROI — never rank by ROI, never ROI alone.** Two things the data\nwill try to fool you on:\n\n- **A 100% win rate is a warning, not a credential** — it usually means near-zero closed trades or hidden\n  unrealised drawdown. **If it reads 100% for *every* candidate, the field is broken — don't cite it at\n  all;** judge on max-drawdown + closed-trade count + mirrorability. A \"−100% \u002F −93% max drawdown\" rated\n  \"solid\" is a contradiction — surface it, don't launder it.\n- **Mirrorability is the go\u002Fno-go — check it before you recommend anyone.** Pull each candidate's *current*\n  positions (`discovery_get_trader_state`) and read **how far each sits from the trader's entry.** That\n  distance is the slippage gate: a trader whose winners have **already run** (mark far past entry) is\n  **un-mirrorable right now — the mirror opens nothing** (every position slippage-skips), and a flat trader\n  has nothing to copy. The \"best track record\" is often the worst mirror *today* for exactly this reason.\n  When the book has already moved, **lead with a managed mirror that waits for the trader's *next* open\n  instead of copying the old book** (built with author) — or find a trader entering now. A mirror of the\n  *current* book is a valid copy style but **not** the fix for an already-run book — don't sell it as one.\n\nIf the user pasted an address, still run **both** checks on it before mirroring.\n\n### Steer the product FIRST — the copy questionnaire (lead with capital use)\nBefore you run a raw mirror, find the right **shape**. Ask one at a time, pre-fill from the opening ask;\nthe goal is to land them on a **raw mirror** or a **managed mirror they build** — recommend the fit.\n\n1. **Capital use — ask this first; it is the #1 pain.** *\"Do you want to use **most** of your capital in a\n   few concentrated positions, or replicate the trader's exact proportional book?\"*\n   - *\"use most of my funds \u002F a few big orders \u002F not 5% sitting idle\"* → **a budget-relative managed\n     mirror** (built with author) — it sizes to *your* capital and opens a few full-size positions, which a\n     proportional mirror won't (it tracks the trader's proportions). **Common answer.**\n   - *\"exactly proportional to the trader\"* → **raw mirror** (below), sized via the multiplier. If the\n     trader's account **dwarfs** the budget, match a closer-sized trader or raise the multiplier so\n     positions clear the $10 floor — a proportional mirror preserves *their* utilization %, it doesn't\n     shrink yours.\n2. **Hands-on or hands-off?** Drive one trader yourself → **raw mirror**. Set-and-forget, auto-DSL every\n   fill → **a managed mirror** (author).\n3. **What shape of copy?** → one specific trader (**raw**) · anything managed — a whale cohort, 2–3 named\n   traders on fresh entries only, one elite's biggest conviction bet, traders hot right now, the consensus\n   of the top copy strategies, a rule of their own — is a managed mirror they build (**→ senpi-strategy-author**).\n4. **Budget — their call; don't advise how much to trade.** Just state the trader's **minimum to run it\n   properly** (`senpi-trader-research` `min_mirror_budget.min_budget_usd`). If their budget is below it,\n   say plainly it won't open their full book (below `opens_nothing_below_usd`, nothing opens) and offer a\n   closer-sized trader, a higher multiplier, or a budget-relative managed mirror. The pre-fund sim confirms it.\n5. **Protection** — default **follow their exits**; offer an added DSL safety-net, especially if the\n   trader runs without stops.\n\n**Route the answer:** managed → **senpi-strategy-author** (it forks the closest template when one fits) · raw mirror of one specific trader → continue below. Offer the managed option **once**, then respect a \"no.\"\n\n### How a mirror actually works — explain it from the single source\nWhen the user needs the mechanics — and many do (*\"why did it open at a 30% different entry?\"*, *\"why so\nsmall?\"*, *\"do I need my own stop?\"*, *\"spot or perps?\"*, *\"how much do I need?\"*) — explain from\n**`references\u002Fmirror-trading-explained.md`**, the one source every skill quotes. Always hit: **sizing\nreality** (small budget vs big trader = dust; the multiplier is locked; concentrated-use → a managed mirror),\n**slippage is the entry gate** (too tight opens nothing), **you mirror their exits** (unrealised PnL\ndoesn't transfer), **protection is optional and stacks** (default: follow their exits). Never paraphrase a\ndifferent version of this anywhere.\n\n### Set it up (interview; pre-fill what's given)\nVetted trader → **budget** → **`mirrorMultiplier`** (the size knob; **immutable after creation** — set it\ndeliberately) → **slippage tolerance** (explain it above; **set it against where their current positions sit — not a silent 1% that opens nothing**) → **optional\nprotection** (none \u002F static strategy-level SL\u002FTP on total PnL \u002F per-position DSL).\n\n### The hero check — simulate BEFORE funding (a one-shot sizing estimate, not paper trading)\nSenpi has no paper-trading mode; the estimate below says what would open *right now*, and the only live test\nis running the mirror at the $10 floor. Never offer to watch a trader on a timer — a cron is a model call per firing.\nRun `execution_estimate_position_opening` at the user's budget × multiplier × slippage **before** creating\nanything. It returns, per position, `open` \u002F `skipped(slippage)` \u002F `skipped(budget)` + `minimumBudgetRequired`\n— i.e. **exactly what would open for them and at what size.** Show the real **$ and %**. If little would\nopen, STOP and offer: (a) more budget, (b) a higher multiplier, (c) a trader closer to their size, or\n(d) a managed mirror that enters only on fresh opens (author). This one check prevents the core failure: funding capital that then\nbarely trades.\n\n### Create + verify — don't fabricate\n`strategy_create` with the agreed params — and **always pass `skillName` + `skillVersion`** (both are real\nparams on `strategy_create` *and* `strategy_create_custom_strategy`). This skill creates the wallet directly,\noutside `deploy.py`, so without them every mirror it opens is **orphaned** (unattributed) per CLAUDE.md.\n**Report the status the call returned**; never say a position opened that no read showed. Poll `strategy_list`\nto ACTIVE and read `strategy_get_clearinghouse_state` only when a next step needs the opened positions: the\nladder below, or the user asked to wait or to see what opened. Never poll just to confirm the create. If that\nread shows the wallet idle past a short window, **tell the user** and adjust target \u002F budget \u002F multiplier —\n**do not** close+recreate (see below).\n\n### DSL on the mirror\n`ratchet_stop_add` per opened position adds the **profit-lock ladder** (no runtime) — but that's\n**profit-lock only**, and it takes over the position's stop order: a **static SL** (`edit_position`) is the\nother option, not a companion — adding the ratchet replaces it, so say which one the user keeps. The **real two-phase DSL** (a ratcheting max-loss floor + the locks, integrated) needs\na **runtime** → a managed strategy (author) that auto-applies it on **every** fill. Don't\nhand-wrap 40 fills a day.\n\n### Closing — present next steps as a LIST, never a paragraph\nWhenever you end a mirror or template flow with options (\"set it up \u002F simulate first \u002F compare \u002F build a\nmanaged mirror on a specific whale\"), render them as a short **numbered or bulleted list, one option per line** —\nnever a run-on sentence with `1.` `2.` buried inline. Bold the action verb; one clear next step per line.\n\n---\n\n## The guardrails — every one earned from real mirror-trading churn\n\n| If you're about to… | Don't — because | Do instead |\n|---|---|---|\n| 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) |\n| 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 |\n| 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 strategy** for real two-sided DSL |\n| Say funds are \"stuck\" \u002F \"lost\" \u002F \"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 |\n| Report a trade as placed off an EMPTY tool result, or keep polling for it | Trade tools run behind the agent's **approval gate**: a call the user does not approve in time is **denied** and comes back empty — nothing reached the venue, so there is nothing to poll for | Say the approval timed out and **nothing was placed**; offer to re-run it for approval. An errored call is different — it carries its own message: surface the **verbatim** tool text. Read `strategy_list` \u002F positions only to confirm what actually exists |\n| 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 |\n| Rank copy targets by raw ROI | Surfaced 100%-win \u002F −100%-drawdown \u002F 99.6%-margin wallets as \"best\" | Filter on drawdown + margin + closed-trade count + copyability first |\n| 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 managed mirror that waits for fresh entries |\n| Leave slippage at a silent \u002F 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 |\n| Close + recreate a mirror to \"fix\" it not trading | Each round-trip skims ~$1.50 in fees; funds fragment | The fix is **target \u002F budget \u002F multiplier**, not re-create |\n| 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 |\n| Place or grow a hand position without the three numbers | A wallet went almost entirely into one thin coin and a \"keep it tight\" stop was widened to over 40% of the account, one small request at a time — nothing ever said the total | Share of account, dollars at the stop, applied leverage — before the replay; above 50% \u002F 20%, a fresh yes to that sentence |\n| Quote the leverage the user asked for after the venue clipped it | 10× asked, 3× applied, the position still labelled \"10x\" | Read `leverage.value` from the position; say the clip; label by what applies |\n| Offer a cron as \"watch it for me\" on a raw position | Every firing is a full agent turn, and it is not a stop | `ratchet_stop_add` — the ladder watches for free (profit-lock only; say so) |\n| Promise a `ratchet_stop_add` on a runtime-managed position covers future entries | **The add binds to the position open now.** The runtime arms the next one from the strategy's own `exit.dsl_preset` — so \"it never closes below +X again\" is false, and the next entry closes the old way | Say the ladder covers this position only, then route the file half to `senpi-strategy-ops` (a DSL change has two targets — the file for future positions, the ratchet for open ones; the user picks) |\n| Say anything about a stop or ladder, or change one, outside the protection protocol | Every rule in it was broken on a live short — the user caught each one | The six rules above, in order |\n\n> **State machine is transient, not terminal — *up to a point*.** `CREATE_WALLET` → `FUND_WALLET` \u002F\n> `PENDING_FUNDING` are normal in-progress states (bridging can take 30s+); don't read a fresh one as\n> failure. `SERR045` (\"requires ACTIVE\") on a pending strategy means *wait*, not *broken*. `FAILED` money\n> is refunded automatically. **BUT `PENDING_FUNDING` past ~15 minutes is a real bridge deadlock** (the\n> Base→strategy-wallet bridge never completed) — the funds are trapped and it will NOT self-heal. Stop\n> reassuring: tell the user plainly it's stuck, never say \"it should resolve shortly,\" and escalate to get\n> the funds returned. (Agents have churned users by promising a stuck deposit would clear when it never did.)\n\n---\n\n## Handoff & boundaries\n- **A request to act on one of the user's SAVED wallets** (close, open, set a stop, cancel — on a\n  wallet in `user_get_me`'s `external_wallets`, the ones they added in Your wallets) → answer by quoting\n  its `access` line, and make **no write-tool attempt**: \"Read-only. Senpi can analyze this wallet. It\n  cannot place, change or cancel orders on it.\" Reading `user_get_me` to recognise the address is fine.\n  A write tool that comes back `NOT_A_STRATEGY_WALLET` (match the error code) is the same answer — never\n  retry it on another tool. \"Your wallet\" means one of their saved wallets or one the user said is\n  theirs in this conversation; an address pasted in chat is never described as saved — to save it, the\n  user can add it in Your wallets on senpi.ai (web).\n- **Finding \u002F vetting the trader → `senpi-trader-research`.** It ranks records + reads current books and\n  hands the *action* (set up the mirror) back to this skill; you own the mechanics — slippage, sizing,\n  the pre-fund sim, execution.\n- **Ongoing hands-off management \u002F DSL-on-every-fill \u002F fresh-entry \u002F budget-relative sizing →**\n  `senpi-strategy-author` (their own managed mirror or strategy; it forks the closest template\n  when one fits). This skill executes the **direct** trade and can add **per-position** protection.\n- **Mirror with *custom rules*** — a position-count cap (\"max 5; if he opens\n  more, don't mirror\"), a per-position % cap (\"each ≤ 5% of my capital\"), \"don't copy his shorts\",\n  \"capture his adds\", or a conditional exit → a **custom mirror runtime** via `senpi-strategy-author`. Note the\n  **`mirrorMultiplier` is immutable after creation** — a user who wants to change size live must redeploy;\n  there is no in-place edit.\n- **\"How's my mirror doing?\" \u002F compare my mirrors \u002F is my trader still active \u002F why didn't it fire →**\n  read **`references\u002Fmirror-monitoring.md`** — it composes your mirror's state (`senpi-portfolio` \u002F\n  `strategy_get_clearinghouse_state`) with the OG's current book (`senpi-trader-research`) and diffs them\n  (are you still tracking, did the OG go idle, which positions drifted). After you create a mirror, tell\n  the user they can ask any time.\n- **Close \u002F withdraw \u002F rebalance a mirror →** `senpi-strategy-ops` (close a mirror, reclaim funds, top-up,\n  or shift budget between mirrors). A mirror **is** a strategy — lifecycle actions live in ops, not here.\n- **A pasted address (`I want to mirror trade 0x…`) is the single most common entry** — vet it through\n  `senpi-trader-research` (mirrorability + drawdown) **before** mirroring, even when it's a popular wallet\n  everyone is asking about. Don't rubber-stamp a hot address.\n- **Never** send USDC to an external address (no tool for it — direct the user to the app), and never\n  present a strategy wallet as a deposit target.\n- Every money amount (`marginAmount`, `initialBudget`, `mirrorMultiplier`, budgets) is **user intent** —\n  if missing, ASK; never copy a number from a doc example or default to the balance.\n\n## Red flags — STOP and re-check\n- You're about to `strategy_create` a mirror without having run the deployability sim.\n- 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\u002For a managed strategy for real two-sided DSL.\n- You're about to tell the user funds are \"stuck\", or to treat an EMPTY tool result as a placed trade — an unapproved (timed-out) call is denied and executes nothing; say so and offer the re-run.\n- You're about to open a manual position into a wallet a runtime is managing.\n- You're about to close+recreate a mirror that \"isn't trading.\"\n- You're about to say anything about a stop or ladder — or change one — without the protection protocol's same-turn read and yes.\n- You're quoting a trader's ROI\u002Fwin-rate with no drawdown beside it.\n- You're about to recommend mirroring a trader whose current positions have already run past their entry — the mirror would open **nothing**.\n- You're about to recommend a trader who trades **rarely or hasn't traded in weeks** (`infrequent_trader` \u002F `dormant`) without warning the user the mirror will sit idle until they trade again — it only fires when they do.\n- 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.\n\nAll of these mean: stop, run the check, correct the framing, or route to the managed path.\n","# Senpi Trade — execute a direct trade *with* the user, one decision at a time\n\nThis skill runs the two **direct** trade paths: a **manual one-off position** (open \u002F edit \u002F close)\nand a **mirror** of a specific trader. You draw the trade out one question at a time, sanity-check\nit, execute it, and confirm the **real** returned result — never firing a money tool on a guess.\n\n## Protection is OPTIONAL — and know exactly what a raw position can carry\n\n> A manual position or a raw mirror can run **bare**, with a **static stop\u002FTP**, or with a **profit-lock\n> trailing ladder** (`ratchet_stop_add`) — all with **no runtime.** But be precise about that ladder: it\n> is **profit-lock ONLY.** It trails a stop **up as the position gains** (and never loosens) — it does\n> **NOT** place a downside floor. On a raw position you are **bare on the losing side until a profit tier\n> triggers.** (The MCP `ratchet_stop_add` tool silently drops `max_loss_pct` \u002F `retrace_threshold` — the\n> Phase-1 floor is **not persisted** without a runtime; only the tier ladder sticks.)\n>\n> So without a runtime, \"protection\" is one of two things, never a pair you can promise: the profit-lock\n> ladder (ratchets up as you win) **or** a **static SL** (`edit_position` — fixed, does **not** ratchet).\n> **A position has one stop order, and once a ratchet is active the engine owns it: `ratchet_stop_add`\n> REPLACES a static SL.** Name the stop the user gives up, get a yes, then read `strategy_get_open_orders`\n> back and report what actually rests. Don't call either one \"DSL.\"\n>\n> **The real, integrated two-phase DSL** — a max-loss floor that ratchets up through breakeven into the\n> profit locks, the engine replacing the stop at each tier — is a **runtime** feature (`exit.dsl_preset`);\n> a **managed strategy** has it built in and auto-applies it on every fill. **Don't** tell a user a\n> raw position \"can't be protected\" (it can — profit-lock + a static SL), **but don't oversell it as DSL**\n> either. When they want a true two-sided ratcheting stop → a managed strategy (author).\n\n## The protection protocol — reading and changing a stop on a position\n\nEvery question about a stop or a ladder (\"show my DSL levels\", \"is it protected\", \"which is tighter\") and\nevery change to one runs the same six rules. Each one was broken on a live short, and it was the user's own\narithmetic that caught it.\n\n1. **Read in the same turn, or say you haven't.** A claim about a live stop or ladder needs\n   `ratchet_stop_get` (the ratchet) and `strategy_get_open_orders` (what actually rests) in the turn that\n   makes the claim. Never describe a ladder from memory, from an earlier turn, or from a rule that says one\n   \"should\" exist. `status: DELETED` (or no row) means no ratchet protection: no tier, no floor, no\n   order — say exactly that; `PAUSED` means the engine has stopped updating it — what still rests is\n   whatever `strategy_get_open_orders` shows.\n2. **Quote, never compute.** The floor is `tierFloorPrice`. `lockRoe` is a share of the **high-water** ROE\n   (`floorRoe = highWaterRoe × lockRoe \u002F 100`) — never a share of margin, never an absolute ROE. Dollars\n   kept at a stop are `(entry − stop) × size` for a short and `(stop − entry) × size` for a long, nothing\n   else. If the engine did not print a number, do not print it either.\n3. **A short's stop sits above the price.** Closer to the price is tighter, so for a short a LOWER trigger\n   is tighter and keeps more; a higher trigger is looser and keeps less. A long is the mirror image. Before\n   any \"tighter \u002F looser \u002F locks more\" sentence, work out which trigger the price reaches first.\n4. **Leverage is the exchange's.** `strategy_get_clearinghouse_state` → `leverage.value` and `.type`, never\n   the strategy's name or a stale ratchet record; say it when they differ. The engine's ROE is on\n   notional ÷ that leverage, not on the margin actually posted — name the base whenever you quote ROE.\n5. **A change is read → say → yes → act → read back.** State what will change and what it replaces (a\n   ratchet replaces a static SL; a leverage change does not move a stop), get an explicit yes, act, then\n   read `strategy_get_open_orders` and `ratchet_stop_get` again and quote them. The read-back is the\n   confirmation; a tool's `success: true` is not.\n6. **Consent comes from this conversation.** A saved instruction (\"always add the ratchet\", \"mandatory on\n   every position\") is neither evidence a ratchet exists nor consent to add one — it is a reminder to ask.\n   A spoken \"no DSL\" \u002F \"forget about it unless I ask\" stands until the user says otherwise, in any later\n   session. A status check (\"did you finish?\", \"how's it going?\", \"run a health check\") is not a yes, and\n   a health check never changes protection.\n\nWorked example, a short: entry $80,890, price $77,300, manual stop $77,500, ratchet floor $78,370. The\nprice reaches $77,500 first, so the manual stop is the tighter one and it keeps `(80,890 − 77,500) × size`;\nthe floor keeps less. Adding the ratchet would replace that stop — say so before it happens. The five\nregression cases behind these rules, with the expected answers, are in\n[`references\u002Fprotection-cases.md`](references\u002Fprotection-cases.md).\n\n**When a managed strategy \u002F template IS the better answer** — steer there for the real reasons, which now\nexplicitly include **integrated two-phase DSL** (a raw position gets only profit-lock + an uncoordinated\nstatic SL, per above):\n\n- they want it **managed for them going forward** — DSL auto-attached to **every** new fill without\n  you babysitting, **budget-relative sizing** (and, if they want it, **fresh-entry-only** — no chasing a runner). A raw mirror\n  + per-position DSL means *you* wrap each new fill by hand; a managed strategy does all of it automatically.\n- they want to **mirror more than one trader at once, by signal** — a managed strategy can position by where the\n  **smart-money cohort** leans (the aggregate of many proven traders), not copy one trader's book. A raw\n  mirror is strictly **1:1**; multi-trader, signal-driven copying is only possible with a runtime strategy.\n\n| The user wants… | Route to | Why (real reason) |\n|---|---|---|\n| Ongoing, hands-off, protected-on-every-fill | **senpi-strategy-author** (their own runtime) | continuous management + DSL on every fill |\n| To browse what's already built | **senpi-strategy-discover** | DSL + risk gates + budget-relative sizing built in |\n| To **copy \u002F mirror a trader, managed** | **senpi-strategy-author** → a managed mirror of their own (author forks the closest template when one fits) | budget-relative sizing, auto-DSL, fresh-entry-only if they want |\n| A genuine one-off, or to mirror **one specific trader hands-on** | **stay here** | direct execution the user is driving |\n\nOffer the managed option **once**, then respect a \"no.\" For mirror, a managed mirror fixes the exact\npains a raw mirror causes (tiny size, stale entries) — offer to build one before you reach for a raw `strategy_create`.\n\n---\n\n## Branch A — Manual position (open \u002F edit \u002F close)\n\n### Opening is a FORK — ask which product, never assume\nOn \"go long HYPE 10x\" \u002F \"buy BTC\" \u002F \"short NVDA\", do **not** just place it. Ask which:\n- **(A) A managed strategy** — named, supervised, auto-DSL. → hand to **senpi-strategy-author**. Stop here.\n- **(B) A one-off position** — you place it, protection is your call. → proceed below.\n\nNo coin named — \"deploy whatever you think is profitable\", \"trade for me\", \"be aggressive\" — is not a\none-off at all; it is a **mandate**, and a mandate is a strategy: hand to **senpi-strategy-discover**.\nNever pick the coins yourself and open them here.\n\n> **NEVER open a manual position into a wallet a deployed runtime is managing.** A hand-placed position\n> in a scanner-managed wallet is reconciled as *foreign* and **flattened within minutes** — the order\n> \"succeeds,\" the position vanishes, the user eats the round-trip. A one-off goes into its own fresh\n> wallet (`strategy_create_custom_strategy` creates it) or an existing **un-managed** wallet.\n\n### The interview (one question at a time; pre-fill anything already said)\n1. **Asset & direction** — turn what the user said into a ticker (Nvidia → `NVDA`, gold → `GOLD`), then\n   look it up: `market_list_instruments(query=\"\u003Cticker>\", fields=[\"max_leverage\",\"only_isolated\"])`.\n   **Always pass `query`** — the no-argument list is cut off long before the XYZ rows (stocks, metals,\n   indices), so \"not in the list I got\" proves nothing. `query` matches tickers only, any case, with or\n   without the prefix; a company name matches nothing. **Copy the returned `name` verbatim into every\n   later call** — the other tools need it exact (`kPEPE` not `KPEPE`, `xyz:NVDA` not `NVDA`). Zero\n   matches → one more lookup with a shorter or alternate ticker; only then say it isn't listed. A row with\n   `is_delisted: true` is not tradeable — say so, never open it. More than one live match and none equal\n   to the ticker → ask which one; never pick for the user. Never\n   call an asset unavailable — or a whole class, like stocks — without a `query` lookup that came back\n   empty. A name a tool rejected as unknown is never retried as-is.\n2. **Size & leverage** — you set `marginAmount` (USD collateral) + `leverage`; the engine derives size\n   (`notional = marginAmount × leverage`). Min notional $10 (auto-bumped to $12). Look up `max_leverage`\n   per asset — never hardcode. **Never invent the amount — if unstated, ASK; don't default to the balance.**\n   **Then the three numbers, before the replay:** the **share of the account** this margin takes\n   (`marginAmount ÷ withdrawable`), the **dollars at the stop** (`|entry − stop| × size`, and as a share of\n   the account), and the **leverage that will actually apply** (the asset's `max_leverage` when it is lower\n   than asked — say the clip; never name a strategy after a leverage the venue will not give). Above\n   **50% of the account in one position** or **20% of the account at the stop**, put the number in its own\n   sentence and get a fresh yes to that sentence — a yes to the setup is not a yes to the concentration.\n   Re-run the three numbers on every add, every stop move and every leverage change, not only at open.\n3. **Entry** — MARKET (immediate, taker) or FEE_OPTIMIZED_LIMIT (maker, cheaper; add\n   `ensureExecutionAsTaker` for a guaranteed fill).\n4. **Protection — OPTIONAL, offer all three:** (a) none, (b) a **static** stop\u002FTP (`stopLoss`\u002F`takeProfit`,\n   `percentage` XOR `price`; margin-relative %; one fixed trigger, won't trail), or (c) a **profit-lock\n   ladder** via `ratchet_stop_add` (tiered locks that trail up as you gain — **profit-lock only; NO downside\n   floor without a runtime**; it replaces (b) if one exists — say so). Explain the\n   difference in one line; let them pick.\n   **A `price` you send must be on the correct side of the live mark — check before the call.** A long's\n   stop sits BELOW the mark and a short's ABOVE; a take-profit is the mirror. The venue refuses the wrong\n   side (`SL trigger price 56.695 >= current price 56.180 for LONG position - would execute immediately`),\n   and on `edit_position` **the size change commits first**, so a refused stop leaves the position open and\n   UNPROTECTED — the error says so in its own last line. Read the mark price from\n   `strategy_get_asset_trading_limits` (wallet + coin) at the moment you build the call, never from entry, a\n   percentage you applied in your head, or a price quoted earlier in the conversation.\n   Re-sending the same price is the one thing that cannot work; recompute it from the mark. `percentage`\n   picks the side but is measured from ENTRY, so once the mark is already past that level it is refused\n   too — say so, and let the user choose between closing and a stop on the right side of the mark.\n\nThen **replay the full spec, get an explicit \"yes\"**, and place.\n\n### Execute & manage\n- **Open:** `strategy_create_custom_strategy` (fresh wallet + position [+ static SL\u002FTP]) or `create_position`\n  (into an existing un-managed wallet) — and **always pass `skillName` + `skillVersion`** (real params on both;\n  `strategy_create_custom_strategy` creates a wallet outside `deploy.py`, so without them the position is\n  **orphaned** \u002F unattributed per CLAUDE.md). Async — **report the real returned status**, never assume success.\n  Poll `strategy_list` to ACTIVE only when a next step needs the new wallet live: you will `create_position`\n  into it, protect or read back the position it opened (below), or the user asked to wait. Never poll just to\n  confirm the create.\n- **Protect (if chosen):** `ratchet_stop_add` on the open position (asset + tier config; it auto-reads the live position).\n- **Read back the leverage:** the position's `leverage.value` from `strategy_get_clearinghouse_state` is\n  the one that applies — quote it, not the request; when the venue clipped it, say so and fix any name or\n  label that carries the asked-for number.\n- **\"Watch it for me\" on a raw position is the ladder, never a cron:** `ratchet_stop_add` is the engine-side\n  watcher at zero model cost (profit-lock only — say it has no downside floor without a runtime); a cron is\n  a full agent turn per firing, and it is not a stop.\n- **Edit:** `edit_position` — `targetMargin` is **absolute, not a delta**; a direction flip does NOT carry\n  SL\u002FTP over. Partial close = `edit_position` with a lower `targetMargin`.\n- **Close:** `close_position` (full only; best-effort cancels resting SL\u002FTP + DSL).\n- **\"Why did it close?\" is a record question.** Read the close before naming a reason —\n  `execution_get_closed_position_details`, or the wallet's `discovery_get_trader_history`. **A position\n  you closed with `close_position` did not hit its take-profit:** an agent close, a stop fill and a TP\n  fill are three different outcomes and only the record says which. Never report a TP or stop as \"hit\"\n  from the protection you configured, or from what you remember doing — a realized return far below the\n  TP you set is the tell that something else closed it.\n\n---\n\n## Branch B — Mirror a specific trader\n\n### 0. Own the PICK — the user usually wants YOU to find the trader\nThe #1 real ask is \"find me someone worth copying,\" not an address. **Delegate the find + vet to the\n`senpi-trader-research` skill** — its engine ranks track records and reads each trader's current book;\ndon't hand-roll `discovery_*` here. Whether the trader comes back from there or the user pastes an\naddress, hold it to the same bar before you mirror — 2–3 vetted candidates with\n**max-drawdown + margin beside win-rate\u002FROI — never rank by ROI, never ROI alone.** Two things the data\nwill try to fool you on:\n\n- **A 100% win rate is a warning, not a credential** — it usually means near-zero closed trades or hidden\n  unrealised drawdown. **If it reads 100% for *every* candidate, the field is broken — don't cite it at\n  all;** judge on max-drawdown + closed-trade count + mirrorability. A \"−100% \u002F −93% max drawdown\" rated\n  \"solid\" is a contradiction — surface it, don't launder it.\n- **Mirrorability is the go\u002Fno-go — check it before you recommend anyone.** Pull each candidate's *current*\n  positions (`discovery_get_trader_state`) and read **how far each sits from the trader's entry.** That\n  distance is the slippage gate: a trader whose winners have **already run** (mark far past entry) is\n  **un-mirrorable right now — the mirror opens nothing** (every position slippage-skips), and a flat trader\n  has nothing to copy. The \"best track record\" is often the worst mirror *today* for exactly this reason.\n  When the book has already moved, **lead with a managed mirror that waits for the trader's *next* open\n  instead of copying the old book** (built with author) — or find a trader entering now. A mirror of the\n  *current* book is a valid copy style but **not** the fix for an already-run book — don't sell it as one.\n\nIf the user pasted an address, still run **both** checks on it before mirroring.\n\n### Steer the product FIRST — the copy questionnaire (lead with capital use)\nBefore you run a raw mirror, find the right **shape**. Ask one at a time, pre-fill from the opening ask;\nthe goal is to land them on a **raw mirror** or a **managed mirror they build** — recommend the fit.\n\n1. **Capital use — ask this first; it is the #1 pain.** *\"Do you want to use **most** of your capital in a\n   few concentrated positions, or replicate the trader's exact proportional book?\"*\n   - *\"use most of my funds \u002F a few big orders \u002F not 5% sitting idle\"* → **a budget-relative managed\n     mirror** (built with author) — it sizes to *your* capital and opens a few full-size positions, which a\n     proportional mirror won't (it tracks the trader's proportions). **Common answer.**\n   - *\"exactly proportional to the trader\"* → **raw mirror** (below), sized via the multiplier. If the\n     trader's account **dwarfs** the budget, match a closer-sized trader or raise the multiplier so\n     positions clear the $10 floor — a proportional mirror preserves *their* utilization %, it doesn't\n     shrink yours.\n2. **Hands-on or hands-off?** Drive one trader yourself → **raw mirror**. Set-and-forget, auto-DSL every\n   fill → **a managed mirror** (author).\n3. **What shape of copy?** → one specific trader (**raw**) · anything managed — a whale cohort, 2–3 named\n   traders on fresh entries only, one elite's biggest conviction bet, traders hot right now, the consensus\n   of the top copy strategies, a rule of their own — is a managed mirror they build (**→ senpi-strategy-author**).\n4. **Budget — their call; don't advise how much to trade.** Just state the trader's **minimum to run it\n   properly** (`senpi-trader-research` `min_mirror_budget.min_budget_usd`). If their budget is below it,\n   say plainly it won't open their full book (below `opens_nothing_below_usd`, nothing opens) and offer a\n   closer-sized trader, a higher multiplier, or a budget-relative managed mirror. The pre-fund sim confirms it.\n5. **Protection** — default **follow their exits**; offer an added DSL safety-net, especially if the\n   trader runs without stops.\n\n**Route the answer:** managed → **senpi-strategy-author** (it forks the closest template when one fits) · raw mirror of one specific trader → continue below. Offer the managed option **once**, then respect a \"no.\"\n\n### How a mirror actually works — explain it from the single source\nWhen the user needs the mechanics — and many do (*\"why did it open at a 30% different entry?\"*, *\"why so\nsmall?\"*, *\"do I need my own stop?\"*, *\"spot or perps?\"*, *\"how much do I need?\"*) — explain from\n**`references\u002Fmirror-trading-explained.md`**, the one source every skill quotes. Always hit: **sizing\nreality** (small budget vs big trader = dust; the multiplier is locked; concentrated-use → a managed mirror),\n**slippage is the entry gate** (too tight opens nothing), **you mirror their exits** (unrealised PnL\ndoesn't transfer), **protection is optional and stacks** (default: follow their exits). Never paraphrase a\ndifferent version of this anywhere.\n\n### Set it up (interview; pre-fill what's given)\nVetted trader → **budget** → **`mirrorMultiplier`** (the size knob; **immutable after creation** — set it\ndeliberately) → **slippage tolerance** (explain it above; **set it against where their current positions sit — not a silent 1% that opens nothing**) → **optional\nprotection** (none \u002F static strategy-level SL\u002FTP on total PnL \u002F per-position DSL).\n\n### The hero check — simulate BEFORE funding (a one-shot sizing estimate, not paper trading)\nSenpi has no paper-trading mode; the estimate below says what would open *right now*, and the only live test\nis running the mirror at the $10 floor. Never offer to watch a trader on a timer — a cron is a model call per firing.\nRun `execution_estimate_position_opening` at the user's budget × multiplier × slippage **before** creating\nanything. It returns, per position, `open` \u002F `skipped(slippage)` \u002F `skipped(budget)` + `minimumBudgetRequired`\n— i.e. **exactly what would open for them and at what size.** Show the real **$ and %**. If little would\nopen, STOP and offer: (a) more budget, (b) a higher multiplier, (c) a trader closer to their size, or\n(d) a managed mirror that enters only on fresh opens (author). This one check prevents the core failure: funding capital that then\nbarely trades.\n\n### Create + verify — don't fabricate\n`strategy_create` with the agreed params — and **always pass `skillName` + `skillVersion`** (both are real\nparams on `strategy_create` *and* `strategy_create_custom_strategy`). This skill creates the wallet directly,\noutside `deploy.py`, so without them every mirror it opens is **orphaned** (unattributed) per CLAUDE.md.\n**Report the status the call returned**; never say a position opened that no read showed. Poll `strategy_list`\nto ACTIVE and read `strategy_get_clearinghouse_state` only when a next step needs the opened positions: the\nladder below, or the user asked to wait or to see what opened. Never poll just to confirm the create. If that\nread shows the wallet idle past a short window, **tell the user** and adjust target \u002F budget \u002F multiplier —\n**do not** close+recreate (see below).\n\n### DSL on the mirror\n`ratchet_stop_add` per opened position adds the **profit-lock ladder** (no runtime) — but that's\n**profit-lock only**, and it takes over the position's stop order: a **static SL** (`edit_position`) is the\nother option, not a companion — adding the ratchet replaces it, so say which one the user keeps. The **real two-phase DSL** (a ratcheting max-loss floor + the locks, integrated) needs\na **runtime** → a managed strategy (author) that auto-applies it on **every** fill. Don't\nhand-wrap 40 fills a day.\n\n### Closing — present next steps as a LIST, never a paragraph\nWhenever you end a mirror or template flow with options (\"set it up \u002F simulate first \u002F compare \u002F build a\nmanaged mirror on a specific whale\"), render them as a short **numbered or bulleted list, one option per line** —\nnever a run-on sentence with `1.` `2.` buried inline. Bold the action verb; one clear next step per line.\n\n---\n\n## The guardrails — every one earned from real mirror-trading churn\n\n| If you're about to… | Don't — because | Do instead |\n|---|---|---|\n| 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) |\n| 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 |\n| 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 strategy** for real two-sided DSL |\n| Say funds are \"stuck\" \u002F \"lost\" \u002F \"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 |\n| Report a trade as placed off an EMPTY tool result, or keep polling for it | Trade tools run behind the agent's **approval gate**: a call the user does not approve in time is **denied** and comes back empty — nothing reached the venue, so there is nothing to poll for | Say the approval timed out and **nothing was placed**; offer to re-run it for approval. An errored call is different — it carries its own message: surface the **verbatim** tool text. Read `strategy_list` \u002F positions only to confirm what actually exists |\n| 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 |\n| Rank copy targets by raw ROI | Surfaced 100%-win \u002F −100%-drawdown \u002F 99.6%-margin wallets as \"best\" | Filter on drawdown + margin + closed-trade count + copyability first |\n| 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 managed mirror that waits for fresh entries |\n| Leave slippage at a silent \u002F 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 |\n| Close + recreate a mirror to \"fix\" it not trading | Each round-trip skims ~$1.50 in fees; funds fragment | The fix is **target \u002F budget \u002F multiplier**, not re-create |\n| 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 |\n| Place or grow a hand position without the three numbers | A wallet went almost entirely into one thin coin and a \"keep it tight\" stop was widened to over 40% of the account, one small request at a time — nothing ever said the total | Share of account, dollars at the stop, applied leverage — before the replay; above 50% \u002F 20%, a fresh yes to that sentence |\n| Quote the leverage the user asked for after the venue clipped it | 10× asked, 3× applied, the position still labelled \"10x\" | Read `leverage.value` from the position; say the clip; label by what applies |\n| Offer a cron as \"watch it for me\" on a raw position | Every firing is a full agent turn, and it is not a stop | `ratchet_stop_add` — the ladder watches for free (profit-lock only; say so) |\n| Promise a `ratchet_stop_add` on a runtime-managed position covers future entries | **The add binds to the position open now.** The runtime arms the next one from the strategy's own `exit.dsl_preset` — so \"it never closes below +X again\" is false, and the next entry closes the old way | Say the ladder covers this position only, then route the file half to `senpi-strategy-ops` (a DSL change has two targets — the file for future positions, the ratchet for open ones; the user picks) |\n| Say anything about a stop or ladder, or change one, outside the protection protocol | Every rule in it was broken on a live short — the user caught each one | The six rules above, in order |\n\n> **State machine is transient, not terminal — *up to a point*.** `CREATE_WALLET` → `FUND_WALLET` \u002F\n> `PENDING_FUNDING` are normal in-progress states (bridging can take 30s+); don't read a fresh one as\n> failure. `SERR045` (\"requires ACTIVE\") on a pending strategy means *wait*, not *broken*. `FAILED` money\n> is refunded automatically. **BUT `PENDING_FUNDING` past ~15 minutes is a real bridge deadlock** (the\n> Base→strategy-wallet bridge never completed) — the funds are trapped and it will NOT self-heal. Stop\n> reassuring: tell the user plainly it's stuck, never say \"it should resolve shortly,\" and escalate to get\n> the funds returned. (Agents have churned users by promising a stuck deposit would clear when it never did.)\n\n---\n\n## Handoff & boundaries\n- **A request to act on one of the user's SAVED wallets** (close, open, set a stop, cancel — on a\n  wallet in `user_get_me`'s `external_wallets`, the ones they added in Your wallets) → answer by quoting\n  its `access` line, and make **no write-tool attempt**: \"Read-only. Senpi can analyze this wallet. It\n  cannot place, change or cancel orders on it.\" Reading `user_get_me` to recognise the address is fine.\n  A write tool that comes back `NOT_A_STRATEGY_WALLET` (match the error code) is the same answer — never\n  retry it on another tool. \"Your wallet\" means one of their saved wallets or one the user said is\n  theirs in this conversation; an address pasted in chat is never described as saved — to save it, the\n  user can add it in Your wallets on senpi.ai (web).\n- **Finding \u002F vetting the trader → `senpi-trader-research`.** It ranks records + reads current books and\n  hands the *action* (set up the mirror) back to this skill; you own the mechanics — slippage, sizing,\n  the pre-fund sim, execution.\n- **Ongoing hands-off management \u002F DSL-on-every-fill \u002F fresh-entry \u002F budget-relative sizing →**\n  `senpi-strategy-author` (their own managed mirror or strategy; it forks the closest template\n  when one fits). This skill executes the **direct** trade and can add **per-position** protection.\n- **Mirror with *custom rules*** — a position-count cap (\"max 5; if he opens\n  more, don't mirror\"), a per-position % cap (\"each ≤ 5% of my capital\"), \"don't copy his shorts\",\n  \"capture his adds\", or a conditional exit → a **custom mirror runtime** via `senpi-strategy-author`. Note the\n  **`mirrorMultiplier` is immutable after creation** — a user who wants to change size live must redeploy;\n  there is no in-place edit.\n- **\"How's my mirror doing?\" \u002F compare my mirrors \u002F is my trader still active \u002F why didn't it fire →**\n  read **`references\u002Fmirror-monitoring.md`** — it composes your mirror's state (`senpi-portfolio` \u002F\n  `strategy_get_clearinghouse_state`) with the OG's current book (`senpi-trader-research`) and diffs them\n  (are you still tracking, did the OG go idle, which positions drifted). After you create a mirror, tell\n  the user they can ask any time.\n- **Close \u002F withdraw \u002F rebalance a mirror →** `senpi-strategy-ops` (close a mirror, reclaim funds, top-up,\n  or shift budget between mirrors). A mirror **is** a strategy — lifecycle actions live in ops, not here.\n- **A pasted address (`I want to mirror trade 0x…`) is the single most common entry** — vet it through\n  `senpi-trader-research` (mirrorability + drawdown) **before** mirroring, even when it's a popular wallet\n  everyone is asking about. Don't rubber-stamp a hot address.\n- **Never** send USDC to an external address (no tool for it — direct the user to the app), and never\n  present a strategy wallet as a deposit target.\n- Every money amount (`marginAmount`, `initialBudget`, `mirrorMultiplier`, budgets) is **user intent** —\n  if missing, ASK; never copy a number from a doc example or default to the balance.\n\n## Red flags — STOP and re-check\n- You're about to `strategy_create` a mirror without having run the deployability sim.\n- 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\u002For a managed strategy for real two-sided DSL.\n- You're about to tell the user funds are \"stuck\", or to treat an EMPTY tool result as a placed trade — an unapproved (timed-out) call is denied and executes nothing; say so and offer the re-run.\n- You're about to open a manual position into a wallet a runtime is managing.\n- You're about to close+recreate a mirror that \"isn't trading.\"\n- You're about to say anything about a stop or ladder — or change one — without the protection protocol's same-turn read and yes.\n- You're quoting a trader's ROI\u002Fwin-rate with no drawdown beside it.\n- You're about to recommend mirroring a trader whose current positions have already run past their entry — the mirror would open **nothing**.\n- You're about to recommend a trader who trades **rarely or hasn't traded in weeks** (`infrequent_trader` \u002F `dormant`) without warning the user the mirror will sit idle until they trade again — it only fires when they do.\n- 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.\n\nAll of these mean: stop, run the check, correct the framing, or route to the managed path.\n",{"name":5,"license":15,"metadata":53,"description":7},{"author":54,"version":55,"exchange":56,"platform":57,"requires":58},"Senpi","1.12.0","hyperliquid","senpi",[59,60],"senpi-trader-research","senpi-strategy-discover","main","4aff87e77e63c1886a978b82902814d015f55a4f","skills\u002Fexchanges\u002Fsenpi-ai-senpi-trade",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-15 02:28:10",{"source":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":82},[72,75,78],{"tool":73,"command":74},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill senpi-trade",{"tool":76,"command":77},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill senpi-trade",{"tool":79,"command":80},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill senpi-trade","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002FSKILL.md",true,[84,88,94,98,102,106,112],{"path":85,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":16},"LICENSE","许可证",1070,{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Fmirror-monitoring.md","REFERENCE","参考文档",3080,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002Freferences\u002Fmirror-monitoring.md",{"path":95,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Fmirror-trading-explained.md",8065,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002Freferences\u002Fmirror-trading-explained.md",{"path":99,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":100,"sourceHtmlUrl":101},"references\u002Fprotection-cases.md",6240,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002Freferences\u002Fprotection-cases.md",{"path":103,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":104,"sourceHtmlUrl":105},"SOURCE.md",334,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002FSOURCE.md",{"path":107,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":110,"sourceHtmlUrl":111},"tests\u002Ftest_trade_skill_surface.py","SCRIPT","脚本",6102,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002Ftests\u002Ftest_trade_skill_surface.py",{"path":113,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":114,"sourceHtmlUrl":115},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fsenpi-ai-senpi-trade\u002FTRUST.auto.yaml",[117,146,168,185,198,208],{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":122,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":48},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":150,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":48},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[154,155,156,157,158,159,160,161,162,163,164,165,166,167],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":172,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":48},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[176,155,177,178,179,46,180,165,164,163,181,182,183,159,184,158,157],"mexc spot rest","REST","admin","signing","requests","actions","secure","data","orders",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":189,"sourceHtmlUrl":190,"categories":191,"keywords":192,"publishedAt":48},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[193,194,156,195,196,166,164,197,162,161,159,158],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":199,"name":200,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":201,"sourceHtmlUrl":202,"categories":203,"keywords":204,"publishedAt":48},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[205,206,207],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":121,"licenseFileUrl":212,"sourceHtmlUrl":213,"categories":214,"keywords":215,"publishedAt":48},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[216,217,218,219,220,221,222,223,224,225,226],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","use","patch","code","share"]