Build1 distinct publisher3 min readPublished
The kill pattern matched a Chrome profile path rather than a process the caller owned, so a posting job in one repository SIGKILLed a Playwright job in another and took the cookie database with it.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
The root cause is the liveness oracle itself. `ensure_chrome.sh` in the `scent-media` repo decides whether Chrome is alive by attempting a connection to CDP port 9223, and treats no response as a dead process to be force-killed [9]. What that probe actually measures is whether the running Chrome exposes a debug port. The `th-scent` job in the separate `social-autolike` repo drives Chrome through Playwright and never opens 9223 [11], so a perfectly healthy browser answers the probe the same way a hung one does [12].
Then look at the blast radius, which is inherited from the pattern. The command is `pkill -f "user-data-dir=$PROFILE"`, with `$PROFILE` set to `.profiles/chrome-ig` [10]. The identity being matched is a directory, and that directory is exactly what the other repo was configured to reuse, via `"reuseProfile": ".profiles/chrome-ig"` in `config/accounts.json` [11]. Neither codebase has to reference the other for the kill to land. This is what happens when a handful of jobs becomes a fleet on one machine: process identity leaks out of the repo and into the filesystem, and that filesystem is shared across jobs.
The data loss follows from the signal pair. `pkill -f` sends SIGTERM then SIGKILL, so Chrome cannot finish its shutdown routine and loses its chance to write the profile's cookie SQLite back consistently [14]. On the next launch it recreates an empty cookie DB, and the measured post-mortem is three rows across all hosts, zero cookies for `instagram.com`, and no IG `sessionid` [15]. On 2026-08-24 the 19:00, 21:00 and 23:00 slots all posted nothing [16].
The timing was not luck. `th-scent` unfollow grabbed the profile at 22:56 and `daily-post` called `ensure_chrome.sh` at 23:00 [13], a four-minute window [20] that launchd hit on schedule every night. The scheduler was the only component doing precisely what it was told.
Detection is the other half, and it failed earlier and for a different reason. The author reports that on 2026-08-08 the `ig-1` like lane exited 0 with zero likes on 8 of 12 daily runs [5], roughly two thirds [19], because the watchdog counted occurrences of a completion marker and therefore scored circuit-break and need-login as healthy [6]. An earlier gap was worse: X, Instagram, TikTok and Threads posting was watched by nobody, and IG posting stopped from 7/29 for two weeks before anyone noticed [4]. Adding `count_dead_runs()` and `sum_likes_today()` fixed the reporting [7], not the structure, since the breaking side and the reporting side live in different repositories [8].
Reaching this failure requires a specific combination: one host, headful Chrome, a profile directory reused by two independently scheduled jobs, and a kill by command-line pattern rather than by a PID the caller started. If each job gets its own `user-data-dir`, the whole class evaporates. According to the dev.to write-up, the account being logged out nightly sits underneath ¥1.2M/month in revenue [17], which is a good argument for the cheap fix being isolation rather than more monitoring.
Ranked by verification strength, evidence, and original report placement.
In the author's current environment, 171 automation jobs launch automatically from launchd every day.
Posting, liking, following, unfollowing and DMs across X, Instagram, Threads and TikTok are all automated in the author's setup.
A Bash script called sns-output-watchdog.sh monitors whether each job actually produced output that day, based on artifact logs.
The header comment of sns-output-watchdog.sh records that content-watchdog.sh only watched article/note/maker/series/ameba, so X, IG, TikTok and Threads posts and replies were monitored by nobody, with the result that IG posting stopped from 7/29 and TikTok posting from 7/28 and went unnoticed for two weeks.
In measurements on 2026-08-08, the IG like lane ig-1 finished with exit 0 and zero likes on 8 out of 12 daily runs.
The watchdog at the time only counted how many times the marker '終了 (' appeared, so it judged both circuit-break and need-login runs as healthy.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
Exit 0 only means nothing threw: what a logged-out browser costs a cron job1 distinct publisher
build
Every setting was correct and the job died anyway: the assertion nobody writes1 distinct publisher
build
The 46GB Leak Your RSS Alert Cannot See: macOS Compressed Memory Breaks Threshold Monitoring1 distinct publisher
build
A cost monitor overcounted 4.9x, then went dark for a week when set -e did its job1 distinct publisher
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.
Terminal-deep, single-witness
The convincing material is the material the author had no reason to invent: a Japanese header comment that dates Instagram's silence to 7/29 and TikTok's to 7/28, a cookies table counted down to three rows across all hosts, the literal pkill pattern and the reuseProfile string sitting in two different repositories. That is a coherent chain from probe to signal to empty database. What is absent is any second witness — nobody reproduced the 9223-probe-kills-Playwright sequence, and the instrumentation vouching for the numbers is the same instrumentation that had already been caught calling zero-like runs healthy.
A sample of one machine
Everything observed here happens inside a single developer's Mac: 171 scheduled jobs, two repositories that were never told about each other, one Chrome profile with two owners. The failure pattern generalises easily — anyone mixing a CDP-probing shell script with a Playwright job on shared profile data is exposed — but our coverage contains no second deployment, no other team hitting it, and no tooling that has adopted the wait-and-skip fix.
Oversold frame, undersold diagnosis
The packaging is louder than the finding: a script 'murdering' a login, a revenue arc from ¥100k to ¥1.2M that nobody can audit, both doing work the engineering does not need. Underneath, the diagnosis is almost deflationary — a pattern-matching kill command, a port that was never going to answer, four minutes of schedule overlap — and it is arguably undersold, because the same footgun waits for anyone whose browser profile has two owners. The gap is in the storytelling, not in the debugging.
Confession that flatters the confessor
The author is his own subject: a solo developer whose funnel ends at a LINE account, publishing on a developer platform where a good war story is distribution. The revenue ladder in paragraph two is recruitment material. Pulling the other way, the piece is an admission that his own script destroyed the login behind his income for days while he re-typed the password every morning — no vendor is being sold, no product is being launched, and self-flattering write-ups do not usually include the part where a human is the loop.
Trust the mechanism, verify the numbers
Split verdict. The causal chain — closed port, wrong kill, unflushed SQLite, missing sessionid — is specific enough that I would expect it to reproduce, and it matches how pkill and Chrome actually behave. The quantities are a different matter: 8 of 12 runs, three cookie rows, ¥1.2M a month, all from one author's tooling on one machine, with no second publisher in our coverage to disagree with any of it.