Skip to content

GPT-6.1 Sol (effort default (no reasoning-effort override) · thinking on) on Best sailing angle and leg times from a polar table

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.05
Wall time
1m
Human step-ins
0
Outcome
Pass

Compare with other models on this task →

Summary

Exact prompt

# Best sailing angle from a polar table `input.json` (synthetic) has a boat polar (`polar.tws` wind speeds in knots, `polar.twa` true wind angles in degrees ascending, `polar.speed[j][k]` = boat speed at `twa[j]`, `tws[k]`), the current true wind speed `tws`, and a list of `legs` each with `bearing` (degrees true to the mark), `distance_nm` and `twd` (true wind direction, degrees the wind blows FROM). Write `solve.py` (Python 3 standard library only); `python solve.py input.json answer.json` writes `answer.json` and `polar.svg`. Fresh inputs are used too, so no hard-coding. ## Rules 1. Boat speed at (tws, a): for each table row, interpolate linearly in tws (clamped to the first/last column outside the range); then interpolate linearly in twa between rows (clamped to 180 at the end). For a < `twa[0]` (no-go zone) speed is 0. 2. `upwind`: over integer a in 0..90, maximise VMG = speed*cos(a); `downwind`: over integer a in 90..180, maximise -speed*cos(a). Compare VMG rounded to 4 decimals; on a tie take the smaller angle. Report `{"twa": a, "vmg": value rounded to 3}`. 3. Each leg: over integer courses c = 0..359, a = smallest angle between c and `twd` (0..180), s = speed(tws, a), VMC = s*cos(c - bearing). Take the c with the greatest VMC compared at 6 decimals; ties keep the smaller c. Report `course`, `twa` (a), `boat_speed` (3 dp), `vmc` (3 dp), `hours` = distance / VMC (3 dp) or null if VMC <= 0. 4. `total_hours` = sum of non-null leg hours (3 dp). ## Visual output: polar.svg Static, self-contained SVG (root `<svg>`, no scripts, images, links, fonts or other external assets; renders headless), containing an element `id="polar-curve"` (the polar curve at the given tws) and `<line id="best-upwind">` and `<line id="best-downwind">` drawn from the origin along the best angles. The drawing itself is not graded. ## answer.json `{"upwind": {"twa", "vmg"}, "downwind": {"twa", "vmg"}, "legs": [{"course", "twa", "boat_speed", "vmc", "hours"}, ...], "total_hours"}` ## Scoring Hidden checks (partial credit = fraction passed; all must pass): `best_upwind_downwind`, `upwind_and_downwind_legs` (legs 0-1), `reaching_legs_and_total` (legs 2-3 and total), `polar_svg_static` (polar.svg exists, follows the static rules, has the ids/tags above), `fresh_run_1`, `fresh_run_2`. Numbers within 0.002; integers exact. 60-second limit per run.

Bilinear polar lookup with clamping and a no-go zone, integer angle searches with stated rounding and tie rules, and course-vs-mark VMC that forces tacking or gybing angles on beats and runs. 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. best_upwind_downwind 2. upwind_and_downwind_legs 3. reaching_legs_and_total 4. polar_svg_static 5. fresh_run_1 6. fresh_run_2

Setup notes: Use Case Scout batch10 case k02-polar-vmg-optimizer (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 (polar.svg) 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: 6/6. 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.05
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 on84,3452,093$0.05

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. best_upwind_downwind 2. upwind_and_downwind_legs 3. reaching_legs_and_total 4. polar_svg_static 5. fresh_run_1 6. fresh_run_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": "01a163f8-a0d0-71f0-8b98-1fe1e25c012b"}
{"type": "turn.started"}
{"type": "item.completed", "item": {"id": "item_0", "type": "agent_message", "text": "I\u2019ll inspect the workspace, implement the interpolation and angle searches, then check the JSON and SVG outputs."}}
{"type": "item.started", "item": {"id": "item_1", "type": "command_execution", "command": "/bin/bash -lc \"pwd && rg --files -g 'AGENTS.md' -g 'input.json' -g 'solve.py' -g '*test*'\"", "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 'solve.py' -g '*test*'\"", "aggregated_output": "/home/bob/usecase-runs/batch/out/gpt-6.1-sol/109_k02/work\ninput.json\n", "exit_code": 0, "status": "completed"}}
{"type": "item.started", "item": {"id": "item_2", "type": "command_execution", "command": "/bin/bash -lc 'cat input.json'", "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'", "aggregated_output": "{\n \"polar\": {\n  \"tws\": [\n   6,\n   8,\n   10,\n   12,\n   16,\n   20\n  ],\n  \"twa\": [\n   38,\n   45,\n   52,\n   60,\n   75,\n   90,\n   110,\n   120,\n   135,\n   150,\n   165,\n   180\n  ],\n  \"speed\": [\n   [\n    2.22,\n    3.19,\n    4.01,\n    4.57,\n    6.33,\n    6.82\n   ],\n   [\n    2.68,\n    3.51,\n    4.7,\n    5.58,\n    7.12,\n    6.99\n   ],\n   [\n    3.17,\n    4.14,\n    5.34,\n    6.44,\n    7.4,\n    7.25\n   ],\n   [\n    3.57,\n    4.84,\n    6.07,\n    7.08,\n    7.63,\n    7.59\n   ],\n   [\n    4.28,\n    5.8,\n    7.1,\n    7.97,\n    7.98,\n    7.89\n   ],\n   [\n    4.95,\n    6.44,\n    7.87,\n    7.99,\n    7.96,\n    8.08\n   ],\n   [\n    4.48,\n    6.04,\n    7.72,\n    7.96,\n    7.92,\n    7.66\n   ],\n   [\n    4.21,\n    5.66,\n    7.22,\n    7.45,\n    7.51,\n    7.65\n   ],\n   [\n    4.1,\n    5.24,\n    6.71,\n    7.51,\n    7.63,\n    7.72\n   ],\n   [\n    3.62,\n    4.67,\n    5.8,\n    7.06,\n    7.66,\n    7.62\n   ],\n   [\n    3.14,\n    4.18,\n    5.16,\n    5.99,\n    7.67,\n    7.57\n   ],\n   [\n    2.54,\n    3.44,\n    4.31,\n    5.05,\n    6.91,\n    7.51\n   ]\n  ]\n },\n \"tws\": 17.0,\n \"legs\": [\n  {\n   \"bearing\": 11,\n   \"distance_nm\": 8.4,\n   \"twd\": 10\n  },\n  {\n   \"bearing\": 50,\n   \"distance_nm\": 8.3,\n   \"twd\": 226\n  },\n  {\n   \"bearing\": 27,\n   \"distance_nm\": 5.3,\n   \"twd\": 121\n  },\n  {\n   \"bearing\": 265,\n   \"distance_nm\": 3.5,\n   \"twd\": 41\n  }\n ]\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/109_k02/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/109_k02/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 && python3 - <<'PY'\nimport json\nimport xml.etree.ElementTree as ET\nfrom solve import make_speed, solve\np={'tws':[10,20], 'twa':[40,90,180], 'speed':[[4,8],[6,10],[3,5]]}\ns=make_speed(p,15)\nassert s(39)==0 and s(40)==6 and s(65)==7 and s(180)==4\nassert make_speed(p,0)(40)==4 and make_speed(p,30)(40)==8\nr,_=solve({'polar':p,'tws':15,'legs':[{'bearing':0,'twd':0,'distance_nm':10}]})\nassert r['legs'][0]['course'] < 180\nzero={'tws':[10], 'twa':[40,180], 'speed':[[0],[0]]}\nr,_=solve({'polar':zero,'tws':10,'legs':[{'bearing':20,'twd':0,'distance_nm':10}]})\nassert r['upwind']['twa']==0 and r['downwind']['twa']==90\nassert r['legs'][0]['course']==0 and r['legs'][0]['hours'] is None\nroot=ET.parse('polar.svg').getroot()\nids={e.attrib.get('id'):e.tag.split('}')[-1] for e in root.iter()}\nassert ids['polar-curve']=='polyline'\nassert ids['best-upwind']==ids['best-downwind']=='line'\nassert all(e.tag.split('}')[-1] in {'svg','title','path','polyline','line'} for e in root.iter())\nprint(json.dumps(json.load(open('answer.json')),indent=2))\nprint('Interpolation, clamping, tie handling, zero-speed legs, and SVG checks passed.')\nPY\"", "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 && python3 - <<'PY'\nimport json\nimport xml.etree.ElementTree as ET\nfrom solve import make_speed, solve\np={'tws':[10,20], 'twa':[40,90,180], 'speed':[[4,8],[6,10],[3,5]]}\ns=make_speed(p,15)\nassert s(39)==0 and s(40)==6 and s(65)==7 and s(180)==4\nassert make_speed(p,0)(40)==4 and make_speed(p,30)(40)==8\nr,_=solve({'polar':p,'tws':15,'legs':[{'bearing':0,'twd':0,'distance_nm':10}]})\nassert r['legs'][0]['course'] < 180\nzero={'tws':[10], 'twa':[40,180], 'speed':[[0],[0]]}\nr,_=solve({'polar':zero,'tws':10,'legs':[{'bearing':20,'twd':0,'distance_nm':10}]})\nassert r['upwind']['twa']==0 and r['downwind']['twa']==90\nassert r['legs'][0]['course']==0 and r['legs'][0]['hours'] is None\nroot=ET.parse('polar.svg').getroot()\nids={e.attrib.get('id'):e.tag.split('}')[-1] for e in root.iter()}\nassert ids['polar-curve']=='polyline'\nassert ids['best-upwind']==ids['best-downwind']=='line'\nassert all(e.tag.split('}')[-1] in {'svg','title','path','polyline','line'} for e in root.iter())\nprint(json.dumps(json.load(open('answer.json')),indent=2))\nprint('Interpolation, clamping, tie handling, zero-speed legs, and SVG checks passed.')\nPY\"", "aggregated_output": "{\n  \"upwind\": {\n    \"twa\": 39,\n    \"vmg\": 5.085\n  },\n  \"downwind\": {\n    \"twa\": 165,\n    \"vmg\": 7.385\n  },\n  \"legs\": [\n    {\n      \"course\": 49,\n      \"twa\": 39,\n      \"boat_speed\": 6.543,\n      \"vmc\": 5.156,\n      \"hours\": 1.629\n    },\n    {\n      \"course\": 61,\n      \"twa\": 165,\n      \"boat_speed\": 7.645,\n      \"vmc\": 7.505,\n      \"hours\": 1.106\n    },\n    {\n      \"course\": 30,\n      \"twa\": 91,\n      \"boat_speed\": 7.983,\n      \"vmc\": 7.972,\n      \"hours\": 0.665\n    },\n    {\n      \"course\": 265,\n      \"twa\": 136,\n      \"boat_speed\": 7.652,\n      \"vmc\": 7.652,\n      \"hours\": 0.457\n    }\n  ],\n  \"total_hours\": 3.857\n}\nInterpolation, clamping, tie handling, zero-speed legs, and SVG checks passed.\n", "exit_code": 0, "status": "completed"}}
{"type": "item.completed", "item": {"id": "item_6", "type": "agent_message", "text": "Implemented [solve.py](solve.py). Generated [answer.json](answer.json) and [polar.svg](polar.svg).\n\nVerified interpolation, clamping, tie handling, zero-speed legs, and SVG structure.\n\nRun with `python3 solve.py input.json answer.json` (`python` is unavailable here)."}}
{"type": "turn.completed", "usage": {"input_tokens": 84345, "cached_input_tokens": 73472, "cache_write_input_tokens": 0, "output_tokens": 2093, "reasoning_output_tokens": 30}}

Get new runs and ranking changes weekly