# Orb: two-person testnet demo

October 2 clarification: both accounts can be demonstration accounts controlled
by the founder, using separate Privy identities/embedded wallets and browser
sessions. There is no customer-recruitment requirement for this rehearsal.
Provider authentication and public testnet receipts are genuine; simulated user
roles do not constitute adoption, retention or commercial revenue evidence. See
[the controlled-demo setup](orb-hackathon-rehearsal.md).

October 1 local continuation: navigate away from a prepared draft and return;
it must remain private to the same room and wallet. Check **My activity**, then
switch account and confirm the previous thread disappears. Interrupt a fixture
submission before acknowledgement: it must remain unknown and non-resendable.
On the real venue, inspect the original request before preparing another order.
Use `/proofs` to explain wallet control and independently verify a supported Spot
receipt. These new navigation checks passed in fixtures, not two real Privy accounts.

> Current status reviewed September 29, 2026. See [the release index](README.md) for shipped versus planned features, network, wallet signing and deployment boundaries. Older dated experiments below are retained as history.

This is the repeatable product journey for the Web3 Orb build. It does not use the production Órbita database, and no automated check sends a funded order. The network is Monad testnet (chain 10143).

The current preview is [joinorb.online](https://joinorb.online/), on the separate `orb` service and database. On 2026-09-22, its public page and market route responded, and a server-side read-only probe used the free AI model to ask for margin and then produce a validated BTC draft. This does not establish that a funded order filled or that a second real account completed the journey.

## What a new user should see

1. Open Orb, sign in with Privy; its embedded Orb Wallet is created or linked automatically. Open **Wallet** to inspect it or finish setup if a prior account lacks one. The login wallet identifies the account; the Orb Wallet holds only funds deliberately moved there.
2. Enter a community trade channel and expand **How it works**. **Open AI assistant** goes directly to its private conversation. The example chips fill the composer without sending anything.
3. Ask the assistant for a BTC perpetual draft. It may ask for the margin; replying with a number must retain the original market, side and leverage. Review the editable ticket, including the current market price and collateral requirement.
4. Use **Share idea in chat**. The preview excludes the margin by default, as well as the private transcript and wallet address. User B sees the card in the channel and chooses **Use as a draft**. User B's margin starts empty and current prices are fetched again. User B must review and confirm their own order.
5. The chat shows **submission attempted → request acknowledged/rejected/unknown → venue order update**. Acknowledgement is not a fill. Partial, full, failed, canceled and expired updates come from Perpl's account socket. The most recent observation survives a mode switch in the same mounted channel; after a disconnect, the UI labels it as the last observed state and points to Perpl. Protections are separate venue requests and their failures remain visible.

For an independently verifiable Monad action, switch the trade channel to **Shared swaps**. User A gets demo faucet assets, publishes a card, and waits for its transaction receipt. Orb extracts the card ID from that receipt and posts a pointer in the same trade room. User B clicks **Verify on Monad**; the server checks the configured contract bytecode and the card's onchain room scope before showing its terms. User B then chooses **Review with my wallet**, requests a fresh quote, approves only the exact input if needed, and confirms their own swap. The card refreshes its verified execution count after a confirmed local swap; other viewers can use **Refresh proof**. The card's execution count and receipt are public. These oBASE/oQUOTE assets have no monetary value and this is a separate demo market, not an AI-generated Perpl order.

## Real testnet rehearsal

Use two test accounts on separate browsers/devices. Both must be community members, but they must use distinct Privy accounts and Orb Wallets. The Perpl testnet venue currently reports a 100 AUSD minimum to open an exchange account; check the live onboarding value before the rehearsal. Fund only testnet wallets. Do not use mainnet assets.

Record for each attempt: time of click, time to Perpl acknowledgement, request ID, venue order ID if reported, time and status of venue update, wallet used, any partial/protection failure, and whether the other user could understand what happened without help. An accepted request without a later venue update is **unverified**, not a successful fill. On an unknown acknowledgement, inspect Perpl before any retry; never automatically resend. Save only redacted screenshots in submission material.

The AI free endpoint can be slow or rate-limited. Test the exact margin-follow-up prompt before recording. If inference is unavailable, say so; do not show a scripted response as live inference.

For Monad-specific proof, perform an Arena or Trading Sprint action on public testnet and retain its transaction hash and receipt. The app should report action-to-receipt time from the user's browser. That number is not Orb TPS, Perpl fill latency or a measure of the network's theoretical capacity. The independently readable contract state, not a database screenshot, establishes the onchain result. The community message, voice call and AI conversation remain offchain.

Perpl browser trading keys now expire after 12 hours and have trade-only scope. Keys enrolled before this change may have been issued without a venue expiry: users must revoke those old keys in Perpl's **API Keys** page. Clearing Orb's browser storage does not revoke a venue key. No automatic revocation API is available in Perpl's published integration documentation.

## Safe preflight

Run from this repository, with the isolated hackathon environment:

```powershell
npx tsc --noEmit
node scripts/test-perpl-session.mjs
node scripts/test-perpl-order-progress.mjs
node scripts/test-assistant-trading.mjs
node scripts/test-assistant-chat-ui.mjs
node scripts/test-community-trade-ui.mjs
node scripts/test-trade-card-api.mjs
node scripts/test-perpl-market.mjs
node scripts/test-shared-market-card.mjs
node scripts/test-economy-ui.mjs
npm run build
```

The browser fixtures use simulated Privy and Perpl writes. The card API test uses an isolated local database. The economy UI test uses a real local EVM and **two isolated browser contexts with distinct Privy-simulated wallets**. It checks chat delivery, onchain card verification, rejection in the wrong room, independent exact approvals and swaps, and both receipts. It does not prove the public testnet or real Privy confirmation. That September 22 read was historical and does not describe the current configuration. Read the current /api/orb/economy before rehearsal and use only the configured, runtime-verified contracts. `test-perpl-market` makes only public testnet reads. `node --env-file=.env.local scripts/probe-assistant-live.mjs --margin-followup` is an optional real free-inference/public-market read, with account tools disabled and no order submission.

Before each public deployment, apply the migrations to Orb's **separate** database, check the production origins in Privy and Perpl, verify the alert-monitor worker if alerts are demonstrated, and run the full two-device rehearsal against the exact deployed build. Do not redirect the production Órbita domain or reuse its database.
