+
    j              
         R t ^ RIHt ^ RIt^ RIHt ^ RIHt ^ RIt]! ]	4      P                  4       P                  P                  P                  P                  R,          R,          R,          R,          t] ! R	 R
4      4       tR R ltR R ltR R R llt]! 4       t]R8X  EdH   ]! R] 24       ]! R]P(                  R,           24       ]! R]! ]P,                  4       R24       ]! R]! ]P.                  4       R24       ]! R]! ]P0                  4       24       ]! R]! ]P2                  4       24       ]! R]! ]P4                   U u. uF  q R8w  g   K  V NK  	  up 4       24       ]! R]! ]P6                  4       24       ]! R]P8                  P;                  4        U Uu. uF   w  rVP=                  R4      '       g   K  V NK"  	  upp  24       ]P>                  ! ^ 4       R# R# u up i u upp i )!u  Load + validate cp-criteria.yaml — the single source of truth for the scorer.

Failure to validate intent assertions = startup error, by design. The whole
point of the YAML is to make the philosophy auditable; silent drift defeats it.

Usage:
    from criteria_loader import CRITERIA
    weights = CRITERIA.weighted_criteria        # dict[str, dict]
    char_range = CRITERIA.deltas['character']   # {'range': [-0.5, 0.5], ...}
    if CRITERIA.gates['price']['max_purchase_eur'] < p.get('price', 0):
        ...
)annotationsN)	dataclass)Pathsystemmemorylifezcyber-prairie-criteria.yamlc                  r    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R]R	&   R]R
&   R]R&   RtR# )Criteriadictstrategy	list[str]intentgatesweighted_criteriadeltasdiamond_signalskeywordsvibe_regions	countries N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       [/Users/jonathan/Documents/Zakelijk/ClaudeOS/03_Lab/paradisomatch/scraper/criteria_loader.pyr	   r	      s3    NKLNOr   r	   c                    V ^8  d   QhRRRR/# )   	delta_cfgr
   returnfloatr   )formats   "r   __annotate__r$   )   s      4 E r   c                (    V R ,          w  rW!,
          # )ranger   )r    lohis   &  r   _delta_spanr)   )   s    wFB7Nr   c                    V ^8  d   QhRRRR/# )r   cr	   r!   r   r   )r#   s   "r   r$   r$   .   s     7 7 7Y 7r   c           
     p   . pV P                   P                  R/ 4      pVP                  R4      '       d   \        V4      M^ pVP                  R^ ^ .4      ^,          pV P                   P                  4        FX  w  rVVR8X  g   VP                  R4      '       g   K%  VR,          ^,          pWt8  g   K=  VP	                  RV RV RV R24       KZ  	  V P                   P                  R/ 4      pVP                  R4      '       dC   VR,          ^,          RV,          8  d'   VP	                  R	VR,          ^,           R
V R24       V P                   P                  R/ 4      p	V	P                  R4      '       dC   V	R,          ^,          RV,          8  d'   VP	                  RV	R,          ^,           RV R24       V P
                  P                  R/ 4      P                  R^ 4      p
V
R8  d   VP	                  RV
 R24       R F*  pWP                  9  g   K  VP	                  RV R24       K,  	  V# )z4Return list of intent violations (empty = all pass).	characterr&   zINTENT VIOLATION: 'z
' upside +z exceeds character +z; (intent: 'character is the single heaviest graded signal')revenue_viabilityg?z.INTENT VIOLATION: 'revenue_viability' upside +z is <80% of character +z5 (intent: 'revenue diversification rivals character')expandabilitygffffff?z(INTENT VIOLATION: expandability upside +z is <70% of character +u6    (intent: 'expandability ≥70% of character's range')location_viewweightg      @z'INTENT VIOLATION: location_view weight u\    below 3.0 floor (intent: 'views/setting weighted ≥3.0 — review-log property #3 lesson')z INTENT VIOLATION: missing gate 'zS' (intent: 'three Tier-1 review-log gates ENFORCED: privacy, road noise, internet'))privacy
road_noiseinternet)r   getr)   itemsappendr   r   )r+   
violationschar	char_spanchar_maxnamecfg	other_maxrevexploc_wrequired_gates   &           r   _validate_intentrC   .   s,   J88<<R(D%)XXg%6%6D!AIxx!Q(+H XX^^%	;cggg&6&6LO	%dV:i[@TU]T^ _M N & ((,,*B
/C
wwwCLOdXo=<S\!_<MMdemdn oC C	
 ((,,
+C
wwwCLOdXo=6s7|A6GG^_g^h iD D	
 ##OR8<<XqIEs{5eW =Z Z	
 ?'2=/ Bd d ? r   c                    V ^8  d   QhRRRR/# )r   	yaml_pathzPath | Noner!   r	   r   )r#   s   "r   r$   r$   h   s      K 8 r   c                   T ;'       g    \         p\        VR R7      ;_uu_ 4       p\        P                  ! V4      pRRR4       \	        XR,          VR,          VR,          VR,          VR,          VR,          VR	,          VR
,          VR,          R7	      p\        V4      pV'       d    RP                  R.VO4      p\        V4      hV#   + '       g   i     L; i)zutf-8)encodingNr   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   
z*cp-criteria.yaml failed intent validation:)	YAML_PATHopenyaml	safe_loadr	   rC   join
ValueError)rE   pfdatar+   r8   msgs   &      r   loadrS   h   s    YA	a'	"	"a~~a  
#j!H~7m23H~./j!.){#
	A "!$JiiES
SToH# 
#	"s   CC	__main__zLoaded: z
Strategy: r<   zIntent assertions: z (all passed)zGates: z categorieszWeighted criteria: zPost-weighting deltas: zDiamond signals: cumulative_capzKeyword banks: zCountries enabled: enabled)N) __doc__
__future__r   sysdataclassesr   pathlibr   rK   __file__resolveparentrI   r	   r)   rC   rS   CRITERIAr   printr   lenr   r   r   r   r   r   r   r6   r5   exit)kvs   00r   <module>re      s   # 
 !   	N##**1188"#%BC 
 	 	 	
7t. 6 z	HYK
 !	Jx((01
23	HOO 45]
CD	GC'(
45	H$>$> ?@
AB	#C$8#9
:;	ch.F.F"`.FO_J_11.F"`ab
cd	OC 1 123
45	h.@.@.F.F.H ].HsqAEER[L\.H ]^
_`HHQK  #a ]s   G2G2,G7G7