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({
{icon ?? }
-

{title}

+

{title}

{description ? ( -

{description}

+

{description}

) : null} {action ?
{action}
: null}
diff --git a/apps/web/components/os/error-state.tsx b/apps/web/components/os/error-state.tsx index b37ae15..fb6a9cc 100644 --- a/apps/web/components/os/error-state.tsx +++ b/apps/web/components/os/error-state.tsx @@ -34,7 +34,7 @@ export function ErrorState({

{permissionDenied ? "Permission denied" : title}

-

{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({

Pack handoffs

- + {rows.length} recorded
diff --git a/apps/web/components/page-header.tsx b/apps/web/components/page-header.tsx index 765972c..3112d29 100644 --- a/apps/web/components/page-header.tsx +++ b/apps/web/components/page-header.tsx @@ -23,7 +23,7 @@ export function PageHeader({ {title} {description && ( -

{description}

+

{description}

)} {actions && ( diff --git a/apps/web/components/settings-view.tsx b/apps/web/components/settings-view.tsx index 0576a1b..afa2613 100644 --- a/apps/web/components/settings-view.tsx +++ b/apps/web/components/settings-view.tsx @@ -122,7 +122,7 @@ export function SettingsView() {

Workspace

-

+

Identity, region, timezone, and status. Read-only: workspace identity is set at bootstrap and has no governed write API.

@@ -146,7 +146,7 @@ export function SettingsView() {

Organisation status

-

+

Active workspaces accept events and agent runs.

@@ -173,7 +173,7 @@ export function SettingsView() { className="rounded-md border border-border bg-card p-3 hover:border-[var(--color-accent)]" >

{section.label}

-

+

{section.detail}

@@ -181,7 +181,7 @@ export function SettingsView() {
-

+

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}

', + ); + + const empty = await readFile( + new URL("./os/empty-state.tsx", import.meta.url), + "utf8", + ); + expect(empty).toContain('max-w-md text-sm text-muted-foreground'); + + const error = await readFile( + new URL("./os/error-state.tsx", import.meta.url), + "utf8", + ); + expect(error).toContain('text-sm text-foreground/90'); + }); +}); diff --git a/apps/web/features/capabilities/capabilities-view.tsx b/apps/web/features/capabilities/capabilities-view.tsx index d055058..7de525e 100644 --- a/apps/web/features/capabilities/capabilities-view.tsx +++ b/apps/web/features/capabilities/capabilities-view.tsx @@ -203,7 +203,7 @@ export function CapabilitiesView() { )}
-

+

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() {

Operational risk radar

-

+

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() { )}
-