An overnight render died halfway and my Telegram AI said nothing — I only noticed the next morning. I found the root cause, made every background job report back the instant it finishes, then taught the same bot to read my 👍/👎 and send me a weekly report card.
I kicked off an overnight video render from my phone: text the bot, it fires the job in the background, I go to bed. In the morning — nothing. No "done", no "failed", no half-file. The render had died mid-way and the bot never said a word. Here's the trap: a Telegram message spins up a short-lived claude -p process just long enough to reply, then exits. Anything it "runs in the background" is tied to that process — so the instant the reply is sent, the job is orphaned and dies untracked. The silence wasn't a bug in the render. It was the whole architecture.
The fix is a wrapper: run-detached-notify.ps1. Instead of backgrounding a job inside the throwaway chat process, it launches the command as a fully OS-detached process — no console, independent of whatever shell started it — so it keeps running long after the bot's reply is gone. When the job finishes it makes one direct Telegram API call: Done with the tail of the output, or FAILED with the exit code and the error. No heartbeats, no spam — exactly one message, guaranteed, success or failure. It generalizes the pattern the bot already used for its own /bg replies to wrap any command: renders, Python jobs, batch work.
Reporting back reliably is only half a loop. The other half: the bot now reads the reactions I leave on its messages. A new capture patch logs every 👍, 🔥, ❤️ or 👎 to reactions.jsonl; a weekend job (weekly-feedback-digest.ps1) matches each reaction back to the message it was on, sorts them positive vs negative, and sends me a weekly report card on how its own work landed. The bot that talks to me all week finally finds out what I thought of it.
Honest status: the reaction-capture patch went live today, and the listener hasn't been restarted yet — so no real reactions have landed and the first digest is empty until it's armed (reply /restart-listener). It also has a known blind spot I didn't hide: messages sent straight through the Bot API — the very /bg and detached-notify replies from beat 2 — aren't indexed yet, so reactions on those read as message text unavailable. Building in public means shipping the loop and the gaps still in it.
The silent gap that started it, the guaranteed completion message that fixed it, the weekly report card, and the coverage gap I left visible on purpose. Tap any image to enlarge it and read exactly what's on screen.




A good assistant does two things a silent one can't: it always tells you how the job went, and it finds out how you felt about the job. One night's dead render exposed both gaps at once. Now every background task reports back on its own — success or failure, guaranteed — and every 👍 and 👎 I leave rolls up into a weekly read on where it's helping and where it's annoying me. That's the loop closed: it talks, and for the first time, it also listens.
On camera: the dead overnight render, the one-line reason a Telegram job dies with the message that launched it, the detached-notify fix, and the weekly reaction report card.
The method is free. Pattern one: run long jobs as a detached process and fire one notification when they finish — so nothing dies silently. Pattern two: log the reactions people leave on your bot's messages and roll them up into a weekly digest. Works with any chat bot and any long-running job.
# Launch detached + notify once on finish, so no background job ever dies silently:
run-detached-notify.ps1 -Command '<your job>' -Label 'overnight render' # → one Telegram "Done" / "FAILED" on completion
Sanitized scripts are being cleaned up for release. Comment LOOP on the post and the bot DMs you both patterns the moment they're public.
A plain markdown file that tracks every unfinished thread, and a bot that checks one off when I text close 3 from anywhere. The scrappy text file that beat the fancy dashboard.