$npx -y skills add Senpi-ai/senpi-skills --skill senpi-account-statusShow the user's standing across Senpi programs — points and rank, loyalty tier and fees, Agents Arena position, and referral earnings. Use for "how many points do I have?", "what's my rank/tier?", "what are my fees?", "how am I doing in the Arena?", "my referral rewards". Use thi
| 1 | # Senpi Account Status — your standing across Senpi |
| 2 | |
| 3 | A hidden engine pulls the user's standing in one real-time call; **your job is to present it |
| 4 | cleanly** and point at the next milestone (next loyalty tier, Arena prize, etc.). |
| 5 | |
| 6 | ## Golden rules |
| 7 | |
| 8 | - **Run the engine; never hand-pull.** `python3 scripts/status.py` gathers points, loyalty, Arena, |
| 9 | and referral together. Read its JSON. |
| 10 | - **Real-time, not from memory.** Points/rank/Arena move — never quote a figure from earlier in the |
| 11 | conversation; re-run. |
| 12 | - **Fees come from the data, never from memory.** Quote `loyalty.fee_bps` / `fee_discount_pct` as |
| 13 | returned — the tier table changes; stale numbers mislead. (For the *full* tier table, that's |
| 14 | `get_loyalty_tiers`; this skill returns the user's *own* tier.) |
| 15 | - **Lead with what they asked, then the milestone.** If they asked about points, lead with points + |
| 16 | rank, then "X to the next tier." Don't dump every section if they asked one question — but the |
| 17 | engine returns all of it so you can. |
| 18 | - **Arena scope.** `arena.enrolled: false` means they're not in the competition — say so plainly and |
| 19 | point to senpi.ai/arena; don't report a rank they don't have. |
| 20 | - **Always end with the two CTAs** (below). |
| 21 | |
| 22 | ## How to run the engine |
| 23 | |
| 24 | ``` |
| 25 | python3 scripts/status.py |
| 26 | ``` |
| 27 | |
| 28 | Returns `{identity, points, loyalty, arena, referral, meta}`: |
| 29 | - `points` — `total`, `base` (Base copy-trading), `perp` (Hyperliquid), `multiplier`, `rank`, |
| 30 | `rank_change`. |
| 31 | - `loyalty` — `tier`, `fee_bps` + `fee_pct`, `fee_discount_pct`, `next_tier`, `points_to_next` (the |
| 32 | milestone), plus `demoted` / `previous_tier` / `maintenance_deadline` — if `demoted` is true, |
| 33 | mention the tier they fell from and that maintenance volume wins it back. |
| 34 | - `arena` — `enrolled`; if enrolled: `rank`, `roe_pct`, `total_pnl_usd`, `qualified` (hit the volume |
| 35 | threshold), `week_pool_usd`, `prize_estimate_usd` (if top-5). |
| 36 | - `referral` — `balance_usdc` (pending referral earnings, 25% of builder fee on referred trades). |
| 37 | - `meta.warnings` / `meta.degraded` — narrate honestly. |
| 38 | - Fails open — partial data still returns valid JSON. |
| 39 | |
| 40 | ## Output contract |
| 41 | |
| 42 | Lead with the section they asked about; otherwise a tight standing card: |
| 43 | |
| 44 | 1. **Points & rank** — total, base/perp split, multiplier, rank (+ change). |
| 45 | 2. **Loyalty** — current tier + fee/discount, and **`points_to_next` → next_tier** (the actionable |
| 46 | milestone). |
| 47 | 3. **Arena** — if `enrolled`: rank, ROE %, qualified-or-not, and the prize context (week pool; |
| 48 | estimate if top-5). If not enrolled: one line + the arena link. |
| 49 | 4. **Referral** — pending `balance_usdc` (and that it's claimable if > 0). |
| 50 | |
| 51 | Formatting: clean, scannable, numbers from the data; emoji sparingly (🏆 Arena, 🎯 next tier). |
| 52 | |
| 53 | ## Mandatory closing (verbatim) |
| 54 | |
| 55 | > **Want me to break down what it takes to reach the next tier (or climb the Arena)?** |
| 56 | |
| 57 | On yes: use `loyalty.points_to_next` + `get_loyalty_tiers` for the tier path, or the |
| 58 | Arena `qualified`/volume threshold + `week_pool`/prize split for the Arena path. |
| 59 | |
| 60 | ## ⚠ Token scope |
| 61 | |
| 62 | Every tool here is **USER-scoped** (the user's own account): needs a USER-scoped `SENPI_AUTH_TOKEN`. |
| 63 | App-scoped → no user resolves and `meta.degraded`; say so rather than reporting zeros. |
| 64 | |
| 65 | ## Skill Attribution |
| 66 | |
| 67 | Guide/analysis skill — it *reads* the user's standing; it does not mutate anything (claiming referral |
| 68 | rewards is a separate explicit action via `user_claim_referral_rewards`, which this skill never calls). |
| 69 | |
| 70 | |
| 71 | ## Install — both scripts are required |
| 72 | |
| 73 | The engine is **two files** in `scripts/`: `status.py` (the engine) and `mcp_client.py` (its vendored |
| 74 | MCP helper, imported at runtime). **Install the whole `scripts/` directory** — copying `status.py` |
| 75 | alone fails with `No module named 'mcp_client'`. Stdlib only, no other runtime dependencies. |