From 5673dd6298479357c166b59de45ca7b0573b7321 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Fri, 29 May 2026 17:36:20 +0300 Subject: [PATCH] chore(claude): extend self-extending tripwire + pause-bots guard for stale-claims MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two safety follow-ups к autonomous-pipeline (flagged в multiagent-аудите): - Self-extending guard расширен: reviewer-bot NEVER merge'ит PR, меняющий _autonomous_pickup.md (claim/kill-switch/merge-FSM contract) или любой work-as-*.md (persona activation) — раньше защищались только git-pr.md Auto-merge policy + CLAUDE.md + auto-code-reviewer.md. Закрывает дыру, где bot мог изменить claim/kill-switch logic без human. Правки в git-pr.md, auto-code-reviewer.md, work-as-reviewer.md. - cleanup-stale-claims.sh: pause-bots early-exit. Без него cron освобождал wip-claim worker'а, приостановленного mid-work (он держит claim до un-pause per _autonomous_pickup.md), теряя его работу. --- .claude/agents/auto-code-reviewer.md | 1 + .claude/commands/work-as-reviewer.md | 1 + .claude/rules/git-pr.md | 2 +- scripts/cleanup-stale-claims.sh | 10 ++++++++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.claude/agents/auto-code-reviewer.md b/.claude/agents/auto-code-reviewer.md index b39eaafe..063c7155 100644 --- a/.claude/agents/auto-code-reviewer.md +++ b/.claude/agents/auto-code-reviewer.md @@ -92,6 +92,7 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re - Diff меняет блок `## Auto-merge policy` в `.claude/rules/git-pr.md` - Diff меняет `Critical workflow rules` / `## Critical rules` в `CLAUDE.md` - Diff меняет содержимое этого файла (`auto-code-reviewer.md`) — bot не должен расширять собственные merge права + - Diff меняет `_autonomous_pickup.md` (claim/kill-switch/merge-FSM contract) или любой `work-as-*.md` (persona activation) — bot не меняет правила своего пайплайна - Diff содержит литеральный 40-char hex / API key / JWT (security tripwire) - Action: NEVER merge даже при APPROVE → POST comment с marker `verdict=changes` + `+status/blocked +needs-human` - ✅ Anti-regression check — `obsidian_simple_search` по теме PR (был ли похожий fix, не воспроизводится ли incident) diff --git a/.claude/commands/work-as-reviewer.md b/.claude/commands/work-as-reviewer.md index 94bd4b04..2476b005 100644 --- a/.claude/commands/work-as-reviewer.md +++ b/.claude/commands/work-as-reviewer.md @@ -58,6 +58,7 @@ curl -sH "Authorization: token $FORGEJO_TOKEN" "$FORGEJO_URL/api/v1/user/tokens" - Diff меняет `## Auto-merge policy` в `.claude/rules/git-pr.md` - Diff меняет `Critical workflow rules` в CLAUDE.md - Diff меняет `auto-code-reviewer.md` (этот файл — bot не расширяет свои merge права) + - Diff меняет `_autonomous_pickup.md` (claim/kill-switch/merge-FSM) или любой `work-as-*.md` (persona) — bot не меняет свой пайплайн - Diff содержит literal 40-char hex / API key / JWT - → POST comment `verdict=changes` + `+status/blocked +needs-human` - ❌ НЕ запускай Playwright smoke сам (это auto-qa-tester работа) diff --git a/.claude/rules/git-pr.md b/.claude/rules/git-pr.md index ae4a9e6f..6e409e6e 100644 --- a/.claude/rules/git-pr.md +++ b/.claude/rules/git-pr.md @@ -89,7 +89,7 @@ Closes #N **Жёсткие исключения** (даже при APPROVE — НЕ merge, ping user): - Diff содержит литеральный secret/token/password/credential (40-char hex, API keys, JWT, и т.д.) — security tripwire -- PR меняет блок `## Auto-merge policy` в этом файле или `Critical workflow rules` в CLAUDE.md (self-extending guard, decided 2026-05-24 — изменение правил всегда через human, предотвращает bot-loop где bot сам расширяет свои merge права) +- PR меняет блок `## Auto-merge policy` в этом файле, `Critical workflow rules` в CLAUDE.md, `_autonomous_pickup.md` (claim/kill-switch/merge-FSM contract), `auto-code-reviewer.md` или любой `work-as-*.md` (self-extending guard, decided 2026-05-24, расширен 2026-05-29 — изменение правил пайплайна всегда через human, предотвращает bot-loop где bot сам расширяет свои merge права) ## Sequential PRs diff --git a/scripts/cleanup-stale-claims.sh b/scripts/cleanup-stale-claims.sh index c33ed9d5..fb770da5 100644 --- a/scripts/cleanup-stale-claims.sh +++ b/scripts/cleanup-stale-claims.sh @@ -44,6 +44,16 @@ now_utc_epoch() { python3 -c 'import datetime; print(int(datetime.datetime.now(datetime.timezone.utc).timestamp()))' } +# Pause-bots guard: если активен kill-switch — НЕ освобождать claims. Иначе worker, +# приостановленный mid-work (держит wip-claim до un-pause per _autonomous_pickup.md +# «Pause-bots поведение mid-work»), потеряет работу — cron снимет его claim. +PAUSE_CHECK=$(curl_forgejo "repos/$FORGEJO_REPO/issues?labels=pause-bots&state=open&limit=1") +PAUSE_COUNT=$(printf '%s' "$PAUSE_CHECK" | python3 -c 'import json,sys; print(len(json.load(sys.stdin)))') +if [ "$PAUSE_COUNT" != "0" ]; then + echo "[$(date -Is)] cleanup-stale-claims: pause-bots active — skipping (workers may intentionally hold wip)" + exit 0 +fi + echo "[$(date -Is)] cleanup-stale-claims: scanning status/wip issues (stale threshold: ${STALE_HOURS}h)" NOW=$(now_utc_epoch) -- 2.45.3