warpdotdev/warp · error
Failed to parse saved prompt ID '{id}': {err}
Error message
Failed to parse saved prompt ID '{id}': {err} What it means
--prompt accepts a saved-prompt reference, which must convert to a ServerId (then a SyncId) via ServerId::try_from (app/src/ai/agent_sdk/ambient.rs:275-284). A malformed ID fails the conversion and the error embeds both the offending ID and the underlying parse error. This fails before any CloudModel lookup happens.
Source
Thrown at app/src/ai/agent_sdk/ambient.rs:278
anyhow::anyhow!("Either --prompt, --skill, or --conversation must be provided"),
ctx,
);
return;
}
let prompt = match prompt {
Some(Prompt::PlainText(text)) => Some(text),
Some(Prompt::SavedPrompt(id)) => {
// Resolve the saved prompt to pass along as the ambient agent query.
// We look up the prompt text here, rather than passing along the saved prompt ID,
// in order to support personal saved prompts, which team service accounts would not
// have access to.
// TODO: we should pipe the saved prompt ID through the API, and resolve it server-side.
// That'd also allow finding all tasks which used a given saved prompt.
let sync_id: SyncId = match ServerId::try_from(id.as_str()) {
Ok(server_id) => server_id.into(),
Err(err) => {
super::report_fatal_error(
anyhow::anyhow!("Failed to parse saved prompt ID '{id}': {err}"),
ctx,
);
return;
}
};
let cloud_model = CloudModel::handle(ctx);
let workflow = cloud_model.as_ref(ctx).get_workflow(&sync_id);
match workflow {
Some(cloud_workflow) => match cloud_workflow.model().data.prompt() {
Some(prompt_text) => Some(prompt_text.to_string()),
None => {
super::report_fatal_error(
anyhow::anyhow!("'{id}' is not a saved prompt"),
ctx,
);
return;View on GitHub (pinned to e72fd7aacb)
Solutions
- Copy the exact saved-prompt ID from the prompt listing output
- Trim whitespace and remove surrounding quotes from the value
- If you only have the text, pass it directly with --prompt instead of an ID
Defensive patterns
Strategy: validation
Validate before calling
if let Some(Prompt::SavedPrompt(id)) = args.prompt_arg.to_prompt() {
if ServerId::try_from(id.as_str()).is_err() {
// reject the ID early instead of letting the run abort later
}
} Type guard
fn saved_prompt_id_is_parsable(id: &str) -> bool {
ServerId::try_from(id).is_ok()
} Prevention
- Pass IDs verbatim from the prompts listing; never the display name
- Trim whitespace/quotes around IDs in wrappers before forwarding them
When it happens
Trigger: Passing a prompt name or free text instead of the sync ID; copying an ID with extra characters, truncation, or surrounding quotes; an ID belonging to a different entity scheme.
Common situations: Users typing the prompt's display name where the ID is expected; IDs mangled by shell quoting or copy-truncation.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- Invalid repo format: '{}'. Expected 'owner/repo' or 'https:/
- '{id}' is not a saved prompt
- Saved prompt with ID '{id}' not found
- claude -p exited {result.returncode} stderr: {result.stderr}
- SKILL.md missing frontmatter (no opening ---)
AI-assisted analysis of warpdotdev/warp@e72fd7aacb (2026-08-16).
Data as JSON: /api/errors/e2eac64bb49fa401.
Report an issue: GitHub.