09 β Risks & Mitigations
Risks ranked by impact Γ likelihood. Each has an owner, a mitigation, and a contingency.
Risk matrix
| # | Risk | Likelihood | Impact | Severity | Status |
|---|---|---|---|---|---|
| 1 | Cloud GPU unavailable during demo | Low | Critical | HIGH | Mitigated |
| 2 | SA3 inference too slow on Vega | High | High | HIGH | Mitigated |
| 3 | LoRA training fails / produces bad output | Medium | High | HIGH | Mitigated |
| 4 | Voice recognition unreliable in noisy venue | High | Medium | MEDIUM | Mitigated |
| 5 | Reaper Web Control API changes / doesn't work | Medium | Medium | MEDIUM | Mitigated |
| 6 | Pattern templates too few / too low quality | Medium | Medium | MEDIUM | Mitigated |
| 7 | Onomatopoeia parser doesn't understand users | Medium | Low | MEDIUM | Mitigated |
| 8 | Screenreader breaks during demo | Low | Medium | MEDIUM | Mitigated |
| 9 | Network drops during demo | Medium | High | MEDIUM | Mitigated |
| 10 | Solo bottleneck β running out of time | High | High | HIGH | Mitigated |
| 11 | Team conflict / teammate leaves | Medium | High | MEDIUM | Monitor |
| 12 | Licensing issues with training data | Low | High | MEDIUM | Mitigated |
| 13 | Browser doesn't support Web Speech API | Low | High | MEDIUM | Mitigated |
| 14 | MIDI export has bugs that only show in Reaper | Medium | Medium | MEDIUM | Mitigated |
| 15 | Audio sample quality is generic | Medium | Medium | MEDIUM | Mitigated |
High-severity risks
Risk 1: Cloud GPU unavailable during demo
Scenario: RunPod has an outage, you can't reach your instance, the venue WiFi blocks the connection, or your account gets suspended.
Mitigation:
- Pre-generate ALL demo samples before the event, store in
cache/directory - Have a backup account on a different provider (Vast.ai + RunPod)
- Test cloud GPU connection from the venue WiFi before the demo
Contingency:
- Run inference on Vega locally (slow but works)
- Use pre-generated samples only and label them as "preset variations"
- Record a video of the working demo as ultimate fallback
Owner: You. Verified: Test cloud GPU from venue network on day 1 morning.
Risk 2: SA3 inference too slow on Vega
Scenario: A 30-second sample takes 15 minutes on your Vega. The demo times out.
Mitigation:
- Establish baseline performance in pre-hack week 1 (see C1 in
08-build-plan.md) - If > 5 min per sample on Vega, commit to cloud-only
- Pre-generate demo samples on cloud GPU
- Cache aggressively (LRU + disk)
Contingency:
- Demo with cached samples only, narrate "this was generated earlier by the model"
- Show inference happening live as a "by the way, look, it's running" secondary moment, not the main demo
Owner: You. Verified: Run scripts/smoke_test.py on Vega before the event.
Risk 3: LoRA training fails / produces bad output
Scenario: Training crashes, or the resulting LoRA makes samples worse than the base model.
Mitigation:
- Run a small training (200 steps) first to verify the pipeline
- Train the real LoRA at least 3 days before the event, so you have time to iterate
- Keep the base model as a fallback (can disable LoRA at inference time)
- Document the training hyperparameters so you can reproduce if needed
Contingency:
- Ship with the base SA3 model only, label output "Stable Audio 3, no fine-tuning"
- Do a quick second training attempt during the hackathon if you have cloud GPU time
- Be honest with the jury: "we attempted fine-tuning but the base model worked better for the time we had"
Owner: You. Verified: Complete first training run before pre-hack week 3.
Risk 10: Solo bottleneck β running out of time
Scenario: You try to do everything alone, run out of time, ship a half-finished product.
Mitigation:
- Aggressive scope cut (see
08-build-plan.md) - Pre-build as much as possible in the 3 weeks before
- Define the minimum viable demo path and protect it ruthlessly
- Daily checkpoint reviews to catch overruns early
Contingency:
- Ship a narrower demo: voice prompt β MIDI export only, no samples
- Have a video walkthrough of the missing features
- Focus the live demo on the 2β3 things that work perfectly
Owner: You. Verified: C6 (demo path works) at end of day 1.
Medium-severity risks
Risk 4: Voice recognition unreliable in noisy venue
Scenario: The hackathon venue is loud. Web Speech API gets garbage transcripts. Demo fails.
Mitigation:
- Use a headset mic / close-mic'd setup, not the laptop mic
- Test voice recognition in a noisy environment before the event
- Have a fallback path: type the prompt instead of speaking
- Push-to-talk (Spacebar to start/stop) avoids picking up ambient noise
Contingency:
- Switch to typed prompts for the demo if voice fails
- Use a quieter corner of the venue for the live demo
- Have a backup video of working voice mode recorded in a quiet space
Owner: You. Verified: Test voice in actual venue conditions.
Risk 5: Reaper Web Control API changes / doesn't work
Scenario: Reaper updates, the WebSocket format changes, your client breaks.
Mitigation:
- Test against your installed Reaper version (currently 7.x) before the event
- Hard-pin the WebSocket protocol version in your client
- Have the fallback path: "type the BPM manually"
Contingency:
- Demo without Reaper integration, just type the BPM
- Show Reaper integration in a video if live fails
Owner: You. Verified: Test on your Reaper install before the event.
Risk 6: Pattern templates too few / too low quality
Scenario: You write 5 patterns, all of them are slightly wrong. Jury asks for a beat you don't have.
Mitigation:
- Aim for 18β20 patterns before hackathon
- Write the 6 demo-critical ones first
- Each pattern tested in Reaper before the event
- Have a "blank bar" fallback that lets the user define their own
Contingency:
- Generate variations from existing patterns (different bars, different cymbals, half-time)
- Be honest: "we focused on metal first, here's what we have"
Owner: You. Verified: C3 (6 patterns authored) at end of week 2.
Risk 7: Onomatopoeia parser doesn't understand users
Scenario: User says "tupatupatupa" but the parser doesn't recognize it. Falls back to genre vocabulary, picks the wrong pattern.
Mitigation:
- Curate the onomatopoeia table with multiple variants per pattern
- Phonetic matching with Levenshtein distance
- Confidence threshold (0.7) below which the parser asks for confirmation
- "I heard X, did you mean Y?" response
Contingency:
- The user can always type the pattern name explicitly
- "Try one of these patterns: [list]" response
Owner: You. Verified: Test the top 20 onomatopoeia phrases manually.
Risk 8: Screenreader breaks during demo
Scenario: NVDA crashes, VoiceOver doesn't pick up the UI, the screenreader demo fails.
Mitigation:
- Test NVDA + Chrome on the demo machine before the event
- Have a backup screenreader (VoiceOver on Mac, JAWS if you have access)
- Record the screenreader demo as a backup video
- Rehearse the keyboard navigation by feel, not by sight
Contingency:
- Show the recorded video of the working screenreader demo
- Skip the live screenreader demo, focus on the voice mode
- Describe the accessibility features narratively
Owner: You. Verified: Test on the demo machine, not your dev machine.
Risk 9: Network drops during demo
Scenario: Venue WiFi dies, you can't reach the cloud GPU for inference.
Mitigation:
- Pre-generate all demo samples, store locally
- Run a local copy of the audio service on the demo machine as backup
- Have a mobile hotspot as tertiary fallback
Contingency:
- Demo with cached samples only
- Acknowledge the network issue honestly if it comes up
Owner: You. Verified: Confirm cloud GPU + local backup both reachable from venue.
Risk 11: Team conflict / teammate leaves
Scenario: A teammate you recruited flakes, or there's conflict about direction.
Mitigation:
- Have all critical code paths owned by you as backup
- Set clear expectations early (what's the demo, what's the deadline)
- Communicate scope cuts in real time
Contingency:
- Cut features the flaky teammate was working on
- Lean on the must-haves list
Owner: You. Status: Monitor.
Risk 12: Licensing issues with training data
Scenario: A sample you used is actually copyrighted, you get called out, model card needs to be pulled.
Mitigation:
- Every sample has a documented source and license in the manifest
- Prefer CC0 / CC-BY / original recordings
- For Freesound samples, filter to CC0 or CC-BY only, document the user
- For your own recordings, document date and context
Contingency:
- If a license is questioned, replace that sample and retrain (time permitting)
- Be transparent in the model card about licensing discipline
Owner: You. Verified: Manifest reviewed before publishing.
Risk 13: Browser doesn't support Web Speech API
Scenario: Demo machine has Firefox, Web Speech API doesn't work.
Mitigation:
- Test on the demo browser before the event
- Chrome is the assumption β install it on the demo machine
Contingency:
- Switch to typed prompts only
- Use a different laptop with Chrome
Owner: You. Verified: Test on demo browser.
Risk 14: MIDI export has bugs that only show in Reaper
Scenario: MIDI plays wrong in Reaper, or doesn't import at all.
Mitigation:
- Test every pattern in Reaper before the event
- Use a known-good GM drum map
- Set tempo in the MIDI file header to match project tempo
- Test on the actual Reaper version you'll use at the event
Contingency:
- Fix the bug live (if quick)
- Show the MIDI in a different DAW if Reaper is broken
- Generate a Reaper project file (.rpp) that includes the MIDI in a known-good arrangement
Owner: You. Verified: Full end-to-end test in Reaper.
Risk 15: Audio sample quality is generic
Scenario: Even with the LoRA, the samples sound like generic AI drums, not brutal.
Mitigation:
- Iterate on the training dataset (more samples, better curation)
- Iterate on prompt engineering (try different intensity descriptors)
- Generate multiple variations and pick the best
Contingency:
- Show the variations, frame as "exploring the space"
- Be honest: "SA3 with our LoRA is good but not perfect yet β here's what it produces"
Owner: You. Verified: Listen to samples before the event.
Risk ownership summary
| Owner | Risks |
|---|---|
| You (all) | All risks by default |
| Future teammate (frontend) | R10 (solo bottleneck) β if recruited |
| Future teammate (ML) | R3 (LoRA), R2 (Vega speed) β if recruited |
What we're explicitly NOT risking
- Building features that won't be demoed
- Custom DAW plugins (too risky for the timeframe)
- Mobile apps
- Cloud accounts / user authentication
- Anything that requires a third-party API key beyond SA3
Current Jam Buddy bugs & findings (verified against Stability API docs)
These are open/confirmed items tracked for the current work. Docs consulted:
platform.stability.ai/docs/api-referenceβpost /v2beta/audio/stable-audio/audio-to-audio.
1. SA3 strength (noise/denoising) is NOT being sent β open bug (high priority)
The SA3 audio-to-audio request schema exposes a strength parameter (a.k.a.
denoising): 0 = output identical to input, 1 = as if no input was given.
We do not send it, so it defaults to 1 = full diffusion. This explains:
- "generations render nothing new" (input take fully morphed / barely anchors output)
- "output contains more than one instrument" (the take's instrument doesn't anchor, model freely adds others)
Stability's guidance for audio-to-audio is strength β 0.5β0.8 (diffuse the
take but keep it as the anchor). This is the pending "Noise knob" task β
wire strength into tools/jam_buddy_api.py and expose it in the UI. UNSENT today.
2. The audio API has NO negative_prompt β confirmed
SA3 audio-to-audio only accepts: prompt, audio, model, duration, seed,
steps, cfg_scale, output_format, strength. There is no negative_prompt.
(Negative prompts exist on Stable Image, not Stable Audio.) So we cannot steer
away from extra instruments via a negative prompt β the positive prompt + cfg_scale
strengthare the only levers. The local CPU fallback (small-music) DOES accept a negative prompt.
3. Demo examples can't be played β RESOLVED
The clickable demo chips (Gradio-style) load MIDI as a take, but preview playback doesn't work β the MIDI examples need to render to audio to actually be audible as a "playable example." Consider pre-rendering the demo MIDIs to audio (or ensuring the Web-MIDI synth preview actually plays).
Resolved: demos now load their pre-rendered MP3 as an audio take (with the BPM knob pinned to the source MIDI's tempo), and playback is a play/stop toggle on the waveform. Single-select + instant highlight/knob update.
4. Stale .next cache corrupts the dev server (recurring) β OPEN
next dev's incremental cache corrupts after heavy edits. Symptoms: API routes
500 (MODULE_NOT_FOUND in webpack-runtime.js) OR the page renders blank
(every /_next/static/chunk 404s while GET / still returns 200). Often a
leftover process squats on port 3000. Fix today: kill the port-3000 PID
(netstat -ano | grep :3000, taskkill /F /PID), rm -rf apps/web/.next,
restart pnpm dev, verify chunks load (not just GET /). Address later β
candidate: a dev:clean npm script that clears .next before starting, or a
more robust dev workflow.