
    
aj"                    ~    d Z ddlmZ ddlZddlZddlZddlmZmZ ddlm	Z	 dZ
dZdZd	Zd
 Zd Zedk(  r e        yy)zLAudited backlog optimizer. Dry-run is the default; migration is append-only.    )annotationsN)datetimetimezone)Pathz?/opt/struktur/obsidian-knowledge-pipeline/knowledge_pipeline.dbz//opt/struktur/knowledge-curator/review_pilot.dbz</opt/struktur/knowledge-curator/review-backlog-analysis.jsonzbacklog-optimizer/1.0.0c                 d    t        j                  t        j                        j	                         S )N)r   nowr   utc	isoformat     4/opt/struktur/knowledge-curator/backlog_optimizer.pyr   r      s    (,,x||,6688r   c                 $   t        j                         } | j                  dd       | j                  dt        d       | j                  dd	       | j                  d
d       | j	                         }t        j                  t        t                    }|d   }i }|D ]Y  }|d   }|dk(  rddd|j                  d      d||d   <   *|dk(  rdddd||d   <   <|dk(  rdddd||d   <   Ndd dd||d   <   [ i }|j                         D ]   }|j                  |d   d      dz   ||d   <   " t               t        t        t        |      |j                  dd      ||d   |d    d!d"i d#}	d$D ]b  }|D cg c]  }|d   |k(  s| }
}t        |
      t        t        |
      |d%v rd&nd'      |
d |d%v rd&nd' D cg c]  }|d   	 c}d(|	d)   |<   d |j                  rUt!        j"                  t$              }t!        j"                  t&              }t               }|j)                  d*      D ch c]  }|d   	 }}|D cg c]  }|d   |v s||d      d   dk7  s| c}d |j*                  xs t        |       }||fD ]  }|j)                  d+        	 |j)                  d,      D ch c]  }|d   	 }}d-D ]!  \  }}||vs|j)                  d.| d/|        # d0t-        j                  t.        j0                        j3                  d1      z   }|j)                  d2|t        d3||t        |      d4d5f       d}d}|j*                  xs t        |      }|D ]  }|d   }||   }|d   dk(  r|j)                  d6|f      j5                         }|r|d   dk7  rC|j)                  d7|d   |d   |j                  d      |d8   t        ||j                  d9      ||f	       |j)                  d:|d;|d<d|d   t        j6                  |d8   t        |j                  d9      d=d">      |f       |j)                  d?|f      j5                         }|r|dz  }nd@|d8    dA}dB|z   dCz   t        j9                  dDdC      z   }|j)                  dE||d4|dF   |d |dGf       |j)                  dHdI|z   dCz   t        j9                  dDdC      z   |d|d   dJd4||f       |dz  } |j;                          |j;                          d!|	dK<   ||	dL<   ||	dM<   ||	dN<   	 |jA                          |jA                          tC        |jD                        jG                  t        j6                  |	d"dOP      dQz   dRS       |jH                  s"tK        t        j6                  |	d"dOP             y y c c}w c c}w c c}w c c}w c c}w # t<        $ r" |j?                          |j?                           w xY w# |jA                          |jA                          w xY w)TNz	--migrate
store_true)actionz--limitr   )typedefaultz--reportz;/opt/struktur/knowledge-curator/review-backlog-dry-run.json)r   z--quietitemscategory	duplicatedz*duplicate.normalized_key_and_evidence_hashcanonical_candidate_id)
new_statusdecisionruleduplicate_ofcandidate_idexcluded_non_knowledgerz.nonknowledge.boilerplate_or_technical_metadata)r   r   r   )invalid_fragment_or_insufficient_evidenceinvalid_fragmentez/evidence.complete_sentence_and_subject_requiredpending_reviewretain_human_reviewr      duplicate_groupsduplicate_itemsTF)generated_atoptimizer_versionsource_analysisbeforepredicted_after_pending_reviewpredicted_statusesr%   r&   no_auto_truthmigration_performedsamples)r   r   r   sensitive_or_high_impactgenuine_pending_review)r0   r1   d   2   )	availablesample_sizecandidate_idsr/   zCSELECT candidate_id FROM review_items WHERE status='pending_review'zBEGIN IMMEDIATEzpragma table_info(review_items)))classification_statusTEXT)r   r8   )classification_ruler8   )classification_versionr8   )classified_atr8   )r   r8   z$ALTER TABLE review_items ADD COLUMN  zbacklog-optimization-z%Y%m%dT%H%M%S%fZzINSERT INTO review_runs(run_id,curator_version,normalization_version,started_at,completed_at,candidate_count,reviewer,status) VALUES(?,?,?,?,?,?,?,?)z
kc-norm-v3zpipeline-optimizer	completedz4SELECT status FROM review_items WHERE candidate_id=?zUPDATE review_items SET status=?,classification_status=?,canonical_candidate_id=?,classification_rule=?,classification_version=?,classified_at=?,duplicate_of=?,updated_at=? WHERE candidate_id=?r   r   z|INSERT INTO audit(run_id,entity_type,entity_key,phase,old_status,new_status,details_json,created_at) VALUES(?,?,?,?,?,?,?,?)reviewbacklog_classification)r   r(   r   )ensure_asciiz;SELECT 1 FROM review_decisions WHERE candidate_id=? LIMIT 1z(Deterministische Backlog-Klassifikation u3   ; keine Wahrheitsschreibung, keine Neo4j-Änderung.zauto--/zINSERT INTO review_decisions(decision_id,candidate_id,reviewer,decision,reason,corrected_candidate_json,reviewed_at,review_duration_seconds) VALUES(?,?,?,?,?,?,?,?)r   g        zINSERT INTO review_audit(audit_id,candidate_id,previous_state,new_state,action,actor,reason,created_at) VALUES(?,?,?,?,?,?,?,?)zauto-audit- automatic_backlog_classificationr.   migratedprotected_existing_decisionsmigration_run_id   )r@   indent
zutf-8)encoding)&argparseArgumentParseradd_argumentint
parse_argsjsonloadopenANALYSISgetvaluesr   VERSIONlenminmigratesqlite3connectPIPEREVIEWexecutelimitr   r   r	   strftimefetchonedumpsreplacecommit	Exceptionrollbackcloser   report
write_textquietprint)apargsar   r   icatcountsvoutpoolpcrctr   pending_idsselecteddbcolsnametyprun_id	protectedrD   r_   cidoldexreasondids                                 r   mainr      sr	   r{,OQSQ`Q`ajps|}Q`Q~  AC  AP  AP  Q[  da  AP  Ab  df  ds  ds  t}  EQ  ds  dR  Y[  Yf  Yf  Yh  TX99T(^AgJe

 oQ
m#+{VY  bN  ^_  ^c  ^c  d|  ^}  2~va/0
$$Nfru  ~n  AofQ~->&?
77as  @C  K|  T}.@Q9R0@DXm"nq !o 	
--/RQ6::aoa3PQR3R6!L/2RUw[^_d[e  HN  HR  HR  Sc  de  Hf  |B  VW  Xj  Vk  ~  @Q  ~R  cg  ~C  NP  Q S FS/aAjM3./$/RUVZR[jmnqrvnw  @C  G|  @|x{  BD  kE  rv  wC  B  F{  {  x{  AC  rD  VE  mn  WX  Yg  Wh  VE  FFY1DFLL__T"wv6B#%ZZ(mnoqto+o!. 1[ @VAnL]E^_kEln~E~A  AZ  BF  BL  BL  BZ  PS  TY  PZ  [(G2bRZZ 122"zz"CDE!1E4E J YxtC4&J4&PQRUQV$WXY
!(,,x||"<"E"EFX"Y
Y6::  f  hn  ov  wC  DE  FG  HK  LT  HU  Vj  kv  gw  x9		!s5z5 q	.CVC[1(((


I3&QZZ\C#a&,,hJJ  S  VW  Xd  Ve  fg  ht  fu  vw  v{  v{  |T  vU  VW  X^  V_  `g  hi  jk  jo  jo  p~  j  @A  BE  UF  GJJ  N  PV  W_  `c  d|  }M  NO  P\  N]  ^b  ^h  ^h  qr  sy  qz  OV  fg  fk  fk  lz  f{  i|  JO  ^P  QR  OS  T	zzOQTPVW``bB	9a<96qykAtuV	SS1	1SZZ  w  y|  }@  AU  VW  Xb  Vc  dj  ko  pq  ru  xv  wZZ  R  Ta  be  Te  fi  Ti  jq  jy  jy  z}  ~A  jB  TB  CF  GW  XY  Zf  Xg  hJ  K_  `f  gh  Si  jaKH 99;		S!67hc*o  }FX[\zX{  `f  HK  L^  H_ 88:rxxzdkkdjj%qI$NX_`

E$**Se1EF
E 0  VE p 	F. 
 ';;="++-'88:rxxzs[   8V&V&=V+
2V0V5V5 V5V? /V:;V? 
IV? :V? ?+W**W- -"X__main__)__doc__
__future__r   rK   rP   rZ   r   r   pathlibr   r\   r]   rS   rV   r   r   __name__r   r   r   <module>r      sF    R "   & F8	G! 80Gd Zr   