Files
admin/.tasks/STATUS.md

29 KiB
Raw Blame History

Admin Task Board

Updated: 2026-05-21

[admin-infra-project-pointers] — Bootstrap-pointers для design admin-infra-project. Pre-fills target's .wiki/CLAUDE.md Domain conventions ссылками на спецификацию. Дизайн не лежит в этом репо — только pointer-stub. Без этой таски следующий агент попадёт в дыру: where_stopped one-liner + пустой Domain conventions stub = угадывание порогов / pipeline-этапов вместо чтения готовых решений.

Кто делает: любой следующий агент в этом проекте. Это первая по приоритету таска промоушена — все остальные импл-таски ссылаются на pointers через .wiki/CLAUDE.md.

Status: ready Where I stopped: (not started) Next action: В .wiki/CLAUDE.md секции "Domain conventions" вставить блок (или заменить дефолтный setup-wiki stub):

Mandatory: read design context before implementation

Before picking up any task in .tasks/, load the full design context. It does not live in this repo as a standalone source — only pointers do. Sources, in order:

  1. Local design (canonical): .wiki/concepts/admin-infra-project.md — ingested via promote 2026-05-21. Identity, scope, content inventory, migration recipe (subtree-split + read-tree merge for populated prefixes), initial agenda.
  2. Brainstorm process trace (rationale): ~/projects/.workshop/.archive/2026-05-21-admin-infra-project.md. Why each decision was made (recommend vs menu trade-offs), what was rejected (filter-repo vs subtree-split, "admin-only" skills, splitting roadmap from ops), anti-patterns flagged during brainstorm.
  3. Local overview.md — thin summary, quick orientation only — never the source of truth.

Do not invent migration recipes, file lists, taxonomies, or scope decisions from task where_stopped lines alone — those are pointers, not specifications. The concept doc and archive contain the rationale.


Закоммитить: wiki(claude): add design-context pointers for admin-infra-project. Branch: n/a


🔵 [morecms-subtree-split] — Шаг 2 миграции: в ~/projects/MoreThenCms создать 4 subtree-split ветки, каждая хранит per-file history своего dir'а. Эти ветки потом импортируются в admin (см. admin-subtree-import-and-cleanup).

См. .wiki/concepts/admin-infra-project.md §Migration mechanics шаг 2 для полного контекста.

Status: blocked Where I stopped: (not started) Next action: ```powershell cd ~/projects/MoreThenCms git subtree split --prefix=.wiki/entities -b split-wiki-entities git subtree split --prefix=.wiki/sources -b split-wiki-sources git subtree split --prefix=.wiki/concepts -b split-wiki-concepts git subtree split --prefix=.tasks -b split-tasks


Acceptance: `git branch | grep split-` показывает 4 ветки. Каждая `git log split-<x>` содержит коммиты только относящиеся к соответствующему dir'у. **Не push'ить** эти ветки — они служебные, нужны только для local subtree-add в admin.

Done — пометить 🟢 + переходить к `admin-subtree-import-and-cleanup`.
**Blocker:** admin-infra-project-pointers
**Branch:** n/a
<!-- created-by: OpeItcLoc03@DESKTOP-NSEF0UK / from: OpeItcLoc03/workshop / 2026-05-21T10:22:50.307Z -->

---

## 🔵 [admin-subtree-import-and-cleanup] — Шаги 3-7 миграции: импорт 4 split-веток из MoreThenCms в admin (clean prefixes через `git subtree add`, populated prefixes через `git read-tree --prefix` merge), cleanup CMS-следов из mixed splits, STATUS.md merge, index.md regen, push на Gitea.

Объединено в одну таску потому что: тот же agent, та же session, sequential steps без natural review-point между ними. См. `.wiki/concepts/admin-infra-project.md` §Migration mechanics шаги 3-7.

**Status:** blocked
**Where I stopped:** (not started)
**Next action:** **3a. Clean prefixes:**
```powershell
cd ~/projects/.admin
git remote add morecms ~/projects/MoreThenCms
git fetch morecms
git rm .wiki/entities/.gitkeep .wiki/sources/.gitkeep
git commit -m "prep: clear gitkeep before subtree import"
git subtree add --prefix=.wiki/entities morecms/split-wiki-entities
git subtree add --prefix=.wiki/sources  morecms/split-wiki-sources

3b. Mixed prefixes (.wiki/concepts/ and .tasks/ already have content):

Preferred — git read-tree merge:

git rm .wiki/concepts/.gitkeep
git commit -m "prep: clear concepts gitkeep before import"
git fetch morecms split-wiki-concepts
git read-tree --prefix=.wiki/concepts/ -u morecms/split-wiki-concepts
git commit -m "import: .wiki/concepts/ from MoreThenCms via subtree-split (history preserved via read-tree)"

git fetch morecms split-tasks
git read-tree --prefix=.tasks-imported/ -u morecms/split-tasks
git commit -m "import: .tasks/ from MoreThenCms via subtree-split (staged at .tasks-imported/)"
# Затем merge content with admin's existing STATUS.md (см. шаг 5).

Альтернатива при конфликтах — temp-prefix dance (.tmp-concepts/, git mv, git rm -r .tmp-concepts).

4. Cleanup CMS-следов:

git rm .wiki/concepts/cms-admin-assets-root-folder-seed.md `
       .wiki/concepts/cms-config-rewrite-pattern.md `
       .wiki/concepts/cms-maljarka-https-mode-crash.md `
       .wiki/concepts/cms-server-port-leak-fix.md `
       .wiki/concepts/webconfig-password-xml-escape.md `
       .tasks-imported/cms-admin-assets-root-folders-seed.md `
       .tasks-imported/cms-admin-assets-root-folders-seed.inserted-rows.txt `
       .tasks-imported/cms-maljarka-https-mode-bug-fix.md `
       .tasks-imported/cms-port-leak-fix.md `
       .tasks-imported/traefik-maljarka-502-bug.md
git commit -m "cleanup: drop CMS files imported via subtree (they stay in MoreThenCms)"

5. STATUS.md merge: скопировать non-CMS таски из .tasks-imported/STATUS.md в admin/.tasks/STATUS.md (сохраняя 🟢 done статусы); удалить .tasks-imported/; rename per-task files в .tasks/. Commit tasks: merge imported MoreThenCms task history with admin live agenda.

6. index.md regen: обновить .wiki/index.md чтобы catalog отражал импортированные entities/concepts/sources. Commit wiki(index): refresh catalog after subtree import.

7. Push: git push origin master.

Acceptance:

  • git log --follow .wiki/concepts/wd40efax-smr-cascade.md показывает MoreThenCms-era коммиты (history preserved)
  • ls .wiki/entities/ содержит все 6 файлов
  • ls .wiki/concepts/ содержит 18 admin-domain + admin-infra-project (новый)
  • cat .tasks/STATUS.md содержит и live agenda (pointers + impl + secrets + roadmap), и imported 🟢 done items
  • Gitea web shows updated tree

Done — 🟢; unblock morecms-cleanup-and-breadcrumb + resilience-roadmap-design. Blocker: admin-infra-project-pointers, morecms-subtree-split Branch: n/a


🔵 [morecms-cleanup-and-breadcrumb] — Шаги 8-10 миграции: в ~/projects/MoreThenCms удалить мигрированные файлы (6 entities + 17 concepts + 3 sources + 7 tasks), обновить STATUS.md/index.md, добавить .wiki/concepts/migrated-infra-to-admin.md breadcrumb со списком «что куда уехало», push на Gitea.

См. .wiki/concepts/admin-infra-project.md §Migration mechanics шаги 8-10 + полный шаблон breadcrumb'а в §9.

Очерёдность: ТОЛЬКО после успешного push'а admin'а с импортированным контентом (admin-subtree-import-and-cleanup 🟢). Иначе риск удалить из MoreThenCms то что ещё не зафиксировано в admin.

Status: blocked Where I stopped: (not started) Next action: 8. Cleanup commit (drop migrated):

cd ~/projects/MoreThenCms
git rm .wiki/entities/* .wiki/sources/* `
       .wiki/concepts/wd40efax-smr-cascade.md `
       .wiki/concepts/hyper-backup-structure-and-recovery.md `
       .wiki/concepts/vbox-windows-stability-tuning.md `
       .wiki/concepts/mssql-container-data-restore.md `
       .wiki/concepts/traefik-on-windows-docker-desktop.md `
       .wiki/concepts/traefik-tcp-passthrough-vs-starttls.md `
       .wiki/concepts/traefik-file-watch-wsl2-broken.md `
       .wiki/concepts/docker-host-loopback-detect.md `
       .wiki/concepts/compose-bcrypt-escape-trap.md `
       .wiki/concepts/portainer-2.21-admin-password-regression.md `
       .wiki/concepts/db-tls-self-signed-via-traefik-raw-tcp.md `
       .wiki/concepts/rusonyx-vps-onboarding-quirks.md `
       .wiki/concepts/registry-gc-mount-and-modify-flag.md `
       .wiki/concepts/verdaccio-prune-semantics.md `
       .wiki/concepts/recovery-architecture-snapshot.md `
       .wiki/concepts/future-resilient-architecture-goals.md `
       .wiki/concepts/iis-migration-2026-05-19-postmortem.md `
       .tasks/vds-kzntsv-bootstrap.md .tasks/vds-gc-cron.md `
       .tasks/vds-backup-rsync-kreknin.md .tasks/vds-ntfy-push.md `
       .tasks/nas-recovery.md `
       .tasks/iis-on-host-migration.md .tasks/iis-traefik-dead-routes-cleanup.md

Manually edit .tasks/STATUS.md — оставить только CMS-domain блоки (cms-*, traefik-maljarka-502-bug, cms-maljarka-https-mode-bug-fix). Manually edit .wiki/index.md — удалить мигрированные entries из catalog.

Commit: migrate: drop infra content moved to OpeItcLoc03/admin (history preserved there via subtree split).

9. Breadcrumb: создать .wiki/concepts/migrated-infra-to-admin.md по шаблону в .wiki/concepts/admin-infra-project.md §9 (frontmatter + Migration table + "What stays here"). Также добавить запись в .wiki/index.md под Concepts.

Commit: wiki(concepts): add migrated-infra-to-admin breadcrumb.

10. Push: git push origin master.

Acceptance:

  • git log --oneline -3 в MoreThenCms показывает 2 cleanup-коммита поверх master
  • ls ~/projects/MoreThenCms/.wiki/entities/ пуст
  • ls ~/projects/MoreThenCms/.wiki/concepts/cms-*.md показывает 4-5 CMS файлов (включая webconfig-password-xml-escape)
  • Gitea web для MoreThenCms показывает обновлённую .wiki/concepts/migrated-infra-to-admin.md

Done — 🟢; unblock verify-migration. Blocker: admin-subtree-import-and-cleanup Branch: n/a


🔵 [verify-migration] — Шаг 11 миграции: end-to-end sanity check после migration push'ей. Подтвердить что projects-meta cache видит admin's tasks, knowledge_search находит migrated content, history preserved (git log --follow), и admin'ская архитектура целостная.

См. .wiki/concepts/admin-infra-project.md §Migration mechanics шаг 11.

Status: blocked Where I stopped: (not started) Next action: Sync cache:

node ~/projects/.common/lib/projects-meta-mcp/dist/sync.js

Validation matrix:

  1. mcp__projects-meta__tasks_aggregate project: "OpeItcLoc03/admin" — должен вернуть все live admin tasks ([admin-infra-project-pointers], impl-таски, [resilience-roadmap-design], [secrets-out-of-common], [secrets-manager-adopt], review-umbrella).
  2. mcp__projects-meta__tasks_aggregate project: "OpeItcLoc03/MoreThenCms"НЕ должна возвращать infra-таски (vds-, nas-recovery, iis-). Должна показывать только CMS-domain ([cms-maljarka-https-mode-bug-fix]).
  3. mcp__projects-meta__knowledge_search query: "WD40EFAX SMR cascade" domain: "all" — должен находить OpeItcLoc03/admin:.wiki/concepts/wd40efax-smr-cascade.md.
  4. mcp__projects-meta__knowledge_search query: "migrated infra admin" domain: "all" — должен находить MoreThenCms breadcrumb.
  5. cd ~/projects/.admin && git log --follow .wiki/concepts/wd40efax-smr-cascade.md — показывает MoreThenCms-era коммиты (proof history preserved).
  6. cd ~/projects/MoreThenCms && git log -p .wiki/concepts/wd40efax-smr-cascade.md — последний коммит = удаление (migrate: prefix).
  7. Открыть https://git.kzntsv.site/OpeItcLoc03/admin в браузере — wiki/tasks visible.

Findings, если есть, — отдельные follow-up tasks через mcp__projects-meta__tasks_create.

Done — 🟢 с close-note типа verified end-to-end: tasks+wiki visible in admin, MoreThenCms clean, history preserved. Blocker: morecms-cleanup-and-breadcrumb Branch: n/a


🔵 [resilience-roadmap-design] — Развернуть placeholder .wiki/concepts/future-resilient-architecture-goals.md (мигрирует из MoreThenCms в admin-subtree-import-and-cleanup) в полноценный fault-tolerance roadmap. Естественная отправная точка для глобальной цели пользователя: «создать отказоустойчивое решение, чтобы такие проблемы как 2026-05-18 не повторялись».

Это design task (не impl): продукт — обновлённая concepts/future-resilient-architecture-goals.md + потенциально цепочка impl-тасок-children. См. concepts/admin-infra-project.md §Initial admin agenda E.1.

Status: blocked Where I stopped: (not started) Next action: Прочитать pointers (через admin-infra-project-pointers). Затем:

  1. Inputs read: concepts/recovery-architecture-snapshot.md (текущее состояние request flow + SPOF list), concepts/future-resilient-architecture-goals.md (placeholder с rough goals), entities/* (что есть в стеке физически).

  2. Expand roadmap — заполнить:

    • RTO/RPO targets per service (client websites, gitea, verdaccio, registry, ntfy, traefik, DB park). Recovery Time Objective vs Recovery Point Objective отдельно по каждому. Сейчас effective RTO для NAS-loss был ~15 часов (15h до восстановления через recovery VM), RPO = 1 day (Hyper Backup daily). Какой target ставим?
    • 3-2-1 backup strategy — 3 копии, 2 разных media, 1 off-site. Сейчас: VDS-data → kreknin (1 off-site daily rsync ), но recovery-host data → ?, client sites content → ?, source code → gitea+kreknin-mirror?
    • Multi-host strategy — клиентский прод сейчас на recovery-host (single point of failure). Опции: secondary IIS host (cold/warm standby), full migration на VDS (cms-on-VDS option), bare-metal колокация. Trade-offs стоимости / сложности / RTO.
    • Monitoring stack — сейчас минимально: ntfy push при backup-completion, ручная проверка через ssh. Опции: Uptime Kuma / Prometheus+Grafana / Synology Active Insight / external (Pingdom/UptimeRobot). Цель — early-warning для cascading failures (типа SMR-deg которая привела к 2026-05-18).
    • Runbook coverage — какие incident-сценарии должны иметь runbook'и (NAS-loss, VDS-loss, client-site-down, traefik-crash, cert-expiry, DB-corruption, ransomware-recovery). Какие уже есть фактически (post-mortem chronologies в sources/), какие missing.
  3. Output structure:

    • concepts/future-resilient-architecture-goals.md — обновленный (живой документ, не frozen).
    • Если roadmap большой — child concepts (concepts/resilience-rto-rpo-targets.md, concepts/resilience-monitoring-stack.md, etc.) с link'ами из основного.
    • Impl-tasks для каждого road-map item — отдельные таски через tasks_create (например [setup-uptime-kuma], [secondary-iis-host-cold-standby], etc.).
  4. Constraints: roadmap не review автоматически — это living document. Acceptance: user (vitya) подтвердил план, есть concrete impl-tasks для top-3 priority items, документ committed.

Done — 🟢 с close-note: «roadmap expanded; N impl-tasks created for first wave». Blocker: admin-subtree-import-and-cleanup Branch: n/a


[secrets-out-of-common] — Этап 1 secret-management фикса: вынести ~/projects/.common/secrets/ в ~/.config/projects-secrets/ (вне git-tree). Не блокирует migration (независимый workstream).

Why это дыра:

  1. .common/ — git-tracked tree. Один неаккуратный git add . из wrong dir / отключение gitignore rule → leak в историю.
  2. Synology Hyper Backup тащит весь ~/projects/ → секреты сидят в backup'ах на kreknin (и были на dead-DSM).
  3. IDE indexing / LSP / Cursor / Copilot — .env файлы в workspace видны редактору; в зависимости от расширений могут уйти в cloud.
  4. Любой find ~/projects | xargs grep — даёт plain-text secrets.

Этап 1 — быстрый фикс, low-risk, обратимый. Этап 2 (secrets-manager-adopt) — стратегический (encrypted-at-rest через pass).

См. concepts/admin-infra-project.md §Initial admin agenda E.2.

Status: ready Where I stopped: (not started) Next action: 1. Audit: ls ~/projects/.common/secrets/ — какие файлы там лежат сейчас? Список ожидаемых из памяти:

  • interns.env — API keys для cheap LLM endpoints
  • gitea-token.txt — admin-scoped Gitea token (admin-scope per memory)
  • vds-kzntsv.env — VDS creds (ssh + DB + portainer + ntfy)
  • возможно другие

2. Audit потребителей:

  • ~/projects/.common/lib/interns-mcp/ — где читается interns.env? Grep по interns.env или dotenv calls.
  • ~/projects/.common/lib/projects-meta-mcp/ — где читается token? Часто это ~/.config/projects-mcp/auth.toml отдельно (см. setup-projects-meta skill); но возможны cross-refs.
  • ~/.claude.json mcpServers.* — где ENV/args ссылаются на .common/secrets/*?
  • ~/projects/.common/secrets/vds-kzntsv.env — кто его читает (scripts? local docs only?).

3. Migration:

mkdir -p ~/.config/projects-secrets
cp -r ~/projects/.common/secrets/* ~/.config/projects-secrets/
chmod 600 ~/.config/projects-secrets/*  # paranoid; Windows ACL отдельно

4. Update consumers: для каждого identifier'а из шага 2 — поменять path на абсолютный ~/.config/projects-secrets/<file> или принять env-override (рекомендуется env-override: легче тестировать на других машинах).

5. Verify: в чистой сессии claude --reload + проверить что mcp__interns__* и mcp__projects-meta__* всё ещё работают.

6. Cleanup .common/secrets/:

  • Удалить (rm -rf ~/projects/.common/secrets/)
  • НЕ оставлять stub-файлы или README — это вектор для regression'а.
  • Git: cd ~/projects/.common && git add -A && git commit -m "secrets: move out of common (now at ~/.config/projects-secrets/)" если .common git-tracked.

7. Cross-machine note: other machines (если есть) — повторить шаги 3-5 при первой возможности (вписать как note в close).

Acceptance: ls ~/projects/.common/secrets/ returns ENOENT, MCP servers still work, no .env references to .common/secrets/ в коде/configs.

Done — 🟢; unblock secrets-manager-adopt. Branch: n/a


🔵 [secrets-manager-adopt] — Этап 2 secret-management: внедрить pass (gpg-based password-store) — encrypted-at-rest secrets + cross-machine sync через private Gitea repo с encrypted blobs.

Альтернатива — Bitwarden CLI (cloud vault, audit log). Recommend pass для one-user setup — нет cloud-dependency, gpg native, encrypted git-syncable.

Why этап 2 нужен: после secrets-out-of-common (этап 1) секреты лежат plaintext в ~/.config/projects-secrets/. Этап 1 убирает риски 1+3 (git leak + IDE indexing), но не риск 4 (любой filesystem read даёт plaintext) и не риск 2 (Hyper Backup на kreknin всё ещё тащит plaintext если ~/.config/ в scope, что зависит от backup config). pass закрывает оба — secrets зашифрованы на диске, расшифровка только в RAM при pass show.

См. concepts/admin-infra-project.md §Initial admin agenda E.3.

Status: blocked Where I stopped: (not started) Next action: 1. Pre-install — gpg setup (Windows):

  • Install Gpg4win (https://www.gpg4win.org/) или через Scoop: scoop install gpg.
  • gpg --full-generate-key — выбрать RSA 4096, без expiration ИЛИ 2-year expiration с rotation reminder.
  • gpg --list-secret-keys — захватить fingerprint.

2. Install pass:

3. Initialize store:

pass init <gpg-fingerprint>
# Creates ~/.password-store/.gpg-id

4. Migrate secrets:

  • Для каждого file/var в ~/.config/projects-secrets/:
    • pass insert <category>/<name> → вводим plaintext, pass сохраняет как ~/.password-store/<category>/<name>.gpg
  • Примеры:
    • pass insert gitea/admin-token
    • pass insert vds-kzntsv/ssh-password
    • pass insert vds-kzntsv/portainer-password
    • pass insert interns/openai-key
    • pass insert interns/anthropic-key
  • Сохранить mapping (какой .env key какой pass-path) — concepts/secrets-pass-mapping.md ingest в admin wiki.

5. Update consumers — заменить direct file reads на shell-out calls:

  • interns-mcp config: вместо OPENAI_API_KEY=<plain> в env-файле → OPENAI_API_KEY=$(pass show interns/openai-key) в wrapper-скрипте startup.
  • ~/.claude.json mcpServers.* env: если поддерживает command-eval — pass show ...; иначе wrapper-script.
  • Альтернатива — pass-aware loader script ~/.config/projects-secrets/load.sh который populate'ит env vars из pass при session start.

6. Cross-machine sync: initialize private Gitea repo OpeItcLoc03/password-store-private (visibility=private), push ~/.password-store/. На каждой машине: clone + gpg --import master key + работает.

7. Cleanup plaintext: удалить ~/.config/projects-secrets/* (содержимое мигрировано в pass). Оставить пустой dir + README указывающий на pass.

8. Verify: в чистой сессии все MCP / scripts работают через pass-resolved secrets.

Acceptance: ls ~/.config/projects-secrets/ пуст или содержит только README, все consumers работают, pass git status clean, encrypted blobs в Gitea private repo.

Done — 🟢; secret-management dyra closed. Blocker: secrets-out-of-common Branch: n/a


🔵 [admin-infra-project-review] — Code-review checkpoint для брейнсторма admin-infra-project (промоушен 2026-05-21).

Спецификация: .wiki/concepts/admin-infra-project.md (ingested 2026-05-21). Pre-impl bootstrap: admin-infra-project-pointers — заполнил .wiki/CLAUDE.md Domain conventions design-context pointer'ами. Без неё review бы читал stub. Импл-таски (review против их acceptance criteria): morecms-subtree-split, admin-subtree-import-and-cleanup, morecms-cleanup-and-breadcrumb, verify-migration, resilience-roadmap-design, secrets-out-of-common, secrets-manager-adopt.

Кто делает: не имплементер. Следующая сессия в этом проекте (другая модель / другой день / другой агент) поднимает таску с чистым контекстом. «Я только что это написал» bias = главный риск.

Чек-лист ревью:

  • Прочитать спецификацию concepts/admin-infra-project.md (acceptance criteria каждой импл-таски).
  • git log --oneline shipped-коммитов в ~/projects/.admin/ и ~/projects/MoreThenCms/ (по migrate:/cleanup:/wiki:/tasks: префиксам в commit-message).
  • Для migration-цепочки:
    • git log --follow на парах файлов admin VS MoreThenCms — history preserved per-file?
    • Нет ли CMS-файлов в admin (cleanup сработал)?
    • Нет ли admin-файлов в MoreThenCms (cleanup сработал)?
    • cat MoreThenCms/.wiki/concepts/migrated-infra-to-admin.md — breadcrumb корректный, все listings соответствуют реальности?
  • Для verify-migration — повторно прогнать его validation matrix; нет ли регрессий после resilience/secrets работ?
  • Для resilience-roadmap-design — roadmap расширен по существу (RTO/RPO с цифрами, не «TBD»; concrete impl-tasks для top-3) ИЛИ остался stub-<TBD>-placeholder fake-completion'ом?
  • Для secrets-out-of-commonls ~/projects/.common/secrets/ точно пуст? Git history .common/ не содержит leak'нутых secrets в недавних коммитах?
  • Для secrets-manager-adoptpass show actually works для всех migrated entries? ~/.config/projects-secrets/ пуст или README-only?
  • Сверить дизайн-decisions из спецификации со shipped state. Любое отклонение от §Migration mechanics / §Initial admin agenda / §Identity — flag.
  • Findings — отдельные follow-up tasks (<topic>-<gap>-fix или подобное) через tasks_create.

Закрытие: только когда все findings зафайлены ИЛИ ревьюер подтвердил «нет findings» в close-note.

Status: blocked Where I stopped: (not started) Next action: Дождаться 🟢 у всех blocker-тасок (включая admin-infra-project-pointers — без него pointers в .wiki/CLAUDE.md не залиты, и review будет читать stub). Прочитать спецификацию (см. путь в description). Для каждой импл-таски: git show <commit>, прогнать acceptance criteria из её next_action, сверить с design-decisions в спецификации. Findings → новые follow-up tasks через mcp__projects-meta__tasks_create. Blocker: bootstrap: admin-infra-project-pointers; migration: morecms-subtree-split, admin-subtree-import-and-cleanup, morecms-cleanup-and-breadcrumb, verify-migration; agenda: resilience-roadmap-design, secrets-out-of-common, secrets-manager-adopt Branch: n/a