
    i                        d Z ddlmZ ddlZddlmZ ddlmZmZ  ee	      j                         j                  d   Zedz  Zdd	d
ddddZddZdddZddZy)u  skills/supervisor_esceptico.py — SUPERVISOR genérico (L3 Opus auditor con PDF como base)

Patrón Andon Tier L3: cuando L1 verifier FAIL o L2 olfato Haiku FLAG.
Este supervisor lee el PDF sub-proceso de su estación + la sección de la caja del agente
y decide APPROVE / BREAK_<reason>.

Backend: claude CLI subprocess (Opus 4.7 con PDF inline como contexto base canónica).

Cada station_id tiene su PDF sub-proceso anclado en _pdfs/PDF_<STATION>.pdf.
El supervisor lo carga y lo incluye en su prompt — la skill audita CONTRA el PDF, NO contra reglas hardcoded.

Inputs:
  context.station_id (qué estación auditar)
  caja.<station_id> (output del agente)

Output:
  SkillResult.ok = True si APPROVE, False si BREAK
  SkillResult.errors = [BREAK_<code> · razón concreta]
    )annotationsN)Path)SkillContextSkillResult   _pdfszPDF_DESCARGAR.pdfzPDF_ANALIZAR.pdfzPDF_INTERPRETAR.pdfzPDF_BUSCAR.pdfzPDF_COMPARADOR.pdfzPDF_TRELLO_EDITOR.pdf)	descargaranalizarinterpretarbuscar
comparadortrello_editorc           	        | j                  d      xs |j                  }|st        ddg      S |j                         }|j                  di       j                  |      }|t        dd| dg      S t	        |t
              r|st        dd| d	g      S t	        |t              r t        |      d
k(  rt        dd| dg      S t        j                  |      }|r	t        |z  nd}||j                         st        dd| g      S t        |      }t        ||||j                  di             }|j                  |dd      }	|	j                  d      s3t        dd|	j                  d      xs |	j                  d       g      S |	j                  d      xs dj                         }
|
r$d|
j                         j!                         dd v rng rt        dd|
dd d      S |
j                         j#                  d      rt        dd|
dd d      S |
j                         j#                  d      rt        d|
dd g      S d|
j                         v rt        dd|
dd d       S t        dd!|
dd  g      S )"u@   inputs.station_id (puede venir explícito) o context.station_id.audit_station_idFu5   BREAK_NO_TARGET · no se especificó audit_station_id)okerrorssectionsNu%   BREAK_EMPTY_SECTION · caja.sections.z
 no existez es {}r   z es []u.   BREAK_PDF_BASE_MISSING · PDF base no existe: input_startzclaude-opus-4-7   )model	timeout_sr   u%   BREAK_LLM_FAIL · claude CLI falló: stderrerrorstdout APPROVE   Ti,  )verdictreason)r   outputBREAKi  APPROVE_inferred)r   rawu@   BREAK_AMBIGUOUS · supervisor no devolvió APPROVE/BREAK claro: )get
station_idr   	read_caja
isinstancedictlistlenPDF_NAME_MAPPDFS_DIRexists_extract_pdf_textbuild_audit_prompt
claude_clistripuppersplit
startswith)inputscontexttarget_stationcajasectionpdf_namepdf_pathpdf_textpromptresverdict_texts              LC:\Users\ferna\proyecto cero\_factory_3d_demo\skills\supervisor_esceptico.pyrunrA   &   s   ZZ 23Iw7I7INe-d,effDhhz2&**>:Ge/TUcTddn-o,pqq'4 e/TUcTddl-m,noo'4 S\Q%6e/TUcTddj-k,lmm /H(08#dHx0e/]^f]g-h,ijj *H'488M[]C^_F


V+<

LC774=e/TUXU\U\]eUfUzjmjqjqryjzT{-|,}~~GGH%+224L8DyL&&(..0!44"dyLY]Z]L^+_``&&y1dyLY]Z]L^+_``&&w/e\$3-?,@AAL&&((d7IR^_c`cRd+eff%+klxy}z}l~k  *A  )B  C  C    c                   ddl }	 |j                  dt        |       dgddd      }|j                  dk(  r|j                  d| S 	 	 ddl}t        | d      5 }|j                  |      }d	j                  d
 |j                  D              }|d| cddd       S # t
        $ r Y ^w xY w# 1 sw Y   yxY w# t
        $ r d| j                   dcY S w xY w)zBExtrae texto del PDF. Usa pdftotext si disponible, fallback pypdf.r   N	pdftotext-T   )capture_outputtexttimeoutrb
c              3  D   K   | ]  }|j                         xs d   yw)r   N)extract_text).0ps     r@   	<genexpr>z$_extract_pdf_text.<locals>.<genexpr>^   s      J\Q^^-33\s    z[PDF extraction failed for ])
subprocessrA   str
returncoder   	Exceptionpypdfopen	PdfReaderjoinpagesname)r;   	max_charsrR   rrV   freaderrH   s           r@   r.   r.   Q   s    NNKX<TX\fhNi<<188JY'' >(D!Q__Q'F99JV\\JJD
# "!	   "!  >,X]]O1==>sA   >B B4 8B(	B4 	B%$B%(B1-B4 1B4 4CCc                    t        j                  |dd      d d }t        j                  |dd      d d }d|  d| j                          d| d	| d
|  d| dS )NF   )ensure_asciiindenti  i  um   Eres el SUPERVISOR L3 (Opus 4.7) del flow Factory v4 escalado de formato.
Auditar el output de la estación "u:   " contra su PDF base canónica.

=== PDF BASE SUB-PROCESO z (verbatim) ===
z/
=== FIN PDF ===

=== INPUT START del flow ===
z9
=== FIN INPUT ===

=== OUTPUT del agente (caja.sections.z) ===
u6  
=== FIN OUTPUT ===

CRITERIO DE AUDITORÍA:
1. La sección debe existir y NO estar vacía.
2. Debe alinear con la spec del PDF (no off-topic).
3. Debe respetar las restricciones del PDF (REGLAs duras, formato esperado, campos obligatorios).
4. Debe ser coherente con el input_start.
5. NO debe haber violado REGLAs activas del stack.

VEREDICTO — devuelve EXACTAMENTE una de estas dos formas:

APPROVE
[razón breve 1 línea]

O

BREAK_<CODIGO_CORTO>
[razón concreta · qué corregir · 1-2 líneas]

NO suavices. NO permitas pasar lo dudoso. Si dudas → BREAK.)jsondumpsr2   )r%   r<   r9   r   section_str	input_strs         r@   r/   r/   d   s    **W5CETJK

;U1EetLI$$.< 0$**,- .	
   & '1\ 2 > A  ArB   )r5   r(   r6   r   returnr   )ip  )r;   r   r\   intrh   rS   )
r%   rS   r<   rS   r9   r(   r   r(   rh   rS   )__doc__
__future__r   rd   pathlibr   skills._libr   r   __file__resolveparentsROOTr,   r+   rA   r.   r/    rB   r@   <module>rs      sk   & #   1H~''*'> %"(&,(CV>&#ArB   