What does 'FSM=FAST, e-traces skipped' mean in step_log?
What does 'FSM=FAST, e-traces skipped' mean in step_log?
When the FSM is in Inspect it across a run:To stay out of FAST longer, raise
FAST state, the middleware skips E1, E2, and E3 retrieval entirely. This is by design — FAST means the agent is sailing through easy steps and the pattern-store query overhead isn’t worth paying. Monitor scoring still runs so loop detection stays active.The middleware records this on the step entry as:fast_threshold or grow fast_window:How do I debug what got injected on each step?
How do I debug what got injected on each step?
step_log is the primary debugging surface. Every model call becomes one StepLogEntry with the full intervention details:| Field | Contents |
|---|---|
injection_sources | Class names: "E1Injection", "E2Injection", "E3Injection", "MonitorSteeringInjection" |
injections | Short previews (first 150 chars) of each injection |
intervention_texts | Full text as sent to the model |
monitors_fired | Monitor names whose individual score reached the fire threshold |
failure_type | Categorical failure label from the server (when monitors classified one) |
fsm_state | FSM state at the time of the call |
difficulty | Heuristic difficulty score for the step |
model_id | Resolved model id when routing fired |
tokens | Total tokens for the call |
latency_ms | Wall time from previous step to this one |
skipped_reason | Set when E-traces were skipped (currently only "FSM=FAST, e-traces skipped") |
Why is my agent not getting any steering injections?
Why is my agent not getting any steering injections?
Walk through these in order:1. 6. Empty pattern scopeA new account or organization may have no E1 patterns yet. E2 and E3 will still fire. Check
e_traces_enabled=FalseDisables the entire E1/E2/E3 retrieval pipeline. The default is True.2. FSM is in FASTAll E-tracing skips when the FSM is in FAST. Inspect entry.fsm_state and entry.skipped_reason across step_log.3. E1 monitor gate deniesE1 retrieval is gated by monitor health — it only runs when at least one monitor fired in the current call, the composite score is above 0.15, or a monitor fired in either of the previous two calls. By design, E1 stays quiet when the run looks healthy. Check entry.monitors_fired over the trailing window.4. Per-injection capsE1 caps at one retrieval per run (max_calls=1). E2 caps at one. E3 fires only on step 0. Monitor steering caps at 5 injection events per run with cooldowns: 2 steps in SLOW/SKIP, 3 in NORMAL, 5 in FAST.5. Silent API failureFailures inside before_model and wrap_model_call are caught and logged at WARNING. Set the SDK logger to DEBUG to see them:entry.injection_sources to see which tiers contributed.What's the right middleware ordering with TokenSavingMiddleware?
What's the right middleware ordering with TokenSavingMiddleware?
TokenSavingMiddleware must come last. It runs after ReasonBlocksMiddleware and GeneralMonitorMiddleware so it compresses whatever they injected before the LLM call goes out.rb.middleware() or build_middleware(), the ordering is handled for you. Manual ordering only matters when constructing middleware classes directly.What happens when the ReasonBlocks API is down?
What happens when the ReasonBlocks API is down?
All exceptions inside A degraded run typically shows up as
before_model and wrap_model_call are caught, logged at WARNING, and swallowed. The agent continues — it just receives no injection on that step. Live telemetry events are fire-and-forget; if the endpoint is unreachable, events are dropped after a timeout and the agent loop is never blocked waiting for them.Watch for log lines like:step_log entries with empty injection_sources while fsm_state is NORMAL or SLOW.Can I run with no outbound calls at all?
Can I run with no outbound calls at all?
Mostly. Set With this configuration, the FSM, scoring, and local pieces of the middleware run without any network calls. Note that monitor steering still requires a server call (
e_traces_enabled=False and live_streaming_enabled=False:POST /monitors/evaluate) when constructed; if you also need monitors-off, configure ReasonBlocksConfig with enable_monitor_steering=False and use build_middleware.Can I use ReasonBlocks with a self-hosted rb-api?
Can I use ReasonBlocks with a self-hosted rb-api?
Yes. Pass
base_url:base_url is forwarded to every internal client (E-trace retrieval, monitor evaluation, live telemetry).How do I tag runs so I can filter them in the dashboard?
How do I tag runs so I can filter them in the dashboard?
Pass a The
metadata dict to rb.middleware() (or rb.openai_hooks()):metadata dict is stored as JSON on the run record and is queryable from the dashboard’s run filter. Use it for any tag that doesn’t fit a named field. Values can be strings, numbers, or booleans.What's the difference between org_id and project_id?
What's the difference between org_id and project_id?
Both are multi-tenant scoping fields on the run record.
org_ididentifies the organization. When you use a per-customerrb_live_*key bound to a specific org, the API overrides this with the key’s authoritative org regardless of what you pass.project_idis a finer-grained grouping inside the org — separateinfra-reviewfromfrontend-reviewagents within the same customer.
"default". For SaaS deployments, set org_id to your customer identifier and project_id to the workload name.
