nexu-io/open-design · error

automation-template delete proposals are not supported yet

Error message

automation-template delete proposals are not supported yet

What it means

Thrown by applyAutomationTemplateProposal() when proposal.action === 'delete'. Automation-template delete support is intentionally unimplemented — the applier can upsert templates but cannot remove them. This is a deliberate capability gap, not a bug.

Source

Thrown at apps/daemon/src/automation-proposals.ts:267

async function applySkillProposal(dataDir: string, proposal: AutomationEvolutionProposal) {
  const slug = targetSlugFor(proposal, 'skill');
  const dir = path.join(dataDir, 'skills', slug);
  const file = path.join(dir, 'SKILL.md');
  if (proposal.action === 'delete') {
    await fsp.rm(dir, { recursive: true, force: true });
    return { skillSlug: slug, action: 'delete', path: `skills/${slug}/SKILL.md` };
  }
  await fsp.mkdir(dir, { recursive: true });
  await fsp.writeFile(file, proposalAfterMarkdown(proposal), 'utf8');
  return { skillSlug: slug, action: proposal.action, path: `skills/${slug}/SKILL.md` };
}

async function applyAutomationTemplateProposal(
  dataDir: string,
  proposal: AutomationEvolutionProposal,
) {
  if (proposal.action === 'delete') {
    throw new Error('automation-template delete proposals are not supported yet');
  }
  const patch = parseJsonPatchAfter(proposal);
  const template = await upsertUserAutomationTemplate(dataDir, patch);
  return {
    automationTemplateId: template.id,
    action: proposal.action,
    path: `automation-templates/${template.id}.json`,
  };
}

async function updateProposalStatus(
  dataDir: string,
  id: string,
  status: AutomationProposalStatus,
  metadataPatch: Record<string, unknown> = {},
): Promise<AutomationEvolutionProposal> {
  const proposals = await listAutomationProposals(dataDir, { status: 'all' });
  const index = proposals.findIndex((proposal) => proposal.id === id);

View on GitHub (pinned to 5be4028344)

Solutions

  1. Do not route automation-template removals through the proposal applier — delete the template file directly under the daemon data root if you have a legitimate removal need.
  2. Reject the proposal with a note that template deletion is not yet supported.
  3. Track the request as a feature gap until delete is implemented in applyAutomationTemplateProposal.
Defensive patterns

Strategy: validation

Validate before calling

if (proposal.targetKind === 'automation-template' && proposal.action === 'delete') {
  throw new Error('automation-template delete proposals are not supported yet');
}

Type guard

function isSupportedTemplateAction(p: { targetKind: string; action: string }): boolean {
  return !(p.targetKind === 'automation-template' && p.action === 'delete');
}

Prevention

When it happens

Trigger: Applying an automation-template proposal with action 'delete'. The other actions (create/update via upsertUserAutomationTemplate) are supported and call parseJsonPatchAfter to build the template payload.

Common situations: Agent proposed removing an obsolete template; UI offered a delete action for templates before the backend supported it; migration script tried to clean up templates via the proposal flow.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/f3f1cd5560ddd240. Report an issue: GitHub.