Prediction Stack docs Open the Stack
Reference

Honesty rules

These are not style preferences. They are enforced in the code, and some of them fail the data job. They protect your users, and they protect you: invented numbers on a financial page read as a promise of returns.

Unknown is "unknown", never zero#

  • A field a venue does not publish is null in the data and unknown on the page. No default, no guess.
  • A fee the code cannot compute from a verified source is unknown (every Polymarket fee today; Kalshi's undocumented flat fee type).
  • Loading shows a placeholder shimmer; it is never left where a value is unknown.

An unreachable venue shows no rows#

  • A venue that could not be reached reports ok: false and zero markets.
  • The workflow step "Fail if the run fabricated anything" stops the run if an unreachable venue reports markets, or if cross-venue is not ok but carries rows.
  • Another step stops the run if the tape carries market titles although the title lookup failed.

No match without a person#

  • Text similarity only filters. The matcher compares the event, the predicate, numeric thresholds, the named subject or person, the resolution source, the settlement time, the year and the party, and any contradiction rejects the pair.
  • The best a machine verdict can be is candidate. Only a pair a person confirmed in the admin is priced as a cross-venue spread.
  • A later change to either market's text, sources or expiry, or a new matcher version, flags the decision for re-review.

Spreads are historical and fully costed#

  • Every fee on every leg is counted, and the result is divided by the days the money is locked. A raw gross spread is never shown on its own.
  • Simple annualisation comes first. The compounded figure is secondary and labelled, because it assumes the same opportunity can be re-entered forever.
  • A multi-outcome Kalshi event counts as a positive spread only when it lists a catch-all leg ("Other", "None", "Field" and similar). Without one, an unlisted outcome would pay every leg $0, so the payout is not guaranteed and the row is kept for research only.
  • Size is capped by the order book where the book is known; where it is not, the page says so.
  • The Scanner's KPI tiles have no sparklines, because the Scanner has no price history and a sparkline would imply a trend that does not exist.

Vocabulary#

The pages say spread, difference in pricing and historical data. They promise no return, call no price wrong and guarantee nothing. Keep it that way when you edit text, write your disclaimer or promote the product.

The Terminal says what it cannot see#

  • "No order book": depth and best bid and ask are not on the chain, so none is shown.
  • "Read-only · no key, no signature".
  • The time window is labelled in blocks and seconds from the chain, never as a day.
  • A token without a title shows its id and says the title is unavailable.

Operator settings never fill in#

  • There is no fee, order or payment setting: the product is read-only.
  • An empty brand or legal field hides the element. There is no placeholder name, email or # link.
  • Text from public.json is inserted as text, never as HTML.
  • Hidden categories are announced: each page says how many rows the filter left out, and Terminal totals still count every market.
  • The pages use neither venue's logo, wordmark nor exact brand colour.

The admin logs and masks#

  • Every change is in the audit log with before and after values.
  • Wallet-like values are masked. Revealing one needs the owner role and a written reason, which is logged.
  • Pair decisions written to the committed pairs.jsonl name the role, not the person; the audit log keeps who.
MIKODES Prediction Stack documentation. Written from the code in this repository; where the code and older notes disagree, the code wins. Nothing here is financial, legal or tax advice.