Build1 distinct publisher3 min readPublished
A daily automation job was killed for two weeks because two reasonable config values were never multiplied together. The check that catches it runs before the first action.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The control that was missing is one line of arithmetic, and it has to run before the first action fires: sum the caps, multiply by the maximum delay, add the maximum startup jitter, and refuse to start if the total exceeds the supervisor's timeout. On the numbers in the post that check fails loudly. The caps total 101 actions [4], the delay range tops out at 60 seconds [5], and jitter can add 900 [7], so the worst-case run needs 6,960 seconds against a 2,400-second window [2]. Off by a factor of nearly three.
The author computed 4,040 seconds using the 40-second mean [6]. For a deadline the mean is the wrong statistic; what matters is whether the unluckiest draw fits. It matters in the other direction too. At the 20-second floor, 101 actions need only 2,020 seconds and do fit, with 380 seconds left for jitter and for the page loads themselves [3]. A morning with low delay draws and a small jitter offset therefore finishes, which is presumably why the settings survived earlier runs and why the failure reads as intermittent rather than as arithmetic.
Invert the same assertion and it sizes the cap instead of testing it. With 900 seconds of jitter reserved and 60-second delays, a 2,400-second slot funds 25 actions [4]; at the mean it funds 37 [1]. The configured 101 is four times the safe figure, so a slightly larger timeout does not rescue it. Nor does the friendliest reading: 1,500 seconds of usable time split across 101 actions is 14.9 seconds each, below the configured 20-second minimum [6].
One more piece of arithmetic in the post is worth checking, because it hides half the overrun. It reports 4,940 seconds as 1.7 times the window [9]. Divide it out and 4,940 over 2,400 is 2.06; 1.7 is what you get from 4,040 over 2,400, with the jitter dropped somewhere between the sum and the ratio [5].
The reason this cost two weeks rather than one morning is that the failure does not reset. Cleanup lives in a finally block [11], and SIGKILL is delivered by the kernel with no handler run at all, so ctx.close() never executes and the Chromium process is left behind [10]. Every dead run adds to the pile. By August 5, according to the author's own measurements, the machine was carrying 1,527 accumulated processes, 395 of them node, with idle CPU at 18% and load average at 24.6 [13]. The misconfigured job was one of more than 160 registered on that box [15], and the ones that visibly broke had innocent numbers in their own config.
That is the case for putting the check where config is loaded rather than trusting review to catch it. The number that kills the job lives in a launchd plist as BROWSER_SLOT_TIMEOUT_SEC and the numbers that spend it live in Python [8], and neither file contains a wrong value.
Ranked by verification strength, evidence, and original report placement.
The author's Instagram engagement job brand-404/sns/ig_engage.py finished with exit code 124 every day for two weeks, starting one morning in August 2026; the author states exit 124 means timeout, the code returned when SIGKILL is sent.
The author read ig_engage.py looking for the fault and found the logic correct, exception handling present and Playwright session management fine, with no bug anywhere.
The Instagram daily action caps were 62 likes, 24 follows and 15 unfollows, a total of 101 actions.
Delays between actions were randomised with a minimum of 20 seconds and a maximum of 60 seconds, chosen to avoid bot detection.
The author's calculation used the average delay, (20 + 60) / 2 = 40 seconds, giving 101 x 40 = 4,040 seconds of sleep time alone.
Maximum startup jitter, a setting that randomises launch timing to look human, was 900 seconds.
Follow any of these and your For You feed starts watching them — no settings page required.
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.
Single self-reported account; mechanism checkable, metrics not
The causal mechanism (uncatchable SIGKILL bypassing a Playwright finally block, leaking Chromium contexts) is generic and independently checkable, and the config arithmetic can be recomputed from the numbers printed in the post. But everything else rests on one first-person dev.to article: the incident metrics come from a private local note, there is no repository, log excerpt or third-party corroboration, and the post's own headline multiplier does not survive recomputation.
One operator's personal fleet
Observed usage is confined to a single author's machine: a disclosed fleet of 160+ launchd jobs and one dated failure event on it. No other team, product, vendor or user is shown adopting either the automation pattern or the proposed pre-flight assertion.
Generalised from n=1, with arithmetic slippage
The framing - 'the assertion nobody writes', settings all correct and a job dying anyway - universalises a single unverified anecdote, and the article's own overrun figure (1.7x) understates what its inputs imply (about 2.06x) while omitting that the schedule does fit at the 20-second minimum draw and blows out to 2.9x at the maximum. The underlying mechanism is real and the diagnosis plausible, so the overstatement is moderate rather than severe.
Personal-brand post with commercial framing
The article is a self-published practitioner post whose narrative interleaves the debugging story with promotional framing - a stated monthly revenue figure the automation stack supposedly underpins, near-zero hands-on time, an autonomous code-generation toolchain, and a mention of sitting in job interviews. That creates an incentive to dramatise both the fleet's scale and the severity of the incident, and no counter-incentive (editorial review, disclosed artifacts) is present.
Moderate on mechanism, low on magnitudes
Confidence is moderate that the described causal chain (uncomputed time budget -> timeout SIGKILL -> skipped ctx.close() -> orphaned Chromium -> host saturation) is what happened, because the mechanism is standard and the config values are internally consistent. Confidence is low in the specific magnitudes and in generality: one publisher, one machine, unauditable metrics, and a printed ratio that does not match its own inputs.
build
The 46GB Leak Your RSS Alert Cannot See: macOS Compressed Memory Breaks Threshold Monitoring1 distinct publisher
build
Screenshot retrieval gets a one-line install, and the comparison is text embeddings1 distinct publisher
build
JetBrains asked 15,000 developers how much code agents write. The answers add up to 112 percent1 distinct publisher
build
Exit 0 is not a health check: a dead PID held a lock for two hours and nothing complained1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 26, 2026