Review Publishing Pipeline: The Voice Note to Post Chain
The seven-stage review-publishing pipeline: voice note + amzn.to URL in, post out. Capture, STT, first-pass draft, review pass, image gen, commit, ship. Each stage's failure shape and verify.

The seven stages in one sentence
Voice note + amzn.to URL → STT → first-pass draft → review pass → image gen → commit → ship. Each stage surfaces to the operator at the boundary; the agent runs the chain end-to-end.
The agent runs these stages automatically. The operator confirms at three points: (1) the STT transcript is correct, (2) the review pass is acceptable, (3) the ship-ready commit is well-formed.
Stage 1: capture (the operator’s input)
The operator sends a voice note + an amzn.to URL via Telegram. Two artifacts:
voice.ogg— a 60-180 second voice note describing the product.https://amzn.to/<tag>— the affiliate-tracked Amazon URL.
The voice note is the natural-language description of the product: what it is, what it does, the operator’s first impression, the standout features, the verdict. The amzn.to URL is the canonical product link.
Failure shapes:
- Voice note under 30 seconds. Likely missing context. The agent surfaces a “more detail?” ping.
- Voice note over 5 minutes. Likely rambling. The agent surfaces a “summarize?” ping.
- No amzn.to URL. Pipeline can’t run end-to-end. Pause and ask.
Stage 2: STT (Whisper transcription)
The voice note is transcribed via Whisper:
from openai import OpenAI
client = OpenAI()
text = client.audio.transcriptions.create(
model="whisper-1",
file=open("voice.ogg", "rb"),
).text
Common errors:
ZTS Mini MBT->zits mini MVT. The STT misheard a brand name. The operator verifies and corrects.- Garbled text at start. A common Whisper artifact when the recording starts mid-word. Truncated.
- Bullet-point truncation. Long voice notes sometimes drop the last 5-10 seconds. Agent surfaces the line count.
Stage 2 verify: render the transcript and confirm with the operator that brand names and key claims are correct.
Stage 3: first-pass draft (haiku-class)
The transcript + the model used to draft:
prompt = (
f"You are the botsitter-review skill. Voice-note transcript: {text}\n"
"Draft a 900-1500 word review in operator-facing markdown. "
f"Product URL: {amzn_url}. Include the affiliate link tag agenticbotsit-20."
)
draft = chat(prompt, model="claude-haiku-4-5-latest")
The default model is haiku-class (cheap, fast, follows instructions well for short jobs). The agent runs this stage in ~30 seconds.
Failure shapes:
- The draft misses the verdict. A common miss — the model drifted on description without committing to a verdict. Re-run with “include the verdict:
”. - The draft reverts the affiliate tag. The amzn.to URL becomes amazon.com/dp/
without the agenticbotsit-20 tag. Post-process fix. - The draft cuts long. The transcript was very long; the model dropped paragraphs. Split the prompt.
Stage 4: review pass (sonnet-class)
The first-pass draft goes through a second model (sonnet-class for quality tightening):
verified = chat(
f"Review the following review for editorial quality, voice consistency, "
f"affiliate link tag, and verdict clarity. Output the corrected version.\n\n{draft}",
model="claude-sonnet-5-latest",
)
Sonnet-class is more expensive but the body-quality gains justify the cost for a review. ~$0.05 per pass.
Failure shapes:
- Sonnet reverses the verdict. Sonnet wants to be balanced; it sometimes reads the draft as too opinionated. The operator verifies the verdict survived.
- Sonnet cuts length. The body comes out at 600 words. Re-run with “preserve word count.”
Stage 5: image gen (gpt-image-2-medium)
A featured illustration is generated for the review’s hero card:
prompt = LOCKED + review_subject + closing
r = OpenAIImageGenProvider().generate(prompt, aspect_ratio="landscape")
The image style is locked (see the image-style guide); only the subject varies.
Failure shapes:
- Image gen returns 5xx. Retry once; if still failing, move to failover chain (cached PNG / cache-bust / text-only).
- Image includes text. Some review subjects trigger text-bleed. Reject the image, regenerate with stronger “no text” in the prompt.
Stage 6: commit
The agent commits the post + image pair:
git add src/content/posts/<review-slug>.md public/images/<review-slug>-<date>.{png,webp}
git commit -m "post(review): <review-slug> (N cumulative today)" -m "<body>"
Commit messages follow the operator-readable form.
Failure shapes:
- Build fails. The post’s frontmatter schema fails. Agent surfaces the offending field.
- Image files missing. PNG or WebP not in place. Agent catches this before commit.
Stage 7: ship
The agent pushes to origin + github:
git push origin main
git push github main
The three-SHA check confirms the deployment, then CF purge happens, then the agent surfaces ship-ready.
Failure shapes:
- Origin has diverged. Pull —ff-only first, retry.
- CF purge fails. Non-fatal; CF will re-serve stale-but-still-correct HTML.
The agent does NOT do without operator confirmation
- Don’t ship a draft the operator hasn’t reviewed. The operator sees stages 3 and 4 outputs before the commit.
- Don’t override the operator’s verdict. If sonnet rewrote the verdict differently than the operator intended, the operator gets the final say.
- Don’t regenerate an image more than 3 times. Three failures means the subject is too hard; surface to operator.
The timing
End-to-end: 5-15 minutes per review. Bottleneck is operator review (steps 2 and 4 confirmation), not agent execution.
The cost
Per review (today’s model prices):
| Stage | Cost |
|---|---|
| Stage 2: STT | ~$0.006 |
| Stage 3: First-pass | ~$0.01-0.03 |
| Stage 4: Review pass | ~$0.05 |
| Stage 5: Image | ~$0.04 |
| Total | ~$0.10-0.13 per review |
For comparison, 30 reviews per day is $3-4 / day, or roughly $90-120 / month. The affiliate revenue covers it at the current conversion rate.
What to monitor
Three signals tell you the pipeline is broken before the operator does:
- STT misheard brand names more than 2 times in 10 reviews. Train a correction model or fall back to type-in.
- First-pass drafts come back at <900 words. The model is over-trimming; bump the floor.
- Review pass cost > $0.10. Sonnet is being asked to do too much; triage the prompt.
Sources
- OpenAI Whisper
- ABS live matrix: AI Model Matrix
- ABS companion: Botsitter-Review Affiliate Link Convention
- ABS companion: Voice-Note to Published Review: The Inputs and Outputs
Last verified: 2026-07-14. Pipeline verified end-to-end against today’s active botsitter-review workflow.



Submit a take
Have a different read on this? Drop a comment below — your email isn't published, and I read every one. Nothing leaves the site until I approve it.