import json

# Load data
with open('C:\\temp\\req_data.json', 'r', encoding='utf-8') as f:
    data = json.load(f)

req_map = data['reqMap']
pairs = data['pairs']

def get_req(req_id):
    if req_id in req_map:
        return req_map[req_id]
    return {'id': req_id, 'title': '[NOT FOUND]', 'doc': ''}

# Now I will score each pair based on careful reading
# This is a judgment task, not a programming task

scores = []

# Pair 1
r1 = get_req("REQ-HAZARD-DROP-FILE-SINGLE-WRITER")  # Drop files are daemon-owned single-writer
r2 = get_req("REQ-HAZARD-DIRECT-WRITE-PRECEDENCE")  # Direct-write precedence marker guards stale overwrite
# Both about file write safety but different mechanisms. Adjacent hazards.
scores.append({"a": "REQ-HAZARD-DROP-FILE-SINGLE-WRITER", "b": "REQ-HAZARD-DIRECT-WRITE-PRECEDENCE", "score": 48, "why": "Adjacent file-write safety hazards: single-writer ownership vs precedence marker enforcement"})

# Pair 2
r1 = get_req("REQ-PICKER-2")  # project-history loader reads git-backed context
r2 = get_req("REQ-READY-AGENT-RESUME")  # offline ReadyAgent shows in picker and resumes
# Same domain (picker), but different aspects
scores.append({"a": "REQ-PICKER-2", "b": "REQ-READY-AGENT-RESUME", "score": 35, "why": "Picker context management vs agent resume behavior - related but distinct promises"})

# Pair 3
r1 = get_req("REQ-ADAPTER-UPDATE-POST")  # Composite adapter update post-step
r2 = get_req("REQ-HAZARD-ENV-SUBST")  # Endpoint run honors manifest env injection
# Completely different: one adapter lifecycle, one runtime behavior
scores.append({"a": "REQ-ADAPTER-UPDATE-POST", "b": "REQ-HAZARD-ENV-SUBST", "score": 18, "why": "Different domains: adapter update mechanism vs endpoint env substitution"})

# Pair 4
r1 = get_req("REQ-HAZARD-DIRECT-WRITE-PRECEDENCE")  # Precedence marker guards stale overwrite
r2 = get_req("REQ-SERVE-OWNERSHIP-GENERATION")  # Terminal exclusion + ownership generation
# Different hazard aspects - one about stale writes, one about ownership/generation
scores.append({"a": "REQ-HAZARD-DIRECT-WRITE-PRECEDENCE", "b": "REQ-SERVE-OWNERSHIP-GENERATION", "score": 42, "why": "Related file safety concepts but distinct mechanisms: precedence vs ownership generation"})

# Pair 5
r1 = get_req("REQ-PICKER-CHANGE-ADAPTER-FLOW")  # ChangeAdapter wrongly routes into CREATE flow
r2 = get_req("REQ-RUN-ID-REUSES-ADAPTER")  # spt endpoint run --id reuses adapter
# Both about adapter selection in picker/run flow
scores.append({"a": "REQ-PICKER-CHANGE-ADAPTER-FLOW", "b": "REQ-RUN-ID-REUSES-ADAPTER", "score": 52, "why": "Both about adapter selection in endpoint run flow but different failure modes"})

# Pair 6  
r1 = get_req("REQ-ADAPTER-GH-TRANSPORT")  # gh_release transport variants
r2 = get_req("REQ-RESUME-ADAPTER-FOLLOWS-SESSION")  # Adapter choice follows session
# Different aspects of adapter: fetch transport vs which adapter to use
scores.append({"a": "REQ-ADAPTER-GH-TRANSPORT", "b": "REQ-RESUME-ADAPTER-FOLLOWS-SESSION", "score": 28, "why": "Both adapter-related but distinct: fetch transport vs adapter selection"})

# Pair 7
r1 = get_req("REQ-RUN-MULTISUBNET-HOME")  # Run defaults to subnet home
r2 = get_req("REQ-RUN-PICKER-HOME")  # Run starts from picker home
# Both about default location in run but different meanings
scores.append({"a": "REQ-RUN-MULTISUBNET-HOME", "b": "REQ-RUN-PICKER-HOME", "score": 55, "why": "Adjacent requirements about default location: multisubnet home vs picker UI start"})

# Pair 8
r1 = get_req("REQ-LIST-JSON-LIVENESS-PARITY")  
r2 = get_req("REQ-SUBNET-8")  
# Different areas entirely
scores.append({"a": "REQ-LIST-JSON-LIVENESS-PARITY", "b": "REQ-SUBNET-8", "score": 20, "why": "Different domains: list JSON output vs subnet behavior"})

# Pair 9
r1 = get_req("REQ-HAZARD-CONTROLLER-LEASE")  # Controller lease identity 
r2 = get_req("REQ-HAZARD-INJECT-CONTROL-COEXIST")  # Inject and control can coexist
# Both about controller mechanisms 
scores.append({"a": "REQ-HAZARD-CONTROLLER-LEASE", "b": "REQ-HAZARD-INJECT-CONTROL-COEXIST", "score": 62, "why": "Related controller hazards but different aspects: lease identity vs concurrent control"})

# Pair 10
r1 = get_req("REQ-HAZARD-SOFT-CLEANUP")  # Soft end preserves resources
r2 = get_req("REQ-HAZARD-EPHEMERAL-CLEANUP")  # Ephemeral instance cleanup
# Different cleanup scenarios
scores.append({"a": "REQ-HAZARD-SOFT-CLEANUP", "b": "REQ-HAZARD-EPHEMERAL-CLEANUP", "score": 48, "why": "Related cleanup hazards: soft state preservation vs ephemeral instance cleanup"})

# Print results
for i, score_record in enumerate(scores, 1):
    print(f"Pair {i}: {score_record['score']} - {score_record['why']}")

print(f"\nScored {len(scores)} pairs")
