{"record":{"id":"93ce380dfeef1ac0","repo":"block/buzz","slug":"setup-mode-membership-subscribe-error-e","errorCode":null,"errorMessage":"setup-mode membership subscribe error: {e}","messagePattern":"setup-mode membership subscribe error: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/buzz-acp/src/setup_mode.rs","lineNumber":341,"sourceCode":"\n    let startup_watermark: u64 = std::time::SystemTime::now()\n        .duration_since(std::time::UNIX_EPOCH)\n        .unwrap_or_default()\n        .as_secs();\n\n    let mut relay =\n        HarnessRelay::connect(&config.relay_url, &config.keys, &pubkey_hex, relay_auth_tag)\n            .await\n            .map_err(|e| anyhow::anyhow!(\"setup-mode relay connect error: {e}\"))?;\n\n    if let Err(e) = relay.set_startup_watermark(startup_watermark).await {\n        tracing::warn!(\"setup-mode: failed to set startup watermark: {e}\");\n    }\n\n    relay\n        .subscribe_membership_notifications()\n        .await\n        .map_err(|e| anyhow::anyhow!(\"setup-mode membership subscribe error: {e}\"))?;\n\n    tracing::info!(\"setup-mode: connected and subscribed to membership notifications\");\n\n    // Resolve owner for author-gate (same priority as normal mode).\n    let startup_owner = crate::resolve_agent_owner(&config);\n    let owner_cache = crate::OwnerCache::new(startup_owner);\n\n    // Discover channels and subscribe (using a \"mentions\" rule so we get\n    // notified when someone @-mentions the agent).\n    let channel_info_map = relay\n        .discover_channels()\n        .await\n        .map_err(|e| anyhow::anyhow!(\"setup-mode channel discovery error: {e}\"))?;\n\n    tracing::info!(\n        \"setup-mode: discovered {} channel(s)\",\n        channel_info_map.len()\n    );","sourceCodeStart":323,"sourceCodeEnd":359,"githubUrl":"https://github.com/block/buzz/blob/934f3325c3fdaa3a6f23134b74518139aac8ca3f/crates/buzz-acp/src/setup_mode.rs#L323-L359","documentation":"In setup mode the relay connection succeeded, but subscribe_membership_notifications — the REQ that feeds the setup flow its membership events — failed (rejected REQ or closed socket). Because membership notifications are setup mode's core input, the harness aborts right after connecting and setting the startup watermark.","triggerScenarios":"The relay closes or errors the membership-notifications REQ: an older relay without this subscription type, an auth token without community membership scope, or a connection drop immediately after connect. Note the preceding set_startup_watermark failure only warns — this subscribe failure is the fatal one.","commonSituations":"Staging relay version older than the harness; expired NIP-42 auth tag granting no subscription rights; flaky network between harness and relay at startup.","solutions":["Confirm the relay build supports membership notifications (same version family as the harness)","Verify the auth env vars give the harness subscription access to the community","Retry startup after fixing connectivity; check relay logs for the closed REQ"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"# Preflight: relay up AND same version family as the harness before setup mode\ncurl -fsS \"$(echo \"$BUZZ_RELAY_URL\" | sed 's|^ws\\(s\\)\\?://|http\\1://')/\" | grep -q '\"name\"' \\\n  || { echo 'relay not serving NIP-11 metadata' >&2; exit 1; }","typeGuard":null,"tryCatchPattern":"// Connect and subscribe inside one retry envelope — a drop between them is transient\nfor attempt in 1..=3 {\n    let mut relay = HarnessRelay::connect(...).await?;\n    match relay.subscribe_membership_notifications().await {\n        Ok(()) => break,\n        Err(e) if attempt < 3 => { tokio::time::sleep(Duration::from_secs(attempt)).await; }\n        Err(e) => return Err(e),\n    }\n}","preventionTips":["Deploy harness and relay together so membership-notification subscriptions are always supported","If the watermark warning ('failed to set startup watermark') appears frequently alongside this error, suspect an unstable socket, not permissions"],"tags":["buzz-acp","websocket","relay","subscription","setup-mode","membership"],"backgroundTag":"websocket-subscribe-failed","analyzedSha":"934f3325c3fdaa3a6f23134b74518139aac8ca3f","analyzedAt":"2026-08-20T04:38:24.874Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T20:17:18.057Z"}