coding-agent-harness 1.0.8 → 1.1.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 (232) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/CONTRIBUTING.md +8 -4
  3. package/README.md +12 -2
  4. package/README.zh-CN.md +10 -2
  5. package/SKILL.md +14 -3
  6. package/dist/build-dist.mjs +19 -6
  7. package/dist/check-dist-observation.mjs +57 -29
  8. package/dist/check-harness.mjs +0 -1
  9. package/dist/check-import-graph.mjs +44 -27
  10. package/dist/check-lite-forbidden-surfaces.mjs +121 -0
  11. package/dist/check-no-ts-nocheck.mjs +7 -7
  12. package/dist/check-runtime-emit.mjs +10 -3
  13. package/dist/check-type-boundaries.mjs +51 -9
  14. package/dist/commands/dashboard-command.mjs +52 -14
  15. package/dist/commands/migration-command.mjs +18 -8
  16. package/dist/commands/module-command.mjs +142 -0
  17. package/dist/commands/preset-command.mjs +51 -12
  18. package/dist/commands/registry.mjs +483 -0
  19. package/dist/commands/task-command.mjs +109 -52
  20. package/dist/harness.mjs +6 -304
  21. package/dist/lib/capability-registry.mjs +229 -53
  22. package/dist/lib/check-module-parallel.mjs +1 -6
  23. package/dist/lib/check-profiles.mjs +39 -46
  24. package/dist/lib/check-task-contracts.mjs +6 -4
  25. package/dist/lib/command-registry.mjs +248 -0
  26. package/dist/lib/core-shared.mjs +78 -3
  27. package/dist/lib/dashboard-data.mjs +203 -22
  28. package/dist/lib/dashboard-workbench.mjs +245 -21
  29. package/dist/lib/dashboard-writer.mjs +4 -1
  30. package/dist/lib/git-status-summary.mjs +0 -1
  31. package/dist/lib/governance-index-generator.mjs +7 -5
  32. package/dist/lib/governance-sync.mjs +46 -121
  33. package/dist/lib/governance-table-boundary.mjs +1 -14
  34. package/dist/lib/harness-core.mjs +4 -1
  35. package/dist/lib/harness-paths.mjs +115 -1
  36. package/dist/lib/impact-classifier.mjs +420 -0
  37. package/dist/lib/lesson-maintenance.mjs +1 -2
  38. package/dist/lib/markdown-utils.mjs +50 -1
  39. package/dist/lib/migration-planner.mjs +31 -16
  40. package/dist/lib/migration-support.mjs +5 -4
  41. package/dist/lib/module-registry.mjs +296 -0
  42. package/dist/lib/preset-audit-contracts.mjs +24 -1
  43. package/dist/lib/preset-engine.mjs +67 -29
  44. package/dist/lib/preset-registry.mjs +361 -71
  45. package/dist/lib/preset-runner.mjs +292 -26
  46. package/dist/lib/review-confirm-git-gate.mjs +73 -19
  47. package/dist/lib/status-builder.mjs +23 -8
  48. package/dist/lib/structure-migration.mjs +6 -4
  49. package/dist/lib/subagent-authorization-audit.mjs +8 -2
  50. package/dist/lib/task-archive-eligibility.mjs +65 -0
  51. package/dist/lib/task-audit-metadata.mjs +25 -11
  52. package/dist/lib/task-audit-migration.mjs +21 -14
  53. package/dist/lib/task-discovery-contract.mjs +32 -0
  54. package/dist/lib/task-index.mjs +3 -2
  55. package/dist/lib/task-lesson-candidates.mjs +1 -2
  56. package/dist/lib/task-lesson-sedimentation.mjs +310 -9
  57. package/dist/lib/task-lifecycle/create-task-helpers.mjs +6 -3
  58. package/dist/lib/task-lifecycle/phase-sync.mjs +0 -1
  59. package/dist/lib/task-lifecycle/preset-interop.mjs +16 -0
  60. package/dist/lib/task-lifecycle/review-confirm.mjs +34 -2
  61. package/dist/lib/task-lifecycle/review-gates.mjs +12 -5
  62. package/dist/lib/task-lifecycle/review-submission.mjs +1 -2
  63. package/dist/lib/task-lifecycle/scaffold-provenance.mjs +0 -1
  64. package/dist/lib/task-lifecycle/template-files.mjs +2 -5
  65. package/dist/lib/task-lifecycle.mjs +116 -160
  66. package/dist/lib/task-metadata.mjs +10 -5
  67. package/dist/lib/task-preset-contract-drift.mjs +45 -0
  68. package/dist/lib/task-repository.mjs +192 -0
  69. package/dist/lib/task-review-model.mjs +36 -17
  70. package/dist/lib/task-scanner.mjs +74 -23
  71. package/dist/lib/task-template-materials.mjs +131 -0
  72. package/dist/lib/task-tombstone-commands.mjs +186 -29
  73. package/dist/lib/types/check-profiles.js +1 -0
  74. package/dist/lib/types/impact.js +1 -0
  75. package/dist/lib/types/preset.js +1 -0
  76. package/dist/lib/types/task-lifecycle.js +1 -0
  77. package/dist/lib/types/task-scanner.js +1 -0
  78. package/dist/postinstall.mjs +2 -2
  79. package/dist/run-built-tests.mjs +10 -3
  80. package/docs-release/README.md +1 -0
  81. package/docs-release/architecture/document-contract-kernel/README.md +150 -0
  82. package/docs-release/architecture/document-contract-kernel/products/full-skill-overlay.md +29 -0
  83. package/docs-release/architecture/document-contract-kernel/products/lite-forbidden-surfaces.txt +26 -0
  84. package/docs-release/architecture/document-contract-kernel/products/lite-skill-overlay.md +37 -0
  85. package/docs-release/architecture/overview.md +2 -2
  86. package/docs-release/architecture/overview.zh-CN.md +2 -2
  87. package/docs-release/architecture/system-explainer/01-system-overview.md +11 -7
  88. package/docs-release/architecture/system-explainer/02-module-dependency.md +4 -4
  89. package/docs-release/architecture/system-explainer/03-task-lifecycle.md +17 -12
  90. package/docs-release/architecture/system-explainer/05-data-flow.md +6 -6
  91. package/docs-release/architecture/system-explainer/06-preset-and-migration.md +2 -2
  92. package/docs-release/architecture/system-explainer/README.md +1 -1
  93. package/docs-release/architecture/system-explainer/en-US/01-system-overview.md +12 -8
  94. package/docs-release/architecture/system-explainer/en-US/02-module-dependency.md +5 -5
  95. package/docs-release/architecture/system-explainer/en-US/03-task-lifecycle.md +19 -11
  96. package/docs-release/architecture/system-explainer/en-US/05-data-flow.md +5 -5
  97. package/docs-release/architecture/system-explainer/en-US/06-preset-and-migration.md +2 -2
  98. package/docs-release/architecture/system-explainer/en-US/README.md +1 -1
  99. package/docs-release/guides/agent-installation.en-US.md +4 -6
  100. package/docs-release/guides/agent-installation.md +11 -8
  101. package/docs-release/guides/contributing.md +10 -3
  102. package/docs-release/guides/contributing.zh-CN.md +10 -3
  103. package/docs-release/guides/legacy-migration-agent-prompt.md +1 -1
  104. package/docs-release/guides/legacy-migration-agent-prompt.zh-CN.md +1 -1
  105. package/docs-release/guides/migration-playbook.en-US.md +9 -6
  106. package/docs-release/guides/migration-playbook.md +9 -6
  107. package/docs-release/guides/preset-development.md +68 -2
  108. package/docs-release/guides/task-state-machine.en-US.md +8 -8
  109. package/docs-release/guides/task-state-machine.md +7 -7
  110. package/docs-release/guides/typescript-runtime-migration-closeout.md +17 -13
  111. package/package.json +16 -12
  112. package/postinstall.mjs +37 -0
  113. package/presets/legacy-migration/preset.yaml +5 -5
  114. package/presets/legacy-migration/templates/execution_strategy.append.md +1 -1
  115. package/presets/lesson-sedimentation/preset.yaml +3 -3
  116. package/presets/module/preset.yaml +2 -2
  117. package/presets/module/templates/execution_strategy.append.md +1 -1
  118. package/presets/module/templates/task_plan.append.md +3 -3
  119. package/presets/release-closeout/checks/check-release-package.mjs +6 -1
  120. package/presets/release-closeout/preset.yaml +9 -9
  121. package/presets/release-closeout/scripts/generate-release-package.mjs +387 -25
  122. package/presets/release-closeout/templates/task_plan.append.md +5 -5
  123. package/presets/standard-task/preset.yaml +2 -2
  124. package/references/agents-md-pattern.md +23 -17
  125. package/references/lessons-governance.md +2 -2
  126. package/references/module-parallel-standard.md +3 -6
  127. package/references/ssot-governance.md +2 -2
  128. package/references/taskr-gap-analysis.md +3 -3
  129. package/run-dist.mjs +34 -0
  130. package/skills/preset-creator/SKILL.md +40 -8
  131. package/skills/preset-creator/references/complex-task-skeleton/brief.md +32 -8
  132. package/skills/preset-creator/references/preset-package-skeleton.md +15 -5
  133. package/skills/preset-creator/references/structure-aware-paths.md +112 -0
  134. package/templates/AGENTS.md.template +28 -26
  135. package/templates/architecture/README.md +2 -2
  136. package/templates/architecture/service-catalog.md +2 -2
  137. package/templates/architecture/services/service-template.md +1 -1
  138. package/templates/dashboard/assets/app-src/00-state.js +5 -1
  139. package/templates/dashboard/assets/app-src/10-router.js +7 -0
  140. package/templates/dashboard/assets/app-src/20-overview.js +8 -8
  141. package/templates/dashboard/assets/app-src/30-tasks.js +132 -40
  142. package/templates/dashboard/assets/app-src/32-task-swimlane.js +314 -0
  143. package/templates/dashboard/assets/app-src/35-task-detail.js +35 -5
  144. package/templates/dashboard/assets/app-src/40-modules.js +257 -41
  145. package/templates/dashboard/assets/app-src/45-review.js +127 -1
  146. package/templates/dashboard/assets/app-src/90-bindings.js +185 -2
  147. package/templates/dashboard/assets/app.css +928 -53
  148. package/templates/dashboard/assets/app.css.manifest.json +2 -0
  149. package/templates/dashboard/assets/app.js +1071 -98
  150. package/templates/dashboard/assets/app.manifest.json +1 -0
  151. package/templates/dashboard/assets/css-src/00-foundation.css +12 -6
  152. package/templates/dashboard/assets/css-src/10-panels-flow.css +2 -2
  153. package/templates/dashboard/assets/css-src/30-task-index.css +21 -13
  154. package/templates/dashboard/assets/css-src/31-archive.css +94 -0
  155. package/templates/dashboard/assets/css-src/32-task-swimlane.css +487 -0
  156. package/templates/dashboard/assets/css-src/35-review-workspace.css +78 -0
  157. package/templates/dashboard/assets/css-src/40-detail-modules-migration.css +191 -14
  158. package/templates/dashboard/assets/css-src/50-responsive-overrides.css +23 -0
  159. package/templates/dashboard/assets/i18n.js +166 -2
  160. package/templates/development/README.md +9 -9
  161. package/templates/development/cross-repo-debugging.md +3 -3
  162. package/templates/development/external-context/service-template.md +1 -1
  163. package/templates/development/external-source-packs/README.md +2 -2
  164. package/templates/integrations/README.md +4 -4
  165. package/templates/integrations/api-contract.md +1 -1
  166. package/templates/integrations/event-contract.md +1 -1
  167. package/templates/integrations/third-party/vendor-template.md +1 -1
  168. package/templates/integrations/webhook-contract.md +1 -1
  169. package/templates/ledger/Harness-Ledger.md +1 -1
  170. package/templates/modules/module_brief.md +50 -0
  171. package/templates/modules/module_plan.md +49 -0
  172. package/templates/modules/registry_view.md +9 -0
  173. package/templates/modules/session_prompt_pack.md +55 -0
  174. package/templates/planning/brief.md +32 -8
  175. package/templates/planning/module_brief.md +28 -3
  176. package/templates/planning/module_plan.md +26 -11
  177. package/templates/planning/module_session_prompt.md +11 -2
  178. package/templates/planning/optional/slices/_slice-template/brief.md +28 -0
  179. package/templates/planning/review.md +1 -1
  180. package/templates/planning/visual_map.md +1 -1
  181. package/templates/reference/docs-library-standard.md +7 -7
  182. package/templates/reference/execution-workflow-standard.md +13 -0
  183. package/templates/reference/external-source-intake-standard.md +10 -10
  184. package/templates/reference/repo-governance-standard.md +1 -1
  185. package/templates/reference/review-routing-standard.md +4 -0
  186. package/templates/ssot/Module-Registry.md +4 -38
  187. package/templates/walkthrough/walkthrough-template.md +1 -1
  188. package/templates-zh-CN/AGENTS.md.template +27 -25
  189. package/templates-zh-CN/CLAUDE.md.template +1 -1
  190. package/templates-zh-CN/architecture/README.md +2 -2
  191. package/templates-zh-CN/architecture/service-catalog.md +2 -2
  192. package/templates-zh-CN/architecture/services/service-template.md +1 -1
  193. package/templates-zh-CN/development/README.md +9 -9
  194. package/templates-zh-CN/development/cross-repo-debugging.md +3 -3
  195. package/templates-zh-CN/development/external-context/service-template.md +1 -1
  196. package/templates-zh-CN/development/external-source-packs/README.md +2 -2
  197. package/templates-zh-CN/integrations/README.md +4 -4
  198. package/templates-zh-CN/integrations/api-contract.md +1 -1
  199. package/templates-zh-CN/integrations/event-contract.md +1 -1
  200. package/templates-zh-CN/integrations/third-party/vendor-template.md +1 -1
  201. package/templates-zh-CN/integrations/webhook-contract.md +1 -1
  202. package/templates-zh-CN/ledger/Harness-Ledger.md +1 -1
  203. package/templates-zh-CN/lessons/lesson-arch-process-change.md +1 -1
  204. package/templates-zh-CN/lessons/lesson-new-doc.md +3 -3
  205. package/templates-zh-CN/lessons/lesson-ref-change.md +4 -4
  206. package/templates-zh-CN/modules/module_brief.md +47 -0
  207. package/templates-zh-CN/modules/module_plan.md +48 -0
  208. package/templates-zh-CN/modules/registry_view.md +9 -0
  209. package/templates-zh-CN/modules/session_prompt_pack.md +50 -0
  210. package/templates-zh-CN/planning/INDEX.md +1 -0
  211. package/templates-zh-CN/planning/brief.md +26 -7
  212. package/templates-zh-CN/planning/module_brief.md +24 -2
  213. package/templates-zh-CN/planning/module_plan.md +35 -29
  214. package/templates-zh-CN/planning/module_session_prompt.md +15 -11
  215. package/templates-zh-CN/planning/optional/slices/_slice-template/brief.md +28 -11
  216. package/templates-zh-CN/planning/review.md +1 -1
  217. package/templates-zh-CN/reference/adversarial-review-standard.md +1 -1
  218. package/templates-zh-CN/reference/delivery-operating-model-standard.md +3 -3
  219. package/templates-zh-CN/reference/docs-library-standard.md +27 -27
  220. package/templates-zh-CN/reference/execution-workflow-standard.md +12 -2
  221. package/templates-zh-CN/reference/external-source-intake-standard.md +10 -10
  222. package/templates-zh-CN/reference/harness-ledger-standard.md +3 -3
  223. package/templates-zh-CN/reference/regression-ssot-governance.md +2 -2
  224. package/templates-zh-CN/reference/repo-governance-standard.md +1 -1
  225. package/templates-zh-CN/reference/review-routing-standard.md +3 -0
  226. package/templates-zh-CN/reference/walkthrough-standard.md +2 -2
  227. package/templates-zh-CN/reference/worktree-standard.md +1 -1
  228. package/templates-zh-CN/regression/Cadence-Ledger.md +2 -2
  229. package/templates-zh-CN/ssot/Delivery-SSoT.md +2 -2
  230. package/templates-zh-CN/ssot/Module-Registry.md +5 -44
  231. package/templates-zh-CN/ssot/Regression-SSoT.md +2 -2
  232. package/templates-zh-CN/walkthrough/walkthrough-template.md +4 -4
@@ -32,6 +32,12 @@
32
32
  /* Typography Scale */
33
33
  --font-sans: "Plus Jakarta Sans", ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
34
34
  --font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
35
+
36
+ /* Dashboard Density */
37
+ --dashboard-page-gap: 8px;
38
+ --dashboard-panel-gap: 8px;
39
+ --dashboard-card-padding: 12px;
40
+ --dashboard-compact-row-height: 32px;
35
41
  }
36
42
 
37
43
  [data-theme="dark"] {
@@ -137,7 +143,7 @@ button, input, select {
137
143
  .visibility-shell {
138
144
  width: 100%;
139
145
  max-width: 100%;
140
- padding: 40px clamp(16px, 3vw, 48px) 80px;
146
+ padding: 32px clamp(14px, 3vw, 44px) 64px;
141
147
  box-sizing: border-box;
142
148
  }
143
149
 
@@ -147,7 +153,7 @@ button, input, select {
147
153
  justify-content: space-between;
148
154
  align-items: center;
149
155
  gap: 24px;
150
- margin-bottom: 32px;
156
+ margin-bottom: 24px;
151
157
  }
152
158
 
153
159
  .hero-copy h1 {
@@ -222,15 +228,15 @@ button, input, select {
222
228
 
223
229
  .stack {
224
230
  display: grid;
225
- gap: 24px;
231
+ gap: var(--dashboard-page-gap);
226
232
  }
227
233
 
228
234
  /* Cockpit Two-Column Layout Grid */
229
235
  .dashboard-grid {
230
236
  display: grid;
231
237
  grid-template-columns: 1fr;
232
- gap: 24px;
233
- margin-top: 16px;
238
+ gap: var(--dashboard-page-gap);
239
+ margin-top: 10px;
234
240
  }
235
241
 
236
242
  .dashboard-main,
@@ -249,7 +255,7 @@ button, input, select {
249
255
  .status-card-group {
250
256
  display: flex;
251
257
  flex-direction: column;
252
- gap: 16px;
258
+ gap: var(--dashboard-page-gap);
253
259
  }
254
260
 
255
261
  .metrics-grid {
@@ -349,9 +355,9 @@ button, input, select {
349
355
  .section-head {
350
356
  display: flex;
351
357
  justify-content: space-between;
352
- gap: 18px;
358
+ gap: var(--dashboard-panel-gap);
353
359
  align-items: center;
354
- margin-bottom: 16px;
360
+ margin-bottom: var(--dashboard-panel-gap);
355
361
  min-width: 0;
356
362
  }
357
363
 
@@ -985,8 +991,8 @@ button, input, select {
985
991
  .tasks-grid {
986
992
  display: grid;
987
993
  grid-template-columns: 1fr;
988
- gap: 24px;
989
- margin-top: 16px;
994
+ gap: var(--dashboard-page-gap);
995
+ margin-top: 10px;
990
996
  }
991
997
 
992
998
  @media (min-width: 1024px) {
@@ -1005,11 +1011,11 @@ button, input, select {
1005
1011
  background: var(--paper);
1006
1012
  border: 1px solid var(--line);
1007
1013
  border-radius: 12px;
1008
- padding: 20px;
1014
+ padding: var(--dashboard-card-padding);
1009
1015
  box-shadow: var(--shadow);
1010
1016
  display: flex;
1011
1017
  flex-direction: column;
1012
- gap: 16px;
1018
+ gap: var(--dashboard-panel-gap);
1013
1019
  transition: box-shadow 0.25s;
1014
1020
  }
1015
1021
 
@@ -1232,14 +1238,14 @@ button, input, select {
1232
1238
  .task-stats-bar {
1233
1239
  display: flex;
1234
1240
  flex-wrap: wrap;
1235
- gap: 12px;
1241
+ gap: 10px;
1236
1242
  align-items: center;
1237
- padding: 16px 20px;
1243
+ padding: 12px 16px;
1238
1244
  background: var(--paper);
1239
1245
  border: 1px solid var(--line);
1240
1246
  border-radius: 12px;
1241
1247
  box-shadow: var(--shadow);
1242
- margin-bottom: 24px;
1248
+ margin-bottom: var(--dashboard-page-gap);
1243
1249
  backdrop-filter: blur(10px);
1244
1250
  }
1245
1251
 
@@ -1248,7 +1254,7 @@ button, input, select {
1248
1254
  flex-direction: column;
1249
1255
  align-items: center;
1250
1256
  gap: 4px;
1251
- padding: 8px 16px;
1257
+ padding: 7px 14px;
1252
1258
  border-radius: 8px;
1253
1259
  background: var(--paper-2);
1254
1260
  min-width: 64px;
@@ -1261,9 +1267,9 @@ button, input, select {
1261
1267
  }
1262
1268
 
1263
1269
  .stat-chip .stat-value {
1264
- font-size: 20px;
1270
+ font-size: 18px;
1265
1271
  font-weight: 800;
1266
- color: var(--ink);
1272
+ color: var(--stat-color, var(--ink));
1267
1273
  line-height: 1;
1268
1274
  }
1269
1275
 
@@ -1324,7 +1330,7 @@ button, input, select {
1324
1330
  border-radius: 12px;
1325
1331
  overflow: hidden;
1326
1332
  border: 1px solid var(--line);
1327
- margin-top: 16px;
1333
+ margin-top: var(--dashboard-panel-gap);
1328
1334
  }
1329
1335
 
1330
1336
  /* Table Header for Task List */
@@ -1449,8 +1455,8 @@ button, input, select {
1449
1455
  .task-card-grid {
1450
1456
  display: grid;
1451
1457
  grid-template-columns: 1fr;
1452
- gap: 16px;
1453
- margin-top: 16px;
1458
+ gap: var(--dashboard-panel-gap);
1459
+ margin-top: var(--dashboard-panel-gap);
1454
1460
  }
1455
1461
 
1456
1462
  @media (min-width: 640px) {
@@ -1553,6 +1559,14 @@ button, input, select {
1553
1559
  gap: 4px;
1554
1560
  }
1555
1561
 
1562
+ .task-card .meta-lifecycle {
1563
+ overflow: hidden;
1564
+ text-overflow: ellipsis;
1565
+ white-space: nowrap;
1566
+ max-width: 100%;
1567
+ color: var(--muted);
1568
+ }
1569
+
1556
1570
  .task-card .card-progress {
1557
1571
  display: flex;
1558
1572
  align-items: center;
@@ -1696,29 +1710,612 @@ button, input, select {
1696
1710
  transition: width 0.4s;
1697
1711
  }
1698
1712
 
1699
- /* Responsive arrangement for search tool order */
1700
- @media (max-width: 1023px) {
1701
- .tasks-grid {
1713
+ /* Responsive arrangement for search tool order */
1714
+ @media (max-width: 1023px) {
1715
+ .tasks-grid {
1716
+ display: flex;
1717
+ flex-direction: column;
1718
+ }
1719
+ .tasks-sidebar {
1720
+ order: -1;
1721
+ }
1722
+ }
1723
+
1724
+ .crumbs {
1725
+ display: flex;
1726
+ align-items: center;
1727
+ gap: 8px;
1728
+ color: var(--muted);
1729
+ margin-bottom: 16px;
1730
+ font-size: 13px;
1731
+ font-weight: 600;
1732
+ }
1733
+
1734
+ .crumbs a:hover {
1735
+ color: var(--accent);
1736
+ }
1737
+
1738
+ .archive-view {
1739
+ margin-top: 16px;
1740
+ }
1741
+
1742
+ .archive-summary-grid {
1743
+ display: grid;
1744
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1745
+ gap: 12px;
1746
+ margin-top: 16px;
1747
+ }
1748
+
1749
+ .archive-group {
1750
+ background: var(--paper);
1751
+ border: 1px solid var(--line);
1752
+ border-radius: 12px;
1753
+ box-shadow: var(--shadow);
1754
+ padding: 20px;
1755
+ }
1756
+
1757
+ .archive-task-list {
1758
+ display: grid;
1759
+ gap: 12px;
1760
+ }
1761
+
1762
+ .archive-task-row {
1763
+ display: grid;
1764
+ grid-template-columns: minmax(0, 1fr);
1765
+ gap: 14px;
1766
+ padding: 16px;
1767
+ border: 1px solid var(--line);
1768
+ border-radius: 10px;
1769
+ background: var(--bg);
1770
+ }
1771
+
1772
+ .archive-task-main {
1773
+ min-width: 0;
1774
+ display: grid;
1775
+ gap: 6px;
1776
+ }
1777
+
1778
+ .archive-task-main a {
1779
+ color: var(--ink);
1780
+ font-weight: 800;
1781
+ text-decoration: none;
1782
+ }
1783
+
1784
+ .archive-task-main span,
1785
+ .archive-task-main p {
1786
+ margin: 0;
1787
+ color: var(--muted);
1788
+ font-size: 12px;
1789
+ line-height: 1.45;
1790
+ overflow-wrap: anywhere;
1791
+ }
1792
+
1793
+ .archive-meta-grid {
1794
+ display: grid;
1795
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr));
1796
+ gap: 10px;
1797
+ margin: 0;
1798
+ }
1799
+
1800
+ .archive-meta-grid div {
1801
+ min-width: 0;
1802
+ display: grid;
1803
+ gap: 4px;
1804
+ padding: 10px;
1805
+ border: 1px solid var(--line);
1806
+ border-radius: 8px;
1807
+ background: var(--paper);
1808
+ }
1809
+
1810
+ .archive-meta-grid dt {
1811
+ color: var(--muted);
1812
+ font-size: 10px;
1813
+ font-weight: 800;
1814
+ letter-spacing: 0.04em;
1815
+ text-transform: uppercase;
1816
+ }
1817
+
1818
+ .archive-meta-grid dd {
1819
+ margin: 0;
1820
+ color: var(--ink);
1821
+ font-size: 12px;
1822
+ font-weight: 700;
1823
+ overflow-wrap: anywhere;
1824
+ }
1825
+
1826
+ @media (min-width: 980px) {
1827
+ .archive-task-row {
1828
+ grid-template-columns: minmax(240px, 0.8fr) minmax(0, 1.2fr);
1829
+ align-items: start;
1830
+ }
1831
+ }
1832
+
1833
+ /* Read-only runtime swimlane heatmap */
1834
+ .task-swimlane {
1835
+ background: var(--paper);
1836
+ border: 1px solid var(--line);
1837
+ border-radius: 12px;
1838
+ box-shadow: var(--shadow);
1839
+ padding: var(--dashboard-card-padding);
1840
+ overflow: hidden;
1841
+ }
1842
+
1843
+ .task-swimlane.empty-state {
1844
+ color: var(--muted);
1845
+ font-weight: 700;
1846
+ }
1847
+
1848
+ .swimlane-header {
1849
+ display: flex;
1850
+ justify-content: space-between;
1851
+ gap: var(--dashboard-panel-gap);
1852
+ align-items: flex-start;
1853
+ margin-bottom: 12px;
1854
+ }
1855
+
1856
+ .swimlane-header h2 {
1857
+ margin: 2px 0 0;
1858
+ font-size: 18px;
1859
+ line-height: 1.2;
1860
+ }
1861
+
1862
+ .swimlane-heatmap {
1863
+ --swimlane-stage-columns: repeat(7, minmax(76px, 1fr));
1864
+ display: flex;
1865
+ flex-direction: column;
1866
+ gap: 5px;
1867
+ overflow-x: auto;
1868
+ padding-bottom: 4px;
1869
+ }
1870
+
1871
+ .swimlane-heatmap-row {
1872
+ display: grid;
1873
+ grid-template-columns: minmax(96px, 136px) var(--swimlane-stage-columns) 42px;
1874
+ gap: 5px;
1875
+ min-width: 0;
1876
+ }
1877
+
1878
+ .swimlane-heatmap-head {
1879
+ align-items: stretch;
1880
+ }
1881
+
1882
+ .swimlane-heatmap-row > * {
1883
+ min-width: 0;
1884
+ }
1885
+
1886
+ .swimlane-axis-label,
1887
+ .swimlane-total-header,
1888
+ .swimlane-stage-header {
1889
+ align-items: center;
1890
+ background: var(--bg);
1891
+ border: 1px solid var(--line);
1892
+ border-radius: 8px;
1893
+ color: var(--muted);
1894
+ display: flex;
1895
+ font-size: 10px;
1896
+ font-weight: 800;
1897
+ gap: 6px;
1898
+ justify-content: space-between;
1899
+ line-height: 1.2;
1900
+ min-height: var(--dashboard-compact-row-height);
1901
+ overflow: hidden;
1902
+ padding: 6px;
1903
+ text-transform: uppercase;
1904
+ }
1905
+
1906
+ .swimlane-stage-header span {
1907
+ overflow: hidden;
1908
+ text-overflow: ellipsis;
1909
+ }
1910
+
1911
+ .swimlane-stage-header strong,
1912
+ .swimlane-row-total strong {
1913
+ color: var(--ink);
1914
+ font-size: 11px;
1915
+ }
1916
+
1917
+ .swimlane-lane-button,
1918
+ .swimlane-heat-cell,
1919
+ .swimlane-mobile-module {
1920
+ appearance: none;
1921
+ border: 1px solid var(--line);
1922
+ cursor: pointer;
1923
+ font: inherit;
1924
+ transition: background 0.18s ease, border-color 0.18s ease, transform 0.18s ease;
1925
+ }
1926
+
1927
+ .swimlane-lane-button {
1928
+ align-items: center;
1929
+ background: var(--bg);
1930
+ border-radius: 8px;
1931
+ color: var(--ink);
1932
+ display: flex;
1933
+ gap: 10px;
1934
+ justify-content: space-between;
1935
+ min-height: var(--dashboard-compact-row-height);
1936
+ padding: 6px 8px;
1937
+ text-align: left;
1938
+ }
1939
+
1940
+ .swimlane-lane-button strong {
1941
+ font-size: 11px;
1942
+ line-height: 1.2;
1943
+ overflow-wrap: anywhere;
1944
+ }
1945
+
1946
+ .swimlane-lane-button span {
1947
+ color: var(--muted);
1948
+ font-size: 11px;
1949
+ font-weight: 800;
1950
+ }
1951
+
1952
+ .swimlane-lane-button:hover,
1953
+ .swimlane-lane-button.active,
1954
+ .swimlane-mobile-module:hover,
1955
+ .swimlane-mobile-module.active {
1956
+ border-color: var(--accent);
1957
+ }
1958
+
1959
+ .swimlane-heat-cell {
1960
+ align-items: center;
1961
+ background: transparent;
1962
+ border-radius: 8px;
1963
+ color: var(--ink);
1964
+ display: flex;
1965
+ justify-content: center;
1966
+ min-height: var(--dashboard-compact-row-height);
1967
+ padding: 0;
1968
+ }
1969
+
1970
+ .swimlane-heat-cell span {
1971
+ font-size: 14px;
1972
+ font-weight: 900;
1973
+ line-height: 1;
1974
+ }
1975
+
1976
+ .swimlane-heat-cell.heat-0 {
1977
+ color: color-mix(in srgb, var(--muted) 58%, transparent);
1978
+ cursor: default;
1979
+ opacity: 0.46;
1980
+ }
1981
+
1982
+ .swimlane-heat-cell.heat-1 {
1983
+ background: color-mix(in srgb, var(--accent) 12%, var(--paper));
1984
+ border-color: color-mix(in srgb, var(--accent) 18%, var(--line));
1985
+ }
1986
+
1987
+ .swimlane-heat-cell.heat-2 {
1988
+ background: color-mix(in srgb, var(--accent) 24%, var(--paper));
1989
+ border-color: color-mix(in srgb, var(--accent) 32%, var(--line));
1990
+ }
1991
+
1992
+ .swimlane-heat-cell.heat-3 {
1993
+ background: color-mix(in srgb, var(--accent) 40%, var(--paper));
1994
+ border-color: color-mix(in srgb, var(--accent) 52%, var(--line));
1995
+ }
1996
+
1997
+ .swimlane-heat-cell:not(:disabled):hover,
1998
+ .swimlane-heat-cell.active {
1999
+ border-color: var(--accent);
2000
+ transform: translateY(-1px);
2001
+ }
2002
+
2003
+ .swimlane-row-total {
2004
+ align-items: center;
2005
+ background: var(--paper);
2006
+ border: 1px solid var(--line);
2007
+ border-radius: 8px;
2008
+ display: flex;
2009
+ justify-content: center;
2010
+ min-height: var(--dashboard-compact-row-height);
2011
+ }
2012
+
2013
+ .swimlane-drilldown-host {
2014
+ display: grid;
2015
+ grid-template-rows: 0fr;
2016
+ margin-top: 0;
2017
+ transition: grid-template-rows 0.22s ease, margin-top 0.22s ease;
2018
+ }
2019
+
2020
+ .swimlane-drilldown-host.open {
2021
+ grid-template-rows: 1fr;
2022
+ margin-top: 12px;
2023
+ }
2024
+
2025
+ .swimlane-drilldown {
2026
+ background: color-mix(in srgb, var(--bg) 70%, var(--paper));
2027
+ border: 1px solid var(--line);
2028
+ border-radius: 10px;
2029
+ min-height: 0;
2030
+ overflow: hidden;
2031
+ padding: 10px;
2032
+ }
2033
+
2034
+ .swimlane-drilldown-head {
2035
+ align-items: flex-start;
2036
+ display: flex;
2037
+ gap: 10px;
2038
+ justify-content: space-between;
2039
+ margin-bottom: 8px;
2040
+ }
2041
+
2042
+ .swimlane-drilldown-head h3 {
2043
+ color: var(--ink);
2044
+ font-size: 15px;
2045
+ line-height: 1.25;
2046
+ margin: 2px 0 0;
2047
+ }
2048
+
2049
+ .swimlane-drilldown-actions {
2050
+ align-items: center;
2051
+ display: flex;
2052
+ gap: 8px;
2053
+ }
2054
+
2055
+ .swimlane-drilldown-actions span {
2056
+ color: var(--muted);
2057
+ font-size: 11px;
2058
+ font-weight: 800;
2059
+ white-space: nowrap;
2060
+ }
2061
+
2062
+ .swimlane-drilldown-actions button {
2063
+ background: var(--paper);
2064
+ border: 1px solid var(--line);
2065
+ border-radius: 7px;
2066
+ color: var(--ink);
2067
+ cursor: pointer;
2068
+ font-size: 11px;
2069
+ font-weight: 800;
2070
+ padding: 6px 8px;
2071
+ }
2072
+
2073
+ .swimlane-mini-board {
2074
+ display: grid;
2075
+ gap: 6px;
2076
+ grid-template-columns: repeat(7, minmax(0, 1fr));
2077
+ overflow-x: visible;
2078
+ padding-bottom: 2px;
2079
+ }
2080
+
2081
+ .swimlane-mini-column {
2082
+ background: var(--paper);
2083
+ border: 1px solid var(--line);
2084
+ border-radius: 8px;
2085
+ min-width: 0;
2086
+ padding: 7px;
2087
+ }
2088
+
2089
+ .swimlane-mini-column-head {
2090
+ align-items: center;
2091
+ color: var(--muted);
2092
+ display: flex;
2093
+ font-size: 10px;
2094
+ font-weight: 800;
2095
+ justify-content: space-between;
2096
+ line-height: 1.2;
2097
+ margin-bottom: 6px;
2098
+ text-transform: uppercase;
2099
+ }
2100
+
2101
+ .swimlane-card-list {
2102
+ display: flex;
2103
+ flex-direction: column;
2104
+ gap: 6px;
2105
+ }
2106
+
2107
+ .swimlane-card {
2108
+ align-items: center;
2109
+ background: var(--paper);
2110
+ border: 1px solid var(--line);
2111
+ border-radius: 7px;
2112
+ cursor: pointer;
2113
+ display: grid;
2114
+ gap: 8px;
2115
+ grid-template-columns: 8px minmax(0, 1fr) 30px;
2116
+ min-height: 30px;
2117
+ min-width: 0;
2118
+ padding: 6px 7px;
2119
+ transition: border-color 0.18s ease, transform 0.18s ease;
2120
+ }
2121
+
2122
+ .swimlane-card:hover {
2123
+ border-color: var(--accent);
2124
+ transform: translateY(-1px);
2125
+ }
2126
+
2127
+ .swimlane-status-dot {
2128
+ background: var(--row-accent, var(--accent));
2129
+ border-radius: 999px;
2130
+ height: 8px;
2131
+ width: 8px;
2132
+ }
2133
+
2134
+ .swimlane-card strong {
2135
+ color: var(--ink);
2136
+ font-size: 12px;
2137
+ line-height: 1.2;
2138
+ overflow: hidden;
2139
+ text-overflow: ellipsis;
2140
+ white-space: nowrap;
2141
+ }
2142
+
2143
+ .swimlane-progress {
2144
+ background: var(--bg);
2145
+ border-radius: 999px;
2146
+ height: 5px;
2147
+ overflow: hidden;
2148
+ }
2149
+
2150
+ .swimlane-progress i {
2151
+ background: var(--row-accent, var(--accent));
2152
+ display: block;
2153
+ height: 100%;
2154
+ width: var(--task-progress, 0%);
2155
+ }
2156
+
2157
+ .swimlane-mini-empty {
2158
+ color: var(--muted);
2159
+ display: block;
2160
+ font-size: 11px;
2161
+ font-weight: 700;
2162
+ opacity: 0.72;
2163
+ padding: 7px 2px;
2164
+ }
2165
+
2166
+ .swimlane-stage-drilldown {
2167
+ align-items: center;
2168
+ appearance: none;
2169
+ background: color-mix(in srgb, var(--accent) 8%, var(--paper));
2170
+ border: 1px solid color-mix(in srgb, var(--accent) 22%, var(--line));
2171
+ border-radius: 7px;
2172
+ color: var(--ink);
2173
+ cursor: pointer;
2174
+ display: flex;
2175
+ font: inherit;
2176
+ gap: 6px;
2177
+ justify-content: space-between;
2178
+ margin-top: 6px;
2179
+ min-height: 28px;
2180
+ padding: 5px 7px;
2181
+ width: 100%;
2182
+ }
2183
+
2184
+ .swimlane-stage-drilldown span {
2185
+ color: var(--accent);
2186
+ font-size: 11px;
2187
+ font-weight: 900;
2188
+ }
2189
+
2190
+ .swimlane-stage-drilldown strong {
2191
+ color: var(--muted);
2192
+ font-size: 10px;
2193
+ font-weight: 800;
2194
+ overflow: hidden;
2195
+ text-overflow: ellipsis;
2196
+ text-transform: uppercase;
2197
+ white-space: nowrap;
2198
+ }
2199
+
2200
+ .swimlane-paged-list {
2201
+ display: grid;
2202
+ gap: 8px;
2203
+ }
2204
+
2205
+ .swimlane-pager {
2206
+ align-items: center;
2207
+ display: flex;
2208
+ gap: 8px;
2209
+ justify-content: flex-end;
2210
+ }
2211
+
2212
+ .swimlane-pager span {
2213
+ color: var(--muted);
2214
+ font-size: 11px;
2215
+ font-weight: 800;
2216
+ }
2217
+
2218
+ .swimlane-pager button {
2219
+ appearance: none;
2220
+ background: var(--paper);
2221
+ border: 1px solid var(--line);
2222
+ border-radius: 7px;
2223
+ color: var(--ink);
2224
+ cursor: pointer;
2225
+ font: inherit;
2226
+ font-size: 11px;
2227
+ font-weight: 800;
2228
+ padding: 5px 8px;
2229
+ }
2230
+
2231
+ .swimlane-pager button:disabled {
2232
+ color: var(--muted);
2233
+ cursor: default;
2234
+ opacity: 0.44;
2235
+ }
2236
+
2237
+ .swimlane-mobile-list {
2238
+ display: none;
2239
+ }
2240
+
2241
+ @media (max-width: 760px) {
2242
+ .task-swimlane {
2243
+ padding: 12px;
2244
+ }
2245
+
2246
+ .swimlane-header,
2247
+ .swimlane-drilldown-head {
2248
+ flex-direction: column;
2249
+ gap: 8px;
2250
+ }
2251
+
2252
+ .swimlane-heatmap {
2253
+ display: none;
2254
+ }
2255
+
2256
+ .swimlane-mobile-list {
2257
+ display: flex;
2258
+ flex-direction: column;
2259
+ gap: 8px;
2260
+ }
2261
+
2262
+ .swimlane-mobile-module {
2263
+ align-items: flex-start;
2264
+ background: var(--bg);
2265
+ border-radius: 9px;
2266
+ color: var(--ink);
2267
+ display: flex;
2268
+ flex-direction: column;
2269
+ gap: 8px;
2270
+ padding: 10px;
2271
+ text-align: left;
2272
+ }
2273
+
2274
+ .swimlane-mobile-module span:first-child {
2275
+ align-items: center;
2276
+ display: flex;
2277
+ gap: 8px;
2278
+ justify-content: space-between;
2279
+ width: 100%;
2280
+ }
2281
+
2282
+ .swimlane-mobile-module strong {
2283
+ font-size: 13px;
2284
+ overflow-wrap: anywhere;
2285
+ }
2286
+
2287
+ .swimlane-mobile-module small {
2288
+ color: var(--muted);
2289
+ font-size: 11px;
2290
+ font-weight: 800;
2291
+ white-space: nowrap;
2292
+ }
2293
+
2294
+ .swimlane-mobile-stages {
1702
2295
  display: flex;
1703
- flex-direction: column;
2296
+ flex-wrap: wrap;
2297
+ gap: 6px;
1704
2298
  }
1705
- .tasks-sidebar {
1706
- order: -1;
2299
+
2300
+ .swimlane-mobile-stages em {
2301
+ background: var(--paper);
2302
+ border: 1px solid var(--line);
2303
+ border-radius: 999px;
2304
+ color: var(--muted);
2305
+ font-size: 10px;
2306
+ font-style: normal;
2307
+ font-weight: 800;
2308
+ padding: 4px 6px;
1707
2309
  }
1708
- }
1709
2310
 
1710
- .crumbs {
1711
- display: flex;
1712
- align-items: center;
1713
- gap: 8px;
1714
- color: var(--muted);
1715
- margin-bottom: 16px;
1716
- font-size: 13px;
1717
- font-weight: 600;
1718
- }
2311
+ .swimlane-mini-board {
2312
+ grid-template-columns: 1fr;
2313
+ overflow-x: visible;
2314
+ }
1719
2315
 
1720
- .crumbs a:hover {
1721
- color: var(--accent);
2316
+ .swimlane-card {
2317
+ grid-template-columns: 8px minmax(0, 1fr) 42px;
2318
+ }
1722
2319
  }
1723
2320
 
1724
2321
  .review-queue-stats {
@@ -1817,6 +2414,67 @@ button, input, select {
1817
2414
  border-color: color-mix(in srgb, var(--accent) 54%, var(--line));
1818
2415
  }
1819
2416
 
2417
+ .bulk-action-bar {
2418
+ display: flex;
2419
+ align-items: center;
2420
+ flex-wrap: wrap;
2421
+ gap: 10px;
2422
+ margin-top: 12px;
2423
+ padding: 10px 12px;
2424
+ border: 1px solid var(--line);
2425
+ border-radius: 8px;
2426
+ background: var(--paper);
2427
+ }
2428
+
2429
+ .bulk-select-all,
2430
+ .bulk-card-check {
2431
+ display: inline-flex;
2432
+ align-items: center;
2433
+ gap: 7px;
2434
+ min-width: 0;
2435
+ color: var(--ink);
2436
+ font-size: 12px;
2437
+ font-weight: 800;
2438
+ }
2439
+
2440
+ .bulk-select-all input,
2441
+ .bulk-card-check input {
2442
+ width: 16px;
2443
+ height: 16px;
2444
+ accent-color: var(--accent);
2445
+ }
2446
+
2447
+ .bulk-selected-count,
2448
+ .bulk-action-result {
2449
+ color: var(--muted);
2450
+ font-size: 12px;
2451
+ font-weight: 800;
2452
+ }
2453
+
2454
+ .bulk-action-result.success {
2455
+ color: var(--ok);
2456
+ }
2457
+
2458
+ .bulk-action-result.failed {
2459
+ color: var(--danger);
2460
+ }
2461
+
2462
+ .bulk-action-bar button {
2463
+ border: 1px solid var(--line);
2464
+ background: var(--paper-2);
2465
+ color: var(--ink);
2466
+ border-radius: 8px;
2467
+ padding: 8px 12px;
2468
+ font-size: 12px;
2469
+ font-weight: 800;
2470
+ cursor: pointer;
2471
+ }
2472
+
2473
+ .bulk-action-bar button:disabled {
2474
+ cursor: not-allowed;
2475
+ opacity: 0.55;
2476
+ }
2477
+
1820
2478
  .review-queue-list-shell {
1821
2479
  margin-top: 18px;
1822
2480
  max-height: clamp(560px, 72vh, 920px);
@@ -1857,6 +2515,11 @@ button, input, select {
1857
2515
  justify-content: flex-start;
1858
2516
  }
1859
2517
 
2518
+ .review-queue-card .bulk-card-check {
2519
+ margin-left: auto;
2520
+ padding: 4px 0;
2521
+ }
2522
+
1860
2523
  .review-queue-card .card-id,
1861
2524
  .review-queue-card .card-title,
1862
2525
  .review-queue-card .subtle,
@@ -1948,6 +2611,10 @@ button, input, select {
1948
2611
  background: var(--paper-2);
1949
2612
  }
1950
2613
 
2614
+ .lesson-candidate-panel.compact .bulk-action-bar {
2615
+ display: none;
2616
+ }
2617
+
1951
2618
  .lesson-candidate-panel-head {
1952
2619
  display: flex;
1953
2620
  justify-content: space-between;
@@ -2018,6 +2685,14 @@ button, input, select {
2018
2685
  min-width: 0;
2019
2686
  }
2020
2687
 
2688
+ .lesson-bulk-check {
2689
+ min-height: 32px;
2690
+ border: 1px solid var(--line);
2691
+ border-radius: 8px;
2692
+ padding: 6px 9px;
2693
+ background: var(--paper);
2694
+ }
2695
+
2021
2696
  .lesson-candidate-action a,
2022
2697
  .lesson-candidate-action button {
2023
2698
  display: inline-flex;
@@ -2519,33 +3194,210 @@ button, input, select {
2519
3194
  font-weight: 500;
2520
3195
  }
2521
3196
 
2522
- /* Module Grid */
2523
- .module-grid {
3197
+ /* Module Console */
3198
+ .module-console {
3199
+ min-width: 0;
3200
+ }
3201
+
3202
+ .module-run-strip {
2524
3203
  display: grid;
2525
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr));
3204
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
3205
+ gap: 12px;
3206
+ }
3207
+
3208
+ .module-console-grid {
3209
+ display: grid;
3210
+ grid-template-columns: minmax(240px, 300px) minmax(0, 1fr);
2526
3211
  gap: 16px;
3212
+ align-items: start;
2527
3213
  }
2528
3214
 
2529
- .module-card {
2530
- padding: 24px;
3215
+ .module-list-panel,
3216
+ .module-detail-panel,
3217
+ .module-unclassified-panel {
3218
+ background: var(--paper);
3219
+ border: 1px solid var(--line);
3220
+ border-radius: 8px;
3221
+ box-shadow: var(--shadow);
2531
3222
  }
2532
3223
 
2533
- .module-more {
2534
- display: inline-flex;
2535
- margin-top: 14px;
2536
- padding: 8px 16px;
3224
+ .module-list-panel {
3225
+ display: grid;
3226
+ gap: 6px;
3227
+ padding: 8px;
3228
+ position: sticky;
3229
+ top: 84px;
3230
+ }
3231
+
3232
+ .module-list-item {
3233
+ display: flex;
3234
+ align-items: center;
3235
+ justify-content: space-between;
3236
+ gap: 12px;
3237
+ padding: 12px;
3238
+ border: 1px solid transparent;
3239
+ border-radius: 6px;
3240
+ color: var(--ink);
3241
+ text-decoration: none;
3242
+ min-width: 0;
3243
+ }
3244
+
3245
+ .module-list-item:hover,
3246
+ .module-list-item.active {
3247
+ background: var(--paper-2);
3248
+ border-color: var(--accent);
3249
+ }
3250
+
3251
+ .module-list-item strong,
3252
+ .module-list-item small {
3253
+ display: block;
3254
+ overflow: hidden;
3255
+ text-overflow: ellipsis;
3256
+ white-space: nowrap;
3257
+ }
3258
+
3259
+ .module-list-item small {
3260
+ margin-top: 3px;
3261
+ color: var(--muted);
3262
+ font-size: 11px;
3263
+ font-weight: 600;
3264
+ }
3265
+
3266
+ .module-list-counts {
3267
+ display: grid;
3268
+ justify-items: end;
3269
+ gap: 4px;
3270
+ flex-shrink: 0;
3271
+ }
3272
+
3273
+ .module-list-counts b {
3274
+ font-size: 18px;
3275
+ }
3276
+
3277
+ .module-detail-panel {
3278
+ padding: 22px;
3279
+ min-width: 0;
3280
+ }
3281
+
3282
+ .module-detail-stack {
3283
+ display: grid;
3284
+ gap: 18px;
3285
+ min-width: 0;
3286
+ }
3287
+
3288
+ .module-detail-header {
3289
+ display: flex;
3290
+ align-items: flex-start;
3291
+ justify-content: space-between;
3292
+ gap: 16px;
3293
+ border-bottom: 1px solid var(--line);
3294
+ padding-bottom: 16px;
3295
+ }
3296
+
3297
+ .module-detail-header h2 {
3298
+ margin: 2px 0 4px;
3299
+ font-size: 24px;
3300
+ line-height: 1.2;
3301
+ }
3302
+
3303
+ .module-chip-row {
3304
+ display: flex;
3305
+ flex-wrap: wrap;
3306
+ gap: 6px;
3307
+ margin-top: 8px;
3308
+ }
3309
+
3310
+ .module-chip {
3311
+ max-width: 100%;
3312
+ padding: 4px 8px;
3313
+ border: 1px solid var(--line);
2537
3314
  border-radius: 999px;
2538
3315
  background: var(--paper-2);
3316
+ color: var(--muted);
3317
+ font-size: 11px;
3318
+ font-weight: 700;
3319
+ overflow-wrap: anywhere;
3320
+ }
3321
+
3322
+ .module-boundary-grid {
3323
+ display: grid;
3324
+ grid-template-columns: repeat(3, minmax(0, 1fr));
3325
+ gap: 10px;
3326
+ }
3327
+
3328
+ .module-boundary-block {
3329
+ display: grid;
3330
+ gap: 6px;
3331
+ padding: 12px;
3332
+ background: var(--paper-2);
3333
+ border: 1px solid var(--line);
3334
+ border-radius: 8px;
3335
+ min-width: 0;
3336
+ }
3337
+
3338
+ .module-boundary-block strong {
3339
+ font-size: 11px;
3340
+ text-transform: uppercase;
3341
+ letter-spacing: 0.05em;
3342
+ }
3343
+
3344
+ .module-boundary-block span {
3345
+ font-size: 12px;
3346
+ color: var(--muted);
3347
+ overflow-wrap: anywhere;
3348
+ }
3349
+
3350
+ .module-work-panel,
3351
+ .module-risk-panel,
3352
+ .module-doc-panel {
3353
+ display: grid;
3354
+ gap: 12px;
3355
+ min-width: 0;
3356
+ }
3357
+
3358
+ .module-risk-panel {
3359
+ padding-top: 14px;
3360
+ border-top: 1px solid var(--line);
3361
+ }
3362
+
3363
+ .module-risk-panel h3,
3364
+ .module-doc-panel h3,
3365
+ .module-work-panel h3 {
3366
+ margin: 0;
3367
+ font-size: 15px;
3368
+ }
3369
+
3370
+ .module-doc-links {
3371
+ display: flex;
3372
+ flex-wrap: wrap;
3373
+ gap: 8px;
3374
+ }
3375
+
3376
+ .module-doc-link {
3377
+ max-width: 100%;
3378
+ padding: 6px 8px;
2539
3379
  border: 1px solid var(--line);
3380
+ border-radius: 6px;
3381
+ color: var(--muted);
2540
3382
  font-size: 12px;
2541
3383
  font-weight: 700;
2542
- transition: all 0.2s ease;
3384
+ overflow-wrap: anywhere;
2543
3385
  }
2544
3386
 
2545
- .module-more:hover {
2546
- background: var(--accent);
2547
- color: var(--paper);
2548
- border-color: var(--accent);
3387
+ .module-doc-link.missing {
3388
+ color: var(--danger);
3389
+ }
3390
+
3391
+ .module-doc-preview {
3392
+ max-height: 280px;
3393
+ overflow: auto;
3394
+ border-top: 1px solid var(--line);
3395
+ padding-top: 12px;
3396
+ }
3397
+
3398
+ .module-unclassified-panel {
3399
+ padding: 18px;
3400
+ border-color: color-mix(in srgb, var(--danger) 36%, var(--line));
2549
3401
  }
2550
3402
 
2551
3403
  /* Migration workbench */
@@ -3483,6 +4335,15 @@ details summary {
3483
4335
  gap: 8px;
3484
4336
  min-width: 0;
3485
4337
  }
4338
+
4339
+ .module-task-left small {
4340
+ color: var(--muted);
4341
+ font-size: 11px;
4342
+ font-weight: 600;
4343
+ overflow: hidden;
4344
+ text-overflow: ellipsis;
4345
+ white-space: nowrap;
4346
+ }
3486
4347
  .module-task-dot {
3487
4348
  width: 8px;
3488
4349
  height: 8px;
@@ -3510,6 +4371,20 @@ details summary {
3510
4371
  margin-left: 8px;
3511
4372
  }
3512
4373
 
4374
+ @media (max-width: 900px) {
4375
+ .module-console-grid {
4376
+ grid-template-columns: 1fr;
4377
+ }
4378
+
4379
+ .module-list-panel {
4380
+ position: static;
4381
+ }
4382
+
4383
+ .module-boundary-grid {
4384
+ grid-template-columns: 1fr;
4385
+ }
4386
+ }
4387
+
3513
4388
  /* Inline card pagination controls */
3514
4389
  .module-pager {
3515
4390
  display: flex;