← Blog

Engineering note

Gemini 3.8 Flash Coding Workflow: GPT-6 Astra for Planning, Flash High for Execution

Gemini 3.8 Flash Coding Workflow: GPT-6 Astra for Planning, Flash High for Execution

I recently split my coding-agent workflow into two deliberately asymmetric roles: GPT-6 Astra makes the problem legible, while Gemini 3.8 Flash High gets the work done. This is not because I have proved that Flash is stronger than Astra on every task. It is because planning, repository reading, coding, testing, and repair do not have the same cost structure.

The starting point is concrete: I use the USD 20/month ChatGPT Plus plan. In my Work/Codex use of GPT-6 Astra, the allowance is governed by two fixed time windows: a five-hour window and a weekly window. What is fixed is the window structure, not a fixed message count; the actual allowance still varies by plan, model, task, and settings. OpenAI’s official usage guidance also notes that the five-hour limit can be reached before five hours have passed. That made me ask: does every loop really need the most expensive, deepest model?

This article is an engineering note about that split. Personal experience, vendor positioning, public DeepSWE results, and my own inferences are kept separate. The leaderboard’s average task cost is not my bill, and it should not be used to infer my subscription cost.

The conclusion first: these are workstations, not ranks

Putting both models into a single “which one is stronger?” ranking can hide the design question that matters: which model should carry which kind of uncertainty?

WorkstationPrimary responsibilityExpected outputWhat I do not assume
GPT-6 AstraProblem framing (problem definition), architectural trade-offs, SPEC (specification), risk, and escalation decisionsCheckable boundaries, change surface, acceptance criteria, and a test planThat the SPEC is automatically correct or removes the need for human review
Gemini 3.8 Flash HighRepository reading, implementation, tests, and error-driven iterationAn executable diff, test evidence, remaining questions, and blockersThat a lower token price makes every architecture or permission decision safe
Human engineerConfirm intent, review the diff, accept risk, and decide whether to shipA traceable change and an explicit delivery decisionThat green tests prove compatibility, security, or operational safety

I therefore do not treat Flash as a “lower tier Astra,” or Astra as a “consultant that never writes code.” Both can read code and produce changes. The difference is where I place the expensive judgment: at high-uncertainty gates, while repeatable and verifiable loops go to a lower-cost executor.

My GPT-6 Astra → Gemini Flash workflow

This is not a matter of throwing a vague requirement into two chat windows in sequence. It starts by creating a work contract that can be executed and challenged.

1. Define the problem before writing the implementation

I ask Astra to answer a few questions first:

  • What behavior actually needs to change?
  • What is explicitly out of scope?
  • What repository constraints, dependent modules, and compatibility risks already exist?
  • Which decisions affect data, permissions, performance, or deployment?
  • What is the minimum acceptance bar, and which tests can demonstrate it?

The output is not a polished essay. It is a short SPEC containing the goal, non-goals, relevant files or modules, proposed change surface, acceptance criteria, test plan, and the conditions that require a stop-and-escalate back to Astra or a human.

If the request still has two or three contradictory interpretations, it should not be handed to Flash yet. Efficiently completing the wrong problem is still waste.

2. Let Flash High take the bounded implementation loop

Once the SPEC is clear enough, I let Gemini 3.8 Flash High reread the relevant repository area, confirm the current state, and then:

  1. Locate the real entry points, data flow, and test locations.
  2. Make the smallest necessary change instead of refactoring unrelated modules.
  3. Run the existing tests, then make local repairs based on failure evidence.
  4. Preserve the diff, test results, and unresolved questions after each loop.
  5. Stop when the acceptance criteria are met or an escalation condition fires.

The important word is “bounded.” Flash can handle multiple compile, test, and repair cycles, but it should not expand the change surface indefinitely after a failure, or rewrite an unauthorized architecture, permission boundary, or external interface.

3. Return to Astra only when the uncertainty is real

I send the result back to Astra, or ask a human engineer to decide directly, when:

  • A test fails but the error does not establish a plausible root cause.
  • The implementation crosses modules or data boundaries not covered by the SPEC.
  • Identity, secrets, migrations, public APIs, or backward compatibility are involved.
  • Flash proposes contradictory repairs, or keeps looping on the same failure.
  • The diff passes tests but changes an important business meaning.

Astra is not asked to “write the code again” at this point. It compresses the problem space again: verify the assumptions, update the SPEC, choose a conservative next step, or explicitly declare that the task is not suitable for autonomous execution.

4. A human reviews the diff, not just the final success sentence

The final check still covers the diff, test output, exception handling, permission scope, and rollback path. “Tests passed” is one piece of evidence, not a shipping authorization. This is also the principle behind the AI Agent architecture guide: a verifiable control loop matters more than a single answer.

Why might this split be economical?

A frontier model’s value is uncertainty compression

The value of a frontier model is not only that it can write more code. It can turn a vague requirement into fewer plausible branches. When the problem involves architecture, responsibility boundaries, data lifecycles, or security conditions, avoiding the wrong branches can be worth more than producing tens of thousands of additional tokens later.

That is an engineering inference in this article, not an official definition from any model provider. I call it uncertainty compression: use the stronger model to turn “we do not know what to change” into “we know what to verify,” then let an execution model handle repeatable operations.

The execution model’s value is stable long-loop work

The implementation phase of a coding agent is rarely a single elegant answer. It is often read, edit, compile, inspect the error, retry, test, and edit again. If the task boundary is clear, the tool environment is stable, and the tests provide reliable signals, an executor (execution model) that uses more steps may still produce lower per-task cost and consume less frontier-model allowance.

But “more steps” is not free. It consumes time, tool calls, tokens, review attention, and failure budget. I therefore treat “Flash is cheaper” as a hypothesis to validate with completed-task results, not as a conclusion.

Usage limits and API prices are different surfaces

OpenAI’s Astra usage window is a Work/Codex product rule; Gemini API pricing is a separate billing surface. Google’s official pricing page currently lists Gemini 3.8 Flash standard paid-tier input at USD 0.75 per million tokens and output, including thinking tokens, at USD 3.75 through December 31, 2026; the prices become USD 1.50 and USD 7.50 on January 1, 2027. Those are API token prices, not a Gemini subscription fee and not my actual bill.

Total cost also includes retries, tool-result context, caching, review time, and failed tasks. The site’s LLM inference cost article explains why API prices, public benchmarks, and derived cost scenarios should not be collapsed into one number.

What do the official model positioning and DeepSWE leaderboard say?

Google describes Gemini 3.8 Flash as a Flash model for long-horizon software engineering, autonomous agents, and complex enterprise workflows. The Gemini API documentation lists a 1M-token context window, 64K maximum output, and low, medium, and high thinking levels; the Google DeepMind model card also lists hallucinations, occasional slowness or timeouts, and higher token use at higher thinking effort among its limitations. That makes it a candidate for a workhorse executor, but it does not make it reliable for every repository, language, or product decision.

Another easily misread signal is the DeepSWE v1.1 leaderboard. Updated on September 3, 2026, it uses 113 tasks and currently lists these results:

Model configurationCompletionAverage task costOutput tokensSteps
GPT-6 Astra [xhigh]74% ± 3%USD 6.5230K29
Gemini 3.8 Flash [high]74% ± 1%USD 2.36143K166
Claude Opus 5 [max]74% ± 4%USD 11.84118K99
GPT-5.6 Sol [max]73% ± 3%USD 6.4660K61

The data comes from the DeepSWE v1.1 leaderboard, where the listed configurations run with mini-swe-agent. It supports one useful but limited observation: under this task set and agent harness (execution framework), Flash High’s point estimate matches Astra’s completion rate and reports lower average task cost, while using more output tokens and steps. That is consistent with the workflow hypothesis that a cheaper executor can spend more loops to complete a bounded task.

It does not support these conclusions:

  • Flash High has universally surpassed Astra.
  • 74% is a normal-project success rate; it also means roughly one quarter of the tasks were not solved.
  • The average task cost is every team’s real cost.
  • 166 steps are necessarily worse than 29, or necessarily more reliable.

More importantly, the DeepSWE paper discusses issues around SWE-bench-derived evaluation, including task distribution, solution memorization, and whether a verifier correctly recognizes alternative solutions. A benchmark can shape a hypothesis; it cannot replace a team’s own task set, tool environment, and human review.

Where does this workflow fit best?

I would start with:

  • Bug fixes, test additions, local refactors, and documentation synchronization with clear acceptance criteria.
  • Repositories whose structure is stable enough for the executor to get reliable signals from existing code and tests.
  • Tasks that need multiple read, edit, and test loops but whose permissions and external side effects can be constrained.
  • Work where the planning stage can state non-goals clearly, preventing “while we are here” from becoming a large rewrite.

This aligns with the direction of the site’s AI software-development environment guide: the Vibe Coding problem is not only whether a model can write code, but whether context, tools, acceptance, and recovery paths form an observable harness.

Conversely, a lower Flash price should never lower the bar for these conditions:

Risk signalWhat can happenMy response
The SPEC fixes a wrong assumption too earlyThe executor efficiently completes the wrong designReframe with Astra or a human
Test coverage is weakGreen status only shows that old tests survivedAdd acceptance tests and review business semantics
Cross-service, migration, or permission changes appearA small diff has a large side-effect radiusRaise the review level and prohibit unattended delivery
Repair loops do not convergeTokens, time, and diff size grow quicklyCap steps, time, and change surface, then escalate
The benchmark differs from the real workloadLeaderboard results fail to predict team successRerun on representative internal tasks

How would I validate this beyond gut feel?

I do not treat my own bill or task success rate as a generalizable experiment result. If the workflow were to expand to a team, I would first build a small, repeatable baseline:

  1. Choose representative tasks covering small fixes, features, cross-module changes, and deliberately high-risk cases.
  2. Fix the repository version, tool permissions, test commands, timeouts, context delivery, and human-intervention rules.
  3. Record Astra-only, Flash-only, and Astra-planning → Flash-execution results separately.
  4. Measure first-pass completion, completion after repair, human review minutes, total tokens and steps, retries, rollback, and escaped defects.
  5. Record why tasks escalated. Escalation is routing data, not merely failure.
  6. Observe canary tasks before expanding Flash’s autonomous execution scope.

That answers the real question: at the same quality bar, does putting the frontier model at the planning gate reduce total cost and waiting time per completed task for this team?

Turn model routing into an engineering contract

If the idea is reduced to “Astra writes the SPEC and Flash writes the code,” new ambiguity appears immediately. A deliverable routing contract should state at least:

  • What counts as planning complete: non-goals, acceptance, tests, and rollback?
  • What counts as execution complete: a diff, or a diff whose tests and human review pass?
  • Which data and tools may the executor access?
  • Which operations need human approval?
  • Which step, time, token, or change-surface limit triggers escalation?
  • Does Astra review the request, the SPEC, the diff, or the test evidence?
  • Which representative tasks must be rerun after a model upgrade?

That is why I see this as an agent-harness problem, not only a model-selection problem. The existing GPT-5.6 architecture and efficiency article offers another angle: capability, intelligence per token, and inference cost have to be evaluated inside the execution system. Routing ultimately serves delivery results, not a prettier leaderboard.

Final judgment

Gemini 3.8 Flash High has not “replaced” GPT-6 Astra; it has let me rearrange their positions. Astra handles high-uncertainty framing, architecture, and risk decisions. Flash handles bounded, testable implementation loops that can tolerate several iterations. DeepSWE gives the idea a public cost/completion baseline, but not a universal victory declaration for any team.

The most valuable change for me is not one model’s score. It is separating model capability from task routing: decide which judgments deserve frontier-model allowance first, then decide which execution can go to a more efficient workhorse.

The prerequisites remain strict: the SPEC must be checkable, the executor must have permission boundaries, tests must provide signal, humans must retain the delivery decision, and every task’s cost and result must be recorded. Remove any one of these, and model specialization may only make it faster and cheaper to amplify the wrong thing.

For speaking invitations, internal engineering sessions, or architecture exchange, see the topics and public work I can bring into the conversation.

Speaking & contact