Ë
    ¶
Þj”ž  ã                  óz  — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 dZ
dZdZdZ eh d	£«      Zd
Z eh d£«      ZdZdZdZdZdZdZdZdZ ej4                  d«      ZdZd„ ZdBd„Z ed¬«       G d„ d«      «       ZddœdCd„Z dDd„Z!dd d!d"œ	 	 	 	 	 dEd#„Z"dd$œdFd%„Z#eddd&œ	 	 	 dGd'„Z$edd(œdHd)„Z%dHd*„Z&dIdHd,„Z'dJd-„Z(dKd.„Z)dLd/„Z*dMd0„Z+dNd1„Z,dOd2„Z-efdHd3„Z.dPdQd4„Z/dRd5„Z0dSd6„Z1dTd7„Z2dUd8„Z3 G d9„ d:e4«      Z5dVd;„Z6dWd<„Z7dddddd=œ	 	 	 	 	 dXd>„Z8d+dd!dedddddddd?œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dYd@„Z9g dA¢Z:y)ZaE  Kaefig-Profile fuer iso_exec.py.

Zwei Profile:
  text  (Default): Codex mit read-only-Sandbox; nur ephemere Arbeits-/CODEX_HOME-Baeume,
        kein Zugriff auf /home/aria, Netz nur TCP:443. Minimaler Baum (Codex ist statisch).
  tools ("B+", Owner-Entscheidung 24.10.): Codex mit abgeschalteter innerer Sandbox,
        darf GANZ /home/aria LESEN AUSSER Zugangsdaten, System (/usr,/etc) lesen+
        ausfuehren, aber `claude` NIE ausfuehren/lesen; Netz TCP/UDP frei; AF_UNIX gesperrt.
        SCHREIBEN (E44 Option 2, Kais TG 12923, 25.10.2026): nur in den ephemeren Lauf-
        Verzeichnissen (Workspace, Lauf-Home, CODEX_HOME, TMPDIR; plus /dev/null und - nur mit
        codex_auth_writable - die auth-KOPIE) und in ausdruecklich konfigurierten Projektordnern
        (codex.tools_write_allowlist, Default leer, validate_write_allowlist). Damit kann Codex
        keine Datei mehr anlegen/aendern, die spaeter ein ungekaefigter Prozess ausfuehrt, ausser
        in einem bewusst freigegebenen Ordner.

Landlock-Semantik (empirisch verifiziert, scratchpad/lane-codex): Rechte sind die UNION aller
Regeln auf dem Pfad UND seinen Vorfahren. Eine spezifischere Regel kann Rechte nur ADDIEREN,
nie entziehen. Daher wird jede Sperre (Secrets, claude, read-only-auth) per DESCENT gebaut:
der verbotene Pfad bekommt KEINE Regel und KEINEN Rechte-gewaehrenden Vorfahren.

M1 (auth read-only): das eine erlaubte Credential wird als KOPIE in ein read-only authdir gelegt
(file_ro), NICHT als Symlink auf ~/.codex (Review M1: Symlink loeste auf das echte Inode mit RW auf).
Im ephemeren CODEX_HOME liegt auth.json als Verweis (Symlink) auf die read-only-Kopie. Das echte
~/.codex ist NIE in der Allowlist. codex_auth_writable (Default False) macht nur die KOPIE schreibbar
(wird mit dem Lauf verworfen); das echte Login kann der Kaefig in keinem Modus zerstoeren.
é    )ÚannotationsN)Ú	dataclassÚfield)z/etc/ssl)z/etc/resolv.confz
/etc/hostsz/etc/localtimez/dev/urandom)z/etc)z/usrz/home/aria/.localz/home/aria/.nvmz/home/aria/.bun>   ú.npmú.venvú.cacheú.cargoú.rustupú.pnpm-storeúdist-packagesúsite-packagesÚvenvÚtargetÚ__pycache__Únode_modulesú.bunú.gitú.nvm)z.pemz.keyz.p12z.pfxz	.keystorez.jksz.ovpnz.kdbx>	   ú.netrcú.npmrcú.my.cnfú.pgpassú.pypircú.zsh_historyú.bash_historyú.python_historyú.git-credentials)z.sshz.claudez.codexz
.config/ghz.config/rclonez.gnupgz.awsz.kube)z.aria-chat.dbr   z.docker/config.jsonz.cargo/credentialsz.cargo/credentials.tomlz.claude.json)ú.bashrcú.profileú.bash_profileú.bash_loginz.bash_logoutú.zshrc)z	CLAUDE.mdz	AGENTS.md)z.configÚscriptsz.localr   r   z
.cargo/binÚbrainÚstate)z
.cargo/env© )r   r   r    r!   r"   z=(?:^|[;&|{}()\s])\\?(?:\.|source)\s+(["\']?)([^"\';&|)\s]+)\1)z
.gitconfigc                óø   — g }| D ]r  }t         j                  j                  |«      }t         j                  j                  |«      sŒBt         j                  j	                  |«      rŒb|j                  |«       Œt |S ©N)ÚosÚpathÚrealpathÚexistsÚislinkÚappend)ÚpathsÚoutÚpÚrps       ú?/home/aria/aria-v3-dev/python/aria_router/isolation/profiles.pyÚ_real_existingr4   l   s[   € Ø
€CØò ˆÜ�W‰W×Ñ˜aÓ ˆÜ�7‰7�>‰>˜"Õ¤b§g¡g§n¡n°RÕ&8Ø�J‰J�r�Nðð €Jó    c                ó|  — | j                  «       }t        j                  j                  |«      \  }}| dk(  s"|j	                  d«      s| j                  d«      ryd|v ry|t        v ry|j	                  d«      s|j	                  d«      s|dk(  ry| t        v ry|j                  d«      r|j	                  d«      syy	)
Nz.envTÚ
credentialz-secretsz.secretsÚsecretsÚid_z.pubF)Úlowerr)   r*   ÚsplitextÚendswithÚ
startswithÚ
SECRET_EXTÚSECRET_NAMES)ÚnameÚlowÚ_Úexts       r3   Ú_is_secret_namerD   u   s¤   € Ø
�*‰*‹,€CÜ�W‰W×Ñ˜cÓ"�F€A€sØˆv‚~˜Ÿ™ fÔ-°·±ÀÔ1HØØ�sÑØØ
ŒjÑØØ
‡|�|�JÔ 3§<¡<°
Ô#;¸sÀiÒ?OØØŒ|ÑØØ
‡~�~�eÔ S§\¡\°&Ô%9ØØr5   T)Úfrozenc                  ór   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   edd	„«       Zedd
„«       Zy)ÚRunDirsz;Ephemere Pfade eines einzelnen Laufs (vom Runner angelegt).ÚstrÚrootÚ	workspaceÚhomeÚ
codex_homeÚauthdirÚtmpc                óV   — t         j                  j                  | j                  d«      S ©Nz	auth.json)r)   r*   ÚjoinrM   ©Úselfs    r3   Ú	auth_copyzRunDirs.auth_copy‘   s   € ä�w‰w�|‰|˜DŸL™L¨+Ó6Ð6r5   c                óV   — t         j                  j                  | j                  d«      S rP   )r)   r*   rQ   rL   rR   s    r3   Úcodex_home_auth_linkzRunDirs.codex_home_auth_link•   s   € ä�w‰w�|‰|˜DŸO™O¨[Ó9Ð9r5   N)ÚreturnrH   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__ÚpropertyrT   rV   r&   r5   r3   rG   rG   ‡   sI   … áEØ
ƒIØƒNØ
ƒIØƒOØƒLØ	ƒHàò7ó ð7ð ò:ó ñ:r5   rG   ©Úhome_overridec               óX   — |xs | j                   dd| j                  | j                  ddœS )Nú/usr/bin:/binzC.UTF-8Ú1)ÚHOMEÚPATHÚLANGÚTMPDIRÚ
CODEX_HOMEÚNO_COLOR)rK   rN   rL   )Údirsr_   s     r3   Úbase_envrj   š   s/   € àÒ* §¡ØØØ—(‘(Ø—o‘oØñð r5   c                óB   — |rg | j                   gfS | j                   gg fS )z‹Gibt (file_ro, file_rw) fuer die auth-KOPIE zurueck. authdir hat sonst KEINE Regel
    (kein rw-Vorfahr) -> Kopie ist im Default read-only.)rT   )ri   Úwritable_auths     r3   Ú_auth_rulesrm   ¥   s+   € ñ Ø�D—N‘NÐ#Ð#Ð#Ø�N‰NÐ˜RÐÐr5   F)i»  é   )rl   Ú	tcp_portsÚmin_abic               ó’  — t        | |«      \  }}t        j                  j                  |«      }|| j                  |gt        t        t        «      «      t        t        t        «      «      |z   t        d«      |z   | j                  | j                  | j                  | j                  gt        |«      t        | «      t        |«      dœ
S )N©z	/dev/null)
rp   ÚcwdÚfile_xÚroÚfile_roÚfile_rwÚrwÚtcp_connectÚenvÚrlimits)rm   r)   r*   r+   rJ   Úlistr4   ÚSYSTEM_RO_DIRSÚSYSTEM_RO_FILESrK   rL   rN   rj   Údict)ri   Ú	codex_binr{   rl   ro   rp   rv   rw   s           r3   Útext_profiler�   ­   s�   € ä" 4¨Ó7Ñ€GˆWÜ—‘× Ñ  Ó+€IàØ�~‰~Ø�+Ü”>¤.Ó1Ó2Üœ¤Ó7Ó8¸7ÑBÜ! .Ó1°GÑ;à�~‰~˜tŸy™y¨$¯/©/¸4¿8¹8ÐDÜ˜I“Ü˜‹~Ü˜“=ñð r5   )Úfollow_symlinksc             #  óÚ  ‡	‡
K  — t         j                  j                  | «      } | |v s>t         j                  j                  | «      rt         j                  j	                  | «      ry| g}|�r]|j                  «       Š
t        ˆ
fd„|D «       «      }|s‰
df–— Œ0	 t        t        j                  ‰
«      «      }|D �]  }t         j                  j                  ‰
|«      Š	‰	|v rŒ)t         j                  j	                  ‰	«      r|sŒK	 t         j                  j                  ‰	«      xr  t         j                  j	                  ‰	«       }t         j                  j                  ‰	«      xr  t         j                  j	                  ‰	«       }|r-t        ˆ	fd„|D «       «      r|j                  ‰	«       Œö‰	df–— Œý|s�Œ‰	df–— �Œ	 |r�Œ\yy# t        $ r Y �Œmw xY w# t        $ r Y �Œ,w xY w­w)zþLiefert (abspath, is_dir) fuer Baeume/Dateien, die ganz freigegeben werden koennen,
    ohne einen blockierten Pfad einzuschliessen. Blockierte Pfade (und ihre Teilbaeume)
    bekommen KEINE Regel. Symlinks werden uebersprungen (N4 / kein Tree-Ausbruch).Nc              3  óp   •K  — | ]-  }|‰k7  xr" |j                  ‰t        j                  z   «      –— Œ/ y ­wr(   ©r=   r)   Úsep)Ú.0ÚbÚds     €r3   ú	<genexpr>z_descend.<locals>.<genexpr>Ì   s.   øè ø€ ÒJ¸Q�Q˜!‘VÒ8 §¡¨Q´·±©ZÓ 8Ó8ÑJùó   ƒ36Tc              3  óp   •K  — | ]-  }|‰k(  xs" |j                  ‰t        j                  z   «      –— Œ/ y ­wr(   r…   )r‡   rˆ   Úcps     €r3   rŠ   z_descend.<locals>.<genexpr>à   s.   øè ø€ ÒMÀ�q˜B‘wÒ; !§,¡,¨r´B·F±F©{Ó";Ó;ÑMùr‹   F)r)   r*   ÚabspathÚisdirr-   ÚpopÚanyÚsortedÚlistdirÚOSErrorrQ   Úisfiler.   )rI   Úblockedr‚   ÚstackÚinsideÚnamesr@   Úis_dirÚis_filer�   r‰   s            @@r3   Ú_descendrœ   Â   s†  ùè ø€ ô �7‰7�?‰?˜4Ó €DØˆw�œbŸg™gŸm™m¨DÔ1´R·W±W·^±^ÀDÔ5IØØˆF€EÚ
Ø�I‰I‹KˆÜÓJÀ'ÔJÓJˆÙØ�d�)ŠOØð	Üœ2Ÿ:™: a›=Ó)ˆEð ó 	"ˆDÜ—‘—‘˜a Ó&ˆBØ�W‰}ØÜ�w‰w�~‰~˜bÔ!©/ØðÜŸ™Ÿ™ rÓ*ÒE´2·7±7·>±>À"Ó3EÐ/E�ÜŸ'™'Ÿ.™.¨Ó,ÒG´R·W±W·^±^ÀBÓ5GÐ1G�ñ ÜÓMÀWÔMÔMØ—L‘L Õ$à˜t˜*Ó$ÛØ˜5�kÔ!ð#	"õ øô ò 	Úð	ûô ò Úðüs\   „BG+ÂG Â9AG+ÄBGÆ	1G+Æ<G+Ç	G+Ç	GÇG+ÇGÇG+Ç	G(Ç$G+Ç'G(Ç(G+©Úprune_namesÚextra_prune_pathsÚwant_gitc               ó"  — t         j                  j                  | «      } |D �ch c]!  }t         j                  j                  |«      ’Œ# }}t        «       t        «       }}t        j                  | dd¬«      D �]‡  \  }}	}
|�rd|	v rþt         j                  j                  |d«      }t         j                  j                  |d«      t         j                  j                  |d«      }}t         j                  j                  |«      r0t         j                  j                  |«      s|j                  |«       t         j                  j                  |«      r0t         j                  j                  |«      s|j                  |«       |	D �cg c]*  }||vr$t         j                  j                  ||«      |vr|‘Œ, c}|	dd |
D ]=  }t        |«      sŒ|j                  t         j                  j                  ||«      «       Œ? �ŒŠ ||fS c c}w c c}w )a¦  EIN Durchlauf ueber home_root. Liefert (secret_files, git_protect):
      secret_files : Pfade nach Namensmuster verdaechtiger Dateien (NIE Inhalt).
      git_protect  : <repo>/.git/hooks-Verzeichnisse und <repo>/.git/config-Dateien (Startschutz H1).
    node_modules/.git/.cache/.cargo... werden fuer den Secret-Scan ausgelassen (haelt die Allowlist
    klein); .git wird aber VOR dem Prunen fuer git_protect ausgewertet.TF)ÚtopdownÚfollowlinksr   ÚhooksÚconfigN)r)   r*   rŽ   ÚsetÚwalkrQ   r�   r-   Úaddr•   rD   )Ú	home_rootrž   rŸ   r    r1   Úprune_pathsÚsecretÚgitÚdirpathÚdirnamesÚ	filenamesÚgr¤   Úcfgr‰   Úfns                   r3   Úscan_home_profiler³   è   s†  € ô —‘—‘ 	Ó*€IØ/@ÖA¨!”2—7‘7—?‘? 1Õ%ÐA€KÐAÜ“%œ›ˆC€FÜ(*¯©°	À4ÐUZÔ([ó 6Ñ$ˆ�˜9Ú˜ (Ñ*Ü—‘—‘˜W fÓ-ˆAÜŸ™Ÿ™ a¨Ó1´2·7±7·<±<ÀÀ8Ó3L�3ˆEÜ�w‰w�}‰}˜UÔ#¬B¯G©G¯N©N¸5Ô,AØ—‘˜”Ü�w‰w�~‰~˜cÔ"¬2¯7©7¯>©>¸#Ô+>Ø—‘˜”Ø"*ö `˜QØ ;Ñ.´2·7±7·<±<ÀÈÓ3KÐS^Ñ3^ò ò `ˆ‘ˆàò 	6ˆBÜ˜rÕ"Ø—
‘
œ2Ÿ7™7Ÿ<™<¨°Ó4Õ5ò	6ð6ð �3ˆ;Ðùò Bùò`s   ¤&HÆ	/H)rž   rŸ   c               ó&   — t        | ||d¬«      d   S )zTRueckwaertskompatible Schnittstelle: nur die Secret-Pfade (siehe scan_home_profile).Fr�   r   )r³   )r©   rž   rŸ   s      r3   Úscan_secret_filesrµ     s#   € ä˜Y°KØ/@È5ôRØRSñUð Ur5   c                ó´  — t         j                  j                  | «      } t        «       }t        t
        z   D ]ž  }t         j                  j                  t         j                  j                  | |«      «      }|j                  |«       t         j                  j                  |«      sŒq|j                  t         j                  j                  |«      «       Œ  |S )zÁHART gesperrte Credential-Pfade. Fuer Symlinks wird ZUSAETZLICH das realpath-Ziel gesperrt,
    damit ein Symlink (z. B. ~/.ssh -> ~/keystore) nicht am Ziel vorbei Zugriff gewaehrt (Review #5).)
r)   r*   rŽ   r¦   ÚHARD_CREDENTIAL_DIRSÚHARD_CREDENTIAL_FILESrQ   r¨   Úlexistsr+   )r©   r0   Úrelr1   s       r3   Úhard_credential_blocklistr»     s�   € ô —‘—‘ 	Ó*€IÜ
‹%€CÜ#Ô&;Ñ;ò )ˆÜ�G‰G�O‰OœBŸG™GŸL™L¨°CÓ8Ó9ˆØ�‰�Œ
Ü�7‰7�?‰?˜1ÕØ�G‰G”B—G‘G×$Ñ$ QÓ'Õ(ð	)ð
 €Jr5   ú
/home/ariac                óf  — t         j                  j                  | «      } dt         j                  j                  | d«      t         j                  j                  | d«      t         j                  j                  | d«      ddg}t	        «       }|D ]   }t         j                  j                  |«      sŒ#|j                  t         j                  j                  |«      «       t         j                  j                  |«      }t         j                  j                  |«      sŒ�|j                  |«       Œ¢ |S )z©Pfade, die im tools-Profil WEDER lesbar NOCH ausfuehrbar sein duerfen: der produktive
    claude (ein Start toetet das Telegram-Plugin). Alle Varianten + realpath-Ziele.z#/usr/lib/node_modules/@anthropic-aiz.local/share/claudez.local/state/claudez.local/bin/claudez/usr/bin/claudez/bin/claude)r)   r*   rŽ   rQ   r¦   r¹   r¨   r+   )r©   Úcandr–   r1   r2   s        r3   Úclaude_blocklistr¿     sÕ   € ô —‘—‘ 	Ó*€Ià-Ü
�‰�‰�YÐ 5Ó6Ü
�‰�‰�YÐ 5Ó6Ü
�‰�‰�YÐ 3Ó4Ø˜=ð€Dô ‹e€GØò  ˆÜ�7‰7�?‰?˜1ÕØ�K‰KœŸ™Ÿ™¨Ó*Ô+Ü—‘×!Ñ! !Ó$ˆBÜ�w‰w�‰˜rÕ"Ø—‘˜B•ð ð €Nr5   c                ód   — g g }}t        | |«      D ]  \  }}|r|n|j                  |«       Œ ||fS )z¬Abstieg ueber root ohne die gesperrten Pfade: (ganz freigebbare Teilbaeume, Einzeldateien).
    Welches Recht die Eintraege bekommen (ro oder rw), entscheidet der Aufrufer.)rœ   r.   )rI   r–   Ú	tree_dirsÚ
tree_filesr*   rš   s         r3   Ú
build_treerÃ   *  sD   € ð  ˆz€IÜ   wÓ/ò ;‰ˆˆfÙ‰ *×4Ñ4°TÕ:ð;à�jÐ Ð r5   c                ó   — t        | |«      S )zÿHistorischer Name: bis E44 wurde damit das ganze Home rw gewaehrt. Seit Option 2 nutzt
    tools_profile build_tree fuer den LESE-Baum des Homes und je Allowlist-Ordner fuer dessen rw-Baum;
    der Helfer bleibt als reiner Abstieg erhalten (Descent-Test).)rÃ   )r©   r–   s     r3   Úbuild_home_rwrÅ   3  s   € ô �i Ó)Ð)r5   c                ó²   — g g }}| D ]K  }t         j                  j                  |«      sŒ#t        ||«      D ]  \  }}|r|n|j	                  |«       Œ ŒM ||fS r(   )r)   r*   r�   rœ   r.   )Ú
exec_rootsr–   Úrx_dirsÚx_filesrI   r*   rš   s          r3   Úbuild_exec_rxrÊ   :  sf   € Ø˜2ˆW€GØò :ˆÜ�w‰w�}‰}˜TÔ"ØÜ$ T¨7Ó3ò 	:‰LˆD�&Ù‰W G×3Ñ3°DÕ9ñ	:ð:ð
 �GÐÐr5   c                óà  — t        «       t        «       }}|D �cg c]"  }t        j                  j                  | |«      ‘Œ$ c}t	        |«      z   }|D ]“  }t        j                  j                  |«      sŒ#t        j                  j                  |«      }t        j                  j                  |«      sŒbt        j                  j                  |«      r|n|j                  |«       Œ• ||fS c c}w )u±   Loest read-only-Ziele auf realpaths auf (N4: keine Symlinks in der Konfig). Liefert
    (ro_dir_targets, ro_file_target_paths) â€” jeweils existierende, symlink-freie realpaths.)
r¦   r)   r*   rQ   r|   r¹   r+   r,   r�   r¨   )	r©   ÚrelsÚabsesÚro_dirsÚro_filesÚrr¾   r1   r2   s	            r3   Ú_resolve_ro_targetsrÑ   D  s³   € ô ›œs›uˆX€GØ04Ö5¨1ŒB�G‰G�L‰L˜ AÕ&Ò5¼¸U»ÑC€DØò =ˆÜ�w‰w�‰˜qÔ!ØÜ�W‰W×Ñ˜aÓ ˆÜ�w‰w�~‰~˜bÔ!ØÜ—G‘G—M‘M "Ô%‰¨8×8Ñ8¸Õ<ð=ð �HÐÐùò 6s   ™'C+c                óf  — t         j                  j                  | «      } t        «       }	 t        j                  | «      }|D ]Û  }|j                  d«      }|s	|t        vrŒt         j                  j                  | |«      }t         j                  j                  |«      st         j                  j                  |«      sŒ~|rt        |«      rŒŒt         j                  j                  |«      |v rŒ®|j                  t         j                  j                  |«      «       ŒÝ |S # t
        $ r |cY S w xY w)aþ  Re-Review 2, 1a: ALLE regulaeren Top-Level-Dotfiles (Name beginnt mit '.') plus die
    Anweisungsdateien CLAUDE.md/AGENTS.md als read-only. Ausgenommen: Secrets (bleiben HART gesperrt,
    nicht nur ro -> sonst waeren sie lesbar) und bereits hart gesperrte Pfade (.claude.json/.aria-chat.db).
    Symlinks werden uebersprungen (N4). Nicht existierende Namen (z. B. latentes .bash_aliases) koennen
    gar nicht neu angelegt werden, weil home_root selbst keine rw-/MAKE_REG-Regel erhaelt (siehe tools_profile).ú.)r)   r*   rŽ   r¦   r“   r”   r=   ÚSTARTUP_RO_TOPLEVELrQ   r-   r•   rD   r¨   )r©   Ú
hard_blockr0   r™   r@   Úis_dotr1   s          r3   Útop_level_startup_filesr×   S  sî   € ô —‘—‘ 	Ó*€IÜ
‹%€CðÜ—
‘
˜9Ó%ˆð ò $ˆØ—‘ Ó%ˆÙ˜$Ô&9Ñ9ØÜ�G‰G�L‰L˜ DÓ)ˆÜ�7‰7�>‰>˜!Ô¤B§G¡G§N¡N°1Ô$5ØÙ”o dÔ+ØÜ�7‰7�?‰?˜1Ó Ñ+ØØ�‰”—‘—‘ Ó"Õ#ð$ð €Jøô ò ØŠ
ðús   «D" Ä"D0Ä/D0c                óP  — | j                  «       j                  d«      j                  d«      j                  «       } | sy| dk(  s
| dk(  s| dk(  r|S dD ]A  }| j                  |«      sŒt        j                  j	                  || t        |«      d «      c S  | j                  d«      rJt        j                  j                  | «      }||k(  s"|j                  |t        j                  z   «      r|S dS d	| v s| j                  d«      ryt        j                  j	                  || «      S )
z¦Loest ~/$HOME/absolute/relative Shell-Tokens auf home_root auf. KEINE Shell-Auswertung:
    unaufloesbare Variablen ($NVM_DIR o. ae.) -> None (uebersprungen, robust).ú"ú'Nú~z$HOMEz${HOME})z~/z$HOME/z${HOME}/ú/ú$)Ústripr=   r)   r*   rQ   ÚlenrŽ   r†   )Úrawr©   ÚprefÚaps       r3   Ú_resolve_home_tokenrã   n  s÷   € ð �)‰)‹+×
Ñ
˜CÓ
 ×
&Ñ
& sÓ
+×
1Ñ
1Ó
3€CÙØØ
ˆc‚z�S˜G’^ s¨iÒ'7ØÐØ,ò <ˆØ�>‰>˜$ÕÜ—7‘7—<‘< 	¨3¬s°4«y¨z¨?Ó;Ò;ð<ð ‡~�~�cÔÜ�W‰W�_‰_˜SÓ!ˆØ˜9’_¨¯©°iÄ"Ç&Á&Ñ6HÔ(IˆrÐSÈtÐSØ
ˆc�z�S—^‘^ CÔ(ØÜ�7‰7�<‰<˜	 3Ó'Ð'r5   c                ó¼  — t         j                  j                  | «      } t        «       }|D �]�  }t         j                  j	                  | |«      }t         j                  j                  |«      st         j                  j                  |«      sŒc	 t        |ddd¬«      5 }|j                  «       }ddd«       j                  «       D ]ñ  }|j                  «       j                  d«      rŒ#t        j                  |«      D ]·  }t        |j!                  d«      | «      }	|	�t         j                  j                  |	«      rŒ@t         j                  j                  |	«      }
|
| k(  s#|
j                  | t         j"                  z   «      sŒ‡t         j                  j                  |
«      sŒ§|j%                  |
«       Œ¹ Œó �Œ’ |S # 1 sw Y   �ŒxY w# t        $ r Y �Œ®w xY w)zº1d: parst `.`/`source <pfad>` aus den Shell-Startdateien, loest ~/$HOME auf, liefert
    existierende, symlink-freie, absolute Datei-Ziele unter home_root. Einfach und robust, kein eval.rÐ   úutf-8Úreplace©ÚencodingÚerrorsNú#é   )r)   r*   rŽ   r¦   rQ   r-   r•   ÚopenÚreadr”   Ú
splitlinesÚlstripr=   Ú
_SOURCE_REÚfinditerrã   Úgroupr†   r¨   )r©   Ústartup_filesr0   rº   ÚsfÚfhÚtextÚlineÚmÚtgtrâ   s              r3   Úparse_sourced_pathsrú   �  sk  € ô —‘—‘ 	Ó*€IÜ
‹%€CØó  ˆÜ�W‰W�\‰\˜) SÓ)ˆÜ�7‰7�>‰>˜"Ô¤R§W¡W§^¡^°BÔ%7Øð	Ü�b˜#¨¸	ÔBð !ÀbØ—w‘w“y�÷!ð —O‘OÓ%ò 		 ˆDØ�{‰{‹}×'Ñ'¨Ô,ØÜ×(Ñ(¨Ó.ò  �Ü)¨!¯'©'°!«*°iÓ@�Ø�;¤"§'¡'§.¡.°Ô"5ØÜ—W‘W—_‘_ SÓ)�Ø˜)’O r§}¡}°YÄÇÁÑ5GÕ'HÌbÏgÉgÏnÉnÐ]_ÕN`Ø—G‘G˜B•Kñ ò		 ð ð& €J÷!ñ !ûäò 	Úð	ús*   ÂGÂGÂ0GÇG	ÇGÇ	GÇGc                ó>  — 	 t        j                  ddgd| dddi¬«      }|j                  d
k7  rg d	fS |j                  j                  dd«      j                  «       d	fS # t        t         j                  f$ r$}g dt	        |«      j
                  › �fcY d	}~S d	}~ww xY w)a#  `crontab -l` des aufrufenden Users AUSSERHALB des Kaefigs. Liefert (zeilen, warnung_oder_None).
    'no crontab for ...' (rc!=0) ist KEINE Warnung (leeres Ergebnis); ein echter Fehler (Timeout/ENOENT)
    ergibt leere Menge + Warnung (Owner-Vorgabe: NICHT fail-closed, aber sichtbar machen).z/usr/bin/crontabz-lTFrd   ra   )Úcapture_outputÚtimeoutÚcheckrz   zcrontab_read_failed:Nr   rå   ræ   )
Ú
subprocessÚrunr”   ÚTimeoutExpiredÚtyperX   Ú
returncodeÚstdoutÚdecoderî   )rý   r1   Úexcs      r3   Úread_user_crontabr  œ  s¢   € ð?Ü�N‰NÐ.°Ð5ÀdÐT[Ø!&¨V°_Ð,EôGˆð 	‡|�|�qÒØ�4ˆxˆØ�8‰8�?‰?˜7 IÓ.×9Ñ9Ó;¸TÐAÐAøô	 ”Z×.Ñ.Ð/ò ?ØÐ)¬$¨s«)×*<Ñ*<Ð)=Ð>Ð>Õ>ûð?ús   ‚A ÁBÁ8BÂBÂBc                ó°  — t         j                  j                  | «      } g }|€!t        «       \  }}|r|j	                  |«       nt        |«      }t        «       t        «       }}t        j                  t        j                  | «      dz   «      }|D �]>  }|j                  «       }	|	r|	j                  d«      rŒ(|j                  |«      D �]  }
|
j                  d«      j                  d«      }|rt         j                  j                  |«      rŒFt         j                  j                  |«      }|| k(  s'|| k(  s#|j                  | t         j                   z   «      sŒ’t         j                  j#                  |«      }t         j                  j%                  |«      sŒÑt         j                  j'                  |«      r|n|j)                  |«       �Œ �ŒA |||fS )a  1e: extrahiert absolute Pfade unter home_root aus den Crontab-Befehlszeilen und klassifiziert sie
    nach Existenz (Verzeichnis -> ro-dir, u. a. `cd <dir>`; Datei -> ro-file). cron_targets injizierbar
    (Tests); None -> echtes `crontab -l`. Liefert (ro_dirs, ro_files, warnings).z(?:/[^\s;:"\'`|&><)]*)?rê   r   rÜ   )r)   r*   rŽ   r  r.   r|   r¦   ÚreÚcompileÚescaperÞ   r=   rñ   rò   Úrstripr-   r†   r+   r,   r�   r¨   )r©   Úcron_targetsÚwarningsÚlinesÚwarnrÎ   rÏ   Útoken_rer÷   Úsrø   rà   râ   r2   s                 r3   Úresolve_cron_targetsr  ª  st  € ô —‘—‘ 	Ó*€IØ€HØÐÜ'Ó)‰ˆˆtÙØ�O‰O˜DÕ!ä�\Ó"ˆÜ›œs›uˆX€GÜ�z‰zœ"Ÿ)™) IÓ.Ð1KÑKÓL€HØó AˆØ�J‰J‹LˆÙ�A—L‘L Ô%ØØ×"Ñ" 4Ó(ó 
	AˆAØ—'‘'˜!“*×#Ñ# CÓ(ˆCÙœ"Ÿ'™'Ÿ.™.¨Ô-ØÜ—‘—‘ Ó%ˆBØ�YŠ r¨Y¢¸"¿-¹-È	ÔTV×TZÑTZÑHZÔ:[ØÜ—‘×!Ñ! "Ó%ˆBÜ—7‘7—>‘> "Ô%ØÜŸ™Ÿ™ bÔ)‰W¨x×<Ñ<¸RÖ@ò
	Að	Að �H˜hÐ&Ð&r5   c                óú  — t         j                  j                  | d«      }	 t         j                  j                  |«      st         j                  j	                  |«      syt        |ddd¬«      5 }|j                  «       j                  «       }ddd«       j                  d«      r9t         j                  j                  |t        d«      d j                  «       «      S y# 1 sw Y   ŒTxY w# t        $ r Y yw xY w)z»Liefert das realpath-gitdir eines Git-Worktrees, dessen `.git` eine DATEI ist ('gitdir: <pfad>'),
    sonst None (kein Worktree, Hauptcheckout mit .git-Verzeichnis, Symlink, oder Fehler).r   NrÐ   rå   ræ   rç   zgitdir:)r)   r*   rQ   r-   r•   rì   ÚreadlinerÞ   r”   r=   r+   rß   )r*   Úgfrõ   r÷   s       r3   Ú_worktree_gitdirr  Ê  sÃ   € ô 
�‰�‰�d˜FÓ	#€BðÜ�7‰7�>‰>˜"Ô¤R§W¡W§^¡^°BÔ%7ØÜ�"�c G°IÔ>ð 	)À"Ø—;‘;“=×&Ñ&Ó(ˆD÷	)ð ‡��yÔ!Ü�w‰w×Ñ ¤S¨£^ _Ð 5× ;Ñ ;Ó =Ó>Ð>Ø÷	)ð 	)ûäò Ùðús/   ¢>C. Á!C. Á0C"ÂC. Ã"C+Ã'C. Ã.	C:Ã9C:c                óÚ  — t         j                  j                  | d«      }t         j                  j                  |«      r\t         j                  j	                  |«      s=t         j                  j                  t         j                  j                  |d«      «      S t        | «      }|rCt         j                  j                  |«      }t         j                  j                  |«      dk(  r|S y)z³<repo_root>/.git/worktrees als realpath - egal ob repo_root der Hauptcheckout (.git-Verzeichnis)
    oder selbst ein Worktree (.git-Datei zeigt auf .../.git/worktrees/<name>) ist.r   Ú	worktreesN)	r)   r*   rQ   r�   r-   r+   r  ÚdirnameÚbasename)Ú	repo_rootr°   ÚgdÚparents       r3   Ú_worktrees_containerr  Ú  s™   € ô 	�‰�‰�Y Ó'€AÜ	‡w�w‡}�}�QÔ¤§¡§¡¨qÔ 1Ü�w‰w×Ñ¤§¡§¡¨Q°Ó <Ó=Ð=Ü	˜)Ó	$€BÙ	Ü—‘—‘ Ó$ˆÜ�7‰7×Ñ˜FÓ# {Ò2ØˆMØr5   c                ó&  — t         j                  j                  | «      } |s
t        «       S t	        |«      }t         j                  j                  |«      }d}|r‡t         j                  j                  t         j                  j                  |«      «      }t         j                  j                  |«      }d|v r|j                  dd«      d   n|}t        |«      dk\  rM|}nJt        t         j                  j                  |«      «      dk\  rt         j                  j                  |«      }t        «       }	 t        j                  | «      }	|	D �]/  }
t         j                  j                  | |
«      }t         j                  j                  |«      rt         j                  j                  |«      rŒct         j                  j                  |«      |k(  rŒ†t        |«      }t        |«      xr6 t        |«      xr) ||k(  xs" |j!                  |t         j"                  z   «      }t        |«      xr |
|k(  xs |
j!                  |dz   «      }|s|s�Œ|j%                  t         j                  j                  |«      «       �Œ2 |S # t        $ r |cY S w xY w)as  1g (+ Re-Review-2-Erweiterung): Geschwister-Repos direkt unter home_root wie repo_root hart sperren.
    Zwei Erkennungswege:
      (a) echte Git-Worktrees: `.git` ist eine DATEI, die auf <repo_root>/.git/worktrees/ zeigt.
      (b) Namens-Stamm des Hauptrepos: Geschwister ohne .git (z. B. manuelle Kopie aria-v3-shadow-test)
          teilen den Stamm des Hauptrepo-Namens (aria-v3-dev -> Stamm 'aria-v3'); alle home-Kinder
          'aria-v3-*' sind Repo-Kopien/-Zustaende und werden gesperrt. Heuristik bewusst konservativ
          (Stamm >= 3 Zeichen), dokumentiert in docs/SICHERHEIT.md. repo_root selbst ist self_block.Nú-é   r   é   )r)   r*   rŽ   r¦   r  r  r  Úrsplitrß   r“   r”   rQ   r�   r-   r  Úboolr=   r†   r¨   )r©   r  Ú	containerÚrepo_root_absÚstemÚ	main_repoÚbaser¾   r0   r™   r@   r‰   r  Úis_worktreeÚ	is_familys                  r3   Úsibling_worktreesr-  è  sð  € ô —‘—‘ 	Ó*€IÙÜ‹uˆÜ$ YÓ/€IÜ—G‘G—O‘O IÓ.€MØ€DÙÜ—G‘G—O‘O¤B§G¡G§O¡O°IÓ$>Ó?ˆ	Ü�w‰w×Ñ 	Ó*ˆØ),°©ˆt�{‰{˜3 Ó" 1Ò%¸$ˆÜˆt‹9˜Š>Ø‰DÜ	ŒR�W‰W×Ñ˜mÓ,Ó	-°Ò	2ô �w‰w×Ñ Ó.ˆÜ
‹%€CðÜ—
‘
˜9Ó%ˆð ó (ˆÜ�G‰G�L‰L˜ DÓ)ˆÜ�w‰w�}‰}˜QÔ¤2§7¡7§>¡>°!Ô#4ØÜ�7‰7�?‰?˜1Ó Ò.ØÜ˜aÓ ˆô ˜2“hÒm¤4¨	£?Òm¸¸i¹Ò8lÈ2Ï=É=ÐYbÔeg×ekÑekÑYkÓKlˆÜ˜“JÒP D¨D¡LÒ$O°D·O±OÀDÈ3ÁJÓ4Oˆ	Ù›)Ø�G‰G”B—G‘G—O‘O AÓ&Ö'ð(ð €Jøô ò ØŠ
ðús   Ä6J ÊJÊJc                  ó   — e Zd ZdZy)ÚWriteAllowlistErrorz¿Unzulaessiger Eintrag in codex.tools_write_allowlist. Immer fail-closed: kein Lauf, keine
    stille Korrektur (ein still wirkungsloser oder zu weiter Eintrag waere schlimmer als ein Fehler).N)rX   rY   rZ   r[   r&   r5   r3   r/  r/    s   „ òir5   r/  c                óT   — | |k(  xs" | j                  |t        j                  z   «      S r(   r…   )r*   rI   s     r3   Ú_inside_or_equalr1    s"   € Ø�4‰<Ò9˜4Ÿ?™?¨4´"·&±&©=Ó9Ð9r5   c                ó*  — t        «       }| D ]ƒ  }|sŒt        j                  j                  |«      }|j	                  |«       t        j                  j                  |«      sŒV|j	                  t        j                  j                  |«      «       Œ… |S r(   )r¦   r)   r*   rŽ   r¨   r¹   r+   )r/   r0   r1   râ   s       r3   Ú_with_realpathsr3     sm   € Ü
‹%€CØò *ˆÙØÜ�W‰W�_‰_˜QÓˆØ�‰�ŒÜ�7‰7�?‰?˜2ÕØ�G‰G”B—G‘G×$Ñ$ RÓ(Õ)ð*ð €Jr5   )Ú	state_dirr  Ú	runs_rootr–   Ú	read_onlyc          	     ó�  ‡— t         j                  j                  ‰«      Št        | t        t
        f«      st        | t        t        f«      st        d«      ‚| syt        ‰«      t        ‰«      z  t        ||f«      z  t        ˆfd„t        D «       «      z  t        ‰|«      z  |D �ch c]!  }t         j                  j                  |«      ’Œ# c}z  }|D �ch c]!  }t         j                  j                  |«      ’Œ# }	}t        |f«      }
g }| D �]i  }t        |t        «      r|rd|v rt        d«      ‚t         j                  j                  |«      st        |› d�«      ‚t         j                  j                  |«      |k7  rt        |› d�«      ‚|‰k(  rt        |› d�«      ‚|j!                  ‰t         j"                  z   «      st        |› d	‰› �«      ‚t%        d
„ t         j                  j'                  |‰«      j)                  t         j"                  «      D «       «      rt        |› d�«      ‚	 t        j*                  |«      }t3        j4                  |j6                  «      rt        |› d�«      ‚t3        j8                  |j6                  «      st        |› d�«      ‚t         j                  j;                  |«      |k7  rt        |› d�«      ‚t=        |«      D ]  }t?        ||«      sŒt        |› d|› �«      ‚ t=        |	«      D ]  }t?        ||«      sŒt        |› d|› �«      ‚ t=        |
«      D ]+  }t?        ||«      st?        ||«      sŒt        |› d|› d�«      ‚ ||vs�ŒY|jA                  |«       �Œl t        |«      S c c}w c c}w # t,        $ r*}t        |› dt/        |«      j0                  › d�«      |‚d}~ww xY w)aÐ  E44 Option 2: prueft die ausdruecklich freigegebenen Schreib-Ordner des tools-Profils und
    liefert sie (ohne Duplikate, Reihenfolge erhalten) zurueck. Jede Verletzung -> WriteAllowlistError.

    Ein Eintrag muss sein: str, absolut, kanonisch (normpath-gleich: kein '..', '.', '//' oder
    abschliessender '/'), ECHT unterhalb von home_root (nie home_root selbst, nichts ausserhalb, weil
    das tools-Profil ausserhalb des Homes keinen Lesezugriff gewaehrt), ohne versteckte Komponente
    ('.ssh', '.config', '.cache', '.git', '.venv' ... sind Zugangsdaten/Konfiguration/Caches/Hooks,
    keine Projektordner), existierendes Verzeichnis, weder selbst Symlink noch mit Symlink im Pfad
    (realpath-gleich). Er darf weder gleich noch unterhalb eines gesperrten Bereichs liegen: harte
    Credential-Sperren (inkl. Symlink-Ziele), claude, state_dir, laufendes Repo und Geschwister
    (aria-v3-*), die Startschutz-Verzeichnisse (STARTUP_RO_DIRS: scripts, brain, state, ...), sowie die
    beim Profilbau ermittelten `blocked`/`read_only`-Mengen (Secrets, Lauf-Root, Cron-Ziele, Hooks).
    Eine rw-Regel auf einem Unterordner eines gesperrten Bereichs wuerde ihn per Landlock-Union wieder
    oeffnen - darum ist "darunter" verboten; ein Eintrag OBERHALB gesperrter Pfade ist erlaubt (der
    Abstieg in tools_profile schneidet sie heraus). runs_root (codex.workspace_root): weder gleich noch
    darin noch darueber - sonst waeren die Lauf-Verzeichnisse paralleler Laeufe schreibbar.z)list of absolute directory paths expectedr&   c              3  ó^   •K  — | ]$  }t         j                  j                  ‰|«      –— Œ& y ­wr(   )r)   r*   rQ   )r‡   rº   r©   s     €r3   rŠ   z+validate_write_allowlist.<locals>.<genexpr>F  s    øè ø€ Ò"[ÀC¤2§7¡7§<¡<°	¸3×#?Ñ"[ùs   ƒ*-ú znon-empty path strings expectedz: absolute path expectedz>: canonical path expected (no '..', '.', '//' or trailing '/')z$: home_root itself is never writablez: must lie below home_root c              3  ó>   K  — | ]  }|j                  d «      –— Œ y­w)rÓ   N)r=   )r‡   Úparts     r3   rŠ   z+validate_write_allowlist.<locals>.<genexpr>W  s   è ø€ Ò^¨ˆt�‰˜s×#Ñ^ùs   ‚zX: hidden path component rejected (credentials/config/caches/.git are no project folders)z: does not exist (ú)Nz: symlink rejectedz: directory expectedz: path contains a symlinkz: inside blocked area z": inside read-only protected area z: overlaps the run container z (codex.workspace_root))!r)   r*   rŽ   Ú
isinstancerH   Úbytesr|   Útupler/  r»   r¿   r3  ÚSTARTUP_RO_DIRSr-  ÚisabsÚnormpathr=   r†   r‘   ÚrelpathÚsplitÚlstatr”   r  rX   ÚstatÚS_ISLNKÚst_modeÚS_ISDIRr+   r’   r1  r.   )Úentriesr©   r4  r  r5  r–   r6  r1   Ú	protectedÚro_protectedÚrunsr0   rà   Ústr  s    `             r3   Úvalidate_write_allowlistrO  ,  s—  ø€ ô& —‘—‘ 	Ó*€IÜ�'œC¤˜<Ô(´
¸7ÄTÌ5ÀMÔ0RÜ!Ð"MÓNÐNÙØÜ*¨9Ó5Ô8HÈÓ8SÑSÜ" I¨yÐ#9Ó:ñ;ä"Ó"[Ì?Ô"[Ó[ñ\ô % Y°	Ó:ñ;ð 18Ö8¨1”B—G‘G—O‘O AÕ&Ò8ñ	9€Ið
 1:Ö:¨1”B—G‘G—O‘O AÕ&Ð:€LÐ:Ü˜I˜<Ó(€DØ€CØó "ˆÜ˜#œsÔ#©3°&¸C±-Ü%Ð&GÓHÐHÜ�w‰w�}‰}˜SÔ!Ü%¨¨Ð-EÐ&FÓGÐGÜ�7‰7×Ñ˜CÓ  CÒ'Ü%¨¨Ð-kÐ&lÓmÐmØ�)ÒÜ%¨¨Ð-QÐ&RÓSÐSØ�~‰~˜i¬"¯&©&Ñ0Ô1Ü%¨¨Ð-HÈÈÐ&TÓUÐUÜÑ^´·±·±ÀÀYÓ0O×0UÑ0UÔVX×V\ÑV\Ó0]Ô^Ô^Ü%¨¨ð .`ð '`ó að að	`Ü—‘˜#“ˆBô �<‰<˜Ÿ
™
Ô#Ü%¨¨Ð-?Ð&@ÓAÐAÜ�|‰|˜BŸJ™JÔ'Ü%¨¨Ð-AÐ&BÓCÐCÜ�7‰7×Ñ˜CÓ  CÒ'Ü%¨¨Ð-FÐ&GÓHÐHÜ˜	Ó"ò 	MˆAÜ  QÕ'Ü)¨S¨EÐ1GÈÀsÐ*KÓLÐLð	Mô ˜Ó%ò 	YˆAÜ  QÕ'Ü)¨S¨EÐ1SÐTUÐSVÐ*WÓXÐXð	Yô ˜“ò 	kˆAÜ  QÔ'Ô+;¸A¸sÕ+CÜ)¨S¨EÐ1NÈqÈcÐQhÐ*iÓjÐjð	kð �c‹>Ø�J‰J�sŽOðE"ôF �‹:ÐùòO 9ùÚ:øô& ò 	`Ü%¨¨Ð-?ÄÀSÃ	×@RÑ@RÐ?SÐSTÐ&UÓVÐ\_Ð_ûð	`ús$   Â)&NÃ&NÈ3NÎ	OÎ%O Ï O)r©   rl   rp   Úsecret_filesrÇ   r4  r  Úprotect_startupÚstartup_gitr  Úwrite_allowlistr5  c               óÞ  — t         j                  j                  |«      }t         j                  j                  |«      }t	        |«      }t        |«      }|�|€0t        || j                  g|
¬«      \  }}|€|}|€|
r|n	t        «       }g }t        «       }||	fD ]¤  }|sŒt         j                  j                  |«      |k7  sŒ)|j                  t         j                  j                  |«      «       t         j                  j                  |«      sŒw|j                  t         j                  j                  |«      «       Œ¦ |
r|t        ||	«      z  }t        ||z  t        |«      z  |z  t         j                  j                  | j                  «      hz  «      }t        |t        d«      \  }}|
rét        |t        t         z   t"        z   t$        z   t&        «      \  }}||z  }||z  }|t)        ||«      z  }|t+        |«      z  }t-        ||«      \  }}}||z  }||z  }||z  }|D ]q  }t         j                  j/                  |«      rŒ#t         j                  j1                  |«      r|n|j                  t         j                  j                  |«      «       Œs ||z  }t3        ||«      \  } }!t5        ||||	|||¬«      }"g g }$}#|"D ]'  }%t3        |%t        ||z  «      «      \  }&}'|#|&z  }#|$|'z  }$Œ) g g })}(t7        |«      D ]+  }*t9        |*|«      D ]  \  }+},|,r|(n|)j;                  |+«       Œ Œ- t7        |t        |)«      z  «      }-t=        ||«      \  }.}/t?        | |«      \  }0}1|| j@                  tC        tE        tF        «      «      t7        t        | «      t        |(«      z  «      z   |.|/|gz   t7        |«      tC        tE        tH        «      «      |0z   t7        t        |!«      t        |-«      z  «      z   tE        d«      |1z   t7        t        |$«      «      z   t7        t        |#«      | j@                  | jJ                  | jL                  | jN                  hz  «      tQ        | |¬«      tS        |«      |dœ}2|2S )a‡  B+-Profil. secret_files/startup_git koennen fuer Tests injiziert werden; sonst wird gescannt.

    state_dir/repo_root: Gateway-Zustand (Budget/Nonces/Schluessel) und das laufende V3-Repo werden
      komplett gesperrt (Selbstmodifikation/Abrechnungs-Umgehung, Review #6). Die ephemeren Lauf-
      Verzeichnisse liegen zwar unter state_dir, werden aber per expliziter rw-Regel wieder gewaehrt.
    protect_startup (Owner TG 12861, Default an): Startdateien/Hooks/Brain read-only (Review H1).
    write_allowlist (E44 Option 2, Default leer): die EINZIGEN Home-Ordner mit Schreibrecht. Das Home
      ist sonst nur lesbar; geschrieben wird nur in den ephemeren Lauf-Verzeichnissen (Workspace,
      Lauf-Home, CODEX_HOME, TMPDIR), /dev/null und - mit writable_auth - der auth-KOPIE. Jeder Eintrag
      wird HIER erneut gegen die beim Profilbau ermittelten Sperren geprueft (validate_write_allowlist,
      Fehler -> WriteAllowlistError); gesperrte/ro-Pfade darunter werden aus seinem rw-Baum geschnitten.
    runs_root: Container der Lauf-Verzeichnisse (codex.workspace_root); kein Allowlist-Eintrag darf ihn
      ueberlappen (vom CagedCodexRunner gesetzt).)rŸ   r    r&   )r©   r4  r  r5  r–   r6  rr   r^   )rp   rs   ru   Úrxrt   Úno_xrv   rw   rx   rz   r{   r  )*r)   r*   rŽ   r+   r¿   r»   r³   rI   r¦   r¨   r¹   r-  Ú	frozensetrÑ   ÚGITCONFIG_ROÚSTARTUP_RO_FILESr@  ÚSTARTUP_RO_FILESETrÔ   ÚSTARTUP_RO_ABSr×   rú   r  r-   r�   rÃ   rO  r’   rœ   r.   rÊ   rm   rJ   r|   r4   ÚTOOLS_SYSTEM_RO_DIRSr~   rK   rL   rN   rj   r   )3ri   r€   r{   r©   rl   rp   rP  rÇ   r4  r  rQ  rR  r  rS  r5  ÚclaudeÚhardÚscanned_secretÚscanned_gitr  Ú
self_blockr1   rÕ   Úro_dir_targetsÚro_file_targetsr‰   ÚfÚcron_dÚcron_fÚ	cron_warnr°   Úro_blockÚhome_ro_dirsÚhome_ro_filesÚallowÚrw_dirsÚrw_filesÚentryÚ
entry_dirsÚentry_filesrÎ   Úro_files_from_dirsrI   r*   rš   Úro_file_listrÈ   rÉ   rv   rw   r±   s3                                                      r3   Útools_profilers  r  sD  € ô( —‘—‘ 	Ó*€IÜ—‘× Ñ  Ó+€IÜ˜iÓ(€FÜ$ YÓ/€DàÐ˜{Ð2Ü&7¸	ÐVZ×V_ÑV_ÐU`ØAPô'RÑ#ˆ˜àÐØ)ˆLØÐÙ)8™+¼c»eˆKà€Hä“€JØ˜Ð#ò 4ˆÚ”—‘—‘ Ó# yÓ0Ø�N‰Nœ2Ÿ7™7Ÿ?™?¨1Ó-Ô.Ü�w‰w�‰˜qÕ!Ø—‘œrŸw™w×/Ñ/°Ó2Õ3ð	4ñ ØÔ'¨	°9Ó=Ñ=ˆ
ô ˜6 D™=¬3¨|Ó+<Ñ<¸zÑIÌRÏWÉWÏ_É_Ð]a×]fÑ]fÓMgÐLhÑhÓi€Jô ':¸)Ä\ÐSUÓ&VÑ#€N�OÙÜ" 9Ô.>ÄÑ.PÔSeÑ.eÜ%8ñ/9Ü:HóJ‰ˆˆ1à˜!ÑˆØ˜1ÑˆàÔ2°9¸jÓIÑIˆàÔ.¨yÓ9Ñ9ˆä$8¸ÀLÓ$QÑ!ˆ�˜	Ø˜&Ñ ˆØ˜6Ñ!ˆØ�IÑˆàò 	^ˆAÜ�w‰w�~‰~˜aÔ ØÜ!Ÿw™wŸ}™}¨QÔ/‰^°_×IÑIÌ"Ï'É'Ï/É/ÐZ[ÓJ\Õ]ð	^ð  Ñ/€Hô
 #-¨Y¸
Ó"CÑ€L�-ô
 % _À	ÐU^Ø/8ÀIØ-7À8ôM€Eð ˜BˆX€GØò  ˆÜ",¨U´I¸jÈ8Ñ>SÓ4TÓ"UÑˆ
�KØ�:ÑˆØ�KÑ‰ð ð #% bÐ€GÜ�~Ó&ò EˆÜ$ T¨:Ó6ò 	E‰LˆD�&Ù‰WÐ$6×>Ñ>¸tÕDñ	EðEô ˜/¬CÐ0BÓ,CÑCÓD€Lô % Z°Ó<Ñ€GˆWä" 4¨Ó7Ñ€GˆWàØ�~‰~ä”>Ô"6Ó7Ó8¼6Ä#ÀlÓBSÔVYÐZaÓVbÑBbÓ;cÑcØØ˜Y˜KÑ'Ü�v“Üœ¬Ó8Ó9¸GÑCÜœS Ó/´#°lÓ2CÑCÓDñEô " .Ó1°GÑ;¼fÄSÈÃ]Ó>SÑSô
 ”S˜“\ T§^¡^°T·Y±YÀÇÁÐQU×QYÑQYÐ$ZÑZÓ[Ü˜¨IÔ6Ü˜“=àñ+€Cð0 €Jr5   )rG   r�   rs  rj   rÃ   rÅ   rÊ   rµ   r³   r¿   r»   r×   rú   r  r  r-  r/  rO  r}   r~   ÚTOOLS_EXEC_ROOTS)r@   rH   rW   r%  )ri   rG   r_   ú
str | NonerW   r   )ri   rG   rl   r%  rW   útuple[list, list])ri   rG   r€   rH   r{   r   rl   r%  rp   ÚintrW   r   )rI   rH   r–   rW  r‚   r%  )r©   rH   r    r%  rW   útuple[set, set])r©   rH   rW   r¦   )r¼   )rI   rH   r–   rW  rW   rv  )r©   rH   r–   rW  rW   rv  )r–   rW  rW   rv  )r©   rH   rW   rx  )r©   rH   rÕ   rW  rW   r¦   )rà   rH   r©   rH   rW   ru  )g      @)rý   ÚfloatrW   ztuple[list, str | None])r©   rH   r  úlist | NonerW   ztuple[set, set, list])r*   rH   rW   ru  )r  rH   rW   ru  )r©   rH   r  ru  rW   r¦   )r*   rH   rI   rH   rW   r%  )rW   r¦   )
r©   rH   r4  ru  r  ru  r5  ru  rW   ztuple[str, ...])ri   rG   r€   rH   r{   r   r©   rH   rl   r%  rp   rw  rP  ú
set | Noner4  ru  r  ru  rQ  r%  rR  r{  r  rz  r5  ru  rW   r   );r[   Ú
__future__r   r)   r	  rF  rÿ   Údataclassesr   r   r}   r~   r\  rt  rW  ÚPRUNE_DIR_NAMESr>   r?   r·   r¸   rY  rÔ   r@  rZ  r[  ÚSTARTUP_PARSE_FILESr
  rð   rX  r4   rD   rG   rj   rm   r�   rœ   r³   rµ   r»   r¿   rÃ   rÅ   rÊ   rÑ   r×   rã   rú   r  r  r  r  r-  Ú
ValueErrorr/  r1  r3  rO  rs  Ú__all__r&   r5   r3   ú<module>r‚     s~  ðñõ4 #ã 	Û 	Û Û ß (ð €ØV€Ø Ð ØVÐ ñ ò ó €ð U€
áò ó €ðÐ ðÐ ð eÐ à0Ð ð c€Ø$Ð Ø€àWÐ àˆR�Z‰ZÐXÓY€
à€òóñ$ �$Ô÷:ð :ó ð:ð$ <@õ ó ð (-¸ÈqñØ $ðØILðØUYóð* HMõ #"ðL 6EÐXZØ'+ñØ $ðØ0?óð4 6EÐXZõ Uó
ôó*!ó*óóóó6(ð& 7Jô ô6Bó'ó@ó ó*ô^i˜*ô ió
:ó	ð RVØ59ÐSWØ%'°2ñCØ(2ðCØFPðCà:IóCðL UaØ(-¸aØ-1Ð>NØ*.ÈØ*.È$Ø.2ÀBØ*.ñAØ!%ðAØ8;ðAà *ðAð (ðAð <FðAð $(ð	Að >Hð	Að
 !,ðAð (ðAð 48óAòH�r5   