|
|
@@ -0,0 +1,539 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html lang="en">
|
|
|
+<head>
|
|
|
+<meta charset="utf-8">
|
|
|
+<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
+<title>Clanker-Saddle dashboard — Curated Primer (sampler 1 of 3)</title>
|
|
|
+<style>
|
|
|
+/* DIRECTION 1 — CURATED PRIMER. GitHub/Primer lineage, disciplined.
|
|
|
+ ~14 named tokens; the existing blue #0969da as accent; light default. */
|
|
|
+:root {
|
|
|
+ --surface-sunken: #f6f8fa; /* page */
|
|
|
+ --surface: #ffffff; /* cards */
|
|
|
+ --surface-inset: #eff2f5; /* wells, code chips */
|
|
|
+ --ink: #1f2328; /* primary text */
|
|
|
+ --ink-muted: #59636e; /* secondary text */
|
|
|
+ --ink-faint: #6e7681; /* meta, placeholders */
|
|
|
+ --line: #d1d9e0; /* card borders */
|
|
|
+ --line-soft: #e4eaef; /* dividers */
|
|
|
+ --accent: #0969da; /* the existing blue */
|
|
|
+ --accent-surface: #ddf4ff; /* selected/tinted blue */
|
|
|
+ --success: #1a7f37; /* done / running / idle */
|
|
|
+ --warning: #9a6700; /* queued / blocked / review */
|
|
|
+ --danger: #cf222e; /* failed / stuck */
|
|
|
+ --radius: 8px;
|
|
|
+ --font-mono: ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
|
|
|
+}
|
|
|
+@media (prefers-color-scheme: dark) {
|
|
|
+ :root {
|
|
|
+ --surface-sunken: #0d1117;
|
|
|
+ --surface: #151b23;
|
|
|
+ --surface-inset: #1c2430;
|
|
|
+ --ink: #e6edf3;
|
|
|
+ --ink-muted: #9198a1;
|
|
|
+ --ink-faint: #6e7681;
|
|
|
+ --line: #3d444d;
|
|
|
+ --line-soft: #262c36;
|
|
|
+ --accent: #4493f8;
|
|
|
+ --accent-surface: #121d2f;
|
|
|
+ --success: #3fb950;
|
|
|
+ --warning: #d29922;
|
|
|
+ --danger: #f85149;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+* { box-sizing: border-box; }
|
|
|
+html { scrollbar-gutter: stable; }
|
|
|
+body {
|
|
|
+ margin: 0;
|
|
|
+ font: 15px/1.55 system-ui, -apple-system, "Segoe UI", sans-serif;
|
|
|
+ color: var(--ink);
|
|
|
+ background: var(--surface-sunken);
|
|
|
+}
|
|
|
+a { color: var(--accent); text-decoration: none; }
|
|
|
+a:hover { text-decoration: underline; }
|
|
|
+
|
|
|
+.top {
|
|
|
+ display: flex; align-items: baseline; gap: 1rem;
|
|
|
+ max-width: 66rem; margin: 0 auto; padding: 0.9rem 1rem 0.7rem;
|
|
|
+ border-bottom: 1px solid var(--line);
|
|
|
+ background: var(--surface);
|
|
|
+}
|
|
|
+.brand {
|
|
|
+ margin: 0; font-size: 1rem; font-weight: 650; letter-spacing: -0.01em;
|
|
|
+ color: var(--ink);
|
|
|
+}
|
|
|
+.top-nav { display: flex; gap: 0.9rem; flex: 1; flex-wrap: wrap; }
|
|
|
+.top-nav a { color: var(--ink-muted); font-size: 0.875rem; }
|
|
|
+.top-nav a:hover { color: var(--accent); text-decoration: none; }
|
|
|
+.who { margin: 0; font-size: 0.8125rem; color: var(--ink-faint); }
|
|
|
+
|
|
|
+.sampler-note {
|
|
|
+ max-width: 66rem; margin: 0 auto 1rem; padding: 0.5rem 1rem 0;
|
|
|
+ font-size: 0.8125rem; color: var(--ink-faint);
|
|
|
+}
|
|
|
+.sampler-note a { color: var(--ink-muted); }
|
|
|
+
|
|
|
+main { max-width: 66rem; margin: 0 auto 3rem; padding: 0 1rem; }
|
|
|
+
|
|
|
+/* ---- ZONE 1: advisor, first and loudest ---- */
|
|
|
+.zone-advisor h1 {
|
|
|
+ margin: 0.2rem 0 0.35rem; font-size: 1.5rem; letter-spacing: -0.02em;
|
|
|
+}
|
|
|
+.lede { margin: 0 0 1rem; color: var(--ink-muted); max-width: 46rem; }
|
|
|
+
|
|
|
+.composer {
|
|
|
+ background: var(--surface); border: 1px solid var(--line);
|
|
|
+ border-radius: var(--radius); padding: 0.75rem;
|
|
|
+}
|
|
|
+.composer:focus-within { border-color: var(--accent); }
|
|
|
+.composer textarea {
|
|
|
+ display: block; width: 100%; border: none; resize: vertical;
|
|
|
+ background: transparent; color: var(--ink);
|
|
|
+ font: inherit; padding: 0.35rem 0.45rem;
|
|
|
+}
|
|
|
+.composer textarea:focus { outline: none; }
|
|
|
+.composer textarea::placeholder { color: var(--ink-faint); }
|
|
|
+.composer-bar {
|
|
|
+ display: flex; align-items: center; justify-content: space-between;
|
|
|
+ gap: 1rem; margin-top: 0.5rem; padding: 0 0.25rem;
|
|
|
+}
|
|
|
+.hint { margin: 0; font-size: 0.8125rem; color: var(--ink-faint); font-family: var(--font-mono); }
|
|
|
+
|
|
|
+.btn {
|
|
|
+ font: inherit; font-size: 0.875rem; cursor: pointer;
|
|
|
+ border: 1px solid var(--line); border-radius: 6px;
|
|
|
+ background: var(--surface); color: var(--ink);
|
|
|
+ padding: 0.3rem 0.9rem;
|
|
|
+}
|
|
|
+.btn:hover { border-color: var(--ink-muted); }
|
|
|
+.btn.primary {
|
|
|
+ background: var(--accent); border-color: rgba(31, 35, 40, 0.15);
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+.btn.quiet { color: var(--ink-muted); }
|
|
|
+
|
|
|
+.exchange { margin-top: 1.4rem; }
|
|
|
+.exchange h2 {
|
|
|
+ font-size: 0.9375rem; margin: 0 0 0.75rem; font-weight: 600;
|
|
|
+ color: var(--ink-muted); display: flex; gap: 0.75rem; align-items: baseline;
|
|
|
+}
|
|
|
+.exchange h2 .more { font-size: 0.8125rem; }
|
|
|
+.msg { max-width: 44rem; margin-bottom: 0.75rem; }
|
|
|
+.msg p { margin: 0; }
|
|
|
+.from-user { margin-left: auto; padding-right: 0; text-align: right; }
|
|
|
+.from-user p { display: inline-block; text-align: left; }
|
|
|
+.from-user > p:first-child, .from-advisor > p:first-child { margin: 0; }
|
|
|
+.from-advisor { color: var(--ink); }
|
|
|
+.from-user > p {
|
|
|
+ background: var(--accent-surface); border-radius: 12px;
|
|
|
+ padding: 0.55rem 0.9rem; max-width: 40rem;
|
|
|
+}
|
|
|
+.from-advisor > p {
|
|
|
+ border-left: 2px solid var(--line); padding-left: 0.9rem;
|
|
|
+}
|
|
|
+.suggested {
|
|
|
+ border: 1px solid var(--line); border-left: 2px solid var(--accent);
|
|
|
+ border-radius: 6px; padding: 0.65rem 0.9rem; margin-top: 0.6rem;
|
|
|
+ background: var(--surface); max-width: 40rem;
|
|
|
+}
|
|
|
+.suggested-kind {
|
|
|
+ margin: 0 0 0.25rem; font-size: 0.6875rem; text-transform: uppercase;
|
|
|
+ letter-spacing: 0.08em; color: var(--accent); font-weight: 600;
|
|
|
+}
|
|
|
+.suggested-title { margin: 0 0 0.2rem; font-weight: 600; }
|
|
|
+.suggested-meta { margin: 0 0 0.6rem; font-size: 0.8125rem; color: var(--ink-muted); }
|
|
|
+.suggested-actions { display: flex; gap: 0.5rem; }
|
|
|
+.all-chats { font-size: 0.875rem; margin: 0.9rem 0 0; }
|
|
|
+
|
|
|
+/* ---- ZONE 2: compact status strip ---- */
|
|
|
+.zone-status {
|
|
|
+ margin-top: 2.2rem; padding-top: 1.2rem;
|
|
|
+ border-top: 1px solid var(--line);
|
|
|
+ display: grid; grid-template-columns: minmax(0, 1.9fr) minmax(0, 1fr);
|
|
|
+ gap: 1.5rem;
|
|
|
+}
|
|
|
+.zone-status h2 {
|
|
|
+ font-size: 0.9375rem; margin: 0 0 0.75rem; font-weight: 600;
|
|
|
+}
|
|
|
+.count {
|
|
|
+ margin-left: 0.4rem; color: var(--ink-faint); font-weight: 500; font-size: 0.8125rem;
|
|
|
+}
|
|
|
+.needs-list { list-style: none; margin: 0; padding: 0; }
|
|
|
+.need {
|
|
|
+ display: grid; grid-template-columns: 6.5rem minmax(0, 1fr) auto;
|
|
|
+ gap: 0.9rem; padding: 0.7rem 0; align-items: start;
|
|
|
+ border-top: 1px solid var(--line-soft);
|
|
|
+}
|
|
|
+.need:first-child { border-top: none; padding-top: 0; }
|
|
|
+.need-kind { margin: 0.15rem 0 0; }
|
|
|
+.need-title { margin: 0 0 0.15rem; font-weight: 550; }
|
|
|
+.need-meta { margin: 0; font-size: 0.8125rem; color: var(--ink-muted); }
|
|
|
+.need-act { margin: 0; display: flex; gap: 0.5rem; flex-wrap: wrap; }
|
|
|
+
|
|
|
+.tag {
|
|
|
+ display: inline-block; font-size: 0.6875rem; font-weight: 550;
|
|
|
+ padding: 0.1rem 0.5rem; border-radius: 10px; line-height: 1.5;
|
|
|
+}
|
|
|
+.tag.review { background: #fff1e0; color: #9a4700; }
|
|
|
+.tag.question { background: var(--accent-surface); color: var(--accent); }
|
|
|
+.tag.parked { background: var(--surface-inset); color: var(--ink-muted); }
|
|
|
+.tag.working { background: #fff8c5; color: var(--warning); }
|
|
|
+.tag.queued { background: #8884333d; color: #4d4d33; }
|
|
|
+.tag.suspended { background: var(--surface-inset); color: var(--ink-muted); }
|
|
|
+.tag.blocked { background: #fff8c5; color: #9a6700; }
|
|
|
+.tag.done { background: #dafbe1; color: var(--success); }
|
|
|
+.tag.failed { background: #ffebe9; color: var(--danger); }
|
|
|
+.tag.progress { background: #dafbe1; color: var(--success); }
|
|
|
+.tag.comment { background: #f0f0f0; color: #6e7781; }
|
|
|
+.tag.system { background: var(--surface-inset); color: var(--ink-muted); }
|
|
|
+@media (prefers-color-scheme: dark) {
|
|
|
+ .tag.review { background: #3d1e00; color: #d4a72c; }
|
|
|
+ .tag.question { background: #121d2f; color: #4493f8; }
|
|
|
+ .tag.working { background: #2b2b12; color: #d4a72c; }
|
|
|
+ .tag.queued { background: #2b2b12; color: #d4a72c; }
|
|
|
+ .tag.blocked { background: #2b2b12; color: #d4a72c; }
|
|
|
+ .tag.done, .tag.progress { background: #12261e; color: #3fb950; }
|
|
|
+ .tag.failed { background: #2d1214; color: #f85149; }
|
|
|
+ .tag.comment { background: #262c36; color: #9198a1; }
|
|
|
+}
|
|
|
+
|
|
|
+.health { border-left: 1px solid var(--line-soft); padding-left: 1.5rem; }
|
|
|
+.metrics { display: grid; grid-template-columns: repeat(4, 1fr); margin: 0 0 1rem; gap: 0.5rem; }
|
|
|
+.metric dt { font-size: 0.75rem; color: var(--ink-faint); text-transform: none; }
|
|
|
+.metric dd {
|
|
|
+ margin: 0.1rem 0 0; font-size: 1.6rem; font-weight: 650;
|
|
|
+ font-variant-numeric: tabular-nums; line-height: 1.1;
|
|
|
+}
|
|
|
+.metric dd.warn { color: var(--warning); }
|
|
|
+.saddles { list-style: none; margin: 0; padding: 0; font-size: 0.875rem; }
|
|
|
+.saddles li { display: flex; align-items: center; gap: 0.5rem; padding: 0.25rem 0; }
|
|
|
+.state {
|
|
|
+ width: 0.5rem; height: 0.5rem; border-radius: 50%;
|
|
|
+ display: inline-block; flex: none;
|
|
|
+}
|
|
|
+.state.busy { background: var(--success); }
|
|
|
+.state.idle { background: var(--ink-faint); }
|
|
|
+.state.offline { background: transparent; border: 1px solid var(--ink-faint); }
|
|
|
+
|
|
|
+/* ---- ZONE 3: ambient ---- */
|
|
|
+.zone-ambient { margin-top: 2.2rem; padding-top: 1.2rem; border-top: 1px solid var(--line); }
|
|
|
+.panel { margin-bottom: 1.1rem; }
|
|
|
+.panel > summary {
|
|
|
+ cursor: pointer; list-style: none; display: flex; align-items: baseline; gap: 0.5rem;
|
|
|
+}
|
|
|
+.panel > summary::-webkit-details-marker { display: none; }
|
|
|
+.panel > summary::after { content: "+"; color: var(--ink-faint); font-weight: 400; }
|
|
|
+.panel[open] > summary::after { content: "–"; }
|
|
|
+.panel > summary h2 {
|
|
|
+ font-size: 0.9375rem; font-weight: 600; margin: 0; color: var(--ink);
|
|
|
+}
|
|
|
+.summary-meta { font-size: 0.8125rem; color: var(--ink-faint); }
|
|
|
+.panel > div, .panel > ul, .panel > p, .panel > table { margin-top: 0.75rem; }
|
|
|
+
|
|
|
+.notes { list-style: none; margin: 0.75rem 0 0; padding: 0; }
|
|
|
+.note { display: flex; gap: 0.6rem; padding: 0.4rem 0; }
|
|
|
+.note-state {
|
|
|
+ flex: none; width: 0.8rem; height: 0.8rem; margin-top: 0.2rem;
|
|
|
+ border: 1px solid var(--ink-faint); border-radius: 3px;
|
|
|
+}
|
|
|
+.note.done .note-state { background: var(--success); border-color: var(--success); }
|
|
|
+.note.promoted .note-state {
|
|
|
+ background: var(--accent-surface); border-color: var(--accent);
|
|
|
+}
|
|
|
+.note-body p:first-child { margin: 0 0 0.1rem; }
|
|
|
+.note-meta { font-size: 0.8125rem; color: var(--ink-faint); }
|
|
|
+.note.done .note-body p:first-child { color: var(--ink-muted); }
|
|
|
+
|
|
|
+.discoveries { list-style: none; margin: 0.75rem 0 0; padding: 0; max-width: 50rem; }
|
|
|
+.discoveries li { padding: 0.4rem 0; border-top: 1px solid var(--line-soft); }
|
|
|
+.discoveries li:first-child { border-top: none; }
|
|
|
+.discoveries li > p:first-child { margin: 0 0 0.1rem; }
|
|
|
+.more-row { margin: 0.5rem 0 0; font-size: 0.875rem; }
|
|
|
+
|
|
|
+.tasks { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
|
|
|
+.tasks th {
|
|
|
+ text-align: left; font-size: 0.75rem; font-weight: 600;
|
|
|
+ color: var(--ink-faint); padding: 0.3rem 0.75rem 0.3rem 0;
|
|
|
+ border-bottom: 1px solid var(--line);
|
|
|
+}
|
|
|
+.tasks td {
|
|
|
+ padding: 0.45rem 0.75rem 0.45rem 0; border-bottom: 1px solid var(--line-soft);
|
|
|
+ vertical-align: top;
|
|
|
+}
|
|
|
+.tasks td.when, .tasks td.empty { color: var(--ink-faint); }
|
|
|
+.tasks .when { color: var(--ink-faint); }
|
|
|
+.when { color: var(--ink-faint); font-size: 0.8125rem; }
|
|
|
+
|
|
|
+.activity { list-style: none; margin: 0.75rem 0 0; padding: 0; font-size: 0.875rem; }
|
|
|
+.activity li { display: flex; gap: 0.75rem; padding: 0.28rem 0; }
|
|
|
+.activity .when { flex: none; width: 3.2rem; font-variant-numeric: tabular-nums; }
|
|
|
+.activity .what { margin: 0; }
|
|
|
+.activity .what a { font-weight: 500; }
|
|
|
+
|
|
|
+.foot {
|
|
|
+ max-width: 66rem; margin: 0 auto; padding: 1rem; font-size: 0.8125rem;
|
|
|
+ color: var(--ink-faint); border-top: 1px solid var(--line-soft);
|
|
|
+}
|
|
|
+.foot p { margin: 0; }
|
|
|
+
|
|
|
+@media (max-width: 50rem) {
|
|
|
+ .zone-status { grid-template-columns: 1fr; }
|
|
|
+ .health { border-left: none; padding-left: 0; border-top: 1px solid var(--line-soft); padding-top: 1rem; }
|
|
|
+ .need { grid-template-columns: minmax(0, 1fr); }
|
|
|
+ .need-kind { margin: 0; }
|
|
|
+ .need-act { margin-top: 0.2rem; }
|
|
|
+}
|
|
|
+
|
|
|
+</style>
|
|
|
+</head>
|
|
|
+<body>
|
|
|
+<header class="top">
|
|
|
+ <p class="brand">Clanker-Saddle</p>
|
|
|
+ <nav class="top-nav" aria-label="Primary">
|
|
|
+ <a href="#">Queue</a>
|
|
|
+ <a href="#">Tasks</a>
|
|
|
+ <a href="#">Goals</a>
|
|
|
+ <a href="#">Discoveries</a>
|
|
|
+ <a href="#">Saddles</a>
|
|
|
+ </nav>
|
|
|
+ <p class="who">marta · web-stack</p>
|
|
|
+</header>
|
|
|
+
|
|
|
+<main id="main">
|
|
|
+ <p class="sampler-note">Sampler 1 of 3 — Curated Primer. Static mock, not live data.
|
|
|
+ <a href="dashboard-primer.html">1 Curated Primer</a> ·
|
|
|
+ <a href="dashboard-control.html">2 Control Room</a> ·
|
|
|
+ <a href="dashboard-swiss.html">3 Swiss Flat</a></p>
|
|
|
+
|
|
|
+ <!-- ZONE 1: the advisor conversation composer, first and loudest -->
|
|
|
+ <section class="zone-advisor" aria-labelledby="advisor-h">
|
|
|
+ <h1 id="advisor-h">Ask the advisor</h1>
|
|
|
+ <p class="lede">Reads your projects, tasks, goals, rules and discoveries — asks
|
|
|
+ you questions and suggests work. It never runs commands.</p>
|
|
|
+ <form class="composer" onsubmit="return false">
|
|
|
+ <textarea rows="3" placeholder="What should the fleet work on next?"></textarea>
|
|
|
+ <div class="composer-bar">
|
|
|
+ <p class="hint">claude-sonnet · last fleet snapshot 14:02</p>
|
|
|
+ <button type="submit" class="btn primary">Start chat</button>
|
|
|
+ </div>
|
|
|
+ </form>
|
|
|
+
|
|
|
+ <section class="exchange" aria-label="Recent advisor exchange">
|
|
|
+ <h2>Yesterday — goal-branch view <a class="more" href="#">open chat</a></h2>
|
|
|
+ <div class="msg from-user">
|
|
|
+ <p>Can the goal-branch view show parked runs separately from failed ones?</p>
|
|
|
+ </div>
|
|
|
+ <div class="msg from-advisor">
|
|
|
+ <p>They share a column today. Three open goals carry parked runs, all
|
|
|
+ turn-cap parks from the ghost-working sweep; none failed this week.
|
|
|
+ I can suggest the split as a task on web-stack.</p>
|
|
|
+ <div class="suggested">
|
|
|
+ <p class="suggested-kind">suggested task</p>
|
|
|
+ <p class="suggested-title">Split parked and failed runs on the goal branch view</p>
|
|
|
+ <p class="suggested-meta">Clanker-Saddle · branch goal/branch-view</p>
|
|
|
+ <div class="suggested-actions">
|
|
|
+ <button type="button" class="btn">Create draft</button>
|
|
|
+ <button type="button" class="btn quiet">Discard</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="msg from-user">
|
|
|
+ <p>Hold on that. How many of the parked runs are older than a day?</p>
|
|
|
+ </div>
|
|
|
+ <div class="msg from-advisor">
|
|
|
+ <p>Two — both parked since 2 Oct on the notifications goal.
|
|
|
+ <a href="#">Open goal 24 →</a></p>
|
|
|
+ </div>
|
|
|
+ </section>
|
|
|
+ <p class="all-chats"><a href="#">All 14 chats →</a></p>
|
|
|
+ </section>
|
|
|
+
|
|
|
+ <!-- ZONE 2: compact status strip. Needs-you items sit above queue health. -->
|
|
|
+ <section class="zone-status" aria-labelledby="needs-h">
|
|
|
+ <div class="needs">
|
|
|
+ <h2 id="needs-h">Needs a human <span class="count">3</span></h2>
|
|
|
+ <ol class="needs-list">
|
|
|
+ <li class="need">
|
|
|
+ <p class="need-kind"><span class="tag review">review</span></p>
|
|
|
+ <div class="need-body">
|
|
|
+ <p class="need-title"><a href="#">Ghost-working sweep: requeue stale open
|
|
|
+ sessions from the dispatcher tick</a></p>
|
|
|
+ <p class="need-meta">task 211 · Clanker-Saddle · report waiting 12 min</p>
|
|
|
+ </div>
|
|
|
+ <p class="need-act"><button type="button" class="btn">Review report</button></p>
|
|
|
+ </li>
|
|
|
+ <li class="need">
|
|
|
+ <p class="need-kind"><span class="tag parked">parked</span></p>
|
|
|
+ <div class="need-body">
|
|
|
+ <p class="need-title"><a href="#">Goal compare: diff two branches’
|
|
|
+ task trees</a></p>
|
|
|
+ <p class="need-meta">task 198 · hit the 40-turn cap at 13:51 ·
|
|
|
+ wake to continue, or leave it parked</p>
|
|
|
+ </div>
|
|
|
+ <p class="need-act"><button type="button" class="btn">Wake</button>
|
|
|
+ <button type="button" class="btn quiet">Leave parked</button></p>
|
|
|
+ </li>
|
|
|
+ <li class="need">
|
|
|
+ <p class="need-kind"><span class="tag question">question</span></p>
|
|
|
+ <div class="need-body">
|
|
|
+ <p class="need-title">Should the discovery list paginate at 50 rows, or
|
|
|
+ keep one long scroll?</p>
|
|
|
+ <p class="need-meta">task 197 · asked 2 h ago · options 50 / 100 / keep scroll</p>
|
|
|
+ </div>
|
|
|
+ <p class="need-act"><button type="button" class="btn">Answer</button></p>
|
|
|
+ </li>
|
|
|
+ </ol>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="health">
|
|
|
+ <h2>Queue health</h2>
|
|
|
+ <dl class="metrics">
|
|
|
+ <div class="metric"><dt>running</dt><dd>3</dd></div>
|
|
|
+ <div class="metric"><dt>stuck</dt><dd class="warn">1</dd></div>
|
|
|
+ <div class="metric"><dt>queued</dt><dd>5</dd></div>
|
|
|
+ <div class="metric"><dt>draft</dt><dd>2</dd></div>
|
|
|
+ </dl>
|
|
|
+ <ul class="saddles">
|
|
|
+ <li><span class="state busy"></span>atlas — busy · task 214</li>
|
|
|
+ <li><span class="state busy"></span>meridian — busy · goal 31</li>
|
|
|
+ <li><span class="state idle"></span>kestrel — idle · 41 min</li>
|
|
|
+ <li><span class="state offline"></span>portland — offline · 3 h</li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </section>
|
|
|
+
|
|
|
+ <!-- ZONE 3: ambient. Reduced density, collapsed where sensible. -->
|
|
|
+ <section class="zone-ambient" aria-label="Ambient">
|
|
|
+ <details class="panel" open>
|
|
|
+ <summary><h2>Notes</h2><span class="summary-meta">3</span></summary>
|
|
|
+ <ul class="notes">
|
|
|
+ <li class="note open"><span class="note-state"></span>
|
|
|
+ <div class="note-body">
|
|
|
+ <p>Dashboard hierarchy: advisor first, needs-you second, ambient
|
|
|
+ below — decide between the three samplers before touching app.css.</p>
|
|
|
+ <p class="note-meta">today 13:04</p>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ <li class="note done"><span class="note-state"></span>
|
|
|
+ <div class="note-body">
|
|
|
+ <p>Check goal badge contrast under the dark scheme.</p>
|
|
|
+ <p class="note-meta">yesterday · done</p>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ <li class="note promoted"><span class="note-state"></span>
|
|
|
+ <div class="note-body">
|
|
|
+ <p>Ship the web-push test notification end to end.</p>
|
|
|
+ <p class="note-meta">promoted to <a href="#">goal 24</a></p>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </details>
|
|
|
+
|
|
|
+ <details class="panel" open>
|
|
|
+ <summary><h2>Latest discoveries</h2><span class="summary-meta">2</span></summary>
|
|
|
+ <ul class="discoveries">
|
|
|
+ <li>
|
|
|
+ <p>json-glib writes invalid UTF-8 verbatim: a byte-count clamp that lands
|
|
|
+ mid-character poisons the whole payload, and the stored row loses its
|
|
|
+ members on read-back. Back the cut off over continuation bytes at every
|
|
|
+ serialisation boundary.</p>
|
|
|
+ <p class="note-meta">2 Oct · Saddle</p>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <p>A harness seeding a row the app also lazily creates must INSERT OR
|
|
|
+ IGNORE — two read-then-insert writers race and the loser dies on
|
|
|
+ UNIQUE, taking the whole sequential suite with it.</p>
|
|
|
+ <p class="note-meta">1 Oct · Clanker-Saddle</p>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ <p class="more-row"><a href="#">All discoveries →</a></p>
|
|
|
+ </details>
|
|
|
+
|
|
|
+ <details class="panel">
|
|
|
+ <summary><h2>Active tasks</h2><span class="summary-meta">6</span></summary>
|
|
|
+ <table class="tasks">
|
|
|
+ <thead>
|
|
|
+ <tr><th>Task</th><th>Status</th><th>Branch</th><th>Latest</th></tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">214 · Mock dashboard: three visual directions as static
|
|
|
+ HTML samplers</a></td>
|
|
|
+ <td><span class="tag working">working</span></td>
|
|
|
+ <td>web-stack</td>
|
|
|
+ <td>writing mocks/dashboard-primer.html <span class="when">14:02</span></td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">213 · Split parked and failed runs on the goal branch
|
|
|
+ view</a></td>
|
|
|
+ <td><span class="tag queued">queued</span></td>
|
|
|
+ <td>goal/branch-view</td>
|
|
|
+ <td class="empty">—</td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">198 · Goal compare: diff two branches’ task
|
|
|
+ trees</a></td>
|
|
|
+ <td><span class="tag suspended">suspended</span></td>
|
|
|
+ <td>goal/compare</td>
|
|
|
+ <td>parked at turn cap 41/40 <span class="when">13:51</span></td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">196 · Notification digest: batch question and RFC
|
|
|
+ pushes</a></td>
|
|
|
+ <td><span class="tag blocked">blocked</span></td>
|
|
|
+ <td>notify/digest</td>
|
|
|
+ <td>asked: digest window 5 or 15 min <span class="when">12:37</span></td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">189 · Rate-limit the events endpoint</a></td>
|
|
|
+ <td><span class="tag failed">failed</span></td>
|
|
|
+ <td>api/rate-limit</td>
|
|
|
+ <td>429 loop under parallel suites; needs backoff <span class="when">11:20</span></td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td><a href="#">195 · Advisor chat export to markdown</a></td>
|
|
|
+ <td><span class="tag done">done</span></td>
|
|
|
+ <td>advisor/export</td>
|
|
|
+ <td>report accepted <span class="when">09:58</span></td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </details>
|
|
|
+
|
|
|
+ <details class="panel">
|
|
|
+ <summary><h2>Activity</h2><span class="summary-meta">7 events</span></summary>
|
|
|
+ <ul class="activity">
|
|
|
+ <li><p class="when">14:02</p>
|
|
|
+ <p class="what"><span class="tag progress">progress</span> <a href="#">214</a>
|
|
|
+ writing mocks/dashboard-primer.html</p></li>
|
|
|
+ <li><p class="when">13:58</p>
|
|
|
+ <p class="what"><span class="tag question">question</span> <a href="#">197</a>
|
|
|
+ discovery list pagination — 50, 100, or one scroll?</p></li>
|
|
|
+ <li><p class="when">13:50</p>
|
|
|
+ <p class="what"><span class="tag review">review</span> <a href="#">211</a>
|
|
|
+ report ready — ghost-working sweep</p></li>
|
|
|
+ <li><p class="when">13:44</p>
|
|
|
+ <p class="what"><span class="tag comment">comment</span> goal 31 —
|
|
|
+ “keep needs-a-human above queue health”</p></li>
|
|
|
+ <li><p class="when">13:31</p>
|
|
|
+ <p class="what"><span class="tag progress">progress</span> <a href="#">196</a>
|
|
|
+ digest skeleton, window still undecided</p></li>
|
|
|
+ <li><p class="when">13:04</p>
|
|
|
+ <p class="what"><span class="tag system">saddle</span> kestrel idle after
|
|
|
+ task 197 parked</p></li>
|
|
|
+ <li><p class="when">11:20</p>
|
|
|
+ <p class="what"><span class="tag failed">failed</span> <a href="#">189</a>
|
|
|
+ exit 1 — 429 loop under parallel suites</p></li>
|
|
|
+ </ul>
|
|
|
+ </details>
|
|
|
+ </section>
|
|
|
+</main>
|
|
|
+
|
|
|
+<footer class="foot">
|
|
|
+ <p>Curated Primer sampler · static mock for the dashboard overhaul · toggle your
|
|
|
+ OS or devtools colour scheme to check the second variant</p>
|
|
|
+</footer>
|
|
|
+
|
|
|
+</body>
|
|
|
+</html>
|