Remind the candidate when they speak while the microphone is muted
I maintainer di solito rispondono entro 1 giorno
@gino1203 ci sta già lavorando.
Dal 8/11/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
Follow-up to #483, whose speaking-while-muted part was deferred to a separate design. The persistent mute indicator from #509 is on main; this issue covers only the reminder and the local detection it needs.
Who is affected and when
A candidate in a live interview mutes the microphone (to cough, or to think aloud privately), returns to the code, and starts answering Jim without unmuting. Jim hears nothing and keeps waiting, so the candidate repeats the answer once they notice. #509 made the muted state visible on the Mic button and beside the interviewer status, but a candidate looking at the editor can still miss both.
Current behavior (main at 750f2d4)
toggleMicrophone in web/interview.js mutes by setting track.enabled = false on every audio track of state.localUserStream (setLocalAudioEnabled, web/interview.js:2570), or by setMicrophoneEnabled(false) when there is no preflight stream. A disabled track delivers silence to every reader, including the turn ring meter (startTurnRing, web/interview.js:3499), so nothing on the page can tell that the candidate is speaking while muted.
Desired outcome
While the microphone is muted, if the candidate speaks for a sustained moment, a text reminder appears next to the Mic button and stays until the microphone is successfully unmuted. Nothing the candidate says while muted reaches Jim, the room, the recording, the transcript or the server.
Present workaround
None besides noticing the indicator.
Proposed scope
- Detection runs only while muted and only in the interview page (
web/interview.js); peer interviews and task mode are out of scope. - On mute, clone the microphone track (
track.clone(), enabled), feed the clone to anAnalyserNode, and reuse the existing level helpers inweb/audio-check.js(peakLevel,sustainedPeak). The clone is never added tostate.localUserStream, never published, and never given to the local recorder. - The reminder fires once per muted period, after a sustained level above a threshold rather than a single peak, and not while Jim is speaking (agent state
speaking), so his voice from the speakers does not trigger it. - Once the reminder fires, the clone is stopped and the analyser closed; the text stays visible until unmute succeeds. A failed unmute keeps it.
- The clone is also stopped on unmute, on interview end, on
pagehide, when the track ends (device loss), and is re-cloned from the new track when a microphone switch completes while muted (onSwitchedinmicrophoneSwitch). - If cloning or the analyser fails, mute and the #509 indicator behave exactly as today, with no error shown.
- No new integrity event, data-channel message or report field: the reminder is local UI only.
Approaches compared
- Clone plus level detection (proposed): no new permission prompt, since the device is already granted and, in Chromium, stays open while the track is disabled; no new dependency; false positives from keyboard clicks are limited by requiring a sustained level, but background speech can still trigger it.
- A vendored voice activity detection model: fewer false positives from noise, but
web/has no build step and vendored assets are checksum-pinned, which adds a large asset for a hint. - Stop the device on mute and detect nothing: strongest privacy, but removes the reminder entirely and changes the meaning of the existing Mic button, so it is out of scope here.
Open questions for the maintainers
- Consent: #483 proposed an opt-in checkbox in the preflight, unchecked by default and valid for one interview. Should the first PR include it, or ship the reminder default-off behind that checkbox only, or default-on with an explanation line? Since the device already stays open while muted, the change is local analysis rather than new capture, but the page should still say so.
- Should the reminder be announced to assistive technology once (
role="status"), given it appears without user action?
Acceptance criteria
- Muted plus sustained speech shows the reminder within about one second; a single keyboard click or short noise does not.
- The reminder stays through silence and interviewer state changes, and disappears only after a successful unmute.
- Browser tests (
tests/browser/) with a fake meter cover: fire once per muted period, no fire while Jim speaks, cleanup on unmute, end, device loss and failed setup, and re-clone after a microphone switch while muted. - A test asserts the clone never appears in
state.localUserStream, the LiveKit publication or the local recorder's input. ./scripts/test.shpasses; the PR includes before and after screenshots of the Mic control.
I read #483, #509, docs/integrity-evidence.md and docs/recording-contract.md, and the mute, microphone switch and mic meter code listed above (I wrote the microphone switch in #426). I plan to implement the scope above once it is agreed.
- Lingua principale
- Rust
- Stelle
- 223
- Fork
- 148
- Merge medio
- 1g 4h
- PR unite (30g)
- 223
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di sysprog21/codetrial
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
I maintainer di solito rispondono entro 1 giorno
-
Show recorded scores in past attempt rowsForse già presa @liehcheng l’ha presa 1 giorno fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
sysprog21/codetrial#604 · 4 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
The peer lobby stays on "Checking account..." when an invite link is opened with site data blockedForse già presa @dges5202 l’ha presa oggi. Aperta
sysprog21/codetrial#626 · 3 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Add basic shape tools to the example drawing areaForse già presa @Chuyutseng l’ha presa oggi. Aperta
sysprog21/codetrial#625 · 1 commento · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Browser-local practice backendForse già presa @tony2037 l’ha presa oggi. Aperta
sysprog21/codetrial#621 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di sysprog21/codetrial
Issue simili
-
needs-triage tooling
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 90/100
neilsh/stunt-reel#317 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 84/100
storytold/craft-fonts#65 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
storytold/craft-libs#723 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
n0-computer/iroh#4669 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno