diff --git a/zebra-report/zebra-spaces.html b/zebra-report/zebra-spaces.html
index d911724..892c79f 100644
--- a/zebra-report/zebra-spaces.html
+++ b/zebra-report/zebra-spaces.html
@@ -1667,9 +1667,13 @@ function attachSfuTrack(uuid, stream){
(t0 ? ' tr0={en='+t0.enabled+' mu='+t0.muted+' rs='+t0.readyState+'}' : ''));
try {
const p = a.play();
- if (p && p.catch) p.catch(e => logLine('err','rtc autoplay '+uuid.slice(0,4)+': '+e.message));
+ if (p && p.catch) p.catch(e => {
+ logLine('err','rtc autoplay '+uuid.slice(0,4)+': '+e.message);
+ flagAudioBlocked('rtc autoplay '+uuid.slice(0,4));
+ });
} catch(e){
logLine('err','rtc play threw '+uuid.slice(0,4)+': '+e.message);
+ flagAudioBlocked('rtc play threw '+uuid.slice(0,4));
}
stopMeter(uuid); startMeter(uuid, stream);
logLine('', 'sfu: receiving '+((members.get(uuid)||{}).handle || uuid));
@@ -3800,6 +3804,13 @@ async function handleSignal(raw){
* down our SFU + mesh PCs too so we actually stop hearing /
* broadcasting — closing the WS alone leaves the WebRTC paths up. */
wantConnected = false;
+ /* Clear the active-call key so a hard-refresh / bfcache restore
+ * doesn't sneak the kicked user right back in via auto-rejoin.
+ * The confirm() text says "they can rejoin" — but that means
+ * MANUALLY (type the code, click enter), not automatically on
+ * any tab event. Fox 2026-06-04: "we have auto-join on the
+ * phone that is kicked just rejoins". */
+ try { sessionStorage.removeItem(ACTIVE_CALL_KEY); } catch(_){}
const noticeVerb = m.action === 'kick' ? 'kicked from'
: m.action === 'ban' ? 'banned from'
: 'removed from';
@@ -4269,19 +4280,49 @@ let selfListenerMode = false;
function activateListenerAudio(){
/* Fire .play() on every existing