--- title: Decisions --- ```js const API = "http://127.0.0.1:8000"; const POLL = 15_000; ``` ```js const decState = (async function*() { while (true) { let data = [], ok = false; try { const r = await fetch(`${API}/decisions/?limit=500`); ok = r.ok; data = ok ? await r.json() : []; } catch {} yield {data, ok, ts: new Date()}; await new Promise(res => setTimeout(res, POLL)); } })(); ``` ```js const data = decState.data ?? []; const _ok = decState.ok ?? false; const _ts = decState.ts; const pending = data.filter(d => d.decision_type === "pending"); const made = data.filter(d => d.decision_type === "made"); ``` # Decisions ```js display(html`
${_ok ? `Live · updated ${_ts?.toLocaleTimeString()}` : `Offline — run: make api`}
`); ``` ```js const tab = view(Inputs.select(["Pending", "Made"], {label: "View"})); ``` ```js const shown = tab === "Pending" ? pending : made; display(Inputs.table(shown.map(d => ({ Title: d.title, Status: d.status + (d.escalation_note ? " ⚠️" : ""), Decided_by: d.decided_by ?? "—", Deadline: d.deadline ? new Date(d.deadline).toLocaleDateString() : "—", Rationale: (d.rationale ?? "").slice(0, 80), Updated: new Date(d.updated_at).toLocaleDateString(), })), {rows: 30})); ``` ```js if (tab === "Pending" && pending.filter(d => d.escalation_note).length > 0) { display(html`
⚠️ Escalated decisions require human approval before any action is taken (constitution §4).
`); } ``` ## Resolution Velocity ```js import * as Plot from "npm:@observablehq/plot"; const resolved = made.filter(d => d.decided_at); const byMonth = Object.entries( resolved.reduce((acc, d) => { const m = d.decided_at.slice(0, 7); acc[m] = (acc[m] ?? 0) + 1; return acc; }, {}) ).map(([month, count]) => ({month, count})); display(byMonth.length === 0 ? html`

No resolved decisions yet.

` : Plot.plot({ title: "Decisions resolved per month", x: {label: "Month", tickRotate: -30}, y: {label: "Count", grid: true}, marks: [ Plot.barY(byMonth, {x: "month", y: "count", fill: "steelblue", tip: true}), Plot.ruleY([0]), ], marginBottom: 60, width: 700, }) ); ```