@cat-factory/app 0.302.2 → 0.303.0

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 (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +9 -8
@@ -298,7 +298,7 @@ const { requestClose } = useUnsavedGuard({
298
298
  <ResultWindowShell
299
299
  :open="open"
300
300
  icon="i-lucide-milestone"
301
- icon-class="bg-indigo-500/15 text-indigo-300"
301
+ icon-class="bg-primary/15 text-primary"
302
302
  :title="initiative?.title ?? block?.title ?? t('initiative.tracker.title')"
303
303
  :subtitle="t('initiative.tracker.subtitle')"
304
304
  width="full"
@@ -307,13 +307,13 @@ const { requestClose } = useUnsavedGuard({
307
307
  >
308
308
  <template #header-extras>
309
309
  <div v-if="progress" class="flex items-center gap-2" data-testid="initiative-progress">
310
- <div class="h-1.5 w-24 overflow-hidden rounded-full bg-slate-800">
310
+ <div class="h-1.5 w-24 overflow-hidden rounded-full bg-elevated">
311
311
  <div
312
- class="h-full rounded-full bg-emerald-500 transition-[width] duration-500"
312
+ class="h-full rounded-full bg-app-success-500 transition-[width] duration-500"
313
313
  :style="{ width: `${progressPct}%` }"
314
314
  />
315
315
  </div>
316
- <span class="text-[11px] tabular-nums text-slate-400">
316
+ <span class="text-[11px] tabular-nums text-muted">
317
317
  {{ t('initiative.card.progress', { done: progress.settled, total: progress.total }) }}
318
318
  </span>
319
319
  </div>
@@ -363,7 +363,7 @@ const { requestClose } = useUnsavedGuard({
363
363
  the scroller by the notice's own height. -->
364
364
  <div
365
365
  v-if="!initiative"
366
- class="flex flex-col items-center justify-center gap-2 text-center text-slate-400"
366
+ class="flex flex-col items-center justify-center gap-2 text-center text-muted"
367
367
  :class="planApproval ? 'py-16' : 'h-full'"
368
368
  >
369
369
  <UIcon name="i-lucide-milestone" class="h-8 w-8 opacity-40" />
@@ -376,21 +376,24 @@ const { requestClose } = useUnsavedGuard({
376
376
  then resume (continue) or cancel (stop) the initiative right here. -->
377
377
  <section
378
378
  v-if="pausedAtCheckpoint"
379
- class="mb-4 rounded-lg border border-amber-500/40 bg-amber-500/10 p-3.5"
379
+ class="mb-4 rounded-lg border border-app-warning-500/40 bg-app-warning-500/10 p-3.5"
380
380
  data-testid="initiative-checkpoint-pause"
381
381
  >
382
382
  <div class="flex items-start gap-2.5">
383
- <UIcon name="i-lucide-pause-circle" class="mt-0.5 h-4 w-4 shrink-0 text-amber-300" />
383
+ <UIcon
384
+ name="i-lucide-pause-circle"
385
+ class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-300"
386
+ />
384
387
  <div class="min-w-0 flex-1">
385
- <h3 class="text-[13px] font-semibold text-amber-200">
388
+ <h3 class="text-[13px] font-semibold text-app-warning-200">
386
389
  {{ t('initiative.checkpoint.pausedTitle') }}
387
390
  </h3>
388
- <p class="mt-0.5 text-[12px] leading-relaxed text-amber-100/80">
391
+ <p class="mt-0.5 text-[12px] leading-relaxed text-app-warning-100/80">
389
392
  {{ t('initiative.checkpoint.pausedBody', { phase: checkpointPhase!.title }) }}
390
393
  </p>
391
394
  <div class="mt-2.5 flex flex-wrap gap-2">
392
395
  <button
393
- class="rounded bg-indigo-600 px-2.5 py-1 text-[11px] font-medium text-white hover:bg-indigo-500 disabled:opacity-50"
396
+ class="rounded bg-primary/90 px-2.5 py-1 text-[11px] font-medium text-inverted hover:bg-primary disabled:opacity-50"
394
397
  :disabled="initiatives.controlling"
395
398
  data-testid="initiative-checkpoint-resume"
396
399
  @click="checkpointControl('resume')"
@@ -398,7 +401,7 @@ const { requestClose } = useUnsavedGuard({
398
401
  {{ t('initiative.inspector.resume') }}
399
402
  </button>
400
403
  <button
401
- class="rounded border border-rose-500/50 px-2.5 py-1 text-[11px] font-medium text-rose-300 hover:bg-rose-500/10 disabled:opacity-50"
404
+ class="rounded border border-app-error-500/50 px-2.5 py-1 text-[11px] font-medium text-app-error-300 hover:bg-app-error-500/10 disabled:opacity-50"
402
405
  :disabled="initiatives.controlling"
403
406
  data-testid="initiative-checkpoint-cancel"
404
407
  @click="checkpointControl('cancel')"
@@ -415,34 +418,34 @@ const { requestClose } = useUnsavedGuard({
415
418
  structure that reads better at the full span, but these are paragraphs and bullets
416
419
  of agent-written text that would otherwise run the width of the display. -->
417
420
  <section v-if="initiative.goal" class="mb-4">
418
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
421
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
419
422
  {{ t('initiative.tracker.goal') }}
420
423
  </h3>
421
- <p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-slate-300">
424
+ <p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-toned">
422
425
  {{ initiative.goal }}
423
426
  </p>
424
427
  </section>
425
428
  <section v-if="initiative.constraints?.length" class="mb-4">
426
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
429
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
427
430
  {{ t('initiative.tracker.constraints') }}
428
431
  </h3>
429
- <ul class="max-w-3xl list-inside list-disc text-[13px] text-slate-300">
432
+ <ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
430
433
  <li v-for="(c, i) in initiative.constraints" :key="i">{{ c }}</li>
431
434
  </ul>
432
435
  </section>
433
436
  <section v-if="initiative.nonGoals?.length" class="mb-4">
434
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
437
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
435
438
  {{ t('initiative.tracker.nonGoals') }}
436
439
  </h3>
437
- <ul class="max-w-3xl list-inside list-disc text-[13px] text-slate-300">
440
+ <ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
438
441
  <li v-for="(g, i) in initiative.nonGoals" :key="i">{{ g }}</li>
439
442
  </ul>
440
443
  </section>
441
444
  <section v-if="initiative.analysisSummary" class="mb-4">
442
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
445
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
443
446
  {{ t('initiative.tracker.analysis') }}
444
447
  </h3>
445
- <p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-slate-300">
448
+ <p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-toned">
446
449
  {{ initiative.analysisSummary }}
447
450
  </p>
448
451
  </section>
@@ -450,14 +453,14 @@ const { requestClose } = useUnsavedGuard({
450
453
  <!-- Awaiting planning -->
451
454
  <div
452
455
  v-if="phases.length === 0"
453
- class="mb-4 rounded-lg border border-dashed border-slate-700 p-4 text-center text-[12px] text-slate-400"
456
+ class="mb-4 rounded-lg border border-dashed border-muted p-4 text-center text-[12px] text-muted"
454
457
  >
455
458
  {{ t('initiative.tracker.noPlan') }}
456
459
  </div>
457
460
 
458
461
  <!-- Phases + items -->
459
462
  <section v-for="phase in phases" :key="phase.id" class="mb-5">
460
- <h3 class="mb-1 flex items-center gap-2 text-sm font-semibold text-slate-200">
463
+ <h3 class="mb-1 flex items-center gap-2 text-sm font-semibold text-default">
461
464
  <span>{{ t('initiative.tracker.phase', { title: phase.title }) }}</span>
462
465
  <!-- Checkpoint annotation (D2): this phase pauses the initiative for human review
463
466
  once its items settle. Cleared → already reviewed; the pending one → awaiting
@@ -485,11 +488,11 @@ const { requestClose } = useUnsavedGuard({
485
488
  }}
486
489
  </UBadge>
487
490
  </h3>
488
- <p v-if="phase.goal" class="mb-2 text-[12px] text-slate-400">{{ phase.goal }}</p>
489
- <div class="overflow-x-auto rounded-lg border border-slate-800">
491
+ <p v-if="phase.goal" class="mb-2 text-[12px] text-muted">{{ phase.goal }}</p>
492
+ <div class="overflow-x-auto rounded-lg border border-default">
490
493
  <table class="w-full text-[12px]">
491
494
  <thead>
492
- <tr class="border-b border-slate-800 text-left text-slate-500">
495
+ <tr class="border-b border-default text-left text-dimmed">
493
496
  <th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colItem') }}</th>
494
497
  <th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colStatus') }}</th>
495
498
  <th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colPr') }}</th>
@@ -499,18 +502,21 @@ const { requestClose } = useUnsavedGuard({
499
502
  <tr
500
503
  v-for="item in itemsOf(phase.id)"
501
504
  :key="item.id"
502
- class="border-b border-slate-800/60 last:border-0"
505
+ class="border-b border-default/60 last:border-0"
503
506
  >
504
507
  <td class="px-3 py-2 align-top">
505
- <div class="font-medium text-slate-200">{{ item.title }}</div>
506
- <div v-if="item.dependsOn?.length" class="mt-0.5 text-[10px] text-slate-500">
508
+ <div class="font-medium text-default">{{ item.title }}</div>
509
+ <div v-if="item.dependsOn?.length" class="mt-0.5 text-[10px] text-dimmed">
507
510
  {{
508
511
  t('initiative.tracker.dependsOn', {
509
512
  items: item.dependsOn.join(', '),
510
513
  })
511
514
  }}
512
515
  </div>
513
- <div v-if="item.note" class="mt-0.5 max-w-3xl text-[10px] text-amber-300/80">
516
+ <div
517
+ v-if="item.note"
518
+ class="mt-0.5 max-w-3xl text-[10px] text-app-warning-300/80"
519
+ >
514
520
  {{ item.note }}
515
521
  </div>
516
522
  <div
@@ -519,7 +525,7 @@ const { requestClose } = useUnsavedGuard({
519
525
  >
520
526
  <button
521
527
  v-if="item.status === 'blocked'"
522
- class="rounded border border-slate-700 px-1.5 py-0.5 text-[10px] text-slate-300 hover:bg-slate-800 disabled:opacity-50"
528
+ class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
523
529
  :disabled="initiatives.curating"
524
530
  :data-testid="`initiative-item-retry-${item.id}`"
525
531
  @click="itemAction(item, 'retry')"
@@ -527,7 +533,7 @@ const { requestClose } = useUnsavedGuard({
527
533
  {{ t('initiative.curation.retry') }}
528
534
  </button>
529
535
  <button
530
- class="rounded border border-slate-700 px-1.5 py-0.5 text-[10px] text-slate-300 hover:bg-slate-800 disabled:opacity-50"
536
+ class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
531
537
  :disabled="initiatives.curating"
532
538
  :data-testid="`initiative-item-skip-${item.id}`"
533
539
  @click="itemAction(item, 'skip')"
@@ -551,11 +557,11 @@ const { requestClose } = useUnsavedGuard({
551
557
  :href="item.pr.url"
552
558
  target="_blank"
553
559
  rel="noopener"
554
- class="text-sky-400 hover:underline"
560
+ class="text-app-info-400 hover:underline"
555
561
  >
556
562
  {{ item.pr.number ? `#${item.pr.number}` : t('initiative.tracker.prLink') }}
557
563
  </a>
558
- <span v-else class="text-slate-600">—</span>
564
+ <span v-else class="text-app-600">—</span>
559
565
  </td>
560
566
  </tr>
561
567
  </tbody>
@@ -566,19 +572,19 @@ const { requestClose } = useUnsavedGuard({
566
572
  <!-- Execution policy -->
567
573
  <section v-if="initiative.policy" class="mb-4">
568
574
  <div class="mb-1 flex items-center gap-2">
569
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
575
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
570
576
  {{ t('initiative.tracker.policy') }}
571
577
  </h3>
572
578
  <button
573
579
  v-if="editable && !editingPolicy"
574
- class="rounded border border-slate-700 px-1.5 py-0.5 text-[10px] text-slate-300 hover:bg-slate-800"
580
+ class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated"
575
581
  data-testid="initiative-policy-edit"
576
582
  @click="startEditPolicy"
577
583
  >
578
584
  {{ t('initiative.curation.edit') }}
579
585
  </button>
580
586
  </div>
581
- <ul v-if="!editingPolicy" class="text-[12px] text-slate-300">
587
+ <ul v-if="!editingPolicy" class="text-[12px] text-toned">
582
588
  <li>
583
589
  {{
584
590
  t('initiative.tracker.maxConcurrent', {
@@ -587,39 +593,39 @@ const { requestClose } = useUnsavedGuard({
587
593
  }}
588
594
  </li>
589
595
  <li v-for="(rule, i) in policyRules" :key="i">
590
- <code class="text-sky-300">{{ rule.pipelineId }}</code>
596
+ <code class="text-app-info-300">{{ rule.pipelineId }}</code>
591
597
  · {{ ruleAxes(rule) }}
592
598
  </li>
593
599
  <li>
594
600
  {{ t('initiative.tracker.defaultPipeline') }}
595
- <code class="text-sky-300">{{ initiative.policy.defaultPipelineId }}</code>
601
+ <code class="text-app-info-300">{{ initiative.policy.defaultPipelineId }}</code>
596
602
  </li>
597
603
  </ul>
598
604
  <!-- Edit form: the two scalar knobs; planner-authored rules are preserved. -->
599
- <div v-else class="flex flex-col gap-2 rounded-lg border border-slate-800 p-3">
600
- <label class="flex items-center gap-2 text-[12px] text-slate-300">
605
+ <div v-else class="flex flex-col gap-2 rounded-lg border border-default p-3">
606
+ <label class="flex items-center gap-2 text-[12px] text-toned">
601
607
  <span class="w-40">{{ t('initiative.curation.maxConcurrentField') }}</span>
602
608
  <input
603
609
  v-model.number="policyForm.maxConcurrent"
604
610
  type="number"
605
611
  min="1"
606
612
  max="20"
607
- class="w-20 rounded border border-slate-700 bg-slate-950 px-2 py-1 text-slate-200"
613
+ class="w-20 rounded border border-muted bg-app-950 px-2 py-1 text-default"
608
614
  data-testid="initiative-policy-max-concurrent"
609
615
  />
610
616
  </label>
611
- <label class="flex items-center gap-2 text-[12px] text-slate-300">
617
+ <label class="flex items-center gap-2 text-[12px] text-toned">
612
618
  <span class="w-40">{{ t('initiative.curation.defaultPipelineField') }}</span>
613
619
  <input
614
620
  v-model="policyForm.defaultPipelineId"
615
621
  type="text"
616
- class="flex-1 rounded border border-slate-700 bg-slate-950 px-2 py-1 font-mono text-[11px] text-slate-200"
622
+ class="flex-1 rounded border border-muted bg-app-950 px-2 py-1 font-mono text-[11px] text-default"
617
623
  data-testid="initiative-policy-default-pipeline"
618
624
  />
619
625
  </label>
620
626
  <div class="flex gap-2">
621
627
  <button
622
- class="rounded bg-indigo-600 px-2 py-1 text-[11px] text-white hover:bg-indigo-500 disabled:opacity-50"
628
+ class="rounded bg-primary/90 px-2 py-1 text-[11px] text-inverted hover:bg-primary disabled:opacity-50"
623
629
  :disabled="initiatives.curating"
624
630
  data-testid="initiative-policy-save"
625
631
  @click="savePolicy"
@@ -627,7 +633,7 @@ const { requestClose } = useUnsavedGuard({
627
633
  {{ t('initiative.curation.save') }}
628
634
  </button>
629
635
  <button
630
- class="rounded border border-slate-700 px-2 py-1 text-[11px] text-slate-300 hover:bg-slate-800"
636
+ class="rounded border border-muted px-2 py-1 text-[11px] text-toned hover:bg-elevated"
631
637
  @click="editingPolicy = false"
632
638
  >
633
639
  {{ t('initiative.curation.cancel') }}
@@ -638,43 +644,43 @@ const { requestClose } = useUnsavedGuard({
638
644
 
639
645
  <!-- Logs -->
640
646
  <section v-if="initiative.decisions?.length" class="mb-4">
641
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
647
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
642
648
  {{ t('initiative.tracker.decisions') }}
643
649
  </h3>
644
- <ul class="list-inside list-disc text-[13px] text-slate-300">
650
+ <ul class="list-inside list-disc text-[13px] text-toned">
645
651
  <li v-for="d in initiative.decisions" :key="d.id">
646
652
  <span class="font-medium">{{ d.title }}</span>
647
- <span v-if="d.detail" class="text-slate-400"> — {{ d.detail }}</span>
653
+ <span v-if="d.detail" class="text-muted"> — {{ d.detail }}</span>
648
654
  </li>
649
655
  </ul>
650
656
  </section>
651
657
  <section v-if="initiative.deviations?.length" class="mb-4">
652
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
658
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
653
659
  {{ t('initiative.tracker.deviations') }}
654
660
  </h3>
655
- <ul class="max-w-3xl list-inside list-disc text-[13px] text-slate-300">
661
+ <ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
656
662
  <li v-for="d in initiative.deviations" :key="d.id">
657
- <code v-if="d.itemId" class="text-slate-400">{{ d.itemId }}</code>
663
+ <code v-if="d.itemId" class="text-muted">{{ d.itemId }}</code>
658
664
  {{ d.description }}
659
- <span v-if="d.resolution" class="text-slate-400"> → {{ d.resolution }}</span>
665
+ <span v-if="d.resolution" class="text-muted"> → {{ d.resolution }}</span>
660
666
  </li>
661
667
  </ul>
662
668
  </section>
663
669
  <section v-if="initiative.followUps?.length" class="mb-4">
664
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
670
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
665
671
  {{ t('initiative.tracker.followUps') }}
666
672
  </h3>
667
- <ul class="flex flex-col gap-2 text-[13px] text-slate-300">
673
+ <ul class="flex flex-col gap-2 text-[13px] text-toned">
668
674
  <li
669
675
  v-for="f in initiative.followUps"
670
676
  :key="f.id"
671
- class="rounded-lg border border-slate-800 p-2.5"
677
+ class="rounded-lg border border-default p-2.5"
672
678
  :data-testid="`initiative-followup-${f.id}`"
673
679
  >
674
680
  <div class="flex items-start gap-2">
675
681
  <div class="min-w-0 flex-1">
676
682
  <span class="font-medium">{{ f.title }}</span>
677
- <span v-if="f.detail" class="text-slate-400"> — {{ f.detail }}</span>
683
+ <span v-if="f.detail" class="text-muted"> — {{ f.detail }}</span>
678
684
  </div>
679
685
  <UBadge
680
686
  :color="INITIATIVE_FOLLOWUP_STATUS_CHIPS[f.status]"
@@ -688,10 +694,10 @@ const { requestClose } = useUnsavedGuard({
688
694
  <div v-if="editable && f.status === 'open'" class="mt-2">
689
695
  <div v-if="promotingId === f.id" class="flex flex-col gap-2">
690
696
  <label class="flex items-center gap-2 text-[12px]">
691
- <span class="text-slate-400">{{ t('initiative.curation.phaseField') }}</span>
697
+ <span class="text-muted">{{ t('initiative.curation.phaseField') }}</span>
692
698
  <select
693
699
  v-model="promoteForm.phaseId"
694
- class="flex-1 rounded border border-slate-700 bg-slate-950 px-2 py-1 text-slate-200"
700
+ class="flex-1 rounded border border-muted bg-app-950 px-2 py-1 text-default"
695
701
  data-testid="initiative-promote-phase"
696
702
  >
697
703
  <option v-for="p in phases" :key="p.id" :value="p.id">
@@ -702,13 +708,13 @@ const { requestClose } = useUnsavedGuard({
702
708
  <input
703
709
  v-model="promoteForm.title"
704
710
  type="text"
705
- class="rounded border border-slate-700 bg-slate-950 px-2 py-1 text-[12px] text-slate-200"
711
+ class="rounded border border-muted bg-app-950 px-2 py-1 text-[12px] text-default"
706
712
  :placeholder="t('initiative.curation.itemTitlePlaceholder')"
707
713
  data-testid="initiative-promote-title"
708
714
  />
709
715
  <div class="flex gap-2">
710
716
  <button
711
- class="rounded bg-indigo-600 px-2 py-1 text-[11px] text-white hover:bg-indigo-500 disabled:opacity-50"
717
+ class="rounded bg-primary/90 px-2 py-1 text-[11px] text-inverted hover:bg-primary disabled:opacity-50"
712
718
  :disabled="initiatives.curating || !promoteForm.phaseId"
713
719
  data-testid="initiative-promote-submit"
714
720
  @click="submitPromote(f)"
@@ -716,7 +722,7 @@ const { requestClose } = useUnsavedGuard({
716
722
  {{ t('initiative.curation.promoteConfirm') }}
717
723
  </button>
718
724
  <button
719
- class="rounded border border-slate-700 px-2 py-1 text-[11px] text-slate-300 hover:bg-slate-800"
725
+ class="rounded border border-muted px-2 py-1 text-[11px] text-toned hover:bg-elevated"
720
726
  @click="promotingId = null"
721
727
  >
722
728
  {{ t('initiative.curation.cancel') }}
@@ -725,14 +731,14 @@ const { requestClose } = useUnsavedGuard({
725
731
  </div>
726
732
  <div v-else class="flex gap-1.5">
727
733
  <button
728
- class="rounded border border-slate-700 px-1.5 py-0.5 text-[10px] text-slate-300 hover:bg-slate-800"
734
+ class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated"
729
735
  data-testid="initiative-followup-promote"
730
736
  @click="startPromote(f)"
731
737
  >
732
738
  {{ t('initiative.curation.promote') }}
733
739
  </button>
734
740
  <button
735
- class="rounded border border-slate-700 px-1.5 py-0.5 text-[10px] text-slate-300 hover:bg-slate-800 disabled:opacity-50"
741
+ class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
736
742
  :disabled="initiatives.curating"
737
743
  data-testid="initiative-followup-dismiss"
738
744
  @click="dismissFollowUp(f)"
@@ -745,10 +751,10 @@ const { requestClose } = useUnsavedGuard({
745
751
  </ul>
746
752
  </section>
747
753
  <section v-if="initiative.caveats?.length" class="mb-4">
748
- <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
754
+ <h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
749
755
  {{ t('initiative.tracker.caveats') }}
750
756
  </h3>
751
- <ul class="max-w-3xl list-inside list-disc text-[13px] text-slate-300">
757
+ <ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
752
758
  <li v-for="(c, i) in initiative.caveats" :key="i">{{ c }}</li>
753
759
  </ul>
754
760
  </section>
@@ -762,7 +768,7 @@ const { requestClose } = useUnsavedGuard({
762
768
  <aside
763
769
  v-if="runMeta"
764
770
  data-testid="initiative-tracker-run-meta"
765
- class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-slate-800 bg-slate-900/50 px-4 py-4 lg:flex"
771
+ class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-default bg-default/50 px-4 py-4 lg:flex"
766
772
  >
767
773
  <StepRunMeta v-bind="runMeta" />
768
774
  </aside>
@@ -126,9 +126,7 @@ async function resolve(choice: 'recheck' | 'proceed') {
126
126
  <div
127
127
  class="rounded-lg border p-3"
128
128
  :class="
129
- blocking
130
- ? 'border-amber-300 bg-amber-50 dark:border-amber-800 dark:bg-amber-950/40'
131
- : 'border-default bg-elevated/40'
129
+ blocking ? 'border-app-warning-800 bg-app-warning-950/40' : 'border-default bg-elevated/40'
132
130
  "
133
131
  :data-tone="tone"
134
132
  data-testid="input-gate-notice"
@@ -137,7 +135,7 @@ async function resolve(choice: 'recheck' | 'proceed') {
137
135
  <UIcon
138
136
  :name="blocking ? 'i-lucide-file-question' : 'i-lucide-info'"
139
137
  class="mt-0.5 size-4 shrink-0"
140
- :class="blocking ? 'text-amber-600 dark:text-amber-400' : 'text-muted'"
138
+ :class="blocking ? 'text-app-warning-400' : 'text-muted'"
141
139
  />
142
140
  <div class="min-w-0 flex-1">
143
141
  <p class="text-sm font-medium">{{ t(copy.title) }}</p>
@@ -84,10 +84,10 @@ const SEVERITY_LABELS = computed<Record<JudgeFinding['severity'], string>>(() =>
84
84
  }))
85
85
 
86
86
  const SEVERITY_CLASSES: Record<JudgeFinding['severity'], string> = {
87
- low: 'border-slate-700 text-slate-300',
88
- medium: 'border-amber-500/40 text-amber-300',
89
- high: 'border-orange-500/40 text-orange-300',
90
- critical: 'border-rose-500/40 text-rose-300',
87
+ low: 'border-muted text-toned',
88
+ medium: 'border-app-warning-500/40 text-app-warning-300',
89
+ high: 'border-app-hue-orange/40 text-app-hue-orange',
90
+ critical: 'border-app-error-500/40 text-app-error-300',
91
91
  }
92
92
 
93
93
  const DISPOSITION_LABELS = computed<
@@ -128,7 +128,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
128
128
  <ResultWindowShell
129
129
  :open="open"
130
130
  :icon="meta.icon"
131
- icon-class="bg-amber-500/15 text-amber-300"
131
+ icon-class="bg-app-warning-500/15 text-app-warning-300"
132
132
  :title="headerTitle"
133
133
  :subtitle="t('judge.subtitle')"
134
134
  :step-ref="{ instanceId, stepIndex }"
@@ -150,7 +150,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
150
150
  <div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
151
151
  <div
152
152
  v-if="!judge"
153
- class="flex h-full flex-col items-center justify-center gap-2 text-center text-slate-400"
153
+ class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
154
154
  >
155
155
  <UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
156
156
  <p class="text-sm">{{ t('judge.empty') }}</p>
@@ -159,26 +159,26 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
159
159
  <template v-else>
160
160
  <!-- The score against the task's threshold — the whole verdict in one line. -->
161
161
  <div
162
- class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-slate-800 bg-slate-950/40 px-3 py-2.5"
162
+ class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-default bg-app-950/40 px-3 py-2.5"
163
163
  data-testid="judge-score"
164
164
  >
165
- <span class="text-[13px] font-semibold text-slate-100">
165
+ <span class="text-[13px] font-semibold text-app-100">
166
166
  {{ score === null ? t('judge.notScored') : n(score, 'percent') }}
167
167
  </span>
168
168
  <span
169
169
  v-if="threshold !== null"
170
- class="text-[12px] text-slate-400"
170
+ class="text-[12px] text-muted"
171
171
  :title="t('judge.thresholdHint')"
172
172
  >
173
173
  {{ t('judge.threshold', { threshold: n(threshold, 'percent') }) }}
174
174
  </span>
175
- <span v-if="judge.disposition" class="text-[12px] text-slate-400">
175
+ <span v-if="judge.disposition" class="text-[12px] text-muted">
176
176
  · {{ DISPOSITION_LABELS[judge.disposition] }}
177
177
  </span>
178
- <span v-if="judge.rubricOverridden" class="text-[11px] text-violet-300">
178
+ <span v-if="judge.rubricOverridden" class="text-[11px] text-app-secondary-300">
179
179
  · {{ t('judge.rubricOverridden') }}
180
180
  </span>
181
- <span v-if="(judge.maxBounces ?? 0) > 0" class="text-[11px] text-slate-500">
181
+ <span v-if="(judge.maxBounces ?? 0) > 0" class="text-[11px] text-dimmed">
182
182
  ·
183
183
  {{ t('judge.reworkRounds', { spent: judge.bounces ?? 0, budget: judge.maxBounces }) }}
184
184
  </span>
@@ -189,7 +189,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
189
189
  name doesn't, and being overridden by the task's own choice is the normal outcome. -->
190
190
  <p
191
191
  v-if="judge.modelPin?.status === 'unavailable'"
192
- class="mt-2 rounded-md border border-amber-500/30 bg-amber-500/5 px-3 py-2 text-[12px] leading-relaxed text-amber-200"
192
+ class="mt-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-[12px] leading-relaxed text-app-warning-200"
193
193
  data-testid="judge-model-pin"
194
194
  >
195
195
  {{ t('judge.modelPinUnavailable', { model: judge.modelPin.requested }) }}
@@ -199,7 +199,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
199
199
  like a clean pass. -->
200
200
  <p
201
201
  v-if="judge.note"
202
- class="mt-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2 text-[12px] leading-relaxed text-slate-400"
202
+ class="mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2 text-[12px] leading-relaxed text-muted"
203
203
  >
204
204
  {{ judge.note }}
205
205
  </p>
@@ -210,19 +210,19 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
210
210
  <CopyButton :text="verdict.summary" class="absolute end-1 top-1" />
211
211
  <MarkdownProse
212
212
  :text="verdict.summary"
213
- class="pe-8 text-[13px] leading-relaxed text-slate-200"
213
+ class="pe-8 text-[13px] leading-relaxed text-default"
214
214
  />
215
215
  </div>
216
216
 
217
217
  <section v-if="findings.length" class="mt-4">
218
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
218
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
219
219
  {{ t('judge.findingsHeading') }}
220
220
  </h3>
221
221
  <ul class="flex flex-col gap-2">
222
222
  <li
223
223
  v-for="(finding, i) in findings"
224
224
  :key="`${finding.title}-${i}`"
225
- class="rounded-md border border-slate-800 bg-slate-950/40 px-3 py-2"
225
+ class="rounded-md border border-default bg-app-950/40 px-3 py-2"
226
226
  data-testid="judge-finding"
227
227
  >
228
228
  <div class="flex flex-wrap items-center gap-2">
@@ -232,15 +232,15 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
232
232
  >
233
233
  {{ SEVERITY_LABELS[finding.severity] }}
234
234
  </span>
235
- <span class="text-[13px] font-medium text-slate-100">{{ finding.title }}</span>
236
- <code v-if="finding.where" class="text-[11px] text-slate-500">{{
235
+ <span class="text-[13px] font-medium text-app-100">{{ finding.title }}</span>
236
+ <code v-if="finding.where" class="text-[11px] text-dimmed">{{
237
237
  finding.where
238
238
  }}</code>
239
239
  </div>
240
240
  <MarkdownProse
241
241
  v-if="finding.detail"
242
242
  :text="finding.detail"
243
- class="mt-1 text-[12px] leading-relaxed text-slate-400"
243
+ class="mt-1 text-[12px] leading-relaxed text-muted"
244
244
  />
245
245
  </li>
246
246
  </ul>
@@ -248,10 +248,10 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
248
248
 
249
249
  <!-- The decision. Only shown while the run is actually parked on this verdict. -->
250
250
  <section v-if="awaiting" class="mt-5" data-testid="judge-decision">
251
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
251
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
252
252
  {{ t('judge.decisionHeading') }}
253
253
  </h3>
254
- <p class="mb-2 text-[11px] leading-relaxed text-slate-500">
254
+ <p class="mb-2 text-[11px] leading-relaxed text-dimmed">
255
255
  {{ t('judge.decisionDescription') }}
256
256
  </p>
257
257
  <textarea
@@ -259,9 +259,9 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
259
259
  rows="3"
260
260
  :disabled="busy"
261
261
  :placeholder="t('judge.feedbackPlaceholder')"
262
- class="w-full resize-y rounded-md border border-slate-800 bg-slate-950/60 px-3 py-2 text-[13px] text-slate-200 placeholder:text-slate-600 focus:border-amber-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-amber-500/60"
262
+ class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-warning-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-warning-500/60"
263
263
  />
264
- <p v-if="judgeStore.error" class="mt-2 text-[12px] text-rose-300">
264
+ <p v-if="judgeStore.error" class="mt-2 text-[12px] text-app-error-300">
265
265
  {{ judgeStore.error }}
266
266
  </p>
267
267
  <div class="mt-2 flex flex-wrap justify-end gap-2">
@@ -307,23 +307,21 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
307
307
 
308
308
  <!-- The round history: a looping judge must not be a black box (the gate-attempt rule). -->
309
309
  <section v-if="rounds.length > 1" class="mt-5">
310
- <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
310
+ <h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
311
311
  {{ t('judge.roundsHeading') }}
312
312
  </h3>
313
313
  <ul class="flex flex-col gap-1.5">
314
314
  <li
315
315
  v-for="round in rounds"
316
316
  :key="round.round"
317
- class="flex flex-wrap items-center gap-2 rounded-md border border-slate-800 bg-slate-950/40 px-3 py-1.5 text-[12px] text-slate-300"
317
+ class="flex flex-wrap items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-1.5 text-[12px] text-toned"
318
318
  data-testid="judge-round"
319
319
  :data-round-disposition="round.disposition"
320
320
  >
321
- <span class="text-slate-500">{{ t('judge.round', { round: round.round }) }}</span>
322
- <span class="font-medium text-slate-100">{{
323
- n(round.verdict.score, 'percent')
324
- }}</span>
325
- <span class="text-slate-400">{{ DISPOSITION_LABELS[round.disposition] }}</span>
326
- <code v-if="round.model" class="text-[11px] text-slate-500">{{ round.model }}</code>
321
+ <span class="text-dimmed">{{ t('judge.round', { round: round.round }) }}</span>
322
+ <span class="font-medium text-app-100">{{ n(round.verdict.score, 'percent') }}</span>
323
+ <span class="text-muted">{{ DISPOSITION_LABELS[round.disposition] }}</span>
324
+ <code v-if="round.model" class="text-[11px] text-dimmed">{{ round.model }}</code>
327
325
  </li>
328
326
  </ul>
329
327
  </section>