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/azigbee2mqtt/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á jenmaster. 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);
.gitignorevzory 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.pysmazány, nahrazeny konsolidovanýmscripts/hikvision.py(subcommandyauditabackup --ip, fail-fast na chybějícíHIKVISION_PASSWORD). - [x] A4 (P1) Pre-commit: přidán
gitleaksv8.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_basicjako 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.py—StrictHostKeyChecking=no→accept-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 naidle); alerting nafailed_*a commit-mismatch >30 min; CI gate na GitHubu (B7). Po implementaci zapsat do decision_log. - [x] B2
automations.yaml:384restart-smyčka: triggerto: "success"bezfrom: "running"+ status soubor se neresetuje → fix dle výsledku B1. - [x] B3
shell_scripts/auto_sync.sh:16—git fetch 2>/dev/nulltiše zahazuje selhání → zapsatfailed_fetchstatus + HA alert automatizace. - [x] B4
auto_sync.sh:18— prázdný$REMOTEpři selhání rev-parse; chybíset -u. - [x] B5
safe_update.sh—appdaemon/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.pyzparsuje 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.tomlv rootu spadl dorestartkoše (nematchovalno_actionanireload) → zbytečný restart HA. Oprava:NO_ACTION_REnově 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 sensortemplate.yaml:419, automatizacivelux_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) podlebuttons.yaml; ověřitcheck_buttons.pypo opravě. - [x] C3 Kolize boost rekuperace × „Rekuperace wc" (
automations.yaml:192vs:620) — jeden vlastníkswitch.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
helloapp (apps.yaml:1-3+hello.py). - [x] C6
scenes.yaml:42,89light.relax_lust_stredvsapps.yamlrelax_lustr_stred— ověřit živou entitu, sjednotit. - [x] C7 Dashboardy
button.carport_branavs repobutton.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:11—eol: /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:450vs:491). - [x] C12
modbus/rele_topeni.yaml:42„Topení Aseko" — doplnit explicitníslave: 1. - [x] C13
modbus/rele_sklad.yaml:31—unique_id: rele_dilna_switch_4na 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.rekuperacerele_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:215binary_sensor.ftv_prebytek_dostupny— odebratdevice_class: power(sémantika). - [~] C17
configuration.yaml:81—grid_import_dnes/grid_export_dnesutility_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_sets 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 nainfrastruktura/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ář podlemodbus/*.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 nascripts/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.md→sit/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.mdpří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 odocs/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.pyamodbus_probe.py. - [ ] D17 Žaluzie ranní/večerní automatika — zmínka pro rodinu (do
komfort.mdv 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řegenerovattruenas_generated.md. - [x] E3 Sjednotit
.envloading: všudeload_dotenv(Path(__file__).resolve().parent.parent / ".env"); smazat ruční parsery vha_cli.py:29aexport_grafana_dashboards.py:25; odstranit absolutní macOS cesty (ha_cli.py:15). - [x] E4
UNIFI_HOSTdva různé defaulty (20.5 vdoc_gen_unifi.py:21vs 20.6 vbackup_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: smazatpypdf, přidaturllib3,types-boto3→ dev group; komentář kpydantic(jen pro lint button_manager). - [x] E7
scripts/_common.py:format_bytes(5 kopií → 1) + helperyload_env/backup_root/generated_headerpro 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;:266rozbitýgetattr(e, "read", ...)fallback. - [ ] E9
log_monitor.pydeploy — přidat dodeploy_debian_services.sh(nebodeploy_log_monitor.sh), ať repo a server nedriftují. - [x] E10
deploy_debian_services.sh—set -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ímcobackup_configs.pyprodukujesw-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ěřitauditibackupproti živým kamerám; zdokumentovat vdocs/infrastruktura/kamery.md(nahrazuje D16 zmínku obackup_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.mdP8E80F9AEF21F6940— ověřit živý UID, sjednotit, držet jen v MEMORY.md. - [x] F3
log-investigation.md— zastaralé labely (app/hostname/levelvs 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.mdsmazat (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 vhostmonitor.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 + řádekcheck_cmk_status.pyz 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-captureskill — 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.