Case study / AI publishing harness
Inside an AI publishing harness that spends tokens like money.
A solo publisher was losing the week to the work around the writing. We built an AI publishing harness that does that work and stops at the decision: files for state, scripts for the mechanical layer, a model only for judgment, and one human publish decision.
The problem
A week of work around the writing.
Forgotten Education is a one-person publication. The writing was never the bottleneck. The week went to finding a topic with demand, checking the angle, sourcing claims, generating and resizing images, formatting for Substack, and keeping the voice consistent across issues.
The obvious fix is another tool. The useful fix is an AI control layer that knows which work is mechanical and which work is not. That distinction is the whole project.
The architecture
Four rules, one small repo.
The rules are not stylistic. They are how the AI harness stays cheap enough to run and small enough to move between machines.
- 01Return paths, never content.A subagent writes a file and returns the path. The parent does not receive the research pasted back into the conversation.
- 02State lives in files.The queue, the archive, and progress survive the session. A conversation is a cache, not a database.
- 03AI only where judgment is the point.Formatting, resizing, link checks, and tests are scripts. If a script can do it, a model never sees it.
- 04Read on demand.Voice rules load before drafting. The corpus is searched, not preloaded.
substack-runner/
config/
voice.yaml
schedule.yaml
data/
queue.json
drafts/
published/index.csv
research/
scripts/
research.py
check_draft.py
substack_draft.py
references/
writing-standards.md
docs/
workflow.md
Sanitized tree. The public repo carries a runnable version with example data.
The gate
Errors, not a rewrite.
The public gate checks frontmatter, length, structure, source links, em dashes, and unfinished markers. The client system adds sourcing, voice drift, and layout checks. It returns a pass or a list of errors. It never rewrites the draft.
That restraint matters. If the gate rewrote the piece, the reviewer would be reviewing the gate's argument. The human keeps the argument, the voice, and the publish decision.
28 offline converter tests and 22 guard checks keep the mechanical layer honest.
---
title: "The one decision rule for AI drafts"
slug: one-decision-rule
status: draft
audience: operators
sources: 1
---
## The rule
One draft, one decision.
A sanitized draft from the repo's examples, not client content.
The result
Three issues, one decision each.
Three issues are live. Each one passed the gate, carried sources, and arrived in Substack as a formatted draft. The publisher read it and decided. No post went live unreviewed.
Read the live publication or view the reference implementation.
What stayed human
The part that decides whether it works.
The topic, the argument, the voice, and the publish action. The AI harness is designed to make those the only things that need a person. That is not a limitation. It is the point.
Publishing remains manual. An unreviewed post at 3am is how you hear about it from a reader.
Limits
What this is not.
- Not auto-publish. The review decision is permanent. Scheduling is a separate, deliberate choice.
- Not a taste engine. The gate checks mechanics. It does not decide whether the piece is worth publishing.
- Not the client repo. The public code is sanitized. No client content, credentials, or session data.
The code
Read it, run it, adapt it.
The reference implementation is a small AI harness, public and MIT licensed. It includes the four rules, the queue, a working gate, tests, and example data.
ControlSquare/token-frugal-harness
Public repo. Python 3.10+. No third-party packages. Tests run on every push.
Start here
Does your week look like this?
Tell us where the work piles up. We will tell you what AI can take, what should not be, and what it would take to build.
Start a conversationBuilt by Control Square. The publication is the client's, not ours. The code is a sanitized reference.