Research Question: RQ-astra-pi
On the OpenAI subscription route, how does GPT-6 Astra compare to the strongest references reachable on the pi harness — Sol on the same route, Sol on Requesty in both reasoning states, and Opus 5 on Requesty — at constant harness, workflow, kata and prompt style?
game-of-life-example-mapping
| n, run dates | Code quality | Size | Correctness | TDD discipline | Cost | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ○ | ○ | ↑ | ↑ | ↑ | ↓ | ↓ | ↓ | |
| model: gpt-6-astra-codex-no-thinkingn = 5, 2026-09-05 | 7.00 ± 2.24 | 2.96 ± 0.29 | 4.60 ± 1.34 🏆 | 3.15 ± 0.31 | 19.4 ± 3.21 | 18.0 ± 5.00 | 18.0 ± 5.00 | 2.40 ± 0.89 | 99.4 ± 15.13 🏆 | 22.4 ± 3.44 | 14.0 ± 0.71 | 100% ± 0 | 100%5/5 | 97%118/122 | 8.3 ± 0.3 min | 971k ± 71k | $2.06 ± 0.15 |
| model: gpt-5-6-sol-codex-no-thinkingn = 5, 2026-08-15 → 08-16 | 4.40 ± 1.52 | 2.47 ± 0.62 🏆 | 4.60 ± 0.55 | 2.38 ± 0.24 | 20.8 ± 6.22 | 11.5 ± 3.67 | 11.1 ± 4.56 | 0.60 ± 1.34 🏆 | 153 ± 6.72 | 41.6 ± 5.77 | 9.80 ± 1.30 | 100% ± 0 | 100%5/5 | 98%65/66 | 10.3 ± 1.8 min | 1.3M ± 278k | $2.02 ± 0.39 |
| model: gpt-5-6-sol-no-thinkingn = 5, 2026-08-15 → 08-16 | 9.00 ± 5.57 | 4.87 ± 2.96 🏆 | 6.80 ± 2.77 | 2.82 ± 1.08 | 18.8 ± 3.70 | 14.1 ± 7.05 | 13.7 ± 7.71 | 2.40 ± 1.67 | 139 ± 16.80 | 30.6 ± 8.93 | 8.40 ± 0.55 | 100% ± 0 | 100%5/5 | 100% 🏆50/50 | 4.2 ± 0.9 min 🏆 | 855k ± 166k 🏆 | $0.96 ± 0.18 🏆 |
| model: gpt-5-6-sol-reasoningn = 5, 2026-08-16 | 10.6 ± 6.11 | 5.62 ± 3.25 | 8.00 ± 3.81 | 3.29 ± 0.69 | 21.6 ± 3.36 | 15.3 ± 4.60 | 15.3 ± 4.60 | 2.80 ± 1.10 | 126 ± 21.49 | 27.2 ± 2.77 | 8.40 ± 1.52 | 100% ± 0 | 100%5/5 | 98%43/44 | 4.8 ± 0.9 min 🏆 | 823k ± 104k 🏆 | $0.95 ± 0.12 🏆 |
| model: opus-5-requestyn = 5, 2026-08-05 | 2.40 ± 0.89 🏆 | 2.20 ± 0.45 🏆 | 3.40 ± 0.89 🏆 | 1.31 ± 0.24 🏆 | 5.80 ± 3.63 🏆 | 2.62 ± 0.62 🏆 | 2.00 ± 0.00 🏆 | 2.00 ± 0.00 | 152 ± 10.83 | 39.8 ± 4.38 | 10.2 ± 0.45 | 100% ± 0 | 100%5/5 | 100% 🏆32/32 | 7.3 ± 1.3 min | 2.2M ± 415k | $3.10 ± 0.58 |
Runs behind this table
- 2026-08-05_05-17-40_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_opus-5-requesty
- 2026-08-05_05-17-41_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_opus-5-requesty
- 2026-08-05_05-17-41_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_opus-5-requesty-2
- 2026-08-05_05-17-41_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_opus-5-requesty-3
- 2026-08-05_05-17-41_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_opus-5-requesty-4
- 2026-08-15_11-47-44_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-no-thinking
- 2026-08-15_11-50-52_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-codex-no-thinking
- 2026-08-15_12-02-43_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-no-thinking
- 2026-08-15_12-07-08_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-codex-no-thinking
- 2026-08-15_22-44-01_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-no-thinking
- 2026-08-15_22-49-17_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-codex-no-thinking
- 2026-08-15_23-01-46_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-no-thinking
- 2026-08-15_23-06-13_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-codex-no-thinking
- 2026-08-16_06-04-33_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-no-thinking
- 2026-08-16_06-09-51_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-codex-no-thinking
- 2026-08-16_08-03-20_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-reasoning
- 2026-08-16_08-33-55_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-reasoning
- 2026-08-16_08-38-20_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-reasoning
- 2026-08-16_08-44-03_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-reasoning
- 2026-08-16_08-50-03_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-5-6-sol-reasoning
- 2026-09-05_09-56-27_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-6-astra-codex-no-thinking
- 2026-09-05_10-17-52_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-6-astra-codex-no-thinking
- 2026-09-05_10-17-52_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-6-astra-codex-no-thinking-2
- 2026-09-05_10-26-16_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-6-astra-codex-no-thinking
- 2026-09-05_10-26-19_game-of-life-example-mapping_v6.2.1-phase-continuation-pi_gpt-6-astra-codex-no-thinking
Findings
RQ-astra-pi — Findings
GPT-6 Astra on the OpenAI subscription route against the strongest references
reachable on the pi harness. game-of-life-example-mapping ×
exact-hybrid-v4.2-phase-continuation-pi, n=5 per cell, 25 runs.
The harness is pi in every cell — this is not a harness comparison. Two
cells sit on the OpenAI subscription route (openai-codex, Responses API),
three on Requesty. codex in the lab ids names the pi provider through which
the subscription is reached, not the Codex CLI.
Overview
Means per cell. Direction is stated per row.
| Metric | astra subs |
sol subs |
sol Requesty |
sol Req. reasoning |
opus-5 Requesty |
|---|---|---|---|---|---|
cognitive_max — lower = better |
7.0 | 4.4 | 9.0 | 10.6 | 2.4 🏆 |
cognitive_avg — lower = better |
2.96 | 2.47 | 4.87 | 5.62 | 2.2 🏆 |
mccabe_max — lower = better |
4.6 | 4.6 | 6.8 | 8.0 | 3.4 🏆 |
longest_function — lower = better |
19.4 | 20.8 | 18.8 | 21.6 | 5.8 🏆 |
avg_loc_per_function — lower = better |
18.0 | 11.53 | 14.14 | 15.3 | 2.62 🏆 |
| Smell Total — lower = better | 2.4 | 0.6 🏆 | 2.4 | 2.8 | 2.0 |
smell_complexity — lower = better |
0.2 | 0.0 🏆 | 0.8 | 0.8 | 0.0 🏆 |
| Production LoC — lower = better | 22.4 🏆 | 41.6 | 30.6 | 27.2 | 39.8 |
| Code Mass (APP) — no trophy, see F-1.5.3 | 99.4 | 153.2 | 138.8 | 126.4 | 151.8 |
| Correctness (external) — saturated | 100 % | 100 % | 100 % | 100 % | 100 % |
| Correctness (internal) — saturated | 100 % | 100 % | 100 % | 100 % | 100 % |
completed_within_budget — saturated |
100 % | 100 % | 100 % | 100 % | 100 % |
cycle_count — ambivalent, no trophy |
14.0 | 9.8 | 8.4 | 8.4 | 10.2 |
refactorings_applied — higher = better |
4.0 | 7.0 🏆 | 5.0 | 4.4 | 3.8 |
predictions_correct_rate — higher = better |
96.7 % | 98.5 % | 100 % 🏆 | 97.7 % | 100 % 🏆 |
duration_seconds — lower = better |
496.2 | 615.6 | 252.8 🏆 | 286.0 | 436.2 |
total_tokens — lower = better |
970.7 k | 1.26 M | 855.4 k | 823.1 k 🏆 | 2.22 M |
Reading the table. Three rows are saturated at the ceiling across all five
cells and carry no trophy — there is no contest to win. cycle_count gets none
because more cycles is not per se better. Code Mass (APP) gets none for the
reason in F-1.5.3. Cross-route rows conflate model and transport: RQ-route-effect-pi
established that the subscription route alone improves structural metrics on this
exact kata and workflow, so a Requesty cell winning a structural row is winning
against its transport, and a subscription cell winning is not proof of the model.
F-1.5.4 bounds how small a difference may be read at all.
F-1.5.1 — Astra does not reach Sol on the shared subscription route
The RQ's cleanest comparison — same route, same vendor, same workflow, no transport confound — goes against Astra on every structural metric:
| Astra | Sol | direction | |
|---|---|---|---|
cognitive_max |
7.0 | 4.4 | lower = better |
cognitive_avg |
2.96 | 2.47 | lower = better |
| Smell Total | 2.4 | 0.6 | lower = better |
avg_loc_per_function |
18.0 | 11.53 | lower = better |
refactorings_applied |
4.0 | 7.0 | higher = better |
mccabe_max is the one tie (4.6 both), and longest_function is the one
row Astra takes (19.4 vs 20.8) — inside the noise of a metric whose spread is
much larger than that gap.
The per-run distributions separate where the aggregate alone would not settle
it: Astra [6, 6, 6, 6, 11] against Sol [3, 4, 4, 4, 7] on cognitive_max.
Four of five Astra runs sit above four of five Sol runs; the overlap is a
single value on each side. σ is 2.24 and 1.52 — an order tighter than the
Requesty cells' 5.57/6.11, so on this route the metric does discriminate
(F-1.5.4).
H1 is rejected. Astra is not the better model on its own route; it is the weaker one on structure while writing the least code (F-1.5.3).
F-1.5.2 — Opus 5 wins the structural axis outright, against the transport
Opus 5 takes five of the six ungated structural rows, and it does so from the route that RQ-route-effect-pi showed to be the structurally worse one:
| Astra (subscription) | Opus 5 (Requesty) | factor | |
|---|---|---|---|
cognitive_max |
7.0 | 2.4 | 2.9× |
mccabe_max |
4.6 | 3.4 | 1.4× |
longest_function |
19.4 | 5.8 | 3.3× |
avg_loc_per_function |
18.0 | 2.62 | 6.9× |
The last row is the finding. Opus 5 decomposes: mean function length 2.62 lines, longest 5.8. The whole GPT branch — both routes, both reasoning states — sits at 11.5–15.3 mean and 18.8–21.6 longest. This is a difference in kind, not in degree, and it is the largest effect in the RQ.
H2 is rejected, and more strongly than it was posed. H2 asked whether Astra's advantage over Opus 5 exceeds the route delta. There is no advantage to net out: Astra loses on every structural metric while holding the route that should favour it. The route delta and the model effect point the same way here, and the model effect is the larger of the two.
Opus 5 buys this with tokens: 2.22 M, which is 2.3× Astra's 970.7 k and still 1.8× the next-highest cell in the matrix (Sol on the subscription route, 1.26 M). It does not buy it with wall-clock — 436.2 s against Astra's 496.2 s makes Opus 5 the faster of the two as well.
F-1.5.3 — Astra writes the least code and the least decomposed code, and Code Mass (APP) rewards it for both
Astra takes Production LoC at 22.4 against 27.2–41.6, and shows the lowest Code
Mass (APP) at 99.4 against 126.4–153.2. It simultaneously holds the worst
avg_loc_per_function in the field at 18.0.
These are the same artefact seen twice. Astra concentrates the solution into
few long functions: fewest lines overall, most lines per function. APP has no
notion of nesting and counts a single long function as cheap, so Code Mass reads
Astra as the most parsimonious cell in the matrix while cognitive_avg,
longest_function and avg_loc_per_function all say it is the least
structured of the low-LoC cells.
Code Mass (APP) therefore carries no trophy in the overview table. This is the documented APP blind spot occurring in a live cell, not a theoretical caveat: the metric would have crowned the cell that F-1.5.1 and F-1.5.2 both rank last on structure.
Production LoC keeps its trophy — less code passing the same external suite is
a real result — but it must be read next to avg_loc_per_function, never
alone.
F-1.5.4 — The noise floor of cognitive_max is route-dependent, and on Requesty it exceeds most between-cell differences
RQ-model-quality-pi carries a second reasoning-off Sol cell under the bare id
gpt-5-6-sol — same route, same pi-config profile, same declared
reasoning: false, differing only in whether the redundant --thinking off is
passed. It is the same configuration, and it does not measure the same:
| id | cognitive_max median |
range | Smell Total | Production LoC |
|---|---|---|---|---|
gpt-5-6-sol-no-thinking |
8.0 | 4–17 | 2.0 | 28 |
gpt-5-6-sol |
17.0 | 4–17 | 4.0 | 26 |
Identical ranges, medians nine points apart at n=5. That is the noise floor of
cognitive_max on this kata for the Requesty cells, and it is larger than the
gap between any two Requesty cells in this RQ (9.0 vs 10.6).
The floor is not uniform across routes. The two subscription cells have σ 2.24 and 1.52 against the Requesty cells' 5.57 and 6.11 — a threefold difference in spread on the same metric, same kata, same workflow. This is why F-1.5.1 can read a 7.0-vs-4.4 difference as real while the overview table's Requesty columns cannot be separated from each other at all.
gpt-5-6-sol is deliberately kept out of factors.model: as a nominal
duplicate it would enter the table as its own cell and imply a difference where
there is none.
F-1.5.5 — Astra runs the most cycles and logs the most predictions, with the fewest refactorings of the GPT branch
Astra reaches 14.0 cycles against 8.4–10.2 everywhere else, and logs 122
predictions against 32–66 — roughly the 2 × cycle_count the marker
convention expects, which no other cell in the matrix reaches (Sol on the same
route logs 66 against an expected ~20).
It converts that into the fewest refactorings of the GPT branch (4.0 against 4.4–7.0). More cycles with less refactoring per cycle, and the structural result of F-1.5.1 and F-1.5.3 is consistent with that: the loop runs often but reworks little.
One of the five runs breaks the marker pattern, logging 8 predictions at 13
cycles where the other four log 28–30. This is the Spark-shaped marker
inconsistency that RQ-spark-vs-sol documented for this route, occurring at
1-in-5 here. It is the reason predictions_total is not an outcome of this RQ
and only predictions_correct_rate is read — the rate is unaffected
(96.7 % pooled, and all five cells sit within 96.7–100 %, i.e. no spread worth
interpreting).
F-1.5.6 — Correctness, budget and the reasoning channel are invisible on this kata
All 25 runs pass: Correctness (external) 1.0, Correctness (internal) green,
completed_within_budget 100 %, cli_built true. H3 confirmed —
game-of-life under hybrid-v4.2 does not discriminate on correctness, so the three
saturated rows gate rather than differentiate, and every cell is eligible for
the quality trophies.
The reasoning channel likewise separates nothing. gpt-5-6-sol-no-thinking and
gpt-5-6-sol-reasoning differ only in whether the Requesty profile declares
reasoning: true, and they land within noise of each other on every row
(cognitive_max 9.0 vs 10.6, Smell Total 2.4 vs 2.8, Production LoC 30.6 vs
27.2) — both inside the floor of F-1.5.4. This reproduces F-1.3.6 on
independent replicates.
H4 is confirmed. The subscription route is the slower transport: 496.2 s and 615.6 s against 252.8 s and 286.0 s on Requesty. Astra is the faster of the two subscription cells despite running more cycles.
Caveats
cost_usdis not an outcome and must not be read fromruns.csv. The column carries three provenances: measured inline costs for the Sol subscription cell and list-price computations for the three Requesty cells. That split no longer exists: since 2026-09-05compute-cost.pyis the single source for every pi run on both routes, so all five cells are now computed on the same basis and the column is comparable — as a list-price estimate, never as a bill. Astra's tariff ($10/$50/$1.00 per 1M) was looked up and cross-checked against three independent sources; seeresearch/model-pricing.md.The route to that state was not clean. Until 2026-09-05
gpt-6-astrahad nomodels.jsonentry at all, so pi priced it with Sol's tariff and two of these five runs recorded a fabricated 0.77 USD. See RQ-astra-native-sol, Caveats.Phase timings and context utilization are 0 on the subscription route.
avg_cycle_seconds,avg_red_seconds,avg_green_seconds,avg_refactor_secondsandcontext_utilization_pctcome back 0 despite millions of tokens. Parser gap, not measurement; excluded fromoutcomes.Astra's declared context window is inherited, not confirmed.
contextWindow272000 /maxTokens128000 are the GPT-5.6 family defaults, and were not even declared when these runs were recorded — themodels.jsonentry carrying them was added on 2026-09-05, after the fact. Under-declaring is safe; verify upstream before reading any context-pressure result.--thinking offdoes not suppress reasoning on the subscription route. Astra's smoke run passed the flag, recordedthinking: false, and still produced 501thinkingblocks. The-no-thinkingsuffix ingpt-6-astra-codex-no-thinkingnames a flag, not a reasoning state; it was chosen so the two subscription cells differ only in the model.