webaudio-guide — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited webaudio-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.
AudioContext inside a user gesture handler (click, keydown) to satisfy autoplay policy.await audioContext.audioWorklet.addModule('path/to/processor.js') before creating nodes.?worker&url import).audioContext.state and call audioContext.resume() if it is 'suspended'.AudioWorkletProcessor in a separate file; call registerProcessor('name', Class) at module scope.process(inputs, outputs, parameters) — inputs[n][channel] and outputs[n][channel] are Float32Array views for the current render quantum. Use .length in loops instead of hardcoding 128.constructor(); never create objects or arrays inside process().AudioParams via static get parameterDescriptors() returning an array of { name, defaultValue, minValue, maxValue, automationRate } descriptors.true from process() to keep the processor alive; false or no return shuts it down.new AudioWorkletNode(ctx, 'name', options).node.connect(destination) and source.connect(node) to build the signal path; AudioContext.destination is the hardware output.AudioParams via node.parameters.get('paramName') — set .value for immediate changes..linearRampToValueAtTime(), .setTargetAtTime(), or .setValueCurveAtTime() on the AudioParam.node.disconnect(), then source.stop(), then audioContext.close().this.port.postMessage() / node.port.onmessage for low-frequency control (meters, state changes, error reporting).SharedArrayBuffer and read/write integer views with Atomics.load() / Atomics.store(). Scale floats to integers or bit-cast through a private buffer; Atomics does not operate on Float32Array.COOP: same-origin + COEP: require-corp response headers) is required for SharedArrayBuffer.await navigator.requestMIDIAccess({ sysex: false }); handle the MIDIAccess object on success.midiAccess.inputs.forEach(input => ...) and attach input.onmidimessage = handler.MIDIMessageEvent.data byte array: data[0] & 0xF0 = status (0x90 = note on, 0xB0 = CC, 0xE0 = pitch bend), data[1] = note/CC number, data[2] = velocity/value.AudioParam targets: normalize 7-bit CC (0–127) to your parameter range and write via .setTargetAtTime() or a SharedArrayBuffer cell for real-time feel.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.