Merge worktree branch merge-15-modules-to-main-5ug5xJ

This commit is contained in:
SpecialX
2026-07-10 15:28:20 +08:00
parent 60d7173545
commit df62ffc176
51 changed files with 11559 additions and 1908 deletions

View File

@@ -1,24 +1,109 @@
# admin-portal 问题记录
> 负责人ai16
> 关联:[coord.md](../coord.md)、[contracts/admin-portal_contract.md](../contracts/admin-portal_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/admin-portal_contract.md](../contracts/admin-portal_contract.md)、[matrix.md](../matrix.md)、[ai-allocation.md §5 ai16](../../ai-allocation.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## §0 已有仲裁核查ai16 复核)
> 任务要求:对 coord 已有仲裁进行核查。以下为 ai16 对照 admin-portal 实际职责逐条复核结论。
### 0.1 ARB-001teacher-bff GraphQL schema 第一版)— 核查结论:✅ 通过,但存在依赖缺口
- **核查点**ARB-001 §1.3 裁决"admin 命名空间 P2 不包含P6 admin-portal 阶段新增 admin 命名空间"。
- **核查结论**裁决方向正确admin-portal 复用 teacher-bff + admin schema 命名空间,与 ai-allocation §5 ai16 设计重点一致)。
- **发现的缺口**teacher-bff 当前 [02-architecture-design.md](../../../services/teacher-bff/docs/02-architecture-design.md) **未定义 admin 命名空间的 GraphQL schema**(全文仅 1 处 audit 提及,无 adminUsers/adminRoles/auditLogs/adminDashboard 等 Query。admin-portal P6 的全部业务查询依赖该 schema属前置依赖缺失。
- **建议**:请 coord 仲裁 admin 命名空间 schema 的归属与时间点——是否由 ai03teacher-bff在 P6 启动前补齐 `packages/shared-ts/contracts/graphql/teacher-bff.graphql` 的 admin 命名空间部分(参照本模块 [contract §2.4](../contracts/admin-portal_contract.md) 的 Query 清单)。
- **状态**:待 coord 仲裁(见新异议 ISSUE-005
### 0.2 ARB-002MF Shell 暴露清单)— 核查结论:✅ 通过,但 01/02 文档未跟进
- **核查点**ARB-002 §2.2 Shell 暴露清单含 `GraphQLProvider` / `useGraphQLClient` / `useAuth` / `usePermission` / `AppShell` / `ErrorBoundary` / `Loading` / `Empty` / `RequirePermission`**不含** `useApi` / `ApiClient`
- **核查结论**裁决正确。admin-portal 应通过 `useGraphQLClient()` 消费 teacher-bff GraphQL而非 REST ApiClient。
- **发现的问题**:本模块 [01-understanding.md](../../../apps/admin-portal/docs/01-understanding.md) 与 [02-architecture-design.md](../../../apps/admin-portal/docs/02-architecture-design.md) 仍基于 REST `useApi()` / `ApiClient` 编写,未跟进 ARB-002。属本模块文档与仲裁不同步见新异议 ISSUE-003
- **状态**:本模块文档待修订(见 ISSUE-003
### 0.3 未仲裁但影响 admin-portal 的关键项
ARB-001/ARB-002 均未明确仲裁以下三项,而它们直接影响 admin-portal 实现,建议 coord 补充裁决:
| 待裁决项 | 当前依据 | 影响 |
| -------- | -------- | ---- |
| admin-portal 端口 | matrix.md / ai-allocation.md = 4003 | 01/02 文档误用 3003与 teacher-bff 冲突) |
| admin-portal 是否消费 push-gateway WebSocket | 同类 portalparent-portal契约 = 消费 | 01/02 文档误声明"不消费推送" |
| 审计日志消费机制iam Kafka → teacher-bff → GraphQL auditLogs | matrix.md §4 列 admin-portal 为 edu.iam.audit.created 消费方 | 前端不直连 Kafka需经 teacher-bff 聚合matrix.md 表述不精确 |
---
## 问题列表
<!--
追加条目格式:
### ISSUE-001-ai1601/02 模块文档归属错误ai07 → ai16
### ISSUE-[编号]-[AI标识][标题]
- **提请方**ai16
- **日期**2026-07-10
- **类型**:编号冲突 / 文档归属
- **描述**[01-understanding.md](../../../apps/admin-portal/docs/01-understanding.md) 与 [02-architecture-design.md](../../../apps/admin-portal/docs/02-architecture-design.md) 头部均标注"AIai07TS/React · 管理场景域前端 remote",分支名 `docs/admin-portal-stage1-stage2-design-ai07`。但 [ai-allocation.md §5](../../ai-allocation.md) 第 54/97/118/159/278 行明确 admin-portal 归属 **ai16**ai07 实际负责 classes → core-edu 交接(见 [workline.md §4.7](../workline.md))。
- **建议方案**:将 01/02 文档头部 AI 标识与分支命名更正为 ai16ai07 在 admin-portal 的产出视为历史草稿,由 ai16 接管修订。
- **状态**:待 coord 仲裁
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
### ISSUE-002-ai1601/02 文档端口错误3003 → 4003且 3003 与 teacher-bff 冲突
(暂无问题)
- **提请方**ai16
- **日期**2026-07-10
- **类型**:契约不明确 / 编号冲突
- **描述**01 §1 与 02 §12.1 声明 admin-portal 端口 3003并称"与 [full-stack-runbook](../../../docs/standards/full-stack-runbook.md) 端口矩阵对齐"。但 full-stack-runbook §2.1 中 **3003 = teacher-bff**admin-portal 未列入该 runbook。coord 维护的 [matrix.md §1](../matrix.md) 与 ai-allocation.md 统一采用 4000 段teacher-portal :4000 / student-portal :4001 / parent-portal :4002 / admin-portal :4003。
- **建议方案**:确认 admin-portal 端口为 **4003**;同步更新 full-stack-runbook §2.1 补齐 4 个 portal 的 4000 段端口(消除 runbook 与 matrix.md 的端口双轨制)。
- **状态**:待 coord 仲裁
### ISSUE-003-ai1601/02 文档通信协议与 ARB-001/ARB-002 不一致REST → GraphQL
- **提请方**ai16
- **日期**2026-07-10
- **类型**:契约不明确 / 前置依赖缺失
- **描述**01 §3.1 / 02 §1、§4 全文基于 REST`/api/v1/iam/*` + `/api/v1/admin/*` + `useApi()` + `ApiClient`)。但 ARB-001 已裁决 admin-portal 复用 teacher-bff GraphQL **admin 命名空间**ARB-002 已裁决 Shell 暴露 `GraphQLProvider` + `useGraphQLClient`(不含 `useApi`。02 §11.3 仍将"GraphQL vs REST"列为未决与仲裁结论冲突。根因01/02 文档参照的 teacher-portal 02 文档(同样基于 REST、将 GraphQL 列为未决)早于 ARB-001/0022026-07-09未跟进仲裁。
- **建议方案**admin-portal 通信协议统一为 GraphQL`POST /api/admin/graphql` → teacher-bff admin 命名空间);删除 `useApi`/`ApiClient` 依赖,改用 `useGraphQLClient()`02 §11.3 移除已裁决项。本模块 [contract.md](../contracts/admin-portal_contract.md) 已按 GraphQL 编写,作为修订基准。
- **状态**:待 coord 仲裁
### ISSUE-004-ai1601/02 文档遗漏审计日志与学校设置ai-allocation §5 明确职责)
- **提请方**ai16
- **日期**2026-07-10
- **类型**:工作量超批 / 契约不明确
- **描述**[ai-allocation.md §5 ai16](../../ai-allocation.md) 第 282 行明确 admin-portal 设计重点含"用户管理 + 角色权限管理 + 学校设置 + 组织管理 + **审计日志消费**"。但 01 §2.1/§L1 导航/§L2 路由表均**无审计日志、无学校设置**(仅有 dashboard/users/roles/permissions/viewports/organization/monitoring 7 个视口)。本模块 [contract.md §1.2/§2.4](../contracts/admin-portal_contract.md) 已含 audit-logs / system 路由与 auditLogs Query与 01/02 不一致。
- **建议方案**admin-portal 视口补齐为 9 个dashboard / users / roles / permissions / viewports / organization / classes / teachers / students / audit-logs / system按 ai-allocation §5 + contract §1.2 对齐);审计日志经 teacher-bff GraphQL `auditLogs` Query 消费(聚合 iam `AuditEvent`)。
- **状态**:待 coord 仲裁
### ISSUE-005-ai16teacher-bff 缺 admin 命名空间 GraphQL schema前置依赖缺失
- **提请方**ai16
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**ARB-001 裁决 P6 新增 admin 命名空间,但 teacher-bff [02-architecture-design.md](../../../services/teacher-bff/docs/02-architecture-design.md) 未定义该 schema无 adminUsers / adminRoles / adminClasses / adminTeachers / adminStudents / auditLogs / adminDashboard 等 Query/Mutation。admin-portal P6 全部业务查询依赖此 schema且需 SDL-first 存放于 `packages/shared-ts/contracts/graphql/teacher-bff.graphql`ARB-001 §1.3)。
- **建议方案**:请 coord 仲裁——由 ai03 在 P6 启动前补齐 teacher-bff admin 命名空间 schema参照本模块 contract §2.4 Query 清单),作为 admin-portal P6 的前置就绪信号;并更新 [matrix.md §3](../matrix.md) teacher-bff 行的 schema 文件状态。
- **状态**:待 coord 仲裁
### ISSUE-006-ai1601/02 文档推送策略与同类 portal 契约不一致(轮询 → WebSocket
- **提请方**ai16
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**01 §3.3 / 02 §5 声明 admin-portal"不消费 WebSocket/SSE采用轮询"。但同类 portal 契约([parent-portal_contract.md §2.3](./parent-portal_contract.md))消费 push-gateway `GET /ws`,本模块 [contract.md §2.3](../contracts/admin-portal_contract.md) 亦声明消费 WebSocket 实时通知。matrix.md §5 列 push-gateway WS 消费方含全部 portal。管理端审计告警/异常登录等场景对实时性有合理需求。
- **建议方案**admin-portal 接入 push-gateway WebSocket与同类 portal 一致用于审计告警、异常登录、系统异常等实时通知保留轮询仅用于监控指标60s与统计5min这类天然适合轮询的低频数据。
- **状态**:待 coord 仲裁
### ISSUE-007-ai16matrix.md §4 将 admin-portal 列为 Kafka 直消费方,与前端层级矛盾
- **提请方**ai16
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**[matrix.md §4](../matrix.md) 第 111 行将 admin-portal 列为 `edu.iam.audit.created` 的消费方。但前端不直连 Kafka[contract.md §2.2](../contracts/admin-portal_contract.md) 已明确审计日志经 GraphQL 查询。实际链路应为iam → Kafka → **teacher-bff** 消费 → GraphQL `auditLogs` Query → admin-portal。
- **建议方案**matrix.md §4 该行消费方更正为 **teacher-bff**admin-portal 经 teacher-bff 间接消费),避免误导架构分层。
- **状态**:待 coord 仲裁
---
## §1 历史问题
(暂无已裁决问题)

View File

@@ -1,13 +1,130 @@
# ai 问题记录
> 负责人ai12
> 关联:[coord.md](../coord.md)、[contracts/ai_contract.md](../contracts/ai_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/ai_contract.md](../contracts/ai_contract.md)、[matrix.md](../matrix.md)、[port-allocation.md](../../../../infra/port-allocation.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## §0 已有仲裁核查ai12 复核2026-07-10
> 任务要求对已有的仲裁进行核查。coord.md 当前仅含 ARB-001 / ARB-002另在 [port-allocation.md](../../../../infra/port-allocation.md) §7、coord-final-decisions.md、president-final-rulings.md 中存在涉及 ai 的历史仲裁。逐项核查如下。
| 仲裁编号 / 来源 | 主题 | 涉及 ai | 核查结论 | 状态 |
| -------------------------- | ----------------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| ARB-001coord.md §1 | teacher-bff GraphQL schema 第一版 | ❌ 否 | 与 ai 无关,不适用。 | — |
| ARB-002coord.md §2 | MF Shell 暴露清单 | ❌ 否 | 与 ai 无关,不适用。 | — |
| port-allocation.md §7 | 50058 让给 aipush-gateway 豁免 gRPC | ✅ 是 | **仲裁有效**port-allocation.md §3/§5 已登记 ai = HTTP 3008 / gRPC 50058。ai 的 01/02 文档已按 50058 设计,一致。**但 [matrix.md](../matrix.md) §2 gRPC 接口提供方矩阵、§8 就绪信号跟踪表仍写 50057未同步** → 提请 coord 同步(见 ISSUE-01 | ⚠️ 仲裁有效但未同步 |
| coord-final-decisions §1-§4 | iam P2 契约 / BFF 设计 / Gateway / content | ❌ 否 | 历史仲裁,与 ai 无直接约束。ai 仅消费 content/data-ana gRPC需待其就绪。 | — |
| president-final-rulings §2.3 | Temporal 用于 AI 编排 | ✅ 是 | **部分仲裁**004 §2.3 列出 Temporal。ai12 已在 02-architecture-design.md §8.3 建议简单 4 步工作流用 BackgroundTasks + Redis长运行评估 Temporal。需 coord 在 P6 决策点确认(见 ISSUE-06。 | ⚠️ 部分仲裁 |
| 01/02 文档引用"004 §7.2 已确认 topic edu.insight.ai.usage" | ai 用量事件 topic | ✅ 是 | **核查不通过**grep 004 全文未发现 `ai.usage` / `insight.ai` / `AIUsage` 任何字样004 §7.2 并未确认 ai 的 topic。该引用无法证实topic 命名实际处于三义未决状态(见 ISSUE-02。 | ❌ 引用失实 |
| 01/02 文档引用"004 §1.2 端口矩阵 HTTP+10050 规则" | ai gRPC 端口推导规则 | ✅ 是 | **核查不通过**004 全文无端口矩阵;`HTTP+10050` 公式不成立3008+10050=13058≠50058。端口唯一源是 port-allocation.md顺序分配ai=50058。ai 文档应改引 port-allocation.md。 | ❌ 引用失实 |
**核查总结**coord.md 现有 2 项仲裁ARB-001/002均与 ai 无关;涉及 ai 的真实仲裁在 port-allocation.md50058 已定)与 004 §2.3Temporal 部分仲裁。ai 文档对"004 §7.2/§1.2"的两处引用失实,需修正引用源。
---
## 问题列表
### ISSUE-01-ai12matrix.md 端口 50057 与 port-allocation.md 50058 不同步
- **提请方**ai12
- **日期**2026-07-10
- **类型**:编号冲突 / 文档不同步
- **描述**[matrix.md](../matrix.md) §2 gRPC 接口提供方矩阵写 "ai (ai12) | 50057"§8 就绪信号跟踪表写 "ai gRPC 50057"。但 [port-allocation.md](../../../../infra/port-allocation.md) §3/§5/§7 明确 ai = HTTP 3008 / gRPC 500582026-07-09 coord 仲裁"push-gateway 豁免 gRPC释放 5005750058 让给 ai")。两份 coord 文件矛盾matrix.md 过时。ai 01/02 文档与 workline.md §1/§4.12 已正确采用 50058。
- **建议方案**coord 将 matrix.md §2 ai 行 gRPC 端口 50057 → 50058§8 就绪信号"ai gRPC 50057"→ 50058。ai12 同步将 contracts/ai_contract.md 全部 50057 改 50058。
- **状态**:待 coord 仲裁(实为同步操作,仲裁已存在于 port-allocation.md §7
### ISSUE-02-ai12ai 用量事件 Kafka topic 命名三义未决
- **提请方**ai12
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**ai 用量计费事件 topic 在三份文档中命名不一致,且无权威源:
- 01-understanding.md §3.2 / 02-architecture-design.md §5.2`edu.insight.ai.usage`(自称"004 §7.2 已确认",但 004 中不存在)
- matrix.md §4 Kafka 事件发布方矩阵:`edu.ai.usage`,事件 `AIUsageEvent`
- contracts/ai_contract.md §1.4`edu.ai.usage.events`
events.proto 现状无 `AIUsageEvent` message004 无 topic 记录。三义导致 data-ana 消费方无法对齐。
- **建议方案**ai12 建议采用 `edu.ai.usage`(与 matrix.md 一致,最简短,符合 `edu.<domain>.<action>` 简洁约定)。请 coord 裁定并在 004 §7.2 补登 + events.proto 补 `AIUsageEvent` messageschema 见 02-architecture-design.md §3.3。ai12 据裁决同步 01/02 文档与 contract。
- **状态**:待 coord 仲裁
### ISSUE-03-ai12ai.proto 待补全(备课工作流 RPC + 字段扩展)
- **提请方**ai12
- **日期**2026-07-10
- **类型**:契约不明确 / 前置依赖缺失
- **描述**ai.proto 现状仅 4 RPCChat / StreamChat / GenerateQuestion / OptimizeExpression`GenerateQuestionRequest` 仅 prompt/subject/difficulty 三字段。P5 交付需要:
- 新增 RPC`GenerateLessonPlan``StreamGenerateQuestion`ai-allocation §5 "题目逐字生成"
- `GenerateQuestionRequest` 扩展字段grade / knowledge_point_ids / question_type / count
- `ChatRequest` 扩展可选字段user_id / session_id / data_scope
关于 RPC 总数存在分歧matrix.md §2 与 contract 写 6 RPC02-architecture-design.md §4.2 单方面扩到 8 RPC追加 GetLessonPlanStatus / ConfirmLessonPlan。需 coord 裁定 P5 目标 RPC 清单。
- **建议方案**ai12 建议 P5 目标 6 RPCChat / StreamChat / GenerateQuestion / StreamGenerateQuestion / OptimizeExpression / GenerateLessonPlan。备课工作流的"查询状态/确认入库"用 HTTP 端点(`GET /ai/v1/lesson/preparation/{id}` + `POST .../confirm`)实现,避免 RPC 膨胀;如 coord 认为查询/确认也需 gRPC则定为 8 RPC。请 coord 在 P5 启动前升级 ai.proto 到 v1 完整版。
- **状态**:待 coord 仲裁
### ISSUE-04-ai12events.proto 缺 AIUsageEvent message
- **提请方**ai12
- **日期**2026-07-10
- **类型**:契约不明确 / 前置依赖缺失
- **描述**004 §12.2 + §15.3 #6 仲裁 ai 用量事件豁免 Outbox派生数据但 events.proto 现状仅有 ClassEvent / ExamEvent / HomeworkEvent / GradeEvent**无 AIUsageEvent**。data-ana 消费方无 schema 可循。01/02 文档已提请A3matrix.md §4 已列事件名,但 proto 未落地。
- **建议方案**coord 在 events.proto 新增 `AIUsageEvent` message建议 schema 见 02-architecture-design.md §3.3(含 event_id / user_id / school_id / provider / model / operation / prompt_tokens / completion_tokens / total_tokens / latency_ms / success / degraded / metadata。与 ISSUE-02 一并裁决。
- **状态**:待 coord 仲裁
### ISSUE-05-ai12contracts/ai_contract.md 与设计文档多处矛盾ai12 自查自纠清单)
- **提请方**ai12
- **日期**2026-07-10
- **类型**:契约不明确 / 文档不同步
- **描述**:现有 contracts/ai_contract.mdcoord 模板ai12 接管前未细化)与 01/02 设计文档存在 5 处矛盾:
1. §1.1 gRPC 端口 50057应为 50058见 ISSUE-01
2. §1.2 "无对外 HTTP 端点,仅 gRPC"——错误。api-gateway 代理 `/api/v1/ai/*` → ai HTTPmain.py 已实现 /ai/* 端点 + SSE 流式HTTP 保留作 Gateway 直连降级
3. §1.4 topic `edu.ai.usage.events`(三义,见 ISSUE-02
4. §1.5 错误码示例 `AI_PROVIDER_UNAVAILABLE` / `AI_TOKEN_LIMIT_EXCEEDED` / `AI_CONTENT_FILTERED` 与 02-architecture-design.md §6.2 清单(`AI_LLM_UNAVAILABLE` / `AI_QUOTA_EXCEEDED` / `AI_CONTENT_MODERATION_REJECTED`)命名不一致
5. §2.2 列出 ai 消费 2 个 content Kafka 事件,与 01/02 §5.1 "ai 不消费任何事件(无状态)"矛盾
- **建议方案**ai12 在本次工作中直接重写 contracts/ai_contract.md 对齐设计文档(端口 50058 / 补 HTTP 端点 / topic 待 ISSUE-02 裁决后填 / 错误码对齐 02 §6.2 / 删除消费事件或标注 P6+ 评估)。仅 RPC 数与 topic 命名待 coord 裁决后最终定稿。
- **状态**ai12 自纠中(依赖 ISSUE-01/02/03 裁决的字段待补)
### ISSUE-06-ai12备课工作流是否引入 TemporalP6 决策点)
- **提请方**ai12
- **日期**2026-07-10
- **类型**:工作量超批 / 前置依赖缺失
- **描述**004 §2.3 列出 Temporal 用于"AI 编排"属部分仲裁。ai12 在 02-architecture-design.md §8.3 建议P5 用 FastAPI BackgroundTasks + Redis24h TTL实现 4 步备课工作流P6 评估迁移 Temporal支持长运行跨天审核 + 复杂状态机)。需 coord 在 P6 决策点确认是否引入,避免 P5 实现被推翻重做。
- **建议方案**P5 采用 BackgroundTasks + Redis02-architecture-design.md §2.4 状态机已设计P6 由 coord 评估 Temporal 引入时机。请 coord 在 roadmap 标注 P6 决策点。
- **状态**:待 coord 仲裁P6 决策点)
### ISSUE-07-ai12iam GetEffectiveDataScope gRPC RPC 待 P4 补全
- **提请方**ai12
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**ai 多租户用量配额校验需调用 `IamService.GetEffectiveDataScope` 查询用户 DataScope。01/02 文档已提请A4coord 已仲裁 P4 补全§15.3 #5),但 iam.proto 现状未见此 RPC。ai P5 实施时依赖,若 P4 未补全将阻塞配额校验功能。
- **建议方案**:请 coord 确认 iam (ai06) 在 P4 已补全 `GetEffectiveDataScope` RPCai12 在 P5 实施时调用Redis 缓存 5min。若 P4 未补全ai 降级为"仅按 user_id 配额,不按 school_id"。
- **状态**:待 coord 确认 P4 补全情况
### ISSUE-08-ai12proto package 命名不符合 project_rules §5
- **提请方**ai12
- **日期**2026-07-10
- **类型**:契约不明确 / 架构约束
- **描述**project_rules §5 规定 proto 包名规范 `edu.<domain>.v1`(如 `edu.iam.v1``edu.core_edu.v1`)。但 ai.proto 现状 package 为 `next_edu_cloud.ai.v1`events.proto 为 `next_edu_cloud.events.v1`均不符合规范。01/02 文档未指出此偏离。此为全局 proto 命名问题(涉及全部 proto 文件),非 ai 独有,但 ai12 在审查中发现需提请。
- **建议方案**:请 coord 裁定是否统一迁移 proto package 至 `edu.<domain>.v1`(全局变更,需 buf breaking 评估或保留现状作为历史包袱。ai12 在 ai.proto 补全 RPC 时遵循最终裁定。
- **状态**:待 coord 仲裁(全局 proto 命名)
### ISSUE-09-ai12响应信封偏离 ActionState 强制整改P0
- **提请方**ai12
- **日期**2026-07-10
- **类型**:架构约束
- **描述**004 §11.5 强制响应信封为 ActionState`{success, data, error:{code,message,details,traceId}}`。ai 当前 main.py 违反:返回 `{success:true, data:..., degraded:false}` 顶层 degraded 字段(见 main.py:89/201-210/233-244。01/02 文档已提请A5contracts 未记录。P5 实施必须整改。
- **建议方案**P5 实施时所有 HTTP 端点 + gRPC RPC 返回值改为 ActionStatedegraded 作为 `error.details.degraded` 子字段。请 coord 在 known-issues §2.9 ai 分区记录此约束01 文档已提请,需 coord 落地 known-issues
- **状态**:待 coord 在 known-issues 记录约束(整改由 ai12 P5 执行)
---
<!--
追加条目格式:
@@ -20,5 +137,3 @@
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)

View File

@@ -1,24 +1,3 @@
# api-gateway 问题记录
> 负责人ai01
> 关联:[coord.md](../coord.md)、[contracts/api-gateway_contract.md](../contracts/api-gateway_contract.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## 问题列表
<!--
追加条目格式:
### ISSUE-[编号]-[AI标识][标题]
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)
>

View File

@@ -1,24 +1,187 @@
# content 问题记录
> 负责人ai09
> 关联:[coord.md](../coord.md)、[contracts/content_contract.md](../contracts/content_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/content_contract.md](../contracts/content_contract.md)、[../../services/content/docs/01-understanding.md](../../../services/content/docs/01-understanding.md)、[../../services/content/docs/02-architecture-design.md](../../../services/content/docs/02-architecture-design.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## 问题列表
## §0 已有仲裁核查2026-07-10 复核)
<!--
追加条目格式:
> 复核依据:[coord-final-decisions.md §3.3](../../coord-final-decisions.md) N1-N5、[01-understanding.md §A](../../../services/content/docs/01-understanding.md) ai09 复核记录
### ISSUE-[编号]-[AI标识][标题]
### 0.1 coord-final-decisions.md N1-N5 核查
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
| 编号 | 仲裁结论 | 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](../../../services/content/src/knowledge-points/knowledge-points.controller.ts) 实现为 `GET /knowledge-points/chapter/:chapterId`path 参数)
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**:每个事件类型独立 topic`edu.content.textbook.created` / `edu.content.question.published` 等共 12 个 topic
- **contracts/content_contract.md §1.4 + matrix.md §4**:按聚合根聚合 topic`edu.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.events`action: created/updated/published/archived`edu.content.chapter.events`action: 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 工作流](../../../../.trae/rules/project_rules.md) 明确规定:
- §8分支开发AI 不得自行切换/创建/合并分支
- §14.3AI 禁止 `git merge``git 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](../../../services/content/src/questions/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](../../../services/content/src/config/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 3``metadata json NULL`,但实际 [textbooks.schema.ts](../../../services/content/src/textbooks/textbooks.schema.ts) 中 `knowledgePoints` 表仅含 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.ts](../../../services/content/src/knowledge-points/knowledge-points.service.ts) 的 `safeCreateNode` 是同步双写(业务事务内写 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 仲裁 |

View File

@@ -1,11 +1,34 @@
# core-edu 问题记录
> 负责人ai08
> 关联:[coord.md](../coord.md)、[contracts/core-edu_contract.md](../contracts/core-edu_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/core-edu_contract.md](../contracts/core-edu_contract.md)、[coord-cross-review.md](../../coord-cross-review.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## §0 已有仲裁核查记录ai08 接管后核查)
> 核查日期2026-07-10
> 核查范围01-understanding.md / 02-architecture-design.md 引用的 coord 仲裁结论
> 核查方法:对照 [coord-cross-review.md](../../coord-cross-review.md) 原文 + 实际 proto 文件 + 实际源码
### 0.1 已核查通过的仲裁
| 仲裁编号 | 位置 | 核查结论 |
| -------- | ---- | -------- |
| coord-cross-review §3.1 | topic 命名统一为 `edu.teaching.<aggregate>.<action>` | ✅ 仲裁真实存在结论准确core-edu 01/02 文档引用正确 |
| coord-cross-review §5.5 | 错误码前缀 `CORE_EDU_*` 统一(不再细分 `EXAMS_`/`HOMEWORK_`/`GRADES_` | ✅ 仲裁真实存在,结论准确 |
| coord-cross-review §5.7 | ActionState 信封结构统一 | ✅ 仲裁真实存在core-edu GlobalErrorFilter 已对齐 |
| coord-cross-review §2.1 | proto 包名 `next_edu_cloud.core_edu.v1` | ✅ 仲裁真实存在core_edu.proto L3 符合 |
| coord-cross-review §6 整改 #14 | core_edu.proto 补 AttendanceService | ⚠️ 仲裁真实存在,但状态与实际不符(见 ISSUE-001 |
| coord-cross-review §6 整改 #16 | buf.gen.yaml 补 gRPC 插件 | ⚠️ 待 ai08 核实 buf.gen.yaml 实际状态 |
### 0.2 核查发现的仲裁状态不一致(升级为 ISSUE
详见下方 ISSUE-001 ~ ISSUE-003。
---
## 问题列表
<!--
@@ -21,4 +44,208 @@
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)
### ISSUE-001-ai08core_edu.proto 实际状态与 coord 仲裁声称不一致P0
- **提请方**ai08
- **日期**2026-07-10
- **类型**:契约不明确(仲裁状态与代码实际不符)
- **描述**
[coord-cross-review.md](../../coord-cross-review.md) L312 声称:
> `core_edu.proto 补全 | packages/shared-proto/proto/core_edu.proto | ✅ 5 service+ClassService +AttendanceService`
但 ai08 核查实际文件 `packages/shared-proto/proto/core_edu.proto`**实际只有 3 个 service**
```
service ExamService { ... } // 5 RPC
service HomeworkService { ... } // 4 RPC
service GradeService { ... } // 5 RPC
```
**缺失**
- `ClassService`4 RPCGetClass / GetClassesByTeacher / BatchGetClasses / ListStudentsByClass
- `AttendanceService`4 RPCRecordAttendance / GetAttendance / ListAttendanceByStudent / ListAttendanceByClass
同时 Exam/Homework/Grade message **缺 P3 新增字段**
- Exam 缺 `subject_id`、`school_id`、`status_changed_at`、`status_changed_by`、`archived_at`
- Homework 缺 `subject_id`、`grace_period`、`school_id`
- Grade 缺 `total_score`、`school_id`、`idempotency_key`
- SubmitHomeworkRequest 缺 `answers` 字段02 文档 §4.2 要求含完整 answers
缺失 P3 新增 RPC`PublishExam` / `SubmitExam` / `GradeExam` / `GradeHomework` / `UpdateGrade`。
- **影响**
1. 01-understanding.md L48 仅声称缺 AttendanceService遗漏了 ClassService 也缺失
2. matrix.md §2 声称 core-edu 22 RPC但实际 proto 仅 14 RPC5+4+5
3. 下游 teacher-bff / student-bff / parent-bff 按 22 RPC 设计 mock实际无 proto 定义可生成代码
- **建议方案**
coord 确认 `core_edu.proto` 补全工作的实际负责人coord 自行补全,还是交由 ai08 在 P3 补全)。
- 若 coord 已补全但未提交:请 coord 提交最新 proto
- 若待 ai08 P3 补全coord-cross-review.md L312 的 "✅ 已补全" 状态需更正为 "⏳ 待 ai08 P3 补全"01-understanding.md L48 需补"ClassService 也缺失"
- **状态**:待 coord 仲裁
---
### ISSUE-002-ai08events.proto 未同步 coord topic 命名仲裁P0
- **提请方**ai08
- **日期**2026-07-10
- **类型**:契约不明确(仲裁未落实到 proto
- **描述**
[coord-cross-review.md](../../coord-cross-review.md) §3.1 仲裁"统一为 `edu.teaching.<aggregate>.<action>` 风格",但 `packages/shared-proto/proto/events.proto` 实际状态:
1. **文件头注释L9-13仍是旧 topic 命名**
```
// edu.exam.events <- exam.created / exam.updated / exam.deleted
// edu.homework.events <- homework.assigned / homework.submitted / homework.graded
// edu.grade.events <- grade.recorded / grade.updated
// edu.class.events <- class.transferred
```
未同步 `edu.teaching.exam.created` 等仲裁后命名。
2. **缺 `AttendanceEvent` message**events.proto 仅定义 ClassEvent / ExamEvent / HomeworkEvent / GradeEvent无 AttendanceEvent。02 文档 §5.1 要求发布 `edu.teaching.attendance.recorded` 事件,但 proto 无对应 message。
3. **缺 `schema_version` 字段**:所有 Event messageClassEvent/ExamEvent/HomeworkEvent/GradeEvent均无 `schema_version` 字段。coord §3.1 仲裁 + known-issues §1.3 + 01-understanding.md L67 + 02-architecture-design.md §5.1 均要求事件 payload 含 `schema_version`,但 proto 未定义。
4. **matrix.md §4 与 coord §3.1 仲裁不一致**matrix.md §4 Kafka 事件发布方矩阵仍列 `edu.exam.events` / `edu.homework.events` / `edu.grade.events` / `edu.class.events`,未同步 coord §3.1 仲裁后的 `edu.teaching.*` 命名。
- **影响**
- core-edu 修改 TOPIC_MAP 后,发布到 `edu.teaching.*` topic但 events.proto 注释和 matrix.md 仍记录旧 topic下游 AI 文档被误导
- 缺 AttendanceEvent message 导致 AttendanceService 无事件契约可发布
- 缺 schema_version 字段导致消费端无法按版本处理
- **建议方案**
1. coord 同步更新 events.proto
- 文件头注释改为 `edu.teaching.*` 命名
- 新增 `AttendanceEvent` message
- 所有 Event message 新增 `string schema_version = N;` 字段
2. coord 同步更新 matrix.md §4 为 `edu.teaching.*` 命名
3. ai08 在 core-edu `outbox.publisher.ts` TOPIC_MAP 按 `edu.teaching.*` 命名实现
- **状态**:待 coord 仲裁
---
### ISSUE-003-ai08考试/作业状态命名跨模块不一致P1
- **提请方**ai08
- **日期**2026-07-10
- **类型**:契约不明确(跨模块命名冲突)
- **描述**
02-architecture-design.md 定义的状态命名与 [coord.md](../coord.md) §1.2 GraphQL schema 枚举不一致:
| 维度 | 02-architecture-design.mdcore-edu | coord.md §1.2 GraphQL schemateacher-bff | 不一致点 |
| ---- | ------------------------------------- | ------------------------------------------- | -------- |
| ExamStatus | `draft / published / in_progress / grading / graded / archived / cancelled` | `DRAFT / PUBLISHED / IN_PROGRESS / GRADING / SCORED / ARCHIVED` | core-edu 用 `graded`coord GraphQL 用 `SCORED`core-edu 多 `cancelled` |
| SubmissionStatusexam | `in_progress / submitted / graded` | `NOT_SUBMITTED / SUBMITTED / GRADED` | core-edu 用 `in_progress`coord 用 `NOT_SUBMITTED` |
| SubmissionStatushomework | `draft / submitted / graded` | `NOT_SUBMITTED / SUBMITTED / GRADED` | core-edu exam 用 `in_progress`homework 用 `draft`,自身也不一致 |
02 文档 §3.1.1 exam_submissions.status 注释 `in_progress / submitted / graded`§3.1.2 homework_submissions.status 注释 `draft / submitted / graded`**core-edu 内部 exam 与 homework 的初始状态命名也不一致**`in_progress` vs `draft`)。
- **影响**
- teacher-bff GraphQL schema 枚举值与 core-edu DB status 字段值无法直接映射BFF 需要转换层
- 前端展示需处理两套命名
- coord 仲裁 teacher-bff schema 时未与 core-edu 状态机命名对齐
- **建议方案**
coord 仲裁统一状态命名(建议二选一):
- **方案 A推荐**core-edu DB status 统一为小写动词形式 `draft / published / in_progress / grading / graded / archived / cancelled`GraphQL 枚举映射为大写 `DRAFT / PUBLISHED / IN_PROGRESS / GRADING / GRADED / ARCHIVED / CANCELLED`(去掉 `SCORED`,统一用 `GRADED`。SubmissionStatus 统一为 `NOT_SUBMITTED / SUBMITTED / GRADED`core-edu exam/homework submissions 初始状态统一为 `not_submitted`(不再用 `in_progress` 或 `draft`)。
- **方案 B**:保留 coord GraphQL 现状(`SCORED`core-edu 改 `graded` 为 `scored`。
ai08 倾向方案 A`graded` 是教育领域通用术语,`scored` 歧义大)。
- **状态**:待 coord 仲裁
---
### ISSUE-004-ai08class.transferred 事件 topic 三处不一致P1
- **提请方**ai08
- **日期**2026-07-10
- **类型**契约不明确topic 命名跨文档不一致)
- **描述**
`class.transferred` 事件的 topic 命名在三处文档不一致:
| 文档 | topic 命名 |
| ---- | ---------- |
| 01-understanding.md L64 / 02-architecture-design.md §5.1 / §7 | `edu.org.class.created`(合并后归 org 域) |
| matrix.md §4 | `edu.class.events`ClassEventaction: transferred |
| events.proto L13 注释 | `edu.class.events` |
core-edu 文档声称"classes 合并后归 org 域"用 `edu.org.class.created`,但 coord 维护的 matrix.md 和 events.proto 仍用 `edu.class.events`。
- **影响**
- core-edu 按 `edu.org.class.created` 实现 TOPIC_MAP 后matrix.md 记录的 `edu.class.events` topic 下游消费者订阅不上
- 命名归类不一致org 域 vs class 域)
- **建议方案**
coord 仲裁统一:
- 若 classes 合并到 core-edu 后仍归"教学组织域",则 topic 应为 `edu.teaching.class.transferred`(遵循 §3.1 仲裁的 `edu.teaching.<aggregate>.<action>` 风格)
- 若归"组织域",则为 `edu.org.class.transferred`(注意 action 应为 `transferred` 而非 `created`
ai08 倾向 `edu.teaching.class.transferred`(与 §3.1 仲裁风格一致classes 合并到 core-edu 后属教学域)。
- **状态**:待 coord 仲裁
---
### ISSUE-005-ai08core-edu gRPC RPC 数量统计口径不一致P1
- **提请方**ai08
- **日期**2026-07-10
- **类型**:契约不明确(统计口径冲突)
- **描述**
core-edu gRPC RPC 数量在三处文档统计不一致:
| 文档 | RPC 数 | 包含 ClassService | 包含 P3 新增 RPC |
| ---- | ------ | ----------------- | ---------------- |
| matrix.md §2 | 22 | ✅ 是4 RPC | ❌ 否P2 基线) |
| 02-architecture-design.md §4.2 | 22 | ❌ 否 | ✅ 是PublishExam/SubmitExam/GradeExam/GradeHomework/UpdateGrade |
| core-edu_contract.md §1.1 | 22 | ✅ 是4 RPC | ❌ 否P2 基线) |
P3 全量应为ClassService 4 + ExamService 85+3 新增)+ HomeworkService 54+1 新增)+ GradeService 65+1 新增)+ AttendanceService 4 = **27 RPC**。
- **影响**
- matrix.md §2 声明 22 RPC 但含 ClassService02 文档声明 22 RPC 但不含 ClassService下游 AI 无法判断应实现多少 RPC
- 就绪信号"core-edu gRPC 50053 + 22 RPC"含义模糊
- **建议方案**
coord 统一 RPC 统计口径:
- matrix.md §2 改为 "27 RPCP3 全量ClassService 4 + ExamService 8 + HomeworkService 5 + GradeService 6 + AttendanceService 4"
- 就绪信号改为 "core-edu gRPC 50053 + 27 RPC + HealthService SERVING"
- core-edu_contract.md §1.1 补全 P3 新增 RPC
- **状态**:待 coord 仲裁
---
### ISSUE-006-ai08core-edu 02 文档 §13.3 七项未决决策待仲裁P2
- **提请方**ai08
- **日期**2026-07-10
- **类型**:契约不明确(设计决策未仲裁)
- **描述**
02-architecture-design.md §13.3 列出 7 项未决设计决策ai08 尚未正式提请 coord 仲裁,现集中提请:
| # | 决策点 | ai08 倾向 |
| - | ------ | --------- |
| 1 | classes 服务合并到 core-edu 的时机 | (a) P3 初期合并 |
| 2 | 排课 room_id 是否 P3 实现 | (b) 仅预留字段 |
| 3 | 成绩计算公式 scope 优先级 | (a) class > subject > school |
| 4 | 作业 grace_period 默认值 | (b) 300 秒5 分钟宽限) |
| 5 | P3 是否启用 events.proto schema 强制校验 | (b) 仅文档约束 |
| 6 | exam.submitted 事件是否包含完整 answers | (b) 仅含 submission_id |
| 7 | archived 考试数据是否物理迁移 | (b) P3 仅软删除 |
注:决策 #4 与 02 文档 §3.1.2 homework 表 `gracePeriod: int("grace_period").notNull().default(0)` 默认 0 不一致,仲裁后需统一 schema 默认值。
- **影响**
- 决策未定core-edu P3 实现无法启动
- 决策 #4 schema 默认值与倾向不一致,仲裁前可能实现错
- **建议方案**
coord 逐项仲裁ai08 按倾向方案实现。决策 #4 若采 (b) 300 秒02 文档 §3.1.2 schema 默认值改为 `.default(300)`。
- **状态**:待 coord 仲裁
---
### ISSUE-007-ai08core-edu 01 文档审计表"待核对"项待 coord 确认P2
- **提请方**ai08
- **日期**2026-07-10
- **类型**:其他(审计未完成项)
- **描述**
01-understanding.md 审计表与"黄金模板对齐清单"中 3 项标记"待核对"
1. Dockerfile 多阶段构建L111 / L128 审计表"待核对"
2. ActionState 信封 traceId 验证L116
3. homework/grades controller 权限装饰器覆盖核对L104
ai08 在 P3 实施前需 coord 确认这些项是否作为 P3 验收硬性标准。
- **建议方案**
coord 确认上述 3 项是否纳入 P3 验收标准若纳入ai08 在 P3 实施时补齐。
- **状态**:待 coord 仲裁

View File

@@ -1,24 +1,129 @@
# data-ana 问题记录
> 负责人ai11
> 关联:[coord.md](../coord.md)、[contracts/data-ana_contract.md](../contracts/data-ana_contract.md)
> 关联:[coord.md](../coord.md)、[coord-cross-review.md](../../coord-cross-review.md)、[contracts/data-ana_contract.md](../contracts/data-ana_contract.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## 问题列表
## §0 已有仲裁核查记录2026-07-10
<!--
追加条目格式:
> ai11 在编写 objections 前对 coord.md 与 coord-cross-review.md 中涉及 data-ana 的仲裁逐项核查落实状态。
### ISSUE-[编号]-[AI标识][标题]
### 0.1 coord.md 仲裁核查
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
| 编号 | 主题 | 涉及 data-ana | 核查结论 |
| ------- | ---------------------------- | ------------- | ------------------------------ |
| ARB-001 | teacher-bff GraphQL schema | ❌ 否 | 不涉及,无需 action |
| ARB-002 | MF Shell 暴露清单 | ❌ 否 | 不涉及,无需 action |
(暂无问题)
**结论**coord.md 无 data-ana 直接仲裁。
### 0.2 coord-cross-review.md 仲裁核查8 项涉及 data-ana
| # | 审查章节 | 裁决内容 | 责任方 | 核查结论 |
| -- | ---------------- | ------------------------------------------------------------------ | ------ | ---------------------------------------------------------------------------------------------------- |
| 1 | §2.2 #3 | iam 新增 `GetEffectiveDataScope` RPCP4 补全data-ana gRPC 调用 | iam | ⚠️ **未落实**iam.proto 当前仅 4 RPCRegister/Login/RefreshToken/GetUserInfo无 GetEffectiveDataScope |
| 2 | §2.3 P4 行 | content + data-ana P4 启用 gRPC server | ai11 | ⏳ 未到 P4 阶段,待执行 |
| 3 | §3.2 | 补登 `edu.insight.ai.usage` topic + events.proto 补 AIUsageEvent | coord | ⚠️ **未落实**events.proto 当前仅 4 messageClass/Exam/Homework/GradeEvent缺 AIUsageEvent |
| 4 | §3.3 | Python 服务 Outbox 豁免MasteryUpdated / WarningTriggered | coord | ✅ **已对齐**01/02 文档已声明豁免,引用 coord-cross-review.md §3.3 |
| 5 | §4.3 | data-ana HTTP=3006 / gRPC=50055 | coord | ✅ **已对齐**01/02 文档端口声明一致 |
| 6 | §5.3 | Python 服务信封改为 ActionStatedegraded 放 details 子字段) | ai11 | ✅ **已对齐**02 §4.3 ActionState 实现已修正degraded 移至顶层 details |
| 7 | §6 #4 | 同 #6ai06 修正 data-ana/ai 02 文档 + 代码 | ai11 | ✅ **已对齐(文档)**02 已修正;代码待 P4 实现阶段重构 |
| 8 | §6 #7/#8/#9/#10 | coord 在 004 §7.2 补登 topic + §1.2 端口列 + §4.1 gRPC 矩阵 + §12.2 豁免 | coord | ⚠️ **未落实**004 正文无 §4.2/§7.2 补登段/§11.4/§11.501/02 引用断裂已临时改为引 coord-cross-review.md |
### 0.3 coord-cross-review §8.2 批次 0 产出声明核查
coord-cross-review.md §8.2 声称批次 0 已完成 proto 补全ai11 逐文件核查实际状态:
| 声明产出项 | 声明状态 | 实际文件状态ai11 核查) | 核查结论 |
| -------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------- | ------------ |
| iam.proto 12 RPC | ✅ 12 RPC | **4 RPC**Register/Login/RefreshToken/GetUserInfo | ⚠️ 严重不符 |
| analytics.proto 扩展 | ✅ 12 RPC含 Stream | **3 RPC**GetClassPerformance/GetStudentWeakness/GetLearningTrend | ⚠️ 严重不符 |
| events.proto 补全 | ✅ 9 message+AuditEvent | **4 message**ClassEvent/ExamEvent/HomeworkEvent/GradeEvent | ⚠️ 严重不符 |
| core_edu.proto 补全 | ✅ 5 service | 未由 ai11 核查(非本模块边界) | — |
| buf.gen.yaml 插件 | ✅ go + python | 未由 ai11 核查coord 维护) | — |
> **核查说明**ai11 仅核查与 data-ana 直接相关的 protoiam/analytics/events。§8.2 声明与实际文件严重不符,可能原因:(a) 声明为计划态但未执行;(b) 执行后未提交到本 worktree 分支;(c) 在其他分支已执行但未合并。无论哪种原因data-ana 的 P4 实现依赖这些 proto 补全,当前实际状态构成 P4 阻塞。
---
## §1 问题列表
### ISSUE-001-ai11iam.proto 缺 GetEffectiveDataScope RPCP4 阻塞)
- **提请方**ai11
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**coord-cross-review.md §2.2 #3 已仲裁"iam P4 补全 `GetEffectiveDataScope` RPCdata-ana gRPC 调用",但 iam.proto 当前仅 4 RPC无此 RPC。data-ana 的 DataScope 6 级过滤SELF/CLASS/GRADE/SCHOOL/DISTRICT/ALL依赖此 RPC 解析用户可见数据范围,是 P4 实现的硬阻塞项。
- **建议方案**coord 确认 iam.proto 补全进度。若 iam 侧尚未实现data-ana P4 阶段将使用硬编码 DataScope 降级(按 role 映射默认 scope并标注 `details.degraded: true`,待 iam 就绪后切换。
- **状态**:待 coord 仲裁(核查已有仲裁 §0.2 #1 未落实)
---
### ISSUE-002-ai11events.proto 缺 AIUsageEvent messageP5 阻塞P4 预备)
- **提请方**ai11
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**coord-cross-review.md §3.2 已仲裁"补登 `edu.insight.ai.usage` topic + events.proto 补 `AIUsageEvent` message",但 events.proto 当前仅 4 messageClassEvent/ExamEvent/HomeworkEvent/GradeEvent缺 AIUsageEvent。data-ana 需消费此事件落 `ai_usage_log` 宽表,供管理员仪表盘展示 AI 用量统计。
- **建议方案**coord 在 events.proto 补 `AIUsageEvent` message字段建议`{event_id, request_id, user_id, provider, model, prompt_tokens, completion_tokens, total_tokens, latency_ms, success, cost_cents, occurred_at}`。P5 前补全即可P4 仪表盘 AI 用量区块显示"暂无数据"。
- **状态**:待 coord 仲裁(核查已有仲裁 §0.2 #3 未落实)
---
### ISSUE-003-ai11analytics.proto 仅 3 RPCcoord-cross-review §8.2 声称已扩展至 12 RPC 但实际未落实P4 阻塞)
- **提请方**ai11
- **日期**2026-07-10
- **类型**:前置依赖缺失 + 声明与实际不符
- **描述**coord-cross-review.md §8.2 声称"analytics.proto 扩展 ✅ 12 RPC含 Stream",但实际文件仅 3 RPCGetClassPerformance/GetStudentWeakness/GetLearningTrend。ai-allocation.md §5 与 matrix.md §2 均要求 data-ana 提供 12 RPC02-architecture-design.md §4.2 已设计完整 12 RPC 清单(含 4 端 Dashboard + Warning + Mastery + Server Streaming但 proto 未补全导致无法生成 stub。
- **建议方案**coord 确认 analytics.proto 扩展进度。ai11 可提供 12 RPC 的完整 message 定义提案(见 [02-architecture-design.md §4.2](../../../services/data-ana/docs/02-architecture-design.md)coord 审议后合并到 analytics.proto。若 coord 未补全ai11 在 P4 阶段自行补全 proto本分支内提请 coord 合并。
- **状态**:待 coord 仲裁
---
### ISSUE-004-ai11coord-cross-review §6 整改清单 coord 责任项未落实,导致 004 章节引用断裂
- **提请方**ai11
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**coord-cross-review.md §6 整改清单中标注"coord"责任的 4 项整改未在 004 正文中落实:
- #7004 §7.2 补登 6 个 topic + CDC 命名规范 → 004 正文无对应段落
- #8004 §1.2 新增 HTTP/gRPC 端口两列 → 004 §1.2 服务清单无端口列
- #9004 §4.1 补充 gRPC 启用阶段矩阵 → 004 正文无 §4.2 子节
- #10004 §12.2 补充派生数据事件 Outbox 豁免条款 → 004 §12.2 未补充
这导致 01-understanding.md 和 02-architecture-design.md 中引用 004 §4.2/§11.4/§11.5/§15.3 等章节均断裂004 正文仅到 §14§15 在 004-p6-addendum.md 但内容不同。ai11 已在 v2.1 修订中临时改为引用 coord-cross-review.md 对应裁决章节,但这是过渡方案。
- **建议方案**coord 按整改清单 #7/#8/#9/#10 补全 004 对应章节,使 004 成为可信的架构设计意图唯一源。各 AI 文档随后将引用从 coord-cross-review.md 回切到 004 对应章节。
- **状态**:待 coord 仲裁
---
### ISSUE-005-ai11data-ana 发布的 MasteryEvent topic 命名三处不一致
- **提请方**ai11
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**data-ana 发布的掌握度/预警事件 topic 命名在三个文档中不一致:
| 文档 | topic 命名 |
| -------------------------------------- | ------------------------------------- |
| 01-understanding.md / 02-architecture-design.md | `edu.insight.mastery.updated` + `edu.insight.warning.triggered` |
| matrix.md §4 | `edu.analytics.mastery` |
| contracts/data-ana_contract.md修正前 | `edu.data_ana.mastery.events` |
按 004 §7.2 命名规范 `edu.<domain>.<aggregate>.<action>`data-ana 属于 D6 智能洞察领域domain=insight`edu.insight.mastery.updated` 符合规范。matrix.md 的 `edu.analytics.mastery` 不符合命名规范(缺 action 层级,且 domain 用了服务名而非领域名)。
- **建议方案**coord 裁决统一为 `edu.insight.mastery.updated` + `edu.insight.warning.triggered`coord 修正 matrix.md §4。ai11 已在 contract.md 中采用此命名。
- **状态**:待 coord 仲裁
---
### ISSUE-006-ai11coord-cross-review §8.2 批次 0 产出声明与 proto 实际文件状态严重不符
- **提请方**ai11
- **日期**2026-07-10
- **类型**:其他(声明与实际不符)
- **描述**coord-cross-review.md §8.2 声称批次 0 已完成 iam.proto12 RPC/ analytics.proto12 RPC/ events.proto9 message补全但 ai11 逐文件核查发现实际均未补全(详见 §0.3 核查表)。这影响所有依赖这些 proto 的下游 AI 的排期评估——若 AI 信任 §8.2 声明,会在排期中忽略 proto 补全的等待时间,导致排期失真。
- **建议方案**coord 核实 §8.2 声明真实性。若实际已补全但未合并到各 worktree 分支,请协调合并;若实际未补全,请更新 §8.2 状态为"计划中"或"待执行",并明确补全时间点,以便下游 AI 据此排期。
- **状态**:待 coord 仲裁

View File

@@ -6,6 +6,124 @@
---
## §1 已有仲裁核查
> 对已生效的仲裁coord-final-decisions I1-I8、president-final-rulings 相关条款、coord.md ARB-001/ARB-002逐条核查落地情况。
### 1.1 coord-final-decisions I1-I8iam 专项)核查
| 裁决 | 内容摘要 | 核查结论 | 证据 |
| ---- | -------- | -------- | ---- |
| I1 | P2 即启用 gRPC server 50052REST + gRPC 并存 | ⚠️ **02 文档未回写**[02-architecture-design.md](../../../services/iam/docs/02-architecture-design.md) §1/§7.1/§8.1 决策点 5 仍写"P2 仅 RESTP3 随 core-edu 引入 gRPC"iam.proto 仅 4 RPC 未补全 | [iam.proto](../../../packages/shared-proto/proto/iam.proto) 仅 4 RPC[02 文档 §8.1](../../../services/iam/docs/02-architecture-design.md) 决策点 5 |
| I2 | 直接建 shared-ts Outbox 工具包iam 首次实现即用 | ✅ **工具包已建立**`packages/shared-ts/src/outbox/` 存在 outbox.service.ts + outbox.module.ts 02 文档 §8.1 决策点 4 仍写"iam 自建轻量 Outbox",未回写 | [shared-ts/outbox](../../../packages/shared-ts/src/outbox/) |
| I3 | 首次实现即 DB 驱动 + Redis 缓存,废弃本地 map | ❌ **源码未改造**[permission.guard.ts](../../../services/iam/src/middleware/permission.guard.ts) 第 30-39 行仍用硬编码 `ROLE_PERMISSIONS` mapadmin/teacher02 文档 §8.1 决策点 9 描述为"待改造" | [permission.guard.ts](../../../services/iam/src/middleware/permission.guard.ts) |
| I4 | 首次实现即注册 AuthMiddlewareController 用 @Req() 注入 | ❌ **源码未注册**[app.module.ts](../../../services/iam/src/app.module.ts) 仅注册 PermissionGuard 为 APP_GUARD未在 configure() 消费 AuthMiddleware02 文档 §1.1/§1.2/§8.1 决策点 10 仍写"P2 仍不注册" | [app.module.ts](../../../services/iam/src/app.module.ts) |
| I5 | P2 本地文件 IAM_PRIVATE_KEY_PATH / IAM_PUBLIC_KEY_PATH | ⚠️ **源码未实现**[iam.service.ts](../../../services/iam/src/iam/iam.service.ts) 第 170-186 行仍用 `env.JWT_SECRET`HS256 单密钥02 文档 §8.1 决策点 1 已对齐本地文件→P6 Vault但未落地 | [iam.service.ts](../../../services/iam/src/iam/iam.service.ts) |
| I6 | P2 即补全 iam_student_guardians 表 + GetChildrenByParent RPC + GET /iam/children | ❌ **02 文档表名错误**[02 文档 §3.1.2](../../../services/iam/docs/02-architecture-design.md) 用 `iam_parent_student_relations`,裁决表名为 `iam_student_guardians`;源码未实现 | 02 文档 §3.1.2 |
| I7 | 采用 /iam/v1/* 前缀Gateway 透传 | ❌ **02 文档未回写**[02 文档 §4.1](../../../services/iam/docs/02-architecture-design.md) REST API 清单全部用 `/iam/*``/v1` 前缀;源码 Controller 用 `@Controller("iam")` 无版本前缀 | [iam.controller.ts](../../../services/iam/src/iam/iam.controller.ts)、[rbac.controller.ts](../../../services/iam/src/iam/rbac.controller.ts) |
| I8 | 统一 GET /iam/permissions/effective | ✅ **源码已对齐**[rbac.controller.ts](../../../services/iam/src/iam/rbac.controller.ts) 第 33 行用 `@Get("permissions/effective")` | [rbac.controller.ts](../../../services/iam/src/iam/rbac.controller.ts) |
### 1.2 president-final-rulings 相关条款核查
| 条款 | 内容摘要 | 核查结论 |
| ----- | -------- | -------- |
| §2.15 | /iam/v1/* 版本化规则Controller 加 v1 前缀) | ❌ 同 I7未落地 |
| §2.16 | gRPC 与 REST 双入口策略gateway HTTP 透传 + BFF gRPC 调用) | ⚠️ 02 文档未体现双入口设计,仅描述 REST 单入口contract.md §1.2 写"无对外 HTTP 端点,仅 gRPC"与此冲突 |
| §3.2 | iam P2 拆分 P2.18 RPC 核心)+ P2.2(扩展) | ⚠️ workline.md 仅粗略列出 P2.1P2.2-P6 未细化(见 worklines/iam_workline.md |
| §5.5 | 审计日志归 iamAuditEvent + edu.iam.audit.created topic + user_audit_log 表) | ❌ 02 文档未包含审计日志设计events.proto 未定义 AuditEvent message |
| §5.1 | events.proto 补全 UserEvent/RoleEvent | ❌ events.proto 实际仅含 ClassEvent/ExamEvent/HomeworkEvent/GradeEvent缺 UserEvent/RoleEvent/AuditEventcoord-final-decisions §5.1 标注"✅ 已补全"与实际不符) |
### 1.3 coord.md ARB-001 / ARB-002 核查
| 仲裁 | 内容摘要 | 核查结论 |
| ------ | -------- | -------- |
| ARB-001 | teacher-bff GraphQL schema 第一版5 Query | ✅ schema 中 `me: User!``viewports` 依赖 iam与 iam GetUserInfo/GetViewports RPC 对齐,无冲突 |
| ARB-002 | MF Shell 暴露清单 | ✅ 不涉及 iam 直接交付物,无冲突 |
---
## §2 新提请异议
### ISSUE-001-ai0601/02 文档未回写 I1-I8 裁决,中间过渡方案残留
- **提请方**ai06
- **日期**2026-07-10
- **类型**:契约不明确 / 其他
- **描述**coord-final-decisions §0.1 强制覆盖声明要求各 AI 在 3 个工作日内回写 02 文档,删除所有"中间过渡方案"。president-final-rulings §3.4 也明确要求 ai06 回写 iam 02I1-I8§3.4)。但当前 [01-understanding.md](../../../services/iam/docs/01-understanding.md) 和 [02-architecture-design.md](../../../services/iam/docs/02-architecture-design.md) 仍残留大量过渡方案:
- 02 §1/§7.1/§8.1 决策点 5P2 仅 REST → P3 gRPC违反 I1
- 02 §8.1 决策点 4iam 自建 Outbox违反 I2
- 02 §8.1 决策点 9PermissionGuard 待改造(违反 I3
- 02 §1.1/§1.2/§8.1 决策点 10AuthMiddleware P2 不注册(违反 I4
- 02 §3.1.2:表名 iam_parent_student_relations违反 I6
- 02 §4.1API 路径无 /v1 前缀(违反 I7
- 01 §1teacher-bff HTTP 调用 iam违反 B2应 gRPC
- **建议方案**ai06 立即回写 01/02 文档,删除全部中间过渡方案描述,对齐 I1-I8 + §2.15/§2.16/§5.5 最终方案。
- **状态**:待 coord 仲裁(确认回写范围与验收标准)
### ISSUE-002-ai06events.proto 缺少 UserEvent/RoleEvent/AuditEvent message
- **提请方**ai06
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**coord-final-decisions §5.1 标注"events.proto ✅ 已补全UserEvent/RoleEvent/NotificationEvent/MasteryEvent/AIUsageEvent/KnowledgePointEvent/QuestionEvent"president §5.5 也要求"events.proto 补 AuditEvent 在批次 0.10 完成"。但实际 [events.proto](../../../packages/shared-proto/proto/events.proto) 仅定义 ClassEvent/ExamEvent/HomeworkEvent/GradeEvent 4 个 message**完全缺少** UserEvent/RoleEvent/AuditEvent 等 iam 依赖的事件契约。这直接阻塞 iam Outbox 事件发布iam 无法写入未定义 schema 的事件)。
- **建议方案**coord 立即补全 events.proto至少新增 UserEvent、RoleEvent、AuditEvent 三个 message按 02 文档 §5.2 和 president §5.5 的字段定义)。
- **状态**:待 coord 仲裁
### ISSUE-003-ai06Topic 命名三方不一致edu.identity.* vs edu.iam.*
- **提请方**ai06
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**iam 事件 Topic 命名存在三方不一致:
- [004 §7.2](../../../docs/architecture/004_architecture_impact_map.md) 行 620-621`edu.identity.user.created` / `edu.identity.user.updated`(用 `identity` 域名)
- [matrix.md §4](../matrix.md) / [iam_contract.md §1.4](../contracts/iam_contract.md)`edu.iam.user.events` / `edu.iam.role.events` / `edu.iam.audit.created`(用 `iam` 域名)
- president §5.5`edu.iam.audit.created`(用 `iam` 域名)
- coord-final-decisions G16 规则:`edu.<domain>.<aggregate>.<action>`
- **建议方案**:统一用 `edu.iam.*`(服务名为 iam非 identitycoord 同步修正 004 §7.2 的 `edu.identity.*``edu.iam.*`。同时明确 Topic 粒度matrix.md 用聚合 topic`edu.iam.user.events` 含多 action004 §7.2 用具体动作 topic`edu.iam.user.created`),需统一为一种风格。
- **状态**:待 coord 仲裁
### ISSUE-004-ai06DataScope 枚举三方不一致
- **提请方**ai06
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**DataScope 6 级枚举存在三方不一致:
- [004 §5.3 表](../../../docs/architecture/004_architecture_impact_map.md) 行 463-470SELF/CLASS/GRADE/SCHOOL/DISTRICT/ALL
- [004 §5.3](../../../docs/architecture/004_architecture_impact_map.md) 行 505all/grade_managed/class_taught/children/owned + 自定义(语义命名,与表不同)
- president §3.2 P2.2ALL/SCHOOL/GRADE/CLASS/SUBJECT/SELF**SUBJECT 替代 DISTRICT**
- 源码 [iam.schema.ts](../../../services/iam/src/iam/iam.schema.ts) 第 16-25 行self/class/grade/school/district/all与 004 表一致,与 president 不一致)
- **建议方案**coord 统一裁定最终枚举值。若采用 president 的 SUBJECT学科级数据范围K12 场景更实用),需同步修改源码 schema + 004 §5.3 表 + 02 文档;若保留 DISTRICT需修正 president §3.2。同时修正 004 行 505 的语义命名使其与枚举表一致。
- **状态**:待 coord 仲裁
### ISSUE-005-ai06iam.proto 仅 4 RPC未补全至 12 RPC
- **提请方**ai06
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**coord-final-decisions §5.1 要求 iam.proto 在"P2 启动前"补全 8 个新 RPCGetViewports / GetEffectivePermissions / GetEffectiveAccess / Logout / GetPublicKey / BatchGetUsers / GetEffectiveDataScope / GetChildrenByParentpresident §6 批次 0 任务 0.3 也明确"coord 补全 iam.proto 8 RPC"。但实际 [iam.proto](../../../packages/shared-proto/proto/iam.proto) 仍仅 4 RPCRegister/Login/RefreshToken/GetUserInfo未补全。这阻塞 iam P2.1 的 8 RPC 实现proto 是契约先行前提)。
- **建议方案**coord 立即补全 iam.proto 至 12 RPC含对应 message 定义),对齐 [iam_contract.md §1.1](../contracts/iam_contract.md) 的 12 RPC 清单。
- **状态**:待 coord 仲裁
### ISSUE-006-ai0601/02 文档 AI 身份署名错误
- **提请方**ai06
- **日期**2026-07-10
- **类型**:其他
- **描述**[01-understanding.md](../../../services/iam/docs/01-understanding.md) 和 [02-architecture-design.md](../../../services/iam/docs/02-architecture-design.md) 署名"AIai02TS / 身份认证)"、"AI Agent: ai02 (iam-module)"。但 coord-final-decisions §3.1、president §3.2、[matrix.md](../matrix.md)、[workline.md](../workline.md)、[iam_workline.md](../worklines/iam_workline.md)、[iam_contract.md](../contracts/iam_contract.md) 全部指明 iam 由 **ai06** 负责。ai02 实际负责 push-gatewaycoord-final-decisions §3.7)。文档署名错误会导致多 AI 协作时身份混淆。
- **建议方案**:回写时将 01/02 文档署名从 ai02 改为 ai06。
- **状态**:待 coord 仲裁
### ISSUE-007-ai06contract.md §1.2 与双入口策略冲突
- **提请方**ai06
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**[iam_contract.md §1.2](../contracts/iam_contract.md) 写"无对外 HTTP 端点,仅 gRPC"。但 president §2.16 裁决双入口策略REST 供 gateway 透传 + gRPC 供 BFF 聚合调用,"gateway 保持 HTTP 透传"。若 iam 不暴露 HTTP 端点gateway 无法透传gateway 不改为 gRPC 客户端)。
- **建议方案**:修正 contract.md §1.2,补充 REST 端点清单(/iam/v1/* 系列),标明"REST 供 gateway 透传 + admin-portal 直连gRPC 供 BFF 聚合调用"。
- **状态**:待 coord 仲裁
---
## 问题列表
<!--
@@ -21,4 +139,4 @@
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)
见上方 §2 新提请异议ISSUE-001 ~ ISSUE-007

View File

@@ -6,19 +6,189 @@
---
## 问题列表
## §0 已有仲裁核查ai10 复核)
<!--
追加条目格式:
> 本节核查 01-understanding.md / 02-architecture-design.md 中引用的已有仲裁,对照源码/proto 验证准确性。
### ISSUE-[编号]-[AI标识][标题]
### ISSUE-001-ai10M8 ZodError 已修复 — 核查通过
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**待 coord 仲裁 / 已裁决(见 coord.md §X
-->
- **提请方**ai10
- **日期**2026-07-10
- **类型**仲裁核查
- **描述**01-understanding.md M8 称"GlobalErrorFilter 已识别 ZodError 返回 400"。核查 [global-error.filter.ts](../../../services/msg/src/shared/errors/global-error.filter.ts) L32-42`else if (exception instanceof ZodError) { statusCode = 400; ... }`,确实已处理,返回 `MSG_VALIDATION_ERROR` + 400。
- **核查结论**:✅ 仲裁准确M8 标记"已修复"无误
- **状态**已裁决(核查通过,无需处理
(暂无问题)
### ISSUE-002-ai10M12 proto 包名规范 — 核查通过
- **提请方**ai10
- **日期**2026-07-10
- **类型**:仲裁核查
- **描述**01-understanding.md M12 称"实际 `next_edu_cloud.msg.v1` 符合规范"。核查 [msg.proto](../../../packages/shared-proto/proto/msg.proto) L3`package next_edu_cloud.msg.v1;`,与 01-understanding.md 描述一致。
- **核查结论**:✅ 仲裁准确,但存在规则冲突(见 ISSUE-007
- **状态**:已裁决(核查通过)
### ISSUE-003-ai10M2 msg 必须有 Outbox — 核查通过
- **提请方**ai10
- **日期**2026-07-10
- **类型**:仲裁核查
- **描述**01-understanding.md M2 称"004 §7.2 明确 msg 生产 `edu.notification.events`msg 必须有 Outbox"。核查 004 §7.3 L638 `NotificationRequested` 事件Msg 投递通知到多渠道)+ known-issues §msg L346"Outbox 强制"。
- **核查结论**:✅ 仲裁准确msg 必须实现 OutboxP5 强制)
- **状态**:已裁决(核查通过)
### ISSUE-004-ai10core-edu 事件 topic 命名统一 — 核查部分通过
- **提请方**ai10
- **日期**2026-07-10
- **类型**:仲裁核查
- **描述**02-architecture-design.md §7.2 P11 称"coord 已仲裁采用 `edu.teaching.*` 新约定"。核查:
- 004 §7.2 L623-625 使用 `edu.teaching.assignment.submitted` / `edu.teaching.exam.published` / `edu.teaching.grade.recorded`(新约定)✅
- [events.proto](../../../packages/shared-proto/proto/events.proto) L9-13 注释仍用 `edu.exam.events` / `edu.homework.events`(旧约定)❌ 未同步
- [matrix.md](../matrix.md) §4 L112-115 使用 `edu.exam.events` / `edu.homework.events`(旧约定)❌ 未同步
- **核查结论**:⚠️ 仲裁已作出但未全量同步events.proto 注释与 matrix.md 仍用旧约定,需 coord 统一更新
- **状态**:待 coord 同步(见 ISSUE-008
### ISSUE-005-ai10Push Gateway 调用方向歧义 — 核查通过
- **提请方**ai10
- **日期**2026-07-10
- **类型**:仲裁核查
- **描述**02-architecture-design.md §7.2 P10 称"004 §4.1 写 PushGW→Msg实际是 Msg→PushGW"。核查 004 §4.1 L413`push-gateway → Msg | gRPC | 推送通道建立`,方向确实反了。实际流程是 msg 调 push-gateway 的 gRPC PushService.Push见 [notifications.service.ts](../../../services/msg/src/notifications/notifications.service.ts) L179 fetch POST /internal/push 降级实现)。
- **核查结论**:✅ 歧义确认,建议 coord 修正 004 §4.1 表述为"Msg → push-gateway (gRPC)"
- **状态**:待 coord 修正 004
---
## §1 新发现问题ai10 提请)
### ISSUE-006-ai10events.proto P9 字段描述不准确
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**02-architecture-design.md §7.2 P9 称"events.proto ExamEvent / HomeworkEvent / GradeEvent 需补 `class_id` / `student_ids[]` 字段"。核查 events.proto
- `ExamEvent` L32 **已有** `class_id` 字段 ✅
- `HomeworkEvent` L45 **已有** `class_id` 字段 ✅
- `GradeEvent` L50-59 **无** `class_id`(仅有 `student_id`)❌
- 三者均**无** `student_ids[]`(复数,用于 fan-out 广播)❌
- **建议方案**:修正 P9 表述为"`GradeEvent` 需补 `class_id`;全部事件需补 `student_ids[]` 字段msg fan-out 广播通知需要)"
- **状态**:待 coord 仲裁
### ISSUE-007-ai10proto 包名规则冲突project_rules vs 实际)
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**[project_rules §5](../../../.trae/rules/project_rules.md) 规定"包名规范:`edu.<domain>.v1`(如 `edu.iam.v1``edu.core_edu.v1`",但实际所有 proto 文件使用 `next_edu_cloud.<domain>.v1`(如 msg.proto L3 `next_edu_cloud.msg.v1`、events.proto L3 `next_edu_cloud.events.v1`。01-understanding.md 称"coord 已裁决采用 `next_edu_cloud.*`",但 project_rules §5 未同步更新,仍写 `edu.<domain>.v1`
- **建议方案**coord 统一裁决,二选一:
- 方案 A更新 project_rules §5 为 `next_edu_cloud.<domain>.v1`(与实际 proto 一致)
- 方案 B重命名所有 proto package 为 `edu.<domain>.v1`(与规则一致,但改动大)
- **状态**:待 coord 仲裁
### ISSUE-008-ai10Kafka topic 命名三套约定并存
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**msg 相关的 Kafka topic 命名存在三套约定:
- **约定 A004 §7.2per-event topic**`edu.identity.user.created` / `edu.teaching.exam.published` / `edu.notification.sent`
- **约定 Bmatrix.md §4 + events.proto 注释aggregate topic**`edu.iam.user.events` / `edu.exam.events` / `edu.notification.requested`
- **约定 Cmsg_contract.md §1.4aggregate topic + action 字段)**`edu.msg.notification.events`action: sent/read/recalled/failed
- 02-architecture-design.md §5.1/§5.2 采用约定 Amsg_contract.md §1.4 采用约定 Cmatrix.md 采用约定 B。known-issues §全局 L182 已标记此冲突。
- **建议方案**coord 统一为一套约定。ai10 倾向约定 Aper-event topic理由
- 004 §7.2 已采用,是架构设计意图唯一源
- per-event topic 便于消费者按需订阅,避免反序列化无关事件
- 与 NotificationSent / NotificationRead 等事件命名PascalCase对齐
- **状态**:待 coord 仲裁
### ISSUE-009-ai10RPC 数量超预算17 vs 13
- **提请方**ai10
- **日期**2026-07-10
- **类型**:工作量超批
- **描述**[ai-allocation.md §3.2](../../ai-allocation.md) L112 与 [matrix.md](../matrix.md) §2 L90 均规定 msg 为"3 Service 13 RPC"。但 02-architecture-design.md §4.2 列出 17 RPC
- NotificationService 9 RPCSendNotification / BatchSendNotification / ListNotifications / GetUnreadCount / MarkAsRead / BatchMarkAsRead / MarkAllAsRead / SearchNotifications / RecallNotification
- NotificationPreferenceService 2 RPCGetPreferences / UpdatePreferences
- NotificationTemplateService 6 RPCCreateTemplate / GetTemplate / ListTemplates / UpdateTemplate / DeleteTemplate / RenderTemplate
- 而 msg_contract.md §1.1 列出 13 RPC分布不同5+4+4两文档互相不一致
- **建议方案**coord 裁决 RPC 范围,二选一:
- 方案 A维持 13 RPC 预算02-architecture-design.md 裁剪至 13移除 BatchSendNotification / GetUnreadCount / BatchMarkAsRead / MarkAllAsRead / UpdateTemplate / DeleteTemplate降级为 REST only 或合并)
- 方案 B放宽至 17 RPC同步更新 ai-allocation.md + matrix.md + msg_contract.md
- **状态**:待 coord 仲裁
### ISSUE-010-ai10markAsRead 权限点与设计不一致
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**[notifications.controller.ts](../../../services/msg/src/notifications/notifications.controller.ts) L74 markAsRead 使用 `MSG_NOTIFICATION_MANAGE` 权限,但 02-architecture-design.md §6.1 L730 规定 markAsRead 应使用 `MSG_NOTIFICATION_READ`。MANAGE 权限通常给管理员,学生标记自己通知已读不应需要 MANAGE 权限。
- **建议方案**:以 02-architecture-design.md §6.1 为准READP5 实现时修正 controller 权限点
- **状态**:待 coord 确认
### ISSUE-011-ai10DB→ES 降级方向与 ai-allocation §5 相反
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- [ai-allocation.md §5](../../ai-allocation.md) ai10 设计重点要求"ES 降级查询策略(**DB 不可用时走 ES 索引**"——即 DB 故障时 ES 作为读模型兜底
- 02-architecture-design.md §3.2.2 / §3.4 描述"**ES 不可用时降级到 MySQL LIKE 查询**"——即 ES 故障时 DB 兜底
- 01-understanding.md M16 称"无 DB→ES 降级读路径"
- 三处描述方向相反,需统一
- **建议方案**ai10 倾向双向降级(两种故障场景都覆盖):
- ES 故障 → DB LIKE 查询(设计文档已覆盖)
- DB 故障 → ES 只读模式ai-allocation 要求,设计文档需补充)
- 但 DB 故障时写操作无法降级(必须等 DB 恢复),仅读操作可走 ES
- **状态**:待 coord 仲裁
### ISSUE-012-ai10设计文档缺 DLQ 与三层幂等防线
- **提请方**ai10
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**[known-issues §msg](../../../docs/troubleshooting/known-issues.md) L344 / L356 已记录两项 ai10 设计点,但 02-architecture-design.md 未覆盖:
- **三层幂等防线**L344L1 Redis SETNX / L2 msg_idempotency 表 / L3 notifications.source_event_id 唯一索引。设计文档 §5.5 仅描述两层Redis + DB UNIQUE缺中间层 msg_idempotency 表
- **死信队列**L356消费失败超 3 次投递 `edu.notification.dlq`。设计文档 §5 完全未提及 DLQ 设计
- **建议方案**02-architecture-design.md 补充:
- §3.1 补 `msg_idempotency` 表 schema中间层
- §5.5 改为三层幂等防线
- §5 补 DLQ 设计(重试 3 次后投递 `edu.notification.dlq` + 告警)
- **状态**:待 coord 确认非阻塞ai10 自行补充设计文档即可)
### ISSUE-013-ai10events.proto 缺 4 类 message 阻塞 msg 消费
- **提请方**ai10
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**[events.proto](../../../packages/shared-proto/proto/events.proto) 仅有 ClassEvent / ExamEvent / HomeworkEvent / GradeEvent 4 个 message。msg 消费还需要:
- `UserEvent`iam 发布 user.created/updated/deleted/role_changed— 阻塞欢迎通知/角色变更通知
- `RoleEvent`iam 发布 role.created/updated— 阻塞角色变更通知
- `MasteryEvent`data-ana 发布 mastery.updated— 阻塞学情预警通知
- `NotificationEvent`msg 发布 notification.sent/read/recalled/failed— 阻塞 push-gateway 消费 msg 事件
- **建议方案**coord 维护 shared-proto在 P5 启动前补齐这 4 个 message。msg 在 proto 补齐前用通用 JSON payload 解析A6 假设)
- **状态**:待 coord 仲裁(🔴 阻塞 P5 消费链路)
### ISSUE-014-ai10msg_contract.md 与 02-architecture-design.md RPC 清单不一致
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**:两文档 RPC 清单存在差异:
- msg_contract.md 独有02 缺GetPreferenceByChannel、ListPreferences
- 02-architecture-design.md 独有contract 缺BatchSendNotification、GetUnreadCount、BatchMarkAsRead、MarkAllAsRead、UpdateTemplate、DeleteTemplate
- 即使忽略 ISSUE-009 的数量问题,两文档的 RPC 组合也不同
- **建议方案**:待 ISSUE-009 仲裁后,统一两文档 RPC 清单
- **状态**:待 coord 仲裁(依赖 ISSUE-009
### ISSUE-015-ai10msg_contract.md Kafka 发布事件与设计文档不一致
- **提请方**ai10
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- msg_contract.md §1.4`edu.msg.notification.events` topic单一 NotificationEvent 含 action 字段
- 02-architecture-design.md §5.24 个 per-event topic`edu.notification.sent` / `edu.notification.read` / `edu.notification.recalled` / `edu.notification.failed`
- matrix.md §4 L118`edu.notification.requested`(第三种命名)
- **建议方案**:待 ISSUE-008 仲裁 topic 命名约定后统一
- **状态**:待 coord 仲裁(依赖 ISSUE-008

View File

@@ -6,8 +6,165 @@
---
## §0 已有仲裁核查结论ai05 复审2026-07-10
> 对 parent-bff 相关的已仲裁决策(用户 U1-U4 + coord C1-C6 + coord-final-decisions I6逐项核查执行情况。
### 0.1 核查通过项(已正确执行)
| 仲裁 | 主题 | 核查结论 |
| --- | --- | --- |
| U2 | push-gateway 豁免 gRPCHTTP /internal/push | ✅ 02 §5.3/§7.1 已执行 HTTP 调用 push-gateway |
| C2 | 端口 3010不暴露 gRPC | ✅ 02 §7.2 + matrix.md §3 已执行 |
| C3 | core-edu 错误码 CORE_EDU_* | ✅ 02 §6.2 已执行 |
| C5 | Kafka topic edu.notification.sent/read/recalled/failed | ✅ 02 §5.2 已执行004 §7.2 同步属 coord 待办 #7,不阻塞 parent-bff |
### 0.2 核查发现的问题(仲裁已裁决但文档未同步/执行有偏差)
以下问题均为"仲裁结论正确,但相关文档未同步"或"文档内部不一致",提请 coord 确认处理方式。
---
## 问题列表
### ISSUE-001-ai0501-understanding.md 未同步 ai05 接手与多项仲裁
- **提请方**ai05
- **日期**2026-07-10
- **类型**:文档同步缺失
- **描述**01-understanding.md 头部仍标 "AI 标识ai04"、"状态:待 coord 审核",未反映 ai05 已正式接手ai-allocation.md §3.2)。同时以下仲裁已裁决但 01 未同步:
- U3GraphQL P2 引入01 §4.1 仍建议"P4 先对齐 teacher-bff REST 现状",与 U3 仲裁冲突
- U4BFF 豁免 @RequirePermission01 §6 表格"权限装饰器"行标"⚠️ 不对齐",未引用 U4 仲裁
- C1错误码前缀 BFF_PARENT_01 §3.3 仍用 `PARENT_BFF_` 旧前缀
- **建议方案**01-understanding.md 头部更新为 ai05 复审版,同步 U3/U4/C1 仲裁结论;或由 coord 确认 01 作为"阶段 1 历史快照"保留原样,以 02 为准
- **状态**:待 coord 仲裁
### ISSUE-002-ai0502 文档内部 ChildGuard 缓存 TTL 不一致
- **提请方**ai05
- **日期**2026-07-10
- **类型**:文档内部不一致
- **描述**02-architecture-design.md 内部 ChildGuard 绑定列表缓存 TTL 三处不一致:
- §3.1.1 Redis 缓存 Schema 表:写 "60s"coord 推断原值)
- §9 #2 ai05 review 结论:调整为 "30s + 主动失效"
- §13 #7 黄金模板对齐表:写 "30s"
§3.1.1 表格未同步 §9 的调整,导致同一文档内 60s 与 30s 并存。
- **建议方案**§3.1.1 表格 ChildGuard 行 TTL 改为 "30s",与 §9 #2 + §13 #7 一致
- **状态**:待 coord 仲裁ai05 建议直接修正,属于文档勘误)
### ISSUE-003-ai05contract.md 仲裁引用编号错误I3 → I6
- **提请方**ai05
- **日期**2026-07-10
- **类型**:契约引用错误
- **描述**contracts/parent-bff_contract.md §2.1 表格 + §3.1 引用 "I3/ISSUE-047 裁决" 作为 GetChildrenByParent 的仲裁依据。但核查 coord-final-decisions.md 发现:
- I3 是 "PermissionGuard 本地 map → DB 驱动" 裁决,与家长-学生关联无关
- I6 才是 "家长-学生关联P2 即补全 iam_student_guardians 表 + GetChildrenByParent RPC" 裁决
- 全仓库未检索到 "ISSUE-047" 编号grep 无结果),疑为虚构编号
- **建议方案**contract.md 将 "I3/ISSUE-047 裁决" 修正为 "I6 裁决coord-final-decisions.md §1"
- **状态**:待 coord 仲裁ai05 建议直接修正,属于引用勘误)
### ISSUE-004-ai05004 §4 服务依赖图与 matrix.md §1 未同步 C6 仲裁
- **提请方**ai05
- **日期**2026-07-10
- **类型**:架构图未同步
- **描述**C6 仲裁将 parent-bff 依赖扩展为 iam + core-edu + data-ana + msg
- 004_architecture_impact_map.md §4 服务依赖图line 376-377仍只画 `PBFF --> IAM` + `PBFF --> CoreEdu`,未加 DataAna + Msg
- matrix.md §1 服务依赖矩阵line 64-65同样只画 `PBFF --> IAM` + `PBFF --> CORE`
- 02 §0.1 C6 行已标注 "004 §4 待 coord 同步更新",但至今未同步
此差异导致新接手的 AI 看 004/matrix 会误以为 parent-bff 不依赖 data-ana/msg与 02 设计冲突。
- **建议方案**coord 在 004 §4 服务依赖图补 `PBFF --> DataAna` + `PBFF --> Msg`matrix.md §1 同步;更新 004 时按 project_rules §1 "改码必同步图" 执行
- **状态**:待 coord 仲裁
### ISSUE-005-ai05parent-portal 01 文档与 parent-bff GraphQL 决策跨模块冲突
- **提请方**ai05
- **日期**2026-07-10
- **类型**:跨模块契约冲突
- **描述**U3 仲裁决定 parent-bff P4 直接用 GraphQL02 §4 已执行),但 parent-portal 01-understanding.md §3.1 仍按 REST 设计消费 parent-bff
- parent-portal §3.1 列 `GET /parent/viewports``GET /parent/dashboard``GET /parent/children` 等 REST 端点
- parent-bff 02 §4.1 明确 "不实现 REST 业务端点(仅保留 /healthz /readyz /metrics"
- parent-portal §3.1 还引用 `GET /iam/effective-permissions`C4 仲裁已改为 `/iam/permissions/effective`
- parent-portal §3.1 标 "BFF 对接parent-bffai04 设计)"ai04 已过时(现 ai05
此冲突若不解决parent-portalai15会按 REST 实现 frontend client与 parent-bff GraphQL 端点不兼容。
- **建议方案**coord 协调 ai15 将 parent-portal 01/02 文档的 parent-bff 消费契约从 REST 改为 GraphQL`POST /api/v1/parent/graphql`),同步 C4 iam 路径仲裁;此属跨模块契约,按 project_rules §14.4 跨模块变更顺序处理
- **状态**:待 coord 仲裁
### ISSUE-006-ai05proto 包名引用不一致(缺失 next_edu_cloud 前缀)
- **提请方**ai05
- **日期**2026-07-10
- **类型**:契约引用错误
- **描述**02-architecture-design.md §3.3 DTO 映射表引用 proto message 为 `iam.v1.UserInfo``core_edu.v1.Grade[]``analytics.v1.StudentWeakness``msg.v1.Notification[]`。但实际 proto 文件包名均带 `next_edu_cloud.` 前缀:
- iam.proto: `package next_edu_cloud.iam.v1;`
- core_edu.proto: `package next_edu_cloud.core_edu.v1;`
- analytics.proto: `package next_edu_cloud.analytics.v1;`
- msg.proto: `package next_edu_cloud.msg.v1;`
引用不一致会导致 gRPC client 代码生成时 package 路径错误。
- **建议方案**02 §3.3 DTO 映射表 proto message 列全部补 `next_edu_cloud.` 前缀;或确认是否统一去掉前缀(需 buf.yaml 配置一致)
- **状态**:待 coord 仲裁
### ISSUE-007-ai05GraphQL Notification.childId 字段在 msg.proto 缺失
- **提请方**ai05
- **日期**2026-07-10
- **类型**:契约缺口
- **描述**02 §4.2 GraphQL schema 定义 `Notification` type 含 `childId: ID` 字段(家长场景需知道通知关联哪个孩子)。但 msg.proto 的 Notification message 无 childId 字段:
```proto
message Notification {
string id = 1;
string user_id = 2;
string type = 3;
string title = 4;
string content = 5;
string channel = 6;
bool is_read = 7;
int64 created_at = 8;
}
```
parent-bff 无法从 msg 服务获取通知关联的孩子 ID影响"按孩子过滤通知"场景。
- **建议方案**coord 协调 ai10 在 msg.proto Notification message 补 `string child_id = 9;` 字段(可选,非家长通知为空);或 parent-bff 从 notification.content 解析(脆弱,不推荐)
- **状态**:待 coord 仲裁
### ISSUE-008-ai05core_edu.proto 缺 ClassService02 §7.1 列为已有
- **提请方**ai05
- **日期**2026-07-10
- **类型**:契约缺口
- **描述**02 §7.1 交互矩阵列 `core-edu ClassService.GetClass`(查孩子班级信息)状态为 "✅ 已有"。但核查 core_edu.proto 实际只有 ExamService / HomeworkService / GradeService 三个 service无 ClassService。matrix.md §2 却声称 core-edu 有 "ClassService + ExamService + HomeworkService + GradeService + AttendanceService" 共 22 RPC。proto 与 matrix.md 不一致,且 02 错误标注为"已有"。
core_edu.proto 的 Grade.score 是 string 类型02 GraphQL Grade.score 是 Float!string→Float 转换规则未在 §3.3 说明。
- **建议方案**
1. coord 确认 ClassService 归属core-edu 还是 classes 服务),补 proto
2. 02 §7.1 ClassService.GetClass 状态从 "✅ 已有" 改为 "❌ 待补"
3. 02 §3.3 补 Grade.score string→Float 转换规则说明
- **状态**:待 coord 仲裁
### ISSUE-009-ai05ai-allocation iam 责任方与 01/02 文档不一致
- **提请方**ai05
- **日期**2026-07-10
- **类型**:责任方引用过时
- **描述**01-understanding.md §7.1/§7.3 多处提"推动 ai02 在 iam 补接口"02 §8.1 P0 阻塞项 + §14.1 P0-1 也标 iam 责任方为 "ai06iam 现归属)" 但 §7.3 #1 仍标 ai02。实际 ai-allocation.md §3.2 确认 iam 归属 ai06。01 文档未同步。
- **建议方案**01 §7.1/§7.3 将 "ai02" 改为 "ai06"02 §7.3 #1 同步
- **状态**:待 coord 仲裁ai05 建议直接修正,属于引用勘误)
### ISSUE-010-ai0502 缺少 ADR / NFR / 容量规划 / 威胁建模(业界规范差距)
- **提请方**ai05
- **日期**2026-07-10
- **类型**:架构文档规范缺失
- **描述**:对照业界通用架构文档规范(如 C4 model + ADR + NFR02-architecture-design.md 存在以下规范差距:
1. **ADR 缺失**:虽有"已仲裁决策"表,但未按 ADR 格式Context/Decision/Consequences记录关键决策如 GraphQL vs REST、ChildGuard 位置、多子女切换方案)。建议补 ADR 索引章节。
2. **NFR 未量化**§10.4 P6 提"SLO 监控"但文档前部未明确非功能性需求P95 延迟、可用性、吞吐量目标)。业界规范要求架构文档开头列 NFR。
3. **容量规划缺失**:未估算家长端 QPS、并发数、数据量家长数 × 孩子数 × 成绩数),无法指导 HPA 副本数和 Redis 容量规划。
4. **安全威胁建模缺失**§6.2 列错误码但未做威胁建模STRIDE。家长场景涉及未成年人数据COPPA/FERPA/PIPL应补威胁模型。
5. **数据流图DFD缺失**§1.2 只有 Dashboard 时序图,缺少 DFD 展示数据跨信任边界流动。
- **建议方案**coord 确认是否在 02 补全上述章节,或作为 P6 硬化阶段补全;当前不阻塞 P4 实施
- **状态**:待 coord 仲裁
---
<!--
追加条目格式:
@@ -20,5 +177,3 @@
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)

View File

@@ -6,6 +6,33 @@
---
## §0 已有仲裁核查ai15 复核 ARB-001 / ARB-002 落地情况)
> ai15 接管 parent-portal 后,核查 coord 已发布的两项仲裁ARB-001 teacher-bff GraphQL schema、ARB-002 MF Shell 暴露清单)在 parent-portal 文档中的落地情况。
### 0.1 ARB-001teacher-bff GraphQL schema 第一版)核查
| 核查项 | ARB-001 结论 | parent-portal 落地情况 | 状态 |
| ------ | ------------ | ---------------------- | ---- |
| BFF 用 GraphQL非 REST | ✅ 已裁决 GraphQL | 01-understanding §3.1 + 02-architecture-design §4.1 全部描述为 REST 消费 | ❌ 未落地 |
| ActionState 信封 | ✅ 已裁决 | 01 §3.2 已对齐 | ✅ |
| 错误码前缀路由 | ✅ 已裁决 | 01 §3.2 + 02 §6.2 已对齐 | ✅ |
**结论**ARB-001 的核心裁决BFF = GraphQL在 parent-portal 的 01/02 文档中**未落地**01 §3.1 与 02 §4.1 仍按 REST 编写,与 [parent-bff_contract.md](../contracts/parent-bff_contract.md) §1.3GraphQL 端点 :3010和 [matrix.md](../matrix.md) §3parent-bff GraphQL直接冲突。提请 ISSUE-001。
### 0.2 ARB-002MF Shell 暴露清单)核查
| 核查项 | ARB-002 结论 | parent-portal 落地情况 | 状态 |
| ------ | ------------ | ---------------------- | ---- |
| Shell 暴露 GraphQLProvider | ✅ 已裁决 | 01 §4 技术栈未列 urql/GraphQL client02 §4.1 用 `useApi()`REST ApiClient而非 `useGraphQLClient()` | ❌ 未落地 |
| MF shared 含 urql/graphql/@edu/* | ✅ 已裁决 | 02 §1.2 `shared` 仅列 react/react-dom/@tanstack/react-query/zustand/nuqs缺 urql/graphql/@edu/ui-tokens/@edu/ui-components/@edu/hooks | ❌ 未落地 |
| Shell 暴露 AppShell | ✅ 已裁决 | 01 §9.1 + 02 §7.1 已对齐 | ✅ |
| feature flag NEXT_PUBLIC_MF_ENABLED | ✅ 已裁决 | 01/02 均未提及 | ❌ 未落地 |
**结论**ARB-002 关于 GraphQL client 与 MF shared 的裁决在 parent-portal 文档中**部分未落地**。提请 ISSUE-002。
---
## 问题列表
<!--
@@ -21,4 +48,164 @@
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)
### ISSUE-001-ai1501/02 文档 REST 消费 parent-bff 与 ARB-001 GraphQL 裁决冲突
- **提请方**ai15
- **日期**2026-07-10
- **类型**:契约不明确(文档与已裁决架构冲突)
- **描述**
- 01-understanding.md §3.1 列出 parent-portal 经 REST 消费 parent-bff`GET /parent/viewports``GET /parent/children``POST /parent/children/:childId/select``GET /parent/notifications``PUT /parent/notification-preferences`
- 02-architecture-design.md §4.1 `useParentApi` 实现全部基于 `api.get()`/`api.post()` REST 调用
- 但 ARB-001coord.md §1已裁决 BFF 用 GraphQL[parent-bff_contract.md](../contracts/parent-bff_contract.md) §1.3 明确 parent-bff 提供 `POST /graphql`:3010[matrix.md](../matrix.md) §3 确认 parent-bff = GraphQL
- parent-portal 自己的 [contract.md](../contracts/parent-portal_contract.md) §2.3-2.4 也写明消费 GraphQL`POST /api/parent/graphql`Query 域currentUser/myChildren/childSummary/childGrades 等)
- **文档内部自相矛盾**01/02 用 RESTcontract.md 用 GraphQL
- **建议方案**
1. coord 确认 parent-portal 消费 parent-bff **统一用 GraphQL**(与 ARB-001、parent-bff contract、matrix.md 一致)
2. ai15 据此修订 01 §3.1(改为 GraphQL Query/Mutation 域、§3.1.1X-Fields 字段裁剪改为 GraphQL query 字段选择、02 §4.1`useParentApi` 改为 GraphQL hooks、§4.2TanStack Query 约定配合 GraphQL operations、§11.3 未决设计决策 #2(移除,已裁决)
3. 若 coord 另有裁决(如 parent-portal 特殊走 REST以 coord 裁决为准
- **状态**:待 coord 仲裁
### ISSUE-002-ai15MF shared 配置缺 urql/graphql/@edu/* 与 ARB-002 冲突
- **提请方**ai15
- **日期**2026-07-10
- **类型**:契约不明确(文档与已裁决 MF 配置冲突)
- **描述**
- 02-architecture-design.md §1.2 MF `shared` 配置仅列:`react``react-dom``@tanstack/react-query``zustand``nuqs`
- ARB-002coord.md §2裁决的 `shared` 应包含:`react``react-dom``urql``graphql``@edu/ui-tokens``@edu/ui-components``@edu/hooks`
- 缺失 `urql`/`graphql` 会导致 Remote 与 Shell 各加载一份 GraphQL client 实例,破坏单例,引发缓存不一致与重复请求
- 缺失 `@edu/*` 会导致设计令牌/UI 组件/Hooks 各加载一份
- 同时 01 §4 技术栈表未列 GraphQL clienturql与 ARB-002 Shell 暴露 GraphQLProvider 矛盾
- **建议方案**
1. coord 确认 parent-portal MF `shared` 必须包含 ARB-002 全部 7 项react/react-dom/urql/graphql/@edu/ui-tokens/@edu/ui-components/@edu/hooks
2. ai15 修订 02 §1.2 `shared` 配置 + 01 §4 技术栈表(新增 urql + GraphQL client 行)
3. 02 §4.1 `useParentApi` 改为从 Shell 暴露的 `useGraphQLClient()` 获取 urql client不再用 REST ApiClient
- **状态**:待 coord 仲裁
### ISSUE-003-ai15switch-child 端点在 01/02 文档间不一致
- **提请方**ai15
- **日期**2026-07-10
- **类型**:契约不明确(文档内部不一致)
- **描述**
- 01-understanding.md §3.1 列 `POST /parent/children/:childId/select`
- 02-architecture-design.md §2.2 + §4.1 用 `POST /api/v1/parent/switch-child`body 携带 childId
- 两处路径与语义均不一致URL param vs body param
- parent-bff contract.md 未列 switch-child其 §1.3 仅列 Query/Mutation 域,未细到 switch-child
- **建议方案**
1. 若走 GraphQL依 ISSUE-001 裁决switch-child 应为 `mutation switchChild(childId: ID!): SwitchChildPayload!`,不存在 REST 路径
2. 若走 REST统一为 `POST /api/v1/parent/switch-child`body 携带 childId与 02 一致),修订 01 §3.1
3. 请 coord 一并明确 parent-bff GraphQL schema 是否包含 `switchChild` Mutation当前 parent-bff contract.md 未列)
- **状态**:待 coord 仲裁
### ISSUE-004-ai15登录端点在 01 / contract.md / matrix.md 间三方不一致
- **提请方**ai15
- **日期**2026-07-10
- **类型**:契约不明确(跨文档不一致)
- **描述**
- 01-understanding.md §3.1 列 `POST /iam/login`
- parent-portal_contract.md §2.3 列 `POST /api/auth/login`
- matrix.md §5 规范 iam 经 api-gateway 代理路径为 `/api/v1/iam/*`
- 三处不一致,且 contract.md 的 `/api/auth/login` 路径在 matrix.md 中不存在
- **建议方案**
1. 统一为 `POST /api/v1/iam/login`(与 matrix.md §5 + 01 §3.1 的 `/api/v1/iam/*` 前缀一致)
2. ai15 修订 contract.md §2.3 路径
3. 注意:登录是 parent-portal 唯一可能走 REST非 GraphQL的端点因登录前无 JWTGraphQL endpoint 需鉴权。请 coord 确认登录是否走 REST `/api/v1/iam/login`,其余走 GraphQL
- **状态**:待 coord 仲裁
### ISSUE-005-ai1502 §11.3 未决设计决策 #2 "GraphQL vs REST" 已由 ARB-001 裁决,应移除
- **提请方**ai15
- **日期**2026-07-10
- **类型**:其他(文档过时)
- **描述**
- 02-architecture-design.md §11.3 第 2 项将 "GraphQL vs REST" 列为未决设计决策,建议 "P4 用 REST后续若 BFF 切 GraphQL 再引入 urql"
- 但 ARB-001coord.md §1已于 2026-07-09 裁决 BFF 用 GraphQL且 parent-bff contract.md 确认 GraphQL
- 此项已过时,会误导后续开发
- **建议方案**
1. coord 确认 ARB-001 适用于 parent-portal即 parent-portal P4 起必须用 GraphQL 消费 parent-bff
2. ai15 移除 02 §11.3 第 2 项,改为 "已裁决:见 ARB-001parent-portal 用 GraphQL 消费 parent-bff"
- **状态**:待 coord 仲裁
### ISSUE-006-ai15contract.md §1.2 将前端页面路由误标为 HTTP 端点
- **提请方**ai15
- **日期**2026-07-10
- **类型**:其他(文档分类错误)
- **描述**
- parent-portal_contract.md §1.2 "HTTP 端点" 列出:`GET /``GET /children``GET /child/:id/summary``GET /child/:id/grades`
- 但 parent-portal 是 Next.js 前端应用,这些是**前端页面路由**SSR/CSR 路由),不是对外 HTTP API 端点
- 将页面路由放在 "HTTP 端点" 表中会误导下游消费方以为这些是 REST API
- 且这些路由与 01 §8 L2 路由表(`/parent/dashboard``/parent/children`路径还不一致contract 用 `/children`01 用 `/parent/children`
- **建议方案**
1. coord 确认 parent-portal 作为前端 Remote不对外提供 HTTP API 端点§1.2 应为"无"
2. ai15 将 contract.md §1.2 改为 "无parent-portal 是前端 Remote不对外提供 HTTP API",页面路由信息保留在 01 §8 L2 路由表中,不进 contract.md
3. 若需保留 MF 暴露信息,归入 §1.6 微前端架构(已有)
- **状态**:待 coord 仲裁
### ISSUE-007-ai15contract.md §1.6 module-federation.config.ts 与 02 next.config.js 不一致
- **提请方**ai15
- **日期**2026-07-10
- **类型**:其他(文档内部不一致)
- **描述**
- parent-portal_contract.md §1.6 列 MF 配置文件为 `apps/parent-portal/module-federation.config.ts`
- 02-architecture-design.md §1.2 MF 配置写在 `next.config.js` 中(用 `NextFederationPlugin`
- 两处文件名与位置不一致
- **建议方案**
1. 统一为 `apps/parent-portal/next.config.js`(与 02 + teacher-portal Shell 一致Next.js 项目 MF 配置应在 next.config.js
2. ai15 修订 contract.md §1.6
- **状态**:待 coord 仲裁
### ISSUE-008-ai15contract.md §2.3 GraphQL 路径前缀与 matrix.md 不一致
- **提请方**ai15
- **日期**2026-07-10
- **类型**:契约不明确(跨文档不一致)
- **描述**
- parent-portal_contract.md §2.3 列 `POST /api/parent/graphql`
- matrix.md §5 规范 api-gateway 代理 parent-bff 路径为 `/api/v1/parent/*`
-`v1` 版本号
- **建议方案**
1. 统一为 `POST /api/v1/parent/graphql`(与 matrix.md §5 一致)
2. ai15 修订 contract.md §2.3 + §2.4
- **状态**:待 coord 仲裁
### ISSUE-009-ai15parent-bff GraphQL schema 是否包含 switchChild Mutation 未明确
- **提请方**ai15
- **日期**2026-07-10
- **类型**:前置依赖缺失(上游契约不全)
- **描述**
- parent-bff_contract.md §1.3 列出的 Query/Mutation 域未包含 "switchChild"(切换当前选中子女)
- 01-understanding.md §2.2 + 02 §2.2 描述 parent-portal 需调用 `POST /parent/switch-child` 切换子女
- 若走 GraphQL依 ISSUE-001parent-bff 需提供 `mutation switchChild(childId: ID!): SwitchChildPayload!`
- 但 parent-bff contract 未列此 Mutation且 iam.GetChildrenByParent 已返回子女列表,切换子女是否需后端记录(还是纯前端 localStorage需明确
- **建议方案**
1. 请 coord 协调 ai05parent-bff确认switchChild 是 GraphQL Mutation 还是纯前端状态localStorage + Zustand
2. 若纯前端01/02 移除 `POST /parent/switch-child` 调用,改为 `useChildSwitcher` 直接写 Zustand + localStorage
3. 若需后端记录:请 ai05 在 parent-bff contract.md §1.3 补充 `switchChild` Mutation
- **状态**:待 coord 仲裁
### ISSUE-010-ai15iam GetChildrenByParent 接口缺失P0 阻塞,跨模块)
- **提请方**ai15
- **日期**2026-07-10
- **类型**:前置依赖缺失(跨模块,承自 parent-bff §7.1
- **描述**
- 01-understanding.md §3.1 注明iam 缺失 "家长-学生关联查询" 接口(`GetChildrenByParent` proto + `GET /iam/children` REST + `iam_student_guardians` 表三缺失)
- parent-bff_contract.md §2.1 也标注 "核心依赖 I3/ISSUE-047 裁决"
- parent-bff_contract.md §3.1 标注 "iam gRPC 50052 启用ai06—— 核心依赖 GetChildrenByParentI3/ISSUE-047 裁决)"
- 此为 parent-portal 多子女场景的 P0 阻塞项ai06iam需在 P3 收尾前补全
- ai15 在此提请,请 coord 跟踪 ai06 进度并确认补全时间点
- **建议方案**
1. coord 确认 ai06 补全 `GetChildrenByParent` 的时间点(应在 P4 启动前)
2. 在补全前parent-portal 用 mock固定 2 个子女开发mock 数据与 parent-bff mock 一致student-001 + student-002
- **状态**:待 coord 仲裁
---
## §1 已裁决问题
(暂无已裁决问题)

View File

@@ -1,24 +1,167 @@
# push-gateway 问题记录
> 负责人ai02
> 关联:[coord.md](../coord.md)、[contracts/push-gateway_contract.md](../contracts/push-gateway_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/push-gateway_contract.md](../contracts/push-gateway_contract.md)、[push-gateway 02 架构设计](../../../services/push-gateway/docs/02-architecture-design.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## 问题列表
## §0 已有仲裁核查ai02 复审 02 文档对总裁裁决的回写情况)
<!--
追加条目格式:
> 本节为 ai02 在批次 0 等待期对 president-final-rulings 已裁决事项的回写核查。
> 裁决来源:[president-final-rulings.md](../../president-final-rulings.md) §1.5 / §3.3 / §4.2 / §4.3 / §4.4 / §7.2 / §3.4
> 核查日期2026-07-10
> 核查结论5 项裁决中 **0 项已完全回写**、**1 项部分回写**、**4 项未回写**
### ISSUE-[编号]-[AI标识][标题]
### 核查矩阵
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
| 裁决编号 | 主题 | 裁决要求(摘要) | 02 文档现状 | 核查结论 | 状态 |
| -------- | ---- | ---------------- | ----------- | -------- | ---- |
| ISSUE-053 | Kafka topic 命名 | 02 §5.1 topic 改为 `edu.notification.requested`,禁止抽象名 `edu.*.events` | §5.1 仍写 `edu.notification.events` / `NotificationRequested` | ❌ 未回写 | 待 ai02 修复 |
| ISSUE-055 | /readyz 软失败 | push-gateway /readyz 对 Kafka 软失败(失败仅告警 + `degraded: true` + 返 200不返 503 | §6.7 仅 Redis PING 硬失败返 503无 Kafka 软失败逻辑 | ❌ 未回写 | 待 ai02 修复 |
| ISSUE-056 | 设计决策记录章节 | 02 §5.4 改名为"设计决策记录gRPC vs HTTP 协议选型coord 已采纳 P1",正文标注"coord 已采纳" | 02 无"设计决策记录"章节 | ❌ 未回写 | 待 ai02 修复 |
| ISSUE-058 | Redis SET 启动重建 | 02 §3.1 补充"Hub 启动时遍历内存连接 SADD + EXPIRE 60s + 清空旧 instanceID 成员"/readyz Redis 失败仅告警不阻塞metrics 暴露 `push_gateway_redis_set_rebuild_total`;文档化 60s 不一致窗口 | §3.1/§8.4 仅描述运行期 SADD/SREM无启动重建§6.7 Redis 硬失败返 503与"仅告警不阻塞"冲突);无重建指标;无 60s 窗口说明 | ❌ 未回写 | 待 ai02 修复 |
| ARB /internal/push 契约§4.2 | 第一版 /internal/push 契约 | coord "as-is" 采纳 ai02 02 §4.2 作为第一版契约,仅在 ai10 异议时调整 | 02 §4.2 已定义 `{user_id, event, data, ttl?}``{success, delivered, online}` | ✅ 已落地 | 无需动作 |
(暂无问题)
### 核查结论
- **ISSUE-053/055/056/058 共 4 项须 ai02 在批次 4 启动前回写到 02 文档**president-final-rulings §3.4 明确"批次 4 启动前"完成回写)
- **ARB /internal/push 契约已落地**,无需动作;但 ai10 若提出异议(如 batch 接口/异步回调coord 会公布差异点
- ISSUE-058 中"/readyz Redis 失败仅告警不阻塞"与 ISSUE-055"软失败规则"形成耦合Redis 作为 push-gateway 必需依赖本应硬失败,但 ISSUE-058 裁决要求"仅告警不阻塞"以避免雪崩 —— **此耦合需 coord 明确优先级**(见下方 ISSUE-006-ai02
---
## §1 问题列表(提请 coord 仲裁)
### ISSUE-001-ai02SSE 端点是否提供(跨文档三方冲突)
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**SSE 端点(`/sse`)在三个文档中存在冲突:
- [push-gateway_contract.md](../contracts/push-gateway_contract.md) §1.2 列出 `GET /sse` 端点,认证 JWT
- [matrix.md](../matrix.md) §5 HTTP 接口矩阵列出 `push-gateway (ai02) | SSE | /sse`
- [02-architecture-design.md](../../../services/push-gateway/docs/02-architecture-design.md) §10 明确建议"不支持 SSEWebSocket 已够用,避免协议膨胀"
- 01-understanding.md 完全未提及 SSE
- 实际代码无 `/sse` 实现,`gin-contrib/sse` 仅为 gin 间接依赖
- **建议方案**:采纳 02 文档建议 —— **push-gateway 不提供 SSE仅 WebSocket**。理由:
1. 单一协议降低维护成本与测试矩阵
2. SSE 单向下行 + 文本协议,不适合未来 reconnect/ack 双向协议
3. 各 portal 已规划 WebSocket 接入([coord-cross-review.md](../../coord-cross-review.md)
- **影响方**ai13/ai14/ai15前端需统一走 WebSocket移除 SSE 兜底、ai10msg 不需调 /sse、coord更新 matrix.md §5 与 contract.md
- **状态**:待 coord 仲裁
### ISSUE-002-ai02内部 API 鉴权命名三方不一致
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**:内部 API 鉴权头与环境变量在四处不一致:
- **代码**[handler.go#L30](../../../services/push-gateway/internal/ws/handler.go#L30) + [config.go#L41](../../../services/push-gateway/internal/config/config.go#L41)`X-Internal-Key` 头 + `INTERNAL_API_KEY` 环境变量
- **02 文档** §4.2/§6.1`X-Internal-Token` 头 + `INTERNAL_API_TOKEN` 环境变量
- **ai-allocation.md** §5`X-Internal-Key`
- **president-final-rulings.md** §7.2"X-Internal-Token 重命名"(暗示应改为 Token
- **contract.md** §1.2`内网 mTLS`(第四种方案!)
- **建议方案**:统一为 `X-Internal-Token` + `INTERNAL_API_TOKEN`(对齐总裁裁决 §7.2)。理由:
1. 总裁裁决已明确倾向 Token 命名
2. "Token"语义比"Key"更准确(共享密钥而非公私钥对)
3. mTLS 在 P5 阶段引入成本过高,且 K8s 内网已有 NetworkPolicy 隔离,共享密钥足够
- **影响方**ai10msg 调用方需用相同头名、coord更新 contract.md 与 matrix.md §5 移除 mTLS
- **状态**:待 coord 仲裁
### ISSUE-003-ai02单节点容量目标 50k vs 10w+ 冲突
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**:单节点最大连接数目标在两份文档冲突:
- [modules/push-gateway/README.md](../../../docs/modules/push-gateway/README.md) §7"单节点最大连接数 50k超出时拒绝新连接"
- [02-architecture-design.md](../../../services/push-gateway/docs/02-architecture-design.md) §11"单实例最大连接数 10w+"
- [01-understanding.md](../../../services/push-gateway/docs/01-understanding.md) §5 引用 pending-features"单节点支撑 10w+ 连接"
- **建议方案**:统一为 **10w+**(对齐 02 文档与 pending-features。理由
1. 10w+ 是 P5 设计目标pending-features 权威)
2. Go goroutine-per-connection + 64KB send chan 单连接约 20-30KB10w 连接约 2-3GB单节点可承载
3. 50k 目标过于保守,与横向扩展方案不匹配
- **影响方**coord更新 modules/README.md §7、ai0202 §11 已正确)
- **状态**:待 coord 仲裁
### ISSUE-004-ai02contract.md 内部端点路径 /internal/send vs /internal/push 冲突
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**:内部单推端点路径在 contract.md 与代码/02 文档冲突:
- [contract.md](../contracts/push-gateway_contract.md) §1.2 + §2.4`POST /internal/send`
- **代码**[main.go#L58](../../../services/push-gateway/main.go#L58)+ **02 文档** §4.2`POST /internal/push`
- 总裁裁决 §4.2 已"as-is 采纳 ai02 02 §4.2",即应使用 `/internal/push`
- **建议方案**contract.md 统一改为 `POST /internal/push`(对齐总裁裁决与代码)。此为 ai02 自主回写范畴,不需 coord 仲裁动作,仅在此登记以便 coord 复核。
- **状态**ai02 自行修复(见 contracts 回写)
### ISSUE-005-ai02审计表6 字段)设计缺失
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**[ai-allocation.md](../../ai-allocation.md) §5 将"审计表6 字段)"列为 ai02 设计重点,但:
- 01-understanding.md §2 明确"不持有业务状态""无 DB"
- 02-architecture-design.md §3 明确"无数据库。所有状态在内存 + Redis"
- 两份文档均无审计表设计
- **疑问**:审计表是否要求 push-gateway 引入 MySQL/PostgreSQL这与"无 DB"定位冲突。可能的解读:
1. push-gateway 引入轻量审计表(如 SQLite/Redis Stream 持久化推送记录)
2. 审计表由 msg 服务维护msg 已落库push-gateway 仅通过 Kafka 事件回流
3. ai-allocation 表述过度,审计需求由 msg 满足
- **建议方案**:方案 2审计由 msg 维护push-gateway 仅同步返结果)。理由:保持 push-gateway 无 DB 定位,避免引入持久化层增加运维复杂度。
- **影响方**ai10msg 需确认审计字段是否覆盖 push-gateway 推送结果、coord澄清 ai-allocation §5 表述)
- **状态**:待 coord 仲裁
### ISSUE-006-ai02ISSUE-058 与 ISSUE-055 对 Redis /readyz 失败策略耦合冲突
- **提请方**ai02
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**:两份裁决对 push-gateway /readyz Redis 检查失败的策略存在表述冲突:
- **ISSUE-055**[president §3.3](../../president-final-rulings.md)):将 Redis 列为"必需依赖",失败返 503 触发 Pod 重启
- **ISSUE-058**[president §4.3](../../president-final-rulings.md)"/readyz Redis 检查失败时仅告警不阻塞,与 ISSUE-055 协调,避免雪崩"
- **冲突点**Redis 是 push-gateway 跨实例广播的必需依赖(必需 → 503但实例重启不能恢复 Redis 故障,且重启会丢失本地连接表加剧雪崩(应仅告警)
- **建议方案**:明确为 **Redis 软失败**(仅告警 + `degraded: true` + 返 200从 ISSUE-055 必需依赖列表中移除 push-gateway → Redis。理由
1. push-gateway 重启不解决 Redis 故障
2. Redis 故障时单实例仍能服务本地连接(仅跨实例广播失效)
3. 雪崩风险高于短暂不一致
- **影响方**coord澄清两裁决优先级
- **状态**:待 coord 仲裁
### ISSUE-007-ai0202 文档缺 ADR / 非功能性需求 / 失败模式章节(不符业界架构文档规范)
- **提请方**ai02
- **日期**2026-07-10
- **类型**:工作量超批
- **描述**02-architecture-design.md 不符合业界架构文档规范arc42 / C4 模型):
1. **无 ADR 章节**[modules/push-gateway/README.md](../../../docs/modules/push-gateway/README.md) §8 提到"待 P5 交付时补充 ADR 记录",但 02 文档未落地。关键决策gorilla/websocket 选型、Redis Pub/Sub vs Stream、心跳间隔 30s/60s 选型、10w 容量依据)无 ADR
2. **无非功能性需求章节**:无可用性 SLO如 99.9%)、安全合规、容量 SLA
3. **无失败模式/混沌工程章节**实例崩溃、Redis 故障、网络分区、Kafka 消费积压场景下的降级策略缺失
4. **§11 容量表无依据**10w 连接的内存/CPU/网络带宽估算缺失
- **建议方案**:在批次 4P5补全 02 文档 §14-§17 四个章节ADR / 非功能性需求 / 失败模式 / 容量估算。预估工作量1-1.5 天。
- **影响方**ai02自主补全
- **状态**:待 coord 确认是否纳入 P5 Must Have
---
## §2 已自主修复的文档偏差ai02 直接修复,不需 coord 仲裁)
> 以下为 01-understanding.md 与现码不符的偏差ai02 在批次 0 自主修复
| # | 位置 | 偏差 | 修复方向 |
| - | ---- | ---- | -------- |
| 1 | 01 §3.2 | `/readyz` 标"无(待实现)",实际已实现(仅未检查 Redis | 改为"已实现,仅返连接数,待补 Redis PING" |
| 2 | 01 §3.2 | `/metrics` 标"无(待实现)",实际已挂载 promhttp | 改为"已实现,待补自定义指标" |
| 3 | 01 §3.2 | `/internal/push` `/internal/broadcast` 标"待补鉴权",实际已实现 X-Internal-Key | 改为"已实现 X-Internal-Key 校验DevMode 跳过)" |
| 4 | 01 §6 + §7 | Dockerfile 标"❌ 单阶段",实际为多阶段(缺非 root/healthcheck/ldflags | 改为"⚠️ 多阶段但缺非 root + healthcheck + ldflags" |
| 5 | 01 §7.1 #6 | 引用 `main.go L44-46` 行号过期,鉴权状态错误 | 更新行号并改为"已实现" |
| 6 | 01 全文 | 未提及 SSE 端点contract.md/matrix.md 列出但 02 建议不支持) | 待 ISSUE-001 仲裁后补充结论 |
| 7 | 01 全文 | 未提及审计表ai-allocation §5 设计重点) | 待 ISSUE-005 仲裁后补充 |
---
## §3 历史问题
(暂无)

View File

@@ -1,24 +1,221 @@
# student-bff 问题记录
> 负责人ai04
> 关联:[coord.md](../coord.md)、[contracts/student-bff_contract.md](../contracts/student-bff_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/student-bff_contract.md](../contracts/student-bff_contract.md)、[matrix.md](../matrix.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
> 仲裁依据:[coord-final-decisions.md](../../coord-final-decisions.md) §2 BFF 专项裁决B1-B8、[president-final-rulings.md](../../president-final-rulings.md)
---
## 问题列表
## §0 已有仲裁核查总结2026-07-10 审查)
<!--
追加条目格式:
> 本次审查对历史 issues.md 中 ai04 提请的 4 项问题ISSUE-028/029/030/031-ai04逐一核查总裁裁决落地情况。
### ISSUE-[编号]-[AI标识][标题]
| 编号 | 主题 | 总裁裁决章节 | 裁决要点 | 核查结果 |
| ---- | ---- | ------------ | -------- | -------- |
| ISSUE-028-ai04 | 02 文档与 B1+B2 裁决冲突需回写 | president §3.4 | ai04 须在批次 2 启动前回写 student-bff 02B1 GraphQL + B2 gRPC + B8 DownstreamClient | ⚠️ **未执行**02-architecture-design.md 仍为 REST 设计§4 21 个 REST 端点 / §9.2 REST→GraphQL 演进 / §9.3 HTTP→gRPC 演进),违反 B1、B2 |
| ISSUE-029-ai04 | P3 启动前置依赖确认4 项强阻塞) | president §4.1 / §6.1 | 批次 0 完成信号机制 + 批次 2 启动条件:批次 1 P2.1 完成 + ai03 DownstreamClient 抽象就绪 | ✅ **已裁决**:批次时间线 §6.1 明确批次 2 启动条件;前置依赖检查清单机制已建立 |
| ISSUE-030-ai04 | student-bff GraphQL schema 第一版仲裁时机 | president §2.2 | ai04 起草 schema批次 1 等待期coord 在批次 2 启动前仲裁第一版;存放 `packages/shared-ts/contracts/graphql/student-bff.schema.graphql` | ✅ **已裁决**schema 仲裁机制已建立§2.2);但 schema 第一版尚未起草,需 ai04 在批次 1 等待期产出 |
| ISSUE-031-ai04 | issues.md 编号冲突 | president §0.4 | 保留原始内容不删除,用 `ISSUE-XXX-<提请AI>` 格式唯一定位,不重新编号 | ✅ **已裁决**:编号规则已生效,本文件即按新流程在 objections/ 下维护 |
- **提请方**aiXX
- **日期**YYYY-MM-DD
- **类型**:契约不明确 / 工作量超批 / 前置依赖缺失 / 编号冲突 / 其他
- **描述**[详细描述问题]
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
### 0.1 核查结论
(暂无问题)
- **唯一未落地项**ISSUE-028-ai0402 文档回写。02-architecture-design.md 当前内容与 B1/B2/B8 裁决严重冲突,须在批次 2 启动前完成回写。
- **schema 第一版未起草**ISSUE-030-ai04 虽已建立仲裁机制,但 ai04 尚未产出 student-bff GraphQL schema 草案,需在批次 1 等待期完成。
- **01-understanding.md 同步问题**:阶段 1 文档同样存在 REST 假设与错误码前缀错误(详见 §2需与 02 文档一并修正。
---
## §1 待 coord 仲裁的新问题(本次审查发现)
### ISSUE-STU-001-ai0401-understanding.md 与 B1/B2/B5 裁决冲突
- **提请方**ai04
- **日期**2026-07-10
- **类型**:裁决冲突(文档未回写)
- **描述**:阶段 1 文档 `services/student-bff/docs/01-understanding.md` 存在 3 项与已裁决规则的冲突:
1. **B1 冲突API 风格)**§3.2 暴露 14 个 REST 端点(`/student/dashboard`§4 / §4.1 明确"先对齐 teacher-bff 现状REST + fetch",建议"P3 阶段先 REST后续统一升级 GraphQL"。与 B1"P2 起直接 GraphQL"冲突,属禁止的"中间过渡方案"。
2. **B2 冲突(下游通信)**§3.1 表述"BFF→Service 走 HTTP fetch当前阶段"§4 技术栈"HTTP fetch当前阶段对齐 teacher-bff 模式)"。与 B2"首次实现即 gRPC 调用下游"冲突。
3. **B5 冲突(错误码前缀)**§3.3 / §6 表格用 `STUDENT_BFF_` 前缀。与 B5"统一 BFF_ 前缀BFF_TEACHER_ / BFF_STUDENT_ / BFF_PARENT_"冲突。
- **建议方案**:与 ISSUE-028-ai04 合并处理01 文档随 02 文档一并回写:
- 删除 REST 端点清单,改为 GraphQL Query/Mutation 清单
- 删除"HTTP fetch 对齐 teacher-bff 现状"表述,改为"gRPC 调用下游(@grpc/grpc-js + @bufbuild/protobuf"
- 错误码前缀统一为 `BFF_STUDENT_`
- §7.2"待 coord 仲裁"项中B1/B2/B3/B5/B6/B7 已裁决,删除重复提请
- **状态**:待 coord 确认回写范围(是否 01 文档也纳入回写义务)
### ISSUE-STU-002-ai0402-architecture-design.md 引用不存在的 004 章节
- **提请方**ai04
- **日期**2026-07-10
- **类型**:契约不明确(文档引用错误)
- **描述**02-architecture-design.md 多处引用"004 §11.4 错误码前缀矩阵"和"004 §11.5 统一响应信封 ActionState",但实际 004_architecture_impact_map.md §11 仅包含:
- §11.1 Protobuf 契约体系
- §11.2 契约规则
- §11.3 BFF 聚合模式
- **不存在 §11.4 和 §11.5**
- **影响**:错误码前缀 BFF_STUDENT_ 的权威来源应改为 [coord-final-decisions.md](../../coord-final-decisions.md) G14 + B5ActionState 信封规范应改为 [coord-final-decisions.md](../../coord-final-decisions.md) G8 + F9
- **建议方案**02 文档回写时修正引用源coord 确认是否需要在 004 补充 §11.4/§11.5 章节,或统一指向 coord-final-decisions
- **状态**:待 coord 仲裁
### ISSUE-STU-003-ai0402 文档 §8.3 列 12 项未决决策,其中 8 项已裁决
- **提请方**ai04
- **日期**2026-07-10
- **类型**:裁决冲突(文档未回写)
- **描述**02-architecture-design.md §8.3"未决设计决策(待 coord 仲裁)"列出 12 项,但其中 8 项已被 coord-final-decisions §2 裁决:
| # | 决策点 | 02 文档建议 | 已裁决结论 | 裁决章节 |
| --- | ------ | ----------- | ---------- | -------- |
| 1 | BFF API 风格 | AP3 REST | **B1P2 起直接 GraphQL** | coord-final-decisions §2 B1 |
| 2 | BFF 是否做权限校验 | A不校验 | **B3BFF 豁免 @RequirePermission** | coord-final-decisions §2 B3 |
| 3 | 自我越权防御 | B | **B4全部 BFF 强制自我越权防御** | coord-final-decisions §2 B4 |
| 4 | /readyz 检查逻辑 | AP3 直接 ok | **G2 + §2.4:按阶段扩展探针,必需依赖失败 503可选依赖软失败** | president §2.4 |
| 5 | Kafka 事件订阅时机 | AP3 不订阅) | **B7P2-P4 不订阅 KafkaP5 后订阅** | coord-final-decisions §2 B7 |
| 6 | 缓存策略 | BRedis 5-30s | **B6Redis 5-30s 短缓存** | coord-final-decisions §2 B6 |
| 8 | 错误码前缀 | BFF_STUDENT_ | **B5BFF_STUDENT_** | coord-final-decisions §2 B5 |
| 9 | DownstreamClient 回写 | B回写 | **B8回写 teacher-bff3 个 BFF 统一** | coord-final-decisions §2 B8 |
仅剩 #7(端口 3009#10CQRS 不引入)、#11SSE 实现)、#12(熔断器引入)属合理的设计决策,但 #12 熔断器 president §2.4 已暗示按阶段评估。
- **建议方案**02 文档回写时删除已裁决项的"待仲裁"标注,改为"已裁决(见 coord-final-decisions §2 BX"
- **状态**:待 coord 确认(与 ISSUE-028-ai04 合并处理)
### ISSUE-STU-004-ai04student-bff GraphQL schema 第一版尚未起草
- **提请方**ai04
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**president §2.2 裁决"ai04 起草 student-bff schema批次 1 等待期coord 在批次 2 启动前仲裁第一版"。当前批次 1 已启动2026-07-10ai04 处于批次 1 等待期,但 schema 草案尚未产出。02-architecture-design.md 仍是 REST 设计,未定义 GraphQL Query/Mutation/Type。
- **影响**:阻塞 ai14student-portalP3 启动(依赖 schema 契约);阻塞 coord 批次 2 启动前仲裁
- **建议方案**ai04 在批次 1 等待期优先产出 student-bff GraphQL schema 草案,存放 `packages/shared-ts/contracts/graphql/student-bff.schema.graphql`,提交 coord 仲裁
- **状态**ai04 自行执行(非 coord 仲裁项),记录待办
---
## §2 01-understanding.md 审查详情
### 2.1 准确性问题
| 位置 | 问题 | 严重度 |
| ---- | ---- | ------ |
| §1 通信方式(入/出) | 表述"HTTP REST当前阶段/ HTTP fetch当前阶段",实际 B1/B2 裁决为 GraphQL + gRPC | 高 |
| §3.1 表格 | 列"当前 REST 端点(实际可用)"列,暗示走 REST但 BFF 是新服务不存在"当前 REST 现状" | 高 |
| §3.2 端点表 | 14 个 REST 端点,违反 B1 GraphQL | 高 |
| §3.3 错误码前缀 | `STUDENT_BFF_` 违反 B5 `BFF_STUDENT_` | 中 |
| §4 技术栈 API 风格 | "HTTP REST当前阶段",违反 B1 | 高 |
| §6 权限装饰器 | "⚠️ 不对齐"结论正确B3 豁免),但理由应补充"已裁决 B3" | 低 |
| §7.2 决策点 1-5 | 列为"待 coord 仲裁",但 B1/B2/B3/B5/B6/B7 均已裁决 | 高 |
### 2.2 遗漏项
| 遗漏内容 | 应补充位置 | 依据 |
| -------- | ---------- | ---- |
| GraphQL schema 设计意图Query/Mutation/Type | §3.2 | B1 + president §2.2 |
| gRPC 下游调用设计(@grpc/grpc-js + @bufbuild/protobuf | §3.1 / §4 | B2 |
| DataLoader 防 N+1 策略 | §4 | 004 §11.3 + B1 |
| B4 自我越权防御userId 强制比对) | §2.3 / §3 | B4 |
| B8 DownstreamClient 抽象(复用 teacher-bff | §4 / §6 | B8 |
| GraphQL schema 存放路径 `packages/shared-ts/contracts/graphql/student-bff.schema.graphql` | §3.2 | president §2.2 |
| GraphQL errors 数组 + extensions.code + extensions.traceId 错误格式 | §3.3 | president §2.2 #5 |
| Relay Cursor Connections 分页规范 | §3.2 | president §2.2 #5 |
---
## §3 02-architecture-design.md 审查详情
### 3.1 架构合理性评估
| 维度 | 评估 | 说明 |
| ---- | ---- | ---- |
| 分层设计§1 | ✅ 合理 | Controller → Service → Aggregator → Cache → DownstreamClient 五层清晰DownstreamClient/Aggregator/Transformer 抽象优于 teacher-bff 现状,符合 B8 |
| 领域模型§2 | ✅ 合理 | "场景聚合视图"概念恰当BFF 无领域模型DataScope=SELF 强制实现§2.3)符合 B4 |
| 缓存设计§3 | ✅ 合理 | Redis Key 规范、TTL 分档、失效策略完整,符合 B6 |
| API 设计§4 | ❌ 严重冲突 | 21 个 REST 端点违反 B1 GraphQL须改为 GraphQL Query/Mutation |
| 事件设计§5 | ⚠️ 部分冲突 | 订阅清单合理,但 B7 裁决 P2-P4 不订阅 Kafka§5 应明确"P5 才落地"且标注 B7 |
| 横切关注点§6 | ✅ 合理 | logger/metrics/tracer/health/优雅关闭对齐黄金模板;错误码 BFF_STUDENT_ 正确§0.2 已修正) |
| 契约矩阵§7 | ⚠️ 需更新 | 下游通信"HTTP→gRPC P3+"表述违反 B2应改为"gRPC 首次实现即用" |
| 风险与假设§8 | ⚠️ 需更新 | §8.3 12 项未决决策中 8 项已裁决(见 ISSUE-STU-003 |
| 演进路线§9 | ❌ 严重冲突 | §9.2 REST→GraphQL、§9.3 HTTP→gRPC 违反"不分阶段"原则president §0.3 |
| 扩展点§10 | ✅ 优秀 | 多端适配/国际化/多角色复用/离线模式/AI 增强/学习路径预留设计前瞻 |
| 性能容量§11 | ✅ 合理 | SLO 分级、容量规划、限流策略完整 |
| 安全合规§12 | ✅ 合理 | 身份认证/授权隔离/输入安全/数据合规/审计完整 |
| 可观测性§13 | ✅ 合理 | 日志规范/span/告警/Grafana 面板完整 |
### 3.2 长远性评估
| 长远性维度 | 评估 | 说明 |
| ---------- | ---- | ---- |
| 多角色复用§9.5 | ✅ | 学习委员/课代表/走读生差异化通过视口扩展,无需改代码 |
| 多端适配§10.1 | ✅ | Transformer 层按 x-client-type 裁剪H5/小程序可扩展 |
| GraphQL 演进§9.2 | ❌ | 规划为"P6+ 可选",但 B1 已裁决 GraphQL 是起点非终点,须移除"可选" |
| 通信协议演进§9.3 | ❌ | 规划"P3 HTTP → P4 gRPC 混合 → P6 Service Mesh",违反 B2"首次实现即 gRPC" |
| 推送通道演进§9.4 | ✅ | P3 无推送 → P5 SSE → P5+ WebSocket → P6+ 移动端推送,渐进合理 |
| AI 答疑增强§10.5 | ✅ | 预留 context 参数,支持多步编排 |
| 国际化§10.2 | ✅ | 预留 I18nContext 接入点 |
### 3.3 业界架构文档规范符合度
| 规范项 | 符合度 | 说明 |
| ------ | ------ | ---- |
| 文档导航/导读 | ✅ | §0.3 文档结构清晰16 章覆盖完整 |
| 设计原则 | ✅ | §0.1 列 P1-P9 九项原则 |
| 架构图C4 模型) | ✅ | §1 物理分层图 + 调用链时序图,符合 C4 Level 2/3 |
| ADR 决策记录 | ⚠️ | §8.3 列决策但未用 ADR 格式,且已裁决项未更新 |
| 非功能性需求 | ✅ | §11 性能 SLO + §12 安全 + §13 可观测性 |
| 演进路线 | ⚠️ | 有 §9 但违反"不分阶段"原则 |
| 实施清单 | ✅ | §14 P3-P6 分阶段清单完整 |
| 风险登记 | ✅ | §8.1 技术风险 + §8.2 外部依赖假设 |
### 3.4 关键遗漏
| 遗漏内容 | 应补充位置 | 依据 |
| -------- | ---------- | ---- |
| GraphQL Schema 完整定义Query/Mutation/Type/Enum | 新增 §4.2 或独立 §5 | B1 + president §2.2 |
| DataLoader 批量策略(哪些 Query 需要 DataLoader | §1.2 或 §6 | 004 §11.3 + B1 |
| gRPC client 设计channel 复用、interceptor、metadata 透传) | §1.2 或 §7 | B2 |
| GraphQL errors 数组扩展 ActionState 字段规范 | §6.2 错误码清单 | president §2.2 #3 |
| Relay Cursor Connections 分页规范 | §4 API 设计 | president §2.2 #5 |
| GraphQL schema 存放路径与 codegen 配置 | §14 实施清单 | president §2.2 #4 |
| AuthorizationGuard 接口设计B4 越权防御 P3 实现方式) | §2.3 或 §6 | president §2.9(参照 teacher-bff ISSUE-033-ai03 |
---
## §4 历史问题归档
> 以下问题原记录在 `docs/issues.md`(旧流程),现按新流程归档至此。总裁裁决详见 [president-final-rulings.md](../../president-final-rulings.md) §10 问题索引表。
### ISSUE-028-ai04ai04 02-architecture-design.md 与 coord B1+B2 裁决冲突需回写
- **提请方**ai04student-bff + parent-bff
- **日期**2026-07-09
- **类型**:裁决冲突(文档回写义务)
- **描述**02-architecture-design.md 与 coord-final-decisions B1P2 起直接 GraphQL+ B2首次实现即 gRPC存在 2 项重大冲突§4 API 设计决策为 REST§9.2 演进路线 REST→GraphQL
- **裁决**president §3.4 — ai04 须在批次 2 启动前回写 student-bff 02B1 GraphQL + B2 gRPC + B8 DownstreamClient
- **状态**:⚠️ 未执行(详见 §0 核查)
### ISSUE-029-ai04ai04 P3 启动前置依赖确认4 项强阻塞)
- **提请方**ai04student-bff + parent-bff
- **日期**2026-07-09
- **类型**:前置依赖未就绪
- **描述**P3 启动依赖 4 项强阻塞前置core_edu.proto 补全 / buf.gen.yaml gRPC 插件 / ai03 DownstreamClient 抽象 / ai08 core-edu gRPC server
- **裁决**president §4.1 / §6.1 — 批次 0 完成信号机制 + 批次 2 启动条件明确
- **状态**:✅ 已裁决
### ISSUE-030-ai04ai04⟷ai14 student-bff GraphQL schema 第一版仲裁时机
- **提请方**ai04student-bff + parent-bff
- **日期**2026-07-09
- **类型**:契约不明确
- **描述**student-bff GraphQL schema 第一版仲裁时机未明确
- **裁决**president §2.2 — ai04 起草 schema批次 1 等待期coord 在批次 2 启动前仲裁第一版
- **状态**:✅ 已裁决schema 第一版待 ai04 起草,见 ISSUE-STU-004
### ISSUE-031-ai04issues.md 编号冲突
- **提请方**ai04student-bff + parent-bff
- **日期**2026-07-09
- **类型**:工作归属不明(文档规范)
- **描述**issues.md ISSUE-024/025 编号冲突ai11 与 ai09 重复)
- **裁决**president §0.4 — 保留原始内容,用 `ISSUE-XXX-<提请AI>` 格式定位,不重新编号
- **状态**:✅ 已裁决

View File

@@ -1,12 +1,208 @@
# student-portal 问题记录
> 负责人ai14
> 关联:[coord.md](../coord.md)、[contracts/student-portal_contract.md](../contracts/student-portal_contract.md)
> 关联:[coord.md](../coord.md)、[contracts/student-portal_contract.md](../contracts/student-portal_contract.md)、[matrix.md](../matrix.md)
> 规则AI 遇到问题时在此追加条目coord 仲裁后更新状态
---
## 问题列表
## §1 已有仲裁核查ARB-001 / ARB-002 对 student-portal 的影响)
### 1.1 ARB-001teacher-bff GraphQL schema 第一版)对 student-portal 的影响核查
| 裁决点 | 对 student-portal 的适用性 | ai14 落实方案 | 状态 |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------ |
| Schema 存放位置 | ✅ 适用原则一致。student-bff GraphQL schema 应存放于 `packages/shared-ts/contracts/graphql/student-bff.graphql`(集中管理,与 teacher-bff 同源) | ai14 在 contract.md §1.3 已标注预期路径;实际由 ai04 创建ai14 仅消费 | ⏳ 待 ai04 |
| P2 Query 范围 | ⚠️ 部分参考。ARB-001 是 teacher-bff 的 P2 范围student-portal 起步于 P3不在 P2因此 student-bff 直接以 P3 全量 Query 起步 | ai14 在 P3 直接消费 student-bff 全量 QuerycurrentUser/myClasses/myExams/myHomework/myGrades/myAttendance/studentDashboard | ✅ 已落实 |
| P2 Mutation 范围 | ⚠️ 部分参考。student-portal P3 起步即需要 submitHomework mutation作业提交是 P3 核心场景) | ai14 P3 即消费 submitHomework mutationai04 P3 必须提供 | ⏳ 待 ai04 |
| DataLoader 防 N+1 | ✅ 适用。student-bff 聚合多 gRPC 时(如 studentDashboard 聚合 iam+core-edu+data-ana必须使用 DataLoader | ai14 不直接实现,但依赖 student-bff 返回结构稳定(无 N+1 慢查询) | ⏳ 待 ai04 |
| 复杂度限制depth ≤ 7 | ✅ 适用。student-portal 发起的 GraphQL query 深度必须 ≤ 7 | ai14 在 [02-architecture-design.md §4.2](../../../apps/student-portal/docs/02-architecture-design.md) 已设计扁平 query | ✅ 已落实 |
| ActionState 信封 | ✅ 适用。student-bff 必须返回 ActionState 信封success/errors/data | ai14 在 GraphQL 请求层02 §3.2)已处理信封解包 + 降级字段识别 | ✅ 已落实 |
| 降级模式(方案 B | ✅ 适用。部分聚合失败时 success=true + data 内 `extensions.degraded: true` | ai14 在 [02 §18.2 降级策略矩阵](../../../apps/student-portal/docs/02-architecture-design.md) 已设计 12 个降级场景 | ✅ 已落实 |
| admin 命名空间 | ❌ 不适用。student-portal 不涉及 admin 命名空间 | - | - |
**核查结论**ARB-001 是 teacher-bff 的 P2 仲裁但其设计原则Schema 集中管理、ActionState 信封、降级模式方案 B、复杂度限制适用于所有 BFFstudent-portal 已在 02-architecture-design.md v2 中全面落实。
---
### 1.2 ARB-002MF Shell 暴露清单)对 student-portal 的影响核查
| 裁决点 | 对 student-portal 的适用性 | ai14 落实方案 | 状态 |
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------- |
| Shell 身份 | ✅ 适用。teacher-portal 是 MF Shellstudent-portal 是 P3 首个 Remote | ai14 在 [02 §3.2 MF 配置](../../../apps/student-portal/docs/02-architecture-design.md) 已声明 `remotes: { teacher: 'teacher@http://localhost:4000/_next/static/chunks/remoteEntry.js' }` | ✅ 已落实 |
| P3 首个 Remote | ✅ 适用。ARB-002 §2.3 明确 P3 首个 Remote 是 student-portal | ai14 P3 任务启动即接入 MF Remote | ✅ 已落实 |
| GraphQL client 归属 | ✅ 适用。Shell 暴露 GraphQLProviderstudent-portal 复用,**不重复创建 client** | ai14 在 [02 §3.2 GraphQL 请求层](../../../apps/student-portal/docs/02-architecture-design.md) 已使用 `useGraphQLClient()``@edu/hooks` 获取 | ✅ 已落实 |
| MF shared singleton 配置 | ✅ 适用。student-portal 必须将 react/react-dom/urql/graphql/@edu/* 声明为 singleton | ai14 在 [02 §3.2 next.config.js](../../../apps/student-portal/docs/02-architecture-design.md) 已声明全部 singleton | ✅ 已落实 |
| AppShell 复用 | ✅ 适用。student-portal 不重复实现 AppShell复用 Shell 暴露的 AppShell | ai14 在 02 §3.2 已设计 `<AppShell>` 包裹 + 学生端导航覆写 | ✅ 已落实 |
| useAuth / usePermission 复用 | ✅ 适用。student-portal 复用 Shell 暴露的 useAuth/usePermission | ai14 在 [01-understanding.md §6](../../../apps/student-portal/docs/01-understanding.md) 已声明权限校验走 usePermission | ✅ 已落实 |
| ErrorBoundary / Loading / Empty 复用 | ✅ 适用。student-portal 复用 Shell 暴露的共享 UI 组件 | ai14 在 02 §6 组件设计已使用 `@edu/ui-components` | ✅ 已落实 |
| feature flag | ✅ 适用。`NEXT_PUBLIC_MF_ENABLED` 控制是否走 MFP3 默认 true | ai14 在 02 §3.2 已设计独立壳回退MF 关闭时独立渲染) | ✅ 已落实 |
| 登录页 | ✅ 适用。P2 登录页由 Shell 独占student-portal 不实现登录页,未登录跳转 Shell `/login` | ai14 在 02 §3.2 已设计未认证 → 跳转 `window.location.href = 'http://localhost:4000/login?redirect=student'` | ✅ 已落实 |
**核查结论**ARB-002 是 student-portal 接入 MF 的直接依据ai14 已在 02-architecture-design.md v2 中全面落实。无异议。
---
### 1.3 ARB-001 / ARB-002 核查总结
| 仲裁 | 对 student-portal 的影响 | ai14 落实情况 | 异议 |
| ------ | ------------------------ | ------------- | ---- |
| ARB-001 | 设计原则适用GraphQL + ActionState + 降级模式) | ✅ 已落实 | 无 |
| ARB-002 | 直接适用P3 首个 Remote + Shell 暴露清单) | ✅ 已落实 | 无 |
> **ai14 声明**ARB-001 / ARB-002 已在 02-architecture-design.md v2 中全面落实,无需新增仲裁。
---
## §2 新提请异议(待 coord 仲裁)
### ISSUE-014-01-ai14GraphQL endpoint 路径不一致(`/api/student/graphql` vs `/api/v1/student/graphql`
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- `student-portal_contract.md` §2.3 当前写 `POST /api/student/graphql`(无 `/v1/` 前缀)
- `matrix.md` §5 HTTP 接口矩阵明确写 `api-gateway` 反向代理 `student-portal` 的路径是 `/api/v1/student/*`
- `01-understanding.md` v2 §3.1 和 `02-architecture-design.md` v2 §4.1 已统一为 `POST /api/v1/student/graphql`
- 三处不一致,需要 coord 仲裁统一为 `/api/v1/student/graphql`(与 matrix.md §5 对齐,与 teacher-portal `/api/v1/teacher/graphql` 保持命名一致性)
- **建议方案**
- 统一为 `POST /api/v1/student/graphql`
- 由 ai01api-gateway确认路由`/api/v1/student/*``student-bff:3009/*`(即 `/api/v1/student/graphql``student-bff:3009/graphql`
- 由 ai04student-bff确认 GraphQL endpoint 路径为 `POST /graphql`(与 teacher-bff 一致)
- **状态**:待 coord 仲裁
---
### ISSUE-014-02-ai14student-bff GraphQL schema 文件存放位置不一致(集中管理 vs 应用内管理)
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- ARB-001 §1.3 关键裁决明确teacher-bff GraphQL schema 存放于 `packages/shared-ts/contracts/graphql/teacher-bff.graphql`(集中管理,总裁裁决 §2.17 SDL-first + 集中管理)
- `student-bff_contract.md` §1.3 写:`apps/student-bff/src/schema/*.graphql`(应用内管理,与 ARB-001 原则不一致)
- `matrix.md` §3 GraphQL 接口提供方矩阵写:`packages/shared-ts/contracts/graphql/student-bff.graphql`(与 ARB-001 一致)
- 两处不一致,需要 coord 仲裁统一
- **建议方案**
- 统一为 `packages/shared-ts/contracts/graphql/student-bff.graphql`(与 ARB-001 原则对齐,集中管理便于前端 codegen
- ai14 在 student-portal 端使用 `graphql-codegen` 从该 schema 生成 TypeScript 类型
- 由 ai04student-bff创建该 schema 文件并维护
- **状态**:待 coord 仲裁
---
### ISSUE-014-03-ai14考试作答页全屏策略与防作弊检测边界
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- student-portal 02-architecture-design.md §14 设计了防作弊检测visibilitychange/copy/paste/fullscreen/contextmenu但未明确以下边界
1. **全屏 API 强制策略**是否强制全屏Fullscreen API退出全屏是否触发警告/记录?
2. **离开页面策略**visibilitychange hidden 触发时,是仅记录还是自动提交?
3. **多标签检测**BroadcastChannel 检测到多标签时,是警告还是阻止作答?
4. **防作弊事件上报**:前端采集的防作弊事件如何上报?走 student-bff GraphQL mutation 还是 push-gateway WebSocket
- 这些决策影响 ai04student-bff是否需要提供 `recordExamViolation` mutation以及 ai08core-edu是否需要存储违规记录
- **建议方案**
- **全屏策略**P3 推荐但不强制(提示"建议全屏作答"P4 评估是否升级为强制(基于教师反馈)
- **离开页面策略**visibilitychange hidden 触发时仅记录(不自动提交),累计 3 次警告后教师端可见
- **多标签检测**:警告 + 记录,不阻止作答(避免误伤合法场景如查词典)
- **防作弊事件上报**:走 student-bff GraphQL mutation `recordExamViolation(examId, type, payload)`,由 ai04 在 P3 提供
- **状态**:待 coord 仲裁
---
### ISSUE-014-04-ai14主观题粘贴策略防作弊 vs 学生体验)
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- 02-architecture-design.md §14 防作弊检测包含 `paste` 事件拦截,但学生作答主观题时可能需要粘贴(如从草稿本粘贴长文本)
- 策略不明确:全部禁止粘贴?仅主观题允许?仅客观题禁止?
- 影响学生体验和防作弊效果平衡
- **建议方案**
- **客观题**:禁止粘贴(防作弊优先)
- **主观题(简答/论述)**:允许粘贴,但记录粘贴事件 + 粘贴内容长度,教师端批改时可见
- **作文题**:允许粘贴(学生体验优先),不记录
- 由 ai04student-bff在 P3 提供 `recordPasteEvent` mutation或复用 ISSUE-014-03 的 `recordExamViolation`type=`PASTE`
- **状态**:待 coord 仲裁
---
### ISSUE-014-05-ai14作业附件上传协议GraphQL mutation vs REST multipart
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- 学生提交作业时可能需要上传附件(图片/PDF/文档GraphQL mutation 不适合处理大文件上传multipart/form-data
- 当前 contract.md 未明确附件上传协议
- 选项:
- A. 走 api-gateway REST 端点(`POST /api/v1/student/upload` → 对象存储),返回 URL再走 GraphQL mutation 提交 URL
- B. 走 student-bff GraphQL multipartgraphql-upload需要 ai04 支持)
- C. 走独立上传服务(如 push-gateway 扩展或新建 upload-service
- **建议方案**
- **推荐 A**:走 api-gateway REST `POST /api/v1/student/upload` → 对象存储MinIO/OSS返回 signed URL再走 GraphQL `submitHomework(attachmentUrls: [String!])` mutation 提交
- 理由GraphQL 不适合大文件传输REST + 对象存储是业界通用方案api-gateway 已有 JWT 鉴权
- 由 ai01api-gateway确认是否提供 `/api/v1/student/upload` 路由,由 ai04student-bff确认 `submitHomework` mutation 是否接受 `attachmentUrls` 字段
- **状态**:待 coord 仲裁
---
### ISSUE-014-06-ai14考试延长/题目重排等实时事件命名未确认
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- student-portal 02-architecture-design.md §16 设计了 WebSocket 实时通知,但以下事件命名未在 matrix.md §4 Kafka 事件矩阵中确认:
1. **考试延长**(教师延长考试时间):事件名 `ExamExtended`?还是 `ExamUpdated`?由 ai08core-edu发布
2. **题目重排**(教师重排题目顺序):事件名 `ExamQuestionReordered`?是否需要前端实时重排?
3. **考试强制提交**(教师强制收卷):事件名 `ExamForceSubmitted`?前端收到后立即提交?
- 这些事件影响 student-portal 考试作答页的实时响应逻辑
- **建议方案**
- **考试延长**ai08core-edu发布 `ExamExtended` 事件到 `edu.exam.events` topicmsgai10消费后通过 push-gateway 推送student-portal 收到后更新倒计时
- **题目重排**P3 不实现题目顺序固定P4 评估是否需要实时重排
- **考试强制提交**ai08 发布 `ExamForceSubmitted` 事件student-portal 收到后立即触发提交流程
- 由 ai08core-edu确认事件命名由 ai10msg确认推送路径
- **状态**:待 coord 仲裁
---
### ISSUE-014-07-ai14学生端 DataScope L0 边界(仅能查看自己数据)的强制执行层
- **提请方**ai14
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**
- 01-understanding.md §8 和 02-architecture-design.md §6 声明学生 DataScope L0仅能查看自己数据
- 但强制执行层不明确:
- A. student-bff 在 Resolver 层基于 JWT 的 `x-user-id` 强制过滤(推荐,前端无法绕过)
- B. student-portal 在 GraphQL query 中显式传 `studentId`(不安全,前端可篡改)
- 当前 02-architecture-design.md §4.2 的 GraphQL query 设计中,部分 query 显式传 `studentId`(如 `myClasses(studentId: ID!)`),这与 L0 强制执行矛盾
- **建议方案**
- **统一为方案 A**student-bff 在 Resolver 层从 JWT `x-user-id` 提取 studentId强制过滤前端 query 不传 `studentId` 参数
- ai14 修改 02-architecture-design.md §4.2 的 GraphQL query 定义,移除 `studentId` 参数(如 `myClasses` 改为无参 query
- 由 ai04student-bff确认所有学生端 Query 均从 JWT 提取 studentId不接受前端传入
- **状态**:待 coord 仲裁
---
## §3 异议状态汇总
| 编号 | 类型 | 标题 | 状态 |
| ------------- | ------------ | -------------------------------------------------------- | ------------ |
| ISSUE-014-01 | 契约不明确 | GraphQL endpoint 路径不一致 | 待 coord 仲裁 |
| ISSUE-014-02 | 契约不明确 | student-bff GraphQL schema 存放位置不一致 | 待 coord 仲裁 |
| ISSUE-014-03 | 契约不明确 | 考试作答页全屏策略与防作弊检测边界 | 待 coord 仲裁 |
| ISSUE-014-04 | 契约不明确 | 主观题粘贴策略(防作弊 vs 学生体验) | 待 coord 仲裁 |
| ISSUE-014-05 | 契约不明确 | 作业附件上传协议GraphQL mutation vs REST multipart | 待 coord 仲裁 |
| ISSUE-014-06 | 契约不明确 | 考试延长/题目重排等实时事件命名未确认 | 待 coord 仲裁 |
| ISSUE-014-07 | 契约不明确 | 学生端 DataScope L0 边界的强制执行层 | 待 coord 仲裁 |
---
<!--
追加条目格式:
@@ -20,5 +216,3 @@
- **建议方案**[AI 的建议]
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)

View File

@@ -21,4 +21,38 @@
- **状态**:待 coord 仲裁 / 已裁决(见 coord.md §X
-->
(暂无问题)
### ISSUE-001-ai03admin 命名空间 P2 预留与 ARB-001 "P2 不包含" 冲突
- **提请方**ai03
- **日期**2026-07-10
- **类型**:契约不明确
- **描述**coord.md ARB-001 §1.3 关键裁决表写 "admin 命名空间 | **P2 不包含**P6 admin-portal 阶段新增 `admin` 命名空间";但 president-final-rulings.md §5.1ISSUE-044裁决 "ai03 P2 预留 admin schema 命名空间(如 `admin.*` Query/Mutation",且 §7.3 ai03 工作清单明确 "批次 1P2Must Have 13 项 + DownstreamClient 抽象 + admin schema 命名空间预留"。两处对 P2 admin 命名空间的要求不一致——总裁裁决要求 P2 预留schema 中声明占位coord 仲裁说 P2 不包含。
- **建议方案**:以总裁裁决为准(裁决优先级 president > coord修正 ARB-001 §1.3 为 "P2 预留 admin 命名空间占位schema 中声明 `admin` Query/Mutation 类型骨架,无实际 ResolverP6 admin-portal 阶段实现具体 Resolver"。ai03 在 P2 schema 第一版中预留 `admin` 命名空间类型声明。
- **状态**:待 coord 仲裁
### ISSUE-002-ai03P2 dashboard classes 数据来源与 ARB-001 §1.4 调用链冲突
- **提请方**ai03
- **日期**2026-07-10
- **类型**:前置依赖缺失
- **描述**coord.md ARB-001 §1.4 ai03 执行项第 4 条写 "dashboard Resolver 并行调用 iam3 RPC+ classes1 RPC用 DataLoader 防御 N+1",暗示 P2 dashboard 需 gRPC 调 classes 服务。但存在三重冲突:
1. **classes P2 无 gRPC server**classes.proto 注释 "P1: REST 实现P3 起转 gRPC"matrix.md §2 gRPC 接口提供方矩阵中 core-edu含 classes 合并gRPC 50053 状态为 P3 就绪。classes 服务 P2 阶段未启用 gRPC。
2. **B2 裁决约束**coord-final-decisions.md B2 裁决 "首次实现即 gRPC 调用下游",若 classes P2 无 gRPCteacher-bff 不能用 REST 调 classesB2 禁止 REST 过渡)。
3. **president §3.5 功能范围**president-final-rulings.md §3.5 裁决 P2 实现 "班级列表iam 数据)",即 P2 班级列表数据来自 iam不是 classes 服务。
- **建议方案**:采纳 president §3.5P2 dashboard 的 classes 数据从 iam gRPC 获取iam `GetEffectiveAccess``GetViewports` 返回的关联班级),不调 classes 服务。ARB-001 §1.4 第 4 条修正为 "dashboard Resolver 并行调用 iam gRPCGetUserInfo + GetViewports + GetEffectiveAccessclasses 列表从 iam 返回数据推导P3 core-edu gRPC 就绪后切换为 `GetClassesByTeacher` RPC"。这样 P2 不依赖 classes gRPC与 B2 + president §3.5 一致。
- **状态**:待 coord 仲裁
### ISSUE-003-ai03GraphQL schema 文件命名不一致ARB-001 vs president §2.17
- **提请方**ai03
- **日期**2026-07-10
- **类型**:编号冲突
- **描述**GraphQL schema 文件存放目录两处一致(`packages/shared-ts/contracts/graphql/`),但文件名不一致:
- coord.md ARB-001 §1.3 + §1.4`teacher-bff.graphql`
- president-final-rulings.md §2.17 第 1 条:`teacher-bff.schema.graphql`
ai03 创建文件时无法确定用哪个文件名。
- **建议方案**:以 president §2.17 为准(裁决优先级 president > coord统一为 `teacher-bff.schema.graphql`。coord 修正 ARB-001 §1.3/§1.4 文件名。
- **状态**:待 coord 仲裁
---

View File

@@ -155,6 +155,31 @@
---
### ISSUE-042-ai13仲裁核查 - 01/02 文档未同步已裁决的 GraphQL 架构
- **提请方**ai13
- **日期**2026-07-10
- **类型**:文档同步遗漏(仲裁核查)
- **阶段**P2
- **描述**
- 按"对已有仲裁进行核查"要求,审查 ISSUE-036~041均已裁决在文档中的落地情况
- 核查发现:`apps/teacher-portal/docs/01-understanding.md``02-architecture-design.md` 仍为 ai07 标识 + REST 架构,**未同步**以下已裁决事项:
- F9ISSUE-036P2 起 all-in GraphQL无 REST 过渡 — 01 §1/§3.1 仍写"P2-P3 用 REST 过渡"02 全文基于 RESTApiClient/TanStack Query/契约清单)
- ARB-001ISSUE-037teacher-bff GraphQL schema 第一版 5 Query — 01 §3.1 列 REST 端点02 §4/§10 全 REST
- ARB-002ISSUE-038/039MF Shell 暴露清单GraphQLProvider + hooks + UI 组件 + urql/graphql singleton— 01 未提02 §1.2 exposes 仅 AppShell+shared-deps、P2 配 3 remotes、shared 无 urql
- 总裁 §2.17ISSUE-038GraphQL client 单例方案 A — 02 §11.3.2 仍列"GraphQL vs REST"未决(已裁决)
- 对照已回写的 `03-long-term-architecture.md §1.4`GraphQL 最终方案01/02 严重滞后
- **建议方案**
1. 01-understanding.mdai07→ai13§1 删除 REST 过渡§3.1 REST 端点→GraphQL queriesARB-001§4 技术栈补 urql补 ARB-002 暴露清单
2. 02-architecture-design.mdai07→ai13全文 REST→GraphQL 重写MF 配置对齐 ARB-002API 层改 urql client契约清单改 GraphQL§11.3 未决决策改已决策)
- **状态**:✅ 已回写闭合2026-07-10审查批次
- **coord 裁决**:无需新裁决(复用 ISSUE-036~040 已有裁决),本次为文档同步执行
- **回写执行**
- `01-understanding.md`:已修正 ai07→ai13、§1 REST→GraphQL、§3.1 REST 端点→GraphQL queriesARB-001、§4 补 urql/GraphQL client 技术栈、补 ARB-002 暴露清单、端口对齐、字体令牌描述
- `02-architecture-design.md`:全量重写为 GraphQL 架构§1 MF 图加 GraphQLProvider 层§1.2 MF 配置对齐 ARB-002 exposes/shared/remotes=0§2 领域模型数据源改 GraphQL Query§3 缓存层改 urql cacheExchange§4 API 设计改 urql client 单例 + ARB-001 Query/Mutation§10 契约清单改 GraphQL§11.3 未决决策改已决策表;端口 3000→4000
---
**AI Agent**: ai13teacher-portal
**Branch**: feat/teacher-portal-issues-migrate-ai13
**Coordinator**: coord-ai