diff --git a/intentkit/core/prompt.py b/intentkit/core/prompt.py
index bfe10303..a1c1b876 100644
--- a/intentkit/core/prompt.py
+++ b/intentkit/core/prompt.py
@@ -294,15 +294,30 @@ def _build_autonomous_task_prompt(agent: Agent, context: AgentContext) -> str:
# Fallback if task not found
return f"You are running an autonomous task. The task id is {task_id}. "
+ def _sanitize_task_field(value: str) -> str:
+ """Strip characters that could be used for prompt injection in task metadata fields."""
+ import re
+ # Remove ASCII control characters (newlines, tabs, etc.)
+ value = re.sub(r'[\x00-\x1f\x7f]', ' ', value)
+ # Remove common prompt-injection markers
+ value = re.sub(
+ r'(?i)(system:|###|<\|system\|>|\[INST\]|OVERRIDE:|ignore\s+previous)',
+ '[removed]',
+ value,
+ )
+ return value.strip()
+
# Build detailed task info - always include task_id
if autonomous_task.name:
- task_info = f"You are running an autonomous task '{autonomous_task.name}' (ID: {task_id})"
+ safe_name = _sanitize_task_field(autonomous_task.name)
+ task_info = f"You are running an autonomous task '{safe_name}' (ID: {task_id})"
else:
task_info = f"You are running an autonomous task (ID: {task_id})"
- # Add description if available
+ # Add description if available — sanitize before injection into system prompt
if autonomous_task.description:
- task_info += f": {autonomous_task.description}"
+ safe_desc = _sanitize_task_field(autonomous_task.description)
+ task_info += f": {safe_desc}"
# Add schedule info (minutes field is deprecated)
if autonomous_task.cron: