skills/vvvv-troubleshooting/SKILL.md
Diagnoses and fixes common vvvv gamma errors in C# nodes, SDSL shaders, and runtime behavior. Use when encountering errors, exceptions, crashes, red nodes, shader compilation failures, missing nodes in the browser, performance issues, or unexpected behavior.
npx skillsauth add tebjan/vvvv-skills vvvv-troubleshootingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Symptom: Node works but has ugly name in vvvv. Fix: Remove "Node" suffix — vvvv convention forbids it.
// WRONG
[ProcessNode]
public class SteeringBehaviorNode { }
// CORRECT
[ProcessNode]
public class SteeringBehavior { }
Symptom: Pins appear in wrong order or node doesn't compile correctly.
Fix: out parameters must come FIRST in Update signature.
// WRONG
public void Update(float input = 0f, out float result) { ... }
// CORRECT
public void Update(out float result, float input = 0f) { ... }
Symptom: Your C# class exists but doesn't show up in vvvv. Fix: Check these in order:
[assembly: ImportAsIs] attribute exists in your project[ProcessNode] attribute on the classnet8.0lib/net8.0/ path relative to .vl documentSymptom: GC spikes, stuttering, frame drops. Diagnosis: Allocations in the Update loop.
Common culprits:
new keyword in Update method.Where(), .Select(), .ToList())+ operator on strings)int where object expected)Fix: Cache everything, pre-allocate buffers, eliminate LINQ from hot paths.
Symptom: CPU usage high even when nothing changes. Fix: Compare inputs to cached values, only recompute on change.
if (param != _lastParam)
{
_cached = Compute(param);
_lastParam = param;
}
result = _cached; // Always output cached
Symptom: Connected nodes get no data, even though the node "works". Fix: Always output cached result, even when no computation happens.
// WRONG — output is only set inside the if block
public void Update(out float result, float input = 0f)
{
if (input != _last)
{
result = Compute(input);
_last = input;
}
// result is unassigned when input hasn't changed!
}
// CORRECT — always assign output
public void Update(out float result, float input = 0f)
{
if (input != _last)
{
_cached = Compute(input);
_last = input;
}
result = _cached;
}
For SDSL syntax rules, common mistakes, and correct/wrong examples, consult the vvvv-shaders skill and its syntax-rules.md. Key issues: static const scope, missing semicolons, missing override, enum binding format.
Symptom: Memory usage grows over time. Causes:
IDisposable on nodes with native resourcesComPtr<T>) not disposedSymptom: Intermittent crashes, data corruption.
Fix: Update() runs on the main thread. Capture SynchronizationContext in the constructor, then marshal background results back:
private SynchronizationContext _vlSyncContext;
public MyNode()
{
_vlSyncContext = SynchronizationContext.Current!;
}
// From background thread:
_vlSyncContext.Post(_ => { /* runs on VL thread */ }, null);
Symptom: vvvv warns about circular dependency, patch won't compile.
Fix: Insert a FrameDelay node to break the cycle.
Symptom: DLL loads but types aren't found.
Fix: Ensure .csproj targets net8.0 (matching vvvv gamma's runtime).
Symptom: FileLoadException or TypeLoadException at runtime.
Fix: Align package versions with vvvv's bundled versions. Check vvvv's lib/ folder for reference.
For detailed error-to-solution mapping, see error-catalog.md.
development
Set up and run automated tests for vvvv gamma packages and C# nodes -- VL.TestFramework with NUnit for library/package authors (CI-ready), test .vl patches with assertion nodes, and lightweight agent-driven test workflows. Use when writing tests for vvvv packages, setting up test infrastructure, creating test patches, running automated compilation checks, or integrating vvvv tests into CI/CD.
testing
Covers launching vvvv gamma from the command line or programmatically -- normal startup, opening specific .vl patches, command-line arguments, package repositories, and key filesystem paths (install directory, user data, sketches, exports, packages). Use when starting vvvv, configuring launch arguments, setting up package repositories, or finding vvvv's data directories.
development
Helps write code using vvvv gamma's Spread<T> immutable collection type and SpreadBuilder<T>. Use when working with Spreads, SpreadBuilder, collections, arrays, iteration, mapping, filtering, zipping, accumulating, or converting between Span and Spread. Trigger whenever the user writes collection-processing C# code in vvvv — even if they say 'list', 'array', or 'IEnumerable' instead of Spread, this skill likely applies.
development
Helps write SDSL shaders for Stride and vvvv gamma — TextureFX, shader mixins, compute shaders, and ShaderFX composition. SDSL is a superset of HLSL, so use this skill when writing or debugging .sdsl shader files, GPU shaders, visual effects, HLSL code for vvvv, working with the Stride rendering pipeline, composing shader mixins, or any GPU/compute work. Trigger even if the user says 'HLSL', 'shader', 'GPU effect', 'render pass', or 'compute' in a vvvv context.