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.
- package/.claude/rules/duaer-spec.md +5 -2
- package/.cursor/rules/duaer-spec.mdc +5 -2
- package/.cursor/skills/duaer-do/SKILL.md +20 -2
- package/.cursor/skills/duaer-tasks/SKILL.md +8 -0
- package/.duaer/active-job.json +3 -3
- package/.duaer/memory/constitution.md +13 -0
- package/.duaer/specs/192-release-020/delivery.json +19 -0
- package/.duaer/specs/192-release-020/tasks.md +3 -3
- package/.duaer/specs/193-dispatch-must-accept/delivery.json +11 -0
- package/.duaer/specs/193-dispatch-must-accept/spec.md +17 -0
- package/.duaer/specs/193-dispatch-must-accept/tasks.md +6 -0
- package/.duaer/specs/194-chat-preview-link/delivery.json +11 -0
- package/.duaer/specs/194-chat-preview-link/spec.md +14 -0
- package/.duaer/specs/194-chat-preview-link/tasks.md +5 -0
- package/.duaer/specs/195-chat-link-garble/delivery.json +10 -0
- package/.duaer/specs/195-chat-link-garble/spec.md +17 -0
- package/.duaer/specs/195-chat-link-garble/tasks.md +5 -0
- package/.duaer/specs/196-task-exec-graph/delivery.json +11 -0
- package/.duaer/specs/196-task-exec-graph/spec.md +15 -0
- package/.duaer/specs/196-task-exec-graph/tasks.md +6 -0
- package/.duaer/specs/197-task-graph-archify/delivery.json +12 -0
- package/.duaer/specs/197-task-graph-archify/spec.md +14 -0
- package/.duaer/specs/197-task-graph-archify/tasks.md +5 -0
- package/.duaer/specs/198-task-graph-labels/delivery.json +12 -0
- package/.duaer/specs/198-task-graph-labels/spec.md +12 -0
- package/.duaer/specs/198-task-graph-labels/tasks.md +5 -0
- package/.duaer/specs/199-preview-open-url/delivery.json +12 -0
- package/.duaer/specs/199-preview-open-url/spec.md +16 -0
- package/.duaer/specs/199-preview-open-url/tasks.md +5 -0
- package/.duaer/specs/200-preview-start-url/delivery.json +11 -0
- package/.duaer/specs/200-preview-start-url/spec.md +15 -0
- package/.duaer/specs/200-preview-start-url/tasks.md +5 -0
- package/.duaer/specs/201-arch-fullscreen/delivery.json +11 -0
- package/.duaer/specs/201-arch-fullscreen/spec.md +15 -0
- package/.duaer/specs/201-arch-fullscreen/tasks.md +5 -0
- package/.duaer/specs/202-release-021/delivery.json +18 -0
- package/.duaer/specs/202-release-021/spec.md +12 -0
- package/.duaer/specs/202-release-021/tasks.md +5 -0
- package/.duaer/specs/203-atomic-monitorable-tasks/delivery.json +13 -0
- package/.duaer/specs/203-atomic-monitorable-tasks/spec.md +44 -0
- package/.duaer/specs/203-atomic-monitorable-tasks/tasks.md +8 -0
- package/.duaer/specs/204-live-i18n-ja/delivery.json +14 -0
- package/.duaer/specs/204-live-i18n-ja/spec.md +34 -0
- package/.duaer/specs/204-live-i18n-ja/tasks.md +7 -0
- package/.duaer/specs/205-release-022/spec.md +12 -0
- package/.duaer/specs/205-release-022/tasks.md +6 -0
- package/.duaer/templates/tasks-template.md +4 -0
- package/CHANGELOG.md +64 -0
- package/bin/duaer-live.mjs +117 -14
- package/bin/live-deliverables.mjs +116 -36
- package/bin/live-modules.mjs +37 -7
- package/bin/live-preview.mjs +63 -12
- package/bin/live-progress.mjs +7 -38
- package/docs/agent/e2e-test-plan.md +20 -1
- package/docs/agent/live-desk.md +11 -1
- package/package.json +1 -1
- package/web/live-dev/acceptance-lines.mjs +42 -0
- package/web/live-dev/app.js +260 -46
- package/web/live-dev/chat-markdown.mjs +43 -3
- package/web/live-dev/i18n-ja.js +483 -0
- package/web/live-dev/i18n.js +34 -13
- package/web/live-dev/index.html +14 -13
- package/web/live-dev/styles.css +82 -4
- 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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
package/.duaer/active-job.json
CHANGED
|
@@ -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
|
-
- [
|
|
5
|
-
- [
|
|
6
|
-
- [
|
|
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,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,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,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,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,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,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,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,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,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,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
|