Ë
   ëlÒ.u©Äã                  ó  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZddlZ ee«      j                  «       j                   d   Zedz  Zedz  Zedz  Zh d	£Zd
Zh d£ZdGd„ZefdHd„ZdId„ZdHd„ZdHd„ZdJd„ZdKd„ZdLd„ZdMd„Z dId„Z!dId„Z"dNd„Z#dOd„Z$d„ Z%d„ Z&d„ Z' e«       D � cg c]   }  ejP                  | | jR                  ¬«      ‘Œ" c} Z*d„ Z+d„ Z,ejZ                  j]                  d e*«      d!„ «       Z/d"„ Z0d#„ Z1d$„ Z2ejZ                  j]                  de«      d%„ «       Z3d&„ Z4d'„ Z5d(„ Z6d)„ Z7d*„ Z8d+„ Z9 e:h d,£«      Z; e:h d-£«      Z< ejP                  dd.¬«      g e«       D � cg c]   }  ejP                  | | jR                  ¬«      ‘Œ" c} z   Z=ejZ                  j]                  d e=«      d/„ «       Z>d0„ Z?d1„ Z@ e:h d2£«      ZAd3„ ZBd4„ ZCd5„ ZDdd6hd7œZEd8„ ZFd9„ ZGd:„ ZHd;„ ZId<„ ZJd=„ ZKd>„ ZLd?„ ZMd@„ ZNdAdBdBdBdBdCdBidDœZOdE„ ZPdF„ ZQyc c} w c c} w )Puˆ  Gate 0 policy-test pro `.kilo/` konfiguraci (F1).

CÃ­l: dokÃ¡zat deterministickÃ½m testem, Å¾e bezpeÄ�nostnÃ­ hranice deklarovanÃ¡
v `.kilo/kilo.jsonc` a `.kilo/agent/*.md` nelze obejÃ­t korektnÃ­ konfiguracÃ­ â€”
stejnÄ› jako se testuje kÃ³d.

Tento soubor je zcela samostatnÃ½:
  * importuje POUZE stdlib + `yaml` + `pytest`,
  * NEimportuje nic z `src/cyberbrain26` (pravidlo zadÃ¡nÃ­),
  * Ä�te pouze soubory v `.kilo/`, nic do repozitÃ¡Å™e nezapisuje.

Odkazy: D1â€”D10, ROADMAP_V6.md Â§14 (invarianty 1, 2, 3, 5, 6, 12),
`.kilo/context/LESSONS_AND_DECISIONS.md` Â§1 V2 (predikÃ¡t, kterÃ½ zruÅ¡Ã­ test
tÃ­m, Å¾e pak vypadÃ¡ jako bÄ›Å¾Ã­cÃ­).
é    )ÚannotationsN)ÚPathé   z.kiloz
kilo.jsoncÚagent>   ÚallÚprimaryÚsubagent)ÚbashÚexternal_directoryÚagent_managerÚ	doom_loop>   ÚtesterÚ
documenterÚimplementerúcode-reviewerúdeep-researchúthreat-modelerúsecurity-auditorúpricing-researcherc                óì  — g }d}d}| j                  «       D ]Ë  }g }d}|t        |«      k  r—||   }|r+|j                  |«       |rd}n|dk(  rd}n|dk(  rd}|dz  }Œ@|dk(  rd}|j                  |«       |dz  }Œ^|dk(  r|dz   t        |«      k  r||dz      dk(  rn%|j                  |«       |dz  }|t        |«      k  rŒ—|j                  dj                  |«      «       ŒÍ d	j                  |«      S )
uä  OdstranÃ­ `//` komentÃ¡Å™e z JSONC textu.

    Scanner jde po Å™Ã¡dcÃ­ch a pÅ™eskoÄ�uje `//` mimo Å™etÄ›zce.

    ZNÃ�MÃ� MEZERA: scanner neumÃ­ `//` uvnitÅ™ Å™etÄ›zce â€” pokud by hodnota
    obsahovala URL typu `"https://..."`, pokusil by se to oznaÄ�it za komentÃ¡Å™.
    Pro `.kilo/kilo.jsonc` to nevadÃ­ (Å¾Ã¡dnÃ¡ hodnota neobsahuje `//`),
    ale je to znÃ¡mÃ¡ mezera tohoto pÅ™Ã­stupu, kterou je nutnÃ© mÃ­t na pamÄ›ti,
    pokud by schÃ©ma konfigurace rozÅ¡Ã­Å™ilo o URL.
    Fr   ú\Tú"r   ú/Ú ú
)Ú
splitlinesÚlenÚappendÚjoin)ÚtextÚoutÚ	in_stringÚescapedÚlineÚresultÚiÚchs           ú>/home/oem/CyberBrain26-unified/tests/test_kilo_agent_policy.pyÚ_strip_jsonc_commentsr)   3   s  € ð €CØ€IØ€Gà—‘Ó!ò $ˆØˆØˆØ”#�d“)ŠmØ�a‘ˆBÙØ—‘˜bÔ!ÙØ#‘GØ˜4’ZØ"‘GØ˜3’YØ %�IØ�Q‘�ØØ�SŠyØ �	Ø—‘˜bÔ!Ø�Q‘�ØØ�SŠy˜Q ™U¤S¨£YÒ.°4¸¸A¹±;À#Ò3EØØ�M‰M˜"ÔØ�‰FˆAð) ”#�d“)‹mð* 	�
‰
�2—7‘7˜6“?Õ#ð1$ð4 �9‰9�S‹>Ðó    c                ób   — | j                  d¬«      }t        j                  t        |«      «      S )Núutf-8©Úencoding)Ú	read_textÚjsonÚloadsr)   )ÚpathÚraws     r(   Ú_load_globalr4   _   s'   € Ø
�.‰. 'ˆ.Ó
*€CÜ�:‰:Ô+¨CÓ0Ó1Ð1r*   c                 óx   — t         j                  «       sg S t        d„ t         j                  d«      D «       «      S )Nc              3  ó    K  — | ]  }|–— Œ y ­w©N© ©Ú.0Úps     r(   ú	<genexpr>z_agent_files.<locals>.<genexpr>g   s   è ø€ Ò4˜”!Ñ4ùs   ‚z*.md)Ú	AGENT_DIRÚis_dirÚsortedÚglobr8   r*   r(   Ú_agent_filesrA   d   s-   € Ü×ÑÔØˆ	ÜÑ4œYŸ^™^¨FÓ3Ô4Ó4Ð4r*   c                ó~  — | j                  d¬«      }|j                  d«      si S |j                  dd«      }t        |«      dk  ri S 	 t	        j
                  |d   «      }t        |t        «      r|S i S # t        j                  $ r4}t        | j                  › dt        |«      j                  › d�«      |‚d	}~ww xY w)
u�   NaÄ�te YAML frontmatter z `.md` agenta.

    VracÃ­ `{}` pokud frontmatter chybÃ­ â€” volajÃ­cÃ­ test to povaÅ¾uje za chybu.
    r,   r-   ú---é   é   r   u,   : YAML frontmatter se nepodaÅ™ilo parsovat (uY   ). NekorektnÃ­ YAML zniÄ�Ã­ soubor â€” viz .kilo/context/LESSONS_AND_DECISIONS.md Â§1 V1.N)r/   Ú
startswithÚsplitr   ÚyamlÚ	safe_loadÚ	YAMLErrorÚRuntimeErrorÚnameÚtypeÚ__name__Ú
isinstanceÚdict)r2   r    ÚpartsÚmetaÚes        r(   Ú_load_agentrT   j   sÂ   € ð
 �>‰> 7ˆ>Ó+€DØ�?‰?˜5Ô!Øˆ	Ø�J‰J�u˜aÓ €EÜ
ˆ5ƒz�A‚~Øˆ	ðÜ�~‰~˜e A™hÓ'ˆô ˜d¤DÔ)ˆ4Ð1¨rÐ1øô �>‰>ò ÜØ�y‰yˆkÐEÄdÈ1Ãg×FVÑFVÐEWð Xeð eó
ð ð	ûðús   Á	A5 Á5B<Â/B7Â7B<c                ó>   — t        | «      j                  d«      xs i S ©NÚ
permission)rT   Úget)r2   s    r(   Ú_agent_permissionrY      s   € Ü�tÓ× Ñ  Ó.Ò4°"Ð4r*   c                 ó<   — t        «       j                  d«      xs i S rV   )r4   rX   r8   r*   r(   Ú_global_permissionr[   ƒ   s   € Ü‹>×Ñ˜lÓ+Ò1¨rÐ1r*   Útoolc                ón   — |j                  | «      }t        |t        «      rd|vrn| |v r|S | |v r||    S y)uç   EfektivnÃ­ hodnota oprÃ¡vnÄ›nÃ­ nÃ¡stroje (model Kilo merge).

    Hodnota agenta mÃ¡ pÅ™ednost; chybÃ­-li klÃ­Ä� v agentovi, zdÄ›dÃ­ se globÃ¡lnÃ­
    hodnota; chybÃ­-li v obou, vrÃ¡tÃ­ se `None` = nic nenÃ­ nastaveno (fail).
    Ú*N)rX   rO   rP   )r\   Úagent_permissionÚglobal_permissionÚvalues       r(   Ú_resolverb   ‡   sO   € ð × Ñ  Ó&€EÜ�%œÔ 3¨eÑ#3ð 	Ø	Ð!Ñ	!ØˆØÐ Ñ Ø  Ñ&Ð&Ør*   c                ó¾   — g }t        | ||«      }|dk(  r|j                  | › d�«       |dk7  r|j                  | › d|›d�«       | |vr|j                  | › d�«       |S )uŽ   KontrolnÃ­ logika pro meta-testy (G) â€” musÃ­ bÃ½t schopna selhat.

    VracÃ­ seznam poruÅ¡enÃ­. PrÃ¡zdnÃ½ seznam = pravidlo dodrÅ¾eno.
    Úallowz: resolved value is 'allow'Údenyz: resolved value is z, expected 'deny'z+: not explicitly denied in agent permission)rb   r   )r\   Ú
agent_permÚglobal_permÚfoundÚresolveds        r(   Ú_violationsrj   ™   sw   € ð
 €EÜ˜˜j¨+Ó6€HØ�7ÒØ�‰˜�vÐ8Ð9Ô:Ø�6ÒØ�‰˜�vÐ1°(°Ð=NÐOÔPØ�:ÑØ�‰˜�vÐHÐIÔJØ€Lr*   c                ó¬   — | dz  }|j                  dd¬«       ||› d�z  }t        j                  d||dœdd¬«      }|j                  d|› d	�d
¬«       |S )Nr   T)ÚparentsÚexist_okú.mdzFAKE agent pro meta-test)ÚdescriptionÚmoderW   )Ú	sort_keysÚallow_unicodez---
z---

# fake
r,   r-   )ÚmkdirrH   Ú	safe_dumpÚ
write_text)ÚrootrL   rp   rW   Ú	agent_dirÚmdÚfronts          r(   Ú_write_fake_agentrz   ©   sj   € Ø�w‘€IØ‡O�O˜D¨4€OÔ0Ø	˜�v˜S�\Ñ	!€BÜ�N‰NØ2¸DÐPZÑ[ØØô€Eð
 ‡M�M�E˜%˜ Ð0¸7€MÔCØ€Ir*   c                 ó"  — t        «       } | s‚t        j                  t        › d�«      dz   ddt	        j
                  «       v st        j                  | «      rt        j                  | «      ndiz  }t        t        j                  |«      «      ‚| S )u  Seznam `.md` agentÅ¯, nebo HRUBÃ� FAIL, kdyÅ¾ je prÃ¡zdnÃ½.

    Nahrazuje pÅ™Ã­mÃ© `_agent_files()` ve vÅ¡ech smyÄ�kÃ¡ch, u nichÅ¾ je uvnitÅ™
    `assert`. SmyÄ�ka nad prÃ¡zdnou kolekcÃ­ totiÅ¾ neprovede Å¾Ã¡dnÃ½ assert, a
    pytest to v reportu vypÃ­Å¡e jako PASSED.
    u¼    neobsahuje Å¾Ã¡dnÃ½ '*.md' â€” smyÄ�ka by neproÅ¡la ani jednou iteracÃ­, Å¾Ã¡dnÃ½ assert by se nevykonal a test by vypadal jako zelenÃ½ (viz .kilo/context/LESSONS_AND_DECISIONS.md Â§1 V2)ú
>assert %(py0)sÚpy0Úfiles)
rA   Ú
@pytest_arÚ_format_assertmsgr=   Ú@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r~   Ú@py_format1s     r(   Ú_require_agent_filesrˆ   ¿   s’   € ô ‹N€EÙô ?÷ .?Ñ->ô ˆ+ð >ð 	>÷?õ ?÷ 9?¹÷?ò ?÷ '?Ñ&>ð ÷ ?ñ ?÷ 6?±Yð ÷ ?÷ ?ó ?÷ ,?Ñ+>÷?ñ ?ð €Lr*   c                 óx   — t        «       D � cg c]"  } t        | «      j                  d«      dk(  sŒ!| ‘Œ$ c} S c c} w )uC   Agenti s `mode: primary`, odvozeno z adresÃ¡Å™e (nikoli hardcoded).rp   r   )rA   rT   rX   ©r;   s    r(   Ú_primary_agent_filesr‹   Î   s.   € ä#“~ÖQ�!¬°Q«×);Ñ);¸FÓ)CÀyÓ)PŠAÒQÐQùÒQs   �"7°7c                ó¶   — | j                  d«      }t        |t        «      s
t        «       S |j	                  «       D ��ch c]  \  }}|dk(  sŒ|’Œ c}}S c c}}w )uÅ   KlÃ­Ä�e `task` s hodnotou `"allow"` â€” VÄŒETNÄš wildcardu `"*"`.

    ZÃ¡mÄ›rnÄ› NIC nefiltruje, aby kontrola mohla wildcard odhalit. FiltrujÃ­cÃ­
    varianta je `_named_delegation_targets`.
    Útaskrd   )rX   rO   rP   ÚsetÚitems)rW   r�   ÚkÚvs       r(   Ú_task_allow_targetsr’   Ó   sG   € ð �>‰>˜&Ó!€DÜ�dœDÔ!Ü‹uˆØŸ*™*›,×7‘$�!�Q¨!¨w«,ŠAÓ7Ð7ùÓ7s   ¿AÁAc                óH  — t        | «      }|dhz
  }|sŽt        j                  |› d|rt        |«      nd› d�«      dz   ddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚|S )ui  CÃ­le delegace POJMENOVANÃ‰; wildcard je vyÅ™azen a PRÃ�ZDNÃ� MNOÅ½INA JE FAIL.

    [V2] Wildcard `{"*": "allow"}` nenÃ­ allowlist. Test, kterÃ½ pÃ­Å¡e
    `k != "*"` a pak iteruje, nevykonÃ¡ ani jedno tvrzenÃ­ a projde. Tento
    helper pÅ™esouvÃ¡ ten predikÃ¡t na jedno mÃ­sto a vynucuje si NEPRÃ�ZDNÃ�
    seznam jmen, aby kontrola mÄ›la co ovÄ›Å™ovat.
    r^   u9   : Å¾Ã¡dnÃ½ POJMENOVANÃ� cÃ­l delegace (v `task` nalezeno Únicu  ). Wildcard '"*"' nenÃ­ allowlist â€” predikÃ¡t `k != "*"` zruÅ¡Ã­ kaÅ¾dou smyÄ�ku nad jmÃ©ny agentÅ¯ a test by proÅ¡el bez jedinÃ©ho ovÄ›Å™enÃ©ho agenta, pÅ™estoÅ¾e vypadÃ¡ jako zelenÃ½ (viz .kilo/context/LESSONS_AND_DECISIONS.md Â§1 V2). UveÄ� jmÃ©na agentÅ¯ explicitnÄ›.r|   r}   Únamed)
r’   r   r€   r?   r�   r‚   rƒ   r„   r…   r†   )rW   Úwherer3   r•   r‡   s        r(   Ú_named_delegation_targetsr—   ß   s­   € ô ˜jÓ
)€CØ�3�%‰K€EÙô ÷ Ñð ˆ'ÐJÙŒ6�#Œ; 5Ð
)ð *ð	÷õ ÷ ‘÷ò ïé ð ÷ ñ ÷ ‰ið ÷ ÷ ó ÷ Ñ÷ñ ð €Lr*   c                 ól  — t         j                  }  | «       }|s²t        j                  dt         › �«      dz   dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx} }t        «       }t        |t        «      }|�sddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndd	t	        j
                  «       v st        j                  t        «      rt        j                  t        «      nd	t        j                  |«      d
œz  }t        t        j                  |«      «      ‚d}d}||v }|s¯t        j                  d|fd||f«      t        j                  |«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  d«      dz   d|iz  }t        t        j                  |«      «      ‚dx}}y)u˜  `.kilo/kilo.jsonc` existuje a parsuje se jako JSON po odeÄ�tenÃ­ komentÃ¡Å™Å¯.

    OdÅ¯vodnÄ›nÃ­: invariant 1 (ROADMAP_V6.md Â§14.1) â€” konfigurace, kterÃ¡ se
    nedÃ¡ pÅ™eÄ�Ã­st, je totÃ©Å¾ co chybÄ›jÃ­cÃ­ konfigurace, kterÃ¡ by se tiÅ¡e
    nahradila vÃ½chozÃ­mi hodnotami. Parsing je tedy fail-closed kontrola,
    ne kosmetika. Viz `_strip_jsonc_comments` pro znÃ¡mou mezeru (URL ve
    stringu).
    õ   chybÃ­ úD
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}ÚGLOBAL_CONFIG©r}   Úpy2Úpy4Nz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}rO   ÚcfgrP   ©r}   Úpy1r�   rž   rW   ©Úin©z%(py1)s in %(py3)s©r¡   Úpy3u(   global config musÃ­ mÃ­t blok permissionú
>assert %(py5)sÚpy5)r›   Úis_filer   r€   r�   r‚   rƒ   r„   r…   r†   r4   rO   rP   Ú_call_reprcompare)Ú@py_assert1Ú@py_assert3Ú@py_format5rŸ   Ú@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6s           r(   Útest_global_config_parsesr²   ÷   sh  € ô × Ñ Ð=Ñ Ó"Ð=Ñ"×=Ö= g¬m¨_Ð$=×=×=×=×=×=Ó=Œ=×=×=Ó=Œ=×=×=Ô=Ð ×=×=Ò=Ð"×=×=×=×=×=Ò=Ü
‹.€CÜ�cœ4Ó Ð Ò × × × × Õ Œ:× × Ó Œ:× × × × × Ò �c× × Ó �c× × × × × Ò œ4× × Ó œ4× × Ô Ð × × × × × Ð ØÐJˆ<˜3Ð×J×JÕJˆ<˜3×J×JÓJˆ<×J×J×J×J×JÐJ˜3×J×JÓJ˜3×J×J×JÑJÐ J×J×J×J×J×J×Jr*   c            
     óT  — t        «       } | D �]™  }|j                  d¬«      }|j                  }d} ||«      }|sÄt        j                  |j
                  › d�«      dz   dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx}x}}|j                  dd	«      }t        |«      }d
}||k\  }	|	�st        j                  d|	fd||f«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }t        j                  |j
                  › d�«      dz   d|iz  }
t        t        j                  |
«      «      ‚dx}x}	}	 t        j                   |d   «      }t/        t0        «      }|�s.t        j                  |j
                  › d�«      dz   d t        j                  «       v st        j                  t.        «      rt        j                  t.        «      nd d!t        j                  «       v st        j                  |«      rt        j                  |«      nd!d"t        j                  «       v st        j                  t0        «      rt        j                  t0        «      nd"t        j                  |«      d#œz  }t        t        j                  |«      «      ‚d}�Œœ y# t        j"                  $ ri}t%        |dd«      }|r#d|j&                  dz   › d|j(                  dz   › d�nd}t+        j,                  |j
                  › d|› d|› d�d¬«       Y d}~�Œ¾d}~ww xY w)$uœ  KaÅ¾dÃ½ `*.md` v `.kilo/agent/` musÃ­ mÃ­t parsovatelnÃ© YAML frontmatter.

    OdÅ¯vodnÄ›nÃ­: invariant 5 (Â§14) â€” Å¾Ã¡dnÃ© bezpeÄ�nostnÃ­ rozhodnutÃ­ nesmÃ­ bÃ½t
    pouze v promptu. Frontmatter je strojovÃ© naÄ�Ã­tanÃ© rozhodnutÃ­; pokud se
    nedÃ¡ parsovat, pravidla se tiÅ¡e neuplatnÃ­ a agent bÄ›Å¾Ã­ na vÃ½chozÃ­ch
    hodnotÃ¡ch. ChybÄ›jÃ­cÃ­ frontmatter = selhÃ¡nÃ­.

    [V1] NekorektnÃ­ YAML nesmÃ­ shodit celÃ½ soubor testÅ¯. `yaml.safe_load`
    vyhazuje `yaml.YAMLError` a nepoÅ¡le ho dÃ¡l â€” chyba se pÅ™evede na
    `pytest.fail` s nÃ¡zvem souboru a pozicÃ­, aby vÃ½stup brÃ¡ny ukazoval
    KTERÃ� agent je rozbitÃ½, ne jen traceback helperu.
    r,   r-   rC   u   : chybÃ­ YAML frontmatterzN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}r    )r}   r�   rž   Úpy6NrD   rE   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   rQ   )r}   r¡   r¦   r´   u   : nedokonÄ�enÃ© frontmatterz
>assert %(py8)sÚpy8r   Úproblem_marku
    (Å™Ã¡dek z
, sloupec ú)r   u*   : YAML frontmatter se nepodaÅ™ilo parsovatú: uX   . NekorektnÃ­ YAML zniÄ�Ã­ soubor â€” viz .kilo/context/LESSONS_AND_DECISIONS.md Â§1 V1.F)Úpytraceu   : frontmatter nenÃ­ mapaú7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}rO   rR   rP   r    )rˆ   r/   rF   r   r€   rL   r�   r‚   rƒ   r„   r…   r†   rG   r   rª   rH   rI   rJ   Úgetattrr$   ÚcolumnÚpytestÚfailrO   rP   )r~   r2   r    r«   r¬   Ú@py_assert5Ú@py_format7rQ   r¯   Ú@py_assert4Ú@py_format9rR   rS   Úmarkr–   r­   s                   r(   Ú.test_every_agent_has_parsable_yaml_frontmatterrÅ     s¡  € ô !Ó"€EØó NˆØ�~‰~ wˆ~Ó/ˆØ�‰ÐN˜uÐN‰˜uÓ%ÐNÑ%×NÖN¨$¯)©)¨Ð4MÐ'N×N×N×N×N×NÓNˆt×N×NÓNˆt×N×NÔNˆ×N×NÒN˜u×N×NÒNÐ%×N×N×N×N×NÔNØ—
‘
˜5 !Ó$ˆÜ�5‹zÐI˜QÐIˆz˜Q‰×I×IÖIˆz˜Q×I×I×I×I×IÑIŒs×I×IÓIŒs×I×I×I×I×IÒI�5×I×IÓI�5×I×IÔIˆz×I×IÒI˜Q×I×I×I 4§9¡9 +Ð-HÐ I×I×I×I×I×I×IÐIð		Ü—>‘> %¨¡(Ó+ˆDô ˜$¤Ó%ÐMÒ%×MÖM¨$¯)©)¨Ð4LÐ'M×M×M×M×M×MÓMŒz×M×MÓMŒz×M×M×M×M×MÒM˜$×M×MÓM˜$×M×M×M×M×MÒM¤×M×MÓM¤×M×MÔMÐ%×M×M×M×M×MÒMñNøô �~‰~ò 	Ü˜1˜n¨dÓ3ˆDÙPT�j §¡¨Q¡ ¨z¸$¿+¹+È¹/Ð9JÈ!ÑLÐZ\ˆEÜ�K‰KØ—9‘9�+ÐGÈÀwÈbÐQRÐPSð Tið ià÷ó ûð	ús   ÉN+Î+P'Î>AP"Ð"P'c            
     ó¾  — t        «       D �]Ï  } t        | «      }d}||v }|s¼t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  | j                  › d�«      dz   d|iz  }t        t        j                  |«      «      ‚d	x}}|d   }|t        v }|sæt        j                  d|fd|t        f«      t        j                  |«      d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
dœz  }t        j                  dj                  | j                  |d   t        t        «      «      «      dz   d|iz  }t        t        j                  |«      «      ‚d	x}}�ŒÒ y	)uª  `mode` agenta musÃ­ bÃ½t jedna z {primary, subagent, all}.

    OdÅ¯vodnÄ›nÃ­: D6 / invariant 3 (Â§14.3) â€” role agenta urÄ�uje, kdo smÃ­
    delegovat. NeplatnÃ¡ hodnota by znamenala tichÃ½ fallback na vÃ½chozÃ­ reÅ¾im,
    coÅ¾ je invariant 1 (Å¾Ã¡dnÃ½ tichÃ½ pÅ™echod).

    Kolekce je tu zÃ¡mÄ›rnÄ› pÅ™es `_require_agent_files()`: bez nÃ­ by prÃ¡zdnÃ½
    `.kilo/agent/` znamenal nula iteracÃ­ a PASSED (viz Â§1 V2).
    rp   r¢   r¤   rR   r¥   u   : chybÃ­ klÃ­Ä� moder§   r¨   NÚVALID_MODESu   {}: mode={!r} nenÃ­ v {})rˆ   rT   r   rª   r„   r�   r‚   rƒ   r€   rL   r…   r†   rÇ   Úformatr?   )r2   rR   r®   r¯   r°   r±   s         r(   Útest_agent_mode_is_valid_enumrÉ   &  sV  € ô %Ó&ó :ˆÜ˜4Ó ˆØÐAˆv˜ˆ~×A×AÕAˆv˜×A×AÓAˆv×A×A×A×A×AÐA˜×A×AÓA˜×A×A×AÑA $§)¡) Ð,@ÐA×A×A×A×A×AÖAØ�F‰|ð 	:ˆ|œ{Ð*÷ 	:ß(9Ñ(9ó	:ˆ|œ{÷ 	:ñ 	:ß09±	ð ÷ 	:ñ 	:ß39±6÷	:ò 	:ß!9Ñ!9ô  +÷ 	:ñ 	:ß09±	ô  +÷ 	:÷ 	:ß(9Ñ(9ð -G×,MÑ,MØ�I‰I�t˜F‘|¤V¬KÓ%8ó-:÷ 	:÷ 	:ö 	:ß&9Ñ&9÷	:÷ 	:ñ:r*   )Úidc                 óF  — t        «       } | sžt        j                  t        › d�«      dz   dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      dœz  }t        t        j                  |«      «      ‚d} t        sƒt        j                  d«      dz   dd	t	        j
                  «       v st        j                  t        «      rt        j                  t        «      nd	iz  }t        t        j                  |«      «      ‚t        D �cg c]  }|j                  d
k7  sŒ|j                  ‘Œ  }}t        |«      }t        «       }t        |«      }||k(  }|�sÚt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      dœz  }	t        j                  dt        |«      › dt        › dt        t        «       «      › d�«      dz   d|	iz  }
t        t        j                  |
«      «      ‚dx}x}x}}t        |«      }t        |«      }t        |«      }||k(  }|�sÿt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }t        j                  dt!        |«      › �«      dz   d|iz  }t        t        j                  |«      «      ‚dx}x}x}}yc c}w )uœ  ParametrickÃ© testy MUSÃ� mÃ­t neprÃ¡zdnou mnoÅ¾inu parametrÅ¯ â€” jinak neexistujÃ­.

    OdÅ¯vodnÄ›nÃ­: `pytest.mark.parametrize` nad prÃ¡zdnÃ½m seznamem NEHLÃ�SÃ�
    chybu. Test se vÅ¯bec nespustÃ­ a pÅ™i bÄ›Å¾nÃ©m bÄ›hu vypadÃ¡ jako zelenÃ¡ brÃ¡na.
    [V2] je pÅ™esnÄ› tento tvar: brÃ¡na, kterÃ¡ neexistuje, ale vypadÃ¡ jako
    brÃ¡na, kterÃ¡ proÅ¡la.

    Tento test je tedy kontrolou nad KONTROLAMI, ne nad `.kilo/`. ProtoÅ¾e
    se parametrizace odvozuje z adresÃ¡Å™e, novÃ½ agent v `.kilo/agent/*.md`
    do nÃ­ vstoupÃ­ automaticky â€” k vylouÄ�enÃ­ by byl nutnÃ½ hardcoded seznam,
    a ten je pÅ™esnÄ› to, co se pÅ™i pÅ™idÃ¡nÃ­ agenta tiÅ¡e rozsype.
    u³    neobsahuje Å¾Ã¡dnÃ½ '*.md' â€” parametrizovanÃ© testy by mÄ›ly nula parametrÅ¯, tj. by se nespustily vÅ¯bec, nikoli by selhaly (viz .kilo/context/LESSONS_AND_DECISIONS.md Â§1 V2)z'
>assert %(py2)s
{%(py2)s = %(py0)s()
}rA   ©r}   r�   Nu~   sada parametrÅ¯ pro kontrolu shody `mode` je prÃ¡zdnÃ¡ â€” test_agent_mode_declared_in_config_matches_markdown by se nespustilr|   r}   Ú_AGENT_MODE_PARAMSÚglobal©ú==)zg%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py10)s
{%(py10)s = %(py5)s(%(py8)s
{%(py8)s = %(py6)s()
})
}r   Úagent_scope_ids)r}   r¡   r¦   r¨   r´   r¶   Úpy10u.   scope parametrÅ¯ pro cyberbrain26_* pokrÃ½vÃ¡ u    agentÅ¯, ale v z je uR    â€” parametrizace nesleduje adresÃ¡Å™, takÅ¾e novÃ½ agent by do brÃ¡ny nevstoupilú
>assert %(py12)sÚpy12)zn%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py11)s
{%(py11)s = %(py8)s(%(py9)s)
}rŽ   )r}   r¡   r�   rž   r´   r¶   Úpy9Úpy11u.   duplicitnÃ­ parametry v cyberbrain26_* scope: z
>assert %(py13)sÚpy13)rA   r   r€   r=   r�   r‚   rƒ   r„   r…   r†   rÍ   Ú_CYBERBRAIN26_SCOPE_PARAMSrÊ   r   rª   rŽ   r?   )r«   Ú@py_format3r‡   r;   rÑ   r¯   Ú@py_assert7Ú@py_assert9rÂ   Ú@py_format11Ú@py_format13r¬   rÀ   Ú@py_assert10Ú@py_format12Ú@py_format14s                   r(   Ú'test_agent_parametrization_is_not_emptyrá   ;  s”  € ô ‹>ð ?‰>ô ?÷ .?Ñ->ô ˆ+ð >ð 	>÷?ô ?÷ 9?¹÷?ò ?÷ '?Ñ&>ô ÷ ?ñ ?÷ 6?±Yô ÷ ?ò ?÷ 6?±Yð ÷ ?÷ ?ò ?÷ ,?Ñ+>÷?ó ?õ
 ô Oç=NÑ=Nð	N÷Oõ OçHNÉ÷Oò Oç6NÑ6Nô ÷ Oñ OçENÁYô ÷ O÷ Oó Oç;NÑ;N÷Oñ Oô &@ÖT À1Ç4Á4È8ÓCS�q—t“tÐT€OÐTÜˆÓð K¤|£~ð K¤3 ~Ó#6ð KÐÐ#6Ñ6÷ Kð K÷ :KÑ9JóKÐÐ#6÷ Kò K÷ EKÁF÷Kò K÷ 3KÑ2Jô ÷ Kñ K÷ BKÁô ÷ Kó K÷ EKÁF÷Kò K÷ 3KÑ2Jð ÷ Kñ K÷ BKÁð ÷ Kò K÷ BKÁð  ÷ Kñ K÷ EKÁF÷Kò K÷ 3KÑ2Jô $'÷ Kñ K÷ BKÁô $'÷ Kó K÷ EKÁF÷Kò K÷ 3KÑ2Jô (4÷ Kñ K÷ BKÁô (4÷ Kò K÷ BKÁð (6÷ Kð K÷ BKÁð $7÷ Kõ K÷ :KÑ9Jð 9¼¸_Ó9MÐ8Nð OÜ#˜ D¬¬\«^Ó)<Ð(=ð >Jð	J÷K÷ Kö K÷ 8KÑ7J÷K÷ Kñ Kô
 �?Ó#ð TŒ3Ð#Ó$ð T¬¨OÓ(<ð TÐ$Ð(<Ñ<÷ Tð TßBSÑBSóTÐ$Ð(<÷ Tò TßMSÉV÷Tò Tß;SÑ;Sô ÷ Tñ TßJSÉ)ô ÷ Tó TßMSÉV÷Tò Tß;SÑ;Sô ÷ Tñ TßJSÉ)ô ÷ Tó TßMSÉV÷Tò Tß;SÑ;Sð #÷ Tñ TßJSÉ)ð #÷ Tò TßJSÉ)ð $÷ Tð TßJSÉ)ð %÷ Tñ TßMSÉV÷Tò Tß;SÑ;Sô ),÷ Tñ TßJSÉ)ô ),÷ Tó TßMSÉV÷Tò Tß;SÑ;Sð -<÷ Tñ TßJSÉ)ð -<÷ Tò TßJSÉ)ð )=÷ Tõ TßBSÑBSÐ
8¼ÀÓ9PÐ8QÐR÷T÷ Tö Tß@SÑ@S÷T÷ Tò Tùò Us   Ä>VÅVc                 ób  — t         j                  }  | «       }|s²t        j                  dt         › �«      dz   dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx} }t        d„ t         j                  d«      D «       «      }| } | s¯t        j                  t         › d|D �cg c]   }t        |j                  t         «      «      ‘Œ" c}› d	�«      d
z   ddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚d} yc c}w )uœ  `.kilo/agent/` musÃ­ bÃ½t PLOCHÃ�.

    OdÅ¯vodnÄ›nÃ­: Kilo skenuje `{agent,agents}/**/*.md` REKURZIVNÄš, zatÃ­mco
    `_agent_files()` pouÅ¾Ã­vÃ¡ `glob("*.md")` NEREKURZIVNÄš. VloÅ¾enÃ½ `.md` do
    podadresÃ¡Å™e by se naÄ�etl jako Å½IVÃ� agent, ale Gate 0 by ho nevidÄ›l â€”
    a nevidÄ›nÃ½ agent se nechodÃ­. To je [V2] v podobÄ› neviditelnÃ©ho agenta:
    nevymizÃ­, jen nenÃ­ pokrytÃ½ brÃ¡nou.

    DvÄ› Å™eÅ¡enÃ­: plochÃ¡ struktura (tento test), nebo rekurze v
    `_agent_files()`. Bez rozhodnutÃ­ vlastnÃ­ka zÅ¯stÃ¡vÃ¡ to prvnÃ­, protoÅ¾e
    `_agent_files()` se pouÅ¾Ã­vÃ¡ i v sekcÃ­ch B a C, kde by rekurze zahrnula
    i zÃ¡lohy a pracovnÃ­ artefakty.
    r™   zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_dir
}()
}r=   rœ   Nc              3  óB   K  — | ]  }|j                  «       sŒ|–— Œ y ­wr7   )r>   r9   s     r(   r<   z7test_agent_dir_has_no_subdirectories.<locals>.<genexpr>j  s   è ø€ ÒC˜1¸¿¹½
”QÑCùs   ‚˜r^   u    obsahuje podadresÃ¡Å™e: u¦   . Kilo skenuje '{agent,agents}/**/*.md' rekurzivnÄ›, ale '_agent_files()' jen nerekurzivnÄ› â€” soubor v podadresÃ¡Å™i by byl Å¾ivÃ½ agent, kterÃ©ho Gate 0 netestuje.ú
>assert not %(py0)sr}   Úsubdirs)r=   r>   r   r€   r�   r‚   rƒ   r„   r…   r†   r?   ÚrglobÚstrÚrelative_to)r«   r¬   r­   rå   r;   Ú@py_format2s         r(   Ú$test_agent_dir_has_no_subdirectoriesrê   [  s7  € ô ×ÑÐ4ÑÓÐ4Ñ×4Ö4 ¬¨Ð4×4×4×4×4×4Ó4Œ9×4×4Ó4Œ9×4×4Ô4Ð×4×4Ò4Ð×4×4×4×4×4Ò4ÜÑC¤	§¡°Ó 4ÔCÓC€GØˆ;ð ‰;ô ÷
 Ñô	 ˆ+Ð.Ø3:Ö;¨aŒC�—‘œiÓ(Õ)Ò;Ð
<ð =ð	÷õ ÷
 ‰v÷ò ï
é ð ÷ ñ ÷
 ‰Ið ÷ ÷ ó ÷
 Ñ÷ô ùâ;s   Ä%F,Ú
agent_pathc                ó®  — | j                   }t        «       j                  d«      }t        |t        «      }|�sGt        j                  t        j                  › dt        |«      j                  › �«      dz   dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                   |«      «      ‚d}||v }|sñt        j"                  d	|fd
||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  d|› dt        j                  › d�«      dz   d|iz  }t        t        j                   |«      «      ‚d}||   }g }t        |t        «      }|}	|rd}
|
|v }|}	|	�sõddt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }|j%                  |«       |rŒt        j"                  d	fd
|f«      t        j                  |
«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }|j%                  |«       t        j&                  |d«      i z  }t        j                  d|› dt        j                  › d�«      dz   d|iz  }t        t        j                   |«      «      ‚dx}	x}x}x}
}|d   }t)        | «      j                  d«      }||k(  }|�st        j"                  d|fd ||f«      d!t        j                  «       v st        j                  |«      rt        j                  |«      nd!d"t        j                  «       v st        j                  |«      rt        j                  |«      nd"dœz  }t        j                  d|› d#t        j                  › d$|›d%| j                  › d&|›d'�«      dz   d|iz  }t        t        j                   |«      «      ‚d}|t*        v }|sýt        j"                  d	|fd
|t*        f«      d!t        j                  «       v st        j                  |«      rt        j                  |«      nd!d(t        j                  «       v st        j                  t*        «      rt        j                  t*        «      nd(dœz  }t        j                  |› d)|›d*t-        t*        «      › �«      dz   d|iz  }t        t        j                   |«      «      ‚d}y)+uý  `mode` agenta musÃ­ bÃ½t explicitnÄ› deklarovÃ¡no V KONFIGURACI a musÃ­
    souhlasit s frontmatterem `.md`.

    OdÅ¯vodnÄ›nÃ­: [OVÄšÅ˜ENO] Kilo pÅ™iÅ™adÃ­ markdown frontmatter k agentovi POUZE
    tehdy, kdyÅ¾ `agent.<jmÃ©no>` v JSON mapÄ› jeÅ¡tÄ› neexistuje. Pokud existuje
    (napÅ™. v globÃ¡lnÃ­m `~/.config/kilo/kilo.jsonc`, kde je `agent.orchestrator`),
    JSON vyhrÃ¡vÃ¡ a frontmatter se TIÅ E zahazuje. OrchestrÃ¡tor tak resolveoval
    jako `all` mÃ­sto `primary` â€” a `all` by pÅ™i `task: allow` na orchestrÃ¡toru
    znamenal vÃ­ce delegÃ¡torÅ¯, tedy obchod D6 ("OrchestrÃ¡tor je jedinÃ½
    delegÃ¡tor"). RozdÃ­l je tichÃ½, tedy invariant 1 (Å¾Ã¡dnÃ½ tichÃ½ pÅ™echod):
    proto se shoda kontroluje deklarativnÄ› na obou mÃ­stech, bez vÃ½jimky.
    r   õ$   : 'agent' musÃ­ bÃ½t mapa, dostÃ¡no r»   rO   Ú
agents_cfgrP   r    Nr¢   ©z%(py0)s in %(py2)srL   rÌ   zagent 'õ   ' chybÃ­ v mapÄ› 'agent' v uT    â€” mode se pak naÄ�Ã­tÃ¡ jinde (globÃ¡lnÃ­ config) a frontmatter se tiÅ¡e zahazujeú
>assert %(py4)srž   rp   ú.%(py6)s
{%(py6)s = %(py2)s(%(py3)s, %(py4)s)
}Úentry©r�   r¦   rž   r´   ©z%(py9)s in %(py11)s©rÕ   rÖ   ú%(py13)sr×   r   ú': v uJ    chybÃ­ explicitnÃ­ 'mode' â€” bez nÄ›j se mode Å™Ã­dÃ­ jinou konfiguracÃ­ú
>assert %(py16)sÚpy16rÏ   ©z%(py0)s == %(py2)sÚconfig_modeÚmd_modeu   ': nesoulad mode â€” ú=z, frontmatter v z	.md mode=u/   ; vyhrÃ¡vÃ¡ JSON, frontmatter se tiÅ¡e zahazujerÇ   z: config mode=u	    nenÃ­ v )Ústemr4   rX   rO   rP   r   r€   r›   rL   rM   rN   r�   r‚   rƒ   r„   r…   r†   rª   r   Ú_format_booloprT   rÇ   r?   )rë   rL   rî   r¬   r­   r«   rÙ   ró   rÀ   r®   Ú@py_assert8rÞ   rÁ   rß   rà   Ú@py_format15Ú@py_format17rü   rý   s                      r(   Ú3test_agent_mode_declared_in_config_matches_markdownr  s  sÖ  € ð �?‰?€DÜ“×#Ñ# GÓ,€JÜ�j¤$Ó'ð `Ò'ô `ßN_ÑN_Œ=×ÑÐ
ÐBÄ4È
ÓCS×C\ÑC\ÐB]Ð^÷`ô `ßY_ÑY_÷`ò `ßG_ÑG_ô ÷ `ñ `ßV_ÑV_ô ÷ `ó `ßY_ÑY_÷`ò `ßG_ÑG_ð !÷ `ñ `ßV_ÑV_ð !÷ `ó `ßY_ÑY_÷`ò `ßG_ÑG_ô #'÷ `ñ `ßV_ÑV_ô #'÷ `ò `ßV_ÑV_ð (÷ `÷ `ò `ßL_ÑL_÷`ó `à�:Ð÷ ?ç->Ñ->ó?ˆ4�:÷ ?ò ?ç8>¹÷?ò ?ç&>Ñ&>ð ÷ ?ñ ?ç5>±Yð ÷ ?ó ?ç8>¹÷?ò ?ç&>Ñ&>ð ÷ ?ñ ?ç5>±Yð ÷ ?÷ ?ç->Ñ->ð �$�Ð2´=×3EÑ3EÐ2Fð G>ð 	>÷?÷ ?ö ?ç+>Ñ+>÷?ó ?ð �tÑ€EñŒ:�eœTÓ"ð Ð"ð Ñ" vð  v° ÷ ô ç‘v÷ò çÑô ÷ ñ ç‘Iô ÷ ó ç‘v÷ò çÑð ÷ ñ ç‘Ið ÷ ó ç‘v÷ò çÑô "÷ ñ ç‘Iô "÷ ò ç‘Ið #÷ ñ ç‘vðäñ #ô çÑó v°÷ ñ ç‘Ið (.÷ ñ ç‘v÷ò çÑð 27÷ ñ ç‘Ið 27÷ ÷ ò ç‘vðäôç‰~÷ö çÑð �$��uœ]×/Ñ/Ð0ð 1ð 	÷÷ ö ç
Ñ
÷÷ ó ð ˜‘-€KÜ˜*Ó%×)Ñ)¨&Ó1€GØ˜'Ñ!÷ 9ð 9ç'8Ñ'8ó9ˆ;˜'÷ 9ò 9ç28±&÷9ò 9ç 8Ñ 8ð ÷ 9ñ 9ç/8©yð ÷ 9ó 9ç28±&÷9ò 9ç 8Ñ 8ð "÷ 9ñ 9ç/8©yð "÷ 9÷ 9ç'8Ñ'8ð �$�Ð,¬]×-?Ñ-?Ð,@ÀÀ+ÀÐP`Ðak×apÑapÐ`qÐqzð  |Cð  {Fð F8ð 	8÷9÷ 9ö 9ç%8Ñ%8÷9ó 9ð œ+Ð%×k×kÕkˆ;œ+×k×k×k×k×kÑkˆ;×k×kÓkˆ;×k×k×k×k×kÒkœ+×k×kÓkœ+×k×k×kÑk¨$¨¨~¸k¸_ÈIÔV\Ô]hÓViÐUjÐ'k×k×k×k×k×kÕkr*   c                 ó  — t        «       j                  d«      } t        | t        «      }|�s3t	        j
                  dt        j                  › d�«      dz   dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  | «      rt	        j                  | «      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	}t        «       D �ch c]  }|j                  ’Œ }}|s‚t	        j
                  d
t         › �«      dz   ddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndiz  }t        t	        j                  |«      «      ‚t#        | «      }t%        ||z
  «      }| }|s t	        j
                  dt         j                  › dt        j                  › d|› �«      dz   ddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndiz  }	t        t	        j                  |	«      «      ‚d	}t%        ||z
  «      }
|
 }|s t	        j
                  dt        j                  › dt         j                  › d|
› �«      dz   ddt        j                  «       v st	        j                  |
«      rt	        j                  |
«      ndiz  }	t        t	        j                  |	«      «      ‚d	}y	c c}w )už  Mapa `agent` v `.kilo/kilo.jsonc` a soubory `.kilo/agent/*.md` se musÃ­
    shodovat V OBA SMÄšRECH.

    OdÅ¯vodnÄ›nÃ­: invariant 1 (Å¾Ã¡dnÃ½ tichÃ½ pÅ™echod). V jednom smÄ›ru chybÃ­
    deklarace = `mode` agenta se naÄ�Ã­tÃ¡ z jinÃ©ho zdroje a frontmatter se
    zahazuje (viz `test_agent_mode_declared_in_config_matches_markdown`);
    ve druhÃ©m smÄ›ru zÃ¡pis bez `.md` je mrtvÃ¡ konfigurace â€” deklaruje agenta,
    kterÃ©ho v repu nenÃ­, takÅ¾e pravidlo vypadÃ¡ zajiÅ¡tÄ›nÃ©, ale nenÃ­ pouÅ¾itelnÃ©.
    Zde nenÃ­ vÃ½jimka typu â€žchybÃ­ do F4" (viz `F4_EXPECTED_PENDING`): mrtvÃ½
    zÃ¡pis je stejnÄ› nebezpeÄ�nÃ½ jako chybÄ›jÃ­cÃ­, proto je tvrdÃ½ assert.
    r   zv u,    chybÃ­ mapa 'agent' s deklarovanÃ½mi agentyr»   rO   rî   rP   r    Nu   Å¾Ã¡dnÃ½ agent v r|   r}   Úmd_namesz	agenti s u#    ale bez zÃ¡pisu v mapÄ› 'agent' v r¹   rä   Úmissing_in_configzmapa 'agent' v z deklaruje agenty bez u    souboru (mrtvÃ¡ konfigurace): Údead_entries)r4   rX   rO   rP   r   r€   r›   rL   r�   r‚   rƒ   r„   r…   r†   rA   rÿ   r=   rŽ   r?   )rî   r¬   r­   r;   r  r‡   Ú	cfg_namesr  r«   ré   r  s              r(   Ú&test_global_config_declares_all_agentsr
  –  s  € ô “×#Ñ# GÓ,€JÜ�j¤$Ó'ð OÒ'ô Oß=NÑ=Nˆ"Œ]×ÑÐ Ð LÐM÷Oô OßHNÉ÷Oò Oß6NÑ6Nô ÷ Oñ OßENÁYô ÷ Oó OßHNÉ÷Oò Oß6NÑ6Nð !÷ Oñ OßENÁYð !÷ Oó OßHNÉ÷Oò Oß6NÑ6Nô #'÷ Oñ OßENÁYô #'÷ Oò OßENÁYð (÷ O÷ Oò Oß;NÑ;N÷Oó Oô !-£Ö/˜1�—“Ð/€HÐ/Ù×4Ö4Ð(¬¨Ð4×4×4×4×4×4Ô4ˆ8×4×4Ó4ˆ8×4×4×4×4×4ä�J“€IÜ˜x¨)Ñ3Ó4ÐØ Ð ð rÑ ô rß`qÑ`qˆ)”I—N‘NÐ#Ð#FÄ}×GYÑGYÐFZÐZ\Ð]nÐ\oÐp÷rõ rßkqÑkq÷rò rßYqÑYqð !÷ rñ rßhqÑhqð !÷ r÷ ró rß^qÑ^q÷ró rô ˜) hÑ.Ó/€LØÐð )Ñô )ç(Ñ(ð œ-×,Ñ,Ð-Ð-CÄIÇNÁNÐCSð TØ%˜ð	(÷)õ )ç"(¡&÷)ò )ç(Ñ(ð ÷ )ñ )ç(™yð ÷ )÷ )ó )ç(Ñ(÷)ô )ùò 0s   Å.M=c                 óš  — t        «       D �]=  } t        | «      j                  d«      }d}||u}|s¼t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }t        j                  | j                  › d�«      dz   d	|iz  }t        t        j                  |«      «      ‚dx}}t        |t        «      }|�sCt        j                  | j                  › d
t        |«      j                   › �«      dz   dt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d}�Œ@ y)u{  `permission` agenta musÃ­ bÃ½t objekt, ne skalÃ¡rnÃ­ hodnota.

    OdÅ¯vodnÄ›nÃ­: skalÃ¡rnÃ­ `permission` by znamenalo, Å¾e deklarativnÃ­ pravidla
    agenta nejsou aplikovatelnÃ¡ â€” veÅ¡kerÃ¡ granularita (bash deny, task
    allowlist) by zmizela a zbylo by jedno slovo. To je fail-open.

    Kolekce pÅ™es `_require_agent_files()` â€” prÃ¡zdnÃ½ adresÃ¡Å™ = FAIL, ne PASS.
    rW   N)úis not)z%(py0)s is not %(py3)sÚperm©r}   r¦   u   : chybÃ­ permissionr§   r¨   u'   : permission musÃ­ bÃ½t dict, dostÃ¡no r»   rO   rP   r    )rˆ   rT   rX   r   rª   r�   r‚   rƒ   r„   r€   rL   r…   r†   rO   rP   rM   rN   )r2   r  r¯   r«   r°   r±   r¬   r­   s           r(   Ú*test_agent_permission_is_object_not_scalarr  ´  sK  € ô %Ó&ó rˆÜ˜4Ó ×$Ñ$ \Ó2ˆØÐBˆt˜4Ð×B×BÕBˆt˜4×B×B×B×B×BÑBˆt×B×BÓBˆt×B×BÔB˜4×B×B×B D§I¡I ;Ð.AÐ!B×B×B×B×B×BÖBÜ˜$¤Ó%ÐqÒ%×qÖq¨$¯)©)¨Ð4[Ô\`ÐaeÓ\f×\oÑ\oÐ[pÐ'q×q×q×q×q×qÓqŒz×q×qÓqŒz×q×q×q×q×qÒq˜$×q×qÓq˜$×q×q×q×q×qÒq¤×q×qÓq¤×q×qÔqÐ%×q×q×q×q×qÒqñrr*   c            	     óP  — t        «       } | j                  }d} ||«      }d}||k(  }|sñt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d	x} x}x}x}x}}y	)
u,  GlobÃ¡lnÄ› `permission.bash == "deny"`.

    OdÅ¯vodnÄ›nÃ­: D3 a invariant 6 (Â§14.6) â€” `bash: deny` je vynuceno dvÄ›ma
    nezÃ¡vislÃ½mi mechanismy (globÃ¡lnÃ­ konfigurace + frontmatter agenta).
    VynechÃ¡nÃ­ globÃ¡lnÃ­ho pravidla by nebylo â€žvÃ½chozÃ­ ask", ale chybÄ›jÃ­cÃ­
    pojistka.
    r
   re   rÏ   ©za%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s()
}.get
}(%(py6)s)
} == %(py11)sr[   ©r}   r�   rž   r´   r¶   rÖ   úassert %(py13)sr×   N)
r[   rX   r   rª   r�   r‚   rƒ   r„   r…   r†   ©r«   r¬   rÀ   rÚ   rÞ   rÛ   rß   rà   s           r(   Útest_global_bash_deniedr  Ç  s·   € ô ÓÐ5Ð×#Ñ#Ð5 FÐ5Ñ# FÓ+Ð5¨vÐ5Ð+¨vÑ5×5×5Õ5Ð+¨v×5×5×5×5×5Ñ5Ô×5×5Ó5Ô×5×5Ô5Ð×5×5Ò5Ð#×5×5Ò5 F×5×5Ò5Ð+×5×5Ò5¨v×5×5×5×5×5×5×5Ò5r*   c           	     ó¦  — t        «       D �]Ã  }t        |«      }|j                  | ft        v rŒ$| |v }|sìt	        j
                  d|fd| |f«      dt        j                  «       v st	        j                  | «      rt	        j                  | «      nddt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }t	        j                  |j                  › d| › d�«      dz   d	|iz  }t        t	        j                  |«      «      ‚d
}||    }d}||k(  }|s˜t	        j
                  d|fd||f«      t	        j                  |«      t	        j                  |«      dœz  }t	        j                  |j                  › d| › d||    ›d�«      dz   d|iz  }	t        t	        j                  |	«      «      ‚d
x}x}}�ŒÆ y
)u  KaÅ¾dÃ½ agent musÃ­ `tool` explicitnÄ› uvÃ¡dÄ›t jako `"deny"`.

    OdÅ¯vodnÄ›nÃ­: D3 / invariant 6. ChybÄ›jÃ­cÃ­ klÃ­Ä� = selhÃ¡nÃ­, protoÅ¾e tichÃ¡
    dÄ›diÄ�nost je pÅ™esnÄ› to, co tato kontrola chytÃ¡. Dva nezÃ¡vislÃ© zÃ¡pisy
    (    `kilo.jsonc` + frontmatter) jsou zÃ¡mÄ›rem: kdyby jeden chybÄ›l, druhÃ½
    drÅ¾Ã­ hranici, a tato kontrola to odhalÃ­ dÅ™Ã­v neÅ¾ Ä�lovÄ›k.

    Kolekce pÅ™es `_require_agent_files()`: prÃ¡zdnÃ½ adresÃ¡Å™ by znamenal nula
    iteracÃ­ a PASSED bez jedinÃ©ho ovÄ›Å™enÃ©ho agenta (viz Â§1 V2).
    r¢   rï   r\   r  rÌ   z: 'u1   ' nenÃ­ explicitnÄ› uveden â€” tichÃ¡ dÄ›diÄ�nostrñ   rž   Nre   rÏ   ©z%(py1)s == %(py4)s©r¡   rž   r¹   rþ   u   , oÄ�ekÃ¡vÃ¡no 'deny'ú
>assert %(py6)sr´   )rˆ   rY   rÿ   ÚPRIMARY_TOOL_ALLOW_EXCEPTIONSr   rª   r�   r‚   rƒ   r„   r€   rL   r…   r†   )
r\   r2   r  r«   rÙ   r­   r®   r¬   r¯   rÁ   s
             r(   Ú'test_every_agent_bash_explicitly_deniedr  Ò  s0  € ô %Ó&ó `ˆÜ  Ó&ˆØ�I‰I�tÐÔ =Ñ=ØØ�tˆ|×e×eÕeˆt�t×e×e×e×e×eÑeˆt×e×eÓeˆt×e×e×e×e×eÒe�t×e×eÓe�t×e×e×eÑe §	¡	˜{¨#¨d¨VÐ3dÐe×e×e×e×e×eÔeØ�D‰zÐ_˜VÐ_ˆz˜VÑ#×_×_Õ_ˆz˜V×_×_Ó_ˆz×_×_Ò_˜V×_×_×_¨¯	©	 {°"°T°F¸!¸DÀ¹J¸>ÐI^Ð%_×_×_×_×_×_×_Ò_ñ`r*   c            	     ó  — t        «       } dt        «       fg}|| D �cg c]  }|j                  t        |«      f‘Œ c}z  }|D �]A  \  }}|j	                  d«      }t        |t        «      sŒ)|j                  }d} ||«      }d}	||	k(  }
|
sðt        j                  d|
fd||	f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |	«      dœz  }t        j                  |› d	|›�«      d
z   d|iz  }t        t        j                  |«      «      ‚dx}x}x}x}
}	�ŒD yc c}w )uõ  Pokud je `bash` hodnotou dict mÃ­sto stringu, musÃ­ obsahovat `"*": "deny"`.

    OdÅ¯vodnÄ›nÃ­: pravidla se vyhodnocujÃ­ v konfiguraÄ�nÃ­m poÅ™adÃ­ a vyhrÃ¡vÃ¡
    POSLEDNÃ� SHODA (komentÃ¡Å™ v `kilo.jsonc`, ROADMAP_V6.md Â§14.1).
    `bash: {foo: allow}` bez `"*"` by propustilo cokoliv jinÃ©ho â€” globÃ¡lnÃ­
    deny by byl pÅ™epsÃ¡n.

    Kolekce pÅ™es `_require_agent_files()` â€” bez nÃ­ by kontrola bÄ›Å¾ela jen nad
    globÃ¡lnÃ­m scope a pÅ™ehlÃ©dla by formu dict u libovolnÃ©ho agenta.
    rÎ   r
   r^   re   rÏ   ©zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sra   ©r}   r�   rž   r´   rÕ   u-   : bash dict musÃ­ mÃ­t '*': 'deny', dostÃ¡no ú
>assert %(py11)srÖ   N)rˆ   r[   rL   rY   rX   rO   rP   r   rª   r�   r‚   rƒ   r„   r€   r…   r†   )r~   Úscopesr;   r–   r  ra   r«   r¬   rÀ   r  rÚ   Ú@py_format10rß   s                r(   Ú&test_bash_dict_form_contains_star_denyr"  æ  s™  € ô !Ó"€EØÔ+Ó-Ð.Ð/€FØ
°uÖ=°!�—‘Ô)¨!Ó,Ò-Ò=Ñ=€FØó R‰ˆˆtØ—‘˜Ó ˆÜ�eœTÕ"Ø—9‘9ð R˜Sð R‘9˜S“>ð R Vð R�> VÑ+÷ Rß@QÑ@QóR�> V÷ Rò RßKQÉ6÷Rò Rß9QÑ9Qð ÷ Rñ RßHQÉ	ð ÷ Rò RßHQÉ	ð ÷ Rð RßHQÉ	ð !÷ Rð RßHQÉ	ð "÷ Rð RßHQÉ	ð &,÷ Rõ Rß@QÑ@Q�5�'ÐFÀuÀiÐP÷R÷ Rö Rß>QÑ>Q÷R÷ Rõ RñRùò >s   �Fc                 ó²  — t        «       D �]É  } t        | «      }| j                  dft        vrŒ$|j                  }d} ||«      }t        |t        «      }| }|�spt        j                  | j                  › d|d   ›d�«      dz   dt        j                  «       v st        j                  t
        «      rt        j                  t
        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d	x}x}x}x}}�ŒÌ y	)
u„  Agent, kterÃ½ tvrdÃ­ `bash` vÃ½jimku, musÃ­ mÃ­t `bash` jako SKALÃ�RNÃ� `allow`.

    ProÄ� je tenhle test:

    `test_bash_dict_form_contains_star_deny` nad dictem *prohÃ¡zÃ­*, takÅ¾e korektnÄ›
    zapsanÃ½ nefunkÄ�nÃ­ grant vypadÃ¡ jako splnÄ›nÃ¡ pojistka. KdyÅ¾ je takovÃ½ agent
    zÃ¡roveÅˆ v `PRIMARY_TOOL_ALLOW_EXCEPTIONS`, testy zaznamenajÃ­ vÃ½jimku, kterÃ¡
    v runtime nemusÃ­ existovat â€” falsnÃ½ doklad o bezpeÄ�nostnÃ­m stavu, pÅ™esnÄ› to,
    co tento soubor mÃ¡ chrÃ¡nit (viz `test_detector_rejects_bash_allow`).

    **OPRAVA TVRZENÃ� 2026-10-05.** Tento test pÅ¯vodnÄ› tvrdil â€ždict nedÃ¡vÃ¡ nÃ¡stroj
    (zmÄ›Å™eno: `EXIT=126`)". To **nebylo prokÃ¡zÃ¡no**. DÅ™Ã­vÄ›jÅ¡Ã­ zÃ¡vÄ›r vznikl z jedinÃ©ho
    mÄ›Å™enÃ­ a pozdÄ›ji vyÅ¡el najevo jako chybnÃ½:

    | kdy | agent | `bash` | vÃ½sledek |
    |---|---|---|---|
    | dÅ™Ã­v v tÃ©Å¾e session | `security-auditor` | `allow` (skalÃ¡r) | `EXIT=0`, `PROBE_OK` |
    | pozdÄ›ji v tÃ©Å¾e session | `security-auditor` | `allow` (skalÃ¡r) | `EXIT=127`, nÃ¡stroj nedostupnÃ½ |

    StejnÃ½ agent, stejnÃ½ grant, stejnÃ½ pÅ™Ã­kaz, jinÃ½ vÃ½sledek. **Dostupnost `bash`
    v tÃ©to session je nedeterministickÃ¡**, takÅ¾e nelze z jedinÃ©ho probe dedukovat,
    Å¾e dict tvar nefunguje a skalÃ¡r funguje.

    Tento test proto **nesoudÃ­ o dict tvaru vÅ¯bec**. VyÅ¾aduje jedinÄ› to, co je
    bezpeÄ�nÃ© v obou smÄ›rech deklarativnÄ›: kdo tvrdÃ­ vÃ½jimku pro `bash`, aÅ¥ ji mÃ¡
    zapsanou jako skalÃ¡rnÃ­ `allow`, protoÅ¾e to je jedinÃ¡ forma, kterou tento soubor
    umÃ­ pÅ™esnÄ› ovÄ›Å™it. ChybÄ›jÃ­cÃ­ `PRIMARY_TOOL_ALLOW_EXCEPTIONS` zÅ¯stÃ¡vÃ¡ BLOCKER
    nezÃ¡visle na tom, jestli dict funguje.
    r
   zD: je v PRIMARY_TOOL_ALLOW_EXCEPTIONS pro 'bash', ale 'bash' je dict u¢   . VÃ½jimka musÃ­ bÃ½t zapsÃ¡na jako skalÃ¡rnÃ­ 'allow' â€” jinak test nemÅ¯Å¾e ovÄ›Å™it, co vÃ½jimka ve skuteÄ�nosti dÄ›lÃ¡, a zÃ¡znam se stane falsnÃ½m dokladem.zt
>assert not %(py10)s
{%(py10)s = %(py0)s(%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.get
}(%(py5)s)
}, %(py8)s)
}rO   r  rP   )r}   r¡   r¦   r¨   Úpy7r¶   rÒ   N)rˆ   rY   rÿ   r  rX   rO   rP   r   r€   rL   r�   r‚   rƒ   r„   r…   r†   )r2   r  r¯   rÂ   Ú@py_assert6rÛ   Ú@py_assert11rß   s           r(   ÚDtest_bash_dict_grant_is_not_usable_so_it_must_not_claim_an_exceptionr'  û  sÆ  € ô< %Ó&ó 	
ˆÜ  Ó&ˆØ�I‰I�vÐÔ&CÑCØØ"Ÿh™hð 	
 vð 	
™h vÓ.ð 	
”:Ð.´Ó5ð 	
Ð5Ð5ð 	
Ò5ô 	
ï
é ð	 �y‰yˆkð Ø˜F‘|Ð&ð '4ð4÷	
ô 	
÷
 
�6÷	
ò 	
ï
é ô ÷ 	
ñ 	
÷
 
�	ô ÷ 	
ó 	
÷
 
�6÷	
ò 	
ï
é ð #÷ 	
ñ 	
÷
 
�	ð #÷ 	
ò 	
÷
 
�	ð '÷ 	
ð 	
÷
 
�	ð (.÷ 	
ð 	
÷
 
�	ð /÷ 	
ñ 	
÷
 
�6÷	
ò 	
ï
é ô 15÷ 	
ñ 	
÷
 
�	ô 15÷ 	
ò 	
÷
 
�	ð 6÷ 	
÷ 	
ò 	
ï
é ÷	
÷ 	
õ 	
ñ		
r*   c            	     óø  — t        «       D � ch c]+  } t        | «      j                  d«      dk(  r| j                  ’Œ- }} t	        |t
        D ��ch c]  \  }}|dk(  sŒ|’Œ c}}z
  «      }| }|st        j                  d|› d�«      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚d}yc c} w c c}}w )	u™  Kdo mÃ¡ `bash: allow` â€” seznam nesmÃ­ rÅ¯st tiÅ¡e.

    OdÅ¯vodnÄ›nÃ­: kaÅ¾dÃ½ agent s bÄ›hem na hostovi je samostatnÃ© bezpeÄ�nostnÃ­ rozhodnutÃ­
    a musÃ­ bÃ½t evidovanÃ½ vÃ½jimkou, ne tichou vlastnostÃ­ souboru. Tento test
    neomezuje koho pÅ™idat â€” to je rozhodnutÃ­ vlastnÃ­ka â€” ale zabraÅˆuje tomu, aby
    pÅ™Ã­davnÃ½ `bash: allow` proÅ¡el bez zÃ¡pisu do `PRIMARY_TOOL_ALLOW_EXCEPTIONS`.
    r
   rd   uF   agenti s bash: allow, kteÅ™Ã­ nejsou v PRIMARY_TOOL_ALLOW_EXCEPTIONS: uH    â€” bÄ›h na hostovi musÃ­ bÃ½t evidovanÃ¡ vÃ½jimka, ne tichÃ¡ vlastnosträ   r}   Ú
undeclaredN)rˆ   rY   rX   rÿ   r?   r  r   r€   r�   r‚   rƒ   r„   r…   r†   )r2   ÚallowedÚaÚtr)  r«   ré   s          r(   Ú7test_agents_claiming_bash_are_exactly_the_measured_onesr-  %  s  € ô )Ó*öàÜ˜TÓ"×&Ñ& vÓ.°'Ò9ð 	�	‹	ð€Gð ô
 ˜Ô1N×"^©¨¨AÐRSÐW]ÓR]¢1Ó"^Ñ^Ó_€JØˆ>ð a‰>ô açO`ÑO`ð QØˆ,Ð^ð	`÷aõ açZ`ÑZ`÷aò açH`ÑH`ð ÷ añ açW`ÑW`ð ÷ a÷ aó açM`ÑM`÷aô aùòùó
 #_s   �0C1ÁC6ÁC6c            
     óº  — t        «       } | j                  «       D ��ch c]  \  }}|dk(  sŒ|’Œ }}}|sŒt        j                  t        j
                  › d�«      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚t        «       D �]  }t        |«      }| j                  «       D �]å  \  }}|dk7  rŒ|j                  |ft        v rŒ"g }||v}	|	}
|	s||   }d}||k7  }|}
|
�s~t        j                   d|	fd||f«      d	t        j                  «       v st        j                  |«      rt        j                  |«      nd	d
t        j                  «       v st        j                  |«      rt        j                  |«      nd
dœz  }dd|iz  }|j#                  |«       |	s_t        j                   dfdf«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }|j#                  |«       t        j$                  |d«      i z  }t        j                  |j
                  › d|› d�«      dz   d|iz  }t        t        j                  |«      «      ‚dx}
x}x}	x}x}}t'        |j)                  |«      t*        «      s�Œè||   }
|
j(                  }d} ||«      }d}||k7  }|sÎt        j                   d|fd||f«      t        j                  |
«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }t        j                  |j
                  › d|› d�«      dz   d|iz  }t        t        j                  |«      «      ‚dx}
x}x}x}x}}�Œè �Œ
 yc c}}w )uŽ  Agent nesmÃ­ bÃ½t mÃ©nÄ› pÅ™Ã­snÃ½ neÅ¾ globÃ¡l: kde globÃ¡l Å™Ã­kÃ¡ `deny`,
    agent nesmÃ­ Å™Ã­ct `allow`. PÅ™Ã­snÄ›jÅ¡Ã­ (`ask`/`deny`) je v poÅ™Ã¡dku, opaÄ�nÄ› ne.

    OdÅ¯vodnÄ›nÃ­: ROADMAP_V6.md Â§14 â€” bezpeÄ�nostnÃ­ poÅ™adÃ­
    identita â†’ politika â†’ oprÃ¡vnÄ›nÃ­. GlobÃ¡lnÃ­ `deny` je podlaha; agent
    frontmatter je deklarativnÃ­ vrstva nad nÃ­ a nesmÃ­ ji podkopat.

    DVA pÅ™edpoklady, oba nynÃ­ tvrdÃ© asserty, protoÅ¾e bez nich je smyÄ�ka
    uvnitÅ™ no-op (viz Â§1 V2): (a) globÃ¡lnÃ­ permission musÃ­ obsahovat alespoÅˆ
    jedno `deny`, jinak se vnitÅ™nÃ­ smyÄ�ka neprovede; (b) kolekce agentÅ¯
    nesmÃ­ bÃ½t prÃ¡zdnÃ¡.
    re   u³   : globÃ¡lnÃ­ `permission` nemÃ¡ Å¾Ã¡dnÃ½ klÃ­Ä� s hodnotou 'deny' â€” podlaha, kterou by tato kontrola podkopÃ¡vala, neexistuje, a smyÄ�ka uvnitÅ™ by neproÅ¡la ani jednou iteracÃ­r|   r}   Úglob_deniesrd   ©únot in)z%(py2)s not in %(py4)sr\   r  )r�   rž   z%(py6)sr´   ©ú!=)z%(py9)s != %(py12)s)rÕ   rÔ   z%(py14)sÚpy14r   r¹   u3   ='allow' je mÃ©nÄ› pÅ™Ã­snÃ© neÅ¾ globÃ¡lnÃ­ 'deny'ú
>assert %(py17)sÚpy17Nr^   )zJ%(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.get
}(%(py5)s)
} != %(py10)s)r¡   r¦   r¨   r$  rÒ   u+    dict '*'='allow' obchÃ¡zÃ­ globÃ¡lnÃ­ denyrÓ   rÔ   )r[   r�   r   r€   r›   rL   r�   r‚   rƒ   r„   r…   r†   rˆ   rY   rÿ   r  rª   r   r   rO   rX   rP   )r@   r\   ra   r/  r‡   r2   r  Úgvaluer«   r¬   r®   r  r&  rÞ   r­   rÁ   rÝ   r  Ú@py_format16Ú@py_format18r¯   rÂ   r%  rÛ   rÜ   s                            r(   Ú)test_agent_permission_is_subset_of_globalr:  <  sç  € ô Ó€DØ+/¯:©:«<×K™K˜D %¸5ÀF»?’4ÐK€KÑKÙô <÷ +<Ñ*;ô ×ÑÐ
ð ;ð 	;÷<õ <÷ 6<±V÷<ò <÷ $<Ñ#;ð ÷ <ñ <÷ 3<±)ð ÷ <÷ <ó <÷ )<Ñ(;÷<ñ <ô
 %Ó&ó WˆÜ  Ó&ˆØ ŸJ™J›Ló 		W‰LˆD�&Ø˜ÒØØ—	‘	˜4Ð Ô$AÑAØñ[�4˜tÐ#ô [ t¨D¡zð [°Wð [ z°WÑ'<÷ [ò [ßIZÑIZó[�4˜t÷ [ò [ßTZÑTZ÷[ò [ßBZÑBZð ÷ [ñ [ßQZÑQZð ÷ [ó [ßTZÑTZ÷[ò [ßBZÑBZð  $÷ [ñ [ßQZÑQZð  $÷ [÷ [ò [ßTZÑTZð[ÜTZö[ßIZÑIZó[ z°W÷ [ñ [ßQZÑQZð (2÷ [ð [ßQZÑQZð 6=÷ [÷ [ð [ßTZÑTZð[ÜTZô[ßLZÉN÷[ö [ßIZÑIZ�4—9‘9�+˜R ˜vÐ%XÐY÷[÷ [ö [ßGZÑGZ÷[÷ [õ [ä˜$Ÿ(™( 4›.¬$Ö/Ø˜D‘zð W�z—~‘~ð W cð W‘~ cÓ*ð W¨gð WÐ*¨gÑ5÷ WßEVÑEVóWÐ*¨g÷ Wñ WßMVÉYð "÷ Wð WßMVÉYð &÷ Wð WßMVÉYð '*÷ Wð WßMVÉYð +÷ Wð WßMVÉYð /6÷ Wõ WßEVÑEV�t—y‘y�k  D 6Ð)TÐU÷W÷ Wö WßCVÑCV÷W÷ W÷ Wò		WñWùó Ls
   žO¬Oc            	     ó0
  — t        «       j                  d«      } t        | t        «      }|�s%t	        j
                  d| ›d�«      dz   dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  | «      rt	        j                  | «      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	}| j                  }d
} ||«      }d}||k(  }|sït	        j                  d|fd||f«      dt        j                  «       v st	        j                  | «      rt	        j                  | «      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }t	        j
                  d| ›d�«      dz   d|iz  }t        t	        j                  |«      «      ‚d	x}x}x}x}}t        «       D �]�  }	t        |	«      j                  d«      }
t        |
t        «      }|�s1t	        j
                  |	j                  › d|
›d�«      dz   dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  |
«      rt	        j                  |
«      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	}|	j                   dft"        v r�Œz|
j                  }d
} ||«      }d}||k(  }|sût	        j                  d|fd||f«      dt        j                  «       v st	        j                  |
«      rt	        j                  |
«      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }t	        j
                  |	j                  › d|
›d�«      dz   d|iz  }t        t	        j                  |«      «      ‚d	x}x}x}x}}�Œ  y	)u´  `task` musÃ­ bÃ½t dict s `"*": "deny"` â€” globÃ¡lnÄ› i v kaÅ¾dÃ©m agentu
    kromÄ› OrchestrÃ¡tora (D14).

    Tento test ovÄ›Å™uje jen FORMU (dict s catch-all), ne DÃ‰LKU allowlistu:
    poÄ�et agentÅ¯, kteÅ™Ã­ smÃ­ delegovat, se Å™Ã­dÃ­ jinde
    (`test_only_orchestrator_may_delegate`).

    ZMÄšNA oproti pÅ¯vodnÃ­mu znÄ›nÃ­: D14 uÅ¾ wildcard `{"*": "allow"}` u
    OrchestrÃ¡tora nepÅ™ipouÅ¡tÃ­. Wildcard byl sice schvÃ¡lenÃ½, ale podle pravidla
    â€žposlednÃ­ shoda vyhrÃ¡vÃ¡" znamenal SKUTEÄŒNÃ‰ prÃ¡vo delegovat na kohokoli a
    zÃ¡roveÅˆ zruÅ¡il kaÅ¾dou kontrolu, kterÃ¡ filtruje `k != "*"` â€” viz Â§1 V2 a
    `test_orchestrator_task_allowlist_is_explicit_not_wildcard`.

    OdÅ¯vodnÄ›nÃ­: D6 / invariant 3 (Â§14.3) â€” jeden orchestration path.
    SkalÃ¡rnÃ­ `task` nebo dict bez `"*"` by propustil delegaci na cokoliv,
    tedy paralelnÃ­/nezamÃ½Å¡lenou orchestration cestu. Allowlist bez catch-all
    deny nenÃ­ allowlist.
    r�   zglobal task=õ    nenÃ­ dictr»   rO   Ú	glob_taskrP   r    Nr^   re   rÏ   r  r  u    global task chybÃ­ '*': 'deny' (r¸   r  rÖ   z: task=u   : task chybÃ­ '*': 'deny' (u   ) â€” propustilo by delegaci)r[   rX   rO   rP   r   r€   r�   r‚   rƒ   r„   r…   r†   rª   rˆ   rY   rL   rÿ   r  )r=  r¬   r­   r«   rÀ   r  rÚ   r!  rß   r2   r�   s              r(   Ú$test_task_always_uses_allowlist_formr>  ^  su  € ô& #Ó$×(Ñ(¨Ó0€IÜ�i¤Ó&ÐOÒ&×OÖO¨,°y°mÀ;Ð(O×O×O×O×O×OÓOŒ:×O×OÓOŒ:×O×O×O×O×OÒO�i×O×OÓO�i×O×O×O×O×OÒO¤×O×OÓO¤×O×OÔOÐ&×O×O×O×O×OÐOØ�=‰=ÐZ˜ÐZ‰=˜ÓÐZ ÐZÐ Ñ'×Z×ZÕZÐ ×Z×Z×Z×Z×ZÑZˆ9×Z×ZÓZˆ9×Z×ZÔZˆ=×Z×ZÒZ˜×Z×ZÒZÐ×Z×ZÒZ ×Z×Z×ZÐ+KÈIÈ=ÐXYÐ)Z×Z×Z×Z×Z×Z×ZÔZä$Ó&ó [ˆÜ  Ó&×*Ñ*¨6Ó2ˆÜ˜$¤Ó%ÐOÒ%×OÖO¨$¯)©)¨°G¸D¸8À;Ð'O×O×O×O×O×OÓOŒz×O×OÓOŒz×O×O×O×O×OÒO˜$×O×OÓO˜$×O×O×O×O×OÒO¤×O×OÓO¤×O×OÔOÐ%×O×O×O×O×OÐOØ�I‰I�vÐÔ"?Ñ?ñ Ø�x‰xð 	[˜ð 	[‰x˜‹}ð 	[ ð 	[ˆ} Ñ&÷ 	[ßIZÑIZó	[ˆ} ÷ 	[ò 	[ßTZÑTZ÷	[ò 	[ßBZÑBZð ÷ 	[ñ 	[ßQZÑQZð ÷ 	[ò 	[ßQZÑQZð ÷ 	[ð 	[ßQZÑQZð ÷ 	[ð 	[ßQZÑQZð ÷ 	[ð 	[ßQZÑQZð !'÷ 	[õ 	[ßIZÑIZˆt�y‰yˆkÐ4°T°HÐ<XÐY÷	[÷ 	[ö 	[ßGZÑGZ÷	[÷ 	[õ 	[ñ[r*   c                 óÆ
  — t         dz  } | j                  } |«       }|s£t        j                  d«      dz   dt	        j
                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx}}t        | «      j                  d«      }t        |t        «      }|�s%t        j                  d|›d	�«      d
z   dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      nddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d}d}||v}|s¯t        j                  d|fd||f«      t        j                  |«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  d«      dz   d|iz  }t        t        j                  |«      «      ‚dx}}|j                  «       D �	�
ch c]  \  }	}
|
dk(  sŒ|	’Œ }}	}
|s{t        j                  d«      dz   ddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚t!        |«      D �]Ó  }g }t        |t"        «      }|}|r|}|�s¯ddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      nddt	        j
                  «       v st        j                  t"        «      rt        j                  t"        «      ndt        j                  |«      dœz  }|j%                  |«       |rXdddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndiz  }|j%                  |«       t        j&                  |d «      i z  }t        j                  d!|›�«      d"z   d#|iz  }t        t        j                  |«      «      ‚dx}x}}�ŒÖ yc c}
}	w )$u  OrchestrÃ¡tor musÃ­ mÃ­t `task` jako explicitnÃ­ allowlist, ne wildcard.

    [V2] D14 uÅ¾ wildcard `{"*": "allow"}` nepÅ™ipouÅ¡tÃ­. Tento test je
    nezÃ¡vislÃ½ na `test_task_always_uses_allowlist_form` (ten orchestrÃ¡tora
    pÅ™eskoÄ�Ã­) a na `test_only_orchestrator_may_delegate` (ten kontroluje
    jen jmÃ©na, ne formu). OvÄ›Å™uje, Å¾e orchestrÃ¡torÅ¯v `task` je dict s
    konkrÃ©tnÃ­mi jmÃ©ny a Å¾Ã¡dnÃ½m `"*"`.

    OdÅ¯vodnÄ›nÃ­: wildcard by znamenal, Å¾e orchestrÃ¡tor mÅ¯Å¾e delegovat na
    kohokoli â€” vÄ�etnÄ› agentÅ¯, kteÅ™Ã­ neexistujÃ­ nebo nejsou v `AGENT_DELEGATION_ALLOWLIST`.
    ZÃ¡roveÅˆ by zruÅ¡il `test_only_orchestrator_may_delegate`, protoÅ¾e ten
    filtruje `k != "*"` a iteruje jen nad jmÃ©ny. [V2] â€” predikÃ¡t, kterÃ½
    zruÅ¡Ã­ vlastnÃ­ test.
    úorchestrator.mdu   chybÃ­ orchestrator.mdrš   Úorchestrator_pathrœ   Nr�   zorchestrator: task=r<  r»   rO   rP   r    r^   r0  ©z%(py1)s not in %(py3)sr¥   uˆ   orchestrator: `task` obsahuje wildcard '*' â€” to nenÃ­ allowlist, je to delegace na kohokoli. D14 vyÅ¾aduje explicitnÃ­ jmÃ©na agentÅ¯.r§   r¨   rd   uj   orchestrator: `task` je prÃ¡zdnÃ½ â€” D14 Å™Ã­kÃ¡, Å¾e orchestrÃ¡tor musÃ­ mÃ­t alespoÅˆ jedno task: allowr|   r}   Úallowsrò   rL   rç   rô   z%(py8)sr¶   r   u'   orchestrator: neplatnÃ½ klÃ­Ä� v task: r  rÖ   )r=   r©   r   r€   r�   r‚   rƒ   r„   r…   r†   rY   rX   rO   rP   rª   r�   r?   rç   r   r   )rA  r«   r¬   r­   r�   r®   r¯   r°   r±   r�   r‘   rC  r‡   rL   rÀ   rÁ   rÃ   r!  rß   s                      r(   Ú9test_orchestrator_task_allowlist_is_explicit_not_wildcardrD  ƒ  sV  € ô "Ð$5Ñ5ÐØ×$Ñ$Ð@Ñ$Ó&Ð@Ñ&×@Ö@Ð(@×@×@×@×@×@Ó@Ð×@×@Ó@Ð×@×@Ô@Ð$×@×@Ò@Ð&×@×@×@×@×@Ò@äÐ.Ó/×3Ñ3°FÓ;€DÜ�dœDÓ!ÐLÒ!×LÖLÐ%8¸¸ÀÐ#L×L×L×L×L×LÓLŒ:×L×LÓLŒ:×L×L×L×L×LÒL�d×L×LÓL�d×L×L×L×L×LÒLœD×L×LÓLœD×L×LÔLÐ!×L×L×L×L×LÐLð ð ˆ3�dˆ?÷ ïé óˆ3�d÷ ñ ïé ð ÷ ñ ïé ÷ò ïé ð ÷ ñ ïé ð ÷ ÷ ïé ð	P÷÷ ö ïé ÷õ ð !ŸJ™J›L×9‘D�A�q¨A°«LŠaÐ9€FÑ9Ùô ïé ð	*÷õ ïé ÷ò ïé ð ÷ ñ ïé ð ÷ ÷ ó ïé ÷ñ ô �v“ó bˆÙaŒz˜$¤Ó$ÐaÐ$ÐaÑ$¨×a×a×a×a×aÑaŒz×a×aÓaŒz×a×a×a×a×aÒa˜$×a×aÓa˜$×a×a×a×a×aÒa¤×a×aÓa¤×a×aÔaÐ$×a×a×aÑaÑ$×a×a×a×aÖa¨×a×aÓa¨×a×a×a×a×a×a×a×aÒaÐ1XÐY]ÐX`Ð/a×a×a×a×a×a×aÒañbùó :s   Ë(UË6U>   ÚscoutÚoverseerr   r   Úpromptmasterr   r   úgate3-auditorr   r   r   >   r   ÚverifierÚorchestratorrÎ   c                óò  — | €dn| j                   }| €
t        «       n
t        | «      }|j                  d«      }d}||k7  }|s²t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dœz  }t	        j                  |› d	�«      d
z   d|iz  }t        t	        j                  |«      «      ‚dx}}y)uP  `cyberbrain26_*` NESMÃ­ bÃ­t `"allow"` v Å¾Ã¡dnÃ©m scope â€” globÃ¡lnÄ› ani u
    Å¾Ã¡dnÃ©ho agenta.

    OdÃºvodnÄ›nÃ­: invariant 5 (ROADMAP_V6.md Â§14.5) a D3. `allow` by obeÅ¡lo
    lidskÃ© schvÃ¡lenÃ­ â€” nÃ¡stroj by se dostal k `AuthorizedExecutionService`
    bez Ä�lovÄ›ka v Å™etÄ›zcci `identity â†’ policy â†’ approval â†’ sandbox`.
    BezpeÄ�nostnÃ­ rozhodnutÃ­ nesmÃ­ bÃ½t vydÃ¡no konfiguracÃ­ ani promptem.

    Toto je JEDINÃ� globÃ¡lnÃ­ invariant pro `cyberbrain26_*`. Pravidlo `deny` vs.
    `ask` je rolovÄ› zÃ¡vislÃ© a kontroluje ho `test_cyberbrain26_role_appropriate`.
    NrÎ   úcyberbrain26_*rd   r2  ©z%(py0)s != %(py3)sra   r  õM   : cyberbrain26_*='allow' obejde lidskÃ© schvÃ¡lenÃ­ (invariant 5, Â§14.5, D3)r§   r¨   )rL   r[   rY   rX   r   rª   r�   r‚   rƒ   r„   r€   r…   r†   )rë   r–   r  ra   r¯   r«   r°   r±   s           r(   Útest_cyberbrain26_never_allowrO  Ï  sè   € ð #Ð*‰H°
·±€EØ#-Ð#5ÔÔÔ;LÈZÓ;X€DØ�H‰HÐ%Ó&€EØð %ˆ5�GÑ÷ %ç$Ñ$ó%ˆ5�G÷ %ò %ç$™f÷%ò %ç$Ñ$ð ÷ %ñ %ç$™9ð ÷ %ò %ç$™9ð ÷ %õ %ç$Ñ$ð ˆ'ð $ð 	$÷%÷ %ö %ç$Ñ$÷%ö %r*   c           
     ó	  — t        «       j                  d«      }d}||k(  }|s³t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }t        j                  d|›d�«      d	z   d
|iz  }t        t        j                  |«      «      ‚dx}}g }g }t        «       D �]¯  }|j                  }	t        |«      j                  d«      }
|	t        v rÛd}|
|v }|sµt        j                  d|fd|
|f«      dt	        j
                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      dœz  }t        j                  |	› d|
›d�«      d	z   d
|iz  }t        t        j                  |«      «      ‚dx}}|
dk(  rù|j                  |	› d�«       nä|	t         v rÃd}|
|k(  }|sµt        j                  d|fd|
|f«      dt	        j
                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      dœz  }t        j                  |	› d|
›d�«      d	z   d
|iz  }t        t        j                  |«      «      ‚dx}}n|j                  |	› d|
›d�«       �Œñd}|
|k7  }|s²t        j                  d|fd|
|f«      dt	        j
                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      dœz  }t        j                  |	› d�«      d	z   d
|iz  }t        t        j                  |«      «      ‚dx}}�Œ² | j#                  «       5  t%        d«       t%        d|›d�«       t'        t        t         z  «      D ]Z  }	t(        |	› d�z  }|j+                  «       rt        |«      j                  d«      nd}|	t        v rdnd}t%        d |› d!|	› d"|›�«       Œ\ |D ]  }t%        d#|› �«       Œ |D ]  }t%        d$|› d%�«       Œ |s|st%        d&«       ddd«       y# 1 sw Y   yxY w)'up  Hodnota `cyberbrain26_*` musÃ­ odpovÃ­dat deklarovanÃ© roli agenta.

    Pravidla:
      * globÃ¡l v `.kilo/kilo.jsonc` = `"ask"`,
      * `NON_EXECUTING_AGENTS` = `"deny"` NEBO `"ask"`, nikdy `"allow"`.
        Pokud mÃ¡ `"ask"`, vypÃ­Å¡e se to jako VAROVÃ�NÃ� (ne selhÃ¡nÃ­) â€” `ask`
        nenÃ­ chyba, jen slabÅ¡Ã­ varianta.
      * `EXECUTION_PATH_AGENTS` = `"ask"`. `deny` by tu byl skuteÄ�nÃ¡ chyba,
        protoÅ¾e tito agenti `cyberbrain26_*` potÅ™ebujÃ­ volat â€” `deny` by
        udÄ›lalo Å™etÄ›zec nedosaÅ¾itelnÃ½m.
      * jakÃ¡koli jinÃ¡ hodnota (napÅ™. `allow`) je chyba,
      * agent mimo obÄ› mnoÅ¾iny se VYPÃ�Å E jako `unclassified_agent` a test
        NESELEHÃ� â€” v F4 pÅ™ibydou exekuÄ�nÃ­ subagenti. Test nesmÃ­ cpÃ¡t
        dopÅ™edu budoucÃ­ konfiguraci.

    TENTO TEST JE ZÃ�MÄšRNÄš NEFAILUJÃ�CÃ�, proto jako doplnÄ›k existuje tvrdÃ½
    `test_every_agent_is_classified_for_cyberbrain26`. ZÃ¡mÄ›r: role-aware
    kontrola hodnot zÅ¯stÃ¡vÃ¡ mÄ›kkÃ¡ (aby nezastavila postup projektu), ale
    ÃšPLNOST registrace rolÃ­ je tvrdÃ¡. Do tÃ© doby je `unclassified_agent`
    jen text v logu, ne poruÅ¡enÃ­.
    rL  ÚaskrÏ   ©z%(py0)s == %(py3)sÚ
glob_valuer  zglobal cyberbrain26_*=u   , oÄ�ekÃ¡vÃ¡no 'ask'r§   r¨   N)re   rQ  r¢   )z%(py0)s in %(py3)sra   z: cyberbrain26_*=u>    â€” oÄ�ekÃ¡vÃ¡no 'deny' nebo 'ask', 'allow' je nepÅ™Ã­pustnÃ©u„   : cyberbrain26_*='ask' â€” pÅ™Ã­pustnÃ©, ale pro neexekuÄ�nÃ­ agenta je 'deny' silnÄ›jÅ¡Ã­ hranice (D6 by Å¡lo schvÃ¡lenÃ­m obejÃ­t)ur    â€” agent je na exekuÄ�nÃ­ cestÄ› a cyberbrain26_* POTÅ˜EBUJE volat; 'deny' by Å™etÄ›zec udÄ›lal nedosaÅ¾itelnÃ½mú (cyberbrain26_*=r¸   rd   r2  rM  rN  z0
[Gate 0/F1] cyberbrain26_* role-aware kontrola:z  global = u    (oÄ�ekÃ¡vÃ¡no 'ask')rn   znon-executingzexecution-pathz  r¹   z -> u     VAROVÃ�NÃ�: z  unclassified_agent: uK    â€” nenÃ­ v NON_EXECUTING_AGENTS ani EXECUTION_PATH_AGENTS, doplÅˆ pÅ™i F4u.     (bez varovÃ¡nÃ­, bez nezaÅ™azenÃ½ch agentÅ¯))r[   rX   r   rª   r�   r‚   rƒ   r„   r€   r…   r†   rˆ   rÿ   rY   ÚNON_EXECUTING_AGENTSr   ÚEXECUTION_PATH_AGENTSÚdisabledÚprintr?   r=   r©   )ÚcapsysrS  r¯   r«   r°   r±   ÚwarningsÚunclassifiedr2   rL   ra   Úagent_mdÚshownÚkindÚwÚus                   r(   Ú"test_cyberbrain26_role_appropriatera  ä  s®  € ô, $Ó%×)Ñ)Ð*:Ó;€JØð Eˆ:˜Ñ÷ Eß3DÑ3DóEˆ:˜÷ Eò Eß>D¹f÷Eò Eß,DÑ,Dð ÷ Eñ Eß;D¹9ð ÷ Eò Eß;D¹9ð ÷ Eõ Eß3DÑ3DÐ
   Ð.BÐC÷E÷ Eö Eß1DÑ1D÷Eõ Eð €HØ€Lä$Ó&ó )ˆØ�y‰yˆÜ! $Ó'×+Ñ+Ð,<Ó=ˆàÔ'Ñ'Ø+ð -�5˜OÐ+÷ -ç,Ñ,ó-�5˜O÷ -ò -ç&,¡f÷-ò -ç,Ñ,ð ÷ -ñ -ç#,¡9ð ÷ -ò -ç#,¡9ð ,÷ -õ -ç,Ñ,ð �&Ð)¨%¨ð 3,ð ,÷-÷ -ö -ç,Ñ,÷-õ -ð ˜Š~Ø—‘Ø�fð ,ð ,õ-ð Ô*Ñ*Ø!ð $�5˜E‘>÷ $÷ $Ñ#ó$�5˜E÷ $ò $÷ $™V÷$ò $÷ $Ñ#ð ÷ $ñ $÷ $™)ð ÷ $ò $÷ $™)ð "÷ $õ $÷ $Ñ#ð �&Ð)¨%¨ð 3#ð #÷$÷ $ö $÷ $Ñ#÷$ö $ð
 ×Ñ 4 &Ð(9¸%¸À!Ð DÔEÙàð 	)ˆu˜Ñ÷ 	)ç(Ñ(ó	)ˆu˜÷ 	)ò 	)ç"(¡&÷	)ò 	)ç(Ñ(ð ÷ 	)ñ 	)ç(™yð ÷ 	)ò 	)ç(™yð  ÷ 	)õ 	)ç(Ñ(ð ˆfð (ð (÷	)÷ 	)ö 	)ç(Ñ(÷	)÷ 	)ð-)ð4 
�‰Ó	ñ DÜÐAÔBÜ�˜J˜>Ð)>Ð?Ô@ÜÔ/Ô2GÑGÓHò 	4ˆDÜ  d V¨3 <Ñ/ˆHà ×(Ñ(Ô*ô ' xÓ0×4Ñ4Ð5EÔFØ04ð à'+Ô/CÑ'C‘OØ)ð ä�B�t�f˜B˜t˜f D¨¨	Ð2Õ3ð	4ð ò 	(ˆAÜ�N 1 #Ð&Õ'ð	(àò 	;ˆAÜÐ*¨1¨#ð .:ð :õ ;ð	;ñ ¡ÜÐBÔC÷!D÷ Dñ Dús   Î+CQ<Ñ<Rc                 óò  — t        «       } t        t        z  }|s{t        j                  d«      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚t        t        z  }| }|sät        j                  dt        t        t        z  «      › d�«      dz   dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd	t        j                  «       v st        j                  t        «      rt        j                  t        «      nd	d
œz  }t        t        j                  |«      «      ‚dx}}g }| D ]B  }|j                  }||v rŒ|j                  |› dt        |«      j                  d«      ›d�«       ŒD | }	|	s™t        j                  ddj!                  t        |«      «      z   dz   «      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }
t        t        j                  |
«      «      ‚d}	y)uN  KAÅ½DÃ� agent musÃ­ mÃ­t deklarovanou roli pro `cyberbrain26_*`.

    OdÅ¯vodnÄ›nÃ­: invariant 5 (Â§14.5) â€” bezpeÄ�nostnÃ­ rozhodnutÃ­ nesmÃ­ bÃ½t
    vydÃ¡no konfiguracÃ­, ale musÃ­ bÃ½t VYNUCENO kÃ³dem. K `cyberbrain26_*` se
    rozhoduje Kilo podle `permission`, a rozdÃ­l `deny` vs. `ask` je rolovÄ›
    zÃ¡vislÃ½: bez deklarovanÃ© role nenÃ­ Ä�Ã­m zdÅ¯vodnit, proÄ� je tenhle agent
    na `ask` a tenhle na `deny`.

    [V2] v podobÄ› tichÃ©ho prÅ¯chodu: `test_cyberbrain26_role_appropriate` vypÃ­Å¡e
    nezaÅ™azenÃ©ho agenta jako `unclassified_agent` a NESELEHÃ�. Osm z jedenÃ¡cti
    agentÅ¯ tak bylo â€žneklasifikovanÃ½ch" a brÃ¡na pÅ™itom hlÃ¡sila PASSED â€”
    v reportu to vypadÃ¡ jako otÃ¡zka k doplnÄ›nÃ­, ve skuteÄ�nosti to je
    neprokÃ¡zanÃ¡ hodnota `ask` u agenta, jehoÅ¾ role nikdo neurÄ�il.

    Tento test je TVRDÃš: doplnit roli, nebo pÅ™epsat allowlist tak, aby byl
    kaÅ¾dÃ½ agent pokrytÃ½. `tester`, `implementer` aj ostatnÃ­ Ä�tenÃ¡Å™Å¡tÃ­
    subagenti jsou `NON_EXECUTING_AGENTS`, pokud nepotÅ™ebujÃ­ volat
    `cyberbrain26_*`; `deny` je pro nÄ› sprÃ¡vnÃ¡ volba.
    ur   NON_EXECUTING_AGENTS i EXECUTION_PATH_AGENTS jsou prÃ¡zdnÃ© â€” kontrola Ãºplnosti registrace by neovÄ›Å™ovala nicr|   r}   Ú
classifieduD   agent je souÄ�asnÄ› v NON_EXECUTING_AGENTS i EXECUTION_PATH_AGENTS: uM    â€” role musÃ­ bÃ½t jednoznaÄ�nÃ¡, jinak se pravidlo urÄ�uje dvÄ›ma zpÅ¯sobyz 
>assert not (%(py0)s & %(py1)s)rU  rV  )r}   r¡   NrT  rL  r¸   u3   agenti bez deklarovanÃ© role pro `cyberbrain26_*`: z, uT  . ZaÅ™aÄ� kaÅ¾dÃ©ho do NON_EXECUTING_AGENTS (Ä�tenÃ¡Å™skÃ½/nekontrolujÃ­cÃ­ agent, sprÃ¡vnÃ¡ hodnota je 'deny') nebo do EXECUTION_PATH_AGENTS (agent na security plane, musÃ­ mÃ­t 'ask'). Dokud jsou nezaÅ™azenÃ­, `test_cyberbrain26_role_appropriate` je pro nÄ› jen nefailujÃ­cÃ­ informaÄ�nÃ­ vÃ½pis a hodnota 'ask' nenÃ­ niÄ�Ã­m podloÅ¾enÃ¡.rä   r[  )rˆ   rU  rV  r   r€   r�   r‚   rƒ   r„   r…   r†   r?   rÿ   r   rY   rX   r   )r~   rc  r‡   r¯   r¬   r°   r[  r2   rL   r«   ré   s              r(   Ú/test_every_agent_is_classified_for_cyberbrain26rd  .  s¡  € ô( !Ó"€EÜ%Ô(=Ñ=€JÙô 5ç#4Ñ#4ð	4÷5õ 5ç.4©f÷5ò 5ç4Ñ4ð ÷ 5ñ 5ç+4©9ð ÷ 5÷ 5ó 5ç!4Ñ!4÷5ñ 5ô %Ô'<Ñ<ð DÐ<Ð=ð DÑ=ô D÷ 3DÑ2Cð 	OÜÔ&Ô)>Ñ>Ó?Ð
@ð ACð	C÷Dô D÷ >D¹V÷Dò D÷ ,DÑ+Cô %÷ Dñ D÷ ;D¹)ô %÷ Dó D÷ >D¹V÷Dò D÷ ,DÑ+Cô (=÷ Dñ D÷ ;D¹)ô (=÷ D÷ Dô D÷ 1DÑ0C÷Dõ Dð
 €LØò ZˆØ�y‰yˆØ�:ÑØØ×ÑØˆfÐ%Ô&7¸Ó&=×&AÑ&AÐBRÓ&SÐ%VÐVWÐXõ	Zð	Zð Ðð JÑô J÷ 9JÑ8Ið 	>Ø
�)‰)”F˜<Ó(Ó
)ñ	*ðIñ	I÷Jõ J÷ DJÁ6÷Jò J÷ 2JÑ1Ið ÷ Jñ J÷ AJÁ	ð ÷ J÷ Jó J÷ 7JÑ6I÷Jô Jr*   >	   ©r   r
   ©rI  r
   ©rJ  r
   ©rJ  Úedit©rJ  r�   ©rJ  r   ©r   r
   ©rH  r
   ©r   r
   c                 ó|  — t        «       D �]®  } t        | «      }|j                  d«      dk7  rŒ$| j                  dft        v rŒ9t        | «      }d}||v }|s¼t        j                  d|fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  | j                  › d�«      d	z   d
|iz  }t        t        j                  |«      «      ‚dx}}|d   }d}||k(  }|s�t        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }t        j                  | j                  › d�«      dz   d|iz  }	t        t        j                  |	«      «      ‚dx}x}}�Œ± y)u7  Agent s `mode: primary` musÃ­ mÃ­t `edit: "deny"`, s vÃ½jimkou
    `PRIMARY_TOOL_ALLOW_EXCEPTIONS` (D14 â€” OrchestrÃ¡tor mÃ¡ `edit: allow`).

    OdÅ¯vodnÄ›nÃ­: D6 / invariant 3 â€” primÃ¡rnÃ­ agenti jsou vstupnÃ­ brÃ¡na
    (`uÅ¾ivatel â†’ PromptMaster â†’ OrchestrÃ¡tor`), ne autor zmÄ›n. Kdyby
    primÃ¡rnÃ­ agent editoval soubory, zmÄ›na by se dÄ›la mimo bezpeÄ�nostnÃ­
    Å™etÄ›zec (`AuthorizedExecutionService`), tedy mimo Gate 1/2. VÃ½jimka
    pro OrchestrÃ¡tora je vÃ½slovnÄ› schvÃ¡lenÃ¡ rozhodnutÃ­m D14 a NEZnamenÃ¡
    obecnÃ© povolenÃ­ k editaci.
    rp   r   ri  r¢   r¤   r  r¥   u«   : primary agent (mimo vÃ½jimku D14) musÃ­ mÃ­t v `permission` explicitnÄ› nastavenÃ½ `edit: 'deny'` â€” nikoli dÄ›dÄ›nÃ½ z globÃ¡lu (fail-closed proti tichÃ© dÄ›diÄ�nosti)r§   r¨   Nre   rÏ   r  r  u'   : primary agent musÃ­ mÃ­t edit: 'deny'r  r´   )rA   rT   rX   rÿ   r  rY   r   rª   r„   r�   r‚   rƒ   r€   rL   r…   r†   )
r2   rR   r  r®   r¯   r°   r±   r¬   r­   rÁ   s
             r(   Útest_primary_agents_cannot_editrp  „  s¾  € ô “ó CˆÜ˜4Ó ˆØ�8‰8�FÓ˜yÒ(ØØ�I‰I�vÐÔ"?Ñ?ØÜ  Ó&ˆØð 	7ˆv˜ˆ~÷ 	7÷ &7Ñ%6ó	7ˆv˜÷ 	7ñ 	7÷ .7©Yð ÷ 	7ñ 	7÷ 17±÷	7ò 	7÷ 7Ñ6ð ÷ 	7ñ 	7÷ .7©Yð ÷ 	7÷ 	7÷ &7Ñ%6ð �y‰yˆkð 6ð 6÷	7÷ 	7ö 	7÷ $7Ñ#6÷	7õ 	7ð �F‰|ð 	C˜vð 	Cˆ|˜vÑ%÷ 	Cß1BÑ1Bó	Cˆ|˜v÷ 	Cñ 	Cß9B¹ð ÷ 	Cð 	Cß9B¹ð  &÷ 	Cõ 	Cß1BÑ1Bˆt�y‰yˆkÐ@ÐA÷	C÷ 	Cö 	Cß/BÑ/B÷	C÷ 	Cñ 	CñCr*   c            	     óP  — t        «       } | j                  }d} ||«      }d}||k(  }|sñt        j                  d|fd||f«      dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d	x} x}x}x}x}}y	)
ur  `subagent_depth == 3`.

    OdÅ¯vodnÄ›nÃ­: invariant 12 (Â§14.12) â€” tvrdÃ½ invariant hloubky 3; orchestrÃ¡tor
    deleguje do tÅ™Ã­ vrstev subagentÅ¯ (vrstva 1 â†’ vrstva 2 â†’ vrstva 3).
    VÃ½chozÃ­ hodnota Kilo je 1, ale byla zmÄ›nÄ›na na 3 vÃ½slovnÃ½m rozhodnutÃ­m
    vlastnÃ­ka (2026-11-03), protoÅ¾e konfigurace je pÅ™edmÄ›t auditu (ROADMAP_V6.md Â§14.1).
    Úsubagent_depthrE   rÏ   r  r4   r  r  r×   N)
r4   rX   r   rª   r�   r‚   rƒ   r„   r…   r†   r  s           r(   Útest_subagent_depth_is_oners  ¢  sµ   € ô ‹>Ð4ˆ>×ÑÐ4Ð.Ð4ÑÐ.Ó/Ð4°1Ð4Ð/°1Ñ4×4×4Õ4Ð/°1×4×4×4×4×4Ñ4Œ<×4×4Ó4Œ<×4×4Ô4ˆ>×4×4Ò4Ð×4×4Ò4Ð.×4×4Ò4Ð/×4×4Ò4°1×4×4×4×4×4×4×4Ò4r*   c            	     ó  — t        «       } | j                  d«      }|sŒt        j                  t        j
                  › d�«      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚| j                  d«      }t        |t        «      }|�sGt        j                  t        j
                  › dt        |«      j                  › �«      dz   dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	d
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
t        j                  |«      dœz  }t        t        j                  |«      «      ‚d}||v }|sñt        j                   d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndd	t        j                  «       v st        j                  |«      rt        j                  |«      nd	dœz  }t        j                  d|› dt        j
                  › d�«      dz   d|iz  }t        t        j                  |«      «      ‚d}||   }g }t        |t        «      }	|	}
|	rd}||v }|}
|
�sõddt        j                  «       v st        j                  t        «      rt        j                  t        «      nddt        j                  «       v st        j                  |«      rt        j                  |«      ndd
t        j                  «       v st        j                  t        «      rt        j                  t        «      nd
t        j                  |	«      dœz  }|j#                  |«       |	rŒt        j                   dfd|f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }|j#                  |«       t        j$                  |d«      i z  }t        j                  d|› dt        j
                  › d�«      d z   d!|iz  }t        t        j                  |«      «      ‚dx}
x}x}	x}}|d   }d"}||k(  }|sÇt        j                   d#|fd$||f«      d%t        j                  «       v st        j                  |«      rt        j                  |«      nd%t        j                  |«      d&œz  }t        j                  d|› d'|›d(t        j
                  › d)�«      d*z   d+|iz  }t        t        j                  |«      «      ‚dx}}y),uá  `default_agent` musÃ­ bÃ½t agentem deklarovanÃ½m v mapÄ› `agent` v
    `.kilo/kilo.jsonc` s `mode: primary` (ne `all`).

    OdÅ¯vodnÄ›nÃ­: D11 (vstupnÃ­ bod je PromptMaster, nikoli OrchestrÃ¡tor) a
    invariant 3 (Â§14.3) â€” jeden primary agent, jedinÃ½ delegÃ¡tor. Test
    neurÄ�uje konkrÃ©tnÃ­ jmÃ©no (D11 ho zmÄ›nil), proto ovÄ›Å™uje invariant:
    defaultnÃ­ agent je primÃ¡rnÃ­. `mode: all` by pÅ™i `task: allow` otevÅ™ilo
    delegaci i jinÃ½m agentÅ¯m a obeÅ¡lo D6.
    Údefault_agentu   : chybÃ­ 'default_agent'r|   r}   r   rí   r»   rO   rî   rP   r    Nr¢   rï   rÌ   zdefault_agent 'rð   uJ    â€” efektivnÃ­ mode se pak Å™Ã­dÃ­ jinak a mÅ¯Å¾e skÃ½tat tichÃ½ pÅ™echodrñ   rž   rp   rò   Údefault_entryrô   rõ   rö   r÷   r×   r   rø   uP    chybÃ­ explicitnÃ­ 'mode' â€” efektivnÃ­ mode se pak Å™Ã­dÃ­ jinou konfiguracÃ­rù   rú   r   rÏ   rR  Úeffective_moder  u   ': efektivnÃ­ mode=z (z uX   ), oÄ�ekÃ¡vÃ¡no 'primary' â€” 'all' by otevÅ™ilo delegaci i jinÃ½m agentÅ¯m a obeÅ¡lo D6r§   r¨   )r4   rX   r   r€   r›   rL   r�   r‚   rƒ   r„   r…   r†   rO   rP   rM   rN   rª   r   r   )rŸ   ru  r‡   rî   r¬   r­   r«   rÙ   rv  rÀ   r®   r  rÞ   rÁ   rß   rà   r  r  rw  r¯   r°   r±   s                         r(   Ú.test_default_agent_is_a_declared_primary_agentrx  ­  sŒ  € ô ‹.€CØ—G‘G˜OÓ,€MÙô 9ß'8Ñ'8Œ=×ÑÐ
Ð6Ð7÷9õ 9ß28±&÷9ò 9ß 8Ñ 8ð ÷ 9ñ 9ß/8©yð ÷ 9÷ 9ó 9ß%8Ñ%8÷9ñ 9ð —‘˜Ó!€JÜ�j¤$Ó'ð `Ò'ô `ßN_ÑN_Œ=×ÑÐ
ÐBÄ4È
ÓCS×C\ÑC\ÐB]Ð^÷`ô `ßY_ÑY_÷`ò `ßG_ÑG_ô ÷ `ñ `ßV_ÑV_ô ÷ `ó `ßY_ÑY_÷`ò `ßG_ÑG_ð !÷ `ñ `ßV_ÑV_ð !÷ `ó `ßY_ÑY_÷`ò `ßG_ÑG_ô #'÷ `ñ `ßV_ÑV_ô #'÷ `ò `ßV_ÑV_ð (÷ `÷ `ò `ßL_ÑL_÷`ó `à˜JÐ&÷ >ç,=Ñ,=ó>ˆ=˜J÷ >ò >ç7=±v÷>ò >ç%=Ñ%=ð ÷ >ñ >ç4=±Ið ÷ >ó >ç7=±v÷>ò >ç%=Ñ%=ð '÷ >ñ >ç4=±Ið '÷ >÷ >ç,=Ñ,=ð ˜-˜Ð(CÄM×DVÑDVÐCWð X=ð 	=÷>÷ >ö >ç*=Ñ*=÷>ó >ð ˜}Ñ-€Mñ-Œ:�m¤TÓ*ð -Ð*ð -Ñ*¨vð -¨v¸Ð/F÷ -ô -ç&,¡f÷-ò -ç,Ñ,ô ÷ -ñ -ç#,¡9ô ÷ -ó -ç&,¡f÷-ò -ç,Ñ,ð $÷ -ñ -ç#,¡9ð $÷ -ó -ç&,¡f÷-ò -ç,Ñ,ô &*÷ -ñ -ç#,¡9ô &*÷ -ò -ç#,¡9ð +÷ -ñ -ç&,¡fð-ä&,ñ +ô -ç,Ñ,ó-¨v¸÷ -ñ -ç#,¡9ð 06÷ -ñ -ç&,¡f÷-ò -ç,Ñ,ð :G÷ -ñ -ç#,¡9ð :G÷ -÷ -ò -ç&,¡fð-ä&,ô-ç,™n÷-ö -ç,Ñ,ð ˜-˜¨¬m×.@Ñ.@Ð-Að B,ð 	,÷-÷ -ö -ç,Ñ,÷-÷ -ó -ð # 6Ñ*€NØ&ð Jˆ>˜YÑ&÷ Jç8IÑ8IóJˆ>˜Y÷ Jò JçCIÁ6÷Jò Jç1IÑ1Ið ÷ Jñ Jç@IÁ	ð ÷ Jò Jç@IÁ	ð '÷ Jõ Jç8IÑ8Ið ˜-˜Ð(;¸NÐ;MÈTÔR_×RdÑRdÐQeð fIð 	I÷J÷ Jö Jç6IÑ6I÷Jö Jr*   r   )rJ  r   c            
     óä  — t        «       D �]\  } t        | «      j                  d«      xs i }|j                  «       D ��ch c]  \  }}|dk(  sŒ|’Œ }}}| j                  t
        vr›| }|s“t        j                  | j                  › dt        |«      › �«      dz   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚d}Œ÷t
        | j                     }|€|s{t        j                  d«      d	z   ddt        j                  «       v st        j                  |«      rt        j                  |«      ndiz  }t        t        j                  |«      «      ‚�Œ‹d
}	|	|v}
|
s¼t        j                  d|
fd|	|f«      t        j                  |	«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  | j                  › d�«      dz   d|iz  }t        t        j                  |«      «      ‚dx}	}
||k(  }|�s t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }t        j                  | j                  › dt        |«      › dt        |«      › �«      dz   d|iz  }t        t        j                  |«      «      ‚d}�Œ_ yc c}}w )u^  Delegovat smÃ­ POUZE dvojice z `AGENT_DELEGATION_ALLOWLIST`.

    OdÅ¯vodnÄ›nÃ­: D6 / invariant 3 â€” Å¾Ã¡dnÃ¡ paralelnÃ­ orchestration cesta.
    Kdyby mohl delegovat kdokoli, existovaly by dva delegÃ¡tory a dva
    Å™etÄ›zce; tato kontrola je pÅ™esnÄ› ta, kterÃ¡ to odmÃ­tne.

    VÃ½jimka pro `implementer` (schvÃ¡lena vlastnÃ­kem 2026-10-02) je omezenÃ¡ na
    JEDINÃ� cÃ­l `tester` a navÃ¡zanÃ¡ na funkci, ne na `mode`. Kdyby nÄ›kdo
    pÅ™idal `implementer` â†’ jinÃ½ cÃ­l, nebo povolil delegaci tÅ™etÃ­mu agentovi,
    tato kontrola SELHÃ� â€” nesmÃ­ se zjednoduÅ¡it na `if path.stem in {...}`.
    r�   rd   uX   : nesmÃ­ delegovat vÅ¯bec (D6 â€” jedinÃ½ delegÃ¡tor je orchestrator), nalezenÃ© allow: rä   r}   rC  Nu8   orchestrator musÃ­ mÃ­t alespoÅˆ jedno task: allow (D14)r|   r^   r0  rB  r¥   u<   : wildcard '*' je vÃ½hradnÄ› vÃ½jimka D14 pro orchestrÃ¡torar§   r¨   rÏ   rû   Úallowed_targetsrÌ   u   : smÃ­ delegovat POUZE u   , nalezenÃ© allow: rñ   rž   )rA   rY   rX   r�   rÿ   ÚAGENT_DELEGATION_ALLOWLISTr   r€   r?   r�   r‚   rƒ   r„   r…   r†   rª   )r2   r�   r�   r‘   rC  r«   ré   rz  r‡   r®   r¯   r°   r±   rÙ   r­   s                  r(   Ú#test_only_orchestrator_may_delegater|  Û  s1  € ô “ó 2ˆÜ  Ó&×*Ñ*¨6Ó2Ò8°bˆØ $§
¡
£×=™˜˜1°°W³’!Ð=ˆÑ=Ø�9‰9Ô6Ñ6Ø�:ð H‘:ô Hç6GÑ6Gð —9‘9�+ð 6Ü6<¸V³nÐ5EðG÷Hõ HçAGÁ÷Hò Hç/GÑ/Gð ÷ Hñ Hç>G¹ið ÷ H÷ Hó Hç4GÑ4G÷Hó Hð Ü4°T·Y±YÑ?ˆØÐ"Ùô Lß:KÑ:KÐJ÷Lõ LßEKÁV÷Lò Lß3KÑ3Kð ÷ Lñ LßBKÁ)ð ÷ L÷ Ló Lß8KÑ8K÷Lñ Láð ð 	ˆs˜&Ð ÷ 	çÑó	ˆs˜&÷ 	ñ 	ç‘Yð ÷ 	ñ 	ç™÷	ò 	çÑð !÷ 	ñ 	ç‘Yð !÷ 	÷ 	çÑð �y‰yˆkð ð ÷	÷ 	ö 	çÑ÷	õ 	ð ˜Ñ(÷ 	2ð 	2ç 1Ñ 1ó	2ˆv˜÷ 	2ò 	2ç+1©6÷	2ò 	2ç1Ñ1ð ÷ 	2ñ 	2ç(1©	ð ÷ 	2ó 	2ç+1©6÷	2ò 	2ç1Ñ1ð )÷ 	2ñ 	2ç(1©	ð )÷ 	2÷ 	2ç 1Ñ 1ð �y‰yˆkÐ0´¸Ó1HÐ0Ið J Ü & v£Ð/ð1÷	2÷ 	2ö 	2ç1Ñ1÷	2õ 	2ñ%2ùã=s   Á M,ÁM,c                 ó¤  — t        t        dz  «      j                  d«      xs i } | j                  «       D ��cg c]  \  }}|dk(  sŒ|‘Œ }}}|s{t	        j
                  d«      dz   ddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndiz  }t        t	        j                  |«      «      ‚|D ]û  }t        |› d�z  }|j                  «       sŒ t        |«      j                  d	«      }d
}||k(  }	|	sµt	        j                  d|	fd||f«      d	t        j                  «       v st	        j                  |«      rt	        j                  |«      nd	t	        j                  |«      dœz  }
t	        j
                  |› d|›d�«      dz   d|
iz  }t        t	        j                  |«      «      ‚dx}	}Œý yc c}}w )u’  KaÅ¾dÃ½ agent z orchestrÃ¡torova allowlistu, kterÃ½ uÅ¾ mÃ¡ `.md`, musÃ­ mÃ­t
    `mode: subagent`.

    OdÅ¯vodnÄ›nÃ­: invariant 3 + 12 â€” primary agent spuÅ¡tÄ›nÃ½ jako subagent by
    obejel hloubku delegace 1 (dostal by vlastnÃ­ `task` pravidla) a
    zmnoÅ¾il by orchestration path. KONTROLA SE VZTAHUJE JEN NA AGENCY,
    KTEÅ˜Ã� ONAÄŒD EXISTUJÃ� â€” viz `test_allowlist_agents_pending_f4`.
    r@  r�   rd   u>   orchestrator allowlist je prÃ¡zdnÃ½ â€” test by nic netestovalr|   r}   Ú	allowlistrn   rp   r	   rÏ   rR  r  u/   .md je v orchestrÃ¡torovu allowlistu, ale mode=u    (musÃ­ bÃ½t 'subagent')r§   r¨   N)rY   r=   rX   r�   r   r€   r�   r‚   rƒ   r„   r…   r†   r©   rT   rª   )r�   r�   r‘   r~  r‡   rL   r2   rp   r¯   r«   r°   r±   s               r(   Ú0test_allowlisted_agents_that_exist_are_subagentsr  þ  s}  € ô œYÐ):Ñ:Ó;×?Ñ?ÀÓGÒMÈ2€DØ#Ÿz™z›|×<‘t�q˜!¨q°G«|’Ð<€IÑ<Ù×VÖVÐV×V×V×V×V×VÔVˆ9×V×VÓVˆ9×V×V×V×V×Vàò 'ˆÜ˜d˜V 3˜<Ñ'ˆØ�|‰|Œ~ØÜ˜4Ó ×$Ñ$ VÓ,ˆØ!ð 	'ˆt�zÑ!÷ 	'ç&Ñ&ó	'ˆt�z÷ 	'ò 	'ç &¡÷	'ò 	'ç&Ñ&ð ÷ 	'ñ 	'ç&™Yð ÷ 	'ò 	'ç&™Yð "÷ 	'õ 	'ç&Ñ&ð ˆfÐCÀDÀ8ð L&ð &÷	'÷ 	'ö 	'ç&Ñ&÷	'ö 	'ñ'ùó =s   ¹GÁGc                óR  — t        t        dz  «      j                  d«      xs i }|j                  «       D ��cg c]  \  }}|dk(  sŒ|‘Œ }}}|D �cg c]  }t        |› d�z  j	                  «       rŒ|‘Œ! }}| j                  «       5  t        d«       |st        d«       |D ]   }|t        v rdnd}t        d	|› d
|› d�«       Œ" t        dt        |«      t        |«      z
  › dt        |«      › dt        t        «       «      › �«       ddd«       yc c}}w c c}w # 1 sw Y   yxY w)u¤  NEFAILUJÃ�CÃ� informaÄ�nÃ­ test: vypÃ­Å¡e agenty z allowlistu bez `.md`.

    OdÅ¯vodnÄ›nÃ­: v F1 existujÃ­ jen tÅ™i agenti, zbÃ½vajÃ­cÃ­ vzniknou aÅ¾ ve F4.
    ChybÄ›jÃ­cÃ­ `.md` NENÃ� chyba F1 â€” Gate 0 nesmÃ­ blokovat postup projektu
    kvÅ¯li tomu, Å¾e F4 jeÅ¡tÄ› nenastal. Test jen vypÃ­Å¡e seznam doplnit, aby
    byl pÅ™i F4 dohledatelnÃ½. PouÅ¾Ã­vÃ¡ `print`, nikoli `assert` â€” zÃ¡mÄ›rnÄ›
    nefailuje.
    r@  r�   rd   rn   uO   
[Gate 0/F1] Agenti z orchestrÃ¡torova allowlistu bez .md (oÄ�ekÃ¡vanÃ© do F4):u,     (Å¾Ã¡dnÃ½ â€” allowlist je plnÄ› pokrytÃ½)u   oÄ�ekÃ¡vanÃ© do F4u   POZOR: mimo znÃ¡mÃ½ seznam F4z  - z (r¸   z[Gate 0/F1] pokryto: r   u%   ; celkem .md agentÅ¯ v .kilo/agent/: N)
rY   r=   rX   r�   r©   rW  rX  ÚF4_EXPECTED_PENDINGr   rA   )	rY  r�   r�   r‘   r~  ÚnÚpendingrL   Úmarkers	            r(   Ú test_allowlist_agents_pending_f4r…    sC  € ô œYÐ):Ñ:Ó;×?Ñ?ÀÓGÒMÈ2€DØ#Ÿz™z›|×<‘t�q˜!¨q°G«|’Ð<€IÑ<Ø#ÖM�Q¬I¸1¸#¸S¸	Ñ,A×+JÑ+JÕ+LŠqÐM€GÐMà	�‰Ó	ñ RÜÐ`ÔaÙÜÐ@ÔAØò 	,ˆDØ.2Ô6IÑ.IÑ*Ø:ð ä�D˜˜˜b  ¨Ð*Õ+ð	,ô 	Ð%¤c¨)£n´s¸7³|Ñ&CÐ%DÀAÄcÈ)ÃnÐEUÐUzÔ{~ô  @Ló  @Nó  |Oð  {Pð  Qô  	R÷Rð Rùó =ùÚM÷Rð Rús$   ¹DÁDÁDÁ2DÂBDÄD&c                 ó  — t        «       j                  d«      } t        | t        «      }|�s%t	        j
                  d| ›d�«      dz   dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      nddt        j                  «       v st	        j                  | «      rt	        j                  | «      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d}| j                  }d	} ||«      }d
di}||k(  }|�s	t	        j                  d|fd||f«      dt        j                  «       v st	        j                  | «      rt	        j                  | «      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }t	        j
                  dj                  | j                  d	«      «      «      dz   d|iz  }t        t	        j                  |«      «      ‚dx}x}x}x}}y)u‡  `mcp.cyberbrain26 == {"enabled": false}`.

    OdÅ¯vodnÄ›nÃ­: invariant 1 a 2 (Â§14.1, Â§14.2) â€” fail-closed. MCP server
    v F1 v repu neexistuje (ovÄ›Å™eno: `src/cyberbrain26/mcp/` neexistuje,
    `mcp` SDK nenÃ­ v `pyproject.toml`), proto musÃ­ bÃ½t explicitnÄ› vypnutÃ½.
    ChybÄ›jÃ­cÃ­ klÃ­Ä� by znamenal, Å¾e stav zÃ¡visÃ­ na vÃ½chozÃ­ hodnotÄ› Kilo,
    tedy tichÃ½ pÅ™echod.
    Úmcpzmcp=u    nenÃ­ objektr»   rO   rP   r    NÚcyberbrain26ÚenabledFrÏ   r  r  u8   mcp.cyberbrain26={!r}, oÄ�ekÃ¡vÃ¡no {{'enabled': False}}r  rÖ   )r4   rX   rO   rP   r   r€   r�   r‚   rƒ   r„   r…   r†   rª   rÈ   )	r‡  r¬   r­   r«   rÀ   r  rÚ   r!  rß   s	            r(   Ú#test_mcp_server_explicitly_disabledrŠ  1  sÚ  € ô ‹.×
Ñ
˜UÓ
#€CÜ�cœ4Ó Ð=Ò ×=Ö= D¨¨¨}Ð"=×=×=×=×=×=Ó=Œ:×=×=Ó=Œ:×=×=×=×=×=Ò=�c×=×=Ó=�c×=×=×=×=×=Ò=œ4×=×=Ó=œ4×=×=Ô=Ð ×=×=×=×=×=Ð=Ø�7‰7ð &�>ð &‰7�>Ó"ð & y°%Ð&8ð &Ð"Ð&8Ñ8÷ &ð &ç%Ñ%ó&Ð"Ð&8÷ &ò &ç%™v÷&ò &ç%Ñ%ð ÷ &ñ &ç%™Ið ÷ &ò &ç%™Ið ÷ &ð &ç%™Ið "÷ &ð &ç%™Ið #÷ &ð &ç%™Ið '9÷ &õ &ç%Ñ%ð 	C×IÑIØ�G‰G�NÓ#ó	%÷&÷ &ö &ç%Ñ%÷&÷ &ô &r*   c                 ó¾  — t        «       } dD ]é  }|| v}|sßt        j                  d|fd|| f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      nddt        j                  «       v st        j
                  | «      rt        j                  | «      nddœz  }t        j                  d|›�«      dz   d	|iz  }t        t        j                  |«      «      ‚d
}Œë g }d}|| v}|}|s| d   }t        |t        «      }	|	}|�s³t        j                  d|fd|| f«      t        j                  |«      dt        j                  «       v st        j
                  | «      rt        j                  | «      nddœz  }
dd|
iz  }|j                  |«       |sÑddt        j                  «       v st        j
                  t        «      rt        j                  t        «      ndt        j                  «      dt        j                  «       v st        j
                  t        «      rt        j                  t        «      ndt        j                  	«      dœz  }|j                  |«       t        j                  |d«      i z  }t        j                  d«      dz   d|iz  }t        t        j                  |«      «      ‚d
x}x}x}x}x}}	y
)uÐ  Konfigurace nesmÃ­ obsahovat `permissions`, `features` ani top-level
    `mode` jako Å™etÄ›zec.

    OdÅ¯vodnÄ›nÃ­: invariant 1 (Å¾Ã¡dnÃ½ tichÃ½ pÅ™echod) â€” `Config` mÃ¡
    `additionalProperties: false`, takÅ¾e CLI by takovou konfiguraci odmÃ­tlo;
    pÅ™Ã­padnÃ© tichÃ© ignorovÃ¡nÃ­ neznÃ¡mÃ©ho klÃ­Ä�e by znamenalo, Å¾e autor pravidla
    se mÃ½lÃ­, ale test mlÄ�el. `mode` na top-level je objekt oznaÄ�enÃ½
    `@deprecated` â€” Å™etÄ›zec tam nepatÅ™Ã­.
    )ÚpermissionsÚfeaturesr0  )z%(py0)s not in %(py2)sÚbadrŸ   rÌ   u   neplatnÃ½ top-level klÃ­Ä�: rñ   rž   Nrp   )z%(py3)s not in %(py5)s)r¦   r¨   z%(py7)sr$  z2%(py14)s
{%(py14)s = %(py9)s(%(py11)s, %(py12)s)
}rO   rP   )rÕ   rÖ   rÔ   r4  r   uL   top-level 'mode' jako Å™etÄ›zec je neplatnÃ½ (schema mÃ¡ objekt @deprecated)r5  r6  )r4   r   rª   r�   r‚   rƒ   r„   r€   r…   r†   rO   rP   r   r   )rŸ   rŽ  r«   rÙ   r­   r¯   rÂ   r®   rÞ   Ú@py_assert13r±   Ú@py_format8r  r8  r9  s                  r(   Útest_no_invalid_top_level_keysr‘  A  sp  € ô ‹.€CØ*ò FˆØ˜#ˆ~×E×EÕEˆs˜#×E×E×E×E×EÑEˆs×E×EÓEˆs×E×E×E×E×EÒE˜#×E×EÓE˜#×E×E×EÑEÐ!=¸c¸WÐE×E×E×E×E×EÕEðFñXˆ6ð Xˆ6˜Ðô X¨3¨v©;ð X¤
¨;¼Ó =ð XÐ =÷ Xð XßFWÑFWóXˆ6˜÷ Xñ XßNWÉið ÷ Xñ XßQWÑQW÷Xò Xß?WÑ?Wð ÷ Xñ XßNWÉið ÷ X÷ Xò XßQWÑQWðXÜQW÷Xð XßQWÑQW÷Xò Xß?WÑ?Wô !+÷ Xñ XßNWÉiô !+÷ Xò XßNWÉið ,7÷ Xñ XßQWÑQW÷Xò Xß?WÑ?Wô 9=÷ Xñ XßNWÉiô 9=÷ Xò XßNWÉið !>÷ Xñ XßQWÑQWðXÜQWôXßIWÉ÷Xö XßFWÑFWÐV÷X÷ Xö XßDWÑDW÷X÷ Xö Xr*   c            	     ó>  — d} ddi}ddi}t        | ||«      }d}||k(  }|sñt        j                  d|fd||f«      dt        j                  «       v st        j
                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d
x} x}x}x}x}}y
)uA   (a) Agent mÃ¡ hodnotu â†’ vyhrÃ¡vÃ¡ agent, globÃ¡l se nepouÅ¾ije.r
   rQ  re   rÏ   ©zC%(py8)s
{%(py8)s = %(py0)s(%(py2)s, %(py4)s, %(py6)s)
} == %(py11)srb   r  r  r×   N©	rb   r   rª   r�   r‚   rƒ   r„   r…   r†   r  s           r(   Útest_resolve_agent_value_winsr•  V  sµ   € àÐG˜V U˜OÐG¨f°fÐ-=ÐGŒ8�F˜OÐ-=Ó>ÐGÀ%ÐGÐ>À%ÑG×G×GÕGÐ>À%×G×G×G×G×GÑGŒ8×G×GÓGŒ8×G×GÔG�F×G×GÒG˜O×G×GÒGÐ-=×G×GÒGÐ>×G×GÒGÀ%×G×G×G×G×G×G×GÒGr*   c            	     ó>  — d} ddi}ddi}t        | ||«      }d}||k(  }|sñt        j                  d|fd||f«      dt        j                  «       v st        j
                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d
x} x}x}x}x}}y
)u7   (b) KlÃ­Ä� v agentovi chybÃ­ â†’ zdÄ›dÃ­ se z globÃ¡lu.ri  r
   re   rÏ   r“  rb   r  r  r×   Nr”  r  s           r(   Ú4test_resolve_inherits_from_global_when_agent_missingr—  [  s¸   € àÐI˜V VÐ,ÐI¨v°vÐ.>ÐIŒ8�FÐ,Ð.>Ó?ÐIÀ6ÐIÐ?À6ÑI×I×IÕIÐ?À6×I×I×I×I×IÑIŒ8×I×IÓIŒ8×I×IÔI�F×I×IÒIÐ,×I×IÒIÐ.>×I×IÒIÐ?×I×IÒIÀ6×I×I×I×I×I×I×IÒIr*   c            	     ó<  — d} ddi}ddi}t        | ||«      }d}||u }|sñt        j                  d|fd||f«      dt        j                  «       v st        j
                  t         «      rt        j                  t         «      ndt        j                  | «      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚dx} x}x}x}x}}y)ut   (c) ChybÃ­ v obou â†’ `None` = nic nenÃ­ nastaveno (fail), ne vÃ½chozÃ­
    hodnota zachycenÃ¡ tichou dÄ›diÄ�nostÃ­.r
   ri  re   N)Úis)zC%(py8)s
{%(py8)s = %(py0)s(%(py2)s, %(py4)s, %(py6)s)
} is %(py11)srb   r  r  r×   r”  r  s           r(   Ú.test_resolve_returns_none_when_missing_in_bothrš  `  sº   € ð ÐG˜V VÐ,ÐG¨v°vÐ.>ÐGŒ8�FÐ,Ð.>Ó?ÐGÀ4ÐGÐ?À4ÐG×G×GÕGÐ?À4×G×G×G×G×GÑGŒ8×G×GÓGŒ8×G×GÔG�F×G×GÒGÐ,×G×GÒGÐ.>×G×GÒGÐ?×G×GÒGÀ4×G×G×G×G×G×G×GÒGr*   c                 óv  — t        ddddiiddi«      } d}| |k(  }|s™t        j                  d|fd| |f«      dt        j                  «       v st        j
                  | «      rt        j                  | «      ndt        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚dx}}y)uä   (d) `bash` jako dict v agentovi `{...}` s chybÄ›jÃ­cÃ­m `"*"` padÃ¡ na
    globÃ¡l â€” `"*"` je catch-all a bez nÄ›j dict nenÃ­ ÃºplnÃ½, takÅ¾e nesmÃ­
    pÅ™epsat globÃ¡lnÃ­ deny. EfektivnÃ­ hodnota je zde globÃ¡lnÃ­ deny.
    r
   ÚgitrQ  re   rÏ   rR  Ú	effectiver  zassert %(py5)sr¨   Nr”  )r�  r¯   r«   r°   r±   s        r(   Ú>test_resolve_agent_bash_dict_without_star_falls_back_to_globalrž  f  sy   € ô
 ˜ &¨5°%¨.Ð!9¸FÀFÐ;KÓL€IØÐˆ9˜Ñ××Õˆ9˜×××××Ñˆ9××Óˆ9××Ô˜××××××Òr*   rQ  re   r^   )r^   r
   r   r   r   r�   c                ó   — t        t        «      }d|d<   t        | dd|«      }|j                  } |«       }|s£t	        j
                  d«      dz   dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	x}}t        d|t        «      }|s{t	        j
                  d
«      dz   ddt        j                  «       v st	        j                  |«      rt	        j                  |«      ndiz  }t        t	        j                  |«      «      ‚d„ |D «       }t        |«      }|s«t	        j
                  |«      dz   dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	x}}t        j                  |j!                  d¬«      j#                  dd«      d   «      }|d   d   }	d}|	|k(  }
|
slt	        j$                  d|
fd|	|f«      t	        j                  |	«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d	x}	x}
}d}|d   }t        ||t        «      }|sòddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      t	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }t        t	        j                  |«      «      ‚d	x}x}}y	) u&  Meta-test: faleÅ¡nÃ½ agent s `bash: allow` musÃ­ bÃ½t odmÃ­tnut.

    OdÅ¯vodnÄ›nÃ­: brÃ¡nÃ­me Gate 0 pÅ™ed tichÃ½m prÅ¯chodem. Kdyby kontrolnÃ­ logika
    nedÄ›lala nic, vÅ¡echny ostatnÃ­ testy by byly zelenÃ© bez jakÃ©koli pojistky.
    `tmp_path` zajiÅ¡Å¥uje, Å¾e se do repa nezapisuje.
    rd   r
   zfake-allowerr	   u9   meta-test fixtures musÃ­ bÃ½t zapisovÃ¡ny jen do tmp_pathrš   rx   rœ   Nu@   detekce bash: allow MUSÃ� selhat (jinak Gate 0 nic nekontroluje)r|   r}   Ú
violationsc              3  ó$   K  — | ]  }d |v –— Œ
 y­w)z'allow'Nr8   ©r:   r‘   s     r(   r<   z3test_detector_rejects_bash_allow.<locals>.<genexpr>‹  s   è ø€ Ò2 !ˆy˜AŒ~Ñ2ùó   ‚ú.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úanyr,   r-   rC   rD   r   rW   rÏ   r  r  zassert %(py6)sr´   z>assert %(py7)s
{%(py7)s = %(py0)s(%(py2)s, %(py4)s, %(py5)s)
}rj   Ú_GLOBAL_DENY_BASELINE)r}   r�   rž   r¨   r$  )rP   r¦  rz   r©   r   r€   r�   r‚   rƒ   r„   r…   r†   rj   r¥  rH   rI   r/   rG   rª   )Útmp_pathrf   rx   r«   r¬   r­   r   r‡   Úreloadedr®   r¯   rÁ   r%  r�  s                 r(   Ú test_detector_rejects_bash_allowr©  }  sX  € ô Ô+Ó,€JØ €JˆvÑÜ	˜8 ^°ZÀÓ	L€BØ�:‰:ÐT‰:‹<ÐT‰<×TÖTÐT×T×T×T×T×TÓTˆ2×T×TÓTˆ2×T×TÔTˆ:×T×TÒTˆ<×T×T×T×T×TÒTä˜V ZÔ1FÓG€JÙ×YÖYÐY×Y×Y×Y×Y×YÔYˆ:×Y×YÓYˆ:×Y×Y×Y×Y×YÙ2 zÔ2Ð>Œ3Ð2Ó2Ð>Ñ2×>Ö>°J×>×>×>×>×>Ó>Œ3×>×>Ó>Œ3×>×>Ô>Ð2×>×>Ò>Ð2×>×>×>×>×>Ò>ô �~‰~˜bŸl™l°G˜lÓ<×BÑBÀ5È!ÓLÈQÑOÓP€HØ�LÑ! &Ñ)Ð4¨WÐ4Ð)¨WÑ4×4×4Õ4Ð)¨W×4×4Ó4Ð)×4×4Ò4¨W×4×4×4×4×4×4Ó4ØÐM˜x¨Ñ5ÐMŒ;�vÐ5Ô7LÓMÐMÑM×M×M×M×MÕMŒ;×M×MÓMŒ;×M×MÔM�v×M×MÒMÐ5×M×M×M×M×MÐMÔ7L×M×MÓMÔ7L×M×MÔMÐM×M×M×M×M×MÕMr*   c           	     óÆ  — t        t        «      }|d= t        | dd|«      }|j                  } |«       }|s�ddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx}}t        d|t        «      }d„ |D «       }t        |«      }|s«t        j                  |«      d	z   d
t	        j
                  «       v st        j                  t        «      rt        j                  t        «      nd
t        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚dx}}d}t        ||t        «      }d}||k(  }	|	�sSt        j                  d|	fd||f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚dx}x}x}	}t!        j"                  |j%                  d¬«      j'                  dd«      d   «      }d}|d   }||v}|s‚t        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }t        j                  d«      dz   d|iz  }t        t        j                  |«      «      ‚dx}x}}y) u„  Meta-test: agent s chybÄ›jÃ­cÃ­m `bash` (tichÃ¡ dÄ›diÄ�nost) musÃ­ bÃ½t odmÃ­tnut.

    OdÅ¯vodnÄ›nÃ­: totÃ©Å¾ co vÃ½Å¡e, ale pro druhÃ½ zpÅ¯sob selhÃ¡nÃ­ â€” klÃ­Ä� `bash`
    ve frontmatteru vÅ¯bec nenÃ­, takÅ¾e by se spolÃ©halo na dÄ›diÄ�nost z globÃ¡lu.
    Dva nezÃ¡vislÃ© zÃ¡pisy jsou zÃ¡mÄ›r, ale chybÄ›jÃ­cÃ­ zÃ¡pis musÃ­ bÃ½t viditelnÃ½ uÅ¾
    v Gate 0, ne aÅ¾ pÅ™i auditu.
    r
   zfake-silentr	   zBassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}rx   rœ   Nc              3  ó$   K  — | ]  }d |v –— Œ
 y­w)znot explicitly deniedNr8   r¢  s     r(   r<   z5test_detector_rejects_missing_bash.<locals>.<genexpr>¢  s   è ø€ Ò@°Ð&¨!Ô+Ñ@ùr£  r¤  r¥  re   rÏ   )zB%(py6)s
{%(py6)s = %(py0)s(%(py2)s, %(py3)s, %(py4)s)
} == %(py9)srb   rf   r¦  )r}   r�   r¦   rž   r´   rÕ   zassert %(py11)srÖ   r,   r-   rC   rD   r   rW   r0  )z%(py1)s not in %(py4)sr  u%   fixture musÃ­ opravdu postrÃ¡dat bashr  r´   )rP   r¦  rz   r©   r�   r‚   r   rƒ   r„   r…   r†   rj   r¥  r€   rb   rª   rH   rI   r/   rG   )r§  rf   rx   r«   r¬   r­   r   rÀ   r  rÚ   r!  rß   r¨  r®   r¯   rÁ   s                   r(   Ú"test_detector_rejects_missing_bashr¬  ”  sH  € ô Ô+Ó,€JØ�6ÐÜ	˜8 ]°JÀ
Ó	K€BØ�:‰:Ð‰:‹<Ð‰<××××Õˆ2××Óˆ2××Ôˆ:××Òˆ<×××××Òä˜V ZÔ1FÓG€JÙ@°ZÔ@ÐLŒ3Ð@Ó@ÐLÑ@×LÖLÀ*×L×L×L×L×LÓLŒ3×L×LÓLŒ3×L×LÔLÐ@×L×LÒLÐ@×L×L×L×L×LÒLð ÐHŒ8�F˜JÔ(=Ó>ÐHÀ&ÐHÐ>À&ÑH×H×HÖHÐ>À&×H×H×H×H×HÑHŒ8×H×HÓHŒ8×H×HÔH�F×H×H×H×H×HÐH˜J×H×HÓH˜J×H×H×H×H×HÒHÔ(=×H×HÓHÔ(=×H×HÔHÐ>×H×HÒHÀ&×H×H×H×H×H×HÕHä�~‰~˜bŸl™l°G˜lÓ<×BÑBÀ5È!ÓLÈQÑOÓP€HØÐX˜ ,Ñ/ÐXˆ6Ð/Ð/×X×XÕXˆ6Ð/×X×XÓXˆ6×X×XÒXÐ/×X×X×XÐ1X×X×X×X×X×X×XÑXr*   )r    rç   Úreturnrç   )r2   r   r­  rP   )r­  Úlist)r­  rP   )r\   rç   r_   rP   r`   rP   )r\   rç   rf   rP   rg   rP   r­  r®  )
rv   r   rL   rç   rp   rç   rW   rP   r­  r   )rW   rP   r­  rŽ   )rW   rP   r–   rç   r­  rŽ   )RÚ__doc__Ú
__future__r   Úbuiltinsr�   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r0   Úpathlibr   r¾   rH   Ú__file__Úresolverl   Ú	REPO_ROOTÚKILO_DIRr›   r=   rÇ   ÚMUST_BE_EXPLICIT_DENYr�  r)   r4   rA   rT   rY   r[   rb   rj   rz   rˆ   r‹   r’   r—   r²   rÅ   rÉ   Úparamrÿ   rÍ   rá   rê   rÄ   Úparametrizer  r
  r  r  r  r"  r'  r-  r:  r>  rD  Ú	frozensetrU  rV  rØ   rO  ra  rd  r  rp  rs  rx  r{  r|  r  r…  rŠ  r‘  r•  r—  rš  rž  r¦  r©  r¬  rŠ   s   0r(   ú<module>r¾     sÁ  ðñõ  #ç  „ ƒÝ ã Û á�‹N×"Ñ"Ó$×,Ñ,¨QÑ/€	Ø�wÑ€Ø˜<Ñ'€Ø�wÑ€	â,€ð UÐ ò	Ð ó)ðX ,ô 2ó
5ó2ó*5ó2óó$ó 
ó,óRó
	8óò0KòNò@:ñ$ ;G».ÖI°Q�l�f—l‘l 1¨¯©Ö0ÒIÐ òTò@ð0 ‡�×Ñ˜Ð'9Ó:ñló ;ðlòD)ò<rò&6ð ‡�×Ñ˜Ð!6Ó7ñ`ó 8ð`ò&Rò*'
òTaò.WòD"[òJ$bñV !ò "ó Ð ñ" "ò #ó Ð ð €V‡\�\�$˜8Ô$Ð%Ù)5«Ö8 A€\€V‡\�\�!˜Ÿ™ÖÒ8ñ9ð ð ‡�×Ñ˜Ð'AÓBñ%ó Cð%ò(GDòT-JñH !*ò +ó !Ð ò$Cò<5òJðR Ø�:ñÐ ò 2òF'ò.Rò8&ò Xò*Hò
Jò
Hòð 
ØØ ØØØ�&ˆMñÐ òNó.Yùòy Jùòf 9s   Â,%HÅ*%H