+ decisions
+
+ Non-trivial decisions recorded during the work — what was decided,
+ by whom, and why.
+
+
+ {decisionsQ.error ? (
+
+ {decisionsQ.error.detail}
+
+ ) : null}
+
+ {decisionsQ.isLoading ? (
+ loading…
+ ) : decisions.length === 0 ? (
+ (no decisions recorded yet)
+ ) : (
+
+ {decisions.map((d): ReactElement => (
+
+ {MAKER_LABEL[d.made_by]}
+
+ {d.text}
+ {d.rationale ? {d.rationale} : null}
+ {(d.project_id || d.task_id) ? (
+
+ {d.project_id ? (
+
+ project {shortId(d.project_id)}
+
+ ) : null}
+ {d.task_id ? (
+
+ task {shortId(d.task_id)}
+
+ ) : null}
+
+ ) : null}
+
+ {relativeFromHlc(d.created_hlc)}
+
+ ))}
+
+ )}
+
+ );
+}
diff --git a/src/claire/web/app/src/lib/api.ts b/src/claire/web/app/src/lib/api.ts
index e01feb2..d51aa29 100644
--- a/src/claire/web/app/src/lib/api.ts
+++ b/src/claire/web/app/src/lib/api.ts
@@ -17,6 +17,8 @@ import type {
ChatPostResponse,
ChatScope,
ConsideredWork,
+ Decision,
+ DecisionMaker,
FleetAgent,
FleetLoad,
OrgsResponse,
@@ -239,3 +241,37 @@ export async function autocomplete(
const r = await request<{ hits: AutocompleteHit[] }>("GET", "/api/v1/autocomplete", { params, signal });
return r.hits;
}
+
+// ---------------------------------------------------------------------------
+// Decisions log
+// ---------------------------------------------------------------------------
+
+export async function fetchDecisions(
+ filters: {
+ project?: string;
+ task?: string;
+ made_by?: DecisionMaker;
+ limit?: number;
+ } = {},
+ signal?: AbortSignal,
+): Promise