toolroll 0.9.52 → 0.9.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +55 -80
  3. package/dist/agentconfig.d.ts +11 -36
  4. package/dist/agentconfig.js +3 -62
  5. package/dist/approval-policy.d.ts +1 -1
  6. package/dist/approval-policy.js +1 -1
  7. package/dist/board.d.ts +3 -19
  8. package/dist/board.js +4 -42
  9. package/dist/browser/workspace.js +18 -18
  10. package/dist/browser-workspace.d.ts +2 -1
  11. package/dist/builder.d.ts +9 -40
  12. package/dist/builder.js +50 -257
  13. package/dist/chat-actions.js +3 -14
  14. package/dist/chat-controls.d.ts +0 -4
  15. package/dist/chat-controls.js +0 -1
  16. package/dist/chat-decide.js +1 -3
  17. package/dist/chat-delivery.d.ts +0 -2
  18. package/dist/chat-delivery.js +0 -1
  19. package/dist/chat-quiet.js +2 -2
  20. package/dist/chat-task-actions.d.ts +1 -1
  21. package/dist/chat-task-actions.js +0 -2
  22. package/dist/claim.d.ts +79 -244
  23. package/dist/claim.js +688 -1023
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +10 -2
  26. package/dist/contracts/cli.d.ts +0 -13
  27. package/dist/contracts/cli.js +0 -2
  28. package/dist/contracts/console-api.d.ts +5 -10
  29. package/dist/contracts/console-api.js +4 -10
  30. package/dist/contracts/flow.d.ts +50 -0
  31. package/dist/contracts/flow.js +26 -1
  32. package/dist/contracts/lead-tools.d.ts +0 -13
  33. package/dist/contracts/lead-tools.js +3 -3
  34. package/dist/contracts/store-json.d.ts +1 -25
  35. package/dist/contracts/store-json.js +3 -13
  36. package/dist/converse.d.ts +1 -11
  37. package/dist/converse.js +6 -38
  38. package/dist/coordinator.d.ts +0 -1
  39. package/dist/coordinator.js +3 -5
  40. package/dist/demo.js +16 -26
  41. package/dist/desktop-update-gate.js +0 -1
  42. package/dist/desktop-update.js +1 -3
  43. package/dist/dispatch.d.ts +1 -1
  44. package/dist/dispatch.js +1 -1
  45. package/dist/dispose.d.ts +2 -3
  46. package/dist/dispose.js +17 -92
  47. package/dist/envelope.js +0 -3
  48. package/dist/exec.d.ts +0 -64
  49. package/dist/exec.js +3 -356
  50. package/dist/exhaustion.d.ts +22 -76
  51. package/dist/exhaustion.js +14 -140
  52. package/dist/export.js +4 -4
  53. package/dist/flow-engine.js +1 -1
  54. package/dist/flow-schedule.d.ts +154 -0
  55. package/dist/flow-schedule.js +321 -0
  56. package/dist/flow-share.js +1 -1
  57. package/dist/flow-triggers.d.ts +6 -1
  58. package/dist/flow-triggers.js +65 -10
  59. package/dist/flows-cli.js +8 -4
  60. package/dist/flows-ui.js +2 -0
  61. package/dist/flows.js +1 -1
  62. package/dist/guides.js +9 -29
  63. package/dist/invoke.d.ts +1 -24
  64. package/dist/invoke.js +17 -259
  65. package/dist/lead-status.js +2 -4
  66. package/dist/lead-voice.js +1 -1
  67. package/dist/mate-doors.d.ts +1 -2
  68. package/dist/mate-doors.js +12 -25
  69. package/dist/mate-tools.d.ts +2 -2
  70. package/dist/mate-tools.js +10 -22
  71. package/dist/modes.d.ts +6 -7
  72. package/dist/modes.js +7 -13
  73. package/dist/operate-remote-arguments.js +2 -6
  74. package/dist/operate-remote.js +6 -7
  75. package/dist/operate.d.ts +0 -6
  76. package/dist/operate.js +222 -2247
  77. package/dist/phase-routing.d.ts +13 -23
  78. package/dist/phase-routing.js +13 -35
  79. package/dist/plan-auto.js +2 -2
  80. package/dist/planner-source.js +2 -1
  81. package/dist/policy.d.ts +1 -4
  82. package/dist/policy.js +0 -8
  83. package/dist/process-recovery-eligibility.js +2 -3
  84. package/dist/project-delete.js +3 -15
  85. package/dist/proposal.d.ts +4 -24
  86. package/dist/proposal.js +3 -88
  87. package/dist/provider-auth.d.ts +3 -3
  88. package/dist/provider-auth.js +4 -6
  89. package/dist/provider.d.ts +11 -25
  90. package/dist/provider.js +4 -36
  91. package/dist/push.js +1 -1
  92. package/dist/recipe-ui.js +6 -6
  93. package/dist/recipes.d.ts +3 -3
  94. package/dist/recipes.js +27 -23
  95. package/dist/run-closeout.d.ts +1 -1
  96. package/dist/run-closeout.js +1 -4
  97. package/dist/scope.d.ts +11 -65
  98. package/dist/scope.js +17 -82
  99. package/dist/serve.js +15 -24
  100. package/dist/server/chat.js +7 -30
  101. package/dist/server/flows.js +11 -10
  102. package/dist/server/guards.js +0 -1
  103. package/dist/server/pages-assets.js +1 -1
  104. package/dist/server/pages.js +0 -2
  105. package/dist/server/people-tokens.js +0 -4
  106. package/dist/server/route-table.d.ts +1 -1
  107. package/dist/server/route-table.js +2 -17
  108. package/dist/server/settings.js +1 -8
  109. package/dist/server/shared.d.ts +28 -212
  110. package/dist/server/shared.js +71 -780
  111. package/dist/server/task-views.js +9 -76
  112. package/dist/server/tasks.d.ts +1 -50
  113. package/dist/server/tasks.js +36 -946
  114. package/dist/setup-guide.d.ts +2 -2
  115. package/dist/slack-chat.d.ts +0 -2
  116. package/dist/slack-chat.js +0 -1
  117. package/dist/store.d.ts +105 -1340
  118. package/dist/store.js +706 -4010
  119. package/dist/surface.js +10 -24
  120. package/dist/task-composer.d.ts +1 -1
  121. package/dist/task-composer.js +1 -1
  122. package/dist/task-control.d.ts +3 -10
  123. package/dist/task-control.js +2 -7
  124. package/dist/teammate-desk.js +1 -1
  125. package/dist/teammates-ui.js +1 -1
  126. package/dist/telegram-mate.d.ts +0 -3
  127. package/dist/telegram-mate.js +0 -1
  128. package/dist/templates.d.ts +11 -7
  129. package/dist/templates.js +12 -9
  130. package/dist/toolroll-update.d.ts +10 -0
  131. package/dist/toolroll-update.js +56 -4
  132. package/dist/work-index.js +2 -6
  133. package/dist/workspace-ui.js +1 -1
  134. package/package.json +1 -1
  135. package/scripts/recovery-canary.mjs +3 -3
  136. package/dist/contest.d.ts +0 -318
  137. package/dist/contest.js +0 -753
  138. package/dist/held.d.ts +0 -150
  139. package/dist/held.js +0 -799
  140. package/dist/liveness.d.ts +0 -30
  141. package/dist/liveness.js +0 -42
  142. package/dist/pricing.d.ts +0 -45
  143. package/dist/pricing.js +0 -77
  144. package/dist/routine.d.ts +0 -228
  145. package/dist/routine.js +0 -764
  146. package/dist/supervisor.mjs +0 -297
@@ -10,7 +10,6 @@ import { type BrowserActionCard, type BrowserCheckItem, type BrowserLimits, type
10
10
  import { type CheckLevel } from '../check-levels.js';
11
11
  import { type CliHttpOptions, type RunOperateAs } from '../cli-http.js';
12
12
  import { CodingWorkspace } from '../coding-workspace.js';
13
- import type { AgentView } from "../contest.js";
14
13
  import { type FormView } from "../contracts/console-api.js";
15
14
  import { type ChatDraft } from "../converse.js";
16
15
  import { type DispatchDiagnosis } from "../dispatch.js";
@@ -30,7 +29,7 @@ import { type FailureExplanation } from '../needs-you.js';
30
29
  import { cloneGithubRepo, listGithubRepos, previewGithubRepo, type ListOutcome } from "../onboard.js";
31
30
  import { type Principal } from "../operate-remote.js";
32
31
  import { parseBaseTreeSnapshot } from "../peek.js";
33
- import { type RiskLevel, type RouteOverride, type RouteProjection, type RouteStamp } from "../phase-routing.js";
32
+ import { type RouteOverride, type RouteProjection, type RouteStamp } from "../phase-routing.js";
34
33
  import { type MilestoneState } from "../plan.js";
35
34
  import { type ContractChange } from "../planner-source.js";
36
35
  import { type CriterionMatrixRow, type ProofVerdict } from "../proof.js";
@@ -46,8 +45,8 @@ import { type BuildReviewView } from "../review-switch.js";
46
45
  import type { Runner } from "../runner.js";
47
46
  import { approvalOf, type AcceptanceCriterion, type Scope, type UnattendedPermissionMode } from "../scope.js";
48
47
  import { type ReportItem } from "../scout-report.js";
49
- import type { ChatConfig, ChatProviderId, ChatSnapshot, ChatTurn, Contest, CoordinatorProposal, DirectChatProviderId, MateMessage, MateProposal, MateSession, MateTurn, PlanRevisionKind, PlanRevisionStatus, PublicationGrant, PushSubscription, RepairChainRow, ReviewRetryState, RevisionLineage, Routine, SteerNote, SubscriptionChatProviderId, TaskFamily, TournamentTerms } from "../store.js";
50
- import { type Artifact, type Capability, type CheckProgress, type Decision, type DiffComment, type ExternalMirror, type Hold, type Incident, type MateAsk, type Publication, type ResultScreenshots, type Run, type SessionTurn, type Store, type Task, type TaskState, type WorktreeRow } from "../store.js";
48
+ import type { ChatConfig, ChatProviderId, ChatSnapshot, ChatTurn, CoordinatorProposal, DirectChatProviderId, MateMessage, MateProposal, MateSession, MateTurn, PlanRevisionKind, PlanRevisionStatus, PublicationGrant, PushSubscription, RepairChainRow, ReviewRetryState, RevisionLineage, SteerNote, SubscriptionChatProviderId, TaskFamily } from "../store.js";
49
+ import { type Artifact, type Capability, type CheckProgress, type Decision, type DiffComment, type ExternalMirror, type Hold, type Incident, type MateAsk, type Publication, type ResultScreenshots, type Run, type Store, type Task, type TaskState, type WorktreeRow } from "../store.js";
51
50
  import type { SubscriptionMateRunner } from "../subscription-chat.js";
52
51
  import { tally } from "../summary.js";
53
52
  import { type TaskControlView } from "../task-control.js";
@@ -219,16 +218,6 @@ export type ServeOptions = {
219
218
  * this device. "vscode" is the only value; the scheme is never data.
220
219
  */
221
220
  editorLinks?: "vscode";
222
- /**
223
- * The attended-mint capability (Phase 2E): present only on a co-located
224
- * `up` console, which alone can hold a session. `headOf` reads the
225
- * repository's CURRENT head — the exact commit the signed terms pin.
226
- */
227
- attended?: {
228
- runner: string;
229
- headOf: (repo: string) => Promise<string | null>;
230
- coordinator?: import("../held.js").HeldSessionCoordinator;
231
- };
232
221
  /** Injected by tests: the onboarding ceremony's gh-facing halves — the
233
222
  * ceremony's gating, nonce, and enrollment logic is what the HTTP tests
234
223
  * prove; gh itself is proved by onboard.test.ts. */
@@ -578,7 +567,6 @@ export declare function approvalSheetHtml(input: {
578
567
  revisionSourceHref: string;
579
568
  /** A machine-drafted repair: the build it repairs. */
580
569
  repairChain: RepairChainRow | null;
581
- raceTerms: TournamentTerms | null;
582
570
  route: RouteView | null | undefined;
583
571
  coordinator: {
584
572
  label: string;
@@ -643,7 +631,7 @@ export declare function consentDoorOf(scope: Scope | null, route: RouteView | nu
643
631
  export declare function consentClosedHtml(taskId: string, door: ConsentDoor & {
644
632
  open: false;
645
633
  }, surface: "task" | "chat" | "next"): string;
646
- export declare function profileWords(scope: Pick<Scope, "profile" | "profileState" | "unresolvedReason" | "digestVersion" | "proposedChainJson">): string;
634
+ export declare function profileWords(scope: Pick<Scope, "profile" | "profileState" | "unresolvedReason" | "digestVersion">): string;
647
635
  /** The Agents view every console surface renders (v47): the SAME
648
636
  * projection the CLI prints — who plans, builds, and revises,
649
637
  * whether each was recommended, overridden, or pinned, its reasons, and
@@ -664,9 +652,8 @@ export type RouteView = {
664
652
  } | null;
665
653
  /** A routed row whose agents cannot be read — fail closed, in words. */
666
654
  problem: string | null;
667
- riskLevel: RiskLevel;
668
655
  overrides: RouteOverride[];
669
- /** An approver may edit: a live claim, a tournament, or a viewer session refuses. */
656
+ /** An approver may edit: a live claim or a viewer session refuses. */
670
657
  editable: boolean;
671
658
  editableWhy: string | null;
672
659
  /** A planner change after a draft landed asks for a real re-plan. */
@@ -687,8 +674,10 @@ export declare function sizeLineHtml(projection: RouteProjection): string;
687
674
  export declare function sizeConsequence(size: string, risky: boolean): string;
688
675
  /** The one plain-English line: who does what. */
689
676
  export declare function agentsSummaryWords(view: RouteView): string;
690
- export declare function agentsRiskWords(projection: RouteProjection): string;
691
- /** Neutral metadata badges: risk, posture, and standing. */
677
+ /** A risk badge only when there is something to say: a risky change, or an
678
+ * older route sealed at elevated or high risk. */
679
+ export declare function riskBadgeHtml(projection: RouteProjection): string;
680
+ /** Neutral metadata badges: risk (when not routine), posture, and standing. */
692
681
  export declare function agentsBadgesHtml(view: RouteView): string;
693
682
  /** Volatile availability, per provider on the route — shown beside the
694
683
  * agents, never inside the approval's terms. */
@@ -698,17 +687,12 @@ export declare function agentsWhyHtml(projection: RouteProjection, summaryLabel?
698
687
  /** The ceremony's agents block: what the yes agrees to — the agents and
699
688
  * their reasons. Availability is volatile and deliberately absent here. */
700
689
  export declare function agentsCeremonyHtml(view: RouteView | null | undefined): string;
701
- /** A standing order's agents (v48): the four-role route its approval
702
- * froze (or will freeze), in the same concise block a task's ceremony
703
- * shows — a firing can never be re-routed by a later configuration
704
- * change, and the page says so. */
705
- export declare function routineAgentsHtml(routine: Routine, approved: boolean, ceremony?: boolean): string;
706
690
  /** The runtime limits the sealed profile binds — permissions, turn and
707
- * time bounds, repairs, the fallback chain — restated on the ceremony as
691
+ * time bounds, repairs — restated on the ceremony as
708
692
  * a CLOSED disclosure (v48): a term the yes covers, one tap away, never a
709
693
  * wall of switches between the reader and the password. An unresolved
710
694
  * profile still speaks in the open: that is a refusal, not a detail. */
711
- export declare function runtimeDetailsHtml(scope: Pick<Scope, "profile" | "profileState" | "unresolvedReason" | "digestVersion" | "proposedChainJson">): string;
695
+ export declare function runtimeDetailsHtml(scope: Pick<Scope, "profile" | "profileState" | "unresolvedReason" | "digestVersion">): string;
712
696
  /** The task page's Agents card: the summary, availability, closed reasons,
713
697
  * and — for an approver — closed change controls. Every change re-files
714
698
  * the scope; an approval given under the earlier agents needs renewing. */
@@ -741,7 +725,7 @@ export declare const THEME_LIGHT = "\n --so-ground: #efefef; --so-paper: #fff
741
725
  export declare const THEME_DARK = "\n --so-ground: #0b0b0b; --so-paper: #161616; --so-sidebar: #0b0b0b; --so-raised: #1c1c1c;\n --so-ink: #ededed; --so-muted: #a1a1a1; --so-line: #262626; --so-input-line: #363636;\n --so-accent: #ededed; --so-accent-hover: #ffffff; --so-accent-text: #ededed; --so-on-accent: #0a0a0a; --so-soft: #1f1f1f;\n --so-nav-ink: #a1a1a1; --so-nav-hover: #171717; --so-nav-current: #1f1f1f; --so-nav-current-ink: #ededed;\n --so-signal: #ededed; --so-signal-hover: #ffffff; --so-on-signal: #0a0a0a; --so-signal-soft: #2e2e2e;\n --so-danger: #ff977d; --so-danger-soft: rgb(255 151 125 / .12); --so-success: #3dd68c; --so-success-soft: rgb(61 214 140 / .12);\n --so-warning: #ffca16; --so-warning-soft: rgb(255 202 22 / .12); --so-info: #70b8ff; --so-info-soft: rgb(112 184 255 / .12);\n --so-neutral-ink: #b4b4b4; --so-neutral-soft: #1f1f1f; --so-live: #70b8ff;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px #262626, 0 1px 2px rgb(0 0 0 / .4);\n --so-pill-shadow: 0 0 0 1px #2a2a2a, 0 1px 2px rgb(0 0 0 / .5);\n --so-overlay: rgb(0 0 0 / .6); --so-shadow-overlay: 0 0 0 1px #2e2e2e, 0 24px 48px -12px rgb(0 0 0 / .7);\n --so-selection: #3a3a3a; --so-scroll: #333333; --so-code-bg: #111111; --so-user-bubble: #202020;";
742
726
  /** The console's original token names, now views onto the palette. */
743
727
  export declare const THEME_MAPPING = "\n --background: var(--so-ground); --foreground: var(--so-ink); --card: var(--so-paper);\n --muted: var(--so-raised); --muted-foreground: var(--so-muted); --border: var(--so-line); --input: var(--so-input-line);\n --primary: var(--so-accent); --primary-foreground: var(--so-on-accent); --secondary: var(--so-raised); --secondary-foreground: var(--so-ink);\n --accent: var(--so-soft); --destructive: var(--so-danger); --destructive-strong: var(--so-danger); --destructive-soft: var(--so-danger-soft);\n --success: var(--so-success); --success-soft: var(--so-success-soft); --warning: var(--so-warning); --warning-soft: var(--so-warning-soft);\n --running: var(--so-info); --running-soft: var(--so-info-soft); --ring: var(--so-signal);\n /* Magenta means one thing: a person is needed (approve, answer, decide). */\n --brand: var(--so-attention); --brand-foreground: var(--so-on-attention); --brand-soft: var(--so-attention-soft);\n --glass: var(--so-paper); --glass-strong: var(--so-paper); --glass-border: var(--so-line); --glass-highlight: transparent;\n --ambient-one: transparent; --ambient-two: transparent; --user-message: var(--so-user-bubble);\n --surface: var(--so-paper); --ok: var(--so-success); --danger: var(--so-danger); --fg-muted: var(--so-muted);\n --shadow: none; --shadow-overlay: var(--so-shadow-overlay);";
744
- export declare const STYLE = "\n/* The Console \u2014 the design system, v4 \"Signal\" (2026-09-27). A neutral\n frame with paper sheets inset into it (Arc, Linear), compact Raycast\n density, Geist for words and Geist Mono for machine facts. Ink is every\n act a person can take; the accent (ink by default) means \"waits on you\" and nothing\n else; blue means live. Flat surfaces: hairlines and one soft sheet\n shadow, no glass. Zero dependencies, zero page JS beyond the nonce'd\n chrome layer. */\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 400;\n font-display: swap; src: url(\"/fonts/geist-sans-400.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 500;\n font-display: swap; src: url(\"/fonts/geist-sans-500.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 600;\n font-display: swap; src: url(\"/fonts/geist-sans-600.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 400;\n font-display: swap; src: url(\"/fonts/geist-mono-400.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 500;\n font-display: swap; src: url(\"/fonts/geist-mono-500.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 600;\n font-display: swap; src: url(\"/fonts/geist-mono-600.woff2\") format(\"woff2\");\n }\n /* One palette for every page (2026-09-27): neutral grey and paper with\n * one chart magenta, light by day and dark after hours. The device decides unless\n * the person pins a theme (html[data-theme], set from their cookie). The\n * console's older token names map onto it, so the React workspace, the\n * server-rendered pages and the pre-script fallback all paint the same. */\n :root {\n color-scheme: light;\n\n --so-ground: #efefef; --so-paper: #ffffff; --so-sidebar: #efefef; --so-raised: #f5f5f5;\n --so-ink: #171717; --so-muted: #666666; --so-line: #e6e6e6; --so-input-line: #d4d4d4;\n --so-accent: #171717; --so-accent-hover: #383838; --so-accent-text: #171717; --so-on-accent: #ffffff; --so-soft: #f2f2f2;\n --so-nav-ink: #525252; --so-nav-hover: #e4e4e4; --so-nav-current: #ffffff; --so-nav-current-ink: #171717;\n --so-signal: #171717; --so-signal-hover: #383838; --so-on-signal: #ffffff; --so-signal-soft: #e8e8e8;\n --so-danger: #c4320a; --so-danger-soft: #feebe7; --so-success: #218358; --so-success-soft: #e6f6eb;\n --so-warning: #ab6400; --so-warning-soft: #fff4d5; --so-info: #0d74ce; --so-info-soft: #e6f4fe;\n --so-neutral-ink: #525252; --so-neutral-soft: #f0f0f0; --so-live: #0d74ce;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px rgb(0 0 0 / .06), 0 1px 2px rgb(0 0 0 / .04), 0 4px 12px -6px rgb(0 0 0 / .06);\n --so-pill-shadow: 0 0 0 1px rgb(0 0 0 / .06), 0 1px 2px rgb(0 0 0 / .06);\n --so-overlay: rgb(0 0 0 / .32); --so-shadow-overlay: 0 0 0 1px rgb(0 0 0 / .08), 0 24px 48px -12px rgb(0 0 0 / .22);\n --so-selection: #d4d4d4; --so-scroll: #cfcfcf; --so-code-bg: #fafafa; --so-user-bubble: #f2f2f2;\n\n --background: var(--so-ground); --foreground: var(--so-ink); --card: var(--so-paper);\n --muted: var(--so-raised); --muted-foreground: var(--so-muted); --border: var(--so-line); --input: var(--so-input-line);\n --primary: var(--so-accent); --primary-foreground: var(--so-on-accent); --secondary: var(--so-raised); --secondary-foreground: var(--so-ink);\n --accent: var(--so-soft); --destructive: var(--so-danger); --destructive-strong: var(--so-danger); --destructive-soft: var(--so-danger-soft);\n --success: var(--so-success); --success-soft: var(--so-success-soft); --warning: var(--so-warning); --warning-soft: var(--so-warning-soft);\n --running: var(--so-info); --running-soft: var(--so-info-soft); --ring: var(--so-signal);\n /* Magenta means one thing: a person is needed (approve, answer, decide). */\n --brand: var(--so-attention); --brand-foreground: var(--so-on-attention); --brand-soft: var(--so-attention-soft);\n --glass: var(--so-paper); --glass-strong: var(--so-paper); --glass-border: var(--so-line); --glass-highlight: transparent;\n --ambient-one: transparent; --ambient-two: transparent; --user-message: var(--so-user-bubble);\n --surface: var(--so-paper); --ok: var(--so-success); --danger: var(--so-danger); --fg-muted: var(--so-muted);\n --shadow: none; --shadow-overlay: var(--so-shadow-overlay);\n --radius: 0.625rem;\n --so-ease-out: cubic-bezier(.23, 1, .32, 1);\n --font-sans: \"Geist\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n --font-mono: \"Geist Mono\", ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;\n /* Phone spacing steps (760px and narrower): side gutter, gap under the\n header, gap between page blocks, between rows, and inside a card. */\n --so-phone-gutter: 16px; --so-phone-gap: 12px; --so-phone-block: 14px; --so-phone-row: 8px; --so-phone-card: 12px;\n }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n color-scheme: dark;\n\n --so-ground: #0b0b0b; --so-paper: #161616; --so-sidebar: #0b0b0b; --so-raised: #1c1c1c;\n --so-ink: #ededed; --so-muted: #a1a1a1; --so-line: #262626; --so-input-line: #363636;\n --so-accent: #ededed; --so-accent-hover: #ffffff; --so-accent-text: #ededed; --so-on-accent: #0a0a0a; --so-soft: #1f1f1f;\n --so-nav-ink: #a1a1a1; --so-nav-hover: #171717; --so-nav-current: #1f1f1f; --so-nav-current-ink: #ededed;\n --so-signal: #ededed; --so-signal-hover: #ffffff; --so-on-signal: #0a0a0a; --so-signal-soft: #2e2e2e;\n --so-danger: #ff977d; --so-danger-soft: rgb(255 151 125 / .12); --so-success: #3dd68c; --so-success-soft: rgb(61 214 140 / .12);\n --so-warning: #ffca16; --so-warning-soft: rgb(255 202 22 / .12); --so-info: #70b8ff; --so-info-soft: rgb(112 184 255 / .12);\n --so-neutral-ink: #b4b4b4; --so-neutral-soft: #1f1f1f; --so-live: #70b8ff;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px #262626, 0 1px 2px rgb(0 0 0 / .4);\n --so-pill-shadow: 0 0 0 1px #2a2a2a, 0 1px 2px rgb(0 0 0 / .5);\n --so-overlay: rgb(0 0 0 / .6); --so-shadow-overlay: 0 0 0 1px #2e2e2e, 0 24px 48px -12px rgb(0 0 0 / .7);\n --so-selection: #3a3a3a; --so-scroll: #333333; --so-code-bg: #111111; --so-user-bubble: #202020;\n }\n }\n :root[data-theme=\"dark\"] {\n color-scheme: dark;\n\n --so-ground: #0b0b0b; --so-paper: #161616; --so-sidebar: #0b0b0b; --so-raised: #1c1c1c;\n --so-ink: #ededed; --so-muted: #a1a1a1; --so-line: #262626; --so-input-line: #363636;\n --so-accent: #ededed; --so-accent-hover: #ffffff; --so-accent-text: #ededed; --so-on-accent: #0a0a0a; --so-soft: #1f1f1f;\n --so-nav-ink: #a1a1a1; --so-nav-hover: #171717; --so-nav-current: #1f1f1f; --so-nav-current-ink: #ededed;\n --so-signal: #ededed; --so-signal-hover: #ffffff; --so-on-signal: #0a0a0a; --so-signal-soft: #2e2e2e;\n --so-danger: #ff977d; --so-danger-soft: rgb(255 151 125 / .12); --so-success: #3dd68c; --so-success-soft: rgb(61 214 140 / .12);\n --so-warning: #ffca16; --so-warning-soft: rgb(255 202 22 / .12); --so-info: #70b8ff; --so-info-soft: rgb(112 184 255 / .12);\n --so-neutral-ink: #b4b4b4; --so-neutral-soft: #1f1f1f; --so-live: #70b8ff;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px #262626, 0 1px 2px rgb(0 0 0 / .4);\n --so-pill-shadow: 0 0 0 1px #2a2a2a, 0 1px 2px rgb(0 0 0 / .5);\n --so-overlay: rgb(0 0 0 / .6); --so-shadow-overlay: 0 0 0 1px #2e2e2e, 0 24px 48px -12px rgb(0 0 0 / .7);\n --so-selection: #3a3a3a; --so-scroll: #333333; --so-code-bg: #111111; --so-user-bubble: #202020;\n }\n * { box-sizing: border-box; }\n /* Touch: no grey flash on a tap, no double-tap zoom wait on a control,\n and a long press never selects a control's label. Text stays selectable. */\n html { -webkit-tap-highlight-color: transparent; }\n a, button, summary, [role=button], [role=tab] { touch-action: manipulation; }\n button, [role=button], [role=tab], .task-context-chip, .approval-chip, .verdict-chip { -webkit-user-select: none; user-select: none; }\n ::selection { background: var(--so-selection); color: var(--so-ink); }\n ::placeholder { color: var(--muted-foreground); }\n body {\n margin: 0; color: var(--foreground);\n background: var(--background);\n caret-color: var(--so-signal);\n font: 400 0.875rem/1.5 var(--font-sans); font-feature-settings: \"ss01\" 0;\n -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;\n }\n :focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }\n\n /* Scrollbars belong to the theme, not the platform default. */\n * { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }\n\n .topbar {\n position: sticky; top: 0; z-index: 10;\n border-bottom: 1px solid var(--border); background: var(--background);\n }\n .topbar-inner {\n max-width: 44rem; margin-inline: auto; padding: 0 1.25rem; height: 3.25rem;\n display: flex; align-items: center; gap: 1.25rem;\n }\n .brand { font-weight: 600; letter-spacing: -0.01em; color: var(--foreground); text-decoration: none;\n display: flex; align-items: center; height: 100%; }\n .brand .dot { color: var(--muted-foreground); }\n .topbar nav { display: flex; gap: .25rem; margin-left: auto; height: 100%; }\n .topbar nav a {\n color: var(--muted-foreground); text-decoration: none; font-size: 0.8125rem; font-weight: 500;\n display: flex; align-items: center; padding: 0 .625rem; transition: color .15s;\n }\n @media (hover: hover) and (pointer: fine) { .topbar nav a:hover { color: var(--foreground); } }\n main { max-width: 44rem; margin-inline: auto; padding: 1.75rem 1.25rem 4rem; }\n h1 { font-size: 1.25rem; font-weight: 600; letter-spacing: -0.02em; margin: 0 0 .25rem; line-height: 1.3; }\n h1 .meta { font-weight: 400; letter-spacing: 0; }\n /* Section headers speak in the human voice (mono is for machine facts\n only): small, semibold, dim \u2014 Linear's \"In Progress 5\" register. */\n h2 {\n font-size: 0.8125rem; font-weight: 600; letter-spacing: -0.005em;\n color: var(--muted-foreground); margin: 2rem 0 .5rem; font-family: var(--font-sans);\n }\n a { color: var(--foreground); text-decoration: underline; text-decoration-color: var(--border); text-underline-offset: 3px; }\n @media (hover: hover) and (pointer: fine) { a:hover { text-decoration-color: var(--muted-foreground); } }\n p { margin: .4rem 0; }\n code { background: var(--muted); border-radius: .3rem; padding: .1rem .35rem; font-family: var(--font-mono); font-size: .8125rem; }\n .mono { font-family: var(--font-mono); font-size: .8125rem; font-variant-numeric: tabular-nums; letter-spacing: -.01em; }\n\n .meta { font-size: 0.8125rem; color: var(--muted-foreground); }\n .meta a { color: var(--muted-foreground); }\n .hint { font-size: 0.75rem; color: var(--muted-foreground); margin: -.375rem 0 .625rem; }\n .eyebrow {\n display: block; color: var(--muted-foreground); font-size: .625rem;\n font-weight: 500; letter-spacing: .08em; line-height: 1.3; text-transform: uppercase;\n font-family: var(--font-mono);\n }\n .num { font-variant-numeric: tabular-nums; }\n\n /* Utility classes replacing the old inline style= attributes. */\n .tight { margin-top: 0; }\n .card > h2:first-child, .card > h3:first-child { margin-top: 0; }\n .w-xs { width: 4.5rem; } .w-sm { width: 8rem; } .w-md { width: 12rem; } .w-lg { width: 14rem; }\n .field-cap { width: 100%; max-width: 28rem; }\n .field-cap-sm { width: 100%; max-width: 22rem; }\n .field-cap-lg { width: 100%; max-width: 34rem; }\n .prewrap { white-space: pre-wrap; }\n .wrap-any { overflow-wrap: anywhere; }\n .grab { cursor: grab; user-select: none; }\n\n .palette {\n position: fixed; top: 18vh; left: 50%; transform: translateX(-50%); width: min(32rem, 90vw);\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay);\n padding: .625rem; z-index: 50;\n }\n .palette input { width: 100%; margin: 0; }\n .palette ul { list-style: none; margin: .5rem 0 0; padding: 0; max-height: 40vh; overflow-y: auto; }\n .palette li { padding: .4375rem .625rem; border-radius: calc(var(--radius) - 4px); cursor: pointer; font-size: .875rem; }\n .palette li[aria-selected=\"true\"] { background: var(--muted); }\n\n /* The ledger: the window's harvest as strong figures in a sentence. */\n .ledger { font-size: 0.9375rem; color: var(--muted-foreground); margin: .875rem 0 0; line-height: 1.9; }\n .ledger b { font-weight: 600; font-size: 1.25rem; color: var(--foreground); font-variant-numeric: tabular-nums; padding-right: .1rem; font-family: var(--font-mono); }\n .ledger .good b { color: var(--success); }\n .ledger .bad b { color: var(--destructive); }\n\n /* Status labels are quiet metadata, not decoration. Their words carry\n the meaning; the restrained tint only speeds scanning. Count badges\n remain round so a number cannot be confused with a state. */\n .badge {\n display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border); border-radius: .375rem;\n padding: .0625rem .4rem; font-size: 0.6875rem; font-weight: 500; line-height: 1.45;\n background: color-mix(in srgb, var(--card) 58%, transparent); color: var(--muted-foreground); vertical-align: middle;\n font-family: var(--font-sans); font-variant-numeric: tabular-nums; white-space: nowrap;\n }\n .badge-done, .badge-answered, .badge-verified, .badge-built {\n background: color-mix(in srgb, var(--muted) 58%, var(--card)); color: var(--foreground);\n border-color: var(--border);\n }\n .badge-failed {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--destructive) 68%, var(--foreground)); border-color: var(--border);\n }\n .badge-note {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: var(--so-warning, #ab6400); border-color: var(--border);\n }\n .badge-overdue {\n background: color-mix(in srgb, var(--muted) 58%, var(--card)); color: var(--foreground);\n border-color: var(--border);\n }\n /* The criterion matrix's fourth state (v39): neither a pass nor a\n failure \u2014 evidence resolved everywhere except a manual-review kind,\n which by design nothing here can machine-verify. Quieter than\n badge-failed; still visibly distinct from a plain pass. */\n .badge-manual-review {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--muted-foreground) 80%, var(--foreground)); border-color: var(--border);\n }\n /* \"open\" and \"parked\" are neutral facts (an open PR, a parked decision);\n the MAGENTA form is the attention count \u2014 the number that waits on you.\n One accent, two places (reduction pass \u00A73): the needs-you count and\n the act that resolves the screen. Cards, frames, and seals are neutral. */\n .badge-open, .badge-parked { color: var(--foreground); }\n .count {\n min-width: 1.25rem; padding-inline: .35rem; border-radius: 9999px;\n }\n .count.badge-open {\n background: var(--brand-soft); color: var(--brand);\n border-color: color-mix(in srgb, var(--brand) 24%, var(--border));\n }\n .badge-running {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--running) 72%, var(--foreground)); border-color: var(--border);\n }\n .badge-cut { background: var(--muted); }\n\n .card {\n border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass);\n padding: 1rem 1.125rem; margin: .75rem 0;\n }\n .problem {\n border: 1px solid color-mix(in srgb, var(--destructive) 35%, transparent);\n background: var(--destructive-soft); color: var(--destructive);\n border-radius: var(--radius); padding: .625rem .875rem; margin: .75rem 0; font-size: 0.8125rem;\n }\n /* A row is 2.25rem of quiet: hairline below, hover fills, nothing else. */\n .row {\n display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;\n padding: .5rem .375rem; min-height: 2.25rem; border-bottom: 1px solid var(--border);\n margin: 0; border-radius: calc(var(--radius) - 4px);\n }\n .row:last-of-type { border-bottom: none; }\n .row .right { margin-left: auto; }\n a.row { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { a.row:hover { background: var(--muted); } }\n\n /* A parked decision: the question in full weight, the whole card the\n tap target, the neutral border \u2014 the \"needs you\" header above it\n carries the colour for every card beneath. */\n .decide-card {\n display: block; border: 1px solid var(--border);\n border-radius: var(--radius);\n background: var(--card); padding: .875rem 1.125rem; margin: .625rem 0;\n text-decoration: none; transition: border-color .15s;\n }\n @media (hover: hover) and (pointer: fine) { .decide-card:hover { border-color: color-mix(in srgb, var(--border) 55%, var(--muted-foreground)); } }\n .decide-card .q { font-weight: 600; margin: 0 0 .25rem; }\n\n /* Buttons: secondary by default (paper + hairline); a form's one\n submit is primary (ink on paper, paper on ink); the approve act is\n the accent; danger is red and outlined. 2.125rem at a desk, 2.75rem to a thumb. */\n button {\n font: 500 0.8125rem/1.4 var(--font-sans); cursor: pointer; border-radius: calc(var(--radius) - 3px);\n border: 1px solid var(--input); background: var(--card); color: var(--foreground);\n padding: .35rem .75rem; min-height: 2.125rem;\n transition: background .12s var(--so-ease-out), border-color .12s var(--so-ease-out), color .12s var(--so-ease-out);\n }\n @media (hover: hover) and (pointer: fine) { button:hover { background: var(--so-soft); } }\n button:active { background: var(--so-nav-hover); }\n form.card > button[type=submit], .sticky-actions button[type=submit], form.card .sticky-actions button {\n background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { form.card > button[type=submit]:hover, .sticky-actions button[type=submit]:hover {\n background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background));\n } }\n /* The approve act is the one magenta verb: it resolves what waits on you.\n The ceremony's frame is neutral so the button is the only coloured thing\n in it; a danger act stays red even inside one. */\n .approve-form button[type=submit], .approve-form .sticky-actions button[type=submit] {\n background: var(--brand); color: var(--brand-foreground); border-color: var(--brand); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .approve-form button[type=submit]:hover, .approve-form .sticky-actions button[type=submit]:hover { background: color-mix(in srgb, var(--brand) 85%, var(--foreground)); border-color: color-mix(in srgb, var(--brand) 85%, var(--foreground)); } }\n button.danger, .approve-form button[type=submit].danger {\n color: var(--destructive); border-color: color-mix(in srgb, var(--destructive) 50%, transparent);\n background: transparent; font-weight: 500;\n }\n @media (hover: hover) and (pointer: fine) { button.danger:hover, .approve-form button[type=submit].danger:hover { background: var(--destructive-soft); } }\n /* Removing a credential takes a second, deliberate tap. */\n details.confirm-remove { display: inline-block; margin: 0 0 0 .5rem; vertical-align: top; }\n details.confirm-remove > summary { cursor: pointer; color: var(--destructive); font-size: .8125rem; min-height: 2.5rem; display: inline-flex; align-items: center; }\n details.confirm-remove[open] { display: block; margin: .75rem 0 0; }\n .project-card .project-name:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; border-radius: .375rem; }\n\n label { display: block; font-size: 0.8125rem; font-weight: 500; margin: .75rem 0 0; color: var(--foreground); }\n input[type=text], input[type=password], input[type=number], input[type=url], input[type=email], input[type=search], input[type=time], textarea, select {\n width: 100%; margin: .35rem 0 0; padding: .45rem .7rem; font: 400 0.875rem/1.4 var(--font-sans);\n color: var(--foreground); background: var(--card); min-height: 2.125rem;\n border: 1px solid var(--input); border-radius: calc(var(--radius) - 3px);\n transition: border-color .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { input:hover, textarea:hover, select:hover { border-color: var(--muted-foreground); } }\n input[type=number] { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }\n input[type=radio], input[type=checkbox] { accent-color: var(--ring); }\n .permission-field { border: 0; padding: 0; margin: 1rem 0 0; min-width: 0; }\n .permission-field legend { padding: 0; font-size: .8125rem; font-weight: 600; }\n .permission-toggle { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; margin-top: .5rem; }\n .permission-choice {\n display: grid; grid-template-columns: auto minmax(0, 1fr); gap: .6rem; align-items: start;\n margin: 0; padding: .72rem .78rem; border: 1px solid var(--glass-border);\n border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--card) 66%, transparent);\n cursor: pointer; transition: border-color .15s, background .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { .permission-choice:hover { background: var(--muted); } }\n .permission-choice:has(input:checked) {\n border-color: color-mix(in srgb, var(--foreground) 42%, var(--border));\n background: var(--card); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 8%, transparent), var(--shadow);\n }\n .permission-choice input { margin: .14rem 0 0; }\n .permission-choice strong, .permission-choice small { display: block; }\n .permission-choice strong { font-size: .8125rem; }\n .permission-choice small { margin-top: .16rem; color: var(--muted-foreground); font-size: .8125rem; font-weight: 400; line-height: 1.4; }\n .permission-note { margin: .55rem 0 0; }\n .scope-editor .permission-toggle { grid-template-columns: 1fr; }\n .scope-editor .problem { color: var(--foreground); }\n /* New work starts like a conversation, not a configuration sheet. The\n planner turns the one intent into the detailed, signed contract; these\n controls expose the uncommon overrides without making them the door. */\n main:has(.task-intake) { max-width: 68rem; }\n .task-intake { width: min(100%, 50rem); margin: clamp(1rem, 5vh, 4rem) auto 0; }\n .task-intake-hero { text-align: center; margin: 0 auto 1.35rem; max-width: 38rem; }\n .task-intake-mark {\n display: grid; place-items: center; width: 3rem; height: 3rem; margin: 0 auto .85rem;\n border: 1px solid var(--border); border-radius: .75rem;\n background: var(--card); box-shadow: var(--so-pill-shadow);\n font: 600 .72rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .task-intake-hero h1 { margin: 0; font-size: clamp(1.65rem, 4vw, 2.2rem); letter-spacing: -.045em; }\n .task-intake-hero p { margin: .45rem 0 0; color: var(--muted-foreground); }\n .task-composer { padding: .75rem; border-radius: 1.45rem; box-shadow: var(--shadow-overlay); }\n .task-prompt { margin: 0; font-size: 0; }\n .task-prompt textarea {\n min-height: 8.5rem; max-height: 18rem; margin: 0; padding: .9rem 1rem; resize: vertical;\n border: 0; background: transparent; box-shadow: none; font-size: 1.05rem; line-height: 1.55;\n }\n .task-prompt textarea:focus-visible { border: 0; box-shadow: none; }\n @media (hover: hover) and (pointer: fine) { .task-prompt textarea:hover { border: 0; box-shadow: none; } }\n .task-repo { margin: .25rem .45rem .7rem; }\n .task-composer-footer { display: flex; align-items: center; gap: .5rem; padding: .25rem; }\n .task-context { display: flex; align-items: center; gap: .4rem; flex: 1 1 auto; min-width: 0; }\n .task-context-chip {\n display: inline-flex; align-items: center; min-height: 2rem; max-width: 13rem; padding: .25rem .65rem;\n border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground);\n background: color-mix(in srgb, var(--glass) 76%, transparent); font-size: .72rem; white-space: nowrap;\n overflow: hidden; text-overflow: ellipsis;\n }\n .task-quality { margin: 0; flex: none; font-size: 0; }\n .task-quality select {\n width: auto; min-height: 2rem; margin: 0; padding: .25rem 1.75rem .25rem .65rem;\n border-radius: 999px; color: var(--muted-foreground); font-size: .72rem; background-color: var(--glass);\n }\n .task-submit {\n flex: none; min-height: 2.45rem; padding: .45rem .95rem; border-radius: 999px;\n background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .task-submit:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: transparent; } }\n details.task-options {\n margin: .65rem .25rem 0; padding: .15rem .5rem 0; border: 0; border-top: 1px solid var(--glass-border);\n border-radius: 0; background: transparent;\n }\n details.task-options[open] { padding-bottom: .25rem; }\n .task-options > summary { display: flex; align-items: center; gap: .5rem; list-style: none; }\n .task-options > summary::-webkit-details-marker { display: none; }\n .task-options > summary::after {\n content: \"\"; width: .4rem; height: .4rem; margin-left: auto; margin-right: .25rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.1rem); transition: transform .15s;\n }\n .task-options[open] > summary::after { transform: rotate(225deg) translateY(-.1rem); }\n .task-options > summary small { color: var(--muted-foreground); font-weight: 400; }\n .task-options-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 .8rem; padding: 0 .25rem .5rem; }\n .task-options-grid .wide, .task-options-grid .permission-field { grid-column: 1 / -1; }\n .task-check { display: flex; gap: .55rem; align-items: flex-start; }\n .task-check input { margin-top: .2rem; }\n .task-check > span { display: grid; gap: .1rem; }\n .task-check small { display: block; font-weight: 400; line-height: 1.45; }\n .task-agent-note { text-align: center; max-width: 42rem; margin: .85rem auto 0; }\n .visually-hidden {\n position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important;\n margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important; border: 0 !important;\n }\n input[type=password] { font-family: var(--font-mono); }\n input:focus-visible, textarea:focus-visible, select:focus-visible {\n outline: none; border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 25%, transparent);\n }\n button:focus-visible, a:focus-visible, summary:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }\n\n .inline { display: inline-block; width: auto; margin: 0 .375rem .375rem 0; vertical-align: middle; }\n .assistant-picker .button-link[aria-current=page] { outline: 2px solid var(--ring); outline-offset: 2px; }\n .inline input[type=text] { display: inline-block; width: auto; margin: 0 .375rem 0 0; vertical-align: middle; }\n .inline button { width: auto; }\n\n /* One option = one container: consequence first, then the act. */\n form.option {\n margin: .75rem 0; border: 1px solid var(--border); border-radius: var(--radius);\n background: var(--card); padding: .875rem 1rem;\n }\n form.option button {\n display: block; width: 100%; text-align: left; font-size: 0.9375rem; font-weight: 600;\n min-height: 2.75rem;\n }\n /* Recommended is a suggestion, not attention: neutral emphasis, no magenta. */\n form.option.recommended { border-color: color-mix(in srgb, var(--foreground) 30%, var(--border)); }\n form.option.recommended .badge { background: var(--muted); color: var(--foreground); }\n .consequence { font-size: 0.8125rem; color: var(--muted-foreground); margin: 0 0 .625rem; white-space: pre-wrap; }\n form.option input[type=text] { font-size: 0.8125rem; margin-top: .5rem; min-height: 2.25rem; }\n\n .recap { color: var(--muted-foreground); margin: .75rem 0; white-space: pre-wrap; }\n #scope .recap, #scope .scope-paths, .approval-goal { overflow-wrap: anywhere; }\n .result-card {\n margin: 1.25rem 0; border-color: color-mix(in srgb, var(--success) 32%, var(--glass-border));\n background: var(--card);\n box-shadow: var(--shadow-card);\n }\n .result-card h2 { margin: 0; }\n .completion-receipt {\n position: relative; overflow: hidden; margin: 1rem 0 1.25rem; padding: 1.15rem;\n border-color: color-mix(in srgb, var(--foreground) 13%, var(--glass-border));\n background: var(--card);\n box-shadow: var(--shadow-card);\n }\n .completion-receipt::after {\n content: \"\"; position: absolute; width: 11rem; height: 11rem; right: -5rem; top: -7rem;\n border-radius: 50%; background: color-mix(in srgb, var(--running) 9%, transparent); filter: blur(4px); pointer-events: none;\n }\n .receipt-head { position: relative; z-index: 1; display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; }\n .receipt-head h2 { margin: .15rem 0 0; font-size: 1.15rem; }\n /* The receipt's status line is the shared component (.status-line);\n the head keeps it from wrapping under the heading. */\n .receipt-head .status-line { flex: none; font-size: .8125rem; }\n .receipt-summary { position: relative; z-index: 1; max-width: 43rem; margin: .75rem 0 1rem; font-size: 1rem; line-height: 1.55; }\n .receipt-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .55rem; }\n .receipt-facts > span { min-width: 0; padding: .7rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 64%, transparent); }\n .receipt-facts strong, .receipt-facts small { display: block; overflow-wrap: anywhere; }\n .receipt-facts strong { font-size: .78rem; font-weight: 600; }\n .receipt-facts small { margin-top: .18rem; color: var(--muted-foreground); font-size: .75rem; line-height: 1.4; }\n /* Thumbnails, never a full-width poster: auto-fill leaves a lone\n screenshot at thumbnail size (UI polish 2026-09-13). */\n .receipt-visuals { display: grid; grid-template-columns: repeat(auto-fill, minmax(8rem, 14rem)); gap: .55rem; margin-top: .75rem; }\n .receipt-shot { display: grid; gap: .35rem; color: var(--muted-foreground); font-size: .75rem; text-decoration: none; }\n .receipt-shot img { display: block; width: 100%; aspect-ratio: 16 / 10; object-fit: cover; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--muted); }\n @media (hover: hover) and (pointer: fine) { .receipt-shot:hover { color: var(--foreground); } }\n .report-items ol { margin: .35rem 0 .75rem; padding-left: 1.25rem; display: grid; gap: .75rem; }\n .report-items li p { margin: .15rem 0; }\n .report-link { overflow-wrap: anywhere; }\n .receipt-caveats, .receipt-coverage { margin-top: .8rem; padding: .7rem .8rem; border-left: 1px solid var(--border); border-radius: 0 calc(var(--radius) - 3px) calc(var(--radius) - 3px) 0; background: color-mix(in srgb, var(--muted) 62%, transparent); font-size: .78rem; }\n .receipt-caveats ul, .receipt-coverage ul { margin: .3rem 0 0; padding-left: 1.15rem; }\n /* Secondary receipt detail (concise pass, 2026-09-13): native\n disclosures in the receipt's own quiet tone \u2014 no card chrome. */\n details.receipt-coverage, details.receipt-coverage[open] { padding: 0 .8rem .1rem; border-top: 0; border-right: 0; border-bottom: 0; }\n details.receipt-coverage > summary { padding: .5rem 0; font-weight: 600; color: var(--foreground); font-size: .78rem; }\n details.receipt-coverage[open] > summary { padding-bottom: .2rem; }\n details.receipt-coverage ul { margin: 0 0 .5rem; }\n .receipt-history, .receipt-history[open] { margin: .35rem 0 0; padding: 0; border: 0; background: none; border-radius: 0; }\n .receipt-history > summary { padding: .35rem 0; min-height: 2.25rem; display: inline-flex; align-items: center; gap: .25rem; font-size: .8125rem; list-style: none; }\n .receipt-history > summary::-webkit-details-marker { display: none; }\n .receipt-history > summary::before { content: \"\u25B8\"; }\n .receipt-history[open] > summary::before { content: \"\u25BE\"; }\n .receipt-history .receipt-review { margin: 0 0 .35rem; }\n .semantic-coverage p { margin: .2rem 0; }\n .receipt-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .65rem 1rem; margin-top: .9rem; }\n .receipt-actions > a:not(.button-link) { font-size: .78rem; font-weight: 550; }\n /* The review cockpit (Priority 5): a master/detail over completed work.\n The queue is a ranked list, the detail one scan path \u2014 intent, proof,\n changes, publication \u2014 and the primary act sits under the header. */\n main:has(.cockpit) { max-width: 82rem; }\n .cockpit { display: grid; grid-template-columns: minmax(15rem, 19rem) minmax(0, 1fr); gap: 0 1.5rem; align-items: start; }\n .cockpit-queue { position: sticky; top: 1rem; min-width: 0; }\n .cockpit-queue h2 { display: flex; align-items: center; gap: .4rem; margin: 0 0 .25rem; }\n .cockpit-queue .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; font-weight: 500; color: var(--muted-foreground); font-size: .6875rem; }\n .cockpit-queue-hint { margin: 0 0 .6rem; font-size: .7rem; line-height: 1.4; }\n .cockpit-queue-list { list-style: none; margin: 0; padding: 0; max-height: calc(100vh - 9rem); overflow-y: auto; }\n .cockpit-row {\n display: grid; gap: .2rem; padding: .55rem .65rem; margin-bottom: .2rem; min-width: 0;\n border: 1px solid transparent; border-radius: calc(var(--radius) - 3px); text-decoration: none; color: var(--foreground);\n }\n @media (hover: hover) and (pointer: fine) { .cockpit-row:hover { background: var(--card); } }\n .cockpit-row.current { background: var(--muted); border-color: color-mix(in srgb, var(--foreground) 12%, var(--border)); }\n .cockpit-row-head { display: flex; align-items: flex-start; justify-content: space-between; gap: .5rem; min-width: 0; }\n .cockpit-row-head strong { min-width: 0; overflow-wrap: anywhere; font-size: .8125rem; font-weight: 550; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }\n .cockpit-row-meta { display: block; color: var(--muted-foreground); font-size: .68rem; overflow-wrap: anywhere; }\n .cockpit-why { display: block; color: var(--muted-foreground); font-size: .7rem; line-height: 1.35; overflow-wrap: anywhere; }\n .refusal-back a { display: inline-flex; align-items: center; min-height: 44px; min-width: 44px; }\n .cockpit-primary { margin: .85rem 0 1rem; }\n .cockpit-primary .button-link { white-space: nowrap; }\n .cockpit-detail { min-width: 0; }\n .cockpit-head h1 { margin: .2rem 0 .55rem; color: var(--foreground); font-size: clamp(1.2rem, 2vw, 1.45rem); font-weight: 600; line-height: 1.3; letter-spacing: -.025em; overflow-wrap: anywhere; }\n .cockpit-chips { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; margin: 0 0 .35rem; }\n .cockpit-next { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin: .85rem 0 1rem; padding: .85rem 1rem;\n border-color: var(--glass-border); background: var(--glass-strong); }\n .cockpit-next > div { display: grid; gap: .2rem; min-width: 0; overflow-wrap: anywhere; }\n .cockpit-next .meta { font-size: .78rem; line-height: 1.45; }\n .cockpit-next form { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: 0; }\n .cockpit-next form input[type=text] { min-width: 9rem; margin: 0; }\n .cockpit-next .button-link, .cockpit-next button[type=submit] { white-space: nowrap; }\n .cockpit-section { margin: .85rem 0; padding: .95rem 1.05rem; }\n .cockpit-section h3 { margin: 0 0 .5rem; font-size: .8rem; letter-spacing: .02em; text-transform: uppercase; color: var(--muted-foreground); }\n .cockpit-section .recap { margin: .35rem 0; }\n .cockpit-section .result-section { margin-top: .6rem; }\n .cockpit-section .result-section ul, .cockpit-section ul { margin: .25rem 0 0; padding-left: 1.15rem; }\n .cockpit-section li { overflow-wrap: anywhere; }\n .cockpit-drift { margin: .6rem 0; font-size: .8rem; }\n .cockpit-files { margin: .4rem 0 .6rem; padding-left: 1.25rem; font-size: .78rem; }\n .cockpit-files li { margin: .2rem 0; }\n .cockpit-files .pick-file { min-height: 1.75rem; padding: 0 .55rem; font-size: .75rem; }\n .cockpit-section .diff-review { margin-top: .6rem; }\n .cockpit-section .receipt-visuals { margin-top: .6rem; grid-template-columns: repeat(auto-fill, minmax(9rem, 14rem)); }\n .cockpit-disclosure { padding: 0; overflow: hidden; }\n .cockpit-disclosure > summary {\n display: flex; align-items: center; justify-content: space-between; gap: 1rem; min-height: 4rem;\n padding: .85rem 1.05rem; list-style: none; cursor: pointer;\n }\n .cockpit-disclosure > summary::-webkit-details-marker { display: none; }\n .cockpit-disclosure > summary > h3 { display: grid; gap: .12rem; min-width: 0; margin: 0; font-size: .82rem; }\n .cockpit-disclosure > summary small { color: var(--muted-foreground); font-size: .72rem; font-weight: 400; }\n .cockpit-disclosure-action { color: var(--muted-foreground); font-size: .72rem; white-space: nowrap; }\n .cockpit-disclosure-action::after { content: \"\u2193\"; margin-left: .35rem; }\n .cockpit-disclosure[open] .cockpit-disclosure-action::after { content: \"\u2191\"; }\n .cockpit-disclosure-body { padding: 0 1.05rem .95rem; border-top: 1px solid var(--glass-border); }\n .cockpit-proof-group { margin: .65rem 0; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 62%, transparent); }\n .cockpit-proof-group > summary { padding: .65rem .75rem; cursor: pointer; font-weight: 550; }\n .cockpit-proof-group .criterion-matrix { padding: 0 .75rem .7rem; }\n .cockpit-proof-summary { display: grid; gap: .25rem; margin: .15rem 0 .75rem; line-height: 1.45; }\n .cockpit-proof-summary strong { font-size: .88rem; }\n .cockpit-evidence-group { margin: .65rem 0 0; scroll-margin-top: 6rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); overflow: hidden; }\n .cockpit-evidence-group > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .75rem; cursor: pointer; list-style: none; font-weight: 550; }\n .cockpit-evidence-group > summary::-webkit-details-marker { display: none; }\n .cockpit-evidence-group > summary > span { flex: none; white-space: nowrap; }\n .cockpit-evidence-group > summary small { min-width: 0; color: var(--muted-foreground); font-size: .7rem; font-weight: 400; text-align: right; }\n .cockpit-evidence-group [data-primary-evidence] { scroll-margin-top: 6rem; }\n .cockpit-evidence-body { padding: 0 .75rem .75rem; border-top: 1px solid var(--glass-border); }\n .cockpit-accept { margin-top: .65rem; padding-top: .65rem; border-top: 1px solid var(--glass-border); }\n .cockpit-accept > summary { cursor: pointer; font-size: .78rem; font-weight: 600; }\n .cockpit-accept[open] > summary { margin-bottom: .55rem; }\n .cockpit-accept p { margin: 0 0 .55rem; }\n .cockpit-accept-form { display: flex; gap: .5rem; margin: 0; }\n .cockpit-accept-form input { margin: 0; min-width: 10rem; }\n .cockpit-accept-form button { flex: none; background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .diff-review {\n overflow: hidden; margin: .8rem 0 .5rem; border: 1px solid var(--glass-border);\n border-radius: var(--radius); background: color-mix(in srgb, var(--card) 82%, transparent);\n \n }\n .diff-review-bar {\n display: flex; align-items: center; justify-content: space-between; gap: .75rem;\n min-height: 2.8rem; padding: .4rem .55rem .4rem .85rem;\n border-bottom: 1px solid var(--glass-border); background: color-mix(in srgb, var(--glass-strong) 68%, transparent);\n }\n .diff-modes { display: inline-flex; padding: .18rem; border: 1px solid var(--glass-border); border-radius: 999px; background: var(--muted); }\n .diff-modes button {\n min-height: 1.75rem; padding: .2rem .7rem; border: 0; border-radius: 999px;\n background: transparent; box-shadow: none; color: var(--muted-foreground); font-size: .7rem;\n }\n @media (hover: hover) and (pointer: fine) { .diff-modes button:hover { transform: none; color: var(--foreground); } }\n .diff-modes button[aria-pressed=\"true\"] { background: var(--card); color: var(--foreground); box-shadow: 0 1px 3px color-mix(in srgb, var(--background) 20%, transparent); }\n .diff-review-help {\n margin: 0; padding: .62rem .85rem; border-bottom: 1px solid var(--glass-border);\n background: color-mix(in srgb, var(--running) 7%, transparent); color: var(--muted-foreground); font-size: .75rem;\n }\n .diff-review[data-mode=\"view\"] .diff-review-help { display: none; }\n .diff-file { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n .diff-file + .diff-file { border-top: 1px solid var(--glass-border); }\n .diff-file[open] { padding-bottom: 0; }\n .diff-file > summary {\n display: flex; align-items: center; gap: .7rem; min-height: 2.75rem; padding: .45rem .85rem;\n list-style: none; color: var(--foreground); background: color-mix(in srgb, var(--glass) 55%, transparent);\n }\n .diff-file > summary::-webkit-details-marker { display: none; }\n .diff-file > summary::before {\n content: \"\"; flex: none; width: .35rem; height: .35rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(-45deg); transition: transform .15s ease;\n }\n .diff-file[open] > summary::before { transform: rotate(45deg) translateY(-.1rem); }\n .diff-file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 .75rem/1.4 var(--font-mono); }\n .diff-file-counts { display: inline-flex; gap: .45rem; flex: none; margin-left: auto; font: 500 .75rem/1 var(--font-mono); }\n .diff-file-counts b { color: var(--success); font-weight: 500; }\n .diff-file-counts i { color: var(--destructive); font-style: normal; }\n .diff-rename { margin: 0; padding: .4rem .85rem; border-top: 1px solid var(--glass-border); }\n .diff-hunk + .diff-hunk { border-top: 1px solid var(--glass-border); }\n .diff-hunk-head {\n overflow-x: auto; padding: .42rem .85rem; border-top: 1px solid var(--glass-border); border-bottom: 1px solid var(--glass-border);\n background: color-mix(in srgb, var(--running) 8%, var(--card)); color: color-mix(in srgb, var(--running) 72%, var(--foreground));\n font: 500 .75rem/1.4 var(--font-mono); white-space: pre;\n }\n .diff-lines { max-width: 100%; overflow-x: auto; background: color-mix(in srgb, var(--background) 48%, var(--card)); }\n .diff-line {\n display: grid; grid-template-columns: 2rem 3.2rem 3.2rem minmax(max-content, 1fr); align-items: stretch;\n min-width: max-content; min-height: 1.8rem; font: 400 .75rem/1.55 var(--font-mono);\n }\n @media (hover: hover) and (pointer: fine) { .diff-line:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); } }\n .diff-line code { display: flex; min-width: 0; padding: .3rem .75rem .3rem .6rem; color: inherit; white-space: pre; }\n .diff-line code b { display: inline-block; width: 1rem; flex: none; font-weight: 500; opacity: .72; }\n .diff-gutter {\n display: flex; align-items: flex-start; justify-content: flex-end; min-width: 0; padding: .3rem .45rem;\n border-right: 1px solid color-mix(in srgb, var(--border) 72%, transparent); color: var(--muted-foreground); user-select: none;\n }\n .diff-addition { background: color-mix(in srgb, var(--success) 10%, transparent); color: color-mix(in srgb, var(--success) 38%, var(--foreground)); }\n .diff-deletion { background: color-mix(in srgb, var(--destructive) 9%, transparent); color: color-mix(in srgb, var(--destructive) 38%, var(--foreground)); }\n .diff-meta { color: var(--muted-foreground); }\n .diff-annotate, .diff-annotate-space {\n position: sticky; left: 0; z-index: 1; display: grid; place-items: center; width: 2rem; min-width: 2rem; min-height: 1.8rem;\n border: 0; border-right: 1px solid color-mix(in srgb, var(--border) 72%, transparent); border-radius: 0;\n }\n .diff-annotate { padding: 0; background: color-mix(in srgb, var(--card) 94%, transparent); color: var(--muted-foreground); box-shadow: none; opacity: .35; }\n .diff-annotate svg { width: .78rem; height: .78rem; }\n @media (hover: hover) and (pointer: fine) { .diff-annotate:hover { transform: none; background: color-mix(in srgb, var(--running) 15%, var(--card)); color: var(--running); opacity: 1; } }\n .diff-annotate-space { background: color-mix(in srgb, var(--card) 94%, transparent); }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 3.2rem 3.2rem minmax(max-content, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-annotate,\n .diff-review[data-mode=\"view\"] .diff-annotate-space { visibility: hidden; width: 0; min-width: 0; overflow: hidden; border: 0; pointer-events: none; }\n .diff-review[data-mode=\"annotate\"] .diff-annotate { opacity: .72; }\n .diff-cut { margin: 0; padding: .65rem .85rem; border-top: 1px solid var(--glass-border); color: var(--warning); font-size: .75rem; }\n .diff-comments { display: grid; gap: .5rem; margin: .7rem 0; }\n .diff-comment {\n position: relative; padding: .7rem .8rem .7rem 1rem; border: 1px solid var(--glass-border);\n border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--glass) 76%, transparent);\n }\n .diff-comment-pin { position: absolute; left: -.2rem; top: .75rem; width: .38rem; height: 1.2rem; border-radius: 999px; background: var(--running); }\n .diff-comment p { margin: 0 0 .25rem; overflow-wrap: anywhere; }\n .diff-comment .meta { font-size: .68rem; }\n .diff-comment-form { display: grid; gap: .65rem; margin: .75rem 0; padding: .85rem; }\n .diff-comment-target { display: grid; grid-template-columns: minmax(0, 1fr) 5.5rem; gap: .6rem; }\n .diff-comment-form label { margin: 0; color: var(--muted-foreground); font-size: .68rem; font-weight: 550; }\n .diff-comment-form input, .diff-comment-form textarea { margin-top: .28rem; }\n .diff-comment-form button { justify-self: start; }\n .diff-comment-limit { margin-top: -.35rem; font-size: .66rem; font-variant-numeric: tabular-nums; }\n .revision-from-comments {\n display: flex; align-items: center; justify-content: space-between; gap: 1rem;\n margin: .75rem 0; padding: .85rem; border-color: color-mix(in srgb, var(--running) 24%, var(--glass-border));\n background: var(--card);\n }\n .revision-from-comments > div { display: grid; gap: .15rem; }\n .revision-from-comments > div > span { display: block; }\n .revision-from-comments button { flex: none; }\n .result-section { margin-top: .875rem; }\n .result-section > strong {\n display: block; font: 600 .6875rem/1.3 var(--font-mono); color: var(--muted-foreground);\n letter-spacing: .06em; text-transform: uppercase;\n }\n .result-section ul { margin: .375rem 0 0; padding-left: 1.25rem; }\n .result-section li { margin: .25rem 0; }\n .criterion-matrix .requirement-list { list-style: none; margin: .4rem 0 0; padding: 0; }\n .criterion-matrix .requirement { margin: 0; padding: 1rem 0; border-bottom: 1px solid var(--border); min-width: 0; overflow-wrap: anywhere; }\n .criterion-matrix .requirement:last-child { border-bottom: 0; }\n .requirement-heading { display: flex; align-items: center; flex-wrap: wrap; gap: .4rem .75rem; font-size: .75rem; color: var(--muted-foreground); }\n .requirement-heading .badge { margin: 0; white-space: normal; }\n .requirement-statement { margin: .5rem 0; line-height: 1.55; white-space: pre-wrap; }\n .requirement-review { margin: .4rem 0; font-size: .78rem; color: var(--muted-foreground); }\n .requirement-warning { margin: .65rem 0; padding: .6rem .75rem; border: 1px solid color-mix(in srgb, var(--warning) 35%, var(--border)); border-radius: 8px; background: var(--warning-soft); font-size: .8125rem; }\n .requirement-warning strong { font-size: .78rem; }\n .requirement-warning p { margin: .3rem 0 0; }\n .requirement-issues { font-size: .8125rem; }\n .criterion-matrix .requirement-evidence { margin: .35rem 0 0; padding: 0; border: 0; border-radius: 0; background: none; }\n .requirement-evidence > summary { display: flex; align-items: center; gap: .5rem; min-height: 44px; width: fit-content; padding: .35rem .1rem; cursor: pointer; list-style: none; font-size: .8125rem; }\n .requirement-evidence > summary::-webkit-details-marker { display: none; }\n .requirement-evidence > summary::after { content: \"+\"; color: var(--muted-foreground); }\n .requirement-evidence[open] > summary::after { content: \"\u2212\"; }\n .requirement-evidence-body { padding: .25rem .75rem .65rem; border-left: 1px solid var(--border); }\n .requirement-evidence-body p { margin: .35rem 0; }\n .requirement-evidence-group { margin: .7rem 0; }\n .requirement-evidence-group > strong { font-size: .75rem; color: var(--muted-foreground); }\n .requirement-evidence-group code { white-space: normal; overflow-wrap: anywhere; font-size: .75rem; }\n .requirement-evidence-group a { display: inline-block; padding: .4rem 0; }\n .question { font-size: 1.125rem; font-weight: 600; letter-spacing: -0.01em; margin: 1rem 0; white-space: pre-wrap; }\n .answered {\n border: 1px solid color-mix(in srgb, var(--success) 35%, transparent); background: var(--success-soft);\n border-radius: var(--radius); padding: .875rem 1rem; margin: 1rem 0;\n }\n details {\n margin: .75rem 0; border: 1px solid var(--border); border-radius: var(--radius);\n padding: .25rem .875rem; background: var(--card);\n }\n details[open] { padding-bottom: .875rem; }\n details.arm-danger { border-color: color-mix(in srgb, var(--destructive) 30%, transparent); }\n summary { padding: .5rem 0; cursor: pointer; font-weight: 500; font-size: 0.8125rem; color: var(--muted-foreground); min-height: 2.25rem; }\n @media (hover: hover) and (pointer: fine) { summary:hover { color: var(--foreground); } }\n details form.option { border: none; padding: .25rem 0 0; margin: 0; }\n .evidence { margin-top: 1.5rem; font-size: 0.8125rem; }\n .evidence a { display: block; padding: .55rem 0; border-bottom: 1px solid var(--border); text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .evidence a:hover { color: var(--muted-foreground); } }\n .evidence strong { display: block; font-size: 0.6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted-foreground); font-family: var(--font-mono); }\n\n .filters { font-size: 0.8125rem; color: var(--muted-foreground); }\n .filters a, .filters strong {\n display: inline-block; padding: .25rem .625rem; border-radius: 9999px; text-decoration: none;\n color: var(--muted-foreground); font-weight: 500;\n }\n .filters strong { background: var(--muted); color: var(--foreground); }\n @media (hover: hover) and (pointer: fine) { .filters a:hover { color: var(--foreground); } }\n\n /* A picked tournament result: marked in the built green, not magenta. */\n .card.picked { border-color: color-mix(in srgb, var(--success) 40%, var(--border)); }\n .seal {\n display: inline-block; font-family: var(--font-mono); font-size: .75rem;\n background: var(--muted); border: 1px solid var(--border);\n color: var(--foreground); border-radius: calc(var(--radius) - 4px); padding: .25rem .625rem;\n font-variant-numeric: tabular-nums; overflow-wrap: anywhere;\n }\n\n /* The workspace shell: sidebar + content, an optional list pane between. */\n /* The rail collapse is instant: a layout dimension is never animated (UI polish 2026-09-13). */\n .app { display: grid; grid-template-columns: 232px minmax(0, 1fr); min-height: 100vh; }\n .side {\n border-right: 1px solid var(--glass-border);\n background: var(--glass-strong);\n padding: 1rem .875rem 1.125rem; display: flex; flex-direction: column; gap: .175rem;\n position: sticky; top: 0; height: 100vh; overflow-y: auto;\n box-shadow: 1px 0 0 var(--glass-highlight) inset;\n }\n .side-head { display: flex; align-items: center; gap: .25rem; min-height: 2.5rem; margin-bottom: .45rem; }\n .side .brand { flex: 1; min-width: 0; padding: .25rem .625rem; font-size: 1rem; height: auto; letter-spacing: -.025em; }\n .brand-short { display: none; font-family: var(--font-mono); letter-spacing: -.06em; }\n .side-toggle {\n display: grid; place-items: center; flex: 0 0 2rem; width: 2rem; min-height: 2rem; padding: 0;\n border-color: transparent; background: transparent; color: var(--muted-foreground); box-shadow: none;\n }\n @media (hover: hover) and (pointer: fine) { .side-toggle:hover { background: var(--glass); color: var(--foreground); transform: none; } }\n .side-toggle svg { width: 1rem; height: 1rem; }\n /* The scope bar: one hairline row, the single scope truth on every\n * screen; its name is the switcher. Magenta never appears here except\n * the needs-you count. */\n .scope-bar {\n display: flex; align-items: baseline; gap: .625rem; flex-wrap: wrap;\n position: sticky; top: 0; z-index: 20;\n padding: .625rem 2rem; border-bottom: 1px solid var(--glass-border);\n background: var(--glass-strong); font-size: .8125rem;\n }\n .scope-bar .eyebrow { font-size: .6875rem; font-weight: 500; color: var(--muted-foreground); }\n .scope-bar .name { font-weight: 600; }\n /* The switcher: a folded menu of enrolled projects under the scope's name. */\n .switcher { position: relative; }\n .switcher > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .25rem; }\n .switcher > summary::-webkit-details-marker { display: none; }\n .switcher .chevron { width: .875rem; height: .875rem; color: var(--muted-foreground); transition: transform .15s; }\n .switcher[open] > summary .chevron { transform: rotate(180deg); }\n .switcher-menu {\n position: absolute; top: calc(100% + .375rem); left: 0; z-index: 40; min-width: 15rem; max-width: 22rem;\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay); padding: .375rem; display: flex; flex-direction: column; gap: .125rem;\n }\n .switcher-menu form { margin: 0; }\n .switcher-menu button {\n display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left; margin: 0;\n background: transparent; border: 0; min-height: 2.5rem; padding: 0 .75rem;\n border-radius: calc(var(--radius) - 4px); font: inherit; font-size: .875rem; color: var(--foreground);\n }\n .switcher-menu button.current { font-weight: 600; }\n .switcher-menu button.current::after {\n content: \"\"; margin-left: auto; width: .375rem; height: .625rem; flex: none;\n border-right: 1.75px solid var(--foreground); border-bottom: 1.75px solid var(--foreground);\n transform: rotate(45deg) translateY(-.125rem);\n }\n @media (hover: hover) and (pointer: fine) { .switcher-menu button:hover { background: var(--muted); } }\n .switcher-menu .manage {\n display: block; margin-top: .25rem; padding: .625rem .75rem; border-top: 1px solid var(--border);\n font-size: .75rem; color: var(--muted-foreground); text-decoration: none;\n }\n .scope-status {\n display: flex; gap: .5rem; flex-wrap: wrap;\n color: var(--muted-foreground); font-size: .6875rem; font-variant-numeric: tabular-nums;\n font-family: var(--font-mono);\n }\n .scope-status .hot { color: var(--brand); font-weight: 500; }\n .scope-status a { color: inherit; text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .scope-status a:hover { text-decoration: underline; } }\n /* A project card's name and counts are forms or links dressed as text and chips. */\n .project-card button.project-name, .project-card a.project-name {\n all: unset; cursor: pointer; font-weight: 600; color: var(--foreground);\n }\n @media (hover: hover) and (pointer: fine) { .project-card a.project-name:hover, .project-card button.project-name:hover { text-decoration: underline; } }\n .project-card button.badge { min-height: auto; box-shadow: none; cursor: pointer; }\n @media (hover: hover) and (pointer: fine) { .project-card button.badge:hover, .project-card a.badge:hover { border-color: var(--input); } }\n /* Adding a project is the page's primary job, not badge-sized metadata.\n * Two roomy action tiles make both roads obvious on a desk and give each\n * one a generous thumb target on a phone. The manual path stays tertiary. */\n .project-add-card { margin-top: 1.25rem; padding: 1.25rem; }\n .project-add-card h2.project-add-title {\n margin: 0; color: var(--foreground); font-size: 1.0625rem; line-height: 1.35;\n letter-spacing: -.015em;\n }\n .project-add-intro { margin: .25rem 0 0; max-width: 36rem; }\n .project-add-actions {\n display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: .625rem; margin-top: 1rem;\n }\n .project-add-action {\n display: grid; grid-template-columns: 2.75rem minmax(0, 1fr) auto;\n align-items: center; gap: .75rem; min-height: 5rem; padding: .75rem .875rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 1px);\n background: var(--glass-strong);\n color: var(--foreground); text-decoration: none;\n \n transition: transform .15s ease, background .15s, border-color .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { .project-add-action:hover {\n border-color: color-mix(in srgb, var(--border) 50%, var(--muted-foreground));\n background: var(--card); text-decoration: none;\n box-shadow: var(--shadow);\n } }\n .project-add-action:active { transform: translateY(0); }\n .project-add-icon {\n display: grid; place-items: center; width: 2.75rem; height: 2.75rem;\n border: 1px solid var(--border); border-radius: .75rem;\n background: var(--muted); color: var(--foreground);\n }\n .project-add-icon svg { width: 1.125rem; height: 1.125rem; }\n .project-add-copy { min-width: 0; }\n .project-add-copy strong { display: block; font-size: .9375rem; line-height: 1.35; }\n .project-add-copy small {\n display: block; margin-top: .175rem; color: var(--muted-foreground);\n font-size: .75rem; font-weight: 400; line-height: 1.4;\n }\n .project-add-arrow { color: var(--muted-foreground); font-size: 1rem; }\n .project-add-more { margin-top: .875rem; border-top: 1px solid var(--border); }\n .project-add-more > summary {\n display: flex; align-items: center; min-height: 2.75rem; width: fit-content;\n color: var(--muted-foreground); cursor: pointer; font-size: .8125rem; font-weight: 500;\n }\n @media (hover: hover) and (pointer: fine) { .project-add-more > summary:hover { color: var(--foreground); } }\n .project-add-more > .card { margin: 0 0 .25rem; }\n .side nav { display: flex; flex-direction: column; gap: .125rem; }\n /* Inline decision options: neutral buttons \u2014 the card's magenta outline is\n * the attention signal; recommendation is a neutral badge, never magenta. */\n .decide-options { margin-top: .5rem; display: flex; flex-direction: column; gap: .375rem; }\n .decide-option { margin: 0; display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }\n .decide-option button { margin: 0; }\n .decide-option .meta { flex: 1 1 12rem; }\n /* The rail's two accordion groups (sidebar rework): collapsed by\n * default, the active page's group open, opening one closes the other\n * (client toggle in chromeScript). Native <details>/<summary> carries\n * the expanded state and keyboard operation for free \u2014 the same pattern\n * the switcher already uses. */\n .side .nav-groups { display: flex; flex-direction: column; gap: .125rem; margin-top: .375rem; }\n .nav-group > summary {\n display: flex; align-items: center; justify-content: space-between; gap: .5rem;\n list-style: none; cursor: pointer; padding: .4375rem .625rem; min-height: 2.125rem;\n border-radius: calc(var(--radius) - 3px); text-decoration: none;\n color: var(--muted-foreground); font-size: .6875rem; font-weight: 500;\n font-family: var(--font-sans);\n }\n .nav-group > summary::-webkit-details-marker { display: none; }\n @media (hover: hover) and (pointer: fine) { .nav-group > summary:hover { background: var(--glass); color: var(--foreground); } }\n .nav-group > summary .chevron { width: .875rem; height: .875rem; flex: none; transition: transform .15s; }\n .nav-group[open] > summary .chevron { transform: rotate(180deg); }\n .nav-group .nav-group-items { display: flex; flex-direction: column; gap: .125rem; margin: .125rem 0 .25rem; }\n .side .nav-settings { margin-top: .375rem; }\n .side nav a {\n position: relative;\n display: flex; align-items: center; gap: .625rem; padding: .4375rem .625rem; min-height: 2.125rem;\n border-radius: calc(var(--radius) - 3px); text-decoration: none;\n color: var(--muted-foreground); font-size: .8125rem; font-weight: 500;\n transition: color .15s, background .15s, transform .15s;\n }\n .side nav a .glyph { display: inline-flex; width: 1rem; height: 1rem; color: var(--muted-foreground); flex: none; }\n .side nav a .glyph svg { width: 1rem; height: 1rem; }\n @media (hover: hover) and (pointer: fine) { .side nav a:hover { background: var(--glass); color: var(--foreground); transform: translateX(2px); } }\n .side nav a:active { background: var(--glass); color: var(--foreground); }\n .app.sidebar-collapsed { grid-template-columns: 64px minmax(0, 1fr); }\n .app.sidebar-collapsed .side { padding-inline: .625rem; }\n .app.sidebar-collapsed .side-head { flex-direction: column; gap: .2rem; margin-bottom: .55rem; }\n .app.sidebar-collapsed .side .brand { flex: none; padding: .2rem 0; font-size: .75rem; }\n .app.sidebar-collapsed .brand-long { display: none; }\n .app.sidebar-collapsed .brand-short { display: block; }\n .app.sidebar-collapsed .side-toggle svg { transform: rotate(180deg); }\n .app.sidebar-collapsed .side nav a {\n justify-content: center; gap: 0; min-height: 2.5rem; padding: .5rem; font-size: 0;\n }\n .app.sidebar-collapsed .side nav a .glyph { width: 1.125rem; height: 1.125rem; }\n .app.sidebar-collapsed .side nav a .glyph svg { width: 1.125rem; height: 1.125rem; }\n .app.sidebar-collapsed .side nav a .count {\n position: absolute; top: .15rem; right: .05rem; min-width: 1rem; padding: 0 .25rem; font-size: .55rem;\n }\n .app.sidebar-collapsed .side .new-task { min-height: 2.5rem; padding: .4rem 0; font-size: 0; }\n .app.sidebar-collapsed .side .new-task::after { content: \"+\"; font-size: 1rem; }\n .app.sidebar-collapsed .side .nav-groups { display: none; }\n .side nav a.active {\n background: var(--card);\n color: var(--foreground); box-shadow: 0 1px 0 var(--glass-highlight) inset;\n }\n .side nav a.active .glyph { color: var(--foreground); }\n .side nav a .count { margin-left: auto; }\n .side .grow { flex: 1; }\n .side .new-task {\n display: block; text-align: center; text-decoration: none; font-weight: 600; font-size: .8125rem;\n background: var(--primary); color: var(--primary-foreground);\n border: 1px solid var(--primary);\n border-radius: calc(var(--radius) - 3px); padding: .525rem; margin: .75rem 0 .125rem;\n box-shadow: 0 10px 28px -18px rgb(255 255 255 / .5);\n }\n @media (hover: hover) and (pointer: fine) { .side .new-task:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n /* The same action link outside the sidebar reads as a real button. */\n .content .new-task {\n display: inline-block; text-decoration: none; font-weight: 500; font-size: .8125rem;\n background: var(--secondary); color: var(--foreground); border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); padding: .5rem .875rem;\n }\n @media (hover: hover) and (pointer: fine) { .content .new-task:hover { background: color-mix(in srgb, var(--secondary) 70%, var(--border)); } }\n .content { min-width: 0; }\n .content > main { max-width: 54rem; margin: 0; padding: 2rem 2.5rem 4rem; }\n\n /* Banners: honest labels, quiet strips. */\n .banner {\n border-bottom: 1px solid var(--glass-border); background: var(--glass);\n padding: .375rem .9rem; font-size: .8125rem; color: var(--muted-foreground);\n }\n .banner .badge { margin-right: .5rem; }\n /* Chat in `toolroll demo`: the scripted lead's conversation. */\n .demo-chat { display: flex; flex-direction: column; gap: 1rem; max-width: 46rem; margin: 0 auto; padding-bottom: 1rem; }\n .demo-thread { display: flex; flex-direction: column; gap: 1.25rem; }\n .demo-turn { display: flex; flex-direction: column; gap: .75rem; scroll-margin-top: 1rem; }\n .demo-said p { margin: 0; }\n .demo-you { align-self: flex-end; max-width: min(34rem, 85%); background: var(--so-ink); color: var(--so-paper); border-radius: .875rem .875rem .25rem .875rem; padding: .55rem .85rem; overflow-wrap: anywhere; }\n .demo-lead { max-width: 40rem; }\n .demo-who { font-size: .75rem; font-weight: 600; color: var(--so-muted); margin-bottom: .15rem !important; }\n .demo-chat .card { margin: 0; padding: 1rem 1.125rem; }\n .demo-chat .card h2 { font-size: .9375rem; margin: .1rem 0 .4rem; }\n .demo-chat .card h3 { font-size: .75rem; font-weight: 600; color: var(--so-muted); margin: .75rem 0 .25rem; }\n .demo-chat .card ul { margin: 0; padding-left: 1.1rem; }\n .demo-chat .card li { margin: .15rem 0; }\n .demo-chat .card > p { margin: .25rem 0; }\n .demo-kicker { font-size: .75rem; color: var(--so-muted); margin: 0 !important; }\n .demo-actions { display: flex; flex-wrap: wrap; align-items: flex-start; gap: .5rem; margin-top: .9rem; }\n .demo-actions form { margin: 0; }\n .demo-actions button, .demo-more > summary { min-height: 2.5rem; }\n .demo-chat button.demo-primary { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .demo-chat details.demo-more { flex: 1 1 12rem; margin: 0; padding: 0; border: 0; border-radius: 0; background: none; }\n .demo-chat details.demo-more[open] { padding-bottom: 0; }\n .demo-chat .demo-more > summary { display: inline-flex; align-items: center; color: var(--so-ink); padding: .35rem .85rem; border: 1px solid var(--so-input-line); border-radius: calc(var(--radius) - 3px); background: var(--so-paper); font-weight: 500; font-size: .8125rem; cursor: pointer; list-style: none; }\n .demo-more > summary::-webkit-details-marker { display: none; }\n .demo-more[open] > summary { margin-bottom: .5rem; }\n .demo-more form, .demo-composer { display: flex; flex-direction: column; gap: .4rem; }\n .demo-more label { font-size: .8125rem; font-weight: 500; }\n .demo-more textarea, .demo-composer textarea { width: 100%; font: inherit; font-size: 1rem; resize: vertical; }\n .demo-more form button { align-self: flex-start; }\n .demo-steps { display: flex; flex-wrap: wrap; gap: .4rem 1rem; list-style: none; padding: 0 !important; margin: .4rem 0 !important; }\n .demo-steps li { display: inline-flex; align-items: center; gap: .4rem; color: var(--so-muted); font-size: .8125rem; margin: 0 !important; }\n .demo-steps li::before { content: \"\"; width: .55rem; height: .55rem; border-radius: 50%; border: 1.5px solid currentColor; }\n .demo-steps li.done { color: var(--so-ink); }\n .demo-steps li.done::before { background: var(--so-success); border-color: var(--so-success); }\n .demo-steps li.now { color: var(--so-ink); font-weight: 600; }\n .demo-steps li.now::before { border-color: var(--so-info); background: var(--so-info); animation: demo-pulse 1.2s ease-in-out infinite; }\n @keyframes demo-pulse { 50% { opacity: .35; } }\n @media (prefers-reduced-motion: reduce) { .demo-steps li.now::before { animation: none; } }\n .demo-state { display: flex; align-items: center; gap: .5rem; margin: 0 !important; }\n .demo-chat .demo-handoff { border-color: var(--so-input-line); }\n .demo-command { margin: .4rem 0 .5rem; padding: .6rem .8rem; border-radius: calc(var(--radius) - 3px); background: var(--so-raised); font: 500 .8125rem/1.5 var(--font-mono); overflow-wrap: anywhere; white-space: pre-wrap; }\n .demo-chat .badge.demo-ready { background: var(--so-info-soft); color: var(--so-info); }\n .demo-chat .badge.demo-complete { background: var(--so-success-soft); color: var(--so-success); }\n .demo-pass { color: var(--so-success); font-weight: 500; }\n .demo-fail { color: var(--so-danger); font-weight: 500; }\n .demo-chat details.demo-evidence { margin: .5rem 0 0; padding: 0; border: 0; border-top: 1px solid var(--so-line); border-radius: 0; background: none; box-shadow: none; }\n .demo-evidence > summary { min-height: 2.5rem; display: list-item; padding-block: .55rem; cursor: pointer; font-weight: 500; font-size: .8125rem; }\n .demo-evidence pre { margin: 0 0 .5rem; max-height: 22rem; overflow: auto; padding: .6rem .75rem; border-radius: .5rem; background: var(--so-raised); font: 400 .75rem/1.55 var(--font-mono); white-space: pre; overflow-wrap: normal; }\n .demo-diff span { display: block; min-width: max-content; }\n .demo-diff-add { background: var(--so-success-soft); color: var(--so-success); }\n .demo-diff-del { background: var(--so-danger-soft); color: var(--so-danger); }\n .demo-diff-hunk, .demo-diff-meta { color: var(--so-muted); }\n .demo-diff-file { font-weight: 600; }\n .demo-evidence figure { margin: 0 0 .5rem; }\n .demo-evidence img { display: block; width: 100%; height: auto; border: 1px solid var(--so-line); border-radius: .5rem; }\n .demo-evidence figcaption { margin-top: .35rem; }\n .demo-hint { padding: 1.25rem 0 .25rem; }\n .demo-hint-title { font-size: .9375rem; font-weight: 600; margin: 0 0 .75rem; }\n .demo-suggestions { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0; }\n .demo-suggestions button { min-height: 2.5rem; border-radius: 999px; padding: .35rem .95rem; }\n .demo-composer { position: sticky; bottom: 0; padding: .75rem 0 .25rem; background: var(--so-paper); flex-direction: row; align-items: flex-end; }\n .demo-chat .demo-composer textarea { flex: 1 1 auto; width: auto; min-width: 0; min-height: 2.75rem; }\n .demo-chat .demo-composer button { flex: none; width: auto; min-height: 2.75rem; padding-inline: 1.1rem; }\n .banner a { color: var(--muted-foreground); }\n .sign-in-banner form { display: inline; margin: 0 0 0 .5rem; padding: 0; border: 0; background: transparent; }\n\n .split { display: grid; grid-template-columns: minmax(250px, 320px) minmax(0, 1fr); min-height: 100vh; }\n .list-pane {\n border-right: 1px solid var(--border); overflow-y: auto; height: 100vh;\n position: sticky; top: 0; padding: 1rem .75rem;\n }\n .list-pane h2 { margin-top: .25rem; }\n .list-pane a.item {\n display: block; padding: .5rem .625rem; border-radius: calc(var(--radius) - 4px);\n text-decoration: none; font-size: .8125rem; margin-bottom: .125rem;\n }\n @media (hover: hover) and (pointer: fine) { .list-pane a.item:hover { background: var(--card); } }\n .list-pane a.item.current { background: var(--muted); }\n .list-pane a.item .t { display: block; font-weight: 500; color: var(--foreground);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .list-pane a.item .m { display: flex; gap: .375rem; align-items: center; color: var(--muted-foreground);\n font-size: .75rem; margin-top: .125rem; }\n .split > .detail { min-width: 0; }\n .split > .detail > main { max-width: 52rem; padding: 1.5rem 2rem 4rem; }\n .split:has(#wb-rail) { grid-template-columns: minmax(320px, 360px) minmax(0, 1fr); }\n .list-pane:has(#wb-rail) { padding: 0; background: var(--background); }\n #wb-rail { padding: 1rem .75rem 1.5rem; }\n #wb-rail-stamp { padding: 0 .75rem; }\n .workbench-mobile-rail, .workbench-mobile-back { display: none; }\n /* The task page (slice 1c): main column beside a rail; one column narrow. */\n .task-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(16rem, 19rem); gap: 0 2rem; align-items: start; }\n /* The task page (task page pass): title, the acts in one row,\n then folding sections; the rail is the property list. */\n .task-identity { overflow-wrap: anywhere; }\n .task-title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-title-row .task-main-title { min-width: 0; margin-bottom: .85rem; }\n .task-view-switch {\n display: inline-grid; grid-template-columns: repeat(2, auto); flex: none; padding: .2rem;\n border: 1px solid var(--glass-border); border-radius: .72rem; background: color-mix(in srgb, var(--glass) 82%, transparent);\n \n }\n .task-view-switch a {\n min-width: 4.6rem; padding: .4rem .72rem; border-radius: .52rem; color: var(--muted-foreground);\n font-size: .72rem; font-weight: 550; text-align: center; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .task-view-switch a:hover { color: var(--foreground); background: color-mix(in srgb, var(--muted) 70%, transparent); } }\n .task-view-switch a.active { color: var(--foreground); background: var(--glass-strong); box-shadow: 0 1px 5px rgb(0 0 0 / .1); }\n .acts-bar { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .75rem 0 .25rem; }\n .acts-bar form.inline { margin: 0; display: inline-flex; align-items: center; gap: .375rem; }\n .acts-bar form.inline button { width: auto; }\n .acts-bar .primary button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .acts-bar .primary button:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .acts-bar .act-hold input[type=text] { width: 10rem; min-height: 2.25rem; margin: 0; font-size: .8125rem; }\n .acts-why { margin: 0 0 .5rem; }\n .dispatch-status { padding: .8rem .9rem; border-radius: var(--radius); overflow: hidden; }\n .dispatch-copy { display: flex; align-items: baseline; flex-wrap: wrap; gap: .2rem .35rem; min-width: 0; }\n .dispatch-copy .meta { min-width: 0; }\n .dispatch-action-link { margin-top: .65rem; }\n .dispatch-status[data-dispatch-status=\"proof-refuted\"],\n .dispatch-status[data-dispatch-status=\"needs-verification\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dispatch-status[data-dispatch-status=\"proof-refuted\"] .dispatch-copy > strong::before,\n .dispatch-status[data-dispatch-status=\"needs-verification\"] .dispatch-copy > strong::before {\n content: \"\"; display: inline-block; width: .45rem; height: .45rem; margin-right: .45rem; border-radius: 50%; vertical-align: .08rem;\n background: var(--so-warning, #ab6400);\n }\n .problem.dispatch-status[data-dispatch-status=\"proof-refuted\"] .dispatch-copy > strong::before { background: var(--destructive); }\n .dispatch-status[data-dispatch-status=\"needs-verification\"] .dispatch-copy > strong::before { background: var(--muted-foreground); }\n /* A review in flight (review fixes): the box reads neutral \u2014 neither the\n green of a settled verdict nor the red of a problem \u2014 with the dot in\n the review's own tone. */\n .dispatch-status[data-work-status=\"reviewing\"], .dispatch-status[data-work-status=\"review-pending\"],\n .dispatch-status[data-work-status=\"review-failed\"], .dispatch-status[data-work-status=\"review-exhausted\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dispatch-status[data-work-status=\"reviewing\"] .dispatch-copy > strong::before, .dispatch-status[data-work-status=\"review-pending\"] .dispatch-copy > strong::before,\n .dispatch-status[data-work-status=\"review-failed\"] .dispatch-copy > strong::before, .dispatch-status[data-work-status=\"review-exhausted\"] .dispatch-copy > strong::before {\n content: \"\"; display: inline-block; width: .45rem; height: .45rem; margin-right: .45rem; border-radius: 50%; vertical-align: .08rem; background: var(--warning);\n }\n .dispatch-status[data-work-status=\"reviewing\"] .dispatch-copy > strong::before { background: var(--running); }\n .review-retry { margin-bottom: .65rem; }\n .task-control { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: .6rem .9rem; margin: .65rem 0; padding: .8rem .9rem; }\n .task-control-copy { display: flex; flex-direction: column; gap: .15rem; min-width: 0; flex: 1 1 16rem; }\n .task-control-copy strong { display: flex; align-items: center; gap: .4rem; overflow-wrap: anywhere; }\n .task-control-copy .meta { overflow-wrap: anywhere; }\n .task-control-form { margin: 0; flex: none; }\n .task-control-button { width: auto; min-width: 7.5rem; white-space: nowrap; }\n .task-control-button.primary { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .task-control-button[disabled] { opacity: .65; cursor: not-allowed; }\n .task-control[data-task-control=\"stopping\"] { border-color: color-mix(in srgb, var(--destructive) 45%, var(--glass-border)); }\n .task-control[data-task-control=\"stopping\"] .live-dot { background: var(--destructive); }\n .task-control[data-task-control=\"paused\"] .eyebrow { color: var(--destructive); }\n .resume-ceremony .row { margin: .3rem 0; }\n @media (max-width: 480px) { .task-control { align-items: stretch; } .task-control-form, .task-control-button { width: 100%; } .task-control-form .task-control-button { width: 100%; } }\n .review-attempts { margin: .55rem 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: .2rem; font-size: .8125rem; }\n .review-attempts li { display: flex; flex-wrap: wrap; align-items: baseline; gap: .2rem .45rem; min-width: 0; }\n .review-attempts .review-attempt-ordinal { font-weight: 600; }\n .review-attempts .meta { min-width: 0; overflow-wrap: anywhere; }\n .review-retry-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .55rem; margin-top: .65rem; }\n .review-retry-actions form.inline { margin: 0; }\n .review-retry-button { width: auto; max-width: 100%; white-space: normal; }\n .review-retry-form .review-retry-button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .review-retry-button[disabled] { opacity: .65; cursor: not-allowed; }\n .proof-review-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .55rem; margin: .65rem 0; }\n .proof-review-actions > .button-link { flex: none; }\n details.proof-exception { margin: 0; }\n details.proof-exception > summary { cursor: pointer; color: var(--muted-foreground); font-size: .78rem; font-weight: 600; }\n details.proof-exception[open] { flex: 1 1 100%; padding: .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--glass); }\n details.proof-exception[open] > summary { margin-bottom: .6rem; color: var(--foreground); }\n .proof-exception-form { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0; }\n .proof-exception-form input { margin: 0; min-width: 12rem; }\n .proof-exception-form button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .dispatch-proof-details { margin: .65rem 0 .85rem; border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass); }\n .dispatch-proof-details > summary { padding: .75rem .9rem; cursor: pointer; color: var(--muted-foreground); font-size: .78rem; font-weight: 600; }\n .dispatch-proof-body { padding: 0 .9rem .85rem; border-top: 1px solid var(--glass-border); }\n details.dispatch-recovery { margin-top: .65rem; border: 0; padding: 0; background: transparent; box-shadow: none; }\n details.dispatch-recovery > summary {\n display: inline-flex; align-items: center; min-height: 2.25rem; padding: 0 .875rem; list-style: none;\n border: 1px solid var(--primary); border-radius: calc(var(--radius) - 2px); cursor: pointer;\n background: var(--primary); color: var(--primary-foreground); font-size: .8125rem; font-weight: 600;\n }\n details.dispatch-recovery > summary::-webkit-details-marker { display: none; }\n .dispatch-recovery-body { margin-top: .65rem; padding: .7rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--glass); color: var(--foreground); }\n .dispatch-recovery-body p { margin: 0; }\n .dispatch-recovery-body p + p { margin-top: .5rem; }\n .dispatch-recovery-command { display: block; margin-top: .45rem; padding: .55rem .65rem; overflow-wrap: anywhere; border-radius: .5rem; background: var(--muted); }\n .dispatch-status[data-dispatch-status=\"no-worker-registered\"],\n .dispatch-status[data-dispatch-status=\"no-worker-online\"] {\n color: var(--foreground); border-color: color-mix(in srgb, var(--warning) 30%, var(--border));\n background: color-mix(in srgb, var(--warning-soft) 48%, var(--glass));\n }\n .dispatch-status[data-dispatch-status=\"no-worker-registered\"] .dispatch-copy > strong,\n .dispatch-status[data-dispatch-status=\"no-worker-online\"] .dispatch-copy > strong { color: color-mix(in srgb, var(--warning) 72%, var(--foreground)); }\n .builder-notice { border-color: color-mix(in srgb, var(--warning) 30%, var(--border)); background: color-mix(in srgb, var(--warning-soft) 48%, var(--glass)); }\n .builder-notice strong { color: color-mix(in srgb, var(--warning) 72%, var(--foreground)); }\n .dispatch-status[data-dispatch-status=\"terminal-dependency\"] {\n color: var(--foreground); border-color: color-mix(in srgb, var(--warning) 42%, var(--border));\n background: color-mix(in srgb, var(--warning-soft) 72%, var(--glass));\n }\n .dispatch-status[data-dispatch-status=\"terminal-dependency\"] .dispatch-copy > strong { color: var(--warning); }\n .dispatch-status[data-dispatch-status=\"waiting-dependency\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dependency-repair-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .45rem; margin-top: .7rem; }\n .dependency-repair-help { flex: 1 0 100%; margin: 0 0 .1rem; }\n .dependency-repair-actions form { display: inline-flex; align-items: center; gap: .4rem; min-width: 0; max-width: 100%; margin: 0; }\n .dependency-repair-label { flex: 1 1 16rem; min-width: 0; margin: 0; color: var(--foreground); font-size: .75rem; }\n .dependency-repair-label select { display: block; margin: .3rem 0 0; }\n .dependency-repair-actions select { width: auto; max-width: 16rem; min-height: 2rem; margin: 0; font-size: .75rem; }\n .dependency-repair-actions button { min-height: 2rem; padding: .3rem .65rem; font-size: .75rem; }\n .approve-form { margin: .75rem 0; }\n .approve-form .ceremony-head { display: flex; align-items: baseline; justify-content: space-between; gap: .75rem; margin: 0 0 .5rem; }\n .approve-form .ceremony-head a { font-size: .8125rem; color: var(--muted-foreground); white-space: nowrap; }\n .approve-form .recap { margin: .125rem 0 .5rem; }\n .approval-card { padding: 1.2rem 1.3rem; border-radius: calc(var(--radius) + 3px); }\n .approval-card .ceremony-head { align-items: flex-start; padding-bottom: .85rem; border-bottom: 1px solid var(--glass-border); }\n .approval-title { display: grid; gap: .15rem; }\n .approval-kicker { color: var(--muted-foreground); font: 500 .66rem/1.3 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .approval-title strong { font-size: 1.05rem; letter-spacing: -.02em; }\n .approval-label { display: block; margin: .9rem 0 .2rem; color: var(--muted-foreground); font: 500 12px/1.4 var(--font-sans); }\n .approval-label::first-letter, .planner-plan .eyebrow::first-letter { text-transform: uppercase; }\n .planner-plan .eyebrow { font: 500 12px/1.4 var(--font-sans); letter-spacing: 0; text-transform: none; }\n .approval-goal { margin: 0; font-size: 1rem; line-height: 1.55; white-space: pre-wrap; }\n .approval-boundaries { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; margin-top: .75rem; }\n .approval-boundary { padding: .7rem .8rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); }\n .approval-boundary .approval-label { margin: 0 0 .2rem; }\n .approval-boundary p { margin: 0; color: var(--muted-foreground); font-size: .8rem; overflow-wrap: anywhere; }\n .approval-chips { display: flex; flex-wrap: wrap; gap: .4rem; margin: .8rem 0 .3rem; }\n /* The filed contract (contract handoff, task 1): preserved, amended, or\n drafted from nothing \u2014 the same panel on the task page, in the\n ceremony, and on /next, so an amendment is never a surprise after the\n yes. An amendment is the one state that asks for a second look. */\n .contract-panel { margin-top: .8rem; padding: .7rem .85rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); }\n .contract-panel .approval-label { margin: 0 0 .25rem; }\n .contract-panel p { margin: .2rem 0; }\n .contract-amended { border-color: color-mix(in srgb, var(--warning, #c98a1b) 55%, var(--glass-border)); background: color-mix(in srgb, var(--warning, #c98a1b) 9%, transparent); }\n .contract-reason { font-size: .9rem; }\n .contract-changes { margin: .5rem 0 0; padding-left: 1.1rem; display: grid; gap: .45rem; }\n .contract-changes li { overflow-wrap: anywhere; }\n .contract-change-kind { display: inline-block; margin-right: .3rem; padding: .05rem .4rem; border-radius: 999px; font: 600 .62rem/1.5 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; background: color-mix(in srgb, var(--muted) 70%, transparent); }\n .contract-change-added { background: color-mix(in srgb, var(--success, #2f9e5f) 18%, transparent); }\n .contract-change-removed { background: color-mix(in srgb, var(--danger, #c8453d) 18%, transparent); }\n .contract-change-changed { background: color-mix(in srgb, var(--warning, #c98a1b) 22%, transparent); }\n .contract-before, .contract-after { margin-top: .15rem; font-size: .85rem; }\n .contract-before { color: var(--muted-foreground); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--muted-foreground) 55%, transparent); }\n .contract-note { margin-top: .5rem; }\n /* The agents (v47): one compact summary, rendered identically on the task\n page, in the approval ceremony, and in the focused chat; reasons and\n change controls stay closed until asked for. */\n .agents-card { margin-top: .75rem; }\n .agents-head { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem .6rem; }\n .agents-head h3 { margin: 0; font-size: .95rem; letter-spacing: -.02em; }\n .agents-badges { display: flex; flex-wrap: wrap; gap: .3rem; }\n .agents-summary { margin: .55rem 0 0; font-size: .86rem; line-height: 1.5; overflow-wrap: anywhere; }\n .agents-availability-label { margin: .6rem 0 .15rem; }\n .agents-availability { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .25rem .9rem; font-size: .8125rem; }\n .agents-availability li { overflow-wrap: anywhere; }\n .agents-availability-unavailable { color: var(--destructive); font-weight: 600; }\n .agents-availability-ready { color: var(--success); }\n .agents-availability-unknown { color: var(--muted-foreground); }\n .agents-halted { margin: .6rem 0 0; padding: .55rem .7rem; border: 1px solid color-mix(in srgb, var(--destructive) 40%, var(--border)); border-radius: calc(var(--radius) - 3px); background: var(--destructive-soft); font-size: .8rem; }\n .agents-problems { margin: .5rem 0 0; padding-left: 1.1rem; color: var(--destructive); font-size: .78rem; }\n .agents-why, .agents-change { margin-top: .65rem; }\n .agents-why > summary, .agents-change > summary { display: flex; align-items: center; min-height: 2.75rem; padding: .35rem .2rem; cursor: pointer; font-size: .8rem; font-weight: 600; }\n .agents-demands { margin: .35rem 0 0; padding-left: 1.1rem; color: var(--muted-foreground); font-size: .76rem; line-height: 1.45; }\n .agents-roles { display: grid; grid-template-columns: 5rem minmax(0, 1fr); gap: .45rem .6rem; margin: .5rem 0 0; }\n .agents-roles dt { color: var(--muted-foreground); font: 500 .66rem/1.8 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .agents-roles dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\n .agents-roles .agents-reasons { margin: .2rem 0 0; padding-left: 1rem; color: var(--muted-foreground); font-size: .74rem; line-height: 1.45; }\n .agents-form { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .5rem; align-items: end; margin: 0; }\n .agents-form label, .agents-form-risk label { display: grid; gap: .2rem; margin: 0; min-width: 0; font-size: .74rem; }\n .agents-form input, .agents-form select, .agents-form-risk select { width: 100%; min-width: 0; min-height: 2.75rem; }\n .agents-form button, .agents-form-risk button, .agents-clear button { min-height: 2.75rem; }\n .agents-form-risk { display: flex; flex-wrap: wrap; align-items: end; gap: .5rem; margin-top: .5rem; }\n .agents-form-risk label.agents-risky { display: flex; align-items: center; gap: .4rem; min-height: 2.75rem; font-size: .85rem; }\n .agents-overrides { list-style: none; margin: .5rem 0 0; padding: 0; display: grid; gap: .35rem; font-size: .78rem; }\n .agents-overrides li { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .4rem .6rem; }\n .agents-clear { margin: 0; }\n .agents-clear button { padding-inline: .8rem; font-size: .72rem; }\n .agents-ceremony { margin: .5rem 0 0; }\n .agents-ceremony .agents-badges { margin-top: .35rem; }\n .agents-risk-line { margin: .4rem 0 0; }\n .agents-runtime { margin-top: .5rem; }\n .agents-runtime > summary { display: flex; align-items: center; min-height: 2.75rem; padding: .35rem .2rem; cursor: pointer; font-size: .8rem; font-weight: 600; }\n .agents-risk-guide { display: grid; gap: .3rem; margin: .5rem 0 0; font-size: .76rem; line-height: 1.45; }\n .agents-risk-guide div { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: .5rem; }\n .agents-risk-guide dt { color: var(--muted-foreground); font: 500 .66rem/1.8 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .agents-risk-guide dd { margin: 0; color: var(--muted-foreground); overflow-wrap: anywhere; }\n .agents-role-forms { display: grid; gap: .45rem; margin-top: .6rem; }\n .agents-role-row { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: .5rem; align-items: center; }\n .agents-role-name { color: var(--muted-foreground); font: 500 .66rem/1.8 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .task-chat-agents { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .55rem; margin: .1rem 0 .2rem; padding: .55rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); font-size: .78rem; line-height: 1.45; overflow-wrap: anywhere; }\n .task-chat-agents a { white-space: nowrap; }\n .task-chat-agents-aside { margin-top: .85rem; }\n .task-chat-agents-aside .agents-summary { font-size: .74rem; }\n .task-chat-agents-aside .agents-badges { margin-top: .35rem; }\n .task-chat-agents-aside .agents-roles { grid-template-columns: 1fr; }\n .approval-chip { padding: .25rem .6rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: var(--glass); font-size: .7rem; }\n .approval-confirm { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .75rem; align-items: end; margin-top: .9rem; padding-top: .8rem; border-top: 1px solid var(--glass-border); }\n .approval-confirm label { margin: 0; }\n .approval-card .approval-confirm button { min-height: 44px; white-space: nowrap; }\n /* The ceremony's orientation and exact-terms group (UI polish 2026-09-13). */\n /* Neutral by law: magenta belongs to the count and the approve act alone. */\n .approval-orient { margin: .85rem 0 .25rem; }\n .approval-terms { scroll-margin-top: 5rem; }\n .approval-confirm { scroll-margin-top: 5rem; }\n .approval-paths { margin: 0; padding: 0; list-style: none; display: grid; gap: .15rem; }\n .approval-paths li { color: var(--muted-foreground); font-size: .8rem; overflow-wrap: anywhere; }\n /* The approval sheet (approval critique, Oct 2): the plan open in plain\n rows, who builds in one line, one Approve & start beside the password,\n and every other signed term in one Details fold at the end. Sentence\n case, Geist, 12px and up; prose capped at 75ch. */\n .approval-sheet { display: grid; gap: 16px; margin: 0; padding: 20px; border: 1px solid var(--border); border-radius: 10px; background: var(--card); }\n .approval-sheet.approve-form > :not(input) { margin: 0; }\n .approval-sheet-title { margin: 0; font-size: 15px; font-weight: 600; line-height: 1.4; letter-spacing: -.01em; }\n .approval-revision, .approval-note, .approval-race { max-width: 75ch; font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }\n .approval-note { color: var(--muted-foreground); }\n .approval-rows { display: grid; gap: 14px; margin: 0; }\n .approval-row { display: grid; grid-template-columns: 7.5rem minmax(0, 1fr); gap: 16px; }\n .approval-row dt { margin: 0; color: var(--muted-foreground); font-size: 13px; font-weight: 500; line-height: 1.6; }\n .approval-row dd { min-width: 0; max-width: 75ch; margin: 0; font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }\n .approval-row dd p, .approval-sheet .approval-goal { margin: 0; font-size: 14px; line-height: 1.6; }\n .approval-row dd :is(ol, ul) { display: grid; gap: 4px; margin: 0; padding-left: 1.25rem; }\n .approval-row dd ol + p { margin-top: 6px; }\n .approval-row dd .approval-paths { margin-top: 2px; padding-left: 0; }\n .approval-row dd .approval-paths li { font-size: 13px; }\n .approval-amendment { max-width: 75ch; padding: 12px 14px; border-radius: 8px; background: var(--muted); font-size: 14px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-amendment p { margin: 0; }\n .approval-amendment ul { display: grid; gap: 4px; margin: 6px 0; padding-left: 1.25rem; }\n .agents-size { margin: 0; font-size: 13px; line-height: 1.5; }\n .approval-who { max-width: 75ch; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-act { display: grid; grid-template-columns: minmax(0, 20rem) auto; justify-content: start; align-items: center; gap: 8px; }\n .approval-password { margin: 0; }\n .approval-act input[type=password] { margin: 0; font-family: var(--font-sans); }\n .approval-act button { margin: 0; min-height: 2.125rem; white-space: nowrap; }\n .approval-after { max-width: 75ch; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-allowing, .approval-you-check { max-width: 75ch; font-size: 14px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-sheet .approval-allowing + .approval-you-check { margin-top: -10px; }\n .approval-act > button { grid-column: 2; grid-row: 1; }\n .approval-password-note { grid-column: 1; grid-row: 2; margin: 0; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-secondary { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n details.approval-edit, details.approval-edit[open] { margin: 0; padding: 0; border: 0; border-radius: 0; background: none; }\n /* Edit plan, in place: the rows become fields where they stood; the\n approval act and Details step aside until it is saved or cancelled. */\n .approval-sheet { position: relative; }\n .approval-edit > summary { list-style: none; cursor: pointer; }\n .approval-edit > summary::-webkit-details-marker { display: none; }\n .approval-edit-close, .approval-edit[open] .approval-edit-open { display: none; }\n .approval-edit[open] .approval-edit-close { display: inline; }\n .approval-edit[open] > summary { position: absolute; top: 14px; right: 20px; }\n .approval-sheet:has(.approval-edit[open]) > :not(.approval-sheet-title, .approval-secondary) { display: none; }\n .approval-secondary:has(> .approval-edit[open]) { display: block; }\n .approval-secondary:has(> .approval-edit[open]) > a { display: none; }\n .approval-editor { display: grid; gap: 14px; }\n .approval-editor .problem { margin: 0; }\n .approval-field { display: grid; gap: 4px; min-width: 0; margin: 0; padding: 0; border: 0; }\n .approval-field-label { padding: 0; color: var(--muted-foreground); font-size: 13px; font-weight: 500; line-height: 1.6; }\n .approval-field-hint { color: var(--muted-foreground); font-size: 12px; line-height: 1.5; }\n .approval-field textarea, .approval-field input[type=text] { width: 100%; max-width: 75ch; margin: 0; font-family: var(--font-sans); font-size: 14px; line-height: 1.55; }\n .approval-requirements { display: grid; gap: 6px; margin: 2px 0 0; padding: 0; list-style: none; }\n .approval-edit-act { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n .approval-edit-act button { margin: 0; min-height: 2.125rem; white-space: nowrap; }\n .approval-link { display: inline-flex; align-items: center; min-height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--card); color: var(--foreground); font-size: 13px; font-weight: 500; text-decoration: none; }\n .approval-secondary > .approval-link:not(:first-child) { border-color: transparent; background: none; color: var(--muted-foreground); }\n @media (hover: hover) and (pointer: fine) { .approval-link:hover { background: var(--muted); color: var(--foreground); } }\n details.approval-details { margin: 0; padding: 0; border: 0; border-top: 1px solid var(--border); border-radius: 0; background: none; }\n details.approval-details[open] { padding-bottom: 0; }\n .approval-details > summary { display: flex; align-items: center; min-height: 40px; padding: 4px 0 0; font-size: 13px; }\n .approval-detail { max-width: 75ch; margin: 12px 0 0; font-size: 13px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-detail h3 { margin: 0 0 4px; font-size: 13px; font-weight: 600; letter-spacing: 0; text-transform: none; }\n .approval-detail p, .approval-detail ul, .approval-detail dl { margin: 4px 0; }\n .approval-detail ul { padding-left: 1.25rem; }\n .approval-detail .revision-card { margin: 0; padding: 0; border: 0; background: none; }\n .approval-roles { display: grid; gap: 8px; }\n .approval-roles > div { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: 12px; }\n .approval-roles dt { color: var(--muted-foreground); font-weight: 500; }\n .approval-roles dd { margin: 0; }\n .approval-roles dd ul { margin: 2px 0 0; color: var(--muted-foreground); }\n .chat-plan .approval-sheet { padding: 0; border: 0; background: none; }\n @media (max-width: 760px) {\n .approval-sheet { gap: 12px; padding: 14px; }\n .approval-row { grid-template-columns: 1fr; gap: 2px; }\n .approval-act { grid-template-columns: 1fr; }\n .approval-act > button, .approval-password-note { grid-column: auto; grid-row: auto; }\n .approval-act input[type=password], .approval-act button { min-height: 44px; font-size: 16px; }\n .approval-act button { width: 100%; }\n /* The one act stays under the thumb: sticky at the bottom, clear of the home indicator. */\n .approval-sheet[data-sticky] .approval-act {\n position: sticky; bottom: 0; z-index: 20; margin: 0 -14px; padding: 10px 14px calc(10px + env(safe-area-inset-bottom, 0px));\n border-top: 1px solid var(--border); background: var(--card);\n }\n .approval-link { min-height: 44px; padding: 0 16px; }\n .approval-edit[open] > summary { top: 6px; right: 6px; }\n .approval-field textarea, .approval-field input[type=text] { font-size: 16px; }\n .approval-edit-act button { width: 100%; min-height: 44px; font-size: 16px; }\n .approval-details > summary { min-height: 44px; }\n .approval-roles > div { grid-template-columns: 1fr; gap: 2px; }\n }\n .run-facts-details { margin-top: 1.25rem; }\n .run-facts-details > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; }\n .run-facts-details > summary .meta { font-size: .75rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .task-main-title, .chat-project-name strong, .proposal h3 { overflow-wrap: anywhere; }\n .planner-plan { margin-top: .75rem; padding: 1.15rem 1.2rem; overflow: hidden; background: color-mix(in srgb, var(--glass) 82%, transparent); }\n .execution-plan-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; margin-bottom: .95rem; }\n .execution-plan-head h2 { margin: .15rem 0 0; font-size: 1.05rem; letter-spacing: -.025em; }\n .execution-plan-head p { margin: .25rem 0 0; max-width: 38rem; }\n details.planner-plan-collapsed { padding: 0; }\n .planner-plan-collapsed > summary.execution-plan-head {\n position: relative; list-style: none; align-items: center; min-height: 4.25rem; margin: 0; padding: .9rem 3rem .9rem 1.1rem; cursor: pointer;\n }\n .planner-plan-collapsed > summary::-webkit-details-marker { display: none; }\n .planner-plan-collapsed > summary::after {\n content: \"\"; position: absolute; right: 1.2rem; top: 50%; width: .45rem; height: .45rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: translateY(-65%) rotate(45deg); transition: transform .15s ease;\n }\n .planner-plan-collapsed[open] > summary::after { transform: translateY(-35%) rotate(225deg); }\n .planner-plan-collapsed[open] > summary { border-bottom: 1px solid var(--glass-border); }\n .planner-plan-body { padding: 1rem 1.15rem 1.15rem; }\n .plan-lock { flex: none; padding: .3rem .6rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 50%, transparent); font-size: .7rem; }\n .execution-plan { display: grid; gap: .75rem; }\n .execution-plan p { margin: .2rem 0 0; line-height: 1.55; white-space: pre-wrap; }\n .execution-plan ol, .execution-plan ul { display: grid; gap: .45rem; margin: .35rem 0 0; padding-left: 1.3rem; }\n .execution-plan li { padding-left: .15rem; line-height: 1.45; overflow-wrap: anywhere; }\n .execution-milestones { padding: .85rem .9rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--muted) 36%, transparent); }\n .execution-milestones li::marker { color: var(--muted-foreground); font: 500 .7rem var(--font-mono); }\n .execution-support { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .65rem; }\n .execution-support > div, .execution-proof { padding: .8rem .85rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass) 74%, transparent); }\n .execution-proof li::marker { content: \"\u2713 \"; color: var(--running); }\n .execution-plan-compact { gap: .55rem; margin-top: .4rem; }\n .execution-plan-compact .execution-support { grid-template-columns: 1fr; }\n .plan-editor { margin-top: .9rem; padding-top: .75rem; border-top: 1px solid var(--glass-border); }\n .plan-editor > summary { width: fit-content; color: var(--muted-foreground); cursor: pointer; font-size: .8rem; font-weight: 600; }\n .plan-editor form { margin-top: .7rem; }\n .plan-editor textarea { width: 100%; font-family: var(--font-mono); font-size: .75rem; line-height: 1.55; }\n .milestone-progress-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .milestone-progress-head h2 { margin: .15rem 0 0; }\n .milestone-progress-count { flex: none; padding: .28rem .58rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 45%, transparent); font-size: .7rem; font-weight: 600; }\n .milestone-list { list-style: none; margin: .75rem 0 0; padding: 0; display: grid; gap: .4rem; }\n .milestone { display: flex; align-items: baseline; gap: .5rem; padding: .5rem .65rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass) 74%, transparent); overflow-wrap: anywhere; }\n .milestone-badge { display: inline-flex; align-items: center; gap: .35rem; flex: none; padding: .08rem .45rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 36%, transparent); font-size: .67rem; font-weight: 600; letter-spacing: .01em; }\n .milestone-badge::before { content: \"\"; width: .38rem; height: .38rem; border-radius: 999px; background: color-mix(in srgb, var(--muted-foreground) 55%, transparent); }\n .milestone-current .milestone-badge { color: var(--foreground); }\n .milestone-current .milestone-badge::before { background: var(--running); box-shadow: 0 0 0 2px color-mix(in srgb, var(--running) 13%, transparent); }\n .milestone-completed .milestone-badge::before { background: var(--success, var(--running)); }\n .milestone-blocked .milestone-badge::before { background: var(--warning); }\n .milestone-progress-note { margin: .7rem .1rem 0; }\n .plan-revision-pending { margin-top: .85rem; padding: .85rem .9rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--running-soft) 30%, transparent); }\n .plan-revision-pending h3 { margin: .15rem 0 .35rem; font-size: 1rem; letter-spacing: -.02em; }\n .plan-revision-pending > p { margin: .3rem 0; }\n .plan-revision-pending form { margin-top: .6rem; display: inline-flex; gap: .4rem; align-items: center; }\n .plan-revision-pending form + form { margin-left: .5rem; }\n .plan-revision > h2 { margin: .15rem 0 .35rem; color: var(--foreground); font-size: 1rem; letter-spacing: -.02em; }\n .plan-revision > p.meta { margin-top: 0; }\n .plan-revision-history { margin-top: .85rem; }\n .plan-revision-history > summary { cursor: pointer; color: var(--muted-foreground); font-size: .8rem; font-weight: 600; }\n .planner-status { display: flex; gap: .8rem; align-items: flex-start; }\n .planner-orb { position: relative; flex: 0 0 2.15rem; width: 2.15rem; height: 2.15rem; border-radius: .75rem; background: var(--running-soft); }\n .planner-orb::after { content: \"\"; position: absolute; inset: .65rem; border-radius: 999px; background: var(--running); animation: pulse 1.25s ease-in-out infinite; }\n .planner-status p { margin: 0; }\n .planner-status .meta { display: block; margin-top: .2rem; }\n .ceremony-road { margin: .75rem 0 0; }\n .button-link {\n display: inline-flex; align-items: center; justify-content: center; min-height: 2.25rem; padding: 0 .875rem;\n border-radius: calc(var(--radius) - 2px); background: var(--primary); color: var(--primary-foreground);\n font-weight: 600; font-size: .8125rem; text-decoration: none; border: 1px solid var(--primary);\n }\n .props .row { padding: .4375rem .375rem; align-items: baseline; }\n .props .row .meta { flex: 0 0 6.5rem; }\n .props .row .mono { flex: 1 1 10rem; min-width: 0; overflow-wrap: anywhere; }\n .props .row .seal { margin-right: .375rem; }\n details.section { border: 0; background: transparent; padding: 0; margin: 1.25rem 0 0; border-radius: 0; box-shadow: none; }\n details.section[open] { padding-bottom: 0; }\n details.section > summary { list-style: none; display: flex; align-items: center; padding: .25rem 0; min-height: 2.25rem; }\n details.section > summary::-webkit-details-marker { display: none; }\n details.section > summary h2 { margin: 0; flex: 1; display: flex; align-items: center; gap: .4rem; }\n details.section > summary h2 .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; font-weight: 500; color: var(--muted-foreground); font-size: .6875rem; }\n details.section > summary::after {\n content: \"\"; width: .45rem; height: .45rem; flex: none; margin-right: .375rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.125rem); transition: transform .15s;\n }\n details.section[open] > summary::after { transform: rotate(225deg) translateY(-.125rem); }\n @media (hover: hover) and (pointer: fine) { details.section > summary:hover h2 { color: var(--foreground); } }\n details.more-agents { margin: .75rem 0 0; }\n .task-layout > .task-main { min-width: 0; }\n .task-rail { position: sticky; top: 1rem; }\n .task-rail .card { margin-top: .75rem; }\n .task-rail .mono { overflow-wrap: anywhere; }\n main:has(.task-layout) { max-width: 76rem; }\n @media (max-width: 980px) {\n .task-layout { grid-template-columns: 1fr; }\n .cockpit { grid-template-columns: 1fr; }\n .cockpit-queue { position: static; padding-bottom: .75rem; margin-bottom: .5rem; border-bottom: 1px solid var(--border); }\n .cockpit-queue-list { max-height: 15rem; }\n .task-rail { position: static; order: -1; border-bottom: 1px solid var(--border); padding-bottom: .75rem; margin-bottom: .75rem; }\n .acts-bar form.inline, .acts-bar .primary, .acts-bar .primary form { flex: 1 1 auto; }\n .acts-bar .primary { flex-basis: 100%; }\n .acts-bar .primary button { width: 100%; }\n .acts-bar .act-hold { flex-wrap: wrap; }\n .acts-bar .act-hold input[type=text] { flex: 1 1 8rem; width: auto; }\n .dependency-repair-actions { align-items: stretch; }\n .dependency-repair-actions form { flex: 1 1 10rem; }\n .dependency-repair-actions .dependency-repair-replace { flex-basis: 100%; }\n .dependency-repair-actions select { flex: 1 1 auto; min-width: 0; max-width: none; }\n .dependency-repair-actions button { white-space: nowrap; }\n .split { grid-template-columns: 1fr; }\n .list-pane { display: none; }\n .workbench-mobile-rail, .workbench-mobile-back { display: block; }\n .workbench-mobile-rail { margin-top: 1.75rem; border-top: 1px solid var(--border); padding-top: .75rem; }\n .workbench-mobile-back { margin: 0 0 1rem; }\n }\n @media (max-width: 620px) {\n .planner-plan { padding: 1rem; }\n details.planner-plan-collapsed { padding: 0; }\n .planner-plan-collapsed > summary.execution-plan-head { padding: .8rem 2.5rem .8rem .9rem; }\n .planner-plan-collapsed > summary .plan-lock { display: none; }\n .planner-plan-body { padding: .85rem .9rem 1rem; }\n .execution-plan-head { flex-direction: column; align-items: flex-start; gap: .55rem; }\n .execution-support { grid-template-columns: 1fr; }\n .plan-lock { white-space: nowrap; }\n .milestone-progress-head { align-items: center; }\n .milestone-progress-count { padding-inline: .48rem; }\n .milestone { align-items: flex-start; padding: .55rem; }\n .plan-revision-pending form { display: flex; width: 100%; }\n .plan-revision-pending form + form { margin-left: 0; margin-top: .4rem; }\n .plan-revision-pending button { width: 100%; }\n }\n\n /* Work (workspace package 1): a quiet list of rows and dividers, never\n another grid of cards. The status line is the same component every\n surface renders for a run \u2014 a small dot in the tone, neutral words. */\n .work-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n .work-head h1 { margin-bottom: .25rem; }\n .work-tools { display: none; position: relative; flex: none; margin: .25rem 0 0; border: 0; padding: 0; background: none; border-radius: 0; }\n .app.sidebar-collapsed .work-tools { display: block; }\n .work-tools > summary {\n list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .3rem;\n min-height: 2.25rem; padding: 0 .75rem; border: 1px solid var(--border); border-radius: 999px;\n font-size: .8125rem; font-weight: 500; color: var(--foreground); background: var(--card);\n }\n .work-tools > summary::-webkit-details-marker { display: none; }\n .work-tools > summary .chevron { width: .875rem; height: .875rem; }\n .work-tools[open] > summary .chevron { transform: rotate(180deg); }\n .work-tools-menu {\n position: absolute; right: 0; top: calc(100% + .375rem); z-index: 20; min-width: 11rem; max-width: calc(100vw - 2rem);\n display: flex; flex-direction: column; padding: .375rem; border: 1px solid var(--border); border-radius: calc(var(--radius) - 2px);\n background: var(--card); box-shadow: var(--shadow);\n }\n .work-tools-menu a { display: block; padding: .5rem .625rem; border-radius: .5rem; text-decoration: none; color: var(--foreground); font-size: .875rem; }\n @media (hover: hover) and (pointer: fine) { .work-tools-menu a:hover { background: var(--muted); } }\n /* The result panel (workspace package 3): one presentation of a finished\n result for the run page, the review cockpit, and the chat's result\n detail \u2014 the deliverable first, problems ahead of readiness words,\n three local views, and Request changes beside it. */\n .result-panel { position: relative; padding: 1.1rem 1.2rem 1rem; min-width: 0; }\n .result-back { margin: 0 0 .4rem; font-size: .8125rem; }\n /* A comfortable target at every width (repair 2026-09-14): 44px tall. */\n .result-back a { display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0 .35rem; margin-left: -.35rem; border-radius: .375rem; text-decoration: none; font-weight: 550; }\n .result-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; }\n .result-head h2 { margin: .15rem 0 0; font-size: 1.15rem; }\n .result-head .eyebrow { overflow-wrap: anywhere; }\n .result-head .status-line { flex: none; font-size: .8125rem; }\n .result-summary { max-width: 46rem; margin: .6rem 0 0; font-size: .95rem; line-height: 1.5; }\n .result-action { margin: .7rem 0 0; }\n .result-action form { margin: 0; }\n .result-action .button-link { min-height: 2.5rem; gap: .35rem; }\n .result-action .button-link .meta { color: inherit; opacity: .78; font-weight: 500; }\n .result-notes, .result-details, .result-notes[open], .result-details[open] { margin: .6rem 0 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .result-notes > summary, .result-details > summary {\n list-style: none; cursor: pointer; display: flex; align-items: center; gap: .5rem; min-height: 2.5rem; padding: 0 .25rem; margin: 0 -.25rem;\n border-radius: .375rem; font-size: .8125rem; font-weight: 550; color: var(--muted-foreground);\n }\n .result-notes > summary::-webkit-details-marker, .result-details > summary::-webkit-details-marker { display: none; }\n .result-notes > summary::before, .result-details > summary::before { content: \"\u25B8\"; }\n .result-notes[open] > summary::before, .result-details[open] > summary::before { content: \"\u25BE\"; }\n @media (hover: hover) and (pointer: fine) { .result-notes > summary:hover, .result-details > summary:hover { color: var(--foreground); } }\n .result-details > summary .meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--font-mono); font-size: .68rem; font-weight: 400; }\n .result-notes .recap { margin: .25rem 0 .4rem; font-size: .875rem; }\n .result-attention { margin: .75rem 0 .25rem; padding: .7rem .85rem; border-left: 1px solid var(--warning); border-radius: 0 calc(var(--radius) - 3px) calc(var(--radius) - 3px) 0; background: var(--warning-soft); font-size: .8125rem; }\n .result-attention strong { display: block; font-size: .78rem; }\n .result-you-check { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem .75rem; margin: .75rem 0; padding: .65rem .85rem; border-radius: calc(var(--radius) - 3px); background: var(--muted); font-size: .8125rem; }\n .result-you-check ul { flex: 1 1 14rem; min-width: 0; margin: 0; padding: 0; list-style: none; }\n .result-you-check form { margin: 0; }\n .result-attention ul { margin: .3rem 0 0; padding-left: 1.15rem; }\n .result-attention li { margin: .15rem 0; overflow-wrap: anywhere; }\n .result-tabs { display: flex; gap: .25rem; margin: .9rem 0 .75rem; border-bottom: 1px solid var(--border); overflow-x: auto; scrollbar-width: none; }\n .result-tabs::-webkit-scrollbar { display: none; }\n .result-tabs a {\n display: inline-flex; align-items: center; gap: .4rem; flex: none; min-height: 2.5rem; padding: 0 .625rem;\n margin-bottom: -1px; border-bottom: 2px solid transparent; text-decoration: none;\n color: var(--muted-foreground); font-size: .875rem; font-weight: 500;\n }\n .result-tabs a .count { font-family: var(--font-mono); font-size: .6875rem; font-variant-numeric: tabular-nums; color: var(--muted-foreground); }\n .result-tabs a[aria-selected=\"true\"] { color: var(--foreground); border-bottom-color: var(--foreground); }\n .result-tabs a[aria-selected=\"true\"] .count { color: var(--foreground); }\n .result-view { min-width: 0; }\n .result-view[hidden] { display: none; }\n .result-visuals { margin-top: .25rem; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); }\n .result-unavailable { margin: .5rem 0 0; padding-left: 1.15rem; font-size: .78rem; }\n .result-changes { margin: .25rem 0 .5rem; padding-left: 1.15rem; font-size: .875rem; }\n .result-changes li { margin: .2rem 0; overflow-wrap: anywhere; }\n .result-files li, .result-files .mono { overflow-wrap: anywhere; white-space: normal; }\n .result-files li { min-width: 0; }\n .result-section[data-cockpit-source=\"reviewer\"] li { overflow-wrap: anywhere; }\n @media (max-width: 760px) { .result-panel .pick-file, .result-panel .pick-line, .diff-modes button { min-height: 44px; min-width: 44px; white-space: nowrap; } }\n .result-files-lead { margin: .25rem 0 .5rem; font-size: .8125rem; overflow-wrap: anywhere; }\n .result-report h3 { margin: .2rem 0 .3rem; font-size: 1rem; }\n .result-report .plan-doc { max-height: 28rem; overflow: auto; }\n .result-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: .5rem; margin: .4rem 0 0; }\n .result-facts > div { min-width: 0; padding: .6rem .7rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 64%, transparent); }\n .result-facts dt { color: var(--muted-foreground); font: 500 .75rem/1.3 var(--font-sans); }\n .result-facts dd { margin: .2rem 0 0; font-size: .78rem; line-height: 1.4; overflow-wrap: anywhere; }\n .result-facts dd p { margin: 0; }\n .result-facts dd form { margin: .35rem 0 0; }\n .result-stat { margin: .2rem 0 .4rem; }\n .result-files { margin: .4rem 0 .6rem; }\n .result-label { display: block; margin: .5rem 0 .25rem; font: 600 .6875rem/1.3 var(--font-mono); color: var(--muted-foreground); letter-spacing: .06em; text-transform: uppercase; }\n .result-verdict { align-items: center; }\n .result-verdict > .meta { min-width: 0; overflow-wrap: anywhere; }\n .result-request { margin-top: 1.1rem; padding-top: .9rem; border-top: 1px solid var(--border); }\n .result-request h3 { margin: 0 0 .5rem; font-size: .8rem; letter-spacing: .02em; text-transform: uppercase; color: var(--muted-foreground); }\n .result-request .diff-comment-form { margin: .5rem 0 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .result-request .diff-comment-form textarea { width: 100%; box-sizing: border-box; }\n .result-pin, .result-pin[open] { margin: 0; padding: 0 .2rem; border: 0; background: none; }\n .result-pin > summary { min-height: 2.25rem; display: flex; align-items: center; flex-wrap: wrap; gap: .35rem; font-size: .78rem; font-weight: 550; cursor: pointer; list-style: none; }\n .result-pin > summary::-webkit-details-marker { display: none; }\n .result-pin > summary::before { content: \"\u25B8\"; }\n .result-pin[open] > summary::before { content: \"\u25BE\"; }\n .result-pin > summary .meta { font-weight: 400; }\n .result-pin .diff-comment-target { margin: .25rem 0 .5rem; }\n .revision-card, .revision-lineage, .task-history, .diff-comment p { min-width: 0; overflow-wrap: anywhere; }\n .result-feedback-history > summary, .task-history > summary, .task-history a { display: inline-flex; align-items: center; min-height: 44px; padding: .25rem .5rem; }\n .task-history > summary::before { content: \"\u25B8\"; margin-right: .35rem; }\n .task-history[open] > summary::before { content: \"\u25BE\"; }\n .task-history li { margin: .25rem 0; }\n .result-revision { margin: .6rem 0; padding: .6rem .75rem; border: 1px solid color-mix(in srgb, var(--running) 24%, var(--glass-border)); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--running) 6%, var(--glass-strong)); font-size: .8125rem; overflow-wrap: anywhere; }\n .result-links { display: flex; flex-wrap: wrap; gap: .25rem .5rem; margin: .6rem 0 0; }\n .result-links a { font-weight: 550; }\n .result-links a + a::before { content: \"\u00B7\"; margin-right: .5rem; color: var(--muted-foreground); font-weight: 400; }\n .cockpit-detail .result-panel { margin: .85rem 0; }\n .cockpit-accept { margin-top: .75rem; }\n /* The result beside the conversation (package 3): with room, two\n columns and no second auxiliary panel; without it, the dedicated\n result view with Back to chat and the conversation out of the way. */\n .chat-result { min-width: 0; }\n .task-chat-workspace.result-open { grid-template-columns: minmax(0, 30rem) minmax(0, 1fr); align-items: start; }\n .task-chat-workspace.result-open .chat-main { max-width: none; }\n /* Said once: while the result detail is open beside the conversation,\n the receipt in the thread keeps its heading, status, and roads only. */\n .result-open .completion-receipt > :not(.receipt-head):not(.receipt-actions) { display: none; }\n @media (max-width: 1199px) {\n .task-chat-workspace.result-open { display: block; }\n .task-chat-workspace.result-open .chat-main, .task-chat-workspace.result-open .task-chat-agents { display: none; }\n main:has(.chat-workspace.result-open) { padding-bottom: calc(5rem + env(safe-area-inset-bottom, 0rem)); }\n }\n @media (max-width: 359px) {\n .result-tabs a .count { display: none; }\n .result-panel { padding-inline: .7rem; }\n }\n .work-views { display: flex; gap: .25rem; margin: .75rem 0 .5rem; border-bottom: 1px solid var(--border); overflow-x: auto; scrollbar-width: none; }\n .work-views::-webkit-scrollbar { display: none; }\n .work-views a {\n display: inline-flex; align-items: center; gap: .4rem; flex: none; min-height: 2.5rem; padding: 0 .625rem;\n margin-bottom: -1px; border-bottom: 2px solid transparent; text-decoration: none;\n color: var(--muted-foreground); font-size: .875rem; font-weight: 500;\n }\n .work-views a .count { font-family: var(--font-mono); font-size: .6875rem; font-variant-numeric: tabular-nums; color: var(--muted-foreground); }\n .work-views a.active { color: var(--foreground); border-bottom-color: var(--foreground); }\n .work-views a.active .count { color: var(--foreground); }\n .work-list { display: flex; flex-direction: column; }\n .work-row {\n display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: .5rem 1.5rem; align-items: start;\n padding: .75rem 0; border-bottom: 1px solid var(--border);\n }\n .work-row:last-child { border-bottom: 0; }\n .work-row-main, .work-row-status { min-width: 0; }\n /* Concise rows (2026-09-13): the status, the next act, and the Details\n toggle share one wrapping line; an opened disclosure is wider than\n its summary, so it wraps onto its own full-width line by itself. */\n .work-row-status { display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .875rem; }\n .work-details, .work-details[open] { max-width: 100%; margin: 0; padding: 0; border: 0; background: none; border-radius: 0; }\n .work-details > summary {\n list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .25rem;\n min-height: 2.25rem; padding: 0 .25rem; margin: 0 -.25rem; border-radius: .375rem;\n font-size: .8125rem; font-weight: 500; color: var(--muted-foreground);\n }\n .work-details > summary::-webkit-details-marker { display: none; }\n .work-details > summary::before { content: \"\u25B8\"; }\n .work-details[open] > summary::before { content: \"\u25BE\"; }\n @media (hover: hover) and (pointer: fine) { .work-details > summary:hover { color: var(--foreground); } }\n .work-title { display: block; font-weight: 600; font-size: .9375rem; line-height: 1.35; color: var(--foreground); text-decoration: none; overflow-wrap: anywhere; }\n @media (hover: hover) and (pointer: fine) { .work-title:hover { text-decoration: underline; } }\n .work-meta { display: flex; flex-wrap: wrap; gap: .25rem .625rem; margin: .25rem 0 0; font-size: .75rem; color: var(--muted-foreground); }\n .work-meta .mono { overflow-wrap: anywhere; }\n .project-label { display: inline-block; padding: 0 .4rem; border: 1px solid var(--border); border-radius: 999px; font-size: .6875rem; line-height: 1.5; color: var(--foreground); }\n .work-detail { margin: 0 0 .25rem; font-size: .8125rem; line-height: 1.45; color: var(--muted-foreground); overflow-wrap: anywhere; }\n .work-details .work-id { margin: 0 0 .25rem; }\n .work-action { display: inline-flex; align-items: center; min-height: 44px; font-size: .8125rem; font-weight: 500; }\n .work-empty { padding: 2rem 0 1rem; max-width: 34rem; }\n .work-empty p { margin: 0 0 .75rem; color: var(--muted-foreground); line-height: 1.5; }\n .work-empty .row { display: flex; align-items: center; gap: 1rem; }\n .work-empty .row > a { display: inline-flex; align-items: center; min-height: 44px; }\n .work-bound { margin-top: .75rem; }\n .status-line { display: inline-flex; align-items: center; gap: .45rem; min-width: 0; font-size: .875rem; font-weight: 600; color: var(--foreground); }\n .status-line .status-label { min-width: 0; overflow-wrap: anywhere; }\n .status-line .status-dot { flex: none; width: .5rem; height: .5rem; border-radius: 50%; background: var(--muted-foreground); }\n .status-line[data-tone=\"attention\"] .status-dot { background: var(--warning); }\n .status-line[data-tone=\"problem\"] .status-dot { background: var(--destructive); }\n .status-line[data-tone=\"live\"] .status-dot { background: var(--running); box-shadow: 0 0 0 3px var(--running-soft); }\n .status-line[data-tone=\"ready\"] .status-dot, .status-line[data-tone=\"done\"] .status-dot { background: var(--success); }\n .status-line[data-tone=\"muted\"] { color: var(--muted-foreground); font-weight: 500; }\n .status-line[data-tone=\"muted\"] .status-dot { background: var(--border); }\n .pull-request { display: grid; gap: .35rem; }\n .pull-request p { margin: 0; overflow-wrap: anywhere; }\n .pull-request-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .75rem; }\n .pull-request-head a, .pull-request .meta a { display: inline-flex; align-items: center; min-height: 44px; }\n .pull-request-head strong { font-size: 1.0625rem; font-weight: 600; color: var(--foreground); display: inline-flex; align-items: center; gap: .5rem; }\n .pull-request-head strong::before { content: \"\"; width: .5rem; height: .5rem; border-radius: 999px; background: var(--muted-foreground); }\n .pull-request--ok .pull-request-head strong::before { background: var(--success, #15803d); }\n .pull-request--problem .pull-request-head strong::before { background: var(--so-warning, #ab6400); }\n .pull-request-act { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem .75rem; margin: .25rem 0 0; }\n .pull-request-act .meta { flex: 1 1 100%; }\n .pull-request-act label { display: grid; gap: .25rem; flex: 1 1 12rem; margin: 0; }\n .pull-request-act label input { margin: 0; min-height: 44px; box-sizing: border-box; width: 100%; }\n .pull-request-act button { min-height: 44px; white-space: nowrap; }\n .result-complete-actions { display: flex; flex-wrap: wrap; gap: .5rem; }\n .result-complete-actions button { white-space: nowrap; }\n .result-complete-actions button[name=publish], .pull-request-act button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (max-width: 480px) { .pull-request-act button, .result-complete-actions button { flex: 1 1 100%; } }\n .receipt-publication { position: relative; z-index: 1; margin: .35rem 0 0; font-size: .8125rem; color: var(--muted-foreground); }\n /* A raw repository path in ordinary copy wraps at any point rather than\n widening the page (the phone task-list overflow, package 1). */\n .path-words { overflow-wrap: anywhere; word-break: break-word; }\n @media (max-width: 760px) {\n .work-row { grid-template-columns: minmax(0, 1fr); gap: .125rem; padding: .625rem 0; }\n .work-head { align-items: center; }\n .work-head h1 { margin-bottom: 0; }\n .work-details > summary, .work-action { min-height: 44px; }\n /* The tools control sits at the head's right edge on every width, so\n its menu keeps the desk's right-aligned anchor here too. A phone\n override once re-anchored it at left: 0, which pushed the opened\n menu past the viewport (right edge 441.5px at 390px) and widened\n the document \u2014 found by the independent concise-UI review. */\n /* All four filters share the row (review fixes, finding 3): each tab\n takes an equal share, no tab scrolls out of view, the count sits on\n the label, and every target stays \u2265 40px tall. */\n .work-views { gap: 0; margin: .5rem 0 .25rem; overflow: visible; }\n .work-views a { flex: 1 1 0; min-width: 0; justify-content: center; padding: 0 .25rem; font-size: .8125rem; gap: .3rem; white-space: nowrap; }\n }\n @media (max-width: 400px) {\n .work-views a { font-size: .75rem; gap: .2rem; padding: 0 .125rem; }\n .work-views a .count { font-size: .625rem; }\n }\n /* The narrowest phones (\u2264 360px): four labels with counts cannot share\n 288px at legible type, so the strip becomes two rows of two \u2014 every\n filter wholly visible, unclipped, 40px tall, never scrolled away. */\n @media (max-width: 360px) {\n .work-views { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .work-views a { font-size: .8125rem; gap: .3rem; padding: 0 .25rem; }\n .work-views a .count { font-size: .6875rem; }\n }\n\n /* The phone shell: the sidebar disappears; a top bar carries the project\n and quick capture; a bottom tab bar carries the destinations a thumb\n visits. Desktop is untouched. */\n .mobile-top, .tabbar { display: none; }\n @media (max-width: 760px) {\n .app { display: block; }\n .side { display: none; }\n .mobile-top {\n display: flex; align-items: center; gap: .5rem; position: sticky; top: 0; z-index: 30;\n background: var(--glass-strong); border-bottom: 1px solid var(--glass-border);\n padding: calc(.375rem + env(safe-area-inset-top, 0rem)) .75rem .375rem;\n }\n /* One header row: the pill carries scope, counts, and the switch. */\n .scope-bar { display: none; }\n .mobile-top .brand-mini { font-weight: 600; font-size: .9375rem; text-decoration: none; color: var(--foreground); font-family: var(--font-mono); }\n .mobile-top .project-pill { flex: 1; min-width: 0; position: static; margin: 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .mobile-top a.project-pill, .mobile-top .project-pill > summary {\n /* align-items: stretch, not the switcher's center: a centered column\n item takes its content width, and a long project name then widens\n the document (the 320px overflow, workspace package 1). */\n min-width: 0; display: flex; flex-direction: column; justify-content: center; align-items: stretch; gap: .0625rem;\n border: 1px solid var(--border); border-radius: 1.375rem; background: var(--card);\n min-height: 2.75rem; padding: .25rem .875rem; text-decoration: none; color: var(--foreground);\n font-size: .875rem; font-weight: 500; line-height: 1.25; cursor: pointer;\n }\n .mobile-top .project-pill > summary .name { display: inline-flex; align-items: center; gap: .25rem; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .mobile-top .project-pill > summary .name .chevron { flex: none; }\n .mobile-top a.project-pill:active, .mobile-top .project-pill > summary:active { background: var(--muted); }\n /* On a phone the menu drops from the header it belongs to (UI polish\n 2026-09-13). It was a fixed sheet, but the header's backdrop-filter\n makes the header the containing block for fixed descendants, so the\n sheet landed above the header, off-screen. Absolute to the sticky\n header is exact, and never taller than the screen. */\n .mobile-top .switcher-menu {\n position: absolute; left: .5rem; right: .5rem; top: calc(100% - .25rem); bottom: auto; max-width: none;\n max-height: calc(100dvh - 8rem); overflow-y: auto; z-index: 45;\n }\n .mobile-top .switcher-menu button { min-height: 2.75rem; }\n .mobile-top .pill-status {\n display: flex; flex-wrap: wrap; gap: .125rem .5rem;\n font-family: var(--font-mono); font-size: .6875rem; font-weight: 500;\n color: var(--muted-foreground); font-variant-numeric: tabular-nums;\n }\n .mobile-top .pill-status > span { white-space: nowrap; }\n .mobile-top .pill-status .hot { color: var(--brand); }\n .mobile-top .project-pill .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .mobile-top .mobile-new {\n flex: 0 0 auto; display: flex; align-items: center; justify-content: center;\n min-height: 2.75rem; padding: 0 .875rem; border-radius: 999px;\n background: var(--secondary); border: 1px solid var(--border); color: var(--foreground);\n font-weight: 500; font-size: .875rem; text-decoration: none;\n }\n /* Tools and settings: a header action, never a fourth tab (workspace\n package 1). A 44px target, the same quiet pill as quick capture. */\n .mobile-top .mobile-more {\n flex: 0 0 auto; display: flex; align-items: center; justify-content: center;\n width: 2.75rem; min-height: 2.75rem; border-radius: 999px;\n border: 1px solid var(--border); background: var(--card); color: var(--foreground);\n }\n .mobile-top .mobile-more svg { width: 1.125rem; height: 1.125rem; }\n @media (max-width: 360px) { .mobile-top .mobile-new { padding: 0 .625rem; } }\n .tabbar {\n display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;\n background: var(--glass-strong); border-top: 1px solid var(--glass-border);\n padding: .25rem max(.25rem, env(safe-area-inset-right, 0rem)) calc(.25rem + env(safe-area-inset-bottom, 0rem)) max(.25rem, env(safe-area-inset-left, 0rem));\n }\n .tabbar a {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: .125rem;\n padding: .375rem 0 .25rem; min-height: 3rem; text-decoration: none;\n color: var(--muted-foreground); font-size: .6875rem; font-weight: 500;\n font-family: var(--font-sans);\n }\n .tabbar a .glyph { display: flex; align-items: center; justify-content: center; height: 1.125rem; }\n .tabbar a .glyph svg { width: 1rem; height: 1rem; }\n .tabbar a.active { color: var(--foreground); }\n .tabbar a.active .glyph { background: var(--muted); border-radius: 999px; box-shadow: 0 0 0 .35rem var(--muted); }\n .tabbar a { position: relative; }\n .tabbar a .dot-badge {\n position: absolute; top: .3125rem; left: calc(50% + .375rem);\n width: .375rem; height: .375rem; border-radius: 9999px; background: var(--brand);\n }\n .content > main { padding: 1rem 1rem calc(4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .project-add-card { padding: 1rem; }\n .project-add-actions { grid-template-columns: minmax(0, 1fr); }\n .project-add-action { min-height: 5.25rem; padding: .75rem; }\n .project-add-more > summary { width: 100%; }\n }\n\n /* /menu mirrors the rail's workflows/admin grouping as plain headed\n * sections \u2014 no collapse: it is already one tap behind the tab bar. */\n .menu-group-label {\n margin: 1.5rem 0 .25rem; font-size: .75rem; font-weight: 600;\n color: var(--muted-foreground); font-family: var(--font-sans);\n }\n .menu-group-label:first-of-type { margin-top: .75rem; }\n .menu-list { display: flex; flex-direction: column; gap: .375rem; margin-top: .75rem; }\n .menu-row {\n display: flex; flex-direction: column; gap: .125rem; text-decoration: none;\n border: 1px solid var(--border); border-radius: var(--radius); background: var(--card);\n padding: .75rem .875rem; color: var(--foreground); min-height: 44px; justify-content: center;\n }\n @media (hover: hover) and (pointer: fine) { .menu-row:hover { border-color: color-mix(in srgb, var(--border) 60%, var(--muted-foreground)); } }\n\n .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(13.5rem, 1fr)); gap: .625rem; margin: .5rem 0; }\n .stat-card {\n border: 1px solid var(--border); border-radius: var(--radius); background: var(--card);\n padding: .75rem .875rem; min-width: 0;\n }\n .stat-card .k { font-weight: 600; font-size: .875rem; display: flex; align-items: center; gap: .4rem;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .stat-card .v { font-size: .75rem; color: var(--muted-foreground); margin-top: .25rem;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .dot { display: inline-block; width: .5rem; height: .5rem; border-radius: 9999px; flex: none; }\n .dot-ok { background: var(--success); }\n /* Caution without a claim on the operator: quiet, not magenta. */\n .dot-warn { background: var(--muted-foreground); }\n .dot-off { background: var(--muted-foreground); opacity: .5; }\n .dot-bad { background: var(--destructive); }\n .pulse { animation: pulse 2s ease-in-out infinite; }\n .dot-ok.pulse { background: var(--running); }\n @keyframes pulse { 50% { opacity: .35; } }\n\n .login-viewport { min-height: 100dvh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 2rem 1.25rem; }\n .login-shell { width: 100%; max-width: 23rem; }\n .login-shell h1 { text-align: center; margin: 0 0 .375rem; font-size: 1.5rem; letter-spacing: -0.02em; }\n .login-shell > .hint { text-align: center; margin: 0 0 2rem; font-size: 0.875rem; }\n .login-card {\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n padding: 1.5rem 1.5rem 1.625rem;\n }\n .login-card label:first-child { margin-top: 0; }\n .login-card .problem { margin: 0 0 1rem; }\n .login-shell button {\n width: 100%; margin-top: 1.25rem;\n background: var(--so-accent); color: var(--so-on-accent); border-color: var(--so-accent); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .login-shell button:hover { background: var(--so-accent-hover); border-color: var(--so-accent-hover); } }\n .login-foot { text-align: center; margin: 1.5rem 0 0; font-size: 0.75rem; color: var(--muted-foreground); line-height: 1.9; }\n .login-foot code { background: none; padding: 0; color: var(--muted-foreground); white-space: nowrap; }\n .so-wordmark { display: flex; align-items: center; gap: 9px; font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; letter-spacing: -.02em; color: var(--foreground); }\n .so-brand-mark { width: 18px; height: 22px; display: flex; align-items: center; gap: 3px; transform: skewY(-10deg); }\n .so-brand-mark i { display: block; width: 4px; height: 15px; background: var(--so-signal); border-radius: 1px; }\n .so-brand-mark i:nth-child(2) { height: 22px; }\n .login-shell .login-brand { justify-content: center; font-size: 1.125rem; margin: 0 0 1.5rem; }\n .sso-step-up { display: inline-flex; align-items: center; min-height: 36px; font-size: .9rem; }\n .sso-step-up[data-sso-step-up=\"confirmed\"] { color: var(--so-success); }\n .sso-step-up[data-sso-step-up=\"confirmed\"]::before { content: \"\u2713\"; margin-right: 6px; }\n .login-shell .login-sso { display: flex; justify-content: center; align-items: center; min-height: 44px; border-radius: 8px; background: var(--so-accent); color: var(--so-on-accent); font-weight: 600; text-decoration: none; margin: 0 0 1rem; }\n @media (hover: hover) and (pointer: fine) { .login-shell .login-sso:hover { background: var(--so-accent-hover); } }\n .login-shell .login-password > summary { text-align: center; font-size: .875rem; color: var(--muted-foreground); cursor: pointer; margin: 0 0 .75rem; }\n .focus-page { max-width: 40rem; margin: 0 auto; padding: 2rem 1.25rem 3rem; }\n .focus-page .focus-brand { display: inline-flex; margin: 0 0 2.5rem; }\n .focus-page h1 { margin: 0 0 1rem; }\n .secret-value { overflow-wrap: anywhere; font-size: .95rem; padding: .75rem .875rem; margin: .75rem 0; border: 1px solid var(--border); border-radius: 8px; background: var(--background); user-select: all; }\n\n @media (max-width: 640px) {\n button, form.option button { min-height: 2.75rem; }\n .topbar nav a { padding: 0 .5rem; }\n }\n\n /* The board: lanes as columns, the pipeline left to right. */\n .content > main:has(.board) { max-width: none; }\n .board {\n display: grid; grid-template-columns: repeat(5, minmax(12.5rem, 1fr));\n gap: .625rem; overflow-x: auto; padding-bottom: .75rem; align-items: start;\n }\n /* The phone board (board pass): lanes stack as sections that fold, the\n counts readable before a single card \u2014 what needs you, then what is\n building, then the rest. A header is a 2.75rem tap; a drawn chevron\n says which way it folds. */\n @media (max-width: 760px) {\n .board { display: flex; flex-direction: column; gap: .5rem; padding-bottom: 0; }\n .board .lane { min-height: 0; padding: 0 .625rem .125rem; }\n .board .lane > summary {\n cursor: pointer; display: flex; align-items: center; min-height: 2.75rem; margin: 0;\n -webkit-tap-highlight-color: transparent;\n }\n .board .lane > summary h2 { flex: 1; font-size: .75rem; }\n .board .lane > summary .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; margin-left: .25rem; }\n .board .lane > summary::after {\n content: \"\"; width: .5rem; height: .5rem; flex: none; margin-right: .25rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.125rem); transition: transform .15s;\n }\n .board .lane[open] > summary::after { transform: rotate(225deg) translateY(-.125rem); }\n .board .lane .hint { margin-bottom: .25rem; }\n .board .lane .lane-card:last-of-type { margin-bottom: .5rem; }\n .board .lane-attention { order: 0; }\n .board .lane-building { order: 1; }\n .board .lane-queued { order: 2; }\n .board .lane-waiting { order: 3; }\n .board .lane-done { order: 4; }\n }\n .lane {\n background: color-mix(in srgb, var(--card) 45%, var(--background)); border: 1px solid var(--border);\n border-radius: var(--radius); padding: .625rem; min-height: 12rem;\n }\n .lane > summary { list-style: none; cursor: default; margin: 0 0 .125rem; }\n .lane > summary::-webkit-details-marker { display: none; }\n .lane h2 { display: flex; align-items: center; gap: .4rem; margin: 0; font-size: .6875rem; }\n .lane h2 a { color: inherit; text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .lane h2 a:hover { text-decoration: underline; } }\n .lane .hint { margin-top: 0; }\n .lane-count { color: var(--muted-foreground); font-weight: 400; font-variant-numeric: tabular-nums; }\n .lane h2::before {\n content: \"\"; width: .375rem; height: .375rem; border-radius: 9999px; flex: none;\n background: var(--muted-foreground); opacity: .55;\n }\n .lane-attention h2::before { background: var(--brand); opacity: 1; }\n .lane-building h2::before { background: var(--running); opacity: 1; }\n .lane-done h2::before { background: var(--success); opacity: 1; }\n .lane-card {\n display: block; text-decoration: none; color: inherit;\n background: var(--card); border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); padding: .5rem .625rem; margin-top: .5rem;\n }\n @media (hover: hover) and (pointer: fine) { .lane-card:hover { border-color: color-mix(in srgb, var(--border) 55%, var(--muted-foreground)); } }\n .lane-card .id { display: block; font-family: var(--font-mono); font-size: .6875rem; color: var(--muted-foreground); margin-bottom: .125rem; overflow-wrap: anywhere; }\n .lane-card .t { display: block; font-size: .8125rem; font-weight: 500; line-height: 1.35; }\n .lane-card .dot { margin-right: .4rem; }\n .lane-card .meta, .lane-card .mono { display: block; margin-top: .125rem; font-size: .75rem; }\n .lane-card .why { display: block; margin-top: .125rem; font-size: .75rem; color: var(--muted-foreground); }\n /* The facts: mono key\u2013value pairs, keys dim, values ink \u2014 one grammar on every lane. */\n .lane-card .facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: .0625rem .625rem; margin-top: .4rem; font-size: .6875rem; line-height: 1.5; }\n .lane-card .fact { display: contents; }\n .lane-card .fact .k { color: var(--muted-foreground); font-family: var(--font-mono); }\n .lane-card .fact .v { font-family: var(--font-mono); color: var(--foreground); overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n .lane-card .chips { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: .4rem; }\n .lane-card .chips .badge { margin: 0; }\n /* The live strip on a building card: stage and clock in an inset well \u2014\n the run's own facts, never a percent. */\n .lane-card .live-line {\n display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-top: .375rem;\n padding: .3rem .5rem; border-radius: calc(var(--radius) - 4px); background: var(--muted);\n font-family: var(--font-mono); font-size: .6875rem; color: var(--running); font-variant-numeric: tabular-nums;\n }\n .lane-card .live-line .clock { color: var(--muted-foreground); }\n .lane-empty { margin: .75rem 0 .25rem; }\n .plan-doc { white-space: pre-wrap; overflow-wrap: anywhere; font-size: .8125rem; max-height: 24rem; overflow-y: auto; }\n .lane-more { display: block; margin-top: .5rem; font-size: .75rem; }\n\n /* The attended control room: one cross-workspace pulse, then a dense\n master rail. */\n .control-room-head {\n display: flex; align-items: flex-start; justify-content: space-between;\n gap: 1rem; margin-bottom: 1.1rem;\n }\n .control-room-head h1 { font-size: 1.375rem; margin-top: .08rem; }\n .control-room-head .actions { display: flex; gap: .45rem; flex-wrap: wrap; justify-content: flex-end; }\n .control-room-head .actions a { text-decoration: none; }\n .command-metrics {\n display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: .625rem; margin: .85rem 0 1.5rem;\n }\n .command-metric {\n border: 1px solid var(--border); border-radius: calc(var(--radius) - 2px); background: var(--card);\n padding: .8rem .9rem; min-width: 0;\n }\n .command-metric .value { display: block; margin-top: .25rem; font-size: 1.5rem; font-weight: 600; line-height: 1.15; font-variant-numeric: tabular-nums; font-family: var(--font-mono); }\n .command-metric .label { display: flex; align-items: center; gap: .4rem; font-weight: 500; font-size: .8125rem; }\n .command-metric .label::before {\n content: \"\"; width: .375rem; height: .375rem; border-radius: 9999px;\n background: var(--muted-foreground); flex: none;\n }\n .command-metric .detail { display: block; color: var(--muted-foreground); font-size: .6875rem; margin-top: .18rem; }\n .command-metric.attention .label::before { background: var(--brand); }\n .command-metric.live .label::before { background: var(--running); }\n .workspace-pulse { margin: .4rem 0 1.5rem; display: grid; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); gap: .625rem; }\n /* The workspace card: name and status word, four counts, the same counts\n as a bar, and the one tap to its board. Neutral border always; the\n needs-you count and the bar's segment carry the accent. */\n .workspace-card {\n padding: .75rem .9rem; border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); background: var(--card); font-size: .8125rem; min-width: 0;\n }\n /* The mate's unified workspace: a glass project navigator beside one\n long-lived conversation. The content stays calm and legible; the\n atmosphere belongs to the shell and edges, never behind the prose. */\n main:has(.chat-workspace) { max-width: 86rem; padding-top: 1.5rem; }\n .chat-workspace {\n display: grid; grid-template-columns: minmax(16rem, 18.5rem) minmax(0, 56rem);\n align-items: start; gap: clamp(1.25rem, 3vw, 2.75rem);\n }\n .chat-workspace.projects-hidden { grid-template-columns: minmax(0, 56rem); }\n .chat-workspace.projects-hidden .chat-projects { display: none; }\n .chat-main { min-width: 0; max-width: 56rem; }\n .task-chat-workspace { grid-template-columns: minmax(15rem, 18rem) minmax(0, 56rem); }\n .task-chat-context {\n position: sticky; top: 6rem; align-self: start; padding: 1rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) + 3px);\n background: var(--glass); box-shadow: var(--shadow);\n }\n .task-chat-context-head { display: flex; align-items: center; justify-content: space-between; gap: .65rem; }\n .task-chat-context h2 { margin: .7rem 0 .25rem; color: var(--foreground); font-size: 1rem; line-height: 1.35; letter-spacing: -.025em; }\n .task-chat-context > .meta { margin: 0; overflow-wrap: anywhere; font-size: .65rem; }\n .task-chat-status { display: grid; gap: .2rem; margin-top: .85rem; padding: .7rem; border-radius: calc(var(--radius) - 3px); background: var(--warning-soft); }\n .task-chat-status.ready { background: var(--running-soft); }\n .task-chat-status strong { font-size: .75rem; }\n .task-chat-status span { color: var(--muted-foreground); font-size: .68rem; line-height: 1.45; }\n .task-chat-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .4rem; margin: .65rem 0; }\n .task-chat-facts div { min-width: 0; padding: .45rem .5rem; border-radius: calc(var(--radius) - 5px); background: color-mix(in srgb, var(--muted) 58%, transparent); }\n .task-chat-facts dt { color: var(--muted-foreground); font: 400 .58rem/1.2 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; }\n .task-chat-facts dd { margin: .15rem 0 0; font-size: .68rem; overflow-wrap: anywhere; }\n .task-chat-overview-actions { display: grid; justify-items: start; gap: .55rem; margin-top: .75rem; }\n .task-chat-overview-link { display: block; font-size: .72rem; text-decoration: none; }\n .task-chat-recovery-link { min-height: 2rem; padding-inline: .7rem; font-size: .7rem; }\n #task-chat-live { display: grid; gap: 1rem; margin-bottom: 1.1rem; }\n .task-journey {\n position: relative; overflow: hidden; padding: 1rem 1.05rem;\n border-color: color-mix(in srgb, var(--accent) 16%, var(--glass-border));\n background: var(--card);\n }\n .task-journey::after { content: \"\"; position: absolute; width: 9rem; height: 9rem; right: -4rem; top: -5rem; border-radius: 50%; background: color-mix(in srgb, var(--accent) 8%, transparent); filter: blur(12px); pointer-events: none; }\n .task-journey-head { position: relative; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-journey h2 { margin: .2rem 0 0; font-size: 1rem; letter-spacing: -.025em; }\n .task-journey > ol { position: relative; z-index: 1; display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 0; margin: 1rem 0 .75rem; padding: 0; list-style: none; }\n .task-journey > ol::before { content: \"\"; position: absolute; top: .7rem; left: 10%; right: 10%; height: 1px; background: var(--border); }\n .task-journey li { position: relative; z-index: 1; display: grid; justify-items: center; gap: .35rem; color: var(--muted-foreground); font-size: .625rem; text-align: center; }\n .task-journey li i { display: grid; place-items: center; width: 1.4rem; height: 1.4rem; border: 1px solid var(--border); border-radius: 50%; background: var(--card); font: 600 .58rem/1 var(--font-mono); font-style: normal; }\n .task-journey li.complete i { color: var(--success); border-color: color-mix(in srgb,var(--success) 32%,var(--border)); background: color-mix(in srgb,var(--success) 9%,var(--card)); }\n .task-journey li.complete span { color: var(--foreground); }\n .task-journey li.active i { color: white; border-color: var(--accent); background: var(--accent); box-shadow: 0 0 0 4px color-mix(in srgb,var(--accent) 12%,transparent); }\n .task-journey li.active span { color: var(--foreground); font-weight: 650; }\n .task-journey > .meta { margin: 0; line-height: 1.45; }\n .task-journey-action { margin-top: .75rem; min-height: 44px; }\n .check-progress {\n margin: .5rem 0 0; color: var(--running); font-size: clamp(.625rem,2.2vw,.75rem);\n line-height: 1.5; font-variant-numeric: tabular-nums; white-space: nowrap;\n overflow-x: auto; scrollbar-width: thin;\n }\n .check-progress[data-final=\"passed\"] { color: var(--success); }\n .check-progress[data-final=\"failed\"] { color: var(--destructive); }\n .check-progress[data-final=\"unknown\"] { color: var(--warning); }\n .receipt-actions [data-primary-action] { min-height: 44px; }\n .task-status-reason { margin-top: .75rem; }\n .task-status-reason summary, .task-status-details > summary { color: var(--muted-foreground); }\n .task-status-details > summary { min-height: 44px; }\n .task-status-details, #task-control-details { margin: 1rem 0; }\n .task-control-copy { min-width: 0; overflow-wrap: anywhere; }\n [data-primary-action] { max-width: 100%; }\n\n .task-live-build { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem; margin: .75rem 0 0; font-size: .72rem; }\n .task-live-build .live-dot { width: .45rem; height: .45rem; border-radius: 50%; background: var(--success); box-shadow: 0 0 0 4px color-mix(in srgb,var(--success) 10%,transparent); }\n .chat-action-card { padding: 0; overflow: hidden; }\n .chat-action-card:not(details) { padding: 1rem 1.05rem; }\n .chat-action-card > summary { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1rem 1.05rem; cursor: pointer; list-style: none; }\n .chat-action-card > summary::-webkit-details-marker { display: none; }\n .chat-action-card > summary > span:first-child { display: grid; gap: .18rem; }\n .chat-action-card > summary strong { font-size: .92rem; }\n .chat-action-card > summary small { color: var(--muted-foreground); font-size: .68rem; font-weight: 400; }\n .chat-action-card[open] > summary { border-bottom: 1px solid var(--border); }\n .chat-run-details { padding: .65rem .75rem; border: 1px solid var(--border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb,var(--muted) 45%,transparent); }\n .chat-run-details > summary { color: var(--muted-foreground); cursor: pointer; font-size: .68rem; }\n .chat-run-details > .meta { margin-bottom: 0; }\n .chat-decisions { display: grid; gap: .7rem; }\n .chat-section-head { margin: .15rem .15rem 0; }\n .chat-section-head h2 { margin: .2rem 0 0; font-size: 1rem; }\n .chat-decisions .decide-card { margin: 0; background: var(--glass); box-shadow: var(--shadow); }\n .chat-publication { margin: -.25rem .25rem .25rem; }\n .chat-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: .5rem .25rem 0; }\n .chat-head h1 { margin-bottom: .2rem; font-size: 1.65rem; letter-spacing: -.04em; }\n .chat-head .badge-running { margin-top: .2rem; background: color-mix(in srgb, var(--success) 11%, var(--glass)); color: var(--success); }\n .chat-head-actions { display: flex; align-items: center; justify-content: flex-end; gap: .45rem; flex-wrap: wrap; }\n .task-chat-head > div { min-width: 0; flex: 1; }\n .chat-task-back { margin: 0 0 .55rem; font-size: .6875rem; }\n .chat-task-back a { text-decoration: none; }\n .task-chat-title-line { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-chat-title-line > div { min-width: 0; }\n .chat-project-toggle {\n display: inline-flex; align-items: center; gap: .4rem; min-height: 2rem; padding: .25rem .55rem;\n color: var(--muted-foreground); font-size: .6875rem; box-shadow: none;\n }\n .chat-project-toggle svg { width: .9rem; height: .9rem; }\n .chat-project-toggle .badge { padding-inline: .38rem; font-size: .6rem; }\n .chat-budget {\n display: flex; flex-wrap: wrap; gap: .4rem; margin: 1rem 0 1.25rem;\n color: var(--muted-foreground); font-size: .6875rem; font-variant-numeric: tabular-nums;\n }\n .chat-budget > span {\n white-space: nowrap; padding: .32rem .58rem; border: 1px solid var(--glass-border);\n border-radius: 999px; background: color-mix(in srgb, var(--glass) 74%, transparent);\n }\n /* Provider, model, and limits behind one quiet disclosure (UI polish 2026-09-13). */\n .chat-limits { margin: .5rem 0 .75rem; padding: 0 .9rem; border-color: var(--glass-border); background: color-mix(in srgb, var(--glass) 70%, transparent); }\n .chat-limits > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; min-height: 2.5rem; padding: .45rem 0; font-size: .75rem; }\n .chat-limits > summary .meta { font-size: .75rem; }\n .chat-limits[open] { padding-bottom: .6rem; }\n .chat-limits .chat-budget { margin: .2rem 0 .1rem; }\n .chat-main .chat-limits + .chat-fleet-context, .chat-main .chat-fleet-context + .chat-limits { margin-top: .5rem; }\n .chat-overview {\n margin: 0 0 1.35rem; padding: 1rem; border-radius: calc(var(--radius) + 2px);\n background: var(--glass);\n box-shadow: var(--shadow);\n }\n .chat-overview-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }\n .chat-overview-head h2 { margin: .1rem 0 0; color: var(--foreground); font-size: .95rem; letter-spacing: -.02em; }\n .chat-overview-head form { margin: 0; }\n .chat-overview-head button, .chat-overview-link {\n min-height: 2rem; padding: .25rem .7rem; font-size: .6875rem; text-decoration: none;\n }\n .chat-overview-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .45rem; margin-top: .85rem; }\n .chat-overview-stat {\n display: flex; flex-direction: column; min-width: 0; padding: .65rem .7rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px);\n background: color-mix(in srgb, var(--glass-strong) 64%, transparent); text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .chat-overview-stat:hover { background: var(--glass-strong); } }\n .chat-overview-stat b { color: var(--foreground); font: 600 1.2rem/1.2 var(--font-mono); font-variant-numeric: tabular-nums; }\n .chat-overview-stat span { overflow: hidden; color: var(--muted-foreground); font-size: .65rem; text-overflow: ellipsis; white-space: nowrap; }\n .chat-overview-stat.attention b { color: var(--warning); }\n .chat-overview-stat.live b { color: var(--running); }\n .chat-overview-items { display: grid; gap: .35rem; margin-top: .7rem; }\n .chat-overview-item {\n display: grid; grid-template-columns: 1.75rem minmax(0, 1fr) auto; align-items: center; gap: .6rem;\n padding: .48rem .55rem; border-radius: calc(var(--radius) - 4px); color: inherit; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .chat-overview-item:hover { background: color-mix(in srgb, var(--muted) 72%, transparent); } }\n .chat-overview-icon { display: grid; place-items: center; width: 1.75rem; height: 1.75rem; border-radius: .55rem; background: var(--muted); color: var(--muted-foreground); }\n .chat-overview-icon svg { width: .9rem; height: .9rem; }\n .chat-overview-item.decision .chat-overview-icon { color: var(--warning); background: var(--warning-soft); }\n .chat-overview-item.failed .chat-overview-icon { color: var(--destructive); background: var(--destructive-soft); }\n .chat-overview-item.running .chat-overview-icon { color: var(--running); background: var(--running-soft); }\n .chat-overview-copy { min-width: 0; }\n .chat-overview-copy strong, .chat-overview-copy span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .chat-overview-copy strong { font-size: .75rem; font-weight: 500; }\n .chat-overview-copy span { color: var(--muted-foreground); font-size: .65rem; margin-top: .05rem; }\n .chat-overview-arrow { color: var(--muted-foreground); }\n .chat-overview-clear { display: flex; align-items: center; gap: .45rem; margin: .8rem .2rem 0; color: var(--muted-foreground); font-size: .75rem; }\n .chat-overview-note { margin: .65rem .2rem 0; font-size: .6875rem; }\n .chat-readonly { margin-top: 1rem; padding: 1rem; }\n .chat-projects {\n position: sticky; top: 4rem; align-self: start; max-height: calc(100vh - 5rem); overflow-y: auto;\n padding: 1rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) + 3px);\n background: var(--glass); box-shadow: var(--shadow);\n }\n .chat-projects-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .75rem; padding: 0 .15rem; }\n .chat-projects-head h2 { margin: 0; color: var(--foreground); font-size: .8125rem; letter-spacing: -.01em; }\n .chat-project-close { display: none; margin-left: auto; width: 2rem; min-height: 2rem; padding: 0; font-size: 1rem; box-shadow: none; }\n .chat-project-card {\n padding: .8rem; margin-top: .5rem; border: 1px solid transparent; border-radius: var(--radius);\n background: color-mix(in srgb, var(--muted) 58%, transparent);\n transition: transform .16s ease, background .16s, border-color .16s, box-shadow .16s;\n }\n @media (hover: hover) and (pointer: fine) { .chat-project-card:hover {\n border-color: var(--glass-border); background: color-mix(in srgb, var(--muted) 82%, transparent);\n box-shadow: 0 12px 28px -24px rgb(0 0 0 / .8);\n } }\n .chat-project-name { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: .45rem; }\n .chat-project-name strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .8125rem; }\n .chat-project-name .mono { color: var(--running); font-size: .6875rem; }\n .chat-project-name .badge { background: var(--glass); font-size: .625rem; }\n .chat-project-stats { display: grid; grid-template-columns: 1fr 1fr; gap: .3rem .55rem; margin-top: .65rem; }\n .chat-project-stats span { color: var(--muted-foreground); font-size: .6875rem; white-space: nowrap; }\n .chat-project-stats b { color: var(--foreground); font-family: var(--font-mono); font-weight: 600; font-variant-numeric: tabular-nums; }\n .chat-project-stats span.hot, .chat-project-stats span.hot b { color: var(--brand); }\n .chat-project-actions { display: flex; gap: .35rem; margin-top: .65rem; }\n .chat-project-actions form { margin-bottom: 0; }\n .chat-project-actions button { min-height: 1.8rem; padding: .2rem .6rem; font-size: .6875rem; box-shadow: none; background: transparent; }\n .thread {\n display: flex; flex-direction: column; gap: 1rem; margin: 1rem 0 1.25rem;\n min-height: min(32rem, 48vh); padding: .25rem;\n }\n .thread .msg { max-width: 48rem; line-height: 1.65; overflow-wrap: anywhere; }\n .chat-previous-divider { display: flex; align-items: center; gap: .6rem; margin: 1rem 0; color: var(--so-muted); font-size: .8rem; }\n .chat-previous-divider::before, .chat-previous-divider::after { content: \"\"; flex: 1; border-top: 1px solid var(--so-line); }\n .thread .msg p { margin: .3rem 0; }\n .thread .msg.op {\n align-self: flex-end; max-width: min(82%, 40rem); padding: .75rem 1rem;\n border: 1px solid var(--glass-border); border-radius: 1.2rem 1.2rem .35rem 1.2rem;\n background: var(--user-message); color: var(--so-ink);\n box-shadow: 0 10px 30px -24px rgb(0 0 0 / .9), 0 1px 0 rgb(255 255 255 / .07) inset;\n }\n .thread .msg.mate {\n position: relative; align-self: stretch; padding: .75rem .5rem .75rem 3.45rem;\n border: 0; background: transparent;\n }\n .thread .msg.mate::before {\n content: \"T\"; position: absolute; top: .7rem; left: .1rem; width: 2.35rem; height: 2.35rem;\n display: grid; place-items: center; border: 1px solid var(--glass-border); border-radius: .8rem;\n background: var(--glass-strong);\n color: var(--foreground); font: 600 .6875rem/1 var(--font-mono); letter-spacing: -.04em;\n box-shadow: var(--so-pill-shadow);\n }\n .chat-copy > :first-child { margin-top: 0; }\n .chat-copy > :last-child { margin-bottom: 0; }\n .chat-copy p { margin: .35rem 0 .7rem; }\n .chat-copy h3 { margin: 1rem 0 .35rem; color: var(--foreground); font-size: .8125rem; }\n .chat-copy ul, .chat-copy ol { margin: .4rem 0 .75rem; padding-left: 1.3rem; }\n .chat-copy li { margin: .24rem 0; padding-left: .15rem; }\n .chat-message-foot { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin-top: .75rem; }\n .chat-message-foot time { color: var(--muted-foreground); font: 400 .625rem/1 var(--font-mono); white-space: nowrap; }\n .chat-activity { display: flex; flex-wrap: wrap; gap: .3rem; }\n .chat-activity span { padding: .15rem .42rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); font: 400 .625rem/1.25 var(--font-mono); }\n .proposal { margin: .9rem 0 0; padding: 0; overflow: hidden; background: var(--glass); }\n .proposal-head { display: grid; grid-template-columns: 2rem minmax(0, 1fr) auto; align-items: center; gap: .65rem; padding: .75rem .85rem; border-bottom: 1px solid var(--glass-border); }\n .proposal-head > span:nth-child(2) { min-width: 0; }\n .proposal-head strong, .proposal-head small { display: block; }\n .proposal-head strong { font-size: .75rem; }\n .proposal-head small { margin-top: .05rem; color: var(--muted-foreground); font-size: .625rem; }\n .proposal-icon { display: grid; place-items: center; width: 2rem; height: 2rem; border-radius: .6rem; color: var(--running); background: var(--running-soft); }\n .proposal-icon svg { width: 1rem; height: 1rem; }\n .proposal-cancel .proposal-icon { color: var(--destructive); background: var(--destructive-soft); }\n .proposal-answer .proposal-icon { color: var(--warning); background: var(--warning-soft); }\n .proposal-repair .proposal-icon { color: var(--warning); background: var(--warning-soft); }\n .proposal-body { padding: .85rem; }\n .proposal-body h3 { margin: 0; color: var(--foreground); font-size: .9rem; letter-spacing: -.015em; }\n .proposal-summary { margin: .45rem 0 0; color: var(--foreground); white-space: pre-wrap; }\n .proposal-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .35rem; margin: .75rem 0 0; }\n .proposal-facts div { min-width: 0; padding: .45rem .55rem; border-radius: calc(var(--radius) - 5px); background: color-mix(in srgb, var(--muted) 65%, transparent); }\n .proposal-facts dt { color: var(--muted-foreground); font: 400 .6rem/1.25 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; }\n .proposal-facts dd { margin: .18rem 0 0; overflow-wrap: anywhere; font-size: .72rem; }\n .proposal-rationale { margin-top: .75rem; padding: .65rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--muted); }\n .proposal-rationale strong { display: block; margin-top: .2rem; }\n .proposal-rationale p { margin: .2rem 0 0; color: var(--muted-foreground); }\n .proposal-disclosure { margin-top: .7rem !important; font-size: .6875rem; }\n .proposal-actions { padding: 0 .85rem .85rem; }\n .proposal-actions .acts { display: flex; align-items: center; gap: .5rem; }\n .proposal-actions form { margin: 0; }\n /* The confirm is the card's one primary; dismiss stays quiet (UI polish 2026-09-13). */\n .proposal-actions .acts form:first-child button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .proposal-actions .acts form:first-child button[type=submit]:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .proposal-actions .done, .proposal-actions .refused, .proposal-wait { margin: 0; padding: .55rem .65rem; border-radius: calc(var(--radius) - 5px); font-size: .72rem; }\n .proposal-actions .done { color: var(--success); background: var(--success-soft); }\n .proposal-actions .refused { color: var(--destructive); background: var(--destructive-soft); }\n .proposal.confirmed { border-color: color-mix(in srgb, var(--ok) 45%, var(--border)); }\n .proposal.refused { border-color: color-mix(in srgb, var(--danger) 45%, var(--border)); }\n .proposal .done { color: var(--ok); }\n .proposal .refused { color: var(--danger); }\n .chat-empty { margin: auto; padding: clamp(3rem, 9vh, 6rem) 1rem 3rem; text-align: center; }\n .chat-empty::before {\n content: \"T\"; display: grid; place-items: center; width: 3.5rem; height: 3.5rem; margin: 0 auto 1.1rem;\n border: 1px solid var(--glass-border); border-radius: 1.15rem;\n background: var(--glass-strong);\n box-shadow: var(--so-pill-shadow);\n font: 600 .8rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .chat-empty > strong { display: block; font-size: 1.2rem; letter-spacing: -.025em; }\n .chat-empty > .meta { margin-top: .4rem; }\n .chat-prompts { display: flex; justify-content: center; flex-wrap: wrap; gap: .5rem; margin-top: 1.25rem; }\n /* The composer's status line takes no room until it has a state to report. */\n .composer-hint:empty { display: none; }\n .chat-prompts form { margin: 0; }\n .chat-prompts button { min-height: 2.35rem; box-shadow: none; background: var(--glass); padding-inline: .9rem; }\n /* The New update action (package 2): sticks above the composer, takes no\n room while hidden, and is the only thing that moves a reader who sat\n above the latest message when a live update landed. */\n .chat-new-update-holder { position: sticky; bottom: 1rem; z-index: 28; display: flex; justify-content: center; height: 0; margin: 0; pointer-events: none; }\n .chat-new-update { pointer-events: auto; transform: translateY(-100%); min-height: 2.35rem; padding-inline: .9rem; border-radius: 999px; box-shadow: var(--shadow-overlay); }\n .chat-new-update[hidden] { display: none; }\n /* The concise plan (package 2): a title, the outcome, one line of\n counts and limits, then one Review plan disclosure over the unchanged\n exact-terms form. */\n .chat-approval-stale { margin: .75rem 0 0; }\n .chat-approval-stale a { font-weight: 600; }\n form.approve-form[data-stale=\"1\"] .approval-confirm, form.approve-form[data-stale=\"1\"] .approval-act { opacity: .55; }\n .proposal-filed { display: flex; align-items: center; flex-wrap: wrap; gap: .6rem; margin: .5rem 0 0; }\n .chat-thinking { display: flex; align-items: center; gap: .75rem; padding: .75rem .85rem; }\n .chat-thinking p { flex: 1; margin: 0; }\n .chat-thinking p strong, .chat-thinking p span { display: block; }\n .chat-thinking p span { margin-top: .08rem; }\n .chat-thinking form { margin: 0; }\n /* On a desk the overview is its own card \u2014 no second frame around it. */\n .chat-fleet-context, .chat-fleet-context[open] { margin: 0; padding: 0; border: 0; background: transparent; }\n .chat-fleet-context > summary { display: none; }\n /* The summary's needs-you count is magenta wherever the summary shows (a count, by the law). */\n .chat-fleet-context > summary .hot { color: var(--brand); font-weight: 600; }\n @media (min-width: 761px) {\n /* A fresh conversation on a desk (annotation on build 1540): the\n overview folds behind one summary row that still carries its two\n counts, and the empty state gives up its centering slack, so the whole\n composer and its send control sit inside the first 1280\u00D7800 viewport. */\n .chat-main:has(.chat-empty) .chat-fleet-context { margin: 0 0 .25rem; border: 1px solid var(--glass-border); border-radius: 1rem; background: color-mix(in srgb, var(--glass) 70%, transparent); }\n .chat-main:has(.chat-empty) .chat-fleet-context[open] { padding-bottom: .5rem; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary { display: flex; align-items: center; gap: .6rem; min-height: 2.5rem; padding: .5rem .9rem; color: var(--muted-foreground); font-size: .78rem; cursor: pointer; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary::before { content: \"\u25B8\"; flex: none; font-size: .7rem; }\n .chat-main:has(.chat-empty) .chat-fleet-context[open] > summary::before { content: \"\u25BE\"; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary .meta { margin-left: auto; font-size: .68rem; white-space: nowrap; }\n .chat-main:has(.chat-empty) .chat-fleet-context .chat-overview { margin: 0 .5rem; box-shadow: none; }\n .chat-main:has(.chat-empty) .thread { min-height: 0; margin: .75rem 0 .75rem; }\n .chat-main:has(.chat-empty) .chat-empty { padding: clamp(1.25rem, 4vh, 2.25rem) 1rem 1rem; }\n }\n .thinking-orb { position: relative; width: 2rem; height: 2rem; flex: none; border-radius: 999px; background: var(--running-soft); }\n .thinking-orb::after { content: \"\"; position: absolute; inset: .55rem; border-radius: inherit; background: var(--running); animation: pulse 1.25s ease-in-out infinite; }\n .composer {\n display: flex; align-items: flex-end; gap: .75rem; padding: .7rem; margin-top: .5rem;\n border-radius: 1.35rem; background: var(--glass-strong);\n }\n .composer label { flex: 1; min-width: 0; margin: 0; font-size: 0; }\n .composer textarea {\n width: 100%; min-height: 3.5rem; max-height: 13rem; margin: 0; padding: .75rem .85rem;\n resize: vertical; border: 0; background: transparent; box-shadow: none; font-size: 1rem;\n }\n .composer textarea:focus-visible { border: 0; box-shadow: none; }\n @media (hover: hover) and (pointer: fine) { .composer textarea:hover { border: 0; box-shadow: none; } }\n .composer button {\n flex: 0 0 2.75rem; width: 2.75rem; min-height: 2.75rem; padding: 0; border-radius: 999px;\n font-size: 0; box-shadow: 0 10px 24px -16px rgb(255 255 255 / .65);\n }\n .composer button::after { content: \"\u2191\"; font: 600 1.15rem/1 var(--font-sans); }\n .chat-main > details { margin-top: 1rem; background: color-mix(in srgb, var(--glass) 70%, transparent); }\n @media (min-width: 761px) {\n /* Keep the desktop composer in the document flow. A sticky bottom\n * constraint pulled it over proposal cards on long conversations (and\n * into the middle of full-page captures), hiding the very acts it asks\n * the operator to confirm. The #latest anchor still brings this form\n * into view after every turn without making it an overlay. */\n .chat-workspace .composer { position: static; width: 100%; box-shadow: var(--shadow); }\n /* The agents summary is said ONCE per screen (v48): the context panel\n * carries it on desktop, so the compact strip \u2014 the phone's copy \u2014\n * steps aside wherever that panel is visible. */\n .task-chat-workspace .task-chat-agents { display: none; }\n }\n @media (min-width: 761px) and (max-width: 1199px) {\n .chat-workspace { grid-template-columns: minmax(0, 1fr); gap: 1rem; }\n .chat-main { max-width: none; }\n .chat-projects { display: none; }\n .chat-workspace.projects-open::before {\n content: \"\"; position: fixed; inset: 0 0 0 232px; z-index: 23; background: rgb(0 0 0 / .18);\n }\n .chat-workspace.projects-open .chat-projects {\n display: block; position: fixed; top: 4rem; left: calc(232px + 1.25rem); z-index: 25;\n width: min(18.5rem, calc(100vw - 232px - 2.5rem)); max-height: calc(100vh - 5rem);\n }\n .app.sidebar-collapsed .chat-workspace.projects-open::before { inset: 0 0 0 64px; }\n .app.sidebar-collapsed .chat-workspace.projects-open .chat-projects { left: calc(64px + 1.25rem); }\n .chat-project-close { display: grid; place-items: center; }\n }\n @media (min-width: 900px) and (max-width: 1199px) {\n .task-chat-workspace { grid-template-columns: minmax(14rem, 16rem) minmax(0, 1fr); gap: 1.25rem; }\n }\n @media (max-width: 760px) {\n main:has(.chat-workspace) { padding: 1rem max(1rem, env(safe-area-inset-right, 0rem)) calc(var(--composer-height, 4rem) + 5rem + env(safe-area-inset-bottom, 0rem)) max(1rem, env(safe-area-inset-left, 0rem)); }\n /* Above the fixed composer and the tab bar, never beneath them. */\n .chat-new-update-holder { bottom: calc(var(--composer-height, 4rem) + 4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .chat-main:has(.proposal.pending) .chat-new-update-holder, .chat-main:has(.chat-empty) .chat-new-update-holder { bottom: calc(4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .chat-workspace, .chat-workspace.projects-hidden { display: block; }\n .chat-workspace.projects-hidden .chat-projects, .chat-projects { display: none; }\n .chat-project-toggle { display: inline-flex; min-height: 2.75rem; }\n .chat-project-close { display: grid; place-items: center; min-height: 2.75rem; min-width: 2.75rem; }\n .chat-workspace.projects-open::before { content: \"\"; position: fixed; inset: 0; z-index: 30; background: rgb(0 0 0 / .18); }\n .chat-workspace.projects-open .chat-projects { display: block; position: fixed; top: 5rem; left: 1rem; right: 1rem; width: auto; max-height: calc(100dvh - 10rem); overflow-y: auto; overscroll-behavior: contain; z-index: 31; background: var(--card); }\n .chat-project-list { display: grid; gap: 0; padding: 0; }\n .chat-project-card {\n margin: 0; padding: .85rem .4rem; border: 0; border-top: 1px solid var(--border); border-radius: 0; background: transparent;\n }\n .chat-projects { position: static; max-height: none; overflow: hidden; padding: .65rem; margin-bottom: .85rem; }\n .chat-projects-head { margin-bottom: .35rem; }\n .chat-project-stats { display: flex; flex-wrap: wrap; gap: .15rem .7rem; margin-top: .35rem; }\n .chat-project-stats span { font-size: .625rem; }\n .chat-project-stats span:last-child { display: none; }\n .chat-project-actions { margin-top: .5rem; }\n .chat-project-actions button { min-height: 2.75rem; padding-inline: .85rem; font-size: .8125rem; }\n .chat-head { padding-inline: 0; }\n .chat-head h1 { font-size: 1.4rem; }\n .chat-head-actions { align-items: flex-start; }\n .task-chat-workspace .task-chat-context { display: none; }\n .result-panel { padding: .25rem 0 1rem; border: 0; border-radius: 0; box-shadow: none; background: transparent; }\n .result-head { display: grid; gap: .45rem; }\n .result-head .status-line { justify-self: start; }\n .result-tabs { gap: 0; }\n .result-tabs a { flex: 1 1 auto; min-width: 0; justify-content: center; padding: 0 .25rem; font-size: .8125rem; gap: .3rem; white-space: nowrap; min-height: 2.75rem; overflow: hidden; }\n .result-facts { grid-template-columns: 1fr; }\n .result-request .diff-comment-form button, .result-request .revision-from-comments button { width: 100%; }\n .result-action .button-link, .result-action form button { width: 100%; box-sizing: border-box; min-height: 2.75rem; }\n .result-request .revision-from-comments { display: grid; }\n .result-links { display: grid; gap: 0; }\n .result-links a { min-height: 2.75rem; display: inline-flex; align-items: center; }\n .result-links a + a::before { content: none; }\n .task-chat-head { display: block; }\n .task-chat-head > .badge { display: none; }\n .task-chat-title-line { display: grid; gap: .65rem; }\n .task-chat-title-line .task-view-switch { justify-self: start; }\n #task-chat-live { gap: .75rem; }\n .task-journey { padding: .85rem; }\n .task-journey > ol { margin: .85rem -.2rem .65rem; }\n .task-journey > ol::before { left: 9%; right: 9%; }\n .task-journey li { font-size: .56rem; }\n .task-journey li i { width: 1.25rem; height: 1.25rem; }\n .chat-action-card > summary { align-items: flex-start; padding: .85rem; }\n .chat-action-card > summary .button-link { min-height: 2.1rem; padding-inline: .6rem; font-size: .65rem; white-space: nowrap; }\n .chat-action-card > summary small { max-width: 14rem; }\n .chat-budget { gap: .3rem; margin: .65rem 0 .9rem; }\n .chat-budget > span { padding: .25rem .48rem; }\n .chat-budget > span:first-child { max-width: 100%; overflow: hidden; text-overflow: ellipsis; }\n .chat-overview { padding: .8rem; }\n .chat-fleet-context { margin: .5rem 0 .75rem; border: 1px solid var(--glass-border); border-radius: 1rem; background: var(--glass); }\n .chat-fleet-context[open] { padding-bottom: .25rem; }\n .chat-fleet-context > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; min-height: 2.75rem; padding: .75rem .9rem; color: var(--muted-foreground); font-size: .8rem; cursor: pointer; }\n .chat-fleet-context > summary::before { content: \"\u25B8\"; flex: none; margin-right: .35rem; font-size: .7rem; }\n .chat-fleet-context[open] > summary::before { content: \"\u25BE\"; }\n .chat-fleet-context > summary .meta { margin-left: auto; font-size: .68rem; white-space: nowrap; }\n .chat-fleet-context .chat-overview { border: 0; box-shadow: none; margin: 0; }\n .chat-overview-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .chat-overview-head { align-items: flex-start; }\n .chat-overview-copy strong, .chat-overview-copy span { white-space: normal; }\n .thread { min-height: 18rem; padding: 0; }\n .thread .msg.op { max-width: 90%; }\n .thread .msg.mate { padding-left: 2.8rem; padding-right: 0; }\n .thread .msg.mate::before { width: 2.15rem; height: 2.15rem; border-radius: .7rem; }\n .proposal-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .proposal-actions .acts { align-items: stretch; flex-direction: row; flex-wrap: wrap; }\n .proposal-actions .acts form { flex: 1 1 8rem; width: auto; }\n .proposal-actions .acts form:has(.arm) { flex-basis: 100%; }\n .proposal-actions .acts button { width: 100%; }\n .chat-prompts {\n display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: .5rem; width: 100%; max-width: 100%; overflow: visible; padding: 0;\n }\n .chat-prompts form, .chat-prompts button { min-width: 0; width: 100%; }\n .chat-prompts form:last-child:nth-child(odd) { grid-column: 1 / -1; }\n .chat-main { padding-bottom: 0; }\n .chat-main #latest { scroll-margin-top: 7rem; }\n .chat-workspace .composer {\n position: fixed; left: 1rem; right: 1rem; bottom: calc(3.75rem + env(safe-area-inset-bottom, 0rem));\n z-index: 29; margin: 0; padding: .45rem; border-radius: 1.1rem; box-shadow: var(--shadow-overlay);\n }\n /* A confirmation is the primary act. Let the composer return to the\n document flow while one is pending so it can never cover the card's\n explanation or buttons on a short phone viewport. */\n .chat-main:has(.proposal.pending) { padding-bottom: 0; }\n .chat-main:has(.proposal.pending) .composer { position: static; width: 100%; margin-top: .5rem; }\n /* \u2026and the suggestion chips step aside for the same reason: on a phone\n the card, its buttons, and the composer then share one screen. */\n .chat-main:has(.proposal.pending) .chat-prompts { display: none; }\n /* First use is one cohesive intake card: prompt, suggestions, then the\n box. A fixed box belongs to an established thread; here it would sit\n above the very question it is asking the person to answer. */\n .chat-main:has(.chat-empty) { padding-bottom: 0; }\n .chat-main:has(.chat-empty) .thread { min-height: 0; margin-bottom: .5rem; }\n .chat-main:has(.chat-empty) .chat-empty {\n width: 100%; min-width: 0; max-width: 100%; margin: 0; padding: 2rem 0 .75rem;\n }\n .chat-main:has(.chat-empty) .chat-empty > strong,\n .chat-main:has(.chat-empty) .chat-empty > .meta { max-width: 22rem; margin-inline: auto; }\n .chat-main:has(.chat-empty) .chat-empty > .meta { margin-top: .45rem; }\n .chat-main:has(.chat-empty) .composer { position: static; width: 100%; margin-top: .5rem; }\n .composer textarea { min-height: 2.75rem; padding: .55rem .65rem; font-size: 1rem; }\n /* Hide bottom navigation only when viewport shrink indicates a soft\n keyboard; hardware-keyboard focus and pinch zoom keep it available. */\n html[data-mobile-keyboard] .tabbar { display: none; }\n html[data-mobile-keyboard] .chat-workspace .composer { bottom: calc(var(--keyboard-inset, 0px) + .5rem); }\n /* The raised composer needs the same room beneath the thread as the\n resting one, or the newest message hides behind it while typing. */\n html[data-mobile-keyboard] main:has(.chat-workspace) { padding-bottom: calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1.5rem); }\n html[data-mobile-keyboard] main:has(.chat-workspace) :is(input, textarea, button, summary, a) { scroll-margin-block: 6rem calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1.5rem); }\n html[data-mobile-keyboard] .chat-new-update-holder { bottom: calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1rem); }\n html[data-mobile-keyboard] .sticky-actions { bottom: .5rem; }\n .work-tools { display: block; }\n .work-tools > summary, .work-tools-menu a, .work-views a { min-height: 2.75rem; }\n .work-tools-menu a { display: flex; align-items: center; }\n main :is(input, textarea, button, summary, a) { scroll-margin-block: 6rem calc(var(--composer-height, 4rem) + 5rem); }\n }\n main:has(.mate-mint) { max-width: 68rem; }\n main:has(.mate-mint) > h1 { margin-top: .5rem; font-size: 1.7rem; letter-spacing: -.04em; }\n .mate-mint { position: relative; max-width: 46rem; margin-top: 1.5rem; padding: 1.5rem; border-radius: calc(var(--radius) + 4px); }\n .mate-mint::before {\n content: \"T\"; position: absolute; top: 1.4rem; left: 1.4rem; width: 3rem; height: 3rem;\n display: grid; place-items: center; border: 1px solid var(--glass-border); border-radius: 1rem;\n background: var(--glass-strong);\n box-shadow: var(--so-pill-shadow);\n font: 600 .75rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .mate-mint > p:first-child { min-height: 3rem; margin: 0; padding: .15rem 0 1.25rem 4rem; font-size: .95rem; }\n .mate-mint > p:first-child strong { display: block; margin-bottom: .2rem; font-size: 1.1rem; letter-spacing: -.02em; }\n .mate-mint form { border-top: 1px solid var(--glass-border); padding-top: .5rem; }\n /* The start act is the page's one primary (UI polish 2026-09-13). */\n .mate-mint form > button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .mate-mint form > button[type=submit]:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .mate-terms { display: flex; flex-wrap: wrap; gap: 1rem; align-items: baseline; padding: .35rem 0; }\n .mate-terms .inline-field { white-space: nowrap; }\n button.quiet { background: transparent; color: var(--fg-muted); border-color: var(--border); }\n .answer-options { list-style: none; padding: 0; margin: 0.4rem 0; }\n .answer-options li { padding: 0.35rem 0.6rem; border-left: 1px solid var(--border); margin: 0.25rem 0; }\n .answer-options li.picked { border-left-color: var(--foreground); }\n .shared-action { max-width: 49rem; overflow-wrap: anywhere; }\n .shared-action form { margin-top: 1.5rem; }\n .shared-action label.arm { display: flex; align-items: center; gap: .6rem; min-height: 44px; padding-block: .4rem; }\n .shared-action label.arm input { flex: none; width: 20px; height: 20px; }\n .shared-action button { white-space: nowrap; }\n .proposal label.arm { display: inline-flex; gap: 0.35rem; align-items: center; margin-right: 0.5rem; font-size: 0.85rem; }\n .coordinator-proposals .card { margin: 0.5rem 0; }\n .workspace-head { display: flex; align-items: center; gap: .5rem; min-width: 0; }\n .workspace-head .workspace-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; font-family: var(--font-mono); font-size: .8125rem; }\n .workspace-head .badge { flex: none; }\n .workspace-head form { margin: 0 0 0 auto; }\n .workspace-head form button { min-height: 2rem; padding: 0 .625rem; font-size: .75rem; width: auto; }\n .workspace-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .375rem; margin-top: .625rem; }\n .workspace-stats .pulse-stat {\n color: var(--muted-foreground); font-size: .6875rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n background: var(--muted); border-radius: calc(var(--radius) - 4px); padding: .375rem .5rem; text-align: center;\n }\n .workspace-stats .pulse-stat b { display: block; color: var(--foreground); font-weight: 600; font-family: var(--font-mono); font-size: 1.125rem; line-height: 1.2; font-variant-numeric: tabular-nums; }\n .workspace-stats .pulse-stat.hot b { color: var(--brand); }\n .workspace-bar { display: flex; gap: 2px; height: .375rem; margin-top: .625rem; border-radius: 9999px; overflow: hidden; background: var(--muted); }\n .workspace-bar .seg { flex: 1 1 0; }\n .workspace-bar .seg.attention { background: var(--brand); }\n .workspace-bar .seg.building { background: var(--running); }\n .workspace-bar .seg.waiting { background: var(--muted-foreground); }\n .workspace-bar .seg.queued { background: color-mix(in srgb, var(--muted-foreground) 45%, transparent); }\n .attention-stack { display: grid; gap: .55rem; }\n .attention-stack .decide-card { margin: 0; }\n .attention-stack .q { display: flex; gap: .5rem; align-items: center; justify-content: space-between; }\n .wb-rail-head {\n display: flex; align-items: flex-end; justify-content: space-between; gap: .75rem;\n padding: 0 .15rem .6rem; border-bottom: 1px solid var(--border);\n }\n .wb-rail-head h2 { margin: .1rem 0 0; color: var(--foreground); font-size: .875rem; letter-spacing: -.01em; text-transform: none; font-family: var(--font-sans); }\n .wb-rail-head a { font-size: .75rem; color: var(--muted-foreground); }\n .wb-group { margin-top: 1.05rem; }\n .wb-group > h2 {\n display: flex; align-items: center; justify-content: space-between; margin: 0 .2rem .35rem;\n font-size: .65rem;\n }\n .wb-group > h2 .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .42rem; }\n .wb-row {\n display: block; padding: .58rem .65rem; margin: .16rem 0; border: 1px solid transparent;\n border-radius: calc(var(--radius) - 4px); color: inherit; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .wb-row:hover { background: var(--card); border-color: var(--border); } }\n .wb-row.wb-selected { background: var(--muted); border-color: var(--border); }\n .wb-row .wb-title { display: block; font-size: .8125rem; font-weight: 500; line-height: 1.35; }\n .wb-row .wb-meta { display: flex; align-items: center; gap: .3rem; flex-wrap: wrap; margin-top: .22rem; }\n .wb-row .badge { padding: .04rem .42rem; font-size: .65rem; }\n .wb-row .wb-reason { display: block; color: var(--muted-foreground); font-size: .72rem; margin-top: .22rem; line-height: 1.35; }\n @media (max-width: 720px) {\n .control-room-head { display: block; }\n .control-room-head .actions { justify-content: flex-start; margin-top: .75rem; }\n .command-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .workspace-pulse { grid-template-columns: 1fr; }\n .workspace-stats .pulse-stat { padding: .375rem .125rem; font-size: .625rem; letter-spacing: -.01em; }\n .permission-toggle { grid-template-columns: 1fr; }\n .task-intake { margin-top: .25rem; }\n .task-intake-hero { text-align: left; margin-bottom: .9rem; }\n .task-intake-mark { display: none; }\n .task-composer { margin-inline: 0; padding: .55rem; border-radius: 1.15rem; }\n .task-prompt textarea { min-height: 7.25rem; padding: .75rem; font-size: 1rem; }\n .task-composer-footer { flex-wrap: wrap; }\n .task-context { order: 1; flex-basis: calc(100% - 7rem); }\n .task-context-chip:first-child { max-width: 9.5rem; }\n .task-context-chip:nth-child(2) { display: none; }\n .task-quality { order: 2; }\n .task-submit { order: 3; width: 100%; }\n .task-options { order: 4; }\n .task-options-grid { grid-template-columns: 1fr; }\n .task-options-grid .wide, .task-options-grid .permission-field { grid-column: auto; }\n .agents-form { grid-template-columns: 1fr; }\n .agents-roles { grid-template-columns: 1fr; }\n .agents-risk-guide div, .agents-role-row { grid-template-columns: 1fr; }\n .approval-card { padding: 1rem; }\n /* The orientation block says the wait on a phone; the kicker would say it twice. */\n .approval-card .approval-kicker { display: none; }\n .approval-boundaries, .approval-confirm { grid-template-columns: 1fr; }\n /* The approval stays IN FLOW on phones: the password field comes\n first and the button follows it \u2014 never a sticky control floating\n over the field it confirms. */\n .approval-confirm .sticky-actions { position: static; margin-top: 0; padding: 0; border-top: 0; }\n }\n\n /* Runner lanes (queue + fleet): one column per worker. */\n .content > main:has(.lanes) { max-width: none; }\n .lanes {\n display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));\n gap: .625rem; padding-bottom: .75rem; align-items: start;\n }\n @media (max-width: 40rem) {\n .lanes { display: flex; flex-direction: column; }\n .lanes .lane { min-height: 0; }\n }\n .runner-note { width: 100%; }\n .queue-handle {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 2rem; height: 2rem; margin: -.375rem .125rem -.375rem -.5rem; vertical-align: middle;\n color: var(--muted-foreground); cursor: grab; user-select: none; touch-action: none; border-radius: calc(var(--radius) - 4px);\n }\n .queue-handle svg { width: 1.125rem; height: 1.125rem; }\n .queue-handle:active { cursor: grabbing; background: var(--muted); }\n .icon-button, .inline button.icon-button { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 2.75rem; min-width: 2.75rem; padding: 0; }\n .icon-button svg { width: 1rem; height: 1rem; }\n .queue-card p { margin: 0; }\n .queue-card a { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .queue-card a:hover { text-decoration: underline; } }\n .queue-card .row + .row { margin-top: .125rem; border-bottom: none; }\n .queue-card p.row { padding: 0; border-bottom: none; }\n .tracks { margin-top: 1.5rem; }\n .tracks > .hint { margin-bottom: .75rem; }\n .track-row { margin-bottom: .6rem; }\n .track-row p { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }\n .track-row p .right { margin-left: auto; }\n .track-row a { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .track-row a:hover { text-decoration: underline; } }\n .track-strip { display: inline-flex; gap: .3rem; align-items: center; vertical-align: middle; }\n .fire {\n display: inline-block; width: .65rem; height: .65rem; border-radius: 50%;\n background: var(--muted);\n }\n .fire-ok { background: var(--success); }\n .fire-bad { background: var(--destructive); }\n .fire-live { background: var(--running); animation: pulse 1.6s ease-in-out infinite; }\n .fire-skip { background: transparent; border: 1.5px solid var(--muted); }\n\n/* the phone: fingers, not cursors \u2014 tested at 320/390px */\ninput, select, textarea { font-size: 16px; }\nbutton { min-height: 44px; }\n@media (max-width: 40rem) {\n form.card button[type=submit], form > button[type=submit] { width: 100%; }\n input[type=text], input[type=password] { width: 100%; max-width: 100%; box-sizing: border-box; }\n main { padding-bottom: calc(1rem + env(safe-area-inset-bottom)); }\n /* Task actions are composed for a thumb, not allowed to wrap according\n to their intrinsic text widths. Every row owns the available width. */\n .task-title-row { display: grid; gap: .6rem; margin-bottom: .8rem; }\n .task-title-row .task-main-title { margin-bottom: 0; }\n .task-title-row .task-view-switch { justify-self: start; }\n .task-main-title { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem .4rem; }\n .dispatch-copy { display: grid; gap: .2rem; }\n .dispatch-copy > strong { line-height: 1.35; }\n .dispatch-action-link, details.dispatch-recovery > summary { width: 100%; box-sizing: border-box; justify-content: center; }\n .proof-review-actions { display: grid; }\n .proof-review-actions > .button-link { width: 100%; box-sizing: border-box; text-align: center; }\n details.proof-exception[open] { width: 100%; }\n .dispatch-recovery-body { padding: .7rem; }\n .dependency-repair-actions { display: grid; grid-template-columns: 1fr; gap: .5rem; margin-top: .75rem; }\n .dependency-repair-actions form { display: flex; width: 100%; max-width: none; margin: 0; }\n .dependency-repair-actions form > button[type=submit] { width: 100%; }\n .dependency-repair-actions .dependency-repair-replace {\n display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .5rem;\n }\n .dependency-repair-actions .dependency-repair-label { width: 100%; min-width: 0; }\n .dependency-repair-actions .dependency-repair-label > select { width: 100%; min-width: 0; max-width: none; }\n .dependency-repair-actions .dependency-repair-replace > button[type=submit] { width: auto; }\n .acts-bar { display: grid; grid-template-columns: minmax(0, 1fr); gap: .5rem; margin: .75rem 0 .35rem; }\n .acts-bar > *, .acts-bar form.inline { min-width: 0; margin: 0; }\n .acts-bar .primary { display: block; width: 100%; }\n .acts-bar .primary form { width: 100%; margin: 0; }\n .acts-bar .primary form.inline > button[type=submit] { width: 100%; margin: 0; }\n .acts-bar .act-hold {\n display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center;\n gap: .5rem; width: 100%;\n }\n .acts-bar .act-hold input[type=text] { width: 100%; min-width: 0; margin: 0; }\n .acts-bar .act-hold > button[type=submit] { width: auto; white-space: nowrap; }\n .acts-why { margin: .25rem 0 .85rem; font-size: .75rem; line-height: 1.5; }\n .acts-why-plan { display: none; }\n .task-scope-needed { padding: .85rem 1rem; }\n .task-scope-needed p { margin: .2rem 0; }\n .receipt-head { display: grid; gap: .45rem; }\n .receipt-head .status-line { justify-self: start; }\n .receipt-facts { grid-template-columns: 1fr; }\n .receipt-actions { display: grid; grid-template-columns: 1fr; }\n .receipt-actions .button-link { width: 100%; box-sizing: border-box; text-align: center; }\n /* The cockpit already stacks at 980px (above); only the phone-width\n act card and section padding are decided here. */\n .cockpit-detail { grid-row: 1; }\n .cockpit-queue { grid-row: 2; margin-top: .85rem; padding-top: .85rem; border-top: 1px solid var(--border); border-bottom: 0; }\n .cockpit-next { display: grid; }\n .cockpit-next form, .cockpit-next .button-link { width: 100%; box-sizing: border-box; }\n .cockpit-next form input[type=text] { flex: 1 1 100%; }\n .cockpit-next form button[type=submit] { width: 100%; }\n .cockpit-section { padding: .85rem .8rem; }\n .cockpit-disclosure { padding: 0; }\n .cockpit-disclosure > summary { padding: .8rem; }\n .cockpit-disclosure-body { padding: 0 .8rem .85rem; }\n .cockpit-accept-form { display: grid; }\n .cockpit-accept-form button { width: 100%; }\n .diff-review { margin-inline: -.1rem; }\n .diff-review-bar { padding-left: .7rem; }\n .diff-file > summary { padding-inline: .7rem; }\n .diff-line { grid-template-columns: 2.75rem 2.65rem 2.65rem minmax(max-content, 1fr); min-height: 2.75rem; }\n .diff-annotate, .diff-annotate-space { width: 2.75rem; min-width: 2.75rem; min-height: 2.75rem; }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 2.65rem 2.65rem minmax(max-content, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-annotate,\n .diff-review[data-mode=\"view\"] .diff-annotate-space { width: 0; min-width: 0; }\n .diff-line code, .diff-gutter { padding-top: .72rem; padding-bottom: .72rem; }\n .diff-comment-target { grid-template-columns: minmax(0, 1fr) 4.75rem; }\n .diff-comment-form button { width: 100%; }\n .revision-from-comments { display: grid; }\n .revision-from-comments button { width: 100%; }\n /* A decision option on a phone: the answer is the full-width thumb\n target; its recommendation and consequence share the line beneath. */\n .decide-option > button { flex: 0 0 100%; width: 100%; }\n .decide-option .badge { flex: none; }\n .decide-option .meta { flex: 1 1 10rem; }\n /* A queue card's controls read as one row under the id: to-front \u00B7 reserve (stretching) \u00B7 move. */\n .queue-card p.row.meta { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }\n .queue-card p.row.meta > .mono { flex: 0 0 100%; }\n .queue-card .inline { margin: 0; display: inline-flex; align-items: center; gap: .375rem; }\n .queue-card .inline:last-child { flex: 1 1 auto; min-width: 0; }\n .queue-card .inline > button[type=submit]:not(.icon-button) { width: auto; }\n .queue-card .inline select { flex: 1 1 6rem; min-width: 0; width: auto; min-height: 2.75rem; margin: 0; }\n .queue-card .mono { overflow-wrap: anywhere; }\n .queue-card .row + .row { margin-top: .5rem; }\n /* The title sits beside the grip and wraps within its own box; the\n chips flow after it, never above the name. */\n .queue-card p.row > a:first-of-type { flex: 1 1 12rem; min-width: 0; }\n}\n/* A phone reads a long changed line wrapped, never scrolled sideways: the\n line keeps its numbers and marker, the code column takes what is left. */\n@media (max-width: 760px) {\n .diff-lines { overflow-x: visible; }\n .diff-line, .diff-review .diff-line { min-width: 0; grid-template-columns: 2.75rem 2.65rem 2.65rem minmax(0, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 2.65rem 2.65rem minmax(0, 1fr); }\n .diff-line code { white-space: pre-wrap; overflow-wrap: anywhere; }\n .diff-hunk-head { overflow-x: visible; white-space: pre-wrap; overflow-wrap: anywhere; }\n}\n@media (max-width: 30rem) {\n .dependency-repair-actions .dependency-repair-replace { grid-template-columns: minmax(0, 1fr); }\n .dependency-repair-actions .dependency-repair-replace > button[type=submit] { width: 100%; }\n}\n@media (max-width: 26rem) {\n .acts-bar .act-hold { grid-template-columns: minmax(0, 1fr); }\n .acts-bar .act-hold > button[type=submit] { width: 100%; }\n}\n.next-pager { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem .75rem; margin: 0 0 .75rem; }\n.next-pager .skip {\n margin-left: auto; display: inline-flex; align-items: center; justify-content: center; min-height: 2.75rem;\n padding: 0 .875rem; border: 1px solid var(--border); border-radius: 999px;\n text-decoration: none; color: var(--foreground); background: var(--card);\n}\n@media (hover: hover) and (pointer: fine) { .next-pager .skip:hover { border-color: color-mix(in srgb, var(--border) 60%, var(--muted-foreground)); } }\n\n/* Motion: only where a human caused the change \u2014 navigation, presses,\n overlays. Liveness swaps stay instant; the pulse dot is the one \"alive\"\n signal. Everything dies under prefers-reduced-motion; auto-refresh pages\n opt out of the navigation cross-fade separately (see shell()). */\n@view-transition { navigation: auto; }\n/* A page change fades THROUGH, not across: the old page leaves before the new\n one arrives, so two pages' text is never on screen at once. The sidebar,\n the same on both, swaps in place instead of fading (each shell names its\n own, so a page can never carry the name twice). */\n::view-transition-old(root) { animation: so-page-leave 80ms ease-in both; }\n::view-transition-new(root) { animation: so-page-arrive 140ms ease-out 60ms both; }\n@keyframes so-page-leave { to { opacity: 0; } }\n@keyframes so-page-arrive { from { opacity: 0; } }\n.side { view-transition-name: so-nav-page; }\n.so-sidebar { view-transition-name: so-nav-app; }\n::view-transition-group(so-nav-page), ::view-transition-group(so-nav-app),\n::view-transition-old(so-nav-page), ::view-transition-new(so-nav-page),\n::view-transition-old(so-nav-app), ::view-transition-new(so-nav-app) { animation: none; }\n/* UI polish 2026-09-13 \u2014 the motion contract. Feedback transitions run\n 140\u2013200 ms on color, border, shadow, opacity, and transform only; an\n overlay's entrance is at most 220 ms of opacity + transform. Nothing\n animates a width, height, margin, grid track, or blur, and nothing\n pulses for decoration. The reduce block below is universal: every\n animation and transition dies, and no page reads differently for it. */\n@media (prefers-reduced-motion: no-preference) {\n .tabbar a, .side nav a { transition: color .15s, background .15s; }\n button:active { transform: scale(.985); }\n /* Anchor buttons press like buttons; nav links fill instead. The palette\n and shortcuts overlay are keyboard-summoned, so they appear at once. */\n .button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip { transition: transform 160ms var(--so-ease-out); }\n :is(.button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip):active { transform: scale(.985); }\n .chat-workspace.projects-open .chat-projects { animation: rise 200ms ease-out; }\n .chat-workspace.projects-open::before { animation: fade 180ms ease-out; }\n .switcher[open] .switcher-menu { animation: rise 160ms ease-out; }\n @media (hover: hover) and (pointer: fine) {\n .lane-card, .decide-card, .menu-row, .chat-overview-item, .proposal { transition: border-color .15s, transform .15s, box-shadow .15s; }\n .lane-card:hover, .decide-card:hover, .menu-row:hover {\n \n box-shadow: 0 2px 8px -2px rgb(0 0 0 / .35);\n }\n }\n}\n@keyframes rise { from { opacity: 0; transform: translateY(4px); } }\n@keyframes fade { from { opacity: 0; } }\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after { animation: none !important; transition: none !important; }\n ::view-transition-group(*), ::view-transition-old(root), ::view-transition-new(root) { animation: none; }\n button:active, :is(.button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip):active { transform: none; }\n @media (hover: hover) and (pointer: fine) { button:hover, .side nav a:hover, .chat-project-card:hover, .lane-card:hover, .decide-card:hover, .menu-row:hover { transform: none; } }\n}\n\n/* The shortcuts overlay: display-only, toggled by the chrome layer, absent\n from sensitive pages. */\n.kbd-help {\n position: fixed; top: 18vh; left: 50%; transform: translateX(-50%); width: min(26rem, 92vw);\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay);\n padding: 1rem 1.25rem; z-index: 50;\n}\n.kbd-help h2 { margin: 0 0 .5rem; font-size: .8125rem; }\n.kbd-help table { width: 100%; border-collapse: collapse; font-size: .8125rem; }\n.kbd-help td { padding: .25rem 0; vertical-align: top; }\n.kbd-help td:first-child { width: 7.5rem; color: var(--muted-foreground); white-space: nowrap; }\n.kbd-help kbd {\n font-family: var(--font-mono); font-size: .75rem; background: var(--muted);\n border: 1px solid var(--border); border-radius: .3rem; padding: .05rem .35rem;\n}\n@media (max-width: 760px) {\n .kbd-help {\n top: auto; bottom: 0; left: 0; right: 0; transform: none; width: auto;\n border-radius: var(--radius) var(--radius) 0 0;\n padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0rem));\n }\n}\n\n/* The tournament comparison: an at-a-glance table and side-by-side cards. */\n.scroll-x { overflow-x: auto; max-width: 100%; }\n.contest-glance { border-collapse: collapse; font-size: .8125rem; min-width: 34rem; margin: .75rem 0; }\n.contest-glance th, .contest-glance td { text-align: left; padding: .375rem .75rem .375rem 0; vertical-align: top; border-bottom: 1px solid var(--border); }\n.contest-glance th { font-weight: 600; }\n.contest-glance tr:last-child td { border-bottom: none; }\n.contest-compare { display: grid; grid-template-columns: 1fr; gap: .75rem; align-items: start; }\n@media (min-width: 1100px) {\n .content > main:has(.contest-compare) { max-width: none; }\n .contest-compare { grid-template-columns: repeat(auto-fit, minmax(24rem, 1fr)); }\n}\n.contest-compare .card { margin: 0; }\n\n/* The per-file comment button: a small real button beside a diff row. */\nbutton.pick-file { min-height: 1.75rem; padding: 0 .55rem; font-size: .75rem; }\n\n/* Sticky ceremony actions: single-primary-action forms keep their submit\n within thumb reach on phones. Desktop: plain flow. */\n@media (max-width: 760px) {\n .sticky-actions {\n position: sticky; bottom: calc(3.5rem + env(safe-area-inset-bottom, 0rem)); z-index: 20;\n background: var(--background); border-top: 1px solid var(--border);\n padding: .625rem 0; margin-top: .75rem;\n }\n .sticky-actions button { margin: 0; }\n}\n\n/* A time a person reads (when-html.ts): the full stamp on a desk, the short\n one on a phone; the full stamp stays in the title. */\n.so-when-short { display: none; }\n@media (max-width: 760px) {\n .so-when-full { display: none; }\n .so-when-short { display: inline; }\n /* Server pages outside the workspace keep the same phone rhythm. */\n main { padding: var(--so-phone-gap) var(--so-phone-gutter) 3rem; }\n h2 { margin: 1.25rem 0 .375rem; }\n .card { padding: var(--so-phone-card); margin: var(--so-phone-row) 0; }\n .problem { padding: .5rem .625rem; margin: var(--so-phone-row) 0; }\n .meta, .hint { line-height: 1.35; }\n details { margin: var(--so-phone-row) 0; }\n}\n";
728
+ export declare const STYLE = "\n/* The Console \u2014 the design system, v4 \"Signal\" (2026-09-27). A neutral\n frame with paper sheets inset into it (Arc, Linear), compact Raycast\n density, Geist for words and Geist Mono for machine facts. Ink is every\n act a person can take; the accent (ink by default) means \"waits on you\" and nothing\n else; blue means live. Flat surfaces: hairlines and one soft sheet\n shadow, no glass. Zero dependencies, zero page JS beyond the nonce'd\n chrome layer. */\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 400;\n font-display: swap; src: url(\"/fonts/geist-sans-400.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 500;\n font-display: swap; src: url(\"/fonts/geist-sans-500.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist\"; font-style: normal; font-weight: 600;\n font-display: swap; src: url(\"/fonts/geist-sans-600.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 400;\n font-display: swap; src: url(\"/fonts/geist-mono-400.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 500;\n font-display: swap; src: url(\"/fonts/geist-mono-500.woff2\") format(\"woff2\");\n }\n @font-face {\n font-family: \"Geist Mono\"; font-style: normal; font-weight: 600;\n font-display: swap; src: url(\"/fonts/geist-mono-600.woff2\") format(\"woff2\");\n }\n /* One palette for every page (2026-09-27): neutral grey and paper with\n * one chart magenta, light by day and dark after hours. The device decides unless\n * the person pins a theme (html[data-theme], set from their cookie). The\n * console's older token names map onto it, so the React workspace, the\n * server-rendered pages and the pre-script fallback all paint the same. */\n :root {\n color-scheme: light;\n\n --so-ground: #efefef; --so-paper: #ffffff; --so-sidebar: #efefef; --so-raised: #f5f5f5;\n --so-ink: #171717; --so-muted: #666666; --so-line: #e6e6e6; --so-input-line: #d4d4d4;\n --so-accent: #171717; --so-accent-hover: #383838; --so-accent-text: #171717; --so-on-accent: #ffffff; --so-soft: #f2f2f2;\n --so-nav-ink: #525252; --so-nav-hover: #e4e4e4; --so-nav-current: #ffffff; --so-nav-current-ink: #171717;\n --so-signal: #171717; --so-signal-hover: #383838; --so-on-signal: #ffffff; --so-signal-soft: #e8e8e8;\n --so-danger: #c4320a; --so-danger-soft: #feebe7; --so-success: #218358; --so-success-soft: #e6f6eb;\n --so-warning: #ab6400; --so-warning-soft: #fff4d5; --so-info: #0d74ce; --so-info-soft: #e6f4fe;\n --so-neutral-ink: #525252; --so-neutral-soft: #f0f0f0; --so-live: #0d74ce;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px rgb(0 0 0 / .06), 0 1px 2px rgb(0 0 0 / .04), 0 4px 12px -6px rgb(0 0 0 / .06);\n --so-pill-shadow: 0 0 0 1px rgb(0 0 0 / .06), 0 1px 2px rgb(0 0 0 / .06);\n --so-overlay: rgb(0 0 0 / .32); --so-shadow-overlay: 0 0 0 1px rgb(0 0 0 / .08), 0 24px 48px -12px rgb(0 0 0 / .22);\n --so-selection: #d4d4d4; --so-scroll: #cfcfcf; --so-code-bg: #fafafa; --so-user-bubble: #f2f2f2;\n\n --background: var(--so-ground); --foreground: var(--so-ink); --card: var(--so-paper);\n --muted: var(--so-raised); --muted-foreground: var(--so-muted); --border: var(--so-line); --input: var(--so-input-line);\n --primary: var(--so-accent); --primary-foreground: var(--so-on-accent); --secondary: var(--so-raised); --secondary-foreground: var(--so-ink);\n --accent: var(--so-soft); --destructive: var(--so-danger); --destructive-strong: var(--so-danger); --destructive-soft: var(--so-danger-soft);\n --success: var(--so-success); --success-soft: var(--so-success-soft); --warning: var(--so-warning); --warning-soft: var(--so-warning-soft);\n --running: var(--so-info); --running-soft: var(--so-info-soft); --ring: var(--so-signal);\n /* Magenta means one thing: a person is needed (approve, answer, decide). */\n --brand: var(--so-attention); --brand-foreground: var(--so-on-attention); --brand-soft: var(--so-attention-soft);\n --glass: var(--so-paper); --glass-strong: var(--so-paper); --glass-border: var(--so-line); --glass-highlight: transparent;\n --ambient-one: transparent; --ambient-two: transparent; --user-message: var(--so-user-bubble);\n --surface: var(--so-paper); --ok: var(--so-success); --danger: var(--so-danger); --fg-muted: var(--so-muted);\n --shadow: none; --shadow-overlay: var(--so-shadow-overlay);\n --radius: 0.625rem;\n --so-ease-out: cubic-bezier(.23, 1, .32, 1);\n --font-sans: \"Geist\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n --font-mono: \"Geist Mono\", ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace;\n /* Phone spacing steps (760px and narrower): side gutter, gap under the\n header, gap between page blocks, between rows, and inside a card. */\n --so-phone-gutter: 16px; --so-phone-gap: 12px; --so-phone-block: 14px; --so-phone-row: 8px; --so-phone-card: 12px;\n }\n @media (prefers-color-scheme: dark) {\n :root:not([data-theme=\"light\"]) {\n color-scheme: dark;\n\n --so-ground: #0b0b0b; --so-paper: #161616; --so-sidebar: #0b0b0b; --so-raised: #1c1c1c;\n --so-ink: #ededed; --so-muted: #a1a1a1; --so-line: #262626; --so-input-line: #363636;\n --so-accent: #ededed; --so-accent-hover: #ffffff; --so-accent-text: #ededed; --so-on-accent: #0a0a0a; --so-soft: #1f1f1f;\n --so-nav-ink: #a1a1a1; --so-nav-hover: #171717; --so-nav-current: #1f1f1f; --so-nav-current-ink: #ededed;\n --so-signal: #ededed; --so-signal-hover: #ffffff; --so-on-signal: #0a0a0a; --so-signal-soft: #2e2e2e;\n --so-danger: #ff977d; --so-danger-soft: rgb(255 151 125 / .12); --so-success: #3dd68c; --so-success-soft: rgb(61 214 140 / .12);\n --so-warning: #ffca16; --so-warning-soft: rgb(255 202 22 / .12); --so-info: #70b8ff; --so-info-soft: rgb(112 184 255 / .12);\n --so-neutral-ink: #b4b4b4; --so-neutral-soft: #1f1f1f; --so-live: #70b8ff;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px #262626, 0 1px 2px rgb(0 0 0 / .4);\n --so-pill-shadow: 0 0 0 1px #2a2a2a, 0 1px 2px rgb(0 0 0 / .5);\n --so-overlay: rgb(0 0 0 / .6); --so-shadow-overlay: 0 0 0 1px #2e2e2e, 0 24px 48px -12px rgb(0 0 0 / .7);\n --so-selection: #3a3a3a; --so-scroll: #333333; --so-code-bg: #111111; --so-user-bubble: #202020;\n }\n }\n :root[data-theme=\"dark\"] {\n color-scheme: dark;\n\n --so-ground: #0b0b0b; --so-paper: #161616; --so-sidebar: #0b0b0b; --so-raised: #1c1c1c;\n --so-ink: #ededed; --so-muted: #a1a1a1; --so-line: #262626; --so-input-line: #363636;\n --so-accent: #ededed; --so-accent-hover: #ffffff; --so-accent-text: #ededed; --so-on-accent: #0a0a0a; --so-soft: #1f1f1f;\n --so-nav-ink: #a1a1a1; --so-nav-hover: #171717; --so-nav-current: #1f1f1f; --so-nav-current-ink: #ededed;\n --so-signal: #ededed; --so-signal-hover: #ffffff; --so-on-signal: #0a0a0a; --so-signal-soft: #2e2e2e;\n --so-danger: #ff977d; --so-danger-soft: rgb(255 151 125 / .12); --so-success: #3dd68c; --so-success-soft: rgb(61 214 140 / .12);\n --so-warning: #ffca16; --so-warning-soft: rgb(255 202 22 / .12); --so-info: #70b8ff; --so-info-soft: rgb(112 184 255 / .12);\n --so-neutral-ink: #b4b4b4; --so-neutral-soft: #1f1f1f; --so-live: #70b8ff;\n --so-attention: var(--so-signal); --so-on-attention: var(--so-on-signal); --so-attention-soft: var(--so-signal-soft);\n --so-sheet-shadow: 0 0 0 1px #262626, 0 1px 2px rgb(0 0 0 / .4);\n --so-pill-shadow: 0 0 0 1px #2a2a2a, 0 1px 2px rgb(0 0 0 / .5);\n --so-overlay: rgb(0 0 0 / .6); --so-shadow-overlay: 0 0 0 1px #2e2e2e, 0 24px 48px -12px rgb(0 0 0 / .7);\n --so-selection: #3a3a3a; --so-scroll: #333333; --so-code-bg: #111111; --so-user-bubble: #202020;\n }\n * { box-sizing: border-box; }\n /* Touch: no grey flash on a tap, no double-tap zoom wait on a control,\n and a long press never selects a control's label. Text stays selectable. */\n html { -webkit-tap-highlight-color: transparent; }\n a, button, summary, [role=button], [role=tab] { touch-action: manipulation; }\n button, [role=button], [role=tab], .task-context-chip, .approval-chip, .verdict-chip { -webkit-user-select: none; user-select: none; }\n ::selection { background: var(--so-selection); color: var(--so-ink); }\n ::placeholder { color: var(--muted-foreground); }\n body {\n margin: 0; color: var(--foreground);\n background: var(--background);\n caret-color: var(--so-signal);\n font: 400 0.875rem/1.5 var(--font-sans); font-feature-settings: \"ss01\" 0;\n -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility;\n }\n :focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }\n\n /* Scrollbars belong to the theme, not the platform default. */\n * { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }\n\n .topbar {\n position: sticky; top: 0; z-index: 10;\n border-bottom: 1px solid var(--border); background: var(--background);\n }\n .topbar-inner {\n max-width: 44rem; margin-inline: auto; padding: 0 1.25rem; height: 3.25rem;\n display: flex; align-items: center; gap: 1.25rem;\n }\n .brand { font-weight: 600; letter-spacing: -0.01em; color: var(--foreground); text-decoration: none;\n display: flex; align-items: center; height: 100%; }\n .brand .dot { color: var(--muted-foreground); }\n .topbar nav { display: flex; gap: .25rem; margin-left: auto; height: 100%; }\n .topbar nav a {\n color: var(--muted-foreground); text-decoration: none; font-size: 0.8125rem; font-weight: 500;\n display: flex; align-items: center; padding: 0 .625rem; transition: color .15s;\n }\n @media (hover: hover) and (pointer: fine) { .topbar nav a:hover { color: var(--foreground); } }\n main { max-width: 44rem; margin-inline: auto; padding: 1.75rem 1.25rem 4rem; }\n h1 { font-size: 1.25rem; font-weight: 600; letter-spacing: -0.02em; margin: 0 0 .25rem; line-height: 1.3; }\n h1 .meta { font-weight: 400; letter-spacing: 0; }\n /* Section headers speak in the human voice (mono is for machine facts\n only): small, semibold, dim \u2014 Linear's \"In Progress 5\" register. */\n h2 {\n font-size: 0.8125rem; font-weight: 600; letter-spacing: -0.005em;\n color: var(--muted-foreground); margin: 2rem 0 .5rem; font-family: var(--font-sans);\n }\n a { color: var(--foreground); text-decoration: underline; text-decoration-color: var(--border); text-underline-offset: 3px; }\n @media (hover: hover) and (pointer: fine) { a:hover { text-decoration-color: var(--muted-foreground); } }\n p { margin: .4rem 0; }\n code { background: var(--muted); border-radius: .3rem; padding: .1rem .35rem; font-family: var(--font-mono); font-size: .8125rem; }\n .mono { font-family: var(--font-mono); font-size: .8125rem; font-variant-numeric: tabular-nums; letter-spacing: -.01em; }\n\n .meta { font-size: 0.8125rem; color: var(--muted-foreground); }\n .meta a { color: var(--muted-foreground); }\n .hint { font-size: 0.75rem; color: var(--muted-foreground); margin: -.375rem 0 .625rem; }\n .eyebrow {\n display: block; color: var(--muted-foreground); font-size: .625rem;\n font-weight: 500; letter-spacing: .08em; line-height: 1.3; text-transform: uppercase;\n font-family: var(--font-mono);\n }\n .num { font-variant-numeric: tabular-nums; }\n\n /* Utility classes replacing the old inline style= attributes. */\n .tight { margin-top: 0; }\n .card > h2:first-child, .card > h3:first-child { margin-top: 0; }\n .w-xs { width: 4.5rem; } .w-sm { width: 8rem; } .w-md { width: 12rem; } .w-lg { width: 14rem; }\n .field-cap { width: 100%; max-width: 28rem; }\n .field-cap-sm { width: 100%; max-width: 22rem; }\n .field-cap-lg { width: 100%; max-width: 34rem; }\n .prewrap { white-space: pre-wrap; }\n .wrap-any { overflow-wrap: anywhere; }\n .grab { cursor: grab; user-select: none; }\n\n .palette {\n position: fixed; top: 18vh; left: 50%; transform: translateX(-50%); width: min(32rem, 90vw);\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay);\n padding: .625rem; z-index: 50;\n }\n .palette input { width: 100%; margin: 0; }\n .palette ul { list-style: none; margin: .5rem 0 0; padding: 0; max-height: 40vh; overflow-y: auto; }\n .palette li { padding: .4375rem .625rem; border-radius: calc(var(--radius) - 4px); cursor: pointer; font-size: .875rem; }\n .palette li[aria-selected=\"true\"] { background: var(--muted); }\n\n /* The ledger: the window's harvest as strong figures in a sentence. */\n .ledger { font-size: 0.9375rem; color: var(--muted-foreground); margin: .875rem 0 0; line-height: 1.9; }\n .ledger b { font-weight: 600; font-size: 1.25rem; color: var(--foreground); font-variant-numeric: tabular-nums; padding-right: .1rem; font-family: var(--font-mono); }\n .ledger .good b { color: var(--success); }\n .ledger .bad b { color: var(--destructive); }\n\n /* Status labels are quiet metadata, not decoration. Their words carry\n the meaning; the restrained tint only speeds scanning. Count badges\n remain round so a number cannot be confused with a state. */\n .badge {\n display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border); border-radius: .375rem;\n padding: .0625rem .4rem; font-size: 0.6875rem; font-weight: 500; line-height: 1.45;\n background: color-mix(in srgb, var(--card) 58%, transparent); color: var(--muted-foreground); vertical-align: middle;\n font-family: var(--font-sans); font-variant-numeric: tabular-nums; white-space: nowrap;\n }\n .badge-done, .badge-answered, .badge-verified, .badge-built {\n background: color-mix(in srgb, var(--muted) 58%, var(--card)); color: var(--foreground);\n border-color: var(--border);\n }\n .badge-failed {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--destructive) 68%, var(--foreground)); border-color: var(--border);\n }\n .badge-note {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: var(--so-warning, #ab6400); border-color: var(--border);\n }\n .badge-overdue {\n background: color-mix(in srgb, var(--muted) 58%, var(--card)); color: var(--foreground);\n border-color: var(--border);\n }\n /* The criterion matrix's fourth state (v39): neither a pass nor a\n failure \u2014 evidence resolved everywhere except a manual-review kind,\n which by design nothing here can machine-verify. Quieter than\n badge-failed; still visibly distinct from a plain pass. */\n .badge-manual-review {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--muted-foreground) 80%, var(--foreground)); border-color: var(--border);\n }\n /* \"open\" and \"parked\" are neutral facts (an open PR, a parked decision);\n the MAGENTA form is the attention count \u2014 the number that waits on you.\n One accent, two places (reduction pass \u00A73): the needs-you count and\n the act that resolves the screen. Cards, frames, and seals are neutral. */\n .badge-open, .badge-parked { color: var(--foreground); }\n .count {\n min-width: 1.25rem; padding-inline: .35rem; border-radius: 9999px;\n }\n .count.badge-open {\n background: var(--brand-soft); color: var(--brand);\n border-color: color-mix(in srgb, var(--brand) 24%, var(--border));\n }\n .badge-running {\n background: color-mix(in srgb, var(--muted) 58%, var(--card));\n color: color-mix(in srgb, var(--running) 72%, var(--foreground)); border-color: var(--border);\n }\n .badge-cut { background: var(--muted); }\n\n .card {\n border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass);\n padding: 1rem 1.125rem; margin: .75rem 0;\n }\n .problem {\n border: 1px solid color-mix(in srgb, var(--destructive) 35%, transparent);\n background: var(--destructive-soft); color: var(--destructive);\n border-radius: var(--radius); padding: .625rem .875rem; margin: .75rem 0; font-size: 0.8125rem;\n }\n /* A row is 2.25rem of quiet: hairline below, hover fills, nothing else. */\n .row {\n display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap;\n padding: .5rem .375rem; min-height: 2.25rem; border-bottom: 1px solid var(--border);\n margin: 0; border-radius: calc(var(--radius) - 4px);\n }\n .row:last-of-type { border-bottom: none; }\n .row .right { margin-left: auto; }\n a.row { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { a.row:hover { background: var(--muted); } }\n\n /* A parked decision: the question in full weight, the whole card the\n tap target, the neutral border \u2014 the \"needs you\" header above it\n carries the colour for every card beneath. */\n .decide-card {\n display: block; border: 1px solid var(--border);\n border-radius: var(--radius);\n background: var(--card); padding: .875rem 1.125rem; margin: .625rem 0;\n text-decoration: none; transition: border-color .15s;\n }\n @media (hover: hover) and (pointer: fine) { .decide-card:hover { border-color: color-mix(in srgb, var(--border) 55%, var(--muted-foreground)); } }\n .decide-card .q { font-weight: 600; margin: 0 0 .25rem; }\n\n /* Buttons: secondary by default (paper + hairline); a form's one\n submit is primary (ink on paper, paper on ink); the approve act is\n the accent; danger is red and outlined. 2.125rem at a desk, 2.75rem to a thumb. */\n button {\n font: 500 0.8125rem/1.4 var(--font-sans); cursor: pointer; border-radius: calc(var(--radius) - 3px);\n border: 1px solid var(--input); background: var(--card); color: var(--foreground);\n padding: .35rem .75rem; min-height: 2.125rem;\n transition: background .12s var(--so-ease-out), border-color .12s var(--so-ease-out), color .12s var(--so-ease-out);\n }\n @media (hover: hover) and (pointer: fine) { button:hover { background: var(--so-soft); } }\n button:active { background: var(--so-nav-hover); }\n form.card > button[type=submit], .sticky-actions button[type=submit], form.card .sticky-actions button {\n background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { form.card > button[type=submit]:hover, .sticky-actions button[type=submit]:hover {\n background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background));\n } }\n /* The approve act is the one magenta verb: it resolves what waits on you.\n The ceremony's frame is neutral so the button is the only coloured thing\n in it; a danger act stays red even inside one. */\n .approve-form button[type=submit], .approve-form .sticky-actions button[type=submit] {\n background: var(--brand); color: var(--brand-foreground); border-color: var(--brand); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .approve-form button[type=submit]:hover, .approve-form .sticky-actions button[type=submit]:hover { background: color-mix(in srgb, var(--brand) 85%, var(--foreground)); border-color: color-mix(in srgb, var(--brand) 85%, var(--foreground)); } }\n button.danger, .approve-form button[type=submit].danger {\n color: var(--destructive); border-color: color-mix(in srgb, var(--destructive) 50%, transparent);\n background: transparent; font-weight: 500;\n }\n @media (hover: hover) and (pointer: fine) { button.danger:hover, .approve-form button[type=submit].danger:hover { background: var(--destructive-soft); } }\n /* Removing a credential takes a second, deliberate tap. */\n details.confirm-remove { display: inline-block; margin: 0 0 0 .5rem; vertical-align: top; }\n details.confirm-remove > summary { cursor: pointer; color: var(--destructive); font-size: .8125rem; min-height: 2.5rem; display: inline-flex; align-items: center; }\n details.confirm-remove[open] { display: block; margin: .75rem 0 0; }\n .project-card .project-name:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; border-radius: .375rem; }\n\n label { display: block; font-size: 0.8125rem; font-weight: 500; margin: .75rem 0 0; color: var(--foreground); }\n input[type=text], input[type=password], input[type=number], input[type=url], input[type=email], input[type=search], input[type=time], textarea, select {\n width: 100%; margin: .35rem 0 0; padding: .45rem .7rem; font: 400 0.875rem/1.4 var(--font-sans);\n color: var(--foreground); background: var(--card); min-height: 2.125rem;\n border: 1px solid var(--input); border-radius: calc(var(--radius) - 3px);\n transition: border-color .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { input:hover, textarea:hover, select:hover { border-color: var(--muted-foreground); } }\n input[type=number] { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }\n input[type=radio], input[type=checkbox] { accent-color: var(--ring); }\n .permission-field { border: 0; padding: 0; margin: 1rem 0 0; min-width: 0; }\n .permission-field legend { padding: 0; font-size: .8125rem; font-weight: 600; }\n .permission-toggle { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .5rem; margin-top: .5rem; }\n .permission-choice {\n display: grid; grid-template-columns: auto minmax(0, 1fr); gap: .6rem; align-items: start;\n margin: 0; padding: .72rem .78rem; border: 1px solid var(--glass-border);\n border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--card) 66%, transparent);\n cursor: pointer; transition: border-color .15s, background .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { .permission-choice:hover { background: var(--muted); } }\n .permission-choice:has(input:checked) {\n border-color: color-mix(in srgb, var(--foreground) 42%, var(--border));\n background: var(--card); box-shadow: 0 0 0 1px color-mix(in srgb, var(--foreground) 8%, transparent), var(--shadow);\n }\n .permission-choice input { margin: .14rem 0 0; }\n .permission-choice strong, .permission-choice small { display: block; }\n .permission-choice strong { font-size: .8125rem; }\n .permission-choice small { margin-top: .16rem; color: var(--muted-foreground); font-size: .8125rem; font-weight: 400; line-height: 1.4; }\n .permission-note { margin: .55rem 0 0; }\n .scope-editor .permission-toggle { grid-template-columns: 1fr; }\n .scope-editor .problem { color: var(--foreground); }\n /* New work starts like a conversation, not a configuration sheet. The\n planner turns the one intent into the detailed, signed contract; these\n controls expose the uncommon overrides without making them the door. */\n main:has(.task-intake) { max-width: 68rem; }\n .task-intake { width: min(100%, 50rem); margin: clamp(1rem, 5vh, 4rem) auto 0; }\n .task-intake-hero { text-align: center; margin: 0 auto 1.35rem; max-width: 38rem; }\n .task-intake-mark {\n display: grid; place-items: center; width: 3rem; height: 3rem; margin: 0 auto .85rem;\n border: 1px solid var(--border); border-radius: .75rem;\n background: var(--card); box-shadow: var(--so-pill-shadow);\n font: 600 .72rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .task-intake-hero h1 { margin: 0; font-size: clamp(1.65rem, 4vw, 2.2rem); letter-spacing: -.045em; }\n .task-intake-hero p { margin: .45rem 0 0; color: var(--muted-foreground); }\n .task-composer { padding: .75rem; border-radius: 1.45rem; box-shadow: var(--shadow-overlay); }\n .task-prompt { margin: 0; font-size: 0; }\n .task-prompt textarea {\n min-height: 8.5rem; max-height: 18rem; margin: 0; padding: .9rem 1rem; resize: vertical;\n border: 0; background: transparent; box-shadow: none; font-size: 1.05rem; line-height: 1.55;\n }\n .task-prompt textarea:focus-visible { border: 0; box-shadow: none; }\n @media (hover: hover) and (pointer: fine) { .task-prompt textarea:hover { border: 0; box-shadow: none; } }\n .task-repo { margin: .25rem .45rem .7rem; }\n .task-composer-footer { display: flex; align-items: center; gap: .5rem; padding: .25rem; }\n .task-context { display: flex; align-items: center; gap: .4rem; flex: 1 1 auto; min-width: 0; }\n .task-context-chip {\n display: inline-flex; align-items: center; min-height: 2rem; max-width: 13rem; padding: .25rem .65rem;\n border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground);\n background: color-mix(in srgb, var(--glass) 76%, transparent); font-size: .72rem; white-space: nowrap;\n overflow: hidden; text-overflow: ellipsis;\n }\n .task-quality { margin: 0; flex: none; font-size: 0; }\n .task-quality select {\n width: auto; min-height: 2rem; margin: 0; padding: .25rem 1.75rem .25rem .65rem;\n border-radius: 999px; color: var(--muted-foreground); font-size: .72rem; background-color: var(--glass);\n }\n .task-submit {\n flex: none; min-height: 2.45rem; padding: .45rem .95rem; border-radius: 999px;\n background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .task-submit:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: transparent; } }\n details.task-options {\n margin: .65rem .25rem 0; padding: .15rem .5rem 0; border: 0; border-top: 1px solid var(--glass-border);\n border-radius: 0; background: transparent;\n }\n details.task-options[open] { padding-bottom: .25rem; }\n .task-options > summary { display: flex; align-items: center; gap: .5rem; list-style: none; }\n .task-options > summary::-webkit-details-marker { display: none; }\n .task-options > summary::after {\n content: \"\"; width: .4rem; height: .4rem; margin-left: auto; margin-right: .25rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.1rem); transition: transform .15s;\n }\n .task-options[open] > summary::after { transform: rotate(225deg) translateY(-.1rem); }\n .task-options > summary small { color: var(--muted-foreground); font-weight: 400; }\n .task-options-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 .8rem; padding: 0 .25rem .5rem; }\n .task-options-grid .wide, .task-options-grid .permission-field { grid-column: 1 / -1; }\n .task-check { display: flex; gap: .55rem; align-items: flex-start; }\n .task-check input { margin-top: .2rem; }\n .task-check > span { display: grid; gap: .1rem; }\n .task-check small { display: block; font-weight: 400; line-height: 1.45; }\n .task-agent-note { text-align: center; max-width: 42rem; margin: .85rem auto 0; }\n .visually-hidden {\n position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important;\n margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important; border: 0 !important;\n }\n input[type=password] { font-family: var(--font-mono); }\n input:focus-visible, textarea:focus-visible, select:focus-visible {\n outline: none; border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 25%, transparent);\n }\n button:focus-visible, a:focus-visible, summary:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }\n\n .inline { display: inline-block; width: auto; margin: 0 .375rem .375rem 0; vertical-align: middle; }\n .assistant-picker .button-link[aria-current=page] { outline: 2px solid var(--ring); outline-offset: 2px; }\n .inline input[type=text] { display: inline-block; width: auto; margin: 0 .375rem 0 0; vertical-align: middle; }\n .inline button { width: auto; }\n\n /* One option = one container: consequence first, then the act. */\n form.option {\n margin: .75rem 0; border: 1px solid var(--border); border-radius: var(--radius);\n background: var(--card); padding: .875rem 1rem;\n }\n form.option button {\n display: block; width: 100%; text-align: left; font-size: 0.9375rem; font-weight: 600;\n min-height: 2.75rem;\n }\n /* Recommended is a suggestion, not attention: neutral emphasis, no magenta. */\n form.option.recommended { border-color: color-mix(in srgb, var(--foreground) 30%, var(--border)); }\n form.option.recommended .badge { background: var(--muted); color: var(--foreground); }\n .consequence { font-size: 0.8125rem; color: var(--muted-foreground); margin: 0 0 .625rem; white-space: pre-wrap; }\n form.option input[type=text] { font-size: 0.8125rem; margin-top: .5rem; min-height: 2.25rem; }\n\n .recap { color: var(--muted-foreground); margin: .75rem 0; white-space: pre-wrap; }\n #scope .recap, #scope .scope-paths, .approval-goal { overflow-wrap: anywhere; }\n .result-card {\n margin: 1.25rem 0; border-color: color-mix(in srgb, var(--success) 32%, var(--glass-border));\n background: var(--card);\n box-shadow: var(--shadow-card);\n }\n .result-card h2 { margin: 0; }\n .completion-receipt {\n position: relative; overflow: hidden; margin: 1rem 0 1.25rem; padding: 1.15rem;\n border-color: color-mix(in srgb, var(--foreground) 13%, var(--glass-border));\n background: var(--card);\n box-shadow: var(--shadow-card);\n }\n .completion-receipt::after {\n content: \"\"; position: absolute; width: 11rem; height: 11rem; right: -5rem; top: -7rem;\n border-radius: 50%; background: color-mix(in srgb, var(--running) 9%, transparent); filter: blur(4px); pointer-events: none;\n }\n .receipt-head { position: relative; z-index: 1; display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; }\n .receipt-head h2 { margin: .15rem 0 0; font-size: 1.15rem; }\n /* The receipt's status line is the shared component (.status-line);\n the head keeps it from wrapping under the heading. */\n .receipt-head .status-line { flex: none; font-size: .8125rem; }\n .receipt-summary { position: relative; z-index: 1; max-width: 43rem; margin: .75rem 0 1rem; font-size: 1rem; line-height: 1.55; }\n .receipt-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .55rem; }\n .receipt-facts > span { min-width: 0; padding: .7rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 64%, transparent); }\n .receipt-facts strong, .receipt-facts small { display: block; overflow-wrap: anywhere; }\n .receipt-facts strong { font-size: .78rem; font-weight: 600; }\n .receipt-facts small { margin-top: .18rem; color: var(--muted-foreground); font-size: .75rem; line-height: 1.4; }\n /* Thumbnails, never a full-width poster: auto-fill leaves a lone\n screenshot at thumbnail size (UI polish 2026-09-13). */\n .receipt-visuals { display: grid; grid-template-columns: repeat(auto-fill, minmax(8rem, 14rem)); gap: .55rem; margin-top: .75rem; }\n .receipt-shot { display: grid; gap: .35rem; color: var(--muted-foreground); font-size: .75rem; text-decoration: none; }\n .receipt-shot img { display: block; width: 100%; aspect-ratio: 16 / 10; object-fit: cover; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--muted); }\n @media (hover: hover) and (pointer: fine) { .receipt-shot:hover { color: var(--foreground); } }\n .report-items ol { margin: .35rem 0 .75rem; padding-left: 1.25rem; display: grid; gap: .75rem; }\n .report-items li p { margin: .15rem 0; }\n .report-link { overflow-wrap: anywhere; }\n .receipt-caveats, .receipt-coverage { margin-top: .8rem; padding: .7rem .8rem; border-left: 1px solid var(--border); border-radius: 0 calc(var(--radius) - 3px) calc(var(--radius) - 3px) 0; background: color-mix(in srgb, var(--muted) 62%, transparent); font-size: .78rem; }\n .receipt-caveats ul, .receipt-coverage ul { margin: .3rem 0 0; padding-left: 1.15rem; }\n /* Secondary receipt detail (concise pass, 2026-09-13): native\n disclosures in the receipt's own quiet tone \u2014 no card chrome. */\n details.receipt-coverage, details.receipt-coverage[open] { padding: 0 .8rem .1rem; border-top: 0; border-right: 0; border-bottom: 0; }\n details.receipt-coverage > summary { padding: .5rem 0; font-weight: 600; color: var(--foreground); font-size: .78rem; }\n details.receipt-coverage[open] > summary { padding-bottom: .2rem; }\n details.receipt-coverage ul { margin: 0 0 .5rem; }\n .receipt-history, .receipt-history[open] { margin: .35rem 0 0; padding: 0; border: 0; background: none; border-radius: 0; }\n .receipt-history > summary { padding: .35rem 0; min-height: 2.25rem; display: inline-flex; align-items: center; gap: .25rem; font-size: .8125rem; list-style: none; }\n .receipt-history > summary::-webkit-details-marker { display: none; }\n .receipt-history > summary::before { content: \"\u25B8\"; }\n .receipt-history[open] > summary::before { content: \"\u25BE\"; }\n .receipt-history .receipt-review { margin: 0 0 .35rem; }\n .semantic-coverage p { margin: .2rem 0; }\n .receipt-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .65rem 1rem; margin-top: .9rem; }\n .receipt-actions > a:not(.button-link) { font-size: .78rem; font-weight: 550; }\n /* The review cockpit (Priority 5): a master/detail over completed work.\n The queue is a ranked list, the detail one scan path \u2014 intent, proof,\n changes, publication \u2014 and the primary act sits under the header. */\n main:has(.cockpit) { max-width: 82rem; }\n .cockpit { display: grid; grid-template-columns: minmax(15rem, 19rem) minmax(0, 1fr); gap: 0 1.5rem; align-items: start; }\n .cockpit-queue { position: sticky; top: 1rem; min-width: 0; }\n .cockpit-queue h2 { display: flex; align-items: center; gap: .4rem; margin: 0 0 .25rem; }\n .cockpit-queue .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; font-weight: 500; color: var(--muted-foreground); font-size: .6875rem; }\n .cockpit-queue-hint { margin: 0 0 .6rem; font-size: .7rem; line-height: 1.4; }\n .cockpit-queue-list { list-style: none; margin: 0; padding: 0; max-height: calc(100vh - 9rem); overflow-y: auto; }\n .cockpit-row {\n display: grid; gap: .2rem; padding: .55rem .65rem; margin-bottom: .2rem; min-width: 0;\n border: 1px solid transparent; border-radius: calc(var(--radius) - 3px); text-decoration: none; color: var(--foreground);\n }\n @media (hover: hover) and (pointer: fine) { .cockpit-row:hover { background: var(--card); } }\n .cockpit-row.current { background: var(--muted); border-color: color-mix(in srgb, var(--foreground) 12%, var(--border)); }\n .cockpit-row-head { display: flex; align-items: flex-start; justify-content: space-between; gap: .5rem; min-width: 0; }\n .cockpit-row-head strong { min-width: 0; overflow-wrap: anywhere; font-size: .8125rem; font-weight: 550; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }\n .cockpit-row-meta { display: block; color: var(--muted-foreground); font-size: .68rem; overflow-wrap: anywhere; }\n .cockpit-why { display: block; color: var(--muted-foreground); font-size: .7rem; line-height: 1.35; overflow-wrap: anywhere; }\n .refusal-back a { display: inline-flex; align-items: center; min-height: 44px; min-width: 44px; }\n .cockpit-primary { margin: .85rem 0 1rem; }\n .cockpit-primary .button-link { white-space: nowrap; }\n .cockpit-detail { min-width: 0; }\n .cockpit-head h1 { margin: .2rem 0 .55rem; color: var(--foreground); font-size: clamp(1.2rem, 2vw, 1.45rem); font-weight: 600; line-height: 1.3; letter-spacing: -.025em; overflow-wrap: anywhere; }\n .cockpit-chips { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem .75rem; margin: 0 0 .35rem; }\n .cockpit-next { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin: .85rem 0 1rem; padding: .85rem 1rem;\n border-color: var(--glass-border); background: var(--glass-strong); }\n .cockpit-next > div { display: grid; gap: .2rem; min-width: 0; overflow-wrap: anywhere; }\n .cockpit-next .meta { font-size: .78rem; line-height: 1.45; }\n .cockpit-next form { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: 0; }\n .cockpit-next form input[type=text] { min-width: 9rem; margin: 0; }\n .cockpit-next .button-link, .cockpit-next button[type=submit] { white-space: nowrap; }\n .cockpit-section { margin: .85rem 0; padding: .95rem 1.05rem; }\n .cockpit-section h3 { margin: 0 0 .5rem; font-size: .8rem; letter-spacing: .02em; text-transform: uppercase; color: var(--muted-foreground); }\n .cockpit-section .recap { margin: .35rem 0; }\n .cockpit-section .result-section { margin-top: .6rem; }\n .cockpit-section .result-section ul, .cockpit-section ul { margin: .25rem 0 0; padding-left: 1.15rem; }\n .cockpit-section li { overflow-wrap: anywhere; }\n .cockpit-drift { margin: .6rem 0; font-size: .8rem; }\n .cockpit-files { margin: .4rem 0 .6rem; padding-left: 1.25rem; font-size: .78rem; }\n .cockpit-files li { margin: .2rem 0; }\n .cockpit-files .pick-file { min-height: 1.75rem; padding: 0 .55rem; font-size: .75rem; }\n .cockpit-section .diff-review { margin-top: .6rem; }\n .cockpit-section .receipt-visuals { margin-top: .6rem; grid-template-columns: repeat(auto-fill, minmax(9rem, 14rem)); }\n .cockpit-disclosure { padding: 0; overflow: hidden; }\n .cockpit-disclosure > summary {\n display: flex; align-items: center; justify-content: space-between; gap: 1rem; min-height: 4rem;\n padding: .85rem 1.05rem; list-style: none; cursor: pointer;\n }\n .cockpit-disclosure > summary::-webkit-details-marker { display: none; }\n .cockpit-disclosure > summary > h3 { display: grid; gap: .12rem; min-width: 0; margin: 0; font-size: .82rem; }\n .cockpit-disclosure > summary small { color: var(--muted-foreground); font-size: .72rem; font-weight: 400; }\n .cockpit-disclosure-action { color: var(--muted-foreground); font-size: .72rem; white-space: nowrap; }\n .cockpit-disclosure-action::after { content: \"\u2193\"; margin-left: .35rem; }\n .cockpit-disclosure[open] .cockpit-disclosure-action::after { content: \"\u2191\"; }\n .cockpit-disclosure-body { padding: 0 1.05rem .95rem; border-top: 1px solid var(--glass-border); }\n .cockpit-proof-group { margin: .65rem 0; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 62%, transparent); }\n .cockpit-proof-group > summary { padding: .65rem .75rem; cursor: pointer; font-weight: 550; }\n .cockpit-proof-group .criterion-matrix { padding: 0 .75rem .7rem; }\n .cockpit-proof-summary { display: grid; gap: .25rem; margin: .15rem 0 .75rem; line-height: 1.45; }\n .cockpit-proof-summary strong { font-size: .88rem; }\n .cockpit-evidence-group { margin: .65rem 0 0; scroll-margin-top: 6rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); overflow: hidden; }\n .cockpit-evidence-group > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; padding: .75rem; cursor: pointer; list-style: none; font-weight: 550; }\n .cockpit-evidence-group > summary::-webkit-details-marker { display: none; }\n .cockpit-evidence-group > summary > span { flex: none; white-space: nowrap; }\n .cockpit-evidence-group > summary small { min-width: 0; color: var(--muted-foreground); font-size: .7rem; font-weight: 400; text-align: right; }\n .cockpit-evidence-group [data-primary-evidence] { scroll-margin-top: 6rem; }\n .cockpit-evidence-body { padding: 0 .75rem .75rem; border-top: 1px solid var(--glass-border); }\n .cockpit-accept { margin-top: .65rem; padding-top: .65rem; border-top: 1px solid var(--glass-border); }\n .cockpit-accept > summary { cursor: pointer; font-size: .78rem; font-weight: 600; }\n .cockpit-accept[open] > summary { margin-bottom: .55rem; }\n .cockpit-accept p { margin: 0 0 .55rem; }\n .cockpit-accept-form { display: flex; gap: .5rem; margin: 0; }\n .cockpit-accept-form input { margin: 0; min-width: 10rem; }\n .cockpit-accept-form button { flex: none; background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .diff-review {\n overflow: hidden; margin: .8rem 0 .5rem; border: 1px solid var(--glass-border);\n border-radius: var(--radius); background: color-mix(in srgb, var(--card) 82%, transparent);\n \n }\n .diff-review-bar {\n display: flex; align-items: center; justify-content: space-between; gap: .75rem;\n min-height: 2.8rem; padding: .4rem .55rem .4rem .85rem;\n border-bottom: 1px solid var(--glass-border); background: color-mix(in srgb, var(--glass-strong) 68%, transparent);\n }\n .diff-modes { display: inline-flex; padding: .18rem; border: 1px solid var(--glass-border); border-radius: 999px; background: var(--muted); }\n .diff-modes button {\n min-height: 1.75rem; padding: .2rem .7rem; border: 0; border-radius: 999px;\n background: transparent; box-shadow: none; color: var(--muted-foreground); font-size: .7rem;\n }\n @media (hover: hover) and (pointer: fine) { .diff-modes button:hover { transform: none; color: var(--foreground); } }\n .diff-modes button[aria-pressed=\"true\"] { background: var(--card); color: var(--foreground); box-shadow: 0 1px 3px color-mix(in srgb, var(--background) 20%, transparent); }\n .diff-review-help {\n margin: 0; padding: .62rem .85rem; border-bottom: 1px solid var(--glass-border);\n background: color-mix(in srgb, var(--running) 7%, transparent); color: var(--muted-foreground); font-size: .75rem;\n }\n .diff-review[data-mode=\"view\"] .diff-review-help { display: none; }\n .diff-file { margin: 0; padding: 0; border: 0; border-radius: 0; background: transparent; box-shadow: none; }\n .diff-file + .diff-file { border-top: 1px solid var(--glass-border); }\n .diff-file[open] { padding-bottom: 0; }\n .diff-file > summary {\n display: flex; align-items: center; gap: .7rem; min-height: 2.75rem; padding: .45rem .85rem;\n list-style: none; color: var(--foreground); background: color-mix(in srgb, var(--glass) 55%, transparent);\n }\n .diff-file > summary::-webkit-details-marker { display: none; }\n .diff-file > summary::before {\n content: \"\"; flex: none; width: .35rem; height: .35rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(-45deg); transition: transform .15s ease;\n }\n .diff-file[open] > summary::before { transform: rotate(45deg) translateY(-.1rem); }\n .diff-file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 .75rem/1.4 var(--font-mono); }\n .diff-file-counts { display: inline-flex; gap: .45rem; flex: none; margin-left: auto; font: 500 .75rem/1 var(--font-mono); }\n .diff-file-counts b { color: var(--success); font-weight: 500; }\n .diff-file-counts i { color: var(--destructive); font-style: normal; }\n .diff-rename { margin: 0; padding: .4rem .85rem; border-top: 1px solid var(--glass-border); }\n .diff-hunk + .diff-hunk { border-top: 1px solid var(--glass-border); }\n .diff-hunk-head {\n overflow-x: auto; padding: .42rem .85rem; border-top: 1px solid var(--glass-border); border-bottom: 1px solid var(--glass-border);\n background: color-mix(in srgb, var(--running) 8%, var(--card)); color: color-mix(in srgb, var(--running) 72%, var(--foreground));\n font: 500 .75rem/1.4 var(--font-mono); white-space: pre;\n }\n .diff-lines { max-width: 100%; overflow-x: auto; background: color-mix(in srgb, var(--background) 48%, var(--card)); }\n .diff-line {\n display: grid; grid-template-columns: 2rem 3.2rem 3.2rem minmax(max-content, 1fr); align-items: stretch;\n min-width: max-content; min-height: 1.8rem; font: 400 .75rem/1.55 var(--font-mono);\n }\n @media (hover: hover) and (pointer: fine) { .diff-line:hover { background: color-mix(in srgb, var(--foreground) 4%, transparent); } }\n .diff-line code { display: flex; min-width: 0; padding: .3rem .75rem .3rem .6rem; color: inherit; white-space: pre; }\n .diff-line code b { display: inline-block; width: 1rem; flex: none; font-weight: 500; opacity: .72; }\n .diff-gutter {\n display: flex; align-items: flex-start; justify-content: flex-end; min-width: 0; padding: .3rem .45rem;\n border-right: 1px solid color-mix(in srgb, var(--border) 72%, transparent); color: var(--muted-foreground); user-select: none;\n }\n .diff-addition { background: color-mix(in srgb, var(--success) 10%, transparent); color: color-mix(in srgb, var(--success) 38%, var(--foreground)); }\n .diff-deletion { background: color-mix(in srgb, var(--destructive) 9%, transparent); color: color-mix(in srgb, var(--destructive) 38%, var(--foreground)); }\n .diff-meta { color: var(--muted-foreground); }\n .diff-annotate, .diff-annotate-space {\n position: sticky; left: 0; z-index: 1; display: grid; place-items: center; width: 2rem; min-width: 2rem; min-height: 1.8rem;\n border: 0; border-right: 1px solid color-mix(in srgb, var(--border) 72%, transparent); border-radius: 0;\n }\n .diff-annotate { padding: 0; background: color-mix(in srgb, var(--card) 94%, transparent); color: var(--muted-foreground); box-shadow: none; opacity: .35; }\n .diff-annotate svg { width: .78rem; height: .78rem; }\n @media (hover: hover) and (pointer: fine) { .diff-annotate:hover { transform: none; background: color-mix(in srgb, var(--running) 15%, var(--card)); color: var(--running); opacity: 1; } }\n .diff-annotate-space { background: color-mix(in srgb, var(--card) 94%, transparent); }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 3.2rem 3.2rem minmax(max-content, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-annotate,\n .diff-review[data-mode=\"view\"] .diff-annotate-space { visibility: hidden; width: 0; min-width: 0; overflow: hidden; border: 0; pointer-events: none; }\n .diff-review[data-mode=\"annotate\"] .diff-annotate { opacity: .72; }\n .diff-cut { margin: 0; padding: .65rem .85rem; border-top: 1px solid var(--glass-border); color: var(--warning); font-size: .75rem; }\n .diff-comments { display: grid; gap: .5rem; margin: .7rem 0; }\n .diff-comment {\n position: relative; padding: .7rem .8rem .7rem 1rem; border: 1px solid var(--glass-border);\n border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--glass) 76%, transparent);\n }\n .diff-comment-pin { position: absolute; left: -.2rem; top: .75rem; width: .38rem; height: 1.2rem; border-radius: 999px; background: var(--running); }\n .diff-comment p { margin: 0 0 .25rem; overflow-wrap: anywhere; }\n .diff-comment .meta { font-size: .68rem; }\n .diff-comment-form { display: grid; gap: .65rem; margin: .75rem 0; padding: .85rem; }\n .diff-comment-target { display: grid; grid-template-columns: minmax(0, 1fr) 5.5rem; gap: .6rem; }\n .diff-comment-form label { margin: 0; color: var(--muted-foreground); font-size: .68rem; font-weight: 550; }\n .diff-comment-form input, .diff-comment-form textarea { margin-top: .28rem; }\n .diff-comment-form button { justify-self: start; }\n .diff-comment-limit { margin-top: -.35rem; font-size: .66rem; font-variant-numeric: tabular-nums; }\n .revision-from-comments {\n display: flex; align-items: center; justify-content: space-between; gap: 1rem;\n margin: .75rem 0; padding: .85rem; border-color: color-mix(in srgb, var(--running) 24%, var(--glass-border));\n background: var(--card);\n }\n .revision-from-comments > div { display: grid; gap: .15rem; }\n .revision-from-comments > div > span { display: block; }\n .revision-from-comments button { flex: none; }\n .result-section { margin-top: .875rem; }\n .result-section > strong {\n display: block; font: 600 .6875rem/1.3 var(--font-mono); color: var(--muted-foreground);\n letter-spacing: .06em; text-transform: uppercase;\n }\n .result-section ul { margin: .375rem 0 0; padding-left: 1.25rem; }\n .result-section li { margin: .25rem 0; }\n .criterion-matrix .requirement-list { list-style: none; margin: .4rem 0 0; padding: 0; }\n .criterion-matrix .requirement { margin: 0; padding: 1rem 0; border-bottom: 1px solid var(--border); min-width: 0; overflow-wrap: anywhere; }\n .criterion-matrix .requirement:last-child { border-bottom: 0; }\n .requirement-heading { display: flex; align-items: center; flex-wrap: wrap; gap: .4rem .75rem; font-size: .75rem; color: var(--muted-foreground); }\n .requirement-heading .badge { margin: 0; white-space: normal; }\n .requirement-statement { margin: .5rem 0; line-height: 1.55; white-space: pre-wrap; }\n .requirement-review { margin: .4rem 0; font-size: .78rem; color: var(--muted-foreground); }\n .requirement-warning { margin: .65rem 0; padding: .6rem .75rem; border: 1px solid color-mix(in srgb, var(--warning) 35%, var(--border)); border-radius: 8px; background: var(--warning-soft); font-size: .8125rem; }\n .requirement-warning strong { font-size: .78rem; }\n .requirement-warning p { margin: .3rem 0 0; }\n .requirement-issues { font-size: .8125rem; }\n .criterion-matrix .requirement-evidence { margin: .35rem 0 0; padding: 0; border: 0; border-radius: 0; background: none; }\n .requirement-evidence > summary { display: flex; align-items: center; gap: .5rem; min-height: 44px; width: fit-content; padding: .35rem .1rem; cursor: pointer; list-style: none; font-size: .8125rem; }\n .requirement-evidence > summary::-webkit-details-marker { display: none; }\n .requirement-evidence > summary::after { content: \"+\"; color: var(--muted-foreground); }\n .requirement-evidence[open] > summary::after { content: \"\u2212\"; }\n .requirement-evidence-body { padding: .25rem .75rem .65rem; border-left: 1px solid var(--border); }\n .requirement-evidence-body p { margin: .35rem 0; }\n .requirement-evidence-group { margin: .7rem 0; }\n .requirement-evidence-group > strong { font-size: .75rem; color: var(--muted-foreground); }\n .requirement-evidence-group code { white-space: normal; overflow-wrap: anywhere; font-size: .75rem; }\n .requirement-evidence-group a { display: inline-block; padding: .4rem 0; }\n .question { font-size: 1.125rem; font-weight: 600; letter-spacing: -0.01em; margin: 1rem 0; white-space: pre-wrap; }\n .answered {\n border: 1px solid color-mix(in srgb, var(--success) 35%, transparent); background: var(--success-soft);\n border-radius: var(--radius); padding: .875rem 1rem; margin: 1rem 0;\n }\n details {\n margin: .75rem 0; border: 1px solid var(--border); border-radius: var(--radius);\n padding: .25rem .875rem; background: var(--card);\n }\n details[open] { padding-bottom: .875rem; }\n details.arm-danger { border-color: color-mix(in srgb, var(--destructive) 30%, transparent); }\n summary { padding: .5rem 0; cursor: pointer; font-weight: 500; font-size: 0.8125rem; color: var(--muted-foreground); min-height: 2.25rem; }\n @media (hover: hover) and (pointer: fine) { summary:hover { color: var(--foreground); } }\n details form.option { border: none; padding: .25rem 0 0; margin: 0; }\n .evidence { margin-top: 1.5rem; font-size: 0.8125rem; }\n .evidence a { display: block; padding: .55rem 0; border-bottom: 1px solid var(--border); text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .evidence a:hover { color: var(--muted-foreground); } }\n .evidence strong { display: block; font-size: 0.6875rem; text-transform: uppercase; letter-spacing: .08em; color: var(--muted-foreground); font-family: var(--font-mono); }\n\n .filters { font-size: 0.8125rem; color: var(--muted-foreground); }\n .filters a, .filters strong {\n display: inline-block; padding: .25rem .625rem; border-radius: 9999px; text-decoration: none;\n color: var(--muted-foreground); font-weight: 500;\n }\n .filters strong { background: var(--muted); color: var(--foreground); }\n @media (hover: hover) and (pointer: fine) { .filters a:hover { color: var(--foreground); } }\n\n .seal {\n display: inline-block; font-family: var(--font-mono); font-size: .75rem;\n background: var(--muted); border: 1px solid var(--border);\n color: var(--foreground); border-radius: calc(var(--radius) - 4px); padding: .25rem .625rem;\n font-variant-numeric: tabular-nums; overflow-wrap: anywhere;\n }\n\n /* The workspace shell: sidebar + content, an optional list pane between. */\n /* The rail collapse is instant: a layout dimension is never animated (UI polish 2026-09-13). */\n .app { display: grid; grid-template-columns: 232px minmax(0, 1fr); min-height: 100vh; }\n .side {\n border-right: 1px solid var(--glass-border);\n background: var(--glass-strong);\n padding: 1rem .875rem 1.125rem; display: flex; flex-direction: column; gap: .175rem;\n position: sticky; top: 0; height: 100vh; overflow-y: auto;\n box-shadow: 1px 0 0 var(--glass-highlight) inset;\n }\n .side-head { display: flex; align-items: center; gap: .25rem; min-height: 2.5rem; margin-bottom: .45rem; }\n .side .brand { flex: 1; min-width: 0; padding: .25rem .625rem; font-size: 1rem; height: auto; letter-spacing: -.025em; }\n .brand-short { display: none; font-family: var(--font-mono); letter-spacing: -.06em; }\n .side-toggle {\n display: grid; place-items: center; flex: 0 0 2rem; width: 2rem; min-height: 2rem; padding: 0;\n border-color: transparent; background: transparent; color: var(--muted-foreground); box-shadow: none;\n }\n @media (hover: hover) and (pointer: fine) { .side-toggle:hover { background: var(--glass); color: var(--foreground); transform: none; } }\n .side-toggle svg { width: 1rem; height: 1rem; }\n /* The scope bar: one hairline row, the single scope truth on every\n * screen; its name is the switcher. Magenta never appears here except\n * the needs-you count. */\n .scope-bar {\n display: flex; align-items: baseline; gap: .625rem; flex-wrap: wrap;\n position: sticky; top: 0; z-index: 20;\n padding: .625rem 2rem; border-bottom: 1px solid var(--glass-border);\n background: var(--glass-strong); font-size: .8125rem;\n }\n .scope-bar .eyebrow { font-size: .6875rem; font-weight: 500; color: var(--muted-foreground); }\n .scope-bar .name { font-weight: 600; }\n /* The switcher: a folded menu of enrolled projects under the scope's name. */\n .switcher { position: relative; }\n .switcher > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .25rem; }\n .switcher > summary::-webkit-details-marker { display: none; }\n .switcher .chevron { width: .875rem; height: .875rem; color: var(--muted-foreground); transition: transform .15s; }\n .switcher[open] > summary .chevron { transform: rotate(180deg); }\n .switcher-menu {\n position: absolute; top: calc(100% + .375rem); left: 0; z-index: 40; min-width: 15rem; max-width: 22rem;\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay); padding: .375rem; display: flex; flex-direction: column; gap: .125rem;\n }\n .switcher-menu form { margin: 0; }\n .switcher-menu button {\n display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left; margin: 0;\n background: transparent; border: 0; min-height: 2.5rem; padding: 0 .75rem;\n border-radius: calc(var(--radius) - 4px); font: inherit; font-size: .875rem; color: var(--foreground);\n }\n .switcher-menu button.current { font-weight: 600; }\n .switcher-menu button.current::after {\n content: \"\"; margin-left: auto; width: .375rem; height: .625rem; flex: none;\n border-right: 1.75px solid var(--foreground); border-bottom: 1.75px solid var(--foreground);\n transform: rotate(45deg) translateY(-.125rem);\n }\n @media (hover: hover) and (pointer: fine) { .switcher-menu button:hover { background: var(--muted); } }\n .switcher-menu .manage {\n display: block; margin-top: .25rem; padding: .625rem .75rem; border-top: 1px solid var(--border);\n font-size: .75rem; color: var(--muted-foreground); text-decoration: none;\n }\n .scope-status {\n display: flex; gap: .5rem; flex-wrap: wrap;\n color: var(--muted-foreground); font-size: .6875rem; font-variant-numeric: tabular-nums;\n font-family: var(--font-mono);\n }\n .scope-status .hot { color: var(--brand); font-weight: 500; }\n .scope-status a { color: inherit; text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .scope-status a:hover { text-decoration: underline; } }\n /* A project card's name and counts are forms or links dressed as text and chips. */\n .project-card button.project-name, .project-card a.project-name {\n all: unset; cursor: pointer; font-weight: 600; color: var(--foreground);\n }\n @media (hover: hover) and (pointer: fine) { .project-card a.project-name:hover, .project-card button.project-name:hover { text-decoration: underline; } }\n .project-card button.badge { min-height: auto; box-shadow: none; cursor: pointer; }\n @media (hover: hover) and (pointer: fine) { .project-card button.badge:hover, .project-card a.badge:hover { border-color: var(--input); } }\n /* Adding a project is the page's primary job, not badge-sized metadata.\n * Two roomy action tiles make both roads obvious on a desk and give each\n * one a generous thumb target on a phone. The manual path stays tertiary. */\n .project-add-card { margin-top: 1.25rem; padding: 1.25rem; }\n .project-add-card h2.project-add-title {\n margin: 0; color: var(--foreground); font-size: 1.0625rem; line-height: 1.35;\n letter-spacing: -.015em;\n }\n .project-add-intro { margin: .25rem 0 0; max-width: 36rem; }\n .project-add-actions {\n display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: .625rem; margin-top: 1rem;\n }\n .project-add-action {\n display: grid; grid-template-columns: 2.75rem minmax(0, 1fr) auto;\n align-items: center; gap: .75rem; min-height: 5rem; padding: .75rem .875rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 1px);\n background: var(--glass-strong);\n color: var(--foreground); text-decoration: none;\n \n transition: transform .15s ease, background .15s, border-color .15s, box-shadow .15s;\n }\n @media (hover: hover) and (pointer: fine) { .project-add-action:hover {\n border-color: color-mix(in srgb, var(--border) 50%, var(--muted-foreground));\n background: var(--card); text-decoration: none;\n box-shadow: var(--shadow);\n } }\n .project-add-action:active { transform: translateY(0); }\n .project-add-icon {\n display: grid; place-items: center; width: 2.75rem; height: 2.75rem;\n border: 1px solid var(--border); border-radius: .75rem;\n background: var(--muted); color: var(--foreground);\n }\n .project-add-icon svg { width: 1.125rem; height: 1.125rem; }\n .project-add-copy { min-width: 0; }\n .project-add-copy strong { display: block; font-size: .9375rem; line-height: 1.35; }\n .project-add-copy small {\n display: block; margin-top: .175rem; color: var(--muted-foreground);\n font-size: .75rem; font-weight: 400; line-height: 1.4;\n }\n .project-add-arrow { color: var(--muted-foreground); font-size: 1rem; }\n .project-add-more { margin-top: .875rem; border-top: 1px solid var(--border); }\n .project-add-more > summary {\n display: flex; align-items: center; min-height: 2.75rem; width: fit-content;\n color: var(--muted-foreground); cursor: pointer; font-size: .8125rem; font-weight: 500;\n }\n @media (hover: hover) and (pointer: fine) { .project-add-more > summary:hover { color: var(--foreground); } }\n .project-add-more > .card { margin: 0 0 .25rem; }\n .side nav { display: flex; flex-direction: column; gap: .125rem; }\n /* Inline decision options: neutral buttons \u2014 the card's magenta outline is\n * the attention signal; recommendation is a neutral badge, never magenta. */\n .decide-options { margin-top: .5rem; display: flex; flex-direction: column; gap: .375rem; }\n .decide-option { margin: 0; display: flex; align-items: baseline; gap: .5rem; flex-wrap: wrap; }\n .decide-option button { margin: 0; }\n .decide-option .meta { flex: 1 1 12rem; }\n /* The rail's two accordion groups (sidebar rework): collapsed by\n * default, the active page's group open, opening one closes the other\n * (client toggle in chromeScript). Native <details>/<summary> carries\n * the expanded state and keyboard operation for free \u2014 the same pattern\n * the switcher already uses. */\n .side .nav-groups { display: flex; flex-direction: column; gap: .125rem; margin-top: .375rem; }\n .nav-group > summary {\n display: flex; align-items: center; justify-content: space-between; gap: .5rem;\n list-style: none; cursor: pointer; padding: .4375rem .625rem; min-height: 2.125rem;\n border-radius: calc(var(--radius) - 3px); text-decoration: none;\n color: var(--muted-foreground); font-size: .6875rem; font-weight: 500;\n font-family: var(--font-sans);\n }\n .nav-group > summary::-webkit-details-marker { display: none; }\n @media (hover: hover) and (pointer: fine) { .nav-group > summary:hover { background: var(--glass); color: var(--foreground); } }\n .nav-group > summary .chevron { width: .875rem; height: .875rem; flex: none; transition: transform .15s; }\n .nav-group[open] > summary .chevron { transform: rotate(180deg); }\n .nav-group .nav-group-items { display: flex; flex-direction: column; gap: .125rem; margin: .125rem 0 .25rem; }\n .side .nav-settings { margin-top: .375rem; }\n .side nav a {\n position: relative;\n display: flex; align-items: center; gap: .625rem; padding: .4375rem .625rem; min-height: 2.125rem;\n border-radius: calc(var(--radius) - 3px); text-decoration: none;\n color: var(--muted-foreground); font-size: .8125rem; font-weight: 500;\n transition: color .15s, background .15s, transform .15s;\n }\n .side nav a .glyph { display: inline-flex; width: 1rem; height: 1rem; color: var(--muted-foreground); flex: none; }\n .side nav a .glyph svg { width: 1rem; height: 1rem; }\n @media (hover: hover) and (pointer: fine) { .side nav a:hover { background: var(--glass); color: var(--foreground); transform: translateX(2px); } }\n .side nav a:active { background: var(--glass); color: var(--foreground); }\n .app.sidebar-collapsed { grid-template-columns: 64px minmax(0, 1fr); }\n .app.sidebar-collapsed .side { padding-inline: .625rem; }\n .app.sidebar-collapsed .side-head { flex-direction: column; gap: .2rem; margin-bottom: .55rem; }\n .app.sidebar-collapsed .side .brand { flex: none; padding: .2rem 0; font-size: .75rem; }\n .app.sidebar-collapsed .brand-long { display: none; }\n .app.sidebar-collapsed .brand-short { display: block; }\n .app.sidebar-collapsed .side-toggle svg { transform: rotate(180deg); }\n .app.sidebar-collapsed .side nav a {\n justify-content: center; gap: 0; min-height: 2.5rem; padding: .5rem; font-size: 0;\n }\n .app.sidebar-collapsed .side nav a .glyph { width: 1.125rem; height: 1.125rem; }\n .app.sidebar-collapsed .side nav a .glyph svg { width: 1.125rem; height: 1.125rem; }\n .app.sidebar-collapsed .side nav a .count {\n position: absolute; top: .15rem; right: .05rem; min-width: 1rem; padding: 0 .25rem; font-size: .55rem;\n }\n .app.sidebar-collapsed .side .new-task { min-height: 2.5rem; padding: .4rem 0; font-size: 0; }\n .app.sidebar-collapsed .side .new-task::after { content: \"+\"; font-size: 1rem; }\n .app.sidebar-collapsed .side .nav-groups { display: none; }\n .side nav a.active {\n background: var(--card);\n color: var(--foreground); box-shadow: 0 1px 0 var(--glass-highlight) inset;\n }\n .side nav a.active .glyph { color: var(--foreground); }\n .side nav a .count { margin-left: auto; }\n .side .grow { flex: 1; }\n .side .new-task {\n display: block; text-align: center; text-decoration: none; font-weight: 600; font-size: .8125rem;\n background: var(--primary); color: var(--primary-foreground);\n border: 1px solid var(--primary);\n border-radius: calc(var(--radius) - 3px); padding: .525rem; margin: .75rem 0 .125rem;\n box-shadow: 0 10px 28px -18px rgb(255 255 255 / .5);\n }\n @media (hover: hover) and (pointer: fine) { .side .new-task:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n /* The same action link outside the sidebar reads as a real button. */\n .content .new-task {\n display: inline-block; text-decoration: none; font-weight: 500; font-size: .8125rem;\n background: var(--secondary); color: var(--foreground); border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); padding: .5rem .875rem;\n }\n @media (hover: hover) and (pointer: fine) { .content .new-task:hover { background: color-mix(in srgb, var(--secondary) 70%, var(--border)); } }\n .content { min-width: 0; }\n .content > main { max-width: 54rem; margin: 0; padding: 2rem 2.5rem 4rem; }\n\n /* Banners: honest labels, quiet strips. */\n .banner {\n border-bottom: 1px solid var(--glass-border); background: var(--glass);\n padding: .375rem .9rem; font-size: .8125rem; color: var(--muted-foreground);\n }\n .banner .badge { margin-right: .5rem; }\n /* Chat in `toolroll demo`: the scripted lead's conversation. */\n .demo-chat { display: flex; flex-direction: column; gap: 1rem; max-width: 46rem; margin: 0 auto; padding-bottom: 1rem; }\n .demo-thread { display: flex; flex-direction: column; gap: 1.25rem; }\n .demo-turn { display: flex; flex-direction: column; gap: .75rem; scroll-margin-top: 1rem; }\n .demo-said p { margin: 0; }\n .demo-you { align-self: flex-end; max-width: min(34rem, 85%); background: var(--so-ink); color: var(--so-paper); border-radius: .875rem .875rem .25rem .875rem; padding: .55rem .85rem; overflow-wrap: anywhere; }\n .demo-lead { max-width: 40rem; }\n .demo-who { font-size: .75rem; font-weight: 600; color: var(--so-muted); margin-bottom: .15rem !important; }\n .demo-chat .card { margin: 0; padding: 1rem 1.125rem; }\n .demo-chat .card h2 { font-size: .9375rem; margin: .1rem 0 .4rem; }\n .demo-chat .card h3 { font-size: .75rem; font-weight: 600; color: var(--so-muted); margin: .75rem 0 .25rem; }\n .demo-chat .card ul { margin: 0; padding-left: 1.1rem; }\n .demo-chat .card li { margin: .15rem 0; }\n .demo-chat .card > p { margin: .25rem 0; }\n .demo-kicker { font-size: .75rem; color: var(--so-muted); margin: 0 !important; }\n .demo-actions { display: flex; flex-wrap: wrap; align-items: flex-start; gap: .5rem; margin-top: .9rem; }\n .demo-actions form { margin: 0; }\n .demo-actions button, .demo-more > summary { min-height: 2.5rem; }\n .demo-chat button.demo-primary { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .demo-chat details.demo-more { flex: 1 1 12rem; margin: 0; padding: 0; border: 0; border-radius: 0; background: none; }\n .demo-chat details.demo-more[open] { padding-bottom: 0; }\n .demo-chat .demo-more > summary { display: inline-flex; align-items: center; color: var(--so-ink); padding: .35rem .85rem; border: 1px solid var(--so-input-line); border-radius: calc(var(--radius) - 3px); background: var(--so-paper); font-weight: 500; font-size: .8125rem; cursor: pointer; list-style: none; }\n .demo-more > summary::-webkit-details-marker { display: none; }\n .demo-more[open] > summary { margin-bottom: .5rem; }\n .demo-more form, .demo-composer { display: flex; flex-direction: column; gap: .4rem; }\n .demo-more label { font-size: .8125rem; font-weight: 500; }\n .demo-more textarea, .demo-composer textarea { width: 100%; font: inherit; font-size: 1rem; resize: vertical; }\n .demo-more form button { align-self: flex-start; }\n .demo-steps { display: flex; flex-wrap: wrap; gap: .4rem 1rem; list-style: none; padding: 0 !important; margin: .4rem 0 !important; }\n .demo-steps li { display: inline-flex; align-items: center; gap: .4rem; color: var(--so-muted); font-size: .8125rem; margin: 0 !important; }\n .demo-steps li::before { content: \"\"; width: .55rem; height: .55rem; border-radius: 50%; border: 1.5px solid currentColor; }\n .demo-steps li.done { color: var(--so-ink); }\n .demo-steps li.done::before { background: var(--so-success); border-color: var(--so-success); }\n .demo-steps li.now { color: var(--so-ink); font-weight: 600; }\n .demo-steps li.now::before { border-color: var(--so-info); background: var(--so-info); animation: demo-pulse 1.2s ease-in-out infinite; }\n @keyframes demo-pulse { 50% { opacity: .35; } }\n @media (prefers-reduced-motion: reduce) { .demo-steps li.now::before { animation: none; } }\n .demo-state { display: flex; align-items: center; gap: .5rem; margin: 0 !important; }\n .demo-chat .demo-handoff { border-color: var(--so-input-line); }\n .demo-command { margin: .4rem 0 .5rem; padding: .6rem .8rem; border-radius: calc(var(--radius) - 3px); background: var(--so-raised); font: 500 .8125rem/1.5 var(--font-mono); overflow-wrap: anywhere; white-space: pre-wrap; }\n .demo-chat .badge.demo-ready { background: var(--so-info-soft); color: var(--so-info); }\n .demo-chat .badge.demo-complete { background: var(--so-success-soft); color: var(--so-success); }\n .demo-pass { color: var(--so-success); font-weight: 500; }\n .demo-fail { color: var(--so-danger); font-weight: 500; }\n .demo-chat details.demo-evidence { margin: .5rem 0 0; padding: 0; border: 0; border-top: 1px solid var(--so-line); border-radius: 0; background: none; box-shadow: none; }\n .demo-evidence > summary { min-height: 2.5rem; display: list-item; padding-block: .55rem; cursor: pointer; font-weight: 500; font-size: .8125rem; }\n .demo-evidence pre { margin: 0 0 .5rem; max-height: 22rem; overflow: auto; padding: .6rem .75rem; border-radius: .5rem; background: var(--so-raised); font: 400 .75rem/1.55 var(--font-mono); white-space: pre; overflow-wrap: normal; }\n .demo-diff span { display: block; min-width: max-content; }\n .demo-diff-add { background: var(--so-success-soft); color: var(--so-success); }\n .demo-diff-del { background: var(--so-danger-soft); color: var(--so-danger); }\n .demo-diff-hunk, .demo-diff-meta { color: var(--so-muted); }\n .demo-diff-file { font-weight: 600; }\n .demo-evidence figure { margin: 0 0 .5rem; }\n .demo-evidence img { display: block; width: 100%; height: auto; border: 1px solid var(--so-line); border-radius: .5rem; }\n .demo-evidence figcaption { margin-top: .35rem; }\n .demo-hint { padding: 1.25rem 0 .25rem; }\n .demo-hint-title { font-size: .9375rem; font-weight: 600; margin: 0 0 .75rem; }\n .demo-suggestions { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0; }\n .demo-suggestions button { min-height: 2.5rem; border-radius: 999px; padding: .35rem .95rem; }\n .demo-composer { position: sticky; bottom: 0; padding: .75rem 0 .25rem; background: var(--so-paper); flex-direction: row; align-items: flex-end; }\n .demo-chat .demo-composer textarea { flex: 1 1 auto; width: auto; min-width: 0; min-height: 2.75rem; }\n .demo-chat .demo-composer button { flex: none; width: auto; min-height: 2.75rem; padding-inline: 1.1rem; }\n .banner a { color: var(--muted-foreground); }\n .sign-in-banner form { display: inline; margin: 0 0 0 .5rem; padding: 0; border: 0; background: transparent; }\n\n .split { display: grid; grid-template-columns: minmax(250px, 320px) minmax(0, 1fr); min-height: 100vh; }\n .list-pane {\n border-right: 1px solid var(--border); overflow-y: auto; height: 100vh;\n position: sticky; top: 0; padding: 1rem .75rem;\n }\n .list-pane h2 { margin-top: .25rem; }\n .list-pane a.item {\n display: block; padding: .5rem .625rem; border-radius: calc(var(--radius) - 4px);\n text-decoration: none; font-size: .8125rem; margin-bottom: .125rem;\n }\n @media (hover: hover) and (pointer: fine) { .list-pane a.item:hover { background: var(--card); } }\n .list-pane a.item.current { background: var(--muted); }\n .list-pane a.item .t { display: block; font-weight: 500; color: var(--foreground);\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .list-pane a.item .m { display: flex; gap: .375rem; align-items: center; color: var(--muted-foreground);\n font-size: .75rem; margin-top: .125rem; }\n .split > .detail { min-width: 0; }\n .split > .detail > main { max-width: 52rem; padding: 1.5rem 2rem 4rem; }\n .split:has(#wb-rail) { grid-template-columns: minmax(320px, 360px) minmax(0, 1fr); }\n .list-pane:has(#wb-rail) { padding: 0; background: var(--background); }\n #wb-rail { padding: 1rem .75rem 1.5rem; }\n #wb-rail-stamp { padding: 0 .75rem; }\n .workbench-mobile-rail, .workbench-mobile-back { display: none; }\n /* The task page (slice 1c): main column beside a rail; one column narrow. */\n .task-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(16rem, 19rem); gap: 0 2rem; align-items: start; }\n /* The task page (task page pass): title, the acts in one row,\n then folding sections; the rail is the property list. */\n .task-identity { overflow-wrap: anywhere; }\n .task-title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-title-row .task-main-title { min-width: 0; margin-bottom: .85rem; }\n .task-view-switch {\n display: inline-grid; grid-template-columns: repeat(2, auto); flex: none; padding: .2rem;\n border: 1px solid var(--glass-border); border-radius: .72rem; background: color-mix(in srgb, var(--glass) 82%, transparent);\n \n }\n .task-view-switch a {\n min-width: 4.6rem; padding: .4rem .72rem; border-radius: .52rem; color: var(--muted-foreground);\n font-size: .72rem; font-weight: 550; text-align: center; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .task-view-switch a:hover { color: var(--foreground); background: color-mix(in srgb, var(--muted) 70%, transparent); } }\n .task-view-switch a.active { color: var(--foreground); background: var(--glass-strong); box-shadow: 0 1px 5px rgb(0 0 0 / .1); }\n .acts-bar { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .75rem 0 .25rem; }\n .acts-bar form.inline { margin: 0; display: inline-flex; align-items: center; gap: .375rem; }\n .acts-bar form.inline button { width: auto; }\n .acts-bar .primary button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .acts-bar .primary button:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .acts-bar .act-hold input[type=text] { width: 10rem; min-height: 2.25rem; margin: 0; font-size: .8125rem; }\n .acts-why { margin: 0 0 .5rem; }\n .dispatch-status { padding: .8rem .9rem; border-radius: var(--radius); overflow: hidden; }\n .dispatch-copy { display: flex; align-items: baseline; flex-wrap: wrap; gap: .2rem .35rem; min-width: 0; }\n .dispatch-copy .meta { min-width: 0; }\n .dispatch-action-link { margin-top: .65rem; }\n .dispatch-status[data-dispatch-status=\"proof-refuted\"],\n .dispatch-status[data-dispatch-status=\"needs-verification\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dispatch-status[data-dispatch-status=\"proof-refuted\"] .dispatch-copy > strong::before,\n .dispatch-status[data-dispatch-status=\"needs-verification\"] .dispatch-copy > strong::before {\n content: \"\"; display: inline-block; width: .45rem; height: .45rem; margin-right: .45rem; border-radius: 50%; vertical-align: .08rem;\n background: var(--so-warning, #ab6400);\n }\n .problem.dispatch-status[data-dispatch-status=\"proof-refuted\"] .dispatch-copy > strong::before { background: var(--destructive); }\n .dispatch-status[data-dispatch-status=\"needs-verification\"] .dispatch-copy > strong::before { background: var(--muted-foreground); }\n /* A review in flight (review fixes): the box reads neutral \u2014 neither the\n green of a settled verdict nor the red of a problem \u2014 with the dot in\n the review's own tone. */\n .dispatch-status[data-work-status=\"reviewing\"], .dispatch-status[data-work-status=\"review-pending\"],\n .dispatch-status[data-work-status=\"review-failed\"], .dispatch-status[data-work-status=\"review-exhausted\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dispatch-status[data-work-status=\"reviewing\"] .dispatch-copy > strong::before, .dispatch-status[data-work-status=\"review-pending\"] .dispatch-copy > strong::before,\n .dispatch-status[data-work-status=\"review-failed\"] .dispatch-copy > strong::before, .dispatch-status[data-work-status=\"review-exhausted\"] .dispatch-copy > strong::before {\n content: \"\"; display: inline-block; width: .45rem; height: .45rem; margin-right: .45rem; border-radius: 50%; vertical-align: .08rem; background: var(--warning);\n }\n .dispatch-status[data-work-status=\"reviewing\"] .dispatch-copy > strong::before { background: var(--running); }\n .review-retry { margin-bottom: .65rem; }\n .task-control { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: .6rem .9rem; margin: .65rem 0; padding: .8rem .9rem; }\n .task-control-copy { display: flex; flex-direction: column; gap: .15rem; min-width: 0; flex: 1 1 16rem; }\n .task-control-copy strong { display: flex; align-items: center; gap: .4rem; overflow-wrap: anywhere; }\n .task-control-copy .meta { overflow-wrap: anywhere; }\n .task-control-form { margin: 0; flex: none; }\n .task-control-button { width: auto; min-width: 7.5rem; white-space: nowrap; }\n .task-control-button.primary { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .task-control-button[disabled] { opacity: .65; cursor: not-allowed; }\n .task-control[data-task-control=\"stopping\"] { border-color: color-mix(in srgb, var(--destructive) 45%, var(--glass-border)); }\n .task-control[data-task-control=\"stopping\"] .live-dot { background: var(--destructive); }\n .task-control[data-task-control=\"paused\"] .eyebrow { color: var(--destructive); }\n .resume-ceremony .row { margin: .3rem 0; }\n @media (max-width: 480px) { .task-control { align-items: stretch; } .task-control-form, .task-control-button { width: 100%; } .task-control-form .task-control-button { width: 100%; } }\n .review-attempts { margin: .55rem 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: .2rem; font-size: .8125rem; }\n .review-attempts li { display: flex; flex-wrap: wrap; align-items: baseline; gap: .2rem .45rem; min-width: 0; }\n .review-attempts .review-attempt-ordinal { font-weight: 600; }\n .review-attempts .meta { min-width: 0; overflow-wrap: anywhere; }\n .review-retry-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .55rem; margin-top: .65rem; }\n .review-retry-actions form.inline { margin: 0; }\n .review-retry-button { width: auto; max-width: 100%; white-space: normal; }\n .review-retry-form .review-retry-button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .review-retry-button[disabled] { opacity: .65; cursor: not-allowed; }\n .proof-review-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .55rem; margin: .65rem 0; }\n .proof-review-actions > .button-link { flex: none; }\n details.proof-exception { margin: 0; }\n details.proof-exception > summary { cursor: pointer; color: var(--muted-foreground); font-size: .78rem; font-weight: 600; }\n details.proof-exception[open] { flex: 1 1 100%; padding: .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--glass); }\n details.proof-exception[open] > summary { margin-bottom: .6rem; color: var(--foreground); }\n .proof-exception-form { display: flex; flex-wrap: wrap; gap: .5rem; margin: 0; }\n .proof-exception-form input { margin: 0; min-width: 12rem; }\n .proof-exception-form button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n .dispatch-proof-details { margin: .65rem 0 .85rem; border: 1px solid var(--glass-border); border-radius: var(--radius); background: var(--glass); }\n .dispatch-proof-details > summary { padding: .75rem .9rem; cursor: pointer; color: var(--muted-foreground); font-size: .78rem; font-weight: 600; }\n .dispatch-proof-body { padding: 0 .9rem .85rem; border-top: 1px solid var(--glass-border); }\n details.dispatch-recovery { margin-top: .65rem; border: 0; padding: 0; background: transparent; box-shadow: none; }\n details.dispatch-recovery > summary {\n display: inline-flex; align-items: center; min-height: 2.25rem; padding: 0 .875rem; list-style: none;\n border: 1px solid var(--primary); border-radius: calc(var(--radius) - 2px); cursor: pointer;\n background: var(--primary); color: var(--primary-foreground); font-size: .8125rem; font-weight: 600;\n }\n details.dispatch-recovery > summary::-webkit-details-marker { display: none; }\n .dispatch-recovery-body { margin-top: .65rem; padding: .7rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--glass); color: var(--foreground); }\n .dispatch-recovery-body p { margin: 0; }\n .dispatch-recovery-body p + p { margin-top: .5rem; }\n .dispatch-recovery-command { display: block; margin-top: .45rem; padding: .55rem .65rem; overflow-wrap: anywhere; border-radius: .5rem; background: var(--muted); }\n .dispatch-status[data-dispatch-status=\"no-worker-registered\"],\n .dispatch-status[data-dispatch-status=\"no-worker-online\"] {\n color: var(--foreground); border-color: color-mix(in srgb, var(--warning) 30%, var(--border));\n background: color-mix(in srgb, var(--warning-soft) 48%, var(--glass));\n }\n .dispatch-status[data-dispatch-status=\"no-worker-registered\"] .dispatch-copy > strong,\n .dispatch-status[data-dispatch-status=\"no-worker-online\"] .dispatch-copy > strong { color: color-mix(in srgb, var(--warning) 72%, var(--foreground)); }\n .builder-notice { border-color: color-mix(in srgb, var(--warning) 30%, var(--border)); background: color-mix(in srgb, var(--warning-soft) 48%, var(--glass)); }\n .builder-notice strong { color: color-mix(in srgb, var(--warning) 72%, var(--foreground)); }\n .dispatch-status[data-dispatch-status=\"terminal-dependency\"] {\n color: var(--foreground); border-color: color-mix(in srgb, var(--warning) 42%, var(--border));\n background: color-mix(in srgb, var(--warning-soft) 72%, var(--glass));\n }\n .dispatch-status[data-dispatch-status=\"terminal-dependency\"] .dispatch-copy > strong { color: var(--warning); }\n .dispatch-status[data-dispatch-status=\"waiting-dependency\"] {\n color: var(--foreground); border-color: var(--glass-border); background: var(--glass);\n }\n .dependency-repair-actions { display: flex; flex-wrap: wrap; align-items: center; gap: .45rem; margin-top: .7rem; }\n .dependency-repair-help { flex: 1 0 100%; margin: 0 0 .1rem; }\n .dependency-repair-actions form { display: inline-flex; align-items: center; gap: .4rem; min-width: 0; max-width: 100%; margin: 0; }\n .dependency-repair-label { flex: 1 1 16rem; min-width: 0; margin: 0; color: var(--foreground); font-size: .75rem; }\n .dependency-repair-label select { display: block; margin: .3rem 0 0; }\n .dependency-repair-actions select { width: auto; max-width: 16rem; min-height: 2rem; margin: 0; font-size: .75rem; }\n .dependency-repair-actions button { min-height: 2rem; padding: .3rem .65rem; font-size: .75rem; }\n .approve-form { margin: .75rem 0; }\n .approve-form .ceremony-head { display: flex; align-items: baseline; justify-content: space-between; gap: .75rem; margin: 0 0 .5rem; }\n .approve-form .ceremony-head a { font-size: .8125rem; color: var(--muted-foreground); white-space: nowrap; }\n .approve-form .recap { margin: .125rem 0 .5rem; }\n .approval-card { padding: 1.2rem 1.3rem; border-radius: calc(var(--radius) + 3px); }\n .approval-card .ceremony-head { align-items: flex-start; padding-bottom: .85rem; border-bottom: 1px solid var(--glass-border); }\n .approval-title { display: grid; gap: .15rem; }\n .approval-kicker { color: var(--muted-foreground); font: 500 .66rem/1.3 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .approval-title strong { font-size: 1.05rem; letter-spacing: -.02em; }\n .approval-label { display: block; margin: .9rem 0 .2rem; color: var(--muted-foreground); font: 500 12px/1.4 var(--font-sans); }\n .approval-label::first-letter, .planner-plan .eyebrow::first-letter { text-transform: uppercase; }\n .planner-plan .eyebrow { font: 500 12px/1.4 var(--font-sans); letter-spacing: 0; text-transform: none; }\n .approval-goal { margin: 0; font-size: 1rem; line-height: 1.55; white-space: pre-wrap; }\n .approval-boundaries { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; margin-top: .75rem; }\n .approval-boundary { padding: .7rem .8rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); }\n .approval-boundary .approval-label { margin: 0 0 .2rem; }\n .approval-boundary p { margin: 0; color: var(--muted-foreground); font-size: .8rem; overflow-wrap: anywhere; }\n .approval-chips { display: flex; flex-wrap: wrap; gap: .4rem; margin: .8rem 0 .3rem; }\n /* The filed contract (contract handoff, task 1): preserved, amended, or\n drafted from nothing \u2014 the same panel on the task page, in the\n ceremony, and on /next, so an amendment is never a surprise after the\n yes. An amendment is the one state that asks for a second look. */\n .contract-panel { margin-top: .8rem; padding: .7rem .85rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); }\n .contract-panel .approval-label { margin: 0 0 .25rem; }\n .contract-panel p { margin: .2rem 0; }\n .contract-amended { border-color: color-mix(in srgb, var(--warning, #c98a1b) 55%, var(--glass-border)); background: color-mix(in srgb, var(--warning, #c98a1b) 9%, transparent); }\n .contract-reason { font-size: .9rem; }\n .contract-changes { margin: .5rem 0 0; padding-left: 1.1rem; display: grid; gap: .45rem; }\n .contract-changes li { overflow-wrap: anywhere; }\n .contract-change-kind { display: inline-block; margin-right: .3rem; padding: .05rem .4rem; border-radius: 999px; font: 600 .62rem/1.5 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; background: color-mix(in srgb, var(--muted) 70%, transparent); }\n .contract-change-added { background: color-mix(in srgb, var(--success, #2f9e5f) 18%, transparent); }\n .contract-change-removed { background: color-mix(in srgb, var(--danger, #c8453d) 18%, transparent); }\n .contract-change-changed { background: color-mix(in srgb, var(--warning, #c98a1b) 22%, transparent); }\n .contract-before, .contract-after { margin-top: .15rem; font-size: .85rem; }\n .contract-before { color: var(--muted-foreground); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--muted-foreground) 55%, transparent); }\n .contract-note { margin-top: .5rem; }\n /* The agents (v47): one compact summary, rendered identically on the task\n page, in the approval ceremony, and in the focused chat; reasons and\n change controls stay closed until asked for. */\n .agents-card { margin-top: .75rem; }\n .agents-head { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem .6rem; }\n .agents-head h3 { margin: 0; font-size: .95rem; letter-spacing: -.02em; }\n .agents-badges { display: flex; flex-wrap: wrap; gap: .3rem; }\n .agents-summary { margin: .55rem 0 0; font-size: .86rem; line-height: 1.5; overflow-wrap: anywhere; }\n .agents-availability-label { margin: .6rem 0 .15rem; }\n .agents-availability { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: .25rem .9rem; font-size: .8125rem; }\n .agents-availability li { overflow-wrap: anywhere; }\n .agents-availability-unavailable { color: var(--destructive); font-weight: 600; }\n .agents-availability-ready { color: var(--success); }\n .agents-availability-unknown { color: var(--muted-foreground); }\n .agents-halted { margin: .6rem 0 0; padding: .55rem .7rem; border: 1px solid color-mix(in srgb, var(--destructive) 40%, var(--border)); border-radius: calc(var(--radius) - 3px); background: var(--destructive-soft); font-size: .8rem; }\n .agents-problems { margin: .5rem 0 0; padding-left: 1.1rem; color: var(--destructive); font-size: .78rem; }\n .agents-why, .agents-change { margin-top: .65rem; }\n .agents-why > summary, .agents-change > summary { display: flex; align-items: center; min-height: 2.75rem; padding: .35rem .2rem; cursor: pointer; font-size: .8rem; font-weight: 600; }\n .agents-demands { margin: .35rem 0 0; padding-left: 1.1rem; color: var(--muted-foreground); font-size: .76rem; line-height: 1.45; }\n .agents-roles { display: grid; grid-template-columns: 5rem minmax(0, 1fr); gap: .45rem .6rem; margin: .5rem 0 0; }\n .agents-roles dt { color: var(--muted-foreground); font: 500 .66rem/1.8 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .agents-roles dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\n .agents-roles .agents-reasons { margin: .2rem 0 0; padding-left: 1rem; color: var(--muted-foreground); font-size: .74rem; line-height: 1.45; }\n .agents-form { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .5rem; align-items: end; margin: 0; }\n .agents-form label, .agents-form-risk label { display: grid; gap: .2rem; margin: 0; min-width: 0; font-size: .74rem; }\n .agents-form input, .agents-form select, .agents-form-risk select { width: 100%; min-width: 0; min-height: 2.75rem; }\n .agents-form button, .agents-form-risk button, .agents-clear button { min-height: 2.75rem; }\n .agents-form-risk { display: flex; flex-wrap: wrap; align-items: end; gap: .5rem; margin-top: .5rem; }\n .agents-form-risk label.agents-risky { display: flex; align-items: center; gap: .4rem; min-height: 2.75rem; font-size: .85rem; }\n .agents-overrides { list-style: none; margin: .5rem 0 0; padding: 0; display: grid; gap: .35rem; font-size: .78rem; }\n .agents-overrides li { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: .4rem .6rem; }\n .agents-clear { margin: 0; }\n .agents-clear button { padding-inline: .8rem; font-size: .72rem; }\n .agents-ceremony { margin: .5rem 0 0; }\n .agents-ceremony .agents-badges { margin-top: .35rem; }\n .agents-runtime { margin-top: .5rem; }\n .agents-runtime > summary { display: flex; align-items: center; min-height: 2.75rem; padding: .35rem .2rem; cursor: pointer; font-size: .8rem; font-weight: 600; }\n .agents-role-forms { display: grid; gap: .45rem; margin-top: .6rem; }\n .agents-role-row { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: .5rem; align-items: center; }\n .agents-role-name { color: var(--muted-foreground); font: 500 .66rem/1.8 var(--font-mono); letter-spacing: .06em; text-transform: uppercase; }\n .task-chat-agents { display: flex; flex-wrap: wrap; align-items: baseline; gap: .3rem .55rem; margin: .1rem 0 .2rem; padding: .55rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--muted) 45%, transparent); font-size: .78rem; line-height: 1.45; overflow-wrap: anywhere; }\n .task-chat-agents a { white-space: nowrap; }\n .task-chat-agents-aside { margin-top: .85rem; }\n .task-chat-agents-aside .agents-summary { font-size: .74rem; }\n .task-chat-agents-aside .agents-badges { margin-top: .35rem; }\n .task-chat-agents-aside .agents-roles { grid-template-columns: 1fr; }\n .approval-chip { padding: .25rem .6rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: var(--glass); font-size: .7rem; }\n .approval-confirm { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .75rem; align-items: end; margin-top: .9rem; padding-top: .8rem; border-top: 1px solid var(--glass-border); }\n .approval-confirm label { margin: 0; }\n .approval-card .approval-confirm button { min-height: 44px; white-space: nowrap; }\n /* The ceremony's orientation and exact-terms group (UI polish 2026-09-13). */\n /* Neutral by law: magenta belongs to the count and the approve act alone. */\n .approval-orient { margin: .85rem 0 .25rem; }\n .approval-terms { scroll-margin-top: 5rem; }\n .approval-confirm { scroll-margin-top: 5rem; }\n .approval-paths { margin: 0; padding: 0; list-style: none; display: grid; gap: .15rem; }\n .approval-paths li { color: var(--muted-foreground); font-size: .8rem; overflow-wrap: anywhere; }\n /* The approval sheet (approval critique, Oct 2): the plan open in plain\n rows, who builds in one line, one Approve & start beside the password,\n and every other signed term in one Details fold at the end. Sentence\n case, Geist, 12px and up; prose capped at 75ch. */\n .approval-sheet { display: grid; gap: 16px; margin: 0; padding: 20px; border: 1px solid var(--border); border-radius: 10px; background: var(--card); }\n .approval-sheet.approve-form > :not(input) { margin: 0; }\n .approval-sheet-title { margin: 0; font-size: 15px; font-weight: 600; line-height: 1.4; letter-spacing: -.01em; }\n .approval-revision, .approval-note { max-width: 75ch; font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }\n .approval-note { color: var(--muted-foreground); }\n .approval-rows { display: grid; gap: 14px; margin: 0; }\n .approval-row { display: grid; grid-template-columns: 7.5rem minmax(0, 1fr); gap: 16px; }\n .approval-row dt { margin: 0; color: var(--muted-foreground); font-size: 13px; font-weight: 500; line-height: 1.6; }\n .approval-row dd { min-width: 0; max-width: 75ch; margin: 0; font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }\n .approval-row dd p, .approval-sheet .approval-goal { margin: 0; font-size: 14px; line-height: 1.6; }\n .approval-row dd :is(ol, ul) { display: grid; gap: 4px; margin: 0; padding-left: 1.25rem; }\n .approval-row dd ol + p { margin-top: 6px; }\n .approval-row dd .approval-paths { margin-top: 2px; padding-left: 0; }\n .approval-row dd .approval-paths li { font-size: 13px; }\n .approval-amendment { max-width: 75ch; padding: 12px 14px; border-radius: 8px; background: var(--muted); font-size: 14px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-amendment p { margin: 0; }\n .approval-amendment ul { display: grid; gap: 4px; margin: 6px 0; padding-left: 1.25rem; }\n .agents-size { margin: 0; font-size: 13px; line-height: 1.5; }\n .approval-who { max-width: 75ch; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-act { display: grid; grid-template-columns: minmax(0, 20rem) auto; justify-content: start; align-items: center; gap: 8px; }\n .approval-password { margin: 0; }\n .approval-act input[type=password] { margin: 0; font-family: var(--font-sans); }\n .approval-act button { margin: 0; min-height: 2.125rem; white-space: nowrap; }\n .approval-after { max-width: 75ch; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-allowing, .approval-you-check { max-width: 75ch; font-size: 14px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-sheet .approval-allowing + .approval-you-check { margin-top: -10px; }\n .approval-act > button { grid-column: 2; grid-row: 1; }\n .approval-password-note { grid-column: 1; grid-row: 2; margin: 0; color: var(--muted-foreground); font-size: 13px; line-height: 1.5; }\n .approval-secondary { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n details.approval-edit, details.approval-edit[open] { margin: 0; padding: 0; border: 0; border-radius: 0; background: none; }\n /* Edit plan, in place: the rows become fields where they stood; the\n approval act and Details step aside until it is saved or cancelled. */\n .approval-sheet { position: relative; }\n .approval-edit > summary { list-style: none; cursor: pointer; }\n .approval-edit > summary::-webkit-details-marker { display: none; }\n .approval-edit-close, .approval-edit[open] .approval-edit-open { display: none; }\n .approval-edit[open] .approval-edit-close { display: inline; }\n .approval-edit[open] > summary { position: absolute; top: 14px; right: 20px; }\n .approval-sheet:has(.approval-edit[open]) > :not(.approval-sheet-title, .approval-secondary) { display: none; }\n .approval-secondary:has(> .approval-edit[open]) { display: block; }\n .approval-secondary:has(> .approval-edit[open]) > a { display: none; }\n .approval-editor { display: grid; gap: 14px; }\n .approval-editor .problem { margin: 0; }\n .approval-field { display: grid; gap: 4px; min-width: 0; margin: 0; padding: 0; border: 0; }\n .approval-field-label { padding: 0; color: var(--muted-foreground); font-size: 13px; font-weight: 500; line-height: 1.6; }\n .approval-field-hint { color: var(--muted-foreground); font-size: 12px; line-height: 1.5; }\n .approval-field textarea, .approval-field input[type=text] { width: 100%; max-width: 75ch; margin: 0; font-family: var(--font-sans); font-size: 14px; line-height: 1.55; }\n .approval-requirements { display: grid; gap: 6px; margin: 2px 0 0; padding: 0; list-style: none; }\n .approval-edit-act { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }\n .approval-edit-act button { margin: 0; min-height: 2.125rem; white-space: nowrap; }\n .approval-link { display: inline-flex; align-items: center; min-height: 32px; padding: 0 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--card); color: var(--foreground); font-size: 13px; font-weight: 500; text-decoration: none; }\n .approval-secondary > .approval-link:not(:first-child) { border-color: transparent; background: none; color: var(--muted-foreground); }\n @media (hover: hover) and (pointer: fine) { .approval-link:hover { background: var(--muted); color: var(--foreground); } }\n details.approval-details { margin: 0; padding: 0; border: 0; border-top: 1px solid var(--border); border-radius: 0; background: none; }\n details.approval-details[open] { padding-bottom: 0; }\n .approval-details > summary { display: flex; align-items: center; min-height: 40px; padding: 4px 0 0; font-size: 13px; }\n .approval-detail { max-width: 75ch; margin: 12px 0 0; font-size: 13px; line-height: 1.55; overflow-wrap: anywhere; }\n .approval-detail h3 { margin: 0 0 4px; font-size: 13px; font-weight: 600; letter-spacing: 0; text-transform: none; }\n .approval-detail p, .approval-detail ul, .approval-detail dl { margin: 4px 0; }\n .approval-detail ul { padding-left: 1.25rem; }\n .approval-detail .revision-card { margin: 0; padding: 0; border: 0; background: none; }\n .approval-roles { display: grid; gap: 8px; }\n .approval-roles > div { display: grid; grid-template-columns: 6rem minmax(0, 1fr); gap: 12px; }\n .approval-roles dt { color: var(--muted-foreground); font-weight: 500; }\n .approval-roles dd { margin: 0; }\n .approval-roles dd ul { margin: 2px 0 0; color: var(--muted-foreground); }\n .chat-plan .approval-sheet { padding: 0; border: 0; background: none; }\n @media (max-width: 760px) {\n .approval-sheet { gap: 12px; padding: 14px; }\n .approval-row { grid-template-columns: 1fr; gap: 2px; }\n .approval-act { grid-template-columns: 1fr; }\n .approval-act > button, .approval-password-note { grid-column: auto; grid-row: auto; }\n .approval-act input[type=password], .approval-act button { min-height: 44px; font-size: 16px; }\n .approval-act button { width: 100%; }\n /* The one act stays under the thumb: sticky at the bottom, clear of the home indicator. */\n .approval-sheet[data-sticky] .approval-act {\n position: sticky; bottom: 0; z-index: 20; margin: 0 -14px; padding: 10px 14px calc(10px + env(safe-area-inset-bottom, 0px));\n border-top: 1px solid var(--border); background: var(--card);\n }\n .approval-link { min-height: 44px; padding: 0 16px; }\n .approval-edit[open] > summary { top: 6px; right: 6px; }\n .approval-field textarea, .approval-field input[type=text] { font-size: 16px; }\n .approval-edit-act button { width: 100%; min-height: 44px; font-size: 16px; }\n .approval-details > summary { min-height: 44px; }\n .approval-roles > div { grid-template-columns: 1fr; gap: 2px; }\n }\n .run-facts-details { margin-top: 1.25rem; }\n .run-facts-details > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; }\n .run-facts-details > summary .meta { font-size: .75rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .task-main-title, .chat-project-name strong, .proposal h3 { overflow-wrap: anywhere; }\n .planner-plan { margin-top: .75rem; padding: 1.15rem 1.2rem; overflow: hidden; background: color-mix(in srgb, var(--glass) 82%, transparent); }\n .execution-plan-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; margin-bottom: .95rem; }\n .execution-plan-head h2 { margin: .15rem 0 0; font-size: 1.05rem; letter-spacing: -.025em; }\n .execution-plan-head p { margin: .25rem 0 0; max-width: 38rem; }\n details.planner-plan-collapsed { padding: 0; }\n .planner-plan-collapsed > summary.execution-plan-head {\n position: relative; list-style: none; align-items: center; min-height: 4.25rem; margin: 0; padding: .9rem 3rem .9rem 1.1rem; cursor: pointer;\n }\n .planner-plan-collapsed > summary::-webkit-details-marker { display: none; }\n .planner-plan-collapsed > summary::after {\n content: \"\"; position: absolute; right: 1.2rem; top: 50%; width: .45rem; height: .45rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: translateY(-65%) rotate(45deg); transition: transform .15s ease;\n }\n .planner-plan-collapsed[open] > summary::after { transform: translateY(-35%) rotate(225deg); }\n .planner-plan-collapsed[open] > summary { border-bottom: 1px solid var(--glass-border); }\n .planner-plan-body { padding: 1rem 1.15rem 1.15rem; }\n .plan-lock { flex: none; padding: .3rem .6rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 50%, transparent); font-size: .7rem; }\n .execution-plan { display: grid; gap: .75rem; }\n .execution-plan p { margin: .2rem 0 0; line-height: 1.55; white-space: pre-wrap; }\n .execution-plan ol, .execution-plan ul { display: grid; gap: .45rem; margin: .35rem 0 0; padding-left: 1.3rem; }\n .execution-plan li { padding-left: .15rem; line-height: 1.45; overflow-wrap: anywhere; }\n .execution-milestones { padding: .85rem .9rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--muted) 36%, transparent); }\n .execution-milestones li::marker { color: var(--muted-foreground); font: 500 .7rem var(--font-mono); }\n .execution-support { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .65rem; }\n .execution-support > div, .execution-proof { padding: .8rem .85rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass) 74%, transparent); }\n .execution-proof li::marker { content: \"\u2713 \"; color: var(--running); }\n .execution-plan-compact { gap: .55rem; margin-top: .4rem; }\n .execution-plan-compact .execution-support { grid-template-columns: 1fr; }\n .plan-editor { margin-top: .9rem; padding-top: .75rem; border-top: 1px solid var(--glass-border); }\n .plan-editor > summary { width: fit-content; color: var(--muted-foreground); cursor: pointer; font-size: .8rem; font-weight: 600; }\n .plan-editor form { margin-top: .7rem; }\n .plan-editor textarea { width: 100%; font-family: var(--font-mono); font-size: .75rem; line-height: 1.55; }\n .milestone-progress-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .milestone-progress-head h2 { margin: .15rem 0 0; }\n .milestone-progress-count { flex: none; padding: .28rem .58rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 45%, transparent); font-size: .7rem; font-weight: 600; }\n .milestone-list { list-style: none; margin: .75rem 0 0; padding: 0; display: grid; gap: .4rem; }\n .milestone { display: flex; align-items: baseline; gap: .5rem; padding: .5rem .65rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass) 74%, transparent); overflow-wrap: anywhere; }\n .milestone-badge { display: inline-flex; align-items: center; gap: .35rem; flex: none; padding: .08rem .45rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); background: color-mix(in srgb, var(--muted) 36%, transparent); font-size: .67rem; font-weight: 600; letter-spacing: .01em; }\n .milestone-badge::before { content: \"\"; width: .38rem; height: .38rem; border-radius: 999px; background: color-mix(in srgb, var(--muted-foreground) 55%, transparent); }\n .milestone-current .milestone-badge { color: var(--foreground); }\n .milestone-current .milestone-badge::before { background: var(--running); box-shadow: 0 0 0 2px color-mix(in srgb, var(--running) 13%, transparent); }\n .milestone-completed .milestone-badge::before { background: var(--success, var(--running)); }\n .milestone-blocked .milestone-badge::before { background: var(--warning); }\n .milestone-progress-note { margin: .7rem .1rem 0; }\n .plan-revision-pending { margin-top: .85rem; padding: .85rem .9rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 2px); background: color-mix(in srgb, var(--running-soft) 30%, transparent); }\n .plan-revision-pending h3 { margin: .15rem 0 .35rem; font-size: 1rem; letter-spacing: -.02em; }\n .plan-revision-pending > p { margin: .3rem 0; }\n .plan-revision-pending form { margin-top: .6rem; display: inline-flex; gap: .4rem; align-items: center; }\n .plan-revision-pending form + form { margin-left: .5rem; }\n .plan-revision > h2 { margin: .15rem 0 .35rem; color: var(--foreground); font-size: 1rem; letter-spacing: -.02em; }\n .plan-revision > p.meta { margin-top: 0; }\n .plan-revision-history { margin-top: .85rem; }\n .plan-revision-history > summary { cursor: pointer; color: var(--muted-foreground); font-size: .8rem; font-weight: 600; }\n .planner-status { display: flex; gap: .8rem; align-items: flex-start; }\n .planner-orb { position: relative; flex: 0 0 2.15rem; width: 2.15rem; height: 2.15rem; border-radius: .75rem; background: var(--running-soft); }\n .planner-orb::after { content: \"\"; position: absolute; inset: .65rem; border-radius: 999px; background: var(--running); animation: pulse 1.25s ease-in-out infinite; }\n .planner-status p { margin: 0; }\n .planner-status .meta { display: block; margin-top: .2rem; }\n .ceremony-road { margin: .75rem 0 0; }\n .button-link {\n display: inline-flex; align-items: center; justify-content: center; min-height: 2.25rem; padding: 0 .875rem;\n border-radius: calc(var(--radius) - 2px); background: var(--primary); color: var(--primary-foreground);\n font-weight: 600; font-size: .8125rem; text-decoration: none; border: 1px solid var(--primary);\n }\n .props .row { padding: .4375rem .375rem; align-items: baseline; }\n .props .row .meta { flex: 0 0 6.5rem; }\n .props .row .mono { flex: 1 1 10rem; min-width: 0; overflow-wrap: anywhere; }\n .props .row .seal { margin-right: .375rem; }\n details.section { border: 0; background: transparent; padding: 0; margin: 1.25rem 0 0; border-radius: 0; box-shadow: none; }\n details.section[open] { padding-bottom: 0; }\n details.section > summary { list-style: none; display: flex; align-items: center; padding: .25rem 0; min-height: 2.25rem; }\n details.section > summary::-webkit-details-marker { display: none; }\n details.section > summary h2 { margin: 0; flex: 1; display: flex; align-items: center; gap: .4rem; }\n details.section > summary h2 .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; font-weight: 500; color: var(--muted-foreground); font-size: .6875rem; }\n details.section > summary::after {\n content: \"\"; width: .45rem; height: .45rem; flex: none; margin-right: .375rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.125rem); transition: transform .15s;\n }\n details.section[open] > summary::after { transform: rotate(225deg) translateY(-.125rem); }\n @media (hover: hover) and (pointer: fine) { details.section > summary:hover h2 { color: var(--foreground); } }\n .task-layout > .task-main { min-width: 0; }\n .task-rail { position: sticky; top: 1rem; }\n .task-rail .card { margin-top: .75rem; }\n .task-rail .mono { overflow-wrap: anywhere; }\n main:has(.task-layout) { max-width: 76rem; }\n @media (max-width: 980px) {\n .task-layout { grid-template-columns: 1fr; }\n .cockpit { grid-template-columns: 1fr; }\n .cockpit-queue { position: static; padding-bottom: .75rem; margin-bottom: .5rem; border-bottom: 1px solid var(--border); }\n .cockpit-queue-list { max-height: 15rem; }\n .task-rail { position: static; order: -1; border-bottom: 1px solid var(--border); padding-bottom: .75rem; margin-bottom: .75rem; }\n .acts-bar form.inline, .acts-bar .primary, .acts-bar .primary form { flex: 1 1 auto; }\n .acts-bar .primary { flex-basis: 100%; }\n .acts-bar .primary button { width: 100%; }\n .acts-bar .act-hold { flex-wrap: wrap; }\n .acts-bar .act-hold input[type=text] { flex: 1 1 8rem; width: auto; }\n .dependency-repair-actions { align-items: stretch; }\n .dependency-repair-actions form { flex: 1 1 10rem; }\n .dependency-repair-actions .dependency-repair-replace { flex-basis: 100%; }\n .dependency-repair-actions select { flex: 1 1 auto; min-width: 0; max-width: none; }\n .dependency-repair-actions button { white-space: nowrap; }\n .split { grid-template-columns: 1fr; }\n .list-pane { display: none; }\n .workbench-mobile-rail, .workbench-mobile-back { display: block; }\n .workbench-mobile-rail { margin-top: 1.75rem; border-top: 1px solid var(--border); padding-top: .75rem; }\n .workbench-mobile-back { margin: 0 0 1rem; }\n }\n @media (max-width: 620px) {\n .planner-plan { padding: 1rem; }\n details.planner-plan-collapsed { padding: 0; }\n .planner-plan-collapsed > summary.execution-plan-head { padding: .8rem 2.5rem .8rem .9rem; }\n .planner-plan-collapsed > summary .plan-lock { display: none; }\n .planner-plan-body { padding: .85rem .9rem 1rem; }\n .execution-plan-head { flex-direction: column; align-items: flex-start; gap: .55rem; }\n .execution-support { grid-template-columns: 1fr; }\n .plan-lock { white-space: nowrap; }\n .milestone-progress-head { align-items: center; }\n .milestone-progress-count { padding-inline: .48rem; }\n .milestone { align-items: flex-start; padding: .55rem; }\n .plan-revision-pending form { display: flex; width: 100%; }\n .plan-revision-pending form + form { margin-left: 0; margin-top: .4rem; }\n .plan-revision-pending button { width: 100%; }\n }\n\n /* Work (workspace package 1): a quiet list of rows and dividers, never\n another grid of cards. The status line is the same component every\n surface renders for a run \u2014 a small dot in the tone, neutral words. */\n .work-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n .work-head h1 { margin-bottom: .25rem; }\n .work-tools { display: none; position: relative; flex: none; margin: .25rem 0 0; border: 0; padding: 0; background: none; border-radius: 0; }\n .app.sidebar-collapsed .work-tools { display: block; }\n .work-tools > summary {\n list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .3rem;\n min-height: 2.25rem; padding: 0 .75rem; border: 1px solid var(--border); border-radius: 999px;\n font-size: .8125rem; font-weight: 500; color: var(--foreground); background: var(--card);\n }\n .work-tools > summary::-webkit-details-marker { display: none; }\n .work-tools > summary .chevron { width: .875rem; height: .875rem; }\n .work-tools[open] > summary .chevron { transform: rotate(180deg); }\n .work-tools-menu {\n position: absolute; right: 0; top: calc(100% + .375rem); z-index: 20; min-width: 11rem; max-width: calc(100vw - 2rem);\n display: flex; flex-direction: column; padding: .375rem; border: 1px solid var(--border); border-radius: calc(var(--radius) - 2px);\n background: var(--card); box-shadow: var(--shadow);\n }\n .work-tools-menu a { display: block; padding: .5rem .625rem; border-radius: .5rem; text-decoration: none; color: var(--foreground); font-size: .875rem; }\n @media (hover: hover) and (pointer: fine) { .work-tools-menu a:hover { background: var(--muted); } }\n /* The result panel (workspace package 3): one presentation of a finished\n result for the run page, the review cockpit, and the chat's result\n detail \u2014 the deliverable first, problems ahead of readiness words,\n three local views, and Request changes beside it. */\n .result-panel { position: relative; padding: 1.1rem 1.2rem 1rem; min-width: 0; }\n .result-back { margin: 0 0 .4rem; font-size: .8125rem; }\n /* A comfortable target at every width (repair 2026-09-14): 44px tall. */\n .result-back a { display: inline-flex; align-items: center; min-height: 2.75rem; padding: 0 .35rem; margin-left: -.35rem; border-radius: .375rem; text-decoration: none; font-weight: 550; }\n .result-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 1rem; }\n .result-head h2 { margin: .15rem 0 0; font-size: 1.15rem; }\n .result-head .eyebrow { overflow-wrap: anywhere; }\n .result-head .status-line { flex: none; font-size: .8125rem; }\n .result-summary { max-width: 46rem; margin: .6rem 0 0; font-size: .95rem; line-height: 1.5; }\n .result-action { margin: .7rem 0 0; }\n .result-action form { margin: 0; }\n .result-action .button-link { min-height: 2.5rem; gap: .35rem; }\n .result-action .button-link .meta { color: inherit; opacity: .78; font-weight: 500; }\n .result-notes, .result-details, .result-notes[open], .result-details[open] { margin: .6rem 0 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .result-notes > summary, .result-details > summary {\n list-style: none; cursor: pointer; display: flex; align-items: center; gap: .5rem; min-height: 2.5rem; padding: 0 .25rem; margin: 0 -.25rem;\n border-radius: .375rem; font-size: .8125rem; font-weight: 550; color: var(--muted-foreground);\n }\n .result-notes > summary::-webkit-details-marker, .result-details > summary::-webkit-details-marker { display: none; }\n .result-notes > summary::before, .result-details > summary::before { content: \"\u25B8\"; }\n .result-notes[open] > summary::before, .result-details[open] > summary::before { content: \"\u25BE\"; }\n @media (hover: hover) and (pointer: fine) { .result-notes > summary:hover, .result-details > summary:hover { color: var(--foreground); } }\n .result-details > summary .meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--font-mono); font-size: .68rem; font-weight: 400; }\n .result-notes .recap { margin: .25rem 0 .4rem; font-size: .875rem; }\n .result-attention { margin: .75rem 0 .25rem; padding: .7rem .85rem; border-left: 1px solid var(--warning); border-radius: 0 calc(var(--radius) - 3px) calc(var(--radius) - 3px) 0; background: var(--warning-soft); font-size: .8125rem; }\n .result-attention strong { display: block; font-size: .78rem; }\n .result-you-check { display: flex; flex-wrap: wrap; align-items: center; gap: .6rem .75rem; margin: .75rem 0; padding: .65rem .85rem; border-radius: calc(var(--radius) - 3px); background: var(--muted); font-size: .8125rem; }\n .result-you-check ul { flex: 1 1 14rem; min-width: 0; margin: 0; padding: 0; list-style: none; }\n .result-you-check form { margin: 0; }\n .result-attention ul { margin: .3rem 0 0; padding-left: 1.15rem; }\n .result-attention li { margin: .15rem 0; overflow-wrap: anywhere; }\n .result-tabs { display: flex; gap: .25rem; margin: .9rem 0 .75rem; border-bottom: 1px solid var(--border); overflow-x: auto; scrollbar-width: none; }\n .result-tabs::-webkit-scrollbar { display: none; }\n .result-tabs a {\n display: inline-flex; align-items: center; gap: .4rem; flex: none; min-height: 2.5rem; padding: 0 .625rem;\n margin-bottom: -1px; border-bottom: 2px solid transparent; text-decoration: none;\n color: var(--muted-foreground); font-size: .875rem; font-weight: 500;\n }\n .result-tabs a .count { font-family: var(--font-mono); font-size: .6875rem; font-variant-numeric: tabular-nums; color: var(--muted-foreground); }\n .result-tabs a[aria-selected=\"true\"] { color: var(--foreground); border-bottom-color: var(--foreground); }\n .result-tabs a[aria-selected=\"true\"] .count { color: var(--foreground); }\n .result-view { min-width: 0; }\n .result-view[hidden] { display: none; }\n .result-visuals { margin-top: .25rem; grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); }\n .result-unavailable { margin: .5rem 0 0; padding-left: 1.15rem; font-size: .78rem; }\n .result-changes { margin: .25rem 0 .5rem; padding-left: 1.15rem; font-size: .875rem; }\n .result-changes li { margin: .2rem 0; overflow-wrap: anywhere; }\n .result-files li, .result-files .mono { overflow-wrap: anywhere; white-space: normal; }\n .result-files li { min-width: 0; }\n .result-section[data-cockpit-source=\"reviewer\"] li { overflow-wrap: anywhere; }\n @media (max-width: 760px) { .result-panel .pick-file, .result-panel .pick-line, .diff-modes button { min-height: 44px; min-width: 44px; white-space: nowrap; } }\n .result-files-lead { margin: .25rem 0 .5rem; font-size: .8125rem; overflow-wrap: anywhere; }\n .result-report h3 { margin: .2rem 0 .3rem; font-size: 1rem; }\n .result-report .plan-doc { max-height: 28rem; overflow: auto; }\n .result-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: .5rem; margin: .4rem 0 0; }\n .result-facts > div { min-width: 0; padding: .6rem .7rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--glass-strong) 64%, transparent); }\n .result-facts dt { color: var(--muted-foreground); font: 500 .75rem/1.3 var(--font-sans); }\n .result-facts dd { margin: .2rem 0 0; font-size: .78rem; line-height: 1.4; overflow-wrap: anywhere; }\n .result-facts dd p { margin: 0; }\n .result-facts dd form { margin: .35rem 0 0; }\n .result-stat { margin: .2rem 0 .4rem; }\n .result-files { margin: .4rem 0 .6rem; }\n .result-label { display: block; margin: .5rem 0 .25rem; font: 600 .6875rem/1.3 var(--font-mono); color: var(--muted-foreground); letter-spacing: .06em; text-transform: uppercase; }\n .result-verdict { align-items: center; }\n .result-verdict > .meta { min-width: 0; overflow-wrap: anywhere; }\n .result-request { margin-top: 1.1rem; padding-top: .9rem; border-top: 1px solid var(--border); }\n .result-request h3 { margin: 0 0 .5rem; font-size: .8rem; letter-spacing: .02em; text-transform: uppercase; color: var(--muted-foreground); }\n .result-request .diff-comment-form { margin: .5rem 0 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .result-request .diff-comment-form textarea { width: 100%; box-sizing: border-box; }\n .result-pin, .result-pin[open] { margin: 0; padding: 0 .2rem; border: 0; background: none; }\n .result-pin > summary { min-height: 2.25rem; display: flex; align-items: center; flex-wrap: wrap; gap: .35rem; font-size: .78rem; font-weight: 550; cursor: pointer; list-style: none; }\n .result-pin > summary::-webkit-details-marker { display: none; }\n .result-pin > summary::before { content: \"\u25B8\"; }\n .result-pin[open] > summary::before { content: \"\u25BE\"; }\n .result-pin > summary .meta { font-weight: 400; }\n .result-pin .diff-comment-target { margin: .25rem 0 .5rem; }\n .revision-card, .revision-lineage, .task-history, .diff-comment p { min-width: 0; overflow-wrap: anywhere; }\n .result-feedback-history > summary, .task-history > summary, .task-history a { display: inline-flex; align-items: center; min-height: 44px; padding: .25rem .5rem; }\n .task-history > summary::before { content: \"\u25B8\"; margin-right: .35rem; }\n .task-history[open] > summary::before { content: \"\u25BE\"; }\n .task-history li { margin: .25rem 0; }\n .result-revision { margin: .6rem 0; padding: .6rem .75rem; border: 1px solid color-mix(in srgb, var(--running) 24%, var(--glass-border)); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb, var(--running) 6%, var(--glass-strong)); font-size: .8125rem; overflow-wrap: anywhere; }\n .result-links { display: flex; flex-wrap: wrap; gap: .25rem .5rem; margin: .6rem 0 0; }\n .result-links a { font-weight: 550; }\n .result-links a + a::before { content: \"\u00B7\"; margin-right: .5rem; color: var(--muted-foreground); font-weight: 400; }\n .cockpit-detail .result-panel { margin: .85rem 0; }\n .cockpit-accept { margin-top: .75rem; }\n /* The result beside the conversation (package 3): with room, two\n columns and no second auxiliary panel; without it, the dedicated\n result view with Back to chat and the conversation out of the way. */\n .chat-result { min-width: 0; }\n .task-chat-workspace.result-open { grid-template-columns: minmax(0, 30rem) minmax(0, 1fr); align-items: start; }\n .task-chat-workspace.result-open .chat-main { max-width: none; }\n /* Said once: while the result detail is open beside the conversation,\n the receipt in the thread keeps its heading, status, and roads only. */\n .result-open .completion-receipt > :not(.receipt-head):not(.receipt-actions) { display: none; }\n @media (max-width: 1199px) {\n .task-chat-workspace.result-open { display: block; }\n .task-chat-workspace.result-open .chat-main, .task-chat-workspace.result-open .task-chat-agents { display: none; }\n main:has(.chat-workspace.result-open) { padding-bottom: calc(5rem + env(safe-area-inset-bottom, 0rem)); }\n }\n @media (max-width: 359px) {\n .result-tabs a .count { display: none; }\n .result-panel { padding-inline: .7rem; }\n }\n .work-views { display: flex; gap: .25rem; margin: .75rem 0 .5rem; border-bottom: 1px solid var(--border); overflow-x: auto; scrollbar-width: none; }\n .work-views::-webkit-scrollbar { display: none; }\n .work-views a {\n display: inline-flex; align-items: center; gap: .4rem; flex: none; min-height: 2.5rem; padding: 0 .625rem;\n margin-bottom: -1px; border-bottom: 2px solid transparent; text-decoration: none;\n color: var(--muted-foreground); font-size: .875rem; font-weight: 500;\n }\n .work-views a .count { font-family: var(--font-mono); font-size: .6875rem; font-variant-numeric: tabular-nums; color: var(--muted-foreground); }\n .work-views a.active { color: var(--foreground); border-bottom-color: var(--foreground); }\n .work-views a.active .count { color: var(--foreground); }\n .work-list { display: flex; flex-direction: column; }\n .work-row {\n display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: .5rem 1.5rem; align-items: start;\n padding: .75rem 0; border-bottom: 1px solid var(--border);\n }\n .work-row:last-child { border-bottom: 0; }\n .work-row-main, .work-row-status { min-width: 0; }\n /* Concise rows (2026-09-13): the status, the next act, and the Details\n toggle share one wrapping line; an opened disclosure is wider than\n its summary, so it wraps onto its own full-width line by itself. */\n .work-row-status { display: flex; flex-wrap: wrap; align-items: center; gap: .25rem .875rem; }\n .work-details, .work-details[open] { max-width: 100%; margin: 0; padding: 0; border: 0; background: none; border-radius: 0; }\n .work-details > summary {\n list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: .25rem;\n min-height: 2.25rem; padding: 0 .25rem; margin: 0 -.25rem; border-radius: .375rem;\n font-size: .8125rem; font-weight: 500; color: var(--muted-foreground);\n }\n .work-details > summary::-webkit-details-marker { display: none; }\n .work-details > summary::before { content: \"\u25B8\"; }\n .work-details[open] > summary::before { content: \"\u25BE\"; }\n @media (hover: hover) and (pointer: fine) { .work-details > summary:hover { color: var(--foreground); } }\n .work-title { display: block; font-weight: 600; font-size: .9375rem; line-height: 1.35; color: var(--foreground); text-decoration: none; overflow-wrap: anywhere; }\n @media (hover: hover) and (pointer: fine) { .work-title:hover { text-decoration: underline; } }\n .work-meta { display: flex; flex-wrap: wrap; gap: .25rem .625rem; margin: .25rem 0 0; font-size: .75rem; color: var(--muted-foreground); }\n .work-meta .mono { overflow-wrap: anywhere; }\n .project-label { display: inline-block; padding: 0 .4rem; border: 1px solid var(--border); border-radius: 999px; font-size: .6875rem; line-height: 1.5; color: var(--foreground); }\n .work-detail { margin: 0 0 .25rem; font-size: .8125rem; line-height: 1.45; color: var(--muted-foreground); overflow-wrap: anywhere; }\n .work-details .work-id { margin: 0 0 .25rem; }\n .work-action { display: inline-flex; align-items: center; min-height: 44px; font-size: .8125rem; font-weight: 500; }\n .work-empty { padding: 2rem 0 1rem; max-width: 34rem; }\n .work-empty p { margin: 0 0 .75rem; color: var(--muted-foreground); line-height: 1.5; }\n .work-empty .row { display: flex; align-items: center; gap: 1rem; }\n .work-empty .row > a { display: inline-flex; align-items: center; min-height: 44px; }\n .work-bound { margin-top: .75rem; }\n .status-line { display: inline-flex; align-items: center; gap: .45rem; min-width: 0; font-size: .875rem; font-weight: 600; color: var(--foreground); }\n .status-line .status-label { min-width: 0; overflow-wrap: anywhere; }\n .status-line .status-dot { flex: none; width: .5rem; height: .5rem; border-radius: 50%; background: var(--muted-foreground); }\n .status-line[data-tone=\"attention\"] .status-dot { background: var(--warning); }\n .status-line[data-tone=\"problem\"] .status-dot { background: var(--destructive); }\n .status-line[data-tone=\"live\"] .status-dot { background: var(--running); box-shadow: 0 0 0 3px var(--running-soft); }\n .status-line[data-tone=\"ready\"] .status-dot, .status-line[data-tone=\"done\"] .status-dot { background: var(--success); }\n .status-line[data-tone=\"muted\"] { color: var(--muted-foreground); font-weight: 500; }\n .status-line[data-tone=\"muted\"] .status-dot { background: var(--border); }\n .pull-request { display: grid; gap: .35rem; }\n .pull-request p { margin: 0; overflow-wrap: anywhere; }\n .pull-request-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: .25rem .75rem; }\n .pull-request-head a, .pull-request .meta a { display: inline-flex; align-items: center; min-height: 44px; }\n .pull-request-head strong { font-size: 1.0625rem; font-weight: 600; color: var(--foreground); display: inline-flex; align-items: center; gap: .5rem; }\n .pull-request-head strong::before { content: \"\"; width: .5rem; height: .5rem; border-radius: 999px; background: var(--muted-foreground); }\n .pull-request--ok .pull-request-head strong::before { background: var(--success, #15803d); }\n .pull-request--problem .pull-request-head strong::before { background: var(--so-warning, #ab6400); }\n .pull-request-act { display: flex; flex-wrap: wrap; align-items: flex-end; gap: .5rem .75rem; margin: .25rem 0 0; }\n .pull-request-act .meta { flex: 1 1 100%; }\n .pull-request-act label { display: grid; gap: .25rem; flex: 1 1 12rem; margin: 0; }\n .pull-request-act label input { margin: 0; min-height: 44px; box-sizing: border-box; width: 100%; }\n .pull-request-act button { min-height: 44px; white-space: nowrap; }\n .result-complete-actions { display: flex; flex-wrap: wrap; gap: .5rem; }\n .result-complete-actions button { white-space: nowrap; }\n .result-complete-actions button[name=publish], .pull-request-act button { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (max-width: 480px) { .pull-request-act button, .result-complete-actions button { flex: 1 1 100%; } }\n .receipt-publication { position: relative; z-index: 1; margin: .35rem 0 0; font-size: .8125rem; color: var(--muted-foreground); }\n /* A raw repository path in ordinary copy wraps at any point rather than\n widening the page (the phone task-list overflow, package 1). */\n .path-words { overflow-wrap: anywhere; word-break: break-word; }\n @media (max-width: 760px) {\n .work-row { grid-template-columns: minmax(0, 1fr); gap: .125rem; padding: .625rem 0; }\n .work-head { align-items: center; }\n .work-head h1 { margin-bottom: 0; }\n .work-details > summary, .work-action { min-height: 44px; }\n /* The tools control sits at the head's right edge on every width, so\n its menu keeps the desk's right-aligned anchor here too. A phone\n override once re-anchored it at left: 0, which pushed the opened\n menu past the viewport (right edge 441.5px at 390px) and widened\n the document \u2014 found by the independent concise-UI review. */\n /* All four filters share the row (review fixes, finding 3): each tab\n takes an equal share, no tab scrolls out of view, the count sits on\n the label, and every target stays \u2265 40px tall. */\n .work-views { gap: 0; margin: .5rem 0 .25rem; overflow: visible; }\n .work-views a { flex: 1 1 0; min-width: 0; justify-content: center; padding: 0 .25rem; font-size: .8125rem; gap: .3rem; white-space: nowrap; }\n }\n @media (max-width: 400px) {\n .work-views a { font-size: .75rem; gap: .2rem; padding: 0 .125rem; }\n .work-views a .count { font-size: .625rem; }\n }\n /* The narrowest phones (\u2264 360px): four labels with counts cannot share\n 288px at legible type, so the strip becomes two rows of two \u2014 every\n filter wholly visible, unclipped, 40px tall, never scrolled away. */\n @media (max-width: 360px) {\n .work-views { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .work-views a { font-size: .8125rem; gap: .3rem; padding: 0 .25rem; }\n .work-views a .count { font-size: .6875rem; }\n }\n\n /* The phone shell: the sidebar disappears; a top bar carries the project\n and quick capture; a bottom tab bar carries the destinations a thumb\n visits. Desktop is untouched. */\n .mobile-top, .tabbar { display: none; }\n @media (max-width: 760px) {\n .app { display: block; }\n .side { display: none; }\n .mobile-top {\n display: flex; align-items: center; gap: .5rem; position: sticky; top: 0; z-index: 30;\n background: var(--glass-strong); border-bottom: 1px solid var(--glass-border);\n padding: calc(.375rem + env(safe-area-inset-top, 0rem)) .75rem .375rem;\n }\n /* One header row: the pill carries scope, counts, and the switch. */\n .scope-bar { display: none; }\n .mobile-top .brand-mini { font-weight: 600; font-size: .9375rem; text-decoration: none; color: var(--foreground); font-family: var(--font-mono); }\n .mobile-top .project-pill { flex: 1; min-width: 0; position: static; margin: 0; padding: 0; border: 0; background: none; box-shadow: none; }\n .mobile-top a.project-pill, .mobile-top .project-pill > summary {\n /* align-items: stretch, not the switcher's center: a centered column\n item takes its content width, and a long project name then widens\n the document (the 320px overflow, workspace package 1). */\n min-width: 0; display: flex; flex-direction: column; justify-content: center; align-items: stretch; gap: .0625rem;\n border: 1px solid var(--border); border-radius: 1.375rem; background: var(--card);\n min-height: 2.75rem; padding: .25rem .875rem; text-decoration: none; color: var(--foreground);\n font-size: .875rem; font-weight: 500; line-height: 1.25; cursor: pointer;\n }\n .mobile-top .project-pill > summary .name { display: inline-flex; align-items: center; gap: .25rem; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .mobile-top .project-pill > summary .name .chevron { flex: none; }\n .mobile-top a.project-pill:active, .mobile-top .project-pill > summary:active { background: var(--muted); }\n /* On a phone the menu drops from the header it belongs to (UI polish\n 2026-09-13). It was a fixed sheet, but the header's backdrop-filter\n makes the header the containing block for fixed descendants, so the\n sheet landed above the header, off-screen. Absolute to the sticky\n header is exact, and never taller than the screen. */\n .mobile-top .switcher-menu {\n position: absolute; left: .5rem; right: .5rem; top: calc(100% - .25rem); bottom: auto; max-width: none;\n max-height: calc(100dvh - 8rem); overflow-y: auto; z-index: 45;\n }\n .mobile-top .switcher-menu button { min-height: 2.75rem; }\n .mobile-top .pill-status {\n display: flex; flex-wrap: wrap; gap: .125rem .5rem;\n font-family: var(--font-mono); font-size: .6875rem; font-weight: 500;\n color: var(--muted-foreground); font-variant-numeric: tabular-nums;\n }\n .mobile-top .pill-status > span { white-space: nowrap; }\n .mobile-top .pill-status .hot { color: var(--brand); }\n .mobile-top .project-pill .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .mobile-top .mobile-new {\n flex: 0 0 auto; display: flex; align-items: center; justify-content: center;\n min-height: 2.75rem; padding: 0 .875rem; border-radius: 999px;\n background: var(--secondary); border: 1px solid var(--border); color: var(--foreground);\n font-weight: 500; font-size: .875rem; text-decoration: none;\n }\n /* Tools and settings: a header action, never a fourth tab (workspace\n package 1). A 44px target, the same quiet pill as quick capture. */\n .mobile-top .mobile-more {\n flex: 0 0 auto; display: flex; align-items: center; justify-content: center;\n width: 2.75rem; min-height: 2.75rem; border-radius: 999px;\n border: 1px solid var(--border); background: var(--card); color: var(--foreground);\n }\n .mobile-top .mobile-more svg { width: 1.125rem; height: 1.125rem; }\n @media (max-width: 360px) { .mobile-top .mobile-new { padding: 0 .625rem; } }\n .tabbar {\n display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 30;\n background: var(--glass-strong); border-top: 1px solid var(--glass-border);\n padding: .25rem max(.25rem, env(safe-area-inset-right, 0rem)) calc(.25rem + env(safe-area-inset-bottom, 0rem)) max(.25rem, env(safe-area-inset-left, 0rem));\n }\n .tabbar a {\n flex: 1; display: flex; flex-direction: column; align-items: center; gap: .125rem;\n padding: .375rem 0 .25rem; min-height: 3rem; text-decoration: none;\n color: var(--muted-foreground); font-size: .6875rem; font-weight: 500;\n font-family: var(--font-sans);\n }\n .tabbar a .glyph { display: flex; align-items: center; justify-content: center; height: 1.125rem; }\n .tabbar a .glyph svg { width: 1rem; height: 1rem; }\n .tabbar a.active { color: var(--foreground); }\n .tabbar a.active .glyph { background: var(--muted); border-radius: 999px; box-shadow: 0 0 0 .35rem var(--muted); }\n .tabbar a { position: relative; }\n .tabbar a .dot-badge {\n position: absolute; top: .3125rem; left: calc(50% + .375rem);\n width: .375rem; height: .375rem; border-radius: 9999px; background: var(--brand);\n }\n .content > main { padding: 1rem 1rem calc(4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .project-add-card { padding: 1rem; }\n .project-add-actions { grid-template-columns: minmax(0, 1fr); }\n .project-add-action { min-height: 5.25rem; padding: .75rem; }\n .project-add-more > summary { width: 100%; }\n }\n\n /* /menu mirrors the rail's workflows/admin grouping as plain headed\n * sections \u2014 no collapse: it is already one tap behind the tab bar. */\n .menu-group-label {\n margin: 1.5rem 0 .25rem; font-size: .75rem; font-weight: 600;\n color: var(--muted-foreground); font-family: var(--font-sans);\n }\n .menu-group-label:first-of-type { margin-top: .75rem; }\n .menu-list { display: flex; flex-direction: column; gap: .375rem; margin-top: .75rem; }\n .menu-row {\n display: flex; flex-direction: column; gap: .125rem; text-decoration: none;\n border: 1px solid var(--border); border-radius: var(--radius); background: var(--card);\n padding: .75rem .875rem; color: var(--foreground); min-height: 44px; justify-content: center;\n }\n @media (hover: hover) and (pointer: fine) { .menu-row:hover { border-color: color-mix(in srgb, var(--border) 60%, var(--muted-foreground)); } }\n\n .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(13.5rem, 1fr)); gap: .625rem; margin: .5rem 0; }\n .stat-card {\n border: 1px solid var(--border); border-radius: var(--radius); background: var(--card);\n padding: .75rem .875rem; min-width: 0;\n }\n .stat-card .k { font-weight: 600; font-size: .875rem; display: flex; align-items: center; gap: .4rem;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .stat-card .v { font-size: .75rem; color: var(--muted-foreground); margin-top: .25rem;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .dot { display: inline-block; width: .5rem; height: .5rem; border-radius: 9999px; flex: none; }\n .dot-ok { background: var(--success); }\n /* Caution without a claim on the operator: quiet, not magenta. */\n .dot-warn { background: var(--muted-foreground); }\n .dot-off { background: var(--muted-foreground); opacity: .5; }\n .dot-bad { background: var(--destructive); }\n .pulse { animation: pulse 2s ease-in-out infinite; }\n .dot-ok.pulse { background: var(--running); }\n @keyframes pulse { 50% { opacity: .35; } }\n\n .login-viewport { min-height: 100dvh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 2rem 1.25rem; }\n .login-shell { width: 100%; max-width: 23rem; }\n .login-shell h1 { text-align: center; margin: 0 0 .375rem; font-size: 1.5rem; letter-spacing: -0.02em; }\n .login-shell > .hint { text-align: center; margin: 0 0 2rem; font-size: 0.875rem; }\n .login-card {\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n padding: 1.5rem 1.5rem 1.625rem;\n }\n .login-card label:first-child { margin-top: 0; }\n .login-card .problem { margin: 0 0 1rem; }\n .login-shell button {\n width: 100%; margin-top: 1.25rem;\n background: var(--so-accent); color: var(--so-on-accent); border-color: var(--so-accent); font-weight: 600;\n }\n @media (hover: hover) and (pointer: fine) { .login-shell button:hover { background: var(--so-accent-hover); border-color: var(--so-accent-hover); } }\n .login-foot { text-align: center; margin: 1.5rem 0 0; font-size: 0.75rem; color: var(--muted-foreground); line-height: 1.9; }\n .login-foot code { background: none; padding: 0; color: var(--muted-foreground); white-space: nowrap; }\n .so-wordmark { display: flex; align-items: center; gap: 9px; font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; letter-spacing: -.02em; color: var(--foreground); }\n .so-brand-mark { width: 18px; height: 22px; display: flex; align-items: center; gap: 3px; transform: skewY(-10deg); }\n .so-brand-mark i { display: block; width: 4px; height: 15px; background: var(--so-signal); border-radius: 1px; }\n .so-brand-mark i:nth-child(2) { height: 22px; }\n .login-shell .login-brand { justify-content: center; font-size: 1.125rem; margin: 0 0 1.5rem; }\n .sso-step-up { display: inline-flex; align-items: center; min-height: 36px; font-size: .9rem; }\n .sso-step-up[data-sso-step-up=\"confirmed\"] { color: var(--so-success); }\n .sso-step-up[data-sso-step-up=\"confirmed\"]::before { content: \"\u2713\"; margin-right: 6px; }\n .login-shell .login-sso { display: flex; justify-content: center; align-items: center; min-height: 44px; border-radius: 8px; background: var(--so-accent); color: var(--so-on-accent); font-weight: 600; text-decoration: none; margin: 0 0 1rem; }\n @media (hover: hover) and (pointer: fine) { .login-shell .login-sso:hover { background: var(--so-accent-hover); } }\n .login-shell .login-password > summary { text-align: center; font-size: .875rem; color: var(--muted-foreground); cursor: pointer; margin: 0 0 .75rem; }\n .focus-page { max-width: 40rem; margin: 0 auto; padding: 2rem 1.25rem 3rem; }\n .focus-page .focus-brand { display: inline-flex; margin: 0 0 2.5rem; }\n .focus-page h1 { margin: 0 0 1rem; }\n .secret-value { overflow-wrap: anywhere; font-size: .95rem; padding: .75rem .875rem; margin: .75rem 0; border: 1px solid var(--border); border-radius: 8px; background: var(--background); user-select: all; }\n\n @media (max-width: 640px) {\n button, form.option button { min-height: 2.75rem; }\n .topbar nav a { padding: 0 .5rem; }\n }\n\n /* The board: lanes as columns, the pipeline left to right. */\n .content > main:has(.board) { max-width: none; }\n .board {\n display: grid; grid-template-columns: repeat(5, minmax(12.5rem, 1fr));\n gap: .625rem; overflow-x: auto; padding-bottom: .75rem; align-items: start;\n }\n /* The phone board (board pass): lanes stack as sections that fold, the\n counts readable before a single card \u2014 what needs you, then what is\n building, then the rest. A header is a 2.75rem tap; a drawn chevron\n says which way it folds. */\n @media (max-width: 760px) {\n .board { display: flex; flex-direction: column; gap: .5rem; padding-bottom: 0; }\n .board .lane { min-height: 0; padding: 0 .625rem .125rem; }\n .board .lane > summary {\n cursor: pointer; display: flex; align-items: center; min-height: 2.75rem; margin: 0;\n -webkit-tap-highlight-color: transparent;\n }\n .board .lane > summary h2 { flex: 1; font-size: .75rem; }\n .board .lane > summary .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .5rem; margin-left: .25rem; }\n .board .lane > summary::after {\n content: \"\"; width: .5rem; height: .5rem; flex: none; margin-right: .25rem;\n border-right: 1.5px solid var(--muted-foreground); border-bottom: 1.5px solid var(--muted-foreground);\n transform: rotate(45deg) translateY(-.125rem); transition: transform .15s;\n }\n .board .lane[open] > summary::after { transform: rotate(225deg) translateY(-.125rem); }\n .board .lane .hint { margin-bottom: .25rem; }\n .board .lane .lane-card:last-of-type { margin-bottom: .5rem; }\n .board .lane-attention { order: 0; }\n .board .lane-building { order: 1; }\n .board .lane-queued { order: 2; }\n .board .lane-waiting { order: 3; }\n .board .lane-done { order: 4; }\n }\n .lane {\n background: color-mix(in srgb, var(--card) 45%, var(--background)); border: 1px solid var(--border);\n border-radius: var(--radius); padding: .625rem; min-height: 12rem;\n }\n .lane > summary { list-style: none; cursor: default; margin: 0 0 .125rem; }\n .lane > summary::-webkit-details-marker { display: none; }\n .lane h2 { display: flex; align-items: center; gap: .4rem; margin: 0; font-size: .6875rem; }\n .lane h2 a { color: inherit; text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .lane h2 a:hover { text-decoration: underline; } }\n .lane .hint { margin-top: 0; }\n .lane-count { color: var(--muted-foreground); font-weight: 400; font-variant-numeric: tabular-nums; }\n .lane h2::before {\n content: \"\"; width: .375rem; height: .375rem; border-radius: 9999px; flex: none;\n background: var(--muted-foreground); opacity: .55;\n }\n .lane-attention h2::before { background: var(--brand); opacity: 1; }\n .lane-building h2::before { background: var(--running); opacity: 1; }\n .lane-done h2::before { background: var(--success); opacity: 1; }\n .lane-card {\n display: block; text-decoration: none; color: inherit;\n background: var(--card); border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); padding: .5rem .625rem; margin-top: .5rem;\n }\n @media (hover: hover) and (pointer: fine) { .lane-card:hover { border-color: color-mix(in srgb, var(--border) 55%, var(--muted-foreground)); } }\n .lane-card .id { display: block; font-family: var(--font-mono); font-size: .6875rem; color: var(--muted-foreground); margin-bottom: .125rem; overflow-wrap: anywhere; }\n .lane-card .t { display: block; font-size: .8125rem; font-weight: 500; line-height: 1.35; }\n .lane-card .dot { margin-right: .4rem; }\n .lane-card .meta, .lane-card .mono { display: block; margin-top: .125rem; font-size: .75rem; }\n .lane-card .why { display: block; margin-top: .125rem; font-size: .75rem; color: var(--muted-foreground); }\n /* The facts: mono key\u2013value pairs, keys dim, values ink \u2014 one grammar on every lane. */\n .lane-card .facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: .0625rem .625rem; margin-top: .4rem; font-size: .6875rem; line-height: 1.5; }\n .lane-card .fact { display: contents; }\n .lane-card .fact .k { color: var(--muted-foreground); font-family: var(--font-mono); }\n .lane-card .fact .v { font-family: var(--font-mono); color: var(--foreground); overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }\n .lane-card .chips { display: flex; flex-wrap: wrap; gap: .25rem; margin-top: .4rem; }\n .lane-card .chips .badge { margin: 0; }\n /* The live strip on a building card: stage and clock in an inset well \u2014\n the run's own facts, never a percent. */\n .lane-card .live-line {\n display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-top: .375rem;\n padding: .3rem .5rem; border-radius: calc(var(--radius) - 4px); background: var(--muted);\n font-family: var(--font-mono); font-size: .6875rem; color: var(--running); font-variant-numeric: tabular-nums;\n }\n .lane-card .live-line .clock { color: var(--muted-foreground); }\n .lane-empty { margin: .75rem 0 .25rem; }\n .plan-doc { white-space: pre-wrap; overflow-wrap: anywhere; font-size: .8125rem; max-height: 24rem; overflow-y: auto; }\n .lane-more { display: block; margin-top: .5rem; font-size: .75rem; }\n\n /* The attended control room: one cross-workspace pulse, then a dense\n master rail. */\n .control-room-head {\n display: flex; align-items: flex-start; justify-content: space-between;\n gap: 1rem; margin-bottom: 1.1rem;\n }\n .control-room-head h1 { font-size: 1.375rem; margin-top: .08rem; }\n .control-room-head .actions { display: flex; gap: .45rem; flex-wrap: wrap; justify-content: flex-end; }\n .control-room-head .actions a { text-decoration: none; }\n .command-metrics {\n display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));\n gap: .625rem; margin: .85rem 0 1.5rem;\n }\n .command-metric {\n border: 1px solid var(--border); border-radius: calc(var(--radius) - 2px); background: var(--card);\n padding: .8rem .9rem; min-width: 0;\n }\n .command-metric .value { display: block; margin-top: .25rem; font-size: 1.5rem; font-weight: 600; line-height: 1.15; font-variant-numeric: tabular-nums; font-family: var(--font-mono); }\n .command-metric .label { display: flex; align-items: center; gap: .4rem; font-weight: 500; font-size: .8125rem; }\n .command-metric .label::before {\n content: \"\"; width: .375rem; height: .375rem; border-radius: 9999px;\n background: var(--muted-foreground); flex: none;\n }\n .command-metric .detail { display: block; color: var(--muted-foreground); font-size: .6875rem; margin-top: .18rem; }\n .command-metric.attention .label::before { background: var(--brand); }\n .command-metric.live .label::before { background: var(--running); }\n .workspace-pulse { margin: .4rem 0 1.5rem; display: grid; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); gap: .625rem; }\n /* The workspace card: name and status word, four counts, the same counts\n as a bar, and the one tap to its board. Neutral border always; the\n needs-you count and the bar's segment carry the accent. */\n .workspace-card {\n padding: .75rem .9rem; border: 1px solid var(--border);\n border-radius: calc(var(--radius) - 2px); background: var(--card); font-size: .8125rem; min-width: 0;\n }\n /* The mate's unified workspace: a glass project navigator beside one\n long-lived conversation. The content stays calm and legible; the\n atmosphere belongs to the shell and edges, never behind the prose. */\n main:has(.chat-workspace) { max-width: 86rem; padding-top: 1.5rem; }\n .chat-workspace {\n display: grid; grid-template-columns: minmax(16rem, 18.5rem) minmax(0, 56rem);\n align-items: start; gap: clamp(1.25rem, 3vw, 2.75rem);\n }\n .chat-workspace.projects-hidden { grid-template-columns: minmax(0, 56rem); }\n .chat-workspace.projects-hidden .chat-projects { display: none; }\n .chat-main { min-width: 0; max-width: 56rem; }\n .task-chat-workspace { grid-template-columns: minmax(15rem, 18rem) minmax(0, 56rem); }\n .task-chat-context {\n position: sticky; top: 6rem; align-self: start; padding: 1rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) + 3px);\n background: var(--glass); box-shadow: var(--shadow);\n }\n .task-chat-context-head { display: flex; align-items: center; justify-content: space-between; gap: .65rem; }\n .task-chat-context h2 { margin: .7rem 0 .25rem; color: var(--foreground); font-size: 1rem; line-height: 1.35; letter-spacing: -.025em; }\n .task-chat-context > .meta { margin: 0; overflow-wrap: anywhere; font-size: .65rem; }\n .task-chat-status { display: grid; gap: .2rem; margin-top: .85rem; padding: .7rem; border-radius: calc(var(--radius) - 3px); background: var(--warning-soft); }\n .task-chat-status.ready { background: var(--running-soft); }\n .task-chat-status strong { font-size: .75rem; }\n .task-chat-status span { color: var(--muted-foreground); font-size: .68rem; line-height: 1.45; }\n .task-chat-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .4rem; margin: .65rem 0; }\n .task-chat-facts div { min-width: 0; padding: .45rem .5rem; border-radius: calc(var(--radius) - 5px); background: color-mix(in srgb, var(--muted) 58%, transparent); }\n .task-chat-facts dt { color: var(--muted-foreground); font: 400 .58rem/1.2 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; }\n .task-chat-facts dd { margin: .15rem 0 0; font-size: .68rem; overflow-wrap: anywhere; }\n .task-chat-overview-actions { display: grid; justify-items: start; gap: .55rem; margin-top: .75rem; }\n .task-chat-overview-link { display: block; font-size: .72rem; text-decoration: none; }\n .task-chat-recovery-link { min-height: 2rem; padding-inline: .7rem; font-size: .7rem; }\n #task-chat-live { display: grid; gap: 1rem; margin-bottom: 1.1rem; }\n .task-journey {\n position: relative; overflow: hidden; padding: 1rem 1.05rem;\n border-color: color-mix(in srgb, var(--accent) 16%, var(--glass-border));\n background: var(--card);\n }\n .task-journey::after { content: \"\"; position: absolute; width: 9rem; height: 9rem; right: -4rem; top: -5rem; border-radius: 50%; background: color-mix(in srgb, var(--accent) 8%, transparent); filter: blur(12px); pointer-events: none; }\n .task-journey-head { position: relative; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-journey h2 { margin: .2rem 0 0; font-size: 1rem; letter-spacing: -.025em; }\n .task-journey > ol { position: relative; z-index: 1; display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: 0; margin: 1rem 0 .75rem; padding: 0; list-style: none; }\n .task-journey > ol::before { content: \"\"; position: absolute; top: .7rem; left: 10%; right: 10%; height: 1px; background: var(--border); }\n .task-journey li { position: relative; z-index: 1; display: grid; justify-items: center; gap: .35rem; color: var(--muted-foreground); font-size: .625rem; text-align: center; }\n .task-journey li i { display: grid; place-items: center; width: 1.4rem; height: 1.4rem; border: 1px solid var(--border); border-radius: 50%; background: var(--card); font: 600 .58rem/1 var(--font-mono); font-style: normal; }\n .task-journey li.complete i { color: var(--success); border-color: color-mix(in srgb,var(--success) 32%,var(--border)); background: color-mix(in srgb,var(--success) 9%,var(--card)); }\n .task-journey li.complete span { color: var(--foreground); }\n .task-journey li.active i { color: white; border-color: var(--accent); background: var(--accent); box-shadow: 0 0 0 4px color-mix(in srgb,var(--accent) 12%,transparent); }\n .task-journey li.active span { color: var(--foreground); font-weight: 650; }\n .task-journey > .meta { margin: 0; line-height: 1.45; }\n .task-journey-action { margin-top: .75rem; min-height: 44px; }\n .check-progress {\n margin: .5rem 0 0; color: var(--running); font-size: clamp(.625rem,2.2vw,.75rem);\n line-height: 1.5; font-variant-numeric: tabular-nums; white-space: nowrap;\n overflow-x: auto; scrollbar-width: thin;\n }\n .check-progress[data-final=\"passed\"] { color: var(--success); }\n .check-progress[data-final=\"failed\"] { color: var(--destructive); }\n .check-progress[data-final=\"unknown\"] { color: var(--warning); }\n .receipt-actions [data-primary-action] { min-height: 44px; }\n .task-status-reason { margin-top: .75rem; }\n .task-status-reason summary, .task-status-details > summary { color: var(--muted-foreground); }\n .task-status-details > summary { min-height: 44px; }\n .task-status-details, #task-control-details { margin: 1rem 0; }\n .task-control-copy { min-width: 0; overflow-wrap: anywhere; }\n [data-primary-action] { max-width: 100%; }\n\n .task-live-build { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem; margin: .75rem 0 0; font-size: .72rem; }\n .task-live-build .live-dot { width: .45rem; height: .45rem; border-radius: 50%; background: var(--success); box-shadow: 0 0 0 4px color-mix(in srgb,var(--success) 10%,transparent); }\n .chat-action-card { padding: 0; overflow: hidden; }\n .chat-action-card:not(details) { padding: 1rem 1.05rem; }\n .chat-action-card > summary { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 1rem 1.05rem; cursor: pointer; list-style: none; }\n .chat-action-card > summary::-webkit-details-marker { display: none; }\n .chat-action-card > summary > span:first-child { display: grid; gap: .18rem; }\n .chat-action-card > summary strong { font-size: .92rem; }\n .chat-action-card > summary small { color: var(--muted-foreground); font-size: .68rem; font-weight: 400; }\n .chat-action-card[open] > summary { border-bottom: 1px solid var(--border); }\n .chat-run-details { padding: .65rem .75rem; border: 1px solid var(--border); border-radius: calc(var(--radius) - 3px); background: color-mix(in srgb,var(--muted) 45%,transparent); }\n .chat-run-details > summary { color: var(--muted-foreground); cursor: pointer; font-size: .68rem; }\n .chat-run-details > .meta { margin-bottom: 0; }\n .chat-decisions { display: grid; gap: .7rem; }\n .chat-section-head { margin: .15rem .15rem 0; }\n .chat-section-head h2 { margin: .2rem 0 0; font-size: 1rem; }\n .chat-decisions .decide-card { margin: 0; background: var(--glass); box-shadow: var(--shadow); }\n .chat-publication { margin: -.25rem .25rem .25rem; }\n .chat-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; padding: .5rem .25rem 0; }\n .chat-head h1 { margin-bottom: .2rem; font-size: 1.65rem; letter-spacing: -.04em; }\n .chat-head .badge-running { margin-top: .2rem; background: color-mix(in srgb, var(--success) 11%, var(--glass)); color: var(--success); }\n .chat-head-actions { display: flex; align-items: center; justify-content: flex-end; gap: .45rem; flex-wrap: wrap; }\n .task-chat-head > div { min-width: 0; flex: 1; }\n .chat-task-back { margin: 0 0 .55rem; font-size: .6875rem; }\n .chat-task-back a { text-decoration: none; }\n .task-chat-title-line { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }\n .task-chat-title-line > div { min-width: 0; }\n .chat-project-toggle {\n display: inline-flex; align-items: center; gap: .4rem; min-height: 2rem; padding: .25rem .55rem;\n color: var(--muted-foreground); font-size: .6875rem; box-shadow: none;\n }\n .chat-project-toggle svg { width: .9rem; height: .9rem; }\n .chat-project-toggle .badge { padding-inline: .38rem; font-size: .6rem; }\n .chat-budget {\n display: flex; flex-wrap: wrap; gap: .4rem; margin: 1rem 0 1.25rem;\n color: var(--muted-foreground); font-size: .6875rem; font-variant-numeric: tabular-nums;\n }\n .chat-budget > span {\n white-space: nowrap; padding: .32rem .58rem; border: 1px solid var(--glass-border);\n border-radius: 999px; background: color-mix(in srgb, var(--glass) 74%, transparent);\n }\n /* Provider, model, and limits behind one quiet disclosure (UI polish 2026-09-13). */\n .chat-limits { margin: .5rem 0 .75rem; padding: 0 .9rem; border-color: var(--glass-border); background: color-mix(in srgb, var(--glass) 70%, transparent); }\n .chat-limits > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; min-height: 2.5rem; padding: .45rem 0; font-size: .75rem; }\n .chat-limits > summary .meta { font-size: .75rem; }\n .chat-limits[open] { padding-bottom: .6rem; }\n .chat-limits .chat-budget { margin: .2rem 0 .1rem; }\n .chat-main .chat-limits + .chat-fleet-context, .chat-main .chat-fleet-context + .chat-limits { margin-top: .5rem; }\n .chat-overview {\n margin: 0 0 1.35rem; padding: 1rem; border-radius: calc(var(--radius) + 2px);\n background: var(--glass);\n box-shadow: var(--shadow);\n }\n .chat-overview-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }\n .chat-overview-head h2 { margin: .1rem 0 0; color: var(--foreground); font-size: .95rem; letter-spacing: -.02em; }\n .chat-overview-head form { margin: 0; }\n .chat-overview-head button, .chat-overview-link {\n min-height: 2rem; padding: .25rem .7rem; font-size: .6875rem; text-decoration: none;\n }\n .chat-overview-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .45rem; margin-top: .85rem; }\n .chat-overview-stat {\n display: flex; flex-direction: column; min-width: 0; padding: .65rem .7rem;\n border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px);\n background: color-mix(in srgb, var(--glass-strong) 64%, transparent); text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .chat-overview-stat:hover { background: var(--glass-strong); } }\n .chat-overview-stat b { color: var(--foreground); font: 600 1.2rem/1.2 var(--font-mono); font-variant-numeric: tabular-nums; }\n .chat-overview-stat span { overflow: hidden; color: var(--muted-foreground); font-size: .65rem; text-overflow: ellipsis; white-space: nowrap; }\n .chat-overview-stat.attention b { color: var(--warning); }\n .chat-overview-stat.live b { color: var(--running); }\n .chat-overview-items { display: grid; gap: .35rem; margin-top: .7rem; }\n .chat-overview-item {\n display: grid; grid-template-columns: 1.75rem minmax(0, 1fr) auto; align-items: center; gap: .6rem;\n padding: .48rem .55rem; border-radius: calc(var(--radius) - 4px); color: inherit; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .chat-overview-item:hover { background: color-mix(in srgb, var(--muted) 72%, transparent); } }\n .chat-overview-icon { display: grid; place-items: center; width: 1.75rem; height: 1.75rem; border-radius: .55rem; background: var(--muted); color: var(--muted-foreground); }\n .chat-overview-icon svg { width: .9rem; height: .9rem; }\n .chat-overview-item.decision .chat-overview-icon { color: var(--warning); background: var(--warning-soft); }\n .chat-overview-item.failed .chat-overview-icon { color: var(--destructive); background: var(--destructive-soft); }\n .chat-overview-item.running .chat-overview-icon { color: var(--running); background: var(--running-soft); }\n .chat-overview-copy { min-width: 0; }\n .chat-overview-copy strong, .chat-overview-copy span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .chat-overview-copy strong { font-size: .75rem; font-weight: 500; }\n .chat-overview-copy span { color: var(--muted-foreground); font-size: .65rem; margin-top: .05rem; }\n .chat-overview-arrow { color: var(--muted-foreground); }\n .chat-overview-clear { display: flex; align-items: center; gap: .45rem; margin: .8rem .2rem 0; color: var(--muted-foreground); font-size: .75rem; }\n .chat-overview-note { margin: .65rem .2rem 0; font-size: .6875rem; }\n .chat-readonly { margin-top: 1rem; padding: 1rem; }\n .chat-projects {\n position: sticky; top: 4rem; align-self: start; max-height: calc(100vh - 5rem); overflow-y: auto;\n padding: 1rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) + 3px);\n background: var(--glass); box-shadow: var(--shadow);\n }\n .chat-projects-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .75rem; padding: 0 .15rem; }\n .chat-projects-head h2 { margin: 0; color: var(--foreground); font-size: .8125rem; letter-spacing: -.01em; }\n .chat-project-close { display: none; margin-left: auto; width: 2rem; min-height: 2rem; padding: 0; font-size: 1rem; box-shadow: none; }\n .chat-project-card {\n padding: .8rem; margin-top: .5rem; border: 1px solid transparent; border-radius: var(--radius);\n background: color-mix(in srgb, var(--muted) 58%, transparent);\n transition: transform .16s ease, background .16s, border-color .16s, box-shadow .16s;\n }\n @media (hover: hover) and (pointer: fine) { .chat-project-card:hover {\n border-color: var(--glass-border); background: color-mix(in srgb, var(--muted) 82%, transparent);\n box-shadow: 0 12px 28px -24px rgb(0 0 0 / .8);\n } }\n .chat-project-name { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: .45rem; }\n .chat-project-name strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .8125rem; }\n .chat-project-name .mono { color: var(--running); font-size: .6875rem; }\n .chat-project-name .badge { background: var(--glass); font-size: .625rem; }\n .chat-project-stats { display: grid; grid-template-columns: 1fr 1fr; gap: .3rem .55rem; margin-top: .65rem; }\n .chat-project-stats span { color: var(--muted-foreground); font-size: .6875rem; white-space: nowrap; }\n .chat-project-stats b { color: var(--foreground); font-family: var(--font-mono); font-weight: 600; font-variant-numeric: tabular-nums; }\n .chat-project-stats span.hot, .chat-project-stats span.hot b { color: var(--brand); }\n .chat-project-actions { display: flex; gap: .35rem; margin-top: .65rem; }\n .chat-project-actions form { margin-bottom: 0; }\n .chat-project-actions button { min-height: 1.8rem; padding: .2rem .6rem; font-size: .6875rem; box-shadow: none; background: transparent; }\n .thread {\n display: flex; flex-direction: column; gap: 1rem; margin: 1rem 0 1.25rem;\n min-height: min(32rem, 48vh); padding: .25rem;\n }\n .thread .msg { max-width: 48rem; line-height: 1.65; overflow-wrap: anywhere; }\n .chat-previous-divider { display: flex; align-items: center; gap: .6rem; margin: 1rem 0; color: var(--so-muted); font-size: .8rem; }\n .chat-previous-divider::before, .chat-previous-divider::after { content: \"\"; flex: 1; border-top: 1px solid var(--so-line); }\n .thread .msg p { margin: .3rem 0; }\n .thread .msg.op {\n align-self: flex-end; max-width: min(82%, 40rem); padding: .75rem 1rem;\n border: 1px solid var(--glass-border); border-radius: 1.2rem 1.2rem .35rem 1.2rem;\n background: var(--user-message); color: var(--so-ink);\n box-shadow: 0 10px 30px -24px rgb(0 0 0 / .9), 0 1px 0 rgb(255 255 255 / .07) inset;\n }\n .thread .msg.mate {\n position: relative; align-self: stretch; padding: .75rem .5rem .75rem 3.45rem;\n border: 0; background: transparent;\n }\n .thread .msg.mate::before {\n content: \"T\"; position: absolute; top: .7rem; left: .1rem; width: 2.35rem; height: 2.35rem;\n display: grid; place-items: center; border: 1px solid var(--glass-border); border-radius: .8rem;\n background: var(--glass-strong);\n color: var(--foreground); font: 600 .6875rem/1 var(--font-mono); letter-spacing: -.04em;\n box-shadow: var(--so-pill-shadow);\n }\n .chat-copy > :first-child { margin-top: 0; }\n .chat-copy > :last-child { margin-bottom: 0; }\n .chat-copy p { margin: .35rem 0 .7rem; }\n .chat-copy h3 { margin: 1rem 0 .35rem; color: var(--foreground); font-size: .8125rem; }\n .chat-copy ul, .chat-copy ol { margin: .4rem 0 .75rem; padding-left: 1.3rem; }\n .chat-copy li { margin: .24rem 0; padding-left: .15rem; }\n .chat-message-foot { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin-top: .75rem; }\n .chat-message-foot time { color: var(--muted-foreground); font: 400 .625rem/1 var(--font-mono); white-space: nowrap; }\n .chat-activity { display: flex; flex-wrap: wrap; gap: .3rem; }\n .chat-activity span { padding: .15rem .42rem; border: 1px solid var(--glass-border); border-radius: 999px; color: var(--muted-foreground); font: 400 .625rem/1.25 var(--font-mono); }\n .proposal { margin: .9rem 0 0; padding: 0; overflow: hidden; background: var(--glass); }\n .proposal-head { display: grid; grid-template-columns: 2rem minmax(0, 1fr) auto; align-items: center; gap: .65rem; padding: .75rem .85rem; border-bottom: 1px solid var(--glass-border); }\n .proposal-head > span:nth-child(2) { min-width: 0; }\n .proposal-head strong, .proposal-head small { display: block; }\n .proposal-head strong { font-size: .75rem; }\n .proposal-head small { margin-top: .05rem; color: var(--muted-foreground); font-size: .625rem; }\n .proposal-icon { display: grid; place-items: center; width: 2rem; height: 2rem; border-radius: .6rem; color: var(--running); background: var(--running-soft); }\n .proposal-icon svg { width: 1rem; height: 1rem; }\n .proposal-cancel .proposal-icon { color: var(--destructive); background: var(--destructive-soft); }\n .proposal-answer .proposal-icon { color: var(--warning); background: var(--warning-soft); }\n .proposal-repair .proposal-icon { color: var(--warning); background: var(--warning-soft); }\n .proposal-body { padding: .85rem; }\n .proposal-body h3 { margin: 0; color: var(--foreground); font-size: .9rem; letter-spacing: -.015em; }\n .proposal-summary { margin: .45rem 0 0; color: var(--foreground); white-space: pre-wrap; }\n .proposal-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .35rem; margin: .75rem 0 0; }\n .proposal-facts div { min-width: 0; padding: .45rem .55rem; border-radius: calc(var(--radius) - 5px); background: color-mix(in srgb, var(--muted) 65%, transparent); }\n .proposal-facts dt { color: var(--muted-foreground); font: 400 .6rem/1.25 var(--font-mono); text-transform: uppercase; letter-spacing: .04em; }\n .proposal-facts dd { margin: .18rem 0 0; overflow-wrap: anywhere; font-size: .72rem; }\n .proposal-rationale { margin-top: .75rem; padding: .65rem .75rem; border: 1px solid var(--glass-border); border-radius: calc(var(--radius) - 3px); background: var(--muted); }\n .proposal-rationale strong { display: block; margin-top: .2rem; }\n .proposal-rationale p { margin: .2rem 0 0; color: var(--muted-foreground); }\n .proposal-disclosure { margin-top: .7rem !important; font-size: .6875rem; }\n .proposal-actions { padding: 0 .85rem .85rem; }\n .proposal-actions .acts { display: flex; align-items: center; gap: .5rem; }\n .proposal-actions form { margin: 0; }\n /* The confirm is the card's one primary; dismiss stays quiet (UI polish 2026-09-13). */\n .proposal-actions .acts form:first-child button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .proposal-actions .acts form:first-child button[type=submit]:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .proposal-actions .done, .proposal-actions .refused, .proposal-wait { margin: 0; padding: .55rem .65rem; border-radius: calc(var(--radius) - 5px); font-size: .72rem; }\n .proposal-actions .done { color: var(--success); background: var(--success-soft); }\n .proposal-actions .refused { color: var(--destructive); background: var(--destructive-soft); }\n .proposal.confirmed { border-color: color-mix(in srgb, var(--ok) 45%, var(--border)); }\n .proposal.refused { border-color: color-mix(in srgb, var(--danger) 45%, var(--border)); }\n .proposal .done { color: var(--ok); }\n .proposal .refused { color: var(--danger); }\n .chat-empty { margin: auto; padding: clamp(3rem, 9vh, 6rem) 1rem 3rem; text-align: center; }\n .chat-empty::before {\n content: \"T\"; display: grid; place-items: center; width: 3.5rem; height: 3.5rem; margin: 0 auto 1.1rem;\n border: 1px solid var(--glass-border); border-radius: 1.15rem;\n background: var(--glass-strong);\n box-shadow: var(--so-pill-shadow);\n font: 600 .8rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .chat-empty > strong { display: block; font-size: 1.2rem; letter-spacing: -.025em; }\n .chat-empty > .meta { margin-top: .4rem; }\n .chat-prompts { display: flex; justify-content: center; flex-wrap: wrap; gap: .5rem; margin-top: 1.25rem; }\n /* The composer's status line takes no room until it has a state to report. */\n .composer-hint:empty { display: none; }\n .chat-prompts form { margin: 0; }\n .chat-prompts button { min-height: 2.35rem; box-shadow: none; background: var(--glass); padding-inline: .9rem; }\n /* The New update action (package 2): sticks above the composer, takes no\n room while hidden, and is the only thing that moves a reader who sat\n above the latest message when a live update landed. */\n .chat-new-update-holder { position: sticky; bottom: 1rem; z-index: 28; display: flex; justify-content: center; height: 0; margin: 0; pointer-events: none; }\n .chat-new-update { pointer-events: auto; transform: translateY(-100%); min-height: 2.35rem; padding-inline: .9rem; border-radius: 999px; box-shadow: var(--shadow-overlay); }\n .chat-new-update[hidden] { display: none; }\n /* The concise plan (package 2): a title, the outcome, one line of\n counts and limits, then one Review plan disclosure over the unchanged\n exact-terms form. */\n .chat-approval-stale { margin: .75rem 0 0; }\n .chat-approval-stale a { font-weight: 600; }\n form.approve-form[data-stale=\"1\"] .approval-confirm, form.approve-form[data-stale=\"1\"] .approval-act { opacity: .55; }\n .proposal-filed { display: flex; align-items: center; flex-wrap: wrap; gap: .6rem; margin: .5rem 0 0; }\n .chat-thinking { display: flex; align-items: center; gap: .75rem; padding: .75rem .85rem; }\n .chat-thinking p { flex: 1; margin: 0; }\n .chat-thinking p strong, .chat-thinking p span { display: block; }\n .chat-thinking p span { margin-top: .08rem; }\n .chat-thinking form { margin: 0; }\n /* On a desk the overview is its own card \u2014 no second frame around it. */\n .chat-fleet-context, .chat-fleet-context[open] { margin: 0; padding: 0; border: 0; background: transparent; }\n .chat-fleet-context > summary { display: none; }\n /* The summary's needs-you count is magenta wherever the summary shows (a count, by the law). */\n .chat-fleet-context > summary .hot { color: var(--brand); font-weight: 600; }\n @media (min-width: 761px) {\n /* A fresh conversation on a desk (annotation on build 1540): the\n overview folds behind one summary row that still carries its two\n counts, and the empty state gives up its centering slack, so the whole\n composer and its send control sit inside the first 1280\u00D7800 viewport. */\n .chat-main:has(.chat-empty) .chat-fleet-context { margin: 0 0 .25rem; border: 1px solid var(--glass-border); border-radius: 1rem; background: color-mix(in srgb, var(--glass) 70%, transparent); }\n .chat-main:has(.chat-empty) .chat-fleet-context[open] { padding-bottom: .5rem; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary { display: flex; align-items: center; gap: .6rem; min-height: 2.5rem; padding: .5rem .9rem; color: var(--muted-foreground); font-size: .78rem; cursor: pointer; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary::before { content: \"\u25B8\"; flex: none; font-size: .7rem; }\n .chat-main:has(.chat-empty) .chat-fleet-context[open] > summary::before { content: \"\u25BE\"; }\n .chat-main:has(.chat-empty) .chat-fleet-context > summary .meta { margin-left: auto; font-size: .68rem; white-space: nowrap; }\n .chat-main:has(.chat-empty) .chat-fleet-context .chat-overview { margin: 0 .5rem; box-shadow: none; }\n .chat-main:has(.chat-empty) .thread { min-height: 0; margin: .75rem 0 .75rem; }\n .chat-main:has(.chat-empty) .chat-empty { padding: clamp(1.25rem, 4vh, 2.25rem) 1rem 1rem; }\n }\n .thinking-orb { position: relative; width: 2rem; height: 2rem; flex: none; border-radius: 999px; background: var(--running-soft); }\n .thinking-orb::after { content: \"\"; position: absolute; inset: .55rem; border-radius: inherit; background: var(--running); animation: pulse 1.25s ease-in-out infinite; }\n .composer {\n display: flex; align-items: flex-end; gap: .75rem; padding: .7rem; margin-top: .5rem;\n border-radius: 1.35rem; background: var(--glass-strong);\n }\n .composer label { flex: 1; min-width: 0; margin: 0; font-size: 0; }\n .composer textarea {\n width: 100%; min-height: 3.5rem; max-height: 13rem; margin: 0; padding: .75rem .85rem;\n resize: vertical; border: 0; background: transparent; box-shadow: none; font-size: 1rem;\n }\n .composer textarea:focus-visible { border: 0; box-shadow: none; }\n @media (hover: hover) and (pointer: fine) { .composer textarea:hover { border: 0; box-shadow: none; } }\n .composer button {\n flex: 0 0 2.75rem; width: 2.75rem; min-height: 2.75rem; padding: 0; border-radius: 999px;\n font-size: 0; box-shadow: 0 10px 24px -16px rgb(255 255 255 / .65);\n }\n .composer button::after { content: \"\u2191\"; font: 600 1.15rem/1 var(--font-sans); }\n .chat-main > details { margin-top: 1rem; background: color-mix(in srgb, var(--glass) 70%, transparent); }\n @media (min-width: 761px) {\n /* Keep the desktop composer in the document flow. A sticky bottom\n * constraint pulled it over proposal cards on long conversations (and\n * into the middle of full-page captures), hiding the very acts it asks\n * the operator to confirm. The #latest anchor still brings this form\n * into view after every turn without making it an overlay. */\n .chat-workspace .composer { position: static; width: 100%; box-shadow: var(--shadow); }\n /* The agents summary is said ONCE per screen (v48): the context panel\n * carries it on desktop, so the compact strip \u2014 the phone's copy \u2014\n * steps aside wherever that panel is visible. */\n .task-chat-workspace .task-chat-agents { display: none; }\n }\n @media (min-width: 761px) and (max-width: 1199px) {\n .chat-workspace { grid-template-columns: minmax(0, 1fr); gap: 1rem; }\n .chat-main { max-width: none; }\n .chat-projects { display: none; }\n .chat-workspace.projects-open::before {\n content: \"\"; position: fixed; inset: 0 0 0 232px; z-index: 23; background: rgb(0 0 0 / .18);\n }\n .chat-workspace.projects-open .chat-projects {\n display: block; position: fixed; top: 4rem; left: calc(232px + 1.25rem); z-index: 25;\n width: min(18.5rem, calc(100vw - 232px - 2.5rem)); max-height: calc(100vh - 5rem);\n }\n .app.sidebar-collapsed .chat-workspace.projects-open::before { inset: 0 0 0 64px; }\n .app.sidebar-collapsed .chat-workspace.projects-open .chat-projects { left: calc(64px + 1.25rem); }\n .chat-project-close { display: grid; place-items: center; }\n }\n @media (min-width: 900px) and (max-width: 1199px) {\n .task-chat-workspace { grid-template-columns: minmax(14rem, 16rem) minmax(0, 1fr); gap: 1.25rem; }\n }\n @media (max-width: 760px) {\n main:has(.chat-workspace) { padding: 1rem max(1rem, env(safe-area-inset-right, 0rem)) calc(var(--composer-height, 4rem) + 5rem + env(safe-area-inset-bottom, 0rem)) max(1rem, env(safe-area-inset-left, 0rem)); }\n /* Above the fixed composer and the tab bar, never beneath them. */\n .chat-new-update-holder { bottom: calc(var(--composer-height, 4rem) + 4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .chat-main:has(.proposal.pending) .chat-new-update-holder, .chat-main:has(.chat-empty) .chat-new-update-holder { bottom: calc(4.5rem + env(safe-area-inset-bottom, 0rem)); }\n .chat-workspace, .chat-workspace.projects-hidden { display: block; }\n .chat-workspace.projects-hidden .chat-projects, .chat-projects { display: none; }\n .chat-project-toggle { display: inline-flex; min-height: 2.75rem; }\n .chat-project-close { display: grid; place-items: center; min-height: 2.75rem; min-width: 2.75rem; }\n .chat-workspace.projects-open::before { content: \"\"; position: fixed; inset: 0; z-index: 30; background: rgb(0 0 0 / .18); }\n .chat-workspace.projects-open .chat-projects { display: block; position: fixed; top: 5rem; left: 1rem; right: 1rem; width: auto; max-height: calc(100dvh - 10rem); overflow-y: auto; overscroll-behavior: contain; z-index: 31; background: var(--card); }\n .chat-project-list { display: grid; gap: 0; padding: 0; }\n .chat-project-card {\n margin: 0; padding: .85rem .4rem; border: 0; border-top: 1px solid var(--border); border-radius: 0; background: transparent;\n }\n .chat-projects { position: static; max-height: none; overflow: hidden; padding: .65rem; margin-bottom: .85rem; }\n .chat-projects-head { margin-bottom: .35rem; }\n .chat-project-stats { display: flex; flex-wrap: wrap; gap: .15rem .7rem; margin-top: .35rem; }\n .chat-project-stats span { font-size: .625rem; }\n .chat-project-stats span:last-child { display: none; }\n .chat-project-actions { margin-top: .5rem; }\n .chat-project-actions button { min-height: 2.75rem; padding-inline: .85rem; font-size: .8125rem; }\n .chat-head { padding-inline: 0; }\n .chat-head h1 { font-size: 1.4rem; }\n .chat-head-actions { align-items: flex-start; }\n .task-chat-workspace .task-chat-context { display: none; }\n .result-panel { padding: .25rem 0 1rem; border: 0; border-radius: 0; box-shadow: none; background: transparent; }\n .result-head { display: grid; gap: .45rem; }\n .result-head .status-line { justify-self: start; }\n .result-tabs { gap: 0; }\n .result-tabs a { flex: 1 1 auto; min-width: 0; justify-content: center; padding: 0 .25rem; font-size: .8125rem; gap: .3rem; white-space: nowrap; min-height: 2.75rem; overflow: hidden; }\n .result-facts { grid-template-columns: 1fr; }\n .result-request .diff-comment-form button, .result-request .revision-from-comments button { width: 100%; }\n .result-action .button-link, .result-action form button { width: 100%; box-sizing: border-box; min-height: 2.75rem; }\n .result-request .revision-from-comments { display: grid; }\n .result-links { display: grid; gap: 0; }\n .result-links a { min-height: 2.75rem; display: inline-flex; align-items: center; }\n .result-links a + a::before { content: none; }\n .task-chat-head { display: block; }\n .task-chat-head > .badge { display: none; }\n .task-chat-title-line { display: grid; gap: .65rem; }\n .task-chat-title-line .task-view-switch { justify-self: start; }\n #task-chat-live { gap: .75rem; }\n .task-journey { padding: .85rem; }\n .task-journey > ol { margin: .85rem -.2rem .65rem; }\n .task-journey > ol::before { left: 9%; right: 9%; }\n .task-journey li { font-size: .56rem; }\n .task-journey li i { width: 1.25rem; height: 1.25rem; }\n .chat-action-card > summary { align-items: flex-start; padding: .85rem; }\n .chat-action-card > summary .button-link { min-height: 2.1rem; padding-inline: .6rem; font-size: .65rem; white-space: nowrap; }\n .chat-action-card > summary small { max-width: 14rem; }\n .chat-budget { gap: .3rem; margin: .65rem 0 .9rem; }\n .chat-budget > span { padding: .25rem .48rem; }\n .chat-budget > span:first-child { max-width: 100%; overflow: hidden; text-overflow: ellipsis; }\n .chat-overview { padding: .8rem; }\n .chat-fleet-context { margin: .5rem 0 .75rem; border: 1px solid var(--glass-border); border-radius: 1rem; background: var(--glass); }\n .chat-fleet-context[open] { padding-bottom: .25rem; }\n .chat-fleet-context > summary { display: flex; align-items: center; justify-content: space-between; gap: .75rem; min-height: 2.75rem; padding: .75rem .9rem; color: var(--muted-foreground); font-size: .8rem; cursor: pointer; }\n .chat-fleet-context > summary::before { content: \"\u25B8\"; flex: none; margin-right: .35rem; font-size: .7rem; }\n .chat-fleet-context[open] > summary::before { content: \"\u25BE\"; }\n .chat-fleet-context > summary .meta { margin-left: auto; font-size: .68rem; white-space: nowrap; }\n .chat-fleet-context .chat-overview { border: 0; box-shadow: none; margin: 0; }\n .chat-overview-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .chat-overview-head { align-items: flex-start; }\n .chat-overview-copy strong, .chat-overview-copy span { white-space: normal; }\n .thread { min-height: 18rem; padding: 0; }\n .thread .msg.op { max-width: 90%; }\n .thread .msg.mate { padding-left: 2.8rem; padding-right: 0; }\n .thread .msg.mate::before { width: 2.15rem; height: 2.15rem; border-radius: .7rem; }\n .proposal-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .proposal-actions .acts { align-items: stretch; flex-direction: row; flex-wrap: wrap; }\n .proposal-actions .acts form { flex: 1 1 8rem; width: auto; }\n .proposal-actions .acts form:has(.arm) { flex-basis: 100%; }\n .proposal-actions .acts button { width: 100%; }\n .chat-prompts {\n display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: .5rem; width: 100%; max-width: 100%; overflow: visible; padding: 0;\n }\n .chat-prompts form, .chat-prompts button { min-width: 0; width: 100%; }\n .chat-prompts form:last-child:nth-child(odd) { grid-column: 1 / -1; }\n .chat-main { padding-bottom: 0; }\n .chat-main #latest { scroll-margin-top: 7rem; }\n .chat-workspace .composer {\n position: fixed; left: 1rem; right: 1rem; bottom: calc(3.75rem + env(safe-area-inset-bottom, 0rem));\n z-index: 29; margin: 0; padding: .45rem; border-radius: 1.1rem; box-shadow: var(--shadow-overlay);\n }\n /* A confirmation is the primary act. Let the composer return to the\n document flow while one is pending so it can never cover the card's\n explanation or buttons on a short phone viewport. */\n .chat-main:has(.proposal.pending) { padding-bottom: 0; }\n .chat-main:has(.proposal.pending) .composer { position: static; width: 100%; margin-top: .5rem; }\n /* \u2026and the suggestion chips step aside for the same reason: on a phone\n the card, its buttons, and the composer then share one screen. */\n .chat-main:has(.proposal.pending) .chat-prompts { display: none; }\n /* First use is one cohesive intake card: prompt, suggestions, then the\n box. A fixed box belongs to an established thread; here it would sit\n above the very question it is asking the person to answer. */\n .chat-main:has(.chat-empty) { padding-bottom: 0; }\n .chat-main:has(.chat-empty) .thread { min-height: 0; margin-bottom: .5rem; }\n .chat-main:has(.chat-empty) .chat-empty {\n width: 100%; min-width: 0; max-width: 100%; margin: 0; padding: 2rem 0 .75rem;\n }\n .chat-main:has(.chat-empty) .chat-empty > strong,\n .chat-main:has(.chat-empty) .chat-empty > .meta { max-width: 22rem; margin-inline: auto; }\n .chat-main:has(.chat-empty) .chat-empty > .meta { margin-top: .45rem; }\n .chat-main:has(.chat-empty) .composer { position: static; width: 100%; margin-top: .5rem; }\n .composer textarea { min-height: 2.75rem; padding: .55rem .65rem; font-size: 1rem; }\n /* Hide bottom navigation only when viewport shrink indicates a soft\n keyboard; hardware-keyboard focus and pinch zoom keep it available. */\n html[data-mobile-keyboard] .tabbar { display: none; }\n html[data-mobile-keyboard] .chat-workspace .composer { bottom: calc(var(--keyboard-inset, 0px) + .5rem); }\n /* The raised composer needs the same room beneath the thread as the\n resting one, or the newest message hides behind it while typing. */\n html[data-mobile-keyboard] main:has(.chat-workspace) { padding-bottom: calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1.5rem); }\n html[data-mobile-keyboard] main:has(.chat-workspace) :is(input, textarea, button, summary, a) { scroll-margin-block: 6rem calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1.5rem); }\n html[data-mobile-keyboard] .chat-new-update-holder { bottom: calc(var(--keyboard-inset, 0px) + var(--composer-height, 4rem) + 1rem); }\n html[data-mobile-keyboard] .sticky-actions { bottom: .5rem; }\n .work-tools { display: block; }\n .work-tools > summary, .work-tools-menu a, .work-views a { min-height: 2.75rem; }\n .work-tools-menu a { display: flex; align-items: center; }\n main :is(input, textarea, button, summary, a) { scroll-margin-block: 6rem calc(var(--composer-height, 4rem) + 5rem); }\n }\n main:has(.mate-mint) { max-width: 68rem; }\n main:has(.mate-mint) > h1 { margin-top: .5rem; font-size: 1.7rem; letter-spacing: -.04em; }\n .mate-mint { position: relative; max-width: 46rem; margin-top: 1.5rem; padding: 1.5rem; border-radius: calc(var(--radius) + 4px); }\n .mate-mint::before {\n content: \"T\"; position: absolute; top: 1.4rem; left: 1.4rem; width: 3rem; height: 3rem;\n display: grid; place-items: center; border: 1px solid var(--glass-border); border-radius: 1rem;\n background: var(--glass-strong);\n box-shadow: var(--so-pill-shadow);\n font: 600 .75rem/1 var(--font-mono); letter-spacing: -.05em;\n }\n .mate-mint > p:first-child { min-height: 3rem; margin: 0; padding: .15rem 0 1.25rem 4rem; font-size: .95rem; }\n .mate-mint > p:first-child strong { display: block; margin-bottom: .2rem; font-size: 1.1rem; letter-spacing: -.02em; }\n .mate-mint form { border-top: 1px solid var(--glass-border); padding-top: .5rem; }\n /* The start act is the page's one primary (UI polish 2026-09-13). */\n .mate-mint form > button[type=submit] { background: var(--primary); color: var(--primary-foreground); border-color: var(--primary); font-weight: 600; }\n @media (hover: hover) and (pointer: fine) { .mate-mint form > button[type=submit]:hover { background: color-mix(in srgb, var(--primary) 85%, var(--background)); border-color: color-mix(in srgb, var(--primary) 85%, var(--background)); } }\n .mate-terms { display: flex; flex-wrap: wrap; gap: 1rem; align-items: baseline; padding: .35rem 0; }\n .mate-terms .inline-field { white-space: nowrap; }\n button.quiet { background: transparent; color: var(--fg-muted); border-color: var(--border); }\n .answer-options { list-style: none; padding: 0; margin: 0.4rem 0; }\n .answer-options li { padding: 0.35rem 0.6rem; border-left: 1px solid var(--border); margin: 0.25rem 0; }\n .answer-options li.picked { border-left-color: var(--foreground); }\n .shared-action { max-width: 49rem; overflow-wrap: anywhere; }\n .shared-action form { margin-top: 1.5rem; }\n .shared-action label.arm { display: flex; align-items: center; gap: .6rem; min-height: 44px; padding-block: .4rem; }\n .shared-action label.arm input { flex: none; width: 20px; height: 20px; }\n .shared-action button { white-space: nowrap; }\n .proposal label.arm { display: inline-flex; gap: 0.35rem; align-items: center; margin-right: 0.5rem; font-size: 0.85rem; }\n .coordinator-proposals .card { margin: 0.5rem 0; }\n .workspace-head { display: flex; align-items: center; gap: .5rem; min-width: 0; }\n .workspace-head .workspace-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; font-family: var(--font-mono); font-size: .8125rem; }\n .workspace-head .badge { flex: none; }\n .workspace-head form { margin: 0 0 0 auto; }\n .workspace-head form button { min-height: 2rem; padding: 0 .625rem; font-size: .75rem; width: auto; }\n .workspace-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: .375rem; margin-top: .625rem; }\n .workspace-stats .pulse-stat {\n color: var(--muted-foreground); font-size: .6875rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n background: var(--muted); border-radius: calc(var(--radius) - 4px); padding: .375rem .5rem; text-align: center;\n }\n .workspace-stats .pulse-stat b { display: block; color: var(--foreground); font-weight: 600; font-family: var(--font-mono); font-size: 1.125rem; line-height: 1.2; font-variant-numeric: tabular-nums; }\n .workspace-stats .pulse-stat.hot b { color: var(--brand); }\n .workspace-bar { display: flex; gap: 2px; height: .375rem; margin-top: .625rem; border-radius: 9999px; overflow: hidden; background: var(--muted); }\n .workspace-bar .seg { flex: 1 1 0; }\n .workspace-bar .seg.attention { background: var(--brand); }\n .workspace-bar .seg.building { background: var(--running); }\n .workspace-bar .seg.waiting { background: var(--muted-foreground); }\n .workspace-bar .seg.queued { background: color-mix(in srgb, var(--muted-foreground) 45%, transparent); }\n .attention-stack { display: grid; gap: .55rem; }\n .attention-stack .decide-card { margin: 0; }\n .attention-stack .q { display: flex; gap: .5rem; align-items: center; justify-content: space-between; }\n .wb-rail-head {\n display: flex; align-items: flex-end; justify-content: space-between; gap: .75rem;\n padding: 0 .15rem .6rem; border-bottom: 1px solid var(--border);\n }\n .wb-rail-head h2 { margin: .1rem 0 0; color: var(--foreground); font-size: .875rem; letter-spacing: -.01em; text-transform: none; font-family: var(--font-sans); }\n .wb-rail-head a { font-size: .75rem; color: var(--muted-foreground); }\n .wb-group { margin-top: 1.05rem; }\n .wb-group > h2 {\n display: flex; align-items: center; justify-content: space-between; margin: 0 .2rem .35rem;\n font-size: .65rem;\n }\n .wb-group > h2 .lane-count { border: 1px solid var(--border); border-radius: 999px; padding: .04rem .42rem; }\n .wb-row {\n display: block; padding: .58rem .65rem; margin: .16rem 0; border: 1px solid transparent;\n border-radius: calc(var(--radius) - 4px); color: inherit; text-decoration: none;\n }\n @media (hover: hover) and (pointer: fine) { .wb-row:hover { background: var(--card); border-color: var(--border); } }\n .wb-row.wb-selected { background: var(--muted); border-color: var(--border); }\n .wb-row .wb-title { display: block; font-size: .8125rem; font-weight: 500; line-height: 1.35; }\n .wb-row .wb-meta { display: flex; align-items: center; gap: .3rem; flex-wrap: wrap; margin-top: .22rem; }\n .wb-row .badge { padding: .04rem .42rem; font-size: .65rem; }\n .wb-row .wb-reason { display: block; color: var(--muted-foreground); font-size: .72rem; margin-top: .22rem; line-height: 1.35; }\n @media (max-width: 720px) {\n .control-room-head { display: block; }\n .control-room-head .actions { justify-content: flex-start; margin-top: .75rem; }\n .command-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n .workspace-pulse { grid-template-columns: 1fr; }\n .workspace-stats .pulse-stat { padding: .375rem .125rem; font-size: .625rem; letter-spacing: -.01em; }\n .permission-toggle { grid-template-columns: 1fr; }\n .task-intake { margin-top: .25rem; }\n .task-intake-hero { text-align: left; margin-bottom: .9rem; }\n .task-intake-mark { display: none; }\n .task-composer { margin-inline: 0; padding: .55rem; border-radius: 1.15rem; }\n .task-prompt textarea { min-height: 7.25rem; padding: .75rem; font-size: 1rem; }\n .task-composer-footer { flex-wrap: wrap; }\n .task-context { order: 1; flex-basis: calc(100% - 7rem); }\n .task-context-chip:first-child { max-width: 9.5rem; }\n .task-context-chip:nth-child(2) { display: none; }\n .task-quality { order: 2; }\n .task-submit { order: 3; width: 100%; }\n .task-options { order: 4; }\n .task-options-grid { grid-template-columns: 1fr; }\n .task-options-grid .wide, .task-options-grid .permission-field { grid-column: auto; }\n .agents-form { grid-template-columns: 1fr; }\n .agents-roles { grid-template-columns: 1fr; }\n .agents-role-row { grid-template-columns: 1fr; }\n .approval-card { padding: 1rem; }\n /* The orientation block says the wait on a phone; the kicker would say it twice. */\n .approval-card .approval-kicker { display: none; }\n .approval-boundaries, .approval-confirm { grid-template-columns: 1fr; }\n /* The approval stays IN FLOW on phones: the password field comes\n first and the button follows it \u2014 never a sticky control floating\n over the field it confirms. */\n .approval-confirm .sticky-actions { position: static; margin-top: 0; padding: 0; border-top: 0; }\n }\n\n /* Runner lanes (queue + fleet): one column per worker. */\n .content > main:has(.lanes) { max-width: none; }\n .lanes {\n display: grid; grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));\n gap: .625rem; padding-bottom: .75rem; align-items: start;\n }\n @media (max-width: 40rem) {\n .lanes { display: flex; flex-direction: column; }\n .lanes .lane { min-height: 0; }\n }\n .runner-note { width: 100%; }\n .queue-handle {\n display: inline-flex; align-items: center; justify-content: center; flex: none;\n width: 2rem; height: 2rem; margin: -.375rem .125rem -.375rem -.5rem; vertical-align: middle;\n color: var(--muted-foreground); cursor: grab; user-select: none; touch-action: none; border-radius: calc(var(--radius) - 4px);\n }\n .queue-handle svg { width: 1.125rem; height: 1.125rem; }\n .queue-handle:active { cursor: grabbing; background: var(--muted); }\n .icon-button, .inline button.icon-button { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 2.75rem; min-width: 2.75rem; padding: 0; }\n .icon-button svg { width: 1rem; height: 1rem; }\n .queue-card p { margin: 0; }\n .queue-card a { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .queue-card a:hover { text-decoration: underline; } }\n .queue-card .row + .row { margin-top: .125rem; border-bottom: none; }\n .queue-card p.row { padding: 0; border-bottom: none; }\n .tracks { margin-top: 1.5rem; }\n .tracks > .hint { margin-bottom: .75rem; }\n .track-row { margin-bottom: .6rem; }\n .track-row p { display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }\n .track-row p .right { margin-left: auto; }\n .track-row a { text-decoration: none; }\n @media (hover: hover) and (pointer: fine) { .track-row a:hover { text-decoration: underline; } }\n .track-strip { display: inline-flex; gap: .3rem; align-items: center; vertical-align: middle; }\n .fire {\n display: inline-block; width: .65rem; height: .65rem; border-radius: 50%;\n background: var(--muted);\n }\n .fire-ok { background: var(--success); }\n .fire-bad { background: var(--destructive); }\n .fire-live { background: var(--running); animation: pulse 1.6s ease-in-out infinite; }\n .fire-skip { background: transparent; border: 1.5px solid var(--muted); }\n\n/* the phone: fingers, not cursors \u2014 tested at 320/390px */\ninput, select, textarea { font-size: 16px; }\nbutton { min-height: 44px; }\n@media (max-width: 40rem) {\n form.card button[type=submit], form > button[type=submit] { width: 100%; }\n input[type=text], input[type=password] { width: 100%; max-width: 100%; box-sizing: border-box; }\n main { padding-bottom: calc(1rem + env(safe-area-inset-bottom)); }\n /* Task actions are composed for a thumb, not allowed to wrap according\n to their intrinsic text widths. Every row owns the available width. */\n .task-title-row { display: grid; gap: .6rem; margin-bottom: .8rem; }\n .task-title-row .task-main-title { margin-bottom: 0; }\n .task-title-row .task-view-switch { justify-self: start; }\n .task-main-title { display: flex; align-items: center; flex-wrap: wrap; gap: .3rem .4rem; }\n .dispatch-copy { display: grid; gap: .2rem; }\n .dispatch-copy > strong { line-height: 1.35; }\n .dispatch-action-link, details.dispatch-recovery > summary { width: 100%; box-sizing: border-box; justify-content: center; }\n .proof-review-actions { display: grid; }\n .proof-review-actions > .button-link { width: 100%; box-sizing: border-box; text-align: center; }\n details.proof-exception[open] { width: 100%; }\n .dispatch-recovery-body { padding: .7rem; }\n .dependency-repair-actions { display: grid; grid-template-columns: 1fr; gap: .5rem; margin-top: .75rem; }\n .dependency-repair-actions form { display: flex; width: 100%; max-width: none; margin: 0; }\n .dependency-repair-actions form > button[type=submit] { width: 100%; }\n .dependency-repair-actions .dependency-repair-replace {\n display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: .5rem;\n }\n .dependency-repair-actions .dependency-repair-label { width: 100%; min-width: 0; }\n .dependency-repair-actions .dependency-repair-label > select { width: 100%; min-width: 0; max-width: none; }\n .dependency-repair-actions .dependency-repair-replace > button[type=submit] { width: auto; }\n .acts-bar { display: grid; grid-template-columns: minmax(0, 1fr); gap: .5rem; margin: .75rem 0 .35rem; }\n .acts-bar > *, .acts-bar form.inline { min-width: 0; margin: 0; }\n .acts-bar .primary { display: block; width: 100%; }\n .acts-bar .primary form { width: 100%; margin: 0; }\n .acts-bar .primary form.inline > button[type=submit] { width: 100%; margin: 0; }\n .acts-bar .act-hold {\n display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center;\n gap: .5rem; width: 100%;\n }\n .acts-bar .act-hold input[type=text] { width: 100%; min-width: 0; margin: 0; }\n .acts-bar .act-hold > button[type=submit] { width: auto; white-space: nowrap; }\n .acts-why { margin: .25rem 0 .85rem; font-size: .75rem; line-height: 1.5; }\n .acts-why-plan { display: none; }\n .task-scope-needed { padding: .85rem 1rem; }\n .task-scope-needed p { margin: .2rem 0; }\n .receipt-head { display: grid; gap: .45rem; }\n .receipt-head .status-line { justify-self: start; }\n .receipt-facts { grid-template-columns: 1fr; }\n .receipt-actions { display: grid; grid-template-columns: 1fr; }\n .receipt-actions .button-link { width: 100%; box-sizing: border-box; text-align: center; }\n /* The cockpit already stacks at 980px (above); only the phone-width\n act card and section padding are decided here. */\n .cockpit-detail { grid-row: 1; }\n .cockpit-queue { grid-row: 2; margin-top: .85rem; padding-top: .85rem; border-top: 1px solid var(--border); border-bottom: 0; }\n .cockpit-next { display: grid; }\n .cockpit-next form, .cockpit-next .button-link { width: 100%; box-sizing: border-box; }\n .cockpit-next form input[type=text] { flex: 1 1 100%; }\n .cockpit-next form button[type=submit] { width: 100%; }\n .cockpit-section { padding: .85rem .8rem; }\n .cockpit-disclosure { padding: 0; }\n .cockpit-disclosure > summary { padding: .8rem; }\n .cockpit-disclosure-body { padding: 0 .8rem .85rem; }\n .cockpit-accept-form { display: grid; }\n .cockpit-accept-form button { width: 100%; }\n .diff-review { margin-inline: -.1rem; }\n .diff-review-bar { padding-left: .7rem; }\n .diff-file > summary { padding-inline: .7rem; }\n .diff-line { grid-template-columns: 2.75rem 2.65rem 2.65rem minmax(max-content, 1fr); min-height: 2.75rem; }\n .diff-annotate, .diff-annotate-space { width: 2.75rem; min-width: 2.75rem; min-height: 2.75rem; }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 2.65rem 2.65rem minmax(max-content, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-annotate,\n .diff-review[data-mode=\"view\"] .diff-annotate-space { width: 0; min-width: 0; }\n .diff-line code, .diff-gutter { padding-top: .72rem; padding-bottom: .72rem; }\n .diff-comment-target { grid-template-columns: minmax(0, 1fr) 4.75rem; }\n .diff-comment-form button { width: 100%; }\n .revision-from-comments { display: grid; }\n .revision-from-comments button { width: 100%; }\n /* A decision option on a phone: the answer is the full-width thumb\n target; its recommendation and consequence share the line beneath. */\n .decide-option > button { flex: 0 0 100%; width: 100%; }\n .decide-option .badge { flex: none; }\n .decide-option .meta { flex: 1 1 10rem; }\n /* A queue card's controls read as one row under the id: to-front \u00B7 reserve (stretching) \u00B7 move. */\n .queue-card p.row.meta { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }\n .queue-card p.row.meta > .mono { flex: 0 0 100%; }\n .queue-card .inline { margin: 0; display: inline-flex; align-items: center; gap: .375rem; }\n .queue-card .inline:last-child { flex: 1 1 auto; min-width: 0; }\n .queue-card .inline > button[type=submit]:not(.icon-button) { width: auto; }\n .queue-card .inline select { flex: 1 1 6rem; min-width: 0; width: auto; min-height: 2.75rem; margin: 0; }\n .queue-card .mono { overflow-wrap: anywhere; }\n .queue-card .row + .row { margin-top: .5rem; }\n /* The title sits beside the grip and wraps within its own box; the\n chips flow after it, never above the name. */\n .queue-card p.row > a:first-of-type { flex: 1 1 12rem; min-width: 0; }\n}\n/* A phone reads a long changed line wrapped, never scrolled sideways: the\n line keeps its numbers and marker, the code column takes what is left. */\n@media (max-width: 760px) {\n .diff-lines { overflow-x: visible; }\n .diff-line, .diff-review .diff-line { min-width: 0; grid-template-columns: 2.75rem 2.65rem 2.65rem minmax(0, 1fr); }\n .diff-review[data-mode=\"view\"] .diff-line { grid-template-columns: 0 2.65rem 2.65rem minmax(0, 1fr); }\n .diff-line code { white-space: pre-wrap; overflow-wrap: anywhere; }\n .diff-hunk-head { overflow-x: visible; white-space: pre-wrap; overflow-wrap: anywhere; }\n}\n@media (max-width: 30rem) {\n .dependency-repair-actions .dependency-repair-replace { grid-template-columns: minmax(0, 1fr); }\n .dependency-repair-actions .dependency-repair-replace > button[type=submit] { width: 100%; }\n}\n@media (max-width: 26rem) {\n .acts-bar .act-hold { grid-template-columns: minmax(0, 1fr); }\n .acts-bar .act-hold > button[type=submit] { width: 100%; }\n}\n.next-pager { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem .75rem; margin: 0 0 .75rem; }\n.next-pager .skip {\n margin-left: auto; display: inline-flex; align-items: center; justify-content: center; min-height: 2.75rem;\n padding: 0 .875rem; border: 1px solid var(--border); border-radius: 999px;\n text-decoration: none; color: var(--foreground); background: var(--card);\n}\n@media (hover: hover) and (pointer: fine) { .next-pager .skip:hover { border-color: color-mix(in srgb, var(--border) 60%, var(--muted-foreground)); } }\n\n/* Motion: only where a human caused the change \u2014 navigation, presses,\n overlays. Liveness swaps stay instant; the pulse dot is the one \"alive\"\n signal. Everything dies under prefers-reduced-motion; auto-refresh pages\n opt out of the navigation cross-fade separately (see shell()). */\n@view-transition { navigation: auto; }\n/* A page change fades THROUGH, not across: the old page leaves before the new\n one arrives, so two pages' text is never on screen at once. The sidebar,\n the same on both, swaps in place instead of fading (each shell names its\n own, so a page can never carry the name twice). */\n::view-transition-old(root) { animation: so-page-leave 80ms ease-in both; }\n::view-transition-new(root) { animation: so-page-arrive 140ms ease-out 60ms both; }\n@keyframes so-page-leave { to { opacity: 0; } }\n@keyframes so-page-arrive { from { opacity: 0; } }\n.side { view-transition-name: so-nav-page; }\n.so-sidebar { view-transition-name: so-nav-app; }\n::view-transition-group(so-nav-page), ::view-transition-group(so-nav-app),\n::view-transition-old(so-nav-page), ::view-transition-new(so-nav-page),\n::view-transition-old(so-nav-app), ::view-transition-new(so-nav-app) { animation: none; }\n/* UI polish 2026-09-13 \u2014 the motion contract. Feedback transitions run\n 140\u2013200 ms on color, border, shadow, opacity, and transform only; an\n overlay's entrance is at most 220 ms of opacity + transform. Nothing\n animates a width, height, margin, grid track, or blur, and nothing\n pulses for decoration. The reduce block below is universal: every\n animation and transition dies, and no page reads differently for it. */\n@media (prefers-reduced-motion: no-preference) {\n .tabbar a, .side nav a { transition: color .15s, background .15s; }\n button:active { transform: scale(.985); }\n /* Anchor buttons press like buttons; nav links fill instead. The palette\n and shortcuts overlay are keyboard-summoned, so they appear at once. */\n .button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip { transition: transform 160ms var(--so-ease-out); }\n :is(.button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip):active { transform: scale(.985); }\n .chat-workspace.projects-open .chat-projects { animation: rise 200ms ease-out; }\n .chat-workspace.projects-open::before { animation: fade 180ms ease-out; }\n .switcher[open] .switcher-menu { animation: rise 160ms ease-out; }\n @media (hover: hover) and (pointer: fine) {\n .lane-card, .decide-card, .menu-row, .chat-overview-item, .proposal { transition: border-color .15s, transform .15s, box-shadow .15s; }\n .lane-card:hover, .decide-card:hover, .menu-row:hover {\n \n box-shadow: 0 2px 8px -2px rgb(0 0 0 / .35);\n }\n }\n}\n@keyframes rise { from { opacity: 0; transform: translateY(4px); } }\n@keyframes fade { from { opacity: 0; } }\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after { animation: none !important; transition: none !important; }\n ::view-transition-group(*), ::view-transition-old(root), ::view-transition-new(root) { animation: none; }\n button:active, :is(.button-link, .side .new-task, .content .new-task, .result-feedback-link, .next-pager .skip):active { transform: none; }\n @media (hover: hover) and (pointer: fine) { button:hover, .side nav a:hover, .chat-project-card:hover, .lane-card:hover, .decide-card:hover, .menu-row:hover { transform: none; } }\n}\n\n/* The shortcuts overlay: display-only, toggled by the chrome layer, absent\n from sensitive pages. */\n.kbd-help {\n position: fixed; top: 18vh; left: 50%; transform: translateX(-50%); width: min(26rem, 92vw);\n background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);\n box-shadow: var(--shadow-overlay);\n padding: 1rem 1.25rem; z-index: 50;\n}\n.kbd-help h2 { margin: 0 0 .5rem; font-size: .8125rem; }\n.kbd-help table { width: 100%; border-collapse: collapse; font-size: .8125rem; }\n.kbd-help td { padding: .25rem 0; vertical-align: top; }\n.kbd-help td:first-child { width: 7.5rem; color: var(--muted-foreground); white-space: nowrap; }\n.kbd-help kbd {\n font-family: var(--font-mono); font-size: .75rem; background: var(--muted);\n border: 1px solid var(--border); border-radius: .3rem; padding: .05rem .35rem;\n}\n@media (max-width: 760px) {\n .kbd-help {\n top: auto; bottom: 0; left: 0; right: 0; transform: none; width: auto;\n border-radius: var(--radius) var(--radius) 0 0;\n padding-bottom: calc(1rem + env(safe-area-inset-bottom, 0rem));\n }\n}\n\n/* The per-file comment button: a small real button beside a diff row. */\nbutton.pick-file { min-height: 1.75rem; padding: 0 .55rem; font-size: .75rem; }\n\n/* Sticky ceremony actions: single-primary-action forms keep their submit\n within thumb reach on phones. Desktop: plain flow. */\n@media (max-width: 760px) {\n .sticky-actions {\n position: sticky; bottom: calc(3.5rem + env(safe-area-inset-bottom, 0rem)); z-index: 20;\n background: var(--background); border-top: 1px solid var(--border);\n padding: .625rem 0; margin-top: .75rem;\n }\n .sticky-actions button { margin: 0; }\n}\n\n/* A time a person reads (when-html.ts): the full stamp on a desk, the short\n one on a phone; the full stamp stays in the title. */\n.so-when-short { display: none; }\n@media (max-width: 760px) {\n .so-when-full { display: none; }\n .so-when-short { display: inline; }\n /* Server pages outside the workspace keep the same phone rhythm. */\n main { padding: var(--so-phone-gap) var(--so-phone-gutter) 3rem; }\n h2 { margin: 1.25rem 0 .375rem; }\n .card { padding: var(--so-phone-card); margin: var(--so-phone-row) 0; }\n .problem { padding: .5rem .625rem; margin: var(--so-phone-row) 0; }\n .meta, .hint { line-height: 1.35; }\n details { margin: var(--so-phone-row) 0; }\n}\n";
745
729
  /** Appearance: a three-way segmented switch, one tap per choice. */
746
730
  export declare const THEME_CONTROLS_CSS = ".task-repo select{width:100%;min-height:2.75rem;font-size:1rem}.task-repo-add{margin:.35rem .1rem .5rem}.task-repo-add a{display:inline-flex;align-items:center;min-height:2.25rem}details.result-request-open.result-request-form>summary{border:0;background:transparent;padding:.5rem 0;min-height:2.75rem;font-weight:600;display:list-item;list-style:revert}details.result-request-open.result-request-form>summary::-webkit-details-marker{display:revert}form.js-autosave button[type=submit]{display:none}.provider-row{border-bottom:1px solid var(--so-line);padding:.35rem 0}.provider-row:first-of-type{border-top:1px solid var(--so-line)}.provider-head{display:flex;align-items:center;gap:.75rem;margin:.4rem 0 0}.provider-status{display:inline-flex;align-items:center;gap:.4rem;color:var(--so-muted);font-size:.875rem}.provider-status i{width:.5rem;height:.5rem;border-radius:50%;background:var(--so-muted)}.provider-status--ok i{background:var(--so-success)}.provider-status--warn i{background:var(--so-attention)}.provider-status--off i{background:transparent;border:1.5px solid var(--so-muted)}details.provider-manage>summary{cursor:pointer;color:var(--so-accent-text);font-size:.875rem;min-height:2.5rem;display:list-item;padding-block:.5rem}.card.props .row{display:grid;gap:.1rem;margin:0 0 .75rem}.card.props .row>.meta{display:block;font-size:.75rem}.card.props .row>.meta::first-letter{text-transform:uppercase}.card.props .row>.mono{font-family:var(--font-sans);font-size:.875rem}.card.props .row>.mono .seal{font-family:var(--font-mono);font-size:.8125rem}details.evidence-files{margin:1rem 0}details.evidence-files>summary{cursor:pointer;min-height:2.75rem;display:list-item;padding-block:.7rem;font-weight:600}details.evidence-files ul{list-style:none;margin:0;padding:0}details.evidence-files li{display:flex;justify-content:space-between;gap:1rem;padding:.5rem 0;border-bottom:1px solid var(--so-line)}.result-action .result-feedback-link{display:inline-flex;align-items:center;min-height:2.5rem;padding:.5rem 1rem;border:1px solid var(--so-input-line);border-radius:.5rem;background:var(--so-paper);color:var(--so-ink);font-weight:600;text-decoration:none}@media(hover:hover) and (pointer:fine){.result-action .result-feedback-link:hover{background:var(--so-raised)}}.so-sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.verdict{margin:.5rem 0 .75rem}.verdict-chips{display:flex;flex-wrap:wrap;gap:.4rem;list-style:none;padding:0;margin:0}.verdict-chip{display:inline-flex;align-items:center;gap:.3rem;min-height:1.75rem;padding:.2rem .65rem;border-radius:999px;font-size:.8125rem;font-weight:600;background:var(--so-neutral-soft);color:var(--so-neutral-ink)}.verdict-chip svg{width:.9rem;height:.9rem}.verdict-chip--success{background:var(--so-success-soft);color:var(--so-success)}.verdict-chip--danger{background:var(--so-danger-soft);color:var(--so-danger)}.verdict-chip--warning{background:var(--so-warning-soft);color:var(--so-warning)}.verdict-chip--info{background:var(--so-info-soft);color:var(--so-info)}.verdict-by{margin:.4rem 0 0}details.result-request-open{margin:.5rem 0}details.result-request-open>summary{display:inline-flex;align-items:center;min-height:2.5rem;padding:.5rem 1rem;border:1px solid var(--so-input-line);border-radius:.5rem;background:var(--so-paper);color:var(--so-ink);font-weight:600;cursor:pointer;list-style:none}details.result-request-open>summary::-webkit-details-marker{display:none}details.result-request-open[open]>summary{margin-bottom:.75rem}.settings-tiles{display:grid;gap:1.25rem;margin:0 0 2rem}.settings-tiles h2{margin:0 0 .5rem;font-size:.875rem;font-weight:600;color:var(--so-muted)}.settings-tiles section>div{display:grid;grid-template-columns:repeat(auto-fill,minmax(8.5rem,1fr));gap:.5rem}.settings-tiles a>span{display:grid;gap:.1rem;min-width:0}.settings-tiles .provider-status{font-weight:400;font-size:.8125rem}.settings-tiles a{display:flex;align-items:center;gap:.6rem;min-height:3rem;padding:.65rem .8rem;border:1px solid var(--so-line);border-radius:.625rem;background:var(--so-paper);color:var(--so-ink);text-decoration:none;font-weight:550;font-size:.875rem}@media(hover:hover) and (pointer:fine){.settings-tiles a:hover{border-color:var(--so-input-line);background:var(--so-raised)}}.settings-tiles a>svg{width:1.1rem;height:1.1rem;flex-shrink:0;color:var(--so-accent-text)}details.settings-more{margin:.25rem 0 1.25rem}details.settings-more>summary{cursor:pointer;min-height:2.75rem;display:list-item;padding-block:.7rem;font-weight:550}details.settings-more>summary .meta{font-weight:400;margin-left:.35rem}.settings-changed{margin-top:-.25rem}.appearance{margin:0 0 28px}.appearance h2{margin:0 0 10px}.theme-switch{display:inline-flex;flex-wrap:nowrap;max-width:100%;gap:4px;padding:4px;margin:0;border:1px solid var(--so-line);border-radius:10px;background:var(--so-raised)}.theme-switch .theme-choice,.so-native-region .theme-switch .theme-choice{flex:1 1 0;width:auto;white-space:nowrap;min-height:40px;padding:8px 16px;border:0;border-radius:7px;background:transparent;color:var(--so-muted);font:inherit;font-weight:550;box-shadow:none;cursor:pointer}@media(hover:hover) and (pointer:fine){.theme-switch .theme-choice:hover{color:var(--so-ink)}}.theme-switch .theme-choice[aria-pressed=\"true\"]{background:var(--so-paper);color:var(--so-ink);box-shadow:0 1px 2px rgb(0 0 0 / .1)}.appearance .meta{margin:8px 0 0}@media(max-width:600px){.theme-switch .theme-choice{min-height:44px}}.update-notes{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit;max-height:18rem;overflow:auto}";
747
731
  /** The page CSS this module writes itself (not the imported modules'), for the stylesheet contract tests. */
@@ -755,7 +739,7 @@ export declare const WORKSPACE_STYLE: {
755
739
  /** Everything the sidebar needs to draw itself for one request. */
756
740
  export type Chrome = {
757
741
  projectScoped?: boolean;
758
- active: "code" | "inbox" | "board" | "queue" | "fleet" | "workbench" | "work" | "done" | "activity" | "review" | "system" | "tasks" | "runs" | "caps" | "routines" | "recipes" | "projects" | "flows" | "settings" | "chat" | "people" | "ledger" | "spend" | "mode" | "menu" | "none";
742
+ active: "code" | "inbox" | "board" | "queue" | "fleet" | "workbench" | "work" | "done" | "activity" | "review" | "system" | "tasks" | "runs" | "caps" | "recipes" | "projects" | "flows" | "settings" | "chat" | "people" | "ledger" | "spend" | "mode" | "menu" | "none";
759
743
  project: string | null;
760
744
  /** The surface's scope for the scope bar — which rows this screen can
761
745
  * show. Derived from the ROUTE, not the session: portfolio and fleet are
@@ -830,21 +814,16 @@ export declare function regionScript(regionId: string, fragmentName: string, eve
830
814
  */
831
815
  export declare function transcriptScript(path?: string, elementId?: string): string;
832
816
  /**
833
- * The attended chrome layer: the jump palette and elapsed tickers. Pure
817
+ * The chrome layer: the jump palette and elapsed tickers. Pure
834
818
  * navigation — no key ever posts, so the palette cannot approve anything;
835
819
  * ceremonies stay POST + password + CSRF, untouched. Reads its index from
836
820
  * a non-executable JSON script tag rendered by the same authorized page.
837
821
  */
838
- /** The attended beat (v28): parameterless, cookie + same-origin proven
839
- * server-side, renewal-only — any console page keeps the signed-in
840
- * approver's own sessions live; a hidden tab pauses honestly. Cheap
841
- * no-op when nothing is open. Shipped ALONE on sensitive pages. */
842
- export declare function beatScript(enabled?: boolean): string;
843
822
  /** The rail's presentation-only state is safe beside a password ceremony:
844
823
  * it never reads a field or sends a request, and keeps the chat collapsible
845
824
  * from its very first screen while the palette and global keys remain absent. */
846
825
  export declare function sidebarScript(): string;
847
- export declare function chromeScript(beats?: boolean): string;
826
+ export declare function chromeScript(): string;
848
827
  /**
849
828
  * A page described, not yet rendered (arc 4): every chromed HTML route
850
829
  * returns one of these and ONE helper (sendScreen, inside the server)
@@ -1055,8 +1034,6 @@ export declare function systemPage(chrome: Chrome, data: {
1055
1034
  model: string | null;
1056
1035
  }[];
1057
1036
  runners: Runner[];
1058
- /** v28: open attended sessions per runner. */
1059
- heldSessions?: Map<string, number>;
1060
1037
  worktrees: WorktreeRow[];
1061
1038
  episode: {
1062
1039
  id: number;
@@ -1082,7 +1059,6 @@ export declare function systemPage(chrome: Chrome, data: {
1082
1059
  */
1083
1060
  export declare function boardBody(data: {
1084
1061
  cards: BoardCard[];
1085
- tracks: Track[];
1086
1062
  done: ReturnType<Store["listCompletedWorkScoped"]>;
1087
1063
  saturated: boolean;
1088
1064
  now: Date;
@@ -1098,33 +1074,6 @@ export declare function boardBody(data: {
1098
1074
  }, ciRed: (pr: number) => boolean): string;
1099
1075
  /** Completed work: one row per done task, its final run and PR attached. */
1100
1076
  export declare function donePage(chrome: Chrome, rows: ReturnType<Store["listCompletedWorkScoped"]>, ciRed: (pr: number) => boolean): Screen;
1101
- /** One routine's board-facing snapshot — the store's routineTracks row. */
1102
- export type Track = {
1103
- routine: Routine;
1104
- fires: ReturnType<Store["routineFires"]>;
1105
- spend: {
1106
- costUsd: number;
1107
- unmeasuredRuns: number;
1108
- totalRuns: number;
1109
- };
1110
- blocker: {
1111
- taskId: string;
1112
- state: string;
1113
- } | null;
1114
- };
1115
- export declare const routineHref: (id: number) => string;
1116
- export declare function routineStatus(routine: Routine): {
1117
- text: string;
1118
- badge: string;
1119
- };
1120
- /**
1121
- * The run-history strip: the last firings as dots, oldest on the left like
1122
- * a CI history. Fired slots wear their instance's fate; skipped slots are
1123
- * hollow — recorded absence, not silence.
1124
- */
1125
- export declare function trackStrip(fires: Track["fires"]): string;
1126
- /** One track row — shared by the board's tracks section and /routines. */
1127
- export declare function trackRow(track: Track, all: boolean): string;
1128
1077
  export declare function chatMoney(microusd: number | null): string;
1129
1078
  export type ChatProjectPulse = {
1130
1079
  id: string;
@@ -1132,13 +1081,16 @@ export type ChatProjectPulse = {
1132
1081
  path: string;
1133
1082
  peek: ProjectPeek | null;
1134
1083
  };
1135
- /** The browser's one-click approval binds not only the signed scope but the
1136
- * exact advisory plan revision and any race terms shown beside it. The scope
1137
- * digest remains the durable authority; this composite makes a stale open
1138
- * tab fail when somebody edits the plan before approval. */
1084
+ /** A ceremony nonce as stored: the sha256 hex of the value the form carried. */
1085
+ export declare function nonceHashOf(value: string): string;
1139
1086
  /** The approve POST's refusal, in words a person can act on. */
1140
1087
  export declare function approveRefusalWords(reason: string): string;
1141
- export declare function approvalFormDigest(scopeDigest: string, raceDigest: string | null, planSha: string | null): string;
1088
+ /** The browser's one-click approval binds not only the signed scope but the
1089
+ * exact advisory plan revision shown beside it. The scope digest remains the
1090
+ * durable authority; this composite makes a stale open tab fail when somebody
1091
+ * edits the plan before approval. The empty middle slot keeps the bytes of
1092
+ * forms already open (it once held other terms, always empty here). */
1093
+ export declare function approvalFormDigest(scopeDigest: string, planSha: string | null): string;
1142
1094
  /** A task attached by the server to one chat turn. The thread remains the
1143
1095
  * unified conversation; this is a focused lens, not a second chat silo. */
1144
1096
  export type TaskChatFocus = {
@@ -1186,7 +1138,6 @@ export type TaskChatFocus = {
1186
1138
  * same panel the task page and /next show inside the ceremony. */
1187
1139
  planContract: PlanContractView | null;
1188
1140
  deliverable: "branch" | "report";
1189
- raceTerms: TournamentTerms | null;
1190
1141
  revision: RevisionView | null;
1191
1142
  coordinator: {
1192
1143
  label: string;
@@ -1565,30 +1516,6 @@ export declare function matePage(chrome: Chrome, data: MateThreadRows & {
1565
1516
  /** The task's result detail (package 3), when the URL opened one. */
1566
1517
  resultPanel?: string | null;
1567
1518
  }): Screen;
1568
- export declare function routinesPage(chrome: Chrome, tracks: Track[], form: {
1569
- csrf: string;
1570
- revision: number;
1571
- problem: string | null;
1572
- values?: URLSearchParams;
1573
- prefill?: {
1574
- name: string;
1575
- goal: string;
1576
- not: string;
1577
- touches: string;
1578
- schedule: string;
1579
- acceptance: string;
1580
- } | null;
1581
- }): Screen;
1582
- export declare function routineScreenPage(chrome: Chrome, data: {
1583
- routine: Routine;
1584
- fires: Track["fires"];
1585
- spend: Track["spend"];
1586
- blocker: Track["blocker"];
1587
- csrf: string;
1588
- nonce: string;
1589
- problem: string | null;
1590
- now: Date;
1591
- }): Screen;
1592
1519
  export declare function homePage(chrome: Chrome, data: {
1593
1520
  csrf: string;
1594
1521
  taskCount: number;
@@ -1601,8 +1528,6 @@ export declare function homePage(chrome: Chrome, data: {
1601
1528
  model: string | null;
1602
1529
  }[];
1603
1530
  runners: Runner[];
1604
- /** v28: open attended sessions per runner. */
1605
- heldSessions?: Map<string, number>;
1606
1531
  worktrees: WorktreeRow[];
1607
1532
  episode: {
1608
1533
  id: number;
@@ -1825,66 +1750,6 @@ export declare function portfolioOverview(data: {
1825
1750
  csrf: string;
1826
1751
  now: Date;
1827
1752
  }): string;
1828
- /** Dollars for a screen: micro-USD stated as money, unknowables in words. */
1829
- export declare function contestDollars(microusd: number): string;
1830
- export declare const CONTEST_STATE_WORDS: Record<string, string>;
1831
- /**
1832
- * The comparison screen: every agent's result side by side — outcome, cost,
1833
- * questions, conclusion, and the verified diff — with a pick button only on
1834
- * results the evidence supports. Plain words throughout: tournament,
1835
- * agents, results. The pick itself happens on a separate confirmation
1836
- * screen whose form this page can only reach through a POST.
1837
- */
1838
- export declare function contestPage(chrome: Chrome, data: {
1839
- view: {
1840
- contest: Contest;
1841
- agents: AgentView[];
1842
- };
1843
- taskId: string;
1844
- taskTitle: string;
1845
- questions: Map<number, number>;
1846
- totalMicrousd: number;
1847
- anyUnknown: boolean;
1848
- rollups: Map<number, {
1849
- costMicrousd: number;
1850
- tokensIn: number;
1851
- tokensOut: number;
1852
- measuredRuns: number;
1853
- totalRuns: number;
1854
- }>;
1855
- diffs: Map<number, TerminalDiffView | null>;
1856
- /** Runs whose lease is still the task's current live claim — "still
1857
- * working" is said only of these; an interrupted agent's unfinished run
1858
- * reads as stopped (round-4 finding 16). */
1859
- liveRuns?: ReadonlySet<number>;
1860
- csrf: string;
1861
- problem: string | null;
1862
- }): Screen;
1863
- /**
1864
- * The confirmation screen a POST minted: it restates, in full, exactly what
1865
- * the password will authorize — the identified result, the money, and the
1866
- * one publication consequence — over a single-use nonce bound to that
1867
- * restatement. If anything shifts underneath before the yes, the pick
1868
- * refuses rather than landing on the moved thing.
1869
- */
1870
- export declare function contestCeremonyPage(chrome: Chrome, data: {
1871
- kind: "pick" | "abandon";
1872
- contestKind: "race" | "comparison";
1873
- contestId: number;
1874
- taskId: string;
1875
- taskTitle: string;
1876
- agents: number;
1877
- totalMicrousd: number;
1878
- anyUnknown: boolean;
1879
- chosen?: AgentView;
1880
- publication?: {
1881
- githubRepo: string;
1882
- branch: string;
1883
- draft: boolean;
1884
- } | null;
1885
- nonceValue: string;
1886
- csrf: string;
1887
- }): Screen;
1888
1753
  export type OnboardCardState = {
1889
1754
  enabled: false;
1890
1755
  why: string;
@@ -2049,7 +1914,7 @@ export type NavRow = {
2049
1914
  * The workspace shell (package 1): three primary rows (chat, work,
2050
1915
  * projects) above two accordion groups. Work tools is where work is
2051
1916
  * arranged, planned, and scheduled — the board, its order view, the
2052
- * flat task list, recipes, routines, the portfolio, and the action
1917
+ * flat task list, recipes, the portfolio, and the action
2053
1918
  * ledger. Settings is who and what the fleet runs on — fleet,
2054
1919
  * requirements, people, operating mode, system — plus the agent-defaults
2055
1920
  * page where the console offers it. Both draw from the same two lists on
@@ -2060,8 +1925,8 @@ export type NavRow = {
2060
1925
  export declare function workToolRows(scoped?: boolean, _offersChat?: boolean, offersCode?: boolean): NavRow[];
2061
1926
  export declare function settingsRows(scoped?: boolean, offersSettings?: boolean): NavRow[];
2062
1927
  /** Which accordion group opens by default for a given active page. */
2063
- export declare const TOOL_KEYS: Set<"activity" | "board" | "caps" | "chat" | "code" | "done" | "fleet" | "flows" | "inbox" | "ledger" | "menu" | "mode" | "none" | "people" | "projects" | "queue" | "recipes" | "review" | "routines" | "runs" | "settings" | "spend" | "system" | "tasks" | "work" | "workbench">;
2064
- export declare const SETTINGS_KEYS: Set<"activity" | "board" | "caps" | "chat" | "code" | "done" | "fleet" | "flows" | "inbox" | "ledger" | "menu" | "mode" | "none" | "people" | "projects" | "queue" | "recipes" | "review" | "routines" | "runs" | "settings" | "spend" | "system" | "tasks" | "work" | "workbench">;
1928
+ export declare const TOOL_KEYS: Set<"activity" | "board" | "caps" | "chat" | "code" | "done" | "fleet" | "flows" | "inbox" | "ledger" | "menu" | "mode" | "none" | "people" | "projects" | "queue" | "recipes" | "review" | "runs" | "settings" | "spend" | "system" | "tasks" | "work" | "workbench">;
1929
+ export declare const SETTINGS_KEYS: Set<"activity" | "board" | "caps" | "chat" | "code" | "done" | "fleet" | "flows" | "inbox" | "ledger" | "menu" | "mode" | "none" | "people" | "projects" | "queue" | "recipes" | "review" | "runs" | "settings" | "spend" | "system" | "tasks" | "work" | "workbench">;
2065
1930
  /** The builds screen's views (reduction pass §1): done, the review queue,
2066
1931
  * and activity are ways of looking at builds, not destinations. */
2067
1932
  export declare function buildsViews(current: "builds" | "done" | "review" | "activity"): string;
@@ -2262,12 +2127,6 @@ export declare function taskBodyParts(data: {
2262
2127
  filedAgo: string | null;
2263
2128
  } | null;
2264
2129
  holds: Hold[];
2265
- contest?: {
2266
- id: number;
2267
- state: string;
2268
- agents: number;
2269
- kind: "race" | "comparison";
2270
- } | null;
2271
2130
  claimed: boolean;
2272
2131
  /** What this task waits for — blockers outside this console's ceiling
2273
2132
  * are named but carry no state and no link. */
@@ -2307,15 +2166,10 @@ export declare function taskBodyParts(data: {
2307
2166
  /** The tracker item this task stands for, when it is external work. */
2308
2167
  mirror?: ExternalMirror | null;
2309
2168
  scope: Scope | null;
2310
- /** Filed race terms (v14) — the approval restates them; one yes covers both. */
2311
- raceTerms?: TournamentTerms | null;
2312
2169
  /** What the approval nonce/digest bind: scope digest, or the joint fingerprint. */
2313
2170
  approvalDigest?: string | null;
2314
2171
  spendDefaults?: {
2315
2172
  buildPerRunMicrousd: number | null;
2316
- racePerAgentMicrousd: number | null;
2317
- raceTotalMicrousd: number | null;
2318
- raceAgents: number | null;
2319
2173
  } | null;
2320
2174
  /** Installation starting value for a task that has no profile yet. */
2321
2175
  permissionDefault?: UnattendedPermissionMode;
@@ -2410,28 +2264,6 @@ export declare function taskBodyParts(data: {
2410
2264
  editPlan?: boolean;
2411
2265
  cancelDraft?: string;
2412
2266
  problem: string | null;
2413
- /** The attended road (Phase 2E): mint offer, or the open authorization. */
2414
- attended?: {
2415
- canMint: boolean;
2416
- /** The mint picker (P1/C7): claude models to choose from, and the
2417
- * permission posture default (escalated when the active mode says so). */
2418
- mint?: {
2419
- models: string[];
2420
- pinnedModel: string;
2421
- posture: "auto" | "acceptEdits" | "bypassPermissions";
2422
- quick: boolean;
2423
- };
2424
- open: {
2425
- id: string;
2426
- state: string;
2427
- expiresAt: string;
2428
- turnsUsed: number;
2429
- cap: number;
2430
- spentMicrousd: number;
2431
- budgetMicrousd: number;
2432
- running: boolean;
2433
- } | null;
2434
- } | null;
2435
2267
  now: Date;
2436
2268
  }): {
2437
2269
  html: string;
@@ -2530,7 +2362,7 @@ export type RankedReviewRow = CompletedWorkRow & {
2530
2362
  assignment?: AssignmentSnapshot | null;
2531
2363
  };
2532
2364
  /** What the cockpit shows of one selected result — a projection of the
2533
- * scope, plan, run, artifact, verdict, contest, and publication records,
2365
+ * scope, plan, run, artifact, verdict, and publication records,
2534
2366
  * each read through the verifier the run page already uses. */
2535
2367
  export type ReviewCockpitView = {
2536
2368
  taskId: string;
@@ -2554,12 +2386,6 @@ export type ReviewCockpitView = {
2554
2386
  sha256: string;
2555
2387
  approach: string | null;
2556
2388
  } | null;
2557
- contest: {
2558
- id: number;
2559
- state: string;
2560
- kind: "race" | "comparison";
2561
- agents: number;
2562
- } | null;
2563
2389
  /** null = the task is done with no finished build attempt on record. */
2564
2390
  run: {
2565
2391
  id: number;
@@ -3084,14 +2910,7 @@ export declare function runPage(chrome: Chrome, run: Run, taskId: string, artifa
3084
2910
  worktree: string;
3085
2911
  } | null, editorToggle?: {
3086
2912
  on: boolean;
3087
- } | null, noted?: boolean, heldTurns?: {
3088
- turns: SessionTurn[];
3089
- open: boolean;
3090
- state: string;
3091
- cap: number;
3092
- } | null, continueOffer?: {
3093
- taskId: string;
3094
- } | null, structuredHandoff?: StructuredHandoffView | null, proofBundle?: ProofBundleView | null, route?: RouteStamp | null, publicationRow?: Publication | null, review?: ReviewFacts | null, result?: {
2913
+ } | null, noted?: boolean, structuredHandoff?: StructuredHandoffView | null, proofBundle?: ProofBundleView | null, route?: RouteStamp | null, publicationRow?: Publication | null, review?: ReviewFacts | null, result?: {
3095
2914
  detail: ResultDetail;
3096
2915
  tab: ResultTab;
3097
2916
  user: string;
@@ -3263,7 +3082,6 @@ export declare function nextPage(chrome: Chrome, data: {
3263
3082
  planDocument: string | null;
3264
3083
  planContract?: PlanContractView | null;
3265
3084
  approvalDigest: string | null;
3266
- raceTerms: TournamentTerms | null;
3267
3085
  /** v34: said inside the ceremony when the yes buys a report, not a branch. */
3268
3086
  deliverable?: "branch" | "report";
3269
3087
  /** v48: the agents the yes freezes — the one block every ceremony shows. */
@@ -3285,8 +3103,6 @@ export declare function decisionOptionForms(decision: Decision, csrf: string, re
3285
3103
  export declare function decisionPage(chrome: Chrome, decision: Decision, taskId: string, artifacts: Artifact[], who: Who, now: Date, returnTo?: string | null): Screen;
3286
3104
  export declare function taskOf(store: Store, decision: Decision): string;
3287
3105
  export declare function form(request: IncomingMessage, cap?: number): Promise<URLSearchParams>;
3288
- /** Attended liveness in words for the task card — reads the durable clock. */
3289
- export declare function attendedWatchWords(lastBeatAt: string | null, now: Date, absoluteExpiry: string): string;
3290
3106
  /** One display line, bounded — turn text is data, never layout. */
3291
3107
  export declare function oneLineOf(text: string, cap: number): string;
3292
3108
  export type SsoIntent = "sign-in" | "reauth" | "link";