Explorer
/proc/81/root/tmp/passa_tick.py
← Zurück ↓ Download
import json, os, tempfile
from pathlib import Path
from datetime import datetime, timezone
R=Path('/opt/struktur/reports/aa043-p44-pass-a-runtime'); lock=R/'run.lock'
try: fd=os.open(lock,os.O_CREAT|os.O_EXCL|os.O_WRONLY); os.close(fd)
except FileExistsError: print('LOCK_EXISTS'); raise SystemExit
try:
 b=Path('/opt/struktur/reports/aa043-p44-r1p/20260828T142945Z'); label=R/'pass-a-labels.jsonl'; cp=R/'checkpoint.json'
 order=json.loads((b/'p44-r1p-order-pass-a.json').read_text())['case_ids']
 def rec(pos,cid,typ,ann): return {'global_order_position':pos,'case_id':cid,'benchmark_type':typ,'annotation':ann}
 S={'SEG-0174':('CORRECT_BOUNDARY','Eigenständiger vollständiger Ausblickssatz.'),'SEG-0080':('SHOULD_JOIN','Schlussformel und Folgesatz bilden gemeinsam die Abschlussaussage.'),'SEG-0012':('CORRECT_BOUNDARY','Eigenständige Recap-Aussage.'),'SEG-0045':('SHOULD_JOIN','Modellbezeichnung vervollständigt syntaktisch den vorangehenden Satz.'),'SEG-0233':('CORRECT_BOUNDARY','Eigenständige kurze Replik vor neuer Erläuterung.'),'SEG-0284':('CORRECT_BOUNDARY','Vollständiger Satz; danach folgen neue Beispiele.'),'SEG-0111':('CORRECT_BOUNDARY','Abgeschlossene Aufzählungsphrase vor neuer Schlussfolgerung.'),'SEG-0102':('CORRECT_BOUNDARY','Eigenständige abschließende Grußformel.'),'SEG-0161':('CORRECT_BOUNDARY','Vollständige Statusaussage vor weiterem Statushinweis.'),'SEG-0266':('CORRECT_BOUNDARY','Vollständige Handlungsbestätigung vor Ergebnisbeschreibung.'),'SEG-0074':('SHOULD_JOIN','Isoliertes ## 2. ist als Überschrift unvollständig.')}
 pairs=['PAIR-0038','PAIR-0067','PAIR-0169','PAIR-0168','PAIR-0198','PAIR-0036','PAIR-0031','PAIR-0163','PAIR-0140']
 A={}
 for c in pairs:
  related=c in ('PAIR-0038','PAIR-0067'); A[c]={'label':'RELATED_NOT_SAME' if related else 'UNRELATED','source_independence':'INDEPENDENT','same_subject':related,'same_predicate':False,'same_object':False,'different_qualifier':False,'negation_difference':False,'numeric_difference':False,'unit_difference':False,'temporal_difference':False,'version_difference':False,'condition_difference':False,'reason':'Beide Aussagen betreffen Agenten, aber unterschiedliche Sachverhalte.' if related else 'Kein gemeinsamer sachlicher Zusammenhang erkennbar.'}
 def cl(s,sub,pred,obj,n=[],u=[],t='unspecified',ctx='LOCAL'):
  return {'atomic_statement':s,'subject':sub,'predicate':pred,'object':obj,'negation':False,'numeric_values':n,'units':u,'temporal_scope':t,'conditions':[],'knowledge_value':'HIGH','required_context':ctx,'reason':'Explizite sachliche Aussage im Fenster.'}
 C={'CLM-0104':[cl('Ein Schwarm von 150.000 beziehungsweise 1.000 Agenten könnte gemeinsam an Software arbeiten.','Agentenschwarm','kann arbeiten an','Software',[150000,1000],['Agenten','Agenten'],'hypothetisch','WIDER_CONTEXT'),cl('GitHub ist eine Webseite für Codepublikation und gemeinsames Arbeiten.','GitHub','ist Plattform für','Codepublikation und Zusammenarbeit',ctx='NONE'),cl('100.000 Agenten könnten gemeinsam an Software arbeiten.','Agenten','könnten arbeiten an','Software',[100000],['Agenten'],'hypothetisch','WIDER_CONTEXT'),cl('Ein solcher Einsatz könnte die Softwareentwicklung verändern.','Einsatz vieler Agenten','könnte verändern','Softwareentwicklung',t='hypothetisch',ctx='WIDER_CONTEXT')], 'CLM-0074':[cl('Tausende OpenClaus diskutieren in einem Reddit-ähnlichen Forum.','Tausende OpenClaus','diskutieren in','Forum',t='Experiment',ctx='WIDER_CONTEXT'),cl('Die Agenten beobachten das Teilen ihrer Screenshots durch Menschen.','OpenClaus','beobachten','Screenshot-Teilen durch Menschen',t='Experiment',ctx='WIDER_CONTEXT'),cl('OpenCloud ist ein schnell wachsendes Open-Source-Projekt.','OpenCloud','ist','schnell wachsendes Open-Source-Projekt',t='bis jetzt',ctx='WIDER_CONTEXT'),cl('OpenCloud hat 131.000 Sterne.','OpenCloud','hat','Sterne',[131000],['Sterne'],t='jetzt',ctx='WIDER_CONTEXT')], 'CLM-0189':[cl('Stärkere Modelle reduzieren wahrscheinlich das Prompt-Injection-Risiko.','starke Modelle','reduzieren wahrscheinlich','Prompt-Injection-Risiko',ctx='WIDER_CONTEXT'),cl('Kleinere Modelle haben eine höhere Chance auf Prompt-Injections.','kleine Modelle','haben höhere Wahrscheinlichkeit für','Prompt-Injections',ctx='WIDER_CONTEXT'),cl('Man kann später auf kleinere Modelle wechseln, um Kosten zu sparen.','Anwender','kann wechseln auf','kleinere Modelle',t='später',ctx='WIDER_CONTEXT')], 'CLM-0057':[cl('Das Netzwerk hieß zunächst Cloudbot, dann Mbot und mittlerweile OpenClaw.','Netzwerk','hatte Namen','Cloudbot, Mbot, OpenClaw',t='zunächst/dann/derzeit',ctx='WIDER_CONTEXT'),cl('OpenClaw kann lokal installiert werden.','OpenClaw','kann installiert werden auf','lokalem System'),cl('OpenClaw kann auf einem virtuellen privaten Server von Hostinger aufgesetzt werden.','OpenClaw','kann aufgesetzt werden auf','virtuellem privaten Server von Hostinger',ctx='WIDER_CONTEXT')], 'CLM-0059':[cl('OpenCloud heißt Paul.','OpenCloud','heißt','Paul'),cl('Das System erkennt Interesse an KI und einen YouTube-Kanal.','System','erkennt','KI-Interesse und YouTube-Kanal',ctx='WIDER_CONTEXT'),cl('Das System soll um 20:30 an das Liken des Videos erinnern.','System','soll erinnern an','Video-Like',[20,30],['Uhrzeit'],t='geplant')]}
 for pos in range(491,516):
  cid=order[pos-1]
  if cid.startswith('SEG'): typ='segmentation'; ann={'label':S[cid][0],'reason':S[cid][1]}
  elif cid.startswith('CLM'): typ='claim'; ann={'contains_knowledge_claim':'YES','atomic_claim_count':len(C[cid]),'claims':C[cid],'reason':'Explizite sachliche Aussagen im Fenster.'}
  else: typ='pair'; ann=A[cid]
  x=rec(pos,cid,typ,ann)
  with label.open('a',encoding='utf-8') as f: f.write(json.dumps(x,ensure_ascii=False,separators=(',',':'))+'\n'); f.flush(); os.fsync(f.fileno())
  with label.open('rb') as f: assert json.loads(f.read().splitlines()[-1])==x
  st=json.loads(cp.read_text()); st['completed_global_positions'].append(pos); st['completed_case_ids'].append(cid); st['count_completed']=len(st['completed_global_positions']); st['completed']=st['count_completed']; st['remaining']=st['total_positions']-st['completed']; st['last_completed_position']=pos; st['next_global_position']=pos+1; st[{'segmentation':'segmentations_completed','claim':'claims_completed','pair':'pairs_completed'}[typ]]+=1; now=datetime.now(timezone.utc).isoformat(); st['last_run']=now; st['updated_at']=now; st['run_status']='RUNNING'; st['status']='RUNNING'; fd,tmp=tempfile.mkstemp(prefix='checkpoint.',dir=R); os.close(fd); Path(tmp).write_text(json.dumps(st,ensure_ascii=False,indent=2)+'\n'); os.replace(tmp,cp)
 print('PROCESSED 25 LAST 515 NEXT 516 SEG',st['segmentations_completed'],'CLM',st['claims_completed'],'PAIR',st['pairs_completed'],'COMPLETED',st['completed'],'REMAINING',st['remaining'])
finally:
 try: lock.unlink()
 except FileNotFoundError: pass