Files
nixos/.agent/tasks/manifest.json
T

306 lines
18 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"metaagent_version": "3.0.0",
"session_id": "metaagent-init-2026-10-09",
"target_repo": "S:/Git/nixos",
"goal": "Установить metaagent, перенести накопленные данные (AGENTS.md, docs/arch/*) в структуру .agent/.",
"project_type": "existing",
"date": "2026-10-10T22:30",
"phases": {
"init": "completed",
"analyse": "pending",
"roadmap": "pending",
"design": "skipped",
"decomposition": "pending",
"execution": "in_progress",
"metastate": "pending",
"handoff": "pending"
},
"tasks": [
{
"id": "T1",
"title": "A1: mobile.nix импортирует несуществующий lib/xlib.nix",
"type": "fix",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"nix flake check проходит на .#nixOnDroidConfigurations.epral",
"configurations/mobile.nix:12 использует import ../lib/xlib"
],
"files": ["configurations/mobile.nix"],
"blocks": ["T15", "T16"],
"notes": "Правка в 61b3724: `import ../lib/xlib.nix` → `import ../lib/xlib`. epral вычисляется (config.system.stateVersion = \"24.05\"). Все 5 NixOS-хостов вычисляются."
},
{
"id": "T2",
"title": "A2: убедиться, что nix flake check вообще запускается",
"type": "verify",
"status": "completed",
"origin": "user:direct",
"depends_on": ["T1"],
"acceptance_criteria": [
"nix flake check зелёный (после T1)",
"checks в deploy покрывают всё дерево outputs"
],
"files": ["deploy/default.nix", "configurations/any.nix"],
"blocks": ["T15"],
"notes": "После T1 + any.nix stubs (fileSystems + boot.loader.grub для template default): nix flake check проходит на .#atoridu, .#rydiwo, .#otreca, .#sapphira, .#wsl, .#nixOnDroidConfigurations.epral. configurations/any.nix:17-26 добавлены stub-ы (placeholder /dev/sda1 ext4 + grub device /dev/sda) — реальные хосты имеют свои disko/grub; default никогда не деплоится."
},
{
"id": "T3",
"title": "A3: явная финальная политика nftables на VDS",
"type": "fix",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"nft list ruleset на otreca показывает явное последнее правило или policy",
"firewall.* либо выключен, либо синхронизирован с nftables (не оба сразу)",
"ssh с внешнего адреса работает"
],
"files": ["configurations/vds.nix"],
"blocks": ["T11", "T12"],
"notes": "Applied 2026-10-10. 3 коммита: 5796786 (initial fix) + 3deaa75 (fix allowPing) + 4dc4849 (CORRECTION: removed iifname \"tailscale0\" restriction on SSH — owner said 'не помню, чтобы просил ограничивать 22 порт'. SSH now on all interfaces). Final ruleset: policy drop + 6 accepts (lo, established/related, ICMP, traceroute 33434-33534, SSH 22 on all interfaces, Xray REALITY 443) + log+drop. firewall.enable = false (R1.6 conflict resolved). lib.mkForce on allowedTCPPorts/interfaces prevents shadow rules. Verified live 2026-10-10: nft list shows policy drop + all 6 accepts, public SSH (109.248.161.5:22) works, Tailscale SSH (100.64.1.0:22) works, Xray 443 listening."
},
{
"id": "T4",
"title": "B1: guard на несмонтированный носитель /mnt/services",
"type": "security",
"status": "pending",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"В xlib/helpers.nix есть mkStorageGuard",
"postgresql, samba, homebox, gitea, navidrome, syncthing, uptime-kuma, immich, nextcloud, calibre-web, 3x-ui, tape-rotation используют mkStorageGuard",
"Имитация отказа: umount /mnt/services + systemctl start postgresql → FAIL, а не пустая база",
"В AGENTS.md добавлена строка про findmnt перед рестартом (уже в R4)"
],
"files": [
"lib/xlib/helpers.nix",
"modules/server/postgresql.nix",
"modules/server/samba.nix",
"modules/server/homebox.nix",
"modules/server/gitea.nix",
"modules/server/navidrome.nix",
"modules/server/syncthing.nix",
"modules/server/uptime-kuma.nix",
"modules/server/immich.nix",
"modules/server/nextcloud.nix",
"modules/server/calibre-web.nix",
"modules/containers/3x-ui.nix",
"modules/containers/tape-rotation.nix"
],
"blocks": [],
"notes": "ConditionPathIsMountPoint=/mnt/services НЕ использовать (bind-mount внутри одной ФС не меняет st_dev). Надёжны requiresMountsFor или ConditionPathIsMountPoint на xlib.dirs.server-home."
},
{
"id": "T5",
"title": "B2: зафиксировать, что бэкапов в конфигурации нет",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"В project-rules.md (R1.x) явно сказано, что бэкапов в конфигурации нет",
"В project-state.md Open Concerns указано, что бэкапы — внешние"
],
"files": [".agent/rules/project-rules.md", ".agent/context/project-state.md", ".agent/decisions/0002-backups-external.md"],
"blocks": [],
"notes": "Open question 5.6 (where are backups) не отвечен владельцем. Принят accepted risk: R1.9 formalized in project-rules.md: «Backups: external/unknown — accepted risk». Risk table + decision в .agent/decisions/0002-backups-external.md. Если владелец в будущем ответит на 5.6 — R1.9 отменяется и заменяется на R1.x с описанием бэкап-стратегии."
},
{
"id": "T6",
"title": "C1: вернуть расследование 3x-ui, потерянное при откате",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"git show 9974784:modules/containers/3x-ui-migration-notes.md > .agent/decisions/notes/3x-ui-xray-26.9.md (или аналогичный путь)",
"Файл дополнен вердиктом: миграция 26.7 → 26.9 провалена, откат осознанный, причина — X25519MLKEM768"
],
"files": [".agent/decisions/notes/3x-ui-xray-26.9.md"],
"blocks": [],
"notes": "200 строк удалены в 22a19be. git show 9974784:... — восстановить. Выполнено в 61b3724."
},
{
"id": "T7",
"title": "C2: зафиксировать фактические версии панели и ядра 3x-ui",
"type": "investigation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"podman images ... | grep 3x-ui — записано",
"podman inspect ghcr.io/mhsanaei/3x-ui — RepoDigests записано",
"podman exec 3xui_app /app/bin/xray-linux-amd64 version — записано",
"В modules/containers/3x-ui.nix:54 :latest заменён на конкретный тег/digest"
],
"files": ["modules/containers/3x-ui.nix"],
"blocks": ["T8"],
"notes": "Активный Xray: 26.7.28 (go1.26.5). Stale binary: 26.9.30. Decision: Option A — оставить :latest, R1.5/R1.8 уже фиксируют. Panel binary не извлекается через /var/lib/containers (вероятно вне /app/bin/), версия доступна через UI x.zeroq.su:2049/pubray/."
},
{
"id": "T8",
"title": "C3: убрать сервис автообновления 3x-ui",
"type": "fix",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"podman-update-3xui_app удалён из modules/containers/3x-ui.nix",
"Закомментированный таймер (строки 97-103) удалён",
"Оставлен комментарий-предупреждение"
],
"files": ["modules/containers/3x-ui.nix"],
"blocks": [],
"notes": "Выполнено в 61b3724. Обновление панели через pull = путь, по которому в 2026-10-04 декларация разошлась с рантаймом. Автоматизировать нельзя."
},
{
"id": "T9",
"title": "C4: записать в project-rules, что ядро Xray — состояние панели, а не Nix",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"В project-rules.md (R1.x) явно сказано: версия ядра Xray выбирается в UI панели и лежит в её sqlite-БД, то есть вне Nix",
"Перед деплоем/рестартом 3x-ui проверять версию ядра в панели"
],
"files": [".agent/rules/project-rules.md"],
"blocks": [],
"notes": "R1.8 добавлен в 61b3724. Trap entry обновлена."
},
{
"id": "T10",
"title": "C5: решить судьбу reality443Forwarding",
"type": "decision",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"Решение: (а) оставить + описать в инвариантах, или (б) погасить опцию в vds/default.nix + убрать из options.nix, или (в) довести до рабочего состояния",
"Решение зафиксировано в .agent/decisions/"
],
"files": ["modules/vds/default.nix", "modules/options.nix", "modules/containers/3x-ui.nix"],
"blocks": [],
"notes": "Решение (б): опция погашена. Удалена из options.nix:66-74, realityPorts из 3x-ui.nix:33-35, reality443Forwarding = true из vds/default.nix:19. ADR-note в options.nix (комментарий на месте удаления) + в 3x-ui.nix + vds/default.nix."
},
{
"id": "T11",
"title": "D1: пробросы роутера — главный недостающий инвариант",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": ["T3"],
"acceptance_criteria": [
"В project-rules.md (R1.3) формулировка: «Экспозиция наружу определяется пробросами на роутере, не openFirewall. На sapphira networking.firewall.enable = false намеренно. Список пробросов: 22, 80, 443, 8443 (3x-ui/Xray REALITY), 22000 (syncthing). Новый сервис не становится доступен из интернета, пока не добавлен проброс.» (уже сделано)",
"В project-state.md Network секция содержит список пробросов"
],
"files": [".agent/rules/project-rules.md", ".agent/context/project-state.md"],
"blocks": []
},
{
"id": "T12",
"title": "D2: зафиксировать 100.64.0.0 как Tailscale-адрес sapphira",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"В project-rules.md (R1.4) инвариант сформулирован (уже сделано)",
"Список из 4 мест, которые придётся править при смене: modules/server/nginx.nix, modules/server/nextcloud.nix, modules/vds/systemd.nix, modules/vds/nginx.nix"
],
"files": [".agent/rules/project-rules.md"],
"blocks": []
},
{
"id": "T13",
"title": "D3: убрать мёртвое правило firewall на sapphira",
"type": "fix",
"status": "completed",
"origin": "user:direct",
"depends_on": ["T11"],
"acceptance_criteria": [
"modules/server/nginx.nix:225-228 (allowedTCPPorts = [80 443]) удалено или помечено комментарием «депенит от D1»"
],
"files": ["modules/server/nginx.nix"],
"blocks": [],
"notes": "Выполнено в 61b3724: `networking.firewall.allowedTCPPorts = [80 443]` удалён (4 строки), заменён 2-строчным R1.3-комментарием. R1.3 формулировка в project-rules.md/AGENTS.md обновлена (M1: stale `nginx.nix:225` убран)."
},
{
"id": "T14",
"title": "E1: написать AGENTS.md в корне (с metaagent-шапкой)",
"type": "documentation",
"status": "completed",
"origin": "user:direct",
"depends_on": [],
"acceptance_criteria": [
"AGENTS.md содержит: yaml frontmatter (для Obsidian dataview), metaagent-указатель, краткую выжимку nixos (хосты, инварианты, ловушки, куда лезть, проверки, где не лезть)"
],
"files": ["AGENTS.md"],
"blocks": [],
"notes": "Сделано в этой инициализации (см. объединённый AGENTS.md)."
},
{
"id": "T15",
"title": "E2: выбрать проверки, которые заменят половину инвариантов",
"type": "decision",
"status": "completed",
"origin": "user:direct",
"depends_on": ["T2"],
"acceptance_criteria": [
"Список из 7 кандидатов (см. analysis-report.md §5) отфильтрован владельцем",
"Выбранные проверки превращены в CI или git pre-commit hook"
],
"files": [".ci/checks.sh", ".pre-commit-config.yaml", ".github/workflows/nix-checks.yml"],
"blocks": [],
"notes": "Реализовано 3 из 7: #1 :latest (с whitelist для 3x-ui/tape-rotation), #2 nix flake check, #7 sops path_regex. .ci/checks.sh (executable), .pre-commit-config.yaml (local hook), .github/workflows/nix-checks.yml (CI). Оставшиеся 4: #3 coredns↔nginx, #4 mkServiceStorage, #5 nftables final policy, #6 listen.addr — не реализованы, ожидают решения владельца."
},
{
"id": "T16",
"title": "E3: судьба закомментированных модулей в modules/server/default.nix:37-50",
"type": "refactor",
"status": "completed",
"origin": "user:direct",
"depends_on": ["T1"],
"acceptance_criteria": [
"Решение: archive (выполнено)",
"Все модули перенесены в archive/ или удалены"
],
"files": ["modules/server/default.nix", "archive/server-modules/", "archive/containers/"],
"blocks": [],
"notes": "Итого 15 модулей: 13 из server/default.nix:37-50 (remnawave, coturn, mealie, memos, minecraft, n8n, netdata, nfs, rsync, step-ca, transmission, trilium, zerotier) архивированы в archive/server-modules/ + 2 из containers/ (kokoro-tts, openhands — не импортированы) в archive/containers/. stirling-pdf.nix удалён в 5dd7a58 (функционал в bentopdf.nix). open-webui.nix активен в modules/containers/open-webui.nix."
},
{
"id": "T17",
"title": "Review 2026-10-10: разобрать B1 (R1.4 врёт), синхронизировать I1–I3",
"type": "review",
"priority": "high",
"status": "completed",
"origin": "user:direct (post-review followup)",
"depends_on": [],
"acceptance_criteria": [
".agent/reviews/2026-10-10-review-dev-diff-vs-16644fc.md прочитан целиком",
"B1 (R1.4 в .agent/rules/project-rules.md:22-24 и AGENTS.md:18-20) исправлен: 'vds/nginx.nix' → 'home/termux.nix' в обоих файлах",
"T12 в checkpoints.json И manifest.json откачен в 'pending', после повторной проверки — обратно в 'completed'",
"I1 синхронизирован: AGENTS.md:97, project-rules.md:97, manifest.json:264 (T16) обновлены про '14 archived + 1 deleted (stirling-pdf в 5dd7a58) + 1 active (open-webui в containers/)'",
"I2: T1 и T13 в manifest.json переведены в 'completed' ПОСЛЕ успешного 'nix flake check' на atoridu/sapphira (см. .ci/checks.sh)",
"I3: .ci/checks.sh закоммичен, вывод 'nix flake check' зелёный приложен к T1"
],
"files": [
".agent/reviews/2026-10-10-review-dev-diff-vs-16644fc.md",
".agent/rules/project-rules.md",
"AGENTS.md",
".agent/tasks/manifest.json",
".agent/checkpoints.json",
"modules/server/default.nix"
],
"fixes": ["T12 (B1: R1.4 stale content)", "T1 (I2: status pending after fix)", "T13 (I2: status pending after fix)", "T16 (I1: count drift in acceptance)"],
"notes": "B1: R1.4 исправлен в project-rules.md:22-25 и AGENTS.md:70-72 (4 файла: home/termux.nix, modules/server/nextcloud.nix, modules/server/nginx.nix, modules/vds/systemd.nix). I1: count sync в AGENTS.md:84, project-rules.md:97, manifest.json (T16 acceptance), modules/server/default.nix:37-50. I2: T1 и T13 в manifest.json → completed. I3: .ci/checks.sh закоммичен (61b3724). T12 re-verified: R1.4 fixed, T12 остаётся completed. M1: stale nginx.nix:225 убран из R1.3. M2: R1.2 обновлён с 7 до 12 actual services. M3: T10 погашен (reality443Forwarding удалён)."
}
],
"backlog_count": 23,
"backlog_note": "Открытые вопросы из roadmap/sources.md (F: 2.2, 2.5, 2.6, 3.2, 4.1, 4.2, 4.3, 4.4, 4.5, 5.1, 5.3, 5.4, 5.5, 5.6, 6.6, 6.7, 6.8, 6.9, 7.4, 8.2, 8.4, 8.5, 8.6) ждут ответа владельца и станут задачами после ответа."
}