status: propose created: 2026-07-28 complexity: 🔴复杂
Forge 当前已经具备第三方 OAuth 登录、组织/用户/岗位、消息中心、任务调度和 Flowable 待办能力,但这些能力尚未形成可复用的企业协同集成层。若直接把企业微信逻辑写进登录、用户、消息或流程模块,后续接入飞书、钉钉时会重复建设配置、Token、通讯录、消息、待办、回调、同步日志和异常补偿。
本变更以现有 sys_social_config 为连接根,建设平台无关的企业协同能力,企业微信作为首个完整适配器。完成后达到以下可验证结果:
COLLABORATION 渠道投递企微应用消息,保留逐接收人结果、幂等键、失败重试和发送记录。sys_flow_task 的创建、转派、完成、撤回和终结可以投影为企微待办卡片;点击或回调后仍由 Forge 校验当前用户、任务状态、办理权限和幂等性。AES_GCM 可逆加密或外部 Secret 引用;管理接口只返回“已配置”状态和固定掩码。本次必须交付:
forge-starter-collaboration SPI 与 forge-plugin-collaboration 编排插件。sys_social_config 兼容升级、独立应用配置、组织/用户/岗位/标签映射、同步日志、问题单、待办投影和回调事件模型。本变更按两个可独立验收和上线的里程碑交付:
| 里程碑 | 范围 | 独立完成标志 |
|---|---|---|
| M1 一期基础协同 | P0 + P1:通用底座、安全登录、企微通讯录/标签、消息、对应管理与补偿 | 完成 Task 0-13、Task 18 的一期接口、Task 16-17 的一期页面和 Task 19A;可独立 Review、UAT 和上线,不依赖待办应用资料 |
| M2 二期待办协同 | P2:待办投影、企微卡片、安全跳转、回调动作、对应运维 | 完成 Task 14-15、Task 17-18 的二期范围和 Task 19B;通过后本变更整体可标记 done |
本次不交付:
SysSocialConfig 仅包含 platform/clientId/clientSecret/redirectUri/agentId/scope/tenantId,实体定位仍是“三方登录配置”,不能表达同一企业连接下的独立通讯录、消息和待办应用。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/domain/entity/SysSocialConfig.java,SysSocialConfig。sys_social_config 唯一索引为 (platform, tenant_id),同租户同平台只能配置一行;client_secret 非空且为普通字符串列。出处:forge-server/db/全量初始化SQL.sql:5514,sys_social_config DDL。LambdaQueryWrapper 构建。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/service/impl/SocialConfigServiceImpl.java,SocialConfigServiceImpl#selectByPlatformAndTenant。platform:tenantId,无法区分同平台下的连接或应用。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/factory/SocialAuthRequestFactory.java,SocialAuthRequestFactory#buildCacheKey。SocialAuthRequestFactory#buildRequest 已支持 WECHAT_ENTERPRISE、FEISHU、DINGTALK 和 DINGTALK_ACCOUNT,说明登录库具备平台基础适配,但只覆盖授权登录。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/factory/SocialAuthRequestFactory.java,SocialAuthRequestFactory#buildRequest。/social/callback 将完整 AuthUser 返回前端,并记录完整第三方用户 JSON;前端再把 socialUuid/socialNickname/socialAvatar/socialEmail 提交给 /auth/login。SocialAuthStrategyImpl 直接信任这些客户端字段。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/controller/SocialController.java 的 SocialController#callback、forge-admin-ui/src/views/login/callback.vue、forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/java/com/mdframe/forge/plugin/system/strategy/SocialAuthStrategyImpl.java 的 SocialAuthStrategyImpl#doAuthenticate。这是必须在开放企业登录前修复的身份伪造和令牌泄露风险。SocialAuthStrategyImpl 在未绑定时可自动创建用户,默认部门逻辑尚未实现;如果企微通讯录同步和登录并行开放,可能形成重复账号和无组织账号。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-system/src/main/java/com/mdframe/forge/plugin/system/strategy/SocialAuthStrategyImpl.java,SocialAuthStrategyImpl#doAuthenticate。SysUserSocial 只按 platform + uuid 表达第三方账号,缺少连接、企业和来源维度;表中还保存访问令牌和刷新令牌。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/domain/entity/SysUserSocial.java 的 SysUserSocial、forge-server/db/全量初始化SQL.sql:5682。SocialUserServiceImpl#selectByPlatformAndUuid 和 #selectByUserIdAndPlatform 均未带租户/连接条件,无法安全支持同一平台的多个企业。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-social/src/main/java/com/mdframe/forge/starter/social/service/impl/SocialUserServiceImpl.java,SocialUserServiceImpl。sys_org、sys_user、sys_user_org、sys_post、sys_user_post,可以承载同步结果;当前初始化结构中没有 sys_social_org_mapping/sys_social_post_mapping/sys_social_tag/sys_social_sync_log,即没有外部映射、快照、冲突和来源所有权模型。出处:forge-server/db/全量初始化SQL.sql 的 System 表 DDL 集合。sys_user_org/sys_user_org_role 或回退旧 sys_user_role。出处:code-copilot/memory/decisions.md“组织上下文权限按当前组织计算”。forge-starter-message 已提供可插拔 MessageChannel,但 ChannelType 只有 EMAIL/SMS/WEB。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-message/src/main/java/com/mdframe/forge/starter/message/channel/MessageChannel.java 的 MessageChannel、同目录 ChannelType.java。MessageClient 通过 Spring 注入的渠道集合选择实现,适合增加一个统一 COLLABORATION 渠道。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-message/src/main/java/com/mdframe/forge/starter/message/config/MessageAutoConfiguration.java 的 MessageAutoConfiguration#messageClient、forge-server/forge-framework/forge-starter-parent/forge-starter-message/src/main/java/com/mdframe/forge/starter/message/sdk/MessageClient.java 的 MessageClient#resolveChannel。MessageServiceImpl 已创建消息、接收人和发送记录,但对外渠道只传手机号/邮箱;发送结果是整批成功或失败,不能表达企微的无映射用户、部分失败和逐人重试。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-message/src/main/java/com/mdframe/forge/plugin/message/service/impl/MessageServiceImpl.java,MessageServiceImpl#sendToChannel/#createSendRecord。sendIfAbsent 先查后写,sys_message 的 idx_biz 不是唯一索引,存在并发重复发送窗口;同一个流程任务转派后也不能只用 taskId 作为唯一消息键。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-message/src/main/java/com/mdframe/forge/plugin/message/service/impl/MessageServiceImpl.java 的 MessageServiceImpl#sendIfAbsent、forge-server/db/全量初始化SQL.sql:4997。FlowTaskEventListener 已监听 TASK_CREATED/TASK_ASSIGNED/TASK_COMPLETED/ENTITY_DELETED 并维护 sys_flow_task,可以作为待办投影的领域事件来源。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/listener/FlowTaskEventListener.java,FlowTaskEventListener#onEvent。WEB 站内信,任务完成后只把对应站内信置已读。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/listener/FlowTaskEventListener.java,FlowTaskEventListener#sendTaskCreatedMessage/#markTaskTodoMessageRead。sys_flow_task 已保存任务、处理人、候选人、业务键、状态和动作幂等摘要;外部待办回调可复用现有任务权限和幂等能力,不能直接更新该表。出处:forge-server/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/entity/FlowTask.java 的 FlowTask、同模块 service/impl/FlowTaskActionAuthorization.java。@JobHandler、集群调度、日志、重试和告警,本变更应注册同步与补偿 Handler,不新增第二套调度配置表。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-job/src/main/java/com/mdframe/forge/starter/job/annotation/JobHandler.java、forge-server/forge-framework/forge-plugin-parent/forge-plugin-job/src/main/java/com/mdframe/forge/plugin/job/example/JobExamples.java、同模块 entity/SysJobConfig.java。PersistentCryptoService 已提供版本化持久化密文的加密、解密、盘点和重加密能力,数据连接已按“空值保留、非空轮换”使用;本变更在该机制中增加 AES_GCM 算法,不另建第二套密文协议。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/persistence/PersistentCryptoService.java、同目录 VersionedPersistentCryptoService.java、forge-server/forge-framework/forge-plugin-parent/forge-plugin-data/src/main/java/com/mdframe/forge/plugin/data/service/impl/DataConnectionServiceImpl.java 的 DataConnectionServiceImpl#toEntity。forge-server/forge-framework/forge-starter-parent/forge-starter-crypto/src/main/java/com/mdframe/forge/starter/crypto/crypto/impl/AESEncryptor.java。forge-starter-outbound 已具备出站目标校验和白名单,可新增 COLLABORATION_PROVIDER 场景保护供应商 API 请求。出处:forge-server/forge-framework/forge-starter-parent/forge-starter-outbound/src/main/java/com/mdframe/forge/starter/outbound/security/OutboundPolicyService.java、同模块 constant/OutboundScenes.java。sys_social_config 升级为企业协同连接根,允许同租户同平台多个企业连接。AuthUser 或信任客户端 socialUuid。userid 到 Forge 用户的稳定映射及主组织关系。COLLABORATION 消息渠道,支持企微文本/模板卡片、跳转链接、逐接收人结果和重试。WECHAT_ENTERPRISE/FEISHU/DINGTALK 分支的业务判断。sys_social_config 表示一个租户下的一个外部企业连接,不再表示某一个 OAuth 应用。LOGIN/DIRECTORY/MESSAGE/TODO 指向指定应用;同一应用可复用多个能力,每个能力只有一个当前启用绑定。应用支持哪些业务能力只以能力绑定表为准,连接表和应用表不重复保存能力集合。CALLBACK 是 Provider 技术能力,不是连接级业务能力绑定。回调入口必须同时携带公开的 connectionCode + appCode,据此加载该物理应用自己的 Callback Token/EncodingAESKey;禁止只按连接随机选择回调凭据。CAPABILITY_NOT_SUPPORTED,禁止静默降级到其他平台或渠道。SYNC_REQUIRED:通讯录同步成功并建立映射后才允许登录,禁止登录时自动创建无组织用户。sys_user。不物理删除历史用户。tenantId + connectionId + syncType。sys_message/sys_message_receiver/sys_message_send_record,不另建一套消息模板中心。sys_flow_task/Flowable;外部平台只是投影,回调不能直接修改投影表来冒充审批完成。hasSecret、固定掩码、最后轮换时间和 keyId;空 Secret 更新表示保留,显式轮换使用比较更新避免并发恢复旧值。迁移版本暂定从当前最大版本
V1.0.56之后顺延。实施前如出现新版本,文件名必须整体后移,不得复用已执行版本。
| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 修改 | sys_social_config |
connection_code/connection_name/enterprise_id/connection_type/identity_policy/directory_authority/default_org_id/del_flag/create_dept |
升级为连接根;能力集合由绑定表实时解析;活动唯一键为 (tenant_id, connection_code, del_flag) 和 (tenant_id, platform, enterprise_id, del_flag) |
| 兼容 | sys_social_config |
原 client_id/client_secret/redirect_uri/agent_id/scope |
暂作旧登录配置双读;迁移完成后 client_secret 必须清空,旧字段不再通过 API 返回 |
| 新增 | sys_social_app_config |
connection_id/app_code/app_name/client_id/agent_id/secret_mode/secret_cipher/secret_ref/callback_token_cipher/encoding_aes_key_cipher/redirect_uri/scope/config_json/status/del_flag |
连接下的物理应用;业务能力由绑定表表达,回调凭据归属具体应用;活动唯一键 (tenant_id, connection_id, app_code, del_flag) |
| 新增 | sys_social_capability_binding |
connection_id/capability/app_config_id/config_json/status/del_flag |
将 LOGIN/DIRECTORY/MESSAGE/TODO 绑定到物理应用;活动唯一键 (tenant_id, connection_id, capability, del_flag) |
| 修改 | sys_user_social |
connection_id/external_enterprise_id/managed_by_sync/external_status/source_hash/last_sync_time/del_flag |
uuid 继续承载外部用户 ID;新增连接维度和来源状态;访问/刷新令牌默认不再落库 |
| 修改 | sys_user_social |
唯一索引 | 替换为 (tenant_id, connection_id, uuid, del_flag) 及 (tenant_id, connection_id, user_id, del_flag) |
| 新增 | sys_social_org_mapping |
外部部门、父部门、org_id/source_hash/last_seen_run_id/status/del_flag |
稳定部门映射和全量快照对账 |
| 新增 | sys_social_post_mapping |
外部岗位编码/文本、post_id/status/del_flag |
岗位映射;企微首期默认不自动创建岗位 |
| 新增 | sys_social_tag |
外部标签、名称、状态、last_seen_run_id/del_flag |
保存平台标签资产 |
| 新增 | sys_social_tag_member |
tag_id/member_type/external_member_id/local_target_id |
标签成员/部门纯关系重建表;允许同步事务内物理替换,并在 Spec 记录原因 |
| 新增 | sys_social_sync_log |
批次、类型、触发来源、阶段、计数、游标、状态、错误码、起止时间 | 运行日志;按留存任务物理清理 |
| 新增 | sys_social_sync_issue |
对象类型、外部 ID、问题码、脱敏摘要、处理状态、处理动作、重试次数 | 冲突和人工处理队列,不保存明文敏感快照 |
| 新增 | sys_social_todo_link |
task_id/connection_id/user_id/external_user_id/desired_state/delivery_state/version/external_id/idempotency_key/retry_at/del_flag |
Flowable 任务到外部待办的可靠投影/出站状态 |
| 新增 | sys_social_callback_event |
connection_id/event_id/dedup_hash/event_type/signature_status/payload_cipher/process_status/retry_count |
回调收件箱、去重和补偿;原文加密并按留存任务清理 |
| 修改 | sys_message |
connection_id/idempotency_key |
绑定企业协同连接和确定性消息键 |
| 修改 | sys_message_receiver |
delivery_status/delivery_attempts/external_id/last_error_code/last_attempt_time/next_retry_time |
支持逐接收人发送结果和补偿 |
| 修改 | sys_message_send_record |
connection_id/idempotency_key/attempt_no/provider_request_id |
记录每次渠道尝试和供应商请求 ID |
| 新增 | sys_dict_type/sys_dict_data |
连接平台、能力、身份策略、权威来源、同步/投递/回调状态 | tenant_id=1,全部使用 NOT EXISTS |
| 新增 | sys_resource |
企业协同连接、应用、同步、映射、消息/待办、回调权限 | 菜单与按钮资源使用 NOT EXISTS,并显式配置角色授权策略 |
| 新增 | sys_job_config |
全量校准、回调处理、消息补偿、待办补偿 Handler | 复用 Job 中心,不新增调度配置表 |
client_secret 加密写入 LOGIN 应用配置,再以 id + 旧值 比较更新清空旧列。sys_user_social 通过 tenant_id + platform 关联唯一连接回填 connection_id;空租户、重复连接或无法唯一归属的行进入阻塞清单,禁止猜测归属。REQUIRES_NEW 事务中比较更新;任一冲突回滚当前批次。| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /system/collaboration/connections/page |
GET | 分页查询当前租户连接,Secret 永不返回 |
| 新增 | /system/collaboration/connections/:id |
GET | 查询连接、能力和凭据状态摘要 |
| 新增 | /system/collaboration/connections |
POST/PUT | 创建/修改连接;敏感请求使用 @ApiDecrypt |
| 新增 | /system/collaboration/connections/:id |
DELETE | 逻辑删除未被活动同步/待办引用的连接 |
| 新增 | /system/collaboration/connections/:id/apps |
GET/POST/PUT | 管理登录、目录、消息、待办应用及 Secret 轮换 |
| 新增 | /system/collaboration/connections/:id/test |
POST | 按能力执行 Token/读取/测试消息连通验证 |
| 新增 | /system/collaboration/connections/:id/sync |
POST | 触发全量、部门、成员或标签同步,返回批次 ID |
| 新增 | /system/collaboration/sync-logs/page |
GET | 查询同步批次和阶段统计 |
| 新增 | /system/collaboration/sync-issues/page |
GET | 查询冲突/失败问题单 |
| 新增 | /system/collaboration/sync-issues/:id/resolve |
POST | 执行绑定、忽略、重试等显式处理动作 |
| 新增 | `/system/collaboration/mappings/orgs | users | posts |
| 新增 | /system/collaboration/deliveries/page |
GET | 查询消息和待办投递状态 |
| 新增 | /system/collaboration/deliveries/:id/retry |
POST | 对失败记录执行权限受控的人工重试 |
| 新增 | /system/collaboration/callback-events/page |
GET | 查询回调元数据和处理状态,不返回解密正文 |
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 兼容修改 | /social/platforms |
GET | 返回公开连接代码和品牌信息;不暴露 tenantId、enterpriseId 或应用 ID |
| 兼容修改 | /social/authUrl/:connectionCode |
GET | 服务端生成并保存一次性 state,绑定连接、应用、租户和动作 |
| 兼容修改 | /social/callback |
POST | 校验并消费 state,服务端完成平台登录,只返回短期一次性 socialTicket |
| 兼容修改 | /auth/login |
POST | OAuth2 分支只接受 socialTicket;旧 socialUuid 等字段不再作为身份依据 |
| 新增 | /collaboration/callback/:connectionCode/:appCode |
GET/POST | 按连接和物理应用定位回调凭据;企微 URL 校验和事件回调验签解密后快速持久化并应答 |
| 新增 | /collaboration/todo/entry |
GET | 消费待办入口票据、完成企微身份校验并安全跳转 Forge 待办 |
/system/socialConfig/* 在一个发布周期内保留只读或重定向能力;新增/修改统一进入新企业协同接口。AiCrudPage 配置中使用 :id,不使用 {id}。forge-starter-collaboration、forge-plugin-collaboration;修改 Social、System、Message、Flow、Job、Crypto、Outbound 和 Admin Server 装配。system/socialConfig.vue、新增企业协同管理工作台及 API。⚠️ 本变更涉及身份认证、权限、人员停用和流程状态动作,必须完成安全与权限人工审查后方可上线。
| 风险 | 级别 | 控制措施 |
|---|---|---|
| 客户把登录 Secret、通讯录 Secret、消息应用混为一套 | 高 | 独立应用模型;能力连通测试逐项验收 |
| 旧 OAuth 流程信任前端身份 | Critical | 一次性 state + 服务端票据;前端不再获得或提交可信身份资料 |
多企业 platform + uuid 冲突 |
Critical | 迁移到 tenant + connection + uuid 唯一键,歧义数据阻塞迁移 |
| 企微全量拉取中断导致误离职 | Critical | 完整快照成功后才处理未出现记录;失败批次不做停用 |
| 自动匹配错误合并员工 | Critical | 默认禁止手机号/邮箱自动合并,只允许已确认的唯一员工编码策略 |
| Secret/Token 泄露 | Critical | 认证加密/外部引用、掩码、空值保留、日志扫描、旧明文迁移门禁 |
| 外部回调越权审批或重放 | Critical | 验签、解密、时间窗、事件去重、身份映射、Forge 权限和任务状态复核 |
| Flowable 事务中调用外网导致流程阻塞 | 高 | 本地待办投影/回调收件箱,Job 异步出站和补偿 |
| 消息部分失败无法重试 | 高 | 逐接收人投递状态、确定性幂等键、错误分类和补偿 Handler |
| API 限流或 Token 刷新风暴 | 高 | 分页、速率控制、指数退避、Token 失效单次刷新、分布式刷新锁 |
| 超级管理员跨租户读取/重试 | 高 | Mapper XML 显式 tenantId 条件,Controller 权限和 Service 归属双校验 |
| 供应商 API/卡片能力与客户许可不一致 | 高 | P0 使用客户测试企业做纵向验证;未通过能力不得写入上线承诺 |
| 飞书/钉钉扩展仍需修改核心 | 中 | Fake Provider 合同测试和编排层平台分支静态扫描作为完成门禁 |
test-spec.md。Gate A 只确认本 Proposal 的范围、架构、优先级和安全默认值,不授权修改生产代码。Task 0 纵向验证与下列 M1 输入完成后,通过 Gate B 才进入
/apply。M2 输入在开始 Task 14 前确认,不阻塞 M1。
corpId,登录/通讯录/消息应用的 AgentId、Secret、权限截图;推荐按能力独立建应用,确需共用时明确共用范围。sys_org,以及 Forge 现有部门是否允许由企微接管。sys_post/sys_user_post;客户确认是否存在外部岗位编码。| 决策 | 选择 | 放弃方案 | 原因 |
|---|---|---|---|
| 模块边界 | 通用 Starter SPI + Collaboration Plugin 编排 | 全部写进 forge-starter-social 或企微专用业务类 |
避免 Starter 依赖 System/Message/Flow,支持后续 Provider 插拔 |
| 连接根 | 兼容升级 sys_social_config |
新建完全独立的企微配置表 | 复用现有管理和登录资产,降低迁移断裂 |
| 应用模型 | 连接下按能力独立应用配置 | 一套 clientId/secret/agentId 承载全部能力 |
企微实际权限和应用通常分离,后续平台也存在多应用场景 |
| 平台扩展 | Provider Registry + Connector 能力发现 | 业务层 switch(platform) |
新平台只实现 Connector,不修改主编排 |
| 目录权威 | 外部只管理映射拥有的数据,Forge 保留 RBAC 权威 | 全量镜像覆盖 Forge 用户/角色 | 避免同步误删和权限扩大 |
| 消息 | 复用消息主表/模板/接收人/记录,增加 COLLABORATION 渠道 |
另建企微消息中心 | 保持统一消息生命周期和运维入口 |
| 待办 | Forge 权威任务 + 本地可靠投影 | 企微成为任务主库或监听器同步调外网 | 保证流程状态一致,外网故障不阻断流程事务 |
| 调度 | 复用 Forge Job Handler | 新建同步 cron 配置表 | 统一启停、重试、日志和告警 |
| 凭据 | 扩展 PersistentCryptoService 使用版本化 AES_GCM,并保留外部 Secret Resolver 扩展点 |
明文、不可逆哈希、另造密文协议 | 调供应商 API 必须取回原文,复用现有 key ring 和迁移能力,认证标签可发现篡改 |
| 登录交换 | 服务端一次性 state + 一次性 socialTicket | 前端持有 AuthUser 后自报 uuid |
消除身份伪造、Token 和个人资料暴露 |
| 回调路由 | connectionCode + appCode 定位物理应用凭据 |
只按连接选择一套 Callback Token/EncodingAESKey | 同一连接可有通讯录、消息、待办等多个应用,回调凭据不能混用或随机选择 |
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| Research | completed | 本 Spec、tasks.md、test-spec.md、execution-log.md |
已完成代码现状、数据结构、依赖边界和安全风险调查;未修改生产代码 |
| Gate A:Proposal 确认 | pending | - | 用户确认范围、架构、优先级、安全默认值和分期方式;仅允许进入 Task 0,不授权生产代码修改 |
| Gate B:M1 实施门 | pending | - | Task 0 一期能力验证和 9.1 输入完成后,才进入 /apply 实施 P0/P1 |
| Gate C:M2 实施门 | pending | - | 9.2 待办资料完成后,才实施 Task 14-15;不阻塞 M1 Review/UAT/上线 |