Goal
Every route, every endpoint, every field mapped. A value that is not in the dictionary does not render.
Routes
| Route | Page | Must show |
|---|---|---|
/ | Overview | Feed status, every surface in src/desk/surfaces.ts with its key and a deep link, the security model, WORD_SHEET by family, and FIELDS |
/security | Security model | Rule cards, the published pair counts, the twin match, the view edges, the view test and the edge pins from src/security/model.ts. Links to the security screen, the IP log and the weblog dictionary |
/desk | Desk | Board quotes plus ticker position. One wall, not two. ?screen= opens a data screen and ?open= an overlay (telegram, picks, review, keys, devig). |
/ip | IP log | getWebLog rows, agent and customer split |
/health | Health | Token age, last ticker pull, last board pull. Every sidecar and desk cron job with its next fire, and the archive pipeline: flush, compact, target (R2 or local) and retention, with each stream's partition. ?d=<id> opens one data dictionary entry. |
/agents | Agent settings | Private agreements, agent contacts and separate manual balance observations. |
/directory | People directory | Private customer and employee contacts, bot references, exact account evidence and workspace sessions. |
/credentials | Environment & keys | Encrypted project variables, keys and passwords with explicit reveal and operator access. |
/workbench | Styles & checks | Theme previews, repository verification records, Bun feature usage and sample controls. |
/docs | Docs | Each doc in PUBLIC_DOCS (scripts/docs-tree.ts) with its title, file and first paragraph. public/llms.txt and public/docs/manifest.json list the same docs. |
/docs/<slug> | Doc | The doc rendered with its outline. A link to an unpublished doc shows as text. |
Endpoints
| Source | Call | Maps to |
|---|---|---|
| fantasy402 | Manager/getBetTicker | Tape and position buckets |
| fantasy402 | Manager/getWebLog | /ip, and the scheduled extract into f402weblog |
| fantasy402 | System/renewToken | Session only. Not a column. |
| fantasy402 | Manager/getAuthorizations | Security |
| fantasy402 | Manager/getReportDeletedTransactions | Security |
| 4C | /api/v2/board/{view} | Board games |
| 4C | /api/v2/game/{id}/market/{m} | Quotes |
| 4C | Phoenix board topic | Live quotes. Needs FOURC_TOKEN. |
No token in the repo. A missing token is a gap, not a fake row.
Fields
One name everywhere. The catalog is src/desk/fields.ts. A count is not a second stored column. Tables build these columns with fieldCol() (src/components/desk/field-cols.tsx), so a field has one width, type and cell on every table: SCORE bold to two places, LOGINS, SESSIONS and IPS quiet at zero, MATCH in the alert tone when any account shares an address. Account, agent, segment and grade columns come from the same file: one width, the account opens its profile, and an empty cell is a dim dash on every table.
- Rotation is the join. Ticker
ShortDescrotation and 4C rotation are the same number. - Team is full name and short name, one switch.
- League code, sport code, market code, period code. No free text in those columns.
- Stake is integer cents.
AmountWageredandVolumeAmountstay separate. Parlay risk uses volume. WagerNumberis the ticket id. A#in the description is the game number. Alert plus internet within 6 seconds is one bet.- The live tape grades each rotation as HIT, EARLY, AFTER GAP, LIVE, PROP, NCAAW, SMALL or ODDBALL. HIT is three or more single-number tickets on one rotation in five minutes, inside a 15-point price band. A parlay, teaser, contest or builder card does not count as a hit. VELOCITY is tickets on that rotation in five minutes. SHARED is a count of logins that share an address, not the address. The 4C number at the wager is not joined, so the board does not call a line stale and does not give a move order.
- Agent id and customer id are trimmed. They are not the same field.
- Web-log
LISTfields outside LoginID, AccessDateTime, IPAddress, Operation, and Data stay on the lake row underextra.
| Name | Column | Read from | Stored |
|---|---|---|---|
| SCORE | sc | GET /api/desk/sharp scores[].score | Not archived. Recomputed from grades. |
| LOGINS | ln | weblog rows with action LOGIN, grouped by customer | desk/v1/weblog/ event. The count is not stored. Expand a row to see those events. |
| SESSIONS | se | distinct session on that customer's LOGIN rows | desk/v1/weblog/ session. The count is not stored. |
| LAST LOGIN | ll | time of the latest LOGIN row | desk/v1/weblog/ t. The latest is not its own column. |
| IPS | ni | distinct ip on the customer's wagers | desk/v1/wagers/ ip. The count is not stored. |
| MATCH | mt | other customers that share any of those ip values | Derived from desk/v1/wagers/. Not a column. Expand a row to see who, and which address they share. |
| IP LIST | ip | the ip values themselves | desk/v1/wagers/ ip. Off until COLUMNS turns it on. |
| IP | wip | this wager's own ip | desk/v1/wagers/ ip. One address, not the account list. |
| HANDLE | hd | sum of open straight risk on the line, integer cents | desk/v1/wagers/ risk. The total is not stored. |
| SHARP % | sh | sharp handle / HANDLE. Sharp is the score segment | Derived from desk/v1/wagers/. Not stored. |
| EXCH | xm | sharp stake matched to available size on OTHER SIDE at the best exchange | Derived from quote size and sharp handle in desk/v1/wagers/. THIS SIDE is the tracked side. Not stored. Not the IP MATCH column, and not the EXCH book-class chip. |
Hotkeys for the data screens are B 4C board, G odds grid, F ticker, A accounts, P positions, M patterns, L alerts, E security. The same list is SCREEN_KEYS and the shortcut sheet (?).
The SCORE column stays recomputed from grades. The alert and sharp scoreboard is a separate object, desk/v1/score/latest.json, rewritten on each flush. See docs/r2-storage.md.
The move graph is not a stored object. It draws the 4C line series against time, places each wager on the number that was up (valueAt), and colors the dot from the wager ip (city and kind in the replay IP table). The band is the 5 minutes before a print. LOGIN, VIEW, and LOGOUT rows for those accounts sit on the city rail. Each print lists the wagers inside its own window as TOWARD, AGAINST, or FLAT. A selected wager lists that session's rows in time order, whether the slot is SEALED or UNSEALED, and every ticket in the slot: the earliest sets LOGIN and the latest sets LOGOUT. Those words, their colors, and their uses live in src/desk/vocab.ts and on the ? sheet. Code: src/desk/move-graph.ts. The sidecar serves that figure from GET /api/desk/move, using one weblog cached for the tick. desk/v1/weblog/latest.json is the rewritten access rollup (LOGINS, SESSIONS, LAST LOGIN, MATCH). The event rows remain the source.
Done when
- Each route above renders only mapped fields.
- Each endpoint above has a row in this file and a parser.
- A ticker rotation shows stake on the matching board quote.
- An unmapped field is listed here as unmapped, not dropped silently.
Play review and ROI
Desk → Telegram → Play review / ROI organizes the replay ticket tape by sport, market, agent, source channel and review state. Related tickets share event, selection and line without merging accounting records. Evidence completeness is separate from estimated edge; reviewing or approving a ticket does not send it. Review decisions persist on this browser for 30 days, bounded to 1000 replay ticket identities. Changed ticket identities do not inherit prior approval. Only identity hashes, stages and timestamps are saved; wager details and customer data are not saved. Storage failures are visible and fall back to memory. Choices do not sync between devices. Outbox receipts and settlement remain separate.
Net ROI uses settled integer-cent stakes and profit after known fees, excludes duplicate records and unavailable accounting, and separates live, paper and replay. The replay panel requires an explicit zero-fee modeling assumption before displaying net ROI; multi-leg replay settlements are excluded because their payout rules are simplified. Strategy attribution remains unclassified rather than treating a source channel as a strategy. Signal review uses finalized closes and at least 50 eligible results before stronger historical-evidence labels.
The edge engine checks canonical market identity, currency, source mode, quote and fair-estimate freshness, settlement terms, fees and executable size. Verified positive estimates rank by executable expected net value, then freshness. Verification flags are caller assertions. The current replay panel has no verified executable live quotes and shows the missing evidence; it does not announce live edges. Telegram summaries are bounded escaped review drafts only.
The private live comparison view now ranks scanner candidates from its original reviewed evidence. It preserves provider observation times and the exact stake covered by depth and fee assessments; assessed fees are not reused on a clipped stake. Missing evidence remains blocked. This integration does not establish that current provider feeds have the required evidence, and it does not send orders or messages. Older sidecar responses show scanner results as unavailable.
Comparison eligibility is rechecked against the browser clock while displayed, so stale quotes, fair estimates and expired reviewed execution terms leave the ranked list without a network request. Refresh comparisons to obtain new evidence; clock differences can block candidates. Every copy of a duplicate candidate reference is blocked, including collisions between live and replay data. Pending local review changes survive repeated storage write failures and merge with newer saved records during recovery; long-lived panels expire review choices too.