Skip to main content
Glama
Mipiti
by Mipiti

Model Coherence Report

model_coherence_report

Detect inconsistencies between threat model components, control bindings, and reachability gaps. Run this report to surface structural completeness issues before audit.

Instructions

Static-analysis report on coherence between the model's component declarations, the code-binding strings on its controls and assertions, and the structural reachability of every CO.

Pass co_id to scope the report to findings carrying that CO id (the co_* reachability findings + the attestation cross-link findings). Component- and assertion-level findings without a CO binding are excluded in single-CO mode. 404 if the CO doesn't exist on the model.

The report carries up to twelve finding types, grouped below by concern. Each finding includes the entity IDs it concerns (co_id, asset_id, attacker_id, component_id, etc.) so the agent can dispatch the resolution tool directly without re-fetching the model.

Component / assertion bindings:

  • control_component_unknown — control references a component ID that no longer exists. Resolve: assign_to_components (target_type="control").

  • asset_component_unknown — asset references a missing component. Resolve: edit_asset (with corrected component_ids).

  • assertion_repo_mismatch — an assertion's repo does not match the repo_url of any component scoping its control. Resolve: rebind the assertion or rescope the control.

  • assertion_repo_orphan — an assertion has a repo but its control is unscoped. Resolve: assign_to_components (target_type="control") to scope the control, or correct the assertion's repo.

  • control_unscoped_with_scoped_assertions — control is unscoped, but its assertions all carry a single component's repo. Resolve: assign_to_components (target_type="control") to that component.

  • component_unbound — a component has no repo_url. Two cases, told apart by the component's trust boundary. An internal-zone component (your own code) that isn't linked yet: resolve with edit_component pointing at the real repo. An external-zone component (e.g. a third-party service, the customer's IdP, or other external infrastructure you call but don't own): leave it unbound — the finding is a permanent, auditor-visible external- dependency marker, NOT a TODO. Never bind an external component to your repo to silence this; "some client code touches it" is not a reason to bind (that client code lives in your repo for every dependency).

Reachability findings (deterministic composer; indeterminate verdicts surface as findings, never auto-decided by an LLM):

  • co_attacker_unpositioned — the CO's attacker has no positioned trust boundaries. Resolve by REPAIRING THE MODEL: edit_attacker (set trust_boundary_ids).

  • co_asset_unbounded — the CO's asset has no component-derived trust boundaries. Resolve by REPAIRING THE MODEL: assign_to_components (target_type="asset") or edit_asset (with component_ids).

  • co_no_shared_boundary — attacker and asset boundaries do not intersect. Resolve by REPAIRING THE MODEL: re-position the attacker via edit_attacker, or scope the asset to a shared component via assign_to_components (target_type="asset").

    An indeterminate verdict means the derivation could not decide, so the first move is to supply the structure it is missing. It does NOT mean the objective is inapplicable, and asserting that it is would answer a structural question with a judgment.

    co_no_shared_boundary can also fire where the connecting structure genuinely does not exist rather than merely going unstated, so supplying it is the first thing to try, not a guaranteed resolution. If the boundaries really do not meet, that is still a modelling answer.

    If the objective genuinely does not apply to this system, that is a separate claim: record it with create_co_disposition, which keeps the objective visible, owned and expiring rather than hiding it.

  • co_missing_entity — the CO references a missing asset/attacker; model state inconsistent. Resolve: restore the entity (restore_entity (entity_type="asset") / restore_entity (entity_type="attacker")) or remove the orphaned CO via refine_threat_model.

Use this before relying on component-scoped control discovery, when assertion verification fails for path/repo reasons, or to enumerate structural-completeness gaps the operator should address before treating the model as audit-ready. get_reachability_verdicts exposes the underlying composer verdicts directly when the finding-shape summary isn't enough.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
co_idNoOptional CO id to scope the report to a single CO.
model_idYesID of the threat model.
server_versionYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Addedv0.62.2
  2. Removedv0.62.2
  3. First observedv0.57.0

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and discharges it exceptionally: it discloses the 404 error case, the exclusion semantics of single-CO mode, that findings embed entity IDs for direct dispatch, and two non-obvious guardrails — indeterminate verdicts must never be auto-decided by an LLM, and external-zone components are permanent auditor-visible markers that must not be bound just to silence a finding. These are genuine behavioral traits no annotation schema would convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (well over 500 words), yet almost every sentence is decision-relevant: each finding type carries its resolution routing, and the guardrails prevent costly agent misbehavior. The structure is logical — purpose, scoping parameter, finding catalog, usage — though the indeterminate-verdict prose paragraphs interrupt the reachability finding list and could be folded into the reachability preamble without losing scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool with an output schema, this is near-totally complete: every listed finding is routed to a concrete resolution tool, the single-CO scoping model and 404 case are documented, and the 'objective doesn't apply' path is correctly deferred to create_co_disposition. Two minor gaps remain: the description promises 'up to twelve finding types' but catalogs ten, and the attestation cross-link findings are named but never defined.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% (co_id and model_id documented, server_version not), so the schema does partial work. The description substantially enriches co_id, the operative parameter, by spelling out the scoping behavior, which finding classes are excluded in single-CO mode, and the 404 condition — all beyond the schema's one-line gloss. model_id and server_version receive no extra treatment, but they are mechanically obvious API arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states precisely what the tool produces — a static-analysis report on coherence among component declarations, code-binding strings, and CO structural reachability — naming both the resource (the threat model) and the analysis dimension. It also explicitly distinguishes itself from the sibling get_reachability_verdicts, which is positioned as the lower-level composer-verdict view, so an agent can tell the two apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use list: before relying on component-scoped control discovery, when assertion verification fails for path/repo reasons, or when enumerating structural-completeness gaps before audit. It closes with a named alternative — get_reachability_verdicts — plus the condition that selects it, which is exactly the exclusion guidance the rubric asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools