jackwener/OpenCLI · error · CommandExecutionError
CreateList returned a list payload without list mode.
Error message
CreateList returned a list payload without list mode.
What it means
requireCreateListResult requires the CreateList response to include a string `mode` field (public/private). It throws when the payload has no mode or a non-string mode. Mode is required so the CLI can verify the list's privacy setting matches what the user requested.
Source
Thrown at clis/twitter/list-create.js:74
const errors = result.bodyJson?.errors;
if (Array.isArray(errors) && errors.length > 0) {
throw new CommandExecutionError(`CreateList failed: ${errors[0].message || JSON.stringify(errors[0])}`);
}
throw new CommandExecutionError(`CreateList returned no list payload. Body: ${String(result.bodyText || '').slice(0, 300)}`);
}
const id = String(list.id_str || list.id || '');
if (!/^\d+$/.test(id)) {
throw new CommandExecutionError('CreateList returned a list payload without a numeric list id.');
}
if (typeof list.name !== 'string' || !list.name.trim()) {
throw new CommandExecutionError('CreateList returned a list payload without a list name.');
}
if (list.name.trim() !== expectedName) {
throw new CommandExecutionError(`CreateList returned name ${JSON.stringify(list.name)}, expected ${JSON.stringify(expectedName)}.`);
}
const modeValue = typeof list.mode === 'string' ? list.mode : '';
if (!modeValue) {
throw new CommandExecutionError('CreateList returned a list payload without list mode.');
}
const mode = /private/i.test(modeValue) ? 'private' : 'public';
if (mode !== expectedMode) {
throw new CommandExecutionError(`CreateList returned mode ${mode}, expected ${expectedMode}.`);
}
return { createdList: list, listId: id, listMode: mode };
}
export function buildListCreateRow({ result, name, description, mode }) {
const { createdList, listId, listMode } = requireCreateListResult(result, name, mode);
return {
id: listId,
name: createdList.name,
description: typeof createdList.description === 'string' ? createdList.description : description,
mode: listMode,
status: 'success',
};
}View on GitHub (pinned to 49907e53dc)
Solutions
- Log the raw response payload to confirm which fields Twitter now returns
- Update the parser/queryId+FEATURES to match the current CreateList schema
- Retry the command in case of a transient partial response
- Add a fallback that re-fetches the list by id to read its mode
Example fix
// before const modeValue = typeof list.mode === 'string' ? list.mode : ''; // after let modeValue = typeof list.mode === 'string' ? list.mode : ''; if (!modeValue && list.customizable !== undefined) modeValue = list.customizable ? 'private' : 'public'; // fallback field
Defensive patterns
Strategy: type-guard
Validate before calling
if (!result?.data?.create_list || typeof result.data.create_list.mode !== 'string') {
throw new Error('CreateList payload missing mode');
} Type guard
function hasListMode(list) {
return !!list && typeof list === 'object' && (list.mode === 'public' || list.mode === 'private');
} Try / catch
try {
const row = buildListCreateRow({ result, name, description, mode });
} catch (e) {
if (/without list mode/.test(e.message)) console.error('Response schema drifted; dump payload', JSON.stringify(result));
else throw e;
} Prevention
- Assert response shape in tests with a current fixture
- Handle schema drift explicitly rather than trusting fields exist
- Re-fetch the list by id as a fallback when mode is missing
When it happens
Trigger: CreateList GraphQL response contains a list object without `mode` or with mode of a non-string type — schema drift, partial response, or mocked test payload missing mode.
Common situations: Twitter updates the CreateList response schema; an API gateway strips fields; unit-test fixtures omit mode.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- CreateList returned a list payload without a list name.
- Bilibili conclusion API returned malformed model_result JSON
- Bilibili conclusion API returned malformed model_result
- ${label} returned malformed items payload
- returned no success evidence
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/f29e8be3af8abcf4.
Report an issue: GitHub.