Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/generous-corp/pulp/ableton-linknpx skills add Generous-Corp/pulp --skill ableton-linkgit clone --depth 1 https://github.com/Generous-Corp/pulpWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/generous-corp/pulp/ableton-link)<a href="https://agentmods.dev/skills/generous-corp/pulp/ableton-link"><img src="https://agentmods.dev/badge/skills/generous-corp/pulp/ableton-link.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00043 | $0.01427 |
| Opus 5 | $0.00022 | $0.00714 |
| Sonnet 5 | $0.00009 | $0.00285 |
| Haiku 4.5 | $0.00004 | $0.00143 |
Grade A, and why
ableton-link scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 117 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Ableton Link
Use this skill for Pulp's desktop Ableton/link integration, its CMake opt-in,
or the backend-neutral tempo-sync seam in core/playback.
Scope and licensing boundary
- This is the desktop C++
Ableton/linkSDK. It is not iOS LinkKit and notm4l-connection-kit. LinkKit needs a separate licensing decision, option, SDK path, and implementation. - Link is available under GPLv2+ or a proprietary arrangement with Ableton. Pulp's MIT license grants no Link rights. The developer enabling the adapter is responsible for having suitable rights.
- Pulp never fetches, bundles, installs, exports, or redistributes Link. Keep
the SDK outside the Pulp source tree. Do not add it to
DEPENDENCIES.mdorNOTICE.mdbecause Pulp ships none of it. - The portable
pulp::playbacktarget owns only Pulp code. The optionalpulp::ableton-linktarget exists only in a source build with the SDK enabled and must never entercmake --installor Pulp's exported target closure. Its adapter declaration lives undercore/playback/adapters/include, exposed only through that target'sBUILD_INTERFACE; do not place it under the installedcore/playback/includetree.
Obtain and enable the desktop SDK
Clone recursively to an absolute path outside the checkout; Link requires its ASIO submodule even on platforms that do not use an ASIO audio device:
git clone --recurse-submodules https://github.com/Ableton/link.git /absolute/path/to/link
cmake -S . -B build-link -DCMAKE_BUILD_TYPE=Release \
-DPULP_ENABLE_ABLETON_LINK=ON \
-DPULP_ABLETON_LINK_SDK_DIR=/absolute/path/to/link
PULP_ENABLE_ABLETON_LINK defaults to OFF. When enabled, a missing, partial,
in-tree, or non-desktop SDK path is a configure error. The SDK path can also
come from the PULP_ABLETON_LINK_SDK_DIR environment variable, but an explicit
CMake cache value is easier to audit.
Runtime contract
TempoSyncSourceis Pulp's backend-neutral, audio-thread interface. Keep Link types and Link-specific peer/enable/start-stop controls out of it.AbletonLinkTempoSyncowns those Link-specific controls. Callset_enabledandset_start_stop_sync_enabledfrom a control thread, never from the audio callback.output_host_timeandcapture_audio_blockare realtime-safe.- Call
output_host_time(output_latency_frames, sample_rate, time)in the audio callback, then pass its opaqueTempoSyncHostTimetoMasterTransport. The adapter reads Link's realtime clock and adds device/output latency so the timestamp names the first sample at the output boundary. A callback timestamp without compensation produces a stable audible offset. TempoSyncHostTimeis tagged with its producing source. A transport rejects a default token or one from another source before asking its backend to capture a block, preventing Link, device, and wall-clock epochs from mixing.- The public desktop adapter models APIs that report output latency from the callback. It does not accept an arbitrary device-host timestamp. A platform integration whose audio API exposes a calibrated future device timestamp needs an explicit Link-clock conversion boundary; do not forward that raw timestamp or a jittery wall-clock read as though it were Link time.
- A configured
TempoSyncSourcemust outliveMasterTransport. Use the host-timebegin_block(frame_count, output_host_time, snapshot)overload. The ordinary overload returnsTempoSyncHostTimeRequired. - The session mapping is authoritative. Disabled, failed, or invalid sources fail the block; they never fall back to the document tempo clock.
- Joining does not send the config's initial tempo, position, or play state.
Only explicit
set_tempo_sync_tempo,seek, andset_playingcalls publish session commands, which avoids hijacking an existing jam on attach. - A Link-projected block retains Pulp's fixed one-or-two-range transport
contract and precise fractional host ticks.
begin_scrub()rejects an active shared tempo source because scrubbing needs a private repositioning clock; use an unsynchronized transport for scrub playback. - Preserve
SessionState::timeForIsPlaying()inTempoSyncBlockState::is_playing_at_host_time_micros. ATransportSnapshothas one playing state for its whole half-open block: a start/stop effective at or before the first sample applies immediately, while one inside or at/after the block end is deterministically deferred until a later block starts at or beyond that timestamp. Do not flatten the timestamp intoSessionState::isPlaying()or claim sample-accurate start/stop splitting that the snapshot contract cannot represent.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today First seen · 117 lines · 43 tokens per session scan A c1403ce85ee1
ableton-link is a skill published in the GitHub repository Generous-Corp/pulp (16 stars, last pushed today), licensed MIT. It adds 43 tokens to every session and 1,427 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-04.
Other skills, from other repositories
zoom-meeting-sdk-unreal
Zoom Meeting SDK for Unreal Engine wrapper integrations. Use when building Unreal projects that embed Zoom meetings with C++ and Blueprint wrappers, including wrapper-to-SDK mapping concerns.
new-cpp-lint
Create a new C++ lint rule, test it, run it across the codebase, and selectively apply fixes. Usage - /new-cpp-lint.
doca-argp
Use this skill for hands-on DOCA Arg Parser CLI work on a shipped sample or new DOCA-using app — adding / removing / renaming flags; wiring docaargpinit → register params → docaargpstart → docaargpdestroy in order; picking a parameter type from the full public enum (DOCAARGPTYPESTRING, INT, BOOLEAN, DEVICE, DEVICEREP…
ax-cpp-gen
Use when writing C++ code with axllm for AxGen programs, forward calls, indexed multi-sampling, result pickers, streaming, tools, assertions, traces, usage, and output parsing.
add-uint-support
Add unsigned integer (uint) type support to PyTorch operators by updating ATDISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
cuda-index-width
Choose 32-bit vs 64-bit index math in PyTorch CUDA kernels. Use when fixing large-tensor indexing overflows, deciding whether to use int64t, canUse32BitIndexMath, CUDAKERNELLOOPTYPE, or ATDISPATCHINDEXTYPES, and when considering binary-size or performance impact of index-type templating.