Přeskočit obsah

Audit repa 2026-06-10 — checklist remediace

Kompletní nálezy z pětioblastního auditu (HA YAML, dokumentace, Python/shell tooling, governance, bezpečnost). Pracovní checklist — po dokončení všech položek soubor smazat, trvalé závěry přesunout do decision_log.md.

Rozhodnutí uživatele (2026-06-10):

  • Sekrety v git historii → přepsat historii repa (git filter-repo), ne rotace hesel. Vědomě akceptované riziko: pokud repo někdy unikl/byl klonován, historie u třetí strany zůstává.
  • Loki není dostupné z WAN (ověřeno uživatelem) → nález downgradován na low.
  • Velux KLF200 je historický pozůstatek — vše řízeno přes Tahoma → KLF watchdog/recovery kompletně odstranit, ne opravovat.
  • Tlačítko WC bazén: prohozená je definice v apps.yaml (FoxtronRoomManager) → opravit apps.yaml podle buttons.yaml.
  • Sync pipeline HA: probrat do hloubky, případně předělat (sekce B1).

A. Bezpečnost

  • [x] A1 (P0) Historie přepsána (git filter-repo) a force-pushnuta: odstraněn heslo-fallback kamer, MQTT heslo Z2M (bonus nález z gitleaks; hodnoty zde záměrně neuvádím), docs/files/zalohy/ a zigbee2mqtt/configuration_backup_v4.yaml. Navíc smazány 4 opuštěné agent-branche na origin (claude/loving-bhabha, claude/nifty-yonath, codex/fix-import-error, jules/ha-structure-improvements), které ty secrety stále nesly. Ověřeno čerstvým klonem: gitleaks 0 reálných nálezů na celé historii, origin má jen master. Oba lokální klony (worktree + main) re-syncnuty, HA auto-sync po force-pushi ověřen (reset --hard na origin přežil). Zbylé gitleaks falsepozitivy (doc placeholdery, vendor BOOMR klíč) potlačeny v .gitleaks.toml.
  • [x] A2 (P0) Zálohy zařízení smazány z working tree (Proxmox cluster je zálohovaný, řekl uživatel); .gitignore vzory přidány (docs/files/zalohy/, *.unf, configurationData). Backup skripty (backup_unifi.py, backup_configs.py) přesměrovány do $HOMELAB_BACKUP_DIR (default ~/Backups/homelab) — už nikdy nezapisují do repa.
  • [x] A3 (P0) audit_hikvision.py + backup_doorbell.py smazány, nahrazeny konsolidovaným scripts/hikvision.py (subcommandy audit a backup --ip, fail-fast na chybějící HIKVISION_PASSWORD).
  • [x] A4 (P1) Pre-commit: přidán gitleaks v8.30.1.
  • [ ] A5 (P2) Switch SNMP community public → změnit na zařízeních (nezávisle na gitu).
  • [ ] A6 (low) Loki za nginx bez auth — není z WAN, ale zvážit auth_basic jako defense-in-depth (docs/files/docker/debian-services/nginx/conf.d/loki.conf).
  • [x] A7 (low) docs/chytry_dum/log_monitor.md:304 — Gemini key placeholder přepsat na jednoznačné AIza...<your-key>; ověřit, že žádný aktivní klíč nezačíná tím prefixem.
  • [x] A8 (P2) scripts/backup_configs.pyStrictHostKeyChecking=noaccept-new.

B. Sync pipeline HA (GitOps) — k rediskusi a předělání

  • [x] B1 Deep-dive diskuse proběhla 2026-06-10. Zjištění: automatizace „Restart After Success" je od 2026-03-11 vypnutá (důvod: nechtěné restarty — každý commit restartoval dům) → pipeline dnes jen deployuje+validuje, aplikace ruční. Rozhodnutí: pull model zůstává; safe_update nově klasifikuje změny do tří košů (no_action = docs/scripts/dashboards/appdaemon · reload = reloadovatelné YAML → homeassistant.reload_all · restart = configuration.yaml/modbus/climate → plný restart, povolen kdykoliv); opravený trigger (from: "running" + reset status na idle); alerting na failed_* a commit-mismatch >30 min; CI gate na GitHubu (B7). Po implementaci zapsat do decision_log.
  • [x] B2 automations.yaml:384 restart-smyčka: trigger to: "success" bez from: "running" + status soubor se neresetuje → fix dle výsledku B1.
  • [x] B3 shell_scripts/auto_sync.sh:16git fetch 2>/dev/null tiše zahazuje selhání → zapsat failed_fetch status + HA alert automatizace.
  • [x] B4 auto_sync.sh:18 — prázdný $REMOTE při selhání rev-parse; chybí set -u.
  • [x] B5 safe_update.shappdaemon/ změny zbytečně restartují HA Core (AD si reloadne sám); přidat do výjimek.
  • [x] B6 safe_update.sh — dvojité timestampy v logu; chybí set -o pipefail.
  • [x] B7 CI na GitHubu (gate před master = před pullem na živý dům): HA config check (docker, dummy secrets ze secrets.yaml.example), mkdocs build --strict, gitleaks, ruff, pytest appdaemon testů.
  • Pozn. (2026-06): lokální agent-side vrstva existuje — PostToolUse hook .claude/hooks/validate-yaml-edit.py zparsuje každý editovaný YAML hned při změně (per-file, ne celý repo). Chytá syntax slip dřív než commit; CI gate zůstává jako autoritativní kontrola před pushem na master a navíc pokrývá ruční edity mimo agenta.
  • [x] B8 (nový nález při nasazení) Automatizace „System - Git Auto-Sync" má historický entity_id automation.system_git_pull_restart_safe (alias přejmenován, registry drží staré ID). Sjednotit entity_id s aliasem; MEMORY.md uvádí staré ID správně, ale je to past pro hledání podle aliasu.

Stav B (2026-06-10): B2–B6 nasazeno a ověřeno živě — reload cesta end-to-end: commit → klasifikace reload → config check → reload_all bez restartu → status idle, nasazený commit sedí s GitHubem.

  • [x] B9 (regrese odhalená při nasazení A) .gitleaks.toml v rootu spadl do restart koše (nematchoval no_action ani reload) → zbytečný restart HA. Oprava: NO_ACTION_RE nově pokrývá všechny root dotfiles (^\.[^/]+$), takže budoucí tooling konfigy (.editorconfig, …) restart nevyvolají. Ověřeno klasifikační tabulkou.

C. Funkční chyby HA configu

  • [x] C1 Velux KLF200 — kompletně odstranit (historický pozůstatek, vše přes Tahoma): command_line sensor configuration.yaml:152, template sensor template.yaml:419, automatizaci velux_klf200_auto_recovery (automations.yaml:415, trigger na generický sensor.connection_state), recovery skript; zkontrolovat dashboardy a docs (velux.md — aktualizovat).
  • [x] C2 WC bazén tlačítko — opravit prohozené instance v appdaemon/apps/apps.yaml (bazen_wc_controller: upper/lower) podle buttons.yaml; ověřit check_buttons.py po opravě.
  • [x] C3 Kolize boost rekuperace × „Rekuperace wc" (automations.yaml:192 vs :620) — jeden vlastník switch.rekuperace_2 (např. input_boolean.rekuperace_boost + jediná vypínací automatizace), nebo zdokumentovat jako přijatý trade-off.
  • [x] C4 Smazat mrtvý appdaemon/apps/recuperation_manager.py (neregistrovaný duplikát boost logiky).
  • [x] C5 Smazat demo hello app (apps.yaml:1-3 + hello.py).
  • [x] C6 scenes.yaml:42,89 light.relax_lust_stred vs apps.yaml relax_lustr_stred — ověřit živou entitu, sjednotit.
  • [x] C7 Dashboardy button.carport_brana vs repo button.brana (template.yaml:266) — sjednotit YAML s registry realitou.
  • [x] C8 binary_sensor.dilna_sensor_1/2/3 (template.yaml:451) drží jen historická registry; modbus YAML (rele_dilna.yaml:55) říká jiná jména — sjednotit + čitelné entity_id.
  • [x] C9 zigbee2mqtt/configuration.yaml:11eol: /n"\n".
  • [x] C10 Propadlá dočasná závlaha trávníků (automations.yaml:147, „~14 dní od 2026-04-25") — smazat nebo vědomě prodloužit.
  • [x] C11 Doorbell description „2 minuty" vs kód 30 s (automations.yaml:450 vs :491).
  • [x] C12 modbus/rele_topeni.yaml:42 „Topení Aseko" — doplnit explicitní slave: 1.
  • [x] C13 modbus/rele_sklad.yaml:31unique_id: rele_dilna_switch_4 na zařízení ve skladu; minimálně komentář, případně vědomá migrace unique_id.
  • [x] C14 Orphan modbus kanály — komentáře „neosazeno" („Závlaha 4" rele_vzt.yaml:21, switch.rekuperace rele_topeni.yaml:5, „Zásuvka strop").
  • [x] C15 Mrtvé template entity (template.yaml): sensor.grid_net_dnes, sensor.evening_cutoff (nebo zapojit — žaluzie večer teď jedou na jiný trigger), atrea_*_control_type_text ×3; ftv_prebytek_* nechat (připravené pro spínání přebytků) ale zapsat do todos.
  • [x] C16 template.yaml:215 binary_sensor.ftv_prebytek_dostupny — odebrat device_class: power (sémantika).
  • [~] C17 configuration.yaml:81grid_import_dnes/grid_export_dnes utility_meter na surových Victron senzorech bez guardu (reset Cerba → skok) — delta_values/wrapper, nebo akceptovat.
  • [x] C18 template.yaml:439,446 — mmWave senzory přes raw IEEE entity_id → přejmenovat na friendly (presence_spiz, presence_technicka).
  • [x] C19 Klima skripty scripts.yaml:262-493 — 9 copy-paste skriptů → jeden parametrický klima_set s fields.
  • [x] C20 configuration.yaml:65,90 — zakomentované includy na neexistující soubory; smazat.
  • [~] C21 Dashboard zahrada — 38 neidentifikovaných Zigbee světel (zahrada.yaml:160-213) — dořešit identifikaci, zapsat do todos s termínem.
  • [x] C22 Velké zakomentované bloky v modbus/rele_*.yaml → nahradit jednořádkovým komentářem.
  • [x] C23 foxtron_scene_controller.py:39 — docstring artefakt.

D. Dokumentace

  • [ ] D1 (vysoká) Naplnit docs/navod_pro_rodinu/nouze.md, komfort.md, media.md (prázdné jádro mise repa; index na ně odkazuje).
  • [x] D2 (vysoká) Smazat/přesměrovat zastaralý docs/technologie_domu/zabezpeceni/kamery.md (lže o běžícím NVR); opravit mkdocs nav na infrastruktura/kamery.md; tam aktualizovat FW na V5.7.23.
  • [ ] D3 (vysoká) Nová stránka technologie_domu/zabezpeceni/zamky.md — presence-unlock + autolock chování (bezpečnostně relevantní, nikde nepopsané).
  • [x] D4 (vysoká) Naplnit chytry_dum/home_assistant/dashboardy.md (co který dashboard dělá, kde žije, jak se edituje).
  • [x] D5 chytry_dum/technologie/modbus.md — přegenerovat inventář podle modbus/*.yaml (chybí rele_sklad_2 40.62, Atrea 40.33; odstranit vyřešené otazníky; opravit waveshare 40.42 popis).
  • [x] D6 docs/chytry_dum/log_monitor.md — smazat vložený zastaralý zdroják, odkázat na scripts/log_monitor.py.
  • [x] D7 decision_log.md — opravit řazení (konec souboru vzestupně, 2026-06-01 na konci, 2026-03-10 duplicitně), doplnit --- u 2026-02-17.
  • [x] D8 todos.md — vyčistit: Grafana MCP 3× (hotovo), site/ (neexistuje), pfSense MCP ověření (hotovo), hotové položky v „Právě teď" (19 položek vs. limit 5).
  • [x] D9 Opravit rozbité interní odkazy: vpn.mdsit/firewall.md, firewall.md../vpn.md, switch_ports.md+wifi.md→neexistující unifi_generated.md, wallbox.md špatné hloubky, uklid.md špatné hloubky, jak_psat_dokumentaci.md příklady.
  • [x] D10 mkdocs.yml — odstranit mrtvý logging_media_design.md; doplnit do nav ~43 chybějících stránek (min. decision_log.md, velux, presence_senzory, vpn, kamery/*, debian_services, projekty); přesunout „Velux Mapping" do správné sekce.
  • [x] D11 Smazat documentation_proposal.md (root, superseded monitoringem) a rozhodnout o docs/documentation_proposal.md (BookStack návrh — zamítnout do decision_log + smazat, nebo označit).
  • [x] D12 appdaemon_media_room.md + appdaemon_transition_manager.md — označit „NÁVRH — neimplementováno".
  • [ ] D13 Chybějící sekce „co dělat když to selže": zavlaha.md, klimatizace.md (materiál v decision_log 2026-05-25), rekuperace.md, bazen_vzt.md, studna.md, wallbox.md, media.md, uklid.md, modbus.md, zigbee.md (vč. nezdokumentované zigbee_auto_restart_z2m).
  • [~] D14 (částečně: dali/tlacitka/fotovoltaika/mereni stuby + intercom redirect hotové; osobni/ prázdné nech) Prázdné placeholdery — rozhodnout: naplnit/smazat/redirect (dali.md, tlacitka.md, intercom.md → redirect na doorbell_gate, fotovoltaika.md+mereni.md → redirect na ftv.md, osobni/).
  • [x] D15 Zdokumentovat HACS závislost expander-card (klima dashboard) + Aseko volba do decision_log (nízká priorita).
  • [x] D16 Zdokumentovat backup_doorbell.py a modbus_probe.py.
  • [ ] D17 Žaluzie ranní/večerní automatika — zmínka pro rodinu (do komfort.md v rámci D1).

E. Python/shell tooling

  • [x] E1 Smazat mrtvé skripty: flatten_buttons.py, sync_foxtron_paired_switch_names.py, add_cmk_hosts.py, check_cmk_status.py, audit_hikvision.py (po A1/A3).
  • [x] E2 doc_gen_truenas.py:70,74,160 — odstranit CheckMK agent check + řádek v generovaném MD; přegenerovat truenas_generated.md.
  • [x] E3 Sjednotit .env loading: všude load_dotenv(Path(__file__).resolve().parent.parent / ".env"); smazat ruční parsery v ha_cli.py:29 a export_grafana_dashboards.py:25; odstranit absolutní macOS cesty (ha_cli.py:15).
  • [x] E4 UNIFI_HOST dva různé defaulty (20.5 v doc_gen_unifi.py:21 vs 20.6 v backup_unifi.py:13) — sjednotit dle reality po LXC→VM migraci.
  • [x] E5 Pre-commit: bump ruff 0.1.11 → aktuální; přidat yamllint (gitleaks viz A4).
  • [x] E6 pyproject.toml: smazat pypdf, přidat urllib3, types-boto3 → dev group; komentář k pydantic (jen pro lint button_manager).
  • [x] E7 scripts/_common.py: format_bytes (5 kopií → 1) + helpery load_env/backup_root/generated_header pro budoucí použití. Ověřeno: ruff čisté, import funguje.
  • [x] E8 log_monitor.py:147 — při selhání všech Loki queries poslat warning, ne tichý success; :266 rozbitý getattr(e, "read", ...) fallback.
  • [ ] E9 log_monitor.py deploy — přidat do deploy_debian_services.sh (nebo deploy_log_monitor.sh), ať repo a server nedriftují.
  • [x] E10 deploy_debian_services.shset -euo pipefail, zdokumentovat.
  • [x] E11 (nový, po A2) doc_gen_switches.py — vstupy přesměrovány na $HOMELAB_BACKUP_DIR/config_backups, ale očekává stará jména souborů (*_startup_config.cfg, mac_table_*, datovaný pfSense XML), zatímco backup_configs.py produkuje sw-rack-01.txt, pfsense.xml. Sjednotit naming + ověřit funkčnost celého řetězce backup → doc_gen.
  • [x] E12 (nový, po A3) scripts/hikvision.py — po nasazení ověřit audit i backup proti živým kamerám; zdokumentovat v docs/infrastruktura/kamery.md (nahrazuje D16 zmínku o backup_doorbell.py).

F. Governance / agent soubory

  • [x] F1 Workflows: CheckMK → Uptime Kuma (incident-response.md:36, monitoring-and-observability.md:36,92,102).
  • [x] F2 Loki UID: log-investigation.md říká loki, MEMORY.md P8E80F9AEF21F6940 — ověřit živý UID, sjednotit, držet jen v MEMORY.md.
  • [x] F3 log-investigation.md — zastaralé labely (app/hostname/level vs reálné component/unit/...) a „being fixed" pasáže; přepsat dle živého stavu.
  • [x] F4 safe-ha-change.md — doplnit sync model (commit→push→sensor.ha_config_commit) do Standard Change Order.
  • [x] F5 CLAUDE.md workflow tabulka — doplnit monitoring-and-observability.md; collaboration.md smazat (parafráze Collaboration Style).
  • [x] F6 Dedup CLAUDE.md ↔ MEMORY.md: CLAUDE.md = policy + odkaz, MEMORY.md = procedury/fakta; opravit drift („match HEAD" vs sensor.ha_github_commit).
  • [x] F7 CLAUDE.md — výjimka pro harness worktrees (read-only/session worktree OK, feature branche ne).
  • [x] F8 settings.local.json — odstranit neexistující tool z allowlistu, trvale povolený mutující SSH příkaz (apparmor 192.168.20.3), redundantní enabledMcpjsonServers.
  • [x] F9 Hook block-generated-edit.py — regex zjednodušit na _generated\.md$.
  • [x] F10 .gitignore — smazat mrtvý .windsurf/workflows.

G. CheckMK úklid v docs (živé instrukce na neexistující systém)

  • [x] G1 infrastruktura/sit/inventory.md:75 — odstranit CheckMK řádek; ověřit/uklidit nginx vhost monitor.marada.name + případný kontejner na debian-services + CMK_* v .env.
  • [x] G2 chytry_dum/home_assistant/architektura.md:36 — odstranit/nahradit Uptime Kuma.
  • [x] G3 infrastruktura/zalohy/strategie.md:49 — alerting na Storj Cloud Sync přepsat na reálný mechanismus (Uptime Kuma / TrueNAS e-mail) — požadavek je legitimní a teď nepokrytý → souvisí s H4.
  • [x] G4 jak_psat_dokumentaci.md:32,160 — odstranit CheckMK příklady + řádek check_cmk_status.py z tabulky.
  • [x] G5 infrastruktura/sit/wan.md:172 — TODO „SNMP do CheckMK" → přeformulovat nebo smazat.
  • [x] G6 infrastruktura/sit/wifi.md:80, infrastruktura/vpn.md:169 — aktualizovat zmínky.

H. Nové nástroje / systémová zlepšení

  • [x] H1 scripts/check_consistency.py — deterministický sken: rozbité doc odkazy, mkdocs nav vs. disk, entity_id reference vs. definice, CLAUDE.md tabulka vs. workflows; zapojit do pre-commit/CI.
  • [~] H2 (zamítnuto uživatelem 2026-06-11 — deny-list do settings.json nechce; MCP mutace zůstávají na permission promptech) MCP deny-list v .claude/settings.json — mutující tools (mcp__pfsense__delete_*|create_*|update_*|apply_*, mcp__truenas__system_reboot|delete_*|apply_update, mcp__unifi__delete_*|restore_backup|..., mcp__homeassistant__ha_config_set_*|ha_restart|ha_remove_*) — vynutit „MCP read-only" pravidlo technicky.
  • [x] H3 decision-capture skill — přidat krok: u rozhodnutí „nahrazujeme X za Y" grep repa na X + výpis k aktualizaci.
  • [ ] H4 Alerting: Storj Cloud Sync fail (osiřelo po CheckMK, viz G3) + GitOps pipeline fail (viz B3) — řešit stávajícím stackem (HA automatizace / Uptime Kuma push monitor).
  • [ ] H5 Měsíční drift-audit skill (pustí H1 + LLM průchod změn config vs. docs) — zvážit po H1.