First live run on PR #126 left the foreground shell stuck: Claude pushed the
commit itself and then did not exit, so the supervisor code after it (push +
ack + handled marker) never ran. Under cron that also holds the flock lock,
freezing every later run, and the comment never gets marked handled (so it
would be re-processed forever).
- Wrap the Claude invocation in `setsid timeout -k 30s "$CLAUDE_TIMEOUT"`
(default 30m). `setsid` detaches from the controlling terminal so a lingering
child can't stick an interactive run; `timeout` returns control to the
supervisor, which still pushes any commits (idempotent if Claude pushed) and
writes the handled marker. A timed-out run (rc=124) is logged, not fatal.
- Give this watcher its own dev port (devPort, default 3101) distinct from the
issue watcher's 3100, and reap it after each run -- no cross-watcher kill.
- Reinforce the prompt: stop any dev server and END THE TURN; never push.
Adds claudeTimeout + devPort to the example config and documents both.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sibling to claude-issue-watcher.sh: polls open Claude-raised PRs (head
branch under claude/, or labelled claude-pr) for review comments carrying
the marker `claude-review:` — in the PR conversation, review summaries, or
inline on-file comments — and runs headless Claude Code on the PR's own
branch to address them, pushing the follow-up commit(s) to the same branch.
- Authorization gate: only repo collaborators (write access) + the owner can
trigger it; the bot's own comments are ignored.
- Idempotent: handled comments are tracked by a hidden marker on the bot's
acknowledgements, so the 10-min poll never redoes a comment.
- Own clone (~/pelagia-pr-review), config, and lock so it never races the
issue watcher. Token needs write:repository + write:issue.
Adds the script, an example config, .gitignore entries for the live
config/lock, and an automation/README.md section with deploy + cron steps.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>