← Files LLM & Agent Builder CopilotARCHIVED FILE
scripts/trace_review.py
2.05 KB · Nov 9, 2026 · 00:41 UTC
#!/usr/bin/env python3
"""Offline *illustrative* agent event-audit helper. Not a replacement for host/tool authorization."""
import json
import sys
from pathlib import Path
EFFECTS={"write","delete","external_send","deploy","payment","permission_change"}
def analyze(events):
if not isinstance(events,list): raise ValueError('events must be a list')
approvals={}
seen=set()
findings=[]
for i,ev in enumerate(events):
if not isinstance(ev,dict):
findings.append('invalid_event:'+str(i));continue
typ=ev.get('type'); aid=ev.get('action_id')
if not isinstance(aid,str) or not aid:
findings.append('missing_action_id:'+str(i));continue
if typ=='approval':
approvals[aid]={'result':ev.get('result'),'target':ev.get('target')}
elif typ=='tool_call':
effect=ev.get('effect')
if effect in EFFECTS:
if aid in seen: findings.append('duplicate_effect:'+aid)
seen.add(aid)
approval=approvals.get(aid)
if not approval or approval.get('result')!='approved':
findings.append('missing_approval:'+aid)
elif approval.get('target')!=ev.get('target'):
findings.append('approval_mismatch:'+aid)
elif typ=='tool_result': pass
else: findings.append('unknown_event:'+str(i))
return sorted(set(findings))
def inspect_fixture_file(path):
data=json.loads(Path(path).read_text())
if data.get('synthetic_data_only') is not True: raise ValueError('synthetic fixture only')
output=[]
for f in data['fixtures']:
found=analyze(f['events'])
output.append({'name':f['name'],'findings':found,'matches_fixture':found==sorted(f['expected_blockers'])})
return output
if __name__=='__main__':
if len(sys.argv)!=2:
print('Usage: python scripts/trace_review.py benchmarks/synthetic-traces.json',file=sys.stderr)
sys.exit(2)
print(json.dumps({'synthetic_only':True,'results':inspect_fixture_file(sys.argv[1])},indent=2))
SHA-256: 6e0e99c5736bd5028ad0939bd10cbc57ebb23b3a5e45dc2aee361730178a826a