接入发布候选回执强制校验(09-06-release-gate-integrity)

这个提交包含在:
2026-09-19 14:25:33 +08:00
父节点 1f8d5b658a
当前提交 16b9cad98c
共修改 15 个文件,包含 722 行新增和 91 行删除
@@ -1,3 +1,72 @@
## 2026-09-19 F1诊断处置及最终冻结
未改执行输入的单文件52项一次通过;独立复核承认三次R1校验不在该测试执行范围内。保留原失败与根因未知,不做推测性修复/预算扩容,不合并分阶段重验。定向证据足以支持本地提交,不能替代完整候选验收。
按已批准顺序:本次本地提交封存15路径及验收记录;最终clean SHA仅运行一次既有verify-candidate,沿现有受管环境/原浏览器版本/并发/预算/零重试/33页7组/分层覆盖,不另造验收流程。使用新独占证据目录和已有浏览器缓存的物理副本,无下载、无历史覆盖;运行期间仅写ignored证据。失败即保留并回报,不自动重试。具体SHA/命令与环境边界在提交后的ignored交接中固定,不再改本提交的受管文件。推送/部署未授权。
## 2026-09-19 F1超时最小诊断(沿用已批准定向验证范围)
静态提取与摘要已排除“三次R1 require启动开销进入生命周期用例”的假设:测试只执行REMOTE片段,三个校验都在片段外,片段及测试夹具未变。不改变生产校验、测试预算、并发、重试或断言,不凭一次耗时比较修改产品。
Claude仅运行未改的deployment-db-lifecycle.test.js完整52项一次;ignored封装器核执行输入前后SHA、记录真实exit/UTC/耗时、每秒采样本地load/CPU与内存压力/cgroup计数。采样只描述当次环境,不追认前次因果。成功也保留原exit1并交主会话判断;失败停报,不循环重跑。此前125/另外46项/独立代码结论沿原输入保留,本轮不重跑。该诊断属于既有失败验证,不改变验收范围;真实部署/推送仍未授权。
## R1 接入方案(2026-09-19,已批准本地实施)
### 当前事实与授权
最新:用户已明确回复“是”,批准本节本地实施及新版执行顺序;以下规划时点描述保留追溯。测试交Claude,推送与部署未授权。
基线为本地分支codex/20260919-reviewed-candidate的1f8d5b65,前两笔本地提交已完成。用户同意推进R1方案;本轮仅源码只读分析和任务合同更新,没有执行测试、真实发布入口、生产访问或提交。本地接入/启用已获用户具体方案批准(实现结果与验收状态见implement顶部),生产部署仍独立授权。
旧r6全绿属于旧输入,budget-full-r1中止FAIL/130;当前候选不能借它们取得资格。本节建议将“本地接入拒绝未验候选”与“真正对外发布”分开:本地补丁与定向验证先完成,最终clean SHA只跑一次完整门禁,合格后才可在另获部署授权时使用真实入口。该顺序取代旧设计中容易导致先全量、再改入口、又全量的执行歧义,不降低完整通过前不得发布的要求。
### 最小修改范围与行为
| 文件 | 接入位置与行为 |
| --- | --- |
| scripts/qa/release-gate-result.mjs | 复用verifyReleaseEvidence/readBundle/facts等,增加供入口使用的导出断言及require CLI;重算资格,失败非零,不信任回执中的PASS或调用者布尔值。明确校验期望发布commit。 |
| scripts/qa/run-release-gate.sh | verify-candidate维持无部署;ci-release/all复用同一验证路径或消费显式指定有效回执,再走production-identity-bootstrap;deploy只消费回执,不隐式跑全量。保留all额外smoke-local,安排在唯一verify-candidate之前;不将它冒充必需阶段,也不重复static/full-local。 |
| deploy/trialrun/production-identity-bootstrap.mjs | 正常发布在读取SSH配置/探测真实目标前要求回执;保留身份发现、origin核验和数据库身份。进入deploy-existing前再核对。identity-only/preflight-only明确只读分支不产生发布资格。 |
| deploy/trialrun/deploy-existing.sh | 正常发布在远端聚合体检前要求回执;保留来源/身份/迁移/回滚窗口preflight,并在调用deploy.sh前用实际source_commit再校验。只读preflight仍能单独运行且必须退出。 |
| deploy/trialrun/deploy.sh | 参数合法性检查后、来源fetch或环境读取前验证;取得SOURCE_COMMIT后绑定同一SHA,并在第一条远端写入mkdir之前再次重验。保留git archive不可变同步、existing/initialize边界、数据库生命周期和部署健康检查。 |
策略摘要显式纳入新增消费入口;全仓源码快照、工具链/CI并发、证据文件摘要、分层清单、清理完成与clean判据全部保留。无schema/业务/迁移/账号/编号/差旅状态变更。仅这5个执行文件及直接配套测试、已有部署规约/任务记录;若暴露新的业务风险另列。
### 回执输入与无重复执行合同
- 拟用RELEASE_GATE_RECEIPT_DIR传递显式回执目录,仅允许工作树artifacts/release-gate下的受限真实目录;沿用反路径逃逸/符号链接/证据SHA检查。RELEASE_GATE_ARTIFACT_DIR继续只表示生成新回执的位置,两者职责不混用。
- 共享断言重算完整release-predeploy资格,并把当前HEAD、回执commit及实际SOURCE_COMMIT绑定;缺失、失效、dirty、工具/策略变化或不完整均拒绝。不得产生GATE_PASSED、SKIP_RELEASE_GATE等信任开关,不自动选择“最新”或历史通过回执。
- verify-candidate仅验证。ci-release/all是显式完整发布命令:有显式回执则重验复用;无回执才调用verify-candidate一次。bootstrap/deploy-existing/deploy.sh及deploy模式无回执立即拒绝并提示先验证,不自动启动耗时全量;这替代旧§2“高层缺回执自动验证”的默认行为。
- 下层重复的是廉价回执校验,不是测试执行。verify-candidate绝不回调部署,生产引导器绝不回调ci-release/all;成功路径部署链只调用一次。
- 对PRODUCTION_IDENTITY_ONLY/PRODUCTION_READ_ONLY_PREFLIGHT严格校验0/1。只读入口不要求发布回执,但任何只读标记都不能继续进入写入;ci-release/all/deploy拒绝以只读标记伪装发布成功。原纯只读脚本不变,本轮也不实际执行它们。
- 阻断时只输出稳定原因与下一步,不回显环境/SSH配置/原始payload。回执不是部署授权,也不是不可伪造签名;源码有写权限的操作者不在防伪承诺内。
### Claude负责的限定验证(获批实施后)
主会话实现后交Claude执行测试与只读review;现在不运行。本轮新增/扩充现有release-gate-result.test.mjs、release-gate-shell.test.mjs,必要的跨入口执行测试放release-gate-enforcement.test.mjs及私有fixture;复用已有部署生命周期/来源测试,不新增生产测试开关。
1. 表驱动覆盖6种入口:ci-release、all、deploy、bootstrap、deploy-existing、deploy.sh。缺/旧/错profile/伪PASS/dirty/不完整回执时,正常发布不得读取真实配置或触发远端命令;写动作计数必须0。
2. 合成有效回执只允许原生产链一次;核static/full-local至多一次、显式回执复用不再跑static/full-local(all仍保留额外smoke-local)、无递归;仅捕获fake命令,不真实发布。
3. 上层已过、下层调用前改HEAD/index/受控文件或篡改证据时仍拒绝;实际归档SOURCE_COMMIT与受验SHA不同必须拒绝。
4. 独立只读分支可完成fake只读检查但写动作0;各种内部/skip/只读标记不能变成写入豁免。来源、迁移、init/server/worker隔离与120秒健康检查合同保留。
5. 对真实入口/判定源码作隔离副本变异:去掉上层前置、下层重验或放宽commit/clean判定时,对应负例必须失败;不只grep字符串。所有SSH/Docker/rsync/git-fetch、SSH配置和真实env读取必须受测试替身封闭,禁止真实外联/配置读取,临时文件仅清理本轮owner。
定向命令(实际补丁落地后Claude执行,数量按实际记录,不提前写通过):
```bash
node --test scripts/qa/tests/release-gate-result.test.mjs scripts/qa/tests/release-gate-shell.test.mjs scripts/qa/tests/release-gate-enforcement.test.mjs
npm test --prefix server -- tests/unit/scripts/deployment-db-lifecycle.test.js tests/unit/scripts/deployment-safety-contract.test.js tests/unit/scripts/check-source-provenance.test.js
```
仅因修改相关文件才纳入对应测试,不跑浏览器/PG/业务全量。规划时新enforcement测试尚不存在;现已落地,命令待Claude执行,不能当作已通过。若验证需要超出这里的范围,先报告缺口;不恢复冻结差旅、不修无关旧警告。
### 提交、完整验收与回退
- 本地补丁获批→主会话实施→Claude定向测试及只读复核→主会话按批准范围提交最终输入;不先跑完整再改产品/QA代码。
- 最终候选冻结后,完整门禁交Claude一次执行;期间不改受管代码、测试、任务或规约,只写ignored证据。失败保留并按具体缺陷处理,不盲目重跑。
- 完整通过后仍须另获推送/部署授权;首次部署独立执行/回执比对及同候选12项公网义务保留,不能把NOT_RUN_LOCAL或本地PASS当成公网通过。生产编号与银行接受性另列。
- 若R1补丁有误,停止发布并保留失败,修复或按授权回退本补丁;不增加disable开关,不借回退无门禁发布。没有数据库/真实配置变更,无须数据恢复;既有线上版本不受本地规划/修复影响。
## 2026-09-19 r5-fixed-r1登录复用边界
四完整文件31项30通过/1失败,采购整链、R75及视觉25项全部通过;付款在经理复核登录后按已有redirect参数返回付款页,而共享login仍应验portal。最小修正仅允许显式reuseLoginPage且当前为无search/hash的规范/login时省略goto;带redirect的登录页必须走原goto('/login')清除返回目标。保留真实表单和portal/profile断言、全部付款下游及300秒;不修改认证产品或接受任意登录落点。原失败保留,类型检查后相同四完整文件复验,再从static完整候选。