Из инцидентов live-сессии 2026-05-30:
- шаг 4: file:line из vault-заметки НЕВЕРИФИЦИРОВАН — Read+confirm своими глазами
до вписывания в issue (incident: спека «перевести на JSON», код уже на JSON)
- шаг 7: status/ready только на финальном verified-теле, не «ready→переписываю»
(incident #697/#699 — воркер смержил по тонкому телу за ~30s)
- «поменяй лейблы» ⇒ также аудит+переписывание тонкого тела до ready
- _autonomous_pickup: dedup-before-create обязателен при параллельных окнах
(incident #724/#728 vs #726/#727), list_repo_issues всегда с фильтром (token-limit)
- work-as-analyst: один loop-механизм, CronDelete перед CronCreate
- fix stale cross-ref шаг 6 → шаг 8
Новое окно auto-resolver — снимает блокеры issues с label needs-human,
используя capabilities, которых нет у headless-ботов (dev-IP не зафайрволлен,
сохранённые куки, Playwright, прямой postgres-tradein/gendesign MCP, SSH на прод).
- .claude/agents/auto-resolver.md — persona (full-auto на машине пользователя;
классификация блокера A/B/C/D; кат B genuine-decision → AskUserQuestion).
- .claude/commands/work-as-resolver.md — skill /work-as-resolver → /loop 15m.
- auto-analyst.md + _autonomous_pickup.md FSM — лейбл-контракт needs-human:
вешать может analyst/worker/qa, СНИМАТЬ только auto-resolver (anti-race #726/#727).
Раньше qa по правилу НЕ создавал issues (только reopen тестируемого + needs-fix,
либо prod_down spike). Побочный/новый баг, замеченный при smoke, терялся.
Теперь (симметрично reviewer minor→follow-up): НОВЫЙ баг (не тестируемый issue) →
mcp__forgejo__create_issue: scope/X + status/ready + priority/pN + bug, body = work-prompt
(Задача/repro/Files/DoD) + screenshot/console → попадёт воркеру в очередь. Проверка
дубликатов. По ТЕСТИРУЕМОМУ issue — по-прежнему reopen+needs-fix (не дубль).
auto-qa-tester.md (verdict + hard rule) + work-as-qa.md (+ починил stale "(10m)"→"(5m)").
Аналитик теперь пишет issue как готовый рабочий промт с единственным толкованием:
- Шаблон body: Задача (императив) + Контекст + Files (точные пути) + Сигнатуры +
Definition of Done (БИНАРНО: команда→результат) + Не делать (out of scope) + Risk + Depends.
- Преамбула issue: «Worker: исполняемый спек, выполняй буквально, неясность → коммент, не угадывай»
→ инструкция едет вместе со спеком (worker не реинтерпретирует).
- NO-AMBIGUITY GATE перед CREATE: перечитать глазами worker'а с нулевым контекстом — точные
идентификаторы (без плейсхолдеров <area>/«соответствующий»), бинарный DoD, единственное
толкование; иначе доуточнить или +needs-human, НЕ постить ready.
- Hard rules + work-as-analyst синхронизированы.
Воркеры (auto-backend/frontend) — CONTEXT LOAD + fixup loop проверены, не тронуты (качество сохранено).
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), теряя его работу.
Fix structural causes of autonomous-window underperformance vs single-window
orchestration — persona prompts were thin pointers that deferred conventions
to unread files and dead-ended every imperfect PR into human review.
- Inline-load conventions: каждый work-тик MANDATORY-читает полный
backend/frontend-engineer.md + rules (был optional pointer, который cost-rule
отучал читать). Cost-saving "не строй контекст" сужен до idle-тиков явно.
- Auto-fix loop: reviewer FIX -> status/needs-fix (assignee остаётся worker),
worker сам подхватывает свой PR и пушит fixup в ту же ветку. blocked+needs-human
зарезервирован под BLOCK (security/data-loss) или 3x fix-fail (+ fix-attempt cap).
QA feature_regression -> needs-fix аналогично. FSM-таблица обновлена.
- Fat issue template: auto-analyst делает mandatory code archeology (Grep/Read)
и пишет Files/сигнатуры/Acceptance/Risk (формат tech-analyst) — issue это
единственный канал к worker'у.
- Model resolution doc: model: frontmatter мёртв в standalone /loop-окне
(модель = модель окна); reviewer-окно запускать в Opus 4.8 осознанно.
- Drift fix: stale-claim cleanup помечен implemented (cron stale-claims.yml в
проде, #610-612); отмечен gap pause-bots vs cleanup.
Новый label status/needs-fix создать в Forgejo до первого запуска auto-fix loop.
#11: slash-commands и _autonomous_pickup.md теперь читают persistent User-scope
env vars напрямую (FORGEJO_TOKEN_<ROLE>) вместо file-based из ~/.claude/secrets/.
Один раз: scripts/setup-bot-env.ps1 (запускается user'ом локально, кладёт
токены из vault в Windows User registry). После этого окна grab credentials
через [System.Environment]::GetEnvironmentVariable() — никаких файлов.
Все 5 work-as-*.md обновлены (analyst/backend/frontend/reviewer/qa).
#12: stale-claim cleanup — cron каждые 30 минут.
- scripts/cleanup-stale-claims.sh — bash, parses Forgejo API + Python для JSON
- .forgejo/workflows/stale-claims.yml — cron schedule `*/30 * * * *`
Освобождает issues застрявшие в status/wip >4h:
- assignees=[]
- +status/ready -status/wip
- comment "stale claim released, worker likely crashed"
Использует secret FORGEJO_BOT_QA_TOKEN (минимум прав = write:issue).
Setup: secret нужно завести в Forgejo Actions UI после merge —
git.gendsgn.ru/lekss361/gendesign/-/settings/actions/secrets.
Refs: PRs #608, #609. Closes TODO с PR #608 (stale-claim cron).
Phase 2 prep для autonomous multi-window workflow (Phase 1 — PR #608).
Изменения:
1. `.claude/agents/_autonomous_pickup.md` — добавлена Pre-flight checklist:
- Шаг 1: где взять PAT из vault meta/00_credentials.md
- Шаг 2: env vars + git identity (GIT_AUTHOR_NAME/EMAIL — критично!)
- Шаг 3: bot-remote setup (отдельный remote с bot's PAT для audit log)
- Шаг 4: sanity check identity (curl /user → должен вернуть bot-<role>)
Без этого commits писались бы под lekss361, не под ботом.
2. `.claude/commands/work-as-*.md` (5 файлов) — slash-commands для запуска окон:
- work-as-analyst (sonnet, /loop 30m)
- work-as-backend (sonnet, /loop dynamic)
- work-as-frontend (sonnet, /loop dynamic)
- work-as-reviewer (opus, /loop 5m)
- work-as-qa (sonnet, /loop 10m)
Каждый command:
- Описывает pre-flight для конкретной роли
- Ссылается на соответствующий .claude/agents/auto-*.md
- Перечисляет hard rules для роли
- Объясняет per-tick workflow
3. Forgejo labels (16 шт, созданы через REST API — не в этом diff):
scope/{backend,frontend,db,qa,devops}
status/{ready,wip,review,qa,done,blocked}
priority/{p0,p1,p2}
pause-bots, needs-human
Что осталось для активации:
- 5 Forgejo bot-users + PATs (уже созданы 2026-05-27, см. vault)
- ~/.claude/secrets/forgejo-bot-*.token — выгрузка PAT'ов из vault user'ом вручную
- Stale-claim cron (отдельный PR)
- Optional: multi-window launcher через tmux/wezterm
Refs: PR #608 (Phase 1), runbooks/multi_agent_autonomous_workflow.md