Debugging L3
Trace source loading, hook invocation, decisions, and execution outcomes.
Start by identifying whether the problem is source loading, frame work, an execution check, provider work, or execution after approval. Keep SJS and L3 evidence tied to the same run and request.
The frame hook never runs
Check that the saved L3 source exports a callable app, evaluation is enabled, and source loading succeeded. A configured provider name alone is not a frame hook.
Inspect runtime errors rather than relying only on a previous l3State.enabled value. Custom state can outlive source changes within the session.
The intent hook never runs
Check that the source exports intent, the execution method reaches an applicable L3 check, and the request is not using L3 provenance. A request rejected earlier by automation may never reach L3.
An observation-only frame does not produce an execution intent simply because it logged a signal.
A rejection was ignored
Confirm that the direct hook returned literal false, not an object containing an allowed field. Check source and the difference between recorded allowed and finalAllowed for manual override.
If compilation failed in a normal session, there may be no enabled loaded hook to reject the request. Agent Lab propagates that compile failure instead.
A close was blocked unexpectedly
Inspect the sequence of request kinds. Shared closing can pass close_position and then fail place_order. The last recorded check can therefore describe the delegated order rather than the first close check.
Also inspect whether pending orders were removed before a later placement failure. Review closing positions.
Provider output looks valid but the decision is wrong
Check parsed output shape, explicit Boolean validation, data timestamps, coverage, and cached-response expiration. Provider response creation time is wall time, not proof of market-evidence freshness.
A frame analysis reading SJS state may observe an earlier signal because L3 runs first. Request metadata is more directly tied to submission, but still needs validation.
Keep failures reproducible
Use a deterministic guard or fake-provider fixture, a short historical run, and one intended decision. Record source revision, input timestamp, request kind/source, response shape, error, and actual execution outcome.
Use policy debugging for framework-specific resolution and execution debugging after the hook allows a request.