How do you stay aware of what your AI coding agents are doing?

by

I've been running Claude Code, Cursor, and Codex pretty heavily for the last few months and I keep hitting the same loop:

1. Start a task in one agent

2. Switch to something else (Slack, Twitter, another terminal)

3. Come back 30-40 minutes later

4. Agent finished 35 minutes ago. Or worse, it's been waiting for my approval the entire time.

The more agents I run, the worse it gets. There's no unified way to know what's happening across them.

Curious what other people's setups look like:

- Do you just keep terminals visible and check manually?

- Built any custom notification scripts?

- Use something like ntfy or Pushover?

- Just... accept the wasted time?

I've been building something in this space (push notifications + approval flows for AI agents) and I'm trying to understand if everyone's workflow is as janky as mine, or if some of you have figured out something clever.

Would love to hear what's working and what's not.

5.1K views

Add a comment

Replies

Best

I hit the same loop, the worst version is the agent that finished half an hour ago sitting next to the one silently waiting on my approval the whole time. What helped more than notifications was making each agent surface what it changed and what it's blocked on, so coming back is a ten-second scan instead of re-reading the session.

 

This is a really sharp distinction and I think you're pointing at something most people (including me at first) conflate. There are actually two separate problems: when to come back (the notification) and how fast you can reorient once you're there (the summary of what changed + what it's blocked on). A notification with no context just teleports you back into a wall of scrollback - you've saved the polling but not the re-reading.

The "ten-second scan instead of re-reading the session" framing is exactly right, and it's making me think the notification and the diff/blocker summary shouldn't be two features - the push should be the summary. Instead of "Agent 3 needs approval," it's "Agent 3 changed X, Y, Z, blocked on: should it touch the auth layer?" so the decision happens at the notification layer, not after you've climbed back into the terminal.

How are you surfacing the "what it changed / what it's blocked on" right now is that baked into your `/handover`-style prompt, a git diff summary, or something the agent writes out on its own at stop time? Curious whether it's reliable enough that you trust the scan, or you still spot-check.

 Agreed, the push should be the summary, not a ping. Right now I just have the agent end each run with a plain what-changed and what-it's-stuck-on line, so the call happens at the notification instead of after you climb back into the terminal. Honestly more manual than a real handover so far.

"Agent is working" is not the useful signal for me.

I need the ugly handoff:

- files touched

- commands run

- checks that failed

- checks it skipped

- assumptions it made

- what still needs a human

The chat transcript is where the agent sounds reasonable. The handoff is where you find out whether it actually did the work.

 

"The transcript is where it sounds reasonable" should be printed on a t-shirt. That's the whole problem in one line. Agents are great at confidently narrating work they didn't fully do.

The two you listed that nobody surfaces: checks it skipped and assumptions it made. Those are the silent landmines. A green checkmark on the three tests it bothered to run tells you nothing about the two it quietly decided weren't worth it.

That ugly handoff is exactly what is built to show: files touched, commands run, what failed, what got skipped, what still needs you. Less "agent is working," more flight recorder for your agents so you find out before production does.

Which line item burns you most in practice, the skipped checks or the unstated assumptions? Curious which one I should make loudest.

I usually provide the AI ​​with an API that logs data in real time. Then I tell the AI ​​to send me a CURL GET request after completing any small step, noting who reported it and what was done. Then I just monitor this file to get a comprehensive overview.

 

That is a genuinely clever hack, and also a slightly cursed one. You basically built your own telemetry pipeline out of curl and willpower. Respect.

The catch is you now own that API, that log file, and the prayer that the agent actually remembers to ping it after every step instead of "forgetting" the one that mattered. It works right up until you're maintaining infrastructure for the thing that was supposed to save you time.

That's the exact duct-tape setup replaces: same idea, the agent reports what it did and where it's blocked, but as a hosted control panel across Claude Code, Cursor, and Codex instead of a file you babysit. You keep the comprehensive overview, you drop the plumbing.

Question for you, since you clearly think in systems: does your agent reliably fire that GET on every step, or do you catch it skipping the report when it gets deep into a task?

mostly just accept the wasted time:)

the approval-wait problem is the one that actually stings though.
a finished agent i can recover from.
one that's been sitting on a y/n for 40 minutes while i'm in another tab. that one hurts differently.

curious how you're handling that in pushary: does the agent push the approval request directly, or is there a layer in between?

 

"A finished agent I can recover from, one sitting on a y/n for 40 minutes hurts differently" is painfully accurate. The finished one wasted your time. The blocked one wasted its time and yours, simultaneously, while smugly doing nothing.

To your question: there's a layer in between, on purpose. The agent doesn't push to you directly, it hits Pushary, and we relay it as the approval request with context attached, then route your y/n back to the right terminal. Going direct would mean every agent needs your device, your auth, and your phone number baked in, which is a security nightmare and breaks the second you add a seventh terminal. The middle layer is what lets one inbox sit across Claude Code, Cursor, and Codex at once.

The fun part is the layer can also be smart: batch the noise, flag the risky approvals louder than the trivial ones, so you're not getting paged for "can I create a file."

Out of curiosity, would you actually want to approve from your phone, or just be told it's blocked so you can walk back to the machine? Trying to figure out how many people want full remote control vs. just the heads-up.

I'd separate progress logs from needs attention.

For coding agents, the useful notification is usually not every step they take. It's just a few state changes: running, blocked / waiting for approval, failed tests, and finished with a short summary of changed files.

Even a tiny script that watches the terminal or log file and sends those states is probably enough. The key is making the agent say when it needs a human, instead of silently waiting for 35 minutes.

 

"Separate progress logs from needs-attention" should be the first line of the spec, and it's the line most people get wrong. They pipe every step to a notification and train themselves to ignore the channel, which is worse than silence. The signal is the four state changes you listed, nothing else. Progress is for the log you read when you choose to. Attention is for the ping you can't ignore.

You're also right that a tiny script gets you most of the way on one tool, one machine. The catch is that's where everyone starts and then quietly drowns. The script that watches Claude Code's log doesn't know about Cursor's, the one for your laptop doesn't follow you to your phone, and "finished with a summary of changed files" needs the agent to actually emit that summary reliably, which is its own small project. It scales to one of you and one tool beautifully, and falls apart at six agents across three tools.

That's the entire reason Pushary exists: the exact state machine you described (running, blocked, failed, done-with-diff) but as one layer across tools and devices, so you're not maintaining a script graveyard. You nailed the spec. We just productized the part where it has to keep working at scale.

The real unlock is your last sentence: making the agent declare when it needs a human instead of silently waiting. Curious, in your setup do you prompt the agent to announce that, or do you infer "blocked" from the terminal going quiet? The detection method is the part I keep going back and forth on.

The useful notification is probably not just “agent finished”. I’d want three boring bits with it: what changed, what it needs from me, and whether it touched anything risky.

For coding agents, a good status update is closer to a tiny handoff report than a push alert: changed files, tests run, failures, and “waiting on approval for X”.

 

"Closer to a tiny handoff report than a push alert" is the cleanest way I've heard anyone draw that line. A bare "agent finished" just relocates the work, you still have to climb back into the terminal to find out what finished means. The notification should carry the decision, not just announce that a decision is waiting.

Your three boring bits are the exact payload: what changed, what it needs from me, and did it touch anything risky. That last one is the underrated star. Most setups surface changed files and failures but never flag "by the way, I edited the auth flow," which is precisely the change you'd want screaming at you and the one that arrives silently. Changed files and tests are the body of the report. "Touched something risky" is the headline.

This is more or less Pushary's whole spec, so either you've been reading my notes or we independently arrived at the same correct answer. The push is the handoff: changed files, tests run, failures, waiting-on-approval-for-X, with risk flags promoted to the top so the loud stuff stays loud.

The hard part is the risk flag, because the agent has to reliably know it touched something sensitive. Curious how you'd draw that line, declare risky paths per project up front (auth, payments, migrations), or have the agent infer risk on its own? I trust the first more than the second right now.

Interesting parallel — this visibility problem shows up at the infrastructure layer too.

Most multi-tenant SaaS teams have almost no real-time awareness of what their workloads are actually doing or costing until the AWS bill arrives (or something breaks). Same observability gap, different layer of the stack.

Curious if you've found any solid patterns or tools for keeping track of multiple agents yet?

 

The AWS-bill parallel is painfully good. "You find out what it cost when the invoice lands" is the exact same failure mode as "you find out the agent was blocked when you happen to glance at the terminal." In both cases the system was telling you the whole time, you just had no surface listening. Observability gaps are all the same shape: work happening faster than the human can passively perceive it.

To your actual question, the patterns that keep showing up in this thread and hold up: isolate first (git worktrees, one per agent, so contexts never collide), then collapse the signal to three states (done, blocked, failed) instead of streaming every step, then make the notification a tiny handoff report (changed files, tests, and crucially a flag if it touched anything risky) rather than a bare "done." And the cultural one: make the agent declare when it needs a human instead of silently waiting. Silence should never be the blocked state.

That stack is basically what Pushary productizes, which is the honest answer to "any solid tools yet." Most people are hand-rolling it with curl pings and log-watchers, and it works until you hit six agents across three tools and your script graveyard becomes its own maintenance job. The pattern is well understood now. The unsolved part is making it work at scale without you babysitting the babysitter.

Funny enough your world might be the next layer down: an agent that's burning tokens or spinning a runaway loop is a cost-observability problem wearing a coding-agent hat. Have you seen anyone tie agent activity to spend in real time, or is that still bill-arrives-and-you-cry?

the notification piece solves "when did it stop" but the harder half is "did it actually do the thing right." a ping that says done still leaves you opening the diff to check, and with 6 agents running thats where the real time goes. supervising agents is turning into an output-evaluation skill more than a monitoring one. whoever makes the "is this correct" check fast wins, not just the "is it finished" ping.

You just drew the line between v1 and the actual endgame. “Done” is a solved problem the second you decide to solve it. “Done correctly” is the one that eats your afternoon, and you’re right that at six agents the bottleneck moved from monitoring to evaluation. Nobody’s time goes to wondering if the agent stopped. It goes to opening six diffs and deciding if any of them are lying to you. So yeah, a bare “done” ping is table stakes, and I’ll say plainly it’s not the moat. The most a notification layer can honestly do is shorten the distance to the check: ship the diff, the tests run, the failures, and a flag on anything risky right in the alert, so you’re evaluating from the first second instead of spending thirty of them reconstructing what the agent even touched. That turns “open the diff and start reading” into “the diff is already in front of you with the scary parts circled.” It compresses the eval. It doesn’t perform it. Performing it is the frontier, and you named it correctly: supervising agents is becoming an output-evaluation skill. The team that makes “is this correct” fast, automated review, adversarial test generation, agents that grade other agents against the success criteria, wins the next round outright. The ping is the floor. The verdict is the ceiling. Where I’d push back slightly: the verdict still needs the human for the judgment-call slice, the ambiguous-spec and risky-path cases where “correct” depends on intent only you hold. So I think it converges on machines doing the first-pass eval and humans ruling on the contested 10%. Curious where you’d put the line, do you trust an agent to grade another agent’s output yet, or is that still the part you refuse to delegate?

Honestly, I still mostly keep terminals visible and check manually, which is not ideal.

The worst part is not even when the agent fails , it’s when it quietly stops and waits for approval while I assume it’s still working. I’ve also started keeping smaller tasks per agent so I can track progress better, but once multiple tools are running, it still gets messy.

A unified notification + approval layer would actually be useful, especially for solo builders who jump between coding, debugging, product, and marketing all day.

“It quietly stops and waits while I assume it’s still working” is the exact failure that should be illegal. A crash at least announces itself. The silent approval-wait disguises itself as progress, which is why it’s the one that actually bleeds time, you’re not even worried, you’re just wrong. Smaller tasks per agent is the right instinct, by the way, that’s you manually buying yourself shorter blind spots. But you’ve also spotted the ceiling: it holds up per-tool and falls apart the moment you’ve got a few running at once, because now you’re tracking three different definitions of “stopped” across three apps. The discipline scales linearly and the chaos scales exponentially. The solo-builder angle is the part I care most about, because that’s the whole bet. When you’re the coder, debugger, PM, and marketer in one day, the cost of context-switching to manually check a terminal isn’t just the minutes, it’s the reload time on whatever you got pulled out of. A unified notification plus approval layer is exactly that: one inbox for done / blocked / needs-input across every tool, so the agents interrupt you only when your brain is actually required and stay silent otherwise. Quick one: when an agent does stop on you mid-flow, what breaks worse, the wasted clock, or losing the thread on the other thing you’d switched to? Trying to figure out whether people are buying back time or buying back focus.

Personally I am trying to avoid giving too complicated and potentially long tasks. It's not easy tho. To achieve this I start with the business requirement , I ask the LLM to show me the steps that are required to complete the task. I try to understand every step. For every step , I want LLM to create a control mechanism to check the validity of the step. ( a simple test case for example). And finally I try to create and automatic script that check the whole use case functionality.

The dilemma of using an agent is if you want speed you need to have less control of your ecosystem. If you want to have 100% control of your system you need to spend your day to understand 30-40 minutes of your agent's work. I try to optimize this and try to know enough to be able to maintain the project and know the general overview.

 

The dilemma you ended on is the realest thing in this whole thread: speed costs you control, control costs you your whole day understanding 40 minutes of work. Most people pretend that tradeoff doesn't exist and then act surprised when they've either lost the plot or lost the afternoon.

But here's the thing your own workflow quietly disproves: that curve is steeper than it has to be, and it's steep mostly because surfacing control is manual. Your "every step gets a control mechanism, a test case, a script that validates the use case" approach is exactly right, and notice what it actually does, it makes verification cheap so control stops costing a full day. You're not choosing less speed. You're lowering the price of control until you can afford more of it at the same speed. That's the real move. The dilemma isn't a law of physics, it's a tooling gap.

That's the whole thesis behind Pushary, honestly. If the agent emits its per-step validity checks and what it touched as a structured handoff, you get the "general overview to maintain the project" you're optimizing for without sitting there reading the session. Make control cheap and the speed-vs-control curve bends instead of forcing a pick.

Curious where you draw the line on understanding "enough", do you read every step's validation, or only the ones that touch something you'd be scared to break? I suspect the skill is knowing which 20% to actually look at.

 I try to ask these questions

  • which step of the overall solution am i going to solve now

  • which technology stack/library/solution will is the agent using

  • what are the constraints of this solution

  • how can i fully sure that the solution meets my requirements (this is half understanding the solution and half testing the solution)

I think the most important part is the third one. Because every solution can have some constraints that you need to take care in the long run. So I try to learn my weaknesses as well. And more than that I try to keep that in the agent's context as well. Becasue if you just tell the agent to develop an API for example when you switch to another context the LLM forgets about some details and just knows there is an API without knowing its constraints (for example a dependency , a performance criteria etc).

 

Question three carrying the weight is the correct call, and the reason is subtle: steps one, two, and four are about getting the thing built, but constraints are about not getting silently betrayed by it six weeks later. A solution that works today and quietly violates a performance ceiling or pins a dependency you can't upgrade isn't done, it's a debt you haven't been billed for yet. Most people only discover their constraints by violating them.

But the real insight is your last point, and it's bigger than your own workflow: the agent forgetting the constraint on context switch is the actual bug. It remembers "there's an API," loses "the API must stay under 200ms and can't touch that library," and now it's confidently building on top of a forgotten rule. The constraint didn't change. The agent's memory of it evaporated. That's not a model being dumb, that's constraints living in volatile context instead of somewhere durable.

Which is exactly why I think constraints belong in the handoff trail, not just the prompt. If "this was built under constraints X, Y, Z" is recorded next to "what changed," then a later agent, or you at 2am, can check work against the rules it was supposed to honor instead of trusting that it still remembers them. The trail becomes the constraint's long-term memory so the agent doesn't have to be.

Curious how you keep them alive in practice, do you re-inject the constraints into context every task, or pin them in a project file the agent has to read first? The forgetting problem seems like it needs a forcing function, not just hope.

 to be honest I couldn't keep these straight from the beginning of the project. Because some wisdom comes after some bad experiences :)

But after some point what i do is this:

  • I keep a tracker table for all the project.

  • The list just keep growing when i want to add new feature. I add a feature as "TODO" in the list

  • When I finished it I add notes to that item before labeling it as DONE.

  • And tell the agent to add enough documentation in the code before commiting.

  • In every conversation I reupload the tracker excel. Trying to keep the excel small enough to be easily maintainable but also comprehensive about crucial feature.

First
Previous
•••
456
•••
Next