oah helps you build an AI development workflow that fits you and keeps changing as AI improves. It is a working reference and a guide you can adapt.
A useful result needs more than generated code: the scope must be clear, the changes checked, and decisions kept for the next session. oah connects those steps so one request can carry through the work with a record of what happened.
002 / Why it keeps changing
Older rules and skills can hold a newer model back or make its results worse. Defaults should be easy to understand and change; a rule that gets in your way is a design problem to fix.
Keep the parts that help, remove what no longer helps, and revise the workflow as your tools improve. You can start with the full setup or take only the impact map, wiki, leases, evidence gates or review loop that your project needs.
003 / Why Claude builds and Codex reviews
This split comes from the author's own experience, not a measured comparison: Claude fills in details a beginner might miss in a first version; Codex checks and corrects within a fixed scope.
The current commands run Claude Code and Codex CLI. The ideas can also be adapted to another tool or harness, with one AI or several. Give each stage to the AI that suits your work.
004 / From one request to a checked change
Describe the result you want in plain language. The AI records the goal and scope, checks what the change touches, reserves its paths and chooses the tools for the task. Claude builds; Codex reviews, corrects and reviews again.
Gates record the checks and their results. The project wiki keeps the decisions and reasons beside the code. In v0.3.0, optional TypeSafe Jev can judge difficulty for model selection; rules remain the fallback when it is unavailable or uncertain.
005 / The decisions stay with you
You ask, answer when the AI needs a decision, and confirm before the change lands. If the same problem repeats or the work reaches a design choice, the loop stops to ask you.
Ask “Is the review done?” or “Did all the gates pass?” and inspect the evidence. The final confirmation belongs to you; writing code, checking it and approving its landing are separate steps.
006 / Free, open source, yours to adapt
oah is free, open-source software under the MIT license. Read the source, change it and bring the useful pieces into your own workflow. Your AI services and any optional services use their own accounts and billing.
The current v0.3.0 release supports macOS and native Windows, and expects familiarity with git and pull requests. Install it, run oah init in your project, then try the small hello-oah example. The installation and documentation sections explain each step.
A gate turns “done” into a check with recorded evidence: one checkable result, the command that proves it and the output it must produce. oah gates check runs the CHECK lines through unlazy after you approve them, ticks passing gates with evidence and binds them to their inputs. oah finish refuses unmet gates.
When you need it
An agent saying “done” proves nothing. Without recorded checks you cannot tell what passed, and a later change can quietly break a result that once worked.
How it works
oah gates new <task> writes .oah/tasks/<task>/GATES.md from a template; oah gates lint <task> judges whether each gate can fail.
oah gates check <task> shows the CHECK commands on the first run and waits for your approval (--approve).
unlazy, at the commit oah is tested with, runs the checks. Passing gates are ticked with evidence and bound to their inputs, so a later change to an input makes the gate run again.
GATES.summary.md, written by gates check, is the committed, path-free record; the ledger itself stays out of git.
oah finish refuses unmet gates (OAH_GATES_UNMET). A truly impossible gate is written as ABANDON: G<n> <reason> and handed to you, never deleted.
Example
One gate in a ledger (from Concepts).
- [ ] G1: `python hello.py Ada` prints `Hello, Ada!`
CHECK: python hello.py Ada
EXPECT: Hello, Ada!
EVIDENCE: pending
Requirements
unlazy, the gate checker, installed with oah init --with-unlazy; it needs Node.js 16 or newer.
CHECK lines must run the same in cmd.exe and sh: call python, node or oah check (for example oah check contains FILE TEXT), not grep or pipes.
Limits and recovery
A gate's inputs are tracked files, untracked files that are not ignored, and the run environment. A change to an external service or an ignored untracked file does not make a gate run again, so check those separately.
Without unlazy, gate commands refuse (OAH_UNLAZY_MISSING); oah finish --allow-structural finishes on ticked boxes alone and is recorded as unverified.
The opt-in Stop hook keeps a Claude Code session from ending while gates are unmet. Limiting it with [gates] stop_agents moves the check to oah finish; it is not lost.
A summary that no longer matches gives OAH_GATES_SUMMARY_STALE: run oah gates check <task> and commit the rewritten summary.