oh-my-muse/docs/memorys/2026-06-03-P1R6Market规格计划.md

222 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# P1R6 Market 规格计划
日期2026-06-03
## 背景
本次进入 P1R-6 Market Real API 的规格、计划和 review gate 阶段只完成事实盘点、规格、执行计划、review 修订和阶段留痕,不进入代码实现。
真实工作面:
```text
/Users/qingse/.config/superpowers/worktrees/oh-my-muse/dev-1.0.0
```
分支:
```text
dev/1.0.0
```
开始前已执行:
```bash
git status --short --branch
git log --oneline -5
git pull --ff-only origin dev/1.0.0
```
结果:
```text
## dev/1.0.0...origin/dev/1.0.0
48c750b test(p1r): 补齐 AI 与 Knowledge 外部端到端验收
Already up to date.
```
## 已验证事实
当前 coverage summary
```text
completedOperations 100
needsVerificationOperations 100
incompleteOperations 33
genericPersistenceOperations 32
ssePlaceholderOperations 1
```
当前按域状态:
```text
account 33 dedicated / needs_verification
ai 41 dedicated / completed
content 51 dedicated / needs_verification
events 1 sse_placeholder / incomplete
knowledge 59 dedicated / completed
market 32 generic_persistence / incomplete
meta 16 dedicated / needs_verification
```
Market 32 个 operation 当前全部为:
```text
generic_persistence / incomplete
```
当前 Market 实现事实:
- `docs/api-contracts/market/openapi.yaml` 声明 32 个 Market operation。
- `muse-module-market-server` 当前合同入口仍是 `AdminMuseMarketContractController``AppMuseMarketContractController`
- 当前 Market 合同入口统一委托 `MuseContractPersistenceService`,不能作为真实 API 完成证据。
- `muse-module-market-server` 当前只依赖 `muse-module-market-api`、security、mybatis。
- `muse-server` 当前同时装配 `muse-module-market-server``muse-module-member-server`
- `muse-module-member-server` 已有 `MarketAccountProjectionFacade`、默认 fail-closed `UnavailableMarketAccountProjectionFacade``muse_account_record_projection` DO/Mapper 和 V11 DDL。
当前 DDL 事实:
- V6 已有 Market 初始资产、版本、安装、发布申请、申诉和 handoff 表。
- V8 已有 workflow task、favorite、purchase 表。
- V11 已有 Account 查询读模型 `muse_account_record_projection`
- P1R-5 已使用 V14P1R-6 如新增迁移,推荐使用 `V15__extend_market_real_api_schema.sql`
## 本阶段产物
- 规格:`docs/superpowers/specs/2026-06-03-P1R-6-market-real-api-design.md`
- 计划:`docs/superpowers/plans/2026-06-03-P1R-6-market-real-api.md`
- 留痕:`docs/memorys/2026-06-03-P1R6Market规格计划.md`
## Review 结果
本阶段按要求执行 fresh review gate。
Spec compliance review
```text
PASS_WITH_WARNINGS
```
已修复首轮阻塞点:
- 计划开头错误写成只允许执行 `Task 1-12`,但正文实际包含 Task 13。已修为 `Task 1-13`
Spec review 非阻塞提醒:
- handoff token 业务状态里的 `completed` 不能和 coverage `completionStatus=completed` 混淆。计划已补充消歧说明。
Quality / feasibility review
```text
PASS_WITH_WARNINGS
```
已修复阻塞点:
- Task 5 不再要求 Market 模块另建同名 `MarketAccountProjectionFacade` / `UnavailableMarketAccountProjectionFacade`
- 已明确 P1R-6 Account 投影采用最小可执行接线方案:`muse-module-market-server` 显式依赖 `muse-module-member-server`,复用 member 侧既有 `MarketAccountProjectionFacade``AccountRecordProjectionDO``AccountRecordProjectionMapper`
- 已明确 `muse_market_account_projection` 只表达 Market 侧 projection sync / outbox 状态,不是 Account 查询读模型。
- 已明确 Account 查询读模型只能是 V11 已有 `muse_account_record_projection`
- 已要求实现阶段用 Maven reactor 或 dependency-tree 验证不形成 Maven 循环,并用 Spring context 测试证明真实 provider 替换默认 unavailable bean。
Quality review 非阻塞提醒:
- 当前 worktree 仍有 P1R-4 / P1R-5 coverage/test/script 未提交 diffP1R-6 spec/plan/memory 也是未跟踪文件。进入 P1R-6 实现前必须先提交或明确保留这些 diff避免阶段混账。
## 关键设计结论
- P1R-6 目标状态只能是 `dedicated / needs_verification`,不能写成 `completed`
- Market owner 是 `muse-module-market`负责市场来源侧事实、授权、安装、handoff、发布、治理和申诉。
- Market 不直接写 AI / Knowledge / Content canonical facts。
- 购买只产生授权,不等于安装;安装只进入账户可用列表,不等于绑定目标 owner。
- Account 只消费 Market 写入的投影Account 查询读模型为 `muse_account_record_projection`
- `needs_recheck` 不能作为 Market `SourceStatus` 值,只能表达为 action policy / recheck reasons。
- P1R-7 统一 Events SSE 不属于 P1R-6。
- 不修改 `docs/api-contracts/market/openapi.yaml`,不修改 scanner 掩盖缺口。
## 验证命令与结果
coverage audit
```bash
python3 muse-cloud/scripts/p1r-audit-api-coverage.py --check
```
结果:
```text
Generated docs/superpowers/reports/p1r-api-coverage.json
Generated docs/superpowers/reports/p1r-api-coverage.md
```
coverage 对账:
```bash
jq -r '.summary | [.completedOperations,.needsVerificationOperations,.incompleteOperations,.genericPersistenceOperations,.ssePlaceholderOperations] | @tsv' docs/superpowers/reports/p1r-api-coverage.json
jq -r '.operations[] | select(.domain == "market") | [.implementationStatus,.completionStatus] | @tsv' docs/superpowers/reports/p1r-api-coverage.json | sort | uniq -c
```
结果:
```text
100 100 33 32 1
32 generic_persistence incomplete
```
文档结构检查:
```bash
python3 - <<'PY'
import re, pathlib
plan=pathlib.Path('docs/superpowers/plans/2026-06-03-P1R-6-market-real-api.md').read_text()
spec=pathlib.Path('docs/superpowers/specs/2026-06-03-P1R-6-market-real-api-design.md').read_text()
print('plan_tasks', re.findall(r'^## Task (\d+):', plan, re.M))
print('spec_operation_rows', len(re.findall(r'^\| `[^`]+` \| (GET|POST|DELETE|PUT|PATCH) \| `/', spec, re.M)))
print('plan_operation_lines', len(re.findall(r'^[A-Za-z].+ (GET|POST|DELETE|PUT|PATCH) /', plan, re.M)))
PY
```
结果:
```text
plan_tasks ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']
spec_operation_rows 32
plan_operation_lines 32
```
diff hygiene
```bash
git diff --check
```
结果:无输出。
OpenAPI diff 检查:
```bash
git status --short -- docs/api-contracts/market/openapi.yaml docs/api-contracts/ai/openapi.yaml docs/api-contracts/knowledge/openapi.yaml
```
结果:无输出。
## 当前阶段边界
本阶段只完成 P1R-6 规格、计划、review 修订和 memory 留痕,没有实现代码。
当前不应把任何 Market operation 标为 `completed`
## 下一步
进入 P1R-6 实现前必须先处理工作面:
1. 提交或明确保留 P1R-4 / P1R-5 coverage completed 推进 diff。
2. 提交或明确保留 P1R-6 spec / plan / memory 文档 diff。
3. 再按 `docs/superpowers/plans/2026-06-03-P1R-6-market-real-api.md` Task 1-13 执行。
实现阶段执行规则:
- 同一实现 Task 内复用最近 implementer。
- 新 Task 才 fresh implementer。
- 每个 Task 完成后仍必须 fresh spec review 和 fresh quality / feasibility review。
- review 结论不能替代真实运行态验收或 coverage `completed` 批准。