# CyberBrain26 — stav repozitáře proti ROADMAP_V7

**Datum:** 2026-10-02  
**Metoda:** čtení zdrojových souborů, spuštění testů (`pytest`, `mypy`), kontrola CI konfigurace, grep na klíčové vzory.

---

## Prostředí a omezení

- Python `python` neexistuje, používá se `python3` 3.12.3. CI specifikuje také 3.11 a 3.13 — tento rozdíl NEOVĚŘEN. [OVĚŘENO]
- Větev `master`, HEAD `90a42e6`, 4 commity: `d4da1d4` → `0534e06` → `b8c71d2` → `90a42e6`, žádný stash, žádná rozpracovaná merge/rebase, 2 linkované worktree. [OVĚŘENO] `.git/logs/HEAD`
- Pracovní strom: 56 záznamů, 28 `M` + 28 `??`. `tests/test_kilo_agent_policy.py` je untracked. [OVĚŘENO]
- Zaznamenaný commit `b8c71d2` EXISTUJE a je přímým rodičem HEAD (`.git/logs/HEAD:3-4`). Tvrzení `ROADMAP_V7.md:58` je NEPRAVDIVÉ. [OVĚŘENO]
- CI nikdy neběželo: `.git/config` nemá žádnou sekci `[remote]` → není co citovat jako výsledek buildu. [OVĚŘENO] `SECURITY.md:237-239`, `docs/CAPABILITIES.md:120,140`
- `semgrep` v prostředí chybí (`příkaz nenalezen`); `bwrap` 0.9.0 přítomen. [OVĚŘENO]

## Testy

- `pytest -q` → **24 failed, 529 passed, 0 skipped** ze 553, ~12 s. [OVĚŘENO]
- `pytest --ignore=tests/test_kilo_agent_policy.py` → **502 passed, 0 failed**. [OVĚŘENO]
- `pytest tests/test_kilo_agent_policy.py -q` → **24 failed, 27 passed** (51 testů v modulu). [OVĚŘENO]
- Všech 24 selhání je v jediném untracked souboru `tests/test_kilo_agent_policy.py`, ne v aplikačním kódu. Kořenové příčiny jsou TŘI: [OVĚŘENO]
  1. **22 selhání (kaskáda)** — `.kilo/agent/tester.md:2` má neukotvenou dvojtečku v necitovaném `description:` → `yaml.scanner.ScannerError: mapping values are not allowed here, line 2 column 43` → celý frontmatter neparsovatelný, `mode` i `permission` se zahodí. Ostatních 10 agentních frontmatterů se parsují OK.
  2. `test_primary_agents_cannot_edit` — `orchestrator.md:11` má `edit: allow` při `mode: primary`; test vyžaduje `deny`.
  3. `test_default_agent_is_orchestrator_and_exists` — `kilo.jsonc:9` má `default_agent: "promptmaster"` (D11), test vyžaduje `"orchestrator"`.
- Fail-closed test prošel dvakrát nezávisle: `tests/test_execution_provider.py:322` PASSED i přímý běh vyhozil `RuntimeError: Bubblewrap executable 'bwrap' is unavailable; refusing to run code without a sandbox`. Test NENÍ označen `@requires_bubblewrap`, takže se tiše nepřeskakuje. [OVĚŘENO]
- `mypy src/cyberbrain26` → **Success: no issues found in 58 source files**, exit 0. [OVĚŘENO]

## CI

- `.github/workflows/ci.yml` (272 řádků, 3 joby) [OVĚŘENO]
  - `quality` — matrix 3.11/3.12/3.13, `fail-fast: false`; coverage `fail_under=60` JEN na 3.11; `ruff check .`; mypy.
  - `no-bubblewrap-fail-closed` (`:121-198`) — 3.11; odstraní bwrap, 3 asserty nedostupnosti, celý suite bez bwrap, runtime assert `RuntimeError` "refusing to run code without a sandbox". Komentář `:109-120` výslovně odděluje "Proves" od "Does NOT prove" (ochrana proti hostile kódu se tím NEOVĚŘUJE). [OVĚŘENO]
  - `dependency-audit` — pip-audit, ale `continue-on-error: true` = **advisory, nikdy nepozvedne build**. [OVĚŘENO]
- **semgrep v CI chybí** a v repu není ani config; bandit běží jen jako ruff `S` pravidla; `.pre-commit-config.yaml` existuje, ale CI ho nespouští. [OVĚŘENO]
- Parita s `pyproject.toml`: pytest, mypy, ruff, coverage mají ekvivalent. [OVĚŘENO]

## Bezpečnostní kontrola

- **Hash audit chain NEEXISTUJE** — 0 výskytů `entry_hash|chain_hash|prev_hash|previous_hash` v `src/` i `tests/`. `AuditEvent` (`audit/__init__.py:61-85`) ani schéma `audit_events` (`sqlite_store.py:59-81`) nemají hash sloupec. Praktický test: po změně uloženého záznamu `list_all()` vrátí změněnou hodnotu bez chyby. [OVĚŘENO]
- Docstring `audit/__init__.py:104-107` tvrdí "append-only, cannot be modified or deleted" — **kódem vyvráceno**: `clear()` (`:264-269`) dělá `DELETE FROM audit_events`, `prune_expired()` (`:271-277`) maže staré řádky, `_events` (`:118`) je běžný list. [OVĚŘENO]
- Audit je in-memory list PLUS SQLite, ne jen list. API klíče se hashuje (`api/__init__.py:419`) a porovnává `hmac.compare_digest` (`:431`) — to je ochrana klíče, NE šifrování v klidu. [OVĚŘENO]
- **Šifrování v klidu neexistuje** — 0 výskytů `encrypt|cipher|AES|Fernet|keyring|cryptography|at_rest`. [OVĚŘENO]
- Existující hashe v repu nejsou chain: `actions.py:147` (sha256 payloadu, nikdy nepersistován), `data_plane/sqlite_memory.py:225,254-258` (per-záznam, `signature_verified is False` dle `tests/test_sqlite_persistence.py:202`), `api/__init__.py:419` (auth). [OVĚŘENO]
- **Multi-tenant izolace neexistuje** — 0 výskytů `tenant` v repu. `spaces_config.json` je promptová instrukce, ne izolace; `CYBERBRAIN_SPACE` čte jen `switch_space.py`, kód v `src/` ho nečte. [OVĚŘENO]
- `BubblewrapExecutionProvider` je čistý: jediné spuštění `create_subprocess_exec(*bwrap_args)` na `:178` s binary z `shutil.which` (`:129`); `os.execv` limiteru (`:232`) běží uvnitř bwrap. `os.system`/`os.popen`/`eval`/`exec`/`Popen` = 0 v `src/`. [OVĚŘENO]
- **Chybí `--seccomp`** v `bwrap_args` (`:152-175`); `RLIMIT_*` jsou kooperativní (`resource.setrlimit` + `os.execv` uvnitř sandboxu, `:220-244`). Žádný test seccomp/RLIMIT neexistuje. `EXECUTION_SECURITY_REVIEW`: vhodné pro omezený lokální prototyp, **NOT approved** jako obecný sandbox proti nepřátelskému kódu. [OVĚŘENO]
- Testy odolnosti auditu proti manipulaci **neexistují**. [OVĚŘENO]

## Nálezky, které NEJSOU v ROADMAP_V7

1. **`switch_space.py:130`** — `subprocess.run(cmd, env=env, check=False)` s libovolným `argparse.REMAINDER` z `--child`. Třetí exekuční cesta: bez identity, bez PermissionGateway, bez AuthorizedExecutionService, bez sandboxu, bez auditu. Soubor je v kořeni repa, mimo balíček `src/cyberbrain26`, mimo D14. Žádný test. [OVĚŘENO]
2. **Obejití autorizace, ne sandboxu** — `ptah_bridge.py:153,196` přijímá libovolný objekt vyhovující `runtime_checkable` protokolu `ExecutionProvider`; implementace bez sandboxu by prošla gateway bez protestu. `BubblewrapExecutionProvider` je veřejně exportovaný (`execution_plane/__init__.py:3`) a `.execute()` (`:97`) je volatelný přímo, mimo `secure_gateway.py:82`. [OVĚŘENO]
3. **D14 zrušil allowlist delegace** — `orchestrator.md:9-10` je `task: {"*": "allow"}`. Důsledek: `test_allowlisted_agents_that_exist_are_subagents` (`:612-623`) i `test_allowlist_agents_pending_f4` (`:635-646`) berou `["*"]` a tiše procházejí jako no-op. `F4_EXPECTED_PENDING` (`:34-42`) navíc nezná `pricing-researcher`, jehož `.md` existuje. [OVĚŘENO]
4. **Seznam selhání v §2.1 je neúplný a jedno selhání je přiřazeno špatnému testu** — `test_only_orchestrator_may_delegate` ve skutečnosti PROCHÁZÍ (orchestrator má `["*"]` ≠ prázdné); selhává `test_task_always_uses_allowlist_form` (`:389-406`), který v seznamu chybí. [OVĚŘENO]
5. **Zakázaný název „Agent Guard" (D9) je porušen v 7 dokumentech** — `PRODUCT_BRIEF_V5.md:1,9`, `MVP_GAP_ANALYSIS_V5.md:1`, `CUSTOMER_DISCOVERY_V5.md:1`, `DECISIONS_LOG_V5.md:7,24`, `ANALOGOUS_INTERVIEW_RESEARCH_V5.md:4,24`, `ROADMAP_V5.md:17`, `docs/presentations/…:18,114,116`. Navíc `docs/presentations/…:18` ho označuje jako „schválený produktový záměr" — což je v rozporu s AGENTS.md. [OVĚŘENO]
6. **`CHANGELOG.md:11-14`** hlásí „[Unreleased] Nothing recorded yet", přesto pracovní strom obsahuje celou V7 změnu (8 nových agentů, D11, D14). [OVĚŘENO]
7. **Tvrzení „250 rozhovorů / 8–12 převáží všech 250" nemá žádný artefakt** v repu. `PRICING_DISCOVERY_V7.md:25` cituje `CUSTOMER_DISCOVERY_V5.md:4`, který říká jen „Target: 8–12 interviews". Grep `250|převáží` v `CUSTOMER_DISCOVERY_V5.md` = 0. [OVĚŘENO]
8. **Šest různých tvrzení o testech** v repu: `SECURITY_ONE_PAGER.md:222` 413 passed; `:227` 360 passed 9 skipped; `PROJECT_STATUS.md:45` 369 passed; `PROJECT_STATUS.md:51` 360/9; prezentace 291 a 290/1; `ROADMAP_V7.md:78` 24 failed 27 passed. **Žádné nebylo re-verifikováno kromě Gate 0.** [OVĚŘENO]
9. Chybějí 2 ze 7 deklarovaných deliverables: `docs/business/BUSINESS_PLAN_V7.md` a `docs/business/PRESENTATION_V7.md` (`ROADMAP_V7.md:257-258`) — `docs/business/` obsahuje jen `PRICING_MODELS.md`. [OVĚŘENO]
10. `orchestrator.md:59-61` (tělo dokumentu) stále tvrdí `bash: deny`, `edit: deny`, `agent_manager: deny`, což je v přímém rozporu s frontmatterem (`:8,11,12`) a s D14 (`DECISIONS_V7.md:71-75`). [OVĚŘENO]

## Chybné citace file:line v ROADMAP_V7

| Citace v ROADMAP_V7 | Skutečnost |
|---|---|
| `ROADMAP_V7.md:120` → `DECISIONS_V7.md:35-37` | správně `DECISIONS_V7.md:111-112`; 35-37 je sekce P3 open-core [OVĚŘENO] |
| `ROADMAP_V7.md:124` i `orchestrator.md:70` → `bubblewrap_provider.py:97` | správně `:129-134`; řádek 97 je `async def execute(` [OVĚŘENO] |
| `docs/SECURITY_ONE_PAGER.md:204` → `bubblewrap_provider.py:73-78` | řádky 73-78 jsou vlastnosti `provider_name`/`allowed_workspaces_root` [OVĚŘENO] |

Všechny tři tvrzení jsou PRAVDIVÉ, jen odkazy neukazují na důkaz. [OVĚŘENO]

## Rozpory mezi subagenty

- `code-reviewer` (bez `bash`) odhadoval Gate 0 na „~100+ testů" a YAML pády na „~7-8". `tester` (s `bash: allow`) změřil 51 testů / 24 selhání / 22 z YAML. **V reportu použij měření od testera.** [NÁVRH]
- `code-reviewer` tvrdí, že `.bak-pre-v7b` neexistuje, `explore` ho četl v `.kilo/agent/orchestrator.md.bak-pre-v7b:9-18` (8jmenný allowlist) — je gitignorovaný vzorem `*.bak-*` (`.gitignore:44`). Oba nesouhlasí; neověřeno. [HYPOTÉZA]
- `docs/SECURITY_ONE_PAGER.md:204` je současně citována jako potvrzení „fail-closed důkaz" i jako chybná citace. [HYPOTÉZA]
- `threat-modeler` dosáhl limitu kroků; riziková matice a full gap analysis nebyly dokončeny. [VÝZKUM]

## OPEN — rozhodnutí vlastníka

1. `.kilo/agent/tester.md:2` — oprava uvozovek, nebo opustit `tester` jako agenta. Zásah do `.kilo/` vyžaduje schválení. [OVĚŘENO]
2. `orchestrator.md:11` `edit: allow` při `mode: primary` — porušuje `test_primary_agents_cannot_edit`. Vrátit na `deny` (D6 „delegátor neprovádí exekuci") nebo změnit test? **Rozhodnutí: D6 vs D14.** [OVĚŘENO]
3. `kilo.jsonc:9` `default_agent: "promptmaster"` — D11 to schválilo, ale test vyžaduje `orchestrator`. Změnit config, nebo test? [OVĚŘENO]
4. `orchestrator.md:9-10` — obnovit 8jmenný allowlist `task` (D14 ho zrušil), nebo ponechat wildcard a přepsat testy, aby wildcard nebyl no-op? [OVĚŘENO]
5. `switch_space.py:130` — odstranit `--child`, nebo zavést jako výslovně zaznamenanou výjimku? Není D14 krytý. [OVĚŘENO]
6. `ptah_bridge.py:153` — vynutit typ/factory se sealed množinou providerů, nebo zdokumentovat jako vědomou mezeru? [OVĚŘENO]
7. Gate 0 třída A vs B — které z 24 selhání jsou bezpečnostní regresie vyžadující okamžitou opravu, a které jsou stale testy vyžadující úpravu testu? [OVĚŘENO]
8. Konflikt `orchestrator.md:59-61` (tělo tvrdí deny) vs frontmatter (allow) vs D14 — která vrstva je autoritativní? [OVĚŘENO]
9. `F4_EXPECTED_PENDING` (`:34-42`) — doplnit `pricing-researcher`, nebo smazat agenta? [OVĚŘENO]
10. Chybějící `docs/business/BUSINESS_PLAN_V7.md` a `PRESENTATION_V7.md` — doručit, nebo upravit ROADMAP_V7 §6? [OVĚŘENO]
11. Zákaz názvu „Agent Guard" v 7 dokumentech — hromadně přepsat, nebo ponechat V5 dokumenty jako historii? [OVĚŘENO]
12. `CHANGELOG.md` — doplnit `[Unreleased]` o V7 změny? [OVĚŘENO]
13. pip-audit je advisory — povýšit na blokující? [OVĚŘENO]
14. semgrep chybí v CI i v prostředí — doplnit jako Gate, nebo z dokumentace odstranit tvrzení o semgrep bráně? [OVĚŘENO]
15. `audit clear()`/`prune_expired()` proti tvrzení „append-only" — opravit docstring, nebo zavést hash chain (a zda vůbec — bez podpisu je chain manipulovatelný)? [OVĚŘENO]
16. CI nikdy neběželo a není remote — kdy a jak se má zelený běh CI vůbec pozorovat? [OVĚŘENO]
