Backlog cleanup release: clears the v0.5.1 review's MEDIUM/LOW backlog and adds an opt-in OSC-subscribe deduplication based on a live investigation of Resolume Arena's wire-level double-broadcast.
Added — `RESOLUME_WIPE_CONCURRENCY` env (M6)
`wipeComposition` accepts a configurable concurrency cap for its parallel per-layer `/clearclips` POSTs. Default 4 (unchanged). Range 1..16; Resolume's HTTP server starts losing throughput beyond ~8 in-flight requests, so the cap is conservative. Useful for many-layered shows.
Added — `dedupe` option on `resolume_osc_subscribe` (live OSC investigation)
Resolume Arena 7.23.x is observed (live, 2026-04-28) to broadcast some continuous-parameter UI bindings — notably `/composition/layers/*/position` — twice per refresh frame at sub-millisecond spacing. Both copies arrive on the wire as distinct UDP datagrams sharing the same `Date.now()` timestamp. Confidence: HIGH that this is wire-level (Arena emits the broadcast on both compositor-tick and UI-sync-tick), not a code-side double-dispatch — every fan-out point in our pipeline was traced and verified single-emit-per-packet. Full investigation at `docs/v0.5/osc-duplicate-investigation.md`.
`resolume_osc_subscribe` gains `dedupe: boolean` (default `false`). When `true`, collapses consecutive same-`(address, args)` pairs per address. Default off preserves the raw stream for jitter / timing analysis. The cache reducer is independently idempotent so cache-mode reads are unaffected.
Added — `getClipPositionFastTagged` discriminated union (M7)
Cache hits now include `ageMs` so callers can tune their refresh cadence:
```ts
type ClipPositionResult =
| { value: number | null; source: "cache"; ageMs: number }
| { value: number | null; source: "rest" };
```
The `resolume_get_clip_position` tool surfaces `ageMs` only when `source === "cache"`.
Documentation / metadata
- `wipeComposition` docstring (M5) — clarifies that `slotsCleared` reports the intended wipe size; per-layer failures over-count.
- `Math.random()` jitter comment (M9) — documents the floor-100ms / ±20% rationale and references the design doc.
- Tool descriptions (M8 partial) — `cache_status` and `cache_refresh` long-form descriptions split into 2-3 readable sentences.
Verified
483 tests pass (was 474 in v0.5.3; +9 across `RESOLUME_WIPE_CONCURRENCY` env, OSC `dedupe` per-address, OSC `dedupe` legacy-path, discriminated-union shape). `check:tools` and `check:skill-sync` green.
Deferred to v0.5.5+
- `Promise.allSettled` accounting for `wipeComposition` partial failures (M5 stretch).
- Other minor cosmetic items.