> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sleuthintel.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sleuth - Belt + Tree + Most Wanted - Build Brief (Dev)

> Original Sleuth document.

<div style={{ margin: "-24px -32px", width: "calc(100% + 64px)" }}>
  <iframe title="Sleuth - Belt + Tree + Most Wanted - Build Brief (Dev)" srcDoc={"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>SLEUTH \u00b7 Belt + Tree + Most Wanted \u00b7 Build Brief (Dev)</title>\n<style>\n  @import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Orbitron:wght@400;700;900&display=swap');\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n  :root{--green:#00FF66;--green-dim:#00cc52;--green-glow:rgba(0,255,102,0.3);--green-faint:rgba(0,255,102,0.06);\n    --bg:#060606;--card:#0c0c0c;--border:#1a1a1a;--text:#d0d0d0;--gold:#FFD700;--gold-glow:rgba(255,215,0,0.25);\n    --red:#FF4444;--blue:#5b8fff;--heat:#ff7a45;--heat-glow:rgba(255,122,69,0.25);}\n  html{scroll-behavior:smooth;}\n  body{font-family:'Share Tech Mono',monospace;background:var(--bg);color:var(--text);line-height:1.8;overflow-x:hidden;}\n  #matrix-canvas{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:0;opacity:0.16;}\n  body::after{content:'';position:fixed;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.1) 2px,rgba(0,0,0,0.1) 4px);pointer-events:none;z-index:1;}\n  body::before{content:'';position:fixed;inset:0;background:radial-gradient(ellipse at center,transparent 50%,rgba(0,0,0,0.6) 100%);pointer-events:none;z-index:1;}\n  .container{position:relative;z-index:2;max-width:1080px;margin:0 auto;padding:40px 24px 120px;}\n\n  .header{text-align:center;padding:78px 0 46px;border-bottom:1px solid var(--border);margin-bottom:54px;position:relative;overflow:hidden;}\n  .header-glow{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:600px;height:280px;background:radial-gradient(ellipse,rgba(0,255,102,0.07) 0%,transparent 70%);}\n  .eyebrow{font-size:11px;color:var(--gold);letter-spacing:6px;text-transform:uppercase;margin-bottom:18px;}\n  .logo{font-family:'Orbitron',sans-serif;font-size:33px;font-weight:900;color:var(--green);text-shadow:0 0 10px var(--green),0 0 34px var(--green),0 0 80px rgba(0,255,102,0.3);letter-spacing:4px;margin-bottom:14px;line-height:1.25;}\n  .tagline{font-size:13px;color:var(--green-dim);text-transform:uppercase;letter-spacing:4px;margin-bottom:16px;}\n  .subtitle{font-size:13px;color:var(--gold);max-width:720px;margin:0 auto;line-height:1.7;}\n\n  .toc{display:flex;flex-wrap:wrap;justify-content:center;gap:10px;margin-top:30px;}\n  .toc a{font-family:'Orbitron',sans-serif;font-size:10px;letter-spacing:1.5px;text-decoration:none;\n    color:var(--green);border:1px solid var(--border);padding:8px 14px;text-transform:uppercase;transition:.2s;}\n  .toc a:hover{border-color:var(--green-dim);background:var(--green-faint);}\n  .toc a.heat{color:var(--heat);}\n  .toc a.heat:hover{border-color:var(--heat);background:rgba(255,122,69,0.05);}\n\n  .section{margin-bottom:70px;opacity:0;transform:translateY(20px);transition:opacity .7s ease,transform .7s ease;scroll-margin-top:20px;}\n  .section.visible{opacity:1;transform:translateY(0);}\n  .section-number{font-family:'Orbitron',sans-serif;font-size:11px;color:var(--green);letter-spacing:4px;margin-bottom:10px;font-weight:900;}\n  .section.heat .section-number{color:var(--heat);}\n  h2{font-family:'Orbitron',sans-serif;font-size:23px;color:var(--green);text-shadow:0 0 22px var(--green-glow);margin-bottom:20px;padding-bottom:14px;border-bottom:1px solid var(--border);}\n  .section.heat h2{color:var(--heat);text-shadow:0 0 22px var(--heat-glow);}\n  h3{font-family:'Orbitron',sans-serif;font-size:14px;color:var(--green-dim);margin:30px 0 12px;letter-spacing:1px;}\n  .section.heat h3{color:var(--heat);}\n  p{margin-bottom:14px;color:var(--gold);font-size:14px;line-height:1.85;}\n  strong{color:var(--green);}\n  .section.heat strong{color:var(--heat);}\n  .lead{font-size:15.5px;color:var(--text);margin-bottom:18px;}\n  ul{list-style:none;margin:12px 0;padding:0;}\n  ul li{position:relative;padding-left:22px;margin-bottom:9px;color:var(--gold);font-size:14px;}\n  ul li::before{content:'>';position:absolute;left:0;color:var(--green);}\n  .section.heat ul li::before{color:var(--heat);}\n  code{font-family:'Share Tech Mono',monospace;color:var(--blue);background:rgba(91,143,255,0.08);padding:1px 6px;border-radius:3px;font-size:13px;}\n\n  pre{background:#070707;border:1px solid var(--border);border-left:2px solid var(--green);padding:16px 18px;margin:16px 0;overflow-x:auto;font-size:12.5px;color:var(--text);line-height:1.7;}\n  pre .c{color:#5c6b5c;}\n  pre .k{color:var(--blue);}\n  pre .t{color:var(--green);}\n  .section.heat pre{border-left-color:var(--heat);}\n\n  table{width:100%;border-collapse:collapse;margin:22px 0;font-size:12.5px;}\n  th{background:rgba(0,255,102,0.07);color:var(--green);text-align:left;padding:11px 12px;border:1px solid var(--border);font-family:'Orbitron',sans-serif;font-size:10px;text-transform:uppercase;letter-spacing:1px;}\n  .section.heat th{background:rgba(255,122,69,0.07);color:var(--heat);}\n  td{padding:10px 12px;border:1px solid var(--border);background:var(--card);color:var(--text);font-size:12.5px;vertical-align:top;}\n  td.id{font-family:'Orbitron',sans-serif;color:var(--green);font-weight:700;text-align:center;}\n  td.fw{color:var(--gold);font-weight:700;}\n  tr:hover td{background:rgba(0,255,102,0.03);}\n  .pill{display:inline-block;padding:2px 9px;border-radius:9px;font-size:10px;font-family:'Orbitron',sans-serif;letter-spacing:1px;white-space:nowrap;}\n  .lo{background:rgba(0,255,102,0.12);color:var(--green);border:1px solid rgba(0,255,102,0.3);}\n  .machine{background:rgba(91,143,255,0.12);color:var(--blue);border:1px solid rgba(91,143,255,0.35);}\n  .judgment{background:rgba(255,215,0,0.1);color:var(--gold);border:1px solid rgba(255,215,0,0.3);}\n  .mixed{background:rgba(0,255,102,0.1);color:var(--green);border:1px solid rgba(0,255,102,0.3);}\n\n  .card{background:var(--card);border:1px solid var(--border);padding:20px 22px;margin:16px 0;position:relative;overflow:hidden;}\n  .card::before{content:'';position:absolute;top:0;left:0;width:2px;height:100%;background:linear-gradient(to bottom,var(--green),transparent);box-shadow:0 0 10px var(--green-glow);}\n  .section.heat .card::before{background:linear-gradient(to bottom,var(--heat),transparent);}\n  .card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:var(--green);text-transform:uppercase;letter-spacing:2px;margin-bottom:10px;}\n  .section.heat .card-title{color:var(--heat);}\n  .card p, .card ul li{font-size:13px;}\n\n  .highlight{background:var(--green-faint);border:1px solid rgba(0,255,102,0.12);padding:18px 22px;margin:18px 0;position:relative;}\n  .highlight::before{content:'//';position:absolute;top:-11px;left:20px;background:var(--bg);padding:0 10px;color:var(--green);font-size:12px;}\n  .highlight p{color:var(--green);font-size:14.5px;margin:0;}\n  .section.heat .highlight{background:rgba(255,122,69,0.05);border-color:rgba(255,122,69,0.14);}\n  .section.heat .highlight::before{color:var(--heat);}\n  .section.heat .highlight p{color:var(--heat);}\n\n  .flowline{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:20px 0;font-size:11px;}\n  .flowline .node{border:1px solid var(--green-dim);background:var(--card);color:var(--green);padding:6px 12px;letter-spacing:1px;font-family:'Orbitron',sans-serif;font-size:10px;}\n  .flowline .node.gold{border-color:var(--gold);color:var(--gold);}\n  .flowline .node.red{border-color:var(--red);color:var(--red);}\n  .flowline .node.blue{border-color:var(--blue);color:var(--blue);}\n  .flowline .node.hot{border-color:var(--heat);color:var(--heat);}\n  .flowline .arr{color:var(--green-dim);}\n\n  /* GANTT */\n  .gantt{margin:22px 0;border:1px solid var(--border);background:#070707;padding:20px;}\n  .g-scale{display:grid;grid-template-columns:200px 1fr;gap:10px;margin-bottom:6px;}\n  .g-weeks{display:flex;justify-content:space-between;font-size:10px;color:var(--text);opacity:.6;font-family:'Orbitron',sans-serif;letter-spacing:1px;border-bottom:1px dashed var(--border);padding-bottom:4px;}\n  .g-row{display:grid;grid-template-columns:200px 1fr;gap:10px;align-items:center;margin:7px 0;}\n  .g-label{font-size:12px;color:var(--gold);}\n  .g-track{position:relative;height:22px;background:rgba(255,255,255,0.02);border:1px solid var(--border);}\n  .g-bar{position:absolute;top:3px;height:16px;border-radius:3px;font-size:9px;color:#041007;display:flex;align-items:center;justify-content:center;font-family:'Orbitron',sans-serif;letter-spacing:1px;overflow:hidden;white-space:nowrap;}\n  .b-core{background:linear-gradient(90deg,#00FF66,#00cc52);}\n  .b-mach{background:linear-gradient(90deg,#5b8fff,#3a63c9);color:#fff;}\n  .b-judg{background:linear-gradient(90deg,#FFD700,#c9a800);}\n  .b-w1{background:linear-gradient(90deg,#00cc52,#0a9c47);color:#d8ffe6;}\n  .b-heat{background:linear-gradient(90deg,#ff7a45,#c2522a);color:#fff;}\n  .g-mark{position:absolute;top:-22px;bottom:-300px;width:1px;background:rgba(255,215,0,0.4);}\n  .g-mark span{position:absolute;top:-2px;left:4px;font-size:9px;color:var(--gold);white-space:nowrap;font-family:'Orbitron',sans-serif;}\n\n  .footer{text-align:center;padding-top:38px;border-top:1px solid var(--border);margin-top:46px;font-size:11px;color:var(--text);opacity:.6;letter-spacing:2px;}\n  @media(max-width:720px){.g-row,.g-scale{grid-template-columns:120px 1fr;}}\n</style>\n</head>\n<body>\n<canvas id=\"matrix-canvas\"></canvas>\n<div class=\"container\">\n\n  <div class=\"header\">\n    <div class=\"header-glow\"></div>\n    <div class=\"eyebrow\">// INTERNAL \u00b7 DEV BUILD BRIEF \u00b7 v1</div>\n    <div class=\"logo\">BELT \u00b7 TREE \u00b7 MOST WANTED</div>\n    <div class=\"tagline\">One model, three systems</div>\n    <div class=\"subtitle\">How to build the intake belt, the Tree of Knowledge, and the Most Wanted demand layer off one shared data model. Dev terms, short form. Belt and Tree are build-now. Most Wanted is downstream, gated behind the Tree, summarised here so you build it without surprises. Where anything conflicts with the whitepaper, the WP wins.</div>\n    <div class=\"toc\">\n      <a href=\"#shape\">00 \u00b7 Shape</a>\n      <a href=\"#belt\">01 \u00b7 Belt</a>\n      <a href=\"#tree\">02 \u00b7 Tree</a>\n      <a href=\"#mw\" class=\"heat\">03 \u00b7 Most Wanted</a>\n      <a href=\"#order\">04 \u00b7 Build order</a>\n    </div>\n  </div>\n\n  <!-- 00 SHAPE -->\n  <div class=\"section\" id=\"shape\">\n    <div class=\"section-number\">// 00 \u00b7 THE SHAPE</div>\n    <h2>One model under all three</h2>\n    <p class=\"lead\">The belt is intake. The Tree is the canonical graph everything lands on. Most Wanted is a steering layer that decides what the belt should be fed. They are not three apps, they are three views over one Postgres schema plus a job runner. Build the Tree's engine once and the belt is its front door and Most Wanted is a coefficient at the back.</p>\n    <div class=\"flowline\">\n      <span class=\"node hot\">MOST WANTED \u00b7 what to hunt</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">BELT \u00b7 intake + slots + router</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node blue\">MACHINE LANE</span><span class=\"arr\">/</span>\n      <span class=\"node gold\">JUDGMENT LANE</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">TREE + aSLEUTH LEDGER</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node hot\">HEAT \u00d7 GRADE at settlement</span>\n    </div>\n    <div class=\"grid2\" style=\"display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:18px 0;\">\n      <div class=\"card\"><div class=\"card-title\">Stack, whole thing</div>\n        <ul>\n          <li><strong>FastAPI + Postgres</strong> for pipeline, router, lanes, ledger, graph.</li>\n          <li><strong>Redis + Python workers</strong> for validators, timers, decay, epoch bills, Merkle commits.</li>\n          <li><strong>React / TS + D3</strong> for forms, conveyor, grading dashboard, the map.</li>\n          <li><strong>Solidity, tiny</strong>: SLEUTH token, LP, daily Merkle root. No Rust.</li>\n        </ul>\n      </div>\n      <div class=\"card\"><div class=\"card-title\">Two load-bearing rules</div>\n        <ul>\n          <li><strong>aSLEUTH is a ledger balance, not an ERC-20.</strong> Issuance, tariffs, decay, slashing, heat settlement are all SQL transactions. On-chain surface stays a daily Merkle root.</li>\n          <li><strong>Everything pending is public.</strong> The belt and conveyor are visible from the second intel lands, that visibility is the anti-fraud mechanism, not a feature.</li>\n        </ul>\n      </div>\n    </div>\n  </div>\n\n  <!-- 01 BELT -->\n  <div class=\"section\" id=\"belt\">\n    <div class=\"section-number\">// 01 \u00b7 THE BELT</div>\n    <h2>Intake pipeline</h2>\n    <p class=\"lead\">One pipeline for humans and agents, same rates, same rules, split only by a <code>contributor_type</code> flag. Form or API in, controlled vocab and evidence out, a pending node on the conveyor, then the router hands it to a lane. Garbage bounces at the pre-filters at zero human cost. Throughput is gated by track record through slots, never by a paywall tier.</p>\n    <div class=\"flowline\">\n      <span class=\"node\">FORM / AGENT API</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">PRE-FILTERS</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">SLOT CHECK</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">CONVEYOR \u00b7 public pending</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node blue\">LANE ROUTER</span>\n    </div>\n\n    <h3>Components</h3>\n    <table>\n      <thead><tr><th>Component</th><th>What it does</th><th>Notes</th></tr></thead>\n      <tbody>\n        <tr><td class=\"fw\">Submission pipeline + pre-filters</td><td>Vocab enforcement, schema validation, dedupe and contradiction check against the existing tree. Runs before anything is persisted as pending.</td><td>Cross-tree checks get sharper as the graph grows, zero marginal cost.</td></tr>\n        <tr><td class=\"fw\">Slots + cooldowns</td><td>Every contributor holds belt slots. Each pending submission occupies one until it resolves. Start 3, scale to ~25 by acceptance rate and aSLEUTH balance. Rejection streaks add escalating cooldowns, any acceptance resets.</td><td>Items that expire unpicked release the slot with no strike, resubmittable.</td></tr>\n        <tr><td class=\"fw\">Conveyor</td><td>Public staging of pending nodes and edges. Anyone can view, scrub, correct, flag. Corrections log as their own contribution records.</td><td>Open to all, throttled by slots and history, never a tier check.</td></tr>\n        <tr><td class=\"fw\">Lane router</td><td>One decision off the category table: <code>machine_checkable</code> + <code>validator_id</code> set, queue the validator. Null, enter the 5 day judgment window.</td><td>Lane migration is flipping a flag plus registering a validator, no schema change.</td></tr>\n      </tbody>\n    </table>\n\n    <h3>Data model</h3>\n<pre><span class=\"c\">-- intake</span>\n<span class=\"k\">submissions</span>(id, contributor_id, <span class=\"t\">contributor_type</span> <span class=\"c\">-- human|agent</span>,\n            niche, target_entity_id, vocab_tag, payload jsonb, evidence jsonb,\n            status <span class=\"c\">-- pending|live|killed|expired</span>,\n            lane <span class=\"c\">-- machine|judgment</span>, validator_id, slot_id, created_at, resolved_at)\n\n<span class=\"k\">slots</span>(id, contributor_id, state <span class=\"c\">-- free|occupied</span>, submission_id)\n\n<span class=\"k\">contributor_state</span>(contributor_id, slot_max, acceptance_rate,\n                  asleuth_balance, rejection_streak, cooldown_until)\n\n<span class=\"k\">config</span>(key, value)  <span class=\"c\">-- all belt constants, beta-tunable, nothing hardcoded</span></pre>\n\n    <h3>Endpoints</h3>\n    <ul>\n      <li><code>POST /v1/submissions</code> form and agent, same handler, <code>contributor_type</code> on the token.</li>\n      <li><code>GET /v1/conveyor</code> public pending feed, the staging view.</li>\n      <li><code>POST /v1/submissions/{id}/flag</code> belt correction, logs a contribution record.</li>\n      <li><code>GET /v1/contributors/{id}/slots</code> slot and cooldown state for the UI.</li>\n    </ul>\n    <div class=\"highlight\"><p>The belt has no economics of its own. It validates shape, holds slots, stages publicly, and routes. Everything that costs money happens after the router, in a lane. Build the belt and you can demo intake end to end before a single validator exists.</p></div>\n  </div>\n\n  <!-- 02 TREE -->\n  <div class=\"section\" id=\"tree\">\n    <div class=\"section-number\">// 02 \u00b7 TREE OF KNOWLEDGE</div>\n    <h2>The graph, the two lanes, the ledger</h2>\n    <p class=\"lead\">This is the build-once 80%. A canonical entity graph underneath, two lanes feeding it (machine proves, judgment grades), an append-only aSLEUTH ledger, a job runner driving the timers, and a render layer drawing it as per-niche lenses and one combined map.</p>\n\n    <h3>Canonical entity layer</h3>\n    <p>Everything hangs off <code>entity_id</code>, never a raw address. Tags and edges attach to entities so the same intel reads ten different ways depending on the lens.</p>\n<pre><span class=\"k\">entities</span>(id, kind <span class=\"c\">-- wallet|account|trader|project</span>, created_at)\n\n<span class=\"k\">identifiers</span>(id, entity_id, type <span class=\"c\">-- address|handle|trader_id</span>, value, chain)\n\n<span class=\"k\">edges</span>(id, src_entity_id, dst_entity_id,\n      kind <span class=\"c\">-- cluster|linkage|narrative_member|same_actor</span>,\n      evidence jsonb, contributor_id, grade)\n\n<span class=\"k\">tags</span>(id, entity_id, vocab_tag, lane, grade_or_tariff,\n     evidence jsonb, contributor_id, validator_version)</pre>\n\n    <h3>Machine lane \u00b7 the validator service</h3>\n    <p>A registry of small deterministic functions, one per machine-checkable category. Each fetches ground truth, compares it to the claim, returns a verdict. No human in the loop. Pass writes the node plus a fixed tariff to the ledger in one transaction, fail kills it and counts toward the rejection streak.</p>\n<pre><span class=\"t\">validate</span>(submission) <span class=\"c\">-&gt;</span> <span class=\"k\">PASS</span> | <span class=\"k\">FAIL</span> | <span class=\"k\">INCONCLUSIVE</span>  <span class=\"c\">+ evidence snapshot</span>\n\n<span class=\"c\">// INCONCLUSIVE is the load-bearing state. API down, market unsettled,</span>\n<span class=\"c\">// source unverified -&gt; falls through to the judgment window, never FAIL.</span>\n<span class=\"c\">// A contributor never eats a strike because an upstream API blinked.</span></pre>\n    <table>\n      <thead><tr><th>#</th><th>Validator</th><th>Ground truth</th><th>Check</th></tr></thead>\n      <tbody>\n        <tr><td class=\"id\">V1</td><td class=\"fw\">Outcome verification</td><td>Polymarket Gamma (have), Kalshi (new)</td><td>Fetch market by id, confirm settled, enum-compare claimed vs resolved outcome. Build first, proves the lane.</td></tr>\n        <tr><td class=\"id\">V2</td><td class=\"fw\">Contract labels</td><td>Etherscan <code>getsourcecode</code>, Solscan</td><td>Verified source, label matches signatures, proxy resolves to implementation first. Unverified returns INCONCLUSIVE.</td></tr>\n        <tr><td class=\"id\">V3</td><td class=\"fw\">Codified wallet tags</td><td>Alchemy / Helius RPC</td><td>One written rule per tag type: deployer-of, balance threshold, funded-by, interacted-with. Only tags with an on-chain predicate qualify.</td></tr>\n      </tbody>\n    </table>\n    <p>Every verdict stores an <code>evidence_snapshot</code> (source endpoint, raw response hash, on-chain refs, timestamp, validator version). Verdicts are replayable. A bug that waved bad intel through is a regrade plus a validator patch, never a contributor slash.</p>\n\n    <h3>Judgment lane \u00b7 the 5 day window machine</h3>\n    <p>Anything without a provable answer. A state machine with timers, public the whole way. Nothing judgment-graded touches the tree in under 5 days, including team-graded intel in beta.</p>\n    <div class=\"flowline\">\n      <span class=\"node gold\">PENDING</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node gold\">DRAWN \u00b7 3 verifiers</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node gold\">SEALED</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node gold\">UNSEALED</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">EXECUTE \u00b7 day 5</span>\n    </div>\n    <ul>\n      <li><strong>Timers:</strong> day 5 execution (hard, even if all verdicts land day one), 48h verifier redraw, one flag extension maximum.</li>\n      <li><strong>Execution:</strong> majority accept or kill, median of accepting grades is the grade, grade maps to aSLEUTH ($10 to $250, superlinear).</li>\n      <li><strong>No strike for a slow queue:</strong> never-picked items expire at deadline, slot released, resubmittable.</li>\n    </ul>\n    <p>The draw engine is built now, live in Phase 3. Three modes, one machine, going live is a routing change not a migration:</p>\n    <table>\n      <thead><tr><th>Mode</th><th>When</th><th>Who grades</th><th>Code delta</th></tr></thead>\n      <tbody>\n        <tr><td class=\"fw\">Team</td><td>Beta day one</td><td>Team via internal dashboard, verdicts still execute day 5</td><td>None, team is the only entry in the verifier pool</td></tr>\n        <tr><td class=\"fw\">Shadow</td><td>Phase 2</td><td>Qualifying contributors grade in parallel for $5, team decision stands</td><td>Record shadow verdicts vs team outcomes, first accuracy scores</td></tr>\n        <tr><td class=\"fw\">Swarm</td><td>Phase 3</td><td>3 blind verdicts, team drops to appeals and calibration</td><td>Draw engine takes over assignment</td></tr>\n      </tbody>\n    </table>\n<pre><span class=\"k\">verdicts</span>(id, submission_id, verifier_id,\n         verdict <span class=\"c\">-- reject | grade 1..10</span>, created_at)\n<span class=\"c\">-- draw: 3 licensed verifiers, random from niche pool, never own/linked intel</span>\n<span class=\"c\">-- licence (auto): $1000 aSLEUTH + 10 accepted in niche + acceptance &gt; floor</span>\n<span class=\"c\">-- pool minimum 9 verifiers before swarm activates in a niche (config)</span></pre>\n\n    <h3>aSLEUTH ledger</h3>\n    <p>Balance ops only, every mutation an append-only row. This is where the money lives and it is all SQL.</p>\n<pre><span class=\"k\">ledger</span>(id, contributor_id,\n       op <span class=\"c\">-- grade_issue|tariff|review_fee|regrade_delta|decay|slash</span>,\n       amount, submission_id, ts)\n<span class=\"c\">-- decay 0.5%/day after 30 days</span>\n<span class=\"c\">-- regrade up: issue diff now + wage diff on current bill; down: calibration record only</span>\n<span class=\"c\">-- daily Merkle root committed on-chain for public verification</span></pre>\n\n    <h3>Job runner + render</h3>\n    <ul>\n      <li><strong>Job runner</strong> (Redis + workers + scheduler): validator runs, window timers, decay sweeps, epoch bill at close on the 1st, mid-month dry-run on the 15th to catch ledger drift, Merkle commits. A burst of submissions never blocks the API.</li>\n      <li><strong>Render layer</strong> (React/TS + D3): per-niche lenses, one combined map, per-entity node view (badges, evidence, contributor, grade or tariff, lane it came through, flag button). Reads the entity layer.</li>\n    </ul>\n\n    <h3>Endpoints</h3>\n    <ul>\n      <li><code>GET /v1/entities/{id}</code> node view, all tags and edges.</li>\n      <li><code>GET /v1/tree?niche=</code> single lens, omit niche for the combined map.</li>\n      <li><code>GET /v1/ledger/{contributor_id}</code> balance and history.</li>\n      <li>Validator runs and window transitions are internal, driven by the job runner not the API.</li>\n    </ul>\n    <div class=\"highlight\"><p>Dormant from day one, switched on by phase, no rebuild: head hunting and slashing records, verifier track records (licences, draws, accuracy), and identity linkage edges. All of it is rows and timers on tables that already exist.</p></div>\n  </div>\n\n  <!-- 03 MOST WANTED -->\n  <div class=\"section heat\" id=\"mw\">\n    <div class=\"section-number\">// 03 \u00b7 MOST WANTED \u00b7 DOWNSTREAM</div>\n    <h2>Demand layer, build after the Tree</h2>\n    <p class=\"lead\">A layer on the Tree, not a change to it. It adds one input before the work (what to hunt) and one coefficient after the grade (what the answer bills at). The belt, lanes, grading, ceilings, decay and slashing all run exactly as built. Do not start this until the Tree, verifier track, billing and API credits are live. It is summarised here so you build the two hooks now and bolt the rest on later.</p>\n    <div class=\"flowline\">\n      <span class=\"node hot\">BUYERS VOTE</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node hot\">BOARD RANKS \u00b7 HEAT SET</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">SWARM SUBMITS \u00b7 BELT UNCHANGED</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">GRADE 1-10 \u00b7 UNCHANGED</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node hot\">GRADE \u00d7 HEAT</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">EPOCH BILL \u00b7 CEILINGS UNCHANGED</span>\n    </div>\n\n    <h3>The two hooks to leave in now</h3>\n    <ul>\n      <li><strong>Before the work:</strong> a request resolves to a <code>target_entity_id</code>. That is the same target a belt submission carries, so a request and an answering submission already share a join key. Leave the column reachable.</li>\n      <li><strong>At settlement:</strong> the ledger reads a heat coefficient when it writes <code>grade_issue</code>. Default 1.0x so the system behaves identically until Most Wanted ships. Adding heat later is reading one extra value, not a settlement rewrite.</li>\n    </ul>\n\n    <h3>Data model</h3>\n<pre><span class=\"k\">requests</span>(id, target_entity_id <span class=\"c\">-- or free-text question</span>, niche,\n         status, heat_band <span class=\"c\">-- 1.0|1.25|1.5</span>, activated bool, created_at)\n<span class=\"c\">-- requests against the same target merge automatically</span>\n\n<span class=\"k\">votes</span>(id, request_id, account_id, epoch, allocated)\n<span class=\"c\">-- allocations not spends, reset each epoch, never bought with SLEUTH</span></pre>\n\n    <h3>Votes and heat</h3>\n    <p>Votes are allocations that scale with what an account pays the platform, reset every epoch, never purchasable. Heat is a multiplier band on the top of the board applied to the graded dollar value of an accepted answer, inside the existing ceilings. Numbers are a founder call, these are the indicative ones:</p>\n    <table>\n      <thead><tr><th>Input</th><th>Value</th><th>Note</th></tr></thead>\n      <tbody>\n        <tr><td class=\"fw\">Tier 1 / 2 / 3 votes</td><td>3 / 5 / 8 per epoch</td><td>Scales with spend, free tier gets 0</td></tr>\n        <tr><td class=\"fw\">API / agents</td><td>By credit spend</td><td>Machine demand counts the same as human</td></tr>\n        <tr><td class=\"fw\">Heat bands</td><td>1.5x top, 1.25x second, else 1.0x</td><td>Applied to graded value at settlement</td></tr>\n        <tr><td class=\"fw\">Activation threshold</td><td>min distinct paying accounts (proposed 5)</td><td>One account is a request, not a market</td></tr>\n      </tbody>\n    </table>\n    <ul>\n      <li><strong>First accepted answer takes the heat,</strong> the multiplier dies on verification. Same race logic as decay.</li>\n      <li><strong>Heat never touches the grade.</strong> Blind verifiers never see it. Verifiers grade quality, the board prices urgency, the two never share state.</li>\n      <li><strong>Heat redistributes the bill, never grows it.</strong> Heated values hit the epoch bill capped by the two ceilings ($150K or 0.5% supply, pro-rata on overflow). No new emission.</li>\n    </ul>\n\n    <h3>Anti-gaming, baked in</h3>\n    <ul>\n      <li>Self-request farming: every sybil seat is a $30/mo paid account, the cap is 1.5x, and requester/answerer correlation is exactly what head hunters get paid to flag.</li>\n      <li>Board spam: filing is free but votes are scarce and reset monthly, unvoted requests sink.</li>\n      <li>Heat sniping with copied intel: the known-elsewhere check grades commodity intel at the floor, and floor \u00d7 1.5x is still the floor. Ships with the same grading-time plumbing.</li>\n    </ul>\n\n    <h3>Endpoints + rollout</h3>\n    <ul>\n      <li><code>POST /v1/most-wanted</code> file a request, auto-merge on target.</li>\n      <li><code>POST /v1/most-wanted/{id}/vote</code> allocate epoch votes.</li>\n      <li><code>GET /v1/most-wanted</code> the board, public read, heat visible.</li>\n      <li><strong>Phase 1</strong> read-only board, no multiplier. <strong>Phase 2</strong> heat live with the known-elsewhere check. <strong>Phase 3</strong> agent demand routing over MCP, both directions.</li>\n    </ul>\n    <div class=\"highlight\"><p>Net for the build: ship the two hooks (target join key, 1.0x default heat coefficient) inside the Tree work. Everything else here is two tables, a board UI and a settlement coefficient that flips off 1.0x. Do not let it block the Tree.</p></div>\n  </div>\n\n  <!-- 04 BUILD ORDER -->\n  <div class=\"section\" id=\"order\">\n    <div class=\"section-number\">// 04 \u00b7 BUILD ORDER</div>\n    <h2>Sequence</h2>\n    <p>Core engine first, machine V1 and the window machine ride alongside it, cheap niches on data we already have, heavy ones staged. Beta at W6 holds: V1 rides Polymarket data we already integrate, the window runs in team mode, no draw engine needed day one. Most Wanted sits entirely after billing.</p>\n    <div class=\"gantt\">\n      <div class=\"g-scale\"><div></div><div class=\"g-weeks\"><span>W0</span><span>W2</span><span>W4</span><span>W6</span><span>W8</span><span>W10</span><span>W12</span></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Core: entity layer + belt + ledger + jobs</div><div class=\"g-track\"><div class=\"g-mark\" style=\"left:50%;\"><span>Beta \u00b7 W6</span></div><div class=\"g-mark\" style=\"left:83%;\"><span>Billing \u00b7 W10&#8211;12</span></div><div class=\"g-bar b-core\" style=\"left:0;width:33%;\">CORE ENGINE</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Machine lane \u00b7 V1 outcome</div><div class=\"g-track\"><div class=\"g-bar b-mach\" style=\"left:17%;width:16%;\">V1</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Judgment window \u00b7 team mode</div><div class=\"g-track\"><div class=\"g-bar b-judg\" style=\"left:21%;width:21%;\">WINDOW + DASH</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Wave 1 niches \u00b7 ride-along</div><div class=\"g-track\"><div class=\"g-bar b-w1\" style=\"left:29%;width:21%;\">FW 1,5,10,2,9</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Machine lane \u00b7 V2, V3</div><div class=\"g-track\"><div class=\"g-bar b-mach\" style=\"left:50%;width:21%;\">CONTRACT + WALLET</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Wave 2 niches</div><div class=\"g-track\"><div class=\"g-bar b-w1\" style=\"left:54%;width:25%;\">FW 3,4,6</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Most Wanted \u00b7 board + heat</div><div class=\"g-track\"><div class=\"g-bar b-heat\" style=\"left:83%;width:17%;\">PHASE 1 &#8594; 2</div></div></div>\n    </div>\n    <ul>\n      <li><strong>By beta (W6):</strong> core + Wave 1 live, belt flowing onto the conveyor, router splitting lanes, V1 verifying outcomes instantly, the window in team mode, everything graduating to the Tree at day 5.</li>\n      <li><strong>W6 to 12:</strong> V2 and V3, Wave 2, shadow mode building accuracy scores, billing online at $30/mo.</li>\n      <li><strong>Post beta:</strong> head hunting and slashing activate, verifier track goes to swarm mode, Most Wanted Phase 1 read-only board, then heat in Phase 2.</li>\n    </ul>\n    <div class=\"highlight\"><p>The one open question that swings every estimate: is the 7-chain GraphQL layer and the PM stats pipeline first-party or vendor. First-party keeps frameworks 1 to 4 cheap and V2/V3 mostly querying. Owning ingestion is where a data engineer earns their salary. Answer this before locking numbers.</p></div>\n  </div>\n\n  <div class=\"footer\">SLEUTH \u00b7 BELT + TREE + MOST WANTED \u00b7 BUILD BRIEF v1 \u00b7 INTERNAL \u00b7 DEV \u00b7 WP v15.1 MASTER</div>\n\n</div>\n<script>\n  const c=document.getElementById('matrix-canvas'),x=c.getContext('2d');\n  function size(){c.width=window.innerWidth;c.height=window.innerHeight;}\n  size();window.addEventListener('resize',size);\n  const chars='01SLEUTH<>{}[]#$%&*+=\u30a2\u30a4\u30a6\u30a8\u30aa'.split('');const fs=14;let drops=[];\n  function draw(){x.fillStyle='rgba(6,6,6,0.08)';x.fillRect(0,0,c.width,c.height);x.fillStyle='#00FF66';x.font=fs+'px monospace';\n    const cols=Math.floor(c.width/fs);for(let i=0;i<cols;i++){const ch=chars[Math.floor(Math.random()*chars.length)];x.fillText(ch,i*fs,(drops[i]||1)*fs);if((drops[i]||1)*fs>c.height&&Math.random()>0.975)drops[i]=0;drops[i]=(drops[i]||1)+1;}}\n  setInterval(draw,60);\n  const io=new IntersectionObserver((es)=>{es.forEach(e=>{if(e.isIntersecting)e.target.classList.add('visible');});},{threshold:0.1});\n  document.querySelectorAll('.section').forEach(s=>io.observe(s));\n</script>\n</body>\n</html>\n" } style={{ width: "100%", minHeight: "100vh", border: "none", display: "block", background: "#060606" }} />
</div>
