> ## 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 - Tree of Knowledge - Build Spec v2 (Dev)

> Original Sleuth document.

<div style={{ margin: "-24px -32px", width: "calc(100% + 64px)" }}>
  <iframe title="Sleuth - Tree of Knowledge - Build Spec v2 (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 Tree of Knowledge \u00b7 Build Spec v2 (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);--red:#FF4444;--blue:#5b8fff;}\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.18;}\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:80px 0 50px;border-bottom:1px solid var(--border);margin-bottom:60px;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:20px;}\n  .logo{font-family:'Orbitron',sans-serif;font-size:38px;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:5px;margin-bottom:16px;line-height:1.2;}\n  .tagline{font-size:13px;color:var(--green-dim);text-transform:uppercase;letter-spacing:5px;margin-bottom:16px;}\n  .subtitle{font-size:13px;color:var(--gold);max-width:680px;margin:0 auto;line-height:1.7;}\n\n  .marquee{padding:11px 0;overflow:hidden;position:relative;margin:44px 0;border-top:1px solid var(--border);border-bottom:1px solid var(--border);}\n  .marquee::before,.marquee::after{content:'';position:absolute;top:0;width:90px;height:100%;z-index:1;}\n  .marquee::before{left:0;background:linear-gradient(90deg,var(--bg),transparent);}\n  .marquee::after{right:0;background:linear-gradient(-90deg,var(--bg),transparent);}\n  .marquee-inner{display:flex;white-space:nowrap;animation:mq 36s linear infinite;}\n  @keyframes mq{from{transform:translateX(0);}to{transform:translateX(-50%);}}\n  .marquee-item{font-size:11px;display:inline-flex;align-items:center;gap:10px;padding:0 34px;color:var(--green);letter-spacing:1px;font-weight:900;text-transform:uppercase;}\n  .marquee-item .dot{width:5px;height:5px;border-radius:50%;background:var(--green);box-shadow:0 0 6px var(--green-glow);}\n\n  .section{margin-bottom:74px;opacity:0;transform:translateY(20px);transition:opacity .7s ease,transform .7s ease;}\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  h2{font-family:'Orbitron',sans-serif;font-size:24px;color:var(--green);text-shadow:0 0 22px var(--green-glow);margin-bottom:22px;padding-bottom:14px;border-bottom:1px solid var(--border);}\n  h3{font-family:'Orbitron',sans-serif;font-size:14px;color:var(--green-dim);margin:30px 0 14px;letter-spacing:1px;}\n  p{margin-bottom:15px;color:var(--gold);font-size:14px;line-height:1.85;}\n  strong{color:var(--green);}\n  .lead{font-size:16px;color:var(--text);margin-bottom:20px;}\n  ul{list-style:none;margin:14px 0;padding:0;}\n  ul li{position:relative;padding-left:22px;margin-bottom:10px;color:var(--gold);font-size:14px;}\n  ul li::before{content:'>';position:absolute;left:0;color:var(--green);}\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  table{width:100%;border-collapse:collapse;margin:24px 0;font-size:12.5px;}\n  th{background:rgba(0,255,102,0.07);color:var(--green);text-align:left;padding:12px 12px;border:1px solid var(--border);font-family:'Orbitron',sans-serif;font-size:10px;text-transform:uppercase;letter-spacing:1px;}\n  td{padding:11px 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  .md{background:rgba(255,215,0,0.1);color:var(--gold);border:1px solid rgba(255,215,0,0.3);}\n  .hi{background:rgba(255,68,68,0.12);color:var(--red);border:1px solid rgba(255,68,68,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:22px 24px;margin:18px 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  .card-title{font-family:'Orbitron',sans-serif;font-size:12px;color:var(--green);text-transform:uppercase;letter-spacing:2px;margin-bottom:12px;}\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:20px 24px;margin:20px 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:15px;margin:0;}\n\n  .grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin:18px 0;}\n  .stk{background:var(--card);border:1px solid var(--border);border-top:2px solid var(--green);padding:18px 20px;}\n  .stk h4{font-family:'Orbitron',sans-serif;font-size:12px;color:var(--green);letter-spacing:1px;margin-bottom:10px;}\n  .stk ul li{font-size:13px;margin-bottom:8px;}\n\n  .flowline{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:22px 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 .arr{color:var(--green-dim);}\n\n  /* GANTT */\n  .gantt{margin:24px 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-w3{background:linear-gradient(90deg,#7fa8ff,#5b8fff);color:#fff;}\n  .b-acc{background:linear-gradient(90deg,#c084fc,#8e54c9);color:#fff;}\n  .b-shdw{background:repeating-linear-gradient(45deg,#c9a800,#c9a800 6px,#8f7600 6px,#8f7600 12px);color:#0a0a00;}\n  .b-slash{background:repeating-linear-gradient(45deg,#FF4444,#FF4444 6px,#a82a2a 6px,#a82a2a 12px);color:#fff;}\n  .g-mark{position:absolute;top:-22px;bottom:-260px;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:40px;border-top:1px solid var(--border);margin-top:50px;font-size:11px;color:var(--text);opacity:.6;letter-spacing:2px;}\n  @media(max-width:720px){.grid2{grid-template-columns:1fr;}.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 SPEC \u00b7 v2</div>\n    <div class=\"logo\">TREE OF KNOWLEDGE<br>BUILD SPEC</div>\n    <div class=\"tagline\">How we actually build it</div>\n    <div class=\"subtitle\">The plumbing behind the swarm layer. One core engine, two lanes off the belt, ten thin niche layers on top. Python and TypeScript throughout. No Rust. Supersedes v1. Where this conflicts with anything, the whitepaper wins.</div>\n  </div>\n\n  <div class=\"marquee\"><div class=\"marquee-inner\">\n    <span class=\"marquee-item\"><span class=\"dot\"></span>Build the engine once \u00b7 bolt the niches on</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>The machine lane proves, it never guesses</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>Nothing judgment graded touches the tree in under 5 days</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>aSLEUTH is a ledger balance, not a contract</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>Build the engine once \u00b7 bolt the niches on</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>The machine lane proves, it never guesses</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>Nothing judgment graded touches the tree in under 5 days</span>\n    <span class=\"marquee-item\"><span class=\"dot\"></span>aSLEUTH is a ledger balance, not a contract</span>\n  </div></div>\n\n  <!-- 00 THE SHAPE -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 00 \u00b7 THE SHAPE</div>\n    <h2>One engine, two lanes, ten thin layers</h2>\n    <p class=\"lead\">The expensive 80% is a single shared engine built once: the submission pipeline with its pre-filters and slot system, the belt, the lane router, the machine lane's validator service, the judgment lane's window machine, the aSLEUTH ledger, the canonical entity graph, and the render layer. Every framework then reduces to four small things: a controlled vocabulary, an evidence rule, a lane assignment, and a render slot on the map.</p>\n    <p>The belt splits in two after intake. <strong>Machine lane:</strong> objective intel with a provable answer, checked by a deterministic validator against chain and platform data, added or killed on arrival, paid a fixed tariff. <strong>Judgment lane:</strong> everything else, a 5 day public window, three blind verdicts, nothing executes before day 5. The lane is not infrastructure mystique, it is a routing decision made by one column on the category table. The validators are the only genuinely new machinery in v2 and they are small, deterministic functions over data sources we already touch.</p>\n    <div class=\"flowline\">\n      <span class=\"node\">FORM / AGENT API</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">PRE-FILTERS \u00b7 vocab, schema, dedupe</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">SLOT CHECK</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">BELT \u00b7 public pending</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node blue\">LANE ROUTER</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node blue\">MACHINE \u00b7 instant</span><span class=\"arr\">/</span>\n      <span class=\"node gold\">JUDGMENT \u00b7 5 days</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">TREE + LEDGER</span>\n    </div>\n    <div class=\"highlight\"><p>Because aSLEUTH is a platform ledger balance and not an ERC-20, issuance, tariffs, regrades, decay and slashing are all SQL transactions. The on-chain surface stays tiny: a daily Merkle root and the token contracts. That is why this ships fast.</p></div>\n  </div>\n\n  <!-- 01 THE CORE -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 01 \u00b7 THE CORE</div>\n    <h2>The shared engine (build once)</h2>\n    <p>Eight components now, up from six in v1, because the slot system and the lane router were missing. Build these and every niche is mostly config plus a display slot. Call it <strong>3 to 4 weeks</strong> for a lean team, the lanes added roughly a week and a half over the v1 estimate. Honest number, written in.</p>\n\n    <table>\n      <thead><tr><th>Component</th><th>What it is (dev terms)</th><th>Stack</th></tr></thead>\n      <tbody>\n        <tr><td class=\"fw\">Canonical entity layer</td><td>The graph under everything. <code>entities</code> (one row per real actor), <code>identifiers</code> (wallets, handles, trader IDs map to an entity), <code>edges</code> (clusters, linkage, narrative membership), <code>tags</code> (badges on a node). Tags and links hang off <code>entity_id</code>, never a raw address.</td><td>Postgres, Python</td></tr>\n        <tr><td class=\"fw\">Submission pipeline + pre-filters</td><td>One pipeline for humans and agents (<code>contributor_type</code> flag, same rates, same rules). Form or API to controlled vocab to evidence payload to a pending node. Pre-filters run before anything lands: vocab enforcement, schema validation, dedupe against the existing tree. Zero human cost, garbage bounces here. Marketplace APIs are a separate system that never touches this.</td><td>Python (FastAPI), React/TS form</td></tr>\n        <tr><td class=\"fw\">Slots + cooldowns</td><td>Throughput control per the WP. Every contributor holds belt slots, each pending submission occupies one until it resolves. New accounts start at 3, scaling to around 25 driven by acceptance rate and aSLEUTH balance. Rejection streaks add escalating cooldowns, reset by any acceptance. Items that expire unpicked release the slot with no strike and can be resubmitted. All constants live in a config table, beta tunable, nothing hardcoded.</td><td>Postgres, Python</td></tr>\n        <tr><td class=\"fw\">The belt (staging)</td><td>Public intake. Pending nodes and edges everyone can see, scrub, correct and flag. Open to everyone, gated by track record per the WP: slots, cooldowns and acceptance history do the throttling, never a tier check. Belt corrections log as their own contribution records.</td><td>Postgres, React/TS</td></tr>\n        <tr><td class=\"fw\">The lane router</td><td>One decision on the category table: <code>machine_checkable</code> flag plus <code>validator_id</code>. Set, the item queues for the validator service. Null, the item enters the 5 day judgment window. Categories migrate lanes by flipping the flag and registering a validator, no schema change.</td><td>Postgres, Python</td></tr>\n        <tr><td class=\"fw\">aSLEUTH ledger</td><td>Balance ops only, every mutation an append-only ledger row: grade issuance ($10 to $250), machine tariffs, verifier review fees ($5 flat, capped at 15% of any month's bill), regrade deltas, 0.5%/day decay after 30 days, slashing splits (recorded, dormant in beta). Retroactive regrading is a first-class op: upgrade issues the aSLEUTH difference immediately and puts the wage difference on the current month's bill, downgrade writes a calibration record and touches nothing. Daily Merkle root committed on-chain for public verification.</td><td>Python, Postgres, one small Solidity contract</td></tr>\n        <tr><td class=\"fw\">Job runner</td><td>The async backbone: validator executions, window timers (day 5 execution, 48h verifier redraws, flag extensions), decay sweeps, epoch bill assembly at close on the 1st, a mid-month dry-run on the 15th to surface ledger drift before it matters, Merkle commits. Burst of submissions never blocks the API.</td><td>Python workers + Redis queue, cron-style scheduler</td></tr>\n        <tr><td class=\"fw\">Render layer (the Tree)</td><td>The graph drawn as per-niche lenses and one combined map, plus the per-entity node view: badges, evidence, contributor, grade or tariff, lane it came through, flag button. Reads the entity layer.</td><td>React/TS, D3 or similar</td></tr>\n      </tbody>\n    </table>\n    <div class=\"card\">\n      <div class=\"card-title\">Built into the core, dormant until their phase</div>\n      <ul>\n        <li>Head hunting and slashing records exist from day one, the reporter economy switches on post beta. Slashing grades 1 to 3, the $500 licence, false flag counters and the 30 day appeal windows are all just rows and timers on tables that already exist.</li>\n        <li>Verifier track records (licences, draws, verdicts, accuracy scores) exist from day one. Shadow mode activates in beta per the roadmap, live grading takes over in Phase 3. Going live is a routing change, not a migration.</li>\n        <li>Identity linkage (the cross-domain edges, a parked eleventh niche) is enabled by the entity layer. Parked as a launch item, adding it later is drawing edges, not a rebuild.</li>\n      </ul>\n    </div>\n  </div>\n\n  <!-- 02 MACHINE LANE -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 02 \u00b7 MACHINE LANE</div>\n    <h2>The validator service</h2>\n    <p class=\"lead\">Not magic. A registry of small deterministic functions, one per machine-checkable category, each with a single job: fetch ground truth from a source, compare it to the claim, return a verdict. Pass and the node goes live with the tariff written to the ledger. Fail and it dies on arrival, counting toward the contributor's rejection streak. No human anywhere in the loop.</p>\n\n    <h3>The validator contract</h3>\n    <p>Every validator implements the same interface: <code>validate(submission) &#8594; PASS | FAIL | INCONCLUSIVE</code> plus an evidence snapshot. The third state is the load-bearing design decision. API down, market not yet resolved, contract unverified on the explorer: the validator cannot prove the claim either way, so the item <strong>falls through to the judgment lane window instead of dying</strong>. The machine lane only acts when it can prove. It never guesses, and a contributor never eats a strike because an upstream API blinked.</p>\n    <div class=\"flowline\">\n      <span class=\"node blue\">VALIDATOR RUNS</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">PASS \u00b7 tree + tariff</span><span class=\"arr\">/</span>\n      <span class=\"node red\">FAIL \u00b7 killed, streak counts</span><span class=\"arr\">/</span>\n      <span class=\"node gold\">INCONCLUSIVE \u00b7 routes to judgment lane</span>\n    </div>\n\n    <h3>Evidence snapshots \u00b7 the machine is accountable too</h3>\n    <p>Every machine verdict stores exactly what the system saw: source endpoint, raw response hash, the on-chain references (tx hashes, block numbers, market IDs), timestamp, and the validator version that ran. Verdicts are replayable. Head hunting applies to machine-passed intel the same as anything else, so when a pass gets flagged later we audit the snapshot, not an opinion. A validator bug that waved bad intel through is a regrade plus a validator patch, never a contributor slash.</p>\n\n    <h3>The v1 registry \u00b7 three validators, built in this order</h3>\n    <table>\n      <thead><tr><th>#</th><th>Validator</th><th>Ground truth source</th><th>The check</th><th>Notes</th></tr></thead>\n      <tbody>\n        <tr><td class=\"id\">V1</td><td class=\"fw\">Outcome verification</td><td>Polymarket Gamma API (have), Kalshi API (new)</td><td>Fetch market by ID, confirm it is settled, compare claimed outcome to resolved outcome. Pure enum comparison.</td><td>Build first. Fully deterministic, rides PM data we already integrate, proves the lane end to end.</td></tr>\n        <tr><td class=\"id\">V2</td><td class=\"fw\">Contract labels</td><td>Etherscan family <code>getsourcecode</code>, Solscan</td><td>Contract is verified, submitted label matches verified source name and known signatures, proxy detection resolves to the implementation before comparing.</td><td>Mostly deterministic. Unverified source returns INCONCLUSIVE, not FAIL.</td></tr>\n        <tr><td class=\"id\">V3</td><td class=\"fw\">Codified wallet tags</td><td>Indexer / RPC (Alchemy, Helius)</td><td>One written rule per tag type, executed verbatim: deployer-of (one RPC call), balance threshold, funded-by, interacted-with-contract.</td><td>Only tags with an on-chain predicate qualify. The vocab splits wallet tags into codified (machine) and judgment (\"smart money\" stays judgment until a codified rule exists).</td></tr>\n      </tbody>\n    </table>\n\n    <h3>Tariffs</h3>\n    <p>Machine-verified intel pays a fixed formula tariff per category, set from beta data, written to the ledger on PASS in the same transaction that publishes the node. No grading, no window, no verifier fee. Tariff values live in the same config table as everything else: beta tunable, but provisional values must be seeded before W6, because beta is epoch one and V1 pays from its first PASS. Day-one rule of thumb: a machine-verified claim with a linking edge (outcome tied to a trader, an account, a tracked position) pays a real tariff; a bare claim with no link (a naked outcome verification anyone could script) pays at or near zero. The linking is the contribution, the public fact is free, and the bottom rung never becomes a farm.</p>\n\n    <h3>\"The tree trains its own gatekeeper\" in dev terms</h3>\n    <p>Not ML, not in v1. Two concrete mechanisms. First, every new submission is cross-checked against the existing graph: dedupe and contradiction detection (\"this wallet already carries a verified deployer tag for a different contract at the same block\") get sharper as the tree grows, at zero marginal cost. Second, judgment categories that accumulate enough resolved examples get a codified rule written, a validator registered, and the flag flipped: the category migrates to the machine lane. The tree growing literally expands what is machine checkable. Auto-detection models remain a separate research track, not in any v1 figure.</p>\n    <div class=\"highlight\"><p>Cost reality: Polymarket's API is free, Etherscan free tier covers early volume, RPC rides what we already run. The real ongoing cost of the machine lane is writing and maintaining the rule per tag type, which is exactly where it should be.</p></div>\n  </div>\n\n  <!-- 03 JUDGMENT LANE -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 03 \u00b7 JUDGMENT LANE</div>\n    <h2>The 5 day window machine</h2>\n    <p class=\"lead\">Anything without a provable answer: narratives, trader profiles, cluster maps, alpha accounts. A state machine with timers, publicly visible the whole way. The window mechanics run from day one of beta so behavior is identical when the swarm takes over from the team. Nothing judgment graded ever touches the tree in under 5 days, including team-graded intel during beta.</p>\n\n    <div class=\"flowline\">\n      <span class=\"node gold\">PENDING \u00b7 in window</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 \u00b7 verdicts in</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node gold\">UNSEALED \u00b7 public</span><span class=\"arr\">&#8594;</span>\n      <span class=\"node\">EXECUTE \u00b7 day 5</span>\n    </div>\n    <ul>\n      <li><strong>Flagged inside the window:</strong> draws two more verifiers and extends the window once. One extension maximum.</li>\n      <li><strong>No verifier ever picked it up:</strong> expires at the deadline with no strike, slot released, resubmittable. A contributor never eats a penalty for a slow queue.</li>\n      <li><strong>Verdict redraws:</strong> a drawn verifier has 48 hours to respond or the item redraws to a new verifier.</li>\n      <li><strong>Execution:</strong> majority decides accept or kill, the median of the accepting grades is the grade, the grade is the aSLEUTH ($10 to $250, superlinear). Nothing executes before day 5 even if all verdicts land on day one.</li>\n    </ul>\n\n    <h3>Three operating modes, one machine</h3>\n    <table>\n      <thead><tr><th>Mode</th><th>When</th><th>Who grades</th><th>What changes in code</th></tr></thead>\n      <tbody>\n        <tr><td class=\"fw\">Team mode</td><td>Beta from day one</td><td>Team, via the internal dashboard, verdicts still execute at day 5</td><td>Nothing, the team is just the only entry in the verifier pool</td></tr>\n        <tr><td class=\"fw\">Shadow mode</td><td>Phase 2, per the roadmap</td><td>Qualifying contributors grade in parallel for pay, team decision stands</td><td>Shadow verdicts recorded against team outcomes, building the first accuracy scores. $5 per review applies.</td></tr>\n        <tr><td class=\"fw\">Swarm mode</td><td>Phase 3 \u00b7 Verifier Track live</td><td>Three blind verdicts per item, team drops to appeals, audits, calibration</td><td>A routing change. The draw engine takes over assignment.</td></tr>\n      </tbody>\n    </table>\n\n    <h3>The draw engine (built now, live Phase 3)</h3>\n    <ul>\n      <li><strong>Licence, automatic:</strong> $1,000 in aSLEUTH plus a minimum of 10 accepted contributions in the niche plus an acceptance rate above the floor. The ledger issues it when the bar is hit and pauses it when the record slips. Nobody chooses verifiers, the record does. This is a nightly job over tables we already have.</li>\n      <li><strong>The draw:</strong> three licensed verifiers per item, random from the niche pool, never the contributor's own intel, never linked accounts (the entity layer answers \"linked\"). Accuracy score weights draw frequency.</li>\n      <li><strong>Pool minimum:</strong> a niche needs nine licensed verifiers before swarm grading activates there. Below nine, senior cross-niche verifiers or the team carry it. A config threshold, per niche.</li>\n      <li><strong>Blind verdicts:</strong> one action, reject or a grade 1 to 10. Verifiers see the full submission, evidence and belt activity, never each other's votes until all three are in. Verdicts unseal when the third lands and sit public for the rest of the window.</li>\n      <li><strong>Pay:</strong> $5 flat per completed review, in aSLEUTH, on the normal epoch bill with normal vesting, never a share of the grade assigned. Capped at 15% of any month's bill, enforced by the ledger.</li>\n      <li><strong>Anonymity:</strong> both directions, before and after. The submitter sees the grade, never the graders.</li>\n      <li><strong>Accountability:</strong> per-verifier accuracy score from verdict-vs-consensus and how passes hold up on the tree. Verifier slashing records ($50 per upheld bad pass, ten times the review fee, suspension at three in 90 days, the reject-and-outvoted protection) exist from day one, enforce post beta.</li>\n    </ul>\n  </div>\n\n  <!-- 04 THE TEN -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 04 \u00b7 THE TEN</div>\n    <h2>Frameworks 1 to 10 \u00b7 build table</h2>\n    <p>Incremental delta on top of the core. Cost, difficulty and time assume the data is already flowing. New in v2: every row carries a lane. Mixed means the vocab splits, codified tag types route machine, the rest sit the window.</p>\n    <table>\n      <thead><tr><th>#</th><th>Framework</th><th>Lane</th><th>What you build</th><th>Data dependency</th><th>Cost</th><th>Diff</th><th>Time</th></tr></thead>\n      <tbody>\n        <tr><td class=\"id\">1</td><td class=\"fw\">Wallet Identity</td><td><span class=\"pill mixed\">Mixed</span></td><td>Tag schema on entity nodes, match against known-address lists. Codified tags (deployer-of, threshold, funded-by) route to V3, attribution claims sit the window.</td><td>Indexer + label lists</td><td><span class=\"pill lo\">Low</span></td><td><span class=\"pill lo\">Low</span></td><td>~0.5 wk</td></tr>\n        <tr><td class=\"id\">2</td><td class=\"fw\">Wallet Behavior</td><td><span class=\"pill judgment\">Judgment</span></td><td>Pattern flags over tx history, human asserted first. Auto-detectors (sniper, bundler) are the research track and a future lane migration.</td><td>Tx history</td><td><span class=\"pill md\">Med</span></td><td><span class=\"pill md\">Med</span></td><td>~1&#8211;2 wk</td></tr>\n        <tr><td class=\"id\">3</td><td class=\"fw\">Contract / Protocol</td><td><span class=\"pill mixed\">Mixed</span></td><td>Contract metadata, ABI parse, deployer and proxy detection. Verified-source labels route to V2, protocol-level annotations sit the window.</td><td>Explorer API (Etherscan/Solscan)</td><td><span class=\"pill md\">Med</span></td><td><span class=\"pill md\">Med</span></td><td>~1.5 wk</td></tr>\n        <tr><td class=\"id\">4</td><td class=\"fw\">Risk / Threat</td><td><span class=\"pill judgment\">Judgment</span></td><td>Cross-entity flags, strict evidence bar, mandatory review gate, honeypot sim and known-drainer lists. Never machine lane: false positives feed slashing and carry legal risk, a human gate is policy, not a gap.</td><td>Sim (Tenderly/Anvil) + lists</td><td><span class=\"pill hi\">Med-Hi</span></td><td><span class=\"pill hi\">High</span></td><td>~2 wk + policy</td></tr>\n        <tr><td class=\"id\">5</td><td class=\"fw\">PM Trader</td><td><span class=\"pill judgment\">Judgment</span></td><td>Archetype tags over trader stats we already compute. Mostly human judgment by definition.</td><td>PM stats (have)</td><td><span class=\"pill lo\">Low</span></td><td><span class=\"pill md\">Low-Md</span></td><td>~0.5&#8211;1 wk</td></tr>\n        <tr><td class=\"id\">6</td><td class=\"fw\">PM Market</td><td><span class=\"pill mixed\">Mixed</span></td><td>Outcome verification routes to V1, the flagship machine category. Theme and ambiguity tags sit the window. Cross-venue mispricing needs the Kalshi feed.</td><td>Polymarket (have) + Kalshi (new)</td><td><span class=\"pill md\">Med</span></td><td><span class=\"pill md\">Med</span></td><td>~1&#8211;1.5 wk</td></tr>\n        <tr><td class=\"id\">7</td><td class=\"fw\">Social Account</td><td><span class=\"pill judgment\">Judgment</span></td><td>Submission plus role tag is easy. Useful needs X/Discord/TG/Farcaster ingestion. X API pricing drives it.</td><td>Social APIs</td><td><span class=\"pill hi\">Med-Hi</span></td><td><span class=\"pill hi\">Med-Hi</span></td><td>~2 wk (tag-only 3&#8211;4 d)</td></tr>\n        <tr><td class=\"id\">8</td><td class=\"fw\">Account Accuracy</td><td><span class=\"pill judgment\">Judgment</span></td><td>Longitudinal engine: capture a call, resolve vs outcome, score over time. A product, not a tag. Resolution checks reuse V1 plumbing where the call maps to a settled market.</td><td>Social + outcomes</td><td><span class=\"pill hi\">High</span></td><td><span class=\"pill hi\">High</span></td><td>MVP ~1 wk, real 4&#8211;6 wk</td></tr>\n        <tr><td class=\"id\">9</td><td class=\"fw\">Narrative / Theme</td><td><span class=\"pill judgment\">Judgment</span></td><td>Manual tagging plus attaching tokens/accounts is easy. Auto-detecting emergence is research grade.</td><td>Feed / social</td><td><span class=\"pill lo\">Low*</span></td><td><span class=\"pill lo\">Low*</span></td><td>~1 wk manual</td></tr>\n        <tr><td class=\"id\">10</td><td class=\"fw\">Project</td><td><span class=\"pill judgment\">Judgment</span></td><td>Structured metadata on Discover entities, mostly human entered. Backer data manual or a paid feed.</td><td>Discover (have) + optional feed</td><td><span class=\"pill md\">Low-Md</span></td><td><span class=\"pill md\">Low-Md</span></td><td>~1 wk</td></tr>\n      </tbody>\n    </table>\n    <p style=\"font-size:12px;opacity:.7;\">* manual mode. Auto-detection (9) and auto-detectors (2) are a separate research track, not in the v1 figure. Lane migrations happen by flipping the category flag and registering a validator, never a rebuild.</p>\n    <div class=\"highlight\"><p>Two frameworks dominate the tail: 7 is gated by social-data cost, 8 is a real longitudinal product. 4 is the sneaky one, medium cost but high stakes, and it stays judgment lane permanently by policy. Everything else is vocab plus a lane assignment plus a render slot.</p></div>\n  </div>\n\n  <!-- 05 STACK -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 05 \u00b7 THE STACK</div>\n    <h2>What to build it with</h2>\n    <p>Two engineers' worth of skill cover the whole thing: a strong Python/data backend and a TypeScript/React frontend. The scarce skill is data engineering and API integration, not a language. New in v2: a job queue, because the lanes run on timers and async validation.</p>\n    <div class=\"grid2\">\n      <div class=\"stk\"><h4>Backend</h4><ul>\n        <li><strong>Python (FastAPI)</strong> for the pipeline, router, lanes, ledger and entity graph. The ledger logic is SQL transactions.</li>\n        <li><strong>Postgres</strong> for entities, edges, tags, submissions, verdicts, ledger, config. A graph store can wait, Postgres edges are fine for v1.</li>\n        <li><strong>Redis + Python workers</strong> for validator runs, window timers, redraws, decay sweeps, epoch bills, Merkle commits.</li>\n      </ul></div>\n      <div class=\"stk\"><h4>Frontend</h4><ul>\n        <li><strong>React / TypeScript</strong> for submission forms, the belt, the team grading dashboard (which becomes the verifier dashboard), node views and the map render.</li>\n        <li><strong>D3 or similar</strong> for the Tree of Knowledge graph rendering and the per-niche lenses.</li>\n      </ul></div>\n      <div class=\"stk\"><h4>Data ingestion (the real cost)</h4><ul>\n        <li><strong>Indexers/RPC</strong>: Alchemy, Helius, Dune for wallet, tx and cluster data across chains. V3 rides these.</li>\n        <li><strong>Explorers</strong>: Etherscan, Solscan for contract metadata, ABIs and verified source. V2 rides these.</li>\n        <li><strong>PM venues</strong>: Polymarket (have) plus Kalshi for V1 and cross-venue mispricing.</li>\n        <li><strong>Social</strong>: X, Discord, Telegram, Farcaster APIs. X pricing is the driver for framework 7.</li>\n      </ul></div>\n      <div class=\"stk\"><h4>Blockchain (tiny)</h4><ul>\n        <li><strong>Solidity</strong> only, for the SLEUTH token, the V4 LP, and the Merkle-root and issuance contracts.</li>\n        <li><strong>No Rust.</strong> Solana shows up only as read data through indexers, never as programs we write.</li>\n      </ul></div>\n    </div>\n    <div class=\"highlight\"><p>The only blockchain hire is a Solidity contractor around TGE, not a core swarm engineer. Reading on-chain data is API consumption in Python, not protocol work. The machine lane is the same skill: API consumption plus discipline about evidence.</p></div>\n  </div>\n\n  <!-- 06 TIMELINE -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 06 \u00b7 TIMELINE</div>\n    <h2>Build sequence</h2>\n    <p>Core first, machine lane V1 and the window machine ride alongside it, then the cheap frameworks on data we already have, then stage the heavy two. A smart v1 is core plus both lanes plus the five low-cost frameworks, <strong>roughly 8 to 10 weeks</strong>, up from the 6 to 8 in v1 because the slots, router, V1 validator and window machine are real work. Beta at W6 holds because V1 rides Polymarket data we already integrate and the window runs in team mode, no draw engine needed on day one.</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 engine + slots + router</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:29%;\">CORE</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 \u00b7 FW 1,5,10,2,9</div><div class=\"g-track\"><div class=\"g-bar b-w1\" style=\"left:29%;width:21%;\">RIDE-ALONG NICHES</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 RULES</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Wave 2 \u00b7 FW 3,4,6</div><div class=\"g-track\"><div class=\"g-bar b-w1\" style=\"left:54%;width:25%;\">CONTRACT \u00b7 RISK \u00b7 PM MKT</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Verifier shadow mode</div><div class=\"g-track\"><div class=\"g-bar b-shdw\" style=\"left:58%;width:42%;\">SHADOW GRADING</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Wave 3 \u00b7 FW 7 social</div><div class=\"g-track\"><div class=\"g-bar b-w3\" style=\"left:67%;width:33%;\">SOCIAL INGESTION</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">FW 8 \u00b7 Accuracy</div><div class=\"g-track\"><div class=\"g-bar b-acc\" style=\"left:50%;width:50%;\">MANUAL MVP &#8594; REAL ENGINE</div></div></div>\n      <div class=\"g-row\"><div class=\"g-label\">Slashing + verifier records</div><div class=\"g-track\"><div class=\"g-bar b-slash\" style=\"left:8%;width:17%;\">DORMANT</div></div></div>\n    </div>\n    <ul>\n      <li><strong>By beta (W6):</strong> core plus Wave 1 live, intel flowing onto the belt, the router splitting lanes, V1 verifying outcomes instantly, the window running in team mode, everything else graduating to the Tree at day 5.</li>\n      <li><strong>W6&#8211;12:</strong> V2 and V3 validators, Wave 2, the accuracy MVP, shadow mode starts building accuracy scores, billing comes online at $30/mo.</li>\n      <li><strong>Post beta:</strong> head hunting and slashing activate, the verifier track goes live per Phase 3, the real accuracy engine and auto-detectors continue.</li>\n    </ul>\n  </div>\n\n  <!-- 07 SWING -->\n  <div class=\"section\">\n    <div class=\"section-number\">// 07 \u00b7 THE SWING FACTOR</div>\n    <h2>What moves these numbers</h2>\n    <p>The whole table hinges on one question: how much of the underlying data do we already ingest first-party versus buy from a vendor. Discover is GraphQL across seven chains and the PM stats already exist, so if that is first-party, frameworks 1 through 4 stay cheap, V2 and V3 mostly query, and the figures above hold. If we own and run the ingestion, that is where a dedicated data engineer earns their salary and frameworks 2, 3, 4, 6 and 7 grow.</p>\n    <div class=\"card\">\n      <div class=\"card-title\">Open question to resolve before locking estimates</div>\n      <p style=\"margin:0;\">Is the 7-chain GraphQL layer and the PM stats pipeline first-party or vendor? That single answer is the difference between the figures above holding and the data-heavy rows ballooning. Still unresolved, still the first thing to answer.</p>\n    </div>\n  </div>\n\n  <div class=\"footer\">SLEUTH \u00b7 TREE OF KNOWLEDGE \u00b7 BUILD SPEC v2 \u00b7 INTERNAL \u00b7 DEV \u00b7 SUPERSEDES v1</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>
