--- title: Overview --- # Custodian State Hub ```js const summary = await FileAttachment("data/summary.json").json(); const totals = summary.totals ?? {}; const ws = totals.workstreams ?? {}; const tasks = totals.tasks ?? {}; const decisions = totals.decisions ?? {}; const topics = totals.topics ?? {}; ``` ```js if (summary.error) display(html`
⚠️ API unreachable: ${summary.error}. Run make api.
`); ``` ## Status ```js display(html`

Active Workstreams

${ws.active ?? 0}

${ws.blocked ?? 0} blocked

Blocking Decisions

${(decisions.open ?? 0) + (decisions.escalated ?? 0)}

${decisions.escalated ?? 0} escalated

Blocked Tasks

${tasks.blocked ?? 0}

of ${tasks.total ?? 0} total

Progress Events Today

${(summary.recent_progress ?? []).filter(e => e.created_at?.startsWith(new Date().toISOString().slice(0,10))).length}

last 20 shown below
`); ``` ## Tasks by Domain ```js import * as Plot from "npm:@observablehq/plot"; const tasksByDomain = []; for (const topic of (summary.topics ?? [])) { for (const ws of (topic.workstreams ?? [])) { // workstream stubs don't include tasks in summary — show per-topic WS count as proxy } tasksByDomain.push({ domain: topic.domain, status: topic.status, count: (topic.workstreams ?? []).length }); } display(Plot.plot({ title: "Open Workstreams by Domain", x: { label: "Domain" }, y: { label: "Count", grid: true }, marks: [ Plot.barY(tasksByDomain, { x: "domain", y: "count", fill: "domain", tip: true }), Plot.ruleY([0]), ], marginBottom: 80, width: 700, })); ``` ## Blocking Decisions ```js const blocking = summary.blocking_decisions ?? []; if (blocking.length === 0) { display(html`

✓ No blocking decisions.

`); } else { display(Inputs.table(blocking.map(d => ({ Title: d.title, Status: d.status, Deadline: d.deadline ? new Date(d.deadline).toLocaleDateString() : "—", Escalated: d.escalation_note ? "⚠️" : "", })))); } ``` ## Decisions Due Within 7 Days ```js const now = new Date(); const in7 = new Date(now.getTime() + 7*24*60*60*1000); const due = (summary.blocking_decisions ?? []).filter(d => d.deadline && new Date(d.deadline) <= in7); if (due.length === 0) { display(html`

No decisions due in next 7 days.

`); } else { display(Inputs.table(due.map(d => ({ Title: d.title, Deadline: new Date(d.deadline).toLocaleString(), Status: d.status, })))); } ``` ## Recent Activity ```js display(Inputs.table((summary.recent_progress ?? []).map(e => ({ Time: new Date(e.created_at).toLocaleString(), Type: e.event_type, Author: e.author ?? "—", Summary: e.summary, })), { maxWidth: 900 })); ```