dashboard-control.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title>Clanker-Saddle dashboard &mdash; Control Room (sampler 2 of 3)</title>
  7. <style>
  8. /* DIRECTION 2 — CONTROL ROOM. Dark-first, mono-forward, quiet neutrals;
  9. status colour carries the meaning. Light variant via scheme query. */
  10. :root {
  11. --bg: #0f1317; /* page: near-black, cold */
  12. --surface: #151a20; /* panels */
  13. --raise: #1c232b; /* hover wells, inputs */
  14. --ink: #c9d4de; /* primary text */
  15. --dim: #7e8b98; /* secondary text */
  16. --faint: #525e6a; /* meta, rules */
  17. --rule: #262e38; /* hairlines */
  18. --rule-hi: #394450; /* emphasized edges */
  19. --run: #4cc38a; /* running / done / busy */
  20. --warn: #f5b452; /* queued / blocked / review */
  21. --crit: #ef6460; /* failed / stuck */
  22. --info: #58a6ff; /* interactive / question */
  23. --accent: #58a6ff; /* actions ride info blue, quietly */
  24. --radius: 4px;
  25. --mono: ui-monospace, "Cascadia Code", Menlo, Consolas, monospace;
  26. --sans: system-ui, -apple-system, "Segoe UI", sans-serif;
  27. }
  28. @media (prefers-color-scheme: light) {
  29. :root {
  30. --bg: #eef1f4;
  31. --surface: #ffffff;
  32. --raise: #f4f6f8;
  33. --ink: #1b2530;
  34. --dim: #54626f;
  35. --faint: #75828e;
  36. --rule: #d7dee4;
  37. --rule-hi: #b4c0ca;
  38. --run: #10735a;
  39. --warn: #8f5b00;
  40. --crit: #c3362f;
  41. --info: #0a5dc2;
  42. --accent: #0a5dc2;
  43. }
  44. }
  45. * { box-sizing: border-box; }
  46. html { scrollbar-gutter: stable; }
  47. body {
  48. margin: 0;
  49. font: 14px/1.55 var(--sans);
  50. color: var(--ink);
  51. background: var(--bg);
  52. }
  53. a { color: var(--info); text-decoration: none; }
  54. a:hover { text-decoration: underline; }
  55. h1, h2, .hint, .tag, .metric dt, .when, dt, th, .sampler-note, .who { font-family: var(--mono); }
  56. .top {
  57. display: flex; align-items: baseline; gap: 1.25rem;
  58. border-bottom: 1px solid var(--rule-hi);
  59. background: var(--surface);
  60. padding: 0.7rem 1.25rem;
  61. }
  62. .brand {
  63. margin: 0; font-family: var(--mono); font-size: 0.875rem; font-weight: 700;
  64. letter-spacing: 0.04em; color: var(--ink);
  65. }
  66. .top-nav { display: flex; gap: 1rem; flex: 1; flex-wrap: wrap; }
  67. .top-nav a {
  68. font-family: var(--mono); font-size: 0.75rem; text-transform: uppercase;
  69. letter-spacing: 0.06em; color: var(--dim);
  70. }
  71. .top-nav a:hover { color: var(--info); text-decoration: none; }
  72. .who { margin: 0; font-size: 0.75rem; color: var(--faint); }
  73. main { max-width: 70rem; margin: 0 auto; padding: 1.25rem 1.25rem 3rem; }
  74. .sampler-note {
  75. font-size: 0.75rem; color: var(--faint); margin: 0 0 1.25rem;
  76. border: 1px solid var(--rule); border-radius: var(--radius);
  77. padding: 0.4rem 0.6rem; display: inline-block;
  78. }
  79. .sampler-note a { color: var(--dim); }
  80. /* ---- ZONE 1 ---- */
  81. .zone-advisor h1 {
  82. margin: 0 0 0.3rem; font-size: 1.0625rem; font-weight: 700;
  83. letter-spacing: 0.02em; text-transform: uppercase;
  84. }
  85. .lede { margin: 0 0 1rem; color: var(--dim); max-width: 46rem; font-size: 0.9375rem; }
  86. .composer {
  87. border: 1px solid var(--rule-hi); border-radius: var(--radius);
  88. background: var(--surface); padding: 0.6rem;
  89. }
  90. .composer:focus-within { border-color: var(--info); }
  91. .composer textarea {
  92. display: block; width: 100%; border: none; resize: vertical;
  93. background: transparent; color: var(--ink); font: inherit; padding: 0.35rem 0.45rem;
  94. }
  95. .composer textarea:focus { outline: none; }
  96. .composer textarea::placeholder { color: var(--faint); }
  97. .composer-bar {
  98. display: flex; align-items: center; justify-content: space-between;
  99. gap: 1rem; margin-top: 0.4rem; padding: 0 0.2rem;
  100. }
  101. .hint { margin: 0; font-size: 0.75rem; color: var(--faint); }
  102. .btn {
  103. font: 0.8125rem var(--mono); cursor: pointer;
  104. border: 1px solid var(--rule-hi); border-radius: var(--radius);
  105. background: var(--raise); color: var(--ink);
  106. padding: 0.3rem 0.85rem;
  107. }
  108. .btn:hover { border-color: var(--dim); }
  109. .btn.primary {
  110. background: var(--accent); border-color: var(--accent); color: #0b0f13;
  111. font-weight: 700;
  112. }
  113. @media (prefers-color-scheme: light) {
  114. .btn.primary { color: #ffffff; }
  115. }
  116. .btn.quiet { color: var(--dim); }
  117. .exchange { margin-top: 1.4rem; }
  118. .exchange h2 {
  119. font-size: 0.75rem; margin: 0 0 0.75rem; font-weight: 600;
  120. text-transform: uppercase; letter-spacing: 0.08em; color: var(--dim);
  121. display: flex; gap: 0.75rem; align-items: baseline;
  122. }
  123. .exchange h2 .more { font-size: 0.75rem; text-transform: none; letter-spacing: 0; }
  124. .msg { max-width: 44rem; margin-bottom: 0.7rem; }
  125. .msg p { margin: 0; }
  126. .from-user { text-align: right; }
  127. .from-user p {
  128. display: inline-block; text-align: left;
  129. background: var(--raise); border: 1px solid var(--rule);
  130. border-radius: var(--radius); padding: 0.5rem 0.8rem;
  131. }
  132. .from-advisor > p {
  133. border-left: 2px solid var(--rule-hi); padding-left: 0.85rem;
  134. }
  135. .suggested {
  136. border: 1px solid var(--rule-hi); border-left: 2px solid var(--info);
  137. border-radius: var(--radius); padding: 0.6rem 0.85rem; margin-top: 0.6rem;
  138. background: var(--surface); max-width: 40rem;
  139. }
  140. .suggested-kind {
  141. margin: 0 0 0.25rem; font-family: var(--mono); font-size: 0.6875rem;
  142. text-transform: uppercase; letter-spacing: 0.1em; color: var(--info); font-weight: 700;
  143. }
  144. .suggested-title { margin: 0 0 0.2rem; font-weight: 600; }
  145. .suggested-meta { margin: 0 0 0.6rem; font-size: 0.8125rem; color: var(--dim); font-family: var(--mono); }
  146. .suggested-actions { display: flex; gap: 0.5rem; }
  147. .all-chats { font-size: 0.875rem; margin: 0.9rem 0 0; }
  148. /* ---- ZONE 2 ---- */
  149. .zone-status {
  150. margin-top: 2rem; padding-top: 1.1rem; border-top: 1px solid var(--rule-hi);
  151. display: grid; grid-template-columns: minmax(0, 1.9fr) minmax(0, 1fr); gap: 1.5rem;
  152. }
  153. .zone-status h2 {
  154. font-size: 0.75rem; margin: 0 0 0.75rem; font-weight: 600;
  155. text-transform: uppercase; letter-spacing: 0.08em; color: var(--dim);
  156. }
  157. .count { margin-left: 0.4rem; color: var(--faint); font-weight: 500; font-size: 0.75rem; }
  158. .needs-list { list-style: none; margin: 0; padding: 0; }
  159. .need {
  160. display: grid; grid-template-columns: 6.5rem minmax(0, 1fr) auto;
  161. gap: 0.9rem; padding: 0.7rem 0; align-items: start;
  162. border-top: 1px solid var(--rule);
  163. }
  164. .need:first-child { border-top: none; padding-top: 0; }
  165. .need-kind { margin: 0.15rem 0 0; }
  166. .need-title { margin: 0 0 0.15rem; font-weight: 550; }
  167. .need-meta { margin: 0; font-size: 0.8125rem; color: var(--dim); font-family: var(--mono); }
  168. .need-act { margin: 0; display: flex; gap: 0.5rem; flex-wrap: wrap; }
  169. .tag {
  170. display: inline-block; font-size: 0.6875rem; font-weight: 600;
  171. padding: 0.05rem 0.45rem; border-radius: 2px; line-height: 1.55;
  172. text-transform: uppercase; letter-spacing: 0.05em;
  173. border: 1px solid currentColor; background: transparent;
  174. }
  175. .tag.review, .tag.working, .tag.blocked, .tag.queued { color: var(--warn); }
  176. .tag.question { color: var(--info); }
  177. .tag.parked, .tag.suspended, .tag.system { color: var(--dim); }
  178. .tag.done, .tag.progress { color: var(--run); }
  179. .tag.failed { color: var(--crit); }
  180. .tag.comment { color: var(--faint); }
  181. .health { border-left: 1px solid var(--rule); padding-left: 1.5rem; }
  182. .metrics { display: grid; grid-template-columns: repeat(4, 1fr); margin: 0 0 1rem; gap: 0.5rem; }
  183. .metric dt { font-size: 0.6875rem; color: var(--faint); text-transform: uppercase; letter-spacing: 0.07em; }
  184. .metric dd {
  185. margin: 0.15rem 0 0; font-family: var(--mono); font-size: 1.7rem; font-weight: 700;
  186. font-variant-numeric: tabular-nums; line-height: 1.1; color: var(--ink);
  187. }
  188. .metric dd.warn { color: var(--warn); }
  189. .saddles { list-style: none; margin: 0; padding: 0; font-size: 0.8125rem; font-family: var(--mono); }
  190. .saddles li { display: flex; align-items: center; gap: 0.5rem; padding: 0.28rem 0; }
  191. .state {
  192. width: 0.55rem; height: 0.55rem; border-radius: 1px;
  193. display: inline-block; flex: none;
  194. }
  195. .state.busy { background: var(--run); box-shadow: 0 0 0 1px var(--run); }
  196. .state.idle { background: transparent; border: 1px solid var(--dim); box-shadow: none; }
  197. .state.offline { background: transparent; border: 1px dashed var(--faint); box-shadow: none; }
  198. /* ---- ZONE 3 ---- */
  199. .zone-ambient { margin-top: 2rem; padding-top: 1.1rem; border-top: 1px solid var(--rule-hi); }
  200. .panel { margin-bottom: 1.1rem; }
  201. .panel > summary {
  202. cursor: pointer; list-style: none; display: flex; align-items: baseline; gap: 0.5rem;
  203. }
  204. .panel > summary::-webkit-details-marker { display: none; }
  205. .panel > summary::after { content: "+"; color: var(--faint); font-family: var(--mono); }
  206. .panel[open] > summary::after { content: "–"; }
  207. .panel > summary h2 {
  208. font-size: 0.75rem; font-weight: 600; margin: 0; text-transform: uppercase;
  209. letter-spacing: 0.08em; color: var(--dim);
  210. }
  211. .summary-meta { font-family: var(--mono); font-size: 0.75rem; color: var(--faint); }
  212. .panel > ul, .panel > table, .panel > p { margin-top: 0.75rem; }
  213. .notes { list-style: none; margin: 0.75rem 0 0; padding: 0; }
  214. .note { display: flex; gap: 0.6rem; padding: 0.4rem 0; }
  215. .note-state {
  216. flex: none; width: 0.8rem; height: 0.8rem; margin-top: 0.2rem;
  217. border: 1px solid var(--faint); border-radius: 1px;
  218. }
  219. .note.done .note-state { background: var(--run); border-color: var(--run); }
  220. .note.promoted .note-state { border-color: var(--info); background: transparent;
  221. box-shadow: inset 0 0 0 2px var(--surface), inset 0 0 0 4px var(--info); }
  222. .note-body p:first-child { margin: 0 0 0.1rem; }
  223. .note-meta { font-size: 0.75rem; color: var(--faint); font-family: var(--mono); }
  224. .note.done .note-body p:first-child { color: var(--dim); }
  225. .discoveries { list-style: none; margin: 0.75rem 0 0; padding: 0; max-width: 50rem; }
  226. .discoveries li { padding: 0.4rem 0; border-top: 1px solid var(--rule); }
  227. .discoveries li:first-child { border-top: none; }
  228. .discoveries li > p:first-child { margin: 0 0 0.1rem; }
  229. .more-row { margin: 0.5rem 0 0; font-size: 0.8125rem; }
  230. .tasks { width: 100%; border-collapse: collapse; font-size: 0.8125rem; }
  231. .tasks th {
  232. text-align: left; font-size: 0.6875rem; font-weight: 600; text-transform: uppercase;
  233. letter-spacing: 0.07em; color: var(--faint); padding: 0.3rem 0.75rem 0.3rem 0;
  234. border-bottom: 1px solid var(--rule-hi);
  235. }
  236. .tasks td {
  237. padding: 0.45rem 0.75rem 0.45rem 0; border-bottom: 1px solid var(--rule);
  238. vertical-align: top;
  239. }
  240. .tasks td.empty { color: var(--faint); }
  241. .tasks .when, .when { color: var(--faint); font-family: var(--mono); font-size: 0.75rem; }
  242. .activity { list-style: none; margin: 0.75rem 0 0; padding: 0; font-size: 0.8125rem; }
  243. .activity li { display: flex; gap: 0.75rem; padding: 0.28rem 0; }
  244. .activity .when {
  245. flex: none; width: 3.4rem; font-variant-numeric: tabular-nums;
  246. }
  247. .activity .what { margin: 0; }
  248. .activity .what a { font-weight: 500; }
  249. .foot {
  250. border-top: 1px solid var(--rule-hi); color: var(--faint);
  251. font-family: var(--mono); font-size: 0.75rem;
  252. padding: 0.9rem 1.25rem;
  253. }
  254. .foot p { margin: 0; max-width: 70rem; margin-inline: auto; }
  255. @media (max-width: 50rem) {
  256. .zone-status { grid-template-columns: 1fr; }
  257. .health { border-left: none; padding-left: 0; border-top: 1px solid var(--rule); padding-top: 1rem; }
  258. .need { grid-template-columns: minmax(0, 1fr); }
  259. .need-kind { margin: 0; }
  260. .need-act { margin-top: 0.2rem; }
  261. }
  262. </style>
  263. </head>
  264. <body>
  265. <header class="top">
  266. <p class="brand">Clanker-Saddle</p>
  267. <nav class="top-nav" aria-label="Primary">
  268. <a href="#">Queue</a>
  269. <a href="#">Tasks</a>
  270. <a href="#">Goals</a>
  271. <a href="#">Discoveries</a>
  272. <a href="#">Saddles</a>
  273. </nav>
  274. <p class="who">marta &middot; web-stack</p>
  275. </header>
  276. <main id="main">
  277. <p class="sampler-note">Sampler 2 of 3 &mdash; Control Room. Static mock, not live data.
  278. <a href="dashboard-primer.html">1 Curated Primer</a> &middot;
  279. <a href="dashboard-control.html">2 Control Room</a> &middot;
  280. <a href="dashboard-swiss.html">3 Swiss Flat</a></p>
  281. <!-- ZONE 1: the advisor conversation composer, first and loudest -->
  282. <section class="zone-advisor" aria-labelledby="advisor-h">
  283. <h1 id="advisor-h">Ask the advisor</h1>
  284. <p class="lede">Reads your projects, tasks, goals, rules and discoveries &mdash; asks
  285. you questions and suggests work. It never runs commands.</p>
  286. <form class="composer" onsubmit="return false">
  287. <textarea rows="3" placeholder="What should the fleet work on next?"></textarea>
  288. <div class="composer-bar">
  289. <p class="hint">claude-sonnet &middot; last fleet snapshot 14:02</p>
  290. <button type="submit" class="btn primary">Start chat</button>
  291. </div>
  292. </form>
  293. <section class="exchange" aria-label="Recent advisor exchange">
  294. <h2>Yesterday &mdash; goal-branch view <a class="more" href="#">open chat</a></h2>
  295. <div class="msg from-user">
  296. <p>Can the goal-branch view show parked runs separately from failed ones?</p>
  297. </div>
  298. <div class="msg from-advisor">
  299. <p>They share a column today. Three open goals carry parked runs, all
  300. turn-cap parks from the ghost-working sweep; none failed this week.
  301. I can suggest the split as a task on web-stack.</p>
  302. <div class="suggested">
  303. <p class="suggested-kind">suggested task</p>
  304. <p class="suggested-title">Split parked and failed runs on the goal branch view</p>
  305. <p class="suggested-meta">Clanker-Saddle &middot; branch goal/branch-view</p>
  306. <div class="suggested-actions">
  307. <button type="button" class="btn">Create draft</button>
  308. <button type="button" class="btn quiet">Discard</button>
  309. </div>
  310. </div>
  311. </div>
  312. <div class="msg from-user">
  313. <p>Hold on that. How many of the parked runs are older than a day?</p>
  314. </div>
  315. <div class="msg from-advisor">
  316. <p>Two &mdash; both parked since 2 Oct on the notifications goal.
  317. <a href="#">Open goal 24 &rarr;</a></p>
  318. </div>
  319. </section>
  320. <p class="all-chats"><a href="#">All 14 chats &rarr;</a></p>
  321. </section>
  322. <!-- ZONE 2: compact status strip. Needs-you items sit above queue health. -->
  323. <section class="zone-status" aria-labelledby="needs-h">
  324. <div class="needs">
  325. <h2 id="needs-h">Needs a human <span class="count">3</span></h2>
  326. <ol class="needs-list">
  327. <li class="need">
  328. <p class="need-kind"><span class="tag review">review</span></p>
  329. <div class="need-body">
  330. <p class="need-title"><a href="#">Ghost-working sweep: requeue stale open
  331. sessions from the dispatcher tick</a></p>
  332. <p class="need-meta">task 211 &middot; Clanker-Saddle &middot; report waiting 12 min</p>
  333. </div>
  334. <p class="need-act"><button type="button" class="btn">Review report</button></p>
  335. </li>
  336. <li class="need">
  337. <p class="need-kind"><span class="tag parked">parked</span></p>
  338. <div class="need-body">
  339. <p class="need-title"><a href="#">Goal compare: diff two branches&rsquo;
  340. task trees</a></p>
  341. <p class="need-meta">task 198 &middot; hit the 40-turn cap at 13:51 &middot;
  342. wake to continue, or leave it parked</p>
  343. </div>
  344. <p class="need-act"><button type="button" class="btn">Wake</button>
  345. <button type="button" class="btn quiet">Leave parked</button></p>
  346. </li>
  347. <li class="need">
  348. <p class="need-kind"><span class="tag question">question</span></p>
  349. <div class="need-body">
  350. <p class="need-title">Should the discovery list paginate at 50 rows, or
  351. keep one long scroll?</p>
  352. <p class="need-meta">task 197 &middot; asked 2 h ago &middot; options 50 / 100 / keep scroll</p>
  353. </div>
  354. <p class="need-act"><button type="button" class="btn">Answer</button></p>
  355. </li>
  356. </ol>
  357. </div>
  358. <div class="health">
  359. <h2>Queue health</h2>
  360. <dl class="metrics">
  361. <div class="metric"><dt>running</dt><dd>3</dd></div>
  362. <div class="metric"><dt>stuck</dt><dd class="warn">1</dd></div>
  363. <div class="metric"><dt>queued</dt><dd>5</dd></div>
  364. <div class="metric"><dt>draft</dt><dd>2</dd></div>
  365. </dl>
  366. <ul class="saddles">
  367. <li><span class="state busy"></span>atlas &mdash; busy &middot; task 214</li>
  368. <li><span class="state busy"></span>meridian &mdash; busy &middot; goal 31</li>
  369. <li><span class="state idle"></span>kestrel &mdash; idle &middot; 41 min</li>
  370. <li><span class="state offline"></span>portland &mdash; offline &middot; 3 h</li>
  371. </ul>
  372. </div>
  373. </section>
  374. <!-- ZONE 3: ambient. Reduced density, collapsed where sensible. -->
  375. <section class="zone-ambient" aria-label="Ambient">
  376. <details class="panel" open>
  377. <summary><h2>Notes</h2><span class="summary-meta">3</span></summary>
  378. <ul class="notes">
  379. <li class="note open"><span class="note-state"></span>
  380. <div class="note-body">
  381. <p>Dashboard hierarchy: advisor first, needs-you second, ambient
  382. below &mdash; decide between the three samplers before touching app.css.</p>
  383. <p class="note-meta">today 13:04</p>
  384. </div>
  385. </li>
  386. <li class="note done"><span class="note-state"></span>
  387. <div class="note-body">
  388. <p>Check goal badge contrast under the dark scheme.</p>
  389. <p class="note-meta">yesterday &middot; done</p>
  390. </div>
  391. </li>
  392. <li class="note promoted"><span class="note-state"></span>
  393. <div class="note-body">
  394. <p>Ship the web-push test notification end to end.</p>
  395. <p class="note-meta">promoted to <a href="#">goal 24</a></p>
  396. </div>
  397. </li>
  398. </ul>
  399. </details>
  400. <details class="panel" open>
  401. <summary><h2>Latest discoveries</h2><span class="summary-meta">2</span></summary>
  402. <ul class="discoveries">
  403. <li>
  404. <p>json-glib writes invalid UTF-8 verbatim: a byte-count clamp that lands
  405. mid-character poisons the whole payload, and the stored row loses its
  406. members on read-back. Back the cut off over continuation bytes at every
  407. serialisation boundary.</p>
  408. <p class="note-meta">2 Oct &middot; Saddle</p>
  409. </li>
  410. <li>
  411. <p>A harness seeding a row the app also lazily creates must INSERT OR
  412. IGNORE &mdash; two read-then-insert writers race and the loser dies on
  413. UNIQUE, taking the whole sequential suite with it.</p>
  414. <p class="note-meta">1 Oct &middot; Clanker-Saddle</p>
  415. </li>
  416. </ul>
  417. <p class="more-row"><a href="#">All discoveries &rarr;</a></p>
  418. </details>
  419. <details class="panel">
  420. <summary><h2>Active tasks</h2><span class="summary-meta">6</span></summary>
  421. <table class="tasks">
  422. <thead>
  423. <tr><th>Task</th><th>Status</th><th>Branch</th><th>Latest</th></tr>
  424. </thead>
  425. <tbody>
  426. <tr>
  427. <td><a href="#">214 &middot; Mock dashboard: three visual directions as static
  428. HTML samplers</a></td>
  429. <td><span class="tag working">working</span></td>
  430. <td>web-stack</td>
  431. <td>writing mocks/dashboard-primer.html <span class="when">14:02</span></td>
  432. </tr>
  433. <tr>
  434. <td><a href="#">213 &middot; Split parked and failed runs on the goal branch
  435. view</a></td>
  436. <td><span class="tag queued">queued</span></td>
  437. <td>goal/branch-view</td>
  438. <td class="empty">&mdash;</td>
  439. </tr>
  440. <tr>
  441. <td><a href="#">198 &middot; Goal compare: diff two branches&rsquo; task
  442. trees</a></td>
  443. <td><span class="tag suspended">suspended</span></td>
  444. <td>goal/compare</td>
  445. <td>parked at turn cap 41/40 <span class="when">13:51</span></td>
  446. </tr>
  447. <tr>
  448. <td><a href="#">196 &middot; Notification digest: batch question and RFC
  449. pushes</a></td>
  450. <td><span class="tag blocked">blocked</span></td>
  451. <td>notify/digest</td>
  452. <td>asked: digest window 5 or 15 min <span class="when">12:37</span></td>
  453. </tr>
  454. <tr>
  455. <td><a href="#">189 &middot; Rate-limit the events endpoint</a></td>
  456. <td><span class="tag failed">failed</span></td>
  457. <td>api/rate-limit</td>
  458. <td>429 loop under parallel suites; needs backoff <span class="when">11:20</span></td>
  459. </tr>
  460. <tr>
  461. <td><a href="#">195 &middot; Advisor chat export to markdown</a></td>
  462. <td><span class="tag done">done</span></td>
  463. <td>advisor/export</td>
  464. <td>report accepted <span class="when">09:58</span></td>
  465. </tr>
  466. </tbody>
  467. </table>
  468. </details>
  469. <details class="panel">
  470. <summary><h2>Activity</h2><span class="summary-meta">7 events</span></summary>
  471. <ul class="activity">
  472. <li><p class="when">14:02</p>
  473. <p class="what"><span class="tag progress">progress</span> <a href="#">214</a>
  474. writing mocks/dashboard-primer.html</p></li>
  475. <li><p class="when">13:58</p>
  476. <p class="what"><span class="tag question">question</span> <a href="#">197</a>
  477. discovery list pagination &mdash; 50, 100, or one scroll?</p></li>
  478. <li><p class="when">13:50</p>
  479. <p class="what"><span class="tag review">review</span> <a href="#">211</a>
  480. report ready &mdash; ghost-working sweep</p></li>
  481. <li><p class="when">13:44</p>
  482. <p class="what"><span class="tag comment">comment</span> goal 31 &mdash;
  483. &ldquo;keep needs-a-human above queue health&rdquo;</p></li>
  484. <li><p class="when">13:31</p>
  485. <p class="what"><span class="tag progress">progress</span> <a href="#">196</a>
  486. digest skeleton, window still undecided</p></li>
  487. <li><p class="when">13:04</p>
  488. <p class="what"><span class="tag system">saddle</span> kestrel idle after
  489. task 197 parked</p></li>
  490. <li><p class="when">11:20</p>
  491. <p class="what"><span class="tag failed">failed</span> <a href="#">189</a>
  492. exit 1 &mdash; 429 loop under parallel suites</p></li>
  493. </ul>
  494. </details>
  495. </section>
  496. </main>
  497. <footer class="foot">
  498. <p>Control Room sampler &middot; static mock for the dashboard overhaul &middot; toggle your
  499. OS or devtools colour scheme to check the second variant</p>
  500. </footer>
  501. </body>
  502. </html>