Back to skill

Security audit

Strudel Music

Security checks for vulnerabilities and agentic risk

Overview

This is a music rendering skill, but review it first because Discord playback directly uses a bot token and composition files can run with broad local privileges.

Install only if you are comfortable running trusted composition JavaScript and with the skill accessing Discord bot credentials for voice playback. Avoid rendering compositions from unknown sources unless you run them in a container or VM with no secrets, and restrict sample-pack downloads with an allowlist and small size limits.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
src/runtime/chunked-render.mjs:120
Finding
Untrusted Composition Files Execute with Full Node.js Process Privileges<![CDATA[ ## Vulnerability Details **File Location**: `src/runtime/chunked-render.mjs:120-142` **Vulnerability Type**: Arbitrary JavaScript execution without isolation **Risk Level**: High ### Vulnerable Code ```javascript let patternCode = readFileSync(input, 'utf8').replace(/^\/\/ @\w+.*/gm, '').trim(); patternCode = stripVizMethods(patternCode); let pattern; try { const lines = patternCode.split('\n'); let lastExprStart = -1; let depth = 0; for (let i = 0; i < lines.length; i++) { const line = lines[i].trim(); if (!line || line.startsWith('//')) continue; if (depth === 0 && /^(stack|note|s|n|seq|cat|sequence|arrange|slowcat|fastcat)\s*\(/.test(line)) { lastExprStart = i; } for (const ch of line) { if (ch === '(') depth++; if (ch === ')') depth--; } } if (lastExprStart >= 0) { const setup = lines.slice(0, lastExprStart).join('\n'); const expr = lines.slice(lastExprStart).join('\n'); const fn = new Function(setup + '\nreturn ' + expr); pattern = fn(); } else { try { pattern = new Function(patternCode)(); } catch { pattern = new Function('return ' + patternCode)(); } } } ``` ### Technical Analysis The renderer reads an arbitrary JavaScript composition and evaluates it through the `Function` constructor in the main renderer process. `new Function()` is not a sandbox. Evaluated code can access globally available Node.js objects and APIs and executes with the same operating-system identity and privileges as the renderer. The renderer does not apply the partial environment and `child_process` restrictions found in `offline-render-v2.mjs`. The visualization-method stripping routine is a compatibility transformation, not a security control, and does not prevent compositions from reading files, modifying files, accessing environment variables, or making network requests. The documentation warns users to trust or review compositions, but this warning does not create an enforceable privilege boundary. ...[truncated 1316 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Execute every composition in a separate, disposable sandbox rather than in the primary renderer process. 2. Use a container or equivalent operating-system isolation with: - No inherited secrets or credentials. - Network access disabled by default. - A read-only root filesystem. - A narrowly scoped writable output directory. - Explicit CPU, memory, process, and execution-time limits. - A non-privileged user and no additional Linux capabilities. 3. Replace unrestricted JavaScript compositions with a declarative composition format or a validated abstract syntax tree containing only approved Strudel operations. 4. If JavaScript support must remain, statically reject imports, dynamic imports, `Function`, `eval`, filesystem APIs, process APIs, network APIs, and constructor-based escapes. Static filtering should supplement, not replace, process isolation. 5. Do not pass the parent process environment into the renderer. 6. Treat AI-generated and externally supplied compositions as untrusted by default. 7. Make the safer isolated renderer the default entry point and add automated tests proving that compositions cannot read secrets, write outside the output directory, spawn processes, or access the network. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/vc-play.mjs:24
Finding
Discord Playback Script Directly Loads and Uses the OpenClaw Bot Credential<![CDATA[ ## Vulnerability Details **File Location**: `scripts/vc-play.mjs:24-37, 101`; contradictory documentation at `SKILL.md:482-484` **Vulnerability Type**: Excessive credential access and least-privilege violation **Risk Level**: Medium ### Vulnerable Code ```javascript // Load env const vcEnvPath = process.env.OPENCLAW_DISCORD_VC_ENV_FILE || join(process.env.HOME, '.config/openclaw/openclaw-discord-vc.env'); dotenv.config({ path: vcEnvPath }); // Also load main openclaw env for bot token const mainEnvPath = process.env.OPENCLAW_ENV_FILE || join(process.env.HOME, '.config/openclaw/openclaw.env'); dotenv.config({ path: mainEnvPath }); const audioFile = process.argv[2]; if (!audioFile) { console.error('Usage: node scripts/vc-play.mjs <audio-file> [--channel <id>]'); process.exit(1); } const channelIdx = process.argv.indexOf('--channel'); const channelId = channelIdx >= 0 ? process.argv[channelIdx + 1] : process.env.DISCORD_VC_CHANNEL_ID; const botToken = process.env.DISCORD_BOT_TOKEN; ``` The credential is then sent through the Discord authentication flow: ```javascript client.login(botToken); ``` The implementation conflicts with the security statement in `SKILL.md:482-484`: ```markdown This skill uses OpenClaw's built-in Discord voice channel support for streaming. **No separate `BOT_TOKEN`, `DISCORD_TOKEN`, or any Discord credentials are required.** OpenClaw handles all Discord authentication and connection management. ``` ### Technical Analysis The script does not merely submit an audio file to an already authenticated OpenClaw voice subsystem. It reads the main OpenClaw environment file, extracts `DISCORD_BOT_TOKEN`, creates a separate Discord client, and authenticates that client directly. Sending the token to Discord through `client.login()` is expected for Discord authentication and is not evidence that the token is sent to an attacker-controlled endpoint. The security concern is that the Skill obtains direct access to a high-va ...[truncated 1334 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Implement the documented architecture: send the audio file to OpenClaw's existing authenticated voice subsystem without exposing the bot token to the Skill. 2. Remove direct reads of `~/.config/openclaw/openclaw.env` from `vc-play.mjs`. 3. If direct Discord authentication is indispensable: - Update the documentation and manifest to disclose the credential requirement. - Pass only the required token and channel identifier to an isolated process. - Do not load the complete main OpenClaw environment. - Use a dedicated, narrowly scoped Discord bot credential rather than a broadly privileged shared token. - Restrict credential-file permissions to the owning account. 4. Ensure logs and exception handlers never print token-bearing objects or environment contents. 5. Add automated tests that verify the playback process cannot access unrelated OpenClaw environment variables. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/samples-manage.sh:108
Finding
ZIP Archive Path Validation Is Performed Only After Extraction<![CDATA[ ## Vulnerability Details **File Location**: `scripts/samples-manage.sh:108-122` **Vulnerability Type**: Unsafe archive extraction and ineffective post-extraction traversal validation **Risk Level**: Medium ### Vulnerable Code ```bash case "$FILENAME" in *.zip) echo "Extracting ZIP..." # Zip slip protection: extract to temp, then validate all paths unzip -q "$TMP/$FILENAME" -d "$TMP/extracted" # Check for path traversal in extracted files while IFS= read -r entry; do RESOLVED=$(realpath -m "$TMP/extracted/$entry" 2>/dev/null) if [[ "$RESOLVED" != "$TMP/extracted"* ]]; then echo "❌ ZIP SLIP DETECTED: $entry escapes extraction directory. Aborting." rm -rf "$TMP" return 1 fi done < <(unzip -l "$TMP/$FILENAME" 2>/dev/null | awk 'NR>3{print $NF}' | grep -v '^$' | head -1000) ;; ``` ### Technical Analysis The script describes this logic as ZIP-slip protection, but it invokes `unzip` before validating archive entry paths. Security validation performed after extraction cannot prevent writes that already occurred. If the platform's archive extractor accepts an unsafe absolute path, parent-directory traversal path, or problematic link entry, the archive may create or overwrite a file outside the intended temporary extraction directory before the script reports the issue. The validation is also limited to the first 1,000 entries because of `head -1000`. Entries after that limit are not checked by this loop. MIME checking does not mitigate path traversal because it only establishes the broad file type. ### Attack Path 1. An attacker hosts a crafted ZIP file containing normal WAV files plus a malicious traversal, absolute-path, or link-related entry. 2. A user invokes `samples-manage.sh add` with the attacker's URL. 3. The script downloads the archive and accepts its MIME type. 4. `unzip` extracts the archive before the entry names are validated. 5. On an extractor or platform that hon ...[truncated 607 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. List and validate every archive entry before invoking any extraction command. 2. Reject: - Absolute paths. - Paths containing parent-directory components. - Windows drive-prefixed paths. - Symbolic links and hard links. - Empty or malformed names. - Archives exceeding explicit entry-count, expanded-size, or nesting limits. 3. Remove the 1,000-entry validation truncation or reject archives exceeding the configured maximum entry count. 4. Prefer an archive library that resolves each output path and enforces containment under the destination directory before creating the file. 5. Extract as a non-privileged user into a newly created directory with restrictive permissions. 6. After extraction, perform a second containment and file-type check as defense in depth, but do not rely on post-extraction validation as the primary control. 7. Add regression tests containing traversal paths, absolute paths, symlinks, hard links, and malicious entries placed after entry 1,000. ]]>

T08 · Insecure Dependencies

Note
Location
scripts/download-samples.sh:14
Finding
Setup Downloads Mutable Unpinned Sample Content Without Integrity Verification<![CDATA[ ## Vulnerability Details **File Location**: `scripts/download-samples.sh:14-17` **Vulnerability Type**: Unpinned external dependency and missing asset integrity verification **Risk Level**: Low ### Vulnerable Code ```bash git clone --filter=blob:none --sparse https://github.com/tidalcycles/Dirt-Samples.git "$TMP" 2>&1 cd "$TMP" git sparse-checkout set bd sd hh oh cp cr ride rim mt lt ht cb 808bd 808sd 808hc 808oh mkdir -p "$SAMPLES_DIR" ``` The installation instruction automatically invokes the download script: ```yaml script: "npm install && bash scripts/download-samples.sh" ``` ### Technical Analysis The setup process clones the current default branch of an external GitHub repository without selecting a reviewed commit or verifying hashes for the copied files. Consequently, the installed content can change after the Skill package has been audited. Only selected sample directories are copied, and the downloaded repository's scripts are not executed. This substantially reduces the risk compared with remote code retrieval and execution. However, mutable files are still subsequently parsed by audio-processing components, so upstream compromise or unexpected repository changes remain a supply-chain concern. This finding is therefore classified as an insecure dependency practice rather than remote payload execution. ### Attack Path 1. The upstream repository, its maintainer account, or its default branch is compromised or changed. 2. A user runs the Skill's setup command. 3. The script clones the current mutable default branch. 4. No commit allowlist or file hash validation detects the change. 5. Altered sample files are copied into the project and later processed by the renderer or audio libraries. ### Impact Assessment An attacker controlling the upstream content can modify the sample assets installed by future setup runs. Direct script execution is not present in this path, so arbitrary code execution is not established by the audited code ...[truncated 265 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the sample repository to a reviewed immutable commit hash. 2. Maintain a manifest of expected file paths, sizes, and cryptographic hashes. 3. Verify the checked-out commit and every copied asset before installation. 4. Fail closed if the commit, file list, or hash manifest differs from the reviewed version. 5. Apply explicit download-size and file-count limits to the default installer. 6. Prefer publishing a versioned, hash-verified asset archive rather than cloning a mutable branch. 7. Document the pinned upstream version and establish a review process for deliberate asset updates. ]]>
Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (144)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The supplied code chunk is a static/demo Strudel composition that maps structured parameters to synthesized pattern layers. Its actual purpose is procedural music generation from parameters, not audio analysis or transformation. The declared description promises a broader toolchain: decompose any audio into stems, extract samples, compose with those assets, and render offline to audio files. None of those capabilities appear in this code. While composition via Strudel is represented, the primary claimed deconstruction/extraction/rendering capabilities are absent, making the description materially inaccurate for this code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The supplied code only contains a handcrafted Strudel live-coding composition: tempo setup plus layered note and percussion patterns with synthesis/effects settings. This aligns partially with the broad notion of composition via Strudel, but it does not implement the key declared capabilities of deconstructing arbitrary audio, extracting samples, or rendering output offline to WAV/MP3. The primary behavior is generating one preset composition, not performing audio analysis/deconstruction or file export. Therefore the description materially overstates and misrepresents what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The declared description promises a general audio deconstruction and composition system with capabilities to split audio into stems, extract samples, compose from that material, and render output files. The supplied code only contains a handcrafted Strudel composition preset ('Cathedral of the Emperor') that sequences synth voices, bells, and effects. There is no code handling input audio, analysis, stem extraction, sample extraction, or export/render functionality. This is a material mismatch in primary purpose and capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared description presents a broader audio-processing and composition skill centered on deconstructing arbitrary audio into stems, extracting samples, and rendering output files. The supplied code does not implement any of those capabilities. Instead, it is a static Strudel live-coding composition defining layered rhythmic and melodic patterns for a combat scene. While it does relate loosely to composition via Strudel, its primary behavior is just generating one musical piece, not performing audio analysis, decomposition, sample extraction, or export. That is a material description-behavior mismatch.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The code does use Strudel-style live-coding for composition, which partially aligns with the composition portion of the description. However, this specific code chunk does not decompose audio, extract samples, or render output files. Instead, it is just a predefined generative music composition asset for a dark ambient track. Because the declared purpose emphasizes broad audio deconstruction/composition capabilities that are not present in the code shown, the description materially overstates what this code actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The code chunk is only a static Strudel composition asset defining tempo, note patterns, sample playback, and effects for one musical piece. While it fits the broad theme of audio composition via Strudel, it does not implement the key declared capabilities: deconstructing input audio, extracting samples, or rendering output files. Its primary behavior is narrower and materially different from the declared end-to-end audio deconstruction/composition tool.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The supplied code is consistent with only one narrow part of the description: composing/generating music with Strudel-style live-coding primitives. However, the declared purpose emphasizes broader audio-processing capabilities—decomposing arbitrary audio into stems, extracting samples, and rendering offline to WAV/MP3—which are not present in this code chunk. The actual code defines a handcrafted generative composition and uses no input audio, no analysis pipeline, no stem separation, and no export logic. Therefore the description materially overstates what this code does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description presents a broader audio-processing tool focused on analyzing existing audio, separating it into stems, extracting samples, and rendering output files. The supplied code does not implement any of those capabilities. Instead, it only defines a specific generative Strudel composition with layered pentatonic synth patterns and visualization parameters. While it does fit the 'composition via Strudel live-coding' portion, the primary described functionality is materially broader and centered on audio deconstruction and export features that are absent from this code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description promises a full audio deconstruction and composition toolchain, including analyzing arbitrary audio, separating stems, extracting samples, using those materials for composition, and exporting rendered audio files. The supplied code does none of that. It is only a Strudel composition snippet that sets tempo and layers predefined melodic, bass, drum, hat, crackle, and pad patterns. There is no code for ingesting audio, stem separation, sample extraction, file handling, or rendering/export. While it is loosely related to music composition via Strudel, its actual scope is far narrower and materially different from the declared end-to-end audio deconstruction/composition functionality.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The supplied code is only a static Strudel composition script for generating an ambient 'Rain' piece. It sets tempo and stacks several synthesized/noise layers (rain wash, drops, thunder, etc.). There is no code for ingesting external audio, separating stems, extracting samples, analyzing audio, or exporting rendered files. The declared description claims broad audio deconstruction and composition features, but this code chunk only demonstrates composition/generative sequencing, making the description materially broader than the actual behavior shown.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The code chunk is a composition asset: it uses Strudel-like musical primitives such as setcpm, stack, note, n, and s to build a specific ambient piece from synthesized patterns and effects. This aligns only with a narrow part of the declared description—composition via live-coding. However, the declared purpose prominently claims broader audio-processing capabilities: decompose any audio into stems, extract samples, and render offline to WAV/MP3. None of those behaviors appear in the supplied code. There is no handling of input audio, no stem separation, no sample extraction logic, and no export/render functionality. Therefore the description materially overstates and misrepresents what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description promises broad audio-analysis and transformation capabilities: decomposing arbitrary audio into stems, extracting samples, composing from that material, and rendering output files. The supplied code does not implement any of those behaviors. Instead, it is a static Strudel composition defining tempo, note patterns, synthesis parameters, and ambient sample playback for a specific musical scene. While it is related to audio composition in a narrow sense, it materially falls short of the declared primary purpose and advertised capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The code chunk does relate to Strudel-based audio composition, so part of the description is aligned. However, the declared purpose emphasizes broader functionality: deconstructing any audio into stems, extracting samples, and rendering offline to WAV/MP3. This code does none of those things. It is only a preset composition script for generating a mood piece ('Underhive Dread') and contains no logic for ingesting external audio, separating stems, extracting samples, or exporting files. Because the primary implemented behavior in this chunk is much narrower than the declared capability set, the description does not accurately represent what this code actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The description promises broad audio deconstruction and composition functionality: taking any audio, breaking it into stems, extracting samples, and rendering outputs. The actual code chunk only contains a hardcoded Strudel music composition preset ('For the Emperor') using note and sample pattern definitions. Its primary behavior is generating one live-coded arrangement, not analyzing or transforming input audio. There are no signs of audio ingestion, stem separation, sample extraction, or export/render logic. Therefore the declared description materially overstates and misrepresents what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description centers on creating and transforming music/audio via Strudel: decomposition into stems, sample extraction, composition, and offline rendering. The actual code does none of those primary tasks. It is narrowly focused on diagnostic inspection of an existing rendered audio file, producing statistics and anomaly reports. While both are audio-related, the implemented behavior is materially different from the declared purpose. The ffmpeg dependency for decoding input audio is consistent with analysis, but that analysis capability itself is not what was declared as the skill's main function.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
The code partially matches the declared purpose because it does support offline rendering of Strudel compositions to WAV/MP3 and references sample management. However, it also implements a significant undeclared capability: streaming rendered audio to Discord voice channels via `vc-play.mjs`, including a multi-track concert mode. That is a materially different operational capability not mentioned in the description or permissions. Additionally, the declared description emphasizes audio deconstruction into stems and sample extraction from audio, but this specific code chunk does not perform those functions; it is primarily a command dispatcher for rendering, listing, sample-script delegation, and Discord playback. Therefore the description does not accurately represent what this supplied code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description presents a broad audio-processing and music-creation skill centered on deconstructing audio into stems, extracting samples, composing with Strudel, and rendering output files. The supplied code does none of those core tasks. Instead, it is a utility for managing sample packs on disk: listing packs, downloading archives or WAVs from URLs, extracting WAV files, copying local directories/files, and deleting packs. While sample-pack management is adjacent to a Strudel workflow, it is a materially different primary purpose from audio deconstruction/composition and rendering. Additionally, the code performs network retrieval and filesystem/archive operations that are not disclosed in the description. Therefore, the description does not accurately represent the actual behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The supplied code only creates a specific musical arrangement in Strudel-style syntax. While this aligns partially with the 'composition' aspect, it does not implement the broader declared functionality of deconstructing any audio into stems, extracting samples, or rendering output files. The primary behavior shown is predefined music generation/composition, not audio analysis or deconstruction. Therefore the description materially overstates and misrepresents the actual behavior of this code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The supplied code is purely a hand-authored Strudel arrangement file. It sets tempo, stacks multiple named sample voices, and automates gain/structure over sections of a composition. That is consistent with only one narrow part of the description: composing music in a Strudel-style live-coding format. However, the declared purpose prominently claims broader audio-processing capabilities—decomposing any audio into stems, extracting samples, and rendering offline to WAV/MP3—which are not present in this code chunk. There are no input-handling, analysis, stem-separation, sample-extraction, or export/render routines shown. Therefore the description materially overstates what this code actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description emphasizes an end-to-end audio deconstruction and composition tool that can take any audio input, split it into stems, extract samples, and render output files. The supplied code only defines a full-length musical arrangement using existing sample names and timing/gain patterns. While it is loosely related to composition via a live-coding vocabulary, it does not implement the major advertised capabilities around audio analysis/decomposition or file rendering. Therefore the description materially overstates what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description promises a broader audio-processing and composition skill: ingesting arbitrary audio, separating it into stems, extracting samples, composing from them, and rendering output files. The supplied code does none of that. It only defines one specific arrangement using pre-named samples (e.g., bloom_kick, bloom_snare, bloom_lead_D3) and timing/gain automation in a Strudel-like DSL. There is no code for loading user audio, stem separation, sample extraction, offline rendering, file export, or any general deconstruction pipeline. While the code is related to music composition, its actual purpose is much narrower and materially different from the declared end-to-end audio deconstruction/composition tool.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The supplied code only implements a preauthored musical arrangement using Strudel-style pattern definitions (`setcps`, `stack`, `s`, `struct`, `slow`, `gain`, `clip`) and references fixed sample names like `bloom_lead_D3` and `bloom_kick`. It does not contain any logic for ingesting arbitrary audio, analyzing audio, separating stems, extracting samples, or exporting rendered files. While it is related to composition in the narrow sense of sequencing existing samples, the declared description emphasizes a broader audio deconstruction-and-recomposition toolchain that is not represented by this code chunk. Therefore the description materially overstates and mischaracterizes the actual behavior.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The declared description presents a broad audio-processing and composition tool that can decompose arbitrary audio into stems, extract samples, and render outputs offline. The supplied code chunk is only a static generative composition script for one piece ('Dark Hive') using Strudel-style synthesis and sequencing primitives. While composition via live-coding is consistent with part of the description, the primary claimed capabilities around deconstruction, extraction, and rendering are absent from this code. Therefore the description materially overstates what this code chunk actually does.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The supplied code only defines one specific musical arrangement using existing sample identifiers like eamon_drone, eamon_pipes, and eamon_drum. It sets tempo and stacks layers with arrange(), gain curves, slow(), clip(), and pan(). There is no code for accepting arbitrary audio input, analyzing or decomposing audio into stems, extracting samples, or exporting rendered output to WAV/MP3. While it is related to Strudel-based composition, the declared description substantially overstates the implemented functionality and suggests a much broader audio-processing toolchain than this code chunk actually provides.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The declared description emphasizes a broad audio deconstruction-and-recomposition toolchain: ingest any audio, split it into stems, extract samples, compose from those elements, and render outputs. The supplied code instead defines one specific musical arrangement in Strudel using hardcoded sample names, note patterns, masks, gains, and tempo. This is consistent with composition/live-coding behavior, but not with audio analysis/decomposition capabilities. There are no signs of handling user-provided audio, stem separation, sample extraction, or file export in this code chunk. Therefore the description materially overstates and misrepresents what this code actually does.