feat(ci): revisor de PRs con varios modelos por OpenRouter #2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/revisor"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Plantilla reusable
_revision.yamlmás el programacmd/reviewer: varios modelos de OpenRouter revisan el diff de un PR contra los criterios de aceptación del propio repositorio, y un verificador descarta todo hallazgo sin cita textual del plan.Comenta, nunca frena.
Incluye
go.yaml, que corre gofmt,go vetygo test -racesobre el código de este repositorio. Hasta ahora nada lo probaba: todas las demás plantillas empiezan con_y solo arrancan porworkflow_call.Para usar la plantilla hace falta, a nivel de organización:
OPENROUTER_API_KEYREVISOR_MODELS(ids de OpenRouter separados por coma)Sin
REVISOR_MODELSel programa no arranca: no hay modelos por defecto a propósito.Seguridad: el revisor se compila siempre desde este repositorio y del PR se leen únicamente datos, en dos checkouts separados. Nada controlado por el PR se interpola en un
run:.Los nombres que se ven en la pestaña de Actions eran lo primero que lee alguien que llega a un run rojo, y varios no decían qué había pasado: "¿Hay dependencias que cachear?" era una pregunta, "gofmt" y "QEMU" eran la herramienta sin la acción, y "Analizar", "Verificar", "Migrar" y "Resumen" se repetían en jobs distintos sin decir sobre qué. Ahora todos siguen la misma forma: verbo en infinitivo más el objeto concreto, con la herramienta nombrada cuando es el punto del paso ("Analizar las dependencias con govulncheck"). Los jobs de _go-analytics pasan a decir qué buscan y entre paréntesis con qué ("Secretos en el historial (gitleaks)"), que es lo que hace falta cuando el run falla y hay cuatro jobs en la lista. Solo cambian nombres visibles, los comentarios de cabecera y una línea del README. Los identificadores de los jobs quedan iguales, así que ni los "needs:" ni las referencias de los repos que llaman a estas plantillas se mueven. El juego genérico multi-lenguaje (_test, _analytics, _build-docker, _deploy-k8s) queda como está: sus nombres ya eran formales y están en inglés, y traducirlos es otra decisión. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oVizRo2WB4FeZVRnHr9YeEl commit anterior los dejó en español y descriptivos, y descriptivo se volvió largo: "Esperar a que PostgreSQL acepte conexiones" ocupa más de lo que la pestaña de Actions muestra sin cortar, y la pestaña es el único lugar donde se leen. Quedan en inglés, de una a cuatro palabras, con la misma forma en los cinco archivos: "Wait for Postgres", "Coverage gate", "Run govulncheck", "Rollback", "Summary". El juego genérico multi-lenguaje entra en el mismo criterio, que ya estaba en inglés pero con tres variantes de lo mismo ("Checkout Code", "Checkout code", "Checkout") y con "Setup Go" donde la acción oficial se llama "Set up Go". El borrador del revisor pasa a review-draft.md, que es el nombre con el que se descarga. Los identificadores de los jobs siguen sin moverse, así que los "needs:" y las referencias de los repos que llaman a estas plantillas quedan igual. Los comentarios y el README siguen en español: son prosa, no nombres. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oVizRo2WB4FeZVRnHr9YeEl código estaba en español y el repositorio de plantillas lo van a leer repos que no son Balanzio. Pasa a inglés: identificadores, comentarios, nombres de flags, mensajes de error y el nombre del paquete, que queda cmd/reviewer. Lo que NO pasa a inglés, y es la mitad del trabajo: Los comentarios que el bot publica. El prompt del modelo, los encabezados del material y cada título y etiqueta del borrador quedan en español carácter por carácter: "## Con cita verificada", "**Cita del plan:**", "## Modelos que no respondieron". El equipo lee la revisión, no el código. Los tags JSON. El prompt le pide al modelo {"hallazgos":[{"archivo":…,"linea":…,"criterio":…,"cita":…,"que":…}]}, así que los campos de Go son File, Line, Criterion, Quote y What pero los tags siguen diciendo archivo, linea, criterio, cita y que. Traducir el tag deja los cinco campos en cero con el JSON bien formado, y ninguna de las 15 pruebas lo detecta: todas construyen los structs en Go y no pasan por el Unmarshal. Se verificó aparte, metiendo el JSON de ejemplo que está dentro de `rules` por ExtractFindings. Los literales que parsean el plan. "· Requisitos:", los prefijos RF- y RNF-, la regla de D más dígitos, los encabezados con — y ·, la fila | D69 |, el prefijo de código de bloque y los marcadores :: y ##[ del saneado. Eso lee Markdown en español: es formato de datos, no idioma. Se comparó contra la versión anterior y son idénticos. La línea "Tarjeta: <nombre>" de la descripción del PR y el comando /revisar también se quedan: son la interfaz que el equipo escribe. El orden de safe() sobrevive intacto, que era lo otro frágil: los caracteres de control se reemplazan por espacio ANTES de partir los pares, nunca al revés. Los flags cambian, así que esta plantilla y el repo que la llama se actualizan en el mismo paso. REVISOR_MODELOS pasa a REVISOR_MODELS: la variable todavía no existe en Forgejo, así que el cambio no rompe nada hoy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012oVizRo2WB4FeZVRnHr9Ye