← Files LLM & Agent Builder CopilotARCHIVED FILE

scripts/trace_review.py

2.05 KB · Nov 9, 2026 · 00:41 UTC

↓ Download file

See the change to this file →

#!/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