Source Intelligence
Sweep 28 Aug 2026 · 00:00Z Build v2.1.250 478 read Stable v2.1.236 Latest v2.1.250 Next v2.1.251 Feeds RSS JSON llms.txt
Reading a new release v2.1.251 Analysing changes · 2/5 Writing the entries · 2/4 steps 470 findings $18.91 so far

DisclaimerUnofficial, and not affiliated with Anthropic. Nearly all of this is read straight out of what ships: npm bundles, captured prompts, published docs. Anthropic's own notes go in verbatim, marked as theirs. The rest is my reading, and every entry carries the strings behind it. If one looks wrong, vote it down and say why.

Prompt capture

Monitor tool description

27 model strings share this prompt, byte for byte.

v2.1.238 71 lines 6132 chars sha256 abcbc10e2b81 Plain text Whole capture

1Start a background monitor that streams events from a long-running script. Each stdout line is an event — you keep working and notifications arrive in the chat. Events arrive on their own schedule and are not replies from the user, even if one lands while you're waiting for the user to answer a question.
3Pick by how many notifications you need:
4- **One** ("tell me when the server is ready / the build finishes") → use **Bash with `run_in_background`** and a command that exits when the condition is true, e.g. `until grep -q "Ready in" dev.log; do sleep 0.5; done`. You get a single completion notification when it exits.
5- **One per occurrence, indefinitely** ("tell me every time an ERROR line appears") → Monitor with an unbounded command (`tail -f`, `inotifywait -m`, `while true`).
6- **One per occurrence, until a known end** ("emit each CI step result, stop when the run completes") → Monitor with a command that emits lines and then exits.
8Your script's stdout is the event stream. Each line becomes a notification. Exit ends the watch.
10 # Each matching log line is an event
11 tail -f /var/log/app.log | grep --line-buffered "ERROR"
13 # Each file change is an event
14 inotifywait -m --format '%e %f' /watched/dir
16 # Poll GitHub for new PR comments and emit one line per new comment
17 last=$(date -u +%Y-%m-%dT%H:%M:%SZ)
18 while true; do
19 now=$(date -u +%Y-%m-%dT%H:%M:%SZ)
20 gh api "repos/owner/repo/issues/123/comments?since=$last" --jq '.[] | "\(.user.login): \(.body)"'
21 last=$now; sleep 30
22 done
24 # Node script that emits events as they arrive (e.g. WebSocket listener)
25 node watch-for-events.js
27 # Per-occurrence with a natural end: emit each CI check as it lands, exit when the run completes
28 prev=""
29 while true; do
30 s=$(gh pr checks 123 --json name,bucket)
31 cur=$(jq -r '.[] | select(.bucket!="pending") | "\(.name): \(.bucket)"' <<<"$s" | sort)
32 comm -13 <(echo "$prev") <(echo "$cur")
33 prev=$cur
34 jq -e 'all(.bucket!="pending")' <<<"$s" >/dev/null && break
35 sleep 30
36 done
38**Don't use an unbounded command for a single notification.** `tail -f`, `inotifywait -m`, and `while true` never exit on their own, so the monitor stays armed until timeout even after the event has fired. For "tell me when X is ready," use Bash `run_in_background` with an `until` loop instead (one notification, ends in seconds). Note that `tail -f log | grep -m 1 ...` does *not* fix this: if the log goes quiet after the match, `tail` never receives SIGPIPE and the pipeline hangs anyway.
40**Script quality:**
41- Every pipe stage must flush per line or matches sit in its buffer unseen: `grep` needs `--line-buffered`, `awk` needs `fflush()`. `head` cannot flush at all — `| head -N` delivers nothing until N matches accumulate, then ends the stream.
42- In poll loops, handle transient failures (`curl ... || true`) — one failed request shouldn't kill the monitor.
43- Poll intervals: 30s+ for remote APIs (rate limits), 0.5-1s for local checks.
44- Write a specific `description` — it appears in every notification ("errors in deploy.log" not "watching logs").
45- Only stdout is the event stream. Stderr goes to the output file (readable via Read) but does not trigger notifications — for a command you run directly (e.g. `python train.py 2>&1 | grep --line-buffered ...`), merge stderr with `2>&1` so its failures reach your filter. (No effect on `tail -f` of an existing log — that file only contains what its writer redirected.)
47**Coverage — silence is not success.** When watching a job or process for an outcome, your filter must match every terminal state, not just the happy path. A monitor that greps only for the success marker stays silent through a crashloop, a hung process, or an unexpected exit — and silence looks identical to "still running." Before arming, ask: *if this process crashed right now, would my filter emit anything?* If not, widen it.
49 # Wrong — silent on crash, hang, or any non-success exit
50 tail -f run.log | grep --line-buffered "elapsed_steps="
52 # Right — one alternation covering progress + the failure signatures you'd act on
53 tail -f run.log | grep -E --line-buffered "elapsed_steps=|Traceback|Error|FAILED|assert|Killed|OOM"
55For poll loops checking job state, emit on every terminal status (`succeeded|failed|cancelled|timeout`), not just success. If you cannot confidently enumerate the failure signatures, broaden the grep alternation rather than narrow it — some extra noise is better than missing a crashloop.
57**Output volume**: Every stdout line is a conversation message, so the filter should be selective — but selective means "the lines you'd act on," not "only good news." Never pipe raw logs; filter to exactly the success and failure signals you care about. Monitors that produce too many events are automatically stopped; restart with a tighter filter if this happens.
59Stdout lines within 200ms are batched into a single notification, so multiline output from a single event groups naturally.
61The script runs in the same shell environment as Bash. Exit ends the watch (exit code is reported). Timeout → killed. Set `persistent: true` for session-length watches (PR monitoring, log tails) — the monitor runs until you call TaskStop or the session ends. Use TaskStop to cancel early.
62**ws source** — open a WebSocket and stream each incoming text frame as an event. No shell, no polling: the server pushes, you get notified.
64 Monitor({
65 ws: {url: 'wss://events.example.com/stream', protocols: ['v1']},
66 description: 'deploy events',
67 })
69Each text frame becomes one notification (multiline frames stay as one event). Binary frames are reported as `[binary frame, N bytes]` rather than passed through. Socket close ends the watch with the close code surfaced; errors are surfaced before close. Same rate limiting as bash — a firehose will be suppressed and eventually stopped, so subscribe to a filtered feed where one exists.
71Prefer this over `command: 'websocat wss://…'` — it avoids the extra process and line-buffering pitfalls. Use bash when you need to transform or filter frames with shell tools before they become events.