Skill: render-style
Reference skill (no <reminder> envelope required). Read it before
calling render_html and adapt the closest skeleton — don't redesign.
Tool names: call these by their registered names —
mcp__hamroh__render_html to render and mcp__hamroh__telegram_send_photo
to deliver. The bare render_html is prose shorthand and matches no tool.
There are three layout modes; pick the one that fits the content:
- Dashboard — left-aligned title, stat tiles, bar rows, verdict.
For metrics, scorecards, calibration reports.
- Timeline / pipeline — centered title, numbered steps in colored
circles, each step a card. For lifecycles, flows, ordered processes.
- Architecture diagram — centered title, two-panel grid or stacked
tiers, inline pills, connector arrows with labels, footer line. For
systems, components, tier maps.
All three share the same tokens, fonts, and section-header style.
Tokens (paste these CSS vars verbatim)
--bg:#0e1828; /* page background */
--card:#1a2332; /* tile / card / track background */
--card2:#141d2c; /* nested panel background (slightly darker) */
--line:rgba(255,255,255,.06); /* dividers, tile borders */
--tx:#ffffff; /* primary text, big numbers */
--tx2:#9ba8bd; /* body / secondary */
--tx3:#6b7a91; /* uppercase labels, captions */
--blue:#3b82f6; /* neutral / info / partial / step 1 */
--green:#10b981; /* correct / positive / safe / step 3 */
--red:#ef4444; /* wrong / negative / stop / crash */
--amber:#f59e0b; /* pending / warning / step 4 */
--purple:#8b5cf6; /* command / owner / auth / step 5 */
--cyan:#06b6d4; /* IO / pipeline / step 2 */
--gray:#6b7280; /* N/A, unverifiable */
Color semantics:
- green — good outcome, safe path, "correct"
- blue — neutral, info, "partial", first step in a sequence
- red — bad outcome, "wrong", "stop", crash branch
- amber — pending, warning, "early", interrupt callout
- purple — command / owner / auth tier, end of sequence
- cyan — IO, network, pipeline middles
- gray — unknown, N/A, unverifiable
Use one semantic color per element. Don't mix accents on a single
tile/card/step.
Shared layout rules
- Render at width 1280, height 800. Full-page captures overflow.
Content max-width 1200px, centered, 40px page padding.
- Body font:
system-ui, -apple-system, "Segoe UI", Roboto, sans-serif.
Mono for code/identifiers: ui-monospace, "SF Mono", Menlo, monospace.
- Section header (when used): 12px, uppercase, letter-spacing
.12em,
color --tx3, with a 1px --line underline. Margins 32px top, 20px
bottom. Never style real <h2>/<h3> for sections — use .sec.
- Numbers carry their unit:
67%, $1.2M, +18%, <1ms, ≤300ms.
- Inline code in prose:
<code> styled with --card bg, mono font,
small horizontal padding, 4px radius. Use for identifiers, file names,
function calls — anything verbatim from the system.
- Inline pills/chips: small rounded badges (8px radius), 11px uppercase
tracked, semi-transparent fill of the semantic color (use
rgba(...,.15) or color-mix). Status, role, timing tags.
Mode-specific rules
Dashboard
- Title left-aligned, h1 34px bold, subtitle line below in
--tx2 14px
with bullet separators (•).
- Stat tiles:
--card bg, 12px radius, 24×28px padding, 4px colored
accent bar on the left edge via ::before (inset 12px top/bottom,
not full-height).
- Bar row: 160px label column + flex track + colored fill with white
bold count inside; minimum fill 60px so single-digit counts read.
- Verdict block at the bottom: full-width tile, centered, "VERDICT"
header in
--tx3 tracked caps, body 18px bold.
Timeline / pipeline
- Title centered, h1 30-34px bold, subtitle centered in
--tx2.
- Each step row: a large colored circle (44-56px, white digit, bold,
centered) on the left; step card on the right with title + body.
- Step card:
--card bg, 1px --line border, 12px radius, padding
18×22px. No left accent bar — the circle is the accent.
- Optional timing pill floated right of the step title:
<span class="pill cyan">≤300ms</span> etc.
- Optional callout band inside a step (red-outlined warning, etc.):
<div class="callout red">…</div>.
- Steps stacked vertically with 14-16px gap. Numbers run 1, 2, 3 — colors
cycle blue → cyan → green → amber → purple → red, etc.
- Optional bottom row of small uniform cards (4-up grid) for
shared-state / glossary items. Each is
--card bg with title + mono
type signature in --tx3.
Architecture diagram
- Title centered, h1 30-34px bold, subtitle centered.
- Either two side-by-side panels (
grid-template-columns:1fr 1fr,
~24px gap) or vertical tiers (single column, with arrow rows
between).
- Panel:
--card bg, 12px radius, 1px --line border, padding 22×24px.
Panel title in 18-20px bold; tag pills (e.g. "IN HARNESS") inline.
- Tier label above each tier: small uppercase tracked label like
TIER 0 — COMMAND in --tx3.
- Connector arrow between tiers/panels: a thin vertical line in
--line with a small label badge centered on it (e.g. "monitors &
restarts"). Use .arrow + .arrow .label.
- Persona/role row at the bottom of a tier: inline dot+name pills
(
<span class="dotpill purple"><i></i>Luna — CEO</span>).
- Footer line centered in
--tx3 12px with em-dash separators.
Skeleton 1 — Dashboard (calibration / scorecard)
<!DOCTYPE html><html><head><meta charset="utf-8"><style>
:root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);
--tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;
--blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;
--purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--tx);
font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}
.wrap{max-width:1200px;margin:0 auto}
h1{font-size:34px;font-weight:700;margin-bottom:8px}
.sub{color:var(--tx2);font-size:14px;border-bottom:1px solid var(--line);
padding-bottom:20px;margin-bottom:32px}
.sec{font-size:12px;font-weight:600;color:var(--tx3);text-transform:uppercase;
letter-spacing:.12em;border-bottom:1px solid var(--line);
padding-bottom:10px;margin:32px 0 20px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:12px;
padding:24px 28px;position:relative;overflow:hidden}
.tile::before{content:"";position:absolute;left:0;top:12px;bottom:12px;
width:4px;border-radius:2px;background:var(--accent,var(--blue))}
.tile.green{--accent:var(--green)}.tile.blue{--accent:var(--blue)}
.tile.red{--accent:var(--red)}.tile.amber{--accent:var(--amber)}
.tile.purple{--accent:var(--purple)}.tile.cyan{--accent:var(--cyan)}
.lbl{font-size:11px;color:var(--tx3);text-transform:uppercase;
letter-spacing:.14em;margin-bottom:14px}
.num{font-size:64px;font-weight:700;line-height:1}
.note{color:var(--tx2);font-size:13px;margin-top:14px}
.bar{display:flex;align-items:center;gap:16px;margin-bottom:10px}
.bar .name{width:160px;color:var(--tx2);font-size:14px}
.bar .track{flex:1;background:var(--card);border-radius:8px;height:36px;
overflow:hidden;border:1px solid var(--line)}
.bar .fill{height:100%;display:flex;align-items:center;padding:0 12px;
color:#fff;font-weight:700;border-radius:8px;background:var(--c,var(--blue))}
.bar.green .fill{--c:var(--green)}.bar.blue .fill{--c:var(--blue)}
.bar.red .fill{--c:var(--red)}.bar.amber .fill{--c:var(--amber)}
.bar.gray .fill{--c:var(--gray)}
.verdict{background:var(--card);border:1px solid var(--line);
border-radius:12px;padding:28px;text-align:center;margin-top:24px}
.verdict .h{font-size:11px;color:var(--tx3);letter-spacing:.18em;
text-transform:uppercase;margin-bottom:14px}
.verdict .t{font-size:18px;font-weight:700;line-height:1.5;color:var(--tx)}
</style></head><body><div class="wrap">
<h1>Title goes here</h1>
<div class="sub">subtitle • metadata • n=… • source</div>
<div class="grid2">
<div class="tile blue"><div class="lbl">strict accuracy</div>
<div class="num">67%</div><div class="note">fully correct only (8 / 12)</div></div>
<div class="tile green"><div class="lbl">directional accuracy</div>
<div class="num">100%</div><div class="note">correct + partial, zero hard misses</div></div>
</div>
<div class="sec">score distribution (n=12)</div>
<div class="bar green"><div class="name">Correct</div>
<div class="track"><div class="fill" style="width:80%">8</div></div></div>
<div class="bar blue"><div class="name">Partially correct</div>
<div class="track"><div class="fill" style="width:40%">4</div></div></div>
<div class="bar red"><div class="name">Wrong</div>
<div class="track"><div class="fill" style="width:6%">0</div></div></div>
<div class="verdict"><div class="h">verdict</div>
<div class="t">One- or two-sentence call. Bold, centered, no period spam.</div></div>
</div></body></html>
Skeleton 2 — Timeline / pipeline (lifecycle, flow)
<!DOCTYPE html><html><head><meta charset="utf-8"><style>
:root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);
--tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;
--blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;
--purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--tx);
font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}
.wrap{max-width:1100px;margin:0 auto}
.head{text-align:center;margin-bottom:32px}
.head h1{font-size:32px;font-weight:700;margin-bottom:8px}
.head .sub{color:var(--tx2);font-size:14px}
.step{display:grid;grid-template-columns:64px 1fr;gap:18px;margin-bottom:14px;align-items:start}
.step .circle{width:48px;height:48px;border-radius:50%;display:flex;
align-items:center;justify-content:center;color:#fff;font-weight:700;
font-size:20px;background:var(--c,var(--blue));margin-top:4px;
box-shadow:0 0 0 4px rgba(255,255,255,.04)}
.step.blue .circle{--c:var(--blue)}.step.cyan .circle{--c:var(--cyan)}
.step.green .circle{--c:var(--green)}.step.amber .circle{--c:var(--amber)}
.step.purple .circle{--c:var(--purple)}.step.red .circle{--c:var(--red)}
.step .body{background:var(--card);border:1px solid var(--line);
border-radius:12px;padding:16px 20px;border-left:3px solid var(--c,var(--blue))}
.step.blue .body{--c:var(--blue)}.step.cyan .body{--c:var(--cyan)}
.step.green .body{--c:var(--green)}.step.amber .body{--c:var(--amber)}
.step.purple .body{--c:var(--purple)}.step.red .body{--c:var(--red)}
.step .ttl{display:flex;justify-content:space-between;align-items:center;
gap:10px;margin-bottom:6px}
.step .ttl h3{font-size:17px;font-weight:700;color:var(--tx)}
.step .txt{color:var(--tx2);font-size:14px}
.pill{display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;
letter-spacing:.08em;padding:3px 9px;border-radius:8px;border:1px solid currentColor}
.pill.blue{color:var(--blue);background:rgba(59,130,246,.12)}
.pill.cyan{color:var(--cyan);background:rgba(6,182,212,.12)}
.pill.green{color:var(--green);background:rgba(16,185,129,.12)}
.pill.amber{color:var(--amber);background:rgba(245,158,11,.12)}
.pill.red{color:var(--red);background:rgba(239,68,68,.12)}
.pill.purple{color:var(--purple);background:rgba(139,92,246,.12)}
code,.mono{font-family:ui-monospace,"SF Mono",Menlo,monospace;
background:var(--card2);padding:1px 6px;border-radius:4px;font-size:13px;color:var(--tx)}
.callout{margin-top:10px;padding:10px 14px;border-radius:8px;
border:1px solid var(--c,var(--red));background:rgba(239,68,68,.08);font-size:13px}
.callout.amber{--c:var(--amber);background:rgba(245,158,11,.08)}
.callout .h{font-size:11px;font-weight:700;letter-spacing:.12em;
text-transform:uppercase;color:var(--c,var(--red));margin-bottom:4px}
.glossary{margin-top:28px;background:var(--card2);border:1px solid var(--line);
border-radius:12px;padding:20px}
.glossary .h{font-size:12px;font-weight:600;color:var(--tx3);
text-transform:uppercase;letter-spacing:.12em;text-align:center;margin-bottom:16px}
.glossary .row{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
.glossary .cell{background:var(--card);border:1px solid var(--line);
border-radius:8px;padding:12px;text-align:center}
.glossary .cell .n{font-weight:700;color:var(--tx);margin-bottom:4px}
.glossary .cell .t{font-family:ui-monospace,"SF Mono",Menlo,monospace;
font-size:12px;color:var(--tx3)}
</style></head><body><div class="wrap">
<div class="head">
<h1>Claude Code Subprocess Lifecycle</h1>
<div class="sub">Persistent AI session managed via stdin/stdout JSON streaming</div>
</div>
<div class="step blue"><div class="circle">1</div><div class="body">
<div class="ttl"><h3>Spawn</h3></div>
<div class="txt">Build claude command with all flags. Set <code>PR_SET_PDEATHSIG</code>
(Linux: child dies if parent dies). Capture stdin/stdout/stderr pipes.</div>
</div></div>
<div class="step cyan"><div class="circle">2</div><div class="body">
<div class="ttl"><h3>Initialize</h3><span class="pill cyan">≤300ms</span></div>
<div class="txt">Send first message ("Session started/resumed"). Wait for System
message → validate tool list (security check). Wait for first Result.</div>
</div></div>
<div class="step amber"><div class="circle">4</div><div class="body">
<div class="ttl"><h3>Engine Processing</h3><span class="pill amber">≤1s</span></div>
<div class="txt">Drains pending queue, formats as XML, sends to CC. If CC already
active → <b>injects mid-turn</b> via sync channel.</div>
<div class="callout"><div class="h">Owner interrupt (! prefix)</div>
Bypasses all queues → direct stdin write to CC within 1 second.</div>
</div></div>
<div class="step purple"><div class="circle">5</div><div class="body">
<div class="ttl"><h3>Claude Code Turn</h3><span class="pill purple">~2.5s</span></div>
<div class="txt">AI processes message, calls MCP tools (<code>telegram_send_message</code>,
<code>database_query</code>, <code>get_image</code>…), returns control action.</div>
</div></div>
<div class="glossary"><div class="h">Shared State: Survives CC Restarts</div>
<div class="row">
<div class="cell"><div class="n">PID</div><div class="t">Arc<AtomicI32></div></div>
<div class="cell"><div class="n">Heartbeat</div><div class="t">Arc<AtomicU64></div></div>
<div class="cell"><div class="n">Inject Sender</div><div class="t">Arc<Mutex<Sender>></div></div>
<div class="cell"><div class="n">Pending Injects</div><div class="t">Arc<Mutex<Vec>></div></div>
</div>
</div>
</div></body></html>
Skeleton 3 — Architecture diagram (tiers, panels, connectors)
<!DOCTYPE html><html><head><meta charset="utf-8"><style>
:root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);
--tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;
--blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;
--purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--tx);
font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}
.wrap{max-width:900px;margin:0 auto}
.head{text-align:center;margin-bottom:28px}
.head h1{font-size:30px;font-weight:700;margin-bottom:6px}
.head .sub{color:var(--tx2);font-size:14px}
.tier{margin-bottom:6px}
.tier .label{font-size:11px;color:var(--tx3);font-weight:700;
letter-spacing:.14em;text-transform:uppercase;margin-bottom:8px}
.panel{background:var(--card);border:1px solid var(--line);border-radius:14px;
padding:18px 22px;border-left:4px solid var(--c,var(--blue))}
.panel.blue{--c:var(--blue)}.panel.green{--c:var(--green)}
.panel.purple{--c:var(--purple)}.panel.red{--c:var(--red)}
.panel.amber{--c:var(--amber)}.panel.cyan{--c:var(--cyan)}
.panel .ttl{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.panel .ttl h2{font-size:18px;font-weight:700}
.panel .ico{font-size:20px}
.panel .desc{color:var(--tx2);font-size:14px}
.pill{display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;
letter-spacing:.08em;padding:3px 9px;border-radius:8px;border:1px solid currentColor}
.pill.blue{color:var(--blue);background:rgba(59,130,246,.12)}
.pill.green{color:var(--green);background:rgba(16,185,129,.12)}
.pill.amber{color:var(--amber);background:rgba(245,158,11,.12)}
.pill.red{color:var(--red);background:rgba(239,68,68,.12)}
.pill.purple{color:var(--purple);background:rgba(139,92,246,.12)}
.arrow{display:flex;flex-direction:column;align-items:center;margin:6px 0}
.arrow .line{width:1px;height:18px;background:var(--line)}
.arrow .label{font-size:11px;color:var(--tx3);background:var(--card2);
border:1px solid var(--line);padding:3px 10px;border-radius:6px;margin:2px 0}
.roles{margin-top:10px;display:flex;flex-wrap:wrap;gap:8px}
.dotpill{display:inline-flex;align-items:center;gap:8px;font-size:13px;
background:var(--card2);border:1px solid var(--line);border-radius:999px;padding:4px 12px}
.dotpill i{width:8px;height:8px;border-radius:50%;background:var(--c,var(--purple));display:inline-block}
.dotpill.blue i{--c:var(--blue)}.dotpill.green i{--c:var(--green)}
.dotpill.amber i{--c:var(--amber)}.dotpill.red i{--c:var(--red)}
.dotpill.purple i{--c:var(--purple)}.dotpill.cyan i{--c:var(--cyan)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.footer{text-align:center;color:var(--tx3);font-size:12px;margin-top:24px;
padding-top:16px;border-top:1px solid var(--line)}
code{font-family:ui-monospace,"SF Mono",Menlo,monospace;
background:var(--card2);padding:1px 6px;border-radius:4px;font-size:13px;color:var(--tx)}
</style></head><body><div class="wrap">
<div class="head">
<h1>Claudir: Three-Tier Architecture</h1>
<div class="sub">Separation of concerns by access level</div>
</div>
<div class="tier"><div class="label">tier 0 — command</div>
<div class="panel purple">
<div class="ttl"><span class="ico">🛡️</span><h2>Owner + Supervisor</h2>
<span class="pill purple">unrestricted</span></div>
<div class="desc">Owner controls via Telegram (<code>bot_xona</code> / DMs). Supervisor
is raw Claude Code in terminal for manual intervention.</div>
</div></div>
<div class="arrow"><div class="line"></div><div class="label">can start / stop / approve</div><div class="line"></div></div>
<div class="tier"><div class="label">tier 1 — operations</div>
<div class="panel green">
<div class="ttl"><span class="ico">⚙️</span><h2>Mirzo</h2>
<span class="pill green">full permissions</span></div>
<div class="desc">CTO bot. Bash, Edit, Write via CC. Owner DMs only. Monitors Tier 2,
delegates to agent teams.</div>
</div></div>
<div class="arrow"><div class="line"></div><div class="label">monitors & restarts</div><div class="line"></div></div>
<div class="tier"><div class="label">tier 2 — public-facing</div>
<div class="panel red">
<div class="ttl"><span class="ico">🤖</span><h2>Luna & Dilya</h2>
<span class="pill red">sandboxed</span></div>
<div class="desc">Public chatbots. WebSearch only via CC. MCP tools validated by
harness. No code execution.</div>
<div class="roles">
<span class="dotpill blue"><i></i>Luna — CEO</span>
<span class="dotpill amber"><i></i>Dilya — Newcomer</span>
</div>
</div></div>
<div class="footer">Same Rust binary (claudir) — Different configs — Shared SQLite communication</div>
</div></body></html>
Don'ts
- Don't use external fonts/CSS/JS — network is blocked. System fonts only.
- Don't use multiple accent colors per tile/card/step. One semantic
color, one job.
- Don't add gradients or shadows beyond what's in the skeleton, or emoji
decoration in body text. Emoji icons in panel titles are OK.
- Don't write headers as
<h2>/<h3> for sections. Use .sec (or
.head h1 for centered diagram titles).
- Don't omit units on numbers.
67%, ≤300ms, never bare.
- Don't mix layout modes in one render — pick dashboard, timeline, or
diagram and commit.
- Don't repeat the calibration colors when the content suggests
pipeline ordering — for sequences use the cycle blue → cyan → green
→ amber → purple → red.
1---2name: render-style3description: House style for the render_html tool — dark dashboard / architecture-diagram look with stat tiles, bar rows, numbered timeline steps, two-panel grids, status pills, connector arrows, callout bands, and verdict blocks. Read this skill before calling render_html so the output is visually consistent. Provides CSS tokens, layout rules, color semantics, and three copy-paste HTML skeletons to adapt.4license: MIT5---67# Skill: render-style89Reference skill (no `<reminder>` envelope required). Read it before10calling `render_html` and adapt the closest skeleton — don't redesign.1112> **Tool names:** call these by their registered names —13> `mcp__hamroh__render_html` to render and `mcp__hamroh__telegram_send_photo`14> to deliver. The bare `render_html` is prose shorthand and matches no tool.1516There are three layout modes; pick the one that fits the content:1718- **Dashboard** — left-aligned title, stat tiles, bar rows, verdict.19 For metrics, scorecards, calibration reports.20- **Timeline / pipeline** — centered title, numbered steps in colored21 circles, each step a card. For lifecycles, flows, ordered processes.22- **Architecture diagram** — centered title, two-panel grid or stacked23 tiers, inline pills, connector arrows with labels, footer line. For24 systems, components, tier maps.2526All three share the same tokens, fonts, and section-header style.2728## Tokens (paste these CSS vars verbatim)2930```31--bg:#0e1828; /* page background */32--card:#1a2332; /* tile / card / track background */33--card2:#141d2c; /* nested panel background (slightly darker) */34--line:rgba(255,255,255,.06); /* dividers, tile borders */35--tx:#ffffff; /* primary text, big numbers */36--tx2:#9ba8bd; /* body / secondary */37--tx3:#6b7a91; /* uppercase labels, captions */38--blue:#3b82f6; /* neutral / info / partial / step 1 */39--green:#10b981; /* correct / positive / safe / step 3 */40--red:#ef4444; /* wrong / negative / stop / crash */41--amber:#f59e0b; /* pending / warning / step 4 */42--purple:#8b5cf6; /* command / owner / auth / step 5 */43--cyan:#06b6d4; /* IO / pipeline / step 2 */44--gray:#6b7280; /* N/A, unverifiable */45```4647Color semantics:4849- **green** — good outcome, safe path, "correct"50- **blue** — neutral, info, "partial", first step in a sequence51- **red** — bad outcome, "wrong", "stop", crash branch52- **amber** — pending, warning, "early", interrupt callout53- **purple** — command / owner / auth tier, end of sequence54- **cyan** — IO, network, pipeline middles55- **gray** — unknown, N/A, unverifiable5657Use one semantic color per element. Don't mix accents on a single58tile/card/step.5960## Shared layout rules6162- Render at **width 1280, height 800**. Full-page captures overflow.63 Content max-width 1200px, centered, 40px page padding.64- Body font: `system-ui, -apple-system, "Segoe UI", Roboto, sans-serif`.65 Mono for code/identifiers: `ui-monospace, "SF Mono", Menlo, monospace`.66- Section header (when used): 12px, uppercase, letter-spacing `.12em`,67 color `--tx3`, with a 1px `--line` underline. Margins 32px top, 20px68 bottom. **Never** style real `<h2>`/`<h3>` for sections — use `.sec`.69- Numbers carry their unit: `67%`, `$1.2M`, `+18%`, `<1ms`, `≤300ms`.70- Inline code in prose: `<code>` styled with `--card` bg, mono font,71 small horizontal padding, 4px radius. Use for identifiers, file names,72 function calls — anything verbatim from the system.73- Inline pills/chips: small rounded badges (8px radius), 11px uppercase74 tracked, semi-transparent fill of the semantic color (use75 `rgba(...,.15)` or `color-mix`). Status, role, timing tags.7677## Mode-specific rules7879### Dashboard8081- Title left-aligned, h1 34px bold, subtitle line below in `--tx2` 14px82 with bullet separators (`•`).83- Stat tiles: `--card` bg, 12px radius, 24×28px padding, **4px colored84 accent bar** on the left edge via `::before` (inset 12px top/bottom,85 not full-height).86- Bar row: 160px label column + flex track + colored fill with white87 bold count inside; minimum fill 60px so single-digit counts read.88- Verdict block at the bottom: full-width tile, centered, "VERDICT"89 header in `--tx3` tracked caps, body 18px bold.9091### Timeline / pipeline9293- Title centered, h1 30-34px bold, subtitle centered in `--tx2`.94- Each step row: a large colored circle (44-56px, white digit, bold,95 centered) on the left; step card on the right with title + body.96- Step card: `--card` bg, 1px `--line` border, 12px radius, padding97 18×22px. **No** left accent bar — the circle is the accent.98- Optional **timing pill** floated right of the step title:99 `<span class="pill cyan">≤300ms</span>` etc.100- Optional **callout band** inside a step (red-outlined warning, etc.):101 `<div class="callout red">…</div>`.102- Steps stacked vertically with 14-16px gap. Numbers run 1, 2, 3 — colors103 cycle blue → cyan → green → amber → purple → red, etc.104- Optional **bottom row** of small uniform cards (4-up grid) for105 shared-state / glossary items. Each is `--card` bg with title + mono106 type signature in `--tx3`.107108### Architecture diagram109110- Title centered, h1 30-34px bold, subtitle centered.111- Either **two side-by-side panels** (`grid-template-columns:1fr 1fr`,112 ~24px gap) or **vertical tiers** (single column, with arrow rows113 between).114- Panel: `--card` bg, 12px radius, 1px `--line` border, padding 22×24px.115 Panel title in 18-20px bold; tag pills (e.g. "IN HARNESS") inline.116- Tier label above each tier: small uppercase tracked label like117 `TIER 0 — COMMAND` in `--tx3`.118- **Connector arrow** between tiers/panels: a thin vertical line in119 `--line` with a small label badge centered on it (e.g. "monitors &120 restarts"). Use `.arrow` + `.arrow .label`.121- **Persona/role row** at the bottom of a tier: inline dot+name pills122 (`<span class="dotpill purple"><i></i>Luna — CEO</span>`).123- **Footer line** centered in `--tx3` 12px with em-dash separators.124125## Skeleton 1 — Dashboard (calibration / scorecard)126127```html128<!DOCTYPE html><html><head><meta charset="utf-8"><style>129 :root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);130 --tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;131 --blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;132 --purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}133 *{box-sizing:border-box;margin:0;padding:0}134 body{background:var(--bg);color:var(--tx);135 font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}136 .wrap{max-width:1200px;margin:0 auto}137 h1{font-size:34px;font-weight:700;margin-bottom:8px}138 .sub{color:var(--tx2);font-size:14px;border-bottom:1px solid var(--line);139 padding-bottom:20px;margin-bottom:32px}140 .sec{font-size:12px;font-weight:600;color:var(--tx3);text-transform:uppercase;141 letter-spacing:.12em;border-bottom:1px solid var(--line);142 padding-bottom:10px;margin:32px 0 20px}143 .grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}144 .tile{background:var(--card);border:1px solid var(--line);border-radius:12px;145 padding:24px 28px;position:relative;overflow:hidden}146 .tile::before{content:"";position:absolute;left:0;top:12px;bottom:12px;147 width:4px;border-radius:2px;background:var(--accent,var(--blue))}148 .tile.green{--accent:var(--green)}.tile.blue{--accent:var(--blue)}149 .tile.red{--accent:var(--red)}.tile.amber{--accent:var(--amber)}150 .tile.purple{--accent:var(--purple)}.tile.cyan{--accent:var(--cyan)}151 .lbl{font-size:11px;color:var(--tx3);text-transform:uppercase;152 letter-spacing:.14em;margin-bottom:14px}153 .num{font-size:64px;font-weight:700;line-height:1}154 .note{color:var(--tx2);font-size:13px;margin-top:14px}155 .bar{display:flex;align-items:center;gap:16px;margin-bottom:10px}156 .bar .name{width:160px;color:var(--tx2);font-size:14px}157 .bar .track{flex:1;background:var(--card);border-radius:8px;height:36px;158 overflow:hidden;border:1px solid var(--line)}159 .bar .fill{height:100%;display:flex;align-items:center;padding:0 12px;160 color:#fff;font-weight:700;border-radius:8px;background:var(--c,var(--blue))}161 .bar.green .fill{--c:var(--green)}.bar.blue .fill{--c:var(--blue)}162 .bar.red .fill{--c:var(--red)}.bar.amber .fill{--c:var(--amber)}163 .bar.gray .fill{--c:var(--gray)}164 .verdict{background:var(--card);border:1px solid var(--line);165 border-radius:12px;padding:28px;text-align:center;margin-top:24px}166 .verdict .h{font-size:11px;color:var(--tx3);letter-spacing:.18em;167 text-transform:uppercase;margin-bottom:14px}168 .verdict .t{font-size:18px;font-weight:700;line-height:1.5;color:var(--tx)}169</style></head><body><div class="wrap">170171 <h1>Title goes here</h1>172 <div class="sub">subtitle • metadata • n=… • source</div>173174 <div class="grid2">175 <div class="tile blue"><div class="lbl">strict accuracy</div>176 <div class="num">67%</div><div class="note">fully correct only (8 / 12)</div></div>177 <div class="tile green"><div class="lbl">directional accuracy</div>178 <div class="num">100%</div><div class="note">correct + partial, zero hard misses</div></div>179 </div>180181 <div class="sec">score distribution (n=12)</div>182 <div class="bar green"><div class="name">Correct</div>183 <div class="track"><div class="fill" style="width:80%">8</div></div></div>184 <div class="bar blue"><div class="name">Partially correct</div>185 <div class="track"><div class="fill" style="width:40%">4</div></div></div>186 <div class="bar red"><div class="name">Wrong</div>187 <div class="track"><div class="fill" style="width:6%">0</div></div></div>188189 <div class="verdict"><div class="h">verdict</div>190 <div class="t">One- or two-sentence call. Bold, centered, no period spam.</div></div>191192</div></body></html>193```194195## Skeleton 2 — Timeline / pipeline (lifecycle, flow)196197```html198<!DOCTYPE html><html><head><meta charset="utf-8"><style>199 :root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);200 --tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;201 --blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;202 --purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}203 *{box-sizing:border-box;margin:0;padding:0}204 body{background:var(--bg);color:var(--tx);205 font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}206 .wrap{max-width:1100px;margin:0 auto}207 .head{text-align:center;margin-bottom:32px}208 .head h1{font-size:32px;font-weight:700;margin-bottom:8px}209 .head .sub{color:var(--tx2);font-size:14px}210 .step{display:grid;grid-template-columns:64px 1fr;gap:18px;margin-bottom:14px;align-items:start}211 .step .circle{width:48px;height:48px;border-radius:50%;display:flex;212 align-items:center;justify-content:center;color:#fff;font-weight:700;213 font-size:20px;background:var(--c,var(--blue));margin-top:4px;214 box-shadow:0 0 0 4px rgba(255,255,255,.04)}215 .step.blue .circle{--c:var(--blue)}.step.cyan .circle{--c:var(--cyan)}216 .step.green .circle{--c:var(--green)}.step.amber .circle{--c:var(--amber)}217 .step.purple .circle{--c:var(--purple)}.step.red .circle{--c:var(--red)}218 .step .body{background:var(--card);border:1px solid var(--line);219 border-radius:12px;padding:16px 20px;border-left:3px solid var(--c,var(--blue))}220 .step.blue .body{--c:var(--blue)}.step.cyan .body{--c:var(--cyan)}221 .step.green .body{--c:var(--green)}.step.amber .body{--c:var(--amber)}222 .step.purple .body{--c:var(--purple)}.step.red .body{--c:var(--red)}223 .step .ttl{display:flex;justify-content:space-between;align-items:center;224 gap:10px;margin-bottom:6px}225 .step .ttl h3{font-size:17px;font-weight:700;color:var(--tx)}226 .step .txt{color:var(--tx2);font-size:14px}227 .pill{display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;228 letter-spacing:.08em;padding:3px 9px;border-radius:8px;border:1px solid currentColor}229 .pill.blue{color:var(--blue);background:rgba(59,130,246,.12)}230 .pill.cyan{color:var(--cyan);background:rgba(6,182,212,.12)}231 .pill.green{color:var(--green);background:rgba(16,185,129,.12)}232 .pill.amber{color:var(--amber);background:rgba(245,158,11,.12)}233 .pill.red{color:var(--red);background:rgba(239,68,68,.12)}234 .pill.purple{color:var(--purple);background:rgba(139,92,246,.12)}235 code,.mono{font-family:ui-monospace,"SF Mono",Menlo,monospace;236 background:var(--card2);padding:1px 6px;border-radius:4px;font-size:13px;color:var(--tx)}237 .callout{margin-top:10px;padding:10px 14px;border-radius:8px;238 border:1px solid var(--c,var(--red));background:rgba(239,68,68,.08);font-size:13px}239 .callout.amber{--c:var(--amber);background:rgba(245,158,11,.08)}240 .callout .h{font-size:11px;font-weight:700;letter-spacing:.12em;241 text-transform:uppercase;color:var(--c,var(--red));margin-bottom:4px}242 .glossary{margin-top:28px;background:var(--card2);border:1px solid var(--line);243 border-radius:12px;padding:20px}244 .glossary .h{font-size:12px;font-weight:600;color:var(--tx3);245 text-transform:uppercase;letter-spacing:.12em;text-align:center;margin-bottom:16px}246 .glossary .row{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}247 .glossary .cell{background:var(--card);border:1px solid var(--line);248 border-radius:8px;padding:12px;text-align:center}249 .glossary .cell .n{font-weight:700;color:var(--tx);margin-bottom:4px}250 .glossary .cell .t{font-family:ui-monospace,"SF Mono",Menlo,monospace;251 font-size:12px;color:var(--tx3)}252</style></head><body><div class="wrap">253254 <div class="head">255 <h1>Claude Code Subprocess Lifecycle</h1>256 <div class="sub">Persistent AI session managed via stdin/stdout JSON streaming</div>257 </div>258259 <div class="step blue"><div class="circle">1</div><div class="body">260 <div class="ttl"><h3>Spawn</h3></div>261 <div class="txt">Build claude command with all flags. Set <code>PR_SET_PDEATHSIG</code>262 (Linux: child dies if parent dies). Capture stdin/stdout/stderr pipes.</div>263 </div></div>264265 <div class="step cyan"><div class="circle">2</div><div class="body">266 <div class="ttl"><h3>Initialize</h3><span class="pill cyan">≤300ms</span></div>267 <div class="txt">Send first message ("Session started/resumed"). Wait for System268 message → validate tool list (security check). Wait for first Result.</div>269 </div></div>270271 <div class="step amber"><div class="circle">4</div><div class="body">272 <div class="ttl"><h3>Engine Processing</h3><span class="pill amber">≤1s</span></div>273 <div class="txt">Drains pending queue, formats as XML, sends to CC. If CC already274 active → <b>injects mid-turn</b> via sync channel.</div>275 <div class="callout"><div class="h">Owner interrupt (! prefix)</div>276 Bypasses all queues → direct stdin write to CC within 1 second.</div>277 </div></div>278279 <div class="step purple"><div class="circle">5</div><div class="body">280 <div class="ttl"><h3>Claude Code Turn</h3><span class="pill purple">~2.5s</span></div>281 <div class="txt">AI processes message, calls MCP tools (<code>telegram_send_message</code>,282 <code>database_query</code>, <code>get_image</code>…), returns control action.</div>283 </div></div>284285 <div class="glossary"><div class="h">Shared State: Survives CC Restarts</div>286 <div class="row">287 <div class="cell"><div class="n">PID</div><div class="t">Arc<AtomicI32></div></div>288 <div class="cell"><div class="n">Heartbeat</div><div class="t">Arc<AtomicU64></div></div>289 <div class="cell"><div class="n">Inject Sender</div><div class="t">Arc<Mutex<Sender>></div></div>290 <div class="cell"><div class="n">Pending Injects</div><div class="t">Arc<Mutex<Vec>></div></div>291 </div>292 </div>293294</div></body></html>295```296297## Skeleton 3 — Architecture diagram (tiers, panels, connectors)298299```html300<!DOCTYPE html><html><head><meta charset="utf-8"><style>301 :root{--bg:#0e1828;--card:#1a2332;--card2:#141d2c;--line:rgba(255,255,255,.06);302 --tx:#fff;--tx2:#9ba8bd;--tx3:#6b7a91;303 --blue:#3b82f6;--green:#10b981;--red:#ef4444;--amber:#f59e0b;304 --purple:#8b5cf6;--cyan:#06b6d4;--gray:#6b7280}305 *{box-sizing:border-box;margin:0;padding:0}306 body{background:var(--bg);color:var(--tx);307 font:16px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;padding:40px}308 .wrap{max-width:900px;margin:0 auto}309 .head{text-align:center;margin-bottom:28px}310 .head h1{font-size:30px;font-weight:700;margin-bottom:6px}311 .head .sub{color:var(--tx2);font-size:14px}312 .tier{margin-bottom:6px}313 .tier .label{font-size:11px;color:var(--tx3);font-weight:700;314 letter-spacing:.14em;text-transform:uppercase;margin-bottom:8px}315 .panel{background:var(--card);border:1px solid var(--line);border-radius:14px;316 padding:18px 22px;border-left:4px solid var(--c,var(--blue))}317 .panel.blue{--c:var(--blue)}.panel.green{--c:var(--green)}318 .panel.purple{--c:var(--purple)}.panel.red{--c:var(--red)}319 .panel.amber{--c:var(--amber)}.panel.cyan{--c:var(--cyan)}320 .panel .ttl{display:flex;align-items:center;gap:10px;margin-bottom:6px}321 .panel .ttl h2{font-size:18px;font-weight:700}322 .panel .ico{font-size:20px}323 .panel .desc{color:var(--tx2);font-size:14px}324 .pill{display:inline-block;font-size:11px;font-weight:600;text-transform:uppercase;325 letter-spacing:.08em;padding:3px 9px;border-radius:8px;border:1px solid currentColor}326 .pill.blue{color:var(--blue);background:rgba(59,130,246,.12)}327 .pill.green{color:var(--green);background:rgba(16,185,129,.12)}328 .pill.amber{color:var(--amber);background:rgba(245,158,11,.12)}329 .pill.red{color:var(--red);background:rgba(239,68,68,.12)}330 .pill.purple{color:var(--purple);background:rgba(139,92,246,.12)}331 .arrow{display:flex;flex-direction:column;align-items:center;margin:6px 0}332 .arrow .line{width:1px;height:18px;background:var(--line)}333 .arrow .label{font-size:11px;color:var(--tx3);background:var(--card2);334 border:1px solid var(--line);padding:3px 10px;border-radius:6px;margin:2px 0}335 .roles{margin-top:10px;display:flex;flex-wrap:wrap;gap:8px}336 .dotpill{display:inline-flex;align-items:center;gap:8px;font-size:13px;337 background:var(--card2);border:1px solid var(--line);border-radius:999px;padding:4px 12px}338 .dotpill i{width:8px;height:8px;border-radius:50%;background:var(--c,var(--purple));display:inline-block}339 .dotpill.blue i{--c:var(--blue)}.dotpill.green i{--c:var(--green)}340 .dotpill.amber i{--c:var(--amber)}.dotpill.red i{--c:var(--red)}341 .dotpill.purple i{--c:var(--purple)}.dotpill.cyan i{--c:var(--cyan)}342 .grid2{display:grid;grid-template-columns:1fr 1fr;gap:18px}343 .footer{text-align:center;color:var(--tx3);font-size:12px;margin-top:24px;344 padding-top:16px;border-top:1px solid var(--line)}345 code{font-family:ui-monospace,"SF Mono",Menlo,monospace;346 background:var(--card2);padding:1px 6px;border-radius:4px;font-size:13px;color:var(--tx)}347</style></head><body><div class="wrap">348349 <div class="head">350 <h1>Claudir: Three-Tier Architecture</h1>351 <div class="sub">Separation of concerns by access level</div>352 </div>353354 <div class="tier"><div class="label">tier 0 — command</div>355 <div class="panel purple">356 <div class="ttl"><span class="ico">🛡️</span><h2>Owner + Supervisor</h2>357 <span class="pill purple">unrestricted</span></div>358 <div class="desc">Owner controls via Telegram (<code>bot_xona</code> / DMs). Supervisor359 is raw Claude Code in terminal for manual intervention.</div>360 </div></div>361 <div class="arrow"><div class="line"></div><div class="label">can start / stop / approve</div><div class="line"></div></div>362363 <div class="tier"><div class="label">tier 1 — operations</div>364 <div class="panel green">365 <div class="ttl"><span class="ico">⚙️</span><h2>Mirzo</h2>366 <span class="pill green">full permissions</span></div>367 <div class="desc">CTO bot. Bash, Edit, Write via CC. Owner DMs only. Monitors Tier 2,368 delegates to agent teams.</div>369 </div></div>370 <div class="arrow"><div class="line"></div><div class="label">monitors & restarts</div><div class="line"></div></div>371372 <div class="tier"><div class="label">tier 2 — public-facing</div>373 <div class="panel red">374 <div class="ttl"><span class="ico">🤖</span><h2>Luna & Dilya</h2>375 <span class="pill red">sandboxed</span></div>376 <div class="desc">Public chatbots. WebSearch only via CC. MCP tools validated by377 harness. No code execution.</div>378 <div class="roles">379 <span class="dotpill blue"><i></i>Luna — CEO</span>380 <span class="dotpill amber"><i></i>Dilya — Newcomer</span>381 </div>382 </div></div>383384 <div class="footer">Same Rust binary (claudir) — Different configs — Shared SQLite communication</div>385386</div></body></html>387```388389## Don'ts390391- Don't use external fonts/CSS/JS — network is blocked. System fonts only.392- Don't use multiple accent colors per tile/card/step. One semantic393 color, one job.394- Don't add gradients or shadows beyond what's in the skeleton, or emoji395 decoration in body text. Emoji icons in panel titles are OK.396- Don't write headers as `<h2>`/`<h3>` for sections. Use `.sec` (or397 `.head h1` for centered diagram titles).398- Don't omit units on numbers. `67%`, `≤300ms`, never bare.399- Don't mix layout modes in one render — pick dashboard, timeline, or400 diagram and commit.401- Don't repeat the calibration colors when the content suggests402 pipeline ordering — for sequences use the cycle blue → cyan → green403 → amber → purple → red.