[BUG] Scheduled-task sessions stopped auto-connecting to Remote Control on 3 Sept — the "Connect new sessions" preference does not cover them
Summary
Since 3 September 2026, sessions spawned by the desktop app's built-in scheduler are never connected to Remote Control. Interactive sessions on the same machine, same folder, same preference still connect normally. The global Settings → Claude Code → Local sessions → "Connect new sessions to Remote Control" toggle is ON and has never been off.
The practical effect is that the only session type a user cannot reach by any other means — one that fires at 4am while they are asleep — is now the one session type excluded from automatic reachability. A session you start yourself is one you are already looking at.
This is the same regression @jkap-el described in a comment on #91839 (2026-09-03), independently, on a different Windows machine. That report is currently buried as a comment on a macOS sidebar-rendering issue. Filing it properly so it can be tracked, and adding the policy-gate mechanism and a longer before/after window.
The mechanism
The app's own policy gate, from the shipped bundle:
shouldEvaluateRemoteControlPolicy(e){
return (this.remoteControlPolicyCovers(e) || !!e.remoteControlUserRequested)
&& !e.remoteControlEnabled && !e.remoteControlUserToggled && !e.remoteControlAutoInFlight
}
remoteControlPolicyCovers(e){ return !!e.remoteControlAutoEligible && !e.scheduledTaskId }
&& !e.scheduledTaskId excludes any session belonging to a scheduled task. And maybeAutoEnableRemoteControl opens with if(...||!this.shouldEvaluateRemoteControlPolicy(e))return; — it returns before the [rcAutoEnable] verdict: line is logged.
That detail matters for anyone reproducing this: you do not get a "no" in the log, you get silence. There is no verdict line at all. The only surviving path is the || !!e.remoteControlUserRequested branch, i.e. the user asking for it by hand.
Evidence
Count of [rcAutoEnable] verdict: lines in %LOCALAPPDATA%\Claude\Logs\main.log, one machine, about a dozen recurring scheduled tasks:
| Date | Verdicts | Trigger | Bundled CLI |
|---|---|---|---|
| 29 Aug | 3 | all enable=true source=explicit_pref trigger=first_turn | 2.1.246 |
| 30 Aug | 13 | same | 2.1.246 → 2.1.247 |
| 31 Aug | 17 | same | 2.1.247 |
| 1 Sept | 11 | same | 2.1.247 |
| 2 Sept | 13 | same (last one 23:06:00) | 2.1.247 → 2.1.255 |
| 3 Sept | 0 | — | 2.1.258 |
| 4 Sept | 0 | — | 2.1.258 |
| 5 Sept | 1 | trigger=warm_send only (user-initiated) | 2.1.258 → 2.1.260 |
57 automatic connections in the five days before, zero in the two days after, and the ones before were unattended overnight runs — 04:12, 04:36, 05:40.
Before (31 Aug, a scheduled task firing while nobody was at the machine):
04:12:31 [info] Using Claude Code binary at: ...\claude-code\2.1.247\claude.exe
04:12:31 [info] [rcAutoEnable] verdict: enable=true source=explicit_pref trigger=first_turn
04:12:31 [info] Enabling remote control for session local_<redacted>
04:12:31 [info] [CCDScheduledTasks] Confirmed task run for: <redacted>
After (this morning): a scheduled session was created at 07:01:13. No [rcAutoEnable] line, no Enabling remote control, no bridge_state. It stayed unreachable for 85 minutes. It connected only at 08:26:13, six seconds after I opened it in the desktop app by hand.
Still broken on the current build. This machine's desktop app was 1.44121.4.0 through 3–4 Sept and updated to 1.46388.3.0 at ~05:50 on 5 Sept. The behaviour is unchanged after the update.
What I could not determine
Which component carries the change. On this machine the bundled CLI went 2.1.255 → 2.1.258 at 23:53 on 2 Sept and the behaviour changed the following morning. @jkap-el attributes it to the desktop app update in the same window (1.40609.1.0 → 1.44121.2.0). Both moved; I can't separate them from the outside, and the code is full of remote feature-gate checks, so a server-side flag is also possible. Flagging this rather than asserting a cause.
Please also correct the record on #91992
#91992 asks for scheduled sessions to be opted out of Remote Control auto-enable, on the stated basis that they currently auto-enable. Per the gate above they no longer do — and the author of #91839 explicitly withdrew the remoteControlAutoEligible hypothesis that #91992 cites, in a correction comment on their own issue. #91992's underlying want is legitimate; its premise is out of date. If it is actioned as written, this regression gets cemented rather than fixed.
Ask
Both needs here are real, which is exactly why neither should be hard-coded:
- Make it a setting, not a carve-out. #77929 and #91992 want scheduled runs excluded; this report wants them included. A per-scope preference — or a per-Routine toggle in the scheduled-task editor — satisfies both. Right now one group's preference is compiled in as everyone's behaviour.
- In the meantime, treat the "Connect new sessions to Remote Control" preference as covering scheduled sessions, as it did through 2.1.255. That is what the toggle's own wording leads a user to expect.
- Log the exclusion. The early return before the verdict line makes this invisible to anyone diagnosing it. A single
[rcAutoEnable] skipped: scheduled_taskline would have saved days.
Impact worth stating plainly
PushNotification from inside a scheduled session returns "Mobile push not sent (Remote Control inactive)", so unattended workflows can no longer surface anything to a phone — matching what @jkap-el reported. And the sessions do not appear in the mobile app at all. For anyone whose scheduled tasks exist because they are away from the machine, this removes the entire point of running them.
Environment
- Windows 10 (19045), MSIX install
- Desktop app 1.44121.4.0 → 1.46388.3.0 (5 Sept); reproduces on both
- App-bundled Claude Code 2.1.258 → 2.1.260; worked on 2.1.255
- Max subscription
"Connect new sessions to Remote Control": ON.~/.claude/settings.jsonremoteControlAtStartup: true- No managed-settings override in force (see note below)
Possibly unrelated, noted in passing
Both C:\Program Files\ClaudeCode\managed-settings.json and C:\ProgramData\ClaudeCode\managed-settings.json on this machine begin with a UTF-8 BOM, and the app logs [SettingsIo] Failed to read C:\Program Files\ClaudeCode\managed-settings.json (SyntaxError) and ignores the file entirely. Since the Remote Control resolver consults managed settings and treats a read failure as settings_unavailable, I mention it for completeness — but it is not the cause here, because the failure predates 3 Sept and auto-connect worked fine throughout. A BOM-tolerant parse (or a louder error) would still be an improvement; happy to file separately if useful.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Confirming on macOS with the same timeline and the same evidence shape.
agentPushNotifEnabledandinputNeededNotifEnabledtrue.~/Library/Logs/Claude/main.log, scheduled spawns followed byEnabling remote control for sessionwithin 20 s:| Date | App version | Scheduled spawns | Got Remote Control |
|---|---|---|---|
| 28 Aug – 2 Sep | 1.40609.x | 18 | 18 |
| 3 Sep, before the 08:55 update | 1.40609.1 | 3 | 3 |
| 4 Sep | 1.46388.2 | 6 | 0 |
| 7 Sep | 1.46388.2/.4 | 6 | 0 |
| 8 Sep | 1.46388.4 | 4 | 0 |
| 9 Sep | 1.49585.0 | 8 | 0 |
Mobile push not sent (Remote Control inactive).orNot sent — this terminal is active, so your output here already reaches the user; a separate notification would be redundant.The latter is returned even with the screen locked and nobody at the machine (three controlled one-off runs on 9 Sep). Interactive sessions in the same app returnMobile push requested.and the phone receives them.Matches the
remoteControlPolicyCoversexclusion described in #92113. A per-user setting to include scheduled-task sessions in the auto-connect policy would restore the pre-3-Sep behaviour.Cause, read out of the desktop bundle (Windows 10 19045, Claude Desktop 1.46388.4, bundled CLI 2.1.260).
In
resources/app.asarthe auto-enable policy is:!e.scheduledTaskIdexcludes every session belonging to a scheduled task. BecausemaybeAutoEnableRemoteControl()returns at its first guard when this predicate is false, the[rcAutoEnable] verdict: enable=... source=... trigger=...line is never reached — so there is no verdict inmain.logand nosourceexplaining the refusal. That silence is why this looks like the engine dying rather than a policy exclusion.The only remaining route is the
|| !!e.remoteControlUserRequestedclause, which is set solely by the client-side/remote-controlcommand (alias/rc) typed into that session."Run now" does not help either. The exclusion keys on the session having a
scheduledTaskId, not on how it started, so a task with no cron and nofireAt— launched by hand from the sidebar — is excluded identically. Two examples from 8 Sep, both manual-trigger, both bridged only after the command was typed: session created 08:48:08 → bridged 09:48:17; created 10:55:06 → bridged 11:55:13.Measured here, correlating every
Enabling remote control for sessionline against the immediately precedingLocalSessions.sendMessage ... messageLength=15(/remote-controlis exactly 15 characters):| window | bridges | automatic | typed by hand |
|---|---|---|---|
| 21–28 Aug | 86 | 83 | 3 |
| 28 Aug – 7 Sep | 72 | 59 | 13 |
| 7 Sep 18:30 – 8 Sep 12:00 | 13 | 0 | 13 |
[rcAutoEnable] verdict:lines withtrigger=first_turn: 53 across 30 Aug – 2 Sep, then none.Also worth flagging: typing
/remote-controlinto a session with no active query logs[warn] Cannot toggle remote control for <id>: no active queryand silently does nothing, so the workaround often takes two attempts.If the exclusion is deliberate, the ask is narrower: say so in the setting's description, emit
enable=false source=scheduled_taskrather than returning before the log point, and offer an opt-in for users who own both ends.Still present on Desktop 1.52386.6.0 (bundle built 13 Sep) with bundled CLI 2.1.270 — two app releases beyond the 1.49585.0 in the comment above, and unchanged in both code and behaviour.
The predicate is byte-for-byte identical in the current bundle:
Behaviour today (14 Sep), one Windows machine, "Connect new sessions to Remote Control" ON throughout:
[rcAutoEnable]verdict line for any of them, as expected from the early return.Enabling remote control for sessionlines in the entire day aresource=user_intent trigger=cold_resume— sessions that had been bridged by hand on an earlier day re-attaching on resume. None of them is a newly spawned session being covered by the preference.So the count of automatic connections for newly spawned scheduled sessions is still 0, now 12 days and several releases after 3 Sep.
One behaviour worth documenting for anyone else hitting this, since it is not obvious and it changes what the workaround is worth:
remoteControlUserRequestedpersists on the session once set. A session bridged by hand once will re-bridge itself automatically on later resumes, loggingsource=user_intent. That is why a machine can show a handful of bridged sessions while still having nothing new connect — those are old sessions re-attaching, not the preference working.Two consequences:
Enabling remote controllines alone suggests auto-connect is alive; separatingsource=user_intent(an old session resuming) fromsource=explicit_pref trigger=first_turn(the preference actually applying) is what shows the latter has not fired since 2 Sep.Also confirming the earlier note about the
no active querypath, since it bears on how much the workaround is actually worth. Typing the command into a session with no live query logsCannot toggle remote control for <id>: no active queryand does nothing.The
!e.querybranch in the bundle does contain an assignment settingremoteControlUserRequested, so it looks at first read as though the request is latched and will take effect on the session's next turn. It is not: that assignment sits behind a guard chain the plain user-typed command does not satisfy. Observed here on 8 Sep — a session warnedno active queryat 11:44:17, cold-resumed on a real message at 11:45:25 producing nosource=user_intentverdict, and bridged only after the command was typed a second time at 11:45:28.So nothing is deferred, and on a scheduled session that has already finished its turn the workaround fails silently on the first attempt.