Files
Edu/docs/architecture/president-final-rulings.md
SpecialX faaaf29f67 docs: ai 协作文档体系重构与多 ai 仲裁结果落地
1.AI 协作文档体系重构(objections/worklines/contracts+matrix.md)

2.coord 仲裁文档(final-decisions/cross-review/final-rulings/orchestration)

3.各服务 01/02 文档补全

4.共享包初始化(shared-ts/shared-go/hooks/ui-components/ui-tokens)

5.Proto 契约补全

6.004 架构影响地图更新

7.端口分配表

8.设计规格文档
2026-07-10 12:58:22 +08:00

69 KiB
Raw Blame History

总裁最终裁决President Final Rulings

版本1.0 日期2026-07-09 决策者:总裁(用户) 执行者coord统一落实 适用范围Edu 微服务架构全部 16 个 AIai01-ai16+ coord 维护的 shared-* 包与文档 关联文档:


0. 裁决原则

0.1 总裁授权范围

本文件是用户作为总裁对全部已汇总问题ISSUE-001 ~ ISSUE-066含编号冲突最终裁决,覆盖:

  1. coord-final-decisions.md 80+ 项裁决的最终确认(无推翻)
  2. ai-work-orchestration.md 6 批次时间线的最终调整
  3. issues.md 70+ 问题的逐个裁决(状态全部转为"总裁已裁决"
  4. 文档同步遗漏的修复指令
  5. 编号冲突的整理规则
  6. 各 AI 工作内容的最终边界

0.2 裁决优先级

裁决按以下优先级分组AI 执行时按优先级处理:

  • P0 立即执行:文档同步遗漏修复 + 编号冲突整理
  • P1 批次 0 启动前完成:设计契约明确 + 工具包产出
  • P2 各批次启动前完成:文档回写 + 工作量分级
  • P3 各阶段执行中持续:跨阶段扩展例外执行

0.3 "不分阶段"与"批次"的最终澄清

针对 ISSUE-021ai08/ ISSUE-015 §0.1ai15表述歧义问题总裁最终澄清

概念 适用层级 含义 禁止事项
不分阶段 代码实现层面 服务首次落地即采用最终方案,禁止"前期简化版后期重构" 禁止 P2 写 REST 后期切 GraphQL禁止 P2 mock 数据后期接真实 gRPC
批次 工作排序层面 因服务依赖需串行启动(下游未就绪时上游无法启动) 批次时间线允许调整,但不得作为"先简化后重构"的借口
跨阶段扩展例外 唯一允许的"分阶段"场景 BFF /readyz 探针列表 / Dashboard Resolver 字段填充 / AuthorizationGuard 内部实现允许按阶段扩展 见 §2.3 详细验收标准

核心规则:批次规划保证下游就绪后再启动上游;不分阶段保证每个服务首次实现即最终方案。两者不冲突。

0.4 编号冲突整理规则ISSUE-031/035 处理)

针对 issues.md 严重的编号冲突ISSUE-024/025 ai11 与 ai09 重复 / ISSUE-028030 ai04 与 ai11 重复 / ISSUE-031 ai04 与 ai15 重复 / ISSUE-032035 ai03 与 ai15 重复 / ISSUE-036 ai03 与 ai13 重复 / ISSUE-044~048 ai16 与 ai06 重复),总裁裁决:

  1. 保留所有 issues 原始内容不删除(避免信息丢失)
  2. 不再重新编号(重编号工作量大,且 AI 已在文档中引用现有编号)
  3. 在本文件 §10 问题索引表中统一映射,每个 issue 用 ISSUE-XXX-<提请AI> 格式唯一定位(如 ISSUE-024-ai11 / ISSUE-024-ai09
  4. coord 在 issues.md §0.5 添加索引指针指向本文件AI 查询时先看本文件索引表

1. P0 立即修复:文档同步遗漏

1.1 port-allocation.md §5 iam 行修正ISSUE-001/015

裁决:修正 port-allocation.md §5行 77 附近iam 行:

  • 修改前:IamServiceP3 启用) | P3
  • 修改后:IamServiceP2 启用I1 裁决) | P2

理由:对齐 coord-final-decisions.md I1 裁决iam P2 即启用 gRPC server 50052+ port-allocation.md §3 已修正的内容。

执行者coord 完成期限:本裁决发布后立即

1.2 004 §4.2 gRPC 启用矩阵修正ISSUE-003

裁决:修正 004 §4.2 gRPC 启用阶段矩阵iam 行从"P3 启用"改为"P2 启用"。

理由:对齐 I1 裁决。

执行者coord 完成期限:本裁决发布后立即

1.3 004 §16.7.4 P4 清单补 QuestionServiceISSUE-016

裁决004 §16.7.4 P4 启动前整改清单补充 content QuestionService

  • 修改前:仅列"ChapterService / TextbookService.ListTextbooks"
  • 修改后:补充"+ QuestionServiceN3 裁决P4 即补全,不等到 P5"

理由:对齐 coord-final-decisions.md N3 裁决QuestionService proto P4 即补全)。

执行者coord 完成期限:本裁决发布后立即

1.4 004 §16.7.5 P5 清单删 QuestionServiceISSUE-016

裁决004 §16.7.5 P5 启动前整改清单删除"ai09 content 补 QuestionService RPC阻塞 ai 出题)"项。

理由QuestionService 已在 P4 补全P5 不再重复。

执行者coord 完成期限:本裁决发布后立即

1.5 004 §7.2 Kafka topic 表格修订ISSUE-043/053

裁决:修订 004 §7.2 Kafka topic 路由表:

  • 删除:| edu.notification.events | 通知事件 | Msg | push-gateway |
  • 新增 3 行:
| edu.notification.sent     | 通知发送 | Msg | push-gateway、DataAna |
| edu.notification.read     | 通知已读 | Msg | DataAna              |
| edu.notification.recalled | 通知撤回 | Msg | DataAna              |
| edu.notification.requested | 通知投递请求 | Msg | push-gateway       |
  • 在表格下方追加注释:"本表已对齐 §16.3.2 + G16 裁决,禁止抽象名 edu.*.events"

理由:对齐 G16 裁决topic 命名统一 edu.<domain>.<aggregate>.<action>,禁止抽象名)+ ai10 msg 02 §5 已设计的具体动作名 + ai02 push-gateway 消费 edu.notification.requestedISSUE-053

执行者coord 完成期限:本裁决发布后立即

1.6 coord-final-decisions.md + ai-work-orchestration.md 相对路径修正ISSUE-031-ai15

裁决:修正两份文档 L7 关联文档引用:

  • coord-final-decisions.md L7[ai-allocation.md](./architecture/ai-allocation.md)[ai-allocation.md](./ai-allocation.md)
  • ai-work-orchestration.md L7[ai-allocation.md](./architecture/ai-allocation.md)[ai-allocation.md](./ai-allocation.md)

理由:两份文档自身位于 docs/architecture/ 目录下,引用 ./architecture/ai-allocation.md 会多一层路径。

执行者coord 完成期限:本裁决发布后立即

1.7 issues.md §0.5 添加总裁裁决索引指针

裁决:在 issues.md §0.4 之后新增 §0.5

### 0.5 总裁最终裁决索引

> 所有 ISSUE-001 ~ ISSUE-066 的"coord 裁决"字段已由总裁最终裁决覆盖。
> 查询裁决结果请先查阅 [president-final-rulings.md](./architecture/president-final-rulings.md)。
> 本文件保留所有 issues 原始内容作为问题追溯,编号冲突通过 `ISSUE-XXX-<提请AI>` 格式唯一定位(见 president-final-rulings.md §10

执行者coord 完成期限:本裁决发布后立即


2. P1 批次 0 启动前完成:设计契约明确

2.1 shared-ts Outbox 工具包设计ISSUE-018/050

裁决coord 在批次 0.4 完成 packages/shared-ts/src/outbox/ 设计草案,包含:

  1. 包名@edu/shared-ts/outbox
  2. 导出 API
// 1. OutboxModuleNestJS Module 注入)
export class OutboxModule {
  static forRoot(config: OutboxConfig): DynamicModule;
}

// 2. OutboxService发布接口
export class OutboxService {
  publish(
    eventType: string,
    payload: unknown,
    options?: PublishOptions,
  ): Promise<string>;
  // 返回 outbox record id
}

// 3. OutboxRelayWorker内置 Relay Worker可注入
export class OutboxRelayWorker {
  start(): void;
  stop(): Promise<void>;
}
  1. 配置项
interface OutboxConfig {
  tableName: string; // 各服务可配,默认 'outbox_events'
  kafkaTopic: string; // 各服务可配
  pollIntervalMs: number; // 默认 1000
  batchSize: number; // 默认 100
  maxRetryCount: number; // 默认 5
  retryBackoffMs: number; // 默认 1000指数退避
}
  1. 表 schemaDrizzle migration各服务执行
CREATE TABLE outbox_events (
  id VARCHAR(32) PRIMARY KEY,           -- cuid2
  event_type VARCHAR(64) NOT NULL,
  payload JSON NOT NULL,
  status VARCHAR(16) DEFAULT 'pending', -- pending / published / failed
  retry_count INT DEFAULT 0,
  last_error TEXT,
  created_at TIMESTAMP DEFAULT NOW(),
  published_at TIMESTAMP
);
CREATE INDEX idx_outbox_status_created ON outbox_events(status, created_at);
  1. 集成方式NestJS Module 注入(@Module({ imports: [OutboxModule.forRoot(config)] })
  2. 是否含 Kafka producer内置iam 仅配置 topic
  3. ORM 支持:仅支持 Drizzle ORM对齐黄金模板
  4. 事务边界:业务表 + outbox 表同事务Drizzle 事务 API示例
await db.transaction(async (tx) => {
  await tx.insert(users).values(newUser);
  await outboxService.publish("user.created", { userId: newUser.id }, { tx });
});

理由iam 首次接入方需求迫切I2 裁决core-edu / content / msg 后续接入保持一致。

执行者coord 完成期限:批次 0.4(批次 1 启动前)

2.2 GraphQL schema 仲裁机制ISSUE-019/030/037

裁决:建立 GraphQL schema 仲裁规范:

  1. 存放位置packages/shared-ts/contracts/graphql/

    • teacher-bff.schema.graphqlai03 定义coord 仲裁)
    • student-bff.schema.graphqlai04 定义coord 仲裁)
    • parent-bff.schema.graphqlai05 定义coord 仲裁)
    • admin.schema.graphqladmin 命名空间,复用 teacher-bff schema见 §5.1
  2. 起草方:各 BFF 负责 AI 起草coord 仲裁

    • teacher-bffai03 起草coord 在批次 1 启动前仲裁第一版
    • student-bffai04 起草(批次 1 等待期coord 在批次 2 启动前仲裁第一版
    • parent-bffai05 起草(批次 2 等待期coord 在批次 3 启动前仲裁第一版
  3. 覆盖范围

    • Query/Mutation 清单(含字段定义 + 类型 + 分页规范)
    • 权限点标注F7 规范,注释形式 # @permission: DASHBOARD_VIEW
    • DataScope 标注(注释形式 # @dataScope: OWN/CHILD/CLASS
    • 错误响应格式GraphQL errors 数组扩展 ActionState 字段,extensions.code = BFF_*
  4. 版本管理SDL-firstschema.graphql 文件),配合 graphql-codegen 生成 TS 类型

  5. 命名规范

    • Query/MutationcamelCaseteacherDashboard / listClassesByTeacher
    • 分页Relay Cursor Connections 规范({ edges, pageInfo, totalCount }
    • 错误GraphQL errors 数组 + extensions.code + extensions.traceId
  6. 协调流程

    • BFF AI 起草 schema 草案 → coord 仲裁第一版 → 前端 AI 消费
    • schema 变更需 PR + BFF AI + 前端 AI 双方 review
    • 重大变更(删除字段 / 修改类型)需 coord 仲裁

理由ai03 / ai04 / ai05 / ai13 / ai14 / ai15 均依赖 schema 仲裁,需统一机制。

执行者coord仲裁+ 各 BFF AI起草+ 各前端 AI消费 完成期限

  • teacher-bff schema 第一版:批次 1 启动前
  • student-bff schema 第一版:批次 2 启动前
  • parent-bff schema 第一版:批次 3 启动前

2.3 BFF 跨阶段扩展例外验收标准ISSUE-020

裁决:明确"跨阶段扩展例外"的允许范围:

允许扩展

  1. 新增下游 gRPC 调用(新增 RPC 方法到 DownstreamClient
  2. 新增下游配置gRPC endpoint 配置)
  3. 新增 /readyz 探针(按阶段启用,见 §2.4
  4. Dashboard Query Resolver 内部数据源扩展null 字段 → 真实数据)
  5. AuthorizationGuard 内部实现替换DEV_MODE 放行 → 真实 gRPC 校验)

禁止变更

  1. 修改已有 RPC 调用的签名或返回类型
  2. 删除已实现的 RPC 调用(除非下游服务下线)
  3. 修改 GraphQL schema 已有字段的类型(新增字段允许)
  4. 修改 /readyz 已有探针的检查项(只能新增,不能修改)

验收标准

  1. 扩展时必须更新 BFF 的 02-architecture-design.md 下游调用矩阵
  2. 扩展时必须更新 packages/shared-ts/contracts/graphql/ 下对应 schema 文件
  3. 扩展时必须运行 pnpm run arch:scan 更新 arch.db
  4. coord 在批次验收时检查上述 3 项

理由ai03 / ai04 / ai05 跨阶段扩展时需统一标准。

执行者:各 BFF AI 执行coord 验收

2.4 /readyz 探针按阶段扩展规则ISSUE-023/034/042/055

裁决G2 裁决"首次实现即检查全部下游依赖"按以下规则执行:

  1. 探针列表按阶段扩展(属"跨阶段扩展例外"

    • P2 teacher-bff /readyzDB + Redis + iam gRPC 500523 项)
    • P3 teacher-bff+ core-edu gRPC 500534 项)
    • P4 teacher-bff+ content gRPC 50054 + data-ana gRPC 500556 项)
    • P5 teacher-bff+ ai gRPC 50058 + msg gRPC 500568 项)
  2. 实现方式DownstreamHealthCheck 注册表模式,每个下游注册独立探针,按阶段启用

  3. 可选依赖软失败规则(针对 ISSUE-042/055

    • 必需依赖DB / Redis / 已启用 gRPC 下游):失败返回 503触发 Pod 重启
    • 可选依赖Kafka 消费 / PushGateway / 未启用 gRPC 下游):失败仅告警,返回 200 + body degraded: true
    • msg /readyz 对 PushGateway软失败ISSUE-042 采纳方案 A
    • push-gateway /readyz 对 Kafka软失败ISSUE-055
  4. 未引入依赖跳过ISSUE-023

    • content P4 /readyz检查 MySQL + Neo4j + Kafka3 项ES 未配置则跳过)
    • content P5 /readyz扩展 ES 检查4 项ES_URL 存在时才检查)
    • 实现方式:检查项数组通过 ENV 过滤(if (env.ES_URL) checks.push(checkES)
  5. 分级检查ISSUE-029

    • data-ana /readyz 对 iam gRPC
      • L1 ping iam 50052 端口可达(基础就绪,失败 ready=false
      • L2 调用 GetEffectiveDataScope 返回有效(深度就绪,失败 degraded=true

理由G2 原裁决"全部下游依赖"在 P2 不可行,需按阶段扩展 + 软失败策略。

执行者:各 AI 按规则实现

2.5 AttendanceService proto 责任方ISSUE-022

裁决

  1. coord 负责 proto 契约定义core_edu.proto 补 AttendanceService + GetClassesByTeacher + BatchGetClasses 的 message + RPC 签名
  2. ai08 负责 proto 实现:基于 coord 定义的 proto 生成 TS 代码 + 实现 AttendanceService 业务逻辑
  3. 修正 coord-cross-review.md §6 #14:责任方从 ai03 改为 coordproto+ ai08实现
  4. 修正 004 §16.7.3:保留 ai08 实现,但补注"proto 契约由 coord 定义"

理由proto 契约是跨服务协作的接口,应由 coord 统一维护;业务实现由服务负责 AI 完成。

执行者coordproto+ ai08实现 完成期限proto 在批次 0.8 完成,实现 ai08 P3 完成

2.6 降级模式 ActionState 表达ISSUE-030-ai11

裁决:采纳方案 Bsuccess=true + error=null + data 内 degraded 字段):

// 降级响应
{
  success: true,
  data: {
    ...actualData,
    degraded: true,           // 降级标记
    degradedReason: "redis_unavailable"  // 降级原因
  },
  error: null
}

规则

  1. 降级时 success=trueHTTP 200
  2. data 内统一加 degraded: boolean + degradedReason: string 字段
  3. BFF 消费端检查 data.degraded 判断降级
  4. Python 服务data-ana / ai的 data 类型需统一加 degraded 字段
  5. 修正 data-ana 02-architecture-design.md §4.3 ActionState.ok() 实现

理由:方案 B 最符合"成功返回数据但质量降级"的语义,避免"success=true 但 error 有值"的语义矛盾。

执行者ai11data-ana+ ai12ai实现coord 验收

2.7 BFF 错误码语义区分ISSUE-059

裁决:采纳 ai03 建议方案,明确 3 类 BFF 越权防御错误码:

错误码 HTTP 场景 i18n key
BFF_TEACHER_UNAUTHORIZED 401 x-user-id 缺失或无效 error.bffTeacher.unauthorized
BFF_TEACHER_FORBIDDEN_RESOURCE 403 teacherId 与资源无归属关系(场景 A error.bffTeacher.forbidden_resource
BFF_TEACHER_IDENTITY_MISMATCH 403 JWT teacherId 与请求 body teacherId 不一致(场景 B error.bffTeacher.identity_mismatch

B3 裁决澄清BFF 豁免 @RequirePermission 指不做"功能权限决策"(如"能否查看仪表盘"),但必须做"数据权限防御"(如"只能看自己的班级")。

student-bff / parent-bff 同规则BFF_STUDENT_* / BFF_PARENT_* 前缀对应。

执行者ai03 / ai04 / ai05 实现

2.8 Dashboard Query Resolver P2 实现方式ISSUE-032

裁决:采纳 ai03 建议方案:

  1. GraphQL schema 设计完整(含全部 Query/Mutation 字段定义P2 即定型,后续不重构
  2. Resolver 实现P2 阶段 Dashboard Query Resolver 内部仅调 iam gRPC返回用户基础信息 + 角色),未启用的下游字段(班级数 / 作业数等)返回 null + extensions.warning = "field_unavailable_in_p2"
  3. P3-P5 扩展:按"跨阶段扩展例外"原则,在 Resolver 内逐步补 gRPC 调用,将 null 字段替换为真实数据
  4. ai13 前端P2 联调时对 null 字段做 UI 降级展示(如"数据加载中"或隐藏模块)
  5. 此方案不违反"不分阶段"schema 即最终方案Resolver 内部数据源扩展属"跨阶段扩展例外"

执行者ai03 实现 + ai13 前端配合

2.9 越权防御 P2 实现方式ISSUE-033

裁决:采纳 ai03 建议方案 D

  1. P2 抽象 AuthorizationGuard 接口(canAccessClass(userId, classId): Promise<boolean>
  2. P2 内部实现为"DEV_MODE 放行 + 生产拒绝"(保守策略)
  3. Redis 缓存P3 接入 core-edu gRPC 后,GetClassesByTeacher 结果缓存到 Rediskey: authz:teacher:{teacherId}:classesTTL 5minAuthorizationGuard 优先查缓存
  4. 此方案不违反"不分阶段"Guard 接口即最终方案P2→P3 仅替换内部实现(属"跨阶段扩展例外"

P2 阶段生产环境Guard 全部拒绝时teacher-bff P2 端到端验证仅限 DEV_MODE。生产环境 P2 不接入流量(仅 dev 测试P3 接入真实校验后正式上线。

执行者ai03 实现

2.10 analytics.proto 补全时间ISSUE-027

裁决

  1. coord 在批次 0.11 完成 analytics.proto 扩展4 端 Dashboard + Warning + MasteryDistribution + SubscribeMasteryUpdate Stream RPC
  2. ai11 在批次 3P4启动前确认 proto 已就绪
  3. ai11 等待期间可先实现 HTTP 端点 + CDC 消费者 + ClickHouse DDL 等不依赖 proto 的工作

执行者coord 完成期限:批次 0.11(批次 3 启动前)

2.11 warning.triggered topic 处理ISSUE-028-ai11

裁决:采纳方案 B复用 topic

  1. 维持现状,warning.triggered 复用 edu.insight.mastery.updated topic
  2. events.proto MasteryEvent 用 action 字段区分 mastery.updated / warning.triggered
  3. consumer 按 action 字段路由
  4. D5 描述修正为"复用 mastery.updated topic非独立登记"
  5. 004 §7.2 表格补充注释:"warning.triggered 复用 edu.insight.mastery.updated topic通过 action 字段区分"

理由:避免拆分为两个 message 增加复杂度,复用 topic + action 字段路由是 Kafka 常见模式。

执行者coord 修订 004 §7.2 + D5 描述

2.12 ClickHouse DDL 归属ISSUE-026

裁决

  1. ai11 提供 DDL 内容(已在 02 文档 §3 设计完毕)
  2. coord 授权 ai11 在 infra/clickhouse/ddl/ 下创建纯 DDL .sql 文件(不涉及部署脚本)
  3. SRE AI 负责部署执行脚本(如 init-clickhouse.sh
  4. 修正 project_rules §14.2 解释:业务 AI 可创建纯 DDL 文件不涉及部署脚本SRE AI 负责部署执行

理由DDL 内容是业务特定的5 张宽表设计),由 ai11 提供最合适;部署脚本属 infra 范畴。

执行者ai11DDL+ SRE AI部署

2.13 Neo4j 知识图谱派生数据裁决ISSUE-025-ai09

裁决Neo4j 知识图谱属于"派生数据读模型"

  1. Neo4j 节点数据完全从 MySQL 的 knowledge_points / kp_prerequisites 表派生
  2. Neo4j 是读模型图查询优化MySQL 是写模型(权威源)
  3. 符合 CQRS 读写分离原则
  4. 实现方式content 主领域事件走 Outbox → KafkaNeo4j Sync Worker 作为 Kafka consumer 消费这些事件并同步图谱(无需独立 Outbox

理由:采纳 ai09 建议方案,符合 004 §12.2 派生数据事件豁免 Outbox 模式。

执行者ai09 实现

2.14 ES Projector 实现位置ISSUE-024-ai09

裁决:采纳方案 Acontent 内部实现):

  1. ES Projector 在 content 服务内部实现(shared/sync/es-sync.worker.ts
  2. 与 Neo4j Sync Worker 同构(一对 Sync Worker 模式)
  3. shared-ts 仅承载通用的 Outbox PublisherKafka producer 通用能力),特定 Projector 由各服务自实现
  4. ES mapping 是 content 特有的questions/knowledge_points 索引结构、ik_max_word 分词、dense_vector embedding通用 Projector 难以抽象

执行者ai09 实现P5 阶段)

2.15 API 版本化 /iam/v1/* 规则ISSUE-048

裁决

  1. 全服务统一加 /v1 前缀(不只是 iam各服务按自身节奏推进iam P2 / core-edu P3 / content P4 / msg P5
  2. 前缀位置Controller 内加 v1 前缀NestJS @Controller('v1/iam/auth')
  3. Gateway 透传Gateway 路由 /iam/v1/* → iam 服务 /v1/iam/*Gateway 不改路径,直接透传)
  4. 避免双 v1Controller 加 /v1Gateway 转发路径不含 /v1Gateway 仅做路径匹配 + 代理)
  5. 现有端点立即迁移:不保留旧路径(遵循"不分阶段"原则P1 链路由 ai01 + ai06 同步修复)
  6. gateway 路由配置同步更新ai01 P2 工作项)

理由:采纳 ai06 建议方案,统一规则避免各 AI 自行理解。

执行者:各服务 AI 实现 + ai01 Gateway 配置

2.16 gRPC 与 REST 双入口策略ISSUE-049

裁决

  1. 双入口策略REST 供 gateway 透传 + 前端直连admin-portalgRPC 供 BFF 聚合调用
  2. NestJS 复用:同一 Application Service 同时被 REST Controller + gRPC Controller 调用,业务逻辑不重复
  3. gateway 保持 HTTP 透传gateway 不改为 gRPC 客户端(降低 P2 工作量gateway → iam REST 路径不变
  4. BFF gRPC 调 iamteacher-bff / student-bff / parent-bff 用 gRPC 调 iamB2 裁决)
  5. 写入 coord-final-decisions.md I1 补充条款

理由:采纳 ai06 建议方案,避免 gateway 改为 gRPC 客户端的额外工作量。

执行者ai06 实现 + ai01 Gateway

2.17 MF AppShell GraphQL client 单例ISSUE-038/047

裁决:采纳方案 AShell 暴露 GraphQL client 单例):

  1. Shell 暴露 GraphQLProviderai13 P2 teacher-portal MF shell 的 AppShell 包含 <GraphQLProvider client={sharedClient}>
  2. 统一缓存:避免跨 Remote 数据不一致
  3. 统一鉴权 header 注入Authorization: Bearer token
  4. 统一错误处理401 跳转登录、5xx 降级
  5. MF shared 配置react / urql / apollo 设为 singleton避免多实例
  6. admin-portal 复用ISSUE-047ai16 admin-portal 作为 MF Remote 接入 teacher-portal Shell复用 Shell 暴露的 GraphQL client 单例
  7. ai16 回写 02 文档 §4.1:将"复用 ApiClient (REST)"改为"复用 Shell 暴露的 GraphQL client 单例"
  8. coord 在批次 1 启动前仲裁 MF shell 暴露清单(增加 GraphQL client 项)

理由:统一缓存 + 鉴权 + 错误处理,避免各 Remote 自行初始化导致数据不一致。

执行者ai13 实现 + ai14/ai15/ai16 消费

2.18 ai13 packages 建立时机ISSUE-039

裁决

  1. ai13 在 P2 启动前(批次 0 末或批次 1 初)建立 3 个 packages 骨架
    • packages/ui-tokens(设计令牌,无依赖)
    • packages/ui-components(依赖 ui-tokens
    • packages/hooks(依赖 ui-components
  2. 4 个 portal 统一消费,版本通过 pnpm workspace 协议("workspace:*"
  3. ai13 完成后通知 ai14/ai15/ai16 消费
  4. coord 在批次 1 验收 ai13 时检查 packages 已建立
  5. 批次 0 增加 0.15 任务"ai13 建立 packages/ui-tokens + ui-components + hooks 骨架"

执行者ai13 完成期限:批次 0.15(批次 1 启动前)

2.19 shared-go 包建立ISSUE-054

裁决

  1. coord 在批次 0 增加 0.14 任务"建立 packages/shared-go 包骨架(含 tracer/logger/jwks/env 4 个模块的接口定义 + 默认实现)"
  2. ai01 / ai02 在 P2/P5 启动时直接 import packages/shared-go,禁止各自维护副本
  3. shared-go 包版本管理:通过 go.workspace 引用,对齐 project_rules §11
  4. 后续提取候选circuit-breaker.go / rate-limiter.go若 ai01 P2 实现后 ai02 P5 复用)

执行者coord 完成期限:批次 0.14(批次 1 启动前)


3. P2 各批次启动前完成:文档回写与工作量分级

3.1 ai03 P2 工作量分级ISSUE-036

裁决:采纳 ai03 建议方案,明确 P2 最小交付范围:

Must HaveP2 必须完成)

  1. GraphQL endpoint + schema 第一版(阻塞 ai13
  2. DownstreamClient 抽象 + iam gRPC阻塞 ai04/ai05
  3. AuthMiddleware 越权防御抽象B4 + ISSUE-033
  4. /readyz 探针注册表 + iam 探针G2 + ISSUE-034
  5. /healthz livenessG3
  6. pino 结构化日志G4
  7. GlobalErrorFilter + ActionState 信封G8
  8. BFF_TEACHER_ 错误码前缀B5 + G14 + ISSUE-059
  9. 回写 02 文档§7.2 + ISSUE-035
  10. ESM import .js 后缀G12
  11. import typeG13
  12. getDb() 统一G10
  13. cuid2 IDG11

Should HaveP2 末期或 P3 初期补)14. OTel tracerG6P2 可降级为 logger-only15. /metrics 业务指标G5P2 仅暴露 process metrics16. DataLoader 集成B1P2 可先用普通 resolver17. Redis 5-30s 短缓存B6

Nice to HaveP3 持续补)18. Zod 全量验证G7P2 先校验核心 Query19. 优雅关闭 SIGTERMG9P2 可简化为 HTTP close

理由:批次 1 时间线 5-7 天内完成 19 项工作风险高,按 Must/Should/Nice 分级保证关键路径。

执行者ai03 完成期限Must Have 在批次 1 完成Should Have 在 P3 初期补Nice to Have 在 P3 持续补

3.2 ai06 iam P2 工作量分级ISSUE-052

裁决:采纳方案 A拆分 P2 为 P2.1 核心 + P2.2 扩展):

P2.1(批次 15-7 天,阻塞批次 2

  1. gRPC server 50052 + 8 RPC 实现GetViewports / GetEffectivePermissions / GetEffectiveAccess / Logout / GetPublicKey / BatchGetUsers / GetEffectiveDataScope / GetChildrenByParent
  2. AuthMiddleware 注册 + Controller 改用 @Req() 注入I4 裁决)
  3. JWT RS256 本地文件 + refresh token 轮换I5 裁决)
  4. iam_student_guardians 表 + GetChildrenByParent RPC + GET /iam/children RESTI6 裁决)
  5. shared-ts Outbox 接入I2 裁决)
  6. /iam/v1/* 前缀迁移I7 裁决)+ 端点路径统一I8 裁决)
  7. DB 驱动 PermissionGuard 基础I3 裁决,废弃硬编码 ROLE_PERMISSIONS map
  8. 回写 02 文档ISSUE-051

P2.2P3 期间持续补,不阻塞批次 2/39. 三层角色模型school_admin / teacher / student + 自定义角色10. DataScope 6 级实现ALL / SCHOOL / GRADE / CLASS / SUBJECT / SELF11. 视口 4 层admin / teacher / student / parent+ getEffectivePermissions 12. 审计日志user_audit_log 表 + 记录关键操作13. 密码策略(强度 / 过期 / 重用限制14. 单元测试 + 集成测试 15. Redis 缓存I3 裁决完整实现)

批次 2 启动条件:仅依赖 P2.1 完成gRPC 50052 + 8 RPC + GetChildrenByParent 已就绪),不依赖 P2.2。

理由iam 实际工作量 26-27 天,批次 1 时间线 5-7 天严重不匹配。拆分 P2.1 / P2.2 保证关键路径不阻塞。

执行者ai06 完成期限P2.1 在批次 1 完成P2.2 在 P3 期间持续补

3.3 ai10 P5 工作量分级(关联 ISSUE-052

裁决ai10 msg P5 实际工作量 14-15 天,批次 4 预估 7-10 天差距约 50%。采纳分级交付:

P5 Must Have批次 410-12 天)

  1. proto 生成代码 + gRPC server 50056 框架搭建
  2. DB schema 建立6 表扩展/新增)+ ES mapping + Redis bitmap schema
  3. 6 层架构骨架Entry/Guard/App/Strategy/Domain/Data+ getDb() + cuid2
  4. 8 gRPC RPC 实现 + 16 REST 端点实现
  5. 7 Kafka 消费方实现 + 3 发布事件 Outbox
  6. 4 ChannelStrategy 基础实现InApp/Email/SMS/Push
  7. /readyz + /healthz + /metrics + 优雅关闭 + OTel

P5 Should Have批次 4 末期或 P6 初期补)8. 模板渲染完整实现 9. 静默时段 10. DLQ 完整实现 11. 三层幂等完整实现 12. 集成测试 + 端到端验证(含 push-gateway 联调)

理由:与 ai06 iam P2 同类问题,分级交付保证关键路径。

执行者ai10 完成期限Must Have 在批次 4 完成Should Have 在 P6 初期补

3.4 各 AI 文档回写义务ISSUE-028/032-ai15/034-ai15/036-ai13/051-ai06/053-ai02/063-ai14

裁决:各 AI 在 coord 仲裁后 3 个工作日内(或对应批次启动前)完成回写:

AI 文档 回写内容 完成期限
ai03 teacher-bff 02 4 处 GetTeacherDashboardStats → GetTeacherDashboardISSUE-035 批次 1 启动前
ai04 student-bff 02 B1 GraphQL + B2 gRPC + B8 DownstreamClient 回写ISSUE-028 批次 2 启动前
ai05 parent-bff 02 B1 GraphQL + B2 gRPC 回写 批次 3 启动前
ai06 iam 02 I1-I8 裁决对齐 4 处 + §9 标注前移ISSUE-051 批次 1 启动前
ai09 content 02 移除已裁决项 + ES 启用时机标注 批次 3 启动前
ai10 msg 02 M2 软失败 + ISSUE-043 验证 + ISSUE-012 契约更新 批次 4 启动前
ai02 push-gateway 02 ISSUE-053 topic + ISSUE-055 /readyz + ISSUE-056 设计决策记录 + ISSUE-058 Redis SET 批次 4 启动前
ai13 teacher-portal 03 删除 §6 REST→GraphQL 演进策略ISSUE-036 批次 1 启动前
ai14 student-portal 02 F9 GraphQL + F7 权限点命名回写ISSUE-063/064 批次 2 启动前
ai15 parent-portal 02 F9 GraphQL + 删除"P4 用 REST 后续切 GraphQL"ISSUE-032/034 批次 3 启动前
ai16 admin-portal 02 ISSUE-044~048 仲裁结果回写 批次 5 启动前

回写验收

  1. 回写完成后在 known-issues.md 工作经验日志追加记录
  2. coord 在批次验收时检查 02 文档与裁决一致性
  3. 不回写视为违反 coord-final-decisions §0.1 回写义务coord 验收不通过

执行者:各 AI

3.5 ai03 P2 功能范围(关联 ISSUE-040

裁决:明确 ai13 teacher-portal P2 功能范围:

P2 实现(依赖 iam + teacher-bff GraphQL schema

  • 登录 + 权限上下文
  • Dashboard 框架null 字段降级展示)
  • 个人设置
  • 班级列表iam 数据)
  • 学生列表iam 数据)

P3 扩展(跟随 teacher-bff 调 core-edu

  • 课表 / 考勤 / 考试 / 作业

P4 扩展(跟随 teacher-bff 调 content/data-ana

  • 教材 / 题库 / 分析仪表盘

P5 扩展(跟随 teacher-bff 调 ai/msg

  • AI 助教 / 消息通知

规则:前端路由骨架 P2 一次性建立,但页面内容随 BFF 能力分阶段填充(属"跨阶段扩展例外")。

执行者ai13

3.6 ai14 student-portal P3 功能范围ISSUE-065

裁决:明确 ai14 student-portal P3 功能范围:

P3 实现7 页,依赖 iam + core-edu

  • dashboard / homework / exams / take / result / grades / my-schedule

P4 扩展4 页,依赖 content + data-ana

  • textbooks / questions / diagnostic / weakness

P5 扩展2 页,依赖 msg + ai

  • notifications / ai-chat

P4/P5 页面:设 <FeatureFlag> 占位(显示"功能开发中"提示页),避免用户访问 404。

coord 验收 ai14 P3 时检查P3 范围 7 页全部可用 + P4/P5 页面有占位。

执行者ai14

3.7 BFF 通知功能阶段归属ISSUE-013/033/066

裁决BFF 通知功能统一推迟到 P5

  1. P2-P4 阶段BFF 不订阅 KafkaB7 裁决),通知功能不实现
  2. P5 阶段msg + push-gateway 就绪后BFF 订阅 Kafka + 前端接入 push-gateway WebSocket/SSE
  3. parent-portal 通知偏好ISSUE-033
    • P4 阶段:通知偏好设置页面 UI + 表单校验,偏好暂存前端 localStorage降级方案不调后端 API
    • P5 阶段parent-bff 接入 msg 服务 GraphQL mutation updateNotificationPreferences,偏好持久化到 msg DB
  4. student-portal 通知中心ISSUE-066
    • P3-P4notifications route 设 <FeatureFlag> 占位
    • P5实现通知中心页面 + WebSocket/SSE 接入 push-gateway
  5. P3-P4 降级方案:学生端可提供"手动刷新"(轮询 core-edu 查询最近作业/考试),但不作为正式通知功能

理由B7 裁决 P2-P4 BFF 不订阅 Kafka 简化实现,通知功能推迟到 P5 统一启用。

执行者ai03/ai04/ai05BFF+ ai13/ai14/ai15前端


4. P2 各批次启动前完成:服务依赖与时序

4.1 批次 0 完成信号机制ISSUE-047

裁决

  1. coord 在 ai-work-orchestration.md §3.1 标注每项任务完成状态 已完成 / 待办 / 🔄 进行中)
  2. 批次 0 全部 15 项任务完成后coord 发布批次 1 启动公告(在 ai-work-orchestration.md §9 时间线末尾追加"批次 0 已完成,批次 1 启动"
  3. 建立"前置依赖就绪检查清单"coord 在批次 1/2/3/4/5 启动前逐项确认
  4. 批次 0 任务清单(最终 15 项):
    • 0.1 arch:scan 更新
    • 0.2 修订 coord-cross-review.md
    • 0.3 补全 iam.proto 8 RPC
    • 0.4 建立 shared-ts Outbox 工具包(含设计草案 + 实现)
    • 0.5 补全 content.protoQuestionService 等)
    • 0.6 补全 msg.proto
    • 0.7 补全 analytics.proto 扩展
    • 0.8 补全 core_edu.protoAttendanceService / GetClassesByTeacher / BatchGetClasses
    • 0.9 buf.gen.yaml 补 gRPC 插件
    • 0.10 补全 events.proto7 message 已完成)
    • 0.11 analytics.proto 扩展4 端 Dashboard + Warning + MasteryDistribution + SubscribeMasteryUpdate
    • 0.12 补全 push-gateway 相关 proto如有
    • 0.13 补全 msg.proto5 RPC + NotificationPreferenceService + NotificationTemplateService + 3 message
    • 0.14 建立 shared-go 包骨架tracer/logger/jwks/env 4 模块)
    • 0.15 ai13 建立 packages/ui-tokens + ui-components + hooks 骨架

执行者coord0.1-0.14+ ai130.15 完成期限:批次 0 全部完成后再启动批次 1

4.2 /internal/push 契约采纳ISSUE-057/012

裁决

  1. coord 直接采纳 ai02 02 §4.2 作为第一版 /internal/push 契约"as-is"采纳)
  2. 仅在 ai10 提出异议时(如 msg 调用方需要 batch 接口 / 异步回调机制coord 才调整契约
  3. coord 在批次 4 启动前公布"采纳 ai02 02 §4.2 作为第一版契约"的决定,避免重复仲裁
  4. 若 coord 决定调整必须给出具体差异点如新增字段、修改响应格式ai02/ai10 按差异点调整

执行者coord 完成期限:批次 4 启动前

4.3 Redis SET 心跳重建机制ISSUE-058

裁决:采纳 ai02 建议方案:

  1. ai02 02 §3.1 补充"Hub 启动时重建 Redis SET"机制
    • Hub 启动时遍历内存连接userIDSADD 自己 instanceID 到 edu:push:online:<userID> + EXPIRE 60s
    • 启动时清空 Redis 中本 instanceID 的旧成员(避免幽灵成员)
  2. /readyz Redis 检查失败时仅告警不阻塞(与 ISSUE-055 协调),避免雪崩
  3. metrics 暴露 push_gateway_redis_set_rebuild_total 监控重建次数
  4. 文档化"Redis 故障恢复后 60s 内在线状态可能短暂不一致"msg 服务调用方需容忍 online: false 误判msg 应继续尝试 HTTP /internal/push由 push-gateway 返回真实在线状态)

执行者ai02 完成期限P5 启动前回写 02 文档

4.4 设计决策记录章节保留规则ISSUE-056

裁决

  1. coord-final-decisions.md §7.2 回写义务表补充澄清"设计决策记录章节(已被 coord 采纳的仲裁请求)保留,但正文需标注'coord 已采纳,见 coord-final-decisions P1/P5/P6',标题改为'设计决策记录xxx'"
  2. ai02 02 §5.4 改名为"设计决策记录gRPC vs HTTP 协议选型coord 已采纳 P1"
  3. ai02 02 §14.2 改名为"设计决策记录SSE/断线重连范围coord 已采纳 P5/P6"
  4. 章节内容保留作为决策追溯依据,但删除"中间过渡方案"字样
  5. 其他 AI 的同类"过渡方案描述"(如 ai13 ISSUE-036、ai15 ISSUE-034按此原则处理删除过渡方案本身保留设计决策记录

执行者coord§7.2 补充)+ ai0202 文档回写)+ 其他 AI 同规则

4.5 iam /readyz 检查深度ISSUE-029-ai11

裁决:采纳 ai11 建议方案:

  1. coord 验收 iam P2 时强制检查 GetEffectiveDataScope RPC 已落地(不仅仅是 gRPC server 启用)
  2. data-ana /readyz 分两级检查
    • L1 ping iam 50052 端口可达(基础就绪,失败 ready=false
    • L2 调用 GetEffectiveDataScope 返回有效(深度就绪,失败 degraded=true

执行者ai11 实现 + coord 验收


5. P2 各批次启动前完成:工作归属裁决

5.1 admin-portal BFF 归属ISSUE-044

裁决:采纳方案 2复用 teacher-bff

  1. admin-portal 复用 teacher-bff 的 GraphQL endpoint,不新建 admin-bff 服务
  2. ai03 P2 预留 admin schema 命名空间(如 admin.* Query/Mutation
  3. coord 在批次 1 启动前仲裁 schema 第一版时纳入 admin 命名空间
  4. 004 §1.2 服务清单保持不变(无 admin-bff
  5. ai16 回写 02 文档 §4.1:数据获取路径改为"复用 teacher-bff GraphQL endpoint"

理由admin 操作低 QPS无需独立 BFF 实例;减少 ai16 工作量。

执行者ai03预留 admin 命名空间)+ ai16回写 02 文档)

5.2 admin-portal 错误码前缀ISSUE-045

裁决

  1. G14 清单补充 ADMIN_ 前缀(合并 SCHOOL_ 入 ADMIN_因学校设置属 admin 业务子域)
  2. ORG 管理也归入 ADMIN_ 前缀(统一 admin 域)
  3. 错误码命名ADMIN_<RESOURCE>_<ERROR>(如 ADMIN_SCHOOL_NOT_FOUNDADMIN_ORG_DUPLICATE_NAME
  4. i18n keyerror.admin.*(对齐 F4 规范)
  5. 写入 coord-final-decisions.md G14 补充条款

执行者coordG14 补充)+ ai16实现

5.3 admin-portal 权限点命名ISSUE-046

裁决

  1. F7 允许服务前缀作为命名空间(避免不同域同名资源冲突,如 CONTENT_QUESTION_READ vs CORE_EDU_QUESTION_READ
  2. 命名规则[<SERVICE>_]<RESOURCE>_<ACTION>[_<SCOPE>]SERVICE 可选
  3. admin-portal 权限点统一加 ADMIN_ 前缀(与错误码前缀对齐)
  4. 跨服务资源(如调 iam 用户管理)保留 iam 前缀(IAM_USER_READadmin 自身资源用 ADMIN_ 前缀
  5. admin-portal 调下游服务的权限点校验由下游服务负责B3 裁决 BFF 豁免 @RequirePermissionadmin-portal 作为 client 不做权限决策)
  6. 写入 coord-final-decisions.md F7 补充条款

执行者coordF7 补充)+ ai16实现

5.4 admin-portal GraphQL 客户端ISSUE-047

裁决:已在 §2.17 裁决admin-portal 复用 Shell 暴露的 GraphQL client 单例。

执行者ai13Shell 暴露)+ ai16消费

5.5 admin-portal 审计日志归属ISSUE-048

裁决X3 审计日志归属前置到 P6 启动前裁决:

  1. 审计日志归 iamiam 已掌握用户/角色数据,审计事件天然属 iam 域)
  2. events.proto 补 AuditEvent message
message AuditEvent {
  string event_id = 1;
  string aggregate_id = 2;
  string event_type = 3;
  int64 occurred_at = 4;
  string actor_user_id = 5;
  string action = 6;              // create / update / delete / login / logout
  string resource_type = 7;       // user / role / class / exam ...
  string resource_id = 8;
  string before_state = 9;        // JSON string
  string after_state = 10;        // JSON string
  string ip = 11;
  string user_agent = 12;
  string trace_id = 13;
  map<string, string> metadata = 14;
}
  1. 新增 topic edu.iam.audit.created(统一审计事件 topic不按操作类型分
  2. admin-portal 作为 consumer 订阅 edu.iam.audit.created,写入 ClickHouse 审计表(或 MySQL 审计表)
  3. admin-portal 8 个新 Kafka topic 重新评估:若审计归 iamadmin-portal 仅需 1 个 audit consumer topic无需 8 个
  4. iam P2.2 扩展阶段补 AuditEvent 发布user_audit_log 表 + 事件发布)
  5. events.proto 补 AuditEvent 在批次 0.10 完成

执行者coordproto + topic+ ai06iam 发布)+ ai16admin-portal 消费)


6. 时间统筹总表(批次时间线最终调整)

6.1 批次时间线(最终版)

基于工作量分级裁决§3.1-3.3),批次时间线最终调整如下:

批次 阶段 AI 并行 时间线 关键交付 启动条件
批次 0 coord 前置 coord0.1-0.14+ ai130.15 3-5 天 proto 契约 + shared-ts Outbox + shared-go + packages 骨架 本裁决发布后立即
批次 1 P2 ai01 + ai06 + ai03⟷ai13 7-10 天 iam P2.1 + teacher-bff Must Have + teacher-portal P2 + Gateway 路由 批次 0 全部完成
批次 2 P3 ai08 + ai07 交接 + ai04⟷ai14 + ai03 扩展 7-10 天 core-edu gRPC 50053 + student-bff + student-portal P37 页)+ teacher-bff P3 扩展 批次 1 P2.1 完成 + ai03 DownstreamClient 抽象就绪
批次 3 P4 ai09 + ai11 + ai05⟷ai15 + ai03/ai04 扩展 10-12 天 content gRPC 50054 + data-ana gRPC 50055 + parent-bff + parent-portal P4 + teacher/student-bff P4 扩展 批次 2 完成
批次 4 P5 ai10⟷ai02 + ai12 + ai03 扩展 12-15 天 msg gRPC 50056 + push-gateway + ai 服务 + teacher-bff P5 扩展 + 通知功能启用 批次 3 完成
批次 5 P6 ai16 + 持续优化 10-12 天 admin-portal + 审计日志 + iam P2.2 补全 + 持续优化 批次 4 完成

总时间线49-64 天(约 10-13 周)

6.2 批次 0 详细任务清单

任务 责任方 内容 完成信号
0.1 coord arch:scan 更新 arch.db 已更新
0.2 coord 修订 coord-cross-review.md 文档已更新
0.3 coord 补全 iam.proto 8 RPC proto 文件已提交
0.4 coord 建立 shared-ts Outbox 工具包(含设计草案 + 实现) packages/shared-ts/src/outbox/ 已建立
0.5 coord 补全 content.protoQuestionService 等) proto 文件已提交
0.6 coord 补全 msg.proto 基础 proto 文件已提交
0.7 coord 补全 analytics.proto 基础 proto 文件已提交
0.8 coord 补全 core_edu.protoAttendanceService / GetClassesByTeacher / BatchGetClasses proto 文件已提交
0.9 coord buf.gen.yaml 补 gRPC 插件 buf generate 可运行
0.10 coord 补全 events.proto含 AuditEvent proto 文件已提交
0.11 coord analytics.proto 扩展4 端 Dashboard + Warning + MasteryDistribution + SubscribeMasteryUpdate Stream RPC proto 文件已提交
0.12 coord 补全 push-gateway 相关 proto如有 proto 文件已提交
0.13 coord 补全 msg.proto5 RPC + NotificationPreferenceService + NotificationTemplateService + 3 message proto 文件已提交
0.14 coord 建立 shared-go 包骨架tracer/logger/jwks/env 4 模块) packages/shared-go/ 已建立
0.15 ai13 建立 packages/ui-tokens + ui-components + hooks 骨架 3 个 packages 已建立

6.3 批次 1 详细任务清单P2

AI 任务 时间线 关键交付
ai01 Gateway 路由配置(/iam/v1/* + /teacher/* + /parent/* 前缀) 3-5 天 Gateway 路由就绪
ai06 iam P2.1gRPC + 8 RPC + AuthMiddleware + JWT RS256 + iam_student_guardians + shared-ts Outbox + /iam/v1/* 前缀 + DB 驱动 PermissionGuard 基础) 7-10 天 iam gRPC 50052 + 8 RPC 就绪
ai03 teacher-bff P2 Must HaveGraphQL + DownstreamClient + AuthMiddleware + /readyz + /healthz + pino + GlobalErrorFilter + 错误码 + ESM + cuid2 7-10 天 teacher-bff GraphQL schema 第一版 + DownstreamClient 抽象
ai13 teacher-portal P2client 改造 + MF shell + 共享组件抽取 + GraphQL Provider + packages 完善) 7-10 天 teacher-portal P2 可联调

批次 1 启动前 coord 仲裁

  • teacher-bff GraphQL schema 第一版(含 admin 命名空间)
  • MF shell 暴露清单(含 GraphQL client 单例)
  • /internal/push 契约(如批次 4 提前需要,可延后)

6.4 批次 2-5 启动前 coord 仲裁

批次 仲裁内容 完成期限
批次 2 student-bff GraphQL schema 第一版 批次 2 启动前
批次 3 parent-bff GraphQL schema 第一版 批次 3 启动前
批次 4 /internal/push 契约(采纳 ai02 02 §4.2 批次 4 启动前
批次 5 admin-portal schema 命名空间(复用 teacher-bff 批次 5 启动前

7. 各 AI 工作内容最终清单

7.1 ai01api-gateway

  • 批次 1P2Gateway 路由配置(/iam/v1/* + /teacher/* + /parent/* 前缀)+ 接入 shared-go 包
  • 批次 2-5路由扩展core-edu / content / data-ana / msg / ai 路由)+ 持续优化

7.2 ai02push-gateway

  • 批次 0 等待期:复审 02 文档 + 回写 ISSUE-053/055/056/058
  • 批次 4P5/internal/push + WebSocket + Redis Pub/Sub + Kafka 消费(可选)+ /readyz + /metrics + OTel + 多阶段 Dockerfile + slog + X-Internal-Token 重命名 + 集成测试

7.3 ai03teacher-bff

  • 批次 1P2Must Have 13 项(见 §3.1+ DownstreamClient 抽象 + admin schema 命名空间预留
  • 批次 2-5跨阶段扩展core-edu / content / data-ana / msg / ai gRPC 调用)+ Should Have + Nice to Have 持续补

7.4 ai04student-bff

  • 批次 0/1 等待期:回写 02 文档B1/B2/B8+ 起草 student-bff GraphQL schema 草案
  • 批次 2P3student-bff P3GraphQL + DownstreamClient 复用 + iam + core-edu gRPC
  • 批次 3-4跨阶段扩展content / data-ana gRPC
  • 批次 4跨阶段扩展msg / ai gRPC+ 通知功能启用

7.5 ai05parent-bff

  • 批次 0-2 等待期:回写 02 文档 + 起草 parent-bff GraphQL schema 草案
  • 批次 3P4parent-bff P4GraphQL + DownstreamClient 复用 + iam + core-edu gRPC
  • 批次 4跨阶段扩展data-ana gRPC+ 通知功能启用

7.6 ai06iam

  • 批次 0 等待期:回写 02 文档I1-I8+ 监控批次 0.3/0.4 完成
  • 批次 1P2.1gRPC + 8 RPC + AuthMiddleware + JWT RS256 + iam_student_guardians + shared-ts Outbox + /iam/v1/* 前缀 + DB 驱动 PermissionGuard 基础
  • 批次 2-5P2.2 持续补):三层角色 + DataScope + 视口 + 审计日志 + 密码策略 + 测试

7.7 ai07classes 交接)

  • 批次 0classes 黄金模板代码交接给 ai08
  • 后续ai07 已完成黄金模板工作)

7.8 ai08core-edu

  • 批次 0 等待期:复审 02 文档 + 监控批次 0.8 完成
  • 批次 2P3core-edu gRPC 50053 + AttendanceService 实现 + classes 代码交接 + Outbox + TOPIC_MAP 修订edu.teaching.*
  • 批次 3-5:跨阶段扩展(如需)

7.9 ai09content

  • 批次 0-2 等待期:复审 02 文档 + 移除已裁决项
  • 批次 3P4content gRPC 50054 + QuestionService 完整实现 + Outbox + Neo4j Sync Worker + /readyzMySQL + Neo4j + Kafka
  • 批次 4P5ES Projector 实现 + /readyz 扩展 ES 检查

7.10 ai10msg

  • 批次 0-3 等待期:复审 02 文档 + 回写 ISSUE-042/043
  • 批次 4P5msg gRPC 50056 + Must HavegRPC + REST + Outbox + 基础 channel+ Should Have模板 + 静默 + DLQ + 完整幂等)
  • 批次 5Should Have 补全 + 集成测试

7.11 ai11data-ana

  • 批次 0-2 等待期:复审 02 文档 + ClickHouse DDL 文件创建
  • 批次 3P4data-ana gRPC 50055 + CDC 消费者 + ClickHouse 宽表 + /readyz分两级检查 iam gRPC
  • 批次 4-5:跨阶段扩展(如需)

7.12 ai12ai

  • 批次 0-3 等待期:复审 02 文档
  • 批次 4P5ai 服务ES 检索 + AI 备课 + 出题 + StreamChat+ 接入 content/data-ana gRPC

7.13 ai13teacher-portal

  • 批次 00.15:建立 packages/ui-tokens + ui-components + hooks 骨架
  • 批次 1P2teacher-portal P2client 改造 + MF shell + GraphQL Provider + 共享组件抽取)+ 03 文档回写
  • 批次 2-5:跟随 teacher-bff 扩展页面

7.14 ai14student-portal

  • 批次 0/1 等待期:回写 02 文档F9 GraphQL + F7 权限点命名)+ 起草 client query 清单
  • 批次 2P3student-portal P37 页dashboard/homework/exams/take/result/grades/my-schedule
  • 批次 3P4 扩展4 页textbooks/questions/diagnostic/weakness
  • 批次 4P5 扩展2 页notifications/ai-chat

7.15 ai15parent-portal

  • 批次 0-2 等待期:回写 02 文档F9 GraphQL + 删除"P4 用 REST 后续切 GraphQL"+ 起草 client query 清单
  • 批次 3P4parent-portal P4Dashboard + 孩子列表 + 考试/作业/成绩 + 通知偏好 UI 占位)
  • 批次 4P5 扩展(通知偏好持久化 + 通知中心)

7.16 ai16admin-portal

  • 批次 0-4 等待期:回写 02 文档ISSUE-044~048 仲裁结果)
  • 批次 5P6admin-portal用户/角色管理 + 学校设置 + 组织管理 + 审计日志消费)+ 复用 teacher-bff GraphQL endpoint

8. 总裁裁决执行检查清单

8.1 P0 立即执行coord

  • 修正 port-allocation.md §5 iam 行§1.1
  • 修正 004 §4.2 gRPC 启用矩阵§1.2
  • 修正 004 §16.7.4 P4 清单补 QuestionService§1.3
  • 修正 004 §16.7.5 P5 清单删 QuestionService§1.4
  • 修订 004 §7.2 Kafka topic 表格§1.5
  • 修正 coord-final-decisions.md + ai-work-orchestration.md 相对路径§1.6
  • 在 issues.md §0.5 添加总裁裁决索引指针§1.7

8.2 P1 批次 0 启动前完成coord + ai13

  • coord 完成 shared-ts Outbox 工具包设计 + 实现§2.10.4
  • coord 建立 GraphQL schema 仲裁规范§2.2
  • coord 补全 core_edu.proto AttendanceService§2.50.8
  • coord 补全 analytics.proto 扩展§2.100.11
  • coord 补全 events.proto AuditEvent§5.50.10
  • coord 建立 shared-go 包骨架§2.190.14
  • ai13 建立 packages 骨架§2.180.15
  • coord 修订 004 §7.2 warning.triggered 注释§2.11
  • coord 修正 coord-cross-review.md §6 #14 责任方§2.5
  • coord 在 coord-final-decisions.md 补充 I1 双入口策略§2.16
  • coord 在 coord-final-decisions.md 补充 F7 服务前缀规则§5.3
  • coord 在 coord-final-decisions.md 补充 G14 ADMIN_ 前缀§5.2
  • coord 在 coord-final-decisions.md §7.2 补充设计决策记录保留规则§4.4

8.3 P2 各批次启动前完成(各 AI

  • ai03 回写 teacher-bff 02GetTeacherDashboard 命名§3.4
  • ai04 回写 student-bff 02B1/B2/B8§3.4
  • ai06 回写 iam 02I1-I8§3.4
  • ai13 回写 teacher-portal 03删除 REST→GraphQL§3.4
  • ai14 回写 student-portal 02F9/F7§3.4
  • ai15 回写 parent-portal 02F9/删除过渡方案§3.4
  • ai02 回写 push-gateway 02ISSUE-053/055/056/058§3.4
  • ai10 回写 msg 02ISSUE-042/043/012§3.4
  • ai16 回写 admin-portal 02ISSUE-044~048§3.4

8.4 P3 各阶段执行中持续(各 AI

  • 各 AI 按工作量分级执行§3.1-3.3
  • 各 AI 按跨阶段扩展例外执行§2.3
  • 各 AI 按回写义务执行§3.4
  • coord 按批次验收检查§8.1-8.3

9. 未解决问题后续处理

9.1 待 P6 评估的问题(保留)

以下问题待 P6 阶段评估,不阻塞当前批次:

  • ISSUE-014admin-portal 8 个新 Kafka topic若审计归 iam仅需 1 个 audit consumer topic见 §5.5
  • X3 审计日志归属已前置裁决§5.5),归 iam
  • X6 httpOnly Cookie 迁移P6 评估
  • X7 其他 P6+ 事项P6 评估

9.2 不再追溯的问题

以下问题已被本裁决覆盖,不再单独追溯:

  • ISSUE-001 ~ ISSUE-014coord 初始识别,已被 coord-final-decisions + 本裁决覆盖)
  • ISSUE-015 ~ ISSUE-022ai08 提请,已在 §1/§2 裁决)
  • ISSUE-023 ~ ISSUE-025-ai09ai09 提请,已在 §2.4/2.13/2.14 裁决)
  • ISSUE-026 ~ ISSUE-030-ai11ai11 提请,已在 §2.6/2.10/2.11/4.5 裁决)
  • ISSUE-028 ~ ISSUE-031-ai04ai04 提请,已在 §3.4 裁决)
  • ISSUE-032 ~ ISSUE-036+059-ai03ai03 提请,已在 §2.7/2.8/2.9/3.1 裁决)
  • ISSUE-036 ~ ISSUE-041-ai13ai13 提请,已在 §2.2/2.17/2.18/3.5 裁决)
  • ISSUE-031 ~ ISSUE-035-ai15ai15 提请,已在 §0.3/0.4/3.4 裁决)
  • ISSUE-042 ~ ISSUE-043-ai10ai10 提请,已在 §1.5/2.4 裁决)
  • ISSUE-044 ~ ISSUE-048-ai16ai16 提请,已在 §5.1-5.5 裁决)
  • ISSUE-047 ~ ISSUE-052-ai06ai06 提请,已在 §2.15/2.16/3.2/4.1 裁决)
  • ISSUE-053 ~ ISSUE-058-ai02ai02 提请,已在 §1.5/2.4/4.2/4.3/4.4 裁决)
  • ISSUE-063 ~ ISSUE-066-ai14ai14 提请,已在 §3.4/3.6/4.7 裁决)

10. 问题索引表(编号冲突映射)

由于 issues.md 存在严重编号冲突(见 §0.4),本表提供 ISSUE-XXX-<提请AI> 格式的唯一定位。

ISSUE 编号 提请 AI 主题 裁决章节
ISSUE-001 coord iam gRPC server 启用时机三处文档冲突 §1.1/1.2
ISSUE-002 coord shared-ts Outbox 工具包未列入 P2 整改清单 §2.1
ISSUE-003 coord 004 §4.2 gRPC 启用阶段矩阵与 B2 裁决冲突 §1.2
ISSUE-004 coord teacher-bff P2 "首次实现即 gRPC 调下游"与下游服务分阶段启用矛盾 §2.3/2.8
ISSUE-005 coord teacher-bff 跨阶段持续改造与"不分阶段"裁决原则矛盾 §0.3/2.3
ISSUE-006 coord student-bff P3 同样存在跨度过大问题 §2.3
ISSUE-007 coord BFF DownstreamClient 抽象回写 teacher-bff 的时间点 §3.4
ISSUE-008 coord teacher-portal P2 改造为 urql/apollo 的工作量 §2.17/3.5
ISSUE-009 coord parent-bff P4 依赖 iam.GetChildrenByParent §3.2
ISSUE-010 coord ai12 ai P5 调 content.QuestionService 的 proto 补全时机冲突 §1.3/1.4
ISSUE-011 coord ai12 ai P5 调 core-edu.ExamService.GetExam 的方向修正 §7.12
ISSUE-012 coord msg P5 调 push-gateway HTTP /internal/push 的时序协调 §4.2
ISSUE-013 coord BFF P2-P4 不订阅 Kafka家长通知实时性如何保证 §3.7
ISSUE-014 coord admin-portal P6 + 8 个新 Kafka topic 时序 §5.5/9.1
ISSUE-015 ai08 port-allocation.md §3 与 §5 关于 iam gRPC 启用阶段冲突 §1.1
ISSUE-016 ai08 004 §16.7.4 P4 清单未列 content QuestionService §1.3/1.4
ISSUE-017 ai08 14 个 issues 状态字段未回填 coord 裁决 §0.4/9.2
ISSUE-018 ai08 shared-ts Outbox 工具包设计未明确 §2.1
ISSUE-019 ai08 GraphQL schema 第一版仲裁机制未明确 §2.2
ISSUE-020 ai08 BFF 跨阶段扩展例外的验收标准未明确 §2.3
ISSUE-021 ai08 "不分阶段"原则与"批次时间线"表述易混淆 §0.3
ISSUE-022 ai08 core-edu AttendanceService proto 补全责任方不明 §2.5
ISSUE-023-ai09 ai09 content /readyz 检查项与 P5 ES 引入的时序冲突 §2.4
ISSUE-024-ai09 ai09 content ES Projector 实现位置未明确 §2.14
ISSUE-025-ai09 ai09 Neo4j 知识图谱同步是否属于"派生数据事件"豁免 Outbox §2.13
ISSUE-026-ai11 ai11 ClickHouse DDL 目录归属不明 §2.12
ISSUE-027-ai11 ai11 analytics.proto 扩展交付时间不明确 §2.10
ISSUE-028-ai11 ai11 warning.triggered topic 登记状态不明确 §2.11
ISSUE-029-ai11 ai11 data-ana /readyz 检查 iam gRPC 依赖落地验证 §4.5
ISSUE-030-ai11 ai11 降级模式在 ActionState 信封中的表达方式 §2.6
ISSUE-028-ai04 ai04 ai04 02 文档与 coord B1+B2 裁决冲突需回写 §3.4
ISSUE-029-ai04 ai04 ai04 P3 启动前置依赖确认 §4.1/6.1
ISSUE-030-ai04 ai04 ai04⟷ai14 student-bff GraphQL schema 第一版仲裁时机 §2.2
ISSUE-031-ai04 ai04 issues.md ISSUE-024/025 编号冲突 §0.4
ISSUE-031-ai15 ai15 coord-final-decisions.md + ai-work-orchestration.md 相对路径错误 §1.6
ISSUE-032-ai03 ai03 B2 裁决 P2 阶段 teacher-bff Dashboard Query Resolver 实现方式 §2.8
ISSUE-033-ai03 ai03 B4 越权防御校验 teacherId 与班级关系在 P2 阶段实现方式 §2.9
ISSUE-034-ai03 ai03 G2 /readyz 检查全部下游依赖在 P2 阶段不可行 §2.4
ISSUE-035-ai03 ai03 §5.2 接口命名 GetTeacherDashboard 需 ai03 回写 02 文档 §3.4
ISSUE-036-ai03 ai03 ai03 P2 工作量激增 §3.1
ISSUE-059 ai03 BFF_TEACHER_FORBIDDEN_RESOURCE vs BFF_TEACHER_PERMISSION_DENIED 错误码语义区分 §2.7
ISSUE-032-ai15 ai15 ai15 parent-portal API 契约 REST 假设与 F9 GraphQL 裁决冲突 §3.4
ISSUE-033-ai15 ai15 ai15 parent-portal 通知偏好 P4 落地与 B7 裁决冲突 §3.7
ISSUE-034-ai15 ai15 ai15 parent-portal §476 "P4 用 REST 后续切 GraphQL"违反"不分阶段"原则 §3.4
ISSUE-035-ai15 ai15 issues.md 文件结构严重混乱 §0.4
ISSUE-036-ai13 ai13 ai13 03-long-term-architecture.md §6 "REST→GraphQL 演进策略"与 F9 裁决冲突 §3.4
ISSUE-037-ai13 ai13 ai13 与 ai03 的 GraphQL schema 契约协调机制未明确 §2.2
ISSUE-038-ai13 ai13 MF 暴露 AppShell 整体是否包含 GraphQL client 单例未明确 §2.17
ISSUE-039-ai13 ai13 F8 ai13 维护 packages 的建立时机与依赖未明确 §2.18
ISSUE-040-ai13 ai13 ai13 teacher-portal P2 功能范围与下游服务启用阶段的关系未明确 §3.5
ISSUE-041-ai13 ai13 仲裁评估总结 §9.2
ISSUE-042-ai10 ai10 M2 msg /readyz 强依赖 PushGateway 与 P5 同批次启动时序冲突 §2.4
ISSUE-043-ai10 ai10 004 §7.2 表格 edu.notification.events 与 §16.3.2 + G16 裁决不同步 §1.5
ISSUE-044-ai16 ai16 admin-portal BFF 归属不明 §5.1
ISSUE-045-ai16 ai16 admin-portal 错误码前缀缺失 §5.2
ISSUE-046-ai16 ai16 admin-portal 权限点命名与 F7 规范的契合度 §5.3
ISSUE-047-ai16 ai16 admin-portal GraphQL 客户端复用 Shell 还是独立引入 §2.17/5.4
ISSUE-048-ai16 ai16 admin-portal 审计日志与 iam 审计事件归属耦合 §5.5
ISSUE-047-ai06 ai06 批次 0 强阻塞 ai06 iam P2 启动 §4.1
ISSUE-048-ai06 ai06 I7 API 版本化 /iam/v1/* 破坏性变更跨服务协调 §2.15
ISSUE-049-ai06 ai06 gRPC 与 REST 双入口实现策略未明确 §2.16
ISSUE-050-ai06 ai06 shared-ts Outbox 工具包 API 契约未明确 §2.1
ISSUE-051-ai06 ai06 02-architecture-design.md 与 I1-I8 裁决对齐回写义务 §3.4
ISSUE-052-ai06 ai06 iam P2 工作量评估与批次时间线不匹配 §3.2
ISSUE-053-ai02 ai02 G16 Kafka topic 命名规则与 push-gateway 02 §5.1 消费 topic 不一致 §1.5
ISSUE-054-ai02 ai02 shared-go 共享包建立时机与责任方未在批次规划中明确 §2.19
ISSUE-055-ai02 ai02 G2 /readyz "全部下游依赖"对 push-gateway Kafka 可选消费的适用性 §2.4
ISSUE-056-ai02 ai02 02 文档 §5.4/§14.2 仲裁请求章节删除会丢失设计决策追溯 §4.4
ISSUE-057-ai02 ai02 ISSUE-012 /internal/push 契约仲裁前置与 02 §4.2 已有定义重复 §4.2
ISSUE-058-ai02 ai02 push-gateway 在线状态 Redis SET 心跳续期与 G2 /readyz 检查的耦合 §4.3
ISSUE-063-ai14 ai14 ai14 student-portal 02 REST 假设与 F9/B1 GraphQL 裁决冲突 §3.4
ISSUE-064-ai14 ai14 F7 权限点命名风格 ai14 文档与裁决不一致 §3.4
ISSUE-065-ai14 ai14 student-portal P3 功能范围受限 §3.6
ISSUE-066-ai14 ai14 student-portal 通知功能推迟到 P5 §3.7

11. 裁决效力

11.1 裁决生效

本文件自发布之日起生效,覆盖以下文档的冲突条款:

  • coord-final-decisions.md80+ 项裁决保持有效,本文件为其补充 + 澄清)
  • ai-work-orchestration.md(批次时间线以本文件 §6 为准)
  • issues.md(所有问题状态转为"总裁已裁决"

11.2 裁决变更

本文件的裁决变更需总裁用户再次确认。coord 无权单方面变更。

11.3 裁决执行

  • coord:负责 P0 立即执行项§8.1+ P1 批次 0 启动前完成项§8.2+ 批次验收
  • 各 AI:负责 P2 各批次启动前完成项§8.3+ P3 各阶段执行中持续项§8.4

本文件为总裁最终裁决,所有 AI 必须遵守。