The AI editing process that never ended: the perfect set-up that broke every Monday
Claude and I both create duplication. Neither of us can reliably find it. “We” built something that could.
The most terrifying Facebook group I ever joined had a mild name.
Something like Grammar Lovers. I thought I had found my people. A Linguistics student with two hats: a prescriptivist love for language and its rules, and a descriptivist fascination with how language actually changes. Both worn simultaneously. The group clarified very quickly that it made me wrong.
I lasted two days. Made just one comment. The responses were swift and certain. Brutal feedback on not only what I said but even the ordering of my words themselves, and I only wrote one sentence! This experience has stayed with me as a lesson: when everyone is completely sure they are right, nobody is actually listening. They are waiting to pounce. Everyone had a position, everyone had evidence, nobody was going to move. Grammar wars are not about grammar. They are about the feeling of being correct.
I made a swift exit from the group. I understood in that moment no one was going to win, and the not-winning was going to go on indefinitely.
This is why I am not going to rant to you here about AI writing tics (although it will only take one of you to beg in the mildest of ways and I will have that piece written for you stat!).
I have opinions. Strong ones. If I was paid ten cents for every “here’s the thing” or “turns out” I have read this week alone, I would be currently booking a Four Seasons bungalow over the water in Bora Bora. The em dash-AI situation makes me shake my head in a way you may not guess. I have feelings about sentences that start with “And” four times in one paragraph, the remaining sentences start with “But”, and the whole thing reads like AI clearing its throat while calling it rhythm.
The people who want to write better are already trying to write better. The people who aren’t will not be persuaded by my irritation.
So, this is not that article (we can all breathe deeply now, you are in a safe space).
Hello! I’m Dallas.
This is Daring Next and we’re absolutely not waiting until we have it all figured out.
Officially → field notes from the uncharted middle of AI adoption.
Actually → dispatches from someone trying to stay human while a very confident alien intelligence keeps offering to think for her.
New? Start here.
There has been a specific tangle tripping me up every single week. One that started with me, got worse with Claude’s help, and ended with a tool that neither of us can subsequently break.
AI has made my editing better in ways I genuinely could not manage alone. The editing loop I find myself in constantly though?! I HATE that part.
My brain naturally duplicates. I have known this for years and has always been an issue in emails rapidly fired off. On Substack, I will write a note, post it, come back twenty minutes later and see the same word sitting in the same small space three times, blinking at me. It is not carelessness but rather how my thinking moves. I circle the thing I mean before I get there, and the circling leaves marks you can often see.
Working with AI exacerbates this. Claude is a probabilistic reasoning machine, and probability loves familiar patterns too. Perfect match! When I reach for “sometimes” four times, Claude reaches for it too. Possibly more. I counted twenty instances of “sometimes” in one recent draft. Claude, when I asked it to count, found thirteen. We then spent what I can only describe as an unreasonable portion of a late Monday night in disagreement about this, and then following word counts too.
When I started working through replacements for “sometimes,” other words started getting overused in their place, and then I had a new set of duplication problems threaded through what had previously been a solved section. I was flying through the edit, the structure was working, the enemy was present, the three reader questions were being met, and then the whole process would grind to a halt because I had spotted “process” seven times across three paragraphs and now I had to go back. The fix would often break the other quality gates.
We’re not even at sentence and idea-level duplication dramas. Separate layers entirely, sitting behind the word mess, patiently waiting for either the AI or I to see them waving madly.
Skills were fresh, project instructions detailed, and my voice document newly updated. It was never a context issue. I was asking Claude to scan for every layer of duplication in a single pass, and it kept surfacing three things while leaving me eight others to find.
All the things you are supposed to have were still not enough in these moments.
The thought that the problem might not be fixable with better instructions had not fully landed yet.
I was absolutely over it.
Working with AI means a lot of honest conversations are inevitable. Many “why do you do this?” and “what am I missing that you need to make this work?” kinda deals.
Last week, I took my frustrations to a generic Claude chat with no project context and no accumulated assumptions. Just “Claudio, here is the tangle, these are my issues, make them better.”
Claude’s response was not what I expected.
It told me it struggled to.
That “read this entire piece and flag every repeated word, phrase, idea, or structural echo” only works sometimes. When bundled with other requests, Claude gets distracted. Even on its own, a complete counting assessment across a full document is one of its genuine weak spots. It wasn’t a prompting failure or a Skills issue. Nothing was built incorrectly in Claude, only my assumptions outside.
Which explained the late Monday night. Also, every single Monday before it.
Then it said something that reframed the whole AI-editing collaboration:
It offered to build one for me.
I said yes. Duh.
Do the thing, Claude! Make something marvellous for us both!
What came back was a React artifact - a simple tool you paste a draft into, click scan, and get a report. Mechanical with an option for API calls if I want it (I do want these, but Anthropic has had issues lately I cannot control!). The mechanical part does not think about the findings, it counts them. Counting, not thinking. Entirely the point.
I kept building from there. I loaded in other quality gate checks I run through as part of my editing process, not because I do not trust Claude to run them, I just needed to be involved in the process more clearly. To see what is happening in my own writing, systematically, without having to hold it all in my head or rely on a fourteen-pass conversation with Claude to surface it.
There are seven tabs now, and it will grow.
Duplication is the starting point: four rule-based checks running instantly with no API call. Repeated words. Repeated phrases. Section echoes, where two paragraphs are covering the same ground in different language. Sentence starters, where the same word is opening too many sentences. It gives me the map I could not get reliably any other way.
Rhythm detects eight prose patterns from Mia Kiraki’s content rhythm framework: inanimate agency, binary contrasts, the rule of three, uniform paragraph lengths, and four others. Her argument is the same one this whole tool is built on. None of these patterns are wrong until they start choosing themselves rather than you choosing them. This tab shows where they are. What to do with that information stays with me.
Every sentence gets a colour in the heat map. Flat grey for low density, brighter for higher. Burstiness from the previous tab made visible here.
Voice gate scans for my specific banned words and phrases, em dashes, conjunction starters, exclamation density, and American spellings. The words in there are mine. I put them in.

Enemy belief finds what the draft is arguing against and rates how hard it’s fighting. I can override it with my own read if it’s missed the point.
Three-question test asks who this is for, what it helps them do, and what should happen after they read it. Three questions. One answer each. If any of them come back vague, the draft isn’t ready.
The job-to-be-done tab is the most specific. Six gate check questions built for Daring Next content, not generic newsletter advice.
The AI tabs make one API call each. If the API is down (and yes, it goes down, and yes, I have frustrated feelings about this), the mechanical tabs still run. The duplication scan, rhythm check, heat map, and voice gate do not need a working API. I built in the fallback because I needed the fallback.
I wanted to write better, so I added quality gates. The process got more thorough and more complex and it worked. Except for the one thing that had always tripped me up, which sat underneath all of it, quietly making every other gate harder to pass.
Apparently, the biggest problem needed the simplest solution. A count. Not an opinion. Just the number.
What the tool did was take the counting part off both our plates. Claude stopped hunting for duplication while also trying to find the enemy while also checking rhythm. I stopped asking it to hold twelve things at once and hoping the most important ones survived.
I ran this draft through the scanner while writing it. The duplication report found “problem” sitting at ten instances. The rhythm tab flagged six rule-of-three constructions. The heat map showed a flat grey zone through the tab descriptions. Every one of those findings changed something in this piece. The tool works on its own origin story.
Mia named me in her article as someone keeping binary contrasts in their writing. She is right. I sure am keeping them, reaching for them only when they earn their place.
At the end of this is the full prompt to build your own draft scanner. Although customised for Claude, you can take it to any vibe coding tool or build it wherever or however you like. The branding section takes whatever you give it. The gate rules are placeholders until you fill them with your own.
Delete any tab you do not want before you paste. The duplication tab is always there. The rest is yours to configure to compliment your editing process.
Through this process, I realised where I was leaning too heavily on AI for editing rather than making it a shared responsibility. What changed is I stopped asking Claude to do the thing it kept telling me, very politely, it was not built for. The writing is mine. The tool does the scanning. Claude does the fixing. I do the deciding.
You could build an agent to do this, and I truly hope some of you do. For me, this structure is where the necessary friction lives so the work stays mine.
It’s never been about banning things. We just need to see what is there clearly so we can make informed choices.
Every single word and every single concept still have to earn their place. That part does not change at all.
Build your own Draft Scanner
The editing tool I built in the newsletter started with one problem: I kept asking AI to count things it cannot reliably count. Now, the scanner does the counting.
This is the prompt that builds it. Paste it into a Claude conversation and it will produce a React artifact, a working tool you can use immediately.
The duplication tab is always there. Repeated words, repeated phrases, paragraph pairs covering the same ground, sentence starters going monotonous. No API call needed. It just counts.
Below the duplication spec are three optional tabs. Delete any you do not want before pasting. Keep any that match how you edit.
Voice gate scans for words, phrases, and patterns that do not belong in your writing. Mechanical. No API call. You fill in the rules.
Enemy belief diagnoses what belief the draft is pushing against and rates how hard the fight is. Uses one API call. Works as-is.
Readiness test checks whether the draft can answer editorial questions crisply. Uses one API call. You fill in the questions or leave this tab out until you know what they are.
Before you paste
Read through the prompt below and look for everything in [SQUARE BRACKETS]. These are the parts that need your input. Some are optional (branding), some are essential (voice gate rules, readiness test questions).
Branding: Fill in with your colours, fonts, and publication name or leave the fields empty and Claude will choose a clean default.
Voice gate: Replace every placeholder list with your own banned words, phrases, and rules. If you do not have a list yet, start with what you know: words that make you wince in your own drafts, phrases AI keeps inserting that do not sound like you, and any hard spelling rules you follow. The list builds itself over time. If you have a voice document or style guide in a Claude Project or loaded as a Skill, you can replace the entire voice gate rules section with “Pull banned words, phrases, and style rules from my project knowledge/skill.”
Enemy belief: Nothing to fill in. It works as-is.
Readiness test: Replace the three placeholder questions with the questions that actually gate your publishing decisions. Each question needs the question itself and a description of what a good answer looks like. If you are not sure what your readiness questions are yet, delete this tab section entirely.
Once the square brackets are filled in (or deleted), copy the entire prompt and paste it into Claude.
The prompt
Copy everything below into a fresh chat.
Build a React artifact: a Draft Scanner tool for editing written drafts.
## BRANDING
- Tool name: [YOUR TOOL NAME, or "Draft Scanner"]
- Subtitle: [YOUR PUBLICATION NAME, or leave empty]
- Heading font: [A GOOGLE FONT OR SYSTEM FONT, or leave empty for default]
- Body font: [A GOOGLE FONT OR SYSTEM FONT, or leave empty for default]
- Colour palette: [DESCRIBE THE FEEL OR LIST HEX COLOURS, or leave empty for a clean default]
## ARCHITECTURE
### Layout
Header with tool name (heading font, large) and optional subtitle (small, accent coloured, uppercase, beside the title). Shared textarea (body font, comfortable line height). "Scan draft" button, disabled until 50+ characters entered. Tabbed results appear below after scanning. Textarea shrinks when results show. "Clear" button resets everything. Display a live word count beside the textarea (count words by splitting on whitespace, not characters).
### Shared patterns
Every tab has: a summary bar with finding count and "Copy report" button; collapsible sections with clickable header, coloured count badge, collapse arrow, one-sentence description; sections open by default if findings exist, show "Clear" if zero.
Copy report: CRITICAL — do NOT use navigator.clipboard.writeText(). It is blocked in sandboxed environments. Instead, create a temporary textarea element, set its value to the report text, append it to the document body, select it, call document.execCommand("copy"), then remove the element. Show "Copied" confirmation for two seconds.
Workflow hint box at the bottom of each tab with next-step guidance.
All UI text refers to "the draft." No "you" or "your" anywhere.
### Paragraph detection
Three-tier split: double-newline first. If fewer than four paragraphs, single-newline. If still fewer than four, group every four sentences.
---
## TAB 1: DUPLICATION
All four analyses run on scan. No API calls. Client-side only.
**Repeated words.** Tokenise (lowercase, strip punctuation). Remove stop words: the, a, an, and, or, but, in, on, at, to, for, of, with, by, from, is, it, this, that, was, are, be, has, had, have, will, would, could, should, can, do, did, not, no, so, if, as, into, than, then, about, up, out, just, also, been, more, when, who, what, where, how, all, each, every, both, few, most, some, any, other, new, old, my, your, our, their, his, her, we, you, i, me, they, them, he, she, us, very, really, even, still, over, own, back, only, well, now, here, there, because, through, after, before, between, under, again, further, once, during, while, too, down, off, way, much, many, such, those, these, which, whom, why, one, two, like, make, made, know, think, see, come, take, want, look, use, find, give, tell, say, said, go, going, went, thing, things, people, time, something, need, work, right, first, last, long, great, little, big, high, different, small, large, next, early, young, important, same, able, around, another, came, three, may, part, might, put, does, already, enough, though, yet, since, without, however, never, always, often, sometimes, try, keep, start, end, point, seem, world, life, day, year. Only words longer than three characters. Threshold: 3+ for drafts under 1,500 words, 4+ for longer. Display: word in quotes left, count right.
**Repeated phrases.** N-grams (three to six words). Keep only those where at least half the words are meaningful (not stop words, longer than three characters). Show phrases appearing 2+ times. Remove sub-phrases contained in a longer phrase with same count. Display: phrase in quotes left, count right.
**Section echoes.** Compare meaningful word sets for every paragraph pair. Flag where shared words exceed 35% of the smaller set AND at least four shared words. Display: paragraph numbers, overlap percentage, preview (first 90 characters each), shared words.
**Sentence starters.** Split on .!? followed by whitespace, keep sentences longer than 10 characters. First word of each. Flag words starting 3+ sentences. Display: word capitalised left, count right.
---
## TAB 2: VOICE GATE [optional — delete this entire section to remove]
Mechanical. No API call. Runs instantly.
Each check below is a separate collapsible section with its own count badge. These categories are mutually exclusive — a finding appears in one section only.
### Banned words
Single-word matches only. Scan the draft for individual words that should not appear. Match whole words, case-insensitive. Display each word found with a count of occurrences.
Flag any occurrence of: [LIST YOUR BANNED WORDS, COMMA SEPARATED — these must be single words, not phrases]
### Banned phrases
Multi-word string matches only. Scan the draft for exact phrase sequences (two or more words) that should not appear. Match case-insensitive. Do not also flag these in the banned words section. Display each phrase found with a count, and show the surrounding sentence context for each match.
Flag any occurrence of: [LIST YOUR BANNED PHRASES, EACH IN QUOTES, COMMA SEPARATED — these must be multi-word phrases]
### Conjunction starters
Flag sentences starting with: And, But, Or, So, Yet, Nor. Display the opening word highlighted in a strong colour, followed by the rest of the sentence.
### Em dashes
Flag every em dash (— and –). Display the full sentence containing each.
### Spelling standard [DELETE THIS SECTION IF NOT RELEVANT]
Flag and suggest alternatives for: [LIST YOUR SPELLING PAIRS IN format/alternative FORMAT, COMMA SEPARATED — e.g. organize/organise, color/colour, center/centre]
### Exclamation density
Count exclamation marks. Report total count and density per paragraph. Flag any individual paragraph that contains more than one exclamation mark, showing the paragraph text.
### Display
Collapsible section per rule type. Count, flagged items, one-line note. Summary bar with total issues.
---
## TAB 3: ENEMY BELIEF [optional — delete this entire section to remove]
Uses one API call (claude-sonnet-4-20250514, max_tokens: 2000). Fire automatically on first tab open. AbortController with 60-second timeout. Human-readable errors: "Rate limited. Wait a moment and try again." for 429, "API is at capacity. Try again in a few minutes." for 529. Retry button on failure.
### System prompt
Analyse the draft. Identify the specific belief the piece is pushing against. State it as a single quoted sentence — the belief itself, as someone who holds it would say it.
Rate the fight on 1-10:
- 1-3: Absent or vague. Information delivery, not a position.
- 4-6: Present but not sharp. Implied but not confronted, or dismantling is generic.
- 7-8: Clear. The draft fights with specific evidence or experience.
- 9-10: Named early, dismantled through lived experience, reframe lands.
Quote 2-3 sentences that most directly fight the enemy belief, with a note on each. Flag gaps where the fight weakens, the draft drifts into information delivery, or friction is papered over.
Respond in JSON only, no preamble, no backticks:
{"enemyBelief":"...","strengthRating":7,"strengthLabel":"Strong","assessment":"...","evidence":[{"quote":"...","note":"..."}],"gaps":[{"location":"...","note":"..."}]}
### Display
Detected belief in highlighted box with colour-coded left border. Strength rating: large score, label, gradient bar. Assessment text. Evidence quotes with teal left border and notes. Gap flags with coral left border and notes.
### Override
Below results: text input for writer to type their own enemy belief. "Reassess" button fires a second API call with the override.
---
## TAB 4: READINESS TEST [optional — delete this entire section to remove]
Uses one API call (claude-sonnet-4-20250514, max_tokens: 2000). Same API handling as enemy belief tab.
### Questions
[REPLACE THESE WITH YOUR OWN QUESTIONS. EACH NEEDS THE QUESTION AND A DESCRIPTION OF WHAT A GOOD ANSWER LOOKS LIKE.]
1. [YOUR FIRST QUESTION]
Good answer: [DESCRIBE WHAT A GOOD ANSWER LOOKS LIKE]
2. [YOUR SECOND QUESTION]
Good answer: [DESCRIBE WHAT A GOOD ANSWER LOOKS LIKE]
3. [YOUR THIRD QUESTION]
Good answer: [DESCRIBE WHAT A GOOD ANSWER LOOKS LIKE]
### System prompt
Assess the draft against the questions above. For each:
- Attempt to answer from the draft text alone
- Rate: CRISP (clear, specific, one answer), FUZZY (present but vague or multiple), MISSING (cannot be answered)
- Quote 1-2 evidence sentences, or note absence
- If FUZZY or MISSING, explain what is vague or absent
Overall verdict: READY (all crisp), NEARLY (one or two fuzzy), NOT YET (any missing or all fuzzy).
Respond in JSON only, no preamble, no backticks:
{"questions":[{"question":"...","answer":"...","rating":"CRISP|FUZZY|MISSING","evidence":"...","note":"..."}],"readiness":"READY|NEARLY|NOT YET","readinessNote":"..."}
### Display
Readiness badge at top: colour-coded (teal for READY, amber for NEARLY, coral for NOT YET), verdict large, assessment note below. Card per question: coloured circle (checkmark/tilde/cross), question in heading font, rating label, attempted answer, evidence quote with coloured left border, note if FUZZY or MISSING.
---
## DESIGN
- Apply branding above. If empty, choose a clean professional default.
- Distinct badge colours per analysis type.
- Load Google Fonts if specified and not system fonts.
- Heading font: title, tab labels, section headers, buttons, summary metrics, scores.
- Body font: everything else.
- Gradient divider line under header.
- Tab bar fits all tabs without scrolling. Flex-wrap if needed.
- Clean, functional. Editing tool, not a showcase.
- Textarea: visible focus state.
- API tabs: loading state, retry button, human-readable errors.
- All API calls: AbortController, 60-second timeout.After it builds
Paste a draft you are currently editing into the tool and scan it. Not all findings are problems. Some repetition is intentional. The value is seeing what was invisible while writing.
The "copy report" button is the bridge back to editing. Paste the report into a Claude conversation alongside the full draft and ask for fixes to the specific findings. "Fix these seven repeated words" gets better results than "edit this for me” every time.
Making it yours
Branding takes as much or as little as you give it. Exact hex colours for a brand match. A vibe description. Or nothing at all.
Voice gate gets sharper the more specific your rules are. Start with whatever you have. Add to it as you notice patterns in your own editing. If you build a voice document over time and store it in a Claude Project, you can replace all the voice gate lists with a single line: “Pull banned words, phrases, and style rules from my project knowledge.”
Enemy belief works immediately. The override is there for when the detection misses.
Readiness test is only useful when the questions are yours. Leave it out until they are.
Delete any tab that doesn’t work for you. The duplication tab is the foundation. The rest is yours to configure.
Growing it from here. Once the base tool is working, you can ask Claude to add more tabs in the same conversation. Describe what the tab should scan for and whether it needs AI or is purely mechanical. If you add a tab that has both a mechanical scan and an optional AI layer (for example, a rhythm analyser that counts patterns but uses an AI call to assess whether each pattern is intentional), ask Claude to add an "Include AI diagnostic" toggle next to the scan button. This toggle lets you run the scans instantly and only fire the AI when you choose to.
Have fun building!
If you want access to more of Mia Kiraki’s work, a Robot’s Ate My Homework paid subscription is where all the good stuff is found. Paid subscribers get access to the full set of Mia’s Content Rhythm Analyst project documents. These are brilliant and a great place to start.
Thank you to Mack Collier for inspiring the three-person test!
This concept sits across a lot of his work. Begin here.
Paid subscriptions are not turned on, but if you would like to support my work, here is one easy way that you can.












Dallas! The Grammar Lovers opening had me laughing 😆 I don't know what's so funny to me about the name but sheesh! I don't blame you for making an exit haha
I had this bookmarked to actually sit with, and now I'm annoyed at myself for not reading it before my last post went out. I was just DEEP in the editing loop you described ... fixing one thing and breaking a million others. Loosing my arc, finding it again. It was a real saga this time.
The artifact is such a generous thing of you to share (as always). I can't wait to try a build my own version of this tool. I know i always say it, but its so cool how we're all building off of each other.
You may have even inspired me to get my next substack draft done EARLY this time, simply because i'm so curious to test it out!
Dallas, this is awesome!! And I have so many responses!
1) Did we know this? I did psychology as my main major, but I also did linguistics when I found a business-related second major very boring. And I’m indignant over that Facebook group. ::fist shake!!::
2) I will still occasionally say, Here’s the thing. And then I’m like I should change that, and then I don’t because omg there are only so many spoons I have to give…
3) I love your writing. I haven’t noticed your duplications, but I do it, too.
4) I really appreciated seeing Claude saying — don’t make me do the thing I’m bad at. I don’t know why but those little frictions really tickle my brain, that human-AI interaction and how we work with what each other can do.
5) I love love love that you created this app! And it’s beautiful! And that you shared the prompt for it! And I wish my dashboards were so beautiful…
Okay that’s all. You’re awesome. 😁