---
status: active
project: CyberBrain26-v4
last_updated: 2026-11-03
version: v3
owner: implementer
parent_plan: .kilo/plans/CyberBrain26cil-031026-v2.md
---

# Implementační plán v3 — R3 validace, Gate 2, Gate 3

## Cíl

Dokončit F2 fázi (minimal complete agent flow) tím, že se ověří R3 proxy server, spustí Gate 2 a vyřeší blokaci Gate 3.

## Současný stav (ověřeno)

| Položka | Stav | Důkaz |
|---------|------|-------|
| R1 Embedding API | DOKONČENO | `embedding_service.py:35,55` |
| R2 Test izolace | DOKONČENO | `tests/conftest.py` |
| R3 llama.cpp server (port 8080) | DOKONČENO (proxy) | `llama_cpp_server_proxy.py` běží na portu 8080 |
| R4 Customer discovery | DOKONČENO | 23 zdrojů, 4 segmenty |
| R5 Audit chain HMAC | DOKONČENO | `chain.py` — `compute_event_hash()` HMAC-SHA256 |
| Gate 1 | ZELENÁ | 747 passed, ruff clean, mypy clean |
| Gate 2 | NEJSPUŠTĚN | Připraveno po R3 nasazení |
| Gate 3 | BLOKOVÁNO | `gate3-auditor` typ není v Task toolu |

## R3 proxy server — soubor

`/home/oem/CyberBrain26-v4/llama_cpp_server_proxy.py` (256 řádků)

- Rychlost: naslouchá na portu 8080, proxyuje na Ollama (port 11434)
- Model primární: `phi3.5:latest`, fallback: `dolphin-cb26:latest`
- Endpointy: `GET /`, `GET /api/tokenize`, `POST /api/chat`, `POST /api/completion`, `POST /api/embeddings`, `POST /api/tokenize`, `POST /api/detokenize`
- Otestováno: `GET /` vrací JSON, `POST /api/chat` vrací "Hello" z phi3.5

## Úkoly k implementaci (v pořadí)

### 1. R3 proxy server validace (před Gate 2)

Ověřit všechny endpointy proxy serveru proti `LlamaCppClient` očekávanému formátu:

- [ ] `GET /` — server info vrátí platný JSON
- [ ] `GET /api/tokenize` — vrátí seznam modelů z Ollama
- [ ] `POST /api/chat` — ne-stream odpověď ve formátu `{"choices": [{"message": {"content": str}}]}`
- [ ] `POST /api/completion` — ne-stream odpověď ve formátu `{"choices": [{"text": str}]}`
- [ ] `POST /api/embeddings` — vrátí `{"embeddings": [[float]]}`
- [ ] `POST /api/tokenize` — vrátí `{"tokens": [int]}`
- [ ] `POST /api/detokenize` — vrátí `{"text": str}`
- [ ] Stream chat — SSE pole s klíči `model`, `content`, `done`
- [ ] Stream completion — SSE pole s klíči `model`, `text`, `done`

**Výstup:** Receipt seznam souborů s `file:line` a výsledek každého testu.

### 2. Gate 2 — post-Change verifikace

Spustit po potvrzení R3 validace:

- [ ] `pytest -q` — všechny testy musí projít (747 passed)
- [ ] `ruff check` — bez chyb
- [ ] `mypy src/cyberbrain26` — bez chyb (87 souborů)
- [ ] Diff R3 souborů vs. předchozí stav — změny jen v `llama_cpp_server_proxy.py`
- [ ] Coverage ≥ 60% (branch=true, fail_under=60)

**Výstup:** Jeden příkaz ověřující všechny body (např. `git status --porcelain` + `pytest -q` + `ruff check` + `mypy src/cyberbrain26`).

### 3. Gate 3 — nezávislá verifikace

Aktuální blokace: `gate3-auditor` typ není dostupný v Task toolu (bash: deny i přes frontmatter allow).

- [ ] Vyřešit `gate3-auditor` typ — buď přidat do Task toolu, nebo použít alternativní agenta s `bash: allow` pro výběrový pytest běh
- [ ] Spustit nezávislý pytest běh s jiným modelem (`dolphin-cb26:latest` místo `phi3.5:latest`)
- [ ] LLM-as-judge s jiným modelem než při vývoji

**Výstup:** Výsledek Gate 3 jako `provedena` nebo `ne` s odůvodněním.

### 4. Plný llama.cpp server (budoucí, když budou GGUF stahování dostupná)

Aktuální proxy je funkční ekvivalent, ale není nativní llama-server.

- [ ] Získat GGUF model soubor (Hugging Face 401, ModelScope 404 — blokováno)
- [ ] Nainstalovat `llama-cpp-bin` nebo postavit llama.cpp ze zdrojáků
- [ ] Spustit `llama-server` na portu 8080 s GGUF modelem
- [ ] Nahradit proxy server nativním serverem

**Stav:** [HYPOTÉZA] — závisí na externí dostupnosti modelových souborů.

### 5. R5 audit chain — vyčištění zbytků

AGENTS.md uvádí zbývající reference na `compute_link` na ř. 203, 403 v `test_audit_chain.py`. Grep nyní vrací 0 — možná již vyčištěno.

- [ ] Potvrdit, že `test_audit_chain.py` neobsahuje reference na `compute_link` / `link_for_record`
- [ ] Pokud ano, odstranit nebo aktualizovat testy

## Závislosti mezi úkoly

1. R3 validace → Gate 2 (musí být před spuštěním Gate 2)
2. Gate 2 → Gate 3 (Gate 3 nikdy jako první brána)
3. Gate 3 vyžaduje vyřešení `gate3-auditor` typu před spuštěním

## Rizika

| Riziko | Původ | Mitigace |
|--------|-------|----------|
| Proxy není nativní llama-server | GGUF stahování blokováno | Dokumentováno jako funkční ekvivalent v plánu v2 |
| Gate 3 nespustitelný | `gate3-auditor` typ chybí | Vyřešit typ agenta nebo použít alternativu |
| R5 testy reference na `compute_link` | Možná zbývají v `test_audit_chain.py` | Ověřit přes grep, případně vyčistit |
| Síťová připojení (model download) | Blokováno 401/404 | Používá se Ollama na portu 11434, žádné nové stahování |

## Receipt kontrola (Pravidlo 7)

Každý report o změně musí nést receipt: seznam souborů s `file:line` a co tam je.
Ověření jedním příkazem musí potvrdit všechny body.

## Otevřená rozhodnutí (potřebuje vlastníka)

1. **Gate 3 agent typ:** Použít `gate3-auditor` (pokud bude přidán) nebo alternativu s `bash: allow`?
2. **Nativní llama-server:** Pokusit se znovu o GGUF stahování nebo ponechat proxy trvale?
3. **R5 testy:** Vyčistit zbývající reference na `compute_link` v `test_audit_chain.py`?

---

## Předpoklady pro spuštění

- Ollama běží na portu 11434 (ověřeno, port otevřen)
- `llama_cpp_server_proxy.py` běží na portu 8080 (ověřeno, `GET /` odpovídá)
- Všechny dépendencie nainstalovány (fastapi, uvicorn, httpx, starlette-context)

## Výstup plánu

Po implementaci všech úkolů: aktualizovat `.kilo/plans/CyberBrain26cil-031026-v2.md` se stavem každé brány a uvést receipt souborů.
