- auto-analyst: новый INBOUND PICKUP режим — забирает issues с label
status/needs-analysis (человек→бот канал), refine in-place в status/ready
или split на под-issues. + PIPELINE STATE READ для осведомлённости об
очередях backend/frontend/db/qa (дедуп + throttle gate). Перенумерованы
шаги per-tick (1-10) + cross-refs.
- _autonomous_pickup: label status/needs-analysis (id 64) в таблицу +
4 state-transitions + семантика входящей очереди.
- backend-engineer + tech-analyst + auto-analyst: доступ к отдельной
postgres-tradein БД (scraped listings/estimator/coverage) — tradein
issues метрик-heavy, без live-чтения работа вслепую.
Из инцидентов 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).
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.
🔴 Critical (3):
1. cleanup-stale-claims.sh: export CUTOFF + STALE_HOURS
Без `export` Python heredoc child process получал "0" вместо реального
cutoff → cron всегда видел все issues как fresh → ничего не освобождал.
Plus added abort при CUTOFF=0 в Python heredoc для defense-in-depth.
2. cleanup-stale-claims.sh: datetime.UTC → datetime.timezone.utc
datetime.UTC требует Python 3.11+. Forgejo runner ubuntu-latest имеет 3.10.
datetime.timezone.utc works в 3.8+.
3. cleanup-stale-claims.sh: invert label order — DELETE wip FIRST, потом
POST ready. Если step 2 (add ready) fails — issue в neutral state без
status/*, менее опасно чем оба status/ready+status/wip одновременно.
🟠 + 🟡 + 🟢 (5):
4. Added pagination loop (defensive cap 10 pages × 50 = 500 issues), но
реализована через temp file + Python parsing (не bash JSON concat).
5. Removed dead code: iso_to_epoch() shell helper не использовался.
6. _autonomous_pickup.md: fix broken `Out-Null | if (-not $?)` pattern.
GetEnvironmentVariable НЕ throws при missing — возвращает $null. $? у
Get* всегда $true. Заменено на прямую проверку результата.
7. stale-claims.yml: добавлен concurrency group чтобы overlapping runs
не stomp'ились (хотя 5-min timeout делает overlap unlikely, defensive).
8. Documented updated_at != heartbeat assumption в header script'а.
Не сделано (low/optional):
- Setup script tokens в memory (UX trade-off — не critical)
- Token suffix в console output (минор info leak в shell history)
Refs: PR #610 review by review-bot (sha=297eb29, verdict=changes)
#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
DRAFT-файлы для autonomous /loop окон (5 ролей: analyst/backend/frontend/
code-reviewer/qa-tester). НЕ для invoke через Task tool — только как
--append-system-prompt для standalone Claude Code windows с /loop.
Все файлы помечены status:draft. Не активны до сборки .claude/commands/
work-as-* wrappers + Forgejo labels + bot-PATs (см. runbook
multi_agent_autonomous_workflow.md в vault).
Также fix .gitignore: .claude/ → .claude/* чтобы whitelist'ы
!.claude/agents/** работали (git не allow re-include children of ignored
directory).
Refs: runbooks/multi_agent_autonomous_workflow.md (vault)