Skip to main content
Glama

audit_class_purity

Read-onlyIdempotent

Scan every Blueprint class under a content root and flag inheritance chains that enter upstream base libraries without passing through a declared thin fork.

Instructions

Project-wide "fork purity" audit of INHERITANCE lineage (complements audit_fork_refs, which audits a fork's INTERNAL refs). Walks every Blueprint UClass under class_root, ascends each parent chain to the point where it leaves class_root, and flags any project class whose chain crosses DIRECTLY into an upstream base library (base_libraries, e.g. /Game/VendorPack) WITHOUT going through a declared thin fork -- a class carrying the fork-origin metadata tag (project setting Fork Origin Tag) that fork_class_chain writes. Catches a new asset that inherits straight from a vendored library instead of via a project fork. Read-only: classes are loaded to resolve the chain (like audit_replication) but never saved. Returns a summary plus the full per-class classification and the actionable violation list inline. NOTE: matches exact UBlueprint assets (as audit_replication/audit_fork_refs do); Widget/Anim blueprints are out of scope for v1. A legit fork created without the fork-origin tag reports as a violation -- back-fill it with set_asset_metadata_tag. The tag is also CHECKED FOR TRUTH, not just for presence: the class it names must really be in the fork point's ancestor chain (the full chain, so declaring a grandparent is fine). A class that declares a fork origin it does not actually descend from -- a copy-sibling rather than a child, or a stale tag left behind by a re-parent -- reports verdict fork_origin_mismatch, whatever its boundary looks like; that also catches copies parented straight to a native class, which the boundary check alone would wave through as native_rooted.

Returns: { class_root: string, base_libraries: [string], summary: { class_count: int, pure_fork_count: int, native_rooted_count: int, other_parent_count: int, violation_count: int (missing_fork_tag + fork_origin_mismatch; == violations.length), missing_fork_tag_count: int, fork_origin_mismatch_count: int, distinct_impure_fork_points: int }, classes: [{ class, package, immediate_parent, fork_point, boundary_parent, boundary_kind, boundary_library, is_declared_fork, fork_origin, fork_origin_in_chain: bool, fork_origin_matched_ancestor: string, fork_origin_exists: bool, verdict: "pure_fork"|"native_rooted"|"other_parent"|"violation"|"fork_origin_mismatch" }], violations: [{ class, kind: "missing_fork_tag"|"fork_origin_mismatch", fork_point, boundary_parent, boundary_library, declared_fork_origin?, actual_immediate_parent?, fork_origin_exists?, actual_ancestor_chain?: [string], detail? }], message: string }

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
max_depthNoMax parent-chain steps to ascend within class_root (clamped 1..256). Defaults to 32.
recursiveNoOptional bool (default true). Recurse into subfolders.
class_rootNoOwn content tree to audit. Defaults to the project setting Project Content Root ("/Game" unless configured).
max_resultsNoCap on classes processed (clamped 1..100000). Defaults to 5000.
base_librariesNoArray of upstream roots a project class must not inherit from directly. Defaults to the project's Read Only Content Roots.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the readOnlyHint/destructiveHint annotations, it discloses that classes are loaded to resolve the chain but never saved, how the walk ascends parent chains, the truth-checking of the fork-origin tag, and the exact edge case where a copy-sibling or stale tag yields fork_origin_mismatch. This is behavioral context the annotations alone cannot 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?

Purpose, scope and the 'complements audit_fork_refs' framing are front-loaded, and the explicit 'Returns: {...}' block is justified because there is no output schema. The prose is dense and long, but given the audit's many verdicts and edge cases nearly every sentence carries actionable information.

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

Completeness5/5

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

With no output schema, the description fully specifies the return shape (summary counters, per-class classification array, violations array) and explains every verdict and violation kind. For a complex audit tool this leaves nothing an agent needs missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the five parameters are already documented with types, defaults and clamping. The description adds a little framing (class_root is the tree walked, base_libraries e.g. /Game/VendorPack, defaults drawn from project settings) but no format/syntax detail beyond the schema, so baseline 3 is correct.

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 names a specific verb+resource ('Project-wide "fork purity" audit of INHERITANCE lineage') and immediately distinguishes it from the sibling audit_fork_refs ('which audits a fork's INTERNAL refs'). An agent can tell exactly what this tool does and how it differs from the nearest alternative without opening any schema.

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?

It states the concrete scenario it exists for ('Catches a new asset that inherits straight from a vendored library instead of via a project fork') and repeatedly routes to alternatives (audit_fork_refs for internal refs, audit_replication for the load pattern, set_asset_metadata_tag to back-fill a missing tag). Scope limits are explicit ('Widget/Anim blueprints are out of scope for v1').

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