Un prompt es una función cuyo valor de retorno es comportamiento.
Cambia una palabra y la función actúa distinto —a veces sutilmente, a veces de forma catastrófica, siempre sin que ningún compilador se entere. Esa es una definición de «código» más estricta que la que cumplen la mayoría de las cosas de tu directorio app/, y le da derecho a todas las disciplinas que ya aplicas al código: control de versiones, revisión, pruebas, un despliegue y una forma de volver atrás.
El instinto al que hay que resistirse es el que dice que un prompt es contenido. Lo parece. Es prosa, se edita cambiando palabras en vez de lógica, y resulta tentador ponerlo en un sitio donde alguien que no programa pueda cambiarlo un viernes por la tarde. Haz eso y habrás sacado el componente que más define tu comportamiento fuera de todas las salvaguardas que tienes.
Dónde vive un prompt
En una clase PHP, como constante, en app/.
final class BuildAiChatSystemPromptAction
{
public function __invoke(string $siteCategory): string
{
return $siteCategory === 'event'
? self::BASE_PROMPT.self::EVENT_EXTRA
: self::BASE_PROMPT;
}
private const BASE_PROMPT = <<<'PROMPT'
Webplo site editor. Single-line JSON only — no markdown, no extra text.
...
PROMPT;
}
Un nowdoc —<<<'PROMPT' con comillas, no <<<PROMPT— porque el prompt está lleno de llaves y de marcadores con forma de variable que pertenecen al modelo, no a PHP. Interpolar por accidente es un error que no verás hasta que el modelo reciba un prompt con una variable vacía donde debería haber una instrucción.
Las razones de esta ubicación no son estéticas:
Se ve en un diff. Un cambio de prompt aparece en la revisión como un diff, junto al código que lo consume. Alguien puede preguntar por qué.
Se despliega. El prompt en producción es el del commit que se desplegó. No hay deriva entre lo que probaste y lo que está corriendo.
Se revierte. Cuando el comportamiento empeora, git revert restaura exactamente el anterior. Un prompt en una fila de base de datos no tiene revert; tiene lo que escribió la última persona.
Se puede probar. Una clase que devuelve una cadena admite aserciones. Un textarea en un panel de administración no.
El contraargumento siempre es «pero entonces un cambio necesita un desarrollador y un despliegue». Sí. Esa es la característica. Un cambio de prompt es un cambio de comportamiento, y que los cambios de comportamiento pasen por revisión y despliegue es la premisa entera del libro anterior.