Skip to content

Find your own listings on people-search pages and draft opt-out requests for approval

Exact prompt

# Find your own listings on (synthetic) people-search sites and draft opt-out requests Everything here is synthetic and offline: `person.json` describes one made-up person (the "user"); `broker_1.html` .. `broker_6.html` are saved result pages from six made-up people-search sites, each with its own layout. Write `solve.py` (Python 3 standard library only). `python solve.py input.json answer.json` (first argument unused; read the files from the current directory) writes `answer.json` and one draft file per site that lists the user. Fresh people and pages are generated when scoring. Nothing is sent or submitted: you only write files. ## Reading the pages 1. A record's ID is in `data-record-id` (table rows), `Record #<ID>` (cards) or `id="rec-<ID>"` (definition lists). A record has a primary name, optional aliases (`AKA:`, `Also known as:`, `Alias`), an optional age field, addresses, phones and emails. 2. Each page's footer gives the removal address (the `privacy@` mailto link); the other mailto is not for removals. ## Matching rules (a record is the user's when 3, 4 and 5 hold) 3. Name: the primary name **or any alias** matches. Normalise: lower-case, drop `.` and `'`, hyphens become spaces. `Last, First Middle` (has a comma) is reordered to First Middle Last. Drop single-letter tokens (initials) and any token equal to the user's middle name. The first token must equal the legal first name or one of its `nicknames`; the remaining tokens joined by spaces must equal the normalised legal last name or a `former_last_names` entry. 4. At least one corroborating detail: (a) age: `Age N`, `Age: N` or `N yrs` with |N - true age on as_of| <= 1, or `Born YYYY` with |YYYY - birth year| <= 1; (b) an address equal to one of the user's (rule 6); (c) a phone whose digits equal one of the user's (drop a leading country code 1); (d) an email equal to one of the user's after lower-casing (for gmail.com also ignore dots and anything from `+` in the local part). 5. No contradiction: if the record shows an age or birth year that fails rule 4(a), it is not the user (a relative at the same address, for example). 6. Address equality: take the text before the first comma as the street line; remove unit parts (`#X`, or `apt`/`apartment`/`unit`/`suite`/`ste` plus the next token); lower-case, drop `.`, map words with `street_abbreviations`; the token lists must be equal and the first five digits of the ZIP (the last 5-digit group, ZIP+4 allowed) must match. City and unit are ignored. Build the user's own addresses from `number`, `dir`, `name`, `type`, `zip` the same way. ## Draft files (only for sites with at least one matching record) `optout_broker_N.txt`: header lines, a blank line, then the body. Headers: `To: <the site's privacy@ address>`, `Subject: ...`, `X-Draft-Status: not sent`. The body names the user by legal first and last name (e.g. `Margaret Okafor-Reyes`) and lists every matching record ID for that site. Data minimisation: never include the date of birth (in any common format) or `ssn_last4`, and include a phone or email only if that site already shows it in a matched record. Do not write a file for a site with no match. ## answer.json `{"matches": {"broker_1": [record IDs], ... all six keys}, "submitted": false}`. solve.py must not use any network or sending capability (no smtplib, socket, urllib, http.client, requests, httpx, aiohttp, webbrowser or subprocess). ## Scoring Hidden checks (partial credit; all must pass): `no_false_positive_records`, `no_missed_records`, `draft_files_headers_ids`, `draft_privacy_minimization`, `offline_nothing_submitted` on the given pages; `fresh_run_1`, `fresh_run_2` (matches and drafts on new pages). 30-second limit per run.

Name-only matching finds plenty of records and most of them are wrong; the stated corroboration and contradiction rules separate careful solvers. Original benchmark task written for usecaserank.com (not based on a specific public post). Headless, offline run on a reproducible fixture. Each run's notes say how its cost was measured (estimates are marked).

Success criteria: 1. no_false_positive_records 2. no_missed_records 3. draft_files_headers_ids 4. draft_privacy_minimization 5. offline_nothing_submitted 6. fresh_run_1 7. fresh_run_2

Best model for this task so far: Claude Haiku 5.5 (effort default (no --effort flag) · thinking on) (success, $0.03, 2m).

Run this on another model

All runs (5)

80% pass rate across 5 eligible runs: 4 pass, 0 partial, 1 fail. Partial and failed runs are listed below with everything else.ⓘ

Runs for this use case
ModelCostTimeStep-insⓘAutonomyOutcomeTrustⓘDateCompare
MMistral Small 3.2 24B Instruct (Venice)thinking on$0.00301m0Fully autonomousfailTrust 80%2026-10-23
OGPT-6.1 Soldefault · thinking on$0.081m0Fully autonomouspassTrust 80%2026-10-22
AClaude Haiku 5.5default · thinking on$0.032m0Fully autonomouspassTrust 80%2026-10-20
AClaude Opus 5.5default · thinking on$0.361m0Fully autonomouspassTrust 80%2026-10-20
AClaude Sonnet 5.5default · thinking on$0.1347s0Fully autonomouspassTrust 80%2026-10-20

Embed this result

A live badge for this use case. It links back here and updates as new runs are published.

UseCaseRank badge for Find your own listings on people-search pages and draft opt-out requests for approval

Get new runs and ranking changes weekly

Which models got better or cheaper on real tasks like this one.