agent-exec transport 4850241e27f1c2a6adc176f4273e7aa3/8b465090dff7

This commit is contained in:
agent-exec-transport
2026-10-23 14:27:38 +00:00
parent c1e209a064
commit bb1f891268
@@ -0,0 +1,101 @@
# 独立 Review:fix/gitea-endpoint-migration(最终轮,合入前)
- 日期:2026-10-23;Review 会话:全新独立会话(本会话未参与实施,只读代码 + 本报告一个产出)
- 对象:分支 `fix/gitea-endpoint-migration` 最终 HEAD `c1e209a064d994bbed9baffe297e1b5729bea5ab`,base=origin/main(真实 main tip 本地不可达,diff 基准经 blob 核验,见「diff 范围一致性」;本地最后合入主线的 merge-base 为 `0650e811`)
- 实施 diff:`/tmp/gitea-mig-final-review.diff`
- 背景:Gitea 迁移(web https://gitea.naitangbaobao.cn、SSH 52222)全链路适配 + 14 组件 pin 前移 + Backend #248 依赖 API 对齐 + rdm.pin 前移到迁移后 RDM main + legacy 生命周期用例条件化 + multi-instance cross_cancel 重试鲁棒性 + ci.yaml insteadOf 旧前缀映射。
- 上轮结论:r2 REVIEW PASS(2026-10-22,报告 `2026-10-22-gitea-endpoint-migration-review.md`);本轮对象在该 HEAD 之上新增 sync/transport 收尾提交,功能面以本轮 diff 为准复核。
## 总体判定
**REVIEW PASS(无阻塞项)。**
五项核对点全部通过:旧端点仅剩政策禁令、F4 观察、测试负例、ci.yaml legacy insteadOf 源前缀与历史记录(均有明确依据);14 组件 pin 全部前移且格式合法(离线无法验证祖先关系,依赖卡内已合入证据 + CI pin 闸,已如实注记);legacy 用例 skip 诚实(原因与单元层覆盖指针落档,核心守护断言全部无条件保留);cross_cancel 重试有界、只对 409 in-flight 生效、其余一律 Fatal 不吞错误;diff 无秘密。必需单测 39 项实测 OK。
## diff 范围一致性 ✅
- `git apply --reverse --check /tmp/gitea-mig-final-review.diff` 于 HEAD 工作树通过:diff 的 HEAD 侧与实际 HEAD 逐字节一致。
- ci.yaml 的 base 侧 blob `c155df2b`(真实 main tip 的较新版本,含两代端点注释与双 insteadOf)本地存在:`git cat-file blob c155df2b` + 正向应用 diff 的 ci.yaml 段 == HEAD 的 ci.yaml(cmp 通过),证明该 diff 即「较新 origin/main → 分支 HEAD」的真实 diff。
- 文件集合核对:supplied diff 文件集 == `git diff 0650e811..HEAD` 文件集 − `.task/fix-gitea-endpoint-migration.md`(任务卡,按惯例不在评审 diff 内),无多无漏。
- base 侧与本地 merge-base 的差异(ci.yaml base blob、agent-command/agent-intent/agent-native/agent-squad/backend 五个 pin 的 base 值)均为 main 在 merge-base 之后的独立前进,在本 diff 中表现为反向 hunk,已逐段核对,无冲突残留。
## 核对点结果
### 1) 端点一致性——无旧端点功能性残留 ✅
全仓扫描(排除 `.git/`、`.task/`)旧端点(git-home:30319、git-ssh:31411、git-panel:30319)仅剩以下项,全部非功能性或有 insteadOf 支撑:
| 位置 | 性质 | 判定 |
|---|---|---|
| `policy/facts.md:11,21` | 退役端点政策禁令 + F4 TLS 观察(单元规定 F4 不动) | 刻意保留,正确 |
| `.gitea/workflows/ci.yaml:442,732` | `GIT_CONFIG_VALUE_4` 旧 git-ssh 前缀作为 insteadOf **源**(改写到受信 https `$SERVER/weichen/`) | legacy 谱系支撑,见下 |
| `tests/test_facts_verify.py:312,373,378`、`tests/test_ci_credentials.py:167` | 负例/退役端点探针 | 语义正确 |
| `docs/superpowers/{plans,specs,reviews}/*.md` | 历史 CLOSED/MERGED 记录 | 豁免类 |
ci.yaml 双 insteadOf(KEY_2=新前缀、KEY_4=旧前缀,同键多值 → `$SERVER/weichen/`)覆盖三代嵌套 pins URL:迁移后 main 的 pin(新前缀)、prev_sha=379263c0(RDM 迁移分支 tip)、legacy_sha(旧前缀)——旧 URL 命中 KEY_4 被改写到受信 https 基址后经 token 头取件,CI 无 SSH key 也不会 host key 失败。prev/legacy 谱系旧 URL 属预期。
新端点两形态全仓一致(sort|uniq 核对):web `https://gitea.naitangbaobao.cn`(无端口;`:30320`/`:443` 仅为 test_facts_verify 负例)与 SSH `ssh://git@gitea.naitangbaobao.cn:52222/weichen/<Repo>.git`(26 处:`.gitmodules` 14 条、registry.json rdm、svc.sh RDM_ORIGIN_DEFAULT、ci.yaml 3 处 allowlist + 2 处 insteadOf、测试期望、facts F3)。无混写(新域名无旧端口,旧域名无新端口)。
### 2) pin 前移的合理性 ✅(离线边界如实注记)
- 14 个 gitlink(modules/core、backend、frontend、documents、ui;deps/development-guidelines、agent-native、agent-squad、agent-intent、error-code-system、logging-system、agent-command、development-manager、agent-document-renderer)全部前移,均为 40 位 hex。
- `tests/integration/lifecycle/rdm.pin`:sha=`9034b662`(RDM main,#480/#481 合并后 tip,含端点迁移 + recall-eval/WP-P2.5)、prev_sha=`379263c0`(RDM 端点迁移分支 tip,与 sha 同为 6-pin 布局,两者间仅差在途栈合并、无 store schema 迁移)、legacy_sha=`72bb1fec` 不变(承载「无 identity」语义,早于 6-pin 布局)。注释与取值一致;格式由 `tests/test_lifecycle_pin`(本轮实测通过)与 CI 的严格 40-hex 解析器双重把关。
- **边界(NOT_RUN 注记)**:本会话 `network=false` 且 14 个子模块未物化(`.git/modules` 为空),无法本地验证各新 pin 的祖先关系与端点内容;「前移均指向各仓已合入迁移的 main(Backend #248、RDM #480 等已合入,卡片有 Review 记录)」采信任务卡证据,最终由 PR CI 的 pin 物化与 fetch-rdm-pin 闸强制(不可达即 CI 红灯,不会静默放过)。
### 3) legacy 生命周期 skip 处理诚实 ✅
`test_legacy_candidate_refused_before_stop`(tests/integration/lifecycle/test_lifecycle_real.py):
- 核心守护断言全部**无条件**保留且先于 skip 分支执行:deploy 必须失败(returncode≠0)、旧进程 pid 不变、服务仍 alive、db inode 不变、data 目录内容不变——「停旧服务前拒绝、不改已有库」的安全语义在任何路径下都被断言。
- skip 分支仅在物化失败(`"pins 子模块物化失败"`——与 svc.sh:2486 实际报错串一致——或 git `fatal:`+`clone`)时触发,即明确到不了 identity 拒绝点的场景;skipTest 消息记录了原因与单元层覆盖指针,指针核实无误:`tests/test_svc_identity.py:345` 正是 `test_U1_update_refuses_identityless_candidate_keeps_old_state` 内对 `候选产物不支持 identity 管理` 的断言。
- 卫生:skip 前先 `svc("leg", "stop")` 清理,不留进程。identity 拒绝语义在可物化路径下仍由 `assertIn("不支持 identity", result.stdout)` 实测。
- 非阻塞注记:`fatal:`+`clone` 启发式理论上可能把无关失败误判为物化失败(svc() 将 stderr 并入 stdout);最坏后果是一次显式 skip(CI 日志可见、原因落档),不会把 identity 断言假通过,可接受。
### 4) cross_cancel 重试有界且不吞错误 ✅
`postMessage`(tests/integration/multi-instance/multi_instance_test.go):
- 有界:`maxInFlightRetries = 3`(至多 4 次 POST);重试前重新 `waitConversationIdle`(其自带 20s 预算,超时自身 Fatal,不会无限等)。
- 不吞错误:仅当 `code == 409 && strings.Contains(raw, "in-flight")` 且未到上限才重试——精确匹配卡片记录的服务端 409 "conversation already has an in-flight run" 文案;其他状态码、超限后的 409 一律 `t.Fatalf`(带状态码与 body 前 300 字节)。文案变更时重试失配 → 显式失败,不会静默。
- 语义安全:409 是服务端拒绝本次写入(上一消息 run 异步启动晚于 idle 观察,TOCTOU),被拒 POST 无副作用,重试不产生重复消息。`strings` 已在导入清单,`e.raw` 复用现有 helper;gofmt 与 `go vet` 均通过。
### 5) 无秘密 ✅
对全量 `+` 行扫描(token 形态、AKIA/xox/ghp、PEM 头、password/api_key 赋值、Bearer、长随机串):命中仅为 `${{ secrets.SUBMODULE_TOKEN }}` 注入线、`synthetic-*-not-a-real-secret` 测试 token、`$SUBMODULE_TOKEN`/`$GITEA_TOKEN` 变量引用、文件路径/测试名/SHA hex。token 值仍只经环境(facts-verify 进程内读 `~/.secrets/gitea`、CI secrets 注入),无凭据值入仓。
## 本地实测(SELF,离线)
- `PYTHONDONTWRITEBYTECODE=1 python3 -m unittest tests.test_facts_verify tests.test_ci_credentials tests.test_lifecycle_pin tests.test_svc_precheck -q` → **Ran 39 tests, OK**
- `bash -n` scripts/task.sh、svc.sh、facts-verify.sh 通过;`py_compile` task_triage.py 通过;plugins/registry.json JSON 合法;`gofmt -l` 无输出、`go vet ./...` 干净(multi-instance 包)。
- NOT_RUN(如实标注):端点可达性(F1—F3 curl/ls-remote)、14 pin 的远端祖先验证——本单元 network=false;以实施侧 F1/F2/F3 PASS 记录与 PR 必需 CI 为准。
## 非阻塞建议(不阻塞合入,仅记录)
1. ci.yaml 较新 main 上的「两代端点 + 双 insteadOf」注释在分支版本中未保留(同键多值功能等价,仅文档损失);后续如有人调整该段建议补回两行注释。
2. 两处 RDM-pin 步骤的最终 `unset` 清单含 KEY_0..3 而不含 KEY_4/VALUE_4:因同步 `unset GIT_CONFIG_COUNT` 且二值非机密(URL 改写),无泄漏、无功能影响,仅为清单与导出不完全对称。
3. `tests/test_svc_realcombo.py` 的 `ci_git_env` 只映射新前缀(COUNT=4):realcombo 场景全部使用迁移后 pin,旧前缀映射仅 CI 内两处 RDM-pin 步骤需要——现状正确,若日后在 realcombo 引入 legacy pin 需同步补映射。
4. F4 判据刷新、compat/integration 过渡分支清理维持卡片登记的后续任务不变。
## 复现命令
```bash
# diff 一致性
git apply --reverse --check /tmp/gitea-mig-final-review.diff && echo MATCH-HEAD
git cat-file blob c155df2b > /tmp/base-ci.yaml # base 侧逐字节核验(正向应用后 cmp HEAD)
# 旧端点残留(应仅剩 facts 禁令/F4、负例、ci.yaml legacy insteadOf 源前缀、历史文档)
grep -rn "u1680832" . --exclude-dir=.git --exclude-dir=.task --exclude-dir=docs
# 新端点形态归一
grep -rhn "gitea\.naitangbaobao\.cn" . --exclude-dir=.git --exclude-dir=.task \
| grep -oE "(ssh://)?git@gitea\.naitangbaobao\.cn:[0-9]+|https://gitea\.naitangbaobao\.cn(:[0-9]+)?" | sort | uniq -c
# 必需单测
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest tests.test_facts_verify \
tests.test_ci_credentials tests.test_lifecycle_pin tests.test_svc_precheck -q
```
## 证据与边界
- 本报告测试输出为本地离线实测(SELF 级);网络类验证 NOT_RUN 已逐项标注,交付信任由 PR HEAD 的必需 CI 复核。
- 审阅者为全新独立会话,未参与实施;本轮仅产出本报告,未修改任何其他文件,工作树保持未提交状态。