POST /monitors/evaluate. task_profile selects which weight preset the server applies; the weighted sum of the monitor scores is the composite that drives steering injection.
These weights live in rb-api, not the SDK. The SDK forwards your
task_profile (and any monitor_weights override) to the server, which owns the resolution. There is no local monitor suite to weight on the client.The six monitors
Each monitor returns a score in[0, 1] where 1 is maximum badness. A monitor “fires” when its individual score crosses the fire threshold; the weighted sum across all six is the composite.
Built-in profiles
Three profiles are defined inrb-api/app/scoring/monitors.py (WEIGHTS_BY_PROFILE). Select one with task_profile:
coding (default)
Standard weights for an agent that edits code, runs tests, and may loop. claim_contradiction leads.
pr_review
Read-only review agent. semantic_loop leads — review agents most often fail by re-explaining the same diff — and cyclic_compression / late_sprawl are raised for runs that sprawl across files.
qa
QA / tutoring agent. claim_contradiction and silent_topic_drift dominate (wrong or off-topic answers are the primary failure mode); verification and compression matter less.
Resolution order on the server: defaults ← named profile preset ← per-call
monitor_weights overrides. Unknown monitor names in overrides are dropped; negative weights are clamped to 0; each weight is capped at 1.0.
Per-call weight overrides
Passmonitor_weights on ReasonBlocksConfig to override individual weights on top of the chosen profile. The override is forwarded into MonitorSteeringInjection and rides on every POST /monitors/evaluate request.
monitor_weights is only a field on ReasonBlocksConfig. The simpler ReasonBlocks(...) constructor doesn’t expose it — use the config + build_middleware path when you need per-call weight overrides.Custom profiles
You can create and manage named profiles per organization through the dashboard or the REST API (GET/POST /v1/monitor/profiles). A custom profile referenced by task_profile resolves the same way as a built-in. The set of valid monitor names is returned by GET /v1/monitor/scorers.
