feat-chv-to10:往 10 分方向提升(类型/lint 清零、worker 适配抽取、审计落盘、lockfile 生成脚本、前端四态与统一文案、就绪清单 §13)
This commit is contained in:
1 parent
df8c64bd64
commit
2f3ff8b3ec
22 files changed
+1400
-282
No files matched your search
@@ -232,3 +232,94 @@
|
||||
live 状态——server 进程没有 VM 登记表,live 状态编不
|
||||
出来;前端无该字段时不显示 VM 状态,不猜测。VM 控制
|
||||
按钮仍不做(后端无控制端点且安全审计 No-Go)。
|
||||
|
||||
## ADR-13 CHV worker 适配模块(to10 轨)
|
||||
|
||||
- 决策:新建 `cloud/chv/worker_adapter.py`,worker.py 只留
|
||||
薄包装。抽入:断点调用(原顶层函数本体)、审计回调
|
||||
(原 `__init__` 闭包)、孤儿清理(原 `_reconcile_warm_pool`
|
||||
本体)、两条看门狗循环(原 `_chv_*_watchdog` 本体,self
|
||||
依赖全部改成回调参数)、看门狗 VM 名派生(原 `_run_attempt`
|
||||
try/except 块)。worker 方法名、签名、调用点、错误文案
|
||||
全部不变,旧测试继续走 worker 方法;适配器本身另有直接
|
||||
行为测试。适配器只依赖标准库 + chv 叶子模块 +
|
||||
`cloud.logging_config`,不 import `cloud.worker`,无循环;
|
||||
公共 API 全注解(#257 的类型测试扫 `cloud/chv/*.py`,
|
||||
新模块不注解会直接炸该测试——本轨已补齐)。
|
||||
- 明确不抽(硬抽无收益,只会撕通用流程):cancel() 里的
|
||||
`cancel_vm` 分支(与 Docker `kill_container` 分支相邻的
|
||||
通用取消流)、`cleanup_stale_containers` 的 CHV 分支
|
||||
(与 Docker 清理相邻的通用清理流)、网关守卫(Local /
|
||||
Docker / CHV 三分支共用的派发流)、`_executor_name` 的
|
||||
CHV 分支(通用执行器名映射)、`_run_attempt` 的看门狗
|
||||
线程启动(线程管理是 worker 通用逻辑,只抽了 VM 名派生)、
|
||||
VM 死亡写回(通用终局流)。以上六处留在 worker.py,
|
||||
不是遗漏,是评估后有理由的结论。
|
||||
- 附带清理:`inspect` 在 worker.py 的唯一用处随断点函数
|
||||
移走,import 一并删除(留着会触发 F401);worker.py
|
||||
基线已有的 I001(两处 import 排序)与 F821(playwright
|
||||
播种块的 `task`)与本轨无关,不顺手重排整个文件。
|
||||
|
||||
## ADR-14 审计失败落盘兜底(to10 轨)
|
||||
|
||||
- 决策:选“本地审计落盘文件”作为兜底,不选“只记日志 +
|
||||
计数”(已做,仍不够:日志会轮转、计数只剩数字,事后
|
||||
找不回哪次事件丢了)。实现:`executor._emit` 回调失败
|
||||
时,除记宿主 error 日志 + `audit_failure_count` +1 外,
|
||||
再把事件 append 到 `state_dir/chv-audit-spill.jsonl`
|
||||
(每行一 JSON:ts/event/kind/detail/task_id),文件超
|
||||
1MB 时轮转成 `.old` 再写。
|
||||
- 取舍(写清,不当成完整修复):① 落盘本身 best-effort,
|
||||
写失败只记日志,绝不中断任务;② 落盘不是 DB 替代,
|
||||
任务 timeline 查询看不到它,需宿主人工查阅;③ 轮转
|
||||
只留最新两代,更早的丢失事件仍会丢;④ detail 沿用
|
||||
`_emit` 契约(只含 VM 名/路径/URL/kind),绝不含密钥值,
|
||||
落盘文件随 state_dir 的 0700 权限保护。审计完整性本身
|
||||
仍无保证——保证需要 DB 事务级审计写入,那是 worker
|
||||
全局语义的改动,不在本轨硬做。
|
||||
- 不选的另一条路:“审计失败即中断任务”——ADR-9 已否决:
|
||||
审计是可观测性不是门禁,DB 短暂不可用时硬中断会把
|
||||
一次审计失败放大成任务失败,且与 worker 全局 best-effort
|
||||
语义冲突。
|
||||
|
||||
## ADR-15 前端只读 VM 展示四态与可用性统一文案(to10 轨)
|
||||
|
||||
- 决策:`chvVmDisplay(task)` 返回四态而非此前两态文案:
|
||||
dead(字段 present 且 true)、not-reported(CHV 任务但
|
||||
字段 absent,只表示未报告)、unknown(任务详情本身未
|
||||
加载)、not-applicable(非 CHV,不显示行)。旧入口
|
||||
`chvVmStatusText` 保留为 display 的 text 包装(unknown /
|
||||
not-applicable 回空串),已测调用点不变。详情页 VM 行
|
||||
改用 `chvVmDisplay(t).text` 并加 `role="status"` 与
|
||||
`aria-label="VM 状态"`。
|
||||
- 决策:`chvAvailabilityText(availability)` 统一新建任务 /
|
||||
Workers / 环境三处可用性文案。此前三处各写各的,Workers
|
||||
的未知分支恒写“仅全局管理员可见”(加载失败/未加载时
|
||||
也是这句,是文案 bug),本轨统一后按 reason 分三句,
|
||||
known 零在线沿用派发页的完整版(不拦提交、后端是最终
|
||||
权威)。无障碍打磨:可用性区与提交结果区加
|
||||
`aria-live="polite"`(结果区另加 `role="status"`),附件
|
||||
三个 input 加 `aria-label`(此前只有 title),禁用态本身
|
||||
已由 `disabled` 传达,不另造禁用文案。控制按钮仍不做
|
||||
(后端无控制端点且安全审计 No-Go);组件渲染仍不在
|
||||
测试覆盖内(无 testing-library 依赖,不临时加依赖冒充)。
|
||||
|
||||
## ADR-16 to10 轨的类型与 lint 口径(诚实标注)
|
||||
|
||||
- mypy:`--follow-imports=silent cloud/chv/`,只查 chv 本身
|
||||
(不拖入无关文件)。基线该口径 115 错 → 本轨 0 错;
|
||||
默认 follow-imports 口径基线 117 错 → 本轨 2 错,且
|
||||
2 错全在作用域外的 `cloud/marker_tools.py:142`(与 chv
|
||||
无关,不顺手修它),chv 自身在默认口径下也是 0 错。
|
||||
- ruff:作用域 F/E9/W/I(未用变量、语法错、空白、import
|
||||
排序),基线 8 错 → 本轨 0 错;默认全规则基线 208 错
|
||||
(含本仓库未采纳的风格意见,如百分号格式化、
|
||||
best-effort 清理的 try/except-pass),本轨不声称全规则
|
||||
通过。worker.py 不在 lint 作用域内:其基线 I001 两处与
|
||||
F821 一处与本轨无关,未重排;本轨只删了随抽取而变多余
|
||||
的 `inspect` import(否则新增 F401)。
|
||||
- 覆盖率:`coverage --source=cloud/chv` 对 CHV 套件(不含
|
||||
worker/server 全量),基线 85% → 本轨 87%(1826 行,
|
||||
缺 268 → 242);未覆盖大头仍是 executor 深层生命周期
|
||||
分支(需假 VMM 全链路)与 disk 配额分支,不靠删测试
|
||||
或改分母凑数。
|
||||
Reference in new issue
Block a user