audit_class_purity
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
| Name | Required | Description | Default |
|---|---|---|---|
| max_depth | No | Max parent-chain steps to ascend within class_root (clamped 1..256). Defaults to 32. | |
| recursive | No | Optional bool (default true). Recurse into subfolders. | |
| class_root | No | Own content tree to audit. Defaults to the project setting Project Content Root ("/Game" unless configured). | |
| max_results | No | Cap on classes processed (clamped 1..100000). Defaults to 5000. | |
| base_libraries | No | Array of upstream roots a project class must not inherit from directly. Defaults to the project's Read Only Content Roots. |