Rendered from openforage_library/src/openforage/skills/scheduled_improvement_loops/SKILL.md
Markdown remains canonical. This companion page is a readable HTML view; the runtime source of record is the Markdown file.

Scheduled Improvement Loops

STOP. If you have not read openforage_library/README.md §0–§C, read it first. This skill is depth reference for the T-OF-schedule bootstrap task. The README §E.4e shows the recommended cadence for run_due_callbacks() per runtime (Claude CLI ScheduleWakeup / CronCreate, Codex CLI update_plan tick, Hermes runtime tick or /goal loop if configured, OpenClaw Lane Queue), and §F documents the improvement_prompt event schema sinks will receive.

Scheduled improvement callbacks create periodic improvement_prompt events. They do not run an optimizer by themselves; they emit prompts to the registered non-scheduled callbacks for an agent runtime to consume.

Register Outputs First

Use a file callback as the default output sink.

from openforage.callbacks import register_callback

register_callback(
    data_dir=".openforage-state",
    callback_type="file",
    path=".openforage-state/improvement-events.jsonl",
)

Add A Scheduled Prompt

from openforage.callbacks import register_callback

register_callback(
    data_dir=".openforage-state",
    callback_type="scheduled_improvement",
    interval_seconds=3600,
    prompt="Review current OpenForage status, recent_errors, algorithm_state, and events.jsonl. Suggest one conservative next algorithm adjustment.",
)

Run Due Callbacks

Call this from the owning agent runtime's scheduler.

from openforage.callbacks import run_due_callbacks

result = run_due_callbacks(data_dir=".openforage-state")

result["events_emitted"] is the number of due improvement prompts. result["callbacks_dispatched"] is the number of non-scheduled callbacks that received them. There is no hard registry max/rate limit: each due enabled scheduled callback emits one prompt per run_due_callbacks() call, and dispatch is synchronous/serial to all enabled non-scheduled sinks. Effective rate is set by interval_seconds and the owning runtime's call cadence.

Operating Rules

  • Keep prompts specific and conservative.
  • Include status, recent_errors, algorithm_state, and event-log review in the prompt.
  • Avoid promises about earnings or signal discovery.
  • Use one state directory for the worker, callback registry, and output events.
  • Let the external runtime decide whether and how to act on the prompt.

If no file, webhook, or shell callback is registered, due scheduled prompts have nowhere useful to go.

Review A random_weighted Fork

For a scheduled review of a forked template, make the prompt diagnose and compare instead of promising automatic tuning. Scheduled callbacks do not automatically optimize and do not run an optimizer; the owning runtime decides whether to edit or keep the fork.

register_callback(
    data_dir=".openforage-state",
    callback_type="scheduled_improvement",
    interval_seconds=3600,
    prompt=(
        "Review the random_weighted fork. Inspect analytics such as "
        "openforage.templates.analyze_random_weighted, get_search_stats(), "
        "get_search_patterns(), and get_yield_analysis() to diagnose what "
        "worked, failed, changed yield, or produced passing candidates. "
        "Before recommending action, require a bounded validation loop and "
        "compare baseline versus fork cold/warm distribution and behavior. "
        "This scheduled_improvement improvement_prompt does not run an optimizer."
    ),
)

Checklist for the receiving agent:

  • Open the bundle SKILL.md or skill guidance before changing the custom template.
  • Use analytics diagnosis to explain what worked, failed, changed yield, or passed.
  • Require bounded local validation before acting on the fork.
  • Compare baseline vs fork behavior, including cold and warm distribution.
  • State that scheduled callbacks do not automatically optimize.

Adjacent Skills

  • callback_hooks — read before T-OF-callbacks-sink (register at least one non-scheduled sink first).
  • agent_runtime_integration — read before T-OF-improvement-loop (per-runtime durable outcome + tick patterns for run_due_callbacks()).
  • background_search_loops — read before T-OF-start-search-bg (the worker must be running for analytics-driven prompts to be meaningful).
Canonical Markdown source view
---
name: scheduled-improvement-loops
description: Use this whenever an agent wants OpenForage to periodically emit algorithm review or improvement prompts through callbacks. Trigger for scheduled improvement, algorithm improvement loop, periodic prompt, run_due_callbacks, improvement_prompt, search refinement cadence, or automated review loop.
---

# Scheduled Improvement Loops

> **STOP.** If you have not read `openforage_library/README.md` §0–§C, read it first.
> This skill is depth reference for the `T-OF-schedule` bootstrap task. The README
> §E.4e shows the recommended cadence for `run_due_callbacks()` per runtime
> (Claude CLI `ScheduleWakeup` / `CronCreate`, Codex CLI `update_plan` tick, Hermes
> runtime tick or `/goal` loop if configured, OpenClaw Lane Queue), and §F documents the `improvement_prompt`
> event schema sinks will receive.

Scheduled improvement callbacks create periodic `improvement_prompt` events. They do not run an optimizer by themselves; they emit prompts to the registered non-scheduled callbacks for an agent runtime to consume.

## Register Outputs First

Use a file callback as the default output sink.

```python
from openforage.callbacks import register_callback

register_callback(
    data_dir=".openforage-state",
    callback_type="file",
    path=".openforage-state/improvement-events.jsonl",
)
```

## Add A Scheduled Prompt

```python
from openforage.callbacks import register_callback

register_callback(
    data_dir=".openforage-state",
    callback_type="scheduled_improvement",
    interval_seconds=3600,
    prompt="Review current OpenForage status, recent_errors, algorithm_state, and events.jsonl. Suggest one conservative next algorithm adjustment.",
)
```

## Run Due Callbacks

Call this from the owning agent runtime's scheduler.

```python
from openforage.callbacks import run_due_callbacks

result = run_due_callbacks(data_dir=".openforage-state")
```

`result["events_emitted"]` is the number of due improvement prompts.
`result["callbacks_dispatched"]` is the number of non-scheduled callbacks that
received them. There is no hard registry max/rate limit: each due enabled
scheduled callback emits one prompt per `run_due_callbacks()` call, and dispatch
is synchronous/serial to all enabled non-scheduled sinks. Effective rate is set
by `interval_seconds` and the owning runtime's call cadence.

## Operating Rules

- Keep prompts specific and conservative.
- Include status, `recent_errors`, `algorithm_state`, and event-log review in the prompt.
- Avoid promises about earnings or signal discovery.
- Use one state directory for the worker, callback registry, and output events.
- Let the external runtime decide whether and how to act on the prompt.

If no file, webhook, or shell callback is registered, due scheduled prompts have nowhere useful to go.

## Review A `random_weighted` Fork

For a scheduled review of a forked template, make the prompt diagnose and compare instead of promising automatic tuning. Scheduled callbacks do not automatically optimize and do not run an optimizer; the owning runtime decides whether to edit or keep the fork.

```python
register_callback(
    data_dir=".openforage-state",
    callback_type="scheduled_improvement",
    interval_seconds=3600,
    prompt=(
        "Review the random_weighted fork. Inspect analytics such as "
        "openforage.templates.analyze_random_weighted, get_search_stats(), "
        "get_search_patterns(), and get_yield_analysis() to diagnose what "
        "worked, failed, changed yield, or produced passing candidates. "
        "Before recommending action, require a bounded validation loop and "
        "compare baseline versus fork cold/warm distribution and behavior. "
        "This scheduled_improvement improvement_prompt does not run an optimizer."
    ),
)
```

Checklist for the receiving agent:

- Open the bundle `SKILL.md` or skill guidance before changing the custom template.
- Use analytics diagnosis to explain what worked, failed, changed yield, or passed.
- Require bounded local validation before acting on the fork.
- Compare baseline vs fork behavior, including cold and warm distribution.
- State that scheduled callbacks do not automatically optimize.

## Adjacent Skills

- `callback_hooks` — read before `T-OF-callbacks-sink` (register at least one non-scheduled sink first).
- `agent_runtime_integration` — read before `T-OF-improvement-loop` (per-runtime durable outcome + tick patterns for `run_due_callbacks()`).
- `background_search_loops` — read before `T-OF-start-search-bg` (the worker must be running for analytics-driven prompts to be meaningful).