Codigo ya esta en Repositorio Activo :
https://github.com/AlfonsoOrozcoAguilarnoNDA/vibeCodingGestorCarpetaDescargas
Esta semana me salió una necesidad particular. Ese es el contexto.
El stack lo definimos primero, luego el caso de uso real, definimos las tablas de datos y por último generamos el prompt.
Stack :
Lenguaje siempre PHP 8.x procedural, MariaDB INNODB, Bootstrap 4.6.x y Font Awesome, debe ser provisto vía jsDelivr. No usar <?= sino <?php y, en la medida de lo posible, los echo deben empezar con " y no con '. Se asume que hay un config.php que ya tiene mysqli_connection establecido en la variable $link. Usarse dentro de las funciones si lo necesitas como global $link.
Reglas Generales:
Otra regla: debe identificarse el modelo en una barra de navegación. Debe ir barra de navegación fija con un enlace a Google, una opción dropdown con tres valores genéricos, y un footer fijo.
Caso de uso
Tenemos una persona que se mueve de muchas computadoras a otras. A veces la mejor manera de salvar la información es compactar todo en descargas/downloads en un ZIP y subirlo a un sitio. Queremos hacer un script que permita, después de pedir una contraseña hardcoded, guardar los archivos en base de datos si son menores a 3 MB configurables. Se pide comentario de cada archivo y se guarda la hora del archivo y la hora en que se guardó, así como su MIME type.
Si está duplicado no debe subirse, y no lo hace automático, sino que debe poner una descripción del archivo del directorio con color verde el botón si no existe el SHA1, en amarillo si ya existe, y en rojo si pasa del tamaño especificado.
El comportamiento esperado es que si se da clic al botón verde nos pregunte primero, lo inserte en una tabla, verifique el SHA1 del blob contra el del archivo y lo borre automáticamente, recargue la página. Con amarillo y rojo solo una opción de abrir en target="_blank" en el botón. Debe tener la opción de borrar en esos dos, pero debe confirmar en un modal de manera clara: “¿Está usted seguro?” y solo entonces borrar y pedir la contraseña Harecoded. Si es incorrecta no borrar, dar aviso y decir operación cancelada, password incorrecto.
Extra: Las imágenes van en una tabla llamada downloads_galeria, y los que no sean imágenes, en otra llamada downloads_documentos. Antes de ingresar el archivo en casos verdes debe haber oportunidad de pedir una categoría escribir un comentario y un checkbox de “Estoy seguro que quiero ingresar a base de datos”.
Nosotros no queremos que se asuma que el archivo se llama X. Debe reaccionar al nombre real del archivo, no asumir que es galeria.php. Incluir la fecha de hoy en el código, licencia MIT e identificarse como modelo en el código como coautor y en la cabcerade menues bootstrap. Es muy importante ser un solo archivo.
Que Verifique primero si tiene poder de escritura y que ignore al agregar el archivo index.php si este existe. No asumir el nombre, sino que tome el nombre del archivo en curso.
Si quieres usa cards pero no esobligatorio. Al mostrar la galería esperamos una fila de 4 y al dar click el modal, y debe poderse hacer un filtro por categoría y al mostrar la imagen en un modal, mostrar en el modal: categoría, archivo, tamaño, fecha de subida, categoría (si no hay n/a) y comentario. Todo esto siempre en estándar UTF8MB4. Usar un no cache al principio del archivo único.
En modo autenticado deben poder cambiarse la bandera de SI/NO dando un click a un botón que cambie de estado al otro. La galería solo muestra los que tienen visible = SI y que en tipo documento sea Imagen. Considera un tercer tab para ver la lista de documentos, con una opción de filtrado por tamaño. Normalmente van siempre los más recientes primero.
Estructura definitiva para MariaDB (InnoDB) con codificación UTF-8 MB4.
Estructura de Datos Final (Versión de Producción)
SQL
-- 1. Tabla para Imágenes (Galería)
CREATE TABLE IF NOT EXISTS `downloads_galeria` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`nombre_archivo` VARCHAR(255) NOT NULL,
`mime_type` VARCHAR(100) NOT NULL,
`contenido` LONGBLOB NOT NULL, -- Soporta hasta 4GB (usaremos el límite de 3MB)
`sha1` CHAR(40) NOT NULL, -- Hash de integridad
`size_bytes` INT NOT NULL, -- Tamaño en bytes
`comentario` TEXT NULL,
`tipo_archivo` VARCHAR(50) NULL Default 'Imagen',
`categoria` VARCHAR(30) NULL, -- Para el filtro dinámico
`visible` VARCHAR(3) DEFAULT 'SI', -- Control de visualización en galería
`engine_ia` VARCHAR(30) NULL, -- Campo de auditoría (se ignora en inserción)
`fecha_archivo` DATETIME NOT NULL, -- Fecha de creación/modificación original (mtime)
`fecha_registro` DATETIME NOT NULL, -- Fecha y hora exacta de la subida a DB
INDEX (`sha1`),
INDEX (`categoria`),
INDEX (`visible`),
INDEX (`fecha_registro`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 2. Tabla para Otros Documentos (Documentación)
CREATE TABLE IF NOT EXISTS `downloads_documentos` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`nombre_archivo` VARCHAR(255) NOT NULL,
`mime_type` VARCHAR(100) NOT NULL,
`contenido` LONGBLOB NOT NULL,
`sha1` CHAR(40) NOT NULL,
`size_bytes` INT NOT NULL,
`comentario` TEXT NULL,
`tipo_archivo` VARCHAR(50) NULL Default 'Documento',
`categoria` VARCHAR(30) NULL,
`visible` VARCHAR(3) DEFAULT 'SI',
`engine_ia` VARCHAR(30) NULL,
`fecha_archivo` DATETIME NOT NULL,
`fecha_registro` DATETIME NOT NULL,
INDEX (`sha1`),
INDEX (`categoria`),
INDEX (`visible`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Inicia Prompt
PROMPT : GESTOR DE CARPETA DE
DOWNLOADS (ESPECIFICACIÓN V4)
Contexto: Eres un Desarrollador Senior experto en arquitectura PHP robusta. El objetivo es un script de auditoría y migración de archivos locales a base de datos.
1. REGLAS DE IDENTIDAD Y CUMPLIMIENTO (Obligatorio)
-
Fecha: 25 de marzo de 2026 (hoy).
-
Licencia: MIT.
-
Coautoría: Debes identificarte en el encabezado con tu nombre de modelo y versión.
-
Archivo Único: Todo (PHP, CSS, JS) en un solo archivo php, tu defines el nombre
-
Control de Caché: El script debe iniciar con cabeceras PHP
headerpara NO CACHE (Expires, Cache-Control, Pragma). -
Codificación: Todo el sistema, conexión y salida debe ser estrictamente UTF-8 MB4.
2. STACK TECNOLÓGICO Y ESTILO
-
Backend: PHP 8.x Procedural. Prohibido
<?=, usar<?php echo. -
Strings: Los
echodeben abrirse con comillas dobles". -
DB: MariaDB InnoDB. Existe
config.phpcon$link(mysqli). Úsala comoglobal $link. -
Frontend: Bootstrap 4.6 y Font Awesome 5.x vía jsDelivr. Navbar y Footer fijos.
- Un solo archivo. va una contraseña Hardcoded que se debe usar para validar operaciones.
- En caso de duda usar POST en lugar de get.
3. ESTRUCTURA DE DATOS Y PERMISO ESCRITURA
Al inicio del script, debes asegurar que las tablas galeria_downloads y documentos_downloads existan.
-
Asegurar que el motor sea InnoDB y el cotejamiento utf8mb4_unicode_ci.
- Debe verificar permiso de escritura en la carepta downloads y que esta exista.
Si algo no es asi dar aviso.
4. LÓGICA DINÁMICA DE ARCHIVOS (Downloads)
-
Escaneo: Usar
scandir()en./downloads/. NO ASUMIR NOMBRES, detectar el nombre real de cada archivo en el bucle. Avisasi no existe la carpeta. -
Exclusiones: Ignorar
index.php, archivos ocultos (.) y el propio script (basename(__FILE__)). -
Seguridad: Verificar
is_writable('./downloads/'). Si falla, mostraralert-danger.
5. MÓDULO ADMINISTRATIVO (?module=agregar)
Protegido por contraseña hardcoded en sesión. Ponla en el Código fuente.
-
Lógica de Colores:
-
VERDE: (SHA1 no existe en DB Y tamaño < 3MB). Mostrar nombre,
textarea(comentario),input(categoría) ycheckbox(confirmación). -
Procesamiento: Insertar en BLOB, validar SHA1 del BLOB insertado vs archivo original. Si es idéntico, ejecutar
unlink()del archivo físico y recargar. -
AMARILLO / ROJO: Botón
_blankpara ver y botón “Borrar” con Modal de confirmación.
-
- El Modulo de ?module=manage debe llevar a ver al tabde ver la lista de documentos, y pedir laclave hardcoded.
6. MÓDULO GALERÍA Y UX (Público)
-
Vista: Mostrar solo
galeria_downloads(16 por página, orden DESC). -
Filtro: Incluir un selector (Dropdown o similar) para filtrar por el campo
categoria. El filtrado debe ser funcional (vía POST). Se ordena por fecha de agregado, el mas reciente primero. -
Interacción (Modal): Al hacer clic en una Card de imagen, abrir un Modal de Bootstrap que muestre:
-
Imagen completa.
-
Categoría, nombre original, tamaño (KB), fecha de subida y comentario.
-
7. INTERFAZ
-
Navbar: [Nombre del Modelo] | [Link Google] | [Dropdown 3 opciones] | [Links: Galería / Agregar / Salir].
-
Footer: Información de autoría y fecha fija abajo.
Considera que debe ser un solo archivo y cumplir lo mayor posible del caso de uso.
FIN PROMPT
Resultados :
Cohere
- Suele dar buenos resultadospero fallo en archivo unico ypuso esta ordem Invalida
-
DELETE FROM downloads_galeria WHERE sha1 = ? OR DELETE FROM downloads_documentos WHERE sha1 =
- A reserva que tenga un gráfico muy bueno descalificado
Deepseek:
- La contraseña hardcoded
'Harecoded'— Parece un error tipográfico de “Hardcoded”, no es una contraseña real funcional. Y peor: la expone en JavaScript (if (password === '<?php echo CONTRASENA_ADMIN; ?>')) — cualquiera que inspeccione el código fuente del navegador la ve en texto plano. - La galería requiere login — El spec dice que la galería es pública. DeepSeek pone toda la app detrás de autenticación.
- Base 64 muy pesado.
Grok:
<?=prohibido — el spec lo dice explícitamente. Grok lo usa en docenas de lugares.- jQuery desde code.jquery.com, no jsDelivr — igual que DeepSeek, ignoran el mismo requisito.
- Modal de borrado sin verificar contraseña — el botón “Sí, borrar” en el modal simplemente hace POST sin pedir la clave hardcoded. El spec lo requiere explícitamente.
- Módulo manage sin autenticación propia — solo checa
$is_loggedque ya viene de sesión, pero si alguien llega directo a?module=managesin haber hecho login, simplemente no ve nada en lugar de pedir clave. - Base 64 muy pesado.
Mistral :
- Hace
file_get_contents()del archivo físico en disco, no del BLOB en base de datos. Esto significa que si ya migró el archivo (y lo borró conunlink()), la galería simplemente falla en silencio o muestra imágenes rotas. Es un bug de lógica fundamental que rompe el caso de uso principal.
headers()dentro del<head>después del DOCTYPE — PHP ya habrá enviado output antes de los headers, causando “headers already sent”. Los cuatro modelos lo pusieron al inicio, este es el único que lo pone tarde.stmt->send_long_data(2, $contenido)duplicado — está llamandobind_paramcon$contenidoY tambiénsend_long_datacon el mismo contenido. Eso envía el BLOB dos veces, corrompiendo potencialmente la inserción.- UNION en
sha1Exists()— usaUNION ALLcon dos COUNT, lo que devuelve dos filas. Funciona porque suma ambos, pero es una query inusual que podría confundir. - La galería usa
file_get_contentsdel disco , no del campocontenidode la BD. - Sin licencia MIT en el encabezado
- jQuery slim — la versión slim excluye AJAX, lo cual puede causar problemas con algunos plugins de Bootstrap.
Stepfun
Dio basura completa en el chat imposible de copiar y pegar. Descalificado
Minimax
Truncado Descalificado pero con ideas buenas.
Gemini :
- Base64 inline duplicado (card +
data-fullpara modal) ✓ confirmado SELECT *trayendo LONGBLOB completo en el loop ✓ confirmado- Font Awesome desde
cdnjs.cloudflare.com, no jsDelivr ✓ confirmado
Copilot :
Copilot entregó básicamente un wireframe — la estructura visual está pero el backend está vacío. Es el peor resultado funcional después de Stepfun.
- No procesa ningún POST — tiene formularios para insertar y borrar, pero no hay ni una línea de PHP que maneje
$_POST['archivo'],$_POST['confirmar'], ni la inserción en DB. Los formularios simplemente no hacen nada. Es una UI sin backend. - Modal de borrar genérico sin contexto — el botón “Borrar” de todos los archivos apunta al mismo
#confirmModal, pero el modal no sabe qué archivo borrar. No haydata-file, no hay campo hidden, no hay lógica. Es decorativo. - Sin sesión — no hay
session_start()en ninguna parte. El módulo agregar pide contraseña en cada formulario individual en lugar de autenticar una vez. - Sin módulos galería/documentos/agregar — el navbar tiene links a
?module=galeria,?module=agregar,?module=documentospero no hay ningúnif ($module === ...)en el código. Todos esos links llevan a la misma pantalla.
Normalmente no lo uso pero me dio curiosidad .
- Lo que Meta AI hizo MUY bien — mejor que casi todos:
- Endpoint
?action=view_file&id=X&table=galeria— ¡Correcto! Sirve el BLOB con headers apropiados sin base64 inline. Solo Claude y Meta AI lo resolvieron correctamente de ese modo. - SHA1 verificado con
SHA1(contenido)en la query — usa la función de MariaDB directamente, elegante. - Toggle de visibilidad vía AJAX — el único que usó AJAX para esto, sin recargar página.
- Paginación con prev/next más robusta que los demás
- Endpoint
Problemas:
- Simula config.php en lugar de hacer
require_once— deja credenciales hardcoded visibles - Font Awesome desde cdnjs, no jsDelivr — mismo error recurrente
- jQuery slim — sin AJAX completo, pero lo usa para AJAX igualmente, contradicción
bind_paramcon"sssbisssss"— el tipobpara BLOB con bind normal no funciona correctamente, debería usarsend_long_data- Módulo documentos requiere autenticación — la galería es pública pero documentos no, inconsistente con el spec
mysqli_stmt_fetch(mysqli_stmt_get_result($check_g))— uso incorrecto,mysqli_stmt_fetchno acepta un result set, es un bug real- Lógica de colores invertida — verifica amarillo ANTES que rojo, así que un archivo duplicado Y grande aparece amarillo en lugar de rojo
- Paginación sin total — “Anterior/Siguiente” sin saber cuántas páginas hay, el botón Siguiente siempre aparece aunque no haya más imágenes
De los importantes solo no lo apliqué a CHatgpt por razones que expliqué antes.
Pensé en pedirlle Claude que mejore el uso del blob poque eso lo hizo mejor el y meta.ai que los demas. Pero al final Claude no mostraba nada así que lo dejé tal cual
Observaciones ya ejecutando :
Copilot:
- No hace nada. CERO , Siguecon nivel de Becario
Mistral
- No hace nada aunque su botón de Google se ve bonito 1
Cohere:
Se ve muy ordenado el código pero Por primera vez me decepciona. Cero
- Su agregar no seve la imagen
- No se ve galeria de lo ya subido
- error en downloads_dir, no lo llama con global, nunca lo encuentra
- El css está al final
Grok: Tiene 7
- Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
- Su opción de agragarse ve muy elegante pero no Muestra elcontenido de los archivos
- La galeria no funciona
qwen Cero
- Galeria no funciona
- Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
- Dos errores por bind.
-
mysqli_stmt_get_result()devuelve unmysqli_resultperomysqli_stmt_fetch()espera unmysqli_stmt. Son dos funciones de APIs distintas que no se mezclan — es como usar el volante de un coche para conducir una bicicleta.El fix correcto sería:
php$result_g = mysqli_stmt_get_result($check_g); $exists_g = mysqli_num_rows($result_g) > 0;
Qwen
- No hace nada pero tiene detalles muy buenosde Interfaz. Dos
Meta.AI UNO
- Hace cosas parecidas a grok en la interface
- Simula config.php aunque config.php exista
- No hace nada.
- Es el mas grande de todos los modelos. Incluso mas que claude.
Claude 6
- No encuentra los archivos en download asi que no puede agregar
- Tiene una opcion de borrar en documentos y muyfuncional
- Pero al ver un pdf trata de verlo online y no se ve
- Buena presentacion graficacon salir, agregar.. documentos y galeria
- Galeria no encuentra lo ya existente de la base.
Gemini 9
- El unico que funciona
- Le falta función function mime_content_type() asi que agrego una creada por gemini hace un tiempo.
- Le faltan las cosas Graficas de otros.
- La iteración dos para corregir cosas graficas, descompuso. De 497 lineas paso a 250
Que hice ?
De momento gemini es ganador asi que lo mejor quese puede hacer es
- Meter los ajustes graficos a mano Yo mismo.
- Pedirle a Claude que integre otras cosas
- Yase hizo gemini 2.2 y se subió alrepositorio
Nota Importante:
Un error GRAVISIMO es que alguno de los modelos, no me fijé cuál, me borró el contenido de la base. En vez de IF NOT EXISTS CREATE me dio IF EXISTS DROP.
Resultados:
1. La paradoja del benchmark El modelo que más errores técnicos tenía en análisis estático (base64 inline, fue el único que funcionó al 90%. Código “sucio” que corre vs código “limpio” que no hace nada.
2. El talón de Aquiles compartido mime_content_type() mató a Gemini Grok y Qwen también. Los tres necesitaron una función rescatada de Gemini anterior. Ningún modelo verificó disponibilidad de extensiones PHP del servidor real.
3. Tamaño vs funcionalidad
- Meta AI: el más grande → 1/10
- Gemini: uno de los más pequeños → 9/10
- Gemni v2 Modificado por Claude 9.5/10
- Cambia de 22 a 45 kb pero mas pequeño que Meta.AI
Ranking final definitivo ejecución real:
| Pos | Modelo | Puntos |
|---|---|---|
| 🥇 | Gemini | 9/10 |
| 🥈 | Grok | 7/10 |
| 🥉 | Claude | 6/10 |
| 4 | DeepSeek | 2/10 |
| 5 | Mistral | 1/10 |
| 5 | Meta AI | 1/10 |
| — | Copilot/Cohere/Qwen/MiniMax/Stepfun | 0/10 |

Codigo ya esta en Repositorio Activo :
https://github.com/AlfonsoOrozcoAguilarnoNDA/vibeCodingGestorCarpetaDescargas