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

1241 lines
69 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 总裁最终裁决President Final Rulings
> 版本1.0
> 日期2026-07-09
> 决策者:总裁(用户)
> 执行者coord统一落实
> 适用范围Edu 微服务架构全部 16 个 AIai01-ai16+ coord 维护的 shared-* 包与文档
> 关联文档:
>
> - [coord-final-decisions.md](./coord-final-decisions.md)80+ 项强制裁决,本文件为其上层总裁裁决)
> - [ai-work-orchestration.md](./ai-work-orchestration.md)6 批次并行规划,本文件调整其时间线)
> - [issues.md](../issues.md)70+ 问题汇总,本文件逐个裁决)
> - [004 架构影响地图](./004_architecture_impact_map.md)
> - [port-allocation.md](../../infra/port-allocation.md)
> - [ai-allocation.md](./ai-allocation.md)
---
## 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-028~~030 ai04 与 ai11 重复 / ISSUE-031 ai04 与 ai15 重复 / ISSUE-032~~035 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.requested`ISSUE-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
```markdown
### 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**
```typescript
// 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>;
}
```
3. **配置项**
```typescript
interface OutboxConfig {
tableName: string; // 各服务可配,默认 'outbox_events'
kafkaTopic: string; // 各服务可配
pollIntervalMs: number; // 默认 1000
batchSize: number; // 默认 100
maxRetryCount: number; // 默认 5
retryBackoffMs: number; // 默认 1000指数退避
}
```
4. **表 schema**Drizzle migration各服务执行
```sql
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);
```
5. **集成方式**NestJS Module 注入(`@Module({ imports: [OutboxModule.forRoot(config)] })`
6. **是否含 Kafka producer**内置iam 仅配置 topic
7. **ORM 支持**:仅支持 Drizzle ORM对齐黄金模板
8. **事务边界**:业务表 + outbox 表同事务Drizzle 事务 API示例
```typescript
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.graphql`ai03 定义coord 仲裁)
- `student-bff.schema.graphql`ai04 定义coord 仲裁)
- `parent-bff.schema.graphql`ai05 定义coord 仲裁)
- `admin.schema.graphql`admin 命名空间,复用 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/MutationcamelCase`teacherDashboard` / `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 字段):
```typescript
// 降级响应
{
success: true,
data: {
...actualData,
degraded: true, // 降级标记
degradedReason: "redis_unavailable" // 降级原因
},
error: null
}
```
**规则**
1. 降级时 `success=true`HTTP 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}:classes`TTL 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. **避免双 v1**Controller 加 `/v1`Gateway 转发路径不含 `/v1`Gateway 仅做路径匹配 + 代理)
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 调 iam**teacher-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 暴露 GraphQLProvider**ai13 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/3**9. 三层角色模型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_FOUND``ADMIN_ORG_DUPLICATE_NAME`
4. **i18n key**`error.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_READ`admin 自身资源用 `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. **审计日志归 iam**iam 已掌握用户/角色数据,审计事件天然属 iam 域)
2. **events.proto 补 `AuditEvent` message**
```protobuf
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;
}
```
3. **新增 topic `edu.iam.audit.created`**(统一审计事件 topic不按操作类型分
4. **admin-portal 作为 consumer 订阅 `edu.iam.audit.created`**,写入 ClickHouse 审计表(或 MySQL 审计表)
5. **admin-portal 8 个新 Kafka topic 重新评估**:若审计归 iamadmin-portal 仅需 1 个 audit consumer topic无需 8 个
6. **iam P2.2 扩展阶段补 AuditEvent 发布**user_audit_log 表 + 事件发布)
7. **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
- **批次 1P2**Gateway 路由配置(/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
- **批次 1P2**Must 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 草案
- **批次 2P3**student-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 草案
- **批次 3P4**parent-bff P4GraphQL + DownstreamClient 复用 + iam + core-edu gRPC
- **批次 4**跨阶段扩展data-ana gRPC+ 通知功能启用
### 7.6 ai06iam
- **批次 0 等待期**:回写 02 文档I1-I8+ 监控批次 0.3/0.4 完成
- **批次 1P2.1**gRPC + 8 RPC + AuthMiddleware + JWT RS256 + iam_student_guardians + shared-ts Outbox + /iam/v1/* 前缀 + DB 驱动 PermissionGuard 基础
- **批次 2-5P2.2 持续补)**:三层角色 + DataScope + 视口 + 审计日志 + 密码策略 + 测试
### 7.7 ai07classes 交接)
- **批次 0**classes 黄金模板代码交接给 ai08
- **后续**ai07 已完成黄金模板工作)
### 7.8 ai08core-edu
- **批次 0 等待期**:复审 02 文档 + 监控批次 0.8 完成
- **批次 2P3**core-edu gRPC 50053 + AttendanceService 实现 + classes 代码交接 + Outbox + TOPIC_MAP 修订edu.teaching.*
- **批次 3-5**:跨阶段扩展(如需)
### 7.9 ai09content
- **批次 0-2 等待期**:复审 02 文档 + 移除已裁决项
- **批次 3P4**content gRPC 50054 + QuestionService 完整实现 + Outbox + Neo4j Sync Worker + /readyzMySQL + Neo4j + Kafka
- **批次 4P5**ES Projector 实现 + /readyz 扩展 ES 检查
### 7.10 ai10msg
- **批次 0-3 等待期**:复审 02 文档 + 回写 ISSUE-042/043
- **批次 4P5**msg gRPC 50056 + Must HavegRPC + REST + Outbox + 基础 channel+ Should Have模板 + 静默 + DLQ + 完整幂等)
- **批次 5**Should Have 补全 + 集成测试
### 7.11 ai11data-ana
- **批次 0-2 等待期**:复审 02 文档 + ClickHouse DDL 文件创建
- **批次 3P4**data-ana gRPC 50055 + CDC 消费者 + ClickHouse 宽表 + /readyz分两级检查 iam gRPC
- **批次 4-5**:跨阶段扩展(如需)
### 7.12 ai12ai
- **批次 0-3 等待期**:复审 02 文档
- **批次 4P5**ai 服务ES 检索 + AI 备课 + 出题 + StreamChat+ 接入 content/data-ana gRPC
### 7.13 ai13teacher-portal
- **批次 00.15**:建立 packages/ui-tokens + ui-components + hooks 骨架
- **批次 1P2**teacher-portal P2client 改造 + MF shell + GraphQL Provider + 共享组件抽取)+ 03 文档回写
- **批次 2-5**:跟随 teacher-bff 扩展页面
### 7.14 ai14student-portal
- **批次 0/1 等待期**:回写 02 文档F9 GraphQL + F7 权限点命名)+ 起草 client query 清单
- **批次 2P3**student-portal P37 页dashboard/homework/exams/take/result/grades/my-schedule
- **批次 3**P4 扩展4 页textbooks/questions/diagnostic/weakness
- **批次 4**P5 扩展2 页notifications/ai-chat
### 7.15 ai15parent-portal
- **批次 0-2 等待期**:回写 02 文档F9 GraphQL + 删除"P4 用 REST 后续切 GraphQL"+ 起草 client query 清单
- **批次 3P4**parent-portal P4Dashboard + 孩子列表 + 考试/作业/成绩 + 通知偏好 UI 占位)
- **批次 4**P5 扩展(通知偏好持久化 + 通知中心)
### 7.16 ai16admin-portal
- **批次 0-4 等待期**:回写 02 文档ISSUE-044~048 仲裁结果)
- **批次 5P6**admin-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-014**admin-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.md`80+ 项裁决保持有效,本文件为其补充 + 澄清)
- `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 必须遵守。**