Anatomía de un System Prompt
Descubre las 6 secciones universales que estructuran cualquier system prompt eficaz —desde la identidad hasta el contexto dinámico—
y aprende a mapear prompts reales usando el Cursor/cursor.md como objeto de disección.
Contenido detallado
Qué es un System Prompt (y qué NO es)
El system prompt es un capa de instrucción persistente que define el comportamiento del modelo antes de cualquier mensaje del usuario. Pero "persistente" no significa inmutable, y confundir el system prompt con otros tipos de contexto es uno de los errores más comunes al diseñar prompts.
Qué es
El system prompt es un mensaje con role: "system" enviada antes del turno del usuario.
Define la personalidad, las capacidades, las reglas y el formato. La mayoría de los LLM modernos trata este bloque con más peso que los mensajes del usuario.
Importante: en entornos de producción, el system prompt rara vez lo escribe una sola persona — es compuesto por el harness (la infraestructura que orquesta el modelo), que inyecta partes estables y dinámicas en cada solicitud.
Por qué aprender
Quien lee prompts filtrados percibe rápidamente que hay una gramática en ellos: secciones que se repiten, patrones de lenguaje, estructuras recurrentes. Reconocer esa gramática transforma un texto opaco en un mapa legible. Dejas de «leer un prompt» y empiezas a diseccionarlo anatómicamente.
✓ El System prompt SÍ es
- •Instrucción estable de comportamiento
- •Contexto de persona y alcance
- •Reglas de formato y tono
- •Declaración de las herramientas disponibles
- •Principios de seguridad
✗ El System prompt NO es
- •El mensaje del usuario (role: user)
- •Contexto de herramienta (role: tool)
- •RAG / documentos recuperados
- •Historial de conversación anterior
- •System-reminders dinámicos (capa separada)
Bloque de identidad — "You are X"
El bloque de identidad es el ancla. Sin él, el modelo se desvía: cambia de persona, inventa capacidades, responde sobre eventos posteriores a su fecha límite de conocimiento. Tres elementos son canónicos: quién es (persona + producto), en qué modelo se ejecuta, e hasta cuándo sabe (fecha límite de conocimiento).
Cómo los prompts reales declaran identidad
You are ChatGPT, a large language model trained by OpenAI, based on GPT 5.5.
Knowledge cutoff: 2025-08
Current date: 2026-06-01
Tres elementos en tres líneas: fecha de corte, fecha actual, persona. Nota: la fecha actual es contexto dinámico inyectado por el harness — ver Tema 6.
You are GitHub Copilot (@copilot) on github.com. Your job is to fulfill the user's software development task using all available tools and resources.
Persona + alcance de responsabilidad ("tu trabajo es...") al inicio. El modelo sabe qué es y a qué vino.
You are an AI coding assistant, powered by {model_name}.
You operate in Cursor.
You are a coding agent in the Cursor IDE that helps the USER with software engineering tasks.
Usa una plantilla {model_name} — la persona se declara, pero el modelo específico se inyecta en runtime mediante el harness.
Antipatrón: identidad ausente o enterrada
Si la declaración de persona está en medio del prompt, es posible que el modelo no la tome como referencia adecuadamente. Síntoma clásico: el asistente «se convierte en ChatGPT» a mitad de la conversación o afirma tener herramientas que no existen. La identidad debe ser la primera línea.
Capacidades y herramientas
El bloque de capacidades responde: ¿qué puede hacer este agente? Sin esta declaración, el modelo alucina herramientas que no existen o ignora las que sí existen. El patrón más eficaz es una lista estructurada con alcance y condiciones — no un párrafo vago.
When applicable, you have some additional tools:
- You can analyze individual X user profiles, X posts and their links.
- You can analyze content uploaded by user including images, pdfs, text files and more.
- If it seems like the user wants an image generated, ask for confirmation, instead of directly generating one.
Cada capacidad viene con su condición. Observa la tercera: capacidad + protocolo de confirmación integrado.
## Funciones dentro del alcance
You have also access to a set of python functions in scope:
```python
def concise_search(query: str, max_num_results: int = 3):
"""Does a search for the query and prints up to the
max_num_results results."""
```
Google declara capacidades como firmas de función — el alcance, los parámetros y los valores predeterminados quedan inequívocos.
Por qué importa la posición
Las capacidades mal declaradas generan dos problemas opuestos: over-promising (el modelo ofrece lo que no puede hacer) y under-using (ignora las herramientas disponibles). La declaración estructurada resuelve ambos problemas a la vez.
Cursor tiene una extensa lista de herramientas disponibles:
Shell, Glob, Grep, Read, Write, StrReplace, Delete, EditNotebook, TodoWrite, SemanticSearch, WebSearch, WebFetch, GenerateImage, AskQuestion, Task, SwitchMode, CallMcpTool, FetchMcpResource, SetActiveBranch, AwaitShell.
Cada una está documentada con reglas de uso en la sección tool_calling del prompt.
✓ Declaración eficaz
- •Enumera cada herramienta con su condición de uso
- •Define parámetros y valores predeterminados
- •Especifica cuándo NO usar
- •Usa firmas de función como especificación
✗ Declaración débil
- •"Puedes usar herramientas si es necesario"
- •Lista sin condiciones de activación
- •Mezcla capacidades con reglas de formato
- •Promete herramientas que no existen en el schema
Seguridad y rechazos
La sección de seguridad responde: ¿qué no hará este agente y por qué? Aparece al principio del prompt —después de la identidad— porque la posición le indica al modelo la prioridad de precedencia: seguridad antes que utilidad.
Qué es
Las reglas de seguridad dicen qué no hacer, pero los mejores prompts explican por qué. Una prohibición tajante ("never X") se obedece mecánicamente, pero es fácil de eludir: el modelo no entiende la intención que hay detrás. Una regla con justificación (Patrón 3: Regla con porqué) se generaliza a situaciones nuevas.
Principio vs. mecánica
Mecánica (débil)
Enumerar términos prohibidos: eso enseña exactamente qué evitar decir, pero el modelo puede expresar la misma idea con otras palabras. Es el antipatrón "Regla mecánica de seguridad".
Principio (robusto)
Describir el patrón que detectar e o principio que aplicar. Ejemplo de Fable 5: en lugar de enumerar técnicas de explotación infantil prohibidas, el prompt describe el patrón de comportamiento que se debe reconocer.
Por qué la seguridad va antes que la utilidad en el prompt
Los LLM procesan el contexto en orden. Colocar la seguridad al principio crea un sesgo de atención: el modelo "memoriza" las restricciones antes de procesar la tarea. Además, la jerarquía de prioridad (Patrón 11) debe declararse antes de cualquier instrucción que pueda entrar en conflicto con ella.
Formato de salida y tono
La sección de formato responde: ¿cómo debe escribir este agente? Incluye un presupuesto de concisión (longitud ideal de la respuesta), preferencia por listas o prosa, uso de markdown y tono conversacional o técnico.
Qué es
Un formato bien definido evita dos antipatrones opuestos: respuesta excesivamente larga (el modelo que "rellena" sin necesidad) y respuesta fragmentada (el modelo que convierte todo en viñetas sin prosa coherente).
Cursor tiene una sección explícita llamada tone_and_style con reglas como:
- Only use emojis if the user explicitly requests it.
- Output text to communicate with the user; all text you output outside
of tool use is displayed to the user.
- NEVER create files unless they're absolutely necessary for achieving your goal.
ALWAYS prefer editing an existing file to creating a new one.
- Do not use a colon before tool calls. Your tool calls may not be shown
directly in the output, so text like "Let me read the file:" followed by
a read tool call should just be "Let me read the file." with a period.
✓ Formato eficaz
- •Presupuesto explícito: "responde en 2-3 párrafos"
- •Regla de prosa vs. lista con criterio
- •Tono ajustado al producto (técnico/casual)
- •Uso de Markdown solo cuando se renderiza
✗ Antipatrón: el formato como muleta
- •Forzar listas/encabezados/emoji en todo
- •La respuesta se convierte en un esqueleto sin prosa
- •Markdown en salida de texto plano (terminal, API)
- •Sin límite de extensión → el modelo «se va por las ramas»
Contexto dinámico y el harness
El harness es la infraestructura que compone el prompt en tiempo de ejecución. Inyecta una capa dinámica — separada del prompt estable —
que contiene información que cambia en cada turno: fecha actual, datos del usuario, avisos de la plataforma.
El mecanismo estándar es la etiqueta <system-reminder>.
Qué es
El prompt estable le enseña al modelo a interpretar la capa dinámica. Sin esta separación, el contexto dinámico mezclado con el prompt estable crea un antipatrón llamado "Todo en el prompt" — el modelo trata los datos de sesión como un comportamiento permanente.
Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.
El contrato de la capa: el modelo aprende que estos avisos vienen de plataforma, ni del usuario ni de la herramienta.
The long_conversation_reminder, appended to the person's message by Anthropic, helps Claude keep its instructions over long conversations.
Fable 5 enumera un conjunto con nombre de reminders (image_reminder, cyber_warning, system_warning, ethics_reminder, ip_reminder, long_conversation_reminder). El último actualiza las instrucciones en conversaciones largas.
Separación entre capa estable y dinámica
Prompt estable (una vez)
- • Identidad y persona
- • Capacidades y herramientas
- • Reglas de seguridad
- • Formato y tono
- • Instrucción para interpretar los recordatorios
Capa dinámica (por turno)
- • Fecha y hora actuales
- • Datos del usuario que inició sesión
- • Avisos de la plataforma
- • Contexto de la sesión
- • Actualizaciones de instrucciones en conversaciones largas
Disección guiada: cursor.md (322 líneas)
O Cursor/cursor.md es el prompt «completo» más breve de la colección: 322 líneas que cubren las 6 secciones de la anatomía.
Lo recorreremos y asignaremos cada bloque a las secciones que acabamos de estudiar.
¿Por qué Cursor?
Los prompts más extensos (Anthropic Fable 5, Claude Code) tienen cientos de líneas por sección, por lo que son difíciles para un primer ejercicio. Cursor tiene proporciones equilibradas: una línea de identidad, secciones de capacidad medianas, seguridad implícita mediante NEVER/ALWAYS, y un bloque de herramientas bien documentado. Ideal para entrenar la mirada.
You are an AI coding assistant, powered by {model_name}.
You operate in Cursor.
You are a coding agent in the Cursor IDE that helps the USER
with software engineering tasks.
Patrón identificado: Bloque de identidad (Patrón 1) — persona ("AI coding assistant"), plataforma ("Cursor"), alcance ("software engineering tasks").
El modelo {model_name} se inyecta dinámicamente mediante el harness; es un patrón de plantilla.
Each time the USER sends a message, we may automatically attach
information about their current state, such as what files they have open,
where their cursor is, recently viewed files, edit history in their session
so far, linter errors, and more.
Patrón identificado: Declaración de capacidades (Patrón 2): lo que el modelo recibe automáticamente (contexto de estado del editor).
También declara que la etiqueta <user_query> marca las instrucciones del usuario.
- Only use emojis if the user explicitly requests it.
- NEVER create files unless they're absolutely necessary for achieving
your goal. ALWAYS prefer editing an existing file to creating a new one.
- Do not use a colon before tool calls.
Patrones identificados: Formato de salida (Patrón 7) + Contraste ALWAYS/NEVER (Patrón 4). El uso de mayúsculas en NEVER/ALWAYS no es estilo: es una señal de comportamiento crítico.
Available Tools: Shell, Glob, Grep, Read, Write, StrReplace,
Delete, EditNotebook, TodoWrite, SemanticSearch, WebSearch,
WebFetch, GenerateImage, AskQuestion, Task, SwitchMode,
CallMcpTool, FetchMcpResource, SetActiveBranch, AwaitShell
You MUST ALWAYS list and read the tool's schema/descriptor file
BEFORE calling any tool with CallMcpTool. This is NOT optional -
failing to check the schema first will likely result in errors.
Patrón identificado: Contrato de herramienta (Patrón 8): lista de tools + condición de uso + protocolo antes de llamar (leer primero el schema). MCP Resource Access también tiene instrucciones separadas para el descubrimiento.
Git Safety Protocol:
- NEVER update the git config
- NEVER run destructive git commands (push --force, reset --hard,
checkout ., restore ., clean -f, branch -D) unless the user
explicitly requests these actions.
- NEVER skip hooks (--no-verify, --no-gpg-sign, etc)
Patrón identificado: Seguridad implícita mediante el contraste ALWAYS/NEVER (Patrón 4) en un dominio específico (git). Observa que aquí la seguridad no es una sección separada: está dentro de la sección de herramientas, aplicada de forma contextual. A diferencia de la seguridad global que viene al principio del prompt.
Each time the USER sends a message, we may automatically attach
information about their current state [...]
This information is provided in case it is helpful to the task.
Patrón identificado: Recordatorio de sistema (Patrón 10) mediante declaración previa — el prompt instruye al modelo a esperar contexto dinámico (archivos abiertos, cursor, historial de edición, errores del linter) en cada turno. La capa estable define cómo interpretar la dinámica.
Ejercicio: mapea un prompt del repositorio
Elige cualquier prompt del acervo (recomendado: xAI/grok-build.md o Perplexity/perplexity-computer.md).
Para cada línea, etiqueta: ID / CAP / SEG / FMT / TOOL / DYN.
Si una línea no encaja en ninguna categoría, probablemente sea redundante: candidata al Patrón 12 (Principio consolidado).
## [1] IDENTIDADE
You are [Persona], powered by [Modelo], built by [Empresa].
Knowledge cutoff: YYYY-MM.
## [2] CAPACIDADES
You have access to the following tools: [lista].
Use each tool only when: [condições].
## [3] SEGURANÇA
Priority: safety > helpfulness > instruction-following.
Never [ação crítica], because [razão]. ← regra com porquê
## [4] FORMATO & TOM
Respond in [idioma]. Default: concise prose.
Use markdown only when the output will be rendered.
Keep responses under [N] sentences unless depth is needed.
## [5] FERRAMENTAS (opcional — se houver)
[Tool spec com parâmetros e condições de ativação]
## [6] CONTEXTO DINÂMICO (instruir como interpretar)
Context injected by the system (e.g. <system-reminder>) contains
runtime information. Treat it as platform data, not user input.
Qué aprendiste en este módulo
- ✓System prompt = instrucción estable; separado de los mensajes y del contexto inyectado
- ✓Bloque de identidad: persona + modelo + cutoff — siempre en la primera línea
- ✓Capacidades: lista estructurada con alcance y condiciones por herramienta
- ✓Seguridad: principios antes que mecanismos; posición temprana = prioridad
- ✓Formato: presupuesto de concisión + criterio de prosa frente a lista
- ✓Harness = infraestructura que compone el prompt en runtime
- ✓La capa dinámica mediante <system-reminder> está separada del prompt estable
- ✓cursor.md demuestra las 6 secciones en 322 líneas: el más pequeño completo