Skip to main content

How to use this runbook

1

Find the symptom

Find the symptom below that matches what you are observing.
2

Follow the diagnosis

Follow the diagnosis steps in order.
3

Apply the resolution

Apply the recommended resolution.
4

Verify via audit trail

Check the Audit Trail for root cause analysis.
All SQL queries reference the SQLite audit database (default: ~/.iscl/audit.sqlite).

Symptoms

Severity: Critical Description: Funds moved to an unexpected address or an unexpected amount was transferred.

Diagnosis

1. Find the transaction in the audit trail:
2. Reconstruct the full intent lifecycle:
Look for:
  • intent_received — Who submitted the intent? Check data.source for the adapter name.
  • policy_evaluated — Was the policy decision allow or require_approval? If allow, the policy threshold was too permissive.
  • approval_requested / approval_decided — Was user confirmation required? Was it actually confirmed by the operator?
  • signed — The signing event with the transaction hash.
  • broadcast — Was the transaction successfully broadcast?
3. Check if the approval was legitimate:
If approved: true but the operator did not authorize it, check:
  • Was ISCL_APPROVAL_MODE=auto? This bypasses human confirmation.
  • Was the approval submitted via the web API by an unauthorized party?
  • Was the approval TTL exploited (approved just before expiry)?

Resolution

This is a critical security incident. Act immediately.
  1. Immediately — Rotate the wallet if compromise is suspected. Generate a new key and transfer remaining assets.
  2. Review policy — Lower requireApprovalAbove.valueWei to require approval for smaller amounts.
  3. Check approval mode — Ensure production is NOT running with ISCL_APPROVAL_MODE=auto.
  4. Restrict access — If using web approval, ensure the /approval-ui endpoint is only accessible to authorized operators.
Severity: Medium Description: Every transaction attempt returns HTTP 403 with policy denial.

Diagnosis

1. Check the policy denial reasons:
2. Common denial reasons and fixes:3. Check if the default policy is in effect:
The default policy has maxValueWei: "0", which denies ALL transactions. This is a safety default — you must configure a policy with appropriate limits.

Resolution

Review and update the policy configuration. See Configuration Reference for all PolicyConfig fields.
Severity: Medium Description: ISCL signs the transaction but broadcast fails (broadcastError is non-null).

Diagnosis

1. Check broadcast errors in the audit trail:
2. Common broadcast errors:3. Check RPC health:
If this fails, the RPC endpoint is down or unreachable.

Resolution

  • For nonce errors: usually self-correcting on retry
  • For gas errors: send ETH to the wallet
  • For RPC errors: check provider status, switch to backup RPC
  • For persistent reverts: check the transaction parameters (insufficient token balance, expired deadline)
Severity: Medium Description: API returns HTTP 502 with "no_rpc_client" or RPC timeout errors.

Diagnosis

1. Verify RPC configuration:
2. Test RPC connectivity:
3. Check for provider rate limiting:If you see intermittent 502s, your RPC provider may be rate limiting. Look for HTTP 429 responses in ISCL Core logs.

Resolution

Severity: Low Description: Users report “Transaction expired” when trying to approve transactions.

Diagnosis

1. Check the approval TTL:The default TTL is 300 seconds (5 minutes). If operators consistently need more time, the TTL may be too short.2. Check for stale pending requests:
If this shows requests with low ttlSeconds, they are about to expire.3. Check approval mode:
If set to cli but no one is watching the terminal, approvals will time out.

Resolution

Severity: Medium Description: The approval succeeds but signing fails with a key-not-found error.

Diagnosis

1. List available keys:
2. Compare with the wallet address in the intent:The wallet.address in the TxIntent must match an address in the keystore (case-insensitive).3. Check keystore path:Ensure the ISCL Core process can access the keystore directory. In Docker, the keystore is mounted as a volume.

Resolution

Severity: Low Description: A sandbox skill is killed (exit code 137) before completing.

Diagnosis

1. Check sandbox events:
2. Look for timeout indicators:
3. Check manifest resource limits:The skill’s sandbox.timeoutMs in the manifest controls the deadline. The default cap is 60 seconds.

Resolution

Severity: Low Description: ISCL Core process memory exceeds expected levels (>300MB).

Diagnosis

1. Check Node.js heap usage:
2. Check for leaked pending approvals:
A large number of stale pending approvals suggests the cleanup interval isn’t running or requests are being submitted faster than they expire.3. Check SQLite database size:

Resolution

Severity: Low Description: The preflight service reports simulation failure, blocking the transaction.

Diagnosis

1. Check the preflight result in audit trail:
Look for simulationSuccess: false and the associated error message.2. Common simulation failures:

Resolution

  • Verify the sender has sufficient balance for the transfer/swap
  • Check that ERC-20 approvals are in place for swap router interactions
  • Ensure the deadline hasn’t passed
  • Verify the target contract exists on the specified chain

General investigation procedure

For any incident not covered above:
1

Get the intent ID

Find the intent ID from error messages, API responses, or logs.
2

Pull the full audit trail

3

Identify where the pipeline failed

Which event is the last one? What does its data show?
4

Check surrounding events for context

5

Correlate with application logs

Cross-reference with pino structured logs for stack traces and detailed error context.

Next steps