本会话三部分交付,均经 JDK21 真实构建验证(非退出码,读 BUILD SUCCESS + Tests run):
1) Agent 开发基建(机械门禁优先)
- 入口与中枢:AGENTS.md、.agents/{knowledge,rules,skills,workflows}、CLAUDE.md 订正
- 订正 .gitignore:移除对 .agent/.agents 的忽略——它们是版本化 agent 基建,须入库(此前被忽略致克隆即缺)
- 机械门禁:CI 真跑测试(maven.yml JDK21、去 -Dmaven.test.skip)、覆盖台账去硬编码、
BC 边界 ArchUnit 门(BcBoundaryArchTest)、契约先行门(ContractFirstGateTest:Flyway 卫生 + OpenAPI 结构)
- 单一进度源 docs/mvp/进度总账.md + 7 个 BC per-module .agent + mise.toml(锁 JDK21)
- P1 增量:AiSuggestionMergeProjectionFacade(Gap A)、ContentSourceServiceImpl 事务化 outbox 回流(Gap B)
2) 过期历史文档清理(97 份 churn,git 可恢复)
- 删 docs/memorys(34)、agent-specs 审阅/执行版+迁移review(34)、superpowers/plans+specs(25)、
design-docs/临时+memorys(4);保留 superpowers/reports/coverage(门禁依赖)
- 唯一干货蒸馏入 .agents/knowledge/external-deps-and-gotchas.md;订正大纲/映射表/基线悬空引用
3) P1 harness 验证:消除已登记 BC 违例 ContentMuseWorkOwnerFacade
- content-api 新增只读端口 MuseContentWorkOwnerApi + content-server 实现(读自有 DAL);
AI 适配器改消费该端口、移除全部 content.dal 依赖,AI 业务规则与 4 消费者不变
- 删除 ArchUnit 豁免 → 门禁收紧(反向红 31 例 / 正向绿;适配器单测 13/0F、端口实现 7/0F)
注:muse-studio/src(SSE 相关 4 文件)与 muse-module-ai/pom.xml(移除孤儿 contract-server)
为本会话之前已存在的未提交改动,非本次工作,未纳入本提交。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2.7 KiB
2.7 KiB
规则:BC 边界 —— 禁跨域 DAL 直连(ArchUnit 机械门禁)
类型:硬约束(rules) · 状态:生效 2026-06-14 · 门禁:ArchUnit(机械阻断,非自觉) 上位:
verification-and-anti-false-green.md§二.6 由来:对抗复盘 A4——软约束下 AI 模块ContentMuseWorkOwnerFacade直连 content 的WorkMapper/ChapterMapper/BlockMapper+WorkDO/ChapterDO/BlockDO,实质破了"模块化单体 + 清晰 BC 边界"(ADR)的根基,且会随时间蔓延、拆服务时代价爆炸。
一、规则
- 一个业务域(BC)模块不得 import / 依赖他域的 DAL(
.dal..,含 dataobject 与 mysql Mapper)。 - 跨 BC 读写只能走对外 API 或 facade-api 契约(本域定义端口,他域提供适配器;或经对外 API)。
- 本域读自己的 DAL 不受限。
正面范例:P1 增量 2 的
AiSuggestionMergeProjectionFacade—— AI 实现 content 的ContentAiSuggestionFacade端口、只读 AI 自有 suggestion 库,不碰 content DAL,即合规的跨 BC 接缝。
二、机械门禁(不是自觉)
- 测试:
muse-server/src/test/java/cn/iocoder/muse/server/framework/arch/BcBoundaryArchTest.java(ArchUnit 1.3.0)。 - CI:随
muse-cloud/.github/workflows/maven.yml(P0 已打开测试门、JDK21)在 PR/push 阻断。 - 任何新增跨域 DAL 依赖 → 测试红 → 阻断合入。
三、违例登记与整改
当前无任何豁免——BcBoundaryArchTest 已不含 haveNameNotMatching,任何 AI→他域 DAL 依赖一律红。
已整改(历史)
| 违例类 | 曾经内容 | 整改 | 验收(2026-06-14) |
|---|---|---|---|
module.ai.application.muse.facade.ContentMuseWorkOwnerFacade |
直连 content WorkMapper/ChapterMapper/BlockMapper + WorkDO/ChapterDO/BlockDO(字节码 31 处依赖) |
content 暴露对外只读端口 MuseContentWorkOwnerApi(content-api 定义、content-server 实现读自有 DAL);AI 适配器改消费该端口,移除全部 content.dal 依赖,AI 业务规则不变 |
反向:删豁免+旧码 → 门禁红、精确报 31 例;正向:整改+删豁免 → 门禁绿(收紧),适配器单测 13/0F、端口实现单测 7/0F |
豁免一律视为临时:违例消除后必须从
haveNameNotMatching删除该类,使门禁收紧——收紧即整改验收(本条已完成,豁免已清零)。新违例不在任何豁免内,一律红。
四、扩展方式
- 新增 BC 间约束(如禁 content→ai.dal、禁前端契约外的耦合)按同样方式在
BcBoundaryArchTest加@Test规则。 - 违例消除后,从对应
haveNameNotMatching豁免里删掉该类,门禁随即收紧——收紧动作本身就是整改完成的验收。