> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stateset.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Produce an auditable, policy-grounded decision with a proof chain.

> **Required scope:** write

**Required scope:** `write`

### Request body

`DecisionRequest`

<ParamField body="action" type="string">
  Optional explicit action being authorized (e.g. 'issue\_refund'). When present, the decision reflects whether *this action* is permitted.
</ParamField>

<ParamField body="authorization_goal" type="object" />

<ParamField body="confidence_threshold" type="number (double)" />

<ParamField body="external_ref" type="string">
  Optional client correlation key (their order id, case id, claim number). Stored on the decision so the real-world outcome can later be recorded against it via `POST /v1/decisions/outcome-by-ref` — a chargeback or override webhook knows this id, not our `decision_id`.
</ParamField>

<ParamField body="facts" type="RecursiveChatFactInput[]">
  Request-scoped facts injected into the working set.
</ParamField>

<ParamField body="hydrate_org_context" type="boolean">
  When false, skip org knowledge-base hydration (default true).
</ParamField>

<ParamField body="include_trace" type="boolean">
  When true, include the full proof trace and raw engine payload.
</ParamField>

<ParamField body="kb_limits" type="object" />

<ParamField body="max_depth" type="integer">
  Recursion depth / iteration / confidence overrides.
</ParamField>

<ParamField body="max_iterations" type="integer" />

<ParamField body="mode" type="string">
  Reasoning thoroughness: `fast` | `accurate` | `safe`. Decisions default to `safe` (highest verification) since they are accountable outputs.
</ParamField>

<ParamField body="query" type="string" required>
  The decision question, e.g. 'Can order #A1 be refunded for customer C?'.
</ParamField>

<ParamField body="rules" type="RecursiveChatRuleInput[]">
  Request-scoped rules injected into the working set.
</ParamField>

<ParamField body="session_id" type="string">
  Optional caller session id (carried into the solver).
</ParamField>

### Response

`DecisionResponse`

<ResponseField name="action" type="object">
  <Expandable title="action">
    <ResponseField name="confidence" type="number (float)" required />

    <ResponseField name="name" type="string" required />

    <ResponseField name="ready" type="boolean" required />

    <ResponseField name="reason" type="string" required />

    <ResponseField name="rule_conclusion" type="string" required />

    <ResponseField name="rule_name" type="string" required />
  </Expandable>
</ResponseField>

<ResponseField name="confidence" type="number (double)" required />

<ResponseField name="decision" type="string" required>
  `approved` | `denied` | `refused`.
</ResponseField>

<ResponseField name="decision_id" type="string" required />

<ResponseField name="dropped_citations" type="string[]">
  Org rules the engine fired during hydration that were dropped from `proof.cited_rules` as unrelated to this decision. Persistently non-empty values mean a standing rule with permanently satisfied premises fires on every hydrated decision — scope or prune it.
</ResponseField>

<ResponseField name="evaluated_goal" type="string">
  Exact predicate evaluated as the permit target. Absent for legacy requests that relied on action/query inference.
</ResponseField>

<ResponseField name="grounding" type="DecisionGrounding" required>
  <Expandable title="DecisionGrounding">
    <ResponseField name="cited_rule_count" type="integer" required />

    <ResponseField name="grounded_entity_count" type="integer" required />

    <ResponseField name="grounded_target_count" type="integer" required />

    <ResponseField name="status" type="string" required />
  </Expandable>
</ResponseField>

<ResponseField name="gss_machine" type="GssMachineGroundingSnapshot" required>
  <Expandable title="GssMachineGroundingSnapshot">
    <ResponseField name="authority" type="string" required />

    <ResponseField name="categories" type="string[]" required />

    <ResponseField name="classification_confidence" type="number (double)" required>
      Confidence of the GSS perception/classification stage.
    </ResponseField>

    <ResponseField name="domains" type="string[]" required />

    <ResponseField name="escalation_triggered" type="boolean" required />

    <ResponseField name="explanation" type="string" />

    <ResponseField name="grounded_symbol" type="string">
      Best-aligned canonical symbol under the variance-aware alignment.
    </ResponseField>

    <ResponseField name="gss_v3_shadow" type="object">
      <Expandable title="gss_v3_shadow">
        <ResponseField name="candidate_rules" type="GssV3ShadowRule[]" required />

        <ResponseField name="matched_predicates" type="string[]" required />

        <ResponseField name="matched_symbols" type="GssV3ShadowSymbolMatch[]" required />

        <ResponseField name="org_scoped" type="boolean" required>
          `true` when `candidate_rules` was filtered to rules with an ACTIVATED `org_bindings` entry for the requesting org. `false` when the org has zero bindings anywhere in the seed (unknown org) and the shadow matcher fell back to the unfiltered rulebook. Matched symbols are never org-filtered — they are shared vocabulary by design.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="horn_clauses_fired" type="string[]" required />

    <ResponseField name="inferred_symbols" type="string[]" required />

    <ResponseField name="intents" type="string[]" required />

    <ResponseField name="machine_confidence" type="number (double)" required>
      Confidence that NSRMachine recognized and executed the supplied grounded symbols. This is not an end-to-end decision confidence.
    </ResponseField>

    <ResponseField name="machine_output" type="string" />

    <ResponseField name="machine_state_version" type="integer (int64)">
      Chat-mutation version of the org's NSRMachine this decision inferred against, alongside `request_policy_hash` in spirit: two runs of the same request stamped with the same version had the same machine view; differing stamps make cross-run drift auditable rather than silent (FINDING-nondeterministic-outcome, option 3).
    </ResponseField>

    <ResponseField name="safety_gate_triggered" type="boolean" required />

    <ResponseField name="seed_grounded" type="boolean" required />

    <ResponseField name="seed_source" type="string" required />

    <ResponseField name="symbol_alignment" type="number (double)">
      Variance-aware (isotropic Mahalanobis) alignment of the message composite to that symbol's centroid, in (0,1]: `exp(−d²/2σ²)` with σ² the symbol's learned seed variance. Use this to assess grounding uncertainty — unlike the classification mixture score, it reflects the symbol's observed spread, not lexical overlap.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="plain_explanation" type="string" required>
  Deterministic, proof-derived, business-readable 'why' — distinct from `rationale` (engine narration): 'Approved to issue a refund for order 9412: the return for order 9412 was received and order 9412 passed inspection.' Always present.
</ResponseField>

<ResponseField name="proof" type="DecisionProof" required>
  <Expandable title="DecisionProof">
    <ResponseField name="cited_rules" type="string[]" required>
      Org rules cited in the derivation (the audit trail).
    </ResponseField>

    <ResponseField name="derivation" type="object">
      <Expandable title="derivation">
        <ResponseField name="authorizing_predicate" type="string">
          The decisive conclusion (declared effect or policy-marker head) the verdict stood on.
        </ResponseField>

        <ResponseField name="cited_org_rules" type="OrgRuleDefinition[]">
          Definitions of cited rules that live in the org knowledge base rather than request scope, so an auditor can read the exact policy the verdict stood on even when it cannot be replayed from the request alone.
        </ResponseField>

        <ResponseField name="org_facts_used" type="string[]">
          Org-KB facts that served as premises in the replayed chain — the org-side evidence a third party needs to check the derivation.
        </ResponseField>

        <ResponseField name="replayable" type="boolean" required>
          True when every cited rule fired from the evidence carried in this response (request facts plus the org facts listed in `org_facts_used`), i.e. the whole chain replays from the response.
        </ResponseField>

        <ResponseField name="steps" type="DerivationStep[]" required>
          Rule firings in derivation order, restricted to the cited dependency path.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="neural_steps" type="integer" required />

    <ResponseField name="planner_steps" type="integer" required />

    <ResponseField name="proof_score" type="number (double)" required>
      0–1 proof strength from the engine's validation pass.
    </ResponseField>

    <ResponseField name="proof_status" type="string" required />

    <ResponseField name="request_policy_hash" type="string">
      `sha256:&lt;hex>` over the canonicalized request-scoped facts and rules — pins this decision to the exact policy inputs it was evaluated against. Absent when the request carried no inline policy.
    </ResponseField>

    <ResponseField name="symbolic_steps" type="integer" required />
  </Expandable>
</ResponseField>

<ResponseField name="rationale" type="string" required />

<ResponseField name="refusal" type="object">
  <Expandable title="refusal">
    <ResponseField name="missing_facts" type="MissingFact[]">
      Request-scoped premises that would unblock an authorization proof: body atoms on the dependency path to a positive policy conclusion that neither the supplied facts nor any derivable conclusion satisfies. Empty for safety-gated refusals, which must not invite resubmission.

      <Expandable title="MissingFact">
        <ResponseField name="args" type="string[]" required />

        <ResponseField name="needed_by_rule" type="string" required />

        <ResponseField name="predicate" type="string" required />

        <ResponseField name="question" type="string" required>
          A natural-language question that, answered affirmatively, yields this premise — so a refusal is turnkey to resolve instead of a dead end.
        </ResponseField>

        <ResponseField name="resolves_with" type="object" />
      </Expandable>
    </ResponseField>

    <ResponseField name="reason" type="string" required />

    <ResponseField name="requires_human_review" type="boolean" required />
  </Expandable>
</ResponseField>

<ResponseField name="trace" type="RecursiveChatTraceStep[]">
  Full proof trace, when `include_trace` was set.

  <Expandable title="RecursiveChatTraceStep">
    <ResponseField name="description" type="string" required />

    <ResponseField name="duration_ms" type="integer (int64)" required />

    <ResponseField name="input" type="object" />

    <ResponseField name="output" type="object" />

    <ResponseField name="step_type" type="string" required />

    <ResponseField name="task_id" type="string" />
  </Expandable>
</ResponseField>

<ResponseField name="usage" type="DecisionUsage" required>
  <Expandable title="DecisionUsage">
    <ResponseField name="billable" type="boolean" required />

    <ResponseField name="billing_tier" type="string" required />

    <ResponseField name="elapsed_ms" type="integer (int64)" required />

    <ResponseField name="iterations" type="integer" required />

    <ResponseField name="max_depth_reached" type="integer" required />

    <ResponseField name="outcome_cost_microdollars" type="integer (int64)" required />
  </Expandable>
</ResponseField>

<ResponseField name="verifiable_bundle" type="object">
  A self-contained, INDEPENDENTLY-VERIFIABLE proof bundle for an approved decision: the exact facts and rules plus a `RuleEngine::backward_chain` derivation of the authorization goal, in the `knowledge::ProofBundle` wire format. POST it verbatim to `/v1/proofs/verify` (or check it offline with the dependency-light `proof_check`) to confirm the verdict without trusting this server. Present only when the caller declared an `authorization_goal` AND the rule engine reproduces the proof; absent otherwise (the verdict still stands on its own derivation).
</ResponseField>

<ResponseField name="warnings" type="string[]">
  Non-fatal advisories about how the verdict was derived (e.g. the outcome rested on predicate-name inference rather than declared rule effects). Omitted when empty.
</ResponseField>

<ResponseField name="x_nsr" type="object">
  <Expandable title="x_nsr">
    <ResponseField name="action_results" type="ActionExecutionResult[]" required>
      <Expandable title="ActionExecutionResult">
        <ResponseField name="action_type" type="string" required />

        <ResponseField name="details" type="string[]" required />

        <ResponseField name="matched_entity_ids" type="string[]" required />

        <ResponseField name="status" type="string" required />

        <ResponseField name="summary" type="string" required />

        <ResponseField name="tool_name" type="string" required />
      </Expandable>
    </ResponseField>

    <ResponseField name="action_runtime" type="RecursiveChatActionRuntime" required>
      <Expandable title="RecursiveChatActionRuntime">
        <ResponseField name="approved_action_types" type="string[]" required />

        <ResponseField name="blocked_action_types" type="string[]" required />

        <ResponseField name="executed_action_types" type="string[]" required />

        <ResponseField name="execution_receipt" type="object" />

        <ResponseField name="lifecycle_stage" type="string" required />

        <ResponseField name="prepared_action_types" type="string[]" required />

        <ResponseField name="review_required_action_types" type="string[]" required />
      </Expandable>
    </ResponseField>

    <ResponseField name="answer" type="object" />

    <ResponseField name="assistant_message" type="string" required />

    <ResponseField name="audit_trace" type="RecursiveChatTraceStep[]">
      <Expandable title="RecursiveChatTraceStep">
        <ResponseField name="description" type="string" required />

        <ResponseField name="duration_ms" type="integer (int64)" required />

        <ResponseField name="input" type="object" />

        <ResponseField name="output" type="object" />

        <ResponseField name="step_type" type="string" required />

        <ResponseField name="task_id" type="string" />
      </Expandable>
    </ResponseField>

    <ResponseField name="context" type="RecursiveChatContextSummary" required>
      <Expandable title="RecursiveChatContextSummary">
        <ResponseField name="hydrated_entities" type="integer" required />

        <ResponseField name="hydrated_rules" type="integer" required />

        <ResponseField name="hydrated_triples" type="integer" required />

        <ResponseField name="request_facts" type="integer" required />

        <ResponseField name="request_rules" type="integer" required />

        <ResponseField name="skipped_rule_names" type="string[]">
          Names of the skipped rules, capped for response size.
        </ResponseField>

        <ResponseField name="skipped_rules" type="integer">
          Org rules that could NOT be represented in the chat rule language and were therefore not applied — today, rules with a negated head (the chat engine has no negated conclusion) and rules with terms that do not convert. Reported rather than silently dropped: a caller reasoning about a policy needs to know part of it was not in force, especially when the dropped part is a prohibition.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="cost" type="RecursiveChatCost" required>
      <Expandable title="RecursiveChatCost">
        <ResponseField name="api_surface" type="string" required />

        <ResponseField name="billable_outcome" type="boolean" required />

        <ResponseField name="billing_tier" type="string" required />

        <ResponseField name="elapsed_ms" type="integer (int64)" required />

        <ResponseField name="estimated_cost_units" type="integer (int64)" required />

        <ResponseField name="iterations" type="integer" required />

        <ResponseField name="max_depth_reached" type="integer" required />

        <ResponseField name="neural_steps" type="integer" required />

        <ResponseField name="outcome_cost_microdollars" type="integer (int64)" required />

        <ResponseField name="planner_steps" type="integer" required />

        <ResponseField name="symbolic_steps" type="integer" required />
      </Expandable>
    </ResponseField>

    <ResponseField name="explanation" type="string" required />

    <ResponseField name="facts" type="RecursiveChatFactView[]">
      <Expandable title="RecursiveChatFactView">
        <ResponseField name="args" type="string[]" required />

        <ResponseField name="confidence" type="number (double)" required />

        <ResponseField name="predicate" type="string" required />

        <ResponseField name="source" type="string" />
      </Expandable>
    </ResponseField>

    <ResponseField name="goal" type="string" required />

    <ResponseField name="mode" type="RecursiveChatMode" required />

    <ResponseField name="org_id" type="string" required />

    <ResponseField name="proof" type="RecursiveChatProof" required>
      <Expandable title="RecursiveChatProof">
        <ResponseField name="cited_rules" type="string[]" required />

        <ResponseField name="completed_tasks" type="string[]" required />

        <ResponseField name="neural_steps" type="integer" required />

        <ResponseField name="planner_steps" type="integer" required />

        <ResponseField name="symbolic_steps" type="integer" required />
      </Expandable>
    </ResponseField>

    <ResponseField name="session_id" type="string" />

    <ResponseField name="success" type="boolean" required />

    <ResponseField name="suggested_actions" type="SuggestedAction[]" required>
      <Expandable title="SuggestedAction">
        <ResponseField name="action_type" type="string" required />

        <ResponseField name="can_auto_execute" type="boolean" required />

        <ResponseField name="execution_status" type="string" required />

        <ResponseField name="label" type="string" required />

        <ResponseField name="missing_inputs" type="string[]" required />

        <ResponseField name="reason" type="string" required />

        <ResponseField name="required_inputs" type="string[]" required />

        <ResponseField name="tool_name" type="string" />
      </Expandable>
    </ResponseField>

    <ResponseField name="tool_calls" type="ToolCall[]" required>
      <Expandable title="ToolCall">
        <ResponseField name="arguments" type="object" required>
          Structured arguments extracted from the message and KB context.
        </ResponseField>

        <ResponseField name="function" type="string" required>
          Function name to invoke (e.g., 'issue\_refund', 'create\_return', 'escalate').
        </ResponseField>

        <ResponseField name="id" type="string" required>
          Unique ID for this tool call.
        </ResponseField>

        <ResponseField name="policy" type="ToolCallPolicy" required />

        <ResponseField name="status" type="string" required>
          Whether this call is ready to execute or needs more context.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="trace" type="RecursiveChatTraceStep[]">
      <Expandable title="RecursiveChatTraceStep">
        <ResponseField name="description" type="string" required />

        <ResponseField name="duration_ms" type="integer (int64)" required />

        <ResponseField name="input" type="object" />

        <ResponseField name="output" type="object" />

        <ResponseField name="step_type" type="string" required />

        <ResponseField name="task_id" type="string" />
      </Expandable>
    </ResponseField>

    <ResponseField name="trace_id" type="string" required />

    <ResponseField name="uncertainty" type="RecursiveChatUncertainty" required>
      <Expandable title="RecursiveChatUncertainty">
        <ResponseField name="aleatoric" type="number (double)" required />

        <ResponseField name="epistemic" type="number (double)" required />

        <ResponseField name="mandatory_review" type="boolean">
          True when review is required for a reason a symbolic proof must NOT override: a safety emergency (medical-emergency language) or the solver explicitly declining. A strong, request-bound symbolic permit may suppress a review driven only by the soft uncertainty threshold, but never this — approving a grounded refund is fine, but a message also reporting a severe reaction still escalates to a human.
        </ResponseField>

        <ResponseField name="requires_human_review" type="boolean" required />

        <ResponseField name="total" type="number (double)" required />
      </Expandable>
    </ResponseField>

    <ResponseField name="validation" type="RecursiveChatValidation">
      <Expandable title="RecursiveChatValidation">
        <ResponseField name="action_execution_eligible" type="boolean" required />

        <ResponseField name="action_execution_reason" type="string" required />

        <ResponseField name="cited_rule_count" type="integer" required />

        <ResponseField name="grounded_entity_count" type="integer" required />

        <ResponseField name="grounded_target_count" type="integer" required />

        <ResponseField name="grounding_status" type="string" required />

        <ResponseField name="llm_backend_live" type="boolean" required />

        <ResponseField name="llm_provider" type="string" required />

        <ResponseField name="proof_score" type="number (double)" required />

        <ResponseField name="proof_status" type="string" required />

        <ResponseField name="symbolic_step_count" type="integer" required />

        <ResponseField name="validation_level" type="string" required />
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

### Status codes

| Code  | Meaning                                            |
| ----- | -------------------------------------------------- |
| `200` | Verified decision with proof                       |
| `400` | Invalid request                                    |
| `401` | Unauthorized — missing or invalid credentials      |
| `402` | Outcome quota exhausted                            |
| `403` | Forbidden — the key/token lacks the required scope |
| `429` | Rate limited — see Retry-After / X-RateLimit-Reset |

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url 'https://api.nsr.stateset.com/v1/decisions' \
    --header 'X-API-Key: YOUR_API_KEY' \
    --header 'Content-Type: application/json' \
    --data '{
    "action": "string",
    "authorization_goal": {
      "args": [
        "string"
      ],
      "name": "Two-Person Tent",
      "negated": true
    },
    "confidence_threshold": 7.5,
    "external_ref": "string",
    "facts": [
      {
        "confidence": 7.5,
        "predicate": {
          "args": null,
          "name": null,
          "negated": null
        },
        "source": "string"
      }
    ],
    "hydrate_org_context": true,
    "include_trace": true,
    "kb_limits": {
      "max_entities": 1,
      "max_properties_per_entity": 1,
      "max_rules": 1,
      "max_triples": 1
    },
    "max_depth": 1,
    "max_iterations": 8,
    "mode": "string",
    "query": "string",
    "rules": [
      {
        "category": "standard",
        "constraints": [],
        "description": "Two-person tent, green — replacement for damaged pole set.",
        "effect": {
          "0": "p",
          "1": "e",
          "2": "r",
          "3": "m",
          "4": "i",
          "5": "t"
        },
        "enabled": true,
        "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "if": [],
        "name": "Two-Person Tent",
        "priority": 1,
        "then": []
      }
    ],
    "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
  }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "action": {
      "confidence": 7.5,
      "name": "Two-Person Tent",
      "ready": true,
      "reason": "Two-person tent, green — replacement for damaged pole set.",
      "rule_conclusion": "string",
      "rule_name": "string"
    },
    "confidence": 7.5,
    "decision": "string",
    "decision_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "dropped_citations": [
      "string"
    ],
    "evaluated_goal": "string",
    "grounding": {
      "cited_rule_count": 1,
      "grounded_entity_count": 1,
      "grounded_target_count": 1,
      "status": "pending"
    },
    "gss_machine": {
      "authority": "string",
      "categories": [
        "string"
      ],
      "classification_confidence": 7.5,
      "domains": [
        "string"
      ],
      "escalation_triggered": true,
      "explanation": "string",
      "grounded_symbol": "string",
      "gss_v3_shadow": {
        "candidate_rules": [],
        "matched_predicates": [],
        "matched_symbols": [],
        "org_scoped": true
      },
      "horn_clauses_fired": [
        "string"
      ],
      "inferred_symbols": [
        "string"
      ],
      "intents": [
        "string"
      ],
      "machine_confidence": 7.5,
      "machine_output": "string",
      "machine_state_version": 1,
      "safety_gate_triggered": true,
      "seed_grounded": true,
      "seed_source": "string",
      "symbol_alignment": 1.5
    },
    "plain_explanation": "string",
    "proof": {
      "cited_rules": [
        "string"
      ],
      "derivation": {
        "authorizing_predicate": "string",
        "cited_org_rules": [],
        "org_facts_used": [],
        "replayable": true,
        "steps": []
      },
      "neural_steps": 1,
      "planner_steps": 1,
      "proof_score": 7.5,
      "proof_status": "string",
      "request_policy_hash": "string",
      "symbolic_steps": 1
    },
    "rationale": "string",
    "refusal": {
      "missing_facts": [
        {
          "args": null,
          "needed_by_rule": null,
          "predicate": null,
          "question": null,
          "resolves_with": null
        }
      ],
      "reason": "Two-person tent, green — replacement for damaged pole set.",
      "requires_human_review": true
    },
    "trace": [
      {
        "description": "Two-person tent, green — replacement for damaged pole set.",
        "duration_ms": 8,
        "input": null,
        "output": null,
        "step_type": "string",
        "task_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
      }
    ],
    "usage": {
      "billable": true,
      "billing_tier": "string",
      "elapsed_ms": 250,
      "iterations": 8,
      "max_depth_reached": 1,
      "outcome_cost_microdollars": 1
    },
    "verifiable_bundle": null,
    "warnings": [
      "string"
    ],
    "x_nsr": {
      "action_results": [
        {
          "action_type": null,
          "details": null,
          "matched_entity_ids": null,
          "status": null,
          "summary": null,
          "tool_name": null
        }
      ],
      "action_runtime": {
        "approved_action_types": [],
        "blocked_action_types": [],
        "executed_action_types": [],
        "execution_receipt": {
          "available_action_types": null,
          "expires_at": null,
          "receipt_id": null
        },
        "lifecycle_stage": "string",
        "prepared_action_types": [],
        "review_required_action_types": []
      },
      "answer": null,
      "assistant_message": "string",
      "audit_trace": [
        {
          "description": null,
          "duration_ms": null,
          "input": null,
          "output": null,
          "step_type": null,
          "task_id": null
        }
      ],
      "context": {
        "hydrated_entities": 8,
        "hydrated_rules": 8,
        "hydrated_triples": 8,
        "request_facts": 1,
        "request_rules": 1,
        "skipped_rule_names": [],
        "skipped_rules": 1
      },
      "cost": {
        "api_surface": "string",
        "billable_outcome": true,
        "billing_tier": "string",
        "elapsed_ms": 250,
        "estimated_cost_units": 1,
        "iterations": 8,
        "max_depth_reached": 1,
        "neural_steps": 1,
        "outcome_cost_microdollars": 1,
        "planner_steps": 1,
        "symbolic_steps": 1
      },
      "explanation": "string",
      "facts": [
        {
          "args": null,
          "confidence": null,
          "predicate": null,
          "source": null
        }
      ],
      "goal": "string",
      "mode": "fast",
      "org_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "proof": {
        "cited_rules": [],
        "completed_tasks": [],
        "neural_steps": 1,
        "planner_steps": 1,
        "symbolic_steps": 1
      },
      "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "success": true,
      "suggested_actions": [
        {
          "action_type": null,
          "can_auto_execute": null,
          "execution_status": null,
          "label": null,
          "missing_inputs": null,
          "reason": null,
          "required_inputs": null,
          "tool_name": null
        }
      ],
      "tool_calls": [
        {
          "arguments": null,
          "function": null,
          "id": null,
          "policy": null,
          "status": null
        }
      ],
      "trace": [
        {
          "description": null,
          "duration_ms": null,
          "input": null,
          "output": null,
          "step_type": null,
          "task_id": null
        }
      ],
      "trace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "uncertainty": {
        "aleatoric": 1.5,
        "epistemic": 1.5,
        "mandatory_review": true,
        "requires_human_review": true,
        "total": 102.12
      },
      "validation": {
        "action_execution_eligible": true,
        "action_execution_reason": "string",
        "cited_rule_count": 1,
        "grounded_entity_count": 1,
        "grounded_target_count": 1,
        "grounding_status": "string",
        "llm_backend_live": true,
        "llm_provider": "string",
        "proof_score": 7.5,
        "proof_status": "string",
        "symbolic_step_count": 1,
        "validation_level": "string"
      }
    }
  }
  ```
</ResponseExample>
