# Implementation Plan: ECR-001 **Author:** Architect Agent **For:** Engineer Agent ## Scope reminder **Allowed / Forbidden:** 见 `docs/ECR/ECR-001-structural-realignment.md`。 **默认:无用户可见行为变更。** ## Steps(按序;每步独立 PR + Task) ### Phase A — Governance docs(可 Architect 收尾 / Engineer 轻触) 1. 确认 ADR-0007 已存在且 Profile 已指向双轨。 2. 更新 `LEGACY.md` + `CLAUDE.md` Legacy 段:标明静态 `css/js/pages/yuxingu.html` 已删除;勿再扩展。 3. 同步 `.ai/architecture/go-services.md`:**标注** membership/order 当前寄居于 report(实现前真相),并写「目标态」指向 Phase C。 ### Phase B — H5 拆页(优先) 1. `HomePage.vue`:抽入口九宫格、推荐区、档案摘要 → components/composables。 2. `SynastryPage.vue`:图表 / 表单 / 结果区拆分。 3. 其余超标页按 ENGINEERING_SPEC 优先级逐个拆。 4. 每页:`npm run build:h5`;相关 vitest;必要时 e2e 主路径。 ### Phase C — Go membership/order 抽出 1. 新建 `internal/service/membership`(含 GetMembership / 配额相关从 report 迁入的用例)。 2. Order 创建迁入 `membership` 或独立 `order` 包(二选一,Prefer:`membership` 内 order 若文件仍 <400)。 3. `ReportHandler` 改为依赖新 service;路由注册不变。 4. 跑 `go test ./...` + `internal/integration` Membership。 ### Phase D — Engine 拆文件 1. `relation/engine.go` 按纯函数/段落拆多文件(同包)。 2. star 过大文件同类处理。 3. 引擎单测全绿;禁止改 golden 输出除非测试本有误。 ### Phase E — 另立 ECR-002(本计划仅占位) fortune 包名 / `lucky` 字段卫生 → 不在本父 ECR 编码。 ### Phase F — packages 补强 1. 对照 `proto/openapi.yaml` 补 `@yuxingu/types`。 2. sdk 缺方法补齐;H5 只经 client。 ## Files likely touched | Phase | Paths | |-------|--------| | A | `LEGACY.md` · `CLAUDE.md` · `.ai/architecture/go-services.md` · `.ai/adr/0007-*` | | B | `apps/user-h5/src/pages/*` · `components/*` · `composables/*` | | C | `apps/api/internal/service/report/*` · `service/membership/*` · `handler/report.go` · `httpserver` wire | | D | `apps/api/internal/relation/*` · `star/*` | | F | `packages/types` · `packages/sdk` · `apps/user-h5/src/api` | ## Tests to add - 搬移/抽函数处:保留或增加表驱动单测 - Phase C:集成测试不得删减 - Phase B:优先现有 `PortraitPage.spec.ts` 模式补关键页 smoke(若拆出纯函数) ## Out of scope - 真支付、新功能、微服务、换栈、Phase E 字段破坏性变更 ## Risks 见 ECR Risk 表。Engineer 遇「必须改行为才能编译」→ **停**,回 Architect 开子 ECR。