Build1 distinct publisher3 min readUpdated
A developer's nightly content pipeline kept reporting success while shipping 186-byte error messages. The fix was to stop reading logs and start checking whether a dated done-marker exists.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A developer writing on dev.to published the shell scaffolding behind a five-lane content generation pipeline, along with the failure that prompted it: the scripts always reported success, and the articles were sometimes 186 bytes of an error message [1]. The useful part is not the watchdog script. It is the concession that an exit code carried no information, and that the only thing now treated as truth is whether a dated file exists [2].
The author lists three ways the job died while looking alive. launchd fires the script every morning, but it starts before the network is up and exits silently [3]. The API times out with no response, and a log file still exists anyway [4]. The Claude token budget runs dry, the error text flows straight into the output file, and the body ends up at zero bytes [5]. All of them leave behind nothing but the fact that the script ran [6]. That is the whole problem in one line: the evidence of running survives, the evidence of working does not.
So completion gets its own artefact. Only the existence of ~/.claude/logs/.article-daily-done-20260710 counts, not anything the script wrote to the log [2]. content-watchdog.sh is invoked several times a day, checks the done-marker for every lane, and restarts only the lanes whose marker is missing [7]. It takes a mkdir-based contention lock at ~/.claude/locks/content-watchdog.lockd/ so overlapping slots do not double-fire [8], and re-runs an incomplete lane under run_capped 1800 [9], which is a 30-minute ceiling [10]. When every lane is done it sends one Discord heartbeat and writes a dated heartbeat file [11].
The per-lane checks are where the pattern gets honest about its own edges. article and series each use a single hidden dated file [12]. note and maker glob for $TODAY-*.done, a shape that tolerates several files per day [13]. ameba has no marker at all, so the watchdog inspects the artefacts directly, grepping .md files under ~/Desktop/Article/ameba for created: metadata matching today, then falling back to file mtime [14]. The author calls that a fallback and a realistic compromise for wiring an existing script that lives outside the design into the watchdog [15]. Five lanes, three different definitions of done [16].
The placement of the touch matters more than the marker itself. In article-daily-stock.sh the marker path is fixed at the top, and the file is created after generation, validation, stock placement and secret scanning, immediately before the git push at line 453 [17]. The in-code comment explains why: the push is best-effort, so judging done by push success would leave the marker unset on a git failure and produce duplicate generation in the next slot [18]. That is the transferable rule. The marker goes at the last point where the thing you actually care about is finished, and not one step later.
What to watch is the gap the pattern does not close. A done-marker proves the script reached line 453; it does not prove the output is any good, and a 186-byte error article would sail past a marker placed before content validation [1][17]. Here the checks sit upstream of the touch, which is what gives the file its meaning. The ameba lane shows the weaker version: when you did not write the lane, you are reduced to reading mtimes, which tells you a file changed today, not that the run succeeded [14][15]. The author also credits this verification-cost reduction with letting him run 10 iOS apps in parallel at 1.2M yen a month in revenue [19]; that part is single-sourced and unverifiable, and the marker logic stands without it. The framing that does hold: automation dies for operational reasons more often than technical ones, on the morning the Wi-Fi is not connected, at midnight with the battery at 3 percent, at the end of the month when the budget runs out [20].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The author's content generation scripts always reported success, while the articles they produced were sometimes 186 bytes of an error message.
The stated design principle is to prove completion by the existence of a file: not what the script wrote to the log, but only whether ~/.claude/logs/.article-daily-done-20260710 exists, is treated as truth. This is described as the done-marker pattern.
launchd fires the script every morning, but it starts before the network is up and exits silently.
The API times out with no response, yet a log file still exists.
When Claude's token budget runs dry, the error message flows straight into the output file, leaving the body at zero bytes.
All of these failure modes leave behind nothing but the fact that the script ran.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Mechanics shown in code, outcomes only asserted
The technical core is unusually well evidenced for a blog post: done_lane(), acquire_lock() and the DONE_MARKER touch are pasted as source with paths, the 1800-second cap and stale-lock takeover are stated explicitly, and the marker-before-push rationale is carried by an in-code comment. Evidence quality drops sharply for the claimed business outcome and the general 'operational beats technical' thesis, which have no data behind them, and the supplied source text is truncated mid-file so the lock and lane code cannot be read end to end.
One self-reported personal deployment
Adoption evidence stops at the author's own machine: five lanes swept several times a day from launchd with dated markers and a Discord heartbeat. No repository, release, fork count, download figure, or second practitioner using the pattern is reported, so the measurable footprint is a single-operator setup rather than an ecosystem.
Solid pattern, overreaching framing
The implementation claims are modest and demonstrated, but the framing runs ahead of them: a dated marker is presented as the only honest success signal even though the marker is set before delivery and, for ameba, inferred from file mtime — so a marker can still exist over an unpublished or unrelated artefact. The revenue-and-throughput attribution and the universal 'automation fails operationally' thesis are generalised from one machine. The gap is moderate rather than severe because nothing about the mechanism is misdescribed.
Self-promotional practitioner post
The author is writing about his own tooling on a personal dev.to account and uses the piece to advertise a monetised operation — 10 iOS apps and ¥1.2M/month attributed to his automation discipline — which creates a direct incentive to present the pattern as decisive and to omit residual failure modes. There is no vendor sponsorship, product being sold in the text, or disclosure statement in the supplied material, so the incentive is reputational and audience-building rather than commercial placement.
Verifiable code, unverifiable claimant
Confidence is limited by structure rather than by internal contradiction: one publisher, one self-interested author, no independent replication, and a truncated body. It is held above the floor because the load-bearing technical assertions are backed by pasted source that is self-consistent (the same 1800-second value used for lock staleness and lane timeout, marker paths matching between watchdog and lane script), so the pattern itself can be judged on its merits even if the surrounding outcome claims cannot.
build
launchd Tells You Nothing When a Job Dies, So Your Revenue Reports It Instead1 distinct publisher
build
Config rot has a latency bill: a 70-line weekly audit for agent environments1 distinct publisher
build
The 46GB Leak Your RSS Alert Cannot See: macOS Compressed Memory Breaks Threshold Monitoring1 distinct publisher
science
Text watermarks land on 2 December. The detection they imply does not.1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 17, 2026