Skip to content

feat(web,mobile): one scheduled-task list and editor for agents and threads - #226

Merged
jayleaton merged 3 commits into
mainfrom
feat/schedules-ui-20261113
Nov 13, 2026
Merged

jayleaton merged 3 commits into
mainfrom
feat/schedules-ui-20261113

Conversation

@jayleaton

@jayleaton jayleaton commented Nov 13, 2026 •

Copy link
Copy Markdown
Owner

Stacked on #224, which is stacked on #222.

Scheduled tasks had two web UIs. Settings → Scheduled tasks listed every task, but editing an agent task hid the agent and showed its cron as read-only ("Edit it from the Agents board"). Agents → Scheduled had a second list and editor that only knew about agent tasks. Mobile had no way to pick an agent or edit a cron. At phone width, #222's Active/Archived toggle also overlapped the heading.

This PR makes one list and one editor, per the design's UI unification section:

  • One list. Settings and Agents → Scheduled now render the same list. Agents → Scheduled opens with the Agents filter selected. ScheduledTaskEditor.tsx and ScheduledTasksPanel.tsx are deleted.
  • Filter. All / Agents / Threads / New thread / Archived replaces the Active/Archived toggle. The filter is scheduledTaskMatchesFilter in client-runtime/scheduled-task-archive, built on the new contracts helper scheduledTaskTarget, and web and mobile share it. Archived keeps its reason, its "Deletes on" date and Restore. At 390px the filter wraps onto its own row.
  • Editor. Destination gains An agent's thread with an agent picker. Saving routes through the agent's model and modes, as the old agent editor did. An existing task keeps its model and thread while its agent is unchanged, and moving a task off an agent clears the agent. The read-only "Current" cron mode is replaced by a real Cron mode with presets, time, day and time zone. Cron schedules are now described in plain words in the list.
  • Entry points.
    • The agent tile's Schedule opens the shared editor with that agent filled in.
    • The thread details Automations section gets a + that opens the editor bound to that thread. As before, the section only shows once the thread has a task.
    • The Agents route's mutation controls follow permissionAtom, because it now uses the Settings list.
    • Webhook tasks no longer offer Run now there.
  • Mobile gets the same filter (as a menu chip, since five segments don't fit a phone), an Agent destination with an agent picker, and an editable Cron mode.
  • The cron helpers move to client-runtime/scheduled-task-cron so both clients can use them, and isoToLocalInput and localInputToIso are removed as unused.

Captures (web dev client, real seeded data)

Before After
Settings list, light Unified list with filter and agent badges
Archived toggle Archived filter with Restore
Agents → Scheduled, its own list, dark Same list, Agents preselected, dark
Settings editor on an agent task: no agent Agent picker
Cron read-only ("Current") Editable cron
390px: toggle overlaps heading 390px: filter wraps
Old agent editor Thread Automations + → bound editor

The red "Doug can't run here" line in the agent-picker capture is real: that agent's profile doesn't list this dev environment. The old editor showed the same thing.

Mobile has no captures yet. Its simulator pass is still to come. It typechecks and its tests pass.

Verification

  • vp test run on the touched files gives 87 passed across 6 files. These include ScheduledTasksSettings.browser.test.tsx and ThreadAutomationsPanel.permissions.browser.test.tsx, plus the logic tests in client-runtime, web settings and mobile.
  • vp run typecheck in apps/mobile reports 0 errors.
  • vp run check:changed: all pass (format, lint, knip ×2, typecheck of 41 packages, 30 test files, React compiler).

Implemented by Claude Opus 5.5 in Claude Code (T3 Code).

🤖 Generated with Claude Code

@github-actions github-actions Bot added the vouch:trusted Author is trusted by repo permissions or the VOUCHED list. label Nov 13, 2026
@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 21.5 KiB 21.5 KiB 0 B (0.0%) 24.4 KiB ✅
Codex Live turn messages 1 1 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.9 KiB 21.9 KiB 0 B (0.0%) 24.4 KiB ✅
Claude Live turn messages 1 1 0 (0.0%) 8 ✅

Baseline: aa65f1b · PR result: 5c42bc7 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@jayleaton jayleaton added the agent-context-increase Approves a measured increase to the agent context budget label Nov 13, 2026
@jayleaton
jayleaton marked this pull request as ready for review November 13, 2026 03:42

@jayleaton jayleaton left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT #226: CHANGES

Confirmed the inline finding with a deterministic service test. Reviewed head 35158bb.

Repository checks against #224 passed apart from the missing local Chromium executable; the 2 browser files subsequently passed (11 tests). The other 6 test files passed (87 tests). Format, lint, knip, typecheck and React compiler checks passed. Real web create/list verified at 390px; native mobile could not be exercised because no simulator/emulator host is available. The budget failure is inherited from #224; the fingerprint check now passes.

@jayleaton
jayleaton force-pushed the feat/schedules-mcp-20261113 branch from a8bd85b to e7d0f17 Compare November 13, 2026 05:28
@jayleaton
jayleaton force-pushed the feat/schedules-ui-20261113 branch from 35158bb to 6d40a19 Compare November 13, 2026 05:32
@jayleaton

Copy link
Copy Markdown
Owner Author

Fixed in 6d40a19: rebased on #224, and leaving an agent with no thread chosen now clears the agent's old thread.

@jayleaton jayleaton left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT #226: MERGE

Reviewed 6d40a19 against e7d0f17. check:changed passes: formatting, lint, both knip passes, GraphQL, 41-package typecheck, 14 focused test files (196 tests), and React compiler checks.

The server clears the old binding only when profileId and threadId are explicitly null while leaving an existing agent. Omitted fields retain legacy behavior, and the same path handles Continue and Fresh session. The extended profile-service regression fails before the fix (the old agent thread is retained) and passes afterward, including a fresh non-agent launch instead of sending to the old conversation.

This layer passes review independently. The stack remains blocked by the new cleanup-reservation finding on #222.

@jayleaton
jayleaton force-pushed the feat/schedules-mcp-20261113 branch from e7d0f17 to b4cce2f Compare November 13, 2026 06:08
@jayleaton
jayleaton force-pushed the feat/schedules-ui-20261113 branch from 6d40a19 to 8a47c72 Compare November 13, 2026 06:08
@jayleaton
jayleaton force-pushed the feat/schedules-mcp-20261113 branch from b4cce2f to e3fbc4e Compare November 13, 2026 06:27
@jayleaton
jayleaton force-pushed the feat/schedules-ui-20261113 branch from 8a47c72 to d3303ea Compare November 13, 2026 06:27
@jayleaton
jayleaton changed the base branch from feat/schedules-mcp-20261113 to main November 13, 2026 06:39
jayleaton and others added 3 commits November 13, 2026 13:40
…hreads

Settings and Agents → Scheduled now share one list with an All / Agents /
Threads / New thread / Archived filter and one editor that can pick an
agent and edit cron schedules. Mobile gets the same filter, agent
destination and cron editing. The thread Automations section can start a
task bound to that thread.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…task

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moving an agent task to Continue or Fresh session with no thread chosen sent
profileId: null and threadId: null, and the save coalesced the null back to
the agent's thread. Later runs then went into that conversation with its
model and modes. Leaving an agent with an explicit null thread now clears the
binding; an omitted threadId still keeps it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jayleaton
jayleaton force-pushed the feat/schedules-ui-20261113 branch from d3303ea to 5c42bc7 Compare November 13, 2026 06:43
@jayleaton
jayleaton merged commit 97f71b5 into main Nov 13, 2026
29 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent-context-increase Approves a measured increase to the agent context budget size:XXL vouch:trusted Author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant