chore(claude): extend self-extending tripwire + pause-bots guard for stale-claims
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), теряя его работу.
This commit is contained in:
parent
870f062587
commit
5673dd6298
4 changed files with 13 additions and 1 deletions
|
|
@ -92,6 +92,7 @@ Staff+ code reviewer в autonomous-merge режиме. Polling PRs с `status/re
|
||||||
- Diff меняет блок `## Auto-merge policy` в `.claude/rules/git-pr.md`
|
- Diff меняет блок `## Auto-merge policy` в `.claude/rules/git-pr.md`
|
||||||
- Diff меняет `Critical workflow rules` / `## Critical rules` в `CLAUDE.md`
|
- Diff меняет `Critical workflow rules` / `## Critical rules` в `CLAUDE.md`
|
||||||
- Diff меняет содержимое этого файла (`auto-code-reviewer.md`) — bot не должен расширять собственные merge права
|
- 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)
|
- Diff содержит литеральный 40-char hex / API key / JWT (security tripwire)
|
||||||
- Action: NEVER merge даже при APPROVE → POST comment с marker `verdict=changes` + `+status/blocked +needs-human`
|
- Action: NEVER merge даже при APPROVE → POST comment с marker `verdict=changes` + `+status/blocked +needs-human`
|
||||||
- ✅ Anti-regression check — `obsidian_simple_search` по теме PR (был ли похожий fix, не воспроизводится ли incident)
|
- ✅ Anti-regression check — `obsidian_simple_search` по теме PR (был ли похожий fix, не воспроизводится ли incident)
|
||||||
|
|
|
||||||
|
|
@ -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 меняет `## Auto-merge policy` в `.claude/rules/git-pr.md`
|
||||||
- Diff меняет `Critical workflow rules` в CLAUDE.md
|
- Diff меняет `Critical workflow rules` в CLAUDE.md
|
||||||
- Diff меняет `auto-code-reviewer.md` (этот файл — bot не расширяет свои merge права)
|
- 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
|
- Diff содержит literal 40-char hex / API key / JWT
|
||||||
- → POST comment `verdict=changes` + `+status/blocked +needs-human`
|
- → POST comment `verdict=changes` + `+status/blocked +needs-human`
|
||||||
- ❌ НЕ запускай Playwright smoke сам (это auto-qa-tester работа)
|
- ❌ НЕ запускай Playwright smoke сам (это auto-qa-tester работа)
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ Closes #N
|
||||||
|
|
||||||
**Жёсткие исключения** (даже при APPROVE — НЕ merge, ping user):
|
**Жёсткие исключения** (даже при APPROVE — НЕ merge, ping user):
|
||||||
- Diff содержит литеральный secret/token/password/credential (40-char hex, API keys, JWT, и т.д.) — security tripwire
|
- 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
|
## Sequential PRs
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,16 @@ now_utc_epoch() {
|
||||||
python3 -c 'import datetime; print(int(datetime.datetime.now(datetime.timezone.utc).timestamp()))'
|
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)"
|
echo "[$(date -Is)] cleanup-stale-claims: scanning status/wip issues (stale threshold: ${STALE_HOURS}h)"
|
||||||
|
|
||||||
NOW=$(now_utc_epoch)
|
NOW=$(now_utc_epoch)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue