feat(cosh-ng): [core,shell] automate auth - #3298
Conversation
|
CI 首跑结果已保留: 唯一失败是本 PR 已调整的 修正仅将该断言改成同时按 CR/LF 分隔,仍严格要求完整行等于 |
c4b4396 to
9de6967
Compare
kongche-jbw
left a comment
There was a problem hiding this comment.
Review baseline: b067c661ffbba8adf9aea5fc6c406023849bc7cc...9de696753c2c667665d0c42199edd9c365e0747f
[P1] 将启动预取也移入可取消的独占探测任务
src/cosh-ng/crates/cosh-shell/src/auth/runtime.rs:191 在 /auth 建立面板前同步调用
prefetch_sysom_menu,后者通过普通 registry_query 执行 auth.prepare。当空闲的
live core 存在时,这条查询会占用共享 core;在非 ECS 或 metadata 卡住时,主事件线程会
等待 registry 超时,期间没有 capture 或 panel 可接收 Esc/Ctrl+C。因此新增的
EcsProbeTask 只保护选择后的 fallback path,未覆盖正常 /auth 入口,prepare 阻塞
场景仍不可取消,也不满足探测使用本轮独占进程的边界。
Possible direction: 先创建 auth 状态并渲染可取消的 checking panel,再通过
start_ecs_probe("prepare") 获取菜单预取结果;补充首次 prepare 挂起的 raw_cli 回归,
断言 /auth 可立即取消,且 worker 与临时 core 均已回收。
🔍 Automated Code ReviewPR: #3298 feat(cosh-ng): [core,shell] automate auth Summary本 PR 将 ECS RAM Role 认证从同步阻塞式原始 TCP 元数据查询升级为异步有界 IMDSv2 HTTP 探测,并在 shell 层实现了完整的 ECS 认证状态机(Preparing → Checking → Waiting → Submitting / TimedOut / Failed / Cancelling),消除首配时的人工确认步骤。核心变更包括:
FindingsP2-1:
|
| 维度 | 状态 |
|---|---|
| 静态评审(diff 交叉验证) | ✅ 已完成 |
| cargo fmt / clippy / test | |
| 方案合理性 | ✅ 已覆盖 |
| 功能完备性 | ✅ 已覆盖 |
| 文档完整性 | ✅ 已覆盖(user-guide 未确认) |
| 安全 | ✅ 已覆盖 |
| 代码质量 | ✅ 已覆盖 |
未覆盖范围与剩余风险:
- 未执行
cargo fmt/clippy --workspace --all-targets/cargo test --workspace——PR 作者声明 ARM64 ALinux 容器上 148 项测试通过、fmt/clippy 通过,但需 CI 独立验证 - macOS workspace Clippy 被主干已有阻断(
cosh-platform/src/checkpoint.rs:1736),不在本 PR 范围内 - user-guide 是否需要同步更新未确认
- 实机 ECS 验收记录属于末轮修复前的证据,末轮 ECHILD/ActiveRun 修复的实机覆盖未声明
结论
未发现 P0 或 P1 阻塞问题。 整体方案设计合理、安全防御到位、测试覆盖充分。3 条 P2 和 1 条 P3 均为改进建议,不阻塞合并。建议作者确认:
- user-guide 是否需要同步更新 ECS 认证流程描述
- P2-1 的上界重试是否需要在 drop 中增加防御性超时
|
已对照 修复范围已确认:配置快照读取成功后先建立可取消的菜单准备面板,复用现有 边界保持明确: 另核对了当前 CI:GitHub 注解明确为 |
🔄 Incremental Code Review — PR #3298Reviewer: SummaryThis PR replaces the synchronous raw-TCP ECS metadata probing with an async IMDSv2 (tokenized) transport, introduces a full ECS auth polling state machine in cosh-shell, adds auto-naming for first-time providers, and hardens the auth form with Provider ID collision detection. The security posture is substantially improved: no IMDSv1 fallback, no redirect following, response size bounds, token marked sensitive, error types that never carry upstream bodies or credentials. Overall verdict: No blocking issues found. The design is sound, the crate boundaries are respected, i18n MessageIds are correctly appended, and the test coverage is thorough across lib / logic / protocol / raw_cli layers. FindingsP2 — Test fixture uses a hardcoded past timestampFile: P2 — ECS poll error strings bypass i18nFiles: P3 — Unknown save stage has no user-actionable retryFile: P3 —
|
| Dimension | Covered | Notes |
|---|---|---|
| Design soundness | ✅ | Crate boundaries, IPC wire contracts, minimal scope |
| Functional completeness | ✅ | Error paths, i18n (4 steps), 5-layer tests |
| Documentation | ✅ | Doc comments on new modules explain invariants |
| Security | ✅ | IMDSv2 enforcement, fail-closed, no secret leakage |
| Code quality | ✅ | No dead abstractions, proper ownership, no ? anti-patterns |
Not covered:
- Tests were not executed (requires Linux + PTY). The PTY-dependent tests in
raw_cli/auth_ecs.rsandprotocol/ecs_probe.rsneed Linux validation. - Runtime performance under metadata service latency was not benchmarked.
Remaining risks:
- The 200s
WAIT_LIMITis generous; a user waiting that long on a misconfigured instance may have a poor experience. Consider whether 60–120s would suffice. - The
EcsFlowstate machine has 9 stages with cross-cutting transitions. Future changes should add state-transition documentation to prevent regression.
This review was produced by reviewer (automated code review). Findings are based on static analysis of the diff against the cosh-ng codebase conventions defined in AGENTS.md.
🔄 Incremental Code Review — PR #3298PR: feat(cosh-ng): [core,shell] automate auth
变更摘要
Findings未发现阻塞问题(P0/P1)。 P2 — 建议改进1.
2.
P3 — 风格/观察3.
4.
验证与覆盖声明
未执行验证: 静态评审,未执行 剩余风险:
结论增量变更质量良好,修复了两个边界条件(ECHILD 子进程回收、ActiveRun panel 残留),测试覆盖充分,验收脚本归档合理。未发现阻塞问题。 |
9de6967 to
e01e6a5
Compare
|
本轮已推送 入口 prepare P1:已采纳并修复
三份自动评审的逐项处置对应 #issuecomment-5694700483、#issuecomment-5694934744、#issuecomment-5695273653:
验证与限制ARM64 ALinux 3:认证过滤 lib 12 + bin 157 + raw_cli 20,以及 ECS protocol 7,共 196 项通过;fmt、shell all-targets Clippy、layout、inventory/necessity 通过,临时容器已清理。这里是定向验证,不是整个 crate/workspace 全量通过。末次独立复审代理未能启动,已做源码级手动回核,不冒称独立终审通过;本轮没有新 ECS 或视觉证据,旧实机材料的版本边界已同步到 PR 正文。 前次 CI 的 15 分钟超时取消记录保留(raw_cli 540 passed / 0 failed / 1 ignored,shell_host 未完成);当前新候选等待 CI,未修改 CI 时限,也不自动合并。 |
🔄 Incremental Code Review
Scope note: This scan was triggered because the PR FindingsP1 —
|
🔄 Incremental Code Review
总体结论本次变更聚焦
代码在安全边界(token 标记 sensitive、错误响应不携带原始 body、凭据不外传)和所有权/取消语义上做了大量回归测试,整体方案合理。 FindingsP1 —
|
kongche-jbw
left a comment
There was a problem hiding this comment.
Review baseline: 26aced8550e551abf092a9e6ae4fafa5ad634ba0...e01e6a5a45162bc88579f4a5d33e1666cca5ec8d
[P1] 避免在确认子进程所有权前按 PGID 发送信号
src/cosh-ng/crates/cosh-shell/src/adapter/ecs_probe.rs:113
在继承 SIGCHLD=SIG_IGN 时,probe 退出后会被内核自动回收;此时 PID/PGID 可能已复用,
但 drop 仍先执行 kill(-pid, SIGKILL),直到之后的 try_wait() 才看到 ECHILD。
在 PID 压力下,取消或正常完成一次短探测可能杀死无关进程组。现有 ignored-SIGCHLD
测试只断言原 PID 消失,没有验证复用后的进程组不被信号命中。
Possible direction: 在发信号前用不会复用的生命周期句柄确认并保持所有权(Linux 可用
pidfd,或由专用 helper 持有并回收进程组),且一旦观察到 ECHILD 就禁止再按数值 ID
发信号。补充继承 SIGCHLD=SIG_IGN 并强制 PID/PGID 复用的 protocol 回归,断言
sentinel 进程组存活。
|
PR number: #3298 Findings
Validation未执行工具或测试。剩余风险是跨 |
|
PR number: #3298 1. 验证范围
2. 结果分类Blocked 容器启动失败:
宿主无 Docker/Podman 后端,且规则禁止将 PR 编译和测试降级到 host,因此没有首跑或复跑结果。 3. Findings 验证
4. 补充测试无。T1 作业未修改源码。 5. 证据索引
6. 未运行 scope
7. 结论Blocked — container 后端缺少 arm64 默认内核,无法执行 focused scope;静态评审的 P1 结论无需修正。 |
🔄 Incremental Code Review
总体结论本次扫描检测到 PR #3298 的 因此本次增量评审不引入新的代码 findings,仅对已有 findings 的状态进行跟踪更新。 Findings 状态更新P1 — 为 integration test 新增未登记的 production public API(已证实,仍待修复)
此前正式评审(2026-09-16 18:10 CST)中仍未关闭的 Findings以下 findings 在本次扫描中未观察到对应代码修复或状态更新,仍保持有效:
验证与覆盖声明
下一步建议
|
CI 首跑失败与复跑记录(候选
|
🔄 Incremental Code Review
Scope note本次扫描触发原因是 PR 的 因此,本次无新增 diff 需要评审。前序自动化评审结论(P0–P3 findings)仍然有效。 验证与覆盖声明
结论PR 本次更新为非代码变更,不产生新的 finding。建议维护者继续等待 CI 全量结果与人工终审后再决定是否合并。 This review was produced by |
e01e6a5 to
e1ddfea
Compare
|
已推送 已修复[P1] 在确认所有权前按 PGID 发信号(#pullrequestreview-5221350395) 核实成立。回收入口原先无条件
[P1] 为 integration test 新增未登记的 production public API(#issuecomment-5696738555、#issuecomment-5696871913) 登记缺失成立: 不采纳“收窄为 不改代码,附依据
验证与未运行范围ARM64 ALinux 3 容器:探测判定 1 项、 |
|
PR number: #3298 Findings
验证未执行工具或测试。现有 focused CI 不能证伪上述竞态;完整 crate/workspace 与确定性 PID/PGID 复用验证未运行。 |
|
PR number: #3298 1. 验证范围
2. 结果分类
3. Findings 验证
4. 补充测试无;T1 未新增测试源码。 5. 证据索引无截图。命令证据保存在 6. 未运行 scope
7. 结论No-Go:focused scopes 虽为绿色,但两项 P1 finding 均被证实;静态评审结论不需要修正。 |
🔄 Incremental Code Review
评审范围: PR #3298 自上次评审后的当前提交集,42 files,+5414/-465 lines。 FindingsP2 - 文档完整性
验证与覆盖声明
剩余风险集中于真实 ECS 元数据服务与 PTY/信号时序的环境差异。 |
🔄 Incremental Code Review — PR #3298Title: feat(cosh-ng): [core,shell] automate auth FindingsP1 — Process-global SIGCHLD disposition is mutated without serialization or restoration
P2 — Documentation not updated for public CLI/auth behavior change
P2 — TOCTOU window between
|
kongche-jbw
left a comment
There was a problem hiding this comment.
Review baseline: c648fc4fd83f...f794aad21ff8
[P1] 不要把任意 SIGCHLD handler 当作可回收性保证
src/cosh-ng/crates/cosh-shell/src/adapter/ecs_probe.rs:131 会保留所有非
SIG_IGN 处置,但常见的 SIGCHLD handler 会在回调中调用
waitpid(..., WNOHANG) 主动回收子进程。若它在第 157 行的
try_wait() == Ok(None) 与第 161 行的组信号之间回收 probe,PID/PGID 仍可被
复用,kill(-pid, SIGKILL) 仍可能终止无关进程组。新增测试只安装空 handler,
没有覆盖这种实际的 reaper。
Possible direction: 仅在能结构性保证组 leader 不会提前被回收时按数值 PGID
发信号;否则拒绝启动,或由不会提前退出的 supervisor 持有组生命周期。请补一个
handler 实际调用 waitpid(WNOHANG) 的 protocol 回归,并在检查后退出/复用交错下
断言 sentinel 进程组存活。
|
PR number: #3298 Findings
验证未执行工具或测试。当前 CI 绿色不能覆盖 SIGCHLD reaper/PID 复用交错;完整 crate/workspace 回归亦未独立验证。 |
🔄 Incremental Code Review
范围说明
因此,本次增量评审未发现新增代码 diff。PR 的 Findings(按 P0–P3 分级)无新增代码 diff,故无新增 findings。 验证与覆盖声明
总结本次扫描触发重新评审条件,但 PR 代码基线未发生变化。无需针对新增 diff 提出阻塞性意见。请维护者按需决定是否基于最新评论调整范围。 |
|
PR number: #3298 1. 验证范围
2. 结果分类
3. Findings 验证
4. 补充测试无;本次为 T1 验证,现有代码与目标测试已足以确认 findings。 5. 证据索引无截图证据。 6. 未运行 scope
7. 结论No-Go — focused scopes 全部通过,但两个 P1 finding 均被证实;静态评审结论无需修正。 |
|
跟进 #pullrequestreview-5230696115(kongche-jbw)、#issuecomment-5708026328、#issuecomment-5708121184(zhoukailong),以及我账号下 codex-auto-review 的 #issuecomment-5708105581 与 #issuecomment-5708285438(判 No-Go)。head 仍为 [P1] 自定义 SIGCHLD reaper 抢先回收 probe:不采纳代码改动,附结构性依据与反证四方一致指出: 该场景在本二进制不可达(grep 证据)在
即:probe 子进程的可能回收者只有 "中和任意 handler" 不安全(回归实测坐实)我按建议试做了"把任意非 这说明"中和任意 handler"会误伤进程内合法的 SIGCHLD 使用者( 关于 serialize + restore考虑过"保存原处置→探测期间强制 DFL→探测后恢复 + 全局锁串行"。它需要跨异步探测生命周期持有全局锁并做恢复,恢复窗口仍有缝,且是为不可达场景新增回收脚手架——与本任务"不加恢复脚手架、最小机械"的约束相左。既然 grep 已证不可达,不做。 结论与残留边界保持当前 其余重复项
CI: |
🔄 Incremental Code Review
范围说明
对 P1「SIGCHLD/PGID 复用竞态」的独立复核:撤回对作者申辩中的关键证据在 head
结论: Findings(按 P0–P3 分级)
验证与覆盖声明
总结本轮无新增代码 diff。作者对 P1 的结构性申辩经独立复核成立,原 P1 撤回;无新增阻塞项,文档项与 P3 观察项维持非阻塞建议。PR 当前 |
f794aad to
4debaa2
Compare
|
跟进 #issuecomment-5711028989(zhoukailong)。感谢独立复核并撤回 P1。 新候选
范围与提交纪律:以 其余项维持上轮口径:文档同步由维护者决定(新增文档请求,非既有文档过期);P3 观察项中 client 重建与 provider 归一化属基线既有语义,建议单独提交带归因,不在本认证修复链内扩面。新候选等待 CI 重新验证,未自动合并。 |
kongche-jbw
left a comment
There was a problem hiding this comment.
本轮完整独立复审结论:当前实现总体合理,未发现仍成立的 P0/P1;保留 1 项 P2 文档同步问题,建议合并前补齐。此前关于自定义 SIGCHLD reaper 的 P1 撤回,原因见下文。
评审基线与范围
- 完整审查基线:
c648fc4fd83f6b4b570f6a724cd3f31022176c12 → f794aad21ff86dc52fd50be89a97ddb3d55cbaa3,覆盖全部 42 个文件的 diff、相关调用链/协议/测试,以及 #3278、PR 描述、提交、历史 conversation、全部 review 和作者回复。 - 提交本评论前重新抓取:当前 base/merge-base 为
8c7aac3994aa10b6ebef7d3d80f7d4e004fdf8e6,head 为4debaa26eeed6137cd8a092f82113397cd8a6095。已独立核对range-diff:前 6 个提交等价,第 7 个仅修改ecs_probe.rs的 doc comment;两个 head 之间整个src/cosh-ng的差异也仅此注释。已阅读最新作者回复,下面结论适用于该新 head。
保留的问题
[P2] 同 PR 补充 ECS 认证协议与生命周期设计文档
位置:src/cosh-ng/crates/cosh-core/src/registry/auth.rs 的 ECS verify 返回协议,以及 cosh-shell/src/auth/ecs_poll.rs、cosh-shell/src/adapter/ecs_probe.rs 的新生命周期。
本 PR 将 ECS verify 从 authorized 改为 status: ready/not_ready 配合 reason/error_code,并引入独占探测任务、自动轮询与提交、取消后 join/reap、保存结果未知时不自动重发等跨 shell/core 的约束,但当前 42 个变更文件没有组件设计文档。
已考虑作者“没有既有文档过期,因此文档可独立处理”的解释;不过 documentation-standard.md §5 明确要求 architecture/protocol change 在同一 PR 更新组件 docs/design/,并不限于修正既有文档。PR 描述和函数注释不能完整承担后续维护者查阅协议的职责。
最小修正:在组件 docs/design/ 补一份符合仓库文档规范的说明,覆盖返回字段和 shell/core 同步升级要求、主要状态转移及各层时间预算、取消完成必须等待 join/reap、未知保存结果不自动重试、probe 唯一回收者这一信号安全前提。无需扩展成全量教程,也无需在功能 PR 中改 CHANGELOG。此项是历史遗留未关闭的文档要求,不是新发现的运行时缺陷。
历史争议的复核
- 入口同步 prepare / 复用 live core:已修复。 入口先建立可取消面板,再执行独占探测。之前的
auth/state快照读取仍同步,作者已明确披露,不能把它说成整个初始化都立即可取消。 - SIG_IGN 导致 PID/PGID 复用:当前修复成立。 启动前规范化继承的 ignore,回收时仅在
try_wait确认子进程尚未回收时按 PGID 发信号,避免已回收后继续使用旧数值 ID。 - 撤回 此前自定义 reaper 的 P1。 当前 production 路径未发现回收 probe 的通配 reaper;caught handler 也不能跨 execve 继承。已核对的
wait-timeout等待的是登记的具体 Child,不能据此推导它会抢收 probe。最新注释已明确 sole-reaper 前提;将来引入通配回收器时需要重新评估,但不能把未来架构变化当作当前 P1。无条件覆盖进程内 SIGCHLD handler 反而会伤及合法使用者。 - 不建议通过 detach 或放弃回收来压缩取消耗时。 这会破坏本 Issue 要求的取消完成语义。
- 测试使用的公共 facade 暂不作为阻断项。 已登记 private-candidate,且协议生命周期测试留在 protocol 层符合当前组织方式。
验证证据与边界
独立测试运行在 Linux ARM64、Rust 1.88.0,执行对象为 f794aad21:
命令(均使用 cargo +1.88.0 test --locked) |
结果 |
|---|---|
-p cosh-shell --lib --bin cosh-shell auth -- --test-threads=1 |
12 + 157 通过 |
-p cosh-shell --test protocol ecs_probe:: -- --test-threads=1 |
7 通过 |
-p cosh-core --lib --bin cosh-core ecs_metadata -- --test-threads=4 |
30 + 6 通过 |
-p cosh-shell --test raw_cli auth -- --test-threads=4 |
20 通过 |
合计 232 项,包含重复取消和活 shell 的线程/子进程回收检查。当前 4debaa26e 已另行核对增量及 git diff --check,未把上述本地测试描述为在新 head 重跑。
提交评论时已核对 当前 head 的 CI:Test cosh-ng、Test cosh-ng fast checks、Build cosh-ng release 均成功。旧候选的失败不再作为当前阻断证据。本轮没有独立运行完整 workspace、macOS 或真实 ECS 验收,历史实机材料也不作为后续补修的直接覆盖证据。
🔄 Incremental Code Review
范围说明
增量内容评审
Findings(按 P0–P3 分级)
验证与覆盖声明
总结rebase 后的本轮增量为注释-only,无行为变化;上轮 P3 闭环;无新增阻塞项。P2 文档项在仓库规范下为同 PR MUST,建议合并前补齐。PR 当前 |
|
跟进 #pullrequestreview-5233520324(kongche-jbw 完整复审)与 #issuecomment-5711958673(zhoukailong)。感谢两位对注释-only 增量的 blob/range-diff 级独立核实,以及对此前 SIGCHLD P1 的撤回确认。 [P2] 组件设计文档:已在本 PR 补齐采纳。我先核实了 新增
字段与常量均从源码核实,非从 spec 转抄。语言按 历史项复核确认
范围与门禁: |
kongche-jbw
left a comment
There was a problem hiding this comment.
增量复审:4debaa26eeed6137cd8a092f82113397cd8a6095 → eb34a319198f82066bdf782aca09291f77cd29c6,base/merge-base 仍为 8c7aac3994aa10b6ebef7d3d80f7d4e004fdf8e6。
已阅读最新回复并独立核对:本轮仅新增 149 行设计文档,生产代码与测试均未变化。上轮“缺少同 PR 设计文档”的 P2 已解决;没有新增 P0/P1。不过文档新增两处 P2 语义偏差,已分别附在线上:configure 的执行/取消/Unknown 生命周期与 prepare 的手动模式回退边界。建议按当前实现修正文档,不需要为迁就文档改动代码。协议字段、同步升级要求、时间预算和 sole-reaper 前提等其余主要内容与实现吻合;当前规范没有要求这份组件设计文档必须另有中文版。
另建议合并前整理一下 commit 历史。当前 8 个提交中有几组属于同一逻辑变更的后续修正,可按仓库 AGENTS.md §13 的 fixup/autosquash 规则合并:
d1fd8130修正了d88a33ca引入的输出行断言,建议合入d88a33ca。a2f963f0删除的是6d054e67在本 PR 内新增的两份验收 YAML,建议合入引入提交,避免历史里保留“先加入再移出产品树”的中间状态;外部验收资产仍可在 PR 中引用。c4e7f479、6a3e8304、4debaa26中针对本 PR 新认证流程的回收、取消和信号所有权修正及对应回归测试,建议核对归因后 fixup 到引入它们的功能提交。确属 main 上既有缺陷的修正再保留独立提交和正确归因。- 设计文档可以保持独立 docs 提交,本轮文档纠正合入该 docs 提交即可;不要求把所有独立逻辑压成一个大提交。
整理后应核对最终 tree/diff 未意外变化,并以新 head 的 CI 为准。
验证:已完成新增文档全文与源码/现有测试对照、相对链接检查和 git diff --check;纯文档增量未重跑 Rust 测试。提交此评审时,当前 head 的 Docs Lint、Commit Message Lint、PR Checks 已通过,cosh-ng 测试、fast checks 和 release 构建仍在运行,未将其计为通过。
🔄 Incremental Code Review
评审时间: 2026-09-17T18:01:01+08:00 FindingsP1 - High
P2 - Medium
未发现本次文档增量中的 P0 问题。 验证与覆盖声明
|
eb34a31 to
8c2f067
Compare
|
跟进 #pullrequestreview-5233853275(kongche-jbw)。两条文档 P2 已订正,并按 §13 整理了提交历史。候选 两处文档语义偏差:已订正(逐条见 inline 回复)
提交历史整理(AGENTS §13)按建议将本 PR 内对新引入代码的修正 fixup 进引入提交,8 → 3 个提交:
逐提交核实归因:五个被折叠提交全部修正本 PR 内新引入的内容,无 main 既有缺陷修复,故不保留独立提交。整理后用树哈希双验证:重写前后 tip 树哈希均为 CI 说明前一候选 |
Use equivalent fixed-size chunk iteration and move the pending request vector without an extra allocation to satisfy the current Clippy rules. Check the foreground command's complete output line without requiring an incidental leading carriage return; keep handoff and once-only checks. The carriage-return failure also reproduced on the unmodified baseline. Crypto vectors, evidence requests and the foreground case were verified. This does not change Gateway or suppress any lint or test. Supplements: 703d4d4 Supplements: 1a93589 Fixes: 3100f22 Assisted-by: Qoder:0.2.5 Signed-off-by: SunnyQjm <mfeng@linux.alibaba.com>
Resolve first-provider identity from both template type and occupied names, preserving editable-field rules across navigation and recovery. Use one owned, cancellable registry probe at a time. The event pump checks cancellation and deadlines before consuming readiness; task completion requires joining the worker and reaping its temporary core. Keep configure on its existing route, consume confirmed save results, and never retry an uncertain mutation automatically. Share bounded IMDSv2 token and credential validation across prepare, verify, preflight and STS refresh. Metadata secrets stay in core; expired credentials wait for refresh rather than requesting a new role. Deterministic ownership/deadline tests and real ECS PTY cases cover first-use naming, automatic readiness, persisted configuration and cancellation followed by ordinary input and another auth flow. Readiness does not claim SysOM service authorization or model access. Reviews covered provider identity, task ownership, metadata safety and code organization. Regressions exercise spawn failure reaping, shell exit while saving, expired credentials and confirmed-ECS read failures. The accepted validation scope is core/shell; pre-existing Gateway workspace lint failures remain disclosed outside this change. Supplements: 76d1d60 Assisted-by: Qoder:0.2.5 Signed-off-by: SunnyQjm <mfeng@linux.alibaba.com>
8c2f067 to
72efd76
Compare
|
跟进 #issuecomment-5712498625。 P2 registry 公共信封:已补齐核实成立。候选
该说明与 P1 旧 head 的 shell_host 失败:不适用于当前候选
因此不改与本任务无关的 Shift+Tab 产品逻辑或测试等待,也不把旧失败豁免成通过。当前候选 历史与主干文档订正已 fold 进 docs 提交,仍保持 3 提交结构。主干前移到 |
🔄 Incremental Code ReviewPR: #3298 FindingsP0 — None identifiedNo blocking correctness, safety, or wire-contract issues were found in the reviewed files. P1 — Signal-disposition normalization has an unsynchronized race windowFile: P2 —
|
|
跟进 #issuecomment-5713398769。该评论评审的是旧 head 已修复:registry 公共信封 P2
P1 SIGCHLD read/set 窗口:不成立,不改代码评论把 SIGCHLD 的僵尸策略误写成子进程在 spawn 时“继承”的属性。是否自动回收取决于父进程在子进程退出时的 process-global SIGCHLD disposition,不是给每个 child 在 spawn 时冻结一份父进程策略。 实现顺序也排除了 probe 命中该窗口: P2
|
🔄 Incremental Code Review
PR: #3298 ScopeThe PR was rebased onto the new main (
The other three files that appear in the head-to-head diff ( FindingsP0 — None identifiedP1 — carried forward (code unchanged): signal-disposition normalization race windowFile: P2 — NEW: the doc's response-validation claim does not hold on the short-lived fallback pathFile:
For the P2 — carried forward (code unchanged):
|
kongche-jbw
left a comment
There was a problem hiding this comment.
Approve 当前 head 72efd76930de9a569677e8a6f0eba9fbd39d760f(base 2508da624d5f6ce3be77549681e4425c79541e99)。
完整评审及后续增量复核后,未发现仍成立的 P0/P1。上轮指出的 prepare 手动回退边界、probe/configure 生命周期两处文档 P2 已修正;提交历史已合理整理为 3 个提交。独立核对 eb34a3191 → 72efd7693,cosh-ng 生产代码与测试内容无变化,仅设计文档更新;当前 head 的 cosh-ng 测试、fast checks、prebuilt action 和 release 构建 CI 均通过,主测试 workflow 为首跑成功。
剩余两处文档问题接受后续补齐,明确不作为本次合并阻断:
- P2,
src/cosh-ng/docs/design/ecs-auth-provisioning.md:46–48:文档将响应type/request_id校验写成所有 shell 路径的统一保证。实际 live core 与独占 ECS probe 会校验,configure 的短进程 fallback 没有该校验。后续收窄文档陈述、准确注明各路径的校验范围即可。 - P3,同文件 :48–49:
params缺省值写成了空对象{};实际#[serde(default)] params: Value为null。后续修正文案即可。
历史讨论中的 SIGCHLD 读写窗口 P1 不成立:keep_children_waitable() 完成后才创建 probe worker,评论所述 probe 在该窗口内启动的顺序与代码不符。此前关于自定义 reaper 的 P1 维持撤回。
验证边界不变:本轮为文档增量静态复核,已检查源码对应关系、相对链接、JSON 示例与 diff hygiene;未重跑 Rust 测试或真实 ECS 验收。以上剩余文档跟进不影响本次批准。
Add a component design note for the registry auth prepare/verify/configure wire contract, the shell polling lifecycle and its time budgets, the cancellation join/reap completion contract, the unknown-save no-resend rule, and the probe sole-reaper signal-safety invariant. Required by documentation-standard.md section 5 for the verify protocol change (authorized -> status/reason/error_code); shell and core upgrade together. Assisted-by: Qoder:0.2.5 Signed-off-by: SunnyQjm <mfeng@linux.alibaba.com>
72efd76 to
85ecfbf
Compare
|
跟进 #pullrequestreview-5235502277(Approve)与 #issuecomment-5713886489。两处文档准确性问题已修正,候选 P2 响应校验范围写得过宽:已修正核实成立,是我上一轮的表述错误。已按三条路径分别说明:
未按建议给 P3
|
Why
修复 Provider 首配重复命名和 ECS RAM Role 认证必须人工确认的问题。ECS 探测改为有界、可取消的单次操作,只有本轮线程与独占子进程完成回收后才报告取消完成。
What changed
ECHILD已被内核回收的终态,以及 ActiveRun 自动 Ready 提交前的认证卡清理,发送失败也不残留旧卡。SIGCHLD=SIG_IGN规范化为默认处置(默认与自定义 handler 均保留 zombie,不改写),Linux 与 macOS 共用同一条 POSIX 路径。取舍:宿主若依赖忽略 SIGCHLD 自动收割自己的子进程,首次探测后它们会保留 zombie 直到被 wait。prepare先建立可取消面板,再复用独占探测任务,不再借用 live core;结果仅更新原菜单,不自动 verify/configure。取消/退出覆盖超时回收终态且不重置期限,取消重绘保持同一 capture 身份,不重新武装输入 owner。SIGCHLD=SIG_IGN下自动回收后不再按数值 ID 发信号,避免命中复用的进程组。新增 adapter 类型在公共 API 台账登记为 private-candidate,协议生命周期测试仍留在组件规则要求的 protocol 层。Related issue
Closes #3278
User / Agent impact
首配直接进入凭据或 ECS 检查;无需“我已授权”确认。等待可取消,配置成功须实际保存;ActiveRun 不假称配置落盘。角色缺失与凭据过期分别展示授权等待和刷新等待。
Risk and compatibility
shell/core 应一同更新:verify 使用
ready/not_ready和安全错误分类。只验证指定角色的完整未过期凭据,不声称验证了 SysOM 服务权限、额度或推理链路;不会自动创建或修改云端角色。自动探测总预算 200 秒,取消完成要求 join/reap,未知保存结果不会自动重发。入口菜单
prepare已纳入可取消任务,但此前的auth/state配置快照读取仍同步,不声称整个/auth初始化立即可取消。状态标题/操作提示为双语,部分安全技术错误详情仍为英文;本轮不扩展错误翻译框架。Validation
当前候选:
72efd76930de9a569677e8a6f0eba9fbd39d760f,基于主干2508da624,提交历史已按 AGENTS §13 整理为 3 个提交。历史重写前后src/cosh-ng树哈希同为67980041cc20aacfaf3b2060acde80749f952d56,零内容漂移;本轮文档补齐 registry JSONL 公共信封(type/request_id及响应回显关联规则),无生产代码或测试变化。SIGCHLD=SIG_IGN时探测启动后处置必须不再是SIG_IGN—— 移除规范化调用该断言红;宿主已装 handler 必须不被替换 —— 让规范化无条件改写该断言红,实测left: 0)。sigaction/signal,Linux 与 macOS 共用一条路径,无cfg分叉。macOS 本机--test protocol ecs_probe::7 项通过、fmt 与clippy -p cosh-shell --all-targets -- -D warnings通过;ARM64 ALinux 3 容器同样 7 项通过。评审建议的 pidfd 方案未采用,理由是pidfd_send_signal(2)不承诺保留 PID 号(man 页把 PID 复用列为传统接口缺陷),且PIDFD_SIGNAL_PROCESS_GROUP需 Linux 6.9 以上,覆盖不到 ALinux 3(5.10)与 ALinux 4(6.6)。--test protocol ecs_probe::7 项、认证过滤 lib 12 + bin 157、--test raw_cli auth20 项通过(含initial_menu_prepare_ctrl_c_reaps_probe_and_worker_in_live_shell,187 秒);该过滤对 logic/shell_host 匹配零项,不代表这些 target 全量通过。rebase 到c648fc4fd后在同一容器重验:cosh-core --lib auth3 项、--test protocol ecs_probe::7 项、clippy -p cosh-shell -p cosh-core --all-targets -- -D warnings均通过;--lib preflight过滤匹配零项,不计作证据。cargo clippy -p cosh-shell -p cosh-core --all-targets -- -D warnings、layout、test inventory/necessity(5916 source IDs、22 rules)通过;台账未分类的兜底项由 2 降为 1(剩余一项非本 PR 引入)。eb34a3191的Test cosh-ng首跑失败于既有shell_host/native.rs的enhanced_shift_tab_toggles_shell_only_routing_without_restarting_bash;该文件不在 PR diff、用例已存在于 main,且该候选相对全绿代码仅新增 markdown,故记录为与本 PR 无关的 PTY 时序失败,不将其冒充当前候选结果。72efd7693的 CI 首跑全绿且无复跑:Test cosh-ng、Test cosh-ng fast checks、Test cosh-ng prebuilt action、Build cosh-ng release均 SUCCESS,failed_jobs=[]、rerun_history=[]。e01e6a5a4的 CI:首跑Test cosh-ng失败,唯一失败为agent_input::raw_cli_routes_slash_bearing_han_prompt_before_shell_execution(zsh 变体,raw_cli 540 passed / 1 failed / 1 ignored);该记录保留。复跑同一 job 成功:raw_cli 541 passed / 0 failed / 1 ignored、shell_host 216 passed / 0 failed / 1 ignored,其余检查 SUCCESS。复跑成功不表述为该用例通过。归因事实:本 PR 相对origin/main未改动raw_input/shell_host/agent任一路径,失败用例使用 fake adapter 且不经/auth,同一用例在前候选9de696753的 job 中通过,且该用例以固定 sleep 注入输入、无 readiness 握手。近期 main 的Test cosh-ng均被 Detect Changes 跳过(job 级skipped),故无同用例主干先例;本地隔离复现因容器供给超时未取得对照,容器已清理,不以未完成的本地运行充当证据。9de696753的Test cosh-ng被 15 分钟 job 上限取消;取消前 raw_cli 为 540 passed / 0 failed / 1 ignored,shell_host 未完成,保留为未通过。本轮未修改 CI 时限,也未改动该 zsh 用例或其 harness。/proc/.../children、root 绕过权限拒绝测试;一条前导回车断言在未修改基线同样失败,修正为独立输出行断言后通过。cosh-platform/src/checkpoint.rs:1736测试引用阻断(spawn_silent_daemon仅在 Linux 定义,调用测试未加同样条件)。该文件不在本 PR 差异中。新候选须以 Linux CI 为目标平台验证,不能将宿主检查称为全绿。cosh-gateway-app/src/checkpoint.rs报两条chunks_exact_to_as_chunks;已按用户要求披露并聚焦本任务,没有修改 Gateway、关闭 lint 或绕过 hooks。既有历史记录不等于当前候选的 CI 结果,也不是 workspace/release 全绿声明。Real ECS evidence(末轮修复前的实机记录)
在入口菜单预取、ECHILD/ActiveRun 后续补修之前,曾于 x86_64 ALinux 4、IMDSv2 required 实例上使用未修改的 canonical Ruby runner 创建真实 PTY;通过 Cloud Assistant 启动并下载原始脚本结果与脱敏 cast。本地只用既有渲染/校验器导入,明确标注
accept-import,不是 SSH 执行,也不是 fake adapter。这些记录验证此前版本的默认命名、自动认证和普通取消链路,不作为后续入口预取、取消交错或 capture 重绘修复的实机覆盖证据。AUTH-ECS-READY:无需命名或二维码,实际配置回读成功。AUTH-ECS-CANCEL:等待中取消,普通命令可执行;超过两次检查间隔后检查同一活 shell 的线程和子进程,再次/auth与取消均正常。AUTH-ECS-WAIT-READY:实际观察 Waiting 后挂回原角色,没有发送确认键,自动完成并回读配置。f23193c3306e06a0c89f89b7292ecbd8d95c8fc13429193c5ecb883d5ca11104;core SHA256af60dcf3216c857c9360a39e00718b7756b7a70bbed97f59bbf31bb62392571e。remaining=0。截图与回放(固定资产 commit)
基线:首次配置仍要求命名。
修复后:角色就绪直接完成并回读已保存配置。
未就绪等待与取消后资源核验。
30 个远端资产 Git blob 哈希已与本地文件逐一核对。资产仅位于 fork 独立分支,不在产品最终差异中。按用户要求,本次专用验收脚本也原样归档,不作为通用 CI 测试提交:
Documentation and rollback
按
specs/documentation-standard.md§5(protocol change → 同 PR 补组件docs/design/),新增src/cosh-ng/docs/design/ecs-auth-provisioning.md,覆盖 registry auth prepare/verify/configure 协议字段(status: ready/not_ready+reason/error_code、shell/core 同步升级)、ECS 轮询状态机与各层时间预算、取消完成必须 join/reap、未知保存不自动重发、probe sole-reaper 信号安全前提。按docs/design/现有惯例为英文(该目录 11 个文件中 10 个纯英文,非强制双语集)。本次专用验收案例与回放保留在证据资产,产品仓保留 Rust 单元、协议和 PTY 回归。回退本 PR 时同步回退 shell/core 协议;现有已保存配置格式不变。不自动合并,等待维护者审阅。