# HANDOFF — 2026-10-04 21:50 CEST

**status: superseded** — nahrazeno `SESSION_HANDOFF_2026-11-03.md` (3. 11. 2026)
Předchozí vlákno ukončeno. Repo: `/home/oem/CyberBrain26-v4`, větev `master`.
**Nic necommitnuto, nic nestagováno — pracovní strom čistý, 0 položek.**

## 0. Tři věci, které mě vlákno změnily nejvíc

1. **Repo bylo 39 hodin bez jediného bodu obnovy.** Poslední commit `779fb91` byl
   ze **3. 10. 2026 06:57** — tedy zhruba 39 hodin před timto vláknem, ne „2 dny"
   jako v předchozím handoffu. Celé `egress.py`, `pilot/`, `knowledge_plane/`,
   property testy i autoritativní plán existovaly jen v pracovním stromu, git o
   27 z nich nevěděl. Bez remote, bez stash.
2. **Argumentace v předchozím handoffu byla chybná a mohl se na ni důvěřovat
   někdo jiný.** §3 tvrdil, že klasifikační brána je nedosažená. Není.
3. **Dnes jedna delegace zničila bezpečnostní soubor.** `documenter` přepsal
   `orchestrator.md` z 369 řádků na 125. Zachránil to bod obnovy z bodu 1.

## 1. Stav repozitáře — OVĚŘENO výstupem příkazů

```
git rev-parse --abbrev-ref HEAD   → master
git log --oneline -3              → 9f9e0eb  fix(docs): make plan authority real
                                    1bfd516  chore: checkpoint unverified WIP state
                                    779fb91  chore(v7): baseline snapshot (3. 10. 06:57)
git status --porcelain | wc -l    → 0
git remote -v | wc -l             → 0   (žádný remote — nikam se neposílá)
git stash list | wc -l            → 0
```

**Dva commity přidány v tomto vlákně.** První zachraňuje 39 hodin práce, druhý
opravuje mechanismus autority plánu. Oba na `master` přímo, oba bez push.

## 2. Brány — přesně co je ověřeno a co ne

**NEZAHALOVAT Gate 1 znovu bez důvodu** (vlastníkovo nařízení z 19:09).

```
NEPOUŠTENO:  ruff check .                          → All checks passed!   exit 0
NEPOUŠTENO:  mypy src/cyberbrain26                 → clean, 71 souborů
NEPOUŠTENO:  pytest (celá suite)                   → 640 passed, 1 skipped
             (platí STAV PŘED commitem 1bfd516; od té doby viz níže)

PO B1/B2:    py_compile secure_gateway.py          → exit 0
PO B1/B2:    pytest test_egress_gate_integration
             + test_execution_provider              → 31 passed
PO B1/B2:    ruff check secure_gateway.py          → exit 0

PO 9f9e0eb:  ruff check .                          → All checks passed!  exit 0
PO 9f9e0eb:  mypy tests/test_plan_authority.py     → Success, 1 file
PO 9f9e0eb:  pytest test_plan_authority
             + test_kilo_agent_policy               → 68 passed
```

**Celá Gate 1 po B1 nikdy neběžela.** Je to vědomá volba vlastníka. Argument,
že komentář nemůže změnit chování, je **rozumový, ne výstup příkazu** — pokud
to někdy budeš citovat jako důkaz, je to chyba.

**Co Gate 1/2 nikdy neobsahovaly a dál neobsahují:**
- `semgrep` — v prostředí ani v `.github/workflows/ci.yml` neexistuje
- hash audit chain — `grep -rn "chain_hash\|previous_hash\|hash_chain" src/ tests/`
  vrací nulu. `AuditLog.record` (`security_plane/audit/__init__.py:122`) je
  `INSERT` bez řetězení; `clear()` (`:264`) a `prune_expired()` (`:271`) řádky
  mažou. Audit je append-only na úrovni API, přepisovatelný na úrovni SQL

## 3. B1/B2/B3 — ZAVŘENO, rozhodnutím vlastníka

Rozhodnutí 19:05: **B1 teď + B2 jako F3. B3 zamítnuto.**

### Co měření zvrátilo

Předchozí handoff §3 tvrdil: „s defaultní politikou je local PUBLIC zamítnuto
na prvním povídku → klasifikační brána se nedosáhne". To platí jen pro holé
`EgressPolicy()`. Ve skutečnosti si `secure_gateway.py:124` skládá vlastní
politiku s `local_provider_ids=frozenset([provider_name])`, takže se větev
`local` **dosáhne** a klasifikační brána rozhodne:

```
GATEWAY policy (line 124)  PUBLIC      → ALLOW
GATEWAY policy (line 124)  RESTRICTED  → DENY: local classifications denied
```

**Argumentace pro B3 tedy neplatila.** Co platí: brána se provede, ale nemá co
kontrolovat, protože `classifications=frozenset({DataClassification.PUBLIC})`
je zpevněno v kódu na `secure_gateway.py:213`. Bezpečnostní pořadí z plánu
(:67) tvrdí, že před provedením proběhne klasifikační kontrola — ve skutečnosti
proběhne kontrola, která si odpověděla „public" předtím, než byla vznesena otázka.

**Nejde o živý bypass. Jde o falošný doklad** v audit logu, a o tvrzení, které
Gate 3 (`-v2.md:234`) nebude moci podpořit.

### Co B1 udělal

`secure_gateway.py:209-212` — 4 řádky komentáře, `:213` je
`classifications=`. Žádná změna chování.

### Co B2 udělal

`.kilo/plans/CyberBrain26cil-031026-v2.md:505` — jeden odrážek v sekci F3,
označený `nerozhodnuto`. Reference opravena na `:213` (commit po 9f9e0eb).

### Co zůstalo pro F3 — nerozhodnuto

Návrhová volba zapsaná v plánu: povinný parametr `classifications` na
`execute()`, fail-closed při chybějící deklaraci, oba call-site
(`agents/orchestrator.py:436`, `pilot/workflow.py:930`) musí deklarovat.

**Změřený blast radius `PUBLIC → RESTRICTED`: 14 testů padá, Gate F2 3/7.**
Změřeno monkeypatchem v paměti, repo nedotčeno.

**Žádný klasifikátor v repu neexistuje.** `RESTRICTED` mimo `egress.py` jen
v `knowledge_plane/contracts.py:31` — citlivost *dokumentů*, ne kódu. Redesign
je nová funkce, ne oprava.

## 4. `documenter` zničil `orchestrator.md` — NEPOUŽÍVAT na bezpečnostní soubory

Když jsem mu zadal vložit Pravidlo 9, přepsal soubor **z 369 řádků na 125**
a přidal duplicitní line-number prefix ke každému řádku (`1: 1: ---`).

**Rozbilo to YAML frontmatter nejvýše oprávněného agenta v repu**, kde jsou
`bash: allow`, `edit: allow`, `task: allow`. Tedy odebral oprávnění tomu, kdo ho
delegoval. Jeho report to označil jako „přidáno Pravidlo 9, žádná jiná změna".

Obnoveno: `git checkout HEAD -- .kilo/agent/orchestrator.md` (z `1bfd516`).
**Pravidlo 9 pak dopsal orchestrátor přímo, bez delegace** — rovnou na
`orchestrator.md:249`, mezi Pravidlem 8 (`:242`) a sekcí na `:272`.

Historie tohoto agenta: `documenter` 2× prázdno + zničení `verifier.md` (minulé
vlákno), 3× tvrdil 4 opravy a udělal 2, **dnes zničení bezpečnostního souboru**.

## 5. Receipt kontrola — POLOVIČNĚ ÚČINNÁ, mezera doplněna

Handoff 18:30 §9 bod 4 žádal zjistit, jestli receipt zabrání lhání. Odpověď:

**Zabránil.** `documenter` v minulém vlákně tvrdil 4 opravy, udělal 2. Dnes
receipt obsahoval konkrétní `soubor:řádek` pro každý bod a všechny body se
potvrdily jedním příkazem.

**Nezabránil — a to je mezera.** `implementer` **nehlásil odchylku**: brief
požadoval 8 mezer odsazení, napsal 12, a v reportu to uvedl jako „odsazení"
bez zmínky, že se liší. Chytil to až `cat -A` orchestrátora, ne receipt.
Chyba byla na mé straně (brief měřený odhadem), ale **mechanismus receipt ji
neodhalil**.

**Pravidlo 9 v `orchestrator.md:249` — dvě povinné kontroly:**
1. **Pravdivost** — potvrzuje receipt (Pravidlo 7)
2. **Shoda s briefem** — porovnání bod po bodě, včetně toho, co brief zakázal

Odchylka nahlášená = přezkoumat. Odchylka **nenahlášená** = `REJECT_UNVERIFIED`.
Briefy se píší proti **změřeným** hodnotám, ne odhadům.

**Účinnost Pravidla 9 je NEOVĚŘENÁ.** Prokáže se až další delegací.

## 6. Autorita plánu — opraveno a hlídáno (commit `9f9e0eb`)

`AGENTS.md` dlouho tvrdil, že `tests/test_plan_authority.py` hlídá ukazatel
autority. `git log --all -- tests/test_plan_authority.py` byl **prázdný** —
soubor nebyl nikdy zapsán ani smazán. Dokumentace odkazovala na ochranu,
která neexistovala, a nikdo si toho nevšiml, protože odkaz na neexistující
test nevypadá jako chyba.

Navíc: `status: superseded` měl **jen `ROADMAP_V6.md`**. Mechanismus, který
má rozlišit „plán je autorita" od „plán je archiv", chyběl ve všech souborech,
kterých se týkal.

**Rozhodnuto C (vlastník 19:27) a provedeno:**
- `status: superseded` + odkaz na `-v2.md` → 5 archivních dokumentů
- `AGENTS.md` popisuje existující test **i jeho meze**
- `tests/test_plan_authority.py` — 10 testů, stdlib + pytest, **bez importu ze `src/`**

**Kontrola, že test není slepý** — tři záměrná poškození, tři pády:
```
1) ROADMAP_V5.md bez 'status: superseded'   → 1 failed  CHYTI
2) 'status: superseded' v -v2.md            → 1 failed  CHYTI
3) nový ROADMAP_V8.md                        → 1 failed  CHYTI
```

**MEZE toho, co test umí — nezaměňovat:** kontroluje **declarativní** označení.
Nezjistí, že někdo vytvořil `ROADMAP_V8.md` jako legitimní nový plán, ani že
`-v2.md` odpovídá realitě. To je posouzení, ne automatická kontrola.

## 7. Gitignorem doplněno — co se necommitlo a proč

`.gitignore` dostal 3 pravidla, bez nichž by `git add -A` nacpal 106 MB:
- `node_modules/` — 97 MB závislostí Kilo pluginu
- `.kilo/worktrees/` — **checkouty tohoto repozitáře včetně vlastních kopií
  `.kilo/`**. Strom uvnitř stromu; `git clean` by zničil rozběhnutou session
- `file:*cache=shared*` — 1.2 MB stopa po chybě DSN

**Pravidla jsou nad spravovaným blokem `# ptah:harness:begin`**, protože ten
píše externí nástroj a mohl by je přepsat.

`file::memory:?cache=shared` **zůstává na disku** (1232896 B, 18:47) —
pokyn vlastníka „nemaž". `.gitignore` ho jen vyfiltruje z tracku.

## 8. OTEVŘENÉ BODY

### 8.1 Gate F1 — blokováno technicky, čeká na vlastníka

```
mv /usr/local/bin/kilo /usr/local/bin/kilo.broken-symlink-20261004
npm install -g @kilocode/cli@7.8.3
kilo --version
```
`/usr/local/bin`, `/usr/local/lib/node_modules`, `@kilocode` jsou `oem:oem`,
**sudo není potřeba**. `npm view @kilocode/cli version` = `7.8.3`.

**Agent to spustit nemůže:** `external_directory: deny` s `pattern: *` blokuje
bash i nástroj `write`. Dnes to blovalo dvakrát: zápis do `/tmp` i přípravu
kontroly záměrného poškození. **Obě cesty obejít nedá se a nebylo obejito** —
kontrola šla přes Python v paměti. Nutné zrušit v nastavení projektu.

### 8.2 B2/F3 — návrh nezvolen

Viz §3. Vlastník rozhodne, až bude F3 na řadě.

### 8.3 `ROADMAP_V8.md`

Nevznikl, `AGENTS.md` to hlídá i testem. Návrh v `.kilo/plans/1791036626945-…`
má `status: superseded` a obsahuje §0, který nezávisle potvrzuje, že V8 nikdy
nebyl zapsán. Jeho tvrzení „plán byl schválen" je **nepodložené**.

## 9. Co se ROZHODLO a NESMÍ se to vrátit

- **`bash: deny` u `implementer` i `verifier` zůstává.** Potvrzeno 4. 10.
  `tests/test_kilo_agent_policy.py:33` — `MUST_BE_EXPLICIT_DENY`. Nerozšiřuj
  `bash` bez změny toho testu, a to je vědomá změna bezpečnostního postoje.
- **`bash: allow` má jen `orchestrator` a `tester`.** 13/13 `.md` agentů má
  parsovatelné YAML (ověřeno `yaml.safe_load`).
- **Gate 1 je zelená. Nezahajovat znovu bez důvodu.**
- **`documenter` na bezpečnostní soubory nepoužívat** (§4).

## 10. Delegace selhala — vzorec, který se opakuje

Měřeno napříč dvěma vlákny, 12 delegací. Agenti bez `bash` selhávají
**opisováním**, ne čtením. Konkrétně zničili: `verifier.md` (celé tělo
+ rozbité YAML, 17 pádů policy testů), `implementer.md` (3 mezery místo 2,
stejný efekt), `orchestrator.md` (dnes, 244 řádků).

**Dvě chyby byly v briefech, ne u agentů:**
1. brief požadoval odsazení, které jsem nezjistil → Pravidlo 9
2. minulé vlákno nařídilo agentovi s `bash: deny`, aby spustil testy

**Co zabránilo škodě:** bod obnovy v gitu. Bez `1bfd516` by `documenter`
dnes tiše odebral `bash: allow` a `edit: allow` nejvýše oprávněnému agentovi
a nikdo by si toho nevšiml, dokud by něco neselhalo.

## 11. Ověřený výzkum (přečteno, ne převzato z reportu)

Norman, Rivera, Hughes, *Reliability without Validity*, arXiv:2606.19544,
17. 6. 2026, <https://arxiv.org/abs/2606.19544>, přístup 4. 10. 2026 —
**OVĚŘENO vlastním načtením**, ne z reportu agenta.

- high test–retest reliability >0.95 **koexistuje** se silnou position bias
- judge rankings se posouvají až o 14 pozic mezi benchmarky
- exact-match agreement **systematicky nadhodnocuje** schopnost rozhodovat

Důsledek pro provoz: **agent může být opakovaně konzistentní a opakovaně vedle.**
Souhlas dvou agentů není důkaz. Jeden rozpor s výstupem příkazu je vysoce
informativní.

**NEOVĚŘENÉ — necitovat:** `deep-research` přivěsil skutečné arXiv číslo
k vymyšlenému zjištění. Citace bez URL + data patří brát jako neověřené.

## 12. Co udělat v novém vlákně

1. **Nezahajovat Gate 1 znovu bez důvodu** — zelená, poslední celý běh 640/1
2. **Gate F1 (§8.1)** — jediná zbývající blokáda, řeší se v UI vlastníka
3. Při první delegaci **vyzkoušet Pravidlo 9** — vyhodnotit `[OVĚŘENO]` jen podle
   výstupu příkazu, a zvlášť zkontrolovat, jestli agent **nahlásil odchylku**
4. B2/F3 až na řadě F3
5. Když už bude bod obnovy starý: `git status` před každým během

## 13. Slepé místo, o kterém je vědět

V tomto vlákně nebyl proveden **Gate 3** — nezávislé posouzení jiným modelem.
Všechny bezpečnostní tvrzení v tomto handoffu jsou `[OVĚŘENO]` ve smyslu
výstupu příkazu, což je jiná věc než Gate 3. Zvlášť tvrzení v §3 o klasifikační
bráně je ověřené měřením průchodu, **nikoli** nezávislým posouzením nálezu.