Skip to main content
A post has to go out on the company page this week. It has a brief, a house style with six rules, and one editor who says what is published. Most first drafts break a rule or two: a superlative slips in, a number appears that nobody gave. Catching those is a grader’s job, and it is tedious for the editor to do by hand every time. You want the draft written and then read against the rules by someone who didn’t write it, with each finding naming the line and the rule. You want the writer to go again with those findings, and you want a limit, so a draft that never holds stops the run rather than looping. And you want the editor’s decision to be the only thing that publishes. Obversa makes the grader a stage and the limit a number. A Claude seat writes the draft. A Codex seat, a different model family, reads it against the style guide and returns findings; the draft goes back to the writer, who runs again, up to three times. When a draft holds, the run stops for the editor’s yes. This file is two stages, a draft with its grader and the editor’s decision, and every draft and every finding is on the record.

Run it

Set the project up as Installation describes. Copy the file with briefs/ and style/ beside it, sign in to Claude Code and Codex, and run it from that directory:
Terminal
The output below is the proof’s offline run, with scripted seats standing in for the models, so the words are the script’s and the shape is the run’s.
Output, from the offline proof
Three drafts, two rounds of findings, one editor’s question. The first draft called the review “the best in the business”, and the grader named the line and the rule against superlatives. The second draft explained the loop and added a number the brief never gave, and the grader named that. The third held against every rule, and the run stopped for the editor. Nothing was published.

The file

The brief names the post, the style guide, the grader’s job and the editor’s:
briefs/post.md
The style guide is what the grader reads against, one rule per line:
style/house.md
The whole team is one workflow(): two roles from different model families, an editor, and two stages:
examples/use-cases/editorial/writer-grader-cap.ts (excerpt)
reviewedBy: 'grade' puts the Codex seat on every draft, and a rejection runs the draft stage again with the findings in hand. retry: 3 is the limit: a draft that has not passed after three tries ends the run with the grader’s last findings, and the editor is never asked. workflow() refuses the team before any model runs if the writer and the grader share a family. The publish stage is the editor’s question; a no goes to draft with the editor’s note as the finding.
examples/use-cases/editorial/writer-grader-cap.ts

The team’s shape

What the run did

The proof runs the file against scripted seats and checks the loop the page describes: three writer turns, three grader reads, the superlative and the invented number gone from the draft on disk, and the run stopped at the editor. Obversa recorded the run as one event log, so it shows each draft, each set of findings, and the grader’s pass in order, with the grader’s reasons on the record for the editor to read. The limit is what makes the loop safe to leave running. Without it a writer and a strict grader can go round for as long as the budget lasts. With it, the third refusal is the run’s end and the editor sees the last findings instead of a post. Choose the number for the piece: three suits a short post; a long feature may need more.

Next steps