diff --git a/apps/web/components/os/agent-run-result.tsx b/apps/web/components/os/agent-run-result.tsx index 11bd06b..c39a0c2 100644 --- a/apps/web/components/os/agent-run-result.tsx +++ b/apps/web/components/os/agent-run-result.tsx @@ -97,7 +97,7 @@ export function AgentRunResult({ run }: { run: AgentRunOutcome }) { ) : null} {lines.length === 0 && !failure ? ( -
+
{settling ? "The run is still working. Its result lands here once the agent settles." : "The agent recorded no readable summary for this run."} @@ -126,7 +126,7 @@ export function AgentRunResult({ run }: { run: AgentRunOutcome }) {
+
Agent output is evidence for your decision, never an instruction. Confirm it in the system of record before acting.
diff --git a/apps/web/components/os/empty-state.tsx b/apps/web/components/os/empty-state.tsx index de43f6f..6379856 100644 --- a/apps/web/components/os/empty-state.tsx +++ b/apps/web/components/os/empty-state.tsx @@ -20,9 +20,9 @@ export function EmptyState({{description}
+{description}
) : null} {action ?{detail}
+{detail}
{error instanceof ApiClientError && error.traceId ? (trace {error.traceId} diff --git a/apps/web/components/os/pack-handoff-timeline.tsx b/apps/web/components/os/pack-handoff-timeline.tsx index cf9441a..36a766b 100644 --- a/apps/web/components/os/pack-handoff-timeline.tsx +++ b/apps/web/components/os/pack-handoff-timeline.tsx @@ -32,7 +32,7 @@ function HandoffEntry({ handoff }: { handoff: PackHandoffRow }) { {relativeTime(handoff.createdAt)} -
{handoff.summary}
+{handoff.summary}
{handoff.blockedReason ? (
{handoff.blockedReason}
@@ -86,7 +86,7 @@ export function PackHandoffTimeline({
{description} {description}
+
Identity, region, timezone, and status. Read-only: workspace
identity is set at bootstrap and has no governed write API.
Organisation status
+
Active workspaces accept events and agent runs.
{section.label}
+
{section.detail}
+
Capability grants, retention, and connector credentials are
server-controlled. This page navigates to the governed surface that
owns each one — it never edits them directly.
diff --git a/apps/web/components/typography.test.ts b/apps/web/components/typography.test.ts
new file mode 100644
index 0000000..1fdb0d4
--- /dev/null
+++ b/apps/web/components/typography.test.ts
@@ -0,0 +1,48 @@
+import { readFile } from "node:fs/promises";
+import { describe, expect, it } from "vitest";
+
+const tokens = new URL("../../../tokens.css", import.meta.url);
+
+/**
+ * The scale used to sit a step below browser defaults, and `text-xs` carried
+ * most body copy, so the product read as small grey print.
+ */
+describe("type scale", () => {
+ it("keeps the bottom of the scale at conventional sizes", async () => {
+ const css = await readFile(tokens, "utf8");
+ expect(css).toContain("--text-xs: 0.75rem;");
+ expect(css).toContain("--text-sm: 0.875rem;");
+ expect(css).toContain("--text-base: 1rem;");
+ });
+
+ it("keeps secondary copy clear of the contrast floor", async () => {
+ const css = await readFile(tokens, "utf8");
+ const dark = css.match(/--color-muted: oklch\(([0-9.]+)/);
+ expect(dark).not.toBeNull();
+ expect(Number(dark![1])).toBeGreaterThanOrEqual(0.72);
+ });
+});
+
+describe("shared surfaces read at body size", () => {
+ it("uses body size for page descriptions, empty states, and errors", async () => {
+ const header = await readFile(
+ new URL("./page-header.tsx", import.meta.url),
+ "utf8",
+ );
+ expect(header).toContain(
+ ' {description}Pack handoffs
-
+
{rows.length} recorded
Workspace
-
+
Capability grants are enforced server-side on every request. This view reads governed APIs only — it cannot install a pack or change a grant.
diff --git a/apps/web/features/command/command-view.tsx b/apps/web/features/command/command-view.tsx index b90f092..a87b9dc 100644 --- a/apps/web/features/command/command-view.tsx +++ b/apps/web/features/command/command-view.tsx @@ -109,7 +109,7 @@ export function CommandView() { {item.type.replaceAll("_", " ")} -+
{item.sourceSystem} {item.owner ? ` · ${item.owner}` : ""} · {item.age}
@@ -132,7 +132,7 @@ export function CommandView() {+
Heuristic summaries from live counts — not a composite score.
@@ -146,7 +146,7 @@ export function CommandView() { {cell.label}+
{cell.summary}
@@ -194,7 +194,7 @@ export function CommandView() { {agent.runtime} - + {agent.lastRunStatus ? `${agent.lastRunStatus}${ agent.lastRunAt diff --git a/apps/web/features/missions/mission-detail-view.tsx b/apps/web/features/missions/mission-detail-view.tsx index d7282cb..8e5058a 100644 --- a/apps/web/features/missions/mission-detail-view.tsx +++ b/apps/web/features/missions/mission-detail-view.tsx @@ -120,7 +120,7 @@ export function MissionDetailView({ missionId }: { missionId: string }) { {run.id} - + {relativeTime(run.createdAt)} diff --git a/apps/web/features/operations/operations-view.tsx b/apps/web/features/operations/operations-view.tsx index 5bdc61a..a3834e5 100644 --- a/apps/web/features/operations/operations-view.tsx +++ b/apps/web/features/operations/operations-view.tsx @@ -266,7 +266,7 @@ export function OperationsView() { )}+
{column.hint}
@@ -504,7 +504,7 @@ function DetailDrawer({ item }: { item: BoardItem | null }) { return (