feat: close provider promotion and support access gates
Build and Test Quality Gate / Contract Web typecheck and build (pull_request) Successful in 3m58s
Build and Test Quality Gate / Python tests and Contract API migration (pull_request) Failing after 29m6s
Security Quality Gate / npm audit, Bandit, pip-audit, detect-secrets (pull_request) Successful in 15m55s

This commit is contained in:
2026-08-11 15:21:14 +08:00
parent 9768491485
commit ff6ea2877e
77 changed files with 10281 additions and 588 deletions
@@ -1071,3 +1071,17 @@ P0 阻断项包括:durable grant/revocation 与跨节点一致性缺失、检
- 当前可锁定资源只有合同和审查任务;审计动作锁定合同锚点;模板尚无稳定的租户/版本资源行,因此固定返回 `support_access_resource_not_lockable`。任何缺失、漂移、锁超时、策略损坏或依赖错误均 fail closed,且不返回资源内容、token、session 或 grant。
- 事务要求无 `new/dirty/deleted` 状态变化,policy/revocation/operation/approval/identity/event/outbox 快照保持不变。真实 support access、身份执行器、共享会话、impersonation 与破坏性身份写接口继续关闭,No-Go 不变。
- 验收证据:enforcement 与 support access 持久化专项 `5/5`,计划/特权身份/投递/反滥用组合 `59/59`,真实 PostgreSQL 隔离专项 `3/3`,Python compileall、`git diff --check` 和危险路由扫描通过;随机 schema 残留为 `0`。
闭环范围仅限 deny-only validation 和可锁资源锚点;真实资源读取、强认证与会话/设备绑定、跨节点撤销传播、逐请求不可变审计/告警、隐私与法律门禁仍是后续独立阶段。任何具名法务签批必须由实际法务责任人针对正式版本留下可核验证据,AI 或项目人员不得代签、推定完成或伪造姓名、日期、签名、批准记录及生效版本。
## 36. support access 安全控制账本与逐请求审计复核(代码验收,发布 No-Go,2026-08-10)
迁移 `20260809_0045` 新增 fail-closed singleton control、追加式 control events、脱敏 request audits 和 audit outbox。默认 kill switch、外部 IdP 和隐私法律门禁全部阻断,`executor_enabled=false` 同时由 DTO、ORM 和数据库 CHECK 约束。控制账本和请求账本在 SQLite/PostgreSQL 均禁止 UPDATE/DELETE。
- 每次内部验证先锁 control,再按固定顺序锁 policy、operation、approval/identity 和可锁资源;资源只在 tenant/deleted 条件及行锁内生成 anchor hash,不返回资源内容。
- policy 撤销在同一事务递增 revocation epoch 并追加事件;请求携带的 observed epoch 必须与数据库一致。配置的 5 秒 SLA 仅是 fail-closed 策略上限,尚未在多服务节点和真实缓存/消息基础设施上测量。
- IdP assertion、MFA 类型、step-up 时间、session/device hash 和 audience 是受信内部认证边界输入,不是面向客户端的凭据,也不证明外部 IdP、WebAuthn、硬件 OTP 或会话生命周期已经接通。
- 每个 deny-only 决策在同一事务先 flush 不可变 audit,再追加 outbox;PostgreSQL 即时外键确保不存在孤立 outbox,失败时整体回滚。审计只保存哈希、门禁状态、错误码、epoch 和 trace,不保存资源内容、token、session 或原始身份字段。
- SQLite 专项 `24/24`、真实 PostgreSQL `3/3`、全量 Contract API `281 passed, 3 skipped`,其中 3 个 PostgreSQL opt-in skip 已由真实专项补齐;运行态 OpenAPI 中 support access API `0`、危险身份写路由 `0`。
发布仍为 **No-Go**。需要外部完成的门禁是:真实 IdP/MFA 与会话绑定集成、跨至少两个节点的撤销传播 SLA 测量、kill switch 控制面/权限/告警演练、真实资源授权后读取,以及具名隐私和法务批准。不得根据内部 assertion 字段、控制表或自动化测试推定这些门禁已经通过。
@@ -14,6 +14,8 @@
## 2. P0 发布阻断项
状态说明:本节保留首次评审时的历史阻断基线,不随代码整改直接改写。后续关闭或部分关闭状态以第 6、7 节复核为准;基础设施或 validation-only 验收不得被解释为真实 support access 发布批准。
1. **无运行时可信授权源**:当前策略材料是纯内存输入,没有持久化 grant、撤销记录、单一真相版本或跨实例一致性协议。任何接入都可能读取陈旧授权。
2. **TOCTOU 未闭合**:validation-only 检查与未来资源访问不在同一受控事务/策略执行点;检查后账号、工作空间、scope、revision 或撤销状态仍可能变化。
3. **可信时间未定义**:`checked_at` 由内部调用方传入,尚未绑定数据库时间或受保护的服务端时钟;不能作为真实自动到期依据。
@@ -59,8 +61,22 @@
发布结论仍为 **No-Go**。尚未关闭的 P0 包括:授权检查与资源读取 TOCTOU、统一 deny-by-default enforcement point、强认证与会话/设备绑定、撤销跨节点传播 SLA 与 kill switch、逐请求不可变审计/告警,以及隐私与法律门禁。真实 support access、身份执行器和共享会话不得启用。
## 7. 锁内 deny-only enforcement 复核(2026-08-09)
## 7. 第二次整改复核:锁内 deny-only enforcement(2026-08-09)
第 25 阶段已完成统一 deny-only validation enforcement point、固定动作到 scope/resource 的服务端映射、PostgreSQL 锁后 `clock_timestamp()` 复核,以及合同/审查资源锚点的同事务锁定。所有决策仍固定 `enforcement_status=denied`、`access_granted=false`、`executor_enabled=false`,未增加 API、资源内容读取、token/session 或 impersonation。
历史 P0 状态更新如下:第 1 项 durable policy/revocation 基础和第 3 项 validation 使用的数据库可信时间已关闭;第 2 项 TOCTOU 与第 7 项统一 enforcement point 只在 deny-only validation 和当前可锁资源锚点范围内部分关闭,尚未覆盖真实资源读取与使用;第 4 项强认证/会话绑定、第 5 项跨节点撤销传播与 kill switch、第 6 项逐请求不可变审计/告警、第 8 项隐私与法律门禁仍未关闭。
新增的内部 enforcement contract 只允许固定资源动作,并在 policy、审批/主体、撤销记录和可锁定资源锚点全部取得行锁后刷新状态。即使 `policy_satisfied=true`,决策仍固定 `enforcement_status=denied`、`access_granted=false`、`executor_enabled=false`;模板等缺乏稳定资源锚点的动作直接拒绝。该实现未增加路由、transport、凭据、session 或 impersonation。
本阶段已完成验证,但不能宣称完整 check-use TOCTOU 已关闭;真实资源读取尚未接入同一事务,强认证/MFA、设备/会话绑定、撤销传播 SLA、逐请求审计/告警及隐私/法律门禁仍未完成。发布结论继续为 **No-Go**。
具名法务批准必须来自实际法务责任人对正式版本的可核验证据;AI、研发、测试或运营不得代签、推定、补写或伪造姓名、日期、签名、批准记录及生效版本。没有真实批准证据时,隐私与法律门禁必须保持未完成。
## 8. 第三次整改复核:安全控制账本与逐请求审计(2026-08-10)
`20260809_0045` 已补齐 deny-only 内部路径的 fail-closed control、revocation epoch、默认启用的 kill switch、受信认证断言契约、资源锁内 anchor、逐请求不可变 audit 和同事务 outbox。PostgreSQL 并发启动只创建一个 baseline control event,audit 在 outbox 前 flush 以满足即时外键,两者仍在同一事务中原子提交或回滚。
历史 P0 状态再次更新:第 5 项的 durable revocation epoch 和默认 kill switch、第 6 项的逐请求不可变审计/outbox 已在内部 deny-only 范围部分关闭;第 2、4、5、6、7、8 项仍不能整体关闭。原因是当前没有真实资源内容读取、外部 IdP/WebAuthn/硬件 OTP/session 集成、多节点传播测量、kill switch 运维控制面与告警演练、审计消费/告警链路以及具名隐私法律批准。
发布结论继续为 **No-Go**。运行态不存在 support access API,危险身份写路由为 `0`,所有决策和数据库约束保持 `access_granted=false`、`executor_enabled=false`。`revocation_sla_seconds<=5` 是待验证的目标,不是已通过的跨节点 SLA;内部请求中的 assertion/hash 也不是认证系统签发或验证证据。
@@ -301,7 +301,7 @@ legal_name: string | null
### 9.4 第二阶段已完成
- **AI 生产发布门禁**:新增 `GET /api/v1/quality/release-readiness` 和可供 CI 调用的 `python -m yuqei_ai_platform_api.release_readiness_gate`。生产环境必须启用非占位 Provider、可解析 URL 与凭据、关闭 fallback、通过黄金资产和引用策略检查,并提供指定的真实 `acceptance_run_id`。离线黄金资产结果明确标记为不验证 Provider 输出。
- **AI 生产发布门禁**:新增 `GET /api/v1/quality/release-readiness` 和可供 CI 调用的 `python -m yuqei_ai_platform_api.release_readiness_gate`。生产环境必须启用非占位 Provider、可解析 URL 与凭据、关闭 fallback、通过黄金资产和引用策略检查,并提供共享预发布持久化的完整 Provider 验收清单 `acceptance_run_id`。单条审计运行 ID、缺少 10+8 样本、10 张知识卡、资产哈希或结构化具名法务审批证据时均失败关闭。离线黄金资产结果明确标记为不验证 Provider 输出。
- **协议版本与同意留痕**:新增公开协议目录和受控同意记录查询接口。个人与组织注册必须逐项提交服务端目录中的当前精确版本;缺失、重复、额外或客户端自定义版本均被拒绝。
- **注册事务一致性**:工作空间、owner/admin、账户、凭据和四条同意记录在同一事务中创建,任一写入失败整体回滚。`20260801_0034` 新增 `identity_agreement_consents`,记录工作空间、用户、协议类型、版本、服务端同意时间、注册来源、客户端 IP 和 User-Agent。
- **注册前端闭环**:个人与组织模式均从同源协议目录加载必签项,逐项展示政策链接、精确版本和“草案未生效”状态;未全部勾选时提交禁用,模式切换清空已有同意。
@@ -319,7 +319,7 @@ legal_name: string | null
### 9.6 下一阶段优先项
1. 将真实 Provider 验收扩展到审查、生成、条款推荐等完整黄金套件,并在共享预发布环境持久化通过的审计运行 ID;单场景隔离验收不得替代完整发布证据。
1. 真实 Provider 验收固定覆盖实际调用模型的 10 条法律问答与 8 条合同审查,并在共享预发布环境持久化完整验收清单;合同生成与条款推荐继续由独立确定性产品黄金套件验证,不伪装为 Provider 调用。单场景或单条审计运行 ID 不得替代完整发布证据。
2. 完成四份政策的具名法务审核、正式版本号、生效时间、历史版本查询和再次同意策略。
3. 在现有全局账号兼容层上收口统一凭据、已验证邮箱归并、账号合并/拆分和成员关系恢复流程,避免仅凭相同邮箱长期承担跨空间身份绑定语义。
4. 补齐平台管理员多人治理、支持访问授权审计,以及个人套餐、配额、用量和数据退出能力。
@@ -724,7 +724,7 @@ P0 后续 backlog:建立 durable grant/revocation 与跨节点一致性;绑
明确非目标:没有 API、Web、token/session、impersonation、transport、真实 grant/revoke 或身份执行入口。No-Go 继续生效;下一 P0 应优先设计统一 deny-by-default enforcement point 和同一请求内的 TOCTOU 闭合,同时保留强认证、撤销传播、逐请求审计及隐私/法律门禁。
### 9.44 第二十五阶段:deny-only enforcement point 与锁内资源复核(进行中,2026-08-09)
### 9.44 第二十五阶段:deny-only enforcement point 与锁内资源复核(已验收,2026-08-09)
1. **P0-ENFORCEMENT-1 固定动作契约(完成)**:动作只能来自闭合集合,由服务端映射到 scope/resource;未知动作不能构造请求。
2. **P0-ENFORCEMENT-2 锁内复核(完成)**:内部 repository 在同一事务中按固定顺序锁 policy、operation、审批主体、support principal、撤销记录和合同/审查资源锚点,锁后刷新并重新使用可信数据库时间检查。
@@ -732,3 +732,78 @@ P0 后续 backlog:建立 durable grant/revocation 与跨节点一致性;绑
4. **P0-ENFORCEMENT-4 回归门禁(完成)**:enforcement 与 support access 持久化专项 `5/5`,计划/特权身份/投递/反滥用组合 `59/59`,真实 PostgreSQL 隔离专项 `3/3`,compileall、diff-check、危险路由扫描通过,随机 schema 残留 `0`。
明确非目标:不增加 enforcement/support-access/execute/grant/revoke API,不读取或返回合同内容,不创建 token/session,不启用身份执行器。
闭环边界:本阶段只验收 deny-only validation 契约和锁内资源锚点复核,不构成真实资源访问、support access 发布或身份执行批准。后续仍须依次完成强认证与会话/设备绑定、跨节点撤销传播与 kill switch、逐请求不可变审计/告警,以及隐私和法律门禁。具名法务签批只能由实际承担责任的法务人员基于正式版本和可核验证据作出;AI、研发、测试或运营人员不得代签、推定已签批,或伪造法务姓名、签批日期、签名、批准记录和生效版本。缺少真实签批证据时必须继续标记为未完成和发布阻断。
### 9.45 第二十六阶段:support access 安全控制账本与逐请求审计(代码验收,外部门禁阻断,2026-08-10)
1. **P0-SUPPORT-SEC-1 全局 fail-closed 控制(完成)**:迁移 `20260809_0045` 增加 singleton control 和追加式控制事件,默认 `kill_switch_engaged=true`、`external_idp_ready=false`、`privacy_legal_gate_approved=false`、`executor_enabled=false`;数据库 CHECK 禁止打开执行器。
2. **P0-SUPPORT-SEC-2 撤销 epoch 与并发启动(完成)**:policy 撤销在同一事务递增 control version/revocation epoch 并追加不可变事件;PostgreSQL 并发 bootstrap 通过 `INSERT ... RETURNING` 只产生一条 baseline 事件。`revocation_sla_seconds<=5` 是策略目标,不是跨节点实测结论。
3. **P0-SUPPORT-SEC-3 强认证输入契约(内部完成,外部未验收)**:内部请求要求受信认证边界传入 IdP assertion、WebAuthn/硬件 OTP 类型、step-up 时间、session/device hash、固定 audience 和 revocation epoch。当前没有外部 IdP/WebAuthn/session API 集成,调用方布尔值或 hash 不能被解释为真实 MFA 已完成。
4. **P0-SUPPORT-SEC-4 TOCTOU 与逐请求证据(完成于 deny-only 范围)**:合同/审查资源使用 tenant/deleted 过滤并在 `FOR UPDATE` 后生成脱敏 anchor hash;同一事务先追加不可变 request audit,再追加 outbox,外键或 outbox 失败整体回滚。模板继续稳定返回 `support_access_resource_not_lockable`,任何结果仍固定 `access_granted=false`。
5. **P0-SUPPORT-SEC-5 回归门禁(完成)**:SQLite support/persistence/migration `24/24`,真实 PostgreSQL 随机 schema `3/3`,全量 Contract API `281 passed, 3 skipped`;3 个 skip 均为 opt-in PostgreSQL 专项且已单独真实运行通过。Alembic 单一 head `20260809_0045`,随机 schema 残留 `0`,运行态 support access API `0`、危险身份写路由 `0`。
发布结论仍为 **No-Go**:尚缺真实外部 IdP/MFA 与会话生命周期集成、两个以上真实服务节点的撤销传播时延测量、kill switch 运维控制面和告警演练、真实资源内容的授权后读取路径,以及具名隐私/法务批准。身份执行器和 support access API 继续关闭。
### 9.46 第二十七阶段:动态 Provider 故障门禁与产品黄金套件分界(技术验收,外部审批阻断,2026-08-10)
1. **P0-AI-PROVIDER-1 超时与降级(完成)**:真实 loopback HTTP 服务注入延迟,验证稳定超时错误和脱敏审计;staging 仅在显式开关下允许 fallback,production 即使误配 fallback flag、缺密钥或返回非法结构也不得 fallback。
2. **P0-AI-PROVIDER-2 验收边界(完成)**:真实 Provider acceptance 只覆盖实际调用 Provider 的 10 条 Legal QA 和 8 条合同审查,不再把确定性产品生成伪装为 `/legal/qa`。
3. **P0-AI-GOLDEN-3 产品黄金套件(完成)**:独立脚本直接调用 Contract API 模板渲染和条款推荐逻辑,23 个合同生成与 8 个条款推荐共 `31/31` 技术通过;缺失必填业务值保留为明确占位符。
4. **P0-AI-LEGAL-4 法务与预发布证据(阻断)**:10 张知识卡、10 条问答、8 条审查及 31 条产品黄金资产均未具备真实具名审批证据,自动化结果保持 `needs_legal_review`、`legal_approved=0`。当前本机没有共享预发布 Provider 凭据或已批准的运行证据,因此未生成、伪造或持久化 `acceptance_run_id`。
自动化证据:AI Platform `113/113`、Infra `32/32`、产品黄金门禁 `31/31` 技术通过;本地运行 AI Platform 使用 mock/disabled Provider,`provider_acceptance_verified=false`,不得作为真实联网验收。
### 9.47 第二十八阶段:Provider 整套验收清单与共享预发布持久化门禁(技术完成,外部法务审批阻断,2026-08-10)
1. **P0-AI-MANIFEST-1 独立追加式验收清单(完成)**:新增 `provider_acceptance_runs`、Alembic `20260810_0023` 至 `20260810_0025`,持久化租户、共享预发布来源、Provider 配置、10 条问答、8 条审查、10 张知识卡、18 条逐样本审计绑定、两类资产哈希、具名法务审批时间、共享证据引用/哈希及具名法务 Ed25519 审批信封元数据。整份清单使用规范化 SHA-256 生成幂等 ID,表无 update/delete 接口。
2. **P0-AI-MANIFEST-2 失败关闭发布门禁(完成)**:生产 release readiness 不再接受单条 `AiRunAudit`。每次检查重新核验租户、当前 Provider/模型、精确样本与知识卡集合、样本输入绑定、18 条无 fallback/错误且质量/引用达标的审计、资产哈希、清单哈希、具名审批人、带时区且晚于全部输出的审批时间及非占位共享证据。旧单审计 ID、缺字段、9/10、7/8、9/10、错绑、错 hash、跨租户和事后篡改均阻断。
3. **P0-AI-MANIFEST-3 共享预发布受限登记(完成)**:只在 `environment=staging`、`repository_backend=sqlalchemy` 且启用服务鉴权时开放内部登记;通用 service key 之外还必须提供受信 keyring 中具名法务 Ed25519 审批信封,服务端重新读取共享证据并校验真实内容 hash,旧 HMAC 直接拒绝。`source_environment=shared_staging` 和 policy version 由服务端写入,客户端不能自报。重复证据幂等返回同一 ID,并处理并发唯一键竞争。
4. **P0-AI-MANIFEST-4 法务审批边界(阻断)**:Provider acceptance CLI 默认仍只产出脱敏 `needs_legal_review` 证据且不登记 ID。只有显式提供覆盖 10+8+10 的结构化具名法务审批文件、Ed25519 签名和可信 keyring、共享证据 URI 与服务端重新计算的真实 SHA-256,且 18 条技术结果全部通过时,才调用共享预发布登记接口。当前未收到真实法务文件、共享 staging 真实运行或真实 `acceptance_run_id`,未生成或伪造任何外部证据。
5. **P0-SUPPORT-TOCTOU-5 锁语义复核(完成于 deny-only 范围)**:治理锁计划完成与资源锁内观察分别由 `locks_acquired`、`resource_observed_under_lock` 表示;kill switch 拒绝时前者为 true、后者为 false,资源存在且全部安全门满足时两者均为 true。真实 PostgreSQL 随机隔离 schema 的事务/故障回滚/support access 三项 `3/3` 和 SQLite support access `7/7` 通过,schema 已清理;执行器、support access API 和真实资源授权后读取继续关闭。
自动化证据:AI Platform `149/149`、Infra `64/64`、产品黄金 `31/31` 技术通过;AI Platform 在全新 SQLite 验证 `0023` 至 `0025` 完整升级与回退,表、法务审批列、唯一约束和复合索引均存在。外部具名法务审批、真实共享预发布 Provider 全套运行、真实证据对象内容 hash、真实 `acceptance_run_id`、受保护 CI 签名收据和生产只读 canary 仍是发布阻断项。
### 9.48 第二十九阶段:共享预发布签名验收收据到生产只读验证(技术完成,真实证据阻断,2026-08-10)
1. **P0-AI-PROMOTION-1 非对称签名收据 v2(完成)**:共享预发布在完整 aggregate manifest、18 条 audit binding、10 张知识卡和具名法务 Ed25519 审批再校验通过后,导出规范化 receipt v2 payload;CI/预发布侧使用 Ed25519 私钥签名。生产只持公钥 keyring,不能生成或伪造收据。收据覆盖 tenant、目标 production audience、不可变 release ID、目标 image digest、Provider/model/base URL/wire API/temperature/max tokens、已发布 Prompt 内容 hash、质量策略 hash、资产与清单 hash、法务证据及签发/生效/到期时间。
2. **P0-AI-PROMOTION-2 生产离线只读验证(完成)**:生产 readiness 仅从只读 receipt/keyring 文件验证签名、部署 SHA-256 pin、租户、release、运行时指纹、有效期、最大 TTL、公钥生效期与撤销状态。有效收据可在 production acceptance/audit 空库下幂等复核;实现和 spy 回归均确认 `get_provider_acceptance_run()` 与 `get_ai_run_audit()` 调用为 `0`。缺失、未 pin、篡改、过期、未来签发、超长 TTL、未知/撤销 key、跨租户/release 或 runtime 漂移均失败关闭,且不得回退本地数据库。
3. **P0-AI-PROMOTION-3 签发与部署隔离(完成)**:Provider acceptance CLI 新增 receipt 私钥、key ID、目标 release/image digest 与独立输出路径四参数成组校验,仅在取得真实 `acceptance_run_id` 后从 shared staging GET payload、严格校验绑定并原子写出独立 JSON;摘要只记录 `receipt_id` 与文件 SHA-256。生产 Compose 只读挂载 receipt/keyring;preflight 强制 release/image digest、文件 hash pin、TTL/clock skew,并拒绝法务私钥、签名私钥和 staging 数据库凭据。
4. **P0-AI-PROMOTION-4 API 与身份边界(完成)**:仅增加 authenticated staging-only receipt payload GET;没有 receipt import/write、promotion POST、execute、support access 或身份写 API。身份执行器继续关闭,promotion 不引入生产状态消费写入;同一有效收据允许只读幂等复核,重放范围由 tenant、audience、release、runtime 与短有效期共同限制。
5. **P0-AI-PROMOTION-5 外部门禁(阻断)**:本阶段没有伪造具名法务审批、真实 Provider 结果、真实 `acceptance_run_id`、签名私钥或生产收据。上线仍需具名法务完成 10 张知识卡和 18 条 Provider 结果审批,共享预发布运行并持久化真实 manifest,由受保护 CI 签发 receipt v2,运营维护公钥轮换/撤销 keyring 后再执行生产 preflight 与只读 readiness。
自动化证据:AI Platform 全量 `149/149`、promotion/registration 定向测试通过,Infra 全量 `64/64`、产品黄金 `31/31`;Ed25519 真实签名/验签、服务端 evidence bytes/hash、生产空 acceptance/audit 数据库、零 repository 回查、tamper、tenant/release/runtime/image digest、时间边界、双 key 轮换/撤销、无效收据不回退、只读挂载、SHA-256 pin 和敏感生产配置拒绝均已覆盖。Python 编译与 `git diff --check` 通过;本机无 Docker CLI,因此 Compose 使用静态回归验证,未声称执行了 `docker compose config`。
### 9.49 第三十阶段:具名法务签名与真实证据内容绑定(技术完成,真实法务签批阻断,2026-08-10)
1. **P0-AI-LEGAL-1 两阶段职责分离(完成)**:`collect` 只运行 10 条法律问答和 8 条合同审查并生成确定性、脱敏技术包;`finalize` 只消费已收集的精确技术包、具名法务审批信封和 trusted keyring,不重新运行 Provider,也不允许 CI 代替法务作出审批决定。
2. **P0-AI-LEGAL-2 Ed25519 具名审批(完成)**:审批 payload 绑定 tenant、approver、role、organization、Provider 配置、10+8+10 清单、18 条 audit binding、技术包 hash、证据 URI/hash、批准与到期时间;服务端验证受信公钥、key 有效期/撤销、签名和全部字段绑定。旧 HMAC 在受保护登记 API 明确返回 `422`。
3. **P0-AI-LEGAL-3 真实内容 hash(完成)**:共享预发布服务端按 host allowlist、超时和大小上限读取 evidence bytes,并重新计算 SHA-256;只提交 URI 和调用方声明 hash 不能通过。18 条 audit 同时绑定精确 bundled sample question 与脱敏 audit snapshot hash。
4. **P0-AI-LEGAL-4 追加式持久化(完成)**:Alembic `20260810_0025` 持久化 approval ID/key/signature/approver/role/organization/expiry/technical package hash;ORM 与迁移均保留 tenant+manifest 唯一约束,无 update/delete API。
### 9.50 第三十一阶段:受保护 promotion 与多节点控制(技术完成,现场演练阻断,2026-08-10)
1. **P0-AI-CI-1 受保护 CI(完成)**:`.github/workflows/provider-promotion.yml` 绑定受保护 shared-staging environment,执行 `collect/finalize`,只上传 allowlist promotion artifacts,并在 job 结束清理 service key、法务材料和 receipt 私钥。
2. **P0-AI-CI-2 多节点只读 canary(完成)**:新增 `verify-provider-promotion-nodes.py` 与 canary workflow,要求至少两个节点报告同一 release、receipt、key 和 image digest;远程 service-auth 节点强制 HTTPS,loopback 仅用于测试。
3. **P0-AI-CI-3 撤销与 kill switch(完成)**:支持 revoked key 传播 SLA 轮询、超时失败关闭、全局 promotion kill switch 及跨节点传播确认;readiness 暴露脱敏只读诊断,不输出 service key、私钥或本地文件路径。
4. **P0-AI-CI-4 现场边界(阻断)**:代码与自动化不能替代双节点真实部署、撤销时延测量和 kill switch 运维演练;未形成真实运行证据前不得标记运营门禁通过。
### 9.51 第三十二阶段:release/image 绑定与真实 promotion 闭环(技术完成,外部真实性阻断,2026-08-10)
1. **P0-AI-IMAGE-1 receipt v2(完成)**:receipt 强制绑定 `target_image_digest=sha256:<64 hex>`;production preflight 验证 `AI_PLATFORM_RELEASE_IMAGE_DIGEST` 与部署的 `AI_PLATFORM_API_IMAGE@sha256:<digest>` 一致,release 或 image 漂移均失败关闭。
2. **P0-AI-IMAGE-2 运维诊断(完成)**:readiness 返回 verification mode、verified、kill switch、release、image digest、receipt id、key id 和 expiry,不返回签名材料或内部路径。
3. **P0-AI-IMAGE-3 API 边界(完成)**:OpenAPI 仅保留共享预发布登记/读取、receipt payload GET 与 readiness GET;生产不提供 receipt import/write、promotion POST、Provider execute、support access 或身份写 API,身份执行器继续关闭。
4. **P0-AI-IMAGE-4 真实闭环(阻断)**:共享预发布目前仍未部署 `0025` 且真实 Provider/fallback 门禁未配置;尚无真实具名法务签名、共享 evidence object、`acceptance_run_id`、receipt v2、受保护 promotion bundle 或生产双节点 canary。不得用本机 memory/mock/loopback 结果补造这些证据。
本轮结论:六项顺序中的前五项已完成代码、迁移、CI 契约和自动化验证;第六项只能由真实法务与共享预发布/生产运维共同完成,当前保持 **No-Go**。下一次执行顺序固定为:部署当前代码及 Alembic `0025` 到共享预发布,配置真实 Provider 并关闭 fallback,运行 `collect`,由具名法务签署精确技术包,运行 `finalize` 取得真实 `acceptance_run_id` 和 receipt v2,再执行生产只读双节点 canary、撤销 SLA 与 kill switch 演练。
### 9.52 第三十三阶段:真实 Provider 技术包与最终发布审查(技术闭环,生产 No-Go,2026-08-11)
1. **P0-AI-LIVE-1 共享预发布与真实联网(完成)**:共享预发布已升级至 Alembic `20260810_0025`,真实动态 Provider 为 `ccswitch` / `gpt-5.6-sol`,调用开启、fallback 关闭、服务鉴权和反滥用开启。最终 `collect` 对 10 条法律问答和 8 条合同审查 `18/18` 技术通过、问题 `0`,状态为 `needs_legal_review`。
2. **P0-AI-LIVE-2 精确技术包(完成)**:远端技术包 `provider-technical-review-package.json` 大小约 195 KiB,SHA-256 为 `ed1830430e8049397800cc75e9c24bac85a093a268bb669cf9d8db862adac9f2`。首次复跑发现输出文件名意外带尾随 `?`,安全扩展名校验按预期拒绝;修正命令后未放宽路径规则并成功构包。
3. **P0-AI-PROMOTION-3 防绕过复核(完成)**:底层 receipt 构造器不再允许旧 HMAC attestation 替代具名审批;shared staging readiness 在 fallback 开启时失败关闭;receipt payload 导出会从持久化字段重建并重新验证具名法务 Ed25519 签名、trusted keyring 和共享 evidence bytes/hash。即使直接篡改数据库并同步重算 acceptance manifest hash,也不能导出 receipt payload。
4. **P1-WEB-MOBILE-4 窄屏导航(完成)**:移动端改为菜单按钮和抽屉侧栏,补齐遮罩、关闭按钮、路由关闭、`Esc`、滚动锁、工作空间切换和退出;关闭态侧栏使用 `visibility:hidden`,不可被键盘焦点命中。390×844 页面宽度等于视口、控制台 `0 error`。
5. **P0-REGRESSION-5 最终自动化(完成)**:Python `454 passed, 3 skipped`;3 个 opt-in PostgreSQL 项在真实随机隔离 schema `3/3`;产品黄金 `31/31`;Web typecheck 与 101 路由 production build;npm audit、pip-audit、Bandit、待提交源码 secret 和 diff-check 均通过。
6. **P0-PRODUCTION-6 正式上线门禁(阻断)**:具名法务尚未对 10 张知识卡和 18 条真实结果签名,因此没有 `acceptance_run_id`、receipt v2 或 promotion bundle。服务器同时缺少 production env、production secrets、preflight 目录、异地备份挂载、TLS/DNS/不可变镜像/阿里云切流证据和双节点 canary;production 容器数为 `0`,根盘约 `91%` 使用。不得启动 production compose 或把 smoke 重命名为 production。
发布结论:当前代码、共享预发布技术验收和内部审查已达到可交付给具名法务及生产运维的候选状态,但正式生产仍为 **No-Go**。下一顺序不可跳步:具名法务签署精确技术包和共享 evidence -> `finalize` 生成真实 `acceptance_run_id`/receipt/promotion bundle -> 建立并通过 production preflight、备份恢复和容量门禁 -> 部署至少两个生产节点 -> 执行只读 canary、撤销 SLA、kill switch 与回滚演练 -> 全部门禁通过后才允许切流。
@@ -35,32 +35,49 @@
运行命令:
```bash
# 1. 共享预发布收集技术包,不登记 acceptance_run_id
python3 yuqei-infra/scripts/run-ai-provider-acceptance.py \
--base-url https://<backend-domain>/ai \
--mode collect \
--base-url https://<shared-staging-domain>/ai \
--service-key-file /etc/yuqei/secrets/ai-platform-service-key \
--tenant-id default
--tenant-id default \
--review-package-file /protected/provider-technical-review-package.json
# 2. 具名法务签署精确技术包后,验签、核验共享证据并登记/签发 receipt v2
python3 yuqei-infra/scripts/run-ai-provider-acceptance.py \
--mode finalize \
--base-url https://<shared-staging-domain>/ai \
--service-key-file /etc/yuqei/secrets/ai-platform-service-key \
--tenant-id default \
--review-package-file /protected/provider-technical-review-package.json \
--legal-approval-file /protected/named-legal-approval.json \
--legal-keyring-file /protected/legal-trusted-keyring.json \
--receipt-private-key-file /protected/provider-receipt-ed25519.pem \
--receipt-key-id provider-acceptance-2026q3 \
--target-release-id v2.0.0-rc.1 \
--target-image-digest sha256:<64-hex-image-digest> \
--receipt-output /release/provider-acceptance-receipt.json \
--promotion-bundle-output /release/provider-promotion-bundle.json
```
报告写入 `project-docs/qa-artifacts/v2-ai-provider-acceptance/<timestamp>`,不记录 Provider key。
报告默认写入 `.runtime/v2-ai-provider-acceptance/<timestamp>`,不记录 Provider key。只有显式提供覆盖 10 条问答、8 条审查和 10 张知识卡的结构化具名法务审批文件,并由具名法务 Ed25519 私钥对规范化技术包签署、由共享预发布受信 keyring 验签,且服务端重新读取共享证据并校验真实内容 hash 时,工具才向启用服务鉴权与 SQLAlchemy 持久化的共享预发布接口登记完整验收清单并返回真实 `acceptance_run_id`;通用 service key 或旧 HMAC 不能替代法务证明,否则保持 `needs_legal_review` 且不登记 ID。
## 尚未完成
## 当前状态(2026-08-11 更新)
1. 尚未取得真实 Provider 的 base URL、模型名、价格和 API key,因此不能执行真实模型验收。
2. 尚未提供正式后端域名和 TLS 证书,因此不能验证 HTTPS edge。
3. 尚未建立镜像仓库并发布三个 digest 镜像。
4. 尚未在 3.90 挂载异地备份目录,不能执行真实备份/恢复演练。
5. 模板、Prompt 和 18 条 Provider 样本仍需具名法务签批。
1. `192.168.3.90` 的共享预发布已部署至 Alembic `20260810_0025`;AI Platform 使用真实动态 Provider `ccswitch` / `gpt-5.6-sol`,Provider 调用开启、fallback 关闭、服务鉴权和反滥用开启。此前“仍是旧版本、调用关闭、fallback 开启”的描述已失效。
2. 真实联网 `collect` 已完成 10 条法律问答和 8 条合同审查,技术结果 `18/18` 通过、问题数 `0`,状态严格保持 `needs_legal_review`。技术包位于共享预发布 `.runtime/v2-ai-provider-acceptance/2026-08-11-shared-staging-collect-final/provider-technical-review-package.json`,SHA-256 为 `ed1830430e8049397800cc75e9c24bac85a093a268bb669cf9d8db862adac9f2`。
3. 10 张知识卡与上述 18 条真实结果尚未由实际具名法务签署精确技术包;共享证据对象、法务 trusted keyring 和 receipt signing key 也尚未形成完整受保护输入。因此没有真实 `acceptance_run_id`、receipt v2 或 promotion bundle,禁止执行 `finalize`。
4. 生产基础设施仍未建立:`/etc/yuqei/production.env`、`/etc/yuqei/production-secrets`、`/var/lib/yuqei/preflight` 和异地备份挂载均不存在,production 容器数为 `0`;正式 TLS/DNS、不可变镜像和阿里云前端切流也没有验收证据。
5. 生产双节点 receipt/release/image digest canary、撤销传播 SLA 和 kill switch 演练尚未执行。服务器根盘当前使用率约 `91%`,仅余约 `18 GiB`,正式部署前必须完成容量治理和回滚空间确认。
6. support access 仍为 deny-only:真实 IdP/MFA、会话绑定、跨节点撤销、真实资源授权后读取、告警消费和具名隐私/法务门禁未完成;support access API 与身份执行器继续关闭。
在上述外部配置具备前,production preflight 应继续失败,系统保持 smoke/UAT,不切生产流量。
在上述外部门禁具备前,production preflight 必须继续失败,系统保持共享预发布/UAT,不启动 production compose、不切生产流量。
## 本轮验证
## 2026-08-11 验证
- `python -m pytest yuqei-infra/tests -q`:6 项通过。
- AI Platform API 全量测试:通过。
- Contract Web typecheck 与 production build:通过,83 个路由生成成功。
- production example preflight template mode:通过。
- Bandit:0 findings;8 个固定 suppression 已由精确 allowlist 测试锁定。
- `git diff --check`:通过。
- 3.90 Docker Compose v2.27:base + production override 普通与 `ops` profile 均通过 `config --quiet`;未启动任何 production 容器。
- 远端渲染结果:Contract Web 未激活;PostgreSQL、Redis、MinIO、Contract API、AI Platform API 均只绑定 `127.0.0.1`;edge 仅暴露 80/443。
- 当前 smoke `provider_runtime=warning`:调用关闭、fallback 开启、默认 Provider 无 base URL/secret ref,符合“尚未真实验收”的预期。
- Python 全量:`454 passed, 3 skipped`;3 个 opt-in 项已在 `192.168.3.90:5432/yuqei_contract` 的随机隔离 schema 中单独 `3/3` 通过并清理。
- Contract Web typecheck 与 production build:通过,101 个路由生成成功;390×844 抽屉、`Esc`、关闭态键盘可达性、正文横向溢出和控制台均通过真实浏览器复核。
- 产品黄金套件:合同生成 23 条、条款推荐 8 条,共 `31/31` 技术通过,法务状态保持 `needs_legal_review`。
- 真实 Provider:`18/18` 技术通过、fallback `false`、问题 `0`,技术包 hash 已与远端文件重新计算结果一致。
- npm audit、pip-audit、Bandit 均为 0 漏洞/0 findings;待提交源码 secret 候选为 0。本地 Git 忽略的 `.env.local` 仍由开发者自行保管且不进入版本库。
- `git diff --check`、Next.js production build、PostgreSQL 事务/故障回滚/outbox/support access 并发门禁均通过。