import json
import pickle

with open('/tmp/req_map.pkl', 'rb') as f:
    req_map, pairs = pickle.load(f)

# Complete scoring for all 132 pairs
all_scores = [
    # Pair 1-10
    (pairs[0][0], pairs[0][1], 12),   # ARCH-2 vs INST-1: SDK surface vs ID split
    (pairs[1][0], pairs[1][1], 28),   # HAZARD-CONTROL-STAMP-LIFETIME vs HAZARD-REGISTRY-STALL
    (pairs[2][0], pairs[2][1], 18),   # LISTEN-PRESERVES-HOSTING vs START-1
    (pairs[3][0], pairs[3][1], 14),   # ECHO-DROP-DIR vs RESUME-CUSTODY-ABA
    (pairs[4][0], pairs[4][1], 24),   # DOCS-6 vs MANIFEST-4
    (pairs[5][0], pairs[5][1], 30),   # BROKER-VIEWER-BRAIN-DECOUPLE vs RESTART-IDEMPOTENT
    (pairs[6][0], pairs[6][1], 35),   # DAEMON-9 vs NET-FAMILY-GATE
    (pairs[7][0], pairs[7][1], 32),   # CONN-POISON-ATTRIBUTION vs RC-ATTACH-TRUTH
    (pairs[8][0], pairs[8][1], 8),    # ENDPOINT-LIST-REST-FILTER vs PICKER-KEY-GATE
    (pairs[9][0], pairs[9][1], 65),   # INBOX-NO-DOUBLE vs RESTART-IDEMPOTENT

    # Pair 11-20
    (pairs[10][0], pairs[10][1], 31),  # PSYCHE-RESIDENCY vs TEARDOWN-DEADEND
    (pairs[11][0], pairs[11][1], 48),  # RESUME-CUSTODY-ABA vs RESUME-ADAPTER
    (pairs[12][0], pairs[12][1], 22),  # ARCH-1 vs ARCH-2
    (pairs[13][0], pairs[13][1], 26),  # DOCS-4 vs DOCS-NO-INTERNAL-CODES
    (pairs[14][0], pairs[14][1], 42),  # SHAREDSEND vs PEER-PUMP-CHURN
    (pairs[15][0], pairs[15][1], 29),  # INST-13 vs RUN-PICKER-HOME
    (pairs[16][0], pairs[16][1], 25),  # RESUME-UNBOUND-STAMP vs SELF-ID
    (pairs[17][0], pairs[17][1], 19),  # EP-3 vs PSYCHE-STAMP-CLEAR
    (pairs[18][0], pairs[18][1], 36),  # ENDPOINT-MESSAGE-ONLY vs RUN-ID-REUSES
    (pairs[19][0], pairs[19][1], 35),  # CONTROLLER-GAP-RESUME vs LIVE-AGENT-NO-INJECT

    # Pair 21-30
    (pairs[20][0], pairs[20][1], 38),  # RENDER-LIFECYCLE vs VIEWER-STARVE
    (pairs[21][0], pairs[21][1], 43),  # STALE-INDEX-LOCK vs REGISTRY-STALE-CLEAN
    (pairs[22][0], pairs[22][1], 58),  # CONTROL-STAMP-CONVERGENCE vs WAKE-RESUME-LEG
    (pairs[23][0], pairs[23][1], 40),  # PSYCHE-SID-CUSTODY vs SESSION-ADAPTER-RECORDED
    (pairs[24][0], pairs[24][1], 37),  # HOSTED-LIVENESS vs SPAWN-COLLISION-GUARD
    (pairs[25][0], pairs[25][1], 22),  # ENDPOINT-LIST-REST-FILTER vs PICKER-CHOOSE
    (pairs[26][0], pairs[26][1], 27),  # DAEMON-BITS-AMBIGUITY vs SUBNET-5
    (pairs[27][0], pairs[27][1], 34),  # ATTACH-WEDGE vs DRIVEN-BY-SELFHEAL
    (pairs[28][0], pairs[28][1], 62),  # ATTACH-SEED-DOUBLE-SERVE vs LISTEN-SEED-CONSUME
    (pairs[29][0], pairs[29][1], 31),  # RC-DISPLAY-SOLE-WRITER vs RC-RESIZE

    # Pair 31-40
    (pairs[30][0], pairs[30][1], 26),  # RC-RECONNECT-TRUTH vs TERM-4
    (pairs[31][0], pairs[31][1], 24),  # INBOX-NO-DOUBLE vs RELAY-NO-BUSY
    (pairs[32][0], pairs[32][1], 33),  # HOSTED-LIVENESS vs RC-HARNESS-ONLY-REFUSAL
    (pairs[33][0], pairs[33][1], 27),  # CLI-4 vs DIGEST-CROSS-NODE
    (pairs[34][0], pairs[34][1], 28),  # DOC-DELIVERY-VOCAB vs DOCS-3
    (pairs[35][0], pairs[35][1], 44),  # UPDATE-GH-TRANSPORT vs UPDATE-RESTART-SAFE
    (pairs[36][0], pairs[36][1], 51),  # DAEMON-STOP-BARRIER vs STAMP-CONVERGENCE
    (pairs[37][0], pairs[37][1], 32),  # PICKER-CHOOSE-DEDUP vs UPDATE-DEFAULT-COMPOSITE
    (pairs[38][0], pairs[38][1], 23),  # RC-INPUT-KEY vs UNHOST-PSYCHE-REAP
    (pairs[39][0], pairs[39][1], 29),  # ENSURE-DAEMON-STOP-INHIBIT vs SEAT-LIFETIME

    # Pair 41-50
    (pairs[40][0], pairs[40][1], 34),  # DAEMON-3 vs INSTALL-10
    (pairs[41][0], pairs[41][1], 31),  # MANIFEST-5 vs UPD-5
    (pairs[42][0], pairs[42][1], 25),  # CLI-JSON vs DIGEST-JSON-SELF-CONTAINED
    (pairs[43][0], pairs[43][1], 46),  # DEFERRED-DRAIN vs DEFERRED-SURVIVE
    (pairs[44][0], pairs[44][1], 41),  # RESUME-REAP-PRIOR-HARNESS vs SEAM-RESUME
    (pairs[45][0], pairs[45][1], 33),  # REDISPATCH-STALL vs PUMP-PEER-ISOLATION
    (pairs[46][0], pairs[46][1], 19),  # API-3 vs ENVELOPE-PARSER-SAFE
    (pairs[47][0], pairs[47][1], 27),  # API-4 vs REGISTRY-STALE-CLEAN
    (pairs[48][0], pairs[48][1], 30),  # VIEWER-ISOLATION vs RUN-PICKER
    (pairs[49][0], pairs[49][1], 38),  # ENDPOINT-CYCLE-HONEST vs HOSTING-AUTHORITY

    # Pair 51-60
    (pairs[50][0], pairs[50][1], 24),  # INST-12 vs INST-14
    (pairs[51][0], pairs[51][1], 35),  # STAMP-CONVERGENCE-ORDER vs SUBNET-2
    (pairs[52][0], pairs[52][1], 41),  # RUN-MULTISUBNET-HOME vs SUBNET-5
    (pairs[53][0], pairs[53][1], 21),  # EP-1 vs EP-2
    (pairs[54][0], pairs[54][1], 42),  # VIEWER-RING-ROLL-SNAP vs STREAM-LIFETIME
    (pairs[55][0], pairs[55][1], 26),  # PICKER-CHOOSE vs PICKER-REMOTE-WAKE
    (pairs[56][0], pairs[56][1], 31),  # RC-EOF vs PEER-PUMP-CHURN
    (pairs[57][0], pairs[57][1], 16),  # DAEMON-1 vs DAEMON-SCHED
    (pairs[58][0], pairs[58][1], 33),  # ADAPTER-FLOOR-ENFORCE vs MANIFEST-1
    (pairs[59][0], pairs[59][1], 28),  # EP-3 vs WAN-SEND-DELIVERY

    # Pair 61-70
    (pairs[60][0], pairs[60][1], 35),  # CONPTY-DSR vs EBUSY-RENAME
    (pairs[61][0], pairs[61][1], 34),  # BIND-REST-STATE vs WIN-PTY-PROGRAM
    (pairs[62][0], pairs[62][1], 26),  # ENDPOINT-LIFECYCLE vs SOFT-END-PRESERVES
    (pairs[63][0], pairs[63][1], 39),  # PSYCHE-SID-CUSTODY vs SELF-ID-TRUST
    (pairs[64][0], pairs[64][1], 38),  # DAEMON-STOP-REAP vs REST-TERMINAL
    (pairs[65][0], pairs[65][1], 35),  # DISPATCH-HYGIENE vs VIEWER-STARVE
    (pairs[66][0], pairs[66][1], 29),  # ADAPTER-GH-TRANSPORT vs WAN-SEND
    (pairs[67][0], pairs[67][1], 42),  # DROP-FILE-SINGLE-WRITER vs DIRECT-WRITE-PRECEDENCE
    (pairs[68][0], pairs[68][1], 36),  # DISPATCH-CLAIM-RETRY vs SERVE-OWNERSHIP
    (pairs[69][0], pairs[69][1], 33),  # ENDPOINT-MESSAGE-ONLY vs PICKER-CONTROLLED

    # Pair 71-80
    (pairs[70][0], pairs[70][1], 25),  # INST-12 vs LIST-JSON-LIVENESS
    (pairs[71][0], pairs[71][1], 29),  # MANIFEST-7 vs PICKER-WINDOW-TITLE
    (pairs[72][0], pairs[72][1], 32),  # CI-DOCS-ONLY vs DOCS-1
    (pairs[73][0], pairs[73][1], 28),  # LISTEN-SESSION-ID vs REST-TERMINAL
    (pairs[74][0], pairs[74][1], 24),  # PAIR-SEED-ROTATION vs INSTALL-9
    (pairs[75][0], pairs[75][1], 23),  # DAEMON-9 vs PEER-ROUTE-CHAIN
    (pairs[76][0], pairs[76][1], 38),  # ATTACH-SEED-DOUBLE vs DISPATCH-CLAIM
    (pairs[77][0], pairs[77][1], 35),  # GRACE-BEFORE-SIGNOFF vs ECHO-BEFORE-SIGNOFF
    (pairs[78][0], pairs[78][1], 31),  # DAEMON-BITS-AMBIGUITY vs MANIFEST-3
    (pairs[79][0], pairs[79][1], 33),  # PROJECT-INDEX vs SPAWN-FRESH-TRUTHFUL

    # Pair 81-90
    (pairs[80][0], pairs[80][1], 26),  # LIVEHOST-RECONCILE vs UPD-3
    (pairs[81][0], pairs[81][1], 42),  # IDLE-PARKED-DELIVERY vs WAN-DELIVERY
    (pairs[82][0], pairs[82][1], 34),  # ENDPOINT-UNBOUND vs IDLE-PARKED
    (pairs[83][0], pairs[83][1], 29),  # EFFECT-JOURNAL-PTY-WEDGE vs SEEDMAP-CONNECT
    (pairs[84][0], pairs[84][1], 31),  # RC-CROSS-NODE vs RC-DISPLAY
    (pairs[85][0], pairs[85][1], 24),  # EP-8 vs SHELL-5
    (pairs[86][0], pairs[86][1], 33),  # SOFT-CLEANUP vs EPHEMERAL-CLEANUP
    (pairs[87][0], pairs[87][1], 27),  # RELAY-NO-BUSY vs SEAM-ACTIVITY
    (pairs[88][0], pairs[88][1], 31),  # MSG-3 vs PRESENCE-CONTROL-REAP
    (pairs[89][0], pairs[89][1], 29),  # SEAM-POSTSPAWN vs TERM-1

    # Pair 91-100
    (pairs[90][0], pairs[90][1], 28),  # WAN-ORIGIN-AUTH vs WHOAMI-EXPLICIT-SID
    (pairs[91][0], pairs[91][1], 37),  # REGISTRY-STALL vs ROSTER-GHOST
    (pairs[92][0], pairs[92][1], 35),  # BROKER-OUTPUT-BEFORE vs PTY-INPUT-WEDGE
    (pairs[93][0], pairs[93][1], 29),  # ENDPOINT-LIST-NODE vs INST-9
    (pairs[94][0], pairs[94][1], 26),  # LISTEN-PRESERVES vs MANIFEST-5
    (pairs[95][0], pairs[95][1], 38),  # BIND-CWD vs SINGLE-PATH-SOURCE
    (pairs[96][0], pairs[96][1], 32),  # RC-EOF vs STREAM-INFOS
    (pairs[97][0], pairs[97][1], 24),  # VIEWER-CLOSE vs TERM-1
    (pairs[98][0], pairs[98][1], 35),  # RESUME-CUSTODY-IDENTITY vs WHOAMI-SID
    (pairs[99][0], pairs[99][1], 33),  # DAEMON-RESTART-SELF vs BROKER-SEED-WIRE-SKEW

    # Pair 101-110
    (pairs[100][0], pairs[100][1], 27),  # SHELL-5 vs TERM-1
    (pairs[101][0], pairs[101][1], 42),  # ADAPTER-LIVE-UPDATE vs MANIFEST-4
    (pairs[102][0], pairs[102][1], 44),  # BRAIN-RESUME-NO-CONTROL vs SERVE-OWNERSHIP
    (pairs[103][0], pairs[103][1], 31),  # DAEMON-3 vs DAEMON-STOP-BARRIER
    (pairs[104][0], pairs[104][1], 28),  # RUN-NO-DUP-SESSION vs UPDATE-FINISH-ENDPOINT
    (pairs[105][0], pairs[105][1], 32),  # MESH-BOOTSTRAP vs PEERADDR-INVARIANT
    (pairs[106][0], pairs[106][1], 25),  # INST-4 vs UPDATE-FINISH-COMMUNE
    (pairs[107][0], pairs[107][1], 30),  # PICKER-KEY-GATE vs PLATFORM-MUSL
    (pairs[108][0], pairs[108][1], 27),  # SEAM-SPAWN vs START-3
    (pairs[109][0], pairs[109][1], 34),  # RC-ATTACH-ONLINE-RACE vs RC-QUALIFIED-TARGET

    # Pair 111-120
    (pairs[110][0], pairs[110][1], 33),  # ENDPOINT-MESSAGE-ONLY vs PICKER-UX
    (pairs[111][0], pairs[111][1], 26),  # CLI-WIN-VT vs JOIN-DEFERRED
    (pairs[112][0], pairs[112][1], 29),  # WORKER-PATH vs WORKER-PICKER
    (pairs[113][0], pairs[113][1], 31),  # PICKER-PROJECT-DISPLAY vs PSYCHE-LEGACY
    (pairs[114][0], pairs[114][1], 23),  # INSTALL-8 vs TERM-ECHO
    (pairs[115][0], pairs[115][1], 35),  # UPDATE-FINISH-ENDPOINT vs UPDATE-ONE-SHOT
    (pairs[116][0], pairs[116][1], 32),  # CASCADE-WIPE vs SINGLE-PATH-SOURCE
    (pairs[117][0], pairs[117][1], 21),  # ACTIVITY-LIST-JSON vs ENDPOINT-LIST-REST
    (pairs[118][0], pairs[118][1], 28),  # PSYCHE-OUTBOUND-PROXY vs INST-12
    (pairs[119][0], pairs[119][1], 34),  # BRAIN-RESTART-PSYCHE-DUP vs RESTART-IDEMPOTENT

    # Pair 121-132
    (pairs[120][0], pairs[120][1], 25),  # MSG-SELF-DETECT vs WHOAMI-SID
    (pairs[121][0], pairs[121][1], 38),  # DAEMON-STOP-LIVE vs DAEMON-STOP-REAP
    (pairs[122][0], pairs[122][1], 26),  # PICKER-WINDOW vs RUN-PICKER-HOME
    (pairs[123][0], pairs[123][1], 46),  # CONTROL-STAMP-CONVERGENCE vs UPDATE-TRIAL
    (pairs[124][0], pairs[124][1], 32),  # MSG-1 vs MSG-INJECT-LEG-DROP
    (pairs[125][0], pairs[125][1], 34),  # DAEMON-STATUS-JSON vs RC-ATTACH-TRUTH
    (pairs[126][0], pairs[126][1], 27),  # DAEMON-STDERR vs DETACHED-DAEMON-STDIO
    (pairs[127][0], pairs[127][1], 43),  # ADAPTER-UPDATE-INPLACE vs ADAPTER-PROFILE-STAMP
    (pairs[128][0], pairs[128][1], 25),  # RC-1 vs RC-WIN-PASTE
    (pairs[129][0], pairs[129][1], 28),  # ARCH-3 vs HANDOFF-ARGV-COMPAT
    (pairs[130][0], pairs[130][1], 32),  # REGISTRY-STALE vs TERM-1
    (pairs[131][0], pairs[131][1], 37),  # GOSSIP-CONTROLLED vs CONTROLLER-LEASE
]

print(f"Scored all {len(all_scores)} pairs")
print(f"Scores range from {min(p[2] for p in all_scores)} to {max(p[2] for p in all_scores)}")

# Distribution analysis
score_ranges = {
    '0-19': len([s for s in all_scores if 0 <= s[2] < 20]),
    '20-39': len([s for s in all_scores if 20 <= s[2] < 40]),
    '40-59': len([s for s in all_scores if 40 <= s[2] < 60]),
    '60-79': len([s for s in all_scores if 60 <= s[2] < 80]),
    '80-100': len([s for s in all_scores if 80 <= s[2] <= 100])
}
print(f"\nScore distribution:")
for range_label, count in score_ranges.items():
    print(f"  {range_label}: {count} pairs")

# Prepare output in the required StructuredOutput format
result_pairs = []
for a, b, score in all_scores:
    result_pairs.append({
        'a': a,
        'b': b,
        'score': score
    })

# Save for use
with open('/tmp/final_scores.json', 'w') as f:
    json.dump(result_pairs, f)

print(f"\nScores saved to /tmp/final_scores.json")
