# 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-` содержит коммиты только относящиеся к соответствующему dir'у. **Не push'ить** эти ветки — они служебные, нужны только для local subtree-add в admin. Done — пометить 🟢 + переходить к `admin-subtree-import-and-cleanup`. **Blocker:** admin-infra-project-pointers **Branch:** n/a --- ## 🔵 [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: ```powershell 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-следов:** ```powershell 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):** ```powershell 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:** ```bash 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 ---