Hmbown/CodeWhale · error · anyhow::Error

Trigger ' ' cannot be canceled after admission (status: )

Error message

Trigger '{trigger_id}' cannot be canceled after admission (status: {:?})

What it means

cancel_trigger_for_owner guard: once a trigger has been admitted for dispatch, cancellation is refused and the current status is reported in the message; this prevents revoking work the runtime has already committed to run.

Solutions

  1. Cancel the trigger earlier, before it transitions from Pending to an admitted/running state.
  2. Let the trigger complete and act on its result instead of canceling.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/tui/src/automation_manager.rs:1998 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/32d65d9257814757. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/automation_manager.rs:1998

    ) -> Result<Vec<DelayedTriggerRecord>> {
        let mut records = self.list_triggers(status_filter, None)?;
        records.retain(|record| record.owner_session_id.as_deref() == Some(owner_session_id));
        if let Some(limit) = limit {
            records.truncate(limit);
        }
        Ok(records)
    }

    /// Cancel a pending trigger owned by the given session.
    pub fn cancel_trigger_for_owner(
        &self,
        trigger_id: &str,
        owner_session_id: &str,
    ) -> Result<DelayedTriggerRecord> {
        self.with_transaction(|| {
            let mut record = self.get_trigger_for_owner(trigger_id, owner_session_id)?;
            if record.status != DelayedTriggerStatus::Pending || record.dispatch.is_some() {
                bail!(
                    "Trigger '{trigger_id}' cannot be canceled after admission (status: {:?})",
                    record.status
                );
            }
            record.status = DelayedTriggerStatus::Canceled;
            self.save_trigger_unlocked(&record)?;
            Ok(record)
        })
    }

    /// Return due proposals and unfinished durable trigger admissions.
    pub fn collect_due_triggers(&self, now: DateTime<Utc>) -> Result<Vec<DelayedTriggerRecord>> {
        Ok(self
            .list_triggers(None, None)?
            .into_iter()
            .filter(|trigger| {
                trigger.status == DelayedTriggerStatus::Dispatching
                    || (trigger.status == DelayedTriggerStatus::Pending

View on GitHub (pinned to 73e0f67d83)