diff --git a/.github/workflows/governance-drift.yml b/.github/workflows/governance-drift.yml index 1125833..895475a 100644 --- a/.github/workflows/governance-drift.yml +++ b/.github/workflows/governance-drift.yml @@ -1,7 +1,7 @@ name: governance-drift on: schedule: - - cron: "0 3 * * *" # 每日 03:00 UTC(红队 #18 P0-1:周检盲区最长 7 天 → 每日;轻量只读检测,成本可忽略) + - cron: "0 * * * *" # 每小时整点(ADR-0020:可见性漂移盲区 24h→1h——全仓公开政策的小时级执法;红队 #18 P0-1 周检→每日的延续推进;公开仓 Actions 免费,轻量只读检测成本可忽略) workflow_dispatch: permissions: {} diff --git a/governance/GOVERNANCE.yaml b/governance/GOVERNANCE.yaml index 43791bf..2cf185c 100644 --- a/governance/GOVERNANCE.yaml +++ b/governance/GOVERNANCE.yaml @@ -127,10 +127,10 @@ domains: strength: advisory files: [policy/languages.yaml, policy/testing.yaml] - id: GM-4 - intent: "组织地图 REPOS.yaml 声明全部仓(层级/角色/可见性/状态):结构层导航的唯一入口;线上未申报仓=漂移;active 仓存在性与 visibility 周检;新仓初始化后必须申报入图(见 flows.new_repo)" + intent: "组织地图 REPOS.yaml 声明全部仓(层级/角色/可见性/状态):结构层导航的唯一入口;线上未申报仓=漂移;active 仓存在性与 visibility 一致;全仓公开政策(ADR-0020)——组织下一切仓必须 public,申报侧与线上全量侧双重检测,exempt 不豁免可见性;新仓初始化后必须申报入图(见 flows.new_repo)" strength: enforced files: [REPOS.yaml] - verify: {method: drift-check, part: section-7, frequency: daily} + verify: {method: drift-check, part: section-7, frequency: hourly} context_governance: measures: diff --git a/governance/REPOS.yaml b/governance/REPOS.yaml index 5510577..5bdd713 100644 --- a/governance/REPOS.yaml +++ b/governance/REPOS.yaml @@ -7,7 +7,8 @@ org: Cloudbird-Software # 规则(GM-4): # - 线上存在的仓必须在下方申报;未申报 = drift(drift-check §7b) # - status: active 的仓必须存在且 visibility 一致(drift-check §7a) -# - status: planned = 尚未建仓(不参与检测);exempt = 申报但不治理 +# - status: planned = 尚未建仓(不参与检测);exempt = 申报但不治理(仅豁免治理基线,不豁免可见性) +# - 全仓公开政策(ADR-0020):一切仓 visibility 必须 public(drift-check §7a 申报侧 + §7c 线上全量侧,含未申报仓) # - 新仓初始化后必须申报入图(flows.new_repo step 4) # ============================================================================ layers: @@ -33,7 +34,7 @@ repos: - name: agent-registry layer: L1 - visibility: private + visibility: public status: active role: 注册层——agent/skill/tool/team 声明 + 模型注册表(models.yaml) + ADR;AR-2 状态门禁校验器 key_paths: [registry/, decisions/, scripts/validate.py] @@ -48,7 +49,7 @@ repos: - name: agent-tools layer: L2 - visibility: private + visibility: public status: planned role: 自研工具实现仓——被 tool 声明的 implementation 字段引用 diff --git a/governance/drift-check.sh b/governance/drift-check.sh index 4d64223..ede783d 100755 --- a/governance/drift-check.sh +++ b/governance/drift-check.sh @@ -147,12 +147,19 @@ if python3 -c 'import yaml' 2>/dev/null; then fi got_vis=$(jq -r 'if .private then "private" else "public" end' <<<"$RR") [[ "$got_vis" == "$want_vis" ]] || drift "repo '$r' visibility=$got_vis 期望=$want_vis" + [[ "$want_vis" == "public" ]] || drift "repo '$r' 申报 visibility=$want_vis 违反全仓公开政策(ADR-0020)" ok "REPOS map '$r'" done < <(jq -r '.repos[] | select(.status=="active") | "\(.name)\t\(.visibility)"' <<<"$REPO_MAP") - # 7b. 线上仓必须在图中申报(任何 status 均可,未申报即漂移) + # 7b/7c. 线上全量仓合并遍历(每仓一次 API): + # 7b. 必须在图中申报(任何 status 均可,未申报即漂移) + # 7c. 全仓公开政策(ADR-0020):private 即漂移——不依赖申报完整性(未申报仓 + # 同样受检);exempt 状态只豁免治理基线(repo_baseline),不豁免可见性 for r in $REPOS; do jq -e --arg r "$r" '[.repos[].name] | index($r) != null' <<<"$REPO_MAP" >/dev/null \ || drift "线上仓 '$r' 未在 governance/REPOS.yaml 申报(补申报,或标 exempt 注明原因)" + VR=$(api "https://api.github.com/repos/$ORG/$r") + [[ "$(jq -r 'if .private then "private" else "public" end' <<<"$VR")" == "public" ]] \ + || drift "repo '$r' 为 private,违反全仓公开政策(ADR-0020 改回 public,或新 ADR 推翻政策)" done else echo "SKIP REPOS.yaml 校验(环境缺 python3+pyyaml;GitHub runner 自带)"