# Spanish phantom-detection configuration
# Phrases are lower-case. Matched against lowercased response text.
intent_phrases = [
"voy a cargar",
"déjame cargar",
"cargando el ",
"cargando la ",
"déjame revisar",
"déjame verificar",
"déjame inspeccionar",
"déjame comprobar",
"déjame actualizar",
"déjame modificar",
"déjame corregir",
"déjame arreglar",
"déjame crear",
"déjame añadir",
"déjame agregar",
"déjame eliminar",
"déjame borrar",
"déjame ejecutar",
"déjame leer",
"déjame buscar",
"déjame encontrar",
"voy a revisar",
"voy a verificar",
"voy a actualizar",
"voy a modificar",
"voy a corregir",
"voy a arreglar",
"voy a crear",
"voy a usar",
"voy a utilizar",
"voy a escribir",
"voy a ejecutar",
"voy a añadir",
"voy a agregar",
"voy a eliminar",
"voy a borrar",
"voy a ejecutar",
"voy a leer",
"voy a buscar",
"ahora voy a",
"ahora reviso",
"ahora actualizo",
"ahora corrijo",
"ahora arreglo",
"ahora creo",
"ahora añado",
"ahora elimino",
"ahora ejecuto",
"ahora leo",
"ahora busco",
"vamos a revisar",
"vamos a actualizar",
"vamos a corregir",
"vamos a arreglar",
"vamos a crear",
"vamos a añadir",
"vamos a eliminar",
"vamos a ejecutar",
"procedo a",
"procederé a",
"ahora procedo a",
# Deferment stalls — "necesito X" / "tengo que X" / "debo X"
# 2026-05-28: parity with the English "i need to X" entries; this is
# the same pre-action narration shape in Spanish.
"necesito leer",
"necesito revisar",
"necesito verificar",
"necesito comprobar",
"necesito inspeccionar",
"necesito examinar",
"necesito buscar",
"necesito encontrar",
"necesito entender",
"necesito ver",
"necesito investigar",
"necesito actualizar",
"necesito corregir",
"necesito arreglar",
"necesito modificar",
"necesito crear",
"necesito escribir",
"necesito añadir",
"necesito agregar",
"necesito eliminar",
"tengo que leer",
"tengo que revisar",
"tengo que verificar",
"tengo que actualizar",
"tengo que corregir",
"tengo que arreglar",
"tengo que investigar",
"debo leer",
"debo revisar",
"debo verificar",
"debo actualizar",
"debo corregir",
"debería leer",
"debería revisar",
"debería verificar",
"debería investigar",
# Cleanup / destructive action verbs — 2026-06-04: mirror of the
# EN additions (limpiar / eliminar / borrar / quitar /
# refactorizar / reorganizar / ordenar / purgar). Spanish
# conjugates first-person in the verb itself, so the equivalents
# of "let me X" / "I'll X" / pronounless "need to X" collapse
# into the standard set of prefixes the bot already uses.
"déjame limpiar",
"déjame eliminar",
"déjame borrar",
"déjame quitar",
"déjame refactorizar",
"déjame reorganizar",
"déjame ordenar",
"déjame purgar",
"voy a limpiar",
"voy a eliminar",
"voy a borrar",
"voy a quitar",
"voy a refactorizar",
"voy a reorganizar",
"voy a ordenar",
"voy a purgar",
"vamos a limpiar",
"vamos a eliminar",
"vamos a borrar",
"vamos a quitar",
"vamos a refactorizar",
"vamos a reorganizar",
"vamos a ordenar",
"vamos a purgar",
"necesito limpiar",
"necesito eliminar",
"necesito borrar",
"necesito quitar",
"necesito refactorizar",
"necesito reorganizar",
"necesito ordenar",
"necesito purgar",
"tengo que limpiar",
"tengo que eliminar",
"tengo que borrar",
"tengo que quitar",
"tengo que refactorizar",
"tengo que reorganizar",
"tengo que ordenar",
"tengo que purgar",
"debo limpiar",
"debo eliminar",
"debo borrar",
"debo refactorizar",
"debería limpiar",
"debería eliminar",
"debería borrar",
"debería refactorizar",
"debería reorganizar",
# Parity with en.toml (#2225): the verb inventory English carries,
# across the Spanish constructions that announce it. Each family keeps
# its own natural mood, so nothing here is a translation of an English
# line, it is the phrase a Spanish speaker writes for the same intent.
"voy a editar",
"voy a cambiar",
"voy a reemplazar",
"voy a hacer commit",
"voy a hacer push",
"voy a comprobar",
"voy a examinar",
"voy a inspeccionar",
"voy a preparar",
"voy a empezar",
"voy a terminar",
"voy a finalizar",
"voy a sincronizar",
"voy a instalar",
"voy a descargar",
"voy a subir",
"voy a registrar",
"voy a habilitar",
"voy a deshabilitar",
"voy a investigar",
"voy a explorar",
"voy a encontrar",
"voy a recopilar",
"voy a obtener",
"voy a consultar",
"voy a escanear",
"voy a rastrear",
"voy a construir",
"voy a compilar",
"voy a desplegar",
"voy a migrar",
"voy a aplicar",
"voy a configurar",
"voy a reiniciar",
"voy a probar",
"voy a fusionar",
"voy a documentar",
"voy a listar",
"voy a mapear",
"voy a planear",
"voy a conectar",
"voy a revertir",
"voy a ajustar",
"voy a mover",
"voy a renombrar",
"déjame escribir",
"déjame editar",
"déjame cambiar",
"déjame reemplazar",
"déjame hacer commit",
"déjame hacer push",
"déjame examinar",
"déjame preparar",
"déjame empezar",
"déjame terminar",
"déjame finalizar",
"déjame sincronizar",
"déjame instalar",
"déjame descargar",
"déjame subir",
"déjame registrar",
"déjame habilitar",
"déjame deshabilitar",
"déjame investigar",
"déjame explorar",
"déjame recopilar",
"déjame obtener",
"déjame consultar",
"déjame escanear",
"déjame rastrear",
"déjame construir",
"déjame compilar",
"déjame desplegar",
"déjame migrar",
"déjame aplicar",
"déjame configurar",
"déjame reiniciar",
"déjame probar",
"déjame fusionar",
"déjame documentar",
"déjame listar",
"déjame mapear",
"déjame planear",
"déjame conectar",
"déjame revertir",
"déjame ajustar",
"déjame mover",
"déjame renombrar",
"vamos a modificar",
"vamos a escribir",
"vamos a editar",
"vamos a agregar",
"vamos a cambiar",
"vamos a reemplazar",
"vamos a hacer commit",
"vamos a hacer push",
"vamos a comprobar",
"vamos a leer",
"vamos a examinar",
"vamos a verificar",
"vamos a inspeccionar",
"vamos a preparar",
"vamos a empezar",
"vamos a terminar",
"vamos a finalizar",
"vamos a cargar",
"vamos a sincronizar",
"vamos a instalar",
"vamos a descargar",
"vamos a subir",
"vamos a registrar",
"vamos a habilitar",
"vamos a deshabilitar",
"vamos a investigar",
"vamos a explorar",
"vamos a buscar",
"vamos a encontrar",
"vamos a recopilar",
"vamos a obtener",
"vamos a consultar",
"vamos a escanear",
"vamos a rastrear",
"vamos a construir",
"vamos a compilar",
"vamos a desplegar",
"vamos a migrar",
"vamos a aplicar",
"vamos a configurar",
"vamos a reiniciar",
"vamos a probar",
"vamos a fusionar",
"vamos a documentar",
"vamos a listar",
"vamos a mapear",
"vamos a planear",
"vamos a conectar",
"vamos a revertir",
"vamos a ajustar",
"vamos a mover",
"vamos a renombrar",
"necesito editar",
"necesito cambiar",
"necesito reemplazar",
"necesito hacer commit",
"necesito hacer push",
"necesito ejecutar",
"necesito preparar",
"necesito empezar",
"necesito terminar",
"necesito finalizar",
"necesito cargar",
"necesito sincronizar",
"necesito instalar",
"necesito descargar",
"necesito subir",
"necesito registrar",
"necesito habilitar",
"necesito deshabilitar",
"necesito explorar",
"necesito recopilar",
"necesito obtener",
"necesito consultar",
"necesito escanear",
"necesito rastrear",
"necesito construir",
"necesito compilar",
"necesito desplegar",
"necesito migrar",
"necesito aplicar",
"necesito configurar",
"necesito reiniciar",
"necesito probar",
"necesito fusionar",
"necesito documentar",
"necesito listar",
"necesito mapear",
"necesito planear",
"necesito conectar",
"necesito revertir",
"necesito ajustar",
"necesito mover",
"necesito renombrar",
"tengo que modificar",
"tengo que crear",
"tengo que escribir",
"tengo que editar",
"tengo que añadir",
"tengo que agregar",
"tengo que cambiar",
"tengo que reemplazar",
"tengo que hacer commit",
"tengo que hacer push",
"tengo que ejecutar",
"tengo que comprobar",
"tengo que examinar",
"tengo que inspeccionar",
"tengo que preparar",
"tengo que empezar",
"tengo que terminar",
"tengo que finalizar",
"tengo que cargar",
"tengo que sincronizar",
"tengo que instalar",
"tengo que descargar",
"tengo que subir",
"tengo que registrar",
"tengo que habilitar",
"tengo que deshabilitar",
"debo arreglar",
"debo modificar",
"debo crear",
"debo escribir",
"debo editar",
"debo añadir",
"debo agregar",
"debo cambiar",
"debo reemplazar",
"debo hacer commit",
"debo hacer push",
"debo ejecutar",
"debo comprobar",
"debo examinar",
"debo inspeccionar",
"debo preparar",
"debo empezar",
"debo terminar",
"debo finalizar",
"debo cargar",
"debo sincronizar",
"debo instalar",
"debo descargar",
"debo subir",
"debo registrar",
"debo habilitar",
"debo deshabilitar",
"debo investigar",
"debería actualizar",
"debería corregir",
"debería arreglar",
"debería modificar",
"debería crear",
"debería escribir",
"debería editar",
"debería añadir",
"debería agregar",
"debería cambiar",
"debería reemplazar",
"debería hacer commit",
"debería hacer push",
"debería ejecutar",
"debería comprobar",
"debería examinar",
"debería inspeccionar",
"debería preparar",
"debería empezar",
"debería terminar",
"debería finalizar",
"debería cargar",
"debería sincronizar",
"debería instalar",
"debería descargar",
"debería subir",
"debería registrar",
"debería habilitar",
"debería deshabilitar",
"ahora modifico",
"ahora escribo",
"ahora edito",
"ahora agrego",
"ahora cambio",
"ahora reemplazo",
"ahora hago commit",
"ahora hago push",
"ahora compruebo",
"ahora examino",
"ahora verifico",
"ahora inspecciono",
"ahora preparo",
"ahora empiezo",
"ahora termino",
"ahora finalizo",
"ahora cargo",
"ahora sincronizo",
"ahora instalo",
"ahora descargo",
"ahora subo",
"ahora registro",
"ahora habilito",
"ahora deshabilito",
"ahora investigo",
]
action_verbs = [
# Local playback / launching an artifact (see en.toml).
"reproduje",
"abrí el archivo",
"lancé",
"previsualicé",
"actualicé",
"modifiqué",
"corregí",
"arreglé",
"creé",
"añadí",
"agregué",
"eliminé",
"borré",
"ejecuté",
"leí",
"busqué",
"encontré",
"revisé",
"verifiqué",
"inspeccioné",
"comprobé",
"actualizado",
"modificado",
"corregido",
"arreglado",
"creado",
"añadido",
"agregado",
"eliminado",
"borrado",
"ejecutado",
# Issue-tracker and review actions (see en.toml for the case that
# exposed the gap).
"cerré",
"cerrado",
"reabrí",
"reabierto",
"comenté",
"comentado",
"abrí",
"abierto",
"etiqueté",
"asigné",
# Self-update and lifecycle. A fabricated "Evolved from X to Y" with zero
# tool calls told the user their binary had replaced itself when it had
# not, leaving them to report bugs against a version they were not running.
"evolucioné",
"evolucionado",
"actualicé la versión",
"reinicié",
"reiniciado",
"reconstruí",
# Claimed INVESTIGATION, not side effects. A zero-tool turn opening
# "Verified just now, real output:" produced a fabricated file dump with
# invented line numbers. Fabricated evidence is worse than a fabricated
# action: a fake push dies to one git log, a fake dump gets built on.
# Deliberately excludes read/checked/found/ran — all legitimate in
# ordinary conversation about context the model already has.
"verificado",
"audité",
"auditado",
]
completion_claims = [
"archivo actualizado",
"archivo modificado",
"archivo corregido",
"archivo creado",
"código actualizado",
"código corregido",
"error corregido",
"cambios aplicados",
"todo actualizado",
"todo corregido",
"listo",
"hecho",
"completado",
"guardado",
"el trabajo está entregado",
"trabajo entregado y registrado",
# Parity with en.toml (#2225): the same claim families English lists,
# phrased as a Spanish speaker writes them.
"aquí está lo que cambió",
"esto es lo que cambié",
"estos son los cambios",
"esto es lo que hice",
"actualicé el archivo",
"actualicé el código",
"modifiqué el archivo",
"modifiqué el código",
"corregí el archivo",
"corregí el error",
"corregí el fallo",
"creé el archivo",
"escribí el archivo",
"todo está actualizado",
"ya hice los cambios",
"ya terminé",
"ya acabé",
"ya actualicé",
"ya escribí",
"ya creé",
"ya guardé",
"ya modifiqué",
"ya corregí",
"ya reemplacé",
"ya hice commit",
"ya subí la versión",
"todos los cambios se aplicaron",
"todos los archivos se actualizaron",
"los cambios están aplicados",
"los cambios ya están",
"el archivo ahora contiene",
"el archivo está actualizado",
"archivo guardado",
"cambios guardados",
"commit hecho",
"versión subida",
"el trabajo está enviado",
"el trabajo está hecho y registrado",
]
line_start_re = "(?im)^[\\s\\-*•>]*(?:(?:vale|bien|ok|okey|sí|claro)\\s*,?\\s+)?(?:ahora\\s+)?(?:déjame|voy a|vamos a|necesito|tengo que|debo|debería|debería de|debo de)\\s+\\w"
# Anuncio de trabajo en curso que cierra el turno sin llamar a ninguna
# herramienta — "Ejecutando las pruebas ahora.", "Verificando…". Requiere
# gerundio de acción + marcador de inmediatez (ahora / … / : ).
work_announcement_re = "(?i)^[\\s\\-*•>]*(?:(?:(?:y\\s+)?luego|(?:y\\s+)?despu[ée]s|(?:y\\s+)?entonces|a\\s+continuaci[óo]n|y)[,]?\\s+)?(?:(?:vale|bien|ok|okey|sí|claro)[,.!:]?\\s+)?(?:estoy\\s+|ahora\\s+)?(?:ejecutando|corriendo|verificando|revisando|comprobando|construyendo|compilando|probando|buscando|leyendo|escribiendo|creando|generando|actualizando|modificando|instalando|aplicando|desplegando|descargando|subiendo|eliminando|borrando|arreglando|corrigiendo|analizando|investigando)\\b[^.!?:\\n]{0,60}?(?:\\s+ahora(?:[.!…,:]+|\\s*(?:\\n|$))|\\.{3}|…|:\\s*(?:\\n|$))"
# Gerund-led plan announcement carrying NO imminence marker — "Setting up the
# plan, then mapping every call site before touching anything." Two reasons
# the patterns above cannot see it (#1261): the verb is a PREPARATION verb
# (mapping, planning, drafting, listing) that work_announcement_re never
# enumerated, and the clause is sequenced with then / before instead of ending
# in now / … / :, which that pattern requires and gerund_re expects at the
# front. Scanned by the zero-tool gate only: once a tool has run, the same
# shape can be a legitimate recap ("Updating the config fixed it, then the
# build passed").
plan_announcement_re = "(?im)^[\\s\\-*•>]*(?:(?:ok|vale|bien|claro)[,.!:]?\\s+)?(?:voy\\s+a\\s+|estoy\\s+|primero\\s+|ahora\\s+)?(?:configurando|configurar|mapeando|mapear|planificando|planificar|preparando|preparar|revisando|revisar|listando|listar|documentando|documentar|creando|crear|actualizando|actualizar|verificando|verificar|leyendo|leer|ejecutando|ejecutar|analizando|analizar|investigando|investigar)\\b[^.!?\\n]{0,120}?\\b(?:luego|después|despues|entonces|antes\\s+de|a\\s+continuación|a\\s+continuacion)\\b"
gerund_re = "(?im)(?:^|[.!?]\\s+)\\s*(?:ahora|ya)\\s+(?:actualizando|modificando|corrigiendo|arreglando|creando|añadiendo|agregando|eliminando|borrando|ejecutando|leyendo|buscando)\\b"
trailing_colon_re = "(?im)(?:^|\\n)\\s*(?:déjame|voy a|ahora voy a|vamos a)\\s+\\w[^:\\n]{0,80}:\\s*$"
now_imperative_re = "(?m)^[\\s\\-*]*(?:ahora\\s+)?(?:déjame|voy a|vamos a)\\s+\\w"
numbered_steps_re = "(?m)^\\s*\\d+\\.\\s+(?:actualizar|modificar|corregir|arreglar|crear|añadir|agregar|eliminar|borrar|ejecutar|leer|buscar)"
past_tense_standalone_re = "(?m)^[\\s\\-*]*(?:actualicé|modifiqué|corregí|arreglé|creé|añadí|agregué|eliminé|borré|ejecuté|revisé|verifiqué|actualizado|modificado|corregido|arreglado|creado)[.!]"
path_re = "(?:^|[\\s`(])(?:\\./)?[a-zA-Z_][\\w\\-]*/[\\w\\-/]*\\.\\w{1,6}(?:[\\s`),:;]|$)"
ext_re = "(?:^|[\\s`(])[\\w\\-]+\\.(?:rs|py|ts|tsx|js|jsx|go|sh|toml|yaml|yml|json|md)(?:[\\s`),:;]|$)"
backtick_code_re = "`[a-zA-Z_]\\w+`"
# Alucinación de generación de imágenes (#747)
media_delivery_phrases = [
"aquí está",
"aquí lo tienes",
"aquí tienes",
"ya está",
"listo, aquí",
"lo generé",
"he generado",
"generé la imagen",
"creé la imagen",
"edité la imagen",
"la imagen editada",
"la imagen generada",
"generado esta vez",
"generada esta vez",
"envié la imagen",
]
media_context_words = [
"imagen",
"foto",
"fotografía",
"render",
"fondo",
"brillo",
"exposición",
"contraste",
"logo",
"logotipo",
]
# Framings that present a named command as ALREADY RUN. The command is
# language-neutral; the claim around it is not. See #789.
executed_framings = [
"ejecuté",
"acabo de ejecutar",
"corrí",
"verifiqué con",
"comprobé con",
"la salida",
"salida arriba",
"el resultado",
"confirmé con",
]
# Claims that a FILE or DOCUMENT was sent (#825). Paired with
# `file_context_words`: a claim of a delivered file in a turn that never
# invoked a document-sending tool is fabricating. Document sending is a
# newer capability than image generation, so the media checks (#747) did
# not cover it.
file_delivery_phrases = [
"archivo enviado",
"envié el archivo",
"te envié el archivo",
"adjunté",
"he adjuntado",
"adjunto el archivo",
"subí el archivo",
"he subido",
"documento enviado",
"envié el documento",
"envié el informe",
"informe entregado",
"el archivo está arriba",
"ver el adjunto",
"recién salido del horno",
"aquí está el vídeo",
"aquí está el audio",
"está ahí arriba",
"ahí arriba",
"dale play",
"acabo de enviarlo",
"ya lo envié",
]
# Words marking the claimed deliverable as a file rather than a message.
file_context_words = [
"archivo",
"documento",
"informe",
".md",
"adjunto",
"pdf",
"csv",
".mp4",
".mp3",
".wav",
".png",
".jpg",
"vídeo",
"audio",
"imagen",
"mp4",
"mp3",
"wav",
"mov",
"png",
"jpg",
]
# Generic first-person intent: the verb is captured, not enumerated, so a
# verb missing from intent_phrases (e.g. "let me execute") is still caught.
generic_intent_re = "(?i)\\b(?:voy\\s+a|d[eé]jame|perm[ií]teme|vamos\\s+a)\\s+([a-záéíóúñ]{2,})"
# Verbs that follow that construction without promising any work.
intent_verb_exclusions = [
"saber",
"explicar",
"aclarar",
"resumir",
"decir",
"pensar",
"mostrar",
"enseñar",
"compartir",
"describir",
"mencionar",
"confirmar",
]
# Context that turns a BARE tool name into a claim of tool usage (#1262).
# Multi-word names (`load_brain_file`) are unmistakable on their own, but
# `plan`, `bash`, `grep` and `ls` are ordinary words, so naming one proves
# nothing by itself. It proves something when the name is the OBJECT of an
# action the model attributes to itself: "Setting up the plan" in a turn that
# called no tool is a tool use that never happened. A marker must sit
# immediately before the name, optionally across one determiner, so an
# instruction addressed to the user ("run it in bash") stays untouched.
tool_use_markers = [
"usando",
"usar",
"uso",
"usé",
"utilizando",
"utilizar",
"ejecutando",
"ejecutar",
"ejecuté",
"corriendo",
"correr",
"llamando",
"llamar",
"llamé",
"invocando",
"invocar",
"invoqué",
"creando",
"crear",
"creé",
"configurando",
"configurar",
"configuré",
"preparando",
"preparar",
"actualizando",
"actualizar",
"actualicé",
"leyendo",
"leer",
"leí",
"escribiendo",
"escribir",
"verificando",
"verificar",
"verifiqué",
"abriendo",
"abrir",
"abrí",
"iniciando",
"iniciar",
"vía",
"via",
]
# Nouns that mark the preceding word as a tool by name ("the plan tool").
tool_nouns = [
"herramienta",
"herramientas",
]
# Determiners allowed between a marker and the tool name, so "setting up THE
# plan" reads the same as "setting up plan". At most one, and only these:
# anything else between the two words means the name is not the marker's
# object. Empty for languages without articles.
tool_name_determiners = [
"el",
"la",
"los",
"las",
"un",
"una",
"mi",
"nuestro",
"nuestra",
"este",
"esta",
"del",
]
# ── Gerundio sin marcador con pronombre propio (#1694) ────────────────────
# "Leyéndolos con calma, encuentro tres diferencias." El clítico español va
# FUSIONADO con desplazamiento de acento, por eso la alternancia necesita
# `éndo`/`ándo` además de `ando`/`iendo`: "Leyéndolos" lleva é, y una
# alternancia plana `endo` no lo casaría; "Corriéndolos"/"Siguiéndolos"
# tampoco. Grupo 1 = resto de la oración ([^.!?\n]*).
participle_object_re = "(?i)^[\\s\\-*•>]*[a-záéíóúüñ]{2,}(?:ando|iendo|éndo|ándo)[-\\s]?(?:los|las|lo|la|nos)\\b(?:\\s+[a-záéíóúüñ]+mente)?([^.!?\\n]*)"
# Clase cerrada que puede seguir al pronombre en un ANUNCIO. Lo que empieza
# de otro modo es sujeto gerundivo + verbo finito: "Leyéndolos reveló el
# fallo.", "Leyéndolos no es difícil."
announcement_tail_words = [
"con", "contra", "antes", "después", "sin", "en", "para", "por", "como",
"y", "o", "pero", "entonces", "ahora", "aquí", "allí", "uno", "una",
"dos", "tres", "ambos", "cada", "vez", "paso", "mejor", "peor", "seguido",
"despacio", "rápido", "primero", "segundo", "tercero", "último", "próximo",
"puede", "debe", "va", "suele",
]