tinyhumansai/openhuman · error
[skills] default channel persist failed:
Error message
[skills] default channel persist failed:
What it means
Persisting the newly selected default channel failed in the Skills page handler: after the single-flight guard admitted the click, the persistence write (persist-first, then update UI) rejected, so the stored default-channel preference may disagree with what the UI shows. The busy flag is cleared in the finally, allowing a retry.
Source
Thrown at app/src/pages/Skills.tsx:559
},
[location.pathname, location.search, navigate]
);
const dispatch = useAppDispatch();
const [defaultChannelBusy, setDefaultChannelBusy] = useState<ChannelType | null>(null);
const handleSetDefaultChannel = useCallback(
async (channel: ChannelType) => {
// Single-flight: ignore re-entries while a write is in progress so two
// back-to-back clicks can't interleave (would leave UI + persisted
// preference disagreeing on which channel won).
if (defaultChannelBusy !== null) return;
setDefaultChannelBusy(channel);
try {
// Persist first, then dispatch — on failure the UI keeps the previous
// selection and the user sees no false-positive flicker.
await channelConnectionsApi.updatePreferences(channel);
dispatch(setDefaultMessagingChannel(channel));
} catch (err) {
console.warn('[skills] default channel persist failed:', err);
} finally {
setDefaultChannelBusy(null);
}
},
[dispatch, defaultChannelBusy]
);
const { definitions: channelDefs } = useChannelDefinitions();
const channelConnections = useAppSelector(state => state.channelConnections);
const {
toolkits: composioToolkits,
// Default to an empty map so the component is resilient when a test
// mock (or an older hook build) omits the dynamic-catalog field.
catalogByToolkit: composioCatalogByToolkit = new Map(),
connectionByToolkit: composioConnectionByToolkit,
connectionsByToolkit: composioConnectionsByToolkit,
loading: composioLoading,
error: composioError,View on GitHub (pinned to 7491200858)
Solutions
- Check the warned error to identify the failing persist layer (core RPC vs backend)
- Verify core/session health and retry the channel selection once the cause is fixed
- Confirm the persisted preference after retry rather than trusting the UI toggle
- Recurrent failures: inspect the core log for the default-channel config write path
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at app/src/pages/Skills.tsx:559 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of tinyhumansai/openhuman@7491200858 (2026-08-17).
Data as JSON: /api/errors/2e7dcd7dfba4e6e6.
Report an issue: GitHub.