@cat-factory/app 0.307.1 → 0.309.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 (255) hide show
  1. package/README.md +21 -0
  2. package/app/assets/css/main.css +22 -0
  3. package/app/assets/css/prose.css +4 -4
  4. package/app/assets/css/type.css +24 -0
  5. package/app/components/assistant/AssistantModal.vue +3 -2
  6. package/app/components/auth/UserMenu.vue +1 -1
  7. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
  8. package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
  9. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  10. package/app/components/board/AddTaskModal.vue +16 -14
  11. package/app/components/board/AgentFailureCard.vue +9 -9
  12. package/app/components/board/AgentFailureHistory.vue +1 -1
  13. package/app/components/board/CreateInitiativeModal.vue +2 -2
  14. package/app/components/board/FailureDetail.vue +1 -1
  15. package/app/components/board/FailureHistoryList.vue +5 -5
  16. package/app/components/board/RecurringPipelineModal.vue +12 -11
  17. package/app/components/board/ReviewFrictionDialog.vue +4 -3
  18. package/app/components/board/StepExecutionHistory.vue +8 -8
  19. package/app/components/board/nodes/AgentChip.vue +1 -1
  20. package/app/components/board/nodes/BlockNode.vue +8 -9
  21. package/app/components/board/nodes/EpicNode.vue +4 -4
  22. package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
  23. package/app/components/board/nodes/InitiativeCard.vue +4 -4
  24. package/app/components/board/nodes/LaneGroup.vue +3 -5
  25. package/app/components/board/nodes/TaskCard.vue +8 -8
  26. package/app/components/board/nodes/TaskLane.vue +3 -3
  27. package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
  28. package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
  29. package/app/components/bootstrap/BootstrapModal.vue +11 -10
  30. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  31. package/app/components/brainstorm/BrainstormWindow.vue +8 -7
  32. package/app/components/bugFishing/BugFishingWindow.vue +37 -36
  33. package/app/components/clarity/ClarityReviewWindow.vue +8 -7
  34. package/app/components/common/AsyncViewError.vue +1 -1
  35. package/app/components/common/ClarificationItem.vue +6 -6
  36. package/app/components/common/DescriptorFields.vue +1 -1
  37. package/app/components/common/EmptyState.vue +1 -1
  38. package/app/components/common/InterviewGateNotice.vue +4 -4
  39. package/app/components/common/MarkdownProse.vue +8 -2
  40. package/app/components/common/SectionLabel.vue +38 -0
  41. package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
  42. package/app/components/context/ContextAttachmentFields.vue +9 -8
  43. package/app/components/docs/DocInterviewWindow.vue +10 -9
  44. package/app/components/documents/ContextDocumentPicker.vue +10 -12
  45. package/app/components/documents/DocumentImportModal.vue +3 -2
  46. package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
  47. package/app/components/documents/DocumentSyncState.vue +1 -1
  48. package/app/components/documents/DocumentTemplatesModal.vue +5 -4
  49. package/app/components/documents/RepoContextDocPicker.vue +3 -6
  50. package/app/components/documents/StartFromDesignModal.vue +4 -4
  51. package/app/components/documents/TaskContextDocs.vue +1 -1
  52. package/app/components/environments/EnvSetupStepper.vue +3 -3
  53. package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
  54. package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
  55. package/app/components/environments/steps/EnvReviewStep.vue +23 -22
  56. package/app/components/environments/steps/EnvSaveStep.vue +5 -5
  57. package/app/components/focus/BlockFocusView.vue +11 -10
  58. package/app/components/followUp/FollowUpWindow.vue +10 -10
  59. package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
  60. package/app/components/foundational/FoundationalContractSummary.vue +2 -2
  61. package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
  62. package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
  63. package/app/components/foundational/FoundationalSuppressions.vue +2 -2
  64. package/app/components/fragments/FragmentLibraryManager.vue +3 -3
  65. package/app/components/fragments/FragmentSelector.vue +10 -11
  66. package/app/components/gates/GateFailingCheckList.vue +3 -3
  67. package/app/components/gates/GateResultView.vue +39 -38
  68. package/app/components/github/AddServiceFromRepoModal.vue +5 -4
  69. package/app/components/github/BranchProtectionPreflight.vue +5 -5
  70. package/app/components/github/GitHubConnect.vue +5 -3
  71. package/app/components/github/GitHubPanel.vue +14 -13
  72. package/app/components/github/RepoTreeBrowser.vue +1 -1
  73. package/app/components/humanTest/HumanTestWindow.vue +18 -17
  74. package/app/components/initiative/InitiativePlanNotice.vue +3 -3
  75. package/app/components/initiative/InitiativePlanReview.vue +19 -21
  76. package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
  77. package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
  78. package/app/components/judge/JudgeResultView.vue +24 -25
  79. package/app/components/kaizen/KaizenPanel.vue +4 -4
  80. package/app/components/kaizen/KaizenStepStatus.vue +7 -6
  81. package/app/components/layout/AccountAuditLog.vue +1 -1
  82. package/app/components/layout/AccountDeploymentSettings.vue +10 -10
  83. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  84. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  85. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  86. package/app/components/layout/AccountModelPolicySettings.vue +7 -7
  87. package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
  88. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  89. package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
  90. package/app/components/layout/AccountSkillSettings.vue +1 -1
  91. package/app/components/layout/AccountTeamSettings.vue +4 -0
  92. package/app/components/layout/AiProvidersBanner.vue +1 -1
  93. package/app/components/layout/AppearanceSwitcher.vue +1 -1
  94. package/app/components/layout/BoardSwitcher.vue +3 -2
  95. package/app/components/layout/BoardToolbar.vue +6 -2
  96. package/app/components/layout/CommandBar.vue +4 -2
  97. package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
  98. package/app/components/layout/IntegrationsHub.vue +4 -3
  99. package/app/components/layout/LanguageSwitcher.vue +1 -1
  100. package/app/components/layout/ModelProvidersHub.vue +6 -4
  101. package/app/components/layout/NotificationsInbox.vue +8 -7
  102. package/app/components/layout/PersonalSetupModal.vue +5 -3
  103. package/app/components/layout/RolePrompt.vue +1 -1
  104. package/app/components/layout/SideBar.vue +3 -5
  105. package/app/components/layout/SpendWarningBanner.vue +3 -3
  106. package/app/components/layout/TranslationWarningBanner.vue +1 -1
  107. package/app/components/layout/UiModeSwitcher.vue +7 -6
  108. package/app/components/layout/UiRoleSwitcher.vue +2 -2
  109. package/app/components/media/ArtifactLightbox.vue +6 -6
  110. package/app/components/media/ImageCompare.vue +16 -16
  111. package/app/components/merge/MergeEffortChips.vue +4 -6
  112. package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
  113. package/app/components/observability/OutcomeFilterChips.vue +1 -1
  114. package/app/components/observability/RunFailureSummary.vue +14 -17
  115. package/app/components/observability/StepMetricsBar.vue +9 -8
  116. package/app/components/observability/StepModelActivity.vue +4 -3
  117. package/app/components/observability/ToolCallList.vue +15 -18
  118. package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
  119. package/app/components/palettes/AgentPalette.vue +7 -5
  120. package/app/components/palettes/AgentTierSelect.vue +1 -1
  121. package/app/components/palettes/PipelinePurposeSelect.vue +2 -1
  122. package/app/components/panels/AgentStepDetail.vue +27 -30
  123. package/app/components/panels/AttemptEntryHeader.vue +2 -2
  124. package/app/components/panels/DecisionModal.vue +1 -1
  125. package/app/components/panels/GenericStructuredResultView.vue +6 -5
  126. package/app/components/panels/InspectorPanel.vue +15 -13
  127. package/app/components/panels/MergerResultView.vue +10 -9
  128. package/app/components/panels/ObservabilityPanel.vue +66 -76
  129. package/app/components/panels/OperatorDashboardPanel.vue +27 -26
  130. package/app/components/panels/ReportsPanel.vue +26 -25
  131. package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
  132. package/app/components/panels/ResultWindowShell.vue +19 -18
  133. package/app/components/panels/RunDetailLoadState.vue +1 -1
  134. package/app/components/panels/StepContainerStatus.vue +8 -7
  135. package/app/components/panels/StepDelegatedStatus.vue +13 -12
  136. package/app/components/panels/StepEffortReport.vue +12 -17
  137. package/app/components/panels/StepFragmentAdherence.vue +9 -10
  138. package/app/components/panels/StepMetadataCard.vue +41 -43
  139. package/app/components/panels/StepReproductionReport.vue +18 -20
  140. package/app/components/panels/StepRunMeta.vue +27 -26
  141. package/app/components/panels/StepTestReport.vue +16 -15
  142. package/app/components/panels/StepToolServers.vue +7 -8
  143. package/app/components/panels/StepValidationReport.vue +5 -5
  144. package/app/components/panels/inspector/ContainerSummary.vue +4 -4
  145. package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
  146. package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
  147. package/app/components/panels/inspector/EpicChildren.vue +8 -7
  148. package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
  149. package/app/components/panels/inspector/FrontendConfig.vue +26 -34
  150. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  151. package/app/components/panels/inspector/InspectorSection.vue +7 -4
  152. package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
  153. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  154. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  155. package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
  156. package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
  157. package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
  158. package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
  159. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  160. package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
  161. package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
  162. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  163. package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
  164. package/app/components/panels/inspector/TaskExecution.vue +13 -12
  165. package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
  166. package/app/components/panels/inspector/TaskStructure.vue +5 -4
  167. package/app/components/pipeline/AgentPromptEditor.vue +15 -14
  168. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
  169. package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
  170. package/app/components/pipeline/GateConfigFields.vue +6 -6
  171. package/app/components/pipeline/IterationCapPrompt.vue +1 -1
  172. package/app/components/pipeline/PipelineBuilder.vue +28 -27
  173. package/app/components/pipeline/PipelineHealthModal.vue +7 -7
  174. package/app/components/pipeline/PipelinePicker.vue +3 -3
  175. package/app/components/pipeline/PipelinePreview.vue +6 -7
  176. package/app/components/pipeline/PipelineProgress.vue +23 -24
  177. package/app/components/prReview/PrReviewWindow.vue +42 -41
  178. package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
  179. package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
  180. package/app/components/providers/ApiKeysSection.vue +7 -6
  181. package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
  182. package/app/components/providers/VendorCredentialsModal.vue +5 -4
  183. package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
  184. package/app/components/ralph/RalphLoopResultView.vue +25 -26
  185. package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
  186. package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
  187. package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
  188. package/app/components/sandbox/SandboxPanel.vue +21 -20
  189. package/app/components/settings/ApiTokensPanel.vue +1 -1
  190. package/app/components/settings/BudgetSettings.vue +18 -17
  191. package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
  192. package/app/components/settings/CloudflareHandlerSection.vue +16 -16
  193. package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
  194. package/app/components/settings/ConnectionTestVerdict.vue +1 -1
  195. package/app/components/settings/ConsensusGroupsSection.vue +21 -20
  196. package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
  197. package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
  198. package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
  199. package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
  200. package/app/components/settings/IssueTrackerPanel.vue +9 -15
  201. package/app/components/settings/KubernetesEngineForm.vue +9 -8
  202. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
  203. package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
  204. package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
  205. package/app/components/settings/MergeClassRulesEditor.vue +6 -5
  206. package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
  207. package/app/components/settings/ModelConfigurationPanel.vue +8 -11
  208. package/app/components/settings/ModelPresetHealthModal.vue +3 -3
  209. package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
  210. package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
  211. package/app/components/settings/PackageRegistriesPanel.vue +4 -4
  212. package/app/components/settings/ProviderConnectionTab.vue +5 -4
  213. package/app/components/settings/ProviderManifestEditor.vue +9 -8
  214. package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
  215. package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
  216. package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
  217. package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
  218. package/app/components/settings/RiskPolicyPanel.vue +11 -13
  219. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
  220. package/app/components/settings/SharedStacksPanel.vue +5 -5
  221. package/app/components/settings/TaskSourceCard.vue +2 -2
  222. package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
  223. package/app/components/settings/ToolServerChecklist.vue +22 -22
  224. package/app/components/settings/UsageSettings.vue +13 -13
  225. package/app/components/settings/UserSecretsSection.vue +4 -3
  226. package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
  227. package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
  228. package/app/components/skills/ReviewSkillQueue.vue +8 -7
  229. package/app/components/skills/SkillLibraryManager.vue +2 -2
  230. package/app/components/slack/SlackPanel.vue +8 -7
  231. package/app/components/spec/ServiceSpecWindow.vue +15 -16
  232. package/app/components/tasks/BugHuntModal.vue +1 -1
  233. package/app/components/tasks/ContextIssuePicker.vue +4 -6
  234. package/app/components/tasks/TaskContextIssues.vue +1 -1
  235. package/app/components/tasks/TaskImportModal.vue +3 -2
  236. package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
  237. package/app/components/testing/TestReportWindow.vue +54 -53
  238. package/app/components/tutorial/TutorialNudge.vue +3 -2
  239. package/app/components/tutorial/TutorialOverlay.vue +3 -2
  240. package/app/components/vcs/GitLabConnect.vue +1 -1
  241. package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
  242. package/app/composables/usePipelineErrorToast.ts +2 -0
  243. package/app/utils/catalog.ts +8 -0
  244. package/app/utils/theme/builtins.ts +7 -1
  245. package/i18n/locales/de.json +6 -3
  246. package/i18n/locales/en.json +6 -3
  247. package/i18n/locales/es.json +6 -3
  248. package/i18n/locales/fr.json +6 -3
  249. package/i18n/locales/he.json +6 -3
  250. package/i18n/locales/it.json +6 -3
  251. package/i18n/locales/ja.json +6 -3
  252. package/i18n/locales/pl.json +6 -3
  253. package/i18n/locales/tr.json +6 -3
  254. package/i18n/locales/uk.json +6 -3
  255. package/package.json +2 -2
@@ -13,6 +13,7 @@ import StepContainerStatus from '~/components/panels/StepContainerStatus.vue'
13
13
  import StepDelegatedStatus from '~/components/panels/StepDelegatedStatus.vue'
14
14
  import CopyButton from '~/components/common/CopyButton.vue'
15
15
  import MarkdownProse from '~/components/common/MarkdownProse.vue'
16
+ import SectionLabel from '~/components/common/SectionLabel.vue'
16
17
 
17
18
  // The step's metadata card body: state/timing/model/run id, the container cold-boot
18
19
  // phase, the live subtask breakdown, the LLM observability rollup, the applied
@@ -182,11 +183,11 @@ async function copyRunId() {
182
183
 
183
184
  <template>
184
185
  <div>
185
- <dl class="grid grid-cols-2 gap-x-6 gap-y-3 text-[13px] sm:grid-cols-3">
186
+ <dl class="grid grid-cols-2 gap-x-6 gap-y-3 text-sm sm:grid-cols-3">
186
187
  <div>
187
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
188
+ <SectionLabel as="dt">
188
189
  {{ t('panels.stepMeta.stateLabel') }}
189
- </dt>
190
+ </SectionLabel>
190
191
  <dd class="mt-0.5 flex items-center gap-1.5 text-default">
191
192
  <UIcon
192
193
  v-if="runFailed && step.state === 'working'"
@@ -199,9 +200,9 @@ async function copyRunId() {
199
200
  </dd>
200
201
  </div>
201
202
  <div>
202
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
203
+ <SectionLabel as="dt">
203
204
  {{ t('panels.stepMeta.duration') }}
204
- </dt>
205
+ </SectionLabel>
205
206
  <dd class="mt-0.5 flex items-center gap-1.5 tabular-nums text-default">
206
207
  <UIcon
207
208
  v-if="isRunning"
@@ -210,55 +211,55 @@ async function copyRunId() {
210
211
  />
211
212
  <span v-if="durationLabel">{{ durationLabel }}</span>
212
213
  <span v-else class="text-dimmed">—</span>
213
- <span v-if="isRunning" class="text-[11px] text-dimmed">{{
214
+ <span v-if="isRunning" class="text-2xs text-dimmed">{{
214
215
  t('panels.stepMeta.elapsed')
215
216
  }}</span>
216
217
  </dd>
217
218
  </div>
218
219
  <div>
219
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
220
+ <SectionLabel as="dt">
220
221
  {{ t('panels.stepMeta.step') }}
221
- </dt>
222
+ </SectionLabel>
222
223
  <dd class="mt-0.5 text-default">
223
224
  {{ t('panels.stepMeta.stepOf', { number: stepNumber, total: totalSteps }) }}
224
225
  </dd>
225
226
  </div>
226
227
  <div>
227
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
228
+ <SectionLabel as="dt">
228
229
  {{ t('panels.stepMeta.started') }}
229
- </dt>
230
+ </SectionLabel>
230
231
  <dd class="mt-0.5 text-toned">{{ formatClock(step.startedAt) ?? '—' }}</dd>
231
232
  </div>
232
233
  <div>
233
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
234
+ <SectionLabel as="dt">
234
235
  {{ t('panels.stepMeta.finished') }}
235
- </dt>
236
+ </SectionLabel>
236
237
  <dd class="mt-0.5 text-toned">{{ formatClock(step.finishedAt) ?? '—' }}</dd>
237
238
  </div>
238
239
  <div>
239
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
240
+ <SectionLabel as="dt">
240
241
  {{ t('panels.stepMeta.model') }}
241
- </dt>
242
+ </SectionLabel>
242
243
  <dd class="mt-0.5 truncate text-toned" :title="step.model">
243
244
  {{ modelLabel ?? t('panels.stepMeta.notRecorded') }}
244
245
  </dd>
245
246
  </div>
246
247
  <div v-if="promptVariant">
247
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
248
+ <SectionLabel as="dt">
248
249
  {{ t('panels.stepMeta.promptVariant') }}
249
- </dt>
250
+ </SectionLabel>
250
251
  <dd class="mt-0.5 truncate text-toned">{{ promptVariant.label }}</dd>
251
- <dd v-if="promptVariant.note" class="mt-0.5 text-[11px] text-app-warning-400/80">
252
+ <dd v-if="promptVariant.note" class="mt-0.5 text-2xs text-app-warning-400/80">
252
253
  {{ promptVariant.note }}
253
254
  </dd>
254
255
  </div>
255
256
  <!-- The run id this step belongs to, surfaced for debugging (copyable). -->
256
257
  <div class="col-span-2 sm:col-span-3">
257
- <dt class="text-[11px] uppercase tracking-wide text-dimmed">
258
+ <SectionLabel as="dt">
258
259
  {{ t('panels.stepMeta.run') }}
259
- </dt>
260
+ </SectionLabel>
260
261
  <dd
261
- class="mt-0.5 cursor-pointer truncate font-mono text-[12px] text-muted hover:text-default"
262
+ class="mt-0.5 cursor-pointer truncate font-mono text-xs text-muted hover:text-default"
262
263
  :title="t('panels.stepMeta.clickToCopy', { id: step.runId ?? instanceId ?? '' })"
263
264
  @click="copyRunId"
264
265
  >
@@ -284,14 +285,14 @@ async function copyRunId() {
284
285
 
285
286
  <!-- live subtask breakdown -->
286
287
  <div v-if="step.subtasks && step.subtasks.total > 0" class="mt-4">
287
- <div class="text-[11px] uppercase tracking-wide text-dimmed">
288
+ <SectionLabel>
288
289
  {{
289
290
  t('panels.stepMeta.subtasks', {
290
291
  completed: step.subtasks.completed,
291
292
  total: step.subtasks.total,
292
293
  })
293
294
  }}
294
- </div>
295
+ </SectionLabel>
295
296
  <div class="mt-1 h-1 overflow-hidden rounded-full bg-accented/60">
296
297
  <div
297
298
  class="h-full rounded-full bg-primary transition-all duration-500"
@@ -304,7 +305,7 @@ async function copyRunId() {
304
305
  <li
305
306
  v-for="(item, idx) in step.subtasks.items"
306
307
  :key="idx"
307
- class="flex items-start gap-1.5 text-[12px]"
308
+ class="flex items-start gap-1.5 text-xs"
308
309
  :class="
309
310
  item.status === 'completed'
310
311
  ? 'text-dimmed line-through'
@@ -335,12 +336,9 @@ async function copyRunId() {
335
336
 
336
337
  <!-- standards (prompt fragments) folded into this step -->
337
338
  <div v-if="step.selectedFragmentIds && step.selectedFragmentIds.length" class="mt-4">
338
- <div
339
- class="text-[11px] uppercase tracking-wide text-dimmed"
340
- :title="t('panels.stepMeta.standardsAppliedHint')"
341
- >
339
+ <SectionLabel :title="t('panels.stepMeta.standardsAppliedHint')">
342
340
  {{ t('panels.stepMeta.standardsApplied') }}
343
- </div>
341
+ </SectionLabel>
344
342
  <div class="mt-1 flex flex-wrap gap-1">
345
343
  <UBadge
346
344
  v-for="id in step.selectedFragmentIds"
@@ -356,28 +354,28 @@ async function copyRunId() {
356
354
 
357
355
  <!-- decision raised on this step -->
358
356
  <div v-if="step.decision" class="mt-4">
359
- <div class="text-[11px] uppercase tracking-wide text-dimmed">
357
+ <SectionLabel>
360
358
  {{ t('panels.stepMeta.decision') }}
361
- </div>
362
- <p class="mt-0.5 text-[13px] text-default">{{ step.decision.question }}</p>
359
+ </SectionLabel>
360
+ <p class="mt-0.5 text-sm text-default">{{ step.decision.question }}</p>
363
361
  <p
364
362
  v-if="step.decision.chosen"
365
- class="mt-0.5 flex items-center gap-1 text-[12px] text-app-success-400"
363
+ class="mt-0.5 flex items-center gap-1 text-xs text-app-success-400"
366
364
  >
367
365
  <UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />
368
366
  {{ step.decision.chosen }}
369
367
  </p>
370
- <p v-else class="mt-0.5 text-[12px] text-app-warning-400">
368
+ <p v-else class="mt-0.5 text-xs text-app-warning-400">
371
369
  {{ t('panels.stepMeta.awaitingChoice') }}
372
370
  </p>
373
371
  </div>
374
372
 
375
373
  <!-- approval gate state -->
376
374
  <div v-if="step.approval" class="mt-4">
377
- <div class="text-[11px] uppercase tracking-wide text-dimmed">
375
+ <SectionLabel>
378
376
  {{ t('panels.stepMeta.approvalGate') }}
379
- </div>
380
- <p class="mt-0.5 text-[13px] text-default">
377
+ </SectionLabel>
378
+ <p class="mt-0.5 text-sm text-default">
381
379
  {{ approvalStatusLabel }}
382
380
  </p>
383
381
  </div>
@@ -385,9 +383,9 @@ async function copyRunId() {
385
383
  <!-- companion verdict + full correction sequence -->
386
384
  <div v-if="companionVerdicts.length" class="mt-4">
387
385
  <div class="flex items-center justify-between">
388
- <span class="text-[11px] uppercase tracking-wide text-dimmed">
386
+ <SectionLabel as="span">
389
387
  {{ t('panels.stepMeta.companionReview') }}
390
- </span>
388
+ </SectionLabel>
391
389
  <!-- The COLOUR is the verdict (`passed`) and the GLYPH is the arithmetic, which are no
392
390
  longer the same fact: a round holding an open `blocker` fails at a rating that cleared
393
391
  its bar, and reading the inequality off `passed` printed "95% < 80%" over the findings
@@ -410,9 +408,9 @@ async function copyRunId() {
410
408
  class="relative rounded-lg border border-default bg-default/60 px-3 py-2"
411
409
  >
412
410
  <CopyButton v-if="v.feedback" :text="v.feedback" class="absolute end-1 top-1" />
413
- <div class="flex items-center gap-2 text-[12px]">
411
+ <div class="flex items-center gap-2 text-xs">
414
412
  <span
415
- class="inline-flex h-4 shrink-0 items-center rounded px-1 font-mono text-[11px] tabular-nums"
413
+ class="inline-flex h-4 shrink-0 items-center rounded-sm px-1 font-mono text-2xs tabular-nums"
416
414
  :class="
417
415
  v.passed
418
416
  ? 'bg-app-success-500/15 text-app-success-300'
@@ -429,7 +427,7 @@ async function copyRunId() {
429
427
  v-if="v.feedback"
430
428
  :text="v.feedback"
431
429
  data-testid="companion-verdict-summary"
432
- class="mt-1.5 pe-6 text-[12px] leading-relaxed text-toned"
430
+ class="mt-1.5 pe-6 text-xs leading-relaxed text-toned"
433
431
  />
434
432
  <ul v-if="findings.length" class="mt-2 space-y-1.5">
435
433
  <li
@@ -448,13 +446,13 @@ async function copyRunId() {
448
446
  </UBadge>
449
447
  <MarkdownProse
450
448
  :text="finding.body"
451
- class="min-w-0 text-[12px] leading-relaxed text-toned"
449
+ class="min-w-0 text-xs leading-relaxed text-toned"
452
450
  />
453
451
  </li>
454
452
  </ul>
455
453
  </li>
456
454
  </ol>
457
- <p v-if="companionVerdicts.length > 1" class="mt-1 text-[11px] text-dimmed">
455
+ <p v-if="companionVerdicts.length > 1" class="mt-1 text-2xs text-dimmed">
458
456
  {{
459
457
  t(
460
458
  'panels.stepMeta.correctionIterations',
@@ -2,6 +2,7 @@
2
2
  import { computed } from 'vue'
3
3
  import type { ReproductionPhaseOutcome, ReproductionReport } from '~/types/reproduction'
4
4
  import { REPRODUCTION_STATUS_KEYS, REPRODUCTION_TREE_KEYS } from '~/utils/reproduction'
5
+ import SectionLabel from '~/components/common/SectionLabel.vue'
5
6
 
6
7
  // The BUGFIX REPRODUCTION PROOF for a step: the declared reproducing check as the
7
8
  // executor-harness ran it against the pre-fix tree and against the final tree, with both captured
@@ -54,15 +55,12 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
54
55
  variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
55
56
  "
56
57
  >
57
- <div
58
- v-if="variant === 'card'"
59
- class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
60
- >
58
+ <SectionLabel v-if="variant === 'card'" class="flex items-center gap-1.5">
61
59
  <UIcon :name="presentation.icon" class="h-3.5 w-3.5" />
62
60
  <span>{{ t('panels.stepDetail.reproduction.heading') }}</span>
63
- </div>
61
+ </SectionLabel>
64
62
 
65
- <p class="text-[11px] text-muted" data-testid="reproduction-verdict">
63
+ <p class="text-2xs text-muted" data-testid="reproduction-verdict">
66
64
  {{ t(presentation.verdict) }}
67
65
  </p>
68
66
 
@@ -72,7 +70,7 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
72
70
  is exactly the inference that gets it wrong. -->
73
71
  <p
74
72
  v-if="report.note"
75
- class="text-[11px] text-app-warning-300"
73
+ class="text-2xs text-app-warning-300"
76
74
  data-testid="reproduction-observation"
77
75
  >
78
76
  {{ report.note }}
@@ -82,19 +80,19 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
82
80
  This is what keeps "could not be reproduced" from looking like "nobody tried". -->
83
81
  <template v-if="report.status === 'declared_infeasible'">
84
82
  <div v-if="report.reason" class="rounded-md border border-default bg-app-950/40 p-2">
85
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
83
+ <SectionLabel as="p">
86
84
  {{ t('panels.stepDetail.reproduction.reason') }}
87
- </p>
88
- <p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">{{ report.reason }}</p>
85
+ </SectionLabel>
86
+ <p class="mt-1 whitespace-pre-wrap text-xs text-toned">{{ report.reason }}</p>
89
87
  </div>
90
88
  <div
91
89
  v-if="report.alternativeVerification"
92
90
  class="rounded-md border border-default bg-app-950/40 p-2"
93
91
  >
94
- <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
92
+ <SectionLabel as="p">
95
93
  {{ t('panels.stepDetail.reproduction.alternative') }}
96
- </p>
97
- <p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">
94
+ </SectionLabel>
95
+ <p class="mt-1 whitespace-pre-wrap text-xs text-toned">
98
96
  {{ report.alternativeVerification }}
99
97
  </p>
100
98
  </div>
@@ -102,17 +100,17 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
102
100
 
103
101
  <template v-else>
104
102
  <div v-if="report.command" class="flex items-baseline gap-2">
105
- <span class="shrink-0 text-[11px] text-dimmed">{{
103
+ <span class="shrink-0 text-2xs text-dimmed">{{
106
104
  t('panels.stepDetail.reproduction.command')
107
105
  }}</span>
108
- <span class="truncate font-mono text-[11px] text-toned">{{ report.command }}</span>
106
+ <span class="truncate font-mono text-2xs text-toned">{{ report.command }}</span>
109
107
  </div>
110
108
 
111
109
  <!-- A dropped path can leave the pre-fix tree without the reproduction, which greens it and
112
110
  reads as "the test does not capture the defect". Stated, never implied. -->
113
111
  <p
114
112
  v-if="report.omittedTestPaths"
115
- class="text-[11px] text-app-warning-300"
113
+ class="text-2xs text-app-warning-300"
116
114
  data-testid="reproduction-omitted-paths"
117
115
  >
118
116
  {{
@@ -142,10 +140,10 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
142
140
  : 'text-app-600'
143
141
  "
144
142
  />
145
- <span class="text-[12px] font-medium text-default">
143
+ <span class="text-xs font-medium text-default">
146
144
  {{ t(phase.label) }}
147
145
  </span>
148
- <span class="ms-auto shrink-0 text-[11px] tabular-nums text-muted">
146
+ <span class="ms-auto shrink-0 text-2xs tabular-nums text-muted">
149
147
  {{
150
148
  phase.outcome ? phaseLabel(phase.outcome) : t('panels.stepDetail.reproduction.notRun')
151
149
  }}
@@ -153,12 +151,12 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
153
151
  </div>
154
152
  <pre
155
153
  v-if="phase.outcome?.outputTail"
156
- class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
154
+ class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-sm bg-app-950 p-2 font-mono text-2xs text-muted"
157
155
  data-testid="reproduction-output"
158
156
  >{{ phase.outcome.outputTail }}</pre>
159
157
  </div>
160
158
 
161
- <p class="text-[11px] text-dimmed">
159
+ <p class="text-2xs text-dimmed">
162
160
  {{
163
161
  t('panels.stepDetail.reproduction.attempts', {
164
162
  attempts: report.attempts,
@@ -3,6 +3,7 @@ import { computed } from 'vue'
3
3
  import type { PipelineStep } from '~/types/execution'
4
4
  import { useStepTimer } from '~/composables/useStepTimer'
5
5
  import StepModelActivity from '~/components/observability/StepModelActivity.vue'
6
+ import SectionLabel from '~/components/common/SectionLabel.vue'
6
7
 
7
8
  // Shared run-metadata + observability block for the step-backed result windows
8
9
  // (the CI/conflicts gate, the tester report). It carries the facts every step has in
@@ -57,26 +58,26 @@ async function copyRunId() {
57
58
  <template>
58
59
  <div class="flex flex-col gap-4">
59
60
  <div v-if="stepNumber && totalSteps">
60
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
61
+ <SectionLabel as="h4" class="mb-1">
61
62
  {{ t('panels.stepMeta.step') }}
62
- </h4>
63
- <p class="text-[12px] text-toned">
63
+ </SectionLabel>
64
+ <p class="text-xs text-toned">
64
65
  {{ t('panels.stepMeta.stepOf', { number: stepNumber, total: totalSteps }) }}
65
66
  </p>
66
67
  </div>
67
68
 
68
69
  <div v-if="durationLabel">
69
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
70
+ <SectionLabel as="h4" class="mb-1">
70
71
  {{ t('panels.stepMeta.duration') }}
71
- </h4>
72
- <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
72
+ </SectionLabel>
73
+ <p class="flex items-center gap-1.5 text-xs tabular-nums text-toned">
73
74
  <UIcon
74
75
  v-if="isRunning"
75
76
  name="i-lucide-loader-circle"
76
77
  class="h-3 w-3 animate-spin text-primary"
77
78
  />
78
79
  {{ durationLabel }}
79
- <span v-if="isRunning" class="text-[11px] text-dimmed">{{
80
+ <span v-if="isRunning" class="text-2xs text-dimmed">{{
80
81
  t('panels.stepMeta.elapsed')
81
82
  }}</span>
82
83
  </p>
@@ -86,54 +87,54 @@ async function copyRunId() {
86
87
  the elapsed clock above — a long, quiet phase keeps this small while elapsed climbs, so a
87
88
  genuinely-active-but-quiet run reads apart from a wedged one. Only while actively running. -->
88
89
  <div v-if="isRunning && activityAgoLabel" data-testid="step-activity">
89
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
90
+ <SectionLabel as="h4" class="mb-1">
90
91
  {{ t('panels.stepMeta.activity') }}
91
- </h4>
92
- <p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
92
+ </SectionLabel>
93
+ <p class="flex items-center gap-1.5 text-xs tabular-nums text-toned">
93
94
  <span class="h-1.5 w-1.5 rounded-full bg-app-success-400" />
94
95
  {{ t('panels.stepMeta.activityAgo', { duration: activityAgoLabel }) }}
95
96
  </p>
96
97
  </div>
97
98
 
98
99
  <div v-if="formatClock(step.startedAt)">
99
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
100
+ <SectionLabel as="h4" class="mb-1">
100
101
  {{ t('panels.stepMeta.started') }}
101
- </h4>
102
- <p class="text-[12px] text-toned">{{ formatClock(step.startedAt) }}</p>
102
+ </SectionLabel>
103
+ <p class="text-xs text-toned">{{ formatClock(step.startedAt) }}</p>
103
104
  </div>
104
105
 
105
106
  <div v-if="formatClock(step.finishedAt)">
106
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
107
+ <SectionLabel as="h4" class="mb-1">
107
108
  {{ t('panels.stepMeta.finished') }}
108
- </h4>
109
- <p class="text-[12px] text-toned">{{ formatClock(step.finishedAt) }}</p>
109
+ </SectionLabel>
110
+ <p class="text-xs text-toned">{{ formatClock(step.finishedAt) }}</p>
110
111
  </div>
111
112
 
112
113
  <div v-if="step.model">
113
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
114
+ <SectionLabel as="h4" class="mb-1">
114
115
  {{ t('panels.stepMeta.model') }}
115
- </h4>
116
- <p class="break-all text-[12px] text-toned" :title="step.model">
116
+ </SectionLabel>
117
+ <p class="break-all text-xs text-toned" :title="step.model">
117
118
  {{ modelLabel ?? step.model }}
118
119
  </p>
119
120
  </div>
120
121
 
121
122
  <div v-if="promptVariant">
122
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
123
+ <SectionLabel as="h4" class="mb-1">
123
124
  {{ t('panels.stepMeta.promptVariant') }}
124
- </h4>
125
- <p class="break-all text-[12px] text-toned">{{ promptVariant.label }}</p>
126
- <p v-if="promptVariant.note" class="mt-0.5 text-[11px] text-app-warning-400/80">
125
+ </SectionLabel>
126
+ <p class="break-all text-xs text-toned">{{ promptVariant.label }}</p>
127
+ <p v-if="promptVariant.note" class="mt-0.5 text-2xs text-app-warning-400/80">
127
128
  {{ promptVariant.note }}
128
129
  </p>
129
130
  </div>
130
131
 
131
132
  <div v-if="runId">
132
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
133
+ <SectionLabel as="h4" class="mb-1">
133
134
  {{ t('panels.stepMeta.run') }}
134
- </h4>
135
+ </SectionLabel>
135
136
  <p
136
- class="cursor-pointer break-all font-mono text-[12px] text-muted hover:text-default"
137
+ class="cursor-pointer break-all font-mono text-xs text-muted hover:text-default"
137
138
  :title="t('panels.stepMeta.clickToCopy', { id: runId })"
138
139
  @click="copyRunId"
139
140
  >
@@ -3,6 +3,7 @@ import type { RequirementVerdictStatus, TestReport } from '~/types/domain'
3
3
  import type { TesterStepState } from '~/types/execution'
4
4
  import { resolveVerdictMeta, type VerdictMeta } from './StepTestReport.logic'
5
5
  import MarkdownProse from '~/components/common/MarkdownProse.vue'
6
+ import SectionLabel from '~/components/common/SectionLabel.vue'
6
7
 
7
8
  // A tester step's latest structured report (what was tested, the per-area outcomes,
8
9
  // the concerns it raised and the greenlight verdict) plus the fixer-loop phase.
@@ -43,17 +44,17 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
43
44
 
44
45
  <template>
45
46
  <section class="mt-4 scroll-mt-4">
46
- <div class="mb-2 flex items-center gap-1.5 text-[11px]">
47
+ <div class="mb-2 flex items-center gap-1.5 text-2xs">
47
48
  <UIcon name="i-lucide-flask-conical" class="h-3.5 w-3.5 text-muted" />
48
- <span class="font-semibold uppercase tracking-wide text-muted">
49
+ <SectionLabel as="span">
49
50
  {{ t('panels.testReport.title') }}
50
- </span>
51
+ </SectionLabel>
51
52
  <UBadge :color="report.greenlight ? 'success' : 'warning'" variant="subtle" size="sm">
52
53
  {{
53
54
  report.greenlight ? t('panels.testReport.greenlit') : t('panels.testReport.needsFixes')
54
55
  }}
55
56
  </UBadge>
56
- <span v-if="phase && phase.attempts > 0" class="text-[11px] text-dimmed">
57
+ <span v-if="phase && phase.attempts > 0" class="text-2xs text-dimmed">
57
58
  {{ t('panels.testReport.fixAttempts', { count: phase.attempts, max: phase.maxAttempts })
58
59
  }}<span v-if="phase.phase === 'fixing'"> {{ t('panels.testReport.fixing') }}</span>
59
60
  </span>
@@ -61,19 +62,19 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
61
62
  <MarkdownProse
62
63
  v-if="report.summary"
63
64
  :text="report.summary"
64
- class="mb-3 text-[13px] leading-relaxed text-toned"
65
+ class="mb-3 text-sm leading-relaxed text-toned"
65
66
  />
66
67
 
67
68
  <div v-if="report.tested.length" class="mb-3">
68
- <div class="mb-1 text-[11px] text-dimmed">{{ t('panels.testReport.tested') }}</div>
69
- <ul class="space-y-0.5 text-[12px] text-toned">
69
+ <div class="mb-1 text-2xs text-dimmed">{{ t('panels.testReport.tested') }}</div>
70
+ <ul class="space-y-0.5 text-xs text-toned">
70
71
  <li v-for="(item, i) in report.tested" :key="i">• {{ item }}</li>
71
72
  </ul>
72
73
  </div>
73
74
 
74
75
  <div v-if="report.outcomes.length" class="mb-3 space-y-1">
75
- <div class="text-[11px] text-dimmed">{{ t('panels.testReport.outcomes') }}</div>
76
- <div v-for="(o, i) in report.outcomes" :key="i" class="flex items-start gap-2 text-[12px]">
76
+ <div class="text-2xs text-dimmed">{{ t('panels.testReport.outcomes') }}</div>
77
+ <div v-for="(o, i) in report.outcomes" :key="i" class="flex items-start gap-2 text-xs">
77
78
  <span
78
79
  class="mt-1 h-2 w-2 shrink-0 rounded-full"
79
80
  :style="{ backgroundColor: OUTCOME_COLOR[o.status] ?? 'var(--ui-text-muted)' }"
@@ -91,20 +92,20 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
91
92
  class="mb-3 space-y-1"
92
93
  data-testid="test-report-requirement-verdicts"
93
94
  >
94
- <div class="text-[11px] text-dimmed">
95
+ <div class="text-2xs text-dimmed">
95
96
  {{ t('panels.testReport.requirementVerdicts.title') }}
96
97
  </div>
97
98
  <div
98
99
  v-for="(verdict, i) in report.requirementVerdicts"
99
100
  :key="i"
100
- class="flex items-start gap-2 text-[12px]"
101
+ class="flex items-start gap-2 text-xs"
101
102
  >
102
103
  <span
103
104
  class="mt-1 h-2 w-2 shrink-0 rounded-full"
104
105
  :style="{ backgroundColor: verdictMeta(verdict.status).color }"
105
106
  />
106
107
  <span class="text-toned">
107
- <span class="font-mono text-[11px] text-muted">{{ verdict.requirementId }}</span>
108
+ <span class="font-mono text-2xs text-muted">{{ verdict.requirementId }}</span>
108
109
  <span class="text-dimmed"> — {{ verdictMeta(verdict.status).label }}</span>
109
110
  <span v-if="verdict.detail" class="text-dimmed"> · {{ verdict.detail }}</span>
110
111
  </span>
@@ -112,15 +113,15 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
112
113
  </div>
113
114
 
114
115
  <div v-if="report.concerns.length" class="space-y-1">
115
- <div class="text-[11px] text-dimmed">{{ t('panels.testReport.concerns') }}</div>
116
+ <div class="text-2xs text-dimmed">{{ t('panels.testReport.concerns') }}</div>
116
117
  <div
117
118
  v-for="(c, i) in report.concerns"
118
119
  :key="i"
119
- class="rounded border border-muted/60 p-2 text-[12px]"
120
+ class="rounded-sm border border-muted/60 p-2 text-xs"
120
121
  >
121
122
  <div class="flex items-center gap-1.5">
122
123
  <span
123
- class="rounded px-1 text-[10px] font-semibold uppercase text-highlighted"
124
+ class="rounded-sm px-1 text-3xs font-semibold uppercase text-highlighted"
124
125
  :style="{ backgroundColor: SEVERITY_COLOR[c.severity] ?? 'var(--ui-text-muted)' }"
125
126
  >{{ c.severity }}</span
126
127
  >
@@ -32,6 +32,7 @@ import {
32
32
  unattributedObservations,
33
33
  } from '~/components/panels/StepToolServers.logic'
34
34
  import { agentKindMeta } from '~/utils/catalog'
35
+ import SectionLabel from '~/components/common/SectionLabel.vue'
35
36
 
36
37
  const props = defineProps<{
37
38
  toolServers: StepToolServers
@@ -109,17 +110,15 @@ const drops = computed(() =>
109
110
  data-testid="step-tool-servers"
110
111
  class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
111
112
  >
112
- <div
113
- class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
114
- >
113
+ <SectionLabel class="mb-2 flex items-center gap-1.5">
115
114
  <UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
116
115
  <span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
117
- </div>
116
+ </SectionLabel>
118
117
 
119
118
  <p
120
119
  v-if="dispatchedAs"
121
120
  data-testid="step-tool-servers-dispatched-as"
122
- class="mb-2 text-[12px] text-muted"
121
+ class="mb-2 text-xs text-muted"
123
122
  >
124
123
  {{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
125
124
  </p>
@@ -130,7 +129,7 @@ const drops = computed(() =>
130
129
  :key="server.id"
131
130
  data-testid="step-tool-server-wired"
132
131
  :data-observed-fault="server.isFault ? 'true' : undefined"
133
- class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[12px]"
132
+ class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-xs"
134
133
  :class="
135
134
  server.isFault
136
135
  ? 'border-app-warning-500/30 bg-app-warning-500/10 text-app-warning-200'
@@ -171,7 +170,7 @@ const drops = computed(() =>
171
170
  v-for="server in unattributed"
172
171
  :key="server.id"
173
172
  data-testid="step-tool-server-unattributed"
174
- class="flex items-start gap-1.5 text-[12px] text-muted"
173
+ class="flex items-start gap-1.5 text-xs text-muted"
175
174
  >
176
175
  <UIcon name="i-lucide-circle-help" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
177
176
  <span>{{
@@ -185,7 +184,7 @@ const drops = computed(() =>
185
184
  v-for="server in drops"
186
185
  :key="server.id"
187
186
  data-testid="step-tool-server-unavailable"
188
- class="flex items-start gap-1.5 text-[12px] text-toned"
187
+ class="flex items-start gap-1.5 text-xs text-toned"
189
188
  >
190
189
  <UIcon
191
190
  name="i-lucide-plug-zap"
@@ -15,7 +15,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
15
15
 
16
16
  <template>
17
17
  <div class="space-y-2" data-testid="step-validation-report">
18
- <p class="text-[11px] text-muted">
18
+ <p class="text-2xs text-muted">
19
19
  {{
20
20
  report.passed
21
21
  ? t('panels.stepDetail.validation.passedSummary', {
@@ -43,11 +43,11 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
43
43
  class="h-3.5 w-3.5 shrink-0"
44
44
  :class="outcome.passed ? 'text-app-success-400' : 'text-app-error-400'"
45
45
  />
46
- <span class="text-[12px] font-medium text-default">{{ outcome.label }}</span>
47
- <span class="truncate font-mono text-[11px] text-dimmed">{{ outcome.command }}</span>
46
+ <span class="text-xs font-medium text-default">{{ outcome.label }}</span>
47
+ <span class="truncate font-mono text-2xs text-dimmed">{{ outcome.command }}</span>
48
48
  <span
49
49
  v-if="!outcome.passed"
50
- class="ms-auto shrink-0 rounded bg-app-error-500/15 px-1.5 py-0.5 text-[11px] tabular-nums text-app-error-300"
50
+ class="ms-auto shrink-0 rounded-sm bg-app-error-500/15 px-1.5 py-0.5 text-2xs tabular-nums text-app-error-300"
51
51
  >
52
52
  {{
53
53
  outcome.timedOut
@@ -58,7 +58,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
58
58
  </div>
59
59
  <pre
60
60
  v-if="outcome.outputTail"
61
- class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
61
+ class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-sm bg-app-950 p-2 font-mono text-2xs text-muted"
62
62
  data-testid="validation-output"
63
63
  >{{ outcome.outputTail }}</pre>
64
64
  </div>