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).
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.ⓘ
| Model | Cost | Time | Step-insⓘ | Autonomy | Outcome | Trustⓘ | Date | Compare |
|---|---|---|---|---|---|---|---|---|
| MMistral Small 3.2 24B Instruct (Venice)thinking on | $0.0030 | 1m | 0 | Fully autonomous | fail | Trust 80% | 2026-10-23 | |
| OGPT-6.1 Soldefault · thinking on | $0.08 | 1m | 0 | Fully autonomous | pass | Trust 80% | 2026-10-22 | |
| AClaude Haiku 5.5default · thinking on | $0.03 | 2m | 0 | Fully autonomous | pass | Trust 80% | 2026-10-20 | |
| AClaude Opus 5.5default · thinking on | $0.36 | 1m | 0 | Fully autonomous | pass | Trust 80% | 2026-10-20 | |
| AClaude Sonnet 5.5default · thinking on | $0.13 | 47s | 0 | Fully autonomous | pass | Trust 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.
Get new runs and ranking changes weekly
Which models got better or cheaper on real tasks like this one.