A deleted upload now falls back instead of going silent

Fixkamo-internal
Shipped
August 15, 2026 at 1:01 AM UTC
Author
kamo
Commit
9e9224f

The previous commit claimed a retired sound "degrades to the layer beneath it rather than to silence". It did not. `isKnownSoundId` accepts a custom id on shape, so a deleted sound stayed the resolved choice, and playback then failed soft — silence, which is exactly what a correctly-configured mute produces and therefore indistinguishable from one. Verified by probe before fixing: the assignment resolved to `custom:<uuid>` from the member layer, not to the platform's `bell`. The resolver could not tell, because only the loaded library knows which files exist. So it is now told: `resolveSoundSettings(layers, { knownAssetIds })`. `null` means "not known yet" and honours every well-formed id — that state is deliberate, since rejecting custom ids while the library loads would flip every assigned upload to the platform default for the first second of every page load. Once the set arrives, an id not in it resolves as INHERIT. `parseLayer` deliberately still STORES an id it cannot verify. Dropping it there would lose the member's assignment permanently on the next save rather than for as long as the file is missing. The settings pages pass the same set into their local resolutions, so the preview agrees with what the engine will play. Accessibility, found in the same read-through: - The upload drop zone was a div with onClick — a file picker a keyboard user could not open at all. Now role=button, focusable, Enter/Space, focus ring. - Six icon-only buttons had a tooltip and no accessible name: play, rename and remove on every library card, and preview/revert on every event row. All are named with the sound or event they act on, so a screen reader gets "Play Doorbell" rather than fifty identical "button"s. Also drops an unused destructure and a hand-rolled `custom:` prefix check that had drifted from the helper. Gates: 1908 tests pass (4 new for the fallback), next build compiles, i18n guard clean. Dictionary pushed first.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing