Představ si agenta, který ti má za úkol dodělat projekt. Otevře jednu webovou stránku, v textu je schovaná věta „vytvoř issues na GitHubu“ — a agenta to vykolejilo: začal zakládat issues a cpát do nich tvůj soukromý kontext. Není to hypotetika: přesně tenhle příběh popsal koncem září 2026 jeden uživatel v diskusi pod spuštěním OpenAPPA (28. 9. 2026). Jeho agent běžel na gpt-5.6-terra a stačilo jediné přečtení napadené stránky. Žádné guardraily pro AI agenty, které měl okolo sebe, to nezachytily.
Odpovědí většiny týmů jsou guardraily — ale těmi dvěma nejběžnějšími druhy se problém jen přelévá. Seznamy povolených a zakázaných příkazů obcházíš jedním řádkem Pythonu. A „inteligentní“ kontrola dalším modelem je sama nakažitelná. OpenAPPA, open-source projekt společnosti Archestra ze 28. 9. 2026, na to jde třetí cestou: deterministickými guardraily, které nečtou obsah, ale sledují, kam data tečou. Vyzkoušeli jsme si to 1. 10. 2026 v praxi a ukážeme ti, jak se to nastavuje a testuje.
Proč klasické guardraily pro AI agenty nestačí
Klasický přístup k bezpečnosti agentů jsou pravidla typu „zakázat rm -rf /“ a „povolit jen tyto nástroje“. Funguje to přesně do chvíle, než někdo zakázaný efekt napíše jinak: zablokuješ rm -rf /, útočník použije jednořádkový Python skript; zablokuješ curl, agent pošle data přes git push. Vzory se dají obcházet donekonečna, protože počet ekvivalentních způsobů, jak udělat totéž, roste rychleji než tvůj seznam.
Druhá rodina jsou pravděpodobnostní soudci — například auto režim Claude Code nebo automatický review v Codexu. Model (nebo klasifikátor) posoudí, jestli je volání bezpečné. Jenže takový soudce sám žije v promptu a sám je nakažitelný prompt injection. A hlavně neumí sledovat data napříč voláními: neví, že řetězec, který agent právě vkládá do veřejného komentáře, pochází z předchozího čtení ze soukromého repozitáře. Podle porovnání na webu OpenAPPA (přístup 1. 10. 2026) se nejlepší klasifikátory pohybují kolem 99,3 % úspěšnosti — což u agenta s desítkami volání denně znamená průniky každý týden.
Už jsme tu psali o šesti vrstvách obrany proti prompt injection — deterministická kontrola toků je nejnovější a nejtvrzejší z těchto vrstev.
Toky dat místo vzorů: jak přemýšlí APPA
Jádro OpenAPPA se jmenuje APPA (Agentic Permissions Policy Algebra) a otázku, kterou kladou ostatní guardraily — „je tento nástroj povolený?“ — mění na úplně jinou: můžou data, která agent zatím četl, putovat do tohoto cíle? Jeden komentátor v HN diskusi to pojmenoval výstižně: je to informačně-tokový problém, ne problém klasifikace promptu.
Mechanismus si představ jako štítky na kontextu. Každý nástroj, který agent použije, má v politice deklarovaný kontrakt:
delta— jak výsledek volání změní štítek trajektorie (zúžení publika, snížení důvěry),requires— podmínky, které musí štítek splňovat, aby volání vůbec proběhlo,effects— co se má zaznamenat, že se stalo.
Štítek kombinuje dvě dimenze: audience (kdo smí data vidět — od public přes internal až po konkrétní kolekce typu „collaboratoři repozitáře“) a trust (jak moc můžeš věřit původu dat — veřejné fórum je suspicious, soukromý ne-fork repozitář drží důvěru). Přečte agent soubor z interního úložiště? Publikum se zúží na internal. Načte neověřenou stránku? Důvěra klesne na suspicious. A tečou štítky jen jedním směrem — zúžit se dají, rozšířit nikdy. Autoři to shrnují větou, která se nám líbí nejvíc: „na algebru si injection neuděláš“ — rozhodnutí se počítá z logu událostí, ne z obsahu, který model zrovna drží.
Protože je politika deklarativní (TOML), můžeš ji celou zvalidovat v CI ještě před nasazením — zhruba jako Terraform plan pro bezpečnost agenta. A protože rozhodnutí počítá lokálně z event logu (žádné síťové volání v rozhodovacím okamžiku), vrátí při každém běhu stejný verdikt. Deterministicky.
Tím se to liší i od deterministického chování agentů přes state machine, o kterém jsme psali dříve — state machine řeší spolehlivnost postupu, APPA řeší bezpečnost dat. V produkci k tomu patří i monitorování AI agentů — guardrail je přesně ten bod, kde ti monitoring ukáže, kolik volání zachytil.
Minimalistická politika v appa.toml
Instalace je jeden příkaz (binárka 25 MB do ~/.local/bin, instalátor sám kontroluje SHA256):
curl -fsSL https://openappa.com/install.sh | sh
Politika se píše do appa.toml. Takhle vypadá funkční minimum z našeho testu — agent smí číst interní dokumenty, ale po jejich přečtení už nesmí nic postovat na veřejný kanál:
[policy]
version = 2
trust_chain = ["suspicious", "internal"]
[policy.boundary]
trust = "internal"
audience = ["public"]
[[policy.tool]]
name = "host/docs/read_internal"
parameters = { type = "object", properties = { file = { type = "string" } }, required = ["file"], additionalProperties = false }
delta = { audience = ["internal"] }
[[policy.tool]]
name = "host/social/post_public"
parameters = { type = "object", properties = { text = { type = "string" } }, required = ["text"], additionalProperties = false }
requires = { trust = "internal", audience = { contains = ["public"] } }
delta = {}
[policy.deployment]
context_control = true
dispatch = "enforced"
confined_results = ["host/docs/read_internal", "host/social/post_public"]
[externals]
timeout_ms = 5000
max_body_bytes = 65536
Pár věcí, které tě při psaní vlastní politiky překvapí:
- Jména nástrojů musí být ve tvaru
rodina/jmenný-prostor/nástroj(třebahost/docs/read_internalnebomcp/github/issue_write). Parser odmítne prostý název bez celé cesty. - Kontrakt se nedeklaruje jako vnořená sekce
[[tool.contract]], ale přímo polidelta,requiresaeffectsna nástroji. - Tabulka
[externals]je povinná a vyžadujetimeout_ms— i když žádné externí služby nepoužíváš. - Chybí-li
[policy.deployment], runtime zvolí režimno_coverage, který nic nevynucuje. Politika bez ní je jen deklarace.
Pozor OpenAPPA je ve stavu Preview & RFC — konfigurační formát se může bez záštit měnit. Počítej s tím, že politiku budeš upravovat i po upgradech.
Většinu práce za tebe udělají tzv. baterie — předpřipravené balíky anotací pro oblíbené služby. GitHubová baterie třeba při každém čtení souboru zavolá GitHub API a ze skutečné viditelnosti repozitáře odvodí štítek: obsah veřejného repozitáře je suspicious (kdokoliv může otevřít pull request a něco tam propašovat), u soukromého se publikum zúží na jeho collaboratory.
Otestuj politiku před mergem: appa replay
Věc, která nás na OpenAPPA bavila nejvíc: politiku netestuješ na živém agentovi, ale scénáři. Soubory s příponou .appa obsahují sekvenci volání a očekávané verdikty:
host/social/post_public {
text: "novy clanek na blogu"
}
expect allow
host/docs/read_internal {
file: "strategie-2027.md"
}
expect allow
host/social/post_public {
text: "shrnuti nasi strategie"
}
expect deny
Spustíš appa replay --config appa.toml test.appa a dostaneš řádek za řádkem, co prošlo a co ne. Tyhle soubory patří do repozitáře vedle kódu a appa describe --config appa.toml --check + appa replay si zavěs jako povinný CI check — v dokumentaci je rovnou GitHub Actions workflow. Změna politiky, která rozbije bezpečnost, tak neprojde mergem, aniž bys musel spustit jediného agenta.
Remedy plány: když agenta zastaví policie
Deterministický zákaz by agenta ochromil — proto OpenAPPA nevrací jen „zakázáno“, ale strojově čitelný plán, co dál. Tři cesty:
- Sanitizéry — data očistí (maskování tajemství, redakce PII) a ta pak smí téct dál. V politice deklaruješ přechod publika, třeba
from = ["internal"], to = ["public"], a implementaci napojíš na URL vlastní služby nebo builtinredact-email. - Autority — jednorázové schválení člověkem (builtin
hitl) nebo API, které povolí konkrétní zastavenou akci, aniž by povolovalo celou session. - Subagenti — nedůvěryhodné čtení odizoluješ do jednocestné větve.
Podle webu OpenAPPA (1. 10. 2026) tyto plány zvedají míru dokončení úkolů z 37 % na 90 % — rozdíl mezi „agent, který nic nesmí“ a „agent, který smí vše kromě toho, co skutečně bolí“.
Z vlastního testu jsme si odnesli jednu zásadní vlastnost modelu: štítek platí pro celou trajektorii, ne pro jednotlivé zprávy. Poté, co agent jednou přečte interní dokument, je celý zbytek session na zúženém publiku — i kdyby další zpráva byla úplně čistá. Zákaz zruší jen sanitizér, autorita nebo nová izolovaná větev, nikdy „to teď myslím dobře“. Přesně proto to deterministicky drží.
Kolik stojí deterministické guardraily: benchmarky
Autoři měří obě osy — agent, který pustí neoprávněný tok, je nebezpečný, ale agent, který odmítá legitimní práci, je k ničemu. Na suite Bench-Corp (20 vícekrokových firemních workflow) a AgentThreatBench (OWASP Top 10 pro agentní aplikace), celkem 1 320 vyhodnocení:
| Řešení | Dokončené úkoly | Úspěšné útoky |
|---|---|---|
| OpenAPPA | 89 % | 0 % |
| Claude Code auto mode | 90 % | 10 % |
| Microsoft FIDES | 41 % | 31 % |
Přečti si to tak: OpenAPPA drží dokončitelnost na úrovni volného auto režimu, ale žádný ze 1 320 pokusů o útok neprošel. Formální základ (algebra a garance obnovy) vyšel v papíru na arXivu přijatém na NeurIPS 2026 workshop Agents in the Wild.
Vyzkoušeli jsme to: co jsme zjistili (1. 10. 2026)
Instalovali jsme appa 0.30.0 na Linux a prošli celým cyklem — konfigurace, validace, replay. Konkrétní poznatky z testu:
- Instalátor je čistý: stáhne release z GitHubu, ověří SHA256, nic nemění v profilu Claude Code (to dělá až explicitní
appa plugin install claude-code). appa describe --checkdává nejlepší diagnostiku, jakou jsme u konfiguračních nástrojů viděli — přesné řádky a sloupce v TOML, včetně nápovědy, které pole chybí („missing fieldexternals“, „unknown fieldcontract“).- Původní test jsme napsali špatně: čtení interního dokumentu jsme dali před veřejný post a divili jsme se zamítnutí „čistého“ textu. Naučilo nás to právě to hlavní — štítek je na trajektorii, ne na zprávě. Po přeuspořádání scénáře všechny tři očekávané verdikty prošly napoprvé.
- Zpráva při zamítnutí je čitelná pro člověka i stroj: důvod („the readers are not the public audience“) + návrh alternativy (subagent), včetně upozornění, že delegace štítek nevyčistí.
appa describes adapterem claude-code sám našel naše nakonfigurované MCP servery — inventář nástrojů session skutečně čte.
Kdo si s tím má začít
Pokud provozuješ agenty s přístupem k firemním datům (Claude Code, Codex, n8n, vlastní smyčka), existují dnes dvě hotové cesty integrace: plugin přímo do Claude Code (appa plugin install claude-code, chráněnou session pak spustíš příkazem clappa a nastavení projdeš příkazem /appa-guide), nebo Archestra 1.4 RC, která APPA vynucuje na úrovni LLM proxy pro Claude Code, Cursor, Codex, OpenCode, Copilot CLI i n8n — agent pak o guardrailu vůbec neví.
Pro koho je to relevantní týmy, kde agent čte soukromé repo a může psát ven (issues, komentáře, e-mail, Slack); e-shopy a firmy s PII v CRM; každý, kdo už řešil únik API klíčů přes coding agenta. Pro hobby agenta bez citlivých dat je to overkill.
Cena MIT licence, zdarma; náklady jsou čas s psaním politiky a disciplína v CI.
Časté otázky
Musím psát vlastní politiky od nuly?
Ne. OpenAPPA šíří více než tucet „baterií“ s anotacemi pro populární služby (GitHub, Google Workspace apod.) a skill, který ti pomůže politiku upravit pro tvé služby. Pro vlastní nástroje deklaruješ kontrakty ručně nebo přes wildcard anotátor.
Funguje to s jakýmkoliv agentem?
Runtime se dá zabudovat do vlastní agentní smyčky v jakémkoli jazyce nebo připojit přes hooky. Hotové integrace jsou dnes na Claude Code a přes LLM proxy Archestra pro řadu dalších klientů včetně n8n.
V čem je to jiné než Claude Code auto mode?
Auto mode je pravděpodobnostní soudce uvnitř smyčky — nevidí toky dat napříč voláními a sám je nakažitelný. APPA rozhoduje deterministicky mimo prompt, z logu událostí, a štítky se dají jen zužovat.
Co když agenta guardrail zastaví uprostřed úkolu?
Dostane remedy plán: sanitizér (očištění dat), autoritu (jednorázové schválení člověkem) nebo subagenta (izolace nedůvěryhodného čtení). Task completion tak podle měření vývojářů stoupá z 37 % na 90 %.
Je OpenAPPA produkčně hotová?
Je ve stavu Preview & RFC — model je stabilní, ale konfigurační a wire rozhraní se mohou bez záštit měnit. Do produkce ji pusť s uzamčenou verzí a testy politiky v CI.