Files
Edu/docs/architecture/issues/objections/content_issue.md
SpecialX c179af64a6 docs(docs): coord 完成 15 模块 issue 仲裁与基础设施同步
coord.md 新增 ARB-019/020/021 三章仲裁章节,修正 ARB-001。

- coord.md: 新增 ARB-019/020/021(student/parent/admin-portal 24 项)
- coord.md: 修正 ARB-001(admin P2 预留/schema 文件名/classes 数据源)
- 004 §4: 依赖图加 PBFF→DataAna+Msg
- 004 §7.2: push-gateway→Redis 软失败标注
- 004 §11.4: 错误码前缀矩阵(11 服务+i18n key)
- 004 §11.5: ActionState 信封规范(降级模式方案 B)
- matrix §1: 依赖矩阵加 PBFF 边
- matrix §2: 移除 api-gateway 为 iam gRPC 消费方
- matrix §4: admin-portal→teacher-bff
- matrix §5: 移除 /sse+鉴权头统一
- matrix §6: 错误码表补 i18n key 列
- 15 个 issue.md: 仲裁结论回写
- push-gateway_contract: 移除 /sse+鉴权头改 X-Internal-Token
- packages/contracts: 新建包 ADMIN_* 权限点常量

AI: coord
2026-07-10 16:30:51 +08:00

16 KiB
Raw Blame History

content 问题记录

负责人ai09 关联:coord.mdcontracts/content_contract.md../../services/content/docs/01-understanding.md../../services/content/docs/02-architecture-design.md 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态


§0 已有仲裁核查2026-07-10 复核)

复核依据:coord-final-decisions.md §3.3 N1-N5、01-understanding.md §A ai09 复核记录

0.1 coord-final-decisions.md N1-N5 核查

编号 仲裁结论 02-architecture-design.md 落实位置 核查结果
N1 P4 首次实现即启用 gRPC server 50054 §1.2 入口 HTTP 3005 / gRPC 50054§4.2 gRPC API 已落实
N2 首次实现即检查 DB/Neo4j/Kafka §6.6 /readyz 多依赖检查 已落实
N3 P4 即补全 QuestionService proto不等到 P5 §4.2.4 QuestionService 6 RPC 已落实
N4 首次实现即对齐 ActionState §4.3 错误响应结构 success/error 信封 已落实
N5 P4 首次实现即补全 ChapterService §4.2.2 ChapterService 3 RPC 已落实

0.2 01-understanding.md §A 已裁决项核查

原编号 仲裁结论 02-architecture-design.md 落实位置 核查结果
C2 P4 必须引入 Outbox004 §12.2 强制条款) §3.1.5 content_outbox_events 表 + §5.4 Outbox Publisher 已落实
C4 P4 必须实现 gRPC controller §4.2 gRPC API4 个 Service 已落实
C10 proto 包名保持 next_edu_cloud.content.v1 —(保持现状) 已落实

0.3 核查结论

N1-N5 与 C2/C4/C10 共 8 项已有仲裁全部在 02-architecture-design.md 中正确落实,无遗漏、无偏离。


§1 新提请异议2026-07-10 ai09 复审)

ISSUE-001-ai09REST 端点设计文档与现有实现不一致

  • 提请方ai09
  • 日期2026-07-10
  • 类型:契约不明确
  • 描述02-architecture-design.md §4.1 列出的 REST API 与现有源码实现存在三处偏差:
    1. knowledge-points 列表:设计文档为 GET /knowledge-points?chapterId=query 参数),源码 knowledge-points.controller.ts 实现为 GET /knowledge-points/chapter/:chapterIdpath 参数)
    2. knowledge-points 删除前置:设计文档列 DELETE /knowledge-points/:id/prerequisites/:prereqId,源码未实现该端点
    3. chapters 列表:设计文档为 GET /chapters?textbookId=,源码实现为 GET /chapters/textbook/:textbookId
  • 建议方案以设计文档为目标态query 参数 + 补 DELETE prerequisite 端点),在 P4 重构时统一对齐。但需 coord 确认是否允许 API 路径变更(影响 teacher-bff 消费方)。
  • 状态:待 coord 仲裁

ISSUE-002-ai09content 发布事件 topic 命名策略与契约文档不一致

  • 提请方ai09
  • 日期2026-07-10
  • 类型:契约不明确
  • 描述:事件 topic 命名存在两种策略冲突:
    • 02-architecture-design.md §5.1 + §5.3 TOPIC_MAP:每个事件类型独立 topicedu.content.textbook.created / edu.content.question.published 等共 12 个 topic
    • contracts/content_contract.md §1.4 + matrix.md §4:按聚合根聚合 topicedu.content.knowledge_point.events / edu.content.question.events 共 2 个 topic事件类型用 action 字段区分)
    • events.proto:未定义 KnowledgePointEvent / QuestionEvent message仅 ClassEvent/ExamEvent/HomeworkEvent/GradeEvent
  • 建议方案:采用聚合 topic + action 字段策略与契约文档、matrix.md、events.proto ClassEvent 模式一致),原因:
    1. 与 core-edu 既有模式edu.exam.events / edu.homework.events 等)一致
    2. 减少 topic 数量12 → 4降低 Kafka 集群元数据压力
    3. 消费方按 action 字段过滤,订阅灵活性更高
    4. 需补 KnowledgePointEvent / QuestionEvent / TextbookEvent / ChapterEvent proto message
  • 状态:待 coord 仲裁

ISSUE-003-ai09Textbook/Chapter 事件在契约文档遗漏

  • 提请方ai09
  • 日期2026-07-10
  • 类型:契约不明确
  • 描述02-architecture-design.md §5.1 列出 4 类 textbook 事件 + 1 类 chapter 事件,但 contracts/content_contract.md §1.4 仅列出 knowledge_point 与 question 两类事件Textbook/Chapter 事件未登记。matrix.md §4 也仅列 kp + question。导致下游data-ana无法感知教材/章节变更。
  • 建议方案:在 contract.md 与 matrix.md 补登记 edu.content.textbook.eventsaction: created/updated/published/archivededu.content.chapter.eventsaction: created/updated/deleted。若 coord 认为教材/章节无需对外发事件,则在 design doc §5.1 删除相关事件。
  • 状态:待 coord 仲裁

ISSUE-004-ai09gRPC RPC 数量三方文档不一致

  • 提请方ai09

  • 日期2026-07-10

  • 类型:契约不明确

  • 描述content gRPC RPC 数量在三处文档不一致:

    Service 02-architecture-design.md §4.2 contracts/content_contract.md §1.1 matrix.md §2
    TextbookService 5含 Update/Delete 新增) 3无 Update/Delete 18总数
    ChapterService 3Create/List/Get 4含 Update无 Delete
    KnowledgeGraphService 4 4
    QuestionService 6无 Publish/Search 7含 Publish/Search
    合计 18 18 18
    • design doc 缺 QuestionService.PublishQuestion / SearchQuestionscontract 有)
    • contract 缺 TextbookService.Update/Deletedesign doc 有)
    • design doc ChapterService 缺 Updatecontract 有contract ChapterService 缺 Deletedesign doc 也缺)
  • 建议方案:以 contract.md 为契约唯一源(已对齐 matrix.md 18 RPC 总数),反向修正 design doc

    1. TextbookService 补 Update/Delete与 contract 对齐)
    2. ChapterService 补 Update + Deletedesign doc + contract 都缺 Delete需补
    3. QuestionService 补 PublishQuestion + SearchQuestions与 contract 对齐)
    4. 最终 RPC 总数TextbookService 5 + ChapterService 5 + KnowledgeGraphService 4 + QuestionService 7 = 21 RPC(需同步更新 matrix.md §2 的 18 → 21
  • 状态:待 coord 仲裁

ISSUE-005-ai09core-edu → content 失效事件 topic 无定义

  • 提请方ai09
  • 日期2026-07-10
  • 类型:前置依赖缺失
  • 描述02-architecture-design.md §5.2 列出 content 消费 edu.teaching.content.invalidated(待 ai03 确认 topic
    1. events.proto 无 ContentInvalidatedEvent message
    2. matrix.md §4 未登记该 topic
    3. core-edu 设计文档ai08未明确发布该事件
    4. 01-understanding.md §5 也标注"具体 topic 待 core-edu ai03 设计确认"——此处 ai03 疑为笔误core-edu 实际由 ai08 负责
  • 建议方案content 不主动消费 core-edu 失效事件content 是上游内容提供方core-edu 是消费方),删除 §5.2 中该条目;若确有联动需求,由 core-edu 主动调用 content gRPC UpdateQuestion 状态变更,而非事件驱动。
  • 状态:待 coord 仲裁

ISSUE-006-ai09文档结尾"直接 push main"与项目规则冲突

  • 提请方ai09
  • 日期2026-07-10
  • 类型:其他
  • 描述01-understanding.md 末尾与 02-architecture-design.md 末尾均标注 Branch: 单仓库并行模式(直接 push main,但 project_rules §8 Git 工作流 明确规定:
    • §8分支开发AI 不得自行切换/创建/合并分支
    • §14.3AI 禁止 git mergegit push origin main
    • 当前 worktree 分支为 feat-review-content-module-docs-WAIyMA
  • 建议方案:删除两份文档末尾"单仓库并行模式(直接 push main"字样,改为 Branch: feat-review-content-module-docs-WAIyMA分支开发提交后通知人类合并
  • 状态:待 coord 仲裁

ISSUE-007-ai09questions 表 created_by 字段迁移风险

  • 提请方ai09
  • 日期2026-07-10
  • 类型:其他
  • 描述02-architecture-design.md §3.1.4 questions 表新增 created_by varchar(32) NOT NULL,但现有 questions.schema.ts 无该字段,且现有数据无 created_by 值。schema 迁移时 NOT NULL 约束会导致历史数据迁移失败。
  • 建议方案:迁移期间先用 created_by varchar(32) NULL,数据回填后再加 NOT NULL 约束;或为新数据强制要求 created_by应用层校验历史数据用 'system' 默认值回填。
  • 状态:待 coord 仲裁

ISSUE-008-ai09设计文档缺缓存策略与 API 版本化策略

  • 提请方ai09
  • 日期2026-07-10
  • 类型:其他
  • 描述02-architecture-design.md 未涉及两个长远架构必备项:
    1. 缓存策略env.ts 已预留 REDIS_URL,但 design doc 未设计缓存层(教材树/知识点树是典型读多写少场景,应缓存)
    2. API 版本化REST 端点无 /v1/ 前缀matrix.md §5 显示 api-gateway 路由为 /api/v1/teacher/*,但 content 自身端点 /textbooks 无版本号),未来破坏性变更无版本隔离机制
  • 建议方案
    1. P4 在 design doc §6 补"缓存策略"小节:教材树/章节树 Redis 缓存 + 失效策略Outbox 事件触发缓存失效)
    2. P4 在 design doc §4 补"API 版本化"说明REST 端点统一加 /v1/ 前缀gRPC 用 proto package version
  • 状态:待 coord 仲裁

ISSUE-009-ai09knowledge-points schema 实际缺 difficulty/metadata 字段

  • 提请方ai09
  • 日期2026-07-10
  • 类型:其他
  • 描述02-architecture-design.md §3.1.3 knowledge_points 表列出 difficulty tinyint NOT NULL DEFAULT 3metadata json NULL,但实际 textbooks.schema.tsknowledgePoints 表仅含 id/chapterId/title/description 四个字段,无 difficulty 与 metadata。01-understanding.md C7 提到"时间戳缺失"但未提到 difficulty/metadata 缺失。
  • 建议方案P4 schema 迁移时一并补齐 difficulty + metadata + created_at + updated_at与 design doc §3.1.3 对齐)。
  • 状态:待 coord 仲裁

ISSUE-010-ai09Neo4j Sync Worker 与 ES Sync Worker 在 P4 阶段不必要

  • 提请方ai09
  • 日期2026-07-10
  • 类型:工作量超批
  • 描述02-architecture-design.md §1.1 分层图将 Neo4j Sync Worker 与 ES Sync Worker 并列展示,但:
    1. ES 在 P5 才引入ES Sync Worker 在 P4 不必要
    2. 当前 knowledge-points.service.tssafeCreateNode 是同步双写(业务事务内写 Neo4j与 design doc §0.1 第 3 条"禁止业务事务内同步双写"原则冲突
    3. P4 应改为 Outbox 事件驱动异步同步 Neo4j但 design doc §1.1 图中 Neo4j Sync Worker 的输入源同时画了"Kafka Consumer"与"CONSUMER",链路不清晰
  • 建议方案
    1. §1.1 图中明确标注 ES Sync Worker 为 P5 组件(虚线或灰显)
    2. §1.1 图中 Neo4j Sync Worker 的输入仅来自 content 自身 Outbox 事件(不消费 core-edu 事件)
    3. P4 任务 T6 明确"重构 knowledge-points.service.ts移除 safeCreateNode 同步写,改为发 Outbox 事件"
  • 状态:待 coord 仲裁

§2 待 coord 仲裁项汇总

# 标题 阻塞性 状态
001 REST 端点设计与实现不一致 🟡 P4 重构时对齐 待 coord 仲裁
002 事件 topic 命名策略冲突(独立 vs 聚合) 🔴 阻塞 Outbox 实现 待 coord 仲裁
003 Textbook/Chapter 事件在契约文档遗漏 🟡 契约完整性 待 coord 仲裁
004 gRPC RPC 数量三方文档不一致 🔴 阻塞 proto 修改 待 coord 仲裁
005 core-edu → content 失效事件 topic 无定义 🟢 建议删除 待 coord 仲裁
006 "直接 push main"与项目规则冲突 🟡 文档修正 待 coord 仲裁
007 questions.created_by 迁移风险 🟡 schema 迁移 待 coord 仲裁
008 缓存策略与 API 版本化策略缺失 🟢 长远架构 待 coord 仲裁
009 knowledge-points schema 实际缺字段 🟡 P4 schema 迁移 待 coord 仲裁
010 Sync Worker 链路与 P4 阶段不必要 🟡 设计澄清 待 coord 仲裁

§3 仲裁结论2026-07-10 coord

详见 coord.md §5 ARB-005

ISSUE 仲裁结论 执行方
001 P4 重构统一 query 参数风格 + 补 DELETE prerequisite 端点 ai09
002 采用聚合 topic + action 字段策略4 聚合 topic ai09 + coord
003 补登记 edu.content.textbook.events + chapter.events ai09 已补 + coord 同步 matrix.md
004 统一为 21 RPCTextbook 5 + Chapter 5 + KG 4 + Question 7 ai09 + coord
005 删除 core-edu 失效事件条目;联动改用 gRPC 调用 ai09
006 遵循总裁裁决trunk-based development措辞优化 ai09
007 created_by varchar(32) NOT NULL DEFAULT 'system' ai09
008 P4 补缓存策略 + API 版本化说明 ai09
009 P4 迁移补齐 difficulty/metadata/created_at/updated_at ai09
010 ES Sync Worker 标 P5Neo4j Sync Worker 仅 Outbox 输入;移除 safeCreateNode ai09