Skip to content

[自动合并 P2-2] 抑制标记预算门 #87

Description

@randypanding

目标

新增"抑制标记预算"门:# noqaeslint-disabletype: ignore.gitleaksignore、coverage exclude、arch-lint allowlist 等抑制标记按净增量设硬阈值(单 PR ≤ 3,且累计总量不得上升)。把"逐条人审"换成"配额 + 越界才叫人"。

背景(源自 #81 §4.1)

抑制标记是 agent 让门禁变绿的第二条捷径:lint 红就加 noqa,类型错就加 ignore,泄密扫描红就加 gitleaksignore。无人值守下,每个抑制标记都是一次未被审判的门禁豁免。预算制让"零星合理豁免"自动通过,"批量规避"被拦下。

涉及文件

  • CI-Workflows/scripts/suppression-budget.sh(新增,检测逻辑)
  • CI-Workflows/.github/workflows/check.yml(接入)
  • governance/policy/testing.yaml 或新 policy/suppressions.yaml(标记清单、单 PR 阈值、总量基线声明)
  • 各业务仓 gate needs 链

执行步骤

  1. 声明抑制标记全集(按语言/工具枚举正则:noqaeslint-disabletype: ignoregitleaks:allownoseccoverage: ignore.gitleaksignore 行、arch-lint allowlist 条目等),落盘到 policy 文件,机器可解析。
  2. 实现计数脚本:
    • 单 PR 维度:diff 中抑制标记净增量 > 3 → 红;
    • 总量维度:main 上标记总数为基线(落盘或 API 取),PR 合入后总量上升 → 红(下降/持平 → 绿);
    • 豁免:引用 scope 覆盖的 ADR(与 P2-1 同款逃生门,入账)。
  3. 接入 gate needs 链(aggregator 严格断言模式)。
  4. 对现有仓做一次基线盘点:当前各标记总量写进 policy 作为初始基线。

验收标准

  • 净增 ≤3 的 PR 绿;净增 >3 的 PR 红;净减的 PR 绿。
  • 累计总量上升的 PR 红(即使单 PR ≤3)。
  • 基线盘点完成,各仓初始总量落盘。

测试方法(预先指定)

T1 阈值边界(核心,参数化):在测试仓开三个 PR:

  • P-A:新增 3 个 noqa → 断言绿;
  • P-B:新增 4 个 noqa → 断言红,错误信息指明超阈值 4>3;
  • P-C:删除 2 个现有抑制标记 → 断言绿。

T2 总量维度(核心)

  • P-D:新增 2 个标记(单 PR 达标)但导致该仓总量超过基线 → 断言红;
  • 断言错误信息区分"单 PR 超阈值"与"总量上升"两种红因。

T3 标记全集覆盖(单元级):构造含每种已声明标记的 fixture diff(每种至少 1 例 + 1 个相似但不应命中的干扰文本,如注释里写 "noqa" 字样),断言计数器输出与预标注完全一致,无漏报无误报。

T4 逃生门(正向):复刻 P-B 并引用 scope 覆盖的 ADR → 断言绿且入账。

T5 基线机制:修改 policy 中基线值(±1)后重跑同一 PR,断言判定结果随之翻转——证明判定确实消费基线而非硬编码。

依赖

  • P1-3(aggregator 模式)
  • P2-1(同款接入与逃生门机制,建议同一 PR 系列落地,减少各仓 caller 改动次数)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auto-merge自动合并计划(#81)工作卡gateGate 工作流相关

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions