Propose, never silently activate
Chat and the form create a disabled draft. Neither may approve authority, widen access, or enable execution.
First-class Scheduled Tasks let a user describe recurring agent work, review the exact task and authority, test it in a fresh session, enable it, inspect durable results, repair denied access, and pause it—without turning OpenWork into a general workflow platform.
OpenWork owns scheduling, authority, persistence, claims, receipts, and user experience. The agent engine is a replaceable execution adapter that receives only the reviewed request.
Chat and the form create a disabled draft. Neither may approve authority, widen access, or enable execution.
One immutable task revision and one immutable grant revision are bound to every unattended run.
Every attempt creates a fresh session, durable receipt, timeline, bounded usage, and verified artifact references.
Exact prompt, workspace, schedule, timezone, model, timeout.
Disabled draft with five-occurrence preview.
Roots, capabilities, filesystem, ceiling, fixed denials.
Atomic occurrence identity, no overlap, bounded retry.
Normalized status, cancellation, artifacts, honest terminal outcome.
Every frame below came from the real Hub-isolated Electron app against the exact revision above. Select any image to inspect it at full resolution.

Honest empty state, creation entry, and running-app limitation.

Name, description, self-contained prompt, frequency, timezone, and disabled-save semantics.

Five server-calculated occurrences plus provider, model, agent, timeout, overlap, missed-run, retry, and safety policy.

The visible receipt is disabled, review-required, and cannot carry an authority grant.

Prompt, daily wall-clock schedule, timezone, next five, workspace defaults, timeout, and edit/duplicate/delete controls.

Editing explicitly warns that the new draft must be reviewed again before unattended work.

Workspace roots, capability IDs, action classes, read/write scope, reviewer, and fixed denials are independently visible.

The exact read/write grant is durable and revocable; communication, destructive action, and self-modification remain denied.

Manual trigger, live status, revision binding, claimed timeline, bounded usage, and Cancel run.

Terminal status, duration, attempts, task/grant revisions, session link, artifact, and claimed/started/completed times.

The receipt opens the exact fresh session; there is no separate automation transcript system.

After review, Enable produces a precise next run while Run once and Pause remain available.

The due boundary creates one scheduled run in a fresh session; repeating the same tick creates no duplicate.

The persistent notification center offers a direct View action back to the task.

Definition, grant, receipts, next occurrence, and idempotency state survive restart without replay.

Cards summarize state, schedule, next run, latest outcome, Open action, and the running-app limitation.

A write attempted under read-only authority becomes repairable needs-attention instead of borrowing interactive approval.

The owner receives an attention notification with a direct View path.

The owner restores exact write capability and filesystem scope before Resume becomes available.

The task returns to Enabled and receives a newly calculated next occurrence.

After pause, advancing to a genuinely due occurrence does not claim a run; Run once and Resume remain explicit.

The overview moves it to Drafts and recent while preserving schedule, latest run, and limitation.
The primary journey proves the critical transitions. The complete product contract also defines the non-happy-path states and recovery behavior below.
| State | What the user sees | Allowed recovery / action | Evidence |
|---|---|---|---|
| Loading | Dedicated loading copy while capabilities, list, or detail resolve. | Wait; no unsafe optimistic controls. | UI contract |
| Unavailable | Server upgrade/restart or connection guidance when Scheduled Tasks are unsupported. | Reconnect, upgrade, or restart the owning server. | UI contract |
| Inaccessible workspace | Honest workspace access error; no execution. | Restore workspace/connection access. | Server + UI contract |
| Empty | Natural creation entry and running-app limitation. | New Scheduled Task or chat proposal. | Frame 01 |
| Draft / disabled | Exact definition, five occurrences, Run once/Enable disabled until grant review. | Edit, duplicate, delete, review authority. | Frames 04–07 |
| Stale / review required | An edit made elsewhere or a new revision invalidates prior review. | Refresh, inspect latest revision, review again. | Revision contract |
| Reviewed / ready | Reviewed grant badge; task remains disabled. | Run once, enable, revoke authority. | Frame 08 |
| Enabled / upcoming | Precise next run, schedule preview, Pause and Run once. | Wait, test manually, edit, pause, revoke. | Frames 12, 16 |
| Queued / running / retrying | Trigger, live status, attempt count, bounded usage, revision binding, timeline, Cancel run. | Cancel; scheduler prevents overlap. | Frame 09 |
| Needs attention | Task-level alert, run receipt error, notification, no inherited approval. | Repair workspace/capability/grant, review, Resume—or Pause. | Frames 17–20 |
| Paused | No next run is claimed; Run once and Resume remain explicit. | Resume after review or keep paused. | Frames 21–22 |
| Completed | Duration, attempts, bounded usage, revision and idempotency binding, session, artifact, timeline. | Open session/artifact; run again. | Frames 10, 13–15 |
| Failed / cancelled / ambiguous | Typed, bounded terminal error; ambiguous outcomes remain honest. | Inspect receipt/session, repair if required, rerun intentionally. | Service + receipt contract |
| Deleted | Task leaves active UI; server history remains auditable. | Deletion requires explicit confirmation. | Control contract |
| Control | Contract | Safety consequence |
|---|---|---|
| New / chat proposal | Creates one workspace-scoped disabled draft. | Never approves or enables. |
| Preview next five | Uses the same server scheduler as real runs. | Timezone and DST behavior cannot drift from execution. |
| Edit | Saves a new immutable task revision. | Prior review cannot silently cover changed work. |
| Duplicate | Creates a separate disabled task identity. | No grant or enabled state is silently inherited. |
| Delete | Requires confirmation; removes the active task. | Run history remains auditable on the server. |
| Approve / revoke authority | Creates or revokes an immutable grant revision. | Execution rechecks the grant server-side. |
| Run once | Creates one manual occurrence and fresh session. | Uses the same reviewed revision/grant boundary as scheduled work. |
| Enable | Activates a reviewed non-manual schedule. | Separate from review; computes the next occurrence. |
| Pause / Resume | Stops or restarts future claims. | A due tick while paused creates no run. |
| Cancel run | Requests cancellation through the execution adapter. | Outcome is retained honestly if engine termination is ambiguous. |
| Open session / artifact | Resolves the exact receipt-bound result. | Artifacts are run-scoped and canonical-path contained. |
The feature is intentionally narrower than a workflow engine. Its useful power comes from explicit, durable boundaries rather than broad unattended permission.
OpenWork does not create a parallel transcript system. The receipt is an audit index into normal OpenWork sessions and artifacts.
Task revision, grant revision, scheduled occurrence, claimed time, attempt ID, idempotency key, and fresh session ID.
Final status, duration, bounded usage, attempt count, retry state, cancellation, attention, typed error, or honest ambiguity.
Exact session link, downloadable receipt-verified file references, live timeline, and persistent completion/failure/attention notifications.
The complete coded journey passed on the final revision. This remains a draft because the requester has not manually confirmed the behavior.
319e15bd394a3d2fea4d548ecd4f1f951d703df5.The change is additive and deliberately avoids irreversible ownership or platform promises.
Feature-local openwork_scheduled_task_* tables are added to the existing runtime SQLite database. Existing workspace/session data is not rewritten.
Reverting removes route/scheduler/UI registration while leaving records intact for a future compatible build. No destructive down migration runs automatically; operational rollback should preserve runtime.sqlite.
No general workflow graph, arbitrary code DSL, webhook/event/file/email triggers, multi-agent DAG, template marketplace, cloud scheduler, OS background service, closed-app execution, organization-wide automation administration, or automatically authorized external communication.
Strings use a complete English fallback across locale bundles; native translations are follow-up work.