# Judge mode

The `/judges` page is a short path through Orb for the people judging it, and a live reading of what answers
on chain right now. It does not stage anything. Each line comes from Monad testnet or from the server's own
configuration, and an item that is not set up is shown as not set up.

## What a judge can do in five minutes

1. **Join the demo community.** One link, no signup, entering as a guest. The link fills in a name ("Judge 4821") that can be
   changed, so joining is one click. Anyone who opens Orb with no community of their own is offered the same demo community on the
   home screen (`/api/orb/demo`, public, returns nothing unless `ORB_JUDGE_INVITE` is set and matches a community).
   **Before you write:** this community's channels are saved publicly on Monad, so a message in `#general`, `#shipped` or `#help`
   becomes part of a permanent record anyone with the chain can read, along with the display name you chose. Read and click around
   freely; if you would rather leave nothing behind, post in the feed instead, which is not saved, or just look.
2. **Post in the feed.** With a wallet, attach a Passport proof: the post is marked as anchored on Monad and links
   to the independent viewer.
3. **Check a proof without Orb.** `/attestation/watch.html` recomputes the proof against the registry and never
   asks for a login.
4. **See the contracts.** `/proofs` lists them with explorer links and says what each one does and does not prove.
5. **Read a community back from the chain.** The [Open Ledger](orb-ledger.md) saves a community on Monad. When the demo
   community is saved publicly, this step opens it: the browser reads it from the chain, checks every entry and shows
   the community laid out like the chat it came from. The [protocol](orb-ledger-protocol.md) and `npm run ledger:read`
   read it back with nothing but an RPC. In the demo community a **Saved on Monad** chip in the channel header opens the
   same view. If the host's own demo community is not saved publicly, the step opens a sample community instead (invented people and
   messages, saved on the same contract and published with the build in `public/ledger/demo.json`), so there is always one that can be read.
6. **Missions, Council and the token.** `/missions`, `/council`, `/token`.
7. **Apps and the registry.** `/developers` is the page for people who write an Orb app: the five-minute path, the SDK and the directory. Each listed app has a public page (`/apps/<app id>`) that shows what it asks for, what installing it grants and, for an app on the [registry](orb-bot-registry.md), its price and the manifest to re-hash against the chain.

The status table on the page covers the RPC, the ORB token (fixed supply read from the contract), community
missions (and whether one is still open on the last day of judging), the Council, the app registry (apps registered by their developers), the Passport registry (epochs
anchored), the Open Ledger (the contract code is compared with the published build), the demo community, and
whether wallet login and the assistant are configured. It reports presence, never a value: no key, secret or
RPC address is shown. An unreadable service is described without its error text.

## Preparing the host (Orb operator)

Add `?operator` to the page address to see what is missing and how to fix it. Judging runs from 14 to 27 October
2026, so everything below has to be true for the whole period, not only at submission.

| Item | What to do |
| --- | --- |
| Passport registry | Set `ORB_ATTESTATION_CONTRACT` on the server, then run `npm run attestation:keeper:publish` so at least one epoch is anchored. |
| App registry | Register at least one app from the Apps tab of a community (Settings → Apps → On Monad testnet), so the status row is green and a judge can read a real record. It costs a few hundredths of a test MON. |
| Missions | Create at least one mission whose deadline is after 27 October, with a prefunded reward, so a judge can open it. |
| Open Ledger | Deploy with `npm run ledger:deploy:testnet`, set `ORB_LEDGER_CONTRACT` and `ORB_LEDGER_SCRIBE` on the server, and run the keeper. Turn it on for the demo community, public, so the history can be read with no code. |
| Demo community | Create a community and give it a short history: bring in the invented sample (`npm run import:sample`, then **Bring your Discord history** in its settings) or write a few real messages. Turn on a public ledger for it so the history can be read back from the chain, then copy its invite code into `ORB_JUDGE_INVITE`. |
| Login and assistant | `NEXT_PUBLIC_PRIVY_APP_ID`, `PRIVY_APP_SECRET` and `OPENROUTER_API_KEY` set, with the credentials rotated if they were ever exposed. |
| Gas | The scribe and the relayers need enough test MON for the whole period. The keeper stops, and says so, when its daily fee ceiling is reached. |

The status is cached for thirty seconds and the endpoint is rate limited per client address, so a crowd of judges
is a handful of RPC calls, not a burst on the public node.

## What this page does not do

It does not create accounts, fund wallets or hide a failing service. If the public RPC is slow, the table says
so. If a judge wants to try wallet actions, a testnet wallet with test MON is still needed; the faucet and the
links to it are in the app.
