Emerging Ideas for AI-Assisted Software EngineeringSeven field guides from Alpha Compose
Alpha ComposeField notesAll articles

My current workflow after six weeks with Codex

Questions
before code.

I do not begin by asking an agent to implement a feature. I make the application inspectable, resolve the important decisions with the agent, turn those decisions into an issue graph, and let bounded Codex tasks execute against tests.

current-workflow.log

human describes intent

grill resolves decisions

issues encode dependencies

tasks claim bounded work

tests decide what passes

status: learning in production
01

See

Start with a runnable, observable application

02

Grill

Resolve intent against the code and docs

03

Slice

Publish dependency-aware GitHub issues

04

Dispatch

Give bounded issues to separate Codex tasks

05

Prove

Use tests and deployment evidence as gates

01 / Foundation

Start with an application the agent can see

I begin with a simple application framework that can run end to end. It exposes as much of its internal behavior as practical: structured events, useful logs, deterministic test seams, and a way for the LLM to inspect what happened after an action.

End-to-end first

A thin, complete system

The first version need not be broad. It needs to be runnable through the real boundaries, so every later feature has somewhere truthful to attach and every bug has a reproducible path.

Introspection

Make state queryable

Introspection means the agent can inspect relevant state and contracts directly. It reduces the amount of application behavior that must be guessed from source code alone.

Observability

Leave causal evidence

Logs are most valuable when they identify operations, transitions, durations, and safe error types. A pile of strings is less useful than bounded events an agent can correlate with a failed test or browser action.

02 / Shared understanding

Grill the change before specifying it

I use a grill-me-with-docs skill adapted from Matt Pocock. I briefly describe the bug or feature. Before asking me anything, the agent reads the relevant code and agent documentation. It then asks the highest-leverage questions first, five at a time.

  1. 1
    Inspect

    Read the codebase, existing contracts, tests, and agent docs before forming questions.

  2. 2
    Prioritize

    Ask first about choices that change architecture, product behavior, risk, or scope.

  3. 3
    Recommend

    Offer a concrete default for each question so I can decide quickly or accept a coherent set.

  4. 4
    Persist

    Add settled, durable decisions to the right project document instead of leaving them trapped in chat.

What it does for me

It exposes assumption mismatches early.

I can correct the agent while a decision is still cheap, rather than after it has spread through code, tests, and deployment configuration.

What it may do for the model

It creates a deliberate reasoning scaffold.

My interpretation is that ordered questions force the model to build a more explicit representation of the problem. That is plausible, but the observable benefit is alignment, not proof of deeper internal reasoning.

The failure mode

Recommendations can become invisible decisions.

Accepting all defaults is efficient, but I still slow down for irreversible product choices, security boundaries, destructive operations, recurring cost, and decisions that constrain later work.

03 / Durable work

Turn the decisions into an executable issue graph

After the grill, another skill files a GitHub issue. Complex work becomes a parent with dependency-ordered children. Each issue says whether it can run AFK, where human judgment is required, what it may touch, what it depends on, and how completion will be proved.

Issue contract#211
Kind

Parent, implementation child, bug, or acceptance issue

Autonomy

AFK or human in the loop

Dependencies

What must finish before this work is ready

Parallel group

Which work may safely overlap

Conflict risk

Likely shared files, interfaces, or deployment surfaces

Validation

The evidence required before completion

AFK

Bounded enough to proceed

AFK does not mean unimportant. It means the product decisions, permissions, cost limits, dependencies, and acceptance evidence are explicit enough for a task to continue without asking me.

HITL

A judgment boundary remains

Human-in-the-loop issues stop at gates such as product approval, private production verification, spending, migrations, secrets, or an external console action. The stop is part of the contract.

04 / Coordinated execution

Let a parent task operate the queue

My GitHub orchestrator inspects the selected open issues, computes what is ready, and opens separate Codex tasks for implementation. It runs independent work in parallel and serializes work when shared files, interfaces, branches, browsers, or deployments create a high chance of conflict.

Coordinator

Inspect, schedule, integrate

Owns the queue and dependency order, not the implementation.

Task A#212infrastructure
Task B#213backend
Task C#214waits for A + B
<!-- codex-claim:v1 -->Action: claimTask: 019fb430-c114...Time: 2026-07-30T18:12:57Z

Concurrency control

The issue claim is a concurrency lock

A task writes its Codex task ID into an append-only issue comment and applies an in-progress label. Other tasks can discover the owner, exchange information, release work, or explicitly take it over. The task ID turns a chat from an isolated transcript into an addressable participant in the delivery system.

05 / Evidence

Tests are the accumulating memory of the product

Each implementation task uses a TDD skill. It first captures the new behavior or bug as a failing test, makes the smallest change that passes, and refactors with the safety net in place. End-to-end coverage grows as features grow, and the required suites run before every push.

RED

Describe the missing behavior

A failing test proves the change is not already present and reproduces the defect.

GREEN

Make the contract pass

Implementation is judged against an executable expectation, not the confidence of the authoring task.

REFACTOR

Improve without changing behavior

The growing suite protects previous decisions while the internal design changes.

A green suite is necessary, not sufficient. Tests can encode the same misunderstanding as the implementation. That is why the grill, issue acceptance criteria, fresh integration checks, and human product judgment remain separate gates.

06 / Repository evidence

This is operating machinery, not a proposed diagram

The Alpha Compose repository shows the workflow under real pressure: privacy boundaries, cloud infrastructure, browser behavior, costed media processing, two integration branches, and hundreds of tests.

The structure underneath

Decision graph

The grill resolves what the product should do and records durable invariants.

Delivery graph

Issues encode dependencies, autonomy, ownership, conflict risk, and integration order.

Evidence graph

Tests, logs, commits, workflow runs, and browser checks show what actually happened.

07 / Possible improvements

What I would add next

The workflow already has strong alignment, durable coordination, and application-level feedback. The next gains are likely to come from measuring the workflow itself and making integration a first-class product gate.

01

Measure the workflow, not only the application

Record cycle time, retries, human interventions, review findings, reverted work, and escaped defects by issue type. The next improvement should respond to evidence, not merely to what felt slow.

02

Give integration its own closing gate

A child can be correct while the parent feature is still wrong. After the last child lands, run the parent acceptance criteria through a fresh task with the integrated system and real deployment path.

03

Keep durable context layered

Put stable product invariants in CONTEXT.md, routing in CONTEXT-MAP.md, architectural consequences in ADRs, and temporary delivery detail in GitHub issues. This keeps agent startup useful as the project grows.

04

Schedule by collision surface

Parallelize only after comparing expected touchpoints, shared interfaces, branches, browsers, and deployment state. The useful unit is not the number of open issues, but the number of genuinely independent change surfaces.