duaer-spec 0.16.0 → 0.18.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 (296) hide show
  1. package/.claude/rules/ai-ui-copy.md +11 -1
  2. package/.cursor/rules/ai-ui-copy.mdc +11 -1
  3. package/.duaer/active-job.json +1 -6
  4. package/.duaer/handoff.json +5 -3
  5. package/.duaer/specs/061-satisfactory-delivery/delivery.json +10 -0
  6. package/.duaer/specs/061-satisfactory-delivery/spec.md +39 -0
  7. package/.duaer/specs/061-satisfactory-delivery/tasks.md +5 -0
  8. package/.duaer/specs/062-deepseek-cli/delivery.json +10 -0
  9. package/.duaer/specs/062-deepseek-cli/spec.md +37 -0
  10. package/.duaer/specs/062-deepseek-cli/tasks.md +4 -0
  11. package/.duaer/specs/063-queued-count/delivery.json +10 -0
  12. package/.duaer/specs/063-queued-count/spec.md +12 -0
  13. package/.duaer/specs/063-queued-count/tasks.md +3 -0
  14. package/.duaer/specs/064-cli-install-show/delivery.json +10 -0
  15. package/.duaer/specs/064-cli-install-show/spec.md +17 -0
  16. package/.duaer/specs/064-cli-install-show/tasks.md +3 -0
  17. package/.duaer/specs/065-detailed-progress/delivery.json +18 -0
  18. package/.duaer/specs/065-detailed-progress/spec.md +19 -0
  19. package/.duaer/specs/065-detailed-progress/tasks.md +4 -0
  20. package/.duaer/specs/066-duaer-fed/delivery.json +16 -0
  21. package/.duaer/specs/066-duaer-fed/spec.md +18 -0
  22. package/.duaer/specs/066-duaer-fed/tasks.md +4 -0
  23. package/.duaer/specs/067-duaer-spec-fed/delivery.json +11 -0
  24. package/.duaer/specs/067-duaer-spec-fed/spec.md +16 -0
  25. package/.duaer/specs/067-duaer-spec-fed/tasks.md +3 -0
  26. package/.duaer/specs/068-fed-ux-polish/delivery.json +11 -0
  27. package/.duaer/specs/068-fed-ux-polish/spec.md +18 -0
  28. package/.duaer/specs/068-fed-ux-polish/tasks.md +4 -0
  29. package/.duaer/specs/069-history-btn-size/delivery.json +6 -0
  30. package/.duaer/specs/069-history-btn-size/spec.md +14 -0
  31. package/.duaer/specs/069-history-btn-size/tasks.md +3 -0
  32. package/.duaer/specs/070-validate-autofix-btn/delivery.json +9 -0
  33. package/.duaer/specs/070-validate-autofix-btn/spec.md +17 -0
  34. package/.duaer/specs/070-validate-autofix-btn/tasks.md +3 -0
  35. package/.duaer/specs/071-req-structured-display/delivery.json +9 -0
  36. package/.duaer/specs/071-req-structured-display/spec.md +17 -0
  37. package/.duaer/specs/071-req-structured-display/tasks.md +3 -0
  38. package/.duaer/specs/072-chat-send/delivery.json +14 -0
  39. package/.duaer/specs/072-chat-send/spec.md +48 -0
  40. package/.duaer/specs/072-chat-send/tasks.md +5 -0
  41. package/.duaer/specs/073-empty-structured/delivery.json +10 -0
  42. package/.duaer/specs/073-empty-structured/spec.md +28 -0
  43. package/.duaer/specs/073-empty-structured/tasks.md +4 -0
  44. package/.duaer/specs/074-chat-blank/delivery.json +10 -0
  45. package/.duaer/specs/074-chat-blank/spec.md +22 -0
  46. package/.duaer/specs/074-chat-blank/tasks.md +4 -0
  47. package/.duaer/specs/075-header-beginner/delivery.json +10 -0
  48. package/.duaer/specs/075-header-beginner/spec.md +17 -0
  49. package/.duaer/specs/075-header-beginner/tasks.md +4 -0
  50. package/.duaer/specs/076-click-options/delivery.json +10 -0
  51. package/.duaer/specs/076-click-options/spec.md +23 -0
  52. package/.duaer/specs/076-click-options/tasks.md +4 -0
  53. package/.duaer/specs/077-dispatch-unique/delivery.json +10 -0
  54. package/.duaer/specs/077-dispatch-unique/spec.md +18 -0
  55. package/.duaer/specs/077-dispatch-unique/tasks.md +4 -0
  56. package/.duaer/specs/078-chip-tone/delivery.json +10 -0
  57. package/.duaer/specs/078-chip-tone/spec.md +16 -0
  58. package/.duaer/specs/078-chip-tone/tasks.md +4 -0
  59. package/.duaer/specs/079-desk-equal-cols/delivery.json +10 -0
  60. package/.duaer/specs/079-desk-equal-cols/spec.md +17 -0
  61. package/.duaer/specs/079-desk-equal-cols/tasks.md +4 -0
  62. package/.duaer/specs/080-progress-polish/delivery.json +10 -0
  63. package/.duaer/specs/080-progress-polish/spec.md +18 -0
  64. package/.duaer/specs/080-progress-polish/tasks.md +4 -0
  65. package/.duaer/specs/081-beginner-copy/delivery.json +10 -0
  66. package/.duaer/specs/081-beginner-copy/spec.md +14 -0
  67. package/.duaer/specs/081-beginner-copy/tasks.md +4 -0
  68. package/.duaer/specs/082-git-cli-ensure/delivery.json +15 -0
  69. package/.duaer/specs/082-git-cli-ensure/spec.md +27 -0
  70. package/.duaer/specs/082-git-cli-ensure/tasks.md +5 -0
  71. package/.duaer/specs/083-deepseek-w-flag/delivery.json +14 -0
  72. package/.duaer/specs/083-deepseek-w-flag/spec.md +23 -0
  73. package/.duaer/specs/083-deepseek-w-flag/tasks.md +4 -0
  74. package/.duaer/specs/084-drop-deepseek-cli/delivery.json +14 -0
  75. package/.duaer/specs/084-drop-deepseek-cli/spec.md +25 -0
  76. package/.duaer/specs/084-drop-deepseek-cli/tasks.md +6 -0
  77. package/.duaer/specs/085-repo-mkdir/delivery.json +14 -0
  78. package/.duaer/specs/085-repo-mkdir/spec.md +26 -0
  79. package/.duaer/specs/085-repo-mkdir/tasks.md +5 -0
  80. package/.duaer/specs/086-claude-auto-perms/delivery.json +14 -0
  81. package/.duaer/specs/086-claude-auto-perms/spec.md +17 -0
  82. package/.duaer/specs/086-claude-auto-perms/tasks.md +4 -0
  83. package/.duaer/specs/087-release-017/delivery.json +9 -0
  84. package/.duaer/specs/087-release-017/spec.md +15 -0
  85. package/.duaer/specs/087-release-017/tasks.md +4 -0
  86. package/.duaer/specs/088-result-versions/delivery.json +14 -0
  87. package/.duaer/specs/088-result-versions/spec.md +37 -0
  88. package/.duaer/specs/088-result-versions/tasks.md +8 -0
  89. package/.duaer/specs/089-deploy-target-tasks/delivery.json +13 -0
  90. package/.duaer/specs/089-deploy-target-tasks/spec.md +28 -0
  91. package/.duaer/specs/089-deploy-target-tasks/tasks.md +9 -0
  92. package/.duaer/specs/090-project-first/delivery.json +13 -0
  93. package/.duaer/specs/090-project-first/spec.md +41 -0
  94. package/.duaer/specs/090-project-first/tasks.md +7 -0
  95. package/.duaer/specs/091-project-meta/delivery.json +13 -0
  96. package/.duaer/specs/091-project-meta/spec.md +35 -0
  97. package/.duaer/specs/091-project-meta/tasks.md +6 -0
  98. package/.duaer/specs/092-project-chat-gate/delivery.json +9 -0
  99. package/.duaer/specs/092-project-chat-gate/spec.md +17 -0
  100. package/.duaer/specs/092-project-chat-gate/tasks.md +4 -0
  101. package/.duaer/specs/093-project-auto-chat/delivery.json +9 -0
  102. package/.duaer/specs/093-project-auto-chat/spec.md +16 -0
  103. package/.duaer/specs/093-project-auto-chat/tasks.md +4 -0
  104. package/.duaer/specs/094-dispatch-project-simple/delivery.json +9 -0
  105. package/.duaer/specs/094-dispatch-project-simple/spec.md +17 -0
  106. package/.duaer/specs/094-dispatch-project-simple/tasks.md +4 -0
  107. package/.duaer/specs/095-project-chat-persist/delivery.json +9 -0
  108. package/.duaer/specs/095-project-chat-persist/spec.md +17 -0
  109. package/.duaer/specs/095-project-chat-persist/tasks.md +5 -0
  110. package/.duaer/specs/096-project-card-persist/delivery.json +15 -0
  111. package/.duaer/specs/096-project-card-persist/spec.md +25 -0
  112. package/.duaer/specs/096-project-card-persist/tasks.md +9 -0
  113. package/.duaer/specs/097-validate-persist/delivery.json +15 -0
  114. package/.duaer/specs/097-validate-persist/spec.md +24 -0
  115. package/.duaer/specs/097-validate-persist/tasks.md +7 -0
  116. package/.duaer/specs/098-req-structured-edit/delivery.json +14 -0
  117. package/.duaer/specs/098-req-structured-edit/spec.md +18 -0
  118. package/.duaer/specs/098-req-structured-edit/tasks.md +7 -0
  119. package/.duaer/specs/099-setup-cli-guide/delivery.json +14 -0
  120. package/.duaer/specs/099-setup-cli-guide/spec.md +19 -0
  121. package/.duaer/specs/099-setup-cli-guide/tasks.md +7 -0
  122. package/.duaer/specs/100-architecture-archify/delivery.json +16 -0
  123. package/.duaer/specs/100-architecture-archify/spec.md +39 -0
  124. package/.duaer/specs/100-architecture-archify/tasks.md +8 -0
  125. package/.duaer/specs/101-archify-ir-sanitize/delivery.json +11 -0
  126. package/.duaer/specs/101-archify-ir-sanitize/spec.md +22 -0
  127. package/.duaer/specs/101-archify-ir-sanitize/tasks.md +5 -0
  128. package/.duaer/specs/102-archify-brand-duaer/delivery.json +5 -0
  129. package/.duaer/specs/102-archify-brand-duaer/spec.md +9 -0
  130. package/.duaer/specs/103-arch-chat-kickoff/delivery.json +11 -0
  131. package/.duaer/specs/103-arch-chat-kickoff/spec.md +13 -0
  132. package/.duaer/specs/103-arch-chat-kickoff/tasks.md +5 -0
  133. package/.duaer/specs/104-settings-modal/delivery.json +8 -0
  134. package/.duaer/specs/104-settings-modal/spec.md +14 -0
  135. package/.duaer/specs/104-settings-modal/tasks.md +5 -0
  136. package/.duaer/specs/105-arch-chat-continue/delivery.json +11 -0
  137. package/.duaer/specs/105-arch-chat-continue/spec.md +12 -0
  138. package/.duaer/specs/105-arch-chat-continue/tasks.md +5 -0
  139. package/.duaer/specs/106-arch-hint-copy/delivery.json +5 -0
  140. package/.duaer/specs/106-arch-hint-copy/spec.md +9 -0
  141. package/.duaer/specs/107-arch-frame-layout/delivery.json +8 -0
  142. package/.duaer/specs/107-arch-frame-layout/spec.md +12 -0
  143. package/.duaer/specs/107-arch-frame-layout/tasks.md +5 -0
  144. package/.duaer/specs/108-arch-no-chrome/delivery.json +8 -0
  145. package/.duaer/specs/108-arch-no-chrome/spec.md +11 -0
  146. package/.duaer/specs/109-arch-layout-repair/delivery.json +8 -0
  147. package/.duaer/specs/109-arch-layout-repair/spec.md +12 -0
  148. package/.duaer/specs/109-arch-layout-repair/tasks.md +5 -0
  149. package/.duaer/specs/110-arch-ready-copy/delivery.json +10 -0
  150. package/.duaer/specs/110-arch-ready-copy/spec.md +12 -0
  151. package/.duaer/specs/110-arch-ready-copy/tasks.md +7 -0
  152. package/.duaer/specs/111-arch-confirm-click/delivery.json +10 -0
  153. package/.duaer/specs/111-arch-confirm-click/spec.md +18 -0
  154. package/.duaer/specs/111-arch-confirm-click/tasks.md +5 -0
  155. package/.duaer/specs/112-duaer-brand-copy/delivery.json +10 -0
  156. package/.duaer/specs/112-duaer-brand-copy/spec.md +27 -0
  157. package/.duaer/specs/112-duaer-brand-copy/tasks.md +5 -0
  158. package/.duaer/specs/113-arch-diagram-height/delivery.json +10 -0
  159. package/.duaer/specs/113-arch-diagram-height/spec.md +14 -0
  160. package/.duaer/specs/113-arch-diagram-height/tasks.md +5 -0
  161. package/.duaer/specs/114-guide-doc-github/delivery.json +10 -0
  162. package/.duaer/specs/114-guide-doc-github/spec.md +15 -0
  163. package/.duaer/specs/114-guide-doc-github/tasks.md +5 -0
  164. package/.duaer/specs/115-panel-scroll-hold/delivery.json +10 -0
  165. package/.duaer/specs/115-panel-scroll-hold/spec.md +19 -0
  166. package/.duaer/specs/115-panel-scroll-hold/tasks.md +5 -0
  167. package/.duaer/specs/116-arch-node-zoom/delivery.json +10 -0
  168. package/.duaer/specs/116-arch-node-zoom/spec.md +18 -0
  169. package/.duaer/specs/116-arch-node-zoom/tasks.md +5 -0
  170. package/.duaer/specs/117-dispatch-done-state/delivery.json +14 -0
  171. package/.duaer/specs/117-dispatch-done-state/spec.md +30 -0
  172. package/.duaer/specs/117-dispatch-done-state/tasks.md +6 -0
  173. package/.duaer/specs/118-preview-result-visible/delivery.json +14 -0
  174. package/.duaer/specs/118-preview-result-visible/spec.md +30 -0
  175. package/.duaer/specs/118-preview-result-visible/tasks.md +5 -0
  176. package/.duaer/specs/119-arch-revise-keep/delivery.json +14 -0
  177. package/.duaer/specs/119-arch-revise-keep/spec.md +34 -0
  178. package/.duaer/specs/119-arch-revise-keep/tasks.md +5 -0
  179. package/.duaer/specs/120-preview-required/delivery.json +14 -0
  180. package/.duaer/specs/120-preview-required/spec.md +31 -0
  181. package/.duaer/specs/120-preview-required/tasks.md +5 -0
  182. package/.duaer/specs/121-preview-start-service/delivery.json +15 -0
  183. package/.duaer/specs/121-preview-start-service/spec.md +26 -0
  184. package/.duaer/specs/121-preview-start-service/tasks.md +5 -0
  185. package/.duaer/specs/122-revise-chat-persist/delivery.json +13 -0
  186. package/.duaer/specs/122-revise-chat-persist/spec.md +18 -0
  187. package/.duaer/specs/122-revise-chat-persist/tasks.md +5 -0
  188. package/.duaer/specs/123-remove-beginner-slogan/delivery.json +9 -0
  189. package/.duaer/specs/123-remove-beginner-slogan/spec.md +26 -0
  190. package/.duaer/specs/123-remove-beginner-slogan/tasks.md +6 -0
  191. package/.duaer/specs/124-header-github-stars/delivery.json +9 -0
  192. package/.duaer/specs/124-header-github-stars/spec.md +31 -0
  193. package/.duaer/specs/124-header-github-stars/tasks.md +6 -0
  194. package/.duaer/specs/125-result-service-status/delivery.json +10 -0
  195. package/.duaer/specs/125-result-service-status/spec.md +32 -0
  196. package/.duaer/specs/125-result-service-status/tasks.md +5 -0
  197. package/.duaer/specs/126-new-project-full-reset/delivery.json +10 -0
  198. package/.duaer/specs/126-new-project-full-reset/spec.md +30 -0
  199. package/.duaer/specs/126-new-project-full-reset/tasks.md +4 -0
  200. package/.duaer/specs/127-progress-text-overflow/delivery.json +8 -0
  201. package/.duaer/specs/127-progress-text-overflow/spec.md +12 -0
  202. package/.duaer/specs/127-progress-text-overflow/tasks.md +4 -0
  203. package/.duaer/specs/128-claude-trust-dialog/delivery.json +9 -0
  204. package/.duaer/specs/128-claude-trust-dialog/spec.md +31 -0
  205. package/.duaer/specs/128-claude-trust-dialog/tasks.md +5 -0
  206. package/.duaer/specs/129-result-one-line/delivery.json +8 -0
  207. package/.duaer/specs/129-result-one-line/spec.md +14 -0
  208. package/.duaer/specs/129-result-one-line/tasks.md +4 -0
  209. package/.duaer/specs/130-result-bar-layout/delivery.json +8 -0
  210. package/.duaer/specs/130-result-bar-layout/spec.md +13 -0
  211. package/.duaer/specs/130-result-bar-layout/tasks.md +5 -0
  212. package/.duaer/specs/131-revise-card-versions/delivery.json +9 -0
  213. package/.duaer/specs/131-revise-card-versions/spec.md +27 -0
  214. package/.duaer/specs/131-revise-card-versions/tasks.md +7 -0
  215. package/.duaer/specs/132-revise-arch-after-plan/delivery.json +9 -0
  216. package/.duaer/specs/132-revise-arch-after-plan/spec.md +29 -0
  217. package/.duaer/specs/132-revise-arch-after-plan/tasks.md +7 -0
  218. package/.duaer/specs/133-button-styles/delivery.json +5 -0
  219. package/.duaer/specs/133-button-styles/spec.md +14 -0
  220. package/.duaer/specs/133-button-styles/tasks.md +6 -0
  221. package/.duaer/specs/134-revise-version-expand/delivery.json +9 -0
  222. package/.duaer/specs/134-revise-version-expand/spec.md +21 -0
  223. package/.duaer/specs/134-revise-version-expand/tasks.md +6 -0
  224. package/.duaer/specs/135-revise-chat-visible/delivery.json +5 -0
  225. package/.duaer/specs/135-revise-chat-visible/spec.md +13 -0
  226. package/.duaer/specs/135-revise-chat-visible/tasks.md +3 -0
  227. package/.duaer/specs/136-revise-click/delivery.json +1 -0
  228. package/.duaer/specs/136-revise-click/spec.md +16 -0
  229. package/.duaer/specs/136-revise-click/tasks.md +5 -0
  230. package/.duaer/specs/137-btn-chrome/delivery.json +11 -0
  231. package/.duaer/specs/137-btn-chrome/spec.md +11 -0
  232. package/.duaer/specs/137-btn-chrome/tasks.md +5 -0
  233. package/.duaer/specs/138-revise-send-msg/delivery.json +11 -0
  234. package/.duaer/specs/138-revise-send-msg/spec.md +18 -0
  235. package/.duaer/specs/138-revise-send-msg/tasks.md +5 -0
  236. package/.duaer/specs/139-revise-first-click/delivery.json +11 -0
  237. package/.duaer/specs/139-revise-first-click/spec.md +22 -0
  238. package/.duaer/specs/139-revise-first-click/tasks.md +6 -0
  239. package/.duaer/specs/140-revise-kickoff-stack/delivery.json +11 -0
  240. package/.duaer/specs/140-revise-kickoff-stack/spec.md +19 -0
  241. package/.duaer/specs/140-revise-kickoff-stack/tasks.md +6 -0
  242. package/.duaer/specs/141-revise-stack-2/delivery.json +11 -0
  243. package/.duaer/specs/141-revise-stack-2/spec.md +19 -0
  244. package/.duaer/specs/141-revise-stack-2/tasks.md +6 -0
  245. package/.duaer/specs/142-arch-node-popup/delivery.json +11 -0
  246. package/.duaer/specs/142-arch-node-popup/spec.md +18 -0
  247. package/.duaer/specs/142-arch-node-popup/tasks.md +4 -0
  248. package/.duaer/specs/143-arch-popup-upgrade/delivery.json +10 -0
  249. package/.duaer/specs/143-arch-popup-upgrade/spec.md +12 -0
  250. package/.duaer/specs/143-arch-popup-upgrade/tasks.md +4 -0
  251. package/.duaer/specs/144-arch-popup-offset/delivery.json +10 -0
  252. package/.duaer/specs/144-arch-popup-offset/spec.md +11 -0
  253. package/.duaer/specs/144-arch-popup-offset/tasks.md +4 -0
  254. package/.duaer/specs/145-arch-popup-visible/delivery.json +10 -0
  255. package/.duaer/specs/145-arch-popup-visible/spec.md +13 -0
  256. package/.duaer/specs/145-arch-popup-visible/tasks.md +4 -0
  257. package/.duaer/specs/146-arch-popup-gutter/delivery.json +10 -0
  258. package/.duaer/specs/146-arch-popup-gutter/spec.md +17 -0
  259. package/.duaer/specs/146-arch-popup-gutter/tasks.md +4 -0
  260. package/.duaer/specs/147-arch-expand-noscroll/delivery.json +10 -0
  261. package/.duaer/specs/147-arch-expand-noscroll/spec.md +14 -0
  262. package/.duaer/specs/147-arch-expand-noscroll/tasks.md +5 -0
  263. package/.duaer/specs/148-release-018/spec.md +12 -0
  264. package/.duaer/specs/148-release-018/tasks.md +4 -0
  265. package/AGENTS.md +15 -4
  266. package/CHANGELOG.md +267 -0
  267. package/DUADER.md +11 -6
  268. package/README.md +32 -16
  269. package/README.zh-CN.md +17 -10
  270. package/bin/deploy-targets.mjs +148 -0
  271. package/bin/duaer-live.mjs +1353 -220
  272. package/bin/duaer.mjs +14 -3
  273. package/bin/live-archify.mjs +808 -0
  274. package/bin/live-claude-trust.mjs +111 -0
  275. package/bin/live-preview.mjs +362 -0
  276. package/bin/live-progress.mjs +203 -0
  277. package/bin/live-project-chat.mjs +319 -0
  278. package/bin/live-projects.mjs +113 -0
  279. package/bin/live-repo-path.mjs +88 -0
  280. package/bin/live-tooling.mjs +308 -0
  281. package/bin/live-worktree-name.mjs +57 -0
  282. package/bin/update-check.mjs +1 -1
  283. package/docs/agent/README.md +3 -0
  284. package/docs/agent/deploy-github.md +1 -1
  285. package/docs/agent/deploy-targets.md +81 -0
  286. package/docs/agent/e2e-test-plan.md +110 -4
  287. package/docs/agent/worker-models.md +108 -0
  288. package/docs/agent/worker-models.zh-CN.md +99 -0
  289. package/package.json +2 -2
  290. package/web/live-dev/app.js +3580 -386
  291. package/web/live-dev/architecture-ir.mjs +170 -0
  292. package/web/live-dev/choice-options.mjs +59 -0
  293. package/web/live-dev/i18n.js +413 -84
  294. package/web/live-dev/index.html +239 -67
  295. package/web/live-dev/structured-html.mjs +204 -0
  296. package/web/live-dev/styles.css +1301 -136
@@ -1,4 +1,4 @@
1
- <!-- Keep AI-generated page copy minimal (duaer-spec agent ops) -->
1
+ <!-- Desk UI copy minimal + Duaer brand (duaer-spec agent ops) -->
2
2
 
3
3
  # AI-generated page content
4
4
 
@@ -7,3 +7,13 @@ AI-generated pages must not contain redundant explanatory text.
7
7
  - No filler introductions, repeated summaries, or prose that only explains an obvious control
8
8
  - Prefer concise labels, headings, helper text, and empty states
9
9
  - Put rationale and implementation detail in docs or code comments, not in the UI, unless the user asks for explanatory content
10
+
11
+ ## Duaer brand (site-wide)
12
+
13
+ Visible live-desk / FED copy that names the product surface must include the
14
+ **Duaer** brand (or **Duaer-spec FED** where that full mark is already used).
15
+
16
+ - Do not write anonymous「台面」/ “desk” alone when referring to this product’s
17
+ chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk”
18
+ - Keep helper text short; branding is a name signal, not a slogan paragraph
19
+ - Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Keep AI-generated page copy minimal (duaer-spec agent ops)
2
+ description: Desk UI copy minimal + Duaer brand (duaer-spec agent ops)
3
3
  alwaysApply: true
4
4
  ---
5
5
 
@@ -10,3 +10,13 @@ AI-generated pages must not contain redundant explanatory text.
10
10
  - No filler introductions, repeated summaries, or prose that only explains an obvious control
11
11
  - Prefer concise labels, headings, helper text, and empty states
12
12
  - Put rationale and implementation detail in docs or code comments, not in the UI, unless the user asks for explanatory content
13
+
14
+ ## Duaer brand (site-wide)
15
+
16
+ Visible live-desk / FED copy that names the product surface must include the
17
+ **Duaer** brand (or **Duaer-spec FED** where that full mark is already used).
18
+
19
+ - Do not write anonymous「台面」/ “desk” alone when referring to this product’s
20
+ chat surface or model setup — prefer「Duaer 台面」/ “Duaer desk”
21
+ - Keep helper text short; branding is a name signal, not a slogan paragraph
22
+ - Applies to i18n strings, HTML fallbacks, empty states, and setup/settings copy
@@ -1,6 +1 @@
1
- {
2
- "featureDir": ".duaer/specs/060-release-016",
3
- "branch": "feat/release-016",
4
- "worktree": ".worktree/feat-release-016",
5
- "status": "accepted"
6
- }
1
+ {"slug":"148-release-018","spec":".duaer/specs/148-release-018/spec.md"}
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "onWorktreeRemove": {
4
- "stop": "Stop any process whose working directory is under the request worktree (dev servers, file watchers, local APIs).",
4
+ "stop": "Stop any process whose working directory is under the request worktree (dev servers, file watchers, local APIs). Also stop the FED desk if it was started from a worktree copy of duaer-live.",
5
5
  "restartFromPrimary": true,
6
- "commands": []
6
+ "commands": [
7
+ "launchctl kickstart -k \"gui/$(id -u)/com.duaer.live8787\" 2>/dev/null || (lsof -t -iTCP:8787 -sTCP:LISTEN | xargs kill 2>/dev/null; sleep 1; node bin/duaer-live.mjs --port 8787)"
8
+ ]
7
9
  },
8
- "notes": "After merging into develop (or hotfix main), stop worktree-bound processes, remove .worktree/<id>, then restart from the primary checkout. Add commands such as \"npm run dev\" when this project needs a local service after handoff. Empty commands = stop only; agent still reports handoff."
10
+ "notes": "After merge to develop: remove worktree, then restart Duaer-spec FED (LaunchAgent com.duaer.live8787) so /api/projects and other new routes load from primary checkout."
9
11
  }
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T01:00:00.000Z",
4
+ "summary": "Position norms → satisfactory delivery; stricter checkable acceptance gate for confirm/revise; docs and live hints updated.",
5
+ "verification": {
6
+ "levels": ["L0", "L1", "L3"],
7
+ "commands": ["npm test"],
8
+ "result": "pass (18 tests)"
9
+ }
10
+ }
@@ -0,0 +1,39 @@
1
+ # Feature Specification: Spec AI for satisfactory delivery
2
+
3
+ **Feature Branch**: `feat/satisfactory-delivery`
4
+
5
+ **Created**: 2026-09-18
6
+
7
+ **Status**: Accepted
8
+
9
+ ## Goal
10
+
11
+ Position Duaer as **规范 AI → 满意交付**: acceptance must be objectively
12
+ checkable before confirm/revise dispatch, and public docs lead with that
13
+ promise—not phase/skill names.
14
+
15
+ ## In scope
16
+
17
+ - Stricter local + LLM validate gate for confirm and revise cards
18
+ - Positioning copy: README EN/ZH, package description, DUADER, live desk tag/hints
19
+ - Dispatch/revise agent prompts emphasize meeting Acceptance + openable preview
20
+ - Tests + CHANGELOG / E2E note
21
+
22
+ ## Out of scope
23
+
24
+ - npm release / promote to main (ship when asked)
25
+ - Layout redesign
26
+ - New columns or cloud hosting
27
+
28
+ ## Acceptance
29
+
30
+ 1. Vague acceptance (e.g.「更好用」/ “looks better”) fails `/api/validate` locally
31
+ 2. Checkable acceptance (open X / see Y / command passes) can still pass the gate
32
+ 3. README EN/ZH lead with 规范 → 满意交付 (English: norms → satisfactory delivery)
33
+ 4. `npm test` passes
34
+
35
+ ## Assumptions
36
+
37
+ - Worktree: `.worktree/feat-satisfactory-delivery`
38
+ - Brief: `.duaer/specs/061-satisfactory-delivery/`
39
+ - User confirmed evolution direction; no further intent wait
@@ -0,0 +1,5 @@
1
+ # Tasks: Spec AI for satisfactory delivery
2
+
3
+ - [x] Stricter acceptance gate (local heuristics + ACCEPT_PROMPT)
4
+ - [x] Positioning docs + live i18n hints
5
+ - [x] Agent prompts; tests; merge develop
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T01:20:00.000Z",
4
+ "summary": "Live desk launches DeepSeek TUI (deepseek) as a third CLI digital employee with PATH discovery for npm/nvm/cargo.",
5
+ "verification": {
6
+ "levels": ["L0", "L1", "L3"],
7
+ "commands": ["npm test"],
8
+ "result": "pass (19 tests)"
9
+ }
10
+ }
@@ -0,0 +1,37 @@
1
+ # Feature Specification: DeepSeek CLI digital employee
2
+
3
+ **Feature Branch**: `feat/deepseek-cli`
4
+
5
+ **Created**: 2026-09-18
6
+
7
+ **Status**: Accepted
8
+
9
+ ## Goal
10
+
11
+ Live desk can launch **DeepSeek TUI** (`deepseek` / `deepseek-tui`) as a third
12
+ CLI digital employee alongside Cursor Agent and Claude Code.
13
+
14
+ ## In scope
15
+
16
+ - Detect `deepseek` on PATH (incl. npm global / nvm / cargo bins under launchd)
17
+ - Dispatch + revise Terminal launch with workspace, YOLO tools, optional `--continue`
18
+ - Preempt matching for deepseek processes; install hint `npm install -g deepseek-tui`
19
+ - README / i18n / tests
20
+
21
+ ## Out of scope
22
+
23
+ - Embedding DeepSeek API chat (already used for desk validate) as the worker
24
+ - Shipping npm release unless asked
25
+
26
+ ## Acceptance
27
+
28
+ 1. With `deepseek` installed, desk lists **DeepSeek** as available CLI
29
+ 2. Dispatch/revise enqueue a Terminal command using `deepseek -w <worktree> …`
30
+ 3. Without `deepseek`, missing list shows install command
31
+ 4. `npm test` passes
32
+
33
+ ## Assumptions
34
+
35
+ - Target CLI: DeepSeek-TUI entrypoint `deepseek` (`npm i -g deepseek-tui`)
36
+ - Worktree: `.worktree/feat-deepseek-cli`
37
+ - Brief: `.duaer/specs/062-deepseek-cli/`
@@ -0,0 +1,4 @@
1
+ # Tasks: DeepSeek CLI digital employee
2
+
3
+ - [x] Catalog + detect + PATH dirs; launch + preempt
4
+ - [x] Docs/i18n/tests; merge develop
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T01:50:00.000Z",
4
+ "summary": "Define queuedCount on fresh Terminal open path to stop ReferenceError.",
5
+ "verification": {
6
+ "levels": ["L0", "L1"],
7
+ "commands": ["npm test"],
8
+ "result": "pass"
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ # Feature Specification: Fix queuedCount ReferenceError
2
+
3
+ **Feature Branch**: `fix/queued-count`
4
+ **Brief**: `.duaer/specs/063-queued-count/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+ Fresh Terminal open path must not throw `queuedCount is not defined`.
9
+
10
+ ## Acceptance
11
+ 1. Unhealthy-runner launch return uses a defined queue depth
12
+ 2. `npm test` passes
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Define queuedCount on fresh Terminal open path
3
+ - [x] Test + merge develop
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T02:00:00.000Z",
4
+ "summary": "Missing CLI chips show install commands; install panel + redetect for PATH refresh.",
5
+ "verification": {
6
+ "levels": ["L0", "L1", "L3"],
7
+ "commands": ["npm test"],
8
+ "result": "pass (19 tests)"
9
+ }
10
+ }
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Show CLI install commands when missing
2
+
3
+ **Feature Branch**: `feat/cli-install-show`
4
+ **Brief**: `.duaer/specs/064-cli-install-show/`
5
+ **Status**: Accepted
6
+
7
+ ## Goal
8
+
9
+ 「用哪个 CLI 数字员工启动」must detect install status; if not installed,
10
+ show the install command clearly (on the chip + install panel), with redetect.
11
+
12
+ ## Acceptance
13
+
14
+ 1. Missing CLIs render as distinct chips with install command text visible
15
+ 2. Install panel lists the selected missing CLI’s command + copy button
16
+ 3. Redetect button refreshes `/api/agents`
17
+ 4. `npm test` passes
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Missing chips show install cmd; panel + redetect
3
+ - [x] i18n/CSS/tests; merge develop
@@ -0,0 +1,18 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "featureDir": ".duaer/specs/065-detailed-progress",
5
+ "branch": "feat/detailed-progress",
6
+ "worktree": ".worktree/feat-detailed-progress",
7
+ "verification": {
8
+ "levels": ["L0", "L1", "L3"],
9
+ "commands": [
10
+ "node --check bin/duaer-live.mjs",
11
+ "node --check bin/live-progress.mjs",
12
+ "node --check web/live-dev/app.js",
13
+ "npm test",
14
+ "npm run test:live"
15
+ ],
16
+ "notes": "Richer default tasks.md, status.activity, progress-activity UI"
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ # Feature Specification: Detailed coding progress
2
+
3
+ **Feature Branch**: `feat/detailed-progress`
4
+ **Brief**: `.duaer/specs/065-detailed-progress/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Live desk progress shows more than 3 coarse tasks: a finer `tasks.md`
10
+ checklist on dispatch, stronger agent check-off rules, and live worktree
11
+ file activity while the CLI runs.
12
+
13
+ ## Acceptance
14
+
15
+ 1. New dispatch writes ≥6 checkbox tasks (not only T001–T003)
16
+ 2. `/api/status` includes `activity` (recent changed files / git porcelain)
17
+ 3. Progress column shows activity under the task list while work is running
18
+ 4. Agent launch prompt requires expanding/checking detailed tasks
19
+ 5. `npm test` passes
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+ - [x] Richer default tasks.md + agent prompt
3
+ - [x] worktree activity on status + UI
4
+ - [x] Tests/docs; merge develop
@@ -0,0 +1,16 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "featureDir": ".duaer/specs/066-duaer-fed",
5
+ "branch": "feat/duaer-fed",
6
+ "worktree": ".worktree/feat-duaer-fed",
7
+ "verification": {
8
+ "levels": ["L0", "L1", "L3"],
9
+ "commands": [
10
+ "node --check bin/duaer-live.mjs",
11
+ "node --check web/live-dev/i18n.js",
12
+ "npm test",
13
+ "npm run test:live"
14
+ ]
15
+ }
16
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: Brand live desk as Duaer FED
2
+
3
+ **Feature Branch**: `feat/duaer-fed`
4
+ **Brief**: `.duaer/specs/066-duaer-fed/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ User-facing name for the web confirm desk is **Duaer FED** (Field
10
+ Engineering Desk). Chinese keeps「现场开发」as the secondary mark.
11
+
12
+ ## Acceptance
13
+
14
+ 1. Desk header brand + document title show `Duaer FED`
15
+ 2. zh mark is「现场开发」; en mark is `Field Engineering Desk`
16
+ 3. README EN/ZH section titles use Duaer FED; CLI help / start banner say FED
17
+ 4. Agent/system prompts refer to Duaer FED (not only「现场开发」)
18
+ 5. `duaer live` command path unchanged; `npm test` + `npm run test:live` pass
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+ - [x] UI i18n + index title/brand
3
+ - [x] CLI banner, README, agent prompts
4
+ - [x] Tests/docs; merge develop
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "featureDir": ".duaer/specs/067-duaer-spec-fed",
5
+ "branch": "feat/duaer-spec-fed",
6
+ "worktree": ".worktree/feat-duaer-spec-fed",
7
+ "verification": {
8
+ "levels": ["L0", "L1", "L3"],
9
+ "commands": ["npm test", "npm run test:live"]
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ # Feature Specification: Brand as Duaer-spec FED
2
+
3
+ **Feature Branch**: `feat/duaer-spec-fed`
4
+ **Brief**: `.duaer/specs/067-duaer-spec-fed/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Correct the live desk product name from `Duaer FED` to **Duaer-spec FED**
10
+ (tied to the duaer-spec product).
11
+
12
+ ## Acceptance
13
+
14
+ 1. Header, title, CLI banner/help, README, and agent prompts say `Duaer-spec FED`
15
+ 2. Secondary marks unchanged (zh on-site desk / en Field Engineering Desk)
16
+ 3. Brand tests updated; `npm test` + `npm run test:live` pass
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Rename Duaer FED → Duaer-spec FED across UI/docs/CLI
3
+ - [x] Update brand test; verify; merge develop
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "featureDir": ".duaer/specs/068-fed-ux-polish",
5
+ "branch": "feat/fed-ux-polish",
6
+ "worktree": ".worktree/feat-fed-ux-polish",
7
+ "verification": {
8
+ "levels": ["L0", "L1", "L3"],
9
+ "commands": ["npm test", "npm run test:live"]
10
+ }
11
+ }
@@ -0,0 +1,18 @@
1
+ # Feature Specification: FED UX polish
2
+
3
+ **Feature Branch**: `feat/fed-ux-polish`
4
+ **Brief**: `.duaer/specs/068-fed-ux-polish/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Raise Duaer-spec FED visual and interaction quality: fix missing surface
10
+ styles, clearer hierarchy (brand / CTAs / empty states), without a layout
11
+ redesign or light-theme flip.
12
+
13
+ ## Acceptance
14
+
15
+ 1. History drawer and install/code chips have readable dark surfaces
16
+ 2. Brand shows `Duaer-spec` + accented `FED`; chat + progress have empty states
17
+ 3. Primary / confirm CTAs read as stronger go-actions; scrollbars + selection styled
18
+ 4. `npm test` + `npm run test:live` pass
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+ - [x] Surfaces, CTAs, brand, empty states (CSS/HTML/i18n)
3
+ - [x] Wire chat-empty hide on first bubble
4
+ - [x] Tests/docs; merge develop
@@ -0,0 +1,6 @@
1
+ {
2
+ "status": "accepted",
3
+ "featureDir": ".duaer/specs/069-history-btn-size",
4
+ "branch": "fix/history-btn-size",
5
+ "verification": { "levels": ["L1", "L3"], "commands": ["npm test", "npm run test:live"] }
6
+ }
@@ -0,0 +1,14 @@
1
+ # Feature Specification: Align history button size
2
+
3
+ **Feature Branch**: `fix/history-btn-size`
4
+ **Brief**: `.duaer/specs/069-history-btn-size/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Header **History** control matches the language `<select>` height and padding.
10
+
11
+ ## Acceptance
12
+
13
+ 1. History button and lang select share the same control height / type size
14
+ 2. `npm test` + `npm run test:live` pass
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Match history btn to lang select size
3
+ - [x] Verify; merge develop
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "featureDir": ".duaer/specs/070-validate-autofix-btn",
4
+ "branch": "feat/validate-autofix-btn",
5
+ "verification": {
6
+ "levels": ["L1", "L3"],
7
+ "commands": ["npm test", "npm run test:live"]
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Auto-handle on validate fail
2
+
3
+ **Feature Branch**: `feat/validate-autofix-btn`
4
+ **Brief**: `.duaer/specs/070-validate-autofix-btn/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ When the confirm/revise card shows validation failed, offer an **自动处理**
10
+ button that runs auto-fix and reports progress in the chat column.
11
+
12
+ ## Acceptance
13
+
14
+ 1. Failed validate shows an **自动处理** button near the fail hint
15
+ 2. Click posts a chat bubble and calls `/api/validate/fix`, then updates the card
16
+ 3. Success unlocks confirm/revise dispatch without forcing silent lock; failure stays retryable in chat
17
+ 4. `npm test` + `npm run test:live` pass
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Auto-handle button + chat flow
3
+ - [x] Tests; merge develop
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "featureDir": ".duaer/specs/071-req-structured-display",
4
+ "branch": "feat/req-structured-display",
5
+ "verification": {
6
+ "levels": ["L1", "L3"],
7
+ "commands": ["npm test", "npm run test:live"]
8
+ }
9
+ }
@@ -0,0 +1,17 @@
1
+ # Feature Specification: Structured requirements display
2
+
3
+ **Feature Branch**: `feat/req-structured-display`
4
+ **Brief**: `.duaer/specs/071-req-structured-display/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Middle confirm/revise card fields show structured blocks (lists / items),
10
+ not one jammed paragraph when the model returns `;` / `;` / numbered clauses.
11
+
12
+ ## Acceptance
13
+
14
+ 1. Semicolon-joined acceptance renders as separate list items
15
+ 2. Inline `1、… 2、…` renders as an ordered list
16
+ 3. List items have clear visual separation (req-item)
17
+ 4. `npm test` + `npm run test:live` pass
@@ -0,0 +1,3 @@
1
+ # Tasks
2
+ - [x] Normalize + structuredHtml module + CSS
3
+ - [x] Tests; merge develop
@@ -0,0 +1,14 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "npm test",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ },
13
+ "summary": "Chat send no longer silent when locked; Enter-to-send; composer sync; locked card skips applyCard writes."
14
+ }
@@ -0,0 +1,48 @@
1
+ # Feature Specification: Chat send not silent / stuck
2
+
3
+ **Feature Branch**: `fix/chat-send`
4
+ **Brief**: `.duaer/specs/072-chat-send/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Live desk chat must always give clear feedback when send is blocked, keep the
10
+ Send control in sync with gate state, support Enter-to-send, and remain usable
11
+ after Confirm / History restore (conversation without silently mutating a
12
+ locked Brief).
13
+
14
+ ## Problem
15
+
16
+ Composer submit returns early when `locked` / `busy` / not ready with **no**
17
+ UI feedback; Send stays enabled while locked, so clicks look broken. Enter in
18
+ the textarea only inserts a newline. After Confirm or History restore, chat is
19
+ fully blocked even for clarifying dialogue.
20
+
21
+ ## In scope
22
+
23
+ - `chatAllowed` / block reasons surfaced in chat (not silent)
24
+ - `syncComposerEnabled` for Send (+ optional placeholder)
25
+ - Enter sends; Shift+Enter newline
26
+ - When specify card is locked: still allow chat; skip applying card field
27
+ updates from the model (direct user to Revise for Brief changes)
28
+ - Stuck `busy` recovery when user retries after a long wait
29
+
30
+ ## Out of scope
31
+
32
+ - Changing validate-before-confirm gate
33
+ - Revise dispatch / Terminal behavior
34
+
35
+ ## Acceptance
36
+
37
+ 1. Locked specify job: typing + Send (or Enter) posts a user bubble and gets a
38
+ reply (or a clear busy/not-ready message); locked card fields are not
39
+ overwritten by chat `goal`/`acceptance` patches
40
+ 2. While busy / not ready / revise-dispatching: Send is disabled or a bot bubble
41
+ explains why; no silent no-op
42
+ 3. Enter sends; Shift+Enter keeps newline
43
+ 4. `node --check web/live-dev/app.js`; `npm test`; `npm run test:live`
44
+
45
+ ## Assumptions
46
+
47
+ - Worktree: `.worktree/fix-chat-send` (not named `072-chat-send`)
48
+ - Hotfix: clear repro → implement after Brief without blocking confirm wait
@@ -0,0 +1,5 @@
1
+ # Tasks: Chat send
2
+
3
+ - [x] Composer gate: allow chat when locked; feedback + syncComposerEnabled + Enter
4
+ - [x] applyCard skips specify writes while locked; i18n + E2E + CHANGELOG
5
+ - [x] Verify L0/L1/L3; stamp delivery; merge develop; handoff
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": ["node --check web/live-dev/i18n.js", "npm test", "npm run test:live"],
7
+ "result": "pass"
8
+ },
9
+ "summary": "Chat empty hint is three numbered steps instead of one semicolon line."
10
+ }
@@ -0,0 +1,28 @@
1
+ # Feature Specification: Structured chat empty hint
2
+
3
+ **Feature Branch**: `feat/empty-structured`
4
+ **Brief**: `.duaer/specs/073-empty-structured/`
5
+ **Status**: Active
6
+
7
+ ## Goal
8
+
9
+ Chat empty-state guidance (“用大白话说想要什么…”) shows as a **structured
10
+ step list**, not one jammed semicolon sentence.
11
+
12
+ ## In scope
13
+
14
+ - Empty hint as ordered / stepped blocks (zh + en)
15
+ - Styles matching desk (no cards clutter)
16
+ - Locale switch updates the steps
17
+
18
+ ## Out of scope
19
+
20
+ - Confirm-card structuredHtml changes
21
+ - Onboarding wizard beyond empty state
22
+
23
+ ## Acceptance
24
+
25
+ 1. Empty state shows discrete steps (plain words → confirm/dispatch → deliver
26
+ to acceptance), not a single `;`/`;` line
27
+ 2. Locale switch updates steps; first bubble still hides empty state
28
+ 3. `npm test` + `npm run test:live` pass
@@ -0,0 +1,4 @@
1
+ # Tasks
2
+
3
+ - [x] HTML/CSS/i18n structured empty steps + sync on locale
4
+ - [x] E2E + CHANGELOG; verify L0/L1/L3; merge develop; handoff
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-18T00:00:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": ["node --check bin/duaer-live.mjs", "npm test", "npm run test:live"],
7
+ "result": "pass"
8
+ },
9
+ "summary": "Serve .mjs as text/javascript so structured-html module loads and desk chat UI runs."
10
+ }