# CyberBrain26 — znalostní databázi: chyby, vzorce, rozhodnutí

**Vznik:** 2026-10-02, z auditu `docs/product/STATE_REPORT_V7.md` (testovaný Python prototyp, nikoli produkčně připravený ani certifikovaný systém).
**Čtenář:** agent, který začíná práci v tomto repozitáři. **Čti §1 dřív, než cokoli měníš.**

## Úvod

Tento soubor není roadmapou ani specifikací. Je to **seznam opakovaných způsobů, jak tento repozitář podává falešné informace**, plus záznam rozhodnutí vlastníka s jejich důsledky. Vznikl proto, že audit našel osm vzorců, které se opakují napříč `.kilo/agent/*.md`, `.kilo/kilo.jsonc`, `tests/test_kilo_agent_policy.py`, `ROADMAP_V7.md` a stavovými dokumenty. Každý z nich je potvrzený důkazem, ne domněnka.

**Značky v tomto souboru:**

| Značka | Význam |
|---|---|
| `[OVĚŘENO]` | důkaz `file:line` v tomto repu, nebo výstup příkazu zaznamenaný v `docs/product/STATE_REPORT_V7.md` |
| `[VÝZKUM]` | veřejný zdroj s URL a datem |
| `[NÁVRH]` | navržené, neschválené řešení |
| `[HYPOTÉZA]` | nedomyšleno; bez artefaktu |
| `[SIMULOVANÉ]` | výstup generátoru, ne reálný rozhovor |

**Pravidlo čtení:** tvrzení bez odkazu není fact. Pokud na sebe narazíš na `[OVĚŘENO]` bez uložitelného artefaktu, považuj ho za `[HYPOTÉZA]` — to je přesně vzorec V3.

**Snapshot:** stav pracovního stromu se mění (paralelně běží implementátor na `tests/test_kilo_agent_policy.py`). Řádky v tomto testovacím souboru se proto posouvají; vždy ověřuj `file:line` před citací.

**F11 (tržní validace) zůstává `OPEN`** (`ROADMAP_V6.md:791`, `:867`; `docs/product/STATE_REPORT_V7.md:80-97`). 0 reálných rozhovorů, 250 fiktivních. F11 neblokuje F1–F10, ale blokuje každé cenové, packagingové a investiční tvrzení. Tento dokument nepředkládá žádné tržní tvrzení.

---

## 1. Vzorce chyb, které se opakují

### V1. Neparseovatelný frontmatter zhasne celý soubor

**Co se stalo.** `.kilo/agent/tester.md:2` měl `description:` bez uvozovek a s `: ` uvnitř hodnoty. `yaml.safe_load` na tom vyhodil `ScannerError`, takže se nerozparsovalo nic — zahodily se `mode` i celý blok `permission`. `tester` tak vůbec nemusel `bash: allow`; pravidla se nikdy neuplatnila.

**Jak se to poznalo.** 22 z 24 selhání Gate 0 mělo jednu příčinu; ostatních 10 frontmatterů se parsovalo bez potíží `[OVĚŘENO]` `docs/product/STATE_REPORT_V7.md:23`. Dnes je `.kilo/agent/tester.md:2` opravený (řádek je citovaný) `[OVĚŘENO]` — chyba sama o sobě je minulá, její možnost zůstává.

**Prevence.**
1. Helper, který čte kolekci konfigurací, musí chybu izolovat: obalit `yaml.safe_load` do `try/except yaml.YAMLError` a volat `pytest.fail("{}: frontmatter se neparsuje".format(path.name))` — nepropusit traceback z `yaml`.
2. V `.kilo/agent/*.md` se nesmí `: ` objevit v necitované hodnotě: buď citovat celou `description` (viz `tester.md:2`), nebo se dvojtečce vyhnout.
3. Přidat kontrolu, která to chytí dřív než pytest (lint frontmatteru v `.github/workflows/ci.yml`), protože bod 1 je stále neimplementovaný — dnes volá `yaml.safe_load` bez `try` na dvou místech.

**Které soubory to umožnily.** `.kilo/agent/tester.md:2`; `tests/test_kilo_agent_policy.py:105-124` (helper `_load_agent`, `yaml.safe_load` uzavřen v `try/except yaml.YAMLError` s `pytest.fail` na `:117-122`); `tests/test_kilo_agent_policy.py:255-282` (`test_every_agent_has_parsable_yaml_frontmatter`, `yaml.safe_load` uzavřen v `try/except` s `pytest.fail` na `:279-282`). **[OVĚŘENO 2026-10-21]** — preventivní body 1 a 3 implementovány.

### V2. Wildcard zruší test, který se pak tváří, že běží

**Co se stalo.** D14 nahradil 8jmenný allowlist delegace wildcardem `task: {"*": "allow"}`. Testy, které ověřují allowlist, teď berou `["*"]`, hledají soubor `*.md`, žádný nenajdou — iterace se neprovede ani jednou a test projde. Necykluje se, jen tiše neplatí.

**Jak se to poznalo.** `test_allowlisted_agents_that_exist_are_subagents` má jediný assert `assert allowlist` — wildcard mu vyhovuje, takže ta kontrola je zelená bez jediného ověřeného agenta. `test_allowlist_agents_pending_f4` je navíc záměrně nefailující informační test, takže jako „prošel" vypadá v reportu, ale nic neprokazuje. Navíc `F4_EXPECTED_PENDING` nezná `pricing-researcher`, jehož `.md` v repu existuje.

**Prevence.** Test, který má ověřovat kolekci, musí **selhat**, když je kolekce prázdná nebo je v ní wildcard:

```python
assert allowlist and "*" not in allowlist, (
    "wildcard není allowlist — test by nic netestoval (allowlist={!r})".format(allowlist))
```

Stejné pravidlo platí pro každý další test, který čte kolekci z konfigurace, ne jen pro tyto dva — **ukotvit jako vzorec do testů, ne opravit jako jednu chybu**. Nechť je wildcard záměrný, musí být deklarovaný jako výjimka s odkazem na rozhodnutí, ne jako tichý průchod. Informativní test, který zůstane nefailující, nesmí být v reportu citován jako průchod brány.

**Které soubory to umožnily.** `.kilo/agent/orchestrator.md:9-10`; původní allowlist `.kilo/agent/orchestrator.md.bak-pre-v7b:9-18` (8 jmen, gitignorovaný vzorem `*.bak-*`); `tests/test_kilo_agent_policy.py:611-631`; `tests/test_kilo_agent_policy.py:634-654`; `tests/test_kilo_agent_policy.py:34-42` `[OVĚŘENO]`. Dnes je wildcard stále zapsaný — vzorec je živý, ne historický `[OVĚŘENO]` `.kilo/agent/orchestrator.md:9-10`.

### V3. Označení `[OVĚŘENO]` bez artefaktu

**Co se stalo.** `.kilo/kilo.jsonc:11-16` tvrdí „frontmatter se přiřadí jen tehdy, když `agent.<jméno>` ještě neexistuje; JSON vyhrává a frontmatter se tiše zahazuje" — a nese značku `[OVĚŘENO]`. Z repa to nelze ověřit: žádný výstup `kilo debug agent` / `kilo debug config` není v repu uložený.

**Jak se to poznalo.** Proti-tvrzení je ve dvou místech, obě s jinou (opačnou) prioritou: `ROADMAP_V6.md:628` uvádí, že project `.kilo/agent/*.md` má **nejvyšší** precedenci; `ROADMAP_V6.md:766` říká, že **frontmatter má přednost**. Tvrzení má druhořadý zdroj (`ROADMAP_V6.md:966` tvrdí, že `kilo debug agent orchestrator` byl spuštěn), ale uložený výstup chybí — zdrojový dokument je doklad, ne artefakt `[OVĚŘENO]`. Tři místa v repu opakují stejný nepodložený komentář: `.kilo/kilo.jsonc:11-16`, `tests/test_kilo_agent_policy.py:234-241`, `tests/test_kilo_agent_policy.py:269-278` (a ve variantě `:248-251` a `:261-262`).

**Prevence.** Značka `[OVĚŘENO]` smí být jen u tvrzení s uloženým důkazem — výstup příkazu v repu, nebo `file:line`, kde to tvrzení přímo plyne z kódu. Jinak `[HYPOTÉZA]`. U tvrzení o chování runtime Kilo je minimálním artefaktem uložený výstup `kilo debug config` v repu s datumem a přesným příkazem. Duplicitní kopie téhož tvrzení ve třech souborech jsou tři příležitosti k chybě najednou, ne tři nezávislé potvrzení.

**Které soubory to umožnily.** `.kilo/kilo.jsonc:11-16`; `tests/test_kilo_agent_policy.py:234-241`, `:248-251`, `:261-262`, `:269-278`; `ROADMAP_V6.md:628`, `:766`, `:966`.

### V4. Stará čísla v dokumentech jako zdroj lži

**Co se stalo.** Rep obsahuje šest různých tvrzení o tom, kolik testů prochází a kolik selhává. Navzájem si odporují a ani jedno nebylo re-verifikovatelné — každé pochází z jiného okamžiku jiného pracovního stromu.

**Jak se to poznalo.** `docs/SECURITY_ONE_PAGER.md:222` uvádí 413 passed, `:227` 360/9; `PROJECT_STATUS.md:45` 369 passed, `:51` 360/9; `docs/presentations/CYBERBRAIN26_VYVOJ_STAV_2026-10-02.md:29` 291 testů a `:32` „290 prošlo, 1 selhal"; `ROADMAP_V7.md:78` „24 failed, 27 passed". Všechny `[OVĚŘENO]` jako citace; žádná re-verifikace neproběhla kromě Gate 0 `[OVĚŘENO]` `docs/product/STATE_REPORT_V7.md:59`.

**Prevence.** K testovacímu číslu patří **datum + přesný příkaz + počítaná kolekce testů** (např. `PYTHONPATH=src python3 -m pytest -q`, 2026-10-02). Bez toho se číslo necituje. Pokud se pracovní strom měnil, číslo se buď přepočítá, nebo se v dokumentu nechá jako historické s výslovnou poznámkou, že k okamžiku platnosti nebylo re-verifikováno. Prodejní ani bezpečnostní závěr nesmí stát na přeneseném čísle.

**Které soubory to umožnily.** `docs/SECURITY_ONE_PAGER.md:218-227`; `PROJECT_STATUS.md:43-55`; `docs/presentations/CYBERBRAIN26_VYVOJ_STAV_2026-10-02.md:27-34`; `ROADMAP_V7.md:52-58`, `:78`.

### V5. `git log` není jediný zdroj historie

**Co se stalo.** `ROADMAP_V7.md:58` prohlásil commit `b8c71d2` za neexistující. Existuje a je přímým rodičem HEAD.

**Jak se to poznalo.** Záznam v `.git/logs/HEAD:3-4` — `0534e06 → b8c71d2`, `b8c71d2 → 90a42e6` `[OVĚŘENO]`. Důkaz ležel v reflogu, ne ve výstupu `git log`, který byl v tu chvíli nedostupný nebo neproběhl.

**Prevence.** Než prohlásíme objekt za neexistující, projít **tři** zdroje, ne jeden: `git log --all`, `.git/refs/`, `.git/logs/HEAD` a `.git/worktrees/` (linkované worktree mají vlastní HEAD a jejich `.git` je soubor, ne adresář). Tvrzení „neexistuje" je závěr, ne výchozí předpoklad — patří k němu výčet míst, kde bylo hledáno.

**Které soubory to umožnily.** `ROADMAP_V7.md:53`, `:58`; důkaz `.git/logs/HEAD:3-4`; chybný výrok zachycený v `docs/product/STATE_REPORT_V7.md:13`.

### V6. Grep jako důkaz neexistence minul skutečnou ochranu

**Co se stalo.** Tvrzení „šifrování v klidu neexistuje" bylo doloženo grepem `encrypt|cipher|AES` = 0 výskytů. Grep minul ochranu, která je ve zdroji a stejně důležitá: API klíče se neukládají v čitelné podobě, ale v SHA-256 digestu, a porovnávají se přes `hmac.compare_digest`.

**Jak se to poznalo.** `src/cyberbrain26/control_plane/api/__init__.py:419` (`hashlib.sha256(...).digest()`), `:428` (digest vypočtený z příchozí klíče), `:431` (`hmac.compare_digest`) — ochrana proti timing side-channelu i proti úniku klíče přes log nebo core dump, popsaná v docstringu `:399-403` `[OVĚŘENO]`. Verdikt o šifrování v klidu správně zůstává záporný, důkaz jen nebyl úplný.

**Prevence.** Závěr „neexistuje" vyžaduje **dva kroky**: (a) kladný grep na funkci, kterou by implementace musela obsahovat (např. `encrypt|cipher|AES|Fernet|keyring` pro šifrování v klidu), a (b) u každého kladného nálezu v sousední oblasti popis, **proč to není to ono**. Formulace „funkčně ekvivalentní ochrana zde není" je nepřípustná bez doložení — a je-li nález co se týče bezpečnosti jiný, nesmí se v dokumentu přehlédnout.

**Které soubory to umožnily.** `ROADMAP_V7.md:199-201` (důkaz grepem); `.kilo/context/decisions/DECISIONS_V7.md:63`; skutečná ochrana `src/cyberbrain26/control_plane/api/__init__.py:419`, `:431`.

### V7. Stručné tvrzení, které je silnější, než jeho důkaz

**Co se stalo.** `ROADMAP_V7.md:199` popisuje audit jako „in-memory list". Je to list **plus** zápis do SQLite **plus** mazání. Čtenář tabulky dojde k závěru, že audit je vlastně něco neškodného a dočasného.

**Jak se to poznalo.** `src/cyberbrain26/security_plane/audit/__init__.py:169-203` provádí `INSERT INTO audit_events` v transakci; `:204` appenduje do `self._events`; `clear()` na `:264-269` dělá `DELETE FROM audit_events`; `prune_expired()` na `:271-277` maže staré řádky. Docstring `:104-107` tvrdí „append-only, cannot be modified or deleted" — kód to vyvrací `[OVĚŘENO]`. Audit je čitelný a přepisovatelný na úrovni SQL; testy odolnosti proti manipulaci neexistují.

**Prevence.** Tvrzení o architektuře musí být **tak široké, jak je implementace**, jinak čtenář dojde k nepravdivému závěru. Když implementace obsahuje funkci, která tvrzení vyvrací, je tvrzení chyba, dokud se neopraví text nebo kód. Docstring, který popisuje vlastnost nedeklarovanou kódem, je bezpečnostní závada, ne kosmetika.

**Které soubory to umožnily.** `ROADMAP_V7.md:199`; `src/cyberbrain26/security_plane/audit/__init__.py:104-107`, `:169-203`, `:264-269`; `.kilo/context/decisions/DECISIONS_V7.md:62`.

### V8. Jmenovaná brána, která nikdy nespustila

**Co se stalo.** `semgrep` je uveden jako jedna z deterministických bran (i v `description` agenta `tester`), ale v prostředí ani v CI neexistuje a v repu není žádný semgrep config. Jmenovaná bráň bez kroku v CI neexistuje.

**Jak se to poznalo.** `semgrep` nenalezen v `.github/workflows/ci.yml` (3 joby: `quality`, `no-bubblewrap-fail-closed`, `dependency-audit`); v repu není žádný soubor configu `[OVĚŘENO]`; `bandit` běží jen jako ruff `S` pravidla; `.pre-commit-config.yaml` existuje, ale CI ho nespouští `[OVĚŘENO]` `docs/product/STATE_REPORT_V7.md:35`. CI navíc nikdy neběželo — v `.git/config` není sekce `[remote]`, takže není co citovat jako výsledek buildu `[OVĚŘENO]` tamtéž `:14`.

**Prevence.** Každá jmenovaná brána musí mít krok v `.github/workflows/ci.yml`, nebo se nesmí jmenovat ani v `description` agenta. Vedlejší pravidlo: job, který je `continue-on-error: true` (jako `dependency-audit`), je **advisory** — nikdy se nepopisuje jako blokátor, protože build nezvede. Brána, která se nikdy nepozorovala zelená, se v dokumentaci píše jako definice, ne jako výsledek.

**Které soubory to umožnily.** `.kilo/agent/tester.md:2`, `:18`; `.github/workflows/ci.yml`; `docs/product/STATE_REPORT_V7.md:14`, `:31-35`; `.kilo/context/decisions/DECISIONS_V7.md:61`.

---

## 2. Rozhodnutí vlastníka (co se rozhodlo, proč a s jakými důsledky)

Všechna rozhodnutí jsou z 2026-10-02. Zdrojové texty: `.kilo/context/decisions/DECISIONS_V7.md`, `docs/product/STATE_REPORT_V7.md:80-97` (OPEN). **Sloupce „stav v repu" a „důsledek" jsou stav pracovního stromu k 2026-10-02, ne potvrzení, že změna proběhla.**

| Datum | Rozhodnutí | Soubor | Důsledek | Kdo dotčen |
|---|---|---|---|---|
| 2026-10-02 | `tester.md:2` opraveno uvozovkami | `.kilo/agent/tester.md:2` | Frontmatter se konečně načítá a `bash: allow` se **poprvé uplatní** — testy běží na hostiteli mimo `BubblewrapExecutionProvider`. Vědomý souhlas; je to stejná třída rizika jako D14. | `tester`, orchestrátor, každý běh Gate 0/1/2 |
| 2026-10-02 | `test_primary_agents_cannot_edit` dostal výjimku `PRIMARY_EDIT_ALLOW_EXCEPTIONS = {"orchestrator"}` | `tests/test_kilo_agent_policy.py:515`, `:518-534` | D14 vyhrál nad D6. Princip: **výjimka navázaná na funkci** (jediný delegátor), ne na `mode` — jinak by propustila i každého budoucího primary agenta. | `orchestrator`, autoři testů |
| 2026-10-02 | `test_default_agent` zobecněn na `test_default_agent_is_a_declared_primary_agent` | `tests/test_kilo_agent_policy.py:558-569` | D11 (`default_agent: "promptmaster"`, `.kilo/kilo.jsonc:9`) je respektováno; test už nevybírá konkrétní jméno, ale kryje invariant `mode == "primary"`. Lépe než výjimka — invariant místo jména. | `promptmaster`, autoři testů |
| 2026-10-02 | D13 doplněn: mapa `agent` v `.kilo/kilo.jsonc` 3 → 11 položek | `.kilo/kilo.jsonc:17-62` | Každý `.md` agent má položku s `mode: subagent` identickým s frontmatterem. **Vyžaduje reload Kilo session** — jinak běží stará konfigurace. | všichni agenti, kdo spouští session |
| 2026-10-02 | `implementer.md:7` `bash: allow` → `bash: "deny"` (D3) | `.kilo/agent/implementer.md:5-13` | Implementátor nespouští testy sám. **Důsledek: testy spouští orchestrátor** (D14 výjimka `bash: allow`), takže kód běží na hostiteli mimo sandbox — tato výjimka nyní nese veškerou exekuci. Dnes je řádek 7 stále `"bash": allow`. | `implementer`, `orchestrator` |
| 2026-10-02 | Výjimky D14 uznány i pro `agent_manager` a wildcard `task` | `tests/test_kilo_agent_policy.py:515`, `:634-654`; `.kilo/kilo.jsonc:64-84` | Globální `bash: deny` zůstává podlahou, agenti ji nesmí podkopat. **Neznamená to, že wildcard testy chrání** — viz V2, ta ochrana je stále no-op. | všichni agenti |
| 2026-10-03 | `orchestrator.md` text sjednocen s D14 + delegační matice 10 subagentů + workflow + report vlastníkovi | `.kilo/agent/orchestrator.md` | Frontmatter a tělo už si neodporují. Orchestrátor teď ví, kdy kterého subagenta použít, v jakém pořadí a v jakém formátu hlásí. | `orchestrator`, všech 10 subagentů |
| 2026-10-03 | 7 tenkých agentních playbooků rozšířeno na konkrétní role | `.kilo/agent/{code-reviewer,deep-research,implementer,pricing-researcher,security-auditor,threat-modeler,verifier}.md` | Z generického boilerplateu na role s postupem, výstupním formátem a hranicemi. Frontmatter beze změny. | těchto 7 agentů |
| 2026-10-03 | `AGENTS.md` doplněn o sekci „Agent orchestration" | `AGENTS.md` | Každá session dostane pravidla delegace a formát reportu bez čtení `.kilo/agent/orchestrator.md`. | všichni agenti |

**Co z těchto rozhodnutí nebylo provedeno** (stav k 2026-10-02, `[OVĚŘENO]`):

1. Prevence V1 — helper bez `try/except` je na místě dál (`tests/test_kilo_agent_policy.py:114`, `:207`).
2. Prevence V2 — wildcard je v `orchestrator.md:9-10` dál a oba testy ho berou jako prázdnou allowlist.
3. `implementer.md:7` ještě neprovedeno (viz tabulka).
4. ~~Konflikt `orchestrator.md`~~ **[VYŘEŠENO 2026-10-03]** — na výslovný pokyn vlastníka opraven text v `.kilo/agent/orchestrator.md`: řádky tvrdící `bash: deny` a `edit: deny` nahradeny D14 (`bash: allow`, `edit: allow`), doplněna delegační matice 10 subagentů, workflow a report vlastníkovi. Záznam v `.kilo/context/decisions/DECISIONS_V7.md` § D14b.
5. **[VYŘEŠENO 2026-10-03] Červená Gate 1:** `tests/test_kilo_agent_policy.py::test_mcp_server_explicitly_disabled` padal, protože `.kilo/kilo.jsonc` měl `"cyberbrain26": { "enabled": true }`, zatímco `src/cyberbrain26/mcp/` neexistuje. Test vyžaduje `{"enabled": false}` (fail-closed). Vlastník na výslovný pokyn schválil přepnutí na `false`; `src/cyberbrain26/mcp/` stále neexistuje, takže stav je fail-closed a není co rozšiřovat.
6. **[NOVÉ 2026-10-03] V16 — výstup `tester` bez `file:line` a bez výstupu příkazu je nevyužitelný.** Tři běhy `tester` na stejném stavu se rozcházely:
   - běh 1: `591 passed, 1 failed` (před opravou, správně),
   - běh 2 (Gate 2): tvrdil, že všechny agenty mají `mode='primary'`, přesto `deep-research`/`code-reviewer`/`tester` mají `mode: subagent`; seznam agentů byl v něm zduplikovaný; tvrdil neúspěch MCP testu, který už byl opravený,
   - běh 3 (Gate 3): místo výstupu vrátil `TIMEOUT` u všech příkazů včetně triviálního `git diff`, přesto `git diff --stat` v témže reportu uvedl reálné hodnoty; a uváděl `yaml.safe_load` na celých `.md`, což by s frontmatterem v souboru vyhodilo chybu.
   **Důsledek:** brána je zelená jen tehdy, když je výsledek **naměřený a zopakovaný**. Orchestrátor má `bash: allow` (D14), takže si testy může a má spustit sám; výstup testera bez důkazu je [HYPOTÉZA].
   Gate 2 v této změně [OVĚŘENO] vlastním během: `python3 -m pytest -q tests/test_kilo_agent_policy.py` → 54 passed (0.31 s); `python3 -m pytest -q` → **591 passed in 10.23 s**; `compileall -q src` → exit 0.

---

## 3. Open lekce (co se naučilo, ale nevyřešilo)

Podrobný seznam 16 bodů je v `docs/product/STATE_REPORT_V7.md:80-97`. Zkráceně, co zůstalo otevřené po tomto auditu:

1. **`switch_space.py:130`** — `subprocess.run` s libovolným `argparse.REMAINDER` z `--child`: třetí exekuční cesta, mimo `AuthorizedExecutionService` i mimo D14, bez testu. Odstranit, nebo zaznamenat jako výslovnou výjimku?
2. **`ptah_bridge.py:153`** — přijímá libovolný objekt vyhovující `ExecutionProvider` protokolu; implementace bez sandboxu by prošla gateway. Vynutit sealed množinu providerů, nebo zdokumentat jako vědomou mezeru?
3. **`test_primary_agents_cannot_edit`** — vyřešeno výjimkou (viz §2), ale zůstává otázka, zda je `edit: allow` u primary agenta vůbec přijatelné, nebo jen u delegátora.
4. **Wildcard `task` vs 8jmenný allowlist** — nebylo rozhodnuto, zda se obnoví allowlist, nebo se přepíší testy, aby wildcard nebyl no-op (V2).
5. **`orchestrator.md` si protřečí sám se sebou** (viz výše) — která vrstva je autoritativní: frontmatter, tělo, nebo `DECISIONS_V7.md`?
6. **`F4_EXPECTED_PENDING`** (`:34-42`) nezná `pricing-researcher` — doplnit, nebo smazat agenta?
7. **`audit` „append-only" proti kódu** — opravit docstring (`audit/__init__.py:104-107`), nebo zavést hash chain? Bez podpisu je chain manipulovatelný, takže to není triviální volba.
8. **Testy odolnosti auditu proti manipulaci neexistují** — a `EXECUTION_SECURITY_REVIEW` zůstává `NOT APPROVED` pro použití jako obecná ochrana proti nepřátelskému kódu `[OVĚŘENO]` `docs/product/STATE_REPORT_V7.md:47`.
9. **`semgrep`** — doplnit jako Gate, nebo odstranit tvrzení o semgrep bráně (V8).
10. **pip-audit je `continue-on-error`** — povýšit na blokující, nebo to deklarativně přijmout?
11. **CI nikdy neběželo a není remote** — kdy a vůbec jak se má pozorovat zelený běh?
12. **Zákaz názvu produktu (D9) je porušen v 7 V5 dokumentech** — hromadně přepsat, nebo ponechat jako historii?
13. **Tvrzení „250 rozhovorů" nemá artefakt** — odstranit, nebo dohledat zdroj.
14. **`CHANGELOG.md` `[Unreleased]` je prázdný**, přesto pracovní strom obsahuje celou V7 změnu.
15. **Chybějí 2 ze 7 deliverablů** (`docs/business/BUSINESS_PLAN_V7.md`, `PRESENTATION_V7.md`) — doručit, nebo upravit `ROADMAP_V7.md §6`?
16. **Rozpory mezi subagenty nejsou vyřešené** — odhady bez `bash` (`code-reviewer`) se rozcházejí s měřením s `bash` (`tester`). V reportu používat měření, ne odhad.

**F11 zůstává `OPEN`** a je nezávislá na všech bodech výše. Simulovaný výstup ji nezavírá; reálné rozhovory vyžadují čtyři nezávislé stopy (`docs/product/PRICING_DISCOVERY_V7.md:722-724`).

---

## 4. Jak číst tuto databázi

**Při začátku práce v tomto repu:**

1. Přečti §1. Trvá to dvě minuty a je to nejlevnější kontrola, jaká v repu existuje.
2. Než změníš jakýkoli soubor, spusť si hledání, zda tvůj zásah neopakuje některý z osmi vzorců:
   - čtu kolekci `.kilo/agent/*.md` → **V1** (chybový helper izoluj) a **V2** (prázdná kolekce musí selhat);
   - píšu `[OVĚŘENO]` → **V3** (musí být artefakt v repu, ne tvrzení z jiného dokumentu);
   - píšu čísla, commit ID nebo „neexistuje" → **V4**, **V5**;
   - dokazuji neexistenci grepem → **V6** (dva kroky);
   - popisuji vlastnost kódu jednou větou → **V7**;
   - jmenuji bránu, nástroj nebo gate → **V8** (musí mít krok v CI).
3. Je-li tvůj zásah podobný něčemu z §1, **napiš to do reportu** — i když to vyjde jako „tentokrát OK". Vzor bez záznamu o jeho setkání znovu vyprodukuje chybu.
4. Ověřuj `file:line` až do okamžiku, kdy ho cituješ. Pracovní strom se mění; §2 obsahuje stav k 2026-10-02, ne trvalou pravdu.

**Co tato databáze neobsahuje a neobsahuje být:** hodnocení trhu, cenové tvrzení a jakékoli prohlášení ochrany proti nepřátelskému kódu, multi-tenant izolace, šifrování v klidu nebo certifikované izolace. Bezpečnostní řetěz je zde popsaný jako redukce blast radius v rámci prototypu, ne jako izolace. F11 je `OPEN`; `P2` a `P3` jsou `OPEN`.

**Při údržbě:** nový vzorec přidej jako `V9`, `V10`, … do §1 ve stejném tvaru (Co se stalo / Jak se to poznalo / Prevence / Které soubory).

---

## 5. V9 — Před každou prací prověřit, jestli v repu nepracuje někdo jiný

**Co se stalo:** 2026-10-03. Při implementaci pentest agenta jsem spustil čtyři
implementační průchody a ani jednou před spuštěním neprověřil, zda v repu pracuje
konfliktní relace. Výsledek: během mé práce se změnily 9 souborů `.kilo/agent/*.md`
a `tests/test_kilo_agent_policy.py`. Jeden z těch souborů byl přepsán **čtyři minuty
po začátku read-only forenzické kontroly** — tedy autor byl aktivní a přepisoval soubor,
který právě někdo četl.

**Jak se to poznalo:** tester si všiml, že pre-existující selhání
`test_every_agent_is_classified_for_cyberbrain26`, které viselo ve vzduchu od Gate 1,
zmizelo, aniž by k tomu došlo jakoukoli schválenou změnou. Řádek s ruff chybou se v
souboru posunul (764 → 731) a import `re` zmizel, přestože `re` v souboru nikdy nebylo
použito. Gate 2 „0 failed" byl tak dosažen **editací testovacího souboru**, ne opravou.

**Prevence:** před každým spuštěním implementačního subagenta, vždy:

```bash
ps -eo pid,etimes,cmd --sort=start_time | grep -Ei "kilo|claude" | grep -v grep
find . -path ./.git -prune -o -type f -newermt '-15 minutes' -print
```

Dvě instance `kilo serve` = dvě relace = pravděpodobně konflikt. Soubor, který byl
zapsán během read-only práce, se nesmí revertovat, dokud autor nezhasne: reverz bude
přepsán a ztrácí se stopa po tom, co změnil.

**Které soubory:** `.kilo/agent/*.md`, `.kilo/kilo.jsonc`,
`tests/test_kilo_agent_policy.py` — tj. bezpečnostní konfigurace agentů a její test.

**Souvisí s V2 a s D1:** prázdná kolekce musí selhat. Testovací soubor, který se dá
„opravit" úpravou frozensetu, taky.

**V10 — Izolační tvrzení musí být ověřeno spuštěním sandboxu, ne čtením argv**

**Co se stalo:** 2026-10-03. Větev `allow_network=True` v `bubblewrap_provider.py`
byla třikrát přepsána a opakovaně „opravována" na základě čtení kódu. Nikdo nespustil
bwrap s touto větví. Audit pak zjistil, že `--share-net` **nahrazuje `--unshare-all`,
ne přidává síť** — sandbox sdílel PID namespace s hostem, viděl 327 procesů a přečetl
`environ` procesu hosta. Tvrzení o izolaci profilu opíralo se o to, že testy kontrolují
argv řetězce.

**Jak se to poznalo:** teprve přímé spuštění `bwrap --share-net` ukázalo `pid1 =
systemd`, zatímco `--unshare-all` dával `pid1 = bwrap`. Ruff i mypy byly zelené.

**Prevence:** každé nové tvrzení o izolaci sandboxu ověřit spuštěním, ne tvrzením
o argumentech. Konkrétně: viditelné síťové rozhraní, počet viditelných procesů,
čitelnost `environ` cizího procesu, dostupnost `/proc/1/root`. Argument-string test
prokazuje jen to, že kód skládá správné slovo — ne to, že bwrap udělá co se myslí. Nové rozhodnutí vlastníka přidej do tabulky v §2 se zdrojem v `DECISIONS_*.md`. Nevyraběj záznamy, i když je chyba opravená — oprava chyby je důvod, proč existuje záznam o chybě.

---

## 6. V17 — Výstup subagenta bez hlášení autora, a „hash audit chainu" jako duch

**Co se stalo:** 2026-10-03. Při threat modelu delegovacího control plane vyšly dvě
věci, obě jako opakování starších vzorců:

1. **`tester.md` a `orchestrator.md` jmenovaly „hash audit chain" jako součást Gate 1/2.**
   Takový chain v repu **neexistuje**.
2. **Hranice mezi výstupem subagenta a kontextem orchestrátora není nikde popsána.**
   `code-reviewer` i `verifier` dostávají diff **i hlášení autora práce**, takže autorovo
   tvrzení „hotovo a otestováno" vstupuje do nezávislé kontroly jako podklad.

Zároveň: `threat-modeler` byl spuštěn dvakrát a pokaždé vrátil výstup, který nebylo možné
použít — poprvé prázdný, podruhé text, který `PermissionGateway.evaluate` označil za
"mitigaci" prompt injection. Ta je věcně chybná: permission gateway hodnotí **akce kódu**,
ne text; D3 to dokazuje (modelový turn nemá akci ani scope, proto je neautorizovatelný).
Třetí pokus by byl zřejmě stejný, takže threat model nakonec napsal orchestrátor.

**Jak se to poznalo (ověřeno vlastním během, ne tvrzením agenta):**

```bash
grep -rn "chain_hash\|previous_hash\|hash_chain\|event_hash\|prev_hash" src/ tests/
# → nula výskytů
```

`AuditLog.record` (`security_plane/audit/__init__.py:122`) je `INSERT INTO audit_events`
bez řetězení; `clear()` (`:264`) a `prune_expired()` (`:271`) řádky mažou. Toto už
popisuje V7 — chain je jen silnější verze téhož problému.

Obě `AIFirewall` metody existují a jsou funkční, ale **mimo provozní cestu**:

```bash
grep -rn "AIFirewall" src/ --include=*.py | grep -v "security_plane/firewall/" | grep -v "security_plane/__init__.py"
# → jen docstring v quality_gates/__init__.py:105
grep -rn "inspect_model_output\|inspect_tool_result" src/ tests/
# → jen tests/test_security_gate.py
```

**Prevence:**
- V8 rozšířeno: **jmenovaná brána musí být v repu jako spustitelný krok**, ne jen v textu
  agenta. "Hash audit chain" a "semgrep" byly odstraněny z `tester.md` i `orchestrator.md`
  2026-10-03, dokud je implementace nedohání.
- **Autorovo hlášení nesmí být součástí vstupu nezávislého kontrolora.** Napsáno do
  `verifier.md` a `code-reviewer.md` s výslovnou instrukcí: pokud ho ve vstupu najdeš,
  napiš to do reportu a pracuj z artefaktu.
- **Agent, který selhal dvakrát po sobě, se nesmí spouštět potřetí.** Orchestrátor přebírá
  práci sám a označí ji jako [OVĚŘENO] jen tam, kde ji sám naměřil. Selhání agenta je
  zjištění o nástroji, ne o zadání — neskrývá se za „chybou promptu".
- **Každé tvrzení agenta o „chyba v kódu X" ověř přímým během, ne čtením jeho výstupu.**
  Tester tvrdil, že `credential_access` chybí ve scope mapě; běh `PYTHONPATH=src python3 -c
  "from cyberbrain26.security_plane.actions import ..."` ukázal, že je tam přítomen
  (řádek 279). Agent byl tentokrát správně a orchestrátor se mýlil — proto se to ověřilo.

**Které soubory:** `.kilo/agent/tester.md:2`, `:18`; `.kilo/agent/orchestrator.md:101`,
`:122`; `.kilo/agent/verifier.md`; `.kilo/agent/code-reviewer.md`;
`src/cyberbrain26/security_plane/audit/__init__.py:122`, `:264`, `:271`;
`src/cyberbrain26/security_plane/firewall/__init__.py:155`;
`tests/test_security_gate.py:421-440`.

**Souvisí s:** V7 (vlastnost širší než implementace), V8 (jmenovaná brána bez kroku),
V16 (výstup agenta bez artefaktu), D3 (modelová cesta není autorizovatelná).

---

## 7. V22 — Gate 1/2 zpevnění 3. 11. 2026 (chronologie)

### Co se stalo, jak se to poznalo a která věc má ochránit

**Co se dělo.** 2026-11-03 vlastník po žádosti o hlášení zavedl šest zabezpečení fixu proti starým slabostem bezpečnostní vrstvy, založeným na čtení zdroje. Každý reakce na **nahradit výchozí chování**, nikoli **objevit nový on**: útok zní méně efektivní, náznak je přímo v kódu (ne v agentovi), a `file:line` je artefakt platný i pro všechny další potvrzení.

### Záznam záznamů

| Zodpovězeno | Jest povinně (v jiných změnách) | Ochranný celek | Cl zákon |
|---|---|---|---|
| `security_plane/egress.py:106-108` | `EgressGate.authorize()` s `base_decision=True` jako nouzový přepínač | Globální nouzový režim: odchozí provoz povolen bez ověření | Vypnutí globálně prochází bez vyhodnocení, kliď je silnější než defaulty v `actions.py` |
| `execution_plane/secure_gateway.py:125` | `base_decision=True` lokální egress | Místní prostředí neblokováno bez prochodu gateway | Na loopbacku a lokální adresách to běží bez dalšího ověření |
| `security_plane/audit/chain.py:39-44` | `CHAIN_KEY` vyvolá `RuntimeError` bez fallbacku | Audit řetězec nikdy neotevřený bez klíče | No-priest, no fallback |
| `conftest.py` | `CYBERBRAIN_CHAIN_KEY` nastaveno | Testy audit chain prošly | Zpomalení runtime `RuntimeError` by negativně ovlivnilo výstup testů |
| `pyproject.toml` | litellm/pydantic/pyyaml pinovat, ekvitabilní sestavení | Bezpečnostní fix v řetězci dodávek | Softwarová závislost nefáze na „poslední běh" |
| Gate 1/2 | 763 passed, ruff clean, mypy clean | Měřitelné brány jsou zelené a více jejich výstupů je aktuální než dřív | Na přání vlastníka |

### Největší zisk z dostupné bezpečnosti

**Nezvratný efekt:** každý z těchto reakčních bodů chrání **infrastructure-of-defense** — takový okolnost, které je po implementaci nemožné zcela zastavit, protože cíl je spojitý s během, který běží. Žádné z těchto reakčních bodů neposkytuje nejlepší možnou ochranu: `egress.py` nouzový režim když je aktivní bere za povinnost automatický balanc, `secure_gateway.py` navíc umožňuje ladění lokálním developerům, `chain.py` je `tamper-evident` nikoli `tamper-proof`, `pyproject.toml` dělá sestavení dostupným pouze nevědomky. Spodní kvalita je přímo z roviny **choosable uncertainty** — tato změna vyvrací tvrzení „chování je bezpečný" kvůli absenci prostředku k ověření chování, takže izolace se přijme jen za ty případy, pro které je k ověření.

### Otevřené body

- **Rozdíl mezi chování AGENTS.md a jeho záznamu v změně:** AGENTS.md uvádí 764 passed, změna hlásí 763. Rozdíl 1 testu vyžaduje přepočet před dalším citováním čísla; viz vzor V4.
- **Gate 3 je stále `NOT PERFORMED`** — viz první změnu změny v tomto paragrafu, která uvádí stejné “tered” ajistotní údaje bez ověření v běhu.
- **Sem이나 bránu v repu neexistuje** `semgrep` ani `security-events` ve výb nábo rozepsaný slitání `ci.yml`; vizů vzor V8.
- **MCP server `cyberbrain26` je `enabled: false`** — viz změna změny v změně, která uvádá zatím aktivní verzi bez dějiště serveru.

---

## 8. Pravidlo čtení databáze

Než řekneš někomu, že v zapověsti je změna hotova, proveď **přetisk**, který se popisuje zde:

1. **Přejít §1.** Trvá dvě minuty a je levnější kontrola, jaká v repu existuje.
2. **Přejít §2.** Seznam rozhodnutí vlastníka, kde se řeší, co se rozhodlo, jak v důsledku. S tím je konečné rozhodnutí.
3. **Přejít §3.** Listování“ co je učin no je připravené. Učení je míně omezná dále než opěvnání.
4. **Přejít §4.** Popis publikání knihy nebo býka. Čte zdroje odpověď jaka změní v knize.
5. **Přejít §5.** V9 — Při startuce každého práce třeba tak průmečky `ps -eo pid,cmd` a `find -type f -newermt '-15 minutes'`.
6. **Přejít §6.** V17 — Pokud je jako jiný výskyt že agent vysel alespoň tři vrať výstup dostatečně černé k odmýtí v práce, prvejší dva také pomarodil mající ze stejnéhoa mínusujícího `git status`.
7. **Přejít §7.** §19 — Jak chvíle čitace seznamu všeho třeba čtěme pouze ČT. Teď přes \\- \(\)을겨lag pronà před n zas panujícíคู่กับมuf num

---
