3 Duplicate Instagram Posts in 8 Hours: Anatomy of a False-Negative Success Check A developer running an autonomous Claude Code environment of roughly 171 scheduled jobs traced three duplicate Instagram carousel posts on August 28, 2026 to a false-negative landing check: the posts succeeded, but the verification step returned ok:false, so the scheduler re-ran the job and republished identical content. The developer argues that for non-idempotent operations with side effects, a false negative is more dangerous than a false positive because it silently multiplies the side effect instead of halting the line. I went from ¥100k/month as a student, to ¥600k juggling side gigs, to zero after a layoff, and then spent six months building an autonomous Claude Code environment that brought me back to ¥1.2M/month. What I learned along the way wasn't a string of automation wins. It was a pile of lessons about what happens when automation breaks . On August 28, 2026, the same Instagram carousel showed up three times on my profile. Shortcodes DckjvpPoFRt , DckN-yYkIBsJ , and DclaPYooPjB — posted at 13:58, 17:55, and 21:54 JST. All three times, the job logged "post not found on profile." All three times, a direct check against the Instagram API showed the post had gone through. The operation succeeded, and the check called it a failure — a false negative that repeated a side effect three times over. "Building an environment" means driving the number of times I have to touch anything toward zero. For Instagram, launchd fires a script on schedule, and that script runs caption generation, posting, landing verification, and ledger write-back end to end with no human in the loop. Around 171 jobs run side by side in total, and the Instagram carousel post is one lane. I never have to go check "did today's post go out?" — the ok:true entry in the ledger and the Discord notification tell me instead. The reason this is an "environment" rather than "work" is that the environment also decides when to retry. If landing verification verify landed returns ok:false , the same job runs again at the next scheduled slot. Instead of a human going "oh, that failed, let me try again," the scheduler re-runs it automatically. Zero time, zero effort — as long as the verdict is correct. When the verdict is wrong, the mechanism runs in reverse. If the post succeeded but ok:false keeps coming back, the scheduler interprets that as "still not posted" and sends the same content again. The side effect the post is already done, but the verification layer insists it isn't. Let retries run in that state and identical posts pile up without limit. A false positive — "it actually failed, but we called it a success" — stops the shipping line. That's a visible failure. Someone notices and investigates. A false negative — "it actually succeeded, but we called it a failure" — increases shipments. That's an invisible failure. The ledger fills with ok:false , and on the surface it looks like "posts are running late." Meanwhile the same post is being mass-produced, and the script calmly schedules the next retry. For an operation with side effects, the damage from a false negative is not "a failed check" but "a duplicated side effect." Every wrong verdict leaves another trace in the real world. In Instagram's case, that trace was three identical carousels lined up on my profile. My learning notes record it this way: " false-positive-stops-the-line was the 'a false alarm halts shipping' pattern. This one is a false alarm that increases shipping . Worse than stopping." 171 jobs run efficiently because each one can accurately judge whether its own work is done. If the verdict is accurate, a successful job runs once, and only failed jobs get re-executed. When the verdict breaks, that premise collapses. Successful jobs get treated as failures and re-run too. If the side effect is idempotent same result no matter how many times you do it , no problem — but a social media post is not idempotent. Send once, one post goes public. Send three times, three go public. Before asking "how many retries should this have?", you have to ask "is this operation idempotent?" Attaching three retries to a non-idempotent operation is a declaration that you'll tolerate the side effect up to three times. My retry-design reference retry-and-giveup-design.md says "throwing the same failure three times doesn't change the result," and it's the same point — when the problem is in the input to the verdict itself, adding attempts changes nothing. Here's the timeline of what happened on the day of the incident. launchd: 13:58 JST │ ▼ ig autopost.py │ ├─ 1 キャプション生成・投稿実行 │ IG カルーセル送信 ─────────────► 成功 ✓ DckjvpPoFRt │ └─ 2 着地確認: verify landed │ ├─ プロフィール DOM 取得 │ キャプション先頭12文字: "👾 個人開発の量産..." │ IG レンダリング: