CLAUDE LABJP
2.1.274 — This round is aimed at people running Claude Code unattended: a warning when memory runs critical, an environment variable that bounds how long the first turn waits for MCP servers, and an end to sessions retrying a 400 forever10/07 — The old management-settings spelling is accepted until noon PT on October 7, nineteen days from now. Deprecation warnings have been showing since September 10WINUPD — Reports keep coming in of a Windows update leaving Cowork unable to mount a single host folder. Removing the update is still the only workaround anyone has foundNEW — Stopping before you hit the limit: a record of rebuilding the day around the five-hour windowBING — Seven in ten of the people who actually read these pages arrive from Bing. Search has more than one front doorEXCEL — Before handing over a spreadsheet, decide which columns it may read and which it may not2.1.274 — This round is aimed at people running Claude Code unattended: a warning when memory runs critical, an environment variable that bounds how long the first turn waits for MCP servers, and an end to sessions retrying a 400 forever10/07 — The old management-settings spelling is accepted until noon PT on October 7, nineteen days from now. Deprecation warnings have been showing since September 10WINUPD — Reports keep coming in of a Windows update leaving Cowork unable to mount a single host folder. Removing the update is still the only workaround anyone has foundNEW — Stopping before you hit the limit: a record of rebuilding the day around the five-hour windowBING — Seven in ten of the people who actually read these pages arrive from Bing. Search has more than one front doorEXCEL — Before handing over a spreadsheet, decide which columns it may read and which it may not
Articles/Cowork
Cowork/2026-09-18Intermediate

How I decide between Cowork and Claude Code: by where approvals land

Cowork and Claude Code run the same Claude, so I stopped comparing features and started sorting work by one question: can a human approval interrupt this step, or not? Here is the line I draw and the code I keep on the unattended side.

Cowork41Claude Code254Scheduled Tasks11Permissions5Automation45

I open last night's scheduled-run log first thing in the morning. One morning the file ended after its header line. The run had not crashed. It had been waiting.

When I traced it back, nothing was misconfigured. I had put the work in the wrong place. A sequence that behaved perfectly while I sat in front of it had been moved, unchanged, into a slot where nobody was watching the screen.

Cowork and Claude Code run the same Claude. So "which one is better" turned out to be nearly useless as a question for me. What helped was narrower: can a human approval interrupt this step, or does an approval here end the run?

Approvals that protect you, and approvals that stall you

An approval prompt is a safety device, and on the attended side it does exactly what it promises. When something reaches for a file I did not intend to touch, it stops and asks.

The same device behaves differently at three in the morning. It does not fail — it waits. Because waiting is not an error, nothing is raised, nothing is reported, and no exception lands in the log. You find out later, when a morning log ends after its header.

This is not only my setup. Adding one ordinary deny rule can make a compound Bash command that includes cd and a relative read ask for approval on every single run (claude-code Issue #91650). The check lands on how the command is assembled rather than on the risky operation itself. If you schedule anything, that behaviour is worth knowing about before it finds you.

The work I pulled back off the unattended side

As an indie developer I have run a set of wallpaper apps for a long time, and preparing assets before a release follows a fixed sequence. I built that sequence interactively, it worked, and — carried along by that — I moved it straight into a scheduled task.

It did not go well. File reads and writes were going through dedicated editing tools, so every run asked for permission and stopped there. On the attended side that prompt costs one keystroke. On the unattended side it is the end of the run.

Looking back, what I moved was not the sequence. It was a habit that quietly assumed someone was sitting there. So I redrew the line.

Nothing on the unattended side is allowed to ask a human anything. If a step genuinely needs a decision, I cut the job just before that step and hand the rest to the attended side.

The rewrite itself was unglamorous: file work moved to shell cat and sed. There is even a report that auto mode's internal guidance suggests sed and short heredocs rather than the dedicated editing tools (Issue #88041), which points the same way. My reason is not speed, though. It is one fewer place where an approval can appear.

The rule I sort by now

I no longer line up feature tables. I say what kind of work it is in one sentence, and that sentence decides where it lives.

Kind of workWhere it livesWhy
Runs at the same time in the same shape every day (asset exports, rolling summaries)Cowork scheduled taskIt can be written approval-free from the start
Needs a human call partway (is this safe to publish, safe to delete)Attended session (Cowork or Claude Code)The approval does its real job here
The steps are not settled yetClaude CodeI can watch it fail and fix it on the spot
Touches a repository, diff by diffClaude CodeI want to read the diff before deciding to stop
Repairing a connection to an external serviceAttended sessionRe-auth and status checks need a screen
Right after an OS or app updateNeither — check by hand firstEnvironment changes sit outside the automation

The last two rows were added later. Connection repair is available in the CLI but does not reach the desktop surface (Issue #54136), and after one Windows cumulative update, host folder shares reportedly stopped mounting altogether (Issue #92984). I have not hit either one myself. Both live in a layer automation cannot repair, which is why the morning after an update I open a folder by hand before I read any task output.

If the underlying question — watch it work, or let it run — is the part you are weighing, I came at it from a different angle in Claude in Chrome vs. Cowork: Watch It Work, or Let It Run.

What I keep in the unattended scripts

Once the sorting was settled, the unattended scripts got three promises: create no approval surface, confirm the write by something other than a return value, and always leave one line at the end.

#!/usr/bin/env bash
set -u
OUT="$HOME/reports/$(date +%Y-%m-%d)_summary.txt"
mkdir -p "$(dirname "$OUT")"
 
# Write through the shell, not a dedicated tool, so no approval surface appears
cat <<'EOF' > "$OUT"
# Daily inventory
status: pending
EOF
 
# Confirm by the artifact on disk, not by the return value
if [ -s "$OUT" ]; then
  echo "OK wrote $(wc -c < "$OUT") bytes -> $OUT"
else
  echo "FAILED empty output -> $OUT" >&2
  exit 1
fi

The expected output is a single line such as OK wrote 34 bytes -> /Users/you/reports/2026-09-18_summary.txt.

Three notes on why it is written this way. The heredoc delimiter is quoted as <<'EOF' so that a $ or a backtick inside the body is not expanded. Drop the quotes and the log you thought you wrote comes out empty, or truncated at the first surprise.

The -s check is there because "the call succeeded" and "the bytes exist" are different claims. A write tool returning success while no file appears has been reported (Issue #81538). A return value only tells you the call was reachable.

The final line exists because an empty log cannot distinguish "it never ran" from "it ran and found nothing." Without that distinction, whoever reads it in the morning starts the investigation from zero every time.

One smaller habit goes with it: I do not chain compound commands onto a single line.

# Approval checks can land on the leading cd, so keep the steps separate
cd "$WORK" || exit 1
git add content/
git commit -m "update: daily inventory"

The chained version is shorter, I will grant that. I keep them split because when it stops, the log tells me which line stopped it. On the unattended side I would rather be able to re-read the run than save a line. For how the scheduled tasks themselves are put together, I wrote that up in Running Cowork Scheduled Tasks in Practice.

Keeping the attended side light with narrow permissions

Driving approvals to zero on the unattended side pushes more of them onto the attended side. Let that get heavy and you are the one who stalls. Rather than opening permissions wide, I opened them narrowly.

{
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Read(./content/**)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./**/*.pem)"
    ]
  }
}

Read-only commands are allowed by name, and files holding secrets are closed off. Keep in mind, though, that each deny rule can pull compound commands that merely could touch its target into the approval queue as well (Issue #91650 again). A deny rule is not a free shield; it is paid for in daily keystrokes. For handling the prompts themselves inside headless runs, see Answering auto mode's confirmation prompts in headless runs.

One place to stop, and questions only during the hours someone is watching. Compressed to a sentence, that is the whole rule for me.

Move exactly one thing first

Look across the work you currently run interactively and find one job where you have never once pressed "yes" partway through. Move only that one into a scheduled slot, then leave it alone for a week. Moving the second one can wait until the first has seven days of logs behind it.

I may be missing something, but every time I redraw this boundary I notice how loose my previous version was. If you are stalled in the same place, I hope one piece of this is worth taking with you.

Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Cowork2026-07-02
How Many Tasks Fire in the Same Minute — Flattening Cowork Scheduled-Task Collisions from Cron
When Cowork scheduled tasks bunch up at the same time and fight over shared resources, you can expand every cron expression into fire times, count collisions and true concurrency, and shave the peak with a greedy offset that never moves your premium slots. With working code and measured before/after numbers.
Cowork2026-07-01
Let the Downstream Task Verify the Upstream Actually Ran Today: A Completion Ledger and Dependency Barrier for Unattended Schedulers
Unattended schedulers have no notion of dependencies, so when a morning data-refresh task fails silently, the noon generation task keeps running on yesterday's leftovers. This is a design for recording upstream completion atomically and having downstream assert its preconditions before running, with working TypeScript and lessons from my own operations.
Cowork2026-06-29
Failing Loud on Stale Inputs: A Freshness Contract for Unattended Pipelines
How to stop a scheduled, unattended pipeline from silently shipping degraded work when its upstream data is empty or stale. We implement a freshness contract in bash that asserts recency, non-emptiness, and provenance, plus two real pitfalls I hit running Cowork scheduled tasks.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links