duaer-spec 0.27.0 → 0.27.2

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 (72) 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/270-patch-version/delivery.json +7 -0
  7. package/.duaer/specs/270-patch-version/spec.md +19 -0
  8. package/.duaer/specs/270-patch-version/tasks.md +4 -0
  9. package/.duaer/specs/271-fde04-compat/delivery.json +9 -0
  10. package/.duaer/specs/271-fde04-compat/spec.md +25 -0
  11. package/.duaer/specs/271-fde04-compat/tasks.md +5 -0
  12. package/.duaer/specs/272-fde03-env-check/delivery.json +9 -0
  13. package/.duaer/specs/272-fde03-env-check/spec.md +34 -0
  14. package/.duaer/specs/272-fde03-env-check/tasks.md +5 -0
  15. package/.duaer/specs/273-fde06-data-precheck/delivery.json +9 -0
  16. package/.duaer/specs/273-fde06-data-precheck/spec.md +37 -0
  17. package/.duaer/specs/273-fde06-data-precheck/tasks.md +5 -0
  18. package/.duaer/specs/274-fde05-external-deps/delivery.json +9 -0
  19. package/.duaer/specs/274-fde05-external-deps/spec.md +37 -0
  20. package/.duaer/specs/274-fde05-external-deps/tasks.md +5 -0
  21. package/.duaer/specs/275-release-0271/delivery.json +9 -0
  22. package/.duaer/specs/275-release-0271/spec.md +13 -0
  23. package/.duaer/specs/275-release-0271/tasks.md +4 -0
  24. package/.duaer/specs/276-fde08-perf-budget/delivery.json +9 -0
  25. package/.duaer/specs/276-fde08-perf-budget/spec.md +38 -0
  26. package/.duaer/specs/276-fde08-perf-budget/tasks.md +5 -0
  27. package/.duaer/specs/277-project-dir-reuse/delivery.json +9 -0
  28. package/.duaer/specs/277-project-dir-reuse/spec.md +31 -0
  29. package/.duaer/specs/277-project-dir-reuse/tasks.md +5 -0
  30. package/.duaer/specs/278-project-create-unique/delivery.json +9 -0
  31. package/.duaer/specs/278-project-create-unique/spec.md +27 -0
  32. package/.duaer/specs/278-project-create-unique/tasks.md +5 -0
  33. package/.duaer/specs/279-arch-side-detour/delivery.json +8 -0
  34. package/.duaer/specs/279-arch-side-detour/spec.md +28 -0
  35. package/.duaer/specs/279-arch-side-detour/tasks.md +5 -0
  36. package/.duaer/specs/280-arch-bottom-via-label/delivery.json +8 -0
  37. package/.duaer/specs/280-arch-bottom-via-label/spec.md +22 -0
  38. package/.duaer/specs/280-arch-bottom-via-label/tasks.md +5 -0
  39. package/.duaer/specs/281-release-0272/spec.md +13 -0
  40. package/.duaer/specs/281-release-0272/tasks.md +4 -0
  41. package/AGENTS.md +5 -2
  42. package/CHANGELOG.md +69 -0
  43. package/bin/duaer-live.mjs +202 -23
  44. package/bin/live-archify.mjs +382 -26
  45. package/bin/live-deliverables.mjs +16 -0
  46. package/bin/live-modules.mjs +81 -1
  47. package/bin/live-project-chat.mjs +8 -0
  48. package/bin/live-repo-path.mjs +91 -2
  49. package/docs/agent/branching-and-release.md +16 -0
  50. package/docs/agent/e2e-test-plan.md +10 -0
  51. package/docs/agent/live-desk.md +34 -4
  52. package/docs/agent/workflow.md +2 -0
  53. package/package.json +1 -1
  54. package/web/live-dev/app.js +95 -2
  55. package/web/live-dev/baseline.mjs +4 -0
  56. package/web/live-dev/compat-matrix.mjs +38 -0
  57. package/web/live-dev/confirm-card.mjs +4 -0
  58. package/web/live-dev/data-precheck.mjs +35 -0
  59. package/web/live-dev/env-check.mjs +41 -0
  60. package/web/live-dev/external-deps.mjs +35 -0
  61. package/web/live-dev/i18n-de.js +25 -10
  62. package/web/live-dev/i18n-es.js +25 -10
  63. package/web/live-dev/i18n-fr.js +25 -10
  64. package/web/live-dev/i18n-ja.js +25 -10
  65. package/web/live-dev/i18n-ko.js +25 -10
  66. package/web/live-dev/i18n-pt-BR.js +25 -10
  67. package/web/live-dev/i18n-ru.js +25 -10
  68. package/web/live-dev/i18n-vi.js +25 -10
  69. package/web/live-dev/i18n-zh-TW.js +25 -10
  70. package/web/live-dev/i18n.js +50 -20
  71. package/web/live-dev/index.html +33 -9
  72. package/web/live-dev/perf-budget.mjs +38 -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": "269-release-027",
3
- "branch": "chore/release-027",
4
- "worktree": ".worktree/chore-release-027"
2
+ "feature": "281-release-0272",
3
+ "branch": "feat/release-0272",
4
+ "worktree": ".worktree/feat-release-0272"
5
5
  }
@@ -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
+ }
@@ -0,0 +1,37 @@
1
+ # Feature Specification: FDE-06 import precheck
2
+
3
+ ## Goal
4
+
5
+ A feature confirm card cannot pass until it records a field mapping, an
6
+ import precheck failure list, and that the list can be exported for
7
+ cleanup. Kickoff schedules that precheck before implementation.
8
+
9
+ ## In scope
10
+
11
+ - Local validate on dataPrecheck
12
+ - One FDE-06 task per confirmed module that declares an import, placed
13
+ before that module's implement task and after the environment probe
14
+ when both exist
15
+ - Hint, placeholder, and chat/accept prompts
16
+ - Explicit opt-out: no import for this module
17
+
18
+ ## Out of scope
19
+
20
+ - Bug desk
21
+ - Scanning a customer database from the desk
22
+
23
+ ## Assumptions
24
+
25
+ - The desk records the checklist; the digital employee produces the
26
+ mapping, the failure list, and the export.
27
+ - 「本模块无导入」 / "no import" skips the three requirements and the
28
+ kickoff task.
29
+
30
+ ## Acceptance
31
+
32
+ 1. A vague line or a line missing mapping, failure list, or export fails
33
+ local validate
34
+ 2. All three present, or the no-import opt-out, passes
35
+ 3. Kickoff adds an FDE-06 data precheck before implement when an import
36
+ is declared, and skips it on the opt-out
37
+ 4. npm test and npm run test:live pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 273-fde06-data-precheck
2
+
3
+ - [x] Validate the import precheck (mapping, failure list, export, or no-import opt-out)
4
+ - [x] Inject an FDE-06 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 blocker, SLA, backup mock, and parallel path, or a no-dependency opt-out. Kickoff schedules the board before implement.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/external-deps.mjs — pass",
6
+ "L1": "npm test — 250 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,37 @@
1
+ # Feature Specification: FDE-05 external dependency board
2
+
3
+ ## Goal
4
+
5
+ A feature confirm card cannot pass until it records a blocker, an SLA, a
6
+ backup mock, and a parallel path for third-party, ERP, or SSO work.
7
+ Kickoff schedules that board before implementation.
8
+
9
+ ## In scope
10
+
11
+ - Local validate on externalDeps
12
+ - One FDE-05 task per confirmed module that declares an external
13
+ dependency, placed before implement and after the env probe and data
14
+ precheck when those exist
15
+ - Hint, placeholder, and chat/accept prompts
16
+ - Explicit opt-out: no external dependency
17
+
18
+ ## Out of scope
19
+
20
+ - Bug desk
21
+ - Calling the vendor or the customer ERP from the desk
22
+
23
+ ## Assumptions
24
+
25
+ - The desk records the board; the digital employee keeps the blocker,
26
+ SLA, mock, and parallel path current.
27
+ - 「本模块无外部依赖」 / "no external dependency" skips the four items
28
+ and the kickoff task.
29
+
30
+ ## Acceptance
31
+
32
+ 1. A vague line or a line missing blocker, SLA, mock, or parallel path
33
+ fails local validate
34
+ 2. All four present, or the no-dependency opt-out, passes
35
+ 3. Kickoff adds an FDE-05 task before implement when a dependency is
36
+ declared, and skips it on the opt-out
37
+ 4. npm test and npm run test:live pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 274-fde05-external-deps
2
+
3
+ - [x] Validate the external dependency board (blocker, SLA, mock, parallel path, or opt-out)
4
+ - [x] Inject an FDE-05 kickoff task before implement
5
+ - [x] Update hints, prompts, docs, and tests
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "0.27.1 is on main as v0.27.1, GitHub Release published, npm Trusted Publishing succeeded.",
4
+ "verification": {
5
+ "publish": "git push origin main develop v0.27.1 — fast-forward 1d6d164..26ede20",
6
+ "release": "https://github.com/Duaer/duaer-spec/releases/tag/v0.27.1",
7
+ "npm": "gh run 35558574069 success — + duaer-spec@0.27.1"
8
+ }
9
+ }
@@ -0,0 +1,13 @@
1
+ # Feature Specification: Release 0.27.1
2
+
3
+ ## Goal
4
+
5
+ Ship 0.27.1: FDE-03 environment checklist, FDE-04 compat evidence, FDE-05
6
+ external dependency board, FDE-06 import precheck, and the patch-version
7
+ policy. Promote develop to main, publish a GitHub Release, and let npm
8
+ Trusted Publishing run.
9
+
10
+ ## Acceptance
11
+
12
+ 1. `package.json` is `0.27.1`; CHANGELOG has `0.27.1` and an empty Unreleased section.
13
+ 2. Tag `v0.27.1` is on `main`; GitHub Release is published.
@@ -0,0 +1,4 @@
1
+ # Tasks — 275-release-0271
2
+
3
+ - [x] Bump 0.27.1 and move changelog notes
4
+ - [x] Tag v0.27.1 on main and publish the GitHub Release
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Feature confirm requires LCP, INP, bundle size, virtualized long lists, a weak-network check, and a large-data check, or a no-page-performance opt-out. A vague speed line fails. Kickoff schedules the budget before implement.",
4
+ "verification": {
5
+ "L0": "node --check bin/duaer-live.mjs bin/live-modules.mjs web/live-dev/app.js web/live-dev/perf-budget.mjs — pass",
6
+ "L1": "npm test — 254 pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,38 @@
1
+ # Feature Specification: FDE-08 performance budget
2
+
3
+ ## Goal
4
+
5
+ A feature confirm card cannot pass on a vague speed claim. It must record
6
+ LCP, INP, bundle size, virtualized long lists, a weak-network check, and a
7
+ large-data check. Kickoff schedules that budget before implementation.
8
+
9
+ ## In scope
10
+
11
+ - Local validate on perfBudget
12
+ - One FDE-08 task per confirmed module that declares page performance,
13
+ placed before implement and after the env probe, data precheck, and
14
+ external-dependency board when those exist
15
+ - Hint, placeholder, and chat/accept prompts
16
+ - Explicit opt-out: no page performance requirement
17
+
18
+ ## Out of scope
19
+
20
+ - Bug desk
21
+ - Running a customer performance lab from the desk
22
+
23
+ ## Assumptions
24
+
25
+ - The desk records the budget; the digital employee runs the weak-network
26
+ and large-data checks.
27
+ - 「本模块无页面性能要求」 / "no page performance" skips the six items
28
+ and the kickoff task.
29
+ - "挺快的" and other vague speed lines fail.
30
+
31
+ ## Acceptance
32
+
33
+ 1. A vague speed line, or a line missing any of the six items, fails
34
+ local validate
35
+ 2. All six present, or the no-page-performance opt-out, passes
36
+ 3. Kickoff adds an FDE-08 task before implement when page performance is
37
+ declared, and skips it on the opt-out
38
+ 4. npm test and npm run test:live pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 276-fde08-perf-budget
2
+
3
+ - [x] Validate the performance budget (LCP, INP, bundle, long list, weak network, large data, or opt-out)
4
+ - [x] Inject an FDE-08 kickoff task before implement
5
+ - [x] Update hints, prompts, docs, and tests
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Create mode refuses when the target project directory already exists. Open from the list or browse still works. Existing folder contents are left untouched.",
4
+ "verification": {
5
+ "L0": "node --check bin/live-repo-path.mjs bin/duaer-live.mjs web/live-dev/app.js — pass",
6
+ "L1": "npm test — pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,31 @@
1
+ # Feature Specification: Refuse reusing an existing project directory on create
2
+
3
+ ## Goal
4
+
5
+ Creating a new project must not reuse a directory that already exists.
6
+ An existing folder can only be opened from the project list or by browse-open.
7
+
8
+ ## In scope
9
+
10
+ - `/api/projects/activate` create mode refuses when the target path already exists
11
+ - Create form sends create mode; list click opens without create
12
+ - Clear Chinese error telling the user to rename or open the existing project
13
+ - Unit / smoke coverage
14
+
15
+ ## Out of scope
16
+
17
+ - Deleting or renaming old project folders
18
+ - Changing how desk sessions are keyed
19
+
20
+ ## Assumptions
21
+
22
+ - "选为当前项目" on the create form means create when the path is new
23
+ - Clicking an item under 「已有项目」 means open
24
+ - Browse into an existing folder opens it; it does not create over it
25
+
26
+ ## Acceptance
27
+
28
+ 1. Create with a folder name that already exists under the parent returns an error; disk contents are unchanged
29
+ 2. Opening the same path from the project list still works
30
+ 3. Create with a never-used name still creates the directory
31
+ 4. `npm test` and `npm run test:live` pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 277-project-dir-reuse
2
+
3
+ - [x] Refuse create when the target project directory already exists
4
+ - [x] Keep open-from-list / browse-open working for existing paths
5
+ - [x] Add tests, copy, and E2E row
@@ -0,0 +1,9 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Create uses only a short folder name under the product parent. Absolute paths, existing folders, and duplicate project titles are refused. Open from the list or browse still works.",
4
+ "verification": {
5
+ "L0": "node --check bin/live-repo-path.mjs bin/duaer-live.mjs — pass",
6
+ "L1": "npm test — pass",
7
+ "L3": "npm run test:live — pass"
8
+ }
9
+ }
@@ -0,0 +1,27 @@
1
+ # Feature Specification: Unique create — short name under parent only
2
+
3
+ ## Goal
4
+
5
+ Create and open are separate. Creating a project only uses a short folder
6
+ name under the product parent. Absolute paths, duplicate folders, and
7
+ duplicate project titles are refused.
8
+
9
+ ## In scope
10
+
11
+ - Create mode: short name only, must have parent set, refuse if folder exists
12
+ - Create mode: refuse if an existing project already uses that path or title
13
+ - Open from list / browse still accepts absolute paths
14
+ - Copy and labels match the rule
15
+
16
+ ## Out of scope
17
+
18
+ - Moving or renaming existing project folders on disk
19
+ - Deleting stale list entries
20
+
21
+ ## Acceptance
22
+
23
+ 1. Create with `/Users/.../pcdemo` fails; asks for a short name under the parent
24
+ 2. Create with a short name that already exists on disk or in the project list fails
25
+ 3. Create with a title already used by another project fails
26
+ 4. Open from the list still works with absolute paths
27
+ 5. `npm test` and `npm run test:live` pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 278-project-create-unique
2
+
3
+ - [x] Create resolves only a short name under the product parent
4
+ - [x] Refuse duplicate folder and duplicate project title on create
5
+ - [x] Update labels, hints, and tests
@@ -0,0 +1,8 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Corridor-aware Archify edge detours (validated bottom/top/side/gutter) plus vertical labelAt so stacked clean-flow IR renders.",
4
+ "verification": {
5
+ "commands": ["node --test test/live-archify.test.mjs"],
6
+ "result": "16 pass / 0 fail"
7
+ }
8
+ }
@@ -0,0 +1,28 @@
1
+ # Feature Specification: Architecture corridor detour for clean-flow
2
+
3
+ ## Goal
4
+
5
+ When Archify rejects edges that cross unrelated components, auto-routing
6
+ must pick a corridor whose segments stay clear of other boxes — not a
7
+ naive bottom exit through column neighbors, and not a side via whose
8
+ horizontal leg clips co-row nodes. Vertical edge labels must sit in the
9
+ gap between stacked boxes.
10
+
11
+ ## In scope
12
+
13
+ - `routeCrossingEdges` validates candidate routes (bottom/top wrap, side
14
+ corridor, gutter wrap) and applies the first clear detour
15
+ - Re-route edges that already have a bad bottom via
16
+ - Vertical edge labels get `labelAt` in the inter-box gap
17
+ - Regression test matching the speaker/editor/store failure
18
+
19
+ ## Out of scope
20
+
21
+ - Changing Archify itself
22
+ - Full force-directed relayout
23
+
24
+ ## Acceptance
25
+
26
+ 1. The reproduced IR (speaker→editor, store→gen, 初稿/定稿 labels) renders
27
+ 2. Existing same-row reverse-edge test still passes
28
+ 3. `npm test` live-archify tests pass
@@ -0,0 +1,5 @@
1
+ # Tasks — 279-arch-side-detour
2
+
3
+ - [x] Corridor-aware detour for edges that cross unrelated components
4
+ - [x] Place vertical edge labels in the gap (`labelAt`)
5
+ - [x] Regression test + docs
@@ -0,0 +1,8 @@
1
+ {
2
+ "status": "accepted",
3
+ "summary": "Bottom/top via edge labels pin labelAt on the via corridor so 改稿 no longer overlaps artifact.",
4
+ "verification": {
5
+ "commands": ["node --check bin/live-archify.mjs", "node --test test/live-archify.test.mjs"],
6
+ "result": "17 pass / 0 fail"
7
+ }
8
+ }
@@ -0,0 +1,22 @@
1
+ # Feature Specification: Bottom-via edge labels clear mid-row boxes
2
+
3
+ ## Goal
4
+
5
+ When a same-row edge detours under the floor, its label must stay on the
6
+ via (below) — not be pulled up with `labelDy: -36` onto mid-row components
7
+ such as `artifact`.
8
+
9
+ ## In scope
10
+
11
+ - `repairEdgeLabelPlacement` pins `labelAt` under bottom vias / above top vias
12
+ - Overlap nudge when an offset mid still hits a box
13
+ - Regression for speaker→revise「改稿」 overlapping artifact
14
+
15
+ ## Out of scope
16
+
17
+ - Changing Archify itself
18
+
19
+ ## Acceptance
20
+
21
+ 1. Reproduced IR renders via Archify
22
+ 2. `node --test test/live-archify.test.mjs` passes
@@ -0,0 +1,5 @@
1
+ # Tasks — 280-arch-bottom-via-label
2
+
3
+ - [x] Pin bottom/top via labels with labelAt on the via corridor
4
+ - [x] Regression test for 改稿 / artifact overlap
5
+ - [x] Docs + delivery stamp
@@ -0,0 +1,13 @@
1
+ # Feature Specification: Release 0.27.2
2
+
3
+ ## Goal
4
+
5
+ Ship 0.27.2: architecture clean-flow corridor detours, bottom-via label
6
+ placement, unique project create paths, and FDE-08 performance budget.
7
+ Promote develop to main, publish a GitHub Release, and let npm Trusted
8
+ Publishing run.
9
+
10
+ ## Acceptance
11
+
12
+ 1. `package.json` is `0.27.2`; CHANGELOG has `0.27.2` and an empty Unreleased section.
13
+ 2. Tag `v0.27.2` is on `main`; GitHub Release is published.
@@ -0,0 +1,4 @@
1
+ # Tasks — 281-release-0272
2
+
3
+ - [x] Bump package.json to 0.27.2 and move CHANGELOG Unreleased
4
+ - [ ] Promote develop → main, tag, GitHub Release
package/AGENTS.md CHANGED
@@ -294,7 +294,9 @@ After normal development:
294
294
  12. Push only when the user explicitly requested remote publishing for the
295
295
  current request
296
296
  13. Promote **`develop` → `main`** only when the user explicitly asks to ship /
297
- go online (see [branching-and-release](docs/agent/branching-and-release.md))
297
+ go online (see [branching-and-release](docs/agent/branching-and-release.md)).
298
+ Fast iteration: bump the **patch** (`0.27.1`, `0.27.2`, …). Do not bump
299
+ the minor on every ship. The next release after `0.27.1` is `0.27.2`.
298
300
 
299
301
  **Production hotfix:** base and merge into **`main`**, then merge the fix into
300
302
  **`develop`** so integration does not regress. Then clean up the worktree.
@@ -350,7 +352,8 @@ git worktree prune
350
352
  13. Stop worktree services; remove worktree; delete short branch; **handoff**
351
353
  restart on `develop` (`duaer handoff [--run]` / `.duaer/handoff.json`)
352
354
  14. Push only when explicitly requested
353
- 15. Promote **`develop` → `main`** only when the user explicitly asks to go online
355
+ 15. Promote **`develop` → `main`** only when the user explicitly asks to go online.
356
+ Version bump is the patch (`0.27.2` next); see branching-and-release.
354
357
 
355
358
  Development must not begin before isolation steps 1–3 are complete.
356
359