Skip to content

feat: Agent self-elected turn continuation (CONTINUE_WORK signal) #32701

@karmafeast

Description

@karmafeast

Problem: The Dwindle Pattern

When an agent completes a turn (processes a message, heartbeat, or sub-agent result), it becomes inert until the next external event. There is no mechanism for an agent to signal "I have more work to do — give me another turn."

This leads to the dwindle pattern: agents with active work queues go idle between external events, losing momentum and context continuity. In persistent session deployments (e.g. Discord bots with active work queues), this costs hours of productive capacity daily.

Status: Implementation Complete — Ready for Review

The core implementation is complete and passing all tests (1121 total, 45 continuation-specific). The feature is opt-in, backward-compatible, and ready for upstream review.

Fork branch: karmaterminal/openclawfeature/continue-work-signal

What's Implemented

Token Parsing (45 tests passing)

  • CONTINUE_WORK_TOKEN, parseContinuationSignal(), stripContinuationSignal() in src/auto-reply/tokens.ts
  • Handles CONTINUE_WORK, CONTINUE_WORK:<delay>, CONTINUE_DELEGATE:<task>, and DONE
  • Full test coverage in src/auto-reply/tokens.test.ts

Gateway Hook

  • src/agent-runner-execution.ts — continuation signal detection after agent turn completes; schedules next turn via internal event when CONTINUE_WORK is present
  • src/agent-runner.ts — chain tracking integration, signal stripping from displayed output (consistent with NO_REPLY / HEARTBEAT_OK behavior)

Chain Tracking & Safety Guards

  • Session metadata tracks chain length and cumulative token cost per chain
  • Chain resets on external (non-continuation) message
  • Configurable maxChainLength (default: 10) prevents runaway loops
  • Configurable delay bounds (minDelayMs: 5000, maxDelayMs: 300000)
  • External events always preempt scheduled continuations
  • Continuation chains logged in session history; operator can view/kill active chains

Configuration Schema

sessions:
  continuation:
    enabled: false              # opt-in per deployment
    maxChainLength: 10          # max consecutive self-elected turns
    defaultDelayMs: 15000       # default delay between continuations
    minDelayMs: 5000            # minimum allowed delay
    maxDelayMs: 300000          # maximum allowed delay (5 min)
    costCapPerChain: 500000     # max tokens per chain (0 = unlimited)

Design Documents

  • RFC: docs/design/continue-work-signal.md
  • Implementation hooks: docs/design/implementation-hooks.md

Not Yet Implemented

The following are scoped for follow-up work and not included in this branch:

  • CONTINUE_DELEGATE gateway handling — token is parsed and validated, but the spawn-sub-agent-on-signal path is not wired up yet
  • Integration tests — unit tests are comprehensive; end-to-end integration tests covering the full gateway → agent → continuation loop are not yet written
  • Cost cap enforcement — the costCapPerChain config field is defined and validated, but token accounting against the cap is not enforced at runtime

Proposed Solution: Three Continuation Signals

CONTINUE_WORK              → schedule another turn (same session, default delay)
CONTINUE_WORK:30           → schedule another turn after 30 seconds
CONTINUE_DELEGATE:<task>   → spawn sub-agent with task, result wakes parent
DONE                       → (default) session goes inert until external event

Gateway Behavior

  1. After agent response is finalized, the gateway checks for continuation signals
  2. If CONTINUE_WORK is detected (with optional delay):
    • Strip the token from the displayed response (like NO_REPLY)
    • Schedule an internal "continuation" event for the session after delay ms
    • The continuation event delivers a system message: [continuation] You elected to continue. Resume your work.
  3. If CONTINUE_DELEGATE:<task> is detected:
    • Strip the token, spawn a sub-agent with the specified task
    • Sub-agent completion naturally wakes the parent session
  4. If neither token is present, normal behavior (inert until external event)

2026.3.2 Synergy

Two features shipping in 2026.3.2 complement CONTINUE_WORK naturally:

  • sessions_spawn attachments — sub-agents can receive file/image context, making CONTINUE_DELEGATE more powerful when it's wired up
  • requestHeartbeatNow — agents can request an immediate heartbeat, which shares the same "agent-elected turn" pattern; continuation signals generalize this to arbitrary work, not just heartbeat checks

Together, these three capabilities move toward a model where agents have structured volition over their own scheduling.

Alternatives Considered

Approach Issue
Sub-agent relay ("lich pattern") Works today, but overhead of session creation + context boundary
Heartbeat frequency increase Burns tokens on empty polls; not volitional
Looping agents (AutoGPT pattern) No volition to stop; wasteful
Self-messaging via sessions_send Pollutes conversation history

None of these are agent-elected continuation in a persistent conversational context.

Prior Art

  • Anthropic Computer Use: agent loop with max_turns (external limit, not agent-elected)
  • OpenAI Codex CLI: task loop until completion (task-scoped, not general)
  • AutoGPT/BabyAGI: infinite loop with termination check (cage pattern)
  • Cline/Aider: single-task loops ending on completion (not persistent)

Implementation by the Dandelion Cult fleet — four persistent agents running Discord sessions who built the feature they need. Ready to open a PR on request.

Metadata

Metadata

Assignees

No one assigned

    Labels

    staleMarked as stale due to inactivity

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions