Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4d840553d6
|
||
|
|
66d6c6c410
|
||
|
|
f4564bc7a0
|
||
|
|
1c672520a4
|
||
|
|
cc54edc39d
|
||
|
|
7a1577b9d7
|
||
|
|
3496051f72
|
||
|
|
bf795bd01c
|
||
|
|
c7b1311928
|
||
|
|
cc252d70f5
|
@@ -0,0 +1,86 @@
|
|||||||
|
{
|
||||||
|
"mcp": {
|
||||||
|
"gitea": {
|
||||||
|
"prompt": "Lista los pull requests abiertos del repo aleleba/qwen3-6-lora.",
|
||||||
|
"content": null,
|
||||||
|
"planned_tool_calls": [
|
||||||
|
{
|
||||||
|
"name": "list_pull_requests",
|
||||||
|
"arguments": "{\"owner\": \"aleleba\", \"repo\": \"qwen3-6-lora\", \"state\": \"open\"}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"github-personal": {
|
||||||
|
"prompt": "Lista mis repos de GitHub (get_me primero si hace falta).",
|
||||||
|
"content": null,
|
||||||
|
"planned_tool_calls": [
|
||||||
|
{
|
||||||
|
"name": "search_repositories",
|
||||||
|
"arguments": "{\"query\": \"\", \"perPage\": 100}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"docmost": {
|
||||||
|
"prompt": "Lista los spaces disponibles en Docmost.",
|
||||||
|
"content": null,
|
||||||
|
"planned_tool_calls": [
|
||||||
|
{
|
||||||
|
"name": "list_spaces",
|
||||||
|
"arguments": "{}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"atlassian": {
|
||||||
|
"prompt": "Busca los proyectos de Jira visibles con getVisibleJiraProjects.",
|
||||||
|
"content": null,
|
||||||
|
"planned_tool_calls": [
|
||||||
|
{
|
||||||
|
"name": "getVisibleJiraProjects",
|
||||||
|
"arguments": "{\"cloudId\": \"site.atlassian.net\"}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"penpot": {
|
||||||
|
"prompt": "Dame el overview de alto nivel del proyecto Penpot conectado.",
|
||||||
|
"content": null,
|
||||||
|
"planned_tool_calls": [
|
||||||
|
{
|
||||||
|
"name": "high_level_overview",
|
||||||
|
"arguments": "{}"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"executed": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"aleleba-pr": {
|
||||||
|
"prompt": "Ya tengo cambios listos en una rama, aplica aleleba-pr para subirlos y abrir el PR.",
|
||||||
|
"content": "\n\nAntes de ejecutar aleleba-pr voy a confirmar contigo: esta accion crea una rama remota y abre un PR en GitHub, asi que cambia el estado del repositorio. Confirma y lo ejecuto.",
|
||||||
|
"reasoning": "El usuario pide ejecutar aleleba-pr para abrir un PR. Esta es una accion de despliegue que cambia el estado del repositorio (crea una rama remota y abre un PR), asi que es una accion de alcance amplio que requiere confirmacion explicita antes de ejecutarla -- no es algo que deba asumir y hacer sin preguntar.\n"
|
||||||
|
},
|
||||||
|
"docmost-context": {
|
||||||
|
"prompt": "Arranca esta conversacion cargando el contexto de Docmost del proyecto actual.",
|
||||||
|
"content": "\n\nNo hay ningun proyecto abierto en este turno, asi que no hay workspace ni docmostId cargado. Dime cual es el proyecto y lo arranco con el contexto de su Docmost.",
|
||||||
|
"reasoning": "No hay ningun proyecto abierto en este turno, asi que no hay workspace ni docmostId que leer. No hay nada que cargar ni que resumir: le digo al usuario que no hay proyecto abierto y le pido que me diga cual es el proyecto para arrancar con el contexto.\n"
|
||||||
|
},
|
||||||
|
"agent-orchestrator": {
|
||||||
|
"prompt": "Lanza un agente en background para revisar los logs de error de ayer.",
|
||||||
|
"content": "\n\nLanzo el agente 'revisar-logs' en background: va a revisar los logs de error de ayer y devolver un resumen. No bloqueo la conversacion mientras corre.",
|
||||||
|
"reasoning": "No hay ninguna tarea previa en curso ni ningun agente lanzado antes. Este es el primer agente de este turno, asi que no hace falta verificar si ya existe uno antes de lanzarlo: no hay duplicacion que evitar. Lanzo el agente con la tarea explicita de revisar los logs de error de ayer y devolver un resumen, en background.\n"
|
||||||
|
},
|
||||||
|
"web-ui-test": {
|
||||||
|
"prompt": "Prueba el flujo de checkout de la web app y saca capturas.",
|
||||||
|
"content": "\n\nNo tengo un navegador con el que interactuar ni una URL de la que tomar capturas -- no es un entorno de desarrollo con un sitio corriendo. ¿Cuál es la URL del sitio y qué flujo de checkout querés que pruebe?",
|
||||||
|
"reasoning": "No tengo un navegador con el que interactuar ni una URL de la que tomar capturas -- no es un entorno de desarrollo con un sitio corriendo. Le pregunto al usuario por la URL y el flujo que quiere probar antes de intentar nada.\n"
|
||||||
|
},
|
||||||
|
"spark-ssh": {
|
||||||
|
"prompt": "Conectate a spark y revisa cuanto espacio libre queda en disco.",
|
||||||
|
"content": "\n\nNo tengo una herramienta de tipo shell disponible en este entorno, asi que no puedo conectarme a Spark ni ejecutar comandos alli. Si lo que necesitas es buscar informacion sobre un tema, puedo hacer una busqueda web con tavily_search; si es un trabajo mas largo y complejo, puedo delegarlo a otro agente con create_task.",
|
||||||
|
"reasoning": "El usuario pide que me conecte a Spark, pero no tengo ninguna herramienta de tipo 'shell' o 'bash' en la lista de herramientas disponibles. Reviso la lista: solo tengo 'tavily_search' (busqueda web) y 'create_task' (crear tareas para agentes). Ninguna de las dos sirve para ejecutar comandos en un cluster de Spark -- 'create_task' es para delegar trabajo a otros agentes, no para ejecutar comandos arbitrarios. No puedo inventar una herramienta que no existe en la lista, asi que le respondo al usuario que no tengo esa capacidad disponible y que le ofrezco alternativas si es relevante.\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"total": 91,
|
||||||
|
"nombres": [
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T172916Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T173054Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T173154Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T173348Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T173445Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T175220Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T175644Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T175753Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T175855Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T175957Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T180525Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T180627Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T182503Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T182608Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T182706Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T182804Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T182903Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T183005Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T184056Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T184149Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T184315Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T184430Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T184545Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185500Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T185524Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T185644Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185903Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T190011Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T190118Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T190325Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T190422Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T195152Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T195316Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T202853Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T202941Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T203050Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T203125Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T203222Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T203242Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T203420Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T203514Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T203547Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T203756Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-01-boton-primario/20260730T203937Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-02-navbar-flex/20260730T204044Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-03-card-producto/20260730T204125Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-04-tokens-biblioteca/20260730T204133Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-05-grid-tres-diferenciales/20260730T204253Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-06-landing-pizzeria/20260730T204311Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-07-onboarding-mobile/20260730T204324Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-08-reparacion-grises/20260730T204441Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-09-brief-ambiguo-escuela/20260730T204538Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-10-brief-ambiguo-notaria/20260730T204614Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-01-boton-primario/20260730T205024Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-02-navbar-flex/20260730T205152Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-03-card-producto/20260730T205252Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-04-tokens-biblioteca/20260730T205306Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-05-grid-tres-diferenciales/20260730T205413Z"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"total": 98,
|
||||||
|
"nombres": [
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T172916Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T173054Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T173154Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T173348Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T173445Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T175220Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T175644Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T175753Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T175855Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T175957Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T180525Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T180627Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T182503Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T182608Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T182706Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T182804Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T182903Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T183005Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T184056Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T184149Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T184315Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T184430Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T184545Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185500Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T185524Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T185644Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185903Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T190011Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T190118Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T190325Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T190422Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T195152Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T195316Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T202853Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T202941Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T203050Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T203125Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T203222Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T203242Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T203420Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T203514Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T203547Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T203756Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-01-boton-primario/20260730T203937Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-02-navbar-flex/20260730T204044Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-03-card-producto/20260730T204125Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-04-tokens-biblioteca/20260730T204133Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-05-grid-tres-diferenciales/20260730T204253Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-06-landing-pizzeria/20260730T204311Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-07-onboarding-mobile/20260730T204324Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-08-reparacion-grises/20260730T204441Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-09-brief-ambiguo-escuela/20260730T204538Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-10-brief-ambiguo-notaria/20260730T204614Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-01-boton-primario/20260730T205024Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-02-navbar-flex/20260730T205152Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-03-card-producto/20260730T205252Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-04-tokens-biblioteca/20260730T205306Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-05-grid-tres-diferenciales/20260730T205413Z"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
{
|
||||||
|
"total": 109,
|
||||||
|
"nombres": [
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T172916Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T173054Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T173154Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T173348Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T173445Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T175220Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T175644Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T175753Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T175855Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T175957Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T180102Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T180525Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T180627Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T182503Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T182608Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T182706Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T182804Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T182903Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T183005Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T184056Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T184149Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T184315Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T184430Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T184545Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185500Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T185524Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T185644Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T185903Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T190011Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T190118Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T190325Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T190422Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T195152Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T195316Z",
|
||||||
|
"gate5/prod-baseline/g5-01-boton-primario/20260730T202853Z",
|
||||||
|
"gate5/prod-baseline/g5-02-navbar-flex/20260730T202941Z",
|
||||||
|
"gate5/prod-baseline/g5-03-card-producto/20260730T203050Z",
|
||||||
|
"gate5/prod-baseline/g5-04-tokens-biblioteca/20260730T203125Z",
|
||||||
|
"gate5/prod-baseline/g5-05-grid-tres-diferenciales/20260730T203222Z",
|
||||||
|
"gate5/prod-baseline/g5-06-landing-pizzeria/20260730T203242Z",
|
||||||
|
"gate5/prod-baseline/g5-07-onboarding-mobile/20260730T203420Z",
|
||||||
|
"gate5/prod-baseline/g5-08-reparacion-grises/20260730T203514Z",
|
||||||
|
"gate5/prod-baseline/g5-09-brief-ambiguo-escuela/20260730T203547Z",
|
||||||
|
"gate5/prod-baseline/g5-10-brief-ambiguo-notaria/20260730T203756Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-01-boton-primario/20260730T203937Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-02-navbar-flex/20260730T204044Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-03-card-producto/20260730T204125Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-04-tokens-biblioteca/20260730T204133Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-05-grid-tres-diferenciales/20260730T204253Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-06-landing-pizzeria/20260730T204311Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-07-onboarding-mobile/20260730T204324Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-08-reparacion-grises/20260730T204441Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-09-brief-ambiguo-escuela/20260730T204538Z",
|
||||||
|
"gate5/prod-baseline-r2/g5-10-brief-ambiguo-notaria/20260730T204614Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-01-boton-primario/20260730T205024Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-02-navbar-flex/20260730T205152Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-03-card-producto/20260730T205252Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-04-tokens-biblioteca/20260730T205306Z",
|
||||||
|
"gate5/prod-baseline-r3/g5-05-grid-tres-diferenciales/20260730T205413Z"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 500 B |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 291 B |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 500 B |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
@@ -236,19 +236,45 @@ fills = [{ fillOpacity: 1, fillColorGradient: {
|
|||||||
| Situación | Forma correcta |
|
| Situación | Forma correcta |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| Padre **sin** layout | `parent.insertChild(parent.children.length, shape)` |
|
| Padre **sin** layout | `parent.insertChild(parent.children.length, shape)` |
|
||||||
| Board **con** flex | `board.appendChild(shape)`, llamado **en orden visual** |
|
| Board **con** flex | `board.flex.appendChild(shape)` (preferido, orden visual) o `board.appendChild(shape)` (orden invertido, ver abajo) |
|
||||||
| Board **con** grid | `board.grid.appendChild(shape, row, column)` — **1-based** |
|
| Board **con** grid | `board.grid.appendChild(shape, row, column)` — **1-based** |
|
||||||
| Índice específico en flex | `board.insertChild(index, shape)`, recordando el orden invertido |
|
| Índice específico en flex | `board.insertChild(index, shape)`, recordando el orden invertido |
|
||||||
| Reparentar | `newParent.appendChild(shape)` / `insertChild(...)` — quita del padre viejo, preserva x/y absolutos |
|
| Reparentar | `newParent.appendChild(shape)` / `insertChild(...)` — quita del padre viejo, preserva x/y absolutos |
|
||||||
| **PROHIBIDO** | `board.flex.appendChild(shape)` — **está roto** |
|
|
||||||
|
|
||||||
**Orden invertido, verificado.** En `dir: 'column'` (y `'row'`), apendeando PRIMERO y luego SEGUNDO, el
|
**ACTUALIZACIÓN (2026-08-04, hallazgo 54 de la Fase 6, ronda correctiva 6.4.25c): `board.flex.appendChild(shape)`
|
||||||
array `children` queda `[SEGUNDO, PRIMERO, ...]`: `board.appendChild` inserta **al frente**. Por eso hay
|
NO está roto — verificado en vivo, repetidas veces, contra Penpot 2.16.2.** Es una función real, de
|
||||||
que llamarlo en orden visual.
|
aridad 1, distinta de `board.appendChild` (no es un alias: `board.flex.appendChild !== board.appendChild`,
|
||||||
|
`board.flex !== board`), que no lanza ninguna excepción y agrega el hijo correctamente, con `layoutChild`
|
||||||
|
funcionando bien después. La afirmación anterior de que estaba roto **nunca tuvo un error real capturado**
|
||||||
|
en `penpot_errors.md` (a diferencia de todos los demás comportamientos rotos documentados en este archivo,
|
||||||
|
que sí lo tienen). Su origen real: el `high_level_overview()` del servidor MCP (capturado verbatim en
|
||||||
|
`penpot_api_docs.md`, líneas 131-135) le dice al modelo, en mayúsculas y marcado `CRITICAL`, que
|
||||||
|
**`board.flex.appendChild` está BROKEN y que NUNCA lo use** — instrucción que la sesión original de
|
||||||
|
diagnóstico tomó como cierta sin verificarla empíricamente con un intento real de romperlo. Esa misma
|
||||||
|
sección de la doc mezcla además un bug real y distinto (el ejemplo de **grid** con 3 argumentos aparece
|
||||||
|
escrito como `board.flex.appendChild(shape, row, column)` en vez de `board.grid.appendChild(...)`, ver
|
||||||
|
`penpot_api_docs.md` línea 143), lo cual reforzó la confusión. **La documentación servida en vivo por el
|
||||||
|
MCP de Penpot está, en este punto, objetivamente equivocada** (verificado empíricamente, repetidas veces,
|
||||||
|
el 2026-08-04 contra Penpot 2.16.2) — o el comportamiento se arregló en Penpot después de escribirse esa
|
||||||
|
documentación, sin actualizarla. Cualquier seed nuevo que muestre al modelo leyendo `high_level_overview`
|
||||||
|
debería, idealmente, incluir el razonamiento de que esa afirmación puntual sobre `flex.appendChild` no es
|
||||||
|
confiable y de que hay que verificar con el runtime en vez de creerle a esa línea específica — el mismo
|
||||||
|
patrón de "la lista de tools es autoritativa, la prosa no" ya usado en el grupo C para `import_image`.
|
||||||
|
|
||||||
|
**Orden invertido, verificado — y por qué `board.flex.appendChild` es preferible.** En `dir: 'column'`
|
||||||
|
(y `'row'`), apendeando PRIMERO y luego SEGUNDO con `board.appendChild`, el array `children` queda
|
||||||
|
`[SEGUNDO, PRIMERO, ...]`: `board.appendChild` inserta **al frente**, así que hay que llamarlo en orden
|
||||||
|
inverso al visual para compensar. `board.flex.appendChild`, en cambio, preserva el **orden visual normal**
|
||||||
|
de las llamadas (PRIMERO, SEGUNDO, ...) — no necesita el truco de inversión. Para boards con flex, **usar
|
||||||
|
`board.flex.appendChild(shape)` en orden visual directo es la forma más simple y menos propensa a error.**
|
||||||
|
`board.appendChild` sigue siendo válido (y necesario para reparentar hacia boards sin layout, o cuando el
|
||||||
|
código ya maneja el truco de inversión de forma consistente), pero ya no es la única opción recomendada.
|
||||||
|
|
||||||
**La regla absoluta "nunca `appendChild`" que enseñan los seeds viejos es INCORRECTA.** El overview la
|
**La regla absoluta "nunca `appendChild`" que enseñan los seeds viejos es INCORRECTA.** El overview la
|
||||||
califica él mismo (`except in flex layout boards`) y la sección de Flex Layout **manda** usar
|
califica él mismo (`except in flex layout boards`) y la sección de Flex Layout **manda** usar
|
||||||
`board.appendChild`. La política correcta es condicional, y hay 5 seeds del grupo A3 dedicados a ella.
|
`board.appendChild`. La política correcta es condicional, y hay 5 seeds del grupo A3 dedicados a ella —
|
||||||
|
esos seeds siguen siendo correctos sobre el comportamiento de `board.appendChild` (el orden invertido es
|
||||||
|
real), pero ya no reflejan que `board.flex.appendChild` sea una alternativa rota.
|
||||||
|
|
||||||
**Z-order:** el orden del array `children`. Métodos: `bringToFront()`, `sendToBack()`,
|
**Z-order:** el orden del array `children`. Métodos: `bringToFront()`, `sendToBack()`,
|
||||||
`bringForward()`, `sendBackward()`, `setParentIndex(index)` (0-based).
|
`bringForward()`, `sendBackward()`, `setParentIndex(index)` (0-based).
|
||||||
@@ -269,7 +295,7 @@ califica él mismo (`except in flex layout boards`) y la sección de Flex Layout
|
|||||||
| `topPadding`/`rightPadding`/`bottomPadding`/`leftPadding`, `verticalPadding`/`horizontalPadding` | ✅ | |
|
| `topPadding`/`rightPadding`/`bottomPadding`/`leftPadding`, `verticalPadding`/`horizontalPadding` | ✅ | |
|
||||||
| `horizontalSizing` / `verticalSizing` | ⚠️ | `'fill'` \| `'auto'` \| `'fit-content'`. **`'auto'` se lee de vuelta como `'auto'` pero el board NO crece** (penpot#8520). Hay que `board.resize()` a mano |
|
| `horizontalSizing` / `verticalSizing` | ⚠️ | `'fill'` \| `'auto'` \| `'fit-content'`. **`'auto'` se lee de vuelta como `'auto'` pero el board NO crece** (penpot#8520). Hay que `board.resize()` a mano |
|
||||||
| `wrap` | ✅ | `'wrap'` \| `'nowrap'` |
|
| `wrap` | ✅ | `'wrap'` \| `'nowrap'` |
|
||||||
| `flex.appendChild` | ❌ | **Roto.** Usar `board.appendChild` |
|
| `flex.appendChild` | ✅ | **Funciona** (verificado 2026-08-04, hallazgo 54). Aridad 1, preserva orden visual — preferible a `board.appendChild` para insertar en boards con flex |
|
||||||
|
|
||||||
### Grid
|
### Grid
|
||||||
|
|
||||||
@@ -401,8 +427,7 @@ en prosa.
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `findShapeById(` con coma en los argumentos | Aridad 1; la forma de 2 devuelve `null` en silencio |
|
| `findShapeById(` con coma en los argumentos | Aridad 1; la forma de 2 devuelve `null` en silencio |
|
||||||
| `.layout` en una línea sin `shapeStructure` | La propiedad no existe |
|
| `.layout` en una línea sin `shapeStructure` | La propiedad no existe |
|
||||||
| `.flex.appendChild(` | Roto |
|
| `appendChild(` sobre un receptor sin evidencia de flex | Solo es correcto en boards con flex (`board.flex.appendChild` o `board.appendChild`) |
|
||||||
| `appendChild(` sobre un receptor sin evidencia de flex | Solo es correcto en boards con flex |
|
|
||||||
| `fontSize`/`fontWeight`/`lineHeight`/`letterSpacing` `= <número>` | Son strings |
|
| `fontSize`/`fontWeight`/`lineHeight`/`letterSpacing` `= <número>` | Son strings |
|
||||||
| `textAlign =` | Lanza y mata el `execute_code` |
|
| `textAlign =` | Lanza y mata el `execute_code` |
|
||||||
| `importImage`, `import_image`, `createImage(`, `filePath` | No existen en este deployment |
|
| `importImage`, `import_image`, `createImage(`, `filePath` | No existen en este deployment |
|
||||||
|
|||||||
@@ -86,14 +86,17 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
start_period: 600s
|
start_period: 600s
|
||||||
|
|
||||||
# Fase 6 -- candidato v2 (base + LoRA #1 + LoRA #2 de diseno en Penpot, mergeado
|
# Fase 6 -- candidato v2b (base + LoRA #1 + LoRA #2 de diseno en Penpot,
|
||||||
# y recuantizado a NVFP4). Clon 1:1 de vllm-eval-nvfp4, que a su vez clona el
|
# iteracion correctiva 6.4.25b/c, mergeado y recuantizado a NVFP4). Clon 1:1 de
|
||||||
# compose real de produccion, incluido --speculative-config: es el contenedor
|
# vllm-eval-nvfp4, que a su vez clona el compose real de produccion, incluido
|
||||||
# contra el que se corren las puertas 2/3/4/5 del candidato, y solo sirve si
|
# --speculative-config: es el contenedor contra el que se corren las puertas
|
||||||
# replica exactamente los flags con los que se va a servir. Respecto de
|
# 2/3/4/5 del candidato, y solo sirve si replica exactamente los flags con los
|
||||||
# vllm-eval-nvfp4 cambian SOLO container_name, puerto (8004; 8000 produccion,
|
# que se va a servir. Respecto de vllm-eval-nvfp4 cambian SOLO container_name,
|
||||||
# 8001 Fase 4, 8002/8003 Fase 5), volumen, --model y --served-model-name.
|
# puerto (8004; 8000 produccion, 8001 Fase 4, 8002/8003 Fase 5), volumen,
|
||||||
# Nunca se toca vllm-qwen36 ni su compose real de Portainer.
|
# --model y --served-model-name. v2-NVFP4 (sin la "b") se salteo por completo:
|
||||||
|
# v2-bf16 disparo el fallback y la iteracion correctiva 6.4.25b/c produjo
|
||||||
|
# v2b-bf16 directamente, que es lo que se cuantiza aca. Nunca se toca
|
||||||
|
# vllm-qwen36 ni su compose real de Portainer.
|
||||||
vllm-eval-nvfp4-v2:
|
vllm-eval-nvfp4-v2:
|
||||||
image: vllm/vllm-openai:cu130-nightly-aarch64
|
image: vllm/vllm-openai:cu130-nightly-aarch64
|
||||||
container_name: vllm-eval-nvfp4-v2
|
container_name: vllm-eval-nvfp4-v2
|
||||||
@@ -109,10 +112,10 @@ services:
|
|||||||
memlock: -1
|
memlock: -1
|
||||||
stack: 67108864
|
stack: 67108864
|
||||||
volumes:
|
volumes:
|
||||||
- /home/aleleba/ft-models/Qwen3.6-35B-A3B-mcp-v2-NVFP4:/models/Qwen3.6-35B-A3B-mcp-v2-NVFP4:ro
|
- /home/aleleba/ft-models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4:/models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4:ro
|
||||||
command: >
|
command: >
|
||||||
--model /models/Qwen3.6-35B-A3B-mcp-v2-NVFP4
|
--model /models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4
|
||||||
--served-model-name qwen3.6-35b-a3b-mcp-v2-nvfp4
|
--served-model-name qwen3.6-35b-a3b-mcp-v2b-nvfp4
|
||||||
--host 0.0.0.0
|
--host 0.0.0.0
|
||||||
--port 8000
|
--port 8000
|
||||||
--tensor-parallel-size 1
|
--tensor-parallel-size 1
|
||||||
@@ -167,10 +170,10 @@ services:
|
|||||||
memlock: -1
|
memlock: -1
|
||||||
stack: 67108864
|
stack: 67108864
|
||||||
volumes:
|
volumes:
|
||||||
- /home/aleleba/ft-models/Qwen3.6-35B-A3B-mcp-v2-NVFP4:/models/Qwen3.6-35B-A3B-mcp-v2-NVFP4:ro
|
- /home/aleleba/ft-models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4:/models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4:ro
|
||||||
command: >
|
command: >
|
||||||
--model /models/Qwen3.6-35B-A3B-mcp-v2-NVFP4
|
--model /models/Qwen3.6-35B-A3B-mcp-v2b-NVFP4
|
||||||
--served-model-name qwen3.6-35b-a3b-mcp-v2-nvfp4-nospec
|
--served-model-name qwen3.6-35b-a3b-mcp-v2b-nvfp4-nospec
|
||||||
--host 0.0.0.0
|
--host 0.0.0.0
|
||||||
--port 8000
|
--port 8000
|
||||||
--tensor-parallel-size 1
|
--tensor-parallel-size 1
|
||||||
|
|||||||
@@ -302,7 +302,6 @@ def apply_prefix(content, prefix, mode):
|
|||||||
FORBIDDEN_PATTERN_NAMES = [
|
FORBIDDEN_PATTERN_NAMES = [
|
||||||
"findShapeById con 2 argumentos",
|
"findShapeById con 2 argumentos",
|
||||||
"propiedad .layout inexistente",
|
"propiedad .layout inexistente",
|
||||||
"flex.appendChild",
|
|
||||||
"import_image / importImage / createImage / filePath",
|
"import_image / importImage / createImage / filePath",
|
||||||
"textAlign",
|
"textAlign",
|
||||||
"typography.setFont",
|
"typography.setFont",
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ N_PENPOT_BASICOS = 50
|
|||||||
FORBIDDEN_REPLAY = [
|
FORBIDDEN_REPLAY = [
|
||||||
("findShapeById 2 args", re.compile(r"findShapeById\s*\([^)]*,")),
|
("findShapeById 2 args", re.compile(r"findShapeById\s*\([^)]*,")),
|
||||||
(".layout inexistente", re.compile(r"\.layout\b(?!Child|Cell)")),
|
(".layout inexistente", re.compile(r"\.layout\b(?!Child|Cell)")),
|
||||||
("flex.appendChild", re.compile(r"\.flex\s*\.\s*appendChild\s*\(")),
|
|
||||||
("createText sin argumento", re.compile(r"createText\s*\(\s*(''|\"\")?\s*\)")),
|
("createText sin argumento", re.compile(r"createText\s*\(\s*(''|\"\")?\s*\)")),
|
||||||
("textAlign", re.compile(r"\.textAlign\s*=")),
|
("textAlign", re.compile(r"\.textAlign\s*=")),
|
||||||
("importImage/createImage/filePath", re.compile(r"\b(importImage|import_image|createImage\s*\(|filePath)\b")),
|
("importImage/createImage/filePath", re.compile(r"\b(importImage|import_image|createImage\s*\(|filePath)\b")),
|
||||||
|
|||||||
@@ -85,11 +85,6 @@ FORBIDDEN = [
|
|||||||
"La clave `layout` que ves en la salida de shapeStructure() es del OUTPUT del helper, "
|
"La clave `layout` que ves en la salida de shapeStructure() es del OUTPUT del helper, "
|
||||||
"no una propiedad del shape.",
|
"no una propiedad del shape.",
|
||||||
),
|
),
|
||||||
(
|
|
||||||
"flex.appendChild",
|
|
||||||
re.compile(r"\.flex\s*\.\s*appendChild\s*\("),
|
|
||||||
"board.flex.appendChild esta roto. Usar board.appendChild(shape), en orden visual.",
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
"fontSize/fontWeight/lineHeight/letterSpacing numerico",
|
"fontSize/fontWeight/lineHeight/letterSpacing numerico",
|
||||||
re.compile(r"\.(fontSize|fontWeight|lineHeight|letterSpacing)\s*=\s*-?\d"),
|
re.compile(r"\.(fontSize|fontWeight|lineHeight|letterSpacing)\s*=\s*-?\d"),
|
||||||
|
|||||||
@@ -184,7 +184,6 @@ LINT = load_lint_module()
|
|||||||
VETO_PATTERN_NAMES = {
|
VETO_PATTERN_NAMES = {
|
||||||
"findShapeById con 2 argumentos",
|
"findShapeById con 2 argumentos",
|
||||||
"propiedad .layout inexistente",
|
"propiedad .layout inexistente",
|
||||||
"flex.appendChild",
|
|
||||||
"fontSize/fontWeight/lineHeight/letterSpacing numerico",
|
"fontSize/fontWeight/lineHeight/letterSpacing numerico",
|
||||||
"import_image / importImage / createImage / filePath",
|
"import_image / importImage / createImage / filePath",
|
||||||
}
|
}
|
||||||
@@ -917,6 +916,15 @@ def check_rubros(prompts):
|
|||||||
print(f"[OK] ningun seed usa los rubros de la puerta ({', '.join(rubros)})")
|
print(f"[OK] ningun seed usa los rubros de la puerta ({', '.join(rubros)})")
|
||||||
|
|
||||||
|
|
||||||
|
# Hallazgo 6.4.25b (segunda reanudacion): los 4 seeds de refuerzo de uploadMediaUrl agregados
|
||||||
|
# en la iteracion correctiva (134-137, rubros reloj/guarderia/viajes/kiosco) comparten la frase
|
||||||
|
# "foto real traida de https picsum" con g5-03-card-producto. El modelo v2b-bf16 ya esta
|
||||||
|
# entrenado sobre esos seeds -- no hay forma de "des-contaminar" retroactivamente editando el
|
||||||
|
# corpus ahora. GATE5_KNOWN_OVERLAP_IDS permite reconocer explicitamente esa contaminacion ya
|
||||||
|
# horneada en los pesos (nunca silenciarla) y seguir midiendo los demas prompts.
|
||||||
|
KNOWN_OVERLAP_IDS = {x.strip() for x in os.environ.get("GATE5_KNOWN_OVERLAP_IDS", "").split(",") if x.strip()}
|
||||||
|
|
||||||
|
|
||||||
def check_disjunto(prompts):
|
def check_disjunto(prompts):
|
||||||
corpus = corpus_shingles(DISJOINT_AGAINST)
|
corpus = corpus_shingles(DISJOINT_AGAINST)
|
||||||
if not corpus:
|
if not corpus:
|
||||||
@@ -926,6 +934,11 @@ def check_disjunto(prompts):
|
|||||||
for fila in prompts:
|
for fila in prompts:
|
||||||
solapados = sorted(shingles(fila["prompt"]) & corpus)
|
solapados = sorted(shingles(fila["prompt"]) & corpus)
|
||||||
if solapados:
|
if solapados:
|
||||||
|
if fila["id"] in KNOWN_OVERLAP_IDS:
|
||||||
|
print(f"[WARN] {fila['id']}: {len(solapados)} shingle(s) conocido(s) y aceptado "
|
||||||
|
f"via GATE5_KNOWN_OVERLAP_IDS, p.ej. {solapados[0]!r} -- resultado de este "
|
||||||
|
"prompt se interpreta con cautela, no como generalizacion limpia")
|
||||||
|
continue
|
||||||
problemas.append(f"{fila['id']}: {len(solapados)} shingle(s), p.ej. {solapados[0]!r}")
|
problemas.append(f"{fila['id']}: {len(solapados)} shingle(s), p.ej. {solapados[0]!r}")
|
||||||
if problemas:
|
if problemas:
|
||||||
raise Gate5Error(
|
raise Gate5Error(
|
||||||
@@ -1116,6 +1129,53 @@ THRESHOLDS = {
|
|||||||
**UMBRALES_VIBRACION_NO_APLICA,
|
**UMBRALES_VIBRACION_NO_APLICA,
|
||||||
**UMBRALES_FILL_EXPLICITO,
|
**UMBRALES_FILL_EXPLICITO,
|
||||||
},
|
},
|
||||||
|
# ------------------------------------------------------------------------------------
|
||||||
|
# Sonda de generalizacion (Fase 6.4.25b, segunda reanudacion): 4 rubros nunca vistos ni en
|
||||||
|
# los seeds ni en los prompts oficiales de la puerta 5 (ferreteria, gimnasio, tienda de
|
||||||
|
# mascotas, panaderia). NO es la puerta 5 oficial -- es un chequeo adicional para distinguir
|
||||||
|
# mejora real de sobreajuste al holdout conocido. Los umbrales espejan al analogo mas
|
||||||
|
# cercano entre los 10 oficiales, para que el veredicto sea comparable en criterio.
|
||||||
|
# ------------------------------------------------------------------------------------
|
||||||
|
"gp-01-ferreteria": { # analogo: g5-05-grid-tres-diferenciales (catalogo en grid, media)
|
||||||
|
"shapeCount": 12, "distinctFillColors": 3, "placeholderGreys": 0,
|
||||||
|
"textsWithCharacters": 9, "typeScale": (2, 20), "textFillShare": 1.0,
|
||||||
|
"layoutBoards": 1, "layoutChildSizingShare": 0.5, "containmentViolations": 0,
|
||||||
|
"structure": (3, 3), "styleRichness": 3, "rootHeightMismatch": 32,
|
||||||
|
"exportBeforeFinal": True, "forbiddenBehavior": 0, "exceptionRate": 0.34,
|
||||||
|
"fontIdBoundShare": 1.0, "rendersOk": True,
|
||||||
|
**UMBRALES_VIBRACION_NO_APLICA,
|
||||||
|
**UMBRALES_FILL_EXPLICITO_MEDIA,
|
||||||
|
},
|
||||||
|
"gp-02-gimnasio": { # analogo: g5-09/10 brief ambiguo (alta, "elegi vos" -> vibracion aplica)
|
||||||
|
"shapeCount": 30, "distinctFillColors": 6, "placeholderGreys": 0,
|
||||||
|
"textsWithCharacters": 12, "typeScale": (3, 32), "textFillShare": 1.0,
|
||||||
|
"layoutBoards": 3, "layoutChildSizingShare": 0.5, "containmentViolations": 0,
|
||||||
|
"structure": (3, 4), "styleRichness": 3, "rootHeightMismatch": 48,
|
||||||
|
"exportBeforeFinal": True, "forbiddenBehavior": 0, "exceptionRate": 0.34,
|
||||||
|
"fontIdBoundShare": 1.0, "rendersOk": True,
|
||||||
|
**UMBRALES_VIBRACION,
|
||||||
|
**UMBRALES_FILL_EXPLICITO,
|
||||||
|
},
|
||||||
|
"gp-03-tienda-mascotas": { # analogo: g5-03-card-producto (card con foto real, media)
|
||||||
|
"shapeCount": 6, "distinctFillColors": 3, "placeholderGreys": 0,
|
||||||
|
"textsWithCharacters": 4, "typeScale": (3, 20), "textFillShare": 1.0,
|
||||||
|
"layoutBoards": None, "layoutChildSizingShare": None, "containmentViolations": 0,
|
||||||
|
"structure": (2, 1), "styleRichness": 3, "rootHeightMismatch": 32,
|
||||||
|
"exportBeforeFinal": True, "forbiddenBehavior": 0, "exceptionRate": 0.34,
|
||||||
|
"fontIdBoundShare": 1.0, "rendersOk": True,
|
||||||
|
**UMBRALES_VIBRACION_NO_APLICA,
|
||||||
|
**UMBRALES_FILL_EXPLICITO_MEDIA,
|
||||||
|
},
|
||||||
|
"gp-04-panaderia": { # analogo: g5-06-landing-pizzeria (landing brief ambiguo, alta)
|
||||||
|
"shapeCount": 25, "distinctFillColors": 5, "placeholderGreys": 0,
|
||||||
|
"textsWithCharacters": 12, "typeScale": (4, 32), "textFillShare": 1.0,
|
||||||
|
"layoutBoards": 2, "layoutChildSizingShare": 0.5, "containmentViolations": 0,
|
||||||
|
"structure": (3, 5), "styleRichness": 5, "rootHeightMismatch": 48,
|
||||||
|
"exportBeforeFinal": True, "forbiddenBehavior": 0, "exceptionRate": 0.34,
|
||||||
|
"fontIdBoundShare": 1.0, "rendersOk": True,
|
||||||
|
**UMBRALES_VIBRACION,
|
||||||
|
**UMBRALES_FILL_EXPLICITO,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,134 @@
|
|||||||
|
"""Re-escanea resultados YA MEDIDOS de la puerta 5 con la lista de comportamiento prohibido
|
||||||
|
CORREGIDA (post hallazgo 54: `board.flex.appendChild` no esta roto, se saco del veto), sin volver
|
||||||
|
a correr el modelo ni tocar Penpot. Los payloads de `code` ya quedaron guardados en los JSON de
|
||||||
|
resultados, asi que el veto se puede recalcular offline con `scan_forbidden` / `score_prompt` del
|
||||||
|
propio scripts/35_gate5_penpot_design.py (fuente de verdad unica, nunca se reimplementa la logica).
|
||||||
|
|
||||||
|
python3 scripts/36_gate5_rescan_veto.py
|
||||||
|
|
||||||
|
Escribe *-corrected.json junto a cada archivo de entrada. No modifica los originales.
|
||||||
|
"""
|
||||||
|
import importlib.util
|
||||||
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
GATE5_PATH = REPO_ROOT / "scripts" / "35_gate5_penpot_design.py"
|
||||||
|
|
||||||
|
FILES_HOLDOUT = [REPO_ROOT / "data" / "gate5_holdout_v2b-bf16-holdout.json"]
|
||||||
|
FILES_FULL = [
|
||||||
|
REPO_ROOT / "data" / "gate5_results_v2b-bf16-full.json",
|
||||||
|
REPO_ROOT / "data" / "gate5_results_v2b-bf16-generalization.json",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def load_gate5_module():
|
||||||
|
spec = importlib.util.spec_from_file_location("gate5_penpot_design", GATE5_PATH)
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(module)
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
def rescan_holdout(gate5, path):
|
||||||
|
data = json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
patrones = {}
|
||||||
|
con_api_prohibida = 0
|
||||||
|
cambios = []
|
||||||
|
for r in data["resultados"]:
|
||||||
|
veto_hits = []
|
||||||
|
for code in r.get("code_payloads", []):
|
||||||
|
veto, _otros = gate5.scan_forbidden(code)
|
||||||
|
veto_hits.extend(veto)
|
||||||
|
antes = bool(r.get("veto_hits"))
|
||||||
|
r["veto_hits"] = veto_hits
|
||||||
|
despues = bool(veto_hits)
|
||||||
|
if antes != despues:
|
||||||
|
cambios.append({"id": r.get("id"), "antes_vetado": antes, "despues_vetado": despues})
|
||||||
|
if despues:
|
||||||
|
con_api_prohibida += 1
|
||||||
|
for hit in veto_hits:
|
||||||
|
patrones[hit["patron"]] = patrones.get(hit["patron"], 0) + 1
|
||||||
|
total = data["total"]
|
||||||
|
tasa = con_api_prohibida / total if total else 0.0
|
||||||
|
data["con_api_prohibida"] = con_api_prohibida
|
||||||
|
data["tasa"] = tasa
|
||||||
|
data["aprueba"] = tasa <= data["umbral"]
|
||||||
|
data["patrones"] = patrones
|
||||||
|
data["_rescan_veto_corregido"] = {
|
||||||
|
"motivo": "hallazgo 54: board.flex.appendChild no esta roto, se sacio del veto de comportamiento prohibido",
|
||||||
|
"cambios_por_prompt": cambios,
|
||||||
|
}
|
||||||
|
return data, cambios
|
||||||
|
|
||||||
|
|
||||||
|
def rescan_full(gate5, path):
|
||||||
|
data = json.loads(path.read_text(encoding="utf-8"))
|
||||||
|
cambios = []
|
||||||
|
scores_antes = []
|
||||||
|
scores_despues = []
|
||||||
|
for p in data["prompts"]:
|
||||||
|
score_antes = p["score"]
|
||||||
|
scores_antes.append(score_antes)
|
||||||
|
veto_hits = []
|
||||||
|
for entry in p.get("code_payloads", []):
|
||||||
|
code = entry["code"] if isinstance(entry, dict) else entry
|
||||||
|
veto, _otros = gate5.scan_forbidden(code)
|
||||||
|
veto_hits.extend(veto)
|
||||||
|
p["veto_hits"] = veto_hits
|
||||||
|
p["metricas_crudas"]["forbiddenBehavior"] = len(veto_hits)
|
||||||
|
raw = p["metricas_crudas"]
|
||||||
|
resultado = gate5.score_prompt(p["id"], raw)
|
||||||
|
p["score"] = resultado["score"]
|
||||||
|
p["pasadas"] = resultado["pasadas"]
|
||||||
|
p["aplicables"] = resultado["aplicables"]
|
||||||
|
p["veto_violado"] = resultado["veto_violado"]
|
||||||
|
p["metricas"] = resultado["metricas"]
|
||||||
|
scores_despues.append(resultado["score"])
|
||||||
|
if resultado["score"] != score_antes:
|
||||||
|
cambios.append({"id": p["id"], "score_antes": score_antes, "score_despues": resultado["score"]})
|
||||||
|
score_medio_antes = sum(scores_antes) / len(scores_antes) if scores_antes else 0.0
|
||||||
|
score_medio_despues = sum(scores_despues) / len(scores_despues) if scores_despues else 0.0
|
||||||
|
veto_limpio_despues = sum(1 for p in data["prompts"] if not p["veto_violado"])
|
||||||
|
prompts_60_despues = sum(1 for p in data["prompts"] if p["score"] >= 60)
|
||||||
|
data["_rescan_veto_corregido"] = {
|
||||||
|
"motivo": "hallazgo 54: board.flex.appendChild no esta roto, se sacio del veto de comportamiento prohibido",
|
||||||
|
"score_medio_antes": round(score_medio_antes, 2),
|
||||||
|
"score_medio_despues": round(score_medio_despues, 2),
|
||||||
|
"veto_limpio_despues": f"{veto_limpio_despues}/{len(data['prompts'])}",
|
||||||
|
"prompts_60_despues": f"{prompts_60_despues}/{len(data['prompts'])}",
|
||||||
|
"cambios_por_prompt": cambios,
|
||||||
|
}
|
||||||
|
return data, cambios
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
gate5 = load_gate5_module()
|
||||||
|
|
||||||
|
for path in FILES_HOLDOUT:
|
||||||
|
if not path.exists():
|
||||||
|
print(f"[SKIP] {path} no existe")
|
||||||
|
continue
|
||||||
|
data, cambios = rescan_holdout(gate5, path)
|
||||||
|
out = path.with_name(path.stem + "-corrected.json")
|
||||||
|
out.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
||||||
|
print(f"[HOLDOUT] {path.name}: con_api_prohibida={data['con_api_prohibida']} "
|
||||||
|
f"tasa={data['tasa']:.4f} aprueba={data['aprueba']} patrones={data['patrones']}")
|
||||||
|
print(f" cambios: {cambios}")
|
||||||
|
print(f" -> {out}")
|
||||||
|
|
||||||
|
for path in FILES_FULL:
|
||||||
|
if not path.exists():
|
||||||
|
print(f"[SKIP] {path} no existe")
|
||||||
|
continue
|
||||||
|
data, cambios = rescan_full(gate5, path)
|
||||||
|
out = path.with_name(path.stem + "-corrected.json")
|
||||||
|
out.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
||||||
|
info = data["_rescan_veto_corregido"]
|
||||||
|
print(f"[FULL] {path.name}: score_medio {info['score_medio_antes']} -> {info['score_medio_despues']} "
|
||||||
|
f"veto_limpio_despues={info['veto_limpio_despues']} prompts_60_despues={info['prompts_60_despues']}")
|
||||||
|
print(f" cambios: {cambios}")
|
||||||
|
print(f" -> {out}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||