duaer-spec 0.26.0 → 0.27.1

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 (85) hide show
  1. package/.claude/rules/agents-workflow.md +2 -0
  2. package/.claude/rules/duaer-spec.md +1 -0
  3. package/.cursor/rules/agents-workflow.mdc +2 -0
  4. package/.cursor/rules/duaer-spec.mdc +1 -0
  5. package/.duaer/active-job.json +3 -3
  6. package/.duaer/specs/260-release-026/delivery.json +10 -9
  7. package/.duaer/specs/260-release-026/tasks.md +1 -3
  8. package/.duaer/specs/261-fde-baseline-sign/delivery.json +10 -0
  9. package/.duaer/specs/261-fde-baseline-sign/spec.md +37 -0
  10. package/.duaer/specs/261-fde-baseline-sign/tasks.md +8 -0
  11. package/.duaer/specs/262-fde01-readme-docs/delivery.json +9 -0
  12. package/.duaer/specs/262-fde01-readme-docs/spec.md +23 -0
  13. package/.duaer/specs/262-fde01-readme-docs/tasks.md +5 -0
  14. package/.duaer/specs/263-arch-edge-via/delivery.json +9 -0
  15. package/.duaer/specs/263-arch-edge-via/spec.md +25 -0
  16. package/.duaer/specs/263-arch-edge-via/tasks.md +5 -0
  17. package/.duaer/specs/264-baseline-field-guide/delivery.json +10 -0
  18. package/.duaer/specs/264-baseline-field-guide/spec.md +23 -0
  19. package/.duaer/specs/264-baseline-field-guide/tasks.md +5 -0
  20. package/.duaer/specs/265-baseline-chat-passthrough/delivery.json +9 -0
  21. package/.duaer/specs/265-baseline-chat-passthrough/spec.md +22 -0
  22. package/.duaer/specs/265-baseline-chat-passthrough/tasks.md +4 -0
  23. package/.duaer/specs/266-fde02-api-contract/delivery.json +10 -0
  24. package/.duaer/specs/266-fde02-api-contract/spec.md +28 -0
  25. package/.duaer/specs/266-fde02-api-contract/tasks.md +7 -0
  26. package/.duaer/specs/267-baseline-restore/delivery.json +9 -0
  27. package/.duaer/specs/267-baseline-restore/spec.md +24 -0
  28. package/.duaer/specs/267-baseline-restore/tasks.md +5 -0
  29. package/.duaer/specs/268-fde07-uat/delivery.json +9 -0
  30. package/.duaer/specs/268-fde07-uat/spec.md +30 -0
  31. package/.duaer/specs/268-fde07-uat/tasks.md +5 -0
  32. package/.duaer/specs/269-release-027/spec.md +12 -0
  33. package/.duaer/specs/269-release-027/tasks.md +4 -0
  34. package/.duaer/specs/270-patch-version/delivery.json +7 -0
  35. package/.duaer/specs/270-patch-version/spec.md +19 -0
  36. package/.duaer/specs/270-patch-version/tasks.md +4 -0
  37. package/.duaer/specs/271-fde04-compat/delivery.json +9 -0
  38. package/.duaer/specs/271-fde04-compat/spec.md +25 -0
  39. package/.duaer/specs/271-fde04-compat/tasks.md +5 -0
  40. package/.duaer/specs/272-fde03-env-check/delivery.json +9 -0
  41. package/.duaer/specs/272-fde03-env-check/spec.md +34 -0
  42. package/.duaer/specs/272-fde03-env-check/tasks.md +5 -0
  43. package/.duaer/specs/273-fde06-data-precheck/delivery.json +9 -0
  44. package/.duaer/specs/273-fde06-data-precheck/spec.md +37 -0
  45. package/.duaer/specs/273-fde06-data-precheck/tasks.md +5 -0
  46. package/.duaer/specs/274-fde05-external-deps/delivery.json +9 -0
  47. package/.duaer/specs/274-fde05-external-deps/spec.md +37 -0
  48. package/.duaer/specs/274-fde05-external-deps/tasks.md +5 -0
  49. package/.duaer/specs/275-release-0271/spec.md +13 -0
  50. package/.duaer/specs/275-release-0271/tasks.md +4 -0
  51. package/AGENTS.md +5 -2
  52. package/CHANGELOG.md +81 -0
  53. package/README.md +22 -14
  54. package/README.zh-CN.md +6 -5
  55. package/bin/duaer-live.mjs +266 -77
  56. package/bin/live-archify.mjs +85 -0
  57. package/bin/live-deliverables.mjs +65 -0
  58. package/bin/live-modules.mjs +127 -3
  59. package/bin/live-project-chat.mjs +24 -1
  60. package/docs/agent/branching-and-release.md +16 -0
  61. package/docs/agent/e2e-test-plan.md +19 -0
  62. package/docs/agent/live-desk.md +36 -1
  63. package/docs/agent/workflow.md +2 -0
  64. package/package.json +1 -1
  65. package/web/live-dev/api-contract.mjs +50 -0
  66. package/web/live-dev/app.js +345 -21
  67. package/web/live-dev/baseline.mjs +74 -0
  68. package/web/live-dev/compat-matrix.mjs +38 -0
  69. package/web/live-dev/confirm-card.mjs +22 -0
  70. package/web/live-dev/data-precheck.mjs +35 -0
  71. package/web/live-dev/env-check.mjs +41 -0
  72. package/web/live-dev/external-deps.mjs +35 -0
  73. package/web/live-dev/i18n-de.js +37 -0
  74. package/web/live-dev/i18n-es.js +37 -0
  75. package/web/live-dev/i18n-fr.js +37 -0
  76. package/web/live-dev/i18n-ja.js +37 -0
  77. package/web/live-dev/i18n-ko.js +37 -0
  78. package/web/live-dev/i18n-pt-BR.js +37 -0
  79. package/web/live-dev/i18n-ru.js +37 -0
  80. package/web/live-dev/i18n-vi.js +37 -0
  81. package/web/live-dev/i18n-zh-TW.js +37 -0
  82. package/web/live-dev/i18n.js +77 -2
  83. package/web/live-dev/index.html +60 -1
  84. package/web/live-dev/styles.css +4 -0
  85. package/web/live-dev/uat-pack.mjs +21 -0
@@ -50,6 +50,8 @@ cd .worktree/feat-login
50
50
  - Push only when the user explicitly asks (a deploy/hosting ask authorizes
51
51
  the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
52
52
  - Promote **`develop` → `main`** only when the user asks to go online
53
+ - Version: fast iteration bumps the **patch** (`0.27.1`, `0.27.2`, …). Next
54
+ after `0.27.1` is `0.27.2`. Do not bump the minor on every ship.
53
55
  - English docs: no Chinese (CJK); Chinese docs may include English terms
54
56
 
55
57
  ## GitHub issue / PR intake
@@ -33,6 +33,7 @@ For new behavior, fixes, refactors that change product behavior, or architecture
33
33
  as you go so progress is visible. Do not leave only coarse mega-tasks.
34
34
  7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
35
35
  **`develop`**). Promote to **`main`** only if the user asks to go online.
36
+ Version bump is the patch (`0.27.2` next).
36
37
  8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
37
38
  the worktree, then restart services from the primary checkout on `develop`
38
39
  using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
@@ -53,6 +53,8 @@ cd .worktree/feat-login
53
53
  - Push only when the user explicitly asks (a deploy/hosting ask authorizes
54
54
  the `gh` + push needed for that publish — see `docs/agent/deploy-github.md`)
55
55
  - Promote **`develop` → `main`** only when the user asks to go online
56
+ - Version: fast iteration bumps the **patch** (`0.27.1`, `0.27.2`, …). Next
57
+ after `0.27.1` is `0.27.2`. Do not bump the minor on every ship.
56
58
  - English docs: no Chinese (CJK); Chinese docs may include English terms
57
59
 
58
60
  ## GitHub issue / PR intake
@@ -37,6 +37,7 @@ For new behavior, fixes, refactors that change product behavior, or architecture
37
37
  as you go so progress is visible. Do not leave only coarse mega-tasks.
38
38
  7. Merge to **`develop`** when done (hotfix: **`main`**, then back-merge
39
39
  **`develop`**). Promote to **`main`** only if the user asks to go online.
40
+ Version bump is the patch (`0.27.2` next).
40
41
  8. **Handoff (mandatory):** stop processes bound to `.worktree/<id>/`, remove
41
42
  the worktree, then restart services from the primary checkout on `develop`
42
43
  using `.duaer/handoff.json` / `duaer handoff [--run]`. Never leave the user
@@ -1,5 +1,5 @@
1
1
  {
2
- "feature": "260-release-026",
3
- "branch": "feat/release-026",
4
- "worktree": ".worktree/feat-release-026"
2
+ "feature": "275-release-0271",
3
+ "branch": "feat/release-0271",
4
+ "worktree": ".worktree/feat-release-0271"
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
@@ -0,0 +1,7 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Fast iteration ships as patch versions. Next release after 0.27.0 is 0.27.1.",
4
+ "verification": {
5
+ "docs": "Policy only; no runtime change. testing.md docs waiver."
6
+ }
7
+ }
@@ -0,0 +1,19 @@
1
+ # Feature Specification: Patch versions for fast iteration
2
+
3
+ ## Goal
4
+
5
+ Ships after 0.27.0 increment the patch number. The next release is 0.27.1.
6
+
7
+ ## In scope
8
+
9
+ - Release docs and agent rules state the default bump is the last number
10
+
11
+ ## Out of scope
12
+
13
+ - Cutting 0.27.1 now
14
+ - Changing npm or GitHub release automation
15
+
16
+ ## Acceptance
17
+
18
+ 1. Branching docs say 0.27.0 is followed by 0.27.1, not 0.28.0
19
+ 2. Agent rules repeat that patch bump
@@ -0,0 +1,4 @@
1
+ # Tasks — 270-patch-version
2
+
3
+ - [x] Document patch bumps (next release 0.27.1)
4
+ - [x] Repeat the rule in agent workflow files
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Feature device matrix must name two targets, evidence, and a fallback; kickoff schedules the compat check.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs — pass",
6
+ "L1": "npm test — 239 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,25 @@
1
+ # Feature Specification: FDE-04 browser matrix evidence
2
+
3
+ ## Goal
4
+
5
+ A feature confirm card cannot pass with a vague browser line. The device
6
+ matrix must name real targets, point at evidence, and state a fallback.
7
+ Kickoff schedules that check.
8
+
9
+ ## In scope
10
+
11
+ - Local validate on deviceMatrix
12
+ - One FDE-04 task per confirmed module
13
+ - Hint, placeholder, and chat/accept prompts
14
+
15
+ ## Out of scope
16
+
17
+ - Bug desk
18
+ - Running a device lab
19
+
20
+ ## Acceptance
21
+
22
+ 1. "主流浏览器" or a single browser name fails local validate
23
+ 2. Two named targets plus screenshot/cloud evidence plus a fallback passes
24
+ 3. Kickoff adds an FDE-04 compat evidence task
25
+ 4. npm test and npm run test:live pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 271-fde04-compat
2
+
3
+ - [x] Validate the browser matrix as evidence
4
+ - [x] Inject an FDE-04 kickoff task
5
+ - [x] Update hints, prompts, docs, and tests
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Feature confirm requires a passed DNS/TLS/CORS/auth/third-party checklist, or a no-customer opt-out. Kickoff schedules the probe before implement.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/env-check.mjs — pass",
6
+ "L1": "npm test — 242 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,34 @@
1
+ # Feature Specification: FDE-03 environment checklist
2
+
3
+ ## Goal
4
+
5
+ A feature confirm card cannot pass until the environment checklist records
6
+ DNS, TLS, CORS, auth, and third-party reachability as passed. A failed probe
7
+ blocks confirm. Kickoff schedules that probe before implementation.
8
+
9
+ ## In scope
10
+
11
+ - Local validate on envChecklist
12
+ - One FDE-03 task per confirmed module that declares a customer environment,
13
+ placed before that module's implement task
14
+ - Hint, placeholder, and chat/accept prompts
15
+ - Explicit opt-out: no customer environment
16
+
17
+ ## Out of scope
18
+
19
+ - Bug desk
20
+ - Scanning the customer network from the desk
21
+
22
+ ## Assumptions
23
+
24
+ - The desk records the checklist; the digital employee runs the probes.
25
+ - 「无客户联调环境」 / "no customer environment" skips the five probes and
26
+ the kickoff task.
27
+
28
+ ## Acceptance
29
+
30
+ 1. A vague line, a missing probe, or any failed probe fails local validate
31
+ 2. All five probes marked passed, or the no-customer opt-out, passes
32
+ 3. Kickoff adds an FDE-03 env probe before implement when a customer
33
+ environment is declared, and skips it on the opt-out
34
+ 4. npm test and npm run test:live pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 272-fde03-env-check
2
+
3
+ - [x] Validate the environment checklist (five probes passed, or no-customer opt-out)
4
+ - [x] Inject an FDE-03 kickoff task before implement
5
+ - [x] Update hints, prompts, docs, and tests
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Feature confirm requires a field mapping, an import failure list, and an export, or a no-import opt-out. Kickoff schedules the precheck before implement.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/data-precheck.mjs — pass",
6
+ "L1": "npm test — 246 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }