Skip to content

[Feature] Unified automation & loop: one scheduled-task primitive #950

@Astro-Han

Description

@Astro-Han

What task are you trying to do?

I want PawWork to run a chat on its own, without me sitting and driving every run:

  • On a schedule — "every morning at 9, summarize today's email into a brief."
  • Repeatedly until something is true — "keep fixing the code until the tests pass."
  • Once, later — "remind me / check back on this in 10 minutes."

Today none of this is possible. Every run is manual and in-session.

Which area would this change affect?

App flow or product behavior (primary). Also touches model harness / tools / session mechanics, since the same capability is exposed to the agent as a single tool and runs inside the engine.

What do you do today?

Nothing — there is no scheduling or looping. I have to be present, type the prompt, and watch each run. Confirmed in code: there is no scheduling/background infrastructure at all (packages/opencode/src/cli/cmd/serve.ts is a passive HTTP server that just waits forever; no cron, interval, or detached-run primitives anywhere).

What would a good result look like?

One unified "Automation" concept — not three separate tools (Loop / Schedule / Reminder). It is modeled in two layers: an Automation (the rule: a tagged union of one-shot vs recurring) and an AutomationRun (the record of each execution). The rule's orthogonal knobs:

  • Trigger rhythm — one-shot time · interval-after-completion (loop) · cron (automation)
  • Prompt — what to do
  • Continue vs fresh — continue the automation's own ongoing session, or start a new empty one (never pollutes your main chat)
  • Stop condition — count / condition / never (recurring only)
  • Where it runs — which project (and, for fresh runs, optionally an isolated worktree)

The same object is created by the user (natural language, or a manual form) and by the agent itself (self-scheduling, e.g. "I'll check back in 10 minutes"). One tool, so the agent never has to choose between overlapping primitives.

It runs locally while PawWork is open. When an unattended run hits a permission prompt, it parks and shows the existing pending marker in the sidebar; I approve when I return.

What would count as done?

  • I can say "every day at 9am, summarize today's email" in chat → an Automation is created and shown back on a confirmation card that echoes the parsed fields.
  • I can create the same Automation via a manual form (title, prompt, project, schedule) and from a template.
  • An "Automations" section in the sidebar lists my automations; I can view, edit, pause, delete, Run now, and review each run's history (including skipped runs and why).
  • A recurring automation fires on schedule while the app is open; results land in a new empty session (fresh) or its own ongoing session (continue) — never in my main chat — following the continue/fresh knob.
  • A loop-style automation ("keep doing X until Y") repeats and stops when its condition is met (with hard ceilings as a backstop).
  • The agent can schedule its own follow-up run from within a conversation, using the same single tool.
  • When an unattended run needs approval, the session parks, the sidebar shows the pending marker, and approving it resumes the run.
  • Automations run under the existing permission framework (allow / deny / ask + autoAccept); the scheduler adds no separate permission system.

What should stay out of scope?

  • No cloud execution / "runs while the app is closed" — local, app-open only in v1.
  • No separate permission system inside the scheduler — reuse the existing one.
  • No catch-up for missed runs — if the app/machine wasn't up at the trigger time, that fire is skipped (recorded with a reason); use Run now to trigger it manually.
  • No auto-pause on repeated failure — failures are made visible (run history + consecutive-failure count + notification), not silently paused.
  • No cross-restart persistence of pending approvals in v1 (in-memory; lost on app restart).

Which audience does this matter to most?

Both.

Extra context

Reference: OpenAI Codex Automations — adopt its UI shell (sidebar "Automations" entry, create-via-chat / create-manually toggle, templates such as Daily brief / Weekly review / Project monitor, a friendly schedule picker, an explicit project selector, and a per-task worktree toggle), and extend it with the two loop knobs Codex lacks: continue-vs-fresh context and a stop condition.

Full design doc, the architecture-review revisions, competitor comparison, and codebase grounding are in the first comment.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P1High priorityappApplication behavior and product flowsenhancementNew feature or requestharnessModel harness, prompts, tool descriptions, and session mechanics

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions