BuildNot yet confirmed elsewhere1 publisher2 min readPublished
Four dead lanes, fourteen days, and a watchdog that was never told to look
A Y1.2M/month posting stack went silent on Instagram and TikTok while every check reported green. The watchdog's scope had been set once and never revisited.
The Engineer · Build desk
What happened
- The social posting lane of a Y1.2M/month automation stack published nothing for 14 days while the morning report said healthy and every exit code was 0.
- Instagram's last post was July 29 and TikTok's July 28; the operator noticed only while reading logs for an unrelated reason.
- The watchdog covered the four article lanes only; X, Instagram, TikTok and Threads were excluded by design, as a comment in the file records.
- Posting scripts exit 0 whether or not a post went out: an Instagram rate limit reads as quota used up, and a TikTok 'already posted' exits 2.
- The replacement watchdog decides health by whether a per-lane success marker appears in today's log.
Why it matters
- constraint Coverage has to be re-earned every time the stack grows: four of the eight lanes were outside the net, and a green report carries no vocabulary for the lanes it was never given.
- cost Pro-rata, about Y560,000 of the stack's monthly figure spans the dead fortnight, and it bought no Instagram or TikTok posts.
- decision Pinning liveness to strings like 'OK posted' and '投稿成功' promotes log wording to an interface: reword a line in a refactor and the lane goes dark with the check still green.
- exposure Healthy sends no Discord message, so a watchdog that never fires looks exactly like a good day.
The part worth copying is the shape of the old check. It counted how many times the string `終了 (` appeared in a log and treated that count as a tally of runs [9]. A lane tripping its circuit breaker printed that string. A lane parked at a login prompt printed it too. Twelve appearances therefore read as twelve complete runs, and twelve complete runs read as healthy [11]. What the check was counting was the sound of a script stopping.
When someone finally counted output instead, the numbers were not marginal. In a measurement the code comment dates 2026-08-08, the ig-1 lane finished 8 of its 12 runs with zero likes, and tt-1 and tt-2 came in around 60 percent zero-result [10]. That is a two-thirds failure rate on one lane, scored daily as fine [21].
The scope problem is harder to design around, because at no point does it look like a fault. `content-watchdog.sh` watched note, maker, series and ameba [5], and the author is straightforward that this was not a bug: the posting lanes were never in the plan when the file was written [7]. A watchdog only knows the lanes someone typed into it. Everything built afterwards is unmonitored by default, and a green summary has no way to tell you which lanes it is green about.
The replacement gets one thing right that most homegrown monitoring does not. A missing log is not treated as a failure. `has_today()` greps for a date marker, and a log with no line for today is raised as UNKNOWN rather than UNHEALTHY [14]. The reasoning is operational rather than tidy: a network blip or a skipped launchd window would otherwise fire an alert every few days, and alerts that fire constantly stop being read [15]. Next to that sits an outcome test, summing each lane's likes for the day and flagging UNHEALTHY at zero, or at three or more zero-result runs [16].
That last rule is where the design stops being about code health. The author's stated basis is six months of running this stack, and the conclusion drawn is that "is output coming out" tracks revenue far better than "is the script running" [22]. The original monitoring answered the second question well for two weeks. The first question was never put to it.
What to watch
- Whether the zero-likes rule survives ordinary low-engagement days, or becomes the alert everyone mutes.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence44
- Adoption9
- Hype gap+16
- Incentives33
- Confidence52
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
A Y1.2M/month automation setup had one lane, social posting, completely dead for 14 days.
- [2]
Instagram had not published a single post since July 29 and TikTok since July 28.
- [3]
The operator only found out because he was digging through logs for something else.
- [4]
Throughout the outage the system reported healthy every morning: no errors anywhere, script exit codes 0, every watchdog green.
- [5]
The existing content-watchdog.sh only monitored the article lanes: note, maker, series and ameba.
- [6]
The social posting lanes (X, Instagram, TikTok, Threads) were, by design, not included in any monitoring; the code comment states that nobody was watching their posts or replies.
- [7]
The author states this was not a bug in the code but a design blind spot: putting the social posting lanes under the watchdog was never part of the plan when it was written.
- [8]
Social posting scripts can finish with exit 0 whether the post succeeded or failed: an Instagram rate limit makes the script decide the day's quota is used up and exit normally, and a TikTok emulator reporting 'already posted' exits 2 and is treated as normal.
- [9]
The previous monitoring counted only the number of occurrences of the string '終了 (' in the log, so circuit-break and need-login states were both judged healthy.
- [10]
In a measurement the code comment dates 2026-08-08, ig-1 finished 8 of 12 runs with zero likes and tt-1/tt-2 were at zero likes in about 60 percent of runs, all exiting 0.
- [11]
The old monitoring scored the result as '12 complete runs = healthy'.
- [12]
The new rule decides life or death by whether a success marker exists in today's log, rather than whether the process ran to completion.
- [13]
Per-lane success markers include 'OK posted' for Instagram posts, '投稿成功' for the X auto-tweet, and 'run end (exit 0)' or 'run end (exit 2)' for TikTok.
- [14]
The has_today() function greps the log for today's date marker; if no line for today exists the lane is classified UNKNOWN and raised through a different alert than UNHEALTHY.
- [15]
The stated reason for the UNKNOWN class is that treating a missing log as broken would fire alerts on internet blips or skipped launchd start windows, and once alerts fire daily humans stop trusting them.
- [16]
The outcome-based check aggregates each lane's likes for the day and marks UNHEALTHY on zero likes or three or more zero-result runs.
- [17]
launchd runs sns-output-watchdog.sh daily at 23:30 JST via com.lily.sns-output-watchdog.plist, with RunAtLoad set false so it does not misfire when the plist is loaded.
- [18]
Results are pushed to Discord: UNHEALTHY and UNKNOWN each get a notification, while an all-normal result sends none.
- [19]
Because an all-normal result sends no Discord message and the watchdog is itself a scheduled launchd job, a watchdog that fails to run is indistinguishable from a clean day.
- [20]
Four article lanes were inside the watchdog and four posting lanes were outside it, so half of the eight lanes were unmonitored.
- [21]
8 zero-result runs out of 12 is a two-thirds failure rate on the ig-1 lane.
- [22]
The author attributes the design to more than six months of running side-business automation, concluding that 'is output coming out' maps to business health far better than 'is the script running'.
- [23]
Pro-rata, 14 days covers roughly Y560,000 of a Y1.2M monthly figure.
Sources
1 independent publisher whose own reporting we read for this story.
- dev.toOur Social Posting Automation Was Dead for 14 Days and the Monitoring Never Noticed
1 article · August 26, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.