Skip to content

Batch 20: Scheduled actions - #36

Merged
sixvolts merged 1 commit into
mainfrom
ci/fix-20-scheduled
Sep 28, 2026
Merged

sixvolts merged 1 commit into
mainfrom
ci/fix-20-scheduled

Conversation

@sixvolts

@sixvolts sixvolts commented Sep 28, 2026 •

Copy link
Copy Markdown
Owner

Stacked on ci/fix-19-skills (PR 15 of 16 precedes it). Merge with "Create a merge commit" (squash or rebase would re-mint untested commits), one PR at a time, bottom-up. GitHub retargets this PR when the one below it merges and its branch is deleted.

fix(scheduled): runs end when they should, failures count, actions don't trigger each other

  • An action's timeout cuts its turn; a cut-off reply is a timeout and
    isn't delivered.
  • Success counts real destinations (notify, log and none count only on
    their own).
  • The breaker notice goes to a person first, never to "none".
  • Deliverer panics are contained; the ledger is stamped once.
  • A disabled action's scheduled fire skips (skipped_disabled); Reload is
    serialized.
  • Stored output is cut on rune boundaries.
  • page_saved actions stop when the owner leaves the watched book; a save
    made by an action's own delivery triggers no action; event payloads
    are treated as data, as are webhook run outputs returned by
    recent_scheduled_runs.
  • Enabling validates the action; min_interval_seconds 0 is kept;
    switching an action to "run as you" requires confirm_envelope.
  • The panel keeps a stored shard envelope it can't list, resets between
    actions, and is keyboard accessible.
  • Maintenance mode is persisted before it takes effect.

Breaking: runs that exceed their timeout now end as "timeout".

Tests cover each change.

Testing

The icecube tiers passed on this PR's tree before a migration-lock commit was added under the stack, as the first commit of #21: Go tests without and with Postgres, Playwright without a model, and Playwright against a local model. That commit changes only internal/db/migrate.go and its test, and the db package's tests pass with Postgres at every commit of the stack. The CI run on this PR tests the head as pushed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UwpkZbULrgj6JLeSra78AT

…n't trigger each other

- An action's timeout cuts its turn; a cut-off reply is a timeout and
  isn't delivered.
- Success counts real destinations (notify, log and none count only on
  their own).
- The breaker notice goes to a person first, never to "none".
- Deliverer panics are contained; the ledger is stamped once.
- A disabled action's scheduled fire skips (skipped_disabled); Reload is
  serialized.
- Stored output is cut on rune boundaries.
- page_saved actions stop when the owner leaves the watched book; a save
  made by an action's own delivery triggers no action; event payloads
  are treated as data, as are webhook run outputs returned by
  recent_scheduled_runs.
- Enabling validates the action; min_interval_seconds 0 is kept;
  switching an action to "run as you" requires confirm_envelope.
- The panel keeps a stored shard envelope it can't list, resets between
  actions, and is keyboard accessible.
- Maintenance mode is persisted before it takes effect.

Breaking: runs that exceed their timeout now end as "timeout".

Tests cover each change.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UwpkZbULrgj6JLeSra78AT
Base automatically changed from ci/fix-19-skills to main September 28, 2026 16:06
@sixvolts
sixvolts merged commit 5d43952 into main Sep 28, 2026
1 check passed
@sixvolts
sixvolts deleted the ci/fix-20-scheduled branch September 28, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant