get_reachability_verdicts
Evaluate threat model reachability verdicts across flat or composed topologies, returning structured reasons and boundary IDs for triage and auditing.
Instructions
Per-CO reachability verdicts for a model — flat or composed topology.
composed selects which topology the verdicts are derived over:
composed=False(default) — FLAT: verdicts over THIS model's own structural primitives only (components, asset.component_ids, trust_boundary.passes, attacker.trust_boundary_ids + attack_vector, Assumption.exclusion predicates). Pure derivation, NOT persisted on the CO — re-running against the model JSON is deterministic, the verification an auditor performs. Passco_idto retrieve a single verdict (skips the cross-CO loop);page/page_size/kind_filterare ignored in this mode. Returns{model_id, model_version, verdicts: [...]}where each verdict carriesco_id,kind("reachable" | "unreachable" | "indeterminate"),reason(structural label:boundary_blocks_vector/assumption_excludes/attacker_unpositioned/asset_unbounded/no_shared_boundary/missing_entity),narration, and (when applicable)boundary_id/assumption_id.composed=True— COMPOSED: the same verdict semantics evaluated over the merged effective tree (own components and trust boundaries combined with everything inherited from ancestors, qualified ids for cross-model references). Use this when the model is a child on the composition tree and you need reach state that reflects the ancestor topology, not just the local model document. Paginated viapage/page_sizeand filterable viakind_filter;co_idis ignored (the composed surface has no single-CO lookup). Returns{model_id, flag_enabled, verdicts: [{co_qid, asset_qid, attacker_qid, kind, reason}, ...], total, page, page_size}. When composition is disabled on the backend,verdictsis empty andflag_enabled: false— fall back tocomposed=Falsefor the per-model derivation.
When a flat verdict is indeterminate, address the gap via the standard model-edit affordances:
attacker_unpositioned→edit_attackersettingtrust_boundary_idsasset_unbounded→assign_to_components (target_type="asset")oredit_assetwithcomponent_idsno_shared_boundary→ re-position attacker, re-scope asset, ORadd_assumptionwith structured exclusionmissing_entity→ restore the missing asset/attacker, or remove the orphaned CO
Use this before relying on per-CO reach state for triage,
auto-remediation, or audit responses. The model_coherence_report
tool surfaces the same gaps as actionable findings; this tool exposes
the raw verdicts when you need the structured data (boundary_id
citations, narration strings) that the findings summarize.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | COMPOSED mode only. 1-indexed page number (default ``1``). Ignored when ``composed=False``. | |
| co_id | No | FLAT mode only. Optional CO id — when set, returns a single verdict; 404 if the CO doesn't exist or is tombstoned. Ignored when ``composed=True``. | |
| composed | No | When False (default), derive over this model's own topology (flat). When True, derive over the composed effective tree (own ⊕ inherited). | |
| model_id | Yes | ID of the threat model. | |
| page_size | No | COMPOSED mode only. Verdicts per page (default ``100``). Ignored when ``composed=False``. | |
| kind_filter | No | COMPOSED mode only. Restrict verdicts to one kind — one of ``"reachable" | "unreachable" | "indeterminate"``. Named ``kind_filter`` (not ``kind``) to disambiguate from the verdict object's own ``kind`` field. When omitted, all verdict kinds are returned. Ignored when ``composed=False``. | |
| server_version | Yes |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||