ci(runner): guard gitea pressure triggers [skip ci]

This commit is contained in:
Your Name
2026-06-28 19:13:30 +08:00
parent c19057044a
commit b3a3233d2a
11 changed files with 242 additions and 30 deletions

View File

@@ -8,7 +8,7 @@
| 欄位 | 值 |
|------|-----|
| **版本** | v2.6 |
| **版本** | v2.7 |
| **建立日期** | 2026-03-20 (台北) |
| **建立者** | Claude Code |
| **最後修改** | 2026-06-28 (台北) |
@@ -35,6 +35,7 @@
| v2.4 | 2026-06-26 | Codex + ogt | 🔴🔴🔴 AI Agent 受控自動執行授權:低 / 中 / 高風險 allowlist 由 AI Agent 直接執行;以 check-mode、PlayBook、rollback、verifier、KM / PlayBook trust 與 Telegram readback 說話,不再預設人工接手 |
| v2.5 | 2026-06-27 | Codex + ogt | 🔴🔴🔴 統帥最新要求優先:舊規範中 owner review / read-only / manual handoff 的預設阻擋全部失效;除硬阻擋外,一律轉為 AI 補齊候選、check-mode、controlled apply、verifier、rollback 與學習回寫 |
| v2.6 | 2026-06-28 | Codex + ogt | 🔴🔴🔴 統帥全面授權:所有非事故級 hard gate / guard 預設打開為 AI controlled apply`0 / false` 只能作 evidence不得阻擋實作真正硬阻擋只剩 secret、不可逆資料破壞、reboot / node drain / firewall cutover、攻擊型掃描、成本 / provider、force push / repo refs 破壞、raw secret volume 與未經 replay / shadow / canary 的核心替換 |
| v2.7 | 2026-06-28 | Codex + ogt | 🔴🔴🔴 110 runner 壓力防再發:`.gitea/workflows` 不得把 push / pull_request 自動事件接到 `awoooi-ubuntu` / `awoooi-host` 或泛用 label新增 source guard 驗證 |
---
@@ -293,6 +294,8 @@ force push / 刪 repo / 刪 refs / 改 repo visibility / raw runtime secret volu
允許的 controlled apply 是降壓與防再發:停止 / disable / mask legacy runner、mask direct transient unit、quarantine legacy runner binary、收斂 labels、補 source fail-closed guard、限制 concurrency、把 smoke 改成排程 / 非 110 runner以及執行只讀 pressure / cold-start verifier。未完成 runner 搬遷或非 110 硬限流前,`awoooi-cd-lane.service``awoooi-cd-lane-drain.service`、direct runner 與 Gitea runner 必須由 `awoooi-runner-failclosed-enforcer.timer``awoooi-runner-failclosed-authority.timer``/etc/cron.d/awoooi-runner-failclosed-authority` 維持 masked / inactive / no process / no job container / root restore-source left `0`cron / systemd authority 必須執行 `/usr/local/lib/awoooi/enforce-110-runner-failclosed.authority.sh`,並用該 authority copy 修復 canonical `/usr/local/lib/awoooi/enforce-110-runner-failclosed.sh`。若外部 opener 暫時恢復 unit 或覆寫 canonical只能恢復成帶 `ConditionPathExists=/run/awoooi-runner-migrated-or-hard-limited` 的 fail-closed stub下一輪 cron authority / authority / enforcer 必須再收斂回 masked / inactive。verifier 不得再接受單一 `controlled_open` lane。
同一事故期內,`.gitea/workflows` 不得再讓 `push``pull_request``pull_request_target` 自動事件命中 `awoooi-ubuntu` / `awoooi-host`,也不得恢復 `ubuntu-latest``ubuntu-*``self-hosted` 泛用 label。所有 workflow 變更必須通過 `ops/runner/guard-gitea-runner-pressure.py`;若要恢復自動事件,必須先提交 runner 搬遷 / 非 110 硬限流 source-of-truth diff、rollback 與 post-apply verifier。
恢復 runner 必須同時具備:
1. target selector明確列出 service、runner dir、label 與承接 repo。

View File

@@ -1,3 +1,19 @@
## 2026-06-28 — 19:10 110 runner push-trigger pressure source guard
**完成內容**
- `.gitea/workflows/cd-dev.yaml``deploy-alerts.yaml``type-sync-check.yaml``run-migration.yml` 移除 push / PR 自動觸發,改為 `workflow_dispatch` controlled path。
- 新增 `ops/runner/guard-gitea-runner-pressure.py`source guard 禁止 `.gitea/workflows``push` / `pull_request` / `pull_request_target` 自動事件接到 `awoooi-ubuntu` / `awoooi-host`,也禁止恢復 `ubuntu-latest` / `ubuntu-*` / `self-hosted` 泛用 label。
- `scripts/ops/ansible-validate.sh` 接入 runner pressure guard`AGENTS.md``docs/HARD_RULES.md`、MASTER 與 `ops/runner/README.md` 同步規範:全面授權不等於重開 110 legacy runner也不等於恢復自動 push runner 壓力。
**驗證結果**
- `python3 ops/runner/guard-gitea-runner-pressure.py --root .``GITEA_RUNNER_PRESSURE_GUARD_OK workflow_files=10 scheduled_workflows=3 auto_branch_events_on_110=0 generic_runner_labels=0`
- `python3 -m py_compile ops/runner/guard-gitea-runner-pressure.py`:通過。
- `ruby -e 'require "yaml"; Dir[".gitea/workflows/*.{yml,yaml}"].sort.each { |p| YAML.load_file(p); puts "YAML_OK #{p}" }'`10 個 Gitea workflow 皆通過。
- `git diff --check`:通過。
- 本機 `python3` 缺 PyYAML未用 `scripts/ops/ansible-validate.sh` 做完整 Ansible validation本輪已用 Ruby YAML parse + 新 guard + Python compile 覆蓋本次 workflow / guard 改動。
**邊界**:未讀 secret / runner token / raw session / SQLite / auth / `.env`;未重啟 Docker / Nginx / firewall / K3s / DB未打開 legacy runner 或 controlled drain lane未使用 GitHub API / gh / GitHub Actions。
## 2026-06-28 — 18:58 110 fail-closed authority cron immutable 修復與 P3 讀回
**背景**`1fdbc96a9` 曾把 fail-closed authority source / timer source 刪除live 110 也被改成 disabled stubauthority / canonical SHA `03bbf87d...``/etc/cron.d/awoooi-runner-failclosed-authority` 內容為 `No cron jobs are defined``awoooi-cd-lane-drain.service active/enabled`。後續 `f4d1b99da``6840c3578` 已 revert 該方向;`5c540460c` / `3b3fbef63` 補上 cron 檔 immutable 覆寫修復。

View File

@@ -153,7 +153,7 @@ AWOOOI / AwoooP / IwoooS 不是單純監控頁、告警轉發器或資安清冊
3. 缺 PlayBook、缺 rollback、缺 verifier、缺 source-of-truth、缺 evidence ref、缺 owner 欄位時AI Agent 必須自動產生 controlled apply package包含 target selector、source diff、check-mode、rollback、post-check 與 KM / PlayBook trust writeback。
4. Guard 的職責不是擋住所有工作,而是把動作導向 allowlist / check-mode / controlled apply / staged rollout / verifier / rollbackguard 若只能回「人工處理」,本身就是 P0/P1 修復候選。
5. 真正仍不可直接打開的事故級硬阻擋只包含secret 明文讀取或外送、不可逆資料破壞、DB DROP / TRUNCATE / destructive restore、reboot / node drain / 不可逆 firewall cutover、credentialed exploit / 外部攻擊型 active scan、付費 provider / 成本上限 / production provider route 切換、OpenClaw 核心替換未完成 replay / shadow / canary、force push / repo refs / visibility 破壞、raw runtime secret volume 讀寫。
6. 110 runner 容量事故屬硬保護例外:不得重開 legacy runner、解除 legacy fail-closed、恢復泛用 label 或把 host pressure gate warn-only未完成 runner 搬遷或非 110 硬限流前AWOOOI controlled CD lane / drain lane 也必須由 `awoooi-runner-failclosed-enforcer.timer``awoooi-runner-failclosed-authority.timer``/etc/cron.d/awoooi-runner-failclosed-authority` 維持 masked / inactive / no process / no job container / root restore-source left `0`cron / systemd authority 必須執行 `/usr/local/lib/awoooi/enforce-110-runner-failclosed.authority.sh` 並修復 canonical `/usr/local/lib/awoooi/enforce-110-runner-failclosed.sh`,舊 `/tmp/enforce-110-runner-failclosed.sh``/tmp/awoooi-enforce-runner-failclosed-110.sh*` opener source、`awoooi-runner-failclosed-opened-*``awoooi-runner-failclosed-*-opened-*``awoooi-runner-failclosed-quarantine-*``failclosed-final-mask-*` disabler artifact 必須封成 fail-closed stubworkflow push trigger 維持 manual-only
6. 110 runner 容量事故屬硬保護例外:不得重開 legacy runner、解除 legacy fail-closed、恢復泛用 label 或把 host pressure gate warn-only未完成 runner 搬遷或非 110 硬限流前AWOOOI controlled CD lane / drain lane 也必須由 `awoooi-runner-failclosed-enforcer.timer``awoooi-runner-failclosed-authority.timer``/etc/cron.d/awoooi-runner-failclosed-authority` 維持 masked / inactive / no process / no job container / root restore-source left `0`cron / systemd authority 必須執行 `/usr/local/lib/awoooi/enforce-110-runner-failclosed.authority.sh` 並修復 canonical `/usr/local/lib/awoooi/enforce-110-runner-failclosed.sh`,舊 `/tmp/enforce-110-runner-failclosed.sh``/tmp/awoooi-enforce-runner-failclosed-110.sh*` opener source、`awoooi-runner-failclosed-opened-*``awoooi-runner-failclosed-*-opened-*``awoooi-runner-failclosed-quarantine-*``failclosed-final-mask-*` disabler artifact 必須封成 fail-closed stub`.gitea/workflows` 不得把 `push``pull_request``pull_request_target` 自動事件接到 `awoooi-ubuntu` / `awoooi-host`,也不得恢復 `ubuntu-latest` / `ubuntu-*` / `self-hosted` 泛用 labelworkflow 變更必須通過 `ops/runner/guard-gitea-runner-pressure.py`
7. 資料 freshness gate 必須 source-aware若 Drive / provider source preflight 證明沒有比最後乾淨 import 更新的來源,且 DB sync / import job 乾淨stale business data 是 source freshness warningauth/source/failed-folder/DB sync 有異常才是 hard blocker。
8. Provider proxy gate 必須避免成本 / route 誤開:未 provisioned 且 repo 已標 optional retired 的 LiteLLM 等 proxy只能列 warning不得為了過 health gate 自動啟動或切 production provider route。