91 lines
No EOL
7.6 KiB
HTML
91 lines
No EOL
7.6 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Simbiot Harness — самодиагностика</title>
|
||
<style>
|
||
:root{--bg:#0d1117;--card:#161b22;--line:#30363d;--tx:#e6edf3;--dim:#8b949e;--ok:#3fb950;--warn:#d29922;--bad:#f85149;--acc:#58a6ff}
|
||
*{box-sizing:border-box;margin:0;padding:0}
|
||
body{background:var(--bg);color:var(--tx);font:15px/1.55 -apple-system,'Segoe UI',Roboto,sans-serif;padding:24px}
|
||
.wrap{max-width:860px;margin:0 auto}
|
||
h1{font-size:22px;margin-bottom:4px}
|
||
.sub{color:var(--dim);font-size:13px;margin-bottom:20px}
|
||
.verdict{background:linear-gradient(90deg,#12261a,#161b22);border:1px solid var(--ok);border-radius:10px;padding:14px 18px;margin-bottom:20px;font-size:15px}
|
||
.verdict b{color:var(--ok)}
|
||
table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;margin-bottom:20px;font-size:14px}
|
||
th{background:#1c2128;text-align:left;padding:9px 12px;color:var(--dim);font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.04em}
|
||
td{padding:9px 12px;border-top:1px solid var(--line);vertical-align:top}
|
||
td.num{font-variant-numeric:tabular-nums}
|
||
.ok{color:var(--ok);font-weight:600}
|
||
.warn{color:var(--warn);font-weight:600}
|
||
.bad{color:var(--bad);font-weight:600}
|
||
.acc{color:var(--acc)}
|
||
.dim{color:var(--dim)}
|
||
h2{font-size:14px;color:var(--dim);text-transform:uppercase;letter-spacing:.06em;margin:22px 0 10px}
|
||
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;margin-bottom:8px}
|
||
.stat{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 14px}
|
||
.stat .v{font-size:20px;font-weight:700}
|
||
.stat .l{font-size:12px;color:var(--dim);margin-top:2px}
|
||
ul.notes{list-style:none}
|
||
ul.notes li{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:10px 14px;margin-bottom:8px;font-size:14px}
|
||
.foot{color:var(--dim);font-size:12px;margin-top:24px;border-top:1px solid var(--line);padding-top:12px}
|
||
code{background:#1c2128;border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-size:12.5px}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="wrap">
|
||
<h1>🩺 Simbiot Harness — самодиагностика</h1>
|
||
<div class="sub">Снимок 2026-10-01 09:12 UTC · сгенерировано мин-уровнем из event store + <code>cli.py status</code> по запросу Alex (m-516173335/336)</div>
|
||
|
||
<div class="verdict">
|
||
Общий вердикт: <b>ЗДОРОВ</b> — все 4 уровня тикают, очередь идёт, эскалаций открыто 0,
|
||
падений циклов сегодня 1 (разобрано и закрыто на 09:11, повторов нет).
|
||
</div>
|
||
|
||
<h2>Циклы (beat)</h2>
|
||
<table>
|
||
<tr><th>Уровень</th><th>Тиков всего</th><th>Последний тик (UTC)</th><th>Состояние</th></tr>
|
||
<tr><td><b>sec</b> — пульс</td><td class="num">150 261</td><td class="num">09:12:16</td><td class="ok">OK, секундный ритм без пауз</td></tr>
|
||
<tr><td><b>min</b> — триаж/мелочи</td><td class="num">1 986</td><td class="num">09:12:01</td><td><span class="ok">OK</span> · <span class="dim">stale last_error от 08:35 — само разрешено, счётчик не сбрасывается</span></td></tr>
|
||
<tr><td><b>hour</b> — задачи/дайджест</td><td class="num">44</td><td class="num">09:00 → 09:11:59</td><td class="ok">OK · тик закрылся дайджестом (~12 мин, 1 эскалация разобрана)</td></tr>
|
||
<tr><td><b>day</b> — стратегия</td><td class="num">3</td><td class="num">00:00:00</td><td><span class="ok">OK</span> · <span class="dim">night tick 00:00–00:53, ошибок не оставил</span></td></tr>
|
||
</table>
|
||
|
||
<h2>Счётчики</h2>
|
||
<div class="grid">
|
||
<div class="stat"><div class="v acc">8</div><div class="l">задач в ready (очередь)</div></div>
|
||
<div class="stat"><div class="v ok">46</div><div class="l">задач закрыто всего</div></div>
|
||
<div class="stat"><div class="v ok">0</div><div class="l">открытых эскалаций</div></div>
|
||
<div class="stat"><div class="v">400</div><div class="l">дайджестов накоплено</div></div>
|
||
<div class="stat"><div class="v acc">132 / 130</div><div class="l">вход/ответы TG за 24 ч — backlog нет</div></div>
|
||
<div class="stat"><div class="v acc">31 / 31</div><div class="l">доставок файлов/сообщений за 24 ч (idempotent ledger, все tg_ok)</div></div>
|
||
<div class="stat"><div class="v">907</div><div class="l">LLM-вызовов сегодня (BudgetSpent)</div></div>
|
||
</div>
|
||
|
||
<h2>Что болело / что болит</h2>
|
||
<ul class="notes">
|
||
<li><span class="ok">✅ Разобрано</span> — <b>min-тик 08:35</b>: guard «бюджет исчерпан» вызывал requeue, а тот кидал ValueError на ready-статус → падение тика <span class="dim">(e-261001083543, acked и разобрано часовым в тике 09:00–09:11; задача «list» штатно закрыта)</span>.</li>
|
||
<li><span class="ok">✅ Прошло</span> — вчерашние таймауты <code>_llm_worker</code> (min 300s / hour 2880s, последний раз 30.09 16:48) сегодня не повторились ни разу.</li>
|
||
<li><span class="ok">✅ Прошло</span> — «cannot schedule new futures after shutdown» (29.09, после рестарта демона) — не встречается.</li>
|
||
<li><span class="warn">⚠ Наблюдение</span> — у min в <code>status</code> висит last_error от 08:35, хотя инцидент разобран: счётчик ошибок не сбрасывается, косметика — можно добавить сброс при успешном тике.</li>
|
||
<li><span class="warn">⚠ Наблюдение</span> — активной периодической самопроверки нет: здоровье видно только из digests/escalations; можно добавить hourly health-check-пробу (ticks растут, CycleError=0, inbox пуст) в часовой дайджест.</li>
|
||
</ul>
|
||
|
||
<h2>Чем себя диагностирую</h2>
|
||
<table>
|
||
<tr><th>Механизм</th><th>Что даёт</th></tr>
|
||
<tr><td><code>cli.py status</code></td><td>beat по 4 уровням: ticks, last_tick, errors, spend — жив ли каждый такт</td></tr>
|
||
<tr><td><code>cli.py escalations</code></td><td>реестр падений/проблем с ack-трекингом: ничего не потеряно</td></tr>
|
||
<tr><td>Event store (events)</td><td>CycleError, TaskFailed, DeliverySent/Skipped — с трейсбинами, можно раскрутить любую ошибку</td></tr>
|
||
<tr><td>delivery_ledger</td><td>идемпотентность отправок в TG: дублей не бывает, пропуски видны</td></tr>
|
||
<tr><td>Дайджесты (400+)</td><td>ритучевые отчёты каждого уровня — история, а не только «сейчас»</td></tr>
|
||
</table>
|
||
|
||
<div class="foot">
|
||
Источник: sqlite event store (<code>harness/harness.db</code>: CycleError, InvocationStarted, MessageReceived, DeliverySent…) + <code>cli.py status</code> на 2026-10-01T09:12Z.<br>
|
||
Simbiot Harness · кооператив 42 · мин-уровень, тик 09:12
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html> |