Analysis runtime
The analysis runtime is the shared, bounded LLM lane plugins use for focused work - memory recall, fact extraction, topic detection, learning consolidation, dream contemplation. It runs through the same provider, auth-profile, and timeout plumbing as agent turns, on a dedicated lane so background analysis never queues behind a live user reply. There are no config keys for the analysis runtime. Its limits are fixed at build time; tuning happens in the plugins that use it (for exampleconsolidation.maxCallsPerAgentPerDay in Learning Core or contemplation.maxCallsPerCycle in Dream Cycle). For the developer-facing API, see Analysis runtime (developers).
Limits
Behaviour at the limits
- Background saturation. When a plugin already has 4 active background jobs,
enqueuereturnsaccepted: falsewith reasonqueue-fullinstead of queueing indefinitely. Well-written plugins log or retry; a plugin that ignores the refusal silently drops that unit of work. - Preemption by live work. Background analysis yields to awaited analysis. If a background job is already running, a new awaited
runis rejected immediately rather than waiting behind the job. - Invalid requests are rejected synchronously. An empty
purposeorinput, aproviderwithout amodel, or a disallowed tool in the allow-list never claims the lane or a quota. - No nested runs. An analysis run that itself triggers another analysis run is rejected (
nested analysis runs are not supported), so one plugin cannot indirectly multiply the lane.
Interaction with plugin budgets
The per-plugin analysis caps bound concurrency, not spend. Daily spend ceilings live in the consuming plugin’s own config:- Learning Core consolidation:
plugins.entries.learning-core.config.consolidation.maxCallsPerAgentPerDay(default8). - Dream Cycle contemplation:
plugins.entries.dream-cycle.config.contemplation.maxCallsPerCycle(default3).
What to monitor
queue-fullrejections in plugin or gateway logs are the saturation signal. Recurring rejections for one plugin mean it is producing background work faster than 4 concurrent jobs drain - check its own budget settings before assuming a gateway problem.- Analysis runs are logged by the
plugins/runtime/analysissubsystem (run started/run completedwith duration and status). Slow or timing-out runs show astimeoutstatuses with durations pinned at the effective timeout. - Memory-tool analysis is restricted to the read-only
memory_searchandmemory_gettools; anything else in an analysis allow-list is rejected before running. There is nothing to configure here - it is a fixed property of the lane.
Troubleshooting
A plugin’s background features lag or miss entries. Check forqueue-full rejections from that plugin. Lower its production rate (its own budget keys) rather than expecting a queue to absorb bursts.
timeout statuses in logs. The run exceeded its timeout (the plugin’s own timeoutMs, else the 15 s default). Either the provider is slow for that prompt size or the prompt is too broad - both are plugin-side fixes.
An awaited hook analysis is rejected while a background job runs. Expected: awaited work does not wait behind background jobs. The retry happens naturally on the next trigger.
Related
- Analysis runtime (developers) - the
api.runtime.analysisAPI, parameters, and result statuses - Learning Core and Dream Cycle - the main analysis consumers
- Logging - subsystem log configuration