duaer-spec 0.20.0 → 0.22.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 (64) hide show
  1. package/.claude/rules/duaer-spec.md +5 -2
  2. package/.cursor/rules/duaer-spec.mdc +5 -2
  3. package/.cursor/skills/duaer-do/SKILL.md +20 -2
  4. package/.cursor/skills/duaer-tasks/SKILL.md +8 -0
  5. package/.duaer/active-job.json +3 -3
  6. package/.duaer/memory/constitution.md +13 -0
  7. package/.duaer/specs/192-release-020/delivery.json +19 -0
  8. package/.duaer/specs/192-release-020/tasks.md +3 -3
  9. package/.duaer/specs/193-dispatch-must-accept/delivery.json +11 -0
  10. package/.duaer/specs/193-dispatch-must-accept/spec.md +17 -0
  11. package/.duaer/specs/193-dispatch-must-accept/tasks.md +6 -0
  12. package/.duaer/specs/194-chat-preview-link/delivery.json +11 -0
  13. package/.duaer/specs/194-chat-preview-link/spec.md +14 -0
  14. package/.duaer/specs/194-chat-preview-link/tasks.md +5 -0
  15. package/.duaer/specs/195-chat-link-garble/delivery.json +10 -0
  16. package/.duaer/specs/195-chat-link-garble/spec.md +17 -0
  17. package/.duaer/specs/195-chat-link-garble/tasks.md +5 -0
  18. package/.duaer/specs/196-task-exec-graph/delivery.json +11 -0
  19. package/.duaer/specs/196-task-exec-graph/spec.md +15 -0
  20. package/.duaer/specs/196-task-exec-graph/tasks.md +6 -0
  21. package/.duaer/specs/197-task-graph-archify/delivery.json +12 -0
  22. package/.duaer/specs/197-task-graph-archify/spec.md +14 -0
  23. package/.duaer/specs/197-task-graph-archify/tasks.md +5 -0
  24. package/.duaer/specs/198-task-graph-labels/delivery.json +12 -0
  25. package/.duaer/specs/198-task-graph-labels/spec.md +12 -0
  26. package/.duaer/specs/198-task-graph-labels/tasks.md +5 -0
  27. package/.duaer/specs/199-preview-open-url/delivery.json +12 -0
  28. package/.duaer/specs/199-preview-open-url/spec.md +16 -0
  29. package/.duaer/specs/199-preview-open-url/tasks.md +5 -0
  30. package/.duaer/specs/200-preview-start-url/delivery.json +11 -0
  31. package/.duaer/specs/200-preview-start-url/spec.md +15 -0
  32. package/.duaer/specs/200-preview-start-url/tasks.md +5 -0
  33. package/.duaer/specs/201-arch-fullscreen/delivery.json +11 -0
  34. package/.duaer/specs/201-arch-fullscreen/spec.md +15 -0
  35. package/.duaer/specs/201-arch-fullscreen/tasks.md +5 -0
  36. package/.duaer/specs/202-release-021/delivery.json +18 -0
  37. package/.duaer/specs/202-release-021/spec.md +12 -0
  38. package/.duaer/specs/202-release-021/tasks.md +5 -0
  39. package/.duaer/specs/203-atomic-monitorable-tasks/delivery.json +13 -0
  40. package/.duaer/specs/203-atomic-monitorable-tasks/spec.md +44 -0
  41. package/.duaer/specs/203-atomic-monitorable-tasks/tasks.md +8 -0
  42. package/.duaer/specs/204-live-i18n-ja/delivery.json +14 -0
  43. package/.duaer/specs/204-live-i18n-ja/spec.md +34 -0
  44. package/.duaer/specs/204-live-i18n-ja/tasks.md +7 -0
  45. package/.duaer/specs/205-release-022/spec.md +12 -0
  46. package/.duaer/specs/205-release-022/tasks.md +6 -0
  47. package/.duaer/templates/tasks-template.md +4 -0
  48. package/CHANGELOG.md +64 -0
  49. package/bin/duaer-live.mjs +117 -14
  50. package/bin/live-deliverables.mjs +116 -36
  51. package/bin/live-modules.mjs +37 -7
  52. package/bin/live-preview.mjs +63 -12
  53. package/bin/live-progress.mjs +7 -38
  54. package/docs/agent/e2e-test-plan.md +20 -1
  55. package/docs/agent/live-desk.md +11 -1
  56. package/package.json +1 -1
  57. package/web/live-dev/acceptance-lines.mjs +42 -0
  58. package/web/live-dev/app.js +260 -46
  59. package/web/live-dev/chat-markdown.mjs +43 -3
  60. package/web/live-dev/i18n-ja.js +483 -0
  61. package/web/live-dev/i18n.js +34 -13
  62. package/web/live-dev/index.html +14 -13
  63. package/web/live-dev/styles.css +82 -4
  64. package/web/live-dev/task-graph.mjs +351 -0
@@ -28,9 +28,12 @@ For new behavior, fixes, refactors that change product behavior, or architecture
28
28
  3. Do **not** wait for `/duaer-do` or any other skill invocation.
29
29
  4. Do **not** say “please run `/duaer-specify`” — you do it.
30
30
  5. Do **not** dump a methodology tutorial unless they ask how Duaer works.
31
- 6. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
31
+ 6. **Break down to atomic, monitorable tasks:** each `tasks.md` item is one
32
+ independently verifiable atom with a `- [ ]` / `- [x]` checkbox; mark done
33
+ as you go so progress is visible. Do not leave only coarse mega-tasks.
34
+ 7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
32
35
  **`develop`**). Promote to **`main`** only if the user asks to go online.
33
- 7. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
36
+ 8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
34
37
  the worktree, then restart services from the primary checkout on `develop`
35
38
  using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
36
39
  on a dead worktree server.
@@ -32,9 +32,12 @@ For new behavior, fixes, refactors that change product behavior, or architecture
32
32
  3. Do **not** wait for `/duaer-do` or any other skill invocation.
33
33
  4. Do **not** say “please run `/duaer-specify`” — you do it.
34
34
  5. Do **not** dump a methodology tutorial unless they ask how Duaer works.
35
- 6. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
35
+ 6. **Break down to atomic, monitorable tasks:** each `tasks.md` item is one
36
+ independently verifiable atom with a `- [ ]` / `- [x]` checkbox; mark done
37
+ as you go so progress is visible. Do not leave only coarse mega-tasks.
38
+ 7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
36
39
  **`develop`**). Promote to **`main`** only if the user asks to go online.
37
- 7. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
40
+ 8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
38
41
  the worktree, then restart services from the primary checkout on `develop`
39
42
  using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
40
43
  on a dead worktree server.
@@ -54,7 +54,13 @@ Do **not** lecture about methodology. Do **not** ask them to run commands.
54
54
  - Deep ambiguity after a full Spec still uses `duaer-clarify` (up to 5
55
55
  questions). Understand is the **lightweight front door** on every ask.
56
56
 
57
- 3. **Break down** — If `tasks.md` missing, write a short checklist from the Spec.
57
+ 3. **Break down** — If `tasks.md` missing, write a checklist from the Spec.
58
+ **Atomic + monitorable (mandatory):**
59
+ - Split until each item is **one** independently verifiable acceptance /
60
+ deliverable atom (not a mega-phase).
61
+ - Every item is a markdown checkbox (`- [ ]` / `- [x]`) so progress can be
62
+ polled; check off immediately when that atom is done.
63
+ - Prefer one checkbox per Acceptance line; no artificial upper count.
58
64
  Skip a heavy plan unless architecture or contracts change.
59
65
 
60
66
  4. **Work** — Implement open tasks; mark `[x]` as you go. No scope beyond Spec.
@@ -67,10 +73,22 @@ Do **not** lecture about methodology. Do **not** ask them to run commands.
67
73
 
68
74
  6. **Handoff** — One line to the human:
69
75
  - `✅ Job accepted — ready for your review.`
70
- - `⏳ Job not accepted yet — <one sentence>.`
76
+ - `⏳ Job not accepted yet — <one sentence>.` (**not** for FDE / live-dispatch
77
+ — see below)
71
78
  - During Understand wait: `⏳ Confirming intent — <one sentence restatement>.`
72
79
  Never claim done unless accepted + tasks clear. Git is not locked by this.
73
80
 
81
+ ### FDE live-dispatch (mandatory finish)
82
+
83
+ When `.duaer/active-job.json` has `"source": "live-dispatch"` (Duaer-spec FDE
84
+ kicked you off), **every** assigned task must be completed and
85
+ `delivery.json` stamped `accepted` before you stop.
86
+
87
+ - **Do not** end with `⏳ Job not accepted yet` — that freezes the desk mid-coding.
88
+ - Mid-wave pause for the orchestrator is fine **only** as a quiet stop (no
89
+ unaccepted handoff line).
90
+ - Final line after stamp: `✅ Job accepted — ready for your review.`
91
+
74
92
  ## Hotfix
75
93
 
76
94
  Still a short Spec (symptom / cause / acceptance). Restate once; if repro is
@@ -139,6 +139,14 @@ The tasks.md should be immediately executable - each task must be specific enoug
139
139
 
140
140
  **CRITICAL**: Tasks MUST be organized by user story to enable independent implementation and testing.
141
141
 
142
+ **Atomic + monitorable (NON-NEGOTIABLE)**:
143
+ - Every task is **one** independently verifiable atom (one acceptance point,
144
+ one file-scoped change, or one verification slice) — not a bundled mega-task.
145
+ - Every task is a markdown checkbox (`- [ ]` / `- [x]`) so progress is
146
+ monitorable; agents mark `[x]` as each atom completes.
147
+ - Prefer one task per Acceptance / independent-test criterion. No artificial
148
+ upper count; refine if still too coarse.
149
+
142
150
  **Verification is DEFAULT**: For each user story, generate verification tasks
143
151
  from `.duaer/memory/testing.md` (L0–L3 as the risk table requires). Do **not**
144
152
  omit tests just because the Spec did not say “TDD”. Only skip a level when the
@@ -1,5 +1,5 @@
1
1
  {
2
- "feature": "192-release-020",
3
- "spec": ".duaer/specs/192-release-020/spec.md",
4
- "updatedAt": "2026-09-19T02:50:00.000Z"
2
+ "featureDir": ".duaer/specs/205-release-022",
3
+ "slug": "205-release-022",
4
+ "updatedAt": "2026-09-19T07:35:00.000Z"
5
5
  }
@@ -41,3 +41,16 @@ cannot cover the path.
41
41
  **Job handoff (not a git lock):** the agent reports accept/open itself.
42
42
  Default policy `coach` — do not claim "done" while the active job is unfinished.
43
43
  Do not send the human to run `duaer status` for routine work.
44
+
45
+ ### V. Atomic verifiable tasks; progress must be monitorable (NON-NEGOTIABLE)
46
+
47
+ When breaking down work (`tasks.md`, kickoff task pool, or mid-job re-split):
48
+
49
+ 1. **Atomic + verifiable:** each task covers **one** independently checkable
50
+ acceptance point or deliverable slice. Do not bundle unrelated acceptance
51
+ into a mega-task.
52
+ 2. **Monitorable progress:** every task is a markdown checkbox
53
+ (`- [ ]` / `- [x]`). Mark `[x]` as soon as that atom is done so FDE / humans
54
+ can see progress. Do not replace checkboxes with prose-only status.
55
+ 3. Prefer splitting Acceptance lines (and Goal slices) over inventing coarse
56
+ phases. There is **no** artificial upper count; refine if still too coarse.
@@ -0,0 +1,19 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T02:48:00.000Z",
4
+ "summary": "0.20.0 shipped: develop+main pushed, tag v0.20.0, GitHub Release, npm publish success.",
5
+ "verification": {
6
+ "commands": [
7
+ "git push origin develop main v0.20.0",
8
+ "gh release create v0.20.0",
9
+ "gh run view 35416594850 (Publish npm package success)",
10
+ "npm view duaer-spec version → 0.20.0"
11
+ ],
12
+ "result": "pass"
13
+ },
14
+ "npm": {
15
+ "url": "https://www.npmjs.com/package/duaer-spec/v/0.20.0",
16
+ "label": "npm 0.20.0"
17
+ },
18
+ "release": "https://github.com/fujiezee/duaer-spec/releases/tag/v0.20.0"
19
+ }
@@ -1,6 +1,6 @@
1
1
  # Tasks — 192-release-020
2
2
 
3
3
  - [x] Brief
4
- - [ ] Bump 0.20.0 + CHANGELOG
5
- - [ ] Merge to develop; promote main; push; tag; gh release
6
- - [ ] Watch npm publish / stamp delivery
4
+ - [x] Bump 0.20.0 + CHANGELOG
5
+ - [x] Merge to develop; promote main; push; tag; gh release
6
+ - [x] Watch npm publish / stamp delivery
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:10:00.000Z",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs",
6
+ "L1": "node --test test/dispatch-must-accept.test.mjs test/live-orchestrate.test.mjs",
7
+ "L3": "npm run test:live",
8
+ "result": "pass"
9
+ },
10
+ "summary": "FDE dispatch must finish every task; forbid Job not accepted yet; accept nudge when checklist done."
11
+ }
@@ -0,0 +1,17 @@
1
+ # 193 — Dispatch must finish every task (no early “not accepted”)
2
+
3
+ ## Goal
4
+
5
+ FDE-dispatched digital employees must complete **every** assigned task and
6
+ stamp `delivery.json` `accepted`. They must not stop with
7
+ `⏳ Job not accepted yet` mid-job (that freezes product coding).
8
+
9
+ ## Acceptance
10
+
11
+ 1. Kickoff / wave / continue / revise prompts forbid “Job not accepted yet”
12
+ as a final handoff; require ✅ accepted only after all tasks + stamp.
13
+ 2. When all `tasks.md` boxes are checked but delivery is not accepted, status
14
+ poll nudges an idle lane to stamp accepted (once).
15
+ 3. `duaer-do` skill: for `source: live-dispatch` (and FDE worktrees), never end
16
+ unaccepted.
17
+ 4. L0 + unit/smoke markers; merge to develop.
@@ -0,0 +1,6 @@
1
+ # Tasks — 193-dispatch-must-accept
2
+
3
+ - [x] Brief
4
+ - [ ] Prompt harden + accept nudge in advanceOrchestration
5
+ - [ ] duaer-do skill + docs/E2E/tests
6
+ - [ ] Merge develop + handoff
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:25:00.000Z",
4
+ "verification": {
5
+ "L0": "node --check web/live-dev/chat-markdown.mjs; node --check web/live-dev/app.js",
6
+ "L1": "node --test test/chat-markdown.test.mjs",
7
+ "L3": "npm run test:live",
8
+ "result": "pass"
9
+ },
10
+ "summary": "Accepted chat bubble preview URL is clickable (markdown + bare URL auto-link)."
11
+ }
@@ -0,0 +1,14 @@
1
+ # 194 — Clickable preview URL in chat
2
+
3
+ ## Goal
4
+
5
+ When the desk posts「数字员工已做好…打开看看」with a preview URL, that URL
6
+ must be a real clickable link in the chat bubble (not plain text).
7
+
8
+ ## Acceptance
9
+
10
+ 1. Accepted bot bubble shows an `<a href>` for http(s) and `/api/…` preview URLs.
11
+ 2. Clicking opens in a new tab (noopener).
12
+ 3. Relative page paths still offer an open action via「打开看看」chip when not
13
+ directly linkable.
14
+ 4. L0 + chat-markdown / smoke tests; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 194-chat-preview-link
2
+
3
+ - [x] Brief
4
+ - [ ] chat-markdown auto-link + accepted bubble href
5
+ - [ ] Tests / E2E / merge
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:35:00.000Z",
4
+ "verification": {
5
+ "L1": "node --test test/chat-markdown.test.mjs",
6
+ "L3": "npm run test:live",
7
+ "result": "pass"
8
+ },
9
+ "summary": "Fix nested /api/result auto-link garble in chat preview URLs."
10
+ }
@@ -0,0 +1,17 @@
1
+ # 195 — Fix garbled chat preview links
2
+
3
+ ## Goal
4
+
5
+ Accepted-bubble preview links must not show broken HTML (e.g. raw
6
+ `target="_blank"` text) when the URL is `http://…/api/result/…`.
7
+
8
+ ## Cause
9
+
10
+ Bare `/api/result/…` auto-link matched inside an existing `http://host/api/result/…`
11
+ href and nested/broke the `<a>` tag.
12
+
13
+ ## Acceptance
14
+
15
+ 1. `http://127.0.0.1:8787/api/result/…` renders as one clean clickable link.
16
+ 2. Bare `/api/result/…` and `/api/artifact/…` still auto-link when standalone.
17
+ 3. Unit tests cover the nested-path regression; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 195-chat-link-garble
2
+
3
+ - [x] Brief
4
+ - [ ] Fix chat-markdown bare /api/ nesting; simplify accepted link
5
+ - [ ] Tests + merge
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:50:00.000Z",
4
+ "verification": {
5
+ "L0": "node --check web/live-dev/app.js; node --check web/live-dev/task-graph.mjs",
6
+ "L1": "node --test test/task-graph.test.mjs",
7
+ "L3": "npm run test:live",
8
+ "result": "pass"
9
+ },
10
+ "summary": "Worker count chips + SVG task dependency execution graph on kickoff."
11
+ }
@@ -0,0 +1,15 @@
1
+ # 196 — Worker chips + task dependency execution graph
2
+
3
+ ## Goal
4
+
5
+ Improve the digital-employee count control (chips instead of a bare select),
6
+ and show a **task path dependency graph** (architecture-panel look) driven by
7
+ module/task `dependsOn` and the selected worker count.
8
+
9
+ ## Acceptance
10
+
11
+ 1. Worker count is a chip radiogroup (1–4); selected state matches deploy chips.
12
+ 2. When the task pool is visible, an SVG dependency graph shows tasks, edges,
13
+ and worker lane coloring for the current count.
14
+ 3. Changing worker count re-assigns and re-renders the graph.
15
+ 4. Unit tests for layout/render; L3 smoke; merge develop.
@@ -0,0 +1,6 @@
1
+ # Tasks — 196-task-exec-graph
2
+
3
+ - [x] Brief
4
+ - [ ] Worker count chips + CSS
5
+ - [ ] task-graph.mjs layout/SVG + wire preview
6
+ - [ ] Tests / docs / merge
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:20:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3-archify-smoke"],
6
+ "commands": [
7
+ "node --test test/task-graph.test.mjs",
8
+ "renderArchitectureHtml smoke (workers 1–3)"
9
+ ],
10
+ "notes": "Task path IR uses Archify deliver; transitive reduction + ranked/lane positions for clean-flow validation."
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ # 197 — Task graph via Archify (same as architecture)
2
+
3
+ ## Goal
4
+
5
+ Task execution path uses the **same Archify renderer and left-to-right layered
6
+ layout** as the system architecture diagram — not a custom SVG.
7
+
8
+ ## Acceptance
9
+
10
+ 1. Kickoff task graph is produced via `/api/architecture/render` +
11
+ `mountArchitectureDiagram`.
12
+ 2. IR maps tasks → components, `dependsOn` → connections; layout matches Archify.
13
+ 3. Changing worker count re-renders the Archify graph.
14
+ 4. Unit tests for IR mapping; L3 smoke; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 197-task-graph-archify
2
+
3
+ - [x] Brief
4
+ - [x] taskPoolToArchitectureIr + mount via Archify
5
+ - [x] Tests / docs / merge
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:25:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --test test/task-graph.test.mjs",
8
+ "renderArchitectureHtml smoke (no depends/Workers)",
9
+ "npm run test:live"
10
+ ]
11
+ }
12
+ }
@@ -0,0 +1,12 @@
1
+ # 198 — Task graph: no redundant Archify labels
2
+
3
+ ## Goal
4
+
5
+ Kickoff task-path Archify diagram shows nodes and edges only — no
6
+ redundant edge/legend/subtitle copy (e.g. repeated "depends").
7
+
8
+ ## Acceptance
9
+
10
+ 1. Connections have no `label`.
11
+ 2. No legend `cards`; no meta `subtitle`.
12
+ 3. Unit tests assert label-free IR; L0/L1/L3; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 198-task-graph-labels
2
+
3
+ - [x] Brief
4
+ - [x] Strip depends / cards / subtitle from task IR
5
+ - [x] Tests / docs / merge
@@ -0,0 +1,12 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:30:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/app.js",
8
+ "node --test test/chat-markdown.test.mjs test/result-versions.test.mjs",
9
+ "npm run test:live"
10
+ ]
11
+ }
12
+ }
@@ -0,0 +1,16 @@
1
+ # 199 — 打开看看 opens the focused preview URL
2
+
3
+ ## Goal
4
+
5
+ Result-bar「打开看看」(and the same open path) must open the **currently
6
+ focused** preview URL (`state.lastPreviewUrl`), not always re-resolve the
7
+ latest delivery preview (which can be a different revision or a docs path).
8
+
9
+ ## Acceptance
10
+
11
+ 1. `/api/artifact|result/…` and other same-origin paths open directly.
12
+ 2. Public https URLs open directly.
13
+ 3. Local `http://localhost:…` still goes through `/api/preview/ensure`, then
14
+ opens the focused URL when set.
15
+ 4. Chat「打开看看」href stays a same-origin `/api/…` path (not a baked host).
16
+ 5. L0/L1/L3; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 199-preview-open-url
2
+
3
+ - [x] Brief
4
+ - [ ] Fix ensureAndOpenPreview + chatPreviewHref
5
+ - [ ] Tests / docs / merge
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:35:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --test test/live-preview.test.mjs",
8
+ "npm run test:live"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ # 200 — 打开看看 uses project start URL, not docs paths
2
+
3
+ ## Goal
4
+
5
+ 「打开看看」must open the **runnable product** (local service or HTML page),
6
+ never a documentation artifact such as `docs/**/*.md` even when
7
+ `delivery.preview.url` points there.
8
+
9
+ ## Acceptance
10
+
11
+ 1. Relative non-HTML preview paths are ignored for primary open URL.
12
+ 2. After an openable delivery path, prefer inferred local service over auto
13
+ HTML candidates when both exist.
14
+ 3. Status `preview` / accepted chat link use that openable URL (not `/api/result/…/*.md`).
15
+ 4. Unit + L3; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 200-preview-start-url
2
+
3
+ - [x] Brief
4
+ - [x] resolvePreviewPayload + status previewOut prefer start/HTML
5
+ - [x] Tests / docs / merge
@@ -0,0 +1,11 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T03:45:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --test test/arch-fullscreen.test.mjs test/task-graph.test.mjs",
8
+ "npm run test:live"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ # 201 — Architecture click opens fullscreen; keep user-facing hints
2
+
3
+ ## Goal
4
+
5
+ 1. Keep clear user-facing hints (e.g. task-path copy about layout / worker
6
+ colors) — written for humans, not jargon.
7
+ 2. Clicking the system architecture diagram (and task-path diagram) opens the
8
+ Archify HTML in a **new tab** with `present=1` for a fullscreen view.
9
+
10
+ ## Acceptance
11
+
12
+ 1. Task-graph hint text stays user-facing (HTML fallback matches i18n).
13
+ 2. Architecture panel hint mentions click-to-fullscreen when a diagram is shown.
14
+ 3. Click on architecture / task-graph mounts opens `/api/architecture/….html?present=1`.
15
+ 4. L0/L1/L3; merge develop.
@@ -0,0 +1,5 @@
1
+ # Tasks — 201-arch-fullscreen
2
+
3
+ - [x] Brief
4
+ - [ ] i18n + HTML hints; click → present=1 new tab
5
+ - [ ] Tests / docs / merge
@@ -0,0 +1,18 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T04:20:00.000Z",
4
+ "summary": "0.21.0 shipped: develop+main pushed, tag v0.21.0, GitHub Release, npm publish success.",
5
+ "verification": {
6
+ "commands": [
7
+ "git push origin develop main v0.21.0",
8
+ "gh release create v0.21.0",
9
+ "gh run watch 35420973848 → success",
10
+ "npm view duaer-spec version → 0.21.0"
11
+ ]
12
+ },
13
+ "preview": {
14
+ "url": "https://www.npmjs.com/package/duaer-spec/v/0.21.0",
15
+ "label": "npm 0.21.0"
16
+ },
17
+ "release": "https://github.com/fujiezee/duaer-spec/releases/tag/v0.21.0"
18
+ }
@@ -0,0 +1,12 @@
1
+ # 202 — Release 0.21.0
2
+
3
+ ## Goal
4
+
5
+ Ship 0.21.0: bump version + CHANGELOG, promote develop → main, push,
6
+ GitHub Release `v0.21.0`, trigger npm Trusted Publishing.
7
+
8
+ ## Acceptance
9
+
10
+ 1. `package.json` is `0.21.0`; CHANGELOG has `0.21.0` section (Unreleased cleared).
11
+ 2. `develop` and `main` pushed with release commits.
12
+ 3. GitHub Release `v0.21.0` published; npm publish workflow run succeeds or documented.
@@ -0,0 +1,5 @@
1
+ # Tasks — 202-release-021
2
+
3
+ - [x] Brief
4
+ - [x] Bump 0.21.0 + CHANGELOG
5
+ - [x] Promote / push / release / npm
@@ -0,0 +1,13 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T04:50:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1"],
6
+ "commands": [
7
+ "node --check bin/live-modules.mjs bin/live-progress.mjs web/live-dev/task-graph.mjs web/live-dev/acceptance-lines.mjs",
8
+ "npm test (165 pass; atomic pool + preview split covered)"
9
+ ],
10
+ "result": "pass"
11
+ },
12
+ "summary": "Atomic verifiable tasks with checkbox-monitorable progress: constitution, skills, kickoff pool + preview graph split acceptance lines."
13
+ }
@@ -0,0 +1,44 @@
1
+ # Feature Specification: Atomic verifiable tasks with monitorable progress
2
+
3
+ **Feature Branch**: `feat/atomic-tasks`
4
+
5
+ ## Goal
6
+
7
+ When decomposing work (Break down / kickoff task pool / `tasks.md`), every
8
+ task MUST be an **atomic, independently verifiable** unit, and every task's
9
+ progress MUST be **monitorable** via a markdown checkbox that the FDE desk
10
+ (and agents) can poll.
11
+
12
+ ## Why
13
+
14
+ Coarse mega-tasks hide progress and block wave orchestration. Acceptance
15
+ bundled into one line cannot be checked off piecemeal.
16
+
17
+ ## In scope
18
+
19
+ - Constitution + duaer-do / duaer-tasks / template wording for the rule
20
+ - Kickoff `buildTaskPoolFromModules` splits module acceptance into one
21
+ checkbox task per acceptance line (plus impl / verify / shared steps)
22
+ - Preview task graph uses the same atomic split so path matches pool
23
+ - `tasks.md` footer / dispatch prompt reinforce: checkbox = progress signal
24
+ - Tests + E2E catalog row
25
+
26
+ ## Out of scope
27
+
28
+ - Changing orchestration wave algorithm beyond richer ready sets
29
+ - Dedicated cloud / npm release
30
+
31
+ ## Acceptance
32
+
33
+ 1. Constitution (or equivalent always-on rule) states: decompose to atomic
34
+ verifiable tasks; each task progress monitorable via `- [ ]` / `- [x]`
35
+ 2. Module with multi-line acceptance yields one task per acceptance line in
36
+ the task pool / `tasks.md`
37
+ 3. Preview pool for the same modules has matching atomic acceptance tasks
38
+ 4. Unit tests cover the split; E2E catalog mentions the rule
39
+ 5. Agents following duaer-do Break down must not leave only coarse mega-tasks
40
+
41
+ ## Assumptions
42
+
43
+ - Prefer splitting on acceptance lines / `;` / `;` (existing
44
+ `splitAcceptanceLines`) rather than LLM rephrasing at kickoff
@@ -0,0 +1,8 @@
1
+ # Tasks
2
+
3
+ - [x] T001 Add constitution + duaer-do / duaer-tasks / template rule
4
+ - [x] T002 Split acceptance into atomic tasks in live-modules pool
5
+ - [x] T003 Mirror atomic split in task-graph preview pool
6
+ - [x] T004 Strengthen tasks.md footer + dispatch prompt wording
7
+ - [x] T005 Unit tests + E2E catalog
8
+ - [x] T006 Stamp delivery accepted
@@ -0,0 +1,14 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-19T07:40:00.000Z",
4
+ "verification": {
5
+ "levels": ["L0", "L1", "L3"],
6
+ "commands": [
7
+ "node --check web/live-dev/i18n.js web/live-dev/i18n-ja.js web/live-dev/app.js bin/live-deliverables.mjs",
8
+ "npm test (168 pass incl. live-i18n-ja)",
9
+ "npm run test:live"
10
+ ],
11
+ "result": "pass"
12
+ },
13
+ "summary": "Added Japanese (ja) live desk locale with full catalog parity, language select, and deliverables lang=ja."
14
+ }
@@ -0,0 +1,34 @@
1
+ # Feature Specification: Live desk Japanese locale (ja)
2
+
3
+ **Feature Branch**: `feat/live-i18n-ja`
4
+
5
+ ## Goal
6
+
7
+ Add **Japanese (`ja`)** as a third FDE live-desk language beside zh-CN and en.
8
+ Users can switch to 日本語; reload keeps the choice; desk copy updates.
9
+
10
+ ## In scope
11
+
12
+ - `LOCALES` includes `ja`; full catalog for all i18n keys
13
+ - Language `<select>` option; `detectLocale` for `ja*` navigator
14
+ - Deliverables `lang=ja` + date/`html lang` handling
15
+ - app.js list join / toLocaleString for ja
16
+ - task-graph Archify locale passthrough
17
+ - E2E catalog + unit/smoke markers; CHANGELOG
18
+
19
+ ## Out of scope
20
+
21
+ - Translating README / intro site / worker-models.md into Japanese
22
+ - Other locales beyond `ja`
23
+
24
+ ## Acceptance
25
+
26
+ 1. Language select shows 日本語 (`ja`); switching updates visible desk copy
27
+ 2. Reload keeps `ja` via localStorage
28
+ 3. Every key present in `en` exists in `ja` (no missing-key gaps in catalog parity test)
29
+ 4. Deliverables HTML accepts `lang=ja`
30
+ 5. `npm test` / required live smoke still pass
31
+
32
+ ## Assumptions
33
+
34
+ - Default remains zh-CN when unset; `ja` browser language can auto-detect to ja