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).
Rules at a glance
Section titled “Rules at a glance”| 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.
Change limits and turn rules off
Section titled “Change limits and turn rules off”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.
Which assets each rule checks
Section titled “Which assets each rule checks”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.
The rules
Section titled “The rules”Compile
Section titled “Compile”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'.Large graph and Large Blueprint
Section titled “Large graph and Large Blueprint”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++.Event Tick
Section titled “Event Tick”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.Hard references
Section titled “Hard references”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.
Cast to Blueprint
Section titled “Cast to Blueprint”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.
Circular reference
Section titled “Circular reference”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.
Unused variable
Section titled “Unused variable”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.Deprecated node
Section titled “Deprecated node”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 insteadIf the engine gives no message, the finding reads '<node>' in '<graph>' is deprecated.
Missing description
Section titled “Missing description”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”.
Where descriptions come from
Section titled “Where descriptions come from”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 and coverage
Section titled “Health and coverage”Health score
Section titled “Health score”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.
Documentation coverage
Section titled “Documentation coverage”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.