Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions governance/policy/patrol.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
schema: patrol-policy/v1
# ============================================================================
# patrol.yaml —— patrol 巡逻服务政策(阈值唯一真源,W3-C2 .github#219)
# 真源: 本文件(频控/降频/开单上限/权限声明集中此文件——改动=C1 变更须引用 ADR)
# 执行: CI-Workflows pipeline/patrol/patrol.py(.github/workflows/patrol.yml
# 每日 02:43 UTC 拉取本文件后巡逻;拉取失败 fail-closed 拒跑)
# 决策: ADR-0065(patrol 巡逻服务——三源场景+指纹去重频控+毕业机制)
# 宪法: §3 patrol(三源/observation 桶两次独立/毕业防刷熟)§8(patrol yield)
# 注: targets 内的探针路径相对 CI-Workflows 仓根(patrol run --target-base);
# 新仓接入巡逻面=在 targets 追加条目(C1 变更)。
# ============================================================================
version: 1

targets:
- repo: Cloudbird-Software/CI-Workflows
mode: demo-probe # shadow 期只对仓内 demo 靶场巡逻(blastRadius 可控)
# 探针适配器契约:stdin 单 JSON payload → stdout JSON 包络 {ok,http_status,data}
# (包络可带 service_ms——perf oracle 优先消费,避免进程墙钟污染预算判定)
service: pipeline/patrol/demo-target/service.py
ac_registry: pipeline/patrol/demo-target/ac-registry.yaml # 源(a) AC 注册表派生
escapes: pipeline/patrol/demo-target/escapes.yaml # 源(b) 历史逃逸模式库

rate_limit:
# 频控(AC-2 / ADR-0065 决策 3):同指纹不重复开单之外的第二道闸——
# 突发缺陷潮也按仓限速,deferred 留待下一窗口再攻击
max_issues_per_repo_per_hour: 2
max_issues_per_repo_per_day: 6

observation:
# 宪法 §3 钉死:LLM"看着不对"只进 observation 桶,两次独立出现才升级开单;
# 独立=不同 run 且不同 seed(防同 run 重复采样灌水)。值固定 2——放宽须先修 ADR
escalate_after_independent: 2

Comment on lines +29 to +33

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. Policy invariants unvalidated 🐞 Bug ☼ Reliability

该 PR 引入新的阈值真源 patrol.yaml,但本仓 gate 只做 yaml.safe_load 的语法解析,不校验必须字段/类型/不变量,导致未来任何结构性误改都可能在本仓 CI
放行、到下游 patrol 执行时才 fail-closed 停巡。尤其是文件内声明了硬约束(如 observation.escalate_after_independent 固定为
2、permissions.forbidden 必须存在),但当前没有机器执行的本仓侧断言。
Agent Prompt
## Issue description
`governance/policy/patrol.yaml` 作为阈值唯一真源引入后,本仓 CI 目前仅验证“YAML 可解析”,没有任何结构/类型/不变量校验。这样未来 PR 可能把关键字段拼错、删段、改类型(例如把数字写成字符串、漏掉 permissions.forbidden)而在本仓 gate 放行,直到下游 patrol 引擎运行时才 fail-closed(等价于“静默停巡直到有人注意到”)。

## Issue Context
- gate.yml 的“YAML 全量解析”仅调用 `yaml.safe_load` 并打印 OK,不做结构断言。
- patrol.yaml 自身注释声明了必须满足的硬约束(如 observation 固定值、permissions 必须带 forbidden),但注释不是机器可执行约束。

## Fix Focus Areas
- .github/workflows/gate.yml[52-65]
- governance/policy/patrol.yaml[29-33]
- governance/policy/patrol.yaml[59-65]

## Implementation sketch
1. 新增一个轻量校验脚本(例如 `scripts/validate_patrol_policy.py`),读取 `governance/policy/patrol.yaml` 并做至少以下断言(fail-closed 非 0 退出):
   - 顶层必须是 dict;`schema`/`version` 存在且为期望值(如果 `schema` 是合同的一部分)。
   - 必须字段存在:`targets`(list)、`rate_limit`、`observation`、`yield`、`sources`、`issue_mode`、`permissions`。
   - 类型断言:数值字段为 int/float、`permissions.allowed/forbidden` 为 list[str]。
   - 不变量断言:`observation.escalate_after_independent == 2`;`permissions.forbidden` 必须非空;可选地断言 `issue_mode` ∈ {draft, gh}。
2. 在 gate.yml 的 YAML 解析步骤后追加一步运行该脚本,确保 policy 结构性错误在本仓 PR 阶段被拦下。
3.(可选)将校验范围扩展为未来可能新增的 `governance/policy/*.yaml` 的结构校验,但本 PR 至少要把新引入的 patrol policy 纳入。

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

yield:
# AC-4 / ADR-0065 决策 6:yield=每百次唯一真 bug 数;开单复现存活率=
# reproduced/opened;信噪比(真 bug/开单数,最近 snr_window_issues 张开单窗口)
# 低于阈值 → 自动降频(收敛到 downshift_daily_issue_cap 而非停巡)+ needs-human
# 复核标记。指标进宪法 §8 成本指标组 / ADR-0073 dashboard。
snr_threshold: 0.05
snr_window_issues: 20
downshift_daily_issue_cap: 1

sources:
escape:
variants_per_pattern: 4 # 每 pattern 按 seed 确定性采样变体数
metamorphic:
pairs_per_run: 6
llm:
# 源(c) LLM 半边:经 metering wrapper(ADR-0062 一次 invoke 恰一条聚合记录);
# 无 LLM_API_KEY 时诚实降级(skipped 计数,不伪装生成过);metamorphic 半边恒跑
enabled: true
model: glm-4.5-air

# 开单形态:draft=shadow 起步(bug issue 草稿落 artifact,零线上噪音——W3-C2
# 演习即此形态);切 gh(真开单+bug 标签)= C1 政策变更,由 owner 按演习 yield
# 数据拍板。开单必附 trace+指纹(AC-1),复现判定走 ADR-0064 三值协议。
Comment on lines +54 to +56
issue_mode: draft

# 权限声明(ADR-0065 决策 5 铁律:patrol 只读运行+开 issue)——执法面在
# CI-Workflows patrol.yml job 级 permissions(contents:read + issues:write +
# actions:read 状态恢复),本段为声明性复核(patrol.py 加载政策时断言,
# 缺 forbidden 声明即 fail-closed 拒跑)。写状态标签归 arbiter(INV-02 一致)。
permissions:
allowed: [read-run, open-issue]
forbidden: [push, pr-write, label-write, code-write]