| name | reschedule |
| description | Use when today has slipped and the user wants to recompute the rest of the day — "reschedule", "I'm behind", "move my blocks", "things slipped", "shift my plan", "recompute from now". Recomputes today's remaining blocks from the current time around the remaining commitments. Never silently drops a must. |
Reschedule today
Recompute the rest of today from where things actually are. Same packer, same
rules as butler:plan; the difference is now = the current time, so placement
starts from this moment, and only today's remaining chunks are considered.
Config
Read ${CLAUDE_PLUGIN_DATA}/config.yaml (your global config; if absent, run /butler:setup), then run the config preflight (references/template.md → Config preflight; migrate if behind, error if ahead). Resolve TickTick names → ids at runtime.
Load deferred MCP tools (TickTick, Google Calendar) with tool_search.
Core rules
- From now. Placement never starts before the current time.
- Schedule only today. Don't spill into tomorrow's blocks; overflow cascades to unscheduled-for-later, surfaced explicitly.
- Work only in the packer. Only WORK blocks are repacked from now. PERSONAL items keep their reminders (adjust a time only if the user asks); they never enter the packer. A chunk with no context is work.
- Never silently drop a must. A must that can't fit surfaces as overflow with a warning.
- Confirm before moving blocks.
- Never duplicate. Reschedule only MOVES existing blocks — it never creates a task that already exists, and recurring habits already fire on their own (don't re-add them).
Procedure
Conduct the interview per `references/interview.md` → Reschedule (honor each question's
[choice]/[open] tag — see → Presentation): "anything new today?" and "drop a passed block?"
are [choice]; "what's done / left" stays prose.
- [ ] 1. Establish "now" and what's done vs left today (ask briefly).
- [ ] 2. Re-read today's remaining WORK chunks from TickTick (scheduled-but-not-done).
Note any personal reminders still ahead today — these are kept as-is, not repacked.
- [ ] 3. Re-read the remaining fixed commitments (those after now) the same way `plan` does:
a connected Google Calendar MCP, reading the calendars named in `config.yaml`
`calendar.calendars` (default primary); no MCP → run calendar-blind but state it.
- [ ] 4. Build packer input with now = current time (schemas/packer-input.schema.json) from
the WORK chunks only, then run: python3 ${CLAUDE_PLUGIN_ROOT}/scripts/pack_schedule.py input.json
Review scheduled / overflow / summary.warnings. Do NOT rewrite est0 — it is immutable.
Handle a slipped block non-punitively (references/accommodations.md → non-punitive,
flexibility-with-spine): re-surface it as a neutral event, and where one won't fit,
OFFER a graded smaller version ("the 15-minute version") instead of dropping it — there
is always a non-zero option. No blame language.
- [ ] 5. On confirmation, update today's WORK blocks in TickTick (batch_update_tasks for moves):
new startDate/dueDate; keep tags, parentId, est0, focusSummaries intact. Leave personal
reminders untouched unless the user asked to shift one (then just move its due/reminder).
- [ ] 6. State the next physical action from now.
References
${CLAUDE_PLUGIN_ROOT}/references/heuristics.md — Time-blocking, Reconciliation.
${CLAUDE_PLUGIN_ROOT}/references/template.md — field mappings + packer I/O.
${CLAUDE_PLUGIN_ROOT}/references/interview.md — Reschedule.
${CLAUDE_PLUGIN_ROOT}/references/accommodations.md — how butler speaks to a user under EF load; apply at miss-handling, selection, next-action, and tone. Single source, don't restate.
${CLAUDE_PLUGIN_ROOT}/schemas/ — packer I/O schema.