Skip to content

fix(ci): harden the lint gate and enable Ruff security rules (#537, #539) - #538

Draft
liujuanjuan1984 wants to merge 3 commits into
mainfrom
fix/ci-lint-gate-strictness
Draft

liujuanjuan1984 wants to merge 3 commits into
mainfrom
fix/ci-lint-gate-strictness

Conversation

@liujuanjuan1984

@liujuanjuan1984 liujuanjuan1984 commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

目的

本 PR 收口此前审查发现的两项 CI / 静态检查问题(按评审要求合并在同一 PR,不再拆分):

提交记录

一、lint 门禁:不再被重试掩盖(#537)

问题

scripts/lint.sh 对 pre-commit run --all-files 最多重试 3 次,任意一次成功即返回 0;而 trailing-whitespace、end-of-file-fixer、ruff check --fix、ruff format 都是自动修复型钩子(改写文件时返回非 0)。于是第 1 次失败并就地修好、第 2 次必然通过 → CI 绿灯,但提交内容并不满足仓库规范。

修复前实测(探针文件 + git add):bash ./scripts/lint.sh → 重试后 退出码 0。

变更

  • scripts/health_common.sh:把 doctor.sh 原有的工作区指纹函数抽取为共享的 repo_state_fingerprint()(搬迁,非新造)。
  • scripts/doctor.sh:改用共享函数,删除本地重复定义。
  • scripts/lint.sh:复用同一指纹判定;若 pre-commit 改写了工作区文件 → 立即失败并给出明确提示;对未改写文件的瞬时失败仍保留重试与既有环境变量接口;失败时返回 pre-commit 的真实退出码。
  • tests/scripts/test_script_health_contract.py:更新 doctor 契约(含负向断言,锁定指纹只有一处实现),新增 lint 门禁契约测试。

二、启用 Ruff 安全规则并收敛 assert(#539)

问题

[tool.ruff.lint] select = ["E", "F", "I", "B", "UP"] 缺少 S,作为对外提供 A2A/JSON-RPC 服务的运行时存在静态安全规则缺口。实测启用后 src/ 有 24 处 S101,scripts/ 另有 1 处 S607。

变更(对齐 codex-a2a 的既有做法)

  • pyproject.toml:规则集加入 S;按兄弟仓库 codex-a2a 的既有配置,对 tests/** 使用 per-file-ignores 豁免 S(测试模块本就要用 assert 与假凭证),不扩大豁免范围。
  • src/ 的 24 处 assert 全部收敛:
    • 校验后类型收窄(session_id / message_id / workspace_id / request_body / parsed):改为显式 typing.cast(...) 收窄——与 codex-a2a 中 cast(ReviewStartControlParams, parsed_params) 等既有写法一致。
    • 上游负载缺失守卫(3 处 assert raw_result is not None):改为显式 raise UpstreamContractError(...),保留运行期检查且不受 python -O 影响。
    • 模块级契约不变量(agent_card.py 2 处扩展 URI 顺序):改为显式 raise RuntimeError(...)。
    • session_lifecycle.py 末尾的 assert method == method_unshare_session 改为显式 elif + 兜底 raise UpstreamContractError,去掉“用 assert 表达分支”的写法。
  • scripts/conformance_probe.py:S607 通过 shutil.which("git") 解析绝对路径消除;残留的 S603 是静态误报(固定参数 + 已解析的绝对路径),按 codex-a2a 同类写法就地 # noqa: S603 并写明原因。
  • CONTRIBUTING.md:说明 S 对发布代码启用、tests/** 豁免的原因与不可扩大。
  • 新增契约测试锁定 ruff 规则集与 tests/** 豁免范围。

验证证据

  • uv run ruff check → All checks passed!(含 S)
  • uv run ruff format --check → 198 files already formatted
  • uv run mypy src/opencode_a2a → Success: no issues found in 89 source files
  • uv run pre-commit run --all-files → 全部 Passed,且未改写任何文件(同时验证新门禁不误伤)
  • 负例复验:探针场景下修复后 bash ./scripts/lint.sh → 退出码 1,输出 ERROR: pre-commit rewrote repository files; the lint gate rejects hook-generated edits.,不再重试
  • 完整基线:bash ./scripts/doctor.sh → 退出码 0;覆盖率 93.46%(门禁 ≥90%),构建与 wheel 冒烟测试通过
  • 指纹开销实测 ≈0.01s/次;.venv、*.cache、dist/、run/ 等均被 .gitignore 覆盖
  • CI:Validate Default Toolchain、Validate Protobuf 6 Compatibility、Runtime Matrix (3.11/3.12/3.13) 全部 pass

影响与风险

  • 门禁变严格:未格式化 / 未应用自动修复的提交会让 CI 失败,与 AGENTS.md、doctor.sh 的既有要求一致。
  • 行为等价性:cast 替换的是“前置校验已保证非空”的收窄断言;raw_result 守卫保留为显式异常,因此失败路径行为不变。agent_card 的模块契约不变量改为显式异常,在 python -O 下依然生效(比原来的 assert 更强)。
  • 覆盖率因新增的少量不可达守卫分支从 93.53% 微降至 93.46%,仍高于 90% 门禁。

关联

@liujuanjuan1984 liujuanjuan1984 changed the title fix(ci): reject pre-commit rewrites in the lint gate (#537) fix(ci): harden the lint gate and enable Ruff security rules (#537, #539) Oct 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant