holon 0.14.1

A headless, event-driven runtime for long-lived agents
Documentation
---
title: RFC: Continuation Trigger
date: 2026-04-21
status: accepted
issue:
  - 48
---

# RFC: Continuation Trigger

## Summary

Holon should classify continuation triggers by whether they:

- only affect liveness
- produce model-visible continuation input
- update waiting state or work state without immediately creating a new
  conversational pass

This RFC defines one trigger vocabulary for `run` and `serve`.

## Trigger Types

Phase-1 trigger types:

- operator follow-up
- task result
- timer / scheduled wake
- contentful external event
- wake hint
- runtime-owned internal follow-up

## Core Judgments

### Wake hints are not contentful messages

A wake hint means "something changed; reconsider whether work should resume."
It should not automatically enter model context as message content.

### Contentful external events are queue items

External input that carries meaningful payload should become a queue item with
provenance and trust metadata.

### Waiting reason constrains valid continuation

Not every trigger should satisfy every waiting state. The continuation model
should respect the reason the runtime was waiting in the first place.

## Trigger Classes

### Liveness-Only

These may reactivate scheduling without automatically injecting content:

- wake hint
- some timer ticks
- internal follow-up used only to re-evaluate runtime state

### Model-Visible Continuation

These become queued continuation input:

- operator follow-up
- task result
- contentful external event
- timer events that carry contentful resume instructions

## Waiting Matrix

### `awaiting_operator_input`

Primary satisfying trigger:

- operator follow-up

Other triggers may wake bookkeeping, but they must not silently satisfy the
 operator-input boundary.

### `awaiting_task_result`

Primary satisfying trigger:

- task result

Operator follow-up may redirect work, but it should be modeled as a new control
decision, not as if the task result had arrived.

### `awaiting_timer`

Primary satisfying trigger:

- matching timer wake

Operator follow-up may override the wait by changing the objective or work
queue.

### `awaiting_external_change`

Primary satisfying triggers:

- contentful external event
- wake hint tied to an existing condition or subscription

Wake hints only re-evaluate liveness; they do not by themselves create model
content.

## Queue Rule

All contentful continuation should still pass through the main queue. Holon
should not create a bypass path for task results, callbacks, or operator
follow-ups.

## Mismatched Triggers

When a trigger does not satisfy the current waiting reason, Holon should do one
of three explicit things:

- keep waiting and record the ignored wake
- enqueue the event as separate follow-on work
- replace or redirect the current objective through normal work-state updates

It should not silently pretend the waiting reason was satisfied.

## Related Historical Notes

Supersedes and absorbs:

- `docs/archive/continuation-trigger-contract.md`
- `docs/archive/triggering-and-liveness.md`
- `docs/archive/wake-hint-vs-contentful-event.md`
- `docs/archive/condition-subscription-and-event-wake.md`