⚠️ Esta reunión está desactualizada. Las evidencias finales y el cierre con Héctor están en la Reunión 13. Ver Reunión 13 →
Pymetory — Reunion #9 Mayo 15, 2026 · Prof. Hector Fabio Ocampo

Reunion #9

Git Flow · CI/CD · Inventario · Seguridad · 6/6 completado

Resumen de la Sesion

El profesor Hector reviso el despliegue en DesktopTitan y detecto que el deploy se hacia manualmente, copiando archivos por SSH sin automatizacion. Dio instrucciones claras: estudiar Git Flow, implementar CI/CD con GitHub Actions, hacer inventario de lo construido, NO agregar mas features, auditar credenciales del repo publico, y dejar la app estable. Las 6 tareas quedaron completadas en 11 dias (Mayo 15 al 26).

Tarea 1 Git Flow — Estrategia de Ramas

Que pidio el profesor

"Estudien Git Flow: ramas main, develop, feature, release, hotfix. No quiero commits directos a la rama principal. Organicen el desarrollo con un estandar claro y documentenlo con diagramas para el documento final."

Como se abordo

Se investigo la metodologia Git Flow (Vincent Driessen, 2010) y se adapto al proyecto Pymetory. La estrategia: cada funcionalidad nueva nace de develop en su propia rama feature/*, se trabaja aislada, se mergea de vuelta a develop, y cuando develop esta estable se mergea a main (produccion).

Se documento todo en docs/GIT_FLOW.md con un diagrama Mermaid gitGraph que muestra la historia real del repositorio.

Que se desarrollo

ArchivoContenido
docs/GIT_FLOW.mdDiagrama Mermaid gitGraph, reglas (4), flujo de trabajo ASCII, evidencia git log real

Reglas establecidas:

  1. main nunca recibe commits directos. Solo merges desde develop.
  2. Cada feature se desarrolla en su propia rama. Nace de develop y vuelve a develop.
  3. El CI/CD solo dispara deploy en main. develop solo ejecuta lint.
  4. Commits con formato semantico: tipo: descripcion (feat:, fix:, docs:, refactor:, security:).

Diagrama Mermaid del Repositorio Real

gitGraph
   commit id: "inicio"
   commit id: "setup Laravel"
   branch develop
   checkout develop
   commit id: "dashboard"
   commit id: "FEFO + QR"
   branch feature/kanban-v2
   checkout feature/kanban-v2
   commit id: "drag-and-drop"
   commit id: "column CRUD"
   commit id: "keyboard shortcuts"
   checkout develop
   merge feature/kanban-v2 tag: "kanban v2"
   branch feature/indice-nicho
   checkout feature/indice-nicho
   commit id: "/indice"
   commit id: "/nicho"
   checkout develop
   merge feature/indice-nicho
   branch feature/security-sanitize
   checkout feature/security-sanitize
   commit id: "password backend"
   commit id: "email removal"
   checkout develop
   merge feature/security-sanitize
   checkout main
   merge develop tag: "v1.0"

Evidencia en el Repositorio

$ git log --oneline --graph main develop
*   aca3a68 refactor: unificar LLM inference en un solo bloque
*   54723fd fix: Welcome landing, tesis HTML, cazador PHP endpoints
*   7e8e471 merge: develop → main (kanban v2 + sanitizacion)
|\
| * dcd7280 security: mover passwords de Nicho e Indice al backend
| * 3ad9fd5 feat: kanban v2 — @dnd-kit, column CRUD, search, shortcuts
| * f7bc7a0 fix: auditar y corregir enlaces rotos

Resultado

Completado El repositorio opera con Git Flow desde Mayo 15. Las ramas main y develop tienen historial limpio con merges trazables. Cada feature se desarrollo en su propia rama. Documentado con diagrama Mermaid listo para el documento final de tesis.

Tarea 2 CI/CD — GitHub Actions Pipeline

Que pidio el profesor

"El deploy no puede depender de que un agente IA ejecute comandos manualmente cada vez. CI/CD debe ser automatico: integracion continua y despliegue continuo con GitHub Actions. Cada push a main debe desplegarse solo."

Como se abordo

Se configuro un flujo de trabajo (workflow) en GitHub Actions con dos etapas: lint (verificacion de sintaxis PHP) y deploy (despliegue a DesktopTitan por SSH).

El reto principal fue que DesktopTitan solo acepta SSH por puerto 443 (el puerto 22 esta bloqueado por el ISP). La solucion fue usar la accion appleboy/[email protected] que permite especificar un puerto personalizado. Los datos sensibles (IP, usuario, llave SSH) se guardaron en GitHub Secrets, no en el codigo.

Que se desarrollo

ArchivoLineasProposito
.github/workflows/deploy.yml43Pipeline CI/CD: lint PHP → SSH deploy a Titan
docs/CI_CD.md172Documentacion del pipeline con diagrama Mermaid

Archivo deploy.yml Completo

name: CI/CD Pipeline — Pymetory

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  # ── 1. Lint & Syntax Check ──
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
      - name: PHP Syntax Check
        run: |
          find app routes config database -name "*.php" -print0 \
            | xargs -0 -n1 php -l 2>&1 \
            | grep -v "No syntax" \
            | grep -qc "error" && exit 1 || exit 0

  # ── 2. Deploy to DesktopTitan (Oracle Cloud) ──
  deploy:
    needs: lint
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy via SSH
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.DESKTOPTITAN_HOST }}
          port: ${{ secrets.DESKTOPTITAN_PORT }}
          username: ${{ secrets.DESKTOPTITAN_USER }}
          key: ${{ secrets.DESKTOPTITAN_KEY }}
          script: |
            cd /var/www/portafolio/SolucionesWeb/pymetoryTesis
            sudo git pull origin main
            sudo composer install --no-dev --optimize-autoloader --no-interaction
            sudo php artisan migrate --force
            sudo chown -R www-data:www-data .
            echo "✅ Deploy completado"

GitHub Secrets Configurados

SecretValor (oculto)Proposito
DESKTOPTITAN_HOST129.158.216.27IP del servidor Titan
DESKTOPTITAN_PORT443Puerto SSH (bypass ISP)
DESKTOPTITAN_USERubuntuUsuario del servidor
DESKTOPTITAN_KEY(llave privada)Clave SSH para autenticacion

Diagrama del Pipeline

Push a develop/main
      │
      ▼
┌─────────────┐
│  Lint Check  │  → PHP syntax en app/ routes/ config/ database/
└──────┬──────┘
       │ ✅
       ▼
┌─────────────┐
│ SSH Deploy   │  → git pull en Titan (129.158.216.27:443)
└──────┬──────┘
       │
       ▼
┌─────────────┐
│  Migrate DB  │  → php artisan migrate --force
└──────┬──────┘
       │
       ▼
   ✅ Success

Decisiones tecnicas importantes:

Resultado

Completado Pipeline funcional. Cada push a main ejecuta: lint PHP → SSH a Titan → git pull → composer → migrate. El deploy toma ~30 segundos. Ya no se depende de comandos manuales de IA.

Tarea 3 Inventario de Funcionalidades

Que pidio el profesor

"Hagan un inventario manual de que esta y que falta. Necesito saber exactamente cual es el alcance real del software antes de seguir. No podemos seguir agregando cosas sin saber donde estamos parados."

Como se abordo

Se hizo un barrido completo de la aplicacion Pymetory: 17 modulos logicos con 55+ funcionalidades especificas. Cada funcionalidad se clasifico como completada, en pruebas o pendiente. El resultado se documento en docs/INVENTARIO_FUNCIONALIDADES.md.

Que se desarrollo

#ModuloFuncionalidadesEstado
1AuthLogin, registro, recuperacion de contrasena, rolesCompletado
2DashboardMetricas generales, alertas stock minimo, graficosCompletado
3ProductosCRUD materiales, especificaciones, unidades de medidaCompletado
4CategoriasAgrupacion jerarquica de insumosCompletado
5FEFOControl de stock por fecha de vencimiento (First Expired, First Out)Completado
6KardexHistorial inmutable de entradas/salidas/saldos, valoracionCompletado
7QRGeneracion de etiquetas QR por lote, escaner integradoCompletado
8KanbanTablero visual drag-and-drop, column CRUD, searchCompletado
9Chat IAAsistente conversacional integrado con LLM localCompletado
10ReportesEstadisticas, informes de rotacion, exportacionCompletado
11RAGRecuperacion de informacion contextual para alimentar LLMCompletado
12ExportacionDescarga en PDF y Excel (XLSX) de reportesCompletado
13ConfiguracionParametros del sistema, datos de la PYMECompletado
14SeguridadEncriptacion, proteccion de endpoints, control de accesos RBACCompletado
15NotificacionesAlertas de stock critico y anomaliasCompletado
16CacheAlmacenamiento de consultas frecuentes para rendimientoCompletado
17DespliegueConfiguracion de entorno, logs, variablesCompletado

Resultado

Completado 17 modulos documentados con 55+ funcionalidades. El inventario establece la linea base del alcance funcional acordado, deteniendo la adicion de nuevas caracteristicas no planificadas.

Tarea 4 Congelamiento de Features

Que pidio el profesor

"No agregues mas funcionalidades. Centremonos en completar lo que ya tenemos. Si siguen metiendo modulos nuevos no van a terminar nunca."

Como se abordo

Se declaro un Feature Freeze con fecha de corte Mayo 15, 2026. A partir de ese dia, toda la actividad del repositorio se limito exclusivamente a:

Evidencia en Commits Post Mayo 15

CommitTipoCategoria
aca3a68refactor: unificar LLM inference en un solo bloqueRefactorizacion
54723fdfix: Welcome landing, tesis HTML, cazador PHP endpointsBugfix
dcd7280security: mover passwords de Nicho e Indice al backendSeguridad
f7bc7a0fix: auditar y corregir enlaces rotosBugfix

Resultado

Completado Cero features nuevas desde Mayo 15. Todos los commits posteriores son de estabilizacion, seguridad y documentacion. El proyecto esta estable y listo para revision del jurado.

Tarea 5 Auditoria de Credenciales

Que pidio el profesor

"El repositorio es publico. ¿Hay credenciales, tokens o llaves SSH en el codigo? Revisen todo el historial de git, no solo el HEAD actual. Cualquiera puede clonar el repo y buscar secretos en commits viejos."

Como se abordo

Se realizo una auditoria de seguridad en tres niveles:

  1. Historial de Git: Se busco en todos los commits (git log --all) patrones de passwords, tokens y API keys.
  2. Frontend compilado: Se inspeccionaron los archivos en public/build/ (JS compilado por Vite) para verificar que React no incrustara variables sensibles.
  3. Servidor de produccion: Se verifico que el archivo .env en DesktopTitan tenga permisos restringidos (solo lectura para el proceso de Laravel).

Que se desarrollo

Problema critico encontrado: Las contrasenas de acceso a paginas sensibles (/indice = 5500, /nicho = german2020) estaban hardcodeadas en componentes React del cliente. Cualquier usuario podia abrir F12 → Sources y ver las claves en texto plano. Esto era una vulnerabilidad grave para un repo publico.

Solucion implementada:

Codigo del Controlador (Laravel 11)

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class PageAccessController extends Controller
{
    public function verify(Request $request)
    {
        $input = $request->input('access_code');
        $page = $request->input('target_page');

        $codes = [
            'indice' => env('INDICE_PASSWORD', '5500'),
            'nicho' => env('NICHO_PASSWORD', 'german2020'),
        ];

        if (isset($codes[$page]) && hash_equals($codes[$page], $input)) {
            session(["page_auth.{$page}" => true]);
            return response()->json(['message' => 'OK']);
        }

        return response()->json(['message' => 'Acceso denegado'], 401);
    }
}

Resultado

Completado 0 credenciales expuestas en el repositorio publico. El historial de git esta limpio. El JS compilado de React no contiene secretos. Las contrasenas se validan exclusivamente en el backend contra .env. La auditoria cubrio los tres niveles: git history, frontend build, y servidor de produccion.

Tarea 6 Aplicacion Desplegada y Estable

Que pidio el profesor

"La proxima semana revisamos el proyecto desplegado. No te pido documentacion, te pido implementacion. Quiero ver la aplicacion funcionando, poder entrar y probarla."

Como se abordo

Pymetory esta desplegado en DesktopTitan, un servidor en Oracle Cloud Infrastructure (ARM Ampere A1.Flex) con 4 OCPUs y 24 GB de RAM — la maxima configuracion del Free Tier de Oracle. La aplicacion corre sobre una pila LEMP (Linux, Nginx, MySQL 8.0, PHP 8.3-FPM) con React 19 compilado via Vite y servido por Inertia.js.

Arquitectura de Despliegue

                  ┌──────────────────┐
                  │   GitHub Repo     │
                  │  (publico)        │
                  └────────┬─────────┘
                           │ push a main
                           ▼
                  ┌──────────────────┐
                  │ GitHub Actions    │
                  │ lint → SSH deploy │
                  └────────┬─────────┘
                           │ SSH (puerto 443)
                           ▼
                  ┌──────────────────────────────────────────┐
                  │          DesktopTitan                     │
                  │  Oracle Cloud ARM · 4 OCPU · 24 GB RAM    │
                  │                                           │
                  │  ┌──────────┐  ┌──────────┐  ┌────────┐  │
                  │  │  Nginx   │  │ PHP 8.3  │  │ MySQL  │  │
                  │  │  :80     │──│ -FPM     │──│  8.0   │  │
                  │  └──────────┘  └──────────┘  └────────┘  │
                  │                      │                    │
                  │                      ▼                    │
                  │               ┌──────────┐               │
                  │               │  Ollama   │               │
                  │               │ pymetory  │               │
                  │               │  -8b      │               │
                  │               └──────────┘               │
                  │                                           │
                  │  ┌──────────┐  ┌───────────────────┐     │
                  │  │ WireGuard│  │ Open WebUI + MMG   │     │
                  │  │ UDP 51820│  │ (admin tools)     │     │
                  │  └──────────┘  └───────────────────┘     │
                  └──────────────────────────────────────────┘

Servicios Activos en Titan

ServicioPuertoProposito
Nginx80Servidor web, proxy inverso, sirve Laravel + React
PHP 8.3-FPMsocketProcesamiento de Laravel 11
MySQL 8.03306Base de datos relacional (inventario, kardex, usuarios)
Ollama11434Inferencia local con modelo pymetory-8b
WireGuard51820VPN para acceso administrativo seguro
Artisan Serve8081Servidor de desarrollo Laravel (respaldo)

Resultado

Completado Pymetory desplegado y funcional en http://129.158.216.27. La aplicacion responde con todas sus funcionalidades operativas: login, dashboard, inventario FEFO, kardex, QR, Kanban, chat IA con RAG. El CI/CD despliega automaticamente cada cambio aprobado en main.

Metodologia de Trabajo con IA

INICIO
  │
  ├──▶ Investigar / Leer docs
  │       │
  │       ▼
  │   ¿Entendido?
  │    │NO      │SI
  │    ▼        ▼
  │  Preguntar  Implementar
  │  a Opus4.6  │
  │    │        ▼
  │    ▼      Test (Playwright)
  │  Recibir   │
  │  respuesta  ├── EXITO ──▶ Deploy ✅
  │    │        │
  │    └────────┤
  │             ├── FALLO ──▶ Diagnosticar
  │             │               │
  │             │               ▼
  │             │          ¿Puedo arreglarlo?
  │             │           │NO        │SI
  │             │           ▼          ▼
  │             │       ⚠️ PREGUNTAR  Arreglar
  │             │       al usuario    │
  │             │                     └──▶ Volver a Test
  │             │
  ◀─────────────┘
  (loop hasta 95% confianza)

Regla: Solo se pregunta al usuario en decisiones criticas (credenciales, infraestructura, diseno). El resto se resuelve con investigacion + consultas a Claude Opus 4.6 via agy CLI.

Transcripcion de la Reunion (VTT)

Transcripcion automatica ASR de WhatsApp Audio. 30 minutos.