Every entry in the deferred ledger is aspirational. The shipped looper below is context for those entries, not a roadmap promise.

The 2026-08-27 decision was to ship one free-time, auto-persisted phrase slot first. That choice supplied musical memory without inventing tempo, transport, layer ownership, or an export workflow. The recorder is capped at 60 seconds and 2,000 events; replay enters only midi.dispatch(ev, 'loop') (src/lib/state/phrase.svelte.ts:4-8,141-236; src/lib/midi/manager.svelte.ts:262-263).

Deferred feature ledger

FeatureStatus and reasonImplementation seamAudit estimate
Tempo-quantized loopsDeferred. Quantized bars require one reliable beat clock; adding bar choices to the free-time slot first would hide a transport inside the recorder.Extend src/lib/state/phrase.svelte.ts; add src/lib/audio/transport.svelte.ts; keep emitted events in midi.dispatch.Transport was sized at about 100–150 production lines; the quantization delta was not sized separately.
Overdub layersDeferred. A single slot has one clear event owner; layers add recursive capture rules, same-pitch reference counts, wrap cleanup, mute state, and merged persistence.Extend src/lib/state/phrase.svelte.ts and the dispatch-tail capture contract in src/lib/midi/manager.svelte.ts.No separate number was recorded; the audit only established that this exceeds the 120–160-line complete single-slot baseline.
Program-change patch bankDeferred until after musical memory. PROG currently changes only waveform, so patches would add sonic variety but no persistence of performance.src/lib/midi/manager.svelte.ts program-change branch; engine.applyPatch() in src/lib/audio/engine.svelte.ts; identical selector in src/components/Settings.svelte.About 70–110 production lines.
Scale lockDeferred. It helps new players but note quantization needs collision-safe note-off ownership; a nearest-note function alone is incorrect.New src/lib/midi/scale.ts; transform only non-drum note-on and note-off at dispatch; persist root and mode in src/lib/state/settings.svelte.ts; expose Off, Major, Minor, and Pentatonic in Settings.About 100–150 production lines.
ArpeggiatorDeferred until a shared transport exists. Generated note-offs must not erase physically held or loop-owned notes.New src/lib/state/arpeggiator.svelte.ts; separate physical from generated ownership around src/lib/midi/manager.svelte.ts; schedule from AudioContext-relative time.About 130–190 production lines.
Transport and metronomeDeferred because a clock alone is not a return feature. It should be pulled in by quantized looping or the arpeggiator, not grow as an independent timer.New src/lib/audio/transport.svelte.ts after engine.start(); one AudioContext-time lookahead scheduler with BPM, tap, mute, and a quiet internal click.About 100–150 production lines.
Visual modesDeferred behind musical modes. More visual novelty does not add memory or accompaniment, and new renderers can accidentally duplicate analyser work.src/components/Stage.svelte, existing engine.bins(), level, bend, and hue; persist visualMode in src/lib/state/settings.svelte.ts; retain one Stage frame loop.About 140–220 production lines for two credible modes.
Phrase permalinkDeferred behind the phrase data contract. The site is single-user and Authelia-gated, so a link is mainly backup or transfer, not viral sharing.Existing src/lib/state/phrase.svelte.ts; new src/lib/state/share.ts; decode a versioned, validated, bounded fragment in src/App.svelte before audio graph construction.About 140–200 production lines after the one-slot looper.

Where the audit recorded no separate estimate, this page says so rather than manufacturing precision.

Dependency order

flowchart LR
  LOOP["Shipped free-time phrase slot"] --> PATCH["Program patch bank"]
  LOOP --> SCALE["Scale lock"]
  LOOP --> LINK["Phrase permalink"]
  LOOP --> CLOCK["Shared transport"]
  CLOCK --> QUANT["Quantized loop"]
  CLOCK --> ARP["Arpeggiator"]
  PATCH --> VISUAL["Visual modes after musical modes"]
  ARP --> VISUAL

The arrows are product and correctness dependencies, not promises of delivery dates. A patch bank does not technically require the looper, but the audit ranked memory ahead of timbral presets. A permalink technically can encode settings today, but no useful phrase payload existed before the looper.

Correctness seams to preserve

Quantized loop

Use one lookahead scheduler against AudioContext.currentTime; do not add an independent setInterval recorder clock. Record source events with free-time offsets, derive beat placement as data, and replay generated events through dispatch. Verify background-tab resume, wrap note-offs, and one scheduler instance.

Overdub

Do not represent overdub as timers that call the engine. Layers need stable ids, bounded event counts, versioned persistence, and note ownership across live input plus every layer. Stop, clear, panic, wrap, and deleting a muted layer must all drain only notes owned by that layer.

Program patch bank

Define eight named snapshots of waveform, attack, release, cutoff, resonance, detune, delay, and reverb. Leave master volume out. Hardware program change and the Settings selector must call the same engine.applyPatch() and produce identical engine.params; active voices should receive the existing smoothing policy.

Scale lock

Transform note-on and note-off as a pair at the dispatch boundary, never drums. Keep an input-to-output map and reference counts because two input notes may quantize to one pitch. Panic must clear those maps. Off must preserve the current event exactly.

Arpeggiator

Separate physically held notes from generated notes and add an explicit generated source. Up, Down, and Random modes with 1/8 and 1/16 rates were the audited first shape. Verify final-key release, mode changes mid-step, sustain, background resume, and panic cancellation.

Transport and metronome

Expose BPM, tap, and mute from one module. Schedule ahead with audio time rather than trusting wall-clock callback arrival. The click should use an engine method and should not flood the MIDI monitor because it is not a MIDI performance event.

Visual modes

Reuse the existing analyser data. Two candidate modes were spectral orbit and note trails. Only one Stage loop may be active, reduced-motion behavior remains mandatory, and every mode needs particle-burst overflow measurement at 390 px.

Use a URL fragment so no backend receives the phrase. Encode a schema version, settings subset, and bounded phrase; exclude CC mappings. Invalid, old, or oversized fragments must fall back to ordinary startup, and a valid link still cannot bypass Authelia or the required audio-unlock gesture.

Rejected rather than deferred

Downloadable audio recording was explicitly refused. The audit sized a responsible output-graph capture, MediaRecorder format negotiation, blob lifecycle, and controls at roughly 120–180 lines, but the feature optimizes export instead of quick reusable play. Reconsidering it changes the product boundary toward a DAW and needs an explicit owner decision, not an opportunistic patch.

Review architecture before introducing any generated event source and private page (sign-in required) before accepting a timer-driven feature.