Docs · Goal

Sports Operations Docs · Goal, home

Goal

Every route, every endpoint, every field mapped. A value that is not in the dictionary does not render.

Routes

RoutePageMust show
/OverviewFeed status, every surface in src/desk/surfaces.ts with its key and a deep link, the security model, WORD_SHEET by family, and FIELDS
/securitySecurity modelRule 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
/deskDeskBoard quotes plus ticker position. One wall, not two. ?screen= opens a data screen and ?open= an overlay (telegram, picks, review, keys, devig).
/ipIP loggetWebLog rows, agent and customer split
/healthHealthToken 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.
/agentsAgent settingsPrivate agreements, agent contacts and separate manual balance observations.
/directoryPeople directoryPrivate customer and employee contacts, bot references, exact account evidence and workspace sessions.
/credentialsEnvironment & keysEncrypted project variables, keys and passwords with explicit reveal and operator access.
/workbenchStyles & checksTheme previews, repository verification records, Bun feature usage and sample controls.
/docsDocsEach 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>DocThe doc rendered with its outline. A link to an unpublished doc shows as text.

Endpoints

SourceCallMaps to
fantasy402Manager/getBetTickerTape and position buckets
fantasy402Manager/getWebLog/ip, and the scheduled extract into f402weblog
fantasy402System/renewTokenSession only. Not a column.
fantasy402Manager/getAuthorizationsSecurity
fantasy402Manager/getReportDeletedTransactionsSecurity
4C/api/v2/board/{view}Board games
4C/api/v2/game/{id}/market/{m}Quotes
4CPhoenix board topicLive 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 ShortDesc rotation 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. AmountWagered and VolumeAmount stay separate. Parlay risk uses volume.
  • WagerNumber is 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 LIST fields outside LoginID, AccessDateTime, IPAddress, Operation, and Data stay on the lake row under extra.
NameColumnRead fromStored
SCOREscGET /api/desk/sharp scores[].scoreNot archived. Recomputed from grades.
LOGINSlnweblog rows with action LOGIN, grouped by customerdesk/v1/weblog/ event. The count is not stored. Expand a row to see those events.
SESSIONSsedistinct session on that customer's LOGIN rowsdesk/v1/weblog/ session. The count is not stored.
LAST LOGINlltime of the latest LOGIN rowdesk/v1/weblog/ t. The latest is not its own column.
IPSnidistinct ip on the customer's wagersdesk/v1/wagers/ ip. The count is not stored.
MATCHmtother customers that share any of those ip valuesDerived from desk/v1/wagers/. Not a column. Expand a row to see who, and which address they share.
IP LISTipthe ip values themselvesdesk/v1/wagers/ ip. Off until COLUMNS turns it on.
IPwipthis wager's own ipdesk/v1/wagers/ ip. One address, not the account list.
HANDLEhdsum of open straight risk on the line, integer centsdesk/v1/wagers/ risk. The total is not stored.
SHARP %shsharp handle / HANDLE. Sharp is the score segmentDerived from desk/v1/wagers/. Not stored.
EXCHxmsharp stake matched to available size on OTHER SIDE at the best exchangeDerived 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.