Repository navigation
Document scheduling Passes on macOS with a LaunchAgent - #1509
Merged
Merged
Conversation
cron jobs on macOS run outside the login session and can't read the Keychain logins of gh and claude, so passes fail with GitHub's unauthenticated rate limit. Show a LaunchAgent for a Pickup run, with the launchctl commands, and point the Pickup schedule section to it.
Point the Pickup section to the note rather than repeating it, keep only what differs from cron in the PATH and log bullets, link the lock, name Claude Code, and write > bare in the plist since XML allows it.
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Guide only. A new macOS subsection under On a schedule explains why a Pass started by cron on a Mac fails:
ghand Claude Code keep their logins in the macOS Keychain, and a cron job runs outside the login session, so it can't read them. The subsection gives a LaunchAgent to use instead.site/docs/index.htmlis regenerated from the guide.The hand-written site pages were checked and left unchanged, because none of them describes scheduling with cron only:
site/how-it-works/"Scheduled work" says "your operating system's scheduler".site/architecture/already says "cron or launchd starts Passes".site/index.htmlsays only that the operating system schedules Passes.Evidence
API rate limit exceeded,KeychainorLaunchAgentfound nothing.rg -n "API rate limit exceeded|Keychain|LaunchAgent" docs/guide.mdfinds the new subsection.plutilisn't available. The example was taken out of the guide and checked three ways instead:plistlib.loadparses it, with all five keys.xmllint --nooutpasses.bash -npasses on the decoded-cstring,cd /Users/you/repos/widgets && thirdshift pickup base main >> /Users/you/.thirdshift/logs/cron.log 2>&1.scripts/affected-tests origin/mainpasses:npm test --prefix site,cargo test --test share_card --test site_deployandcargo test --bin thirdshift prompts_page.cd site && npm run docs:checkpasses.Merge Danger
Door: two-way. It changes documentation only.
Blast Radius: docs. Only
docs/guide.mdand the generated/docs/page change.Review
The Standards axis raised 7 findings, all judgement calls on prose. All 7 were addressed:
PATHand log bullets keep only what differs from cron;cron.logname is explained.The Spec axis raised 3. The
>wording nit was fixed: the plist now writes>bare, which XML allows, and the bullet says only&must be escaped.Review coverage: every changed file was read. The Standards reviewer covered
site/docs/index.htmlas confirmed generated output: it is generated fromdocs/guide.md,npm run docs:checkpasses, and the reviewer inspected its escaping and anchors in the diff. The Spec reviewer read it.Unaddressed findings
Standards: none.
Security: none. The change is documentation only:
docs/guide.mdand the generatedsite/docs/index.html, whose new HTML is fully escaped. The example plist and commands run only as the user who installs them, the sample IP is from the 203.0.113.0/24 documentation range, and the paths are placeholders. No trust boundary is touched, so no proof-of-concept test applies.Spec:
StartInterval300) and a nightlyStartCalendarInterval, where the spec asks for "a complete example plist for a Pickup run". Kept: the subsection sits in On a schedule, which is about Architect runs, and its line "Write one LaunchAgent per line you would have put in a crontab" needs the Architect and nightly equivalents to be complete. The reviewer recommended keeping it.RunAtLoadat login,mkdir -p ~/.thirdshift/logs, and Homebrew's/opt/homebrew/bininPATH. Kept: each is something a reader needs for the example to work, it mirrors the existing cron bullets, and the reviewer judged all of them accurate.Closes #1501
Built with claude 2.1.312 · claude-opus-5-5 · high
Security review outcome
No unaddressed introduced findings.