[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X935PFESK0M10JK6ABK01N":3,"skill-same:01M6X935PFESK0M10JK6ABK01N":103},{"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":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":6,"ownerHtmlUrl":59,"ownerBlogUrl":60,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6X935PFESK0M10JK6ABK01N","senpi-trading-runtime",null,"Configure, deploy, and manage Senpi Trading Runtime (OpenClaw plugin @senpi-ai\u002Fruntime) for automated on-chain position tracking with DSL trailing stop-loss protection. Use when a user needs to create or modify runtime YAML files, configure DSL (Dynamic Stop-Loss) exit engine parameters (phases, tiers, time-based cuts), set up the position_tracker scanner to monitor a wallet's positions on Hyperliquid, install\u002Flist\u002Fdelete runtimes via CLI, or inspect DSL-tracked positions. The runtime does NOT create strategy wallets; create\u002Fget the strategy wallet via Senpi MCP first, then link that existing wallet in runtime YAML. Triggers on mentions of senpi, Senpi runtime, DSL exit, stop-loss tiers, position tracker, trailing stop, openclaw senpi, dsl_preset, or strategy YAML configuration.\"","enuno\u002Fcrewless-capital","enuno","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6727752?v=4","01M6J09HF6Y74150F7PEMC446X","Elvis Nuno","01M6X86WGZG9RH09ACTSTJ2383",1,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"senpi trading runtime","runtime","trading","scanner","when","dsl","on-chain","inspect","chain","get","time","MCP","files","Wallet","up","configure","SET","delete","create","cli","2026-11-10 10:12:30",false,"---\nname: senpi-trading-runtime\ndescription: >-\n  Configure, deploy, and manage Senpi Trading Runtime (OpenClaw plugin @senpi-ai\u002Fruntime) for automated on-chain position tracking with DSL trailing stop-loss protection. Use when a user needs to create or modify runtime YAML files, configure DSL (Dynamic Stop-Loss) exit engine parameters (phases, tiers, time-based cuts), set up the position_tracker scanner to monitor a wallet's positions on Hyperliquid, install\u002Flist\u002Fdelete runtimes via CLI, or inspect DSL-tracked positions. The runtime does NOT create strategy wallets; create\u002Fget the strategy wallet via Senpi MCP first, then link that existing wallet in runtime YAML. Triggers on mentions of senpi, Senpi runtime, DSL exit, stop-loss tiers, position tracker, trailing stop, openclaw senpi, dsl_preset, or strategy YAML configuration.\"\nlicense: Apache-2.0\nmetadata:\n  author: Senpi\n  version: \"1.0\"\n  platform: senpi\n  exchange: hyperliquid\n---\n\n# Senpi Trading Runtime — OpenClaw Plugin\n\nOn-chain position tracker with automated DSL (Dynamic Stop-Loss) exit engine. Monitors a wallet's positions on Hyperliquid for lifecycle events (open, close, edit, flip) and applies two-phase trailing stop-loss protection to all positions. It links to an existing strategy wallet address and does not create wallets.\n\n## Core Concepts\n\n**Flow:** Position Tracker scanner → detects position changes → DSL exit engine manages trailing stops\n\n1. **Position Tracker** (`position_tracker` scanner) polls the wallet on-chain, detecting opens, closes, increases, decreases, and flips.\n2. **DSL exit engine** monitors tracked positions on a timer, computing trailing stop-loss floors across two phases.\n3. **Strategy (in runtime)** = link to an existing wallet address. The wallet address is the strategy identifier everywhere, but wallet creation happens via Senpi MCP (not the runtime).\n\n**Key insight:** The position tracker enables DSL protection for ALL positions of a strategy address — including those opened manually on the exchange or by other tools.\n\n### Wallet lifecycle (required order)\n\n1. Create strategy wallet address via Senpi MCP calls (or confirm it already exists).\n2. Put that wallet address into runtime YAML (`strategies.\u003Cname>.wallet` \u002F `${WALLET_ADDRESS}`).\n3. Install\u002Fcreate runtime. This links the runtime to the existing wallet for monitoring and exits.\n\nNever treat `openclaw senpi runtime create` as wallet creation.\n\n### Strategy wallet validation (mandatory before runtime create\u002Finstall)\n\nUse this exact MCP-first guardrail to avoid using embedded wallets by mistake:\n\n1. Call `strategy_list` and collect `strategies[].strategyWalletAddress`.\n2. A runtime wallet is valid only if it appears in that list (case-insensitive match).\n3. If list is empty OR provided wallet is not in list: call `strategy_create_custom_strategy` to create a strategy wallet first.\n4. Use the newly created strategy wallet address directly as `WALLET_ADDRESS` in runtime YAML, then install runtime.\n\nHard rules:\n- Never use embedded wallet\u002Finjected wallet for runtime linking.\n- Never treat a wallet as a strategy wallet unless it exists in `strategy_list`.\n- Runtime install is blocked until strategy wallet validation passes.\n- Always confirm with the user before creating a new strategy wallet address, and explicitly confirm the budget (`initialBudget`) that will be used.\n\nExample MCP flow (tool names from Senpi MCP):\n\n```text\nstrategy_list({})\nif provided_wallet not in strategies[].strategyWalletAddress:\n  # confirm with user first: create new strategy wallet + initialBudget\n  strategy_create_custom_strategy({\n    initialBudget: \u003Cbudget_usdc>,\n    positions: [],\n    skillName: \u003Cstrategy_or_runtime_name>,\n    skillVersion: \"1.0.0\"\n  })\n```\n\nNotes:\n- `initialBudget` is required when creating the strategy wallet.\n- Use `positions: []` when you only need the strategy wallet created now and will trade later.\n\n## CLI Commands\n\nAll commands require the OpenClaw gateway running (`openclaw gateway run`).\n\nUse `openclaw senpi --cheatsheet` to print the full plugin command cheatsheet to stdout.\n\n### Runtime management\n\nPrerequisite: strategy wallet address already exists (created\u002Ffetched via Senpi MCP).\n\n```bash\n# Create a runtime from YAML file\nopenclaw senpi runtime create --path .\u002Fmy-strategy.yaml\nopenclaw senpi runtime create -p .\u002Fmy-strategy.yaml          # short form\n\n# Create with inline YAML content\nopenclaw senpi runtime create --content \"\u003Cyaml>\"\nopenclaw senpi runtime create -c \"\u003Cyaml>\"                    # short form\n\n# Create with custom ID\nopenclaw senpi runtime create --path .\u002Fmy-strategy.yaml --runtime-id my-name\n\n# List installed runtimes (id, wallet, source, status)\nopenclaw senpi runtime list\n\n# Delete a runtime\nopenclaw senpi runtime delete \u003Cruntime_id>                   # positional id\nopenclaw senpi runtime delete --id \u003Cruntime_id>              # named flag\n```\n\n### DSL position inspection\n\n```bash\n# All active DSL-tracked positions\nopenclaw senpi dsl positions\nopenclaw senpi dsl positions -r \u003Cid>                         # filter by runtime id\nopenclaw senpi dsl positions -a \u003Caddr>                       # filter by wallet address\nopenclaw senpi dsl positions --json\n\n# Inspect one position (full DslState)\nopenclaw senpi dsl inspect \u003CASSET>\nopenclaw senpi dsl inspect SOL -r \u003Cid>\nopenclaw senpi dsl inspect SOL -a \u003Caddr>\nopenclaw senpi dsl inspect BTC --json\n\n# Archived (closed) positions — reason, ROE, phase, tier\nopenclaw senpi dsl closes\nopenclaw senpi dsl closes -r \u003Cid>\nopenclaw senpi dsl closes -a \u003Caddr>\nopenclaw senpi dsl closes -l \u003Cn>\nopenclaw senpi dsl closes --json\n```\n\n### Runtime diagnostics\n\n```bash\nopenclaw senpi status                    # lightweight health summary (all runtimes)\nopenclaw senpi status -r \u003Cid>\nopenclaw senpi status --json\n\nopenclaw senpi state                     # full operational state (all runtimes)\nopenclaw senpi state -r \u003Cid>\nopenclaw senpi state --json\n```\n\n### In-shell reference (`senpi guide`)\n\n```bash\nopenclaw senpi guide                 # overview + quick command list\nopenclaw senpi guide scanners        # scanner types and config fields\nopenclaw senpi guide actions         # action types and decision modes\nopenclaw senpi guide dsl             # DSL exit engine: phases, tiers, time cuts\nopenclaw senpi guide examples        # print minimal strategy YAML to stdout\nopenclaw senpi guide schema          # full YAML schema field reference\nopenclaw senpi guide version         # plugin version and changelog URL\n```\n\n### CLI preferences (`senpi config`)\n\nPersists to `~\u002F.openclaw\u002Fsenpi-cli.json`. Restart gateway to apply.\n\n```bash\nopenclaw senpi config set-chat-id \u003CchatId>\nopenclaw senpi config set-senpi-jwt-token \u003Ctoken>\nopenclaw senpi config set-state-dir \u003Cdir>\nopenclaw senpi config get \u003Ckey>      # telegram-chat-id | senpi-jwt-token | state-dir\nopenclaw senpi config list           # secrets masked\nopenclaw senpi config unset \u003Ckey>\nopenclaw senpi config reset\n```\n\n### Gateway RPC (advanced)\n\n**Common calls:**\n\n```bash\nopenclaw gateway call senpi.installRuntime --params '{\"runtimeYamlContent\":\"...\"}'\nopenclaw gateway call senpi.listRuntimes --json --params '{}'\nopenclaw gateway call senpi.deleteRuntime --params '{\"id\":\"my-runtime\"}'\nopenclaw gateway call senpi.listDslPositions --json --params '{}'\nopenclaw gateway call senpi.getDslPositionState --json --params '{\"asset\":\"SOL\"}'\nopenclaw gateway call senpi.listDslArchives --json --params '{\"limit\":20}'\nopenclaw gateway call senpi.getHealthStatus --json --params '{}'\nopenclaw gateway call senpi.getSystemState --json --params '{}'\n```\n\n**Methods summary**\n\n| Method | Params | Success response |\n|--------|--------|------------------|\n| `senpi.installRuntime` | `runtimeYamlContent` or `runtimeYamlPath` | Runtime installed |\n| `senpi.listRuntimes` | — | List of runtimes |\n| `senpi.deleteRuntime` | `id` or address | Deleted |\n| `senpi.listDslPositions` | `runtimeId?` | Active positions |\n| `senpi.getDslPositionState` | `asset`, `runtimeId?` | Single position state |\n| `senpi.listDslArchives` | `runtimeId?`, `address?`, `limit?` | `closes[]` (asset, direction, entryPrice, lastPrice, currentROE, closeReason, closedAt, phase, …) |\n| `senpi.getHealthStatus` | `runtimeId?` (string) | `status` or `statuses[]` (health, components.scanners, components.dsl) |\n| `senpi.getSystemState` | `runtimeId?` (string) | `state` or `states[]` (health, stateDir, scanner\u002FDSL components) |\n\nClose reasons for `listDslArchives`: `dsl_breach`, `hard_timeout`, `weak_peak_cut`, `dead_weight_cut`, `exchange_sl_hit`, `manual`.\n\n## Runtime YAML\n\nThe runtime YAML drives all behavior. Top-level keys: `name`, `strategies`, `scanners`, `actions`, `exit`, `notifications`.\n\n```yaml\nname: my-tracker\nversion: 1.0.0\ndescription: >\n  On-chain position tracker with DSL trailing stop-loss.\n\nstrategies:\n  main:\n    wallet: \"${WALLET_ADDRESS}\"\n    budget: 500\n    slots: 2\n    margin_per_slot: 200\n    trading_risk: conservative    # conservative | moderate | aggressive\n    enabled: true\n\nscanners:\n  - name: position_tracker\n    type: position_tracker\n    interval: 10s\n\nactions:\n  - name: position_tracker_action\n    action_type: POSITION_TRACKER\n    decision_mode: rule\n    scanners: [position_tracker]\n\nexit:\n  engine: dsl\n  interval_seconds: 30            # how often the price monitor runs (5-3600)\n  dsl_preset:                     # single preset (no named map needed)\n    hard_timeout:\n      enabled: true\n      interval_in_minutes: 360\n    weak_peak_cut:\n      enabled: true\n      interval_in_minutes: 120\n      min_value: 5\n    dead_weight_cut:\n      enabled: true\n      interval_in_minutes: 60\n    phase1:\n      enabled: true\n      max_loss_pct: 4.0\n      retrace_threshold: 7\n      consecutive_breaches_required: 1\n    phase2:\n      enabled: true\n      tiers:\n        - { trigger_pct: 7,  lock_hw_pct: 40 }\n        - { trigger_pct: 12, lock_hw_pct: 55 }\n        - { trigger_pct: 15, lock_hw_pct: 75 }\n        - { trigger_pct: 20, lock_hw_pct: 85 }\n\nnotifications:\n  telegram_chat_id: \"${TELEGRAM_CHAT_ID}\"\n```\n\nEnvironment variable substitution: `${VAR}` and `${VAR:-default}` resolved at load time.\n\nFor full field details: [YAML Schema Reference](references\u002Fyaml-schema.md)\n\n## DSL Exit Engine — Key Concepts\n\n**Two-phase trailing stop-loss** protecting open positions:\n\n**Phase 1** (from entry until the first tier is reached):\n- **Absolute floor** from `max_loss_pct` (cap on loss from entry, scaled by leverage)\n- **Trailing floor** from `retrace_threshold` (ROE % pullback from high-water mark)\n- Effective floor = stricter of both (LONG: higher price; SHORT: lower)\n- Optional **time-based cuts** at preset level: `hard_timeout`, `weak_peak_cut`, `dead_weight_cut`\n- Exchange SL stays at the absolute floor only; tighter exits enforced by runtime\n\n**Phase 2** (after the first tier is reached — Phase 2 always starts at tier 0):\n- **Tier floor** = `lock_hw_pct` % of current high-water ROE (trails as HW advances, never loosens)\n- Exchange SL tracks the full effective floor and updates as it moves\n\n**Tiers** are profit milestones (by ROE % from entry). Each tier has two fields: `trigger_pct` (ROE % that activates it) and `lock_hw_pct` (% of high-water ROE to lock as floor). Tiers must have strictly increasing `trigger_pct`.\n\n**Consecutive breaches** are tick-based (not time-based). Each monitor tick (every `interval_seconds`), if price violates the floor, the breach counter increments. Recovery resets it.\n\n**Retrace convention:** `retrace_threshold` is ROE %. Engine converts to price: `retrace_ROE% \u002F 100 \u002F leverage`. At 10x leverage, 7% ROE retrace = 0.7% price below high-water.\n\nFor full DSL configuration with all fields, time-based cuts, close reasons, and events: [DSL Configuration Reference](references\u002Fdsl-configuration.md)\n\n## Environment Variables\n\n| Variable | Required | Purpose |\n|----------|----------|---------|\n| `WALLET_ADDRESS` | Yes | Existing strategy wallet address from Senpi MCP (used in YAML via `${WALLET_ADDRESS}`). |\n| `SENPI_API_KEY` | For live MCP | Senpi MCP authentication. |\n| `TELEGRAM_CHAT_ID` | No | Telegram chat ID for notifications. |\n| `DSL_STATE_DIR` | No | Override DSL state file directory. |\n\n## References\n\n- [Runtime Concepts](references\u002Fruntime-concepts.md) — Conceptual explanation of scanners, actions, DSL phases, and what every field controls in trading terms\n- [YAML Schema Reference](references\u002Fyaml-schema.md) — All runtime YAML fields and DSL preset options\n- [DSL Configuration Reference](references\u002Fdsl-configuration.md) — Full DSL exit engine: phases, tiers, time cuts, close reasons, events\n- [Strategy Examples](references\u002Fstrategy-examples.md) — Ready-to-use YAML examples with different DSL tuning profiles\n- [Migration from DSL Cron](references\u002Fmigration-from-dsl-cron.md) — Upgrade from old `dsl-v5.py` cron to plugin runtime\n- [Runtime Template](references\u002Fruntime-template.yaml) — Starter runtime.yaml with field mapping comments\n","# Senpi Trading Runtime — OpenClaw Plugin\n\nOn-chain position tracker with automated DSL (Dynamic Stop-Loss) exit engine. Monitors a wallet's positions on Hyperliquid for lifecycle events (open, close, edit, flip) and applies two-phase trailing stop-loss protection to all positions. It links to an existing strategy wallet address and does not create wallets.\n\n## Core Concepts\n\n**Flow:** Position Tracker scanner → detects position changes → DSL exit engine manages trailing stops\n\n1. **Position Tracker** (`position_tracker` scanner) polls the wallet on-chain, detecting opens, closes, increases, decreases, and flips.\n2. **DSL exit engine** monitors tracked positions on a timer, computing trailing stop-loss floors across two phases.\n3. **Strategy (in runtime)** = link to an existing wallet address. The wallet address is the strategy identifier everywhere, but wallet creation happens via Senpi MCP (not the runtime).\n\n**Key insight:** The position tracker enables DSL protection for ALL positions of a strategy address — including those opened manually on the exchange or by other tools.\n\n### Wallet lifecycle (required order)\n\n1. Create strategy wallet address via Senpi MCP calls (or confirm it already exists).\n2. Put that wallet address into runtime YAML (`strategies.\u003Cname>.wallet` \u002F `${WALLET_ADDRESS}`).\n3. Install\u002Fcreate runtime. This links the runtime to the existing wallet for monitoring and exits.\n\nNever treat `openclaw senpi runtime create` as wallet creation.\n\n### Strategy wallet validation (mandatory before runtime create\u002Finstall)\n\nUse this exact MCP-first guardrail to avoid using embedded wallets by mistake:\n\n1. Call `strategy_list` and collect `strategies[].strategyWalletAddress`.\n2. A runtime wallet is valid only if it appears in that list (case-insensitive match).\n3. If list is empty OR provided wallet is not in list: call `strategy_create_custom_strategy` to create a strategy wallet first.\n4. Use the newly created strategy wallet address directly as `WALLET_ADDRESS` in runtime YAML, then install runtime.\n\nHard rules:\n- Never use embedded wallet\u002Finjected wallet for runtime linking.\n- Never treat a wallet as a strategy wallet unless it exists in `strategy_list`.\n- Runtime install is blocked until strategy wallet validation passes.\n- Always confirm with the user before creating a new strategy wallet address, and explicitly confirm the budget (`initialBudget`) that will be used.\n\nExample MCP flow (tool names from Senpi MCP):\n\n```text\nstrategy_list({})\nif provided_wallet not in strategies[].strategyWalletAddress:\n  # confirm with user first: create new strategy wallet + initialBudget\n  strategy_create_custom_strategy({\n    initialBudget: \u003Cbudget_usdc>,\n    positions: [],\n    skillName: \u003Cstrategy_or_runtime_name>,\n    skillVersion: \"1.0.0\"\n  })\n```\n\nNotes:\n- `initialBudget` is required when creating the strategy wallet.\n- Use `positions: []` when you only need the strategy wallet created now and will trade later.\n\n## CLI Commands\n\nAll commands require the OpenClaw gateway running (`openclaw gateway run`).\n\nUse `openclaw senpi --cheatsheet` to print the full plugin command cheatsheet to stdout.\n\n### Runtime management\n\nPrerequisite: strategy wallet address already exists (created\u002Ffetched via Senpi MCP).\n\n```bash\n# Create a runtime from YAML file\nopenclaw senpi runtime create --path .\u002Fmy-strategy.yaml\nopenclaw senpi runtime create -p .\u002Fmy-strategy.yaml          # short form\n\n# Create with inline YAML content\nopenclaw senpi runtime create --content \"\u003Cyaml>\"\nopenclaw senpi runtime create -c \"\u003Cyaml>\"                    # short form\n\n# Create with custom ID\nopenclaw senpi runtime create --path .\u002Fmy-strategy.yaml --runtime-id my-name\n\n# List installed runtimes (id, wallet, source, status)\nopenclaw senpi runtime list\n\n# Delete a runtime\nopenclaw senpi runtime delete \u003Cruntime_id>                   # positional id\nopenclaw senpi runtime delete --id \u003Cruntime_id>              # named flag\n```\n\n### DSL position inspection\n\n```bash\n# All active DSL-tracked positions\nopenclaw senpi dsl positions\nopenclaw senpi dsl positions -r \u003Cid>                         # filter by runtime id\nopenclaw senpi dsl positions -a \u003Caddr>                       # filter by wallet address\nopenclaw senpi dsl positions --json\n\n# Inspect one position (full DslState)\nopenclaw senpi dsl inspect \u003CASSET>\nopenclaw senpi dsl inspect SOL -r \u003Cid>\nopenclaw senpi dsl inspect SOL -a \u003Caddr>\nopenclaw senpi dsl inspect BTC --json\n\n# Archived (closed) positions — reason, ROE, phase, tier\nopenclaw senpi dsl closes\nopenclaw senpi dsl closes -r \u003Cid>\nopenclaw senpi dsl closes -a \u003Caddr>\nopenclaw senpi dsl closes -l \u003Cn>\nopenclaw senpi dsl closes --json\n```\n\n### Runtime diagnostics\n\n```bash\nopenclaw senpi status                    # lightweight health summary (all runtimes)\nopenclaw senpi status -r \u003Cid>\nopenclaw senpi status --json\n\nopenclaw senpi state                     # full operational state (all runtimes)\nopenclaw senpi state -r \u003Cid>\nopenclaw senpi state --json\n```\n\n### In-shell reference (`senpi guide`)\n\n```bash\nopenclaw senpi guide                 # overview + quick command list\nopenclaw senpi guide scanners        # scanner types and config fields\nopenclaw senpi guide actions         # action types and decision modes\nopenclaw senpi guide dsl             # DSL exit engine: phases, tiers, time cuts\nopenclaw senpi guide examples        # print minimal strategy YAML to stdout\nopenclaw senpi guide schema          # full YAML schema field reference\nopenclaw senpi guide version         # plugin version and changelog URL\n```\n\n### CLI preferences (`senpi config`)\n\nPersists to `~\u002F.openclaw\u002Fsenpi-cli.json`. Restart gateway to apply.\n\n```bash\nopenclaw senpi config set-chat-id \u003CchatId>\nopenclaw senpi config set-senpi-jwt-token \u003Ctoken>\nopenclaw senpi config set-state-dir \u003Cdir>\nopenclaw senpi config get \u003Ckey>      # telegram-chat-id | senpi-jwt-token | state-dir\nopenclaw senpi config list           # secrets masked\nopenclaw senpi config unset \u003Ckey>\nopenclaw senpi config reset\n```\n\n### Gateway RPC (advanced)\n\n**Common calls:**\n\n```bash\nopenclaw gateway call senpi.installRuntime --params '{\"runtimeYamlContent\":\"...\"}'\nopenclaw gateway call senpi.listRuntimes --json --params '{}'\nopenclaw gateway call senpi.deleteRuntime --params '{\"id\":\"my-runtime\"}'\nopenclaw gateway call senpi.listDslPositions --json --params '{}'\nopenclaw gateway call senpi.getDslPositionState --json --params '{\"asset\":\"SOL\"}'\nopenclaw gateway call senpi.listDslArchives --json --params '{\"limit\":20}'\nopenclaw gateway call senpi.getHealthStatus --json --params '{}'\nopenclaw gateway call senpi.getSystemState --json --params '{}'\n```\n\n**Methods summary**\n\n| Method | Params | Success response |\n|--------|--------|------------------|\n| `senpi.installRuntime` | `runtimeYamlContent` or `runtimeYamlPath` | Runtime installed |\n| `senpi.listRuntimes` | — | List of runtimes |\n| `senpi.deleteRuntime` | `id` or address | Deleted |\n| `senpi.listDslPositions` | `runtimeId?` | Active positions |\n| `senpi.getDslPositionState` | `asset`, `runtimeId?` | Single position state |\n| `senpi.listDslArchives` | `runtimeId?`, `address?`, `limit?` | `closes[]` (asset, direction, entryPrice, lastPrice, currentROE, closeReason, closedAt, phase, …) |\n| `senpi.getHealthStatus` | `runtimeId?` (string) | `status` or `statuses[]` (health, components.scanners, components.dsl) |\n| `senpi.getSystemState` | `runtimeId?` (string) | `state` or `states[]` (health, stateDir, scanner\u002FDSL components) |\n\nClose reasons for `listDslArchives`: `dsl_breach`, `hard_timeout`, `weak_peak_cut`, `dead_weight_cut`, `exchange_sl_hit`, `manual`.\n\n## Runtime YAML\n\nThe runtime YAML drives all behavior. Top-level keys: `name`, `strategies`, `scanners`, `actions`, `exit`, `notifications`.\n\n```yaml\nname: my-tracker\nversion: 1.0.0\ndescription: >\n  On-chain position tracker with DSL trailing stop-loss.\n\nstrategies:\n  main:\n    wallet: \"${WALLET_ADDRESS}\"\n    budget: 500\n    slots: 2\n    margin_per_slot: 200\n    trading_risk: conservative    # conservative | moderate | aggressive\n    enabled: true\n\nscanners:\n  - name: position_tracker\n    type: position_tracker\n    interval: 10s\n\nactions:\n  - name: position_tracker_action\n    action_type: POSITION_TRACKER\n    decision_mode: rule\n    scanners: [position_tracker]\n\nexit:\n  engine: dsl\n  interval_seconds: 30            # how often the price monitor runs (5-3600)\n  dsl_preset:                     # single preset (no named map needed)\n    hard_timeout:\n      enabled: true\n      interval_in_minutes: 360\n    weak_peak_cut:\n      enabled: true\n      interval_in_minutes: 120\n      min_value: 5\n    dead_weight_cut:\n      enabled: true\n      interval_in_minutes: 60\n    phase1:\n      enabled: true\n      max_loss_pct: 4.0\n      retrace_threshold: 7\n      consecutive_breaches_required: 1\n    phase2:\n      enabled: true\n      tiers:\n        - { trigger_pct: 7,  lock_hw_pct: 40 }\n        - { trigger_pct: 12, lock_hw_pct: 55 }\n        - { trigger_pct: 15, lock_hw_pct: 75 }\n        - { trigger_pct: 20, lock_hw_pct: 85 }\n\nnotifications:\n  telegram_chat_id: \"${TELEGRAM_CHAT_ID}\"\n```\n\nEnvironment variable substitution: `${VAR}` and `${VAR:-default}` resolved at load time.\n\nFor full field details: [YAML Schema Reference](references\u002Fyaml-schema.md)\n\n## DSL Exit Engine — Key Concepts\n\n**Two-phase trailing stop-loss** protecting open positions:\n\n**Phase 1** (from entry until the first tier is reached):\n- **Absolute floor** from `max_loss_pct` (cap on loss from entry, scaled by leverage)\n- **Trailing floor** from `retrace_threshold` (ROE % pullback from high-water mark)\n- Effective floor = stricter of both (LONG: higher price; SHORT: lower)\n- Optional **time-based cuts** at preset level: `hard_timeout`, `weak_peak_cut`, `dead_weight_cut`\n- Exchange SL stays at the absolute floor only; tighter exits enforced by runtime\n\n**Phase 2** (after the first tier is reached — Phase 2 always starts at tier 0):\n- **Tier floor** = `lock_hw_pct` % of current high-water ROE (trails as HW advances, never loosens)\n- Exchange SL tracks the full effective floor and updates as it moves\n\n**Tiers** are profit milestones (by ROE % from entry). Each tier has two fields: `trigger_pct` (ROE % that activates it) and `lock_hw_pct` (% of high-water ROE to lock as floor). Tiers must have strictly increasing `trigger_pct`.\n\n**Consecutive breaches** are tick-based (not time-based). Each monitor tick (every `interval_seconds`), if price violates the floor, the breach counter increments. Recovery resets it.\n\n**Retrace convention:** `retrace_threshold` is ROE %. Engine converts to price: `retrace_ROE% \u002F 100 \u002F leverage`. At 10x leverage, 7% ROE retrace = 0.7% price below high-water.\n\nFor full DSL configuration with all fields, time-based cuts, close reasons, and events: [DSL Configuration Reference](references\u002Fdsl-configuration.md)\n\n## Environment Variables\n\n| Variable | Required | Purpose |\n|----------|----------|---------|\n| `WALLET_ADDRESS` | Yes | Existing strategy wallet address from Senpi MCP (used in YAML via `${WALLET_ADDRESS}`). |\n| `SENPI_API_KEY` | For live MCP | Senpi MCP authentication. |\n| `TELEGRAM_CHAT_ID` | No | Telegram chat ID for notifications. |\n| `DSL_STATE_DIR` | No | Override DSL state file directory. |\n\n## References\n\n- [Runtime Concepts](references\u002Fruntime-concepts.md) — Conceptual explanation of scanners, actions, DSL phases, and what every field controls in trading terms\n- [YAML Schema Reference](references\u002Fyaml-schema.md) — All runtime YAML fields and DSL preset options\n- [DSL Configuration Reference](references\u002Fdsl-configuration.md) — Full DSL exit engine: phases, tiers, time cuts, close reasons, events\n- [Strategy Examples](references\u002Fstrategy-examples.md) — Ready-to-use YAML examples with different DSL tuning profiles\n- [Migration from DSL Cron](references\u002Fmigration-from-dsl-cron.md) — Upgrade from old `dsl-v5.py` cron to plugin runtime\n- [Runtime Template](references\u002Fruntime-template.yaml) — Starter runtime.yaml with field mapping comments\n",{"name":5,"license":15,"metadata":49,"description":7},{"author":50,"version":51,"exchange":52,"platform":53},"Senpi","1.0","hyperliquid","senpi","main","bfe4e4653cba696a8dc20f70c6006651b997fdef","migrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime",0,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital","https:\u002F\u002Fgithub.com\u002Fenuno","https:\u002F\u002Fenuno.github.io\u002FDynamicCareerCanvas","Digital Nomad, Blockchain Evangel, and Digital Solutions Architect. \r\nCreator of TerraHash Stack.\r\nCEO of Ryno Crypto Mining Services.","2026-07-02 10:49:15",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add enuno\u002Fcrewless-capital --skill senpi-trading-runtime",{"tool":69,"command":70},"bunx","bunx skills add enuno\u002Fcrewless-capital --skill senpi-trading-runtime",{"tool":72,"command":73},"pnpm","pnpm dlx skills add enuno\u002Fcrewless-capital --skill senpi-trading-runtime","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002FSKILL.md",true,[77,83,87,91,95,99],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fdsl-configuration.md","REFERENCE","参考文档",10898,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fdsl-configuration.md",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fmigration-from-dsl-cron.md",5140,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fmigration-from-dsl-cron.md",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fruntime-concepts.md",15612,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fruntime-concepts.md",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fruntime-template.yaml",2286,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fruntime-template.yaml",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fstrategy-examples.md",6977,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fstrategy-examples.md",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fyaml-schema.md",6272,"https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fsenpi-trading-runtime\u002Freferences\u002Fyaml-schema.md",[104,132,154,176,200,221],{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":113,"publishedAt":44},"01M6X94YFR1XNANZ321FS661NG","supermemory","Supermemory is a state-of-the-art memory and context infrastructure for AI agents. Use this skill when building applications that need persistent memory, user personalization, long-term context retention, or semantic search across knowledge bases. It provides Memory API for learned user context, User Profiles for static\u002Fdynamic facts, and RAG for semantic search. Perfect for chatbots, assistants, and knowledge-intensive applications.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsupermemory\u002FSKILL.md",[110],{"categoryNo":111,"categoryName":112,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[106,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,28],"ai agents","memory","rag","semantic search","infrastructure","search","applications","api","knowledge","context","Art","personalization","across","learned","retention","for","persistent memory","static",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":136,"licenseFileUrl":6,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":44},"01M6X94S3K97CSK7VFF5H85ED2","wolverine-strategy","WOLVERINE v2.0 — HYPE alpha hunter. Entry-only scanner, DSL-exit-only architecture. v1.1 lost -22.7% because the scanner's thesis exit chopped 25\u002F27 trades before DSL could manage them. v2.0 removes thesis exit entirely. Scanner decides entries (score 8+, 4H\u002F1H aligned, SM consensus). DSL manages all exits (wide Phase 1 for HYPE volatility, trailing tiers starting at +15% ROE). Leverage lowered to 7x. Max 4 entries\u002Fday. 3-hour cooldown between entries. DSL exit managed by plugin runtime via runtime.yaml.","MIT","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolverine\u002FSKILL.md",[],[140,141,142,143,144,145,146,26,27,147,148,52,25,149,150,151,129,152,29,153],"strategy","wolverine strategy","architecture","alpha","Volatility","consensus","only","manage","max","leverage","hunter","at","managed","phase",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":136,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":44},"01M6X94HN3CHBM37GM2C84KT26","wolf-strategy","WOLF v6.3 — Fully autonomous multi-strategy trading for Hyperliquid perps via Senpi MCP. Manages multiple strategies simultaneously, each with independent wallets, budgets, slots, and DSL configs. 5+N cron architecture: 5 shared wolf crons (Emerging Movers 3min, SM Flip 5min, Watchdog 5min, Risk Guardian 5min, Health Check 10min) plus one DSL v5.2 cron per strategy (native Hyperliquid SL sync via dsl-dynamic-stop-loss skill v5.3.1). Same asset can be traded in different strategies simultaneously. Enter early on first jumps, not at confirmed peaks. Dynamic risk-based leverage per strategy. Requires Senpi MCP connection, python3, mcporter CLI, OpenClaw cron system, and dsl-dynamic-stop-loss skill (provides dsl-cli.py + dsl-v5.py).","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolf-strategy\u002FSKILL.md",[160],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[140,162,35,163,142,164,165,166,167,168,169,170,171,149,172,173,151,174,175,129],"wolf strategy","openclaw","health","system","python3","check","health check","stop","strategies","shared","connection","wallets","stop-loss","hyperliquid perps",{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":136,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":183,"publishedAt":44},"01M6X949FBGWWGY3YZ8N3WB3CP","wolf-howl","HOWL v2 — Hunt, Optimize, Win, Learn. Nightly self-improvement loop for the WOLF autonomous trading strategy. Runs once per day (via cron) to review all trades from the last 24 hours, compute win rates, analyze signal quality correlation, evaluate DSL tier performance, identify missed opportunities, and produce concrete improvement suggestions for the wolf-strategy skill. v2 adds fee drag ratio (FDR) analysis, holding period bucketing, LONG vs SHORT regime detection, rotation cost tracking, cumulative drift detection, and gross vs net profit factor separation. Use when setting up daily trade review automation, analyzing trading performance, or improving an autonomous trading strategy through data-driven feedback loops. Requires Senpi MCP connection, mcporter CLI, and OpenClaw cron system.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwolf-howl\u002FSKILL.md",[182],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[184,35,185,186,187,188,189,190,191,192,38,193,194,195,196,197,198,29,199,28],"wolf howl","review","performance","learn","analysis","loop","analyze","short","autonomous","optimize","drift","self","factor","loops","profit","fdr",{"skillNo":201,"name":202,"nameZh":6,"description":203,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":204,"categories":205,"keywords":206,"publishedAt":44},"01M6X9437CQ55N5AYHCPF71JWG","whale-index","Auto-mirror top Discovery traders on Hyperliquid. Scans top 50 traders, scores on PnL rank (35%), win rate (25%), consistency (20%), hold time (10%), drawdown (10%). Creates 2-5 mirror strategies with overlap checks. Daily rebalance with 2-day watch period before swaps. Use when setting up trader mirroring, copy trading, or portfolio auto-rebalancing based on Discovery leaderboard performance.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fwhale-index\u002FSKILL.md",[],[207,208,209,186,210,211,212,213,214,38,215,34,170,216,217,218,219,129,220,28],"index","whale","whale index","auth","monitoring","discovery","use","auto","daily","with","consistency","top","mirror","pnl",{"skillNo":222,"name":223,"nameZh":6,"description":224,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":136,"licenseFileUrl":6,"sourceHtmlUrl":225,"categories":226,"keywords":227,"publishedAt":44},"01M6X93YTRGNPYNHZRTW9XNH1E","vixen-strategy","VIXEN v1.0 — Dual-mode emerging movers scanner. Built from FOX v1.6 live trading data (+34.5% ROI). Two entry modes: STALKER (steady accumulation, score 6+, catches the SM buildup BEFORE the explosion) and STRIKER (violent FIRST_JUMP, score 9+, with raw volume confirmation to filter blow-off tops). 2-hour per-asset cooldown after Phase 1 exits. DSL High Water Mode mandatory.","https:\u002F\u002Fgithub.com\u002Fenuno\u002Fcrewless-capital\u002Fblob\u002Fmain\u002Fmigrate-hyperliquid-firm\u002Fskills\u002Fsenpi-skills\u002Fvixen\u002FSKILL.md",[],[140,228,229,230,231,232,27,233,234,235,216,236,237,238,239,240,241,242,29,153],"vixen strategy","roi","data","first","confirmation","volume","filter","asset","explosion","mode","high","v1","modes","emerging movers","entry"]