yup-guide — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited yup-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 a working CLAP/VST3/standalone plugin. Do each step in order; skip none.
FetchContent target; disable examples/tests for plugin projects unless needed.yup_audio_plugin (...) to declare the plugin target.TARGET_NAME, TARGET_VERSION, TARGET_APP_ID, TARGET_APP_NAMESPACE, and TARGET_CXX_STANDARD 20.PLUGIN_ID, PLUGIN_NAME, PLUGIN_VENDOR, PLUGIN_VERSION, PLUGIN_DESCRIPTION, PLUGIN_IS_SYNTH, and PLUGIN_IS_MONO.PLUGIN_CREATE_CLAP, PLUGIN_CREATE_VST3, PLUGIN_CREATE_STANDALONE.yup::yup_gui and yup::yup_audio_processors in MODULES.${target_name}_shared; the format targets link against that shared interface target.yup::AudioProcessor.yup::AudioBusLayout, e.g. stereo output:AudioProcessor ("MyPlugin", yup::AudioBusLayout ({}, { yup::AudioBus ("main", yup::AudioBus::Audio, yup::AudioBus::Output, 2) })).
prepareToPlay (float sampleRate, int maxBlockSize), releaseResources(), processBlock (yup::AudioSampleBuffer& audioBuffer, yup::MidiBuffer& midiBuffer), and flush().prepareToPlay: store sample rate, allocate worst-case scratch storage, initialise AudioParameterHandles, and reset all filters, envelopes, oscillators, delay lines, MIDI/voice state, and smoothers.processBlock: assume realtime constraints; no allocation, locks, yup::String formatting, logging, file/network access, or UI calls.getCurrentPreset, setCurrentPreset, getNumPresets, getPresetName, setPresetName, loadStateFromMemory, and saveStateIntoMemory.extern "C" yup::AudioProcessor* createPluginProcessor()
{
return new MyPluginProcessor();
}addParameter (...).yup::AudioParameter::Ptr as a processor member; parameter IDs must be stable and unique.yup::AudioParameterBuilder().withID (...).withName (...).withRange (...).withDefault (...).withSmoothing (...).build().yup::AudioParameterHandle in prepareToPlay with the parameter and sample rate.processBlock, call handle.updateNextAudioBlock() once per block, then use getNextValue() per sample or skip (numSamples) for block ramps.beginChangeGesture() and endChangeGesture(), and use setValueNotifyingHost() for host-visible parameter changes.setValue() or setNormalizedValue() from a non-audio thread, then let the audio handle pick it up next block.yup::AudioProcessorEditor.isResizable(), getPreferredSize(), paint (yup::Graphics&), and resized().AudioParameter::Ptrs and poll values from a yup::Timer for display sync.hasEditor() and createEditor() as the factory boundary.setValueNotifyingHost().cmake -B build -DCMAKE_BUILD_TYPE=Release -DYUP_BUILD_TESTS=OFF -DYUP_BUILD_EXAMPLES=OFFcmake --build build --config ReleasegetLatencySamples() and getTailSamples() and verify hosts receive correct values.| Pitfall | Correct approach |
|---|---|
Reading raw AudioParameter values directly for smoothed DSP | Use AudioParameterHandle initialised in prepareToPlay |
Forgetting updateNextAudioBlock() | Call it once at the top of each audio block before getNextValue() or skip() |
Calling setValueNotifyingHost() from processBlock | Use it from UI/host-control paths; keep audio-thread changes local or lock-free |
| Allocating MIDI voices on note-on | Preallocate a bounded voice pool in prepareToPlay |
Hard-coding stereo processing without matching AudioBusLayout | Declare the layout explicitly and guard channel access |
| Missing state methods | Implement loadStateFromMemory / saveStateIntoMemory; hosts depend on them for recall |
Holding getProcessLock() from UI/background work | Keep state swaps short; the CLAP wrapper uses a try-lock around processing |
Leaving state stale after prepareToPlay or flush() | Reset voices, smoothers, filter history, delay buffers, and pending MIDI unconditionally |
Use the yup-review skill to audit finished processor code for YUP-specific thread, parameter, wrapper, and bus-layout issues.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.