Files
Duriin-API/public/admin/pages/autonomy.html
T
ImBenjiandClaude Opus 5 6f1d1eee2d fix: restart the stalled autonomy pipeline and make calibration honest
Archive ingestion had been dead since 2026-08-02 because nothing in the
compose stack actually ran it. Everything downstream starved from there.

- add ingest + enrichment services. server.js only starts the scheduler when
  DURIIN_RUN_SCHEDULER is not "false", and workers/index.js was not running at
  all, so articles never got event_id/content/has_embedding and the coordinator
  had nothing to lease.
- pass an explicit origin from coordinatorWorker. it was never passed, so
  acceptProposal defaulted to 'live' and 464 historical backfill predictions
  were recorded as live. that also meant verifyEvidence got a null cutoff and
  skipped its date check entirely.
- coarsen cohortKey to event families + horizon buckets. 201 free text event
  types produced 221 cohorts averaging 2.76 samples, so the n>=30 gate could
  never be reached and everything abstained for the wrong reason.
- gate on cohort diversity, not just sample count. one ticker was roughly half
  of all resolved outcomes, so a pure count gate was measuring one company.
  unknown diversity abstains rather than passing.
- resolve the admin archive db explicitly and probe it. it relied on a
  Dockerfile symlink, and without it better-sqlite3 quietly creates an empty
  file and serves a phantom archive.
- clamp implausible future publication dates at ingest.
- pin the db backend to sqlite by default. compose hardcoded postgres "true",
  which would have overridden the operator's own .env on the next redeploy and
  pointed everything at a stale snapshot.

scripts/repair-autonomy-labels.js relabels the affected rows. it is dry run by
default and has not been applied.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WnNxwxfXSbeNtjvtz5gayb
2026-08-29 21:43:24 +01:00

160 lines
7.9 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#090b0a">
<title>Duriin — Autonomy</title>
<link rel="stylesheet" href="/admin/assets/css/base.css?v=20260804-3">
<link rel="stylesheet" href="/admin/assets/css/layout.css?v=20260804-3">
<link rel="stylesheet" href="/admin/assets/css/components.css?v=20260804-3">
<link rel="stylesheet" href="/admin/assets/css/autonomy.css?v=20260829-1">
</head>
<body class="page-autonomy">
<header class="app-header">
<h1>Duriin</h1>
<nav class="tabs">
<a href="/admin/autonomy" class="active">Autonomy</a>
<a href="/admin/ingest">Ingest</a>
<a href="/admin/intelligence">Intelligence</a>
<a href="/admin/stats">Stats</a>
<a href="/admin/sql">SQL</a>
</nav>
</header>
<main class="autonomy-shell">
<section class="autonomy-hero">
<div class="hero-copy">
<div class="eyebrow"><span class="pulse"></span><span id="runtime-state">Autonomy runtime</span></div>
<h2 id="hero-title">Duriin is observing.</h2>
<p id="hero-description">Building evidence-backed hypotheses from the archive and measuring them against the market.</p>
</div>
<div class="hero-mode">
<span class="mode-label">Execution authority</span>
<strong id="execution-mode">—</strong>
<span id="broker-state">Connecting to broker state…</span>
</div>
</section>
<section class="metric-strip" aria-label="Autonomy summary">
<article class="metric-block">
<span class="metric-kicker">Open hypotheses</span>
<strong id="metric-open">—</strong>
<small id="metric-resolved">— resolved</small>
</article>
<article class="metric-block">
<span class="metric-kicker">Directional accuracy</span>
<strong id="metric-accuracy">—</strong>
<small id="metric-sample">Waiting for outcomes</small>
</article>
<article class="metric-block">
<span class="metric-kicker">Average excess return</span>
<strong id="metric-alpha">—</strong>
<small>Against SPY benchmark</small>
</article>
<article class="metric-block">
<span class="metric-kicker">Tradable universe</span>
<strong id="metric-universe">—</strong>
<small>Verified Alpaca instruments</small>
</article>
</section>
<section class="pipeline-section panel">
<div class="section-head">
<div><span class="section-index">01</span><h3>Learning loop</h3></div>
<span class="freshness" id="freshness">Updating…</span>
</div>
<div class="pipeline" id="pipeline">
<div class="pipeline-step"><span class="step-number">01</span><strong>Observe</strong><small>Archive events</small><b id="pipe-observe">—</b></div>
<div class="pipeline-arrow">→</div>
<div class="pipeline-step"><span class="step-number">02</span><strong>Propose</strong><small>Evidence hypotheses</small><b id="pipe-propose">—</b></div>
<div class="pipeline-arrow">→</div>
<div class="pipeline-step"><span class="step-number">03</span><strong>Measure</strong><small>Market outcomes</small><b id="pipe-measure">—</b></div>
<div class="pipeline-arrow">→</div>
<div class="pipeline-step"><span class="step-number">04</span><strong>Calibrate</strong><small>Empirical confidence</small><b id="pipe-calibrate">—</b></div>
<div class="pipeline-arrow">→</div>
<div class="pipeline-step"><span class="step-number">05</span><strong>Act</strong><small>Policy decisions</small><b id="pipe-act">—</b></div>
</div>
</section>
<div class="autonomy-grid">
<section class="panel hypotheses-panel">
<div class="section-head">
<div><span class="section-index">02</span><h3>Latest hypotheses</h3></div>
<a href="/admin/intelligence/predictions" class="text-link">Legacy intelligence ↗</a>
</div>
<div id="hypothesis-list" class="hypothesis-list"><div class="loading-line"></div></div>
</section>
<aside class="panel performance-panel">
<div class="section-head"><div><span class="section-index">03</span><h3>Measured performance</h3></div></div>
<div class="accuracy-orbit" id="accuracy-orbit">
<div><strong id="orbit-value">—</strong><span>correct</span></div>
</div>
<div class="performance-facts">
<div><span>Resolved</span><strong id="perf-resolved">0</strong></div>
<div><span>Correct</span><strong id="perf-correct">0</strong></div>
<div><span>Calibration cohorts</span><strong id="perf-cohorts">0</strong></div>
</div>
<p class="performance-note" id="performance-note">Duriin will only claim an edge after predictions mature and are measured out of sample.</p>
<div class="performance-facts" id="origin-split"></div>
<p class="performance-note" id="origin-note">Historical backfill and walk-forward replay are shown separately. Neither is evidence of live edge.</p>
</aside>
</div>
<div class="autonomy-grid lower-grid">
<section class="panel ledger-panel">
<div class="section-head"><div><span class="section-index">04</span><h3>Decision ledger</h3></div><span class="mode-pill" id="ledger-mode">Shadow</span></div>
<div class="table-wrap ledger-table">
<table>
<thead><tr><th>Instrument</th><th>Decision</th><th>Direction</th><th>Calibration</th><th>Horizon</th><th>Created</th></tr></thead>
<tbody id="decision-ledger"><tr><td colspan="6" class="empty-state">Waiting for calibrated decisions.</td></tr></tbody>
</table>
</div>
</section>
<aside class="panel runtime-panel">
<div class="section-head"><div><span class="section-index">05</span><h3>Runtime</h3></div></div>
<div class="runtime-list">
<div><span><i class="status-light ok"></i>Coordinator</span><strong id="runtime-coordinator">Active</strong></div>
<div><span><i class="status-light ok"></i>Outcome resolver</span><strong>Active</strong></div>
<div><span><i class="status-light ok"></i>Calibration</span><strong>Active</strong></div>
<div><span><i class="status-light ok"></i>Execution</span><strong id="runtime-execution">Shadow</strong></div>
<div><span><i class="status-light"></i>Historical queue</span><strong id="runtime-queue">—</strong></div>
</div>
<div class="account-card" id="account-card">
<span>Paper account</span>
<strong id="account-equity">Not sampled in shadow mode</strong>
<small id="account-meta">Alpaca Paper connected</small>
</div>
</aside>
</div>
<section class="panel" aria-label="Historical replay">
<div class="section-head"><div><span class="section-index">06</span><h3>Historical replay</h3></div><span class="mode-pill">Isolated from execution</span></div>
<div class="performance-facts">
<div><span>Run state</span><strong id="replay-status">Starting…</strong></div>
<div><span>Articles replayed</span><strong id="replay-articles">—</strong></div>
<div><span>Walk-forward evaluations</span><strong id="replay-evaluations">—</strong></div>
<div><span>Watermark</span><strong id="replay-watermark">—</strong></div>
</div>
</section>
<section class="panel" aria-label="Calibration cohorts">
<div class="section-head"><div><span class="section-index">07</span><h3>Calibration cohorts</h3></div><span class="mode-pill">Needs 30 samples · 5 tickers · max 50% in one</span></div>
<div class="table-wrap">
<table>
<thead><tr><th>Cohort</th><th>Source</th><th>Samples</th><th>Distinct tickers</th><th>Top ticker share</th><th>Status</th></tr></thead>
<tbody id="cohort-list"><tr><td colspan="6" class="empty-state">No calibration snapshots yet.</td></tr></tbody>
</table>
</div>
</section>
</main>
<div id="toast"><span class="toast-dot"></span><span id="toast-msg"></span></div>
<script src="/admin/assets/js/app.js?v=20260804-3"></script>
<script src="/admin/assets/js/autonomy.js?v=20260829-1"></script>
</body>
</html>