juce-guide — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited juce-guide (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Five steps from empty folder to distributable plugin. Do each step in order; skip none.
add_subdirectory(JUCE).juce_add_plugin(MyPlugin FORMATS VST3 AU Standalone ...) to declare the plugin target.PLUGIN_MANUFACTURER_CODE, PLUGIN_CODE, IS_SYNTH, NEEDS_MIDI_INPUT in the same call.juce::juce_audio_processors juce::juce_audio_utils juce::juce_dsp to the target.juce::AudioProcessor; override prepareToPlay, releaseResources, processBlock.prepareToPlay: store sampleRate and maximumBlockSize, allocate internal buffers, reset all state (filters, envelopes, delay lines — unconditionally).processBlock: read only pre-cached raw parameter pointers; never allocate, never call JUCE String ops or DBG().getStateInformation / setStateInformation using apvts.copyState() and apvts.replaceState() with a MemoryOutputStream / MemoryBlock.createParameterLayout() method that returns AudioProcessorValueTreeState::ParameterLayout.apvts(*this, nullptr, "Parameters", createParameterLayout()) as a member.gainParam = apvts.getRawParameterValue("Gain").processBlock, dereference with gainParam->load() — no APVTS calls on the audio thread.AudioProcessorValueTreeState::ParameterAttachment (or SliderAttachment) in the editor, never in the processor.juce::AudioProcessorEditor; call setSize(w, h) in the constructor.paint for background / labels; override resized to lay out components with setBounds.juce::Slider members; attach each via juce::AudioProcessorValueTreeState::SliderAttachment.cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build --config Releasebuild/MyPlugin_artefacts/Release/.codesign --deep --force --sign "Developer ID Application: ..." MyPlugin.vst3 then spctl --assess --verbose MyPlugin.vst3.xcrun notarytool submit MyPlugin.pkg --apple-id ... --wait.AudioPluginHost utility (extras/AudioPluginHost).| Pitfall | Correct approach |
|---|---|
Calling apvts.getParameter() in processBlock | Cache getRawParameterValue() once after APVTS construction |
Allocating in processBlock | Allocate in prepareToPlay only |
Not resetting state on prepareToPlay re-entry | Always reset unconditionally |
| Storing editor pointer in processor | Use createEditor() factory; processor owns no editor reference |
Missing JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR | Add to every AudioProcessor and AudioProcessorEditor subclass |
Use the juce-review skill to audit finished processor code for thread-safety violations.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.