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.
- package/.claude/rules/agents-workflow.md +2 -0
- package/.claude/rules/duaer-spec.md +1 -0
- package/.cursor/rules/agents-workflow.mdc +2 -0
- package/.cursor/rules/duaer-spec.mdc +1 -0
- package/.duaer/active-job.json +3 -3
- package/.duaer/specs/260-release-026/delivery.json +10 -9
- package/.duaer/specs/260-release-026/tasks.md +1 -3
- package/.duaer/specs/261-fde-baseline-sign/delivery.json +10 -0
- package/.duaer/specs/261-fde-baseline-sign/spec.md +37 -0
- package/.duaer/specs/261-fde-baseline-sign/tasks.md +8 -0
- package/.duaer/specs/262-fde01-readme-docs/delivery.json +9 -0
- package/.duaer/specs/262-fde01-readme-docs/spec.md +23 -0
- package/.duaer/specs/262-fde01-readme-docs/tasks.md +5 -0
- package/.duaer/specs/263-arch-edge-via/delivery.json +9 -0
- package/.duaer/specs/263-arch-edge-via/spec.md +25 -0
- package/.duaer/specs/263-arch-edge-via/tasks.md +5 -0
- package/.duaer/specs/264-baseline-field-guide/delivery.json +10 -0
- package/.duaer/specs/264-baseline-field-guide/spec.md +23 -0
- package/.duaer/specs/264-baseline-field-guide/tasks.md +5 -0
- package/.duaer/specs/265-baseline-chat-passthrough/delivery.json +9 -0
- package/.duaer/specs/265-baseline-chat-passthrough/spec.md +22 -0
- package/.duaer/specs/265-baseline-chat-passthrough/tasks.md +4 -0
- package/.duaer/specs/266-fde02-api-contract/delivery.json +10 -0
- package/.duaer/specs/266-fde02-api-contract/spec.md +28 -0
- package/.duaer/specs/266-fde02-api-contract/tasks.md +7 -0
- package/.duaer/specs/267-baseline-restore/delivery.json +9 -0
- package/.duaer/specs/267-baseline-restore/spec.md +24 -0
- package/.duaer/specs/267-baseline-restore/tasks.md +5 -0
- package/.duaer/specs/268-fde07-uat/delivery.json +9 -0
- package/.duaer/specs/268-fde07-uat/spec.md +30 -0
- package/.duaer/specs/268-fde07-uat/tasks.md +5 -0
- package/.duaer/specs/269-release-027/spec.md +12 -0
- package/.duaer/specs/269-release-027/tasks.md +4 -0
- package/.duaer/specs/270-patch-version/delivery.json +7 -0
- package/.duaer/specs/270-patch-version/spec.md +19 -0
- package/.duaer/specs/270-patch-version/tasks.md +4 -0
- package/.duaer/specs/271-fde04-compat/delivery.json +9 -0
- package/.duaer/specs/271-fde04-compat/spec.md +25 -0
- package/.duaer/specs/271-fde04-compat/tasks.md +5 -0
- package/.duaer/specs/272-fde03-env-check/delivery.json +9 -0
- package/.duaer/specs/272-fde03-env-check/spec.md +34 -0
- package/.duaer/specs/272-fde03-env-check/tasks.md +5 -0
- package/.duaer/specs/273-fde06-data-precheck/delivery.json +9 -0
- package/.duaer/specs/273-fde06-data-precheck/spec.md +37 -0
- package/.duaer/specs/273-fde06-data-precheck/tasks.md +5 -0
- package/.duaer/specs/274-fde05-external-deps/delivery.json +9 -0
- package/.duaer/specs/274-fde05-external-deps/spec.md +37 -0
- package/.duaer/specs/274-fde05-external-deps/tasks.md +5 -0
- package/.duaer/specs/275-release-0271/spec.md +13 -0
- package/.duaer/specs/275-release-0271/tasks.md +4 -0
- package/AGENTS.md +5 -2
- package/CHANGELOG.md +81 -0
- package/README.md +22 -14
- package/README.zh-CN.md +6 -5
- package/bin/duaer-live.mjs +266 -77
- package/bin/live-archify.mjs +85 -0
- package/bin/live-deliverables.mjs +65 -0
- package/bin/live-modules.mjs +127 -3
- package/bin/live-project-chat.mjs +24 -1
- package/docs/agent/branching-and-release.md +16 -0
- package/docs/agent/e2e-test-plan.md +19 -0
- package/docs/agent/live-desk.md +36 -1
- package/docs/agent/workflow.md +2 -0
- package/package.json +1 -1
- package/web/live-dev/api-contract.mjs +50 -0
- package/web/live-dev/app.js +345 -21
- package/web/live-dev/baseline.mjs +74 -0
- package/web/live-dev/compat-matrix.mjs +38 -0
- package/web/live-dev/confirm-card.mjs +22 -0
- package/web/live-dev/data-precheck.mjs +35 -0
- package/web/live-dev/env-check.mjs +41 -0
- package/web/live-dev/external-deps.mjs +35 -0
- package/web/live-dev/i18n-de.js +37 -0
- package/web/live-dev/i18n-es.js +37 -0
- package/web/live-dev/i18n-fr.js +37 -0
- package/web/live-dev/i18n-ja.js +37 -0
- package/web/live-dev/i18n-ko.js +37 -0
- package/web/live-dev/i18n-pt-BR.js +37 -0
- package/web/live-dev/i18n-ru.js +37 -0
- package/web/live-dev/i18n-vi.js +37 -0
- package/web/live-dev/i18n-zh-TW.js +37 -0
- package/web/live-dev/i18n.js +77 -2
- package/web/live-dev/index.html +60 -1
- package/web/live-dev/styles.css +4 -0
- 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
|
package/.duaer/active-job.json
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"status": "accepted",
|
|
3
|
-
"acceptedAt": "2026-09-
|
|
3
|
+
"acceptedAt": "2026-09-20T14:14:57.110Z",
|
|
4
4
|
"verification": {
|
|
5
|
-
"levels": [
|
|
5
|
+
"levels": [
|
|
6
|
+
"docs"
|
|
7
|
+
],
|
|
6
8
|
"commands": [
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"gh run view 35513791762"
|
|
9
|
+
"gh workflow run npm-publish.yml --ref main",
|
|
10
|
+
"npm view duaer-spec version"
|
|
10
11
|
],
|
|
11
|
-
"result": "
|
|
12
|
-
"notes": "
|
|
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://
|
|
16
|
-
"label": "
|
|
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
|
|
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,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,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,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,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,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,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,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,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,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,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,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
|
+
}
|