Skip to content

GPT-6.1 Sol (effort default (no reasoning-effort override) · thinking on) on Sailboat instrument dashboard from an NMEA 0183 log

OGPT-6.1 Soldefault · thinking on · Codex CLI 0.163.0 (codex exec --json) · cloud · 2026-10-22 · by @bobsiopener

Trust 80%Fully autonomoussuccess · first try
Estimated cost
$0.06
Wall time
1m
Human step-ins
0
Outcome
Pass

Compare with other models on this task →

Summary

Exact prompt

# Sailboat instrument dashboard from an NMEA 0183 log `log.nmea` is a **synthetic** instrument log from a sailboat; `input.json` names it and gives alarm thresholds. Write `solve.py` (Python 3 standard library only) so that `python solve.py input.json answer.json` parses the log, computes true wind and VMG, finds alarm periods, writes `answer.json`, **and** writes a static display `dashboard.html` in the working directory. We re-run it on fresh logs, so do not hard-code anything. ## Log format Each line is `<t>,<sentence>` where `<t>` is an integer second and `<sentence>` is an NMEA 0183 sentence `$<body>*<hh>`. The checksum hh is two hex digits (either case) equal to the XOR of all characters of `<body>` (between `$` and `*`). ## Rules 1. Blank lines are ignored and not counted. A line is **malformed** if it has no comma before the sentence, `<t>` is not an integer, the sentence does not start with `$`, has no `*`, the checksum is not exactly 2 hex digits, or (after the checksum passes) the sentence type is not one of those below or a needed field is missing or not a number. A line whose checksum does not match is **bad_checksum**. Every other line is **valid** (this includes MWV lines that are skipped by rule 3). 2. The sentence type is the last 3 characters of the first field. Fields are split on commas (field 0 is the talker+type): - `HDT`: field 1 = true heading (degrees). - `VHW`: field 5 = boat speed through water (knots). - `DBT`: field 3 = depth (metres). - `VTG`: field 5 = speed over ground (knots). - `MWV`: field 1 = apparent wind angle (degrees clockwise from the bow, 0-360), field 2 = reference, field 3 = apparent wind speed (knots), field 5 = status. 3. Keep the latest heading and boat speed. For an MWV with reference `R` and status `A`, if a heading and a boat speed have already been seen, make a **true wind sample** at its time: x = AWS*cos(AWA) - BSP, y = AWS*sin(AWA); TWS = hypot(x, y); TWA = atan2(y, x) in degrees mod 360; TWD = (heading + TWA) mod 360; VMG = BSP*cos(TWA). MWV lines with another reference or status are valid but make no sample. 4. Alarms: depth alarm on DBT readings with depth < `depth_min`; wind alarm on true wind samples with TWS > `tws_max`; speed alarm on VTG readings with SOG > `sog_max`. For each type, an alarm is a maximal run of consecutive readings of that type (in file order) that break the limit; `start`/`end` are the times of its first and last breaking reading. Sort all alarms by start, then type name. 5. `last` holds the last sample's tws, twa, twd, vmg (2 decimals) and the last boat speed and depth values as read. ## answer.json `{"counts": {"valid", "bad_checksum", "malformed"}, "true_wind_samples": n, "last": {"tws", "twa", "twd", "vmg", "bsp", "depth"}, "tws_mean": .., "tws_max": .., "alarms": [{"type": "depth"|"wind"|"speed", "start", "end"}, ...]}` (mean and max of TWS over all samples, 2 decimals). ## dashboard.html A self-contained static page (no scripts or network needed) with these element ids: `tws`, `twa`, `twd`, `vmg`, `bsp`, `depth` (each element's text is only the value from `last` with 1 decimal), an `<svg id="wind-rose">` containing a `<line id="twd-needle">` pointing toward TWD, and `<ul id="alarm-list">` with exactly one `<li>` per alarm. Styling is up to you. It must be static and self-contained so it can be screenshotted headless: no `<script>`, no `<img>`/`<link>`/`<iframe>`/`<object>`/`<embed>`, no `on*` handlers, no `href`/`src` except `#...` or `data:`, no CSS `url(http...)` or `@import`, no fetches. ## Scoring Hidden checks (partial credit = fraction passed; all must pass): `sentence_counts` (exact), `true_wind_and_vmg` (within 0.011, sample count exact), `alarm_intervals` (exact), `dashboard_elements` (file exists, static rules above, ids present, `wind-rose` is `<svg>`, `twd-needle` is `<line>`, `alarm-list` is `<ul>`), `dashboard_values` (each value within 0.051 of the answer, li count) on the given log; `fresh_log_1` (all answer keys plus dashboard values) and `fresh_log_2` (all answer keys) on fresh logs. Each run has a 60-second limit.

Checksum XOR with lowercase hex, malformed vs bad-checksum vs skipped MWV, true wind from apparent wind with the latest heading and speed, alarm runs per reading type, and a static HTML display whose values are cross-checked. Original benchmark task written for usecaserank.com. Headless, offline run on a reproducible fixture. Cost shown is a list-price API-equivalent estimate (run on a ChatGPT subscription, not billed).

Benchmark code for comparing AI models, not navigation or safety software.

Success criteria: 1. sentence_counts 2. true_wind_and_vmg 3. alarm_intervals 4. dashboard_elements 5. dashboard_values 6. fresh_log_1 7. fresh_log_2

Setup notes: Use Case Scout batch10 case k01-nmea-instrument-dashboard (offline fixture). Prepared with batch10/prepare.sh on the shared box; only TASK.md + starting files were copied to the agent machine, hidden key/tests stayed on the box. Prompt = TASK.md verbatim on stdin. Flags: --json -s workspace-write --skip-git-repo-check --ephemeral --ignore-user-config --ignore-rules -C <workdir>. Scored on the box with the scout's scorer: `python score.py WORKDIR KEYDIR`. Single run, no retries. User-level AGENTS.md (846 bytes, sha256 83ec4fe50da8) may have been in context; --ignore-user-config does not document excluding it. Visual output (dashboard.html) rendered offline to PNG with google-chrome headless, network blocked, 1280x800 at ~3 s after load. Serving model not confirmed: requested via -m; the event log does not echo the serving model id. Price source is secondary (pricing.json verification='secondary', https://www.actuia.com/en/news/ai-api-pricing-in-october-2026-050-to-50-for-output/), not an official OpenAI price page. Score: 7/7. Cost is an ESTIMATE: measured tokens x pricing.json list price (ChatGPT plan, nothing billed); input_tokens include cached reads; output_tokens include reasoning tokens. Tool calls 4 (1 failed, recovered). Single run.

Estimated cost List-price estimate; not actually billed.

Output

Metrics

Estimated cost
$0.06
Wall time
1m
Human step-ins
0
Turns
1
Model usage
ModelInput tokOutput tokCost
OGPT-6.1 Solopenai/gpt-6.1-soleffort default (no reasoning-effort override) · thinking on89,4642,551$0.06

Reproduce this run

  1. Use the use case prompt on the use case page.
  2. Same setup: GPT-6.1 Sol (openai/gpt-6.1-sol, effort default (no reasoning-effort override) · thinking on) via Codex CLI 0.163.0 (codex exec --json), cloud.
  3. It counts as a success only if it meets every success criterion: 1. sentence_counts 2. true_wind_and_vmg 3. alarm_intervals 4. dashboard_elements 5. dashboard_values 6. fresh_log_1 7. fresh_log_2
  4. Log model, tokens, wall time, human step-ins and the evidence log, then submit it as a reproduction. A different model? Submit a head-to-head rerun.

How runs are scored: Methodology.

Was this useful?

⇄ Rerun on another model

Automated checks

Trust 80% comes from these checks (how Trust % works).

Evidence log
{"type": "thread.started", "thread_id": "01a163f7-b64c-74c0-a5a4-05ef7ab31271"}
{"type": "turn.started"}
{"type": "item.completed", "item": {"id": "item_0", "type": "agent_message", "text": "I\u2019ll inspect the input files, then write and run a standard-library solution that generates both outputs.\n"}}
{"type": "item.started", "item": {"id": "item_1", "type": "command_execution", "command": "/bin/bash -lc \"pwd && rg --files -g 'AGENTS.md' -g 'input.json' -g '*.nmea' -g 'solve.py'\"", "aggregated_output": "", "exit_code": null, "status": "in_progress"}}
{"type": "item.completed", "item": {"id": "item_1", "type": "command_execution", "command": "/bin/bash -lc \"pwd && rg --files -g 'AGENTS.md' -g 'input.json' -g '*.nmea' -g 'solve.py'\"", "aggregated_output": "/home/bob/usecase-runs/batch/out/gpt-6.1-sol/108_k01/work\ninput.json\nlog.nmea\n", "exit_code": 0, "status": "completed"}}
{"type": "item.started", "item": {"id": "item_2", "type": "command_execution", "command": "/bin/bash -lc 'cat input.json && head -n 12 log.nmea'", "aggregated_output": "", "exit_code": null, "status": "in_progress"}}
{"type": "item.completed", "item": {"id": "item_2", "type": "command_execution", "command": "/bin/bash -lc 'cat input.json && head -n 12 log.nmea'", "aggregated_output": "{\n \"log\": \"log.nmea\",\n \"alarms\": {\n  \"depth_min\": 6.0,\n  \"tws_max\": 19.2,\n  \"sog_max\": 5.2\n }\n}0,$IIHDT,322.1,T*20\n0,$IIVHW,,T,,M,4.95,N,,K*43\n0,$IIDBT,,f,7.4,M,,F*12\n0,$GPVTG,322.1,T,,M,5.15,N,,K*7d\n0,$IIMWV,77.2,R,17.7,N,A*3E\n3,$IIHDT,324.5,T*22\n3,$IIVHW,,T,,M,4.82,N,,K*45\n3,$IIDBT,,f,7.5,M,,F*13\n3,$GPVTG,324.5,T,,M,5.29,N,,K*70\n3,$IIMWV,75.0,R,18.4,N,A*32\n6,$IIHDT,325.5,T*23\n6,$IIVHW,,T,,M,5.07,N,,K*49\n", "exit_code": 0, "status": "completed"}}
{"type": "item.started", "item": {"id": "item_3", "type": "file_change", "changes": [{"path": "/home/bob/usecase-runs/batch/out/gpt-6.1-sol/108_k01/work/solve.py", "kind": "add"}], "status": "in_progress"}}
{"type": "item.completed", "item": {"id": "item_3", "type": "file_change", "changes": [{"path": "/home/bob/usecase-runs/batch/out/gpt-6.1-sol/108_k01/work/solve.py", "kind": "add"}], "status": "completed"}}
{"type": "item.started", "item": {"id": "item_4", "type": "command_execution", "command": "/bin/bash -lc 'python solve.py input.json answer.json && cat answer.json'", "aggregated_output": "", "exit_code": null, "status": "in_progress"}}
{"type": "item.completed", "item": {"id": "item_4", "type": "command_execution", "command": "/bin/bash -lc 'python solve.py input.json answer.json && cat answer.json'", "aggregated_output": "/bin/bash: line 1: python: command not found\n", "exit_code": 127, "status": "failed"}}
{"type": "item.started", "item": {"id": "item_5", "type": "command_execution", "command": "/bin/bash -lc 'python3 solve.py input.json answer.json && cat answer.json'", "aggregated_output": "", "exit_code": null, "status": "in_progress"}}
{"type": "item.completed", "item": {"id": "item_5", "type": "command_execution", "command": "/bin/bash -lc 'python3 solve.py input.json answer.json && cat answer.json'", "aggregated_output": "{\n  \"counts\": {\n    \"valid\": 487,\n    \"bad_checksum\": 11,\n    \"malformed\": 3\n  },\n  \"true_wind_samples\": 95,\n  \"last\": {\n    \"tws\": 17.35,\n    \"twa\": 69.52,\n    \"twd\": 47.72,\n    \"vmg\": 1.77,\n    \"bsp\": 5.06,\n    \"depth\": 5.6\n  },\n  \"tws_mean\": 17.39,\n  \"tws_max\": 19.79,\n  \"alarms\": [\n    {\n      \"type\": \"speed\",\n      \"start\": 3,\n      \"end\": 3\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 9,\n      \"end\": 9\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 21,\n      \"end\": 21\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 27,\n      \"end\": 27\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 36,\n      \"end\": 36\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 42,\n      \"end\": 48\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 54,\n      \"end\": 54\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 60,\n      \"end\": 111\n    },\n    {\n      \"type\": \"wind\",\n      \"start\": 84,\n      \"end\": 84\n    },\n    {\n      \"type\": \"wind\",\n      \"start\": 93,\n      \"end\": 93\n    },\n    {\n      \"type\": \"wind\",\n      \"start\": 99,\n      \"end\": 99\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 117,\n      \"end\": 132\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 144,\n      \"end\": 156\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 171,\n      \"end\": 186\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 195,\n      \"end\": 228\n    },\n    {\n      \"type\": \"depth\",\n      \"start\": 210,\n      \"end\": 216\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 234,\n      \"end\": 240\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 246,\n      \"end\": 267\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 273,\n      \"end\": 273\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 285,\n      \"end\": 285\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 291,\n      \"end\": 291\n    },\n    {\n      \"type\": \"depth\",\n      \"start\": 294,\n      \"end\": 297\n    },\n    {\n      \"type\": \"speed\",\n      \"start\": 297,\n      \"end\": 297\n    }\n  ]\n}\n", "exit_code": 0, "status": "completed"}}
{"type": "item.completed", "item": {"id": "item_6", "type": "agent_message", "text": "Created `solve.py` and generated `answer.json` and `dashboard.html`.\n\nVerified execution with Python 3: 487 valid lines, 11 bad checksums, 3 malformed lines, and 95 true wind samples.\n\nRun with:\n```bash\npython3 solve.py input.json answer.json\n```"}}
{"type": "turn.completed", "usage": {"input_tokens": 89464, "cached_input_tokens": 73984, "cache_write_input_tokens": 0, "output_tokens": 2551, "reasoning_output_tokens": 44}}

Get new runs and ranking changes weekly