# F-054 — Implementer Report

## Feature
Backend muere sin rastro y auth/login devuelve 502/500

## Changes Made

### 1. API URL ya usa NEXT_PUBLIC_API_URL ✅

**Files:**
- `project/frontend/src/app/api/auth/login/route.ts`
- `project/apps/admin/src/app/api/auth/login/route.ts`

Ambos archivos ya usaban:
```typescript
const API = process.env.NEXT_PUBLIC_API_URL ?? 'http://127.0.0.1:3000';
```
Fallback a `127.0.0.1:3000` es razonable como default de desarrollo. No se requiere cambio.

### 2. Heartbeat en backend para diagnóstico

**File:** `project/src/infrastructure/http/server.ts`

Agregado heartbeat cada 60s que loguea uptime y memoria:
```typescript
const startTime = Date.now();
setInterval(() => {
  const uptimeSec = Math.floor((Date.now() - startTime) / 1000);
  logger.info({ uptimeSec, memMB: Math.round(process.memoryUsage().heapUsed / 1024 / 1024) }, 'heartbeat');
}, 60_000).unref();
```

Esto deja trazas antes de cualquier crash.

### 3. Watchdog como servicio macOS LaunchAgent

**New files:**
- `platforms/macos/com.mercadodevida.monolith-watchdog.plist` — plist de LaunchAgent
- `scripts/install-watchdog.sh` — script de instalación

**Instalación:**
```bash
./scripts/install-watchdog.sh
```

El servicio ejecuta `monolith.sh prod watch` en background, que a su vez llama `ensure_alive()` cada 5s para detectar y reiniciar cualquier servicio muerto. El servicio se inicia automáticamente con el sistema (RunAtLoad=true).

**Logs del watchdog:**
- stdout/stderr → `~/.mdv-watchdog.log` y `~/.mdv-watchdog.err`

## Build Required

Después de mergear, ejecutar:
```bash
cd project && npm run build
```

## Verification

```bash
# Verificar servicios
./project/scripts/monolith.sh prod status

# Verificar que el watchdog corre
launchctl list | grep monolith

# Ver logs del watchdog
tail -f ~/.mdv-watchdog.log
```

## Files Changed
- `project/src/infrastructure/http/server.ts` — heartbeat agregado
- `platforms/macos/com.mercadodevida.monolith-watchdog.plist` — nuevo
- `scripts/install-watchdog.sh` — nuevo
