
    ؛j5                        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ZddlZddl	Z	ddl
mZ  ed      Z ed      Z ed      Z ed      Zd	Zd
 Zd ZddZd Zd Zd Zd Zd Zd Zd Zedk(  r e e             y)zDeterministic post-session knowledge review.
Scans all local Hermes profile state DBs, extracts only explicit durable facts,
and writes provenance-bearing project notes. No LLM, no transcript archive.
    )annotationsN)Pathz/home/hermes/.hermesz/opt/obsidian-vaultz0/opt/struktur/session-knowledge-review/review.dbz2/opt/struktur/session-knowledge-review/audit.jsonlzsession-knowledge-review/1.2.0c                     t         j                  j                  dd       t        j                  t               } | j                  d       | j                  d       | j                  d       | j                          | S )NTparentsexist_oka  create table if not exists session_reviews (session_key text primary key, session_id text, profile text, source_db text, project text, status text not null, knowledge_items_found integer not null default 0, created integer not null, completed_at real, error text, version text not null)a  create table if not exists semantic_reviews (session_key text primary key, session_id text, profile text, project text, status text not null, knowledge_items_found integer not null default 0, created_at real not null, completed_at real, version text not null, error text)a8  create table if not exists semantic_items (session_key text, claim_id text, project text, subject text, claim text, claim_type text, source_session_id text, source_profile text, source_timestamp real, confidence real, validation_status text, knowledge_action text, target text, primary key(session_key,claim_id)))STATEparentmkdirsqlite3connectexecutecommit)cs    '/tmp/hermes_session_knowledge_review.pydbr      s    D$/
??5!))  %I  J  KL  KT  KT  Uj	  Kk	  l	m	  l	u	  l	u	  v	t  l	u  vw  v~  v~  v@  HI  AI    c                L   t        j                  dd| xs dj                               t        fddD              ryt        fddD              ry	d
v sdv sdv rydv sdv rydv ryt        fddD              ry|xs dd d j                         }d|v sd|v ryy)Nz[-_]+  c              3  &   K   | ]  }|v  
 y wN .0kts     r   	<genexpr>zproject_for.<locals>.<genexpr>   s     s1Qs   )zmas visual libraryzvisual kuratorzasset groupvariantenlogikzvariant candidateMAS Visual Libraryc              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zproject_for.<locals>.<genexpr>   s     |1Q|r   )zsocial media radarzsocial media agentz	sma radarzaa 045zfacebook propertyzsocial mediazSocial Media Radarz
youtube lmzyoutube videozyoutube audioz
YouTube LMzyoutube research
transkriptzYouTube ResearchventoVentoc              3  &   K   | ]  }|v  
 y wr   r   r   s     r   r   zproject_for.<locals>.<genexpr>   s     I1QIr   )zworker watcherwachfunktionu   überwachungu   Worker-Überwachungi N  z!/opt/struktur/mas-visual-library/zvisual_library.dbzMAS allgemein)resublowerany)titletextbodyr   s      @r   project_forr/      s     66(3**,-srss	|{||	AA-A1E\!|q08JqLIHIIQfzr6E  "'4/3F$3NVjr   c                    | |||dS )N)claim_id	statement
confidencesource_typer   )cidr2   r3   r4   s       r   claimr6   #   s    I:T_``r   c                   g }t               }dj                  d |xs dj                         D              }|j                         D ]  }|j                         dv sdv st	        j
                  d      r3t	        j
                  d|      }|rt        |      dk  rt        fd	d
D              sdv sdv sdv sdv sdv r|j                  d      j                  d      }	dt        j                  |	j                               j                         dd z   }
|
|vri|j                  |
       |j                  | j                         j!                  dd       d|
 d||ddt#        |	      j%                         rdnddd       t	        j&                  d      s]t        fdd D              ssd!vsyt	        j&                  d"      rt	        j(                  d#d|      j+                         }t        |      d$k\  st        |      d%k  st        fd&d'D              r|j-                  d(      rt	        j(                  d)d*t/        j0                  d+|j                                     j+                  d*      dd, }| j                         j!                  dd       d-| }
|
|vsu|j                  |
       |j                  |
d.||d/d0ddd1d2	        |S )3zExtract explicit, stable claims; this is claim extraction, not summarization.
 Only user-authored durable markers and verifiable production paths qualify.
 
c              3  ^   K   | ]%  }|j                         s|j                          ' y wr   )stripr   xs     r   r   z#semantic_extract.<locals>.<genexpr>*   s"     #^!TUT[T[T]AGGI#^s   --r   z/tmp/debugz\b(job|run|session)[ _-]?id\bz.(/opt/(?:struktur|obsidian-vault)/[^\s`\"\']+)i  c              3  &   K   | ]  }|v  
 y wr   r   r   r   lows     r   r   z#semantic_extract.<locals>.<genexpr>/   s       &T1a3h  &Tr   )z	reporter:status=bittearbeitsauftragz
noch offenzoffen:zverifiziert unterliegtpfadunter	datenbankvault   z.,)zpath.N   r   .production_pathPATHg
ףp=
?	VALIDATEDSUPPORTED_BY_SESSIONsession_user_instruction)r1   subjectr6   r2   
claim_typer3   validation_statusr4   z:^(die|der|das|hermes|obsidian|der aktuelle|die aktuelle)\bc              3  &   K   | ]  }|v  
 y wr   r   r?   s     r   r   z#semantic_extract.<locals>.<genexpr>4   s!       Y}fgYZ^aYa  Y}r   )z ist z sind z liegt z bleibt z dient z	 erfolgt z wurde z gilt:?u|   ^(prüfe|pruefe|erstelle|lege|führe|fuehre|behalte|muss|soll|darf|implementiere|aktualisiere|bitte|vor jeder|für |fuer )\bz\s+#   i,  c              3  &   K   | ]  }|v  
 y wr   r   r?   s     r   r   z#semantic_extract.<locals>.<genexpr>6   s       5[!Q#X  5[r   )znoch zunter anderemz	nicht alsu   häufigbeispielsweiserC   rA   u   prüfepruefesollteu   könntekoennterB   :z
[^a-z0-9]+_NFKDF   z.rule.explicit_ruleRULEgQ?REVIEW_REQUIRED)	r1   rQ   r6   r2   rR   r3   rS   r4   knowledge_action)setjoin
splitlinesr*   r(   searchlenr+   grouprstriphashlibsha256encode	hexdigestaddappendreplacer   existsmatchr)   r:   endswithunicodedata	normalize)projectsidr,   r-   outseenr.   linempathkeycleanslugr@   s                @r   semantic_extractr   &   s    ce$))#^
7N7N7P#^^T__ IT
jjl#^w#~3STW)XZbII?E!3t9c>#  &T  9S  &T  #T  [b  fi  [i  ou  y|  o|  BI  MP  BP  Va  eh  Vh  nu  y|  n|	
% 4ggnnT[[].K.U.U.WX[Y[.\&\#	oHHSM#**GMMO,C,CC,L+MQse)T_py}  KO  ]c  qu  Y]  ^b  Yc  Yj  Yj  Yl  JU  rH  Wq  r  sXXKCPUX  Y}  l|  Y}  V}  BE  MP  BP  Y[  Ya  Ya  ba  be  Yf	s4	 	&	&	(5	%j"nUS  5[  HZ  5[  2[  di  dr  dr  sv  dw	c+"7"7u{{}"M	N	T	TUX	YZ][]	^D==?""3s+
,F4&9C
$	XXc]3::#PUbgu{  JN  cy  Hb  vG  H  II  	r   c                F   |d   }| d| }| j                  d|f      j                         ry t        j                  d|z   dz   d      }dj	                  d	 |j                  d
|f      D              }t        |d   xs d|      }t        |||d   xs d|      }	d||g dt        j                         d}
	 t        j                         st        d      |	D ]u  }|j                  dd      dk  rd|d<   |
d   j                  |       2t        t        |      ||||d      \  }}||d<   t        |      |d<   |
d   j                  |       w t!        d |
d   D              rdnd}|
d   D ]  }| j                  d||j                  d      ||j                  d      |j                  d       |j                  d!      ||t        j                         |j                  d      |j                  d"      |j                  d      |j                  d      f        ||
d<   | j                  d#|||||t%        |	      t        j                         |dk(  rt        j                         nd t&        |
j                  d      f
       | j)                          t*        j,                  j/                  dd$       t*        j1                  d%d&'      j3                  t5        j6                  |
d()      dz          |
S # t"        $ r }d}||
d<   t        |      |
d<   Y d }~d }~ww xY w)*Nidr\   z2select 1 from semantic_reviews where session_key=?file:?mode=roTurir8   c              3  .   K   | ]  }|d    xs d  yw)r   r   Nr   r;   s     r   r   zsemantic_one.<locals>.<genexpr>@   s#       G|VWqtzrz  G|   zKselect content from messages where session_id=? and role='user' order by idr,   r   semantic_review	COMPLETED)event
session_idrw   itemsstatus	timestampOBSIDIAN_VAULT_UNAVAILABLEr3   r   g?rb   rc   r   )r   profiletargetc              3  D   K   | ]  }|j                  d       dk(    yw)rc   rb   N)getr;   s     r   r   zsemantic_one.<locals>.<genexpr>I   s!     !hST!%%(:";=N"N!hs    KNOWLEDGE_REVIEW_PENDINGr   errorzGinsert or replace into semantic_items values(?,?,?,?,?,?,?,?,?,?,?,?,?)r1   rQ   r6   rR   rS   z8insert into semantic_reviews values(?,?,?,?,?,?,?,?,?,?)r   autf-8encodingFensure_ascii)r   fetchoner   r   re   r/   r   timeVAULTrr   RuntimeErrorr   rp   append_note	note_pathstrr+   	Exceptionrh   VERSIONr   AUDITr
   r   openwritejsondumps)r   r   dbpathrowrx   r~   qr-   rw   r   resultitemactionr}   r   es                   r   semantic_oner   =   s   Ywiq&IIBC6JSSU^b
??76>*,6TYY  G|[\[d[d  fs  ux  tz  \{  G|  >|	S\'R	-5EgcRUV]R^Rdbdei5ju  }N  \_  jq  z|  FQ  ^b  ^g  ^g  ^i  tjlri	|,HII wd
hh|As".D	w0F0Ft0Lh9W-gdW^;_`;6$  {Aaefxay  QT  UY  QZ  BF  GO  BP  [a  bi  [j  [q  [q  rv  [w	w
 "!hX^_fXg!hh	ny&G_ tT))UWZ[_[c[cdn[opwx|  yA  yA  BK  yL  MQ  MU  MU  V]  M^  _c  _g  _g  ht  _u  vy  zA  BF  BK  BK  BM  NR  NV  NV  Wc  Nd  ei  em  em  nA  eB  CG  CK  CK  L^  C_  `d  `h  `h  iq  `r  Ws  ttEs3wW^_efijofpquqzqzq|  MS  U`  M`  ~B  ~G  ~G  ~I  fj  kr  sy  s}  s}  ~E  sF  GG  H  IJ  IQ  IQ  ISD$/

3
0P0V0VW[WaWabhv{W|  ~B  XB  1C  KQ  DQ 	h96&:JbefgbhRXY`Rahs   9B2K7 7	L  LL c                   | dk7  rg S t        ddd      t        ddd      t        ddd	      t        d
dd      t        ddd	      t        ddd      t        ddd      g}	 t        d      }t        j                  dt	        |      z   dz   d      }|j                  d      j                         d   }|j                  d      j                         d   }|j                  d      j                         d   }	|j                  d      j                         d   }
|j                  d      j                         d   }||
|	z
  z
  }|t        dd | d!| d"|	 d#|
 d$||
z
   d%| d&| d'dd(      gz  }|j                          |S # t        $ r Y |S w xY w))Nr!   z
masvl.rootzODie MAS Visual Library liegt produktiv unter /opt/struktur/mas-visual-library/.gGz?zmasvl.dbzYDie produktive Datenbank ist /opt/struktur/mas-visual-library/database/visual_library.db.zmasvl.originals_immutableuf   Originaldateien werden nicht überschrieben oder gelöscht; visual_id und SHA256 bleiben unverändert.g\(\?zmasvl.import_analysis_splitzuTechnischer Import/Katalogisierung und fachliche Bildanalyse durch den Visual-Kurator sind getrennte Prozessschritte.gffffff?zmasvl.duplicate_ruleu[   SHA256 dient ausschließlich zur Erkennung exakter Dubletten, nicht als Variantenkriterium.zmasvl.variant_groupsuV   Asset-Groups modellieren Variantenbeziehungen ausschließlich als Metadatenrelationen.gQ?zmasvl.candidate_lifecyclezVariant-Candidates besitzen einen nachvollziehbaren Lebenszyklus mit OPEN, RESOLVED_GROUPED, RESOLVED_FALSE_POSITIVE und RESOLVED_ALREADY_GROUPED.z;/opt/struktur/mas-visual-library/database/visual_library.dbr   r   Tr   zselect count(*) from visualsr   zselect count(*) from analysesz!select count(*) from asset_groupsz=select count(*) from visuals where asset_group_id is not nullz;select count(*) from variant_candidates where status='OPEN'zmasvl.live_inventoryzLive-Stand: z Visuals und z Kuratoranalysen; z Asset-Groups; z gruppierte und z ungruppierte Visuals; z Motivfamilien; z offene Variant-Candidates.zsession+live_db_validation)	r6   r   r   r   r   r   r   closer   )rw   rx   r,   r-   r   pr   visualsanalysesgroupsgrouped
candidatesfamiliess                r   extractr   Q   s   !!	) fgkl
nost#  %M  NR  S%  '^  _c  d|  ~B  Cwx|}#  %y  z~  	FG!7??[bcfghci[ijt[ty}K~
))2
3
<
<
>q
A'AIIVuLvLL  MB  CD  ME8  NO  NW  NW  X{  N|  NE  NE  NG  HI  NJ  GM  TU  T]  T]  ^]  T^  Tg  Tg  Ti  jk  Tl  LS  yz  yB  yB  C@  yA  yJ  yJ  yL  MN  yO  nxGFN#(E(<yhZWijpiq  rA  BI  AJ  JZ  [b  cj  [j  Zk  kB  CK  BL  L\  ]g  \h  hC  *D  EI  Jf  g  h  h%'') 	 	 s   DE? ?	FFc                    t        j                  dd|       j                         j                  dd      }t        dz  |z  dz  S )Nu   [^A-Za-z0-9ÄÖÜäöüß -]+r   r   -z03-ProjektezSESSION-KNOWLEDGE.md)r(   r)   r:   rq   r   )rw   safes     r   r   r   h   sA    ff-b9??AII#cRmD !777r   c                l   | j                   j                  dd       d|d    }t        j                  dt        j                               }| j                         r| j                  dd      }||v rh|d	   |v rd
| fS t        j                  dt        j                               }d|d    d| d|d	    d|d    d| d}| j                  ||z   d       d| fS d}nd| d}d}d|d    d|d	    d| d|d    d| d|d    d| d|d    d|d   d d!}	| j                  ||z   |	z   d       d"| fS )#NTr   z
claim_id: r1   z%Y-%m-%dT%H:%M:%SZr   rq   )r   errorsr2   CONFIRMz
## CONFLICT_REVIEW z
- existing claim marker: z
- new assertion: z
- source_session_id: r   z
- timestamp: zO
- recommendation: human review; do not overwrite existing claim automatically
r   CONFLICTr   z---
title: uC    – Session Knowledge
type: durable_knowledge
status: active
---

z
## z
- z
- project: z
- agent/profile: r   z
- source_type: r4   z
- confidence: r3   z.2fz
- knowledge_action: CREATE
CREATE)r
   r   r   strftimegmtimerr   	read_text
write_text)
r}   rw   r   sourcemarkernowoldconflictprefixblocks
             r   r   r   l   s   4.
T*%&'	]]'6KKM
nngYn7#s]
;3T>}})$++-83$T*%5$6 7))/ 1!!%k!2 3 4%%+L%9$: ; E "_	`8 ??3x<?1
T/	&y h	i&#	tJ T+%6$7tF8CZ[abn[oZpp}  F  ~G  GZ  [a  bk  [l  Zm  m|  }@  |A  AR  SW  Xe  Sf  Rg  gw  x|  }I  xJ  KN  wO  Om  nE!73r   c                   |d   }| d| }| j                  d|f      j                         }|r|d   dk(  rt        | |||      S t        j                  d|z   dz   d	      j                  d
|f      j                         }dj                  d |D              }t        |d   xs d|      }	t        |	||d   xs d|      }
|||d}||	g dd d}	 t        j                         st        d      |
D ]@  }t        t        |	      |	||      \  }}|d   j                  i ||t        |      d       B d}|||||	|t#        |
      t%        t'        j&                               |dk(  rt'        j&                         nd |d   t(        f}|r| j                  d|dd  |fz          n| j                  d|       | j+                          t,        j.                  j1                  dd       t,        j3                  dd      j5                  t7        j8                  i |dt'        j&                         id       dz          t        | |||      }||d!S # t         $ r }d}||d<   t        |      |d<   Y d }~=d }~ww xY w)"Nr   r\   z6select status from session_reviews where session_key=?r   r   r   r   Tr   zPselect role,content from messages where session_id=? and role='user' order by idr8   c              3  .   K   | ]  }|d    xs d  yw)rI   r   Nr   r;   s     r   r   zreview_one.<locals>.<genexpr>   sE       xT  JK  z{  |}  z~  zD  BD  zD  xTr   r,   r   )r   r   	source_db)r   rw   r   r   r   r   r   )rc   r   r   r   r   zupdate session_reviews set session_id=?,profile=?,source_db=?,project=?,status=?,knowledge_items_found=?,created=?,completed_at=?,error=?,version=? where session_key=?rI   z9insert into session_reviews values(?,?,?,?,?,?,?,?,?,?,?)r   r   r   r   r   Fr   )deterministicsemantic)r   r   r   r   r   fetchallre   r/   r   r   rr   r   r   r   rp   r   r   rh   intr   r   r   r   r
   r   r   r   r   r   )r   r   r   r   rx   r~   existingmsgsr-   rw   r   r   r   r   r   r}   str   valuessems                       r   
review_oner      s@   Ywiq&
))LcV
T
]
]
_!k),qPS2T+ToogfnZ/D9AA  CU  WZ  V\  ]  f  f  h  os  ox  ox  xT  OS  xT  oT  jn	S\'R	-WWSWI[Y[\`5aux{  GN  [a  kbciGBTXYK	|,HII Qd9W-gd6B;6$6'?CYCY  [P]a  [Pu{  FI  JN  FO  [P  DQQ" 
S3u:c$))+6FVXZeVetyy{kopvw~p  AH  	I))  v  w}  ~  ~@  wA  CF  BH  wH  I))GOD$/

3
0P0V0VW[WaWa  cEek  cElwx|  yB  yB  yD  cE  SX  XY  Z^  X^  1_!GF3'RU/V(V 	 K"x 0CFF7OKs   A&I 	I9I44I9c            	        t        j                         } | j                  dd       | j                  d       | j                         }t	               }g }t
        j                  d      D cg c]  }|j                         s| c}t
        dz  j                         r
t
        dz  gng z   }|D ]  }|j                  j                  dk7  r|j                  j                  nd}	 t        j                  d	t        |      z   d
z   d      }t        j                  |_        d}d}	|j                   r|dz  }|j                   f}	|j#                  ||	      D ]-  }
t%        ||t        |      |
      }|s|j'                  |       /  t+        t-        j.                  t0        t3        |      |dd             yc c}w # t(        $ r}t+        d||       Y d }~)d }~ww xY w)Nz--once
store_true)r   z--session-idzprofiles/*/state.dbzstate.dbz.hermesdefaultr   r   Tr   zEselect * from sessions where ended_at is not null and message_count>0r   z	 and id=?
SCAN_ERROR)version	processedresultsFr   r   )argparseArgumentParseradd_argument
parse_argsr   ROOTglobis_filerr   r
   namer   r   r   Rowrow_factoryr   r   r   rp   r   printr   r   r   rh   )apr   r   ry   r   pathsr   r   sqlparamsr   rr   s                r   mainr      s   boohloKBOO\jLknpn{n{n}lm  AC  AE~  JL  FI9923Caqyy{C[_`j[jZrZrZtd:oEVz|}
 
1Q88==)3!((--'1__WSV^J.481w{{N3
6llC$CQ\\OViiF# s73q6#&AA
1 tzzWSCHV[\]	 D 
0|Aa000s+   ,F7F7$BF<0F<<	GGG__main__)zsession+live_validation)__doc__
__future__r   r   rk   r   r   r   r(   ru   pathlibr   r   r   r	   r   r   r   r/   r6   r   r   r   r   r   r   r   __name__
SystemExitr   r   r   <module>r      s    # > > > > 	
 !.C)D5
=>dK  GA(I"a.Q(.88W.
  Zj00r   