Menu
Přihlásit
Článek Automatizace

Deterministické guardraily pro AI agenty: OpenAPPA v praxi

Deterministické guardraily pro AI agenty řeší prompt injection jinak: OpenAPPA sleduje toky dat, ne vzory. Návod na nastavení a test v CI z praxe.

Aktualizováno 9 min čtení 9 sekcí

Obsah článku 9 sekcí

V kostce

  • OpenAPPA je open-source deterministický guardrail pro AI agenty: sleduje toky dat, ne vzory, a rozhoduje vždy stejně.
  • V benchmarku 1 320 vyhodnocení: 89 % dokončených úkolů a 0 % úspěšných útoků; Claude Code auto mode pustil 10 % útoků.
  • Politika se píše deklarativně v appa.toml a testuje se v CI pomocí appa replay, bez spuštění agenta.
  • Po přečtení interního dokumentu se zúží audience celé session; zpět ji dostaneš jen sanitizérem, autoritou nebo subagentem.
Deterministické guardraily pro AI agenty: OpenAPPA v praxi - ilustrační obrázek

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řeba host/docs/read_internal nebo mcp/github/issue_write). Parser odmítne prostý název bez celé cesty.
  • Kontrakt se nedeklaruje jako vnořená sekce [[tool.contract]], ale přímo poli delta, requires a effects na nástroji.
  • Tabulka [externals] je povinná a vyžaduje timeout_ms — i když žádné externí služby nepoužíváš.
  • Chybí-li [policy.deployment], runtime zvolí režim no_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 builtin redact-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 --check dá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 field externals“, „unknown field contract“).
  • 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 describe s 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.

Pokračuj dál

Všechny články →