+
    &j                     <    R t ^ RItRt^tR tR]3R ltR]3R ltR# )u5  Vettability — the single source of truth for "is this property worth a viewing?"

One predicate, owned here, instead of three diverging copies (the old JS isVetted in
shortlist.html, compute_data_confidence, and _has_complete_new_system_data). The scorer
calls this at score time (fresh cp_score in hand) and writes `vetted` + `vetted_blockers`
into each shortlist entry; the page renders the flag rather than re-deriving it over
stale enriched_data.json.

A property is VETTED when it is substantively evaluated AND top-tier:
  - confirmed live within the last 7 days (availability recheck)
  - not removed by a hard gate
  - has a photo (you can look at it)
  - has been analyzed — vision character_score OR ≥4 GPT/Claude criteria
  - has a verified land_size_m2 (so the 3,000m² gate decides on real data)
  - CP score ≥ the top-tier floor (worth a viewing, not just worth tracking)

`vetted_blockers()` returns the reasons a property is NOT vetted (empty list = vetted),
so the gap is legible — both to the page and to a future "ensure-vettable" enrichment step.
Ng      ?c                     V P                  R 4      pV'       g   R#  \        P                  P                  \        V4      P	                  RR4      4      pY,
          P                  \        8*  #   \
         d     R# i ; i)availability_checked_atFZ )getdatetimefromisoformatstrreplace
ValueErrordaysCHECKED_LIVE_WINDOW_DAYS)pnowrawts   &&  S/Users/jonathan/Documents/Zakelijk/ClaudeOS/03_Lab/paradisomatch/scraper/vetting.py_checked_recentlyr   "   sk    
%%)
*C++CH,<,<S",EF G>>555  s   8A. .A=<A=c                   T;'       g    \         P                   P                  4       p. pV P                  R4      R8X  d   VP                  R4       \	        W4      '       g   VP                  R\
         R24       V'       d   VP                  R4       V P                  R4      '       g1   . '       g)   V P                  R4      '       g   VP                  R	4       \        V P                  R
4      ;'       g    / 4      pV P                  R4      f   V^8  d   VP                  R4       \        V P                  R4      \        \        34      '       g   VP                  R4       T;'       g    ^ V8  d   VP                  RV R24       V# )zReasons this property is not vetted (empty = vetted). cp_score + gated come from
the scorer (fresh), the rest from the property's enriched fields.statusRemovedremovedz"availability not confirmed within dzfailed a hard gate
photo_urls	thumbnailzno photocriteriacharacter_scorez8not analyzed (no character score, fewer than 4 criteria)land_size_m2zno verified land sizezCP score below z floor)
r   r   r   appendr   r   len
isinstanceintfloat)r   cp_scoregatedr   min_cpblockerscriteria_counts   &&&&&  r   vetted_blockersr(   -   s.    
(
(""&&(CHuuX)#	"Q$$<=U<VVWXY,-UU<  B155+=+=
#z*00b1Nuu'NQ,>RSaeeN+c5\::/0A/&89O    c                 &    \        WW#V4      '       * # )N)r(   )r   r#   r$   r   r%   s   &&&&&r   	is_vettedr+   D   s    qE???r)   )__doc__r   VETTED_MIN_CPr   r   r(   r+    r)   r   <module>r/      s8   &  6 -1 . '+= @r)   