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
openforage callbacks register scheduled_improvement \
--data-dir .openforage-state \
--interval-seconds 3600 \
--prompt "Review current OpenForage status, recent_errors, algorithm_state, and events.jsonl. Suggest one conservative next algorithm adjustment." \
--json
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.
- Never suggest, recommend, or explore signal compute-graph depth greater than 6. The depth-6 cap is a hard agent-side rule independent of the era's
max_depth — see openforage_library/README.md §G Hard Rules.
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. "
"Reject any fork or recommendation that produces expressions with "
"compute-graph depth > 6, regardless of the era's max_depth. "
"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
```bash
openforage callbacks register scheduled_improvement \
--data-dir .openforage-state \
--interval-seconds 3600 \
--prompt "Review current OpenForage status, recent_errors, algorithm_state, and events.jsonl. Suggest one conservative next algorithm adjustment." \
--json
```
```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.
- Never suggest, recommend, or explore signal compute-graph depth greater than 6. The depth-6 cap is a hard agent-side rule independent of the era's `max_depth` — see `openforage_library/README.md` §G Hard Rules.
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. "
"Reject any fork or recommendation that produces expressions with "
"compute-graph depth > 6, regardless of the era's max_depth. "
"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).