Skip to content

Audit rules

Every scan runs the audit rules on each scanned asset. A finding has a rule id, a severity (Error, Warning or Info; Info findings are called Suggestions in the panel), a message and, where possible, the graph and node it is about. Findings with a node open the Blueprint editor at that node (Go to node in the panel).

Rule id Name Setting Default severity Default limit
Compile Compile Compile errors and warnings Error or Warning, as reported by the compiler –
Graph.Large Large graph Large graphs Warning more than 100 nodes in a graph
Blueprint.Large Large Blueprint Large graphs Warning more than 300 nodes in a Blueprint
Tick Event Tick Event Tick Warning above the limit, Info otherwise 20 nodes
References.Heavy Hard references Hard reference weight Warning more than 50 MB
Cast.Blueprint Cast to Blueprint Casts to Blueprints Info –
References.Circular Circular reference Circular references Warning –
Variable.Unused Unused variable Unused variables Warning for private variables, Info otherwise –
Nodes.Dead Dead nodes Dead and disabled nodes Warning –
Nodes.UnusedPure Unused results Dead and disabled nodes Info –
Nodes.Disabled Disabled nodes Dead and disabled nodes Info –
Nodes.Deprecated Deprecated node Deprecated nodes Warning –
Docs.Missing Missing description Missing descriptions Info –

All rules are on by default. The rule id appears in scribe.json and in the commandlet output; the name appears in the panel, on the pages, in the AI-ready text and in Data Validation messages.

The complexity score and the C++ migration score are not rules: they create no findings and don’t change the health score.

Open Edit > Project Settings > Plugins > ta Blueprint Scribe (or the settings button in the panel) and expand Audit > Rules. Each setting in the Setting column above turns its rules on or off. The limits are:

Setting Default Minimum Used by
Max Nodes Per Graph 100 10 Graph.Large
Max Nodes Per Blueprint 300 10 Blueprint.Large
Tick Nodes Warning 20 1 Tick
Hard Reference Warning MB 50 1 References.Heavy

The severities are fixed by the rules. To decide which severities count, use Min Validation Severity for Data Validation and -FailOn for the commandlet. Changes apply to the next scan. See Settings.

Most rules look at the graphs of a Blueprint and only run on Blueprints. Hard references and Missing description also run on structures and enums. Circular reference compares all assets of one scan with each other.

Node counts never include comment boxes, reroute nodes or the disabled placeholder events (such as BeginPlay and Tick) that the editor adds to new Blueprints.

Reports Blueprints whose compile status is Error or Up to date with warnings. Blueprint Scribe doesn’t compile Blueprints itself; it reads the status and the compiler messages stored on the nodes.

  • Each node with a compiler error becomes an Error finding at that node, each node with a compiler warning a Warning finding.
  • A warning about a deprecated node is reported by the Deprecated node rule instead, with the engine’s deprecation message, when that rule is on.
  • Other compiler messages, such as notes, are not reported.
  • If the status is Error or Warnings but no node has a message, one finding without a node is reported: “The Blueprint has compile errors. Open and compile it to see them.” (Error) or “The Blueprint compiles with warnings. Open and compile it to see them.” (Warning).

Example:

Set Score in 'EventGraph': Could not find a variable named "Score" in '/Game/ScribeTest/Blueprints/BP_Broken.BP_Broken_C'.

Graph.Large reports every graph with more nodes than Max Nodes Per Graph (default 100). Every graph is checked on its own: Event Graphs, functions, macros, collapsed graphs and Animation Blueprint graphs. A collapsed graph counts as one node in its parent graph.

Blueprint.Large reports a Blueprint whose graphs together have more nodes than Max Nodes Per Blueprint (default 300).

Both are Warnings and are turned on and off together with Large graphs. Examples:

'EventGraph' has 131 nodes (limit 100). Move parts of it into functions, macros or collapsed graphs.
The Blueprint has 322 nodes (limit 300). Consider splitting it into components, a parent class or C++.

Reports enabled tick events that override a function named ReceiveTick (the Event Tick of Actors and Actor Components, for example) or Tick (the Event Tick of Widget Blueprints), and counts the nodes they run every frame: all nodes reached by following the exec wires from the event. Pure nodes that only provide data are not counted, and a function call, macro or collapsed graph counts as one node.

  • More nodes than Tick Nodes Warning (default 20): Warning.
  • At least one node, up to the limit: Info.
  • An Event Tick with nothing connected is not reported.

Example:

Event Tick runs 24 nodes every frame. Timers, events or a lower tick interval are often cheaper.

For every scanned asset, Blueprint Scribe follows its hard package references recursively, using the Asset Registry, and adds up the disk size of all packages that are loaded together with it. C++ (/Script) packages are not counted. Engine and plugin content is.

If the total is larger than Hard Reference Warning MB (default 50; 1 MB = 1024 × 1024 bytes), a Warning names the total and the three direct references that bring in the most, each with the size it loads:

Loading this asset also loads <packages> packages (<size>) through hard references. Biggest: <asset> (<size>), <asset> (<size>), <asset> (<size>). Soft references or interfaces keep heavy content out of memory until it is needed.

The Hard refs column of the panel and the Hard references fact on each page show the total for every asset, also below the limit.

Reports cast nodes whose target is a Blueprint class. A cast to a Blueprint makes the casting Blueprint load the target. Casts to C++ classes, casts to the Blueprint itself or to its own parent classes, and disabled cast nodes are not reported.

There is one Info finding per target Blueprint, at the first cast node to it:

Casts to BP_Key. The cast target is loaded together with this Blueprint; an interface avoids that.
Casts to <Blueprint> <count> times. The cast target is loaded together with this Blueprint; an interface avoids that.

The second form is used when the Blueprint casts to the same target more than once.

Finds groups of scanned assets that hard reference each other, directly or through other scanned assets (A loads B, B loads A). Every asset in such a cycle gets its own Warning that names the others (up to five names, then “and N more”):

Hard reference cycle with BP_Door. Each of them loads all the others; an interface or a soft reference breaks the cycle.

Only references between assets of the same scan are considered. Scanning a single Blueprint, and Data Validation, which checks one asset at a time, don’t report cycles.

Reports member variables that no graph of the Blueprint reads or writes.

  • Private variables: Warning, “Private variable ‘UnusedCounter’ is not used in any graph.”
  • Other variables: Info, because other Blueprints may still use them: “Variable ‘Settings’ is not used in any graph of this Blueprint (other Blueprints may still use it).”

Local variables and event dispatchers are not checked. Unused variables are also marked Unused in the documentation.

Dead nodes, Unused results and Disabled nodes

Section titled “Dead nodes, Unused results and Disabled nodes”

All three are checked per graph when Dead and disabled nodes is on. Each produces at most one finding per graph, at the first node, listing up to five node titles (“and N more” for the rest).

Rule Severity Reports
Nodes.Dead Warning Nodes with an exec input that nothing is connected to, so they never run
Nodes.UnusedPure Info Pure nodes with outputs, none of which is connected
Nodes.Disabled Info Disabled nodes

Events, function entry and result nodes and the entry and exit of macros and collapsed graphs are not reported as dead. Disabled nodes are only reported as disabled. Examples:

1 node in 'EventGraph' never runs because nothing is connected to the exec input: Print String.
1 pure node in 'EventGraph' has no connected output: Get Actor Location.
1 disabled node in 'EventGraph': Print String.

Reports every node that is deprecated or uses something deprecated, such as a deprecated function, as a Warning at the node. The message includes the first line of the engine’s deprecation message, which usually names the replacement:

'Get Unique Device Id' in 'EventGraph' is deprecated: Usage of 'Get Unique Device Id' has been deprecated. Use GetDeviceId instead

If the engine gives no message, the finding reads '<node>' in '<graph>' is deprecated.

Reports members without a description as Info findings. Each asset gets up to three findings:

Finding When Example
The asset itself The asset has no description No description. Add one in Class Settings > Description.
Functions and events Functions (also private ones), custom events, macros or event dispatchers without a description. Overridden functions and events, and implementations of interface functions, are not checked. 2 functions and events have no description: HelperNoDocs, Slam.
Variables Variables that are not private and have no tooltip; for structures, fields without a tooltip 1 public variable has no tooltip: OpenSpeed.

For structures the hint reads “Add a tooltip in the structure editor.”, for enums “Add an Enum Description in the enum editor.”, and for missing field tooltips “1 field has no tooltip: OpenAngle.” Up to five names are listed, then “and N more”.

Blueprint Scribe reads the descriptions you already enter in the editor. It doesn’t write anything into your assets.

Member Description is read from
Blueprint Class Settings > Description
Function The function’s Description in the Details panel
Custom event The custom event’s Description, or its node comment when the description is empty
Macro The macro’s Description
Event dispatcher The dispatcher’s tooltip, or the description of its signature, in the Details panel
Variable The variable’s Tooltip
Component The component’s Tooltip (shown, but not counted for coverage)
Structure The structure’s tooltip in the structure editor
Structure field The field’s Tooltip
Enum Enum Description in the enum editor
Enum entry The entry’s Description

Overridden events such as BeginPlay show the engine’s description, or the node comment if the node has one. These are not counted for coverage.

health score = assets without Error or Warning findings ÷ scanned assets × 100, rounded

Info findings don’t lower the score. With no scanned assets the score is 100. The panel shows it in the Blueprint health ring (green from 80, amber from 50, red below), the HTML overview and audit pages and scribe.json (healthScore) show it too, and the commandlet logs it.

coverage = documented members ÷ documentable members

Members are added up over all scanned assets, so an asset with many members weighs more than a small one. A member is documented when its description isn’t empty. These members count:

Asset Documentable members
Blueprint The Blueprint itself, its functions (also private ones) except overrides and interface implementations, custom events, macros, event dispatchers and variables that are not private
Structure The structure itself and every field
Enum The enum itself and every entry

An asset with nothing to document counts as 100 %. Each asset’s own coverage is shown in the panel, on its page and as docCoverage in scribe.json.