# Other World Projex: skills for AI assistants

*Version of 5 October 2026. This file is written for an AI assistant (or a human support person) who answers questions about otherworldprojex.io. It is a set of self-contained skills. Each one says when to use it, what to ask, what is true, what the common errors mean, and what **not** to say. Everything here was checked against the site's code on that date. If something here disagrees with what the user sees on screen or with the live configuration, the screen and the live configuration win, and you should say so.*

---

## 0. How to use this file

**Source-of-truth order.** (1) What the user's own screen shows. (2) The site's public configuration at `GET https://otherworldprojex.io/api/config`, if you can fetch it. (3) This file. (4) Nothing else. Never fill a gap with a guess. If you do not know, say "I can't confirm that" and point the user to the screen or the email thread.

**Live values on 1 October 2026** (they can change, so confirm when it matters):

| Setting | Live value | Code default |
|---|---|---|
| $RIBBIT per chip | 10 | 100 |
| Share of a chip purchase that is burned | 50% (the rest goes to the treasury) | 50% |
| House edge on Flip and Dice | 4% | 4% |
| Minimum / maximum wager | 100 / 100,000 chips | 1 / 1,000 |
| Lifetime spend to appear on ranked boards | 100,000 $RIBBIT | 1,000 |
| Spend inside the board's period | 100 $RIBBIT | 100 |
| Chips wagered in the period (table boards) | 100 | 100 |
| Bounty pot share of the realised edge | 50% | 50% |
| Invite required | No | Yes |
| Tables paused / chip sales paused | No / No | |
| Internet Identity sign-in / ICP chip sales / chip cash-out | Built, switched off. Confirm `icpSignInEnabled` and `icpBuyOpen` in `/api/config`; cash-out has no public flag (the Account page shows a **Cash out chips** panel only when it is on). | Off |

**Words.** *Chips* (called *credits* in some places) are the table-game currency. They can be bought with $RIBBIT or (when open) ICP, and today they cannot be cashed out: cash-out is built but switched off, with no date (Skill 19). The *bidding balance* is deposited $RIBBIT used for auctions and can be withdrawn. *$RIBBIT in the wallet* is the user's own token. Keep these three apart in every answer. *ICP* is the Internet Computer's native token; it is only ever a payment rail for chips (Skill 19), never a balance the site holds for the user.

**Global rules for every answer.**

1. You cannot see the user's account, balance, or transactions, and you cannot move anything. Ask them to read values off their screen.
2. **Never ask for a seed phrase, private key, password, or recovery phrase, and tell the user never to share one.** A transaction signature, a wallet's public address, a screenshot, and the time are fine to ask for. **Never ask a user to paste a claim code into the chat**: it is a bearer token for a physical prize, and anyone who sees it can redeem it.
3. The only official address is https://otherworldprojex.io. Do not give or endorse any other address for connecting a wallet. The team never DMs links.
4. Do not give financial, tax or legal advice, and do not predict returns. The site's own notice: games are for entertainment, and $RIBBIT is a memecoin with no promise of financial return. You can explain how things work and what the rules are.
5. Do not describe anything in Skill 18 ("not built yet") as available. Say it is not available yet, and that the roadmap page shows its status.
6. There is **no published support channel**. For any problem you cannot solve, tell the user to reply to the email they received from the project (or the email that carried their claim code). Do not invent a Discord, Telegram or support address.
7. If a user describes lost funds, an unexpected transaction, or a payout that looks wrong: collect the wallet address, the transaction signature(s), the time, and a screenshot, tell them not to retry anything repeatedly, and send them to the email thread. Do not speculate about fault.

---

## Skill 1: owp-orientation

**Use when** a user asks "what is this site", "where do I find X", or you need to route a question.

**What exists.** A public site with these pages: Home, About, Games (Flip, Dice, Blackjack, plus the arcade games Hopper, Frogris and Worm Frog), Fairness, Leaderboard, Bounties, Auctions (and Apply), Reserve, Redeem, Staking, Tools, Treasury, Waitlist, Tournament, Poker, Roadmap, Whitepaper, Account (sign-in required), Unsubscribe.

**Sign-in options:** a Solana wallet message signature (always), or, when the house has switched it on, Internet Identity (Skill 19). An Internet Identity account has no Solana wallet unless the user adds one.

**Without signing in:** view all public pages, play Sandbox with practice chips, play unranked arcade practice, use read-only tools, join the waitlist or tournament list (these need a wallet signature), redeem a claim code.
**Needs sign-in:** account, buying chips, live tables, bidding, deposit and withdraw, consigning, the Reserve ownership ledger, the fairness seed panels.

**Route table.** Games question → Skills 5 and 6. "I paid and got nothing" → Skill 3. Money in or out → Skill 4. Prizes → Skills 8 and 10. Auctions → Skill 9. Staking tier → Skill 11. Wallet safety → Skills 12 and 16. Poker → Skill 14. ICP, Internet Identity sign-in, paying with ICP or cashing out chips → Skill 19. A feature that may not exist → Skill 18.

---

## Skill 2: owp-connect-and-sign-in

**Use when** the user cannot connect, cannot sign in, or asks how sign-in works.

**Facts.**
- Any Solana wallet that exposes the wallet standard and supports `signMessage` is offered (Phantom, Solflare, Backpack are the ones the code names). Hardware wallets are untested: say so.
- Flow: Connect wallet → Sign in (or Join when an invite is needed) → approve a message that starts "Other World Projex — sign in". It states that it only proves ownership and authorises no transaction. It costs nothing.
- The challenge expires in 5 minutes. The session is a 7-day cookie (`owp_session`, HttpOnly). Switching the wallet to another address signs the user out. **Sign out & disconnect** is in the wallet menu.
- Invites: needed only to create a new account, only when the site is invite-only (live: not required). Codes look like `OWP-XXXX-XXXX`, case-insensitive. Existing users skip it.
- Bans are checked on every request.
- **Internet Identity sign-in** is a second way in, only when the house has switched it on (the **Internet Identity** button next to Connect wallet; needs `ICP_LINK_CANISTER_ID`). Details and errors are in Skill 19. If a user cannot see that button, the house has not switched it on: say so and do not suggest a workaround.

**Errors.**

| Message | Meaning | Action |
|---|---|---|
| Connect a wallet that can sign messages first. | Wallet lacks `signMessage`. | Use a supported wallet. |
| Sign-in cancelled in your wallet. | User declined. | Try again. |
| Sign-in failed — signature couldn't be verified. / Signature verification failed | Bad or stale signature. | Retry; make sure the same wallet address is active. |
| Invite required — enter an invite code to join | Gate on, new account. | Ask for a valid code. |
| Invite code invalid — it may be used up or disabled | Wrong, used up, or disabled code. | Try another. |
| This wallet is suspended | Account is banned. | Reply to the project email thread. |
| Too many attempts — give it a moment and retry | Rate limit (nonce 30/min, verify 20/min per IP). | Wait a minute. |
| Couldn't start sign-in — try again in a moment. | Temporary auth failure. | Retry. |

**Do not say** that signing in can move funds, or that a wallet extension "needs your seed phrase" for sign-in. If the wallet asks to approve a *transaction* at sign-in, tell the user to decline.

---

## Skill 3: owp-buy-chips

**Use when** the user wants chips, or paid and did not receive them.

**Facts.**
- One signed wallet transaction does three things: creates the treasury's $RIBBIT token account if missing, **burns** the burn share, and **sends** the rest to the treasury. Live split 50/50.
- Chips = floor(amount ÷ price). Any remainder is spent without credit, so recommend multiples of the price. Minimum purchase = one chip's price (live 10 $RIBBIT). Quick buttons offer 1,000, 5,000 and 10,000.
- The user needs enough $RIBBIT plus about 0.005 SOL for network fees.
- The server verifies the transaction at "confirmed" commitment, and the page retries up to 4 times, 5 seconds apart. The pending signature is saved in the browser for 7 days and re-checked when Games is reopened. A **Paid but credits didn't arrive?** box accepts a pasted signature.
- Each signature can be credited **once** across buys, burns and deposits.
- Chips do not convert back to $RIBBIT by default. Chip cash-out is built but switched off (Skill 19), so unless the user's Account page shows a **Cash out chips** panel, say they cannot be cashed out and give no date.
- This skill covers paying with $RIBBIT. Paying with ICP is Skill 19.
- Pure burn-only is disabled once a treasury exists.

**Procedure for "I paid but have no chips".** (1) Ask them to reopen Games signed in with the *same wallet* and wait for the retry. (2) Ask for the transaction signature (from the wallet's activity or a block explorer) and have them paste it in the recovery box. (3) If the message is "This purchase was already credited", it already was, so check the chip count on Account. (4) If the message is "Could not verify a $RIBBIT burn + treasury payment by your wallet in that transaction", the transaction either was not a site purchase or was signed by another wallet. (5) If still stuck, escalate (Global rule 7).

**Errors.** "Buy at least X $RIBBIT for 1 credit" (below minimum). "Treasury share is below the required split" (the transaction did not follow the live split, usually a stale page; reload). "Not enough $RIBBIT" / "Not enough SOL for the network fee" (client messages). "Chip sales are paused — back shortly" (house paused sales, HTTP 423). "Buying chips isn't available yet" (no treasury configured).

---

## Skill 4: owp-bidding-balance

**Use when** the user asks about depositing, withdrawing, "locked in bids", or why chips cannot be withdrawn.

**Facts.**
- The **bidding balance** is $RIBBIT deposited for auctions plus consignment proceeds. It shows in the wallet menu with "Locked in bids".
- Deposit: send $RIBBIT to the treasury's token account through the deposit button. Credited 1:1. UI minimum 1 $RIBBIT. A deposit that times out on the Auctions page has no automatic replay, so ask for the signature and escalate.
- Withdraw: the button sweeps the entire unlocked balance (the API accepts partial amounts but the UI does not offer them). Minimum 1 $RIBBIT unless sweeping everything. At most 10 requests per hour. The balance is reduced immediately. The request is `pending`, then `processing`, then `sent` (with an explorer link) or `rejected` (amount returned to the balance). A person pays it **by hand** from their own wallet. "Usually within a day" is the site's stated expectation, not a guarantee. The site deducts no fee.
- When payouts are paused by the house the user sees no banner. If a withdrawal is slow, say it may be paused and escalate rather than assuring a date.
- **Chips are separate and are not part of the bidding balance.** They cannot be withdrawn through it. Chip cash-out is its own feature (Skill 19) and is off today.

**Error.** "Minimum withdrawal is 1 $RIBBIT — or withdraw your full balance in one go." "Insufficient deposited $RIBBIT — deposit more to bid" (bidding).

---

## Skill 5: owp-table-games

**Use when** the user asks how Flip, Dice or Blackjack work, what they pay, or why a win paid less than expected.

**Limits.** Wager per round must be between the live minimum and maximum (live 100 to 100,000 chips; error "Wager must be between X and Y credits", HTTP 422). When tables are paused: "The tables are paused — back shortly" (HTTP 423); new rounds stop, an open blackjack hand can finish. Rate limits: Flip and Dice 60/min, Blackjack 120/min. Guests use a Sandbox with practice chips kept in the browser.

**Frog Flip.** Choose frog or fly. Roll r in [0,1). Landed = frog if r < 0.5 else fly. Win pays `floor(wager × 2 × (1 − edge))` (total return, stake included). At 4%: 1.92×.

**Pond Dice.** Target is an integer 2 to 98. `rolled = floor(r × 10000) / 100` (0.00 to 99.99). Win if `rolled < target`. Win pays `floor(wager × (100 / target) × (1 − edge))`. At 4%: target 50 → 1.92×, target 2 → 48×, target 98 → about 0.98×, which means a one-chip win at a very high target can floor to 0.

**Blackjack.** Single deck, new shuffle every round. Dealer stands on all 17 including soft 17 and checks for a natural at the deal. Natural pays 3:2 (`floor(wager × 2.5)` total). Push when both have a natural. Actions: hit, stand, double (any first two cards, also after a split), split once on a pair of the same rank (one card each on split aces; a 21 after a split pays 1:1). No insurance, no surrender. Double or split stakes one more base wager. Hands survive a page refresh.

**The flat house edge applies to Flip and Dice only.** Blackjack uses the standard payouts above. Do not tell users blackjack has a 4% edge.

**Rounding.** Payouts are floored to a whole chip, so small wagers lose slightly more than the headline edge suggests. This is how the code works, and it is disclosed here so it is not a surprise.

**Worked examples.** Flip, wager 1,000, win at 4% edge: payout `floor(1000 × 1.92) = 1920`, net +920. Dice target 25, wager 1,000, win at 4%: multiplier 3.84, payout 3,840. Dice target 13, wager 65, 4% edge: the true payout is exactly 480, but the code computes the multiplier in floating point (7.384615384615384), gets 479.99999999999994, and floors it to **479**. This happens in roughly 0.34% of winning dice rounds at a 4% edge and always costs the player one chip.

**Do not say** that results can be predicted, that a streak makes a win more likely, or that any strategy beats the edge.

---

## Skill 6: owp-verify-fairness

**Use when** a user wants to check a Flip, Dice or Blackjack round. All three are provably fair by commit and reveal.

**How it works.** The server holds one random 32-byte seed per user (stored as a 64-character hex string) and shows only `SHA-256(seed text)`. Each round `n` uses `HMAC-SHA256(key = seed text, message = "<clientSeed>:<nonce>")`. The seed string is used **as text (UTF-8)**, not decoded into bytes, and the commitment hash is also of the **text**. The nonce increases by 1 per round (per deal for blackjack). The client seed is stored in the browser (`owp-client-seed`), editable on Fairness, 1 to 64 characters.

**Roll.** Take the first 8 hex characters of the digest, read as an integer, divide by 2³². That gives `r` in [0,1).

**Test vector** (confirmed against the site's own function): seed text `a1` repeated 32 times (64 characters), client seed `my-seed`, nonce `7`. Commitment starts `3490f80401886d12`. Roll `r = 0.24864928028546274`. As Dice, `rolled = 24.86`. As Flip, `r < 0.5` so it lands frog.

```python
import hmac, hashlib, math
seed = "a1"*32; client = "my-seed"; nonce = 7
print(hashlib.sha256(seed.encode()).hexdigest()[:16])        # commitment prefix
d = hmac.new(seed.encode(), f"{client}:{nonce}".encode(), hashlib.sha256).hexdigest()
r = int(d[:8], 16) / 2**32
print(r, math.floor(r*10000)/100)                             # roll, dice value
```

**Blackjack deck.** Start with `deck = [0,1,…,51]`. For `i` from 51 down to 1: digest = `HMAC(seed text, "<clientSeed>:<nonce>:<51 − i>")`, `r` as above, `j = floor(r × (i + 1))`, swap `deck[i]` and `deck[j]`. Card `c`: rank = `c mod 13` (0 to 12 mean 2…10, J, Q, K, A), suit = `floor(c / 13)`. Deal order: player, dealer, player, dealer (hole card); hits then continue from the fifth card (deck position 4).

**Procedure.** (1) The user presses **Reveal my seed & verify my rounds** on Fairness (this retires the active seed and reveals it; new rounds use a new committed seed). (2) The page auto-checks Flip and Dice (✓ or ✗) and offers **Check deck →** for blackjack. (3) For an independent check, take the revealed seed, confirm its SHA-256 equals the commitment shown *before* the rounds, then recompute the rolls.

**Limits.** The page lists up to 10 revealed seeds and up to 500 rounds. **Reveal is refused while a blackjack hand is open**, and the page currently fails silently when that happens; tell the user to finish the hand and try again. Rounds are only checkable once their seed is revealed. Arcade games are not commit-reveal games: they are skill games, verified by replaying the submitted input trace on the server. The poker room has a separate shuffle on the Internet Computer, and the Fairness page does not yet explain or prove it.

**Do not say** that the house cannot cheat in the arcade or in poker on the basis of this skill. Say precisely what is verifiable: Flip, Dice and Blackjack rounds after reveal.

---

## Skill 7: owp-arcade-and-ranked

**Use when** the user asks about Hopper, Frogris, Worm Frog, scores, ranked status, or the leaderboard.

**Facts.**
- Free, no chips. Signed-in players get ranked runs; guests play unranked.
- A run token is valid 30 minutes. Starting a new run voids the previous unsubmitted run (a second tab voids the first: "A newer run was started — this one is void").
- Submission includes an input trace; the server replays it. Rejections: "Run too short to be real" (under 10 seconds), "Score does not match the replayed run", "Run replayed faster than real time allows", "Replay rejected: …".
- Daily limit: 40 accepted scores per wallet per game per UTC day. Error "Daily ranked-run limit reached — back tomorrow, hunter" (429).
- If the arcade is paused: "The arcade is paused — back shortly", and the page shows unranked play.
- **Ranked eligibility** (to appear on boards and be paid by bounties): lifetime spend (buying chips plus pure burns) at least the live threshold; spend inside the board's period at least the live window amount; and for table boards, at least the live minimum chips wagered in the period. Eligibility is computed when the board is read.
- Boards: top 20 eligible wallets, shortened, for "This week" (rolling 7 days) or "All time". Arcade boards rank by best score, table boards by net chips. "Staker" mark shows for any open stake.

**Do not say** that a high score guarantees a prize. Bounties pay only eligible wallets, pro rata, when the bounty's conditions are met.

---

## Skill 8: owp-bounties

**Use when** the user asks how prizes work, why a pot has not paid, or where a prize is.

**Table bounties (Flip, Dice, Blackjack).** Each chip wagered on that table after the bounty opens adds `bountyPotShare × houseEdge × (1 − burnShare) × $RIBBIT-per-chip` to the pot (live: 0.5 × 0.04 × 0.5 × 10 = 0.1 $RIBBIT per chip; confirm on the bounty page). The pot starts at an admin seed. When it reaches the prize, it pays every eligible player who is **net positive** over the bounty window, in proportion to their net chips won. If the deadline passes unfilled, it closes unpaid and a new one may open (auto-renew). Table bounties also need the volume rule from Skill 7.

**Arcade bounties.** Pay weekly at the deadline, pro rata to best score among eligible wallets with a positive score; then a new week opens. "No live episode right now" means none is open.

**Payment.** Settlement is automatic when the house has automatic settlement switched on. The $RIBBIT transfer is made **by a person** from the admin screen, in the same queue as withdrawals. Account shows the prize as **pending → paying out → paid** (with an explorer link), or **on hold** if the house rejected it. A bell notification says "Your prize is queued for payout." (One notification text for rejected prizes says "refunded to your balance"; that is wrong, and a rejected prize is not refunded. Call it "on hold".)

**Live standing.** Account shows "Your live bounty standings" (rank, projected share, or "not eligible — …").

**Physical prizes.** Winners receive a claim code for Skill 10.

**Do not say** that prizes are instant, that staking improves odds, or that a losing or break-even table player can win a table bounty.

---

## Skill 9: owp-auctions

**Use when** the user asks about bidding, selling, commissions, or an auction result.

**Facts.**
- Marked **Beta**. Lots are house lots, member consignments approved by the team, and Reserve claims listed for resale.
- Tabs: Live, Ending soon (under 1 hour), Past. Lists refresh every 10 s, a lot page every 5 s.
- Bidding: needs enough bidding balance. First bid ≥ start bid; later bids ≥ current bid + minimum increment ("Bid must be at least X $RIBBIT"). The **full bid is locked at once** and released the moment the user is outbid. A top bidder cannot raise their own bid ("You are already the highest bidder"). Bids cannot be withdrawn. Simultaneous bids can return "Someone bid at the same moment — retry".
- Anti-snipe: a bid with under 2 minutes left extends the end by 2 minutes.
- Settlement happens when the lot is read after its end. The winner's locked amount is consumed. For a member's consignment the seller's bidding balance is credited with the price minus the marketplace commission (default 2.5%, 0 to 25%, reduced for stakers by tier). A lot with no bids is cancelled. The winner gets an "Auction won" notification, and the house tells them about delivery. There is no delivery tracking on the site.
- **The site's Apply page says the winner's money is held by the house until delivery. The code credits the seller at settlement with no delivery hold.** Do not repeat the escrow promise; say the seller is credited at the end of the auction.
- Consigning: signed-in users apply at Auctions → Apply with title (3 to 80 characters), description (10 to 2,000), category (collectible, NFT, merch, service, other), opening bid, photo (JPEG, PNG, WebP or GIF, up to 4 MB) and optional contact. At most 3 pending applications. The team approves or rejects. Approved lots run 72 hours by default (up to 14 days), minimum increment about 5% of the opening bid. Status shows on Apply and Account. The code stores a review note but no screen was found that shows a rejection reason to the applicant, so do not promise one.

---

## Skill 10: owp-reserve-and-redeem

**Use when** the user asks about the Reserve, claim codes, delivery, or reselling a claim.

**Facts.**
- The Reserve is the set of real items the project holds. `/reserve` is public (photo, description, status Unclaimed/Claimed/For sale, category, **declared value**, which is a record, not a price or payout). Signed-in users also see the ownership ledger. Early access for higher staking tiers is off unless the house enables it.
- **Claim code** format: ten characters shown `XXXXX-XXXXX`, case-insensitive, from the alphabet `23456789ABCDEFGHJKMNPQRSTVWXYZ` (no 0, O, 1, I, L, U).
- **Redeem** (`/redeem`, no account needed for the post option):
  - *Post it to me:* code, full name, street address, apartment (optional), city, state (optional), postcode, country, email (optional), notes (optional). Name and address are collected only to post the item.
  - *Keep it in the Reserve:* needs wallet sign-in, no address collected.
  - Messages: "We don't recognise that code. Check it against the one you were sent."; "That code doesn't look right. Check it and try again."; "That code has already been redeemed. If that wasn't you, reply to the email you received and we'll look into it."; "Name, street address, city, postcode and country are all needed to post a coin."
  - The site does not check a code until the form is submitted.
  - Tracking is recorded by a team member and is **not emailed automatically**.
- Holders with items see **Your pieces**: **Send it to me** (request delivery with an optional note) and **Sell the claim** (auction: start bid default 1,000, increment 100, 1 to 336 hours; the claim transfers at settlement; no user cancel). The delivery screen says it uses the address from the original claim, but a claim kept in the Reserve or won at auction has no address on file and the screen does not ask for one, so escalate (Global rule 6).
- **Privacy.** Ledger notes can be seen by other signed-in users. Tell users not to put addresses in notes.

**Do not say** that the Reserve can be bought from, that $RIBBIT can be traded in for an item, or that shipping is available to any particular country. No shipping options, rates or country list exist in the code.

---

## Skill 11: owp-staking-tiers

**Use when** the user asks about staking, tiers, or discounts.

**Facts.**
- `/staking` is read-only. It shows the Streamflow pool (total staked, reward rate, lock-up, stakers, funded rewards, run-out date) and, if signed in, the user's stake, unlock date, tier and distance to the next tier. **Stake on Streamflow →** opens Streamflow. The site never holds staked tokens or signs a stake for the user.
- Tier comes from the sum of the wallet's open stake entries in that one pool. Nothing is stored. The snapshot is cached 60 s, so a change appears within about a minute.
- Default thresholds: **Keeper 250,000, Curator 1,000,000, Warden 5,000,000** $RIBBIT (admin-tunable; the page shows the live ones).
- Benefits are discounts and access only: a share of the maximum waiver on the marketplace commission when the member **sells** (a third, two thirds, all; with the default 2.5% commission and 50% maximum waiver that is about 2.08%, 1.67%, 1.25%), a flat basis-point cut on future Reserve purchases (not usable yet because no Reserve shop exists), and an optional early-access window to new Reserve items (off by default). They are **never** a payout, extra chips, or better odds.
- Any open stake, even below Keeper, shows a "staker" mark.
- **LP dashboard access (live since 3 October 2026).** Curator and above can sign in at https://lp.otherworldprojex.io/member/login with the staking wallet (a free signed message, no transaction). Members see their own Meteora LP positions (up to 10 wallets), the market scanner, LP reputation, wallet alerts and creator history, and can export data for their own AI or create read-only API keys. Wallets can also be invited whatever they stake: by the project, or by a Warden (up to 5 each). Access is rechecked about every 10 minutes. Members never see the project's own wallets.
- The one-page summary of all of this, printable, is https://otherworldprojex.io/membership.
- In-house staking (and any "99.9% APR" idea) is **not built** and is waiting on legal review. Do not mention rates other than what the Staking page shows live.

---

## Skill 12: owp-tools

**Use when** the user wants to inspect or clean up a wallet.

**Facts.**
- Read-only and no signing: **Epoch countdown**, **Wallet inspector** (paste an address; 20 requests per minute per IP), **Stake accounts** (paste an address; 8 per minute per IP).
- Needs a connected wallet: **Revoke approvals** (unrecognised delegates only; staking positions are excluded) and **Reclaim rent** (closes empty token accounts and returns the SOL deposit). Each first **simulates**; the sign button appears only after "Check what this will do" succeeds, and changing the selection discards the simulation. Up to 10 instructions per transaction, so large clean-ups need several signatures.
- Neither tool moves tokens. Merge/split/withdraw stake tools are not built.
- A red "This is not the real site" banner appears when the address bar does not match the configured official address. Treat it as real. (It only works if that address is configured.)

---

## Skill 13: owp-waitlist-and-tournament

**Use when** the user asks about the airdrop queue or the Hold'em tournament sign-up.

**Waitlist.** Needs at least **250,000 $RIBBIT** in the wallet (live setting, checked on chain, nothing locked). One message signature, no invite needed. Shows a position, referral count and referral link (`?ref=<wallet>`). Goal 1,000 members; the airdrop is described as guaranteed once the list is full, but **no amount has been set anywhere**. Errors: "The waitlist needs N $RIBBIT held in your wallet. You're holding X." and "Couldn't read your $RIBBIT balance from the chain — try again in a moment." Closed state: "Sign-ups closed" (existing places unaffected). Anyone can look up a wallet's place.

**Tournament sign-up.** Needs a wallet (and a message signature if not signed in), an email, an optional table name (up to 24 characters) and a **tester** checkbox (default on). Resubmitting with the same wallet updates details. The same email cannot be used with a different wallet (409 "That email is already signed up with a different wallet"). The page shows a signed-up count. No automatic confirmation email is sent; the team writes to the stored emails later. The tester airdrop amount is not quoted. **Treat the date shown on the page as provisional** (the project has said it may move; the page's weekday has been inconsistent with the calendar).

---

## Skill 14: owp-poker

**Use when** the user asks about poker.

**Facts.**
- `/poker` on the main site is a doorway. It checks the wallet holds at least the minimum (default 1,000 $RIBBIT; nothing is spent or locked; re-checked at each visit), then links to the room on the Internet Computer. "The table isn't open yet" means the link is not configured. If the balance cannot be read, it says so.
- The room uses **Internet Identity** (Google, Apple, Microsoft or a passkey). It is a separate identity from the Solana wallet. Poker profiles and chips are **not connected** to a main-site account.
- Inside the room: cash tables and bot games, sit-and-go, mini-tournaments and multi-table tournaments (still being proven; treat as test events), a lobby, leaderboard, public ledger, a basic profile (username, bio, avatar), and per-table chat.
- Chips in the poker room are play chips with no cash value today. There are no deposits or withdrawals.
- Video and voice at tables is experimental and not recommended. Table chat is basic and unmoderated.
- The Fairness page on the main site does **not** cover the poker shuffle, even though the doorway page mentions it.

**Do not say** that poker chips can be cashed out, that a poker profile links to X or Facebook, or that a poker result is provably fair in the sense of Skill 6.

---

## Skill 15: owp-account-and-notifications

**Use when** the user asks about Account, badges, the bell, emails, or unsubscribing.

**Facts.**
- Account shows chips, bidding balance, locked in bids, Buy chips, staker line, badges, live bounty standings, bounty winnings, bids (leading / outbid / won), withdrawals, consignments, recent rounds (last 25 settled; 8 shown). It polls every 30 s.
- **Promo eligibility panel** (below the stats on Account). It is a checklist, not a profile and not visible to other members. Rows: **Wallet** (connected and signed in), **Email** (enter an address, receive a code, enter it; verified when done), **Mailing address** (line 1, optional line 2, city, optional state, postcode, country; complete when line 1, city, postcode and country are present), **X (Twitter)** (OAuth sign-in with X; the numeric X id is stored), **Internet Identity (ICP)** (links one ICP principal through a relay canister). A badge shows "n/4 linked" and becomes "eligible" when email, address, X and ICP are all done. Each email, X id and ICP principal can be linked to **one** wallet only. If the house has not configured X or ICP the row says "Not configured yet." and the user cannot proceed on that row (do not suggest a workaround). The panel itself grants nothing. The 100,000 $RIBBIT for a 1 oz silver coin promotion requires all four; the redemption flow for it is not built yet, so do not tell users how to claim it. Point them to the announcement.
- **Cash out chips panel** appears only when the house has switched cash-out on (Skill 19). **Promo eligibility** "Internet Identity (ICP)" is a *link* step for promotions; it is separate from signing in with Internet Identity and from the ICP payout address.
- Bell items: Bounty won; Prize paid or Withdrawal sent; Withdrawal declined; Auction won. Window 60 days, 30 items. "Seen" is stored in this browser only.
- Badges: First Blood (settle 1 round), The Regular (50 rounds), Exterminator (arcade score ≥ 300), Card Shark (net +100 chips at blackjack), High Roller (single payout ≥ 100 chips), Ranked Hunter (meets lifetime spend threshold), Torch Bearer (spend ≥ 10,000 $RIBBIT), Gavel Hand (win an auction).
- Email is sent only by admin broadcasts and operator alerts. Each email has an unsubscribe link: it shows a masked address, one confirm, then "Done — you're unsubscribed". A bad link says "That link didn't work"; advise replying "unsubscribe" to any email. Unsubscribing does not change a waitlist or tournament place.
- **Treasury page** shows live balances, burned total, prizes paid, wagered volume, chips sold and the last 15 events. It deliberately shows no profit figure.
- The site has **no public profile** (no handle, avatar or bio), **no followers or messages**, and **no social login**. X linking exists only as a promo-eligibility step (see the Promo eligibility panel above), and Facebook linking does not exist (Skill 18).

---

## Skill 16: owp-safety-and-scams

**Use when** a user is unsure whether something is genuine, reports a suspicious message, or asks how to stay safe.

**Rules to state plainly.**
- The only official address is https://otherworldprojex.io. Bookmark it. Clone sites copy the tools page because people trust it.
- Signing in is a *message* signature and costs nothing. Approving a *transaction* happens only when the user chooses to buy chips, deposit, or run a Tools action.
- Nobody from the project will ask for a seed phrase or private key, ask a user to "verify" a wallet by pasting one, DM a link to connect or claim, or ask for a payment to release a prize or airdrop. Prizes are paid *to* users.
- Claim codes are only for the Redeem page. Do not share a code publicly.
- A "Connect your wallet to claim" message from anyone is the scammer's standard line. Airdrops are announced only on official channels.
- If someone has already signed something suspicious, tell them to stop, move remaining assets to a fresh wallet using a clean device, revoke approvals with a trusted tool, and **not** to share keys with anyone offering to "recover" funds.

---

## Skill 17: owp-troubleshooting

| Symptom | Likely cause | What to do |
|---|---|---|
| Wallet won't connect | Wallet not detected or locked | Unlock, reload, try another supported wallet |
| "Connect a wallet that can sign messages first." | Wallet can't sign messages | Different wallet |
| Signed out suddenly | Session expired (7 days) or the wallet address was switched | Sign in again with the intended address |
| Paid for chips, balance unchanged | Verification not finished or wrong wallet | Skill 3 |
| Can't buy chips | Sales paused, or no treasury configured | Wait; message "Chip sales are paused" is the house's choice |
| "Wager must be between X and Y" | Outside live limits | Choose within the limits |
| "The tables are paused" | House paused new rounds | Wait; blackjack hand in progress can finish |
| A win paid less than the multiplier suggested | Rounding down, or the edge | Skill 5 |
| Reveal seed button does nothing | An open blackjack hand | Finish the hand, retry |
| Arcade run not counted | Newer run elsewhere, under 10 s, mismatch, or daily limit | Skill 7 |
| Not on the leaderboard | Eligibility not met | Skill 7 |
| Prize shows "on hold" | House rejected the payout | Escalate (Global rule 7) |
| Withdrawal slow | Paid by hand; payouts may be paused | Escalate if beyond several days |
| Auction bid fails | Not enough bidding balance, below minimum, already top bidder, or race | Skill 9 |
| Claim code rejected | Typo, voided, already used | Skill 10 |
| Tournament sign-up says email in use | Same email on another wallet | Use the original wallet or another email |
| Poker button says table isn't open | Link not configured yet | Wait for the announcement |
| Poker asks for a different login | Internet Identity is separate | Skill 14 |
| No Internet Identity button | House hasn't switched it on | Skill 19; no workaround |
| "This needs a Solana wallet. Add one on your Account page first." | ICP-only account using a wallet-only action | Skill 19: Add a Solana wallet, or explain it can't be done without one |
| Sent ICP, no chips | Not yet seen, or ICP sales closed/paused, or wrong address/token | Skill 19 |
| No Cash out chips panel | Cash-out is switched off | Skill 19; no date |

---

## Skill 18: owp-not-built

**Use when** a user asks for any of the following. Say it does not exist yet, name what does exist instead, and point to the Roadmap page for status.

| Asked for | Reality on 4 October 2026 |
|---|---|
| A member profile (handle, avatar, bio, public page) on the main site | Does not exist. Account is an activity ledger plus a private Promo eligibility checklist. |
| Linking X (Twitter) or Facebook | **Facebook: does not exist.** **X:** a link exists on the main site only as a step in the Promo eligibility panel, and only once the house has configured it (otherwise "Not configured yet."). It is not a sign-in method and does not create a profile. In poker the "X handle" field is typed text that nothing verifies or displays. |
| One identity across the site and the poker room | Does not exist. The main site (wallet signature, or Internet Identity sign-in when switched on) and the poker room's own Internet Identity login are separate identities and are not linked. |
| Chat or video on the main site, followers, friends, direct messages | Does not exist. Poker has table chat and an experimental video panel. |
| Buying from the Reserve, a $RIBBIT trade-in, selling coins | Not built. The Roadmap page lists the trade-in as Planned. (Before the 2026-10 copy fix it said Live, which was wrong; if a user quotes "Live", the code still has no trade-in.) |
| In-house staking or a fixed APR | Not built; waiting on legal review. Only the Streamflow pool exists. |
| Cashing out chips | Built, **switched off**, no date and no promise (Skill 19). Without a **Cash out chips** panel on Account, chips cannot be cashed out. |
| Poker deposits or withdrawals, or converting poker chips to tokens | Do not exist. |
| Automatic tracking emails | Do not exist; a team member records tracking. |
| Terms of service and privacy policy pages | Not live yet (the site's `/terms` and `/privacy` return "not found"). |
| A support contact address, Discord or Telegram on the site | None published. Reply to the project's email. |
| Community rigs (running the LP data on your own machine) | Designed, not built. Members' access to the LP dashboard itself is live: see the Staking skill and https://otherworldprojex.io/membership. |
| Merge, split or withdraw stake accounts in Tools | Not built. |
| Multi-table tournaments with real prizes at scale | Present in the poker engine but still being proven. Do not promise them. |

---

## Skill 19: owp-icp-mode

**Use when** the user asks about Internet Identity sign-in, accounts without a Solana wallet, paying for chips with ICP, an ICP deposit address, or cashing chips out (to $RIBBIT or ICP).

**State of play (5 October 2026).** All of this is built and **switched off** until the house turns it on. Never describe a piece as available unless the user's screen shows it. Never give a date or promise a launch. Switches: Internet Identity sign-in needs the house to configure it (`icpSignInEnabled` in `/api/config`); ICP buying shows only when `icpBuyOpen` is true; cash-out is off and the **Cash out chips** panel on Account is hidden while it is off.

**Internet Identity sign-in.**
- The **Internet Identity** button sits next to **Connect wallet** when switched on. Internet Identity's own window opens; after approval the site says "Signed in with Internet Identity". Nothing is signed on a blockchain and there is no fee.
- The account has **no Solana wallet** unless the user chooses **Add a Solana wallet** in the wallet menu. That can be done once and cannot be changed or removed. If that wallet already has an account the answer is "That wallet already has its own account. Accounts can't be merged automatically — contact the team if you need them joined." and "This account already has a Solana wallet, and it can't be changed here."
- Wallet-only actions (buy chips with $RIBBIT, burn, deposit or withdraw $RIBBIT, apply to consign) answer "This needs a Solana wallet. Add one on your Account page first."
- Internet Identity gives each website address its own identity. The account is tied to the identity for the official address, so users should sign in only from https://otherworldprojex.io. Never say it is the same identity as the poker room's login or the promo-eligibility Internet Identity link.
- Sign-in errors: "Internet Identity sign-in isn't available yet" (not switched on); "That sign-in expired — start again."; "The canister hasn't seen that sign-in yet — finish the Internet Identity prompt first."; "Couldn't reach the Internet Computer — try again in a moment."; "This account is suspended"; "Invite required — enter an invite code to join"; "Invite code invalid — it may be used up or disabled"; "Sign-in couldn't be verified".

**Paying with ICP.**
- Games shows **Pay with $RIBBIT** and **Pay with ICP** tabs when ICP buying is open (ICP-only accounts see only ICP). The ICP tab gives the user **their own deposit address**: a 64-character hexadecimal "account ID", unique to the account. Send native **ICP** only. The panel has Copy.
- Chips arrive on their own. The open page checks about every 12 seconds; the site also scans in the background about every 5 minutes for users who opened the panel in the last 30 minutes. The user signs and connects nothing.
- Credit is for the amount that actually arrived on the ledger, at the price in force when the site credits it. Chips = floor(ICP ÷ price per chip). The remainder is kept and added to the next purchase. The ICP ledger fee (0.0001 ICP) is charged by the ledger on the transfer, so the arriving amount can be slightly less than the user typed if an exchange deducts it.
- Each ledger block is credited once. ICP sent while sales are closed or paused waits on the ledger and is credited when sales reopen, at the price then.
- ICP sales open only when: the house has set the treasury, ICP sales are switched on, chip sales are not paused, and the ICP price has been set and refreshed within the house's maximum age. Messages: "Buying chips with ICP isn't open yet."; "Chip sales are paused — back shortly."; "ICP sales are paused while the price is refreshed. ICP you've already sent is safe and is credited once sales reopen."
- Not refundable once credited. Tokens other than ICP sent to the address cannot be recovered; say so, do not promise recovery.
- Procedure for "I sent ICP and got nothing": (1) Was it **ICP** to the **long account ID** shown on their own Games page? (2) Keep the page open for a minute. (3) Are sales open (see messages)? If not, it will be credited later. (4) If an exchange sent it, ask the amount actually received and the time; the exchange may have taken time or deducted a fee. (5) Do not ask them to send again. Ask for their deposit address, amount, time and a ledger block number if they have one, and send them to the project email (Global rule 7).

**Cashing out chips (switched off).**
- If there is no **Cash out chips** panel on the user's Account page, say: "Cash-out exists in the code but is switched off, and I can't give a date. Today chips can't be cashed out." Do not call it coming soon, planned for a date, or guaranteed.
- If the panel is shown, you may explain its rules, always telling the user to read the live numbers off the panel. Defaults: minimum 10 chips; fee 2%; only chips the user **bought** qualify; the user must have wagered at least as many chips as they bought (the play-through; the house can set a higher multiple or none); account at least 24 hours old; a saved payout address at least 24 hours old (a Solana wallet's link time for $RIBBIT payouts); at most 200 chips a day and 500 a week per person; a site-wide daily cap per payout type; and the site declines a request when its payout reserve for that type is too low (it does not show the reserve).
- Payout types: **$RIBBIT** (to the account's Solana wallet) and **ICP** (to an ICP address the user types and saves; an account ID or a principal; the anonymous principal is refused). The ICP address is **not** the user's Internet Identity login and is not set automatically. The house switches each type on separately and sets the rate per chip. The panel shows what the user would receive after the fee. If the rate changes between quote and confirm the site asks them to try again.
- A person reviews every request and sends the payment **by hand**. For ICP the site checks the payment on the ledger before it closes the request. Statuses: pending, processing, sent, rejected, cancelled. The user can cancel while pending. A cancelled or declined request returns the chips, once. No promise of timing.
- Refusal messages come from the rules above (disabled, not offered for that type, no rate, below minimum, no destination, never bought chips, play-through not met, account or address too new, daily or weekly limit, reserve). Read them out; do not add reasons that are not in the message.

**Do not say** that ICP is held as a balance on the site, that cash-out is available, coming, or has a date, that a payout is instant or guaranteed, that the ICP deposit address is the user's Internet Identity or wallet address, that other tokens can be sent to the deposit address, that Internet Identity here is the same as the poker room's login, or that anything in this skill is financial or legal advice. If asked whether cash-out is legal where they live or how it is taxed, say you can't advise and the house has not published terms yet.

---

## Appendix: keeping this file true

When any of the following change, update this file in the same change as the code:

| If this changes | Update | Source of truth in the repository |
|---|---|---|
| Any admin setting, default, or range | Skill 0 table; Skills 3, 5, 7, 8, 11, 13 | `src/lib/settings.ts` (`SETTING_DEFS`), `src/lib/config.ts`, `GET /api/config` |
| Game rules or payouts | Skills 5 and 6 | `src/lib/games.ts`, `src/lib/blackjack.ts`, `src/lib/fairness.ts` |
| Tier thresholds or benefits | Skill 11 | `src/lib/tiers.ts` |
| Bounty maths or eligibility | Skills 7 and 8 | `src/lib/bounty.ts`, `src/lib/ranked.ts` |
| Auction rules | Skill 9 | `src/lib/auctions.ts` |
| Claim codes or redeem fields | Skill 10 | `src/lib/claim-code.ts`, `src/app/api/redeem/route.ts` |
| A feature in Skill 18 ships | Move it out of Skill 18 into its own skill | `src/lib/roadmap.ts` |
| Internet Identity sign-in, ICP buying or chip cash-out is switched on, or its rules change | Skill 0 table, Skills 2, 3, 15, 17, 18, 19 and the user guide Sections 2, 3, 15, 17, 18. Remove "switched off" wording, add the live ICP price and live cash-out rates and limits, and decide what the skills file may say about turning cash-out on (counsel's answers first). | `src/lib/settings.ts` (ICP and Cash-out groups), `src/lib/icp-rules.ts`, `src/lib/cashout-rules.ts`, `src/lib/cashout.ts`, `GET /api/config` |
| Error text | The error tables | The route that returns it |

The fairness test vector in Skill 6 must keep passing; if the roll derivation ever changes, this file is wrong until it is updated.
