duaer-spec 0.26.0 → 0.27.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 (57) hide show
  1. package/.duaer/active-job.json +3 -3
  2. package/.duaer/specs/260-release-026/delivery.json +10 -9
  3. package/.duaer/specs/260-release-026/tasks.md +1 -3
  4. package/.duaer/specs/261-fde-baseline-sign/delivery.json +10 -0
  5. package/.duaer/specs/261-fde-baseline-sign/spec.md +37 -0
  6. package/.duaer/specs/261-fde-baseline-sign/tasks.md +8 -0
  7. package/.duaer/specs/262-fde01-readme-docs/delivery.json +9 -0
  8. package/.duaer/specs/262-fde01-readme-docs/spec.md +23 -0
  9. package/.duaer/specs/262-fde01-readme-docs/tasks.md +5 -0
  10. package/.duaer/specs/263-arch-edge-via/delivery.json +9 -0
  11. package/.duaer/specs/263-arch-edge-via/spec.md +25 -0
  12. package/.duaer/specs/263-arch-edge-via/tasks.md +5 -0
  13. package/.duaer/specs/264-baseline-field-guide/delivery.json +10 -0
  14. package/.duaer/specs/264-baseline-field-guide/spec.md +23 -0
  15. package/.duaer/specs/264-baseline-field-guide/tasks.md +5 -0
  16. package/.duaer/specs/265-baseline-chat-passthrough/delivery.json +9 -0
  17. package/.duaer/specs/265-baseline-chat-passthrough/spec.md +22 -0
  18. package/.duaer/specs/265-baseline-chat-passthrough/tasks.md +4 -0
  19. package/.duaer/specs/266-fde02-api-contract/delivery.json +10 -0
  20. package/.duaer/specs/266-fde02-api-contract/spec.md +28 -0
  21. package/.duaer/specs/266-fde02-api-contract/tasks.md +7 -0
  22. package/.duaer/specs/267-baseline-restore/delivery.json +9 -0
  23. package/.duaer/specs/267-baseline-restore/spec.md +24 -0
  24. package/.duaer/specs/267-baseline-restore/tasks.md +5 -0
  25. package/.duaer/specs/268-fde07-uat/delivery.json +9 -0
  26. package/.duaer/specs/268-fde07-uat/spec.md +30 -0
  27. package/.duaer/specs/268-fde07-uat/tasks.md +5 -0
  28. package/.duaer/specs/269-release-027/spec.md +12 -0
  29. package/.duaer/specs/269-release-027/tasks.md +4 -0
  30. package/CHANGELOG.md +46 -0
  31. package/README.md +22 -14
  32. package/README.zh-CN.md +6 -5
  33. package/bin/duaer-live.mjs +161 -77
  34. package/bin/live-archify.mjs +85 -0
  35. package/bin/live-deliverables.mjs +53 -0
  36. package/bin/live-modules.mjs +63 -2
  37. package/bin/live-project-chat.mjs +18 -1
  38. package/docs/agent/e2e-test-plan.md +14 -0
  39. package/docs/agent/live-desk.md +18 -1
  40. package/package.json +1 -1
  41. package/web/live-dev/api-contract.mjs +50 -0
  42. package/web/live-dev/app.js +278 -21
  43. package/web/live-dev/baseline.mjs +71 -0
  44. package/web/live-dev/confirm-card.mjs +19 -0
  45. package/web/live-dev/i18n-de.js +28 -0
  46. package/web/live-dev/i18n-es.js +28 -0
  47. package/web/live-dev/i18n-fr.js +28 -0
  48. package/web/live-dev/i18n-ja.js +28 -0
  49. package/web/live-dev/i18n-ko.js +28 -0
  50. package/web/live-dev/i18n-pt-BR.js +28 -0
  51. package/web/live-dev/i18n-ru.js +28 -0
  52. package/web/live-dev/i18n-vi.js +28 -0
  53. package/web/live-dev/i18n-zh-TW.js +28 -0
  54. package/web/live-dev/i18n.js +59 -2
  55. package/web/live-dev/index.html +42 -1
  56. package/web/live-dev/styles.css +4 -0
  57. package/web/live-dev/uat-pack.mjs +21 -0
@@ -1,5 +1,5 @@
1
1
  {
2
- "feature": "260-release-026",
3
- "branch": "feat/release-026",
4
- "worktree": ".worktree/feat-release-026"
2
+ "feature": "269-release-027",
3
+ "branch": "chore/release-027",
4
+ "worktree": ".worktree/chore-release-027"
5
5
  }
@@ -1,18 +1,19 @@
1
1
  {
2
2
  "status": "accepted",
3
- "acceptedAt": "2026-09-20T13:33:00.000Z",
3
+ "acceptedAt": "2026-09-20T14:14:57.110Z",
4
4
  "verification": {
5
- "levels": ["docs"],
5
+ "levels": [
6
+ "docs"
7
+ ],
6
8
  "commands": [
7
- "git push origin develop main",
8
- "gh release create v0.26.0",
9
- "gh run view 35513791762"
9
+ "gh workflow run npm-publish.yml --ref main",
10
+ "npm view duaer-spec version"
10
11
  ],
11
- "result": "partial",
12
- "notes": "GitHub Release v0.26.0 on main. npm Trusted Publishing failed: GitHub Actions account locked (billing). Re-run workflow npm-publish.yml after billing is cleared."
12
+ "result": "pass",
13
+ "notes": "npm duaer-spec@0.26.0 published via Trusted Publishing after Duaer repo URL fix"
13
14
  },
14
15
  "preview": {
15
- "url": "https://github.com/Duaer/duaer-spec/releases/tag/v0.26.0",
16
- "label": "GitHub Release v0.26.0"
16
+ "url": "https://www.npmjs.com/package/duaer-spec/v/0.26.0",
17
+ "label": "npm duaer-spec@0.26.0"
17
18
  }
18
19
  }
@@ -1,5 +1,3 @@
1
- # Tasks: Release 0.26.0
2
-
3
1
  - [x] T001 Bump package.json to 0.26.0 and fold CHANGELOG
4
2
  - [x] T002 Merge develop, promote main, push, GitHub release
5
- - [x] T003 Stamp delivery.json (npm blocked: Actions billing lock — re-run npm-publish.yml after unlock)
3
+ - [x] T003 npm 0.26.0 published (Trusted Publishing + Duaer provenance URL)
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:20:00.000Z",
4
+ "summary": "FDE-01: confirm card baseline fields, signed fingerprint gate before kickoff, change order + deliverables.",
5
+ "verification": {
6
+ "L0": "node --check bin/duaer-live.mjs web/live-dev/app.js web/live-dev/baseline.mjs bin/live-modules.mjs — pass",
7
+ "L1": "npm test — 225 pass (incl. baseline-sign)",
8
+ "L3": "npm run test:live — pass"
9
+ }
10
+ }
@@ -0,0 +1,37 @@
1
+ # Feature Specification: FDE-01 scope + acceptance baseline sign gate
2
+
3
+ ## Goal
4
+
5
+ Enforce a signed scope/acceptance baseline before kickoff (联调), per WeCom
6
+ FDE pain FDE-01: no unsigned baseline may enter dispatch; post-sign scope
7
+ changes require an explicit change order and re-sign.
8
+
9
+ ## In scope
10
+
11
+ - Confirm card fields: device matrix, critical paths, exception cases (feature)
12
+ - Project baseline sign (signer + time + fingerprint of confirmed modules)
13
+ - Kickoff / dispatch hard-blocked until baseline signed and fingerprint matches
14
+ - Change order: reason → unlock modules for re-confirm → clear sign → re-sign
15
+ - Deliverables page shows baseline + change history
16
+ - Docs / E2E / tests
17
+
18
+ ## Out of scope
19
+
20
+ - Real e-sign / PKI
21
+ - Automatic schedule recalculation
22
+ - Cloud browser matrix execution
23
+ - Full RACI (FDE-10)
24
+
25
+ ## Acceptance
26
+
27
+ 1. Feature confirm without device matrix / critical paths / exception cases fails local validate
28
+ 2. Unsigned baseline: 「写入 Brief 并启动」disabled or blocked with clear copy
29
+ 3. After sign, kickoff allowed when fingerprint matches confirmed modules
30
+ 4. Opening a change order with a reason clears the sign and returns modules to re-confirm
31
+ 5. Deliverables HTML shows signer, signed time, and change reasons when present
32
+ 6. `npm test` and `npm run test:live` pass
33
+
34
+ ## Assumptions
35
+
36
+ - Bug desk skips the three new field requirements but still needs baseline sign before dispatch
37
+ - Worktree: `.worktree/feat-fde-baseline-sign` · Brief: `.duaer/specs/261-fde-baseline-sign/`
@@ -0,0 +1,8 @@
1
+ # Tasks: FDE-01 baseline sign
2
+
3
+ - [x] T001 Clip card + session baseline helpers (`baseline.mjs` / modules / chat)
4
+ - [x] T002 Confirm card UI fields + i18n (device / paths / exceptions)
5
+ - [x] T003 Baseline sign + change-order UI in dispatch; gate doDispatch
6
+ - [x] T004 Server validate + dispatch reject unsigned / stale fingerprint
7
+ - [x] T005 Deliverables page + live-desk / E2E / CHANGELOG
8
+ - [x] T006 L0/L1/L3 verify; stamp delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:25:00.000Z",
4
+ "summary": "Document FDE-01 baseline sign in README zh-CN and en.",
5
+ "verification": {
6
+ "waiver": "docs-only",
7
+ "note": "README + CHANGELOG only; CJK scan on README.md clean"
8
+ }
9
+ }
@@ -0,0 +1,23 @@
1
+ # Feature Specification: Document FDE-01 in README
2
+
3
+ ## Goal
4
+
5
+ Update user-facing README (zh-CN + en) so FDE-01 baseline fields and sign
6
+ gate match the live console.
7
+
8
+ ## In scope
9
+
10
+ - `README.zh-CN.md` and `README.md` capability bullets + FDE flow steps
11
+ - Brief / delivery stamp
12
+
13
+ ## Out of scope
14
+
15
+ - Product code / i18n / ADR
16
+ - Push / release
17
+
18
+ ## Acceptance
19
+
20
+ 1. zh-CN README mentions device matrix / critical paths / exception cases on feature confirm
21
+ 2. Both READMEs mention signed baseline before kickoff and change-order re-sign
22
+ 3. English README has no CJK
23
+ 4. Docs-only waiver in delivery verification
@@ -0,0 +1,5 @@
1
+ # Tasks: Document FDE-01 in README
2
+
3
+ - [x] T001 Update README.zh-CN.md capability + flow
4
+ - [x] T002 Update README.md capability + flow
5
+ - [x] T003 Stamp delivery (docs-only waiver)
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:35:00.000Z",
4
+ "summary": "Auto-detour architecture edges that would fail Archify clean-flow/edge-through-node.",
5
+ "verification": {
6
+ "L0": "node --check bin/live-archify.mjs — pass",
7
+ "L1": "node --test test/live-archify.test.mjs — 14 pass"
8
+ }
9
+ }
@@ -0,0 +1,25 @@
1
+ # Feature Specification: Auto-route architecture edges that cross nodes
2
+
3
+ ## Goal
4
+
5
+ When Archify rejects architecture IR with `clean-flow/edge-through-node`
6
+ (long same-row reverse edges from LLM layout), duaer-live auto-detours those
7
+ edges with `fromSide`/`toSide`/`via` so render succeeds.
8
+
9
+ ## In scope
10
+
11
+ - `routeCrossingEdges` in `bin/live-archify.mjs` (called from layout)
12
+ - Unit test using the failing PPT IR (state→gen)
13
+ - CHANGELOG / brief note in live-desk if needed
14
+
15
+ ## Out of scope
16
+
17
+ - Changing Archify itself
18
+ - Relayouting all LLM positions from scratch
19
+ - Showcase quality profile
20
+
21
+ ## Acceptance
22
+
23
+ 1. Saved IR `state`→`gen` (crosses user/ui/check/doc) renders via Archify without error
24
+ 2. Neighbor edges without intermediates keep no forced via
25
+ 3. `npm test` live-archify tests pass
@@ -0,0 +1,5 @@
1
+ # Tasks: Auto-route crossing architecture edges
2
+
3
+ - [x] T001 Implement `routeCrossingEdges` + wire into layout / viewBox
4
+ - [x] T002 Unit test for PPT IR state→gen case
5
+ - [x] T003 CHANGELOG; verify; stamp delivery
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:40:00.000Z",
4
+ "summary": "Guide chat and placeholders to fill FDE-01 baseline confirm fields.",
5
+ "verification": {
6
+ "L0": "node --check bin/duaer-live.mjs web/live-dev/app.js — pass",
7
+ "L1": "node --test test/live-i18n-common.test.mjs — pass",
8
+ "L3": "npm run test:live — pass"
9
+ }
10
+ }
@@ -0,0 +1,23 @@
1
+ # Feature Specification: Guide filling FDE-01 baseline fields
2
+
3
+ ## Goal
4
+
5
+ Chat and confirm UX must guide (and preferably fill) device matrix, critical
6
+ paths, and exception cases — not leave them as empty「待确认」forever.
7
+
8
+ ## In scope
9
+
10
+ - Feature SYSTEM / ACCEPT / FIX / REVISE prompts include the three fields
11
+ - Field-specific placeholders (examples) in UI + i18n
12
+ - Smoke assert prompts mention the fields
13
+
14
+ ## Out of scope
15
+
16
+ - Bug desk (still skips the three fields)
17
+ - Changing validate rules
18
+
19
+ ## Acceptance
20
+
21
+ 1. `SYSTEM_PROMPT` / accept / fix prompts list `deviceMatrix` / `criticalPaths` / `exceptionCases`
22
+ 2. Feature confirm textareas use example placeholders (not bare「待确认」)
23
+ 3. `npm test` + `npm run test:live` pass
@@ -0,0 +1,5 @@
1
+ # Tasks: Guide filling FDE-01 baseline fields
2
+
3
+ - [x] T001 Update chat / accept / fix / revise prompts
4
+ - [x] T002 Per-field placeholders + i18n locales
5
+ - [x] T003 Smoke assert; stamp delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:45:00.000Z",
4
+ "summary": "Pass deviceMatrix/criticalPaths/exceptionCases through chat parse and SSE done.",
5
+ "verification": {
6
+ "L0": "node --check bin/duaer-live.mjs — pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,22 @@
1
+ # Feature Specification: Pass baseline fields through chat parse/SSE
2
+
3
+ ## Goal
4
+
5
+ When the model returns deviceMatrix / criticalPaths / exceptionCases in chat
6
+ JSON, they must reach the middle confirm card (not be stripped by
7
+ parseChatResult / chatDoneSsePayload).
8
+
9
+ ## In scope
10
+
11
+ - parseChatResult + chatDoneSsePayload passthrough (top-level + modules[])
12
+ - Unit / smoke coverage
13
+
14
+ ## Out of scope
15
+
16
+ - Prompt wording (already done in 264)
17
+
18
+ ## Acceptance
19
+
20
+ 1. Parsed chat JSON with baseline fields retains them in the done payload shape
21
+ 2. Middle card merge path receives the three keys from SSE done
22
+ 3. `npm run test:live` + targeted unit pass
@@ -0,0 +1,4 @@
1
+ # Tasks: Pass baseline fields through chat parse/SSE
2
+
3
+ - [x] T001 Fix parseChatResult + chatDoneSsePayload
4
+ - [x] T002 Unit test; smoke marker; stamp delivery
@@ -0,0 +1,10 @@
1
+ {
2
+ "status": "accepted",
3
+ "acceptedAt": "2026-09-21T00:55:00.000Z",
4
+ "summary": "FDE-02: apiContract confirm field, validate gate, kickoff contract tasks, deliverables.",
5
+ "verification": {
6
+ "L0": "node --check — pass",
7
+ "L1": "npm test — pass",
8
+ "L3": "npm run test:live — pass"
9
+ }
10
+ }
@@ -0,0 +1,28 @@
1
+ # Feature Specification: FDE-02 API contract gate
2
+
3
+ ## Goal
4
+
5
+ Enforce an API contract declaration on feature confirm cards (OpenAPI/types
6
+ path, or explicit「本模块无 HTTP API」). When HTTP APIs are in scope, kickoff
7
+ injects contract sync / Mock / CI contract-test tasks so联调不再追字段.
8
+
9
+ ## In scope
10
+
11
+ - Confirm card field `apiContract` + validate / chat prompts / SSE passthrough
12
+ - Fingerprint includes the field
13
+ - Task pool injects FDE-02 shared tasks when any module declares a contract path
14
+ - Deliverables show the field
15
+ - Docs / E2E / tests
16
+
17
+ ## Out of scope
18
+
19
+ - Built-in OpenAPI editor, codegen, or running customer CI
20
+ - Bug desk (skips field like other FDE-01 extras)
21
+
22
+ ## Acceptance
23
+
24
+ 1. Feature confirm without apiContract fails local validate
25
+ 2. 「本模块无 HTTP API」passes without injecting contract tasks
26
+ 3. A path like `openapi/openapi.yaml` injects three shared pool tasks
27
+ 4. Chat SSE / clip / deliverables carry the field
28
+ 5. `npm test` + `npm run test:live` pass
@@ -0,0 +1,7 @@
1
+ # Tasks: FDE-02 API contract gate
2
+
3
+ - [x] T001 `api-contract.mjs` + clipCard / fingerprint / localAccept
4
+ - [x] T002 Chat prompts + parseChatResult / SSE passthrough
5
+ - [x] T003 UI + i18n placeholders; app.js merge/apply
6
+ - [x] T004 Task pool inject + deliverables
7
+ - [x] T005 Tests / docs / CHANGELOG; stamp delivery
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Desk refresh restores device matrix, critical paths, exception cases, and API contract onto the confirm card.",
4
+ "verification": {
5
+ "L0": "node --check web/live-dev/app.js web/live-dev/confirm-card.mjs — pass",
6
+ "L1": "npm test — 234 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,24 @@
1
+ # Feature Specification: Keep baseline fields after desk refresh
2
+
3
+ ## Goal
4
+
5
+ Refreshing the Duaer console must keep the four feature confirm fields
6
+ (device matrix, critical paths, exception cases, API contract) that were
7
+ already on the card.
8
+
9
+ ## In scope
10
+
11
+ - Session restore copies those four fields onto each module card before the
12
+ form is filled
13
+ - Confirm fingerprint includes `apiContract` so a later edit re-validates
14
+
15
+ ## Out of scope
16
+
17
+ - Bug desk (those fields stay hidden)
18
+ - Changing validate rules
19
+
20
+ ## Acceptance
21
+
22
+ 1. Restoring a saved module card keeps deviceMatrix, criticalPaths,
23
+ exceptionCases, and apiContract
24
+ 2. `npm test` and `npm run test:live` pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 267-baseline-restore
2
+
3
+ - [x] Restore the four baseline fields when loading a saved desk session
4
+ - [x] Include apiContract in the confirm fingerprint
5
+ - [x] Tests, merge develop, handoff
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Feature confirm requires a UAT pack (empty, failure, permission, timeout, retry) and kickoff schedules those checks.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js — pass",
6
+ "L1": "npm test — 237 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,30 @@
1
+ # Feature Specification: FDE-07 UAT pack on confirm
2
+
3
+ ## Goal
4
+
5
+ Feature confirm must not treat a single happy-path note as acceptance.
6
+ Exception cases have to cover the UAT pack, and kickoff must schedule
7
+ those checks.
8
+
9
+ ## In scope
10
+
11
+ - Local validate requires empty, failure, permission, timeout, and retry
12
+ - When the module declares an API contract path, exception text must name
13
+ an error code or HTTP status
14
+ - Kickoff adds a UAT task per confirmed module, plus a contract error-code
15
+ task when a path is declared
16
+ - Confirm hints, placeholders, and chat/accept prompts match the pack
17
+
18
+ ## Out of scope
19
+
20
+ - Bug desk
21
+ - Running the UAT cases against a customer environment
22
+
23
+ ## Acceptance
24
+
25
+ 1. A feature card that only mentions one exception class fails local validate
26
+ 2. A card covering the five classes passes that check; a contract path also
27
+ needs an error code or status
28
+ 3. Confirmed modules get an FDE-07 UAT task; no-HTTP modules skip the
29
+ error-code task
30
+ 4. `npm test` and `npm run test:live` pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 268-fde07-uat
2
+
3
+ - [x] Validate exception cases against the UAT pack
4
+ - [x] Inject FDE-07 kickoff tasks
5
+ - [x] Update hints, prompts, docs, and tests
@@ -0,0 +1,12 @@
1
+ # Feature Specification: Release 0.27.0
2
+
3
+ ## Goal
4
+
5
+ Ship 0.27.0: FDE-01 signed baseline, FDE-02 API contract gate, FDE-07 UAT
6
+ pack, baseline field restore, architecture edge detour. Promote develop to
7
+ main, publish a GitHub Release, and let npm Trusted Publishing run.
8
+
9
+ ## Acceptance
10
+
11
+ 1. `package.json` is `0.27.0`; CHANGELOG has `0.27.0` and an empty Unreleased section.
12
+ 2. Tag `v0.27.0` is on `main`; GitHub Release is published.
@@ -0,0 +1,4 @@
1
+ # Tasks — 269-release-027
2
+
3
+ - [x] Bump 0.27.0 and move changelog notes
4
+ - [ ] Promote develop to main, tag, GitHub Release
package/CHANGELOG.md CHANGED
@@ -2,6 +2,52 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.27.0 — 2026-09-21
6
+
7
+ ### Feat: FDE-07 UAT pack on confirm
8
+
9
+ - Feature exception cases must cover empty, failure, permission, timeout, and retry
10
+ - A declared API contract also requires an error code or HTTP status in that text
11
+ - Kickoff adds a UAT task per confirmed module
12
+
13
+ ### Fix: keep baseline confirm fields after desk refresh
14
+
15
+ - Restoring a project session copies device matrix, critical paths, exception
16
+ cases, and API contract back onto the confirm card
17
+
18
+ ### Feat: FDE-02 API contract gate on confirm + kickoff tasks
19
+
20
+ - Feature confirm requires `apiContract` (OpenAPI/types path or「本模块无 HTTP API」)
21
+ - Kickoff injects contract sync / Mock / CI contract-test tasks when a path is declared
22
+ - Deliverables and baseline fingerprint include the field
23
+
24
+ ### Fix: pass FDE-01 baseline fields through chat SSE
25
+
26
+ - `parseChatResult` / `chatDoneSsePayload` keep deviceMatrix, criticalPaths,
27
+ exceptionCases so the middle confirm card fills from chat JSON
28
+
29
+ ### Fix: guide filling FDE-01 baseline confirm fields
30
+
31
+ - Feature chat / accept / fix / revise prompts include device matrix, critical
32
+ paths, and exception cases (fill defaults or offer options — do not leave empty)
33
+ - Confirm card placeholders show examples instead of bare「待确认」
34
+
35
+ ### Fix: auto-route architecture edges that cross unrelated nodes
36
+
37
+ - Before Archify deliver, long same-row edges that would pass through other
38
+ components get a bottom `via` detour (`clean-flow/edge-through-node`)
39
+
40
+ ### Docs: README covers FDE-01 baseline sign
41
+
42
+ - zh-CN / en README: feature confirm fields, signed baseline before kickoff,
43
+ change order, deliverables baseline history
44
+
45
+ ### Feat: FDE-01 signed scope + acceptance baseline before kickoff
46
+
47
+ - Confirm card requires device matrix, critical paths, and exception cases (feature)
48
+ - Dispatch requires a signed baseline (signer + fingerprint); change order clears sign and reopens confirm
49
+ - Deliverables page shows baseline sign-off and change history
50
+
5
51
  ## 0.26.0 — 2026-09-20
6
52
 
7
53
  ### Fix: npm provenance repository URL after GitHub move
package/README.md CHANGED
@@ -65,15 +65,17 @@ After install, these are the capabilities you actually use:
65
65
  A local web console (`duaer live`) for “chat → confirm → dispatch → watch → open result”:
66
66
 
67
67
  - **Projects.** Create and switch projects; each keeps its own chat and progress.
68
- - **Chat until the ask is clear.** Left chat; center confirm cards (goal / out of scope / checkable acceptance). Vague acceptance cannot be confirmed. Beside **Send**, tap **Record** to capture speech; with a **speech recognition (STT) model** in Settings (OpenAI-compatible `/audio/transcriptions`, e.g. whisper-1), the clip is decoded into the composer—edit, then send.
68
+ - **Chat until the ask is clear.** Left chat; center confirm cards (goal / out of scope / checkable acceptance). Feature cards also need **device matrix, critical paths, and exception cases**. Vague acceptance cannot be confirmed. Beside **Send**, tap **Record** to capture speech; with a **speech recognition (STT) model** in Settings (OpenAI-compatible `/audio/transcriptions`, e.g. whisper-1), the clip is decoded into the composer—edit, then send.
69
69
  - **Split big work into modules.** Confirm module by module; nothing starts until you kick off after the ones you care about are confirmed.
70
70
  - **Architecture diagram.** After requirements, review the system diagram; click it for fullscreen; kickoff waits until architecture is confirmed. If chat claims the diagram is ready but the middle panel is empty, the same bubble offers Regenerate — it does not leave a false “ready” line.
71
+ - **Sign the scope + acceptance baseline before kickoff.** After architecture confirm, an operator must **sign** (signer + time; fingerprint of confirmed module cards). Unsigned or stale fingerprints block **Write Brief and start**. An **open change** (with reason) clears the sign, returns modules for re-confirm, then architecture and re-sign.
71
72
  - **Dispatch digital employees to code.** Pick a product folder and Cursor Agent or Claude Code; work happens in an isolated worktree, not directly on your long-lived branches.
72
73
  - **Visible task progress.** Work is a checklist; each finished item is checked off and the console refreshes; dependent tasks release in waves so agents don’t pile on blocked work.
73
74
  - **Employee roles.** Top-bar **digital employee** directory (Implementer / Functional regression / Deployer). Optional parallel workers on the same CLI. See the next section.
74
75
  - **Locales.** Console UI: zh-CN, zh-TW, en, ja, ko, es, pt-BR, fr, de, ru, vi.
75
76
  - **Deliverables and results.** Open a deliverables page (requirements timeline,
76
- architecture, tasks, delivery); when done, open the page or the project folder.
77
+ confirmation, baseline sign-off and change history, architecture, tasks,
78
+ delivery); when done, open the page or the project folder.
77
79
  - **Revise when it’s not right.** Continue in left chat → re-confirm → relaunch on
78
80
  the same job without starting from scratch. After deploy, **Revise again** and
79
81
  **Fix a bug** stay on the result bar.
@@ -163,15 +165,21 @@ mock LLM — no paid API).
163
165
  content. Messy multi-topic talk is fine: the console evolves **`modules[]`**
164
166
  (tabs). Chat bubbles render **Markdown** (`**bold**`, code, links).
165
167
  2. Per module: fill the confirm card (goal / out-of-scope / **checkable**
166
- acceptance / assumptions). Vague acceptance fails the gate; validate must
167
- pass before **Confirm**. Confirming a module **locks that card only** it
168
- does **not** write a Brief or start workers yet. Jump between modules freely.
168
+ acceptance / assumptions; feature cards also need **device matrix /
169
+ critical paths / exception cases**). Vague acceptance or missing baseline
170
+ fields fails the gate; validate must pass before **Confirm**. Confirming a
171
+ module **locks that card only** — it does **not** write a Brief or start
172
+ workers yet. Jump between modules freely.
169
173
  3. When **all** modules you care about are confirmed → review / confirm
170
- **architecture** (Archify) → **kickoff**. Kickoff writes the Brief, builds a
171
- **dependency-aware task pool** (`dependsOn`), and assigns work. Default is
172
- **1** worker; optionally **N** parallel workers on the **same CLI**. Shared
173
- tasks go to worker 1; module tasks round-robin. Each worker gets its own
174
- **Terminal queue lane** (`live-terminal` / `live-terminal/w2`…).
174
+ **architecture** (Archify) → **sign the scope + acceptance baseline**
175
+ (signer) **kickoff**. Kickoff stays blocked while unsigned or when the
176
+ fingerprint no longer matches confirmed cards. Kickoff writes the Brief,
177
+ builds a **dependency-aware task pool** (`dependsOn`), and assigns work.
178
+ Default is **1** worker; optionally **N** parallel workers on the **same
179
+ CLI**. Shared tasks go to worker 1; module tasks round-robin. Each worker
180
+ gets its own **Terminal queue lane** (`live-terminal` /
181
+ `live-terminal/w2`…). To change scope: **open change** (reason) → clear
182
+ sign and re-confirm modules → architecture again → re-sign.
175
183
  4. Pick a product repo (browse / scan / recent), or paste a path / project name.
176
184
  Missing paths are created; set **Projects parent folder** so short names
177
185
  resolve under it. Non-git folders get `git init -b develop`; missing
@@ -184,10 +192,10 @@ mock LLM — no paid API).
184
192
  `.worktree/feat-*` and opens **Terminal** for each worker lane.
185
193
  7. Progress shows a **next-action** stage strip, then `tasks.md` polling.
186
194
  **View deliverables** (above progress) opens a generated HTML page of stage
187
- artifacts (requirements doc timeline, confirmation, architecture, task pool,
188
- delivery). On delivery, workers update the product **README** before
189
- `delivery.json` is `accepted`. Then open **Results** (**View result** when a
190
- page exists, otherwise **Open
195
+ artifacts (requirements doc timeline, confirmation, baseline sign-off and
196
+ change history, architecture, task pool, delivery). On delivery, workers
197
+ update the product **README** before `delivery.json` is `accepted`. Then open
198
+ **Results** (**View result** when a page exists, otherwise **Open
191
199
  project folder**).
192
200
  8. If the result is not right: **Continue improving (left chat)** → confirm the
193
201
  revise card (same validate gate) → re-confirm architecture (keep or redesign)
package/README.zh-CN.md CHANGED
@@ -28,14 +28,15 @@
28
28
  本机开一个网页控制台(`duaer live`),专门管「从聊需求到派工、看进度、看结果」:
29
29
 
30
30
  - **项目管理。** 建项目、切换项目;每个项目自己的对话和进度,互不搅在一起。
31
- - **聊着把需求聊清楚。** 左边聊天;中间把目标、边界、验收写成确认卡;空话验收过不了,得能检查才给确认。发送旁可点 **录音**;在设置里配置 **语音识别模型**(兼容 OpenAI `/audio/transcriptions`,如 whisper-1)后,录完会解码成文字填入输入框,改完再发送。
31
+ - **聊着把需求聊清楚。** 左边聊天;中间把目标、边界、验收写成确认卡;功能卡还要填 **浏览器/设备矩阵、关键路径、异常态**。空话验收过不了,得能检查才给确认。发送旁可点 **录音**;在设置里配置 **语音识别模型**(兼容 OpenAI `/audio/transcriptions`,如 whisper-1)后,录完会解码成文字填入输入框,改完再发送。
32
32
  - **大需求可拆成多个模块。** 一块一块确认,确认完一块不会立刻开工,全部谈妥再一起派。
33
33
  - **系统架构图。** 确认需求后一起看架构;点图可全屏查看;架构确认后才能派工。若对话称已生成但中间栏没有图,同一条气泡会改成提示并提供「重新生成架构图」,不会留下假的「已生成」。
34
+ - **签署范围与验收基线再开工。** 架构确认后须签署(签字人 + 时间;指纹对上已确认模块卡);未签或卡面改过不得「写入 Brief 并启动」。开 **变更单**(写原因)会清签、退回重确认,再架构、再签。
34
35
  - **一键派数字员工写代码。** 选产品目录、选 Cursor Agent 或 Claude Code,点开工;它在隔离目录里改代码,不直接乱动你的主分支。
35
36
  - **任务进度看得见。** 任务拆成一条条可勾选项;做完勾一项,控制台实时刷新;有依赖的任务会排队放行,不会一窝蜂乱做。
36
37
  - **数字员工分工。** 顶部有「数字员工」目录(实现 / 功能回归 / 部署);可开多个并行(同一套 CLI)。详见下一节。
37
38
  - **中 / 繁中 / 英 / 日 / 韩 / 西 / 葡 / 法 / 德 / 俄 / 越界面。** 控制台文案可切换语种。
38
- - **看交付物和结果。** 可打开交付物页(需求时间线、架构、任务、交付记录);做完了可打开页面或项目文件夹。
39
+ - **看交付物和结果。** 可打开交付物页(需求时间线、确认书、基线签署与变更记录、架构、任务、交付);做完了可打开页面或项目文件夹。
39
40
  - **不满意就继续改。** 左侧继续聊改进 → 再确认 → 同一次任务上续派,不用从头建仓。部署后结果栏仍可「再改一版」和「修 bug」。
40
41
  - **修 bug。** 走缺陷卡(不拆多模块),默认跳过架构,短任务池,开 `fix/` 分支(可选从 `main` 出紧急修复)。交付过的地址/启动信息会自动带入;缺陷和迭代排在同一条项目时间线上。
41
42
  - **快速导航。** 对话栏右缘「导航」可跳到:对话底部 · 确认卡 · 结果 · 进度。
@@ -145,15 +146,15 @@ duaer live config --base-url https://api.openai.com/v1 --api-key sk-... --model
145
146
  **流程**
146
147
 
147
148
  1. 打开或新建**项目**,再聊天。右上角「项目」列表会显示每个项目的**交付状态**;有内容时可直接打开**交付物**。话题可以乱跳:控制台会演进 **`modules[]`**(模块页签)。气泡支持 **Markdown**(加粗、代码、链接)。
148
- 2. **按模块**填确认卡(目标 / 不做 / **可检查验收** / 假设)。空泛验收过不了门禁;须校验通过才能点确认。确认只**锁住该模块卡**,**不会**立刻写 Brief 或开工。模块之间可随时切换。
149
- 3. 关心的模块都确认完 → 审 / 确认**架构**(Archify)→ **开工(kickoff)**。开工才写 Brief,建带 **`dependsOn` 的任务池**,并分派。默认 **1** 个数字员工;可选 **N** 个同 CLI 并行。共享任务给 1 号;模块任务轮询。每个 worker 独占一条 **Terminal 队列泳道**(`live-terminal` / `live-terminal/w2`…)。
149
+ 2. **按模块**填确认卡(目标 / 不做 / **可检查验收** / 假设;功能卡另填 **设备矩阵 / 关键路径 / 异常态**)。空泛验收或缺基线字段过不了门禁;须校验通过才能点确认。确认只**锁住该模块卡**,**不会**立刻写 Brief 或开工。模块之间可随时切换。
150
+ 3. 关心的模块都确认完 → 审 / 确认**架构**(Archify)→ **签署范围与验收基线**(签字人)→ **开工(kickoff)**。未签或指纹与已确认卡不一致时开工按钮不可用。开工才写 Brief,建带 **`dependsOn` 的任务池**,并分派。默认 **1** 个数字员工;可选 **N** 个同 CLI 并行。共享任务给 1 号;模块任务轮询。每个 worker 独占一条 **Terminal 队列泳道**(`live-terminal` / `live-terminal/w2`…)。范围要改:开 **变更单**(写原因)→ 清签并退回模块重确认 → 再架构、再签。
150
151
  4. 浏览 / 扫描 / 点选产品仓,或粘贴路径 / 项目名。路径不存在会自动创建;可先设**产品父目录**,再填短名在其下新建。非 git 目录会 `git init -b develop`;没有 develop/main/master 会建本地 `develop`。
151
152
  5. 只选 **CLI 数字员工**:**Cursor Agent** 或 **Claude Code**
152
153
  - Cursor:`curl https://cursor.com/install -fsS | bash`
153
154
  - Claude Code:`npm install -g @anthropic-ai/claude-code`(或 `curl -fsSL https://claude.ai/install.sh | bash`)
154
155
  - 要用 **DeepSeek 等其它模型**写代码:把 Claude Code 接到对应 API,见 [`docs/agent/worker-models.zh-CN.md`](docs/agent/worker-models.zh-CN.md)。FDE「配置模型」页下方也有同样说明。
155
156
  6. 编辑「启动命令」(须以 `Duaer` 开头)→ 开工建 `.worktree/feat-*`,并为每条 worker 泳道打开 **Terminal**。
156
- 7. 右侧进度列先提示**下一步**(阶段条),并轮询 `tasks.md`。进度上方 **查看交付物** 会打开生成的 HTML 页(需求文档时间线、确认书、架构、任务池、交付等)。交付时数字员工先更新产品仓 **README**,再把 `delivery.json` 标为 `accepted`。然后出现 **结果**(有页面时 **查看结果**;否则 **打开项目目录**)。
157
+ 7. 右侧进度列先提示**下一步**(阶段条),并轮询 `tasks.md`。进度上方 **查看交付物** 会打开生成的 HTML 页(需求文档时间线、确认书、基线签署与变更、架构、任务池、交付等)。交付时数字员工先更新产品仓 **README**,再把 `delivery.json` 标为 `accepted`。然后出现 **结果**(有页面时 **查看结果**;否则 **打开项目目录**)。
157
158
  8. 成品不满意:点 **继续改进(左侧对话)** → 确认改进卡(同样须校验)→ 再确认架构(保留或重画)→ 同 worktree 续派(先清残留 Agent 再入队)。进度跟本轮 `R{n}-*`。启动失败会回滚本轮 Brief Revision;状态行按泳道显示 Terminal 忙闲/队列。
158
159
  9. 若需要上线 / 公网:在控制台选 **计划托管平台**(Cloudflare / 阿里云 / AWS / GitHub Pages),说明见 [`docs/agent/deploy-targets.md`](docs/agent/deploy-targets.md)。未指定时默认 **GitHub CLI(`gh`)+ Actions**([`docs/agent/deploy-github.md`](docs/agent/deploy-github.md))
159
160