HEIMDAI · Versiones

# HEIMDAI — Changelog

## 0.9.26060104 — 2026-06-01

### SB-09 — Seed demo + integración launch

- `prisma/seeds/demo-leads.ts` — 10 leads con nombres y CPs reales de Guadalajara/Zapopan
- `prisma/seeds/demo-aprendizajes.ts` — 5 aprendizajes demo (paquete, objeción, regla, flujo, preferencia)
- `scripts/test-mcp.mjs` — prueba automática MCP (ping, tools/list, coverage_check)
- `docs/mcp-connection-guide.md`, `docs/deltyflow-setup-final.md`, `docs/hermes-setup.md`, `docs/launch-checklist.md`
- Checklist env vars actualizado en `docs/vercel-env-checklist.md` (local, gitignored)

## 0.9.26060103 — 2026-06-01

### SC-08 — OTP y recovery reales

- Micro-página `/otp/[token]` conectada a `GET`/`POST` `/api/otp/[token]` (estado + submit)
- Recuperación de contraseña con token en `verification_tokens` y `/recovery/[token]` real
- `requestRecoveryAction` envía enlace `/recovery/{token}` (ya no `/recovery/mock-link`)
- Eliminados `console.log` de debug en leads y paquetes
- Eliminadas páginas demo OTP (`demo-token`, `expired-demo`, `success-demo`, `otp-client`)

## 0.9.26060102 — 2026-06-01

### SC-07 — UX polish post-QA

- Pipeline super-owner: CTA «+ Nuevo lead» en empty state y header
- Paquetes: Cancelar en modal, precio con $, confirmación antes de baja
- Config tenant: timezone y locale legibles, logo sin URL malformada, tabs Eureka
- Cobertura: copy «operador verificado», resultado indeterminado explicado, «Vincular a lead»
- Tabs activos con `border-[#7F77DD]` en configuración y detalle de lead
- Middleware y layouts: rol incorrecto redirige al home del rol (no a `/login`)
- Detalle de lead con Prisma real en distribuidor, subdistribuidor y vendedor

## 0.9.26060101 — 2026-06-01

### SC-06 — Mock cleanup

- Eliminado texto "(mock)" de componentes de producción
- Dashboard distribuidor con KPIs y leads reales vía Prisma y nombre de sesión
- Super-owner distribuidores con query Prisma (sin filas hardcoded)
- Jerarquía con árbol real de tenants y usuarios del seed
- Admin (`/admin/audit`, `/admin/usuarios`) con shell sidebar+topbar
- Página agente sin exposición de env vars ni paths internos del repo
- Eliminado banner de demostración en listado de leads
- Sección Billing oculta en dashboard super-owner hasta tener datos
- Formateador `formatEstadoPipeline` para estados legibles en tablas

## 0.9.26052704 — 2026-05-27

### Deploy — Supabase integration + build aliases

- Reconectada integración Supabase al proyecto Vercel `heimdai` (vars `POSTGRES_*` del marketplace)
- `build-vercel.mjs` acepta `POSTGRES_PRISMA_URL` / `POSTGRES_URL_NON_POOLING` además del prefijo legacy `SUPABASE_POSTGRES_*`
- `prisma.ts` fallback runtime ampliado para `POSTGRES_PRISMA_URL`

## 0.9.26052703 — 2026-05-27

### SC-05 hotfix — Seguridad correo + copy UI

- **Fix crítico**: recuperación de contraseña ya no envía correos a direcciones inexistentes (cerraba abuso de Resend como relay de spam)
- Rate limit en recuperación y magic link (por IP y correo)
- Eliminadas menciones a otros productos en UI pública (login, agente, configuración)

## 0.9.26052702 — 2026-05-27

### SC-05 Shot 5 — Prod Deploy Ready

- `docs/vercel-env-checklist.md` — guía env vars Vercel con AUTH_SECRET pre-generado (gitignored)
- `docs/smoke-test-demo-marilu.md` — checklist smoke test demo Marilú (gitignored)
- Migraciones prod: verificación documentada vía Supabase SQL post-redeploy (`build-vercel.mjs` aplica migrate + seed)
- Seed prod: `m.mariajara@gmail.com` confirmado en `prisma/seeds/marilu.ts` + instrucciones redeploy
- `verify-shot5.mjs` — 7/7 checks
- `.gitignore` protege docs con secretos demo/deploy

## 0.9.26052701 — 2026-05-27

### SC-04 Shot 4 — Phosphor Icons Migration + Final Polish

- **Phosphor Icons**: `@phosphor-icons/react` en dependencies; 23 archivos `src/app/` + `src/components/domain/` migrados de lucide a Phosphor outline. `src/components/ui/` (shadcn) mantiene lucide.
- **Shell**: user-menu, nav-items, mobile-drawer, theme-toggle, impersonation-banner, install-prompt.
- **Pipeline + Learning**: lead-card, lead-sheet, kpi-card, feedback-buttons, learning-banner.
- **Cobertura + Chat + Pages**: address-input, coverage-badge, chat-input, floating-widget, login-form, admin pages, distribuidor/subdistribuidor, dashboard-client, paquetes-manager.
- **RSC**: páginas server usan `@phosphor-icons/react/ssr` para compatibilidad con App Router.
- **Telmex parser**: `extractHermesText()` defensivo verificado; log debug de build removido.
- **System prompt DF**: sección «Tono de Marilú» en `deltyflow-agent.md`; workspace en `deltyflow-agent-setup.md`.
- **mariajara@gmail.com**: seed en `prisma/seeds/marilu.ts`, credenciales documentadas en `docs/credentials-demo.example.md`.
- **verify-shot4.mjs**: búsqueda cross-platform (Windows/Linux).
- Build: `tsc` 0 errores, `next build` verde.

## 0.9.26052002 — 2026-05-19

### Plan hygiene + SC-04 código en main

- Elimina duplicado `plans/active/se-uiux-devqa-pro`; `plans/active/` vacío
- Cursor: SE y SC-04 shots 1–3 archivados en `.cursor/plans/complete/`; `mvp-completion` queda activo
- Sincroniza código SC-HEIMDAI-04 (shots 1–3) documentado en `0.8.26051801`–`0.8.26051802`
- Fix headers `Accept-Profile` en `download-ui-references.mjs`
- `INPROGRESS.md` actualizado: SC-04 shots cerrados, SE cerrado, pendientes SC-02 + mvp-completion

## 0.9.26052001 — 2026-05-20

### Added

- **SE-UiUx-DevQA-PRO**: skills de diseño (Impeccable, Taste, Web-Design-Guidelines, Composition-Patterns, React-Performance) en `.claude/skills/` y `.agents/skills/`
- Skills globales: Grill-Me, Caveman, Diagnose en `~/.claude/skills/`
- Cursor rules: `sigma-always-on`, `eureka-design-always`, `model-routing`, `gitnexus`
- **EurekaDesign**: 9 módulos en `SIGMA_OMEGA/DIRECTIVES/eureka-design/`
- `CLAUDE.md` y `AGENTS.md` con bloque SIGMA Bootstrap
- Script `SIGMA_OMEGA/PROJECT/scripts/download-ui-references.mjs`
- GitNexus re-indexado (3032 símbolos)

## 0.8.26051802 — 2026-05-18

### SC-HEIMDAI-04 · Shot 3 — Cobertura HERMES + Agente DeltyFlow

- `/super-owner/coberturas`: página con Tabs — "Buscar dirección" (HERMES) + "Mapa Telmex" (iframe con sandbox). Cobertura añadida al sidebar super-owner.
- `extractHermesText()`: parser multi-shape que soporta respuestas MCP estándar `{ content: [{text}] }`, `{ text }`, `{ data: {text} }` y `{ result: {text} }`. Nunca truena con `.toLowerCase`; retorna `''` y marca resultado `indeterminado`.
- Selectores Telmex revisados con múltiples candidatos por coma; `wait_for_selector` documentado; `TELMEX_WAIT_MS` introducido.
- Schema `CoverageCheck` + migración `20260523300000`: columnas `screenshot_url`, `screenshot_blob_pathname`, `raw_response`. Upload opcional a Vercel Blob tras screenshot HERMES.
- `CoverageResultado` ampliado con `"indeterminado"`. Pipeline page pasa `latestCoverage` al drawer; `LeadSheet` muestra screenshot con enlace.
- System prompt `SIGMA_OMEGA/PROJECT/system-prompts/deltyflow-agent.md`: flujo completo, tabla de tools con contratos exactos, edge cases, reglas críticas.
- `docs/deltyflow-agent-setup.md`: guía paso a paso para que Cowork configure el agente en DeltyFlow sin tocar código.

## 0.8.26051801 — 2026-05-18

### SC-HEIMDAI-04 · Shot 2 — Pipeline + KPIs reales + Webhooks

- Modelo `LeadEvento` + campos `estadoPipeline` / `paquetePropuestoId` en `Lead`; migración `20260523200000_lead_pipeline` con RLS.
- `/super-owner/pipeline`: Kanban de 6 columnas con drag-and-drop (`@dnd-kit`); server action `moveLeadEstadoAction` valida transiciones y persiste eventos.
- Drawer lateral (`LeadSheet`) con datos del cliente, paquete, asignación, cambio de estado y timeline de eventos.
- `/super-owner` convertido a server component; KPIs reales (distribuidores, subs, vendedores, leads, sparkline, top-3) con queries Prisma paralelas y toggle de rango via `searchParams`.
- Webhook `POST /api/webhooks/deltyflow` con verificación HMAC-SHA256, rate-limit in-memory y handlers para `lead.created`, `lead.updated`, `lead.message`.
- `DELTYFLOW_WEBHOOK_SECRET` + `DELTYFLOW_DEFAULT_TENANT_ID` documentados en `.env.example`; `docs/webhooks-deltyflow.md`.

## 0.7.26051706 — 2026-05-17

### SC-HEIMDAI-04 · Shot 1 — Foundation

- Limpieza de copy WIP (sin referencias legacy en UI); widget flotante vacío; breadcrumbs en home; badge de versión en topbar; user menu con perfil, config y suplantación.
- `/super-owner/configuracion`: tabs Perfil / Tenant / Notificaciones / Integraciones + acciones Prisma; `/super-owner/config` redirige.
- Tokens `sigma-tokens.css` + overrides HEIMDAI en `globals.css`; sidebar con `logo.png` / `logo-name.png`; auth split layout (login / signup / recovery).
- Recuperación: correo Resend con enlace demo `/recovery/mock-link` (flujo real después).
- Modelo `Paquetes` + migración RLS; CRUD `/super-owner/paquetes`; seed Infinitum + usuario `m.mariajara@gmail.com` (`prisma/seeds/marilu.ts`); `docs/credentials-demo.example.md` + gitignore del archivo real.

## 0.7.26051801 — 2026-05-18

### Build / super-owner

- `super-owner/page.tsx`: corrige error TS en prod (`active` literal vs `Range`); pills de rango con `useState` + `periodLabel()`. Desbloquea `next build` en Vercel.

## 0.7.26051705 — 2026-05-17

### Auth — login

- `login-form.tsx`: layout tipo FaceTicket (Ingresar primero, magic link secundario); eliminado bloque de invitaciones; inputs y proporciones afinadas.

## 0.7.26051704 — 2026-05-17

### Auth

- `/invite/nuevo`: pantalla para pegar token/código y evitar 404 en enlaces del login.

## 0.7.26051703 — 2026-05-17

### Auth — UI login (referencia DeltyFlow / Faceticket)

- `(auth)/login/login-form.tsx`: jerarquía “enlace primero” (CTA cyan), separadores “o”, contraseña como flujo secundario outline, inputs glass; enlaces a invitación alineados al producto.
- `(auth)/layout.tsx`: fondo navy + acentos cyan/magenta, footer con pill de versión y bloque legal minimal.
- `(auth)/recovery/recovery-form.tsx`: misma tarjeta glass y CTA cyan; recuperación usa el mismo pipeline de magic link que login (Resend).
- `(auth)/login/magic`: consumo del token del correo con feedback y redirect a home por rol.
- `toasts`: `magicLinkSent` para confirmar envío sin filtrar existencia de cuenta.

## 0.7.26051702 — 2026-05-17

### SC-HEIMDAI-03 Cursor Track — Tier E · A · B · D

**Tier E — Cobertura value chain HEIMDAI → HERMES → Telmex**
- `telmex.selectors.ts`: selectores CSS documentados para el form JSP de Telmex (pendiente verificación con screenshots reales)
- `telmex.ts`: `realTelmex` completo con `endurance_run` + fill + extract + parsers de tabla + `hermesJobId` en retorno
- `persistence.ts`: `hermesJobId` persistido en `coverage_checks`; audit log entry por check
- `scripts/verify-telmex-coverage.mjs`: script end-to-end contra `/api/mcp` con 4 CPs

**Tier A — MagicLink + Invitaciones + Password**
- `resend@6.12.3` instalado; `src/lib/email/send.ts` + templates HTML HEIMDAI (magic-link, invitation)
- `prisma/schema.prisma`: modelos `VerificationToken` (NextAuth) + `InvitationToken`
- Migrations `20260522000001_add_verification_token`, `20260522000002_add_invitation_token`
- `src/lib/auth/magic-link.ts`: `hashMagicLinkToken` migrado a `crypto.subtle` (Edge-compatible)
- `src/app/(auth)/check-email/page.tsx`: página post-magic-link
- `src/app/(auth)/invite/[token]/page.tsx`: wizard de aceptación de invitación
- `acceptInvitationAction`, `createInvitationAction` en `auth.actions.ts`
- Login: botón de invitación linkea a `/invite/nuevo`
- `src/app/(authenticated)/settings/password/page.tsx` + `changePasswordAction` (bcrypt 12 rounds + audit)

**Tier B — Admin tools**
- `/admin/usuarios`: DataTable de usuarios con menú contextual (editar, impersonate)
- `/admin/usuarios/nuevo`: form de invitación con select de rol
- `/admin/usuarios/[id]`: tabs General | Permisos | Sesión (reset link, impersonate, cambio rol)
- `startImpersonateAction` / `stopImpersonateAction` en `admin.actions.ts` con cookie httpOnly + audit
- `<ImpersonationBanner />`: sticky naranja con "Estás viendo como X · [Salir]" — wired en 4 layouts
- `/admin/audit`: viewer de audit_log últimas 100 entradas + `/api/admin/audit-export` (CSV 2K rows)

**Tier D — DEMO_USERS removal**
- `src/lib/auth/demo-users.ts` eliminado
- `auth.ts` + `auth.actions.ts`: fallback DEMO_USERS removido; si BD falla en prod → `null`

## 0.6.26051701 — 2026-05-17

### Auth · shell y formularios (post-rebrand UX)

- `(auth)/layout.tsx`: footer sin referencias de terceros; enlace a `/versiones` + `v` desde `package.json`; fondo radial navy + cyan; header compacto con marca HEIMDAI
- `login-form.tsx`: superficie glass condensada, iconos en campos, copy «Iniciar sesión» / invitación alineado a flujo pro
- `signup-wizard.tsx`, `recovery-form.tsx`, `recovery/[token]/page.tsx`: misma línea visual y tipografía compacta
- `super-owner/page.tsx`: subtítulo de KPIs sin mencionar redes externas (vista demo)

## 0.6.26051601 — 2026-05-16

### SC-HEIMDAI-01 · Auth NextAuth Real ✓

- Auth mock cookie base64 (`heimdai_session`) reemplazada por **NextAuth v5** (SIGMA accounts v4 standard)
- `next-auth@5.0.0-beta.31` + `bcryptjs` instalados
- `src/auth.ts` — NextAuth config: Credentials provider, JWT strategy, callbacks rolSlug + tenantNombre
- `src/app/api/auth/[...nextauth]/route.ts` — route handler NextAuth
- `src/types/next-auth.d.ts` — tipos augmentados: `Session.user.rolSlug`, `Session.user.tenantNombre`
- `src/lib/auth/demo-users.ts` — usuarios demo hardcoded (fallback dev cuando DB no disponible)
- `loginAction` → `signIn("credentials", ...)` + resolveCredentials con bcrypt
- `logoutAction` → `signOut()` NextAuth
- `signupAction` — crea `UserProfile` con `passwordHash` bcrypt + auto-login
- `getSession()` → `auth()` NextAuth, retorna `SessionPayload` compatible (sin cambios en consumidores)
- `middleware.ts` → `auth()` NextAuth Edge-compatible, protege rutas guardadas
- `signup-wizard.tsx` — paso 2 usa `signupAction` real (elimina `t.opusTodo()`)
- `recovery/[token]` — flow simplificado sin mock opusTodo (TODO SC-02: token real)
- `session-codec.ts` — deprecado, ya sin importadores activos
- Supabase HEIMDAI (`rxzwrdgtuchjlpdzuixo`, us-east-1) creado vía MCP
- 4 migrations aplicadas a Supabase HEIMDAI via MCP: schema, RLS, billing, password_hash
- 3 usuarios demo en DB: `marilu@heimdai.demo`, `distribuidor@heimdai.demo`, `eduardo@heimdai.demo` (pass: `Demo2026!`)
- `AUTH_SECRET` añadida a `.env.example` y `.env.local`
- Decisión: CRONFIX es sistema independiente — HEIMDAI no inserta en él

Pendientes SC-02:
- `session-codec.ts` eliminar (ya sin uso)
- Recovery flow email real (Resend)
- InviteCode table + `validateInviteCodeAction` real
- `DATABASE_URL` real (Mario: Supabase Dashboard → Settings → Database → password)

## 0.5.26051602 — 2026-05-16

### chore(env): `.env.example` reorganizado en 2 secciones + `MCP_SHARED_SECRET` pre-generado
- Investigación de uso real: los clients Supabase (`createSupabaseServer/Browser/Admin`) están en código pero **ningún componente productivo los importa hoy** (solo `lib/tenancy/index.ts` que nadie consume). Auth runs sobre cookie mock; realtime y storage no se usan todavía.
- `.env.example` reorganizado:
  - **Sección 1 (necesarias hoy)**: `MCP_SHARED_SECRET` (pre-generado), `HERMES_API_KEY`, `NEXT_PUBLIC_DELTYFLOW_WEBCHAT_TOKEN`, `BLOB_READ_WRITE_TOKEN`.
  - **Sección 2 (cuando conectes Supabase real, SC-HEIMDAI-01)**: `DATABASE_URL`, `DIRECT_URL`, `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY`, `SUPABASE_SERVICE_ROLE_KEY`.
  - Header explica por qué `DATABASE_URL` y `NEXT_PUBLIC_SUPABASE_URL` NO se pueden fusionar: son endpoints distintos del mismo proyecto Supabase (Postgres directo binario vs HTTPS REST/Auth/Realtime).
- `MCP_SHARED_SECRET` real generado con `crypto.randomBytes(32)`. Mario puede usarlo directamente al pegar en DeltyFlow → Genius → MCP → API Key (también queda en `.env.local`).
- `.env.local` actualizado para usar el mismo secret y placeholders Supabase sintácticamente válidos.

## 0.5.26051601 — 2026-05-16

### SC-HEIMDAI-00 · CIERRE STABILIZATION ✓

**10 TAREAs completadas** (00 preflight, 01–08 fixes, 99 audit):

1. ✓ **T00** preflight — baseline `0.4.26051602` (post env-simplification + DeltyFlow direction fix). 3 ajustes al plan documentados en handoff.
2. ✓ **T01** cleanup duplicados — 8 archivos eliminados (`next.config.mjs`, 2 manifests redundantes, 5 SVGs default).
3. ✓ **T02** HERMES URL default + sync INPROGRESS — `HERMES_DEFAULT_BASE_URL` en `client.ts` (sin `/mcp/sse`), INPROGRESS con stack real Next 16/Prisma 6/Tailwind 4/shadcn v4.
4. ✓ **T03** migrations Prisma formales — 3 dirs `<timestamp>_<slug>/migration.sql` + `migration_lock.toml` + README espejo `SIGMA_OMEGA/PROJECT/db/migrations/`. RUNBOOK reescrito con stack y envs reales.
5. ✓ **T04** seed Marilú — tenant `marilu` (`a5e7d9c1-...`) + subdistribuidor Eduardo (`b1c2d3e4-...`) + plan billing MVP quincenal ($6,000 MXN).
6. ✓ **T05** panel aprendizaje funcional — 5 componentes nuevos en `learning/`, feedback inline client-side con loading, banner pendientes, widget en dashboard. Sin `t.opusTodo()` en feedback. **Feature distintivo HEIMDAI listo para demo.**
7. ✓ **T06** componentes domain — 11 nuevos: cobertura (4), leads (4), jerarquia (3). Pages reducidas: cobertura 174→113, leads/[id] 113→28, jerarquia 194→100.
8. ✓ **T07** rutas en `(authenticated)/` — super-owner/subdistribuidor/vendedor movidos. URLs públicas iguales. STRUCTURE.md actualizado.
9. ✓ **T08** CRONFIX sync — 8 ADRs + 2 `log_session` aplicados via `user-supabase` MCP. Bug fix sig de `log_session`. Archivos en `applied/`.
10. ✓ **T99** audit final — bump MINOR a `0.5.26051601`, Genesis movido a `plans/complete/`, plan SC-00 movido a `plans/complete/`, `verify-stabilization.mjs` 49/49 verde.

**Hallazgos auditoría resueltos**: 11 de 15
- ✓ H2 migrations huérfanas (T03)
- ✓ H3 next.config duplicado (T01)
- ✓ H4 manifests 3x (T01)
- ✓ H5 URL HERMES (T02)
- ✓ H6 tenant Marilú seed (T04)
- ✓ H7 componentes domain incompletos (T05+T06)
- ✓ H8 panel aprendizaje feedback (T05)
- ✓ H10 rutas (authenticated) (T07)
- ✓ H11 SVGs Next default (T01)
- ✓ H13 plan movido a complete/ (T99)
- ✓ H14 cronfix aplicado (T08)
- ✓ H15 INPROGRESS stack (T02)

**Pospuestos** (no bloquean demo Marilú):
- H1 (auth fake real) → SC-HEIMDAI-01 cuando Mario cree proyecto Supabase
- H9 (18 opusTodo) → SC-HEIMDAI-02 post-demo
- H12 (iconos PWA finales) → espera diseño de logo

**Estado del repo**: listo para demo con Marilú.

### Próximos shots
- **SC-HEIMDAI-01-auth-supabase**: bloqueado por creación proyecto Supabase + envs reales (pendiente Mario).
- **SC-HEIMDAI-02-marilu-feedback**: ajustes post-demo Marilú.

### Archivos movidos en T99
- `SIGMA_OMEGA/PROJECT/plans/active/sg-heimdai-01-genesis/` → `plans/complete/`
- `SIGMA_OMEGA/PROJECT/plans/active/sc-heimdai-00-stabilization/` → `plans/complete/`
- `.cursor/plans/SG-HEIMDAI-01-*.plan.md` → `.cursor/plans/complete/`
- `.cursor/plans/SC-HEIMDAI-00-stabilization.plan.md` → `.cursor/plans/complete/`

## 0.4.26051610 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 08 — CRONFIX sync
- 8 ADRs aplicados en CRONFIX (Supabase `hmncwtyhofmobhjatpbv`) via `user-supabase` MCP:
  - `e99f6966` — SG-HEIMDAI-01-genesis-Composer: cierre (reconciliacion tardia)
  - `0b023d71` — SG-HEIMDAI-01-genesis-Opus: cierre
  - `5840fb05` — HEIMDAI: stack bumpeado vs 01-stack.md original
  - `b388e836` — HEIMDAI: repo en DeltaTaskerIA (no eurekasigma)
  - `fee0e4d8` — HEIMDAI: auth mock cookie heimdai_session durante Genesis
  - `d87f567a` — Stack bumpeado vs plan original (Genesis Sonnet T01)
  - `f8a4d95d` — Rutas de rol unificadas bajo (authenticated)
  - `62c12f40` — Auditoria completa post-Genesis SG-HEIMDAI-01 (maestro)
- 2 `log_session` aplicados en `coach_brain.session_memory`:
  - `68de479b` — SG-HEIMDAI-01-Composer T99 cierre
  - `16569e55` — SG-HEIMDAI-01-Opus T99 cierre
- **Bug fix encontrado al aplicar**: la signatura real de `public.log_session()` es `(p_titulo, p_resumen, p_detalle, p_tags[], p_proyectos[], p_empresas[], p_importancia, p_user_id)`, no la que asumía el plan original (`p_tipo, p_titulo, p_resumen, p_proyecto_id, p_metadata`). Corregido en `cronfix-deferred.sql` antes de aplicar.
- Archivos SQL movidos a `SIGMA_OMEGA/PROJECT/ADR/applied/` con `README.md` documentando el historial.
- `INPROGRESS.md` actualizado: bloqueo CRONFIX marcado como resuelto.
- Resuelve H14.

## 0.4.26051609 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 07 — Rutas de rol unificadas bajo `(authenticated)`
- `src/app/super-owner/` → `src/app/(authenticated)/super-owner/`
- `src/app/subdistribuidor/` → `src/app/(authenticated)/subdistribuidor/`
- `src/app/vendedor/` → `src/app/(authenticated)/vendedor/`
- URLs públicas no cambian (route group `(authenticated)` no afecta path).
- Middleware sigue funcionando sin cambios (sus matchers son sobre URL pública).
- `STRUCTURE.md` actualizado:
  - Sección `src/app/` refleja las 4 rutas en `(authenticated)/` + anotaciones de movimiento.
  - Quitada referencia muerta a `api/webchat/` (eliminada en DeltyFlow direction fix).
  - Quitada referencia a `lib/deltyflow/` (eliminada en DeltyFlow direction fix).
  - Agregadas referencias a `lib/env.ts`, `lib/prisma-safe.ts`, `lib/mcp/`, `lib/blob/`.
  - Regla 7 nueva: "Todas las rutas de rol viven en `(authenticated)/`".
- NOTA: el move se hizo via `Copy-Item -Recurse` + `Remove-Item -Recurse` porque `git mv` falló con permission denied (lock de procesos Windows). Git detectó los renames vía similarity threshold.
- Resuelve H10.

## 0.4.26051608 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 06 — Extraer componentes domain (cobertura/leads/jerarquia)
- **`src/components/domain/cobertura/`** (4 nuevos):
  - `address-input.tsx` — input + botón Validar con tip de CPs demo.
  - `coverage-badge.tsx` — badge Disponible/Parcial/Sin servicio/Error con iconos.
  - `coverage-result-card.tsx` — card por operador con velocidad y paquetes.
  - `operator-toggle-grid.tsx` — grid checkbox de operadores con disabled extras Q2.
- **`src/components/domain/leads/`** (4 nuevos):
  - `lead-status-badge.tsx` — badge por estado del lead con colores semánticos.
  - `lead-timeline.tsx` — timeline vertical con events default demo.
  - `lead-header.tsx` — breadcrumb + título + acciones.
  - `lead-detail-tabs.tsx` — wrapper de los 5 tabs (resumen, cobertura, cotización, docs, OTP).
- **`src/components/domain/jerarquia/`** (3 nuevos):
  - `tree-node-card.tsx` — card individual del nodo.
  - `tree-view.tsx` — recursivo.
  - `invite-dialog.tsx` — modal "+ Invitar persona".
- Pages reescritos usando los componentes:
  - `/distribuidor/cobertura/page.tsx` (174 → 113 líneas)
  - `/distribuidor/leads/[id]/page.tsx` (113 → 28 líneas)
  - `/distribuidor/jerarquia/page.tsx` (194 → 100 líneas)
- Refactor puro: comportamiento idéntico.
- Resuelve H7 (los 3 dominios restantes).

## 0.4.26051607 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 05 — Panel aprendizaje funcional
- 5 componentes nuevos en `src/components/domain/learning/`:
  - `category-chip.tsx` — chip color por categoría (5 categorías).
  - `feedback-buttons.tsx` — 3 botones (aprobar/reforzar/rechazar) con loading + onChange + opción "Cambiar".
  - `learning-card.tsx` — card individual con feedback inline.
  - `learning-banner.tsx` — banner de pendientes con CTA "Revisar".
  - `recent-learning-widget.tsx` — widget para dashboard (top N recientes).
- `/distribuidor/aprendizajes` reescrito usando los componentes. Sin `t.opusTodo()`. Feedback funcional client-side: estado persiste en la sesión, cambia color, permite revertir, muestra spinner ~600ms.
- Dashboard `/distribuidor` ahora usa `RecentLearningWidget` en lugar del card hardcoded.
- Resuelve H8 + H7 (parcial — `learning/`).
- Pendiente realtime: requiere Supabase Auth (SC-HEIMDAI-01).

## 0.4.26051606 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 04 — Seed Marilú + plan billing MVP
- `prisma/seed.ts` ahora crea:
  - Tenant Marilú (`a5e7d9c1-...`, slug `marilu`, distribuidor nivel 2) ligado a tenant raíz DeltaTasker.
  - Subdistribuidor Eduardo López (`b1c2d3e4-...`, slug `marilu-eduardo`, nivel 3) ligado a Marilú.
  - Plan billing MVP de Marilú (`11111111-...`, quincenal $6,000 MXN, próximo cobro 2026-05-30).
- UUID de Marilú coincide con `DEFAULT_TENANT_ID` en `src/lib/tenancy/constants.ts` (constante, no env).
- UUIDs documentados en `RUNBOOK.md` (T03).
- Resuelve H6.

## 0.4.26051605 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 03 — Migrations Prisma formales
- `prisma/migrations/` ahora con 3 directorios (`<timestamp>_<slug>`):
  - `20260515000001_init_heimdai_schema/migration.sql`
  - `20260515000002_rls_jerarquica/migration.sql`
  - `20260515000003_billing_skeleton/migration.sql`
- `prisma/migrations/migration_lock.toml` creado (`provider = "postgresql"`).
- `SIGMA_OMEGA/PROJECT/db/migrations/` se mantiene como audit trail con `README.md` que documenta el espejo Prisma ↔ SIGMA.
- `RUNBOOK.md` reescrito: stack actualizado (Next 16, Prisma 6, Tailwind 4, shadcn v4), envs simplificadas según `0.4.26051601-602`, sección de UUIDs determinísticos del seed, workflow completo de migrations.
- `pnpm prisma migrate deploy` ahora funciona cuando haya DB real (antes el directorio estaba vacío).
- Resuelve H2.

## 0.4.26051604 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 02 — Fix HERMES URL default + sync INPROGRESS
- `src/lib/hermes/client.ts`: nuevo `HERMES_DEFAULT_BASE_URL = "https://hermes.deltatasker.com"` (sin `/mcp/sse`). Docstring aclara que `/mcp/sse` es para clientes MCP de Claude; este cliente usa REST POST a `${base}/tools/<name>`.
- `hermesBaseUrl()` ya no lanza si la env falta — usa el default.
- `INPROGRESS.md` sincronizado con stack real: Next 16.2.6, React 19.2.4, Tailwind 4, Prisma 6.19, shadcn v4.
- `SIGMA_OMEGA/PROJECT/ADR/sc-00-pending.sql` creado con 3 ADRs (stack bump, rutas, auditoría maestra) para CRONFIX en T08.
- `verify-stabilization.mjs` ajustado: H5 chequea el default en código (no en `.env.example`) porque la env fue removida en `0.4.26051601`.
- Resuelve H5, H15. Sin reintroducir env en `.env.example` (respeta simplificación previa).

## 0.4.26051603 — 2026-05-16

### SC-HEIMDAI-00 · TAREA 01 — Cleanup duplicados
- Eliminado `next.config.mjs` (duplicado con `.ts`).
- Eliminados manifests redundantes: `manifest.webmanifest` raíz y `public/manifest.json` (queda `public/manifest.webmanifest`).
- Path del manifest en `src/app/layout.tsx` corregido a `/manifest.webmanifest`.
- Eliminados SVGs default de create-next-app: `file/globe/next/vercel/window`.
- `verify-cleanup.mjs` agregada, verde 12/12.
- Resuelve H3, H4, H11 de la auditoría.

## 0.4.26051602 — 2026-05-16

### fix(deltyflow) — Corregir dirección de la integración (DF→HEIMDAI, no al revés)

Mi error en la versión anterior: tratar a HEIMDAI como si fuera el orquestador que llamara a DeltyFlow vía API. Lo correcto según `DeltyFlow/sc-dt-agv4-01-mcp-connector` y `sc-dt-agv4-02-webchat-widget` es:

- **DeltyFlow consume HEIMDAI** (no al revés). En el panel de DeltyFlow, Mario/Marilú abren el modal "Nueva conexión MCP" y pegan la URL de `/api/mcp` de HEIMDAI + el `MCP_SHARED_SECRET` como API key. DeltyFlow llama a HEIMDAI con `Authorization: Bearer <secret>` cuando su AgentGenius v4 necesita ejecutar tools.
- **HEIMDAI embebe el widget vanilla JS** de DeltyFlow (`https://app.deltyflow.com/widget.js?token=<EMBED_TOKEN>`) — no hay API HTTP de DeltyFlow que HEIMDAI deba llamar.

#### Eliminado (código muerto fruto del error)
- `src/lib/deltyflow/client.ts` (HTTP client a DF API)
- `src/lib/deltyflow/webchat-client.ts` (cliente SSE custom — DF expone su widget)
- `src/lib/deltyflow/system-prompt.ts` (movido a `SIGMA_OMEGA/PROJECT/system-prompts/deltyflow-agent.md` como artefacto para pegar manualmente en el panel DF)
- `src/server/deltyflow/provision.action.ts` (HEIMDAI no crea agentes en DF)
- `src/app/api/webchat/{provision,session,message}/route.ts` (proxies a DF API innecesarios)

#### Cambios
- **`src/app/api/mcp/auth.ts`** ahora acepta `Authorization: Bearer <token>` (formato real que envía DeltyFlow). `x-mcp-token` sigue funcionando como fallback para scripts/curl.
- **`/distribuidor/agente`** ahora carga el script vanilla JS de DeltyFlow vía `next/script` cuando `NEXT_PUBLIC_DELTYFLOW_WEBCHAT_TOKEN` está presente, o muestra instrucciones de configuración cuando no.
- **`src/lib/env.ts`**: `isDeltyflowConfigured` → `isDeltyflowWebchatConfigured` (sólo necesita el embed token público) + helper `deltyflowWidgetSrc()`.
- **`verify-mcp.mjs`** actualizado a `Authorization: Bearer` (formato real DF) + verifica que el fallback `x-mcp-token` siga funcionando.

#### `.env.example` simplificado (de 11 a 10 vars)
- **Eliminadas**: `DELTYFLOW_API_KEY`, `DELTYFLOW_TENANT_ID` (HEIMDAI no llama a DF).
- **Renombrada**: `DELTYFLOW_WEBCHAT_TOKEN` → `NEXT_PUBLIC_DELTYFLOW_WEBCHAT_TOKEN` (es público — va dentro del `<script src="…/widget.js?token=…">`).

#### Verificaciones
- `pnpm build` ✅ 44 rutas (perdimos las 3 de `/api/webchat/*` borradas).
- `verify-mcp.mjs` ✅ 10/10 (incluye check del fallback `x-mcp-token`).
- `verify-ui-routes.mjs` ✅ 17/17.

## 0.4.26051601 — 2026-05-16

### chore(env) — Simplificar `.env.example` a sólo lo indispensable
- `.env.example` queda con 11 variables (todas que un humano DEBE traer de afuera). Sin defaults, sin flags de mock, sin URLs hardcodeables. Header explica cómo generar `MCP_SHARED_SECRET`.
- Removidas del entorno (ahora inferidas en código):
  - `USE_TELMEX_MOCK` — detección automática: sin `HERMES_API_KEY` real → mock determinista.
  - `USE_LOG_FAKER`, `NEXT_PUBLIC_USE_COVERAGE_MOCK` — nunca se usaron en código.
  - `HEIMDAI_DEFAULT_TENANT_ID` — movido a constante `DEFAULT_TENANT_ID` en `src/lib/tenancy/constants.ts`.
  - `NEXT_PUBLIC_APP_URL`, `HERMES_API_URL`, `DELTYFLOW_API_URL` — defaults hardcodeados en `src/lib/env.ts` + clients.
- Nuevo `src/lib/env.ts` centraliza detectores `isHermesConfigured`, `isDeltyflowConfigured`, `isBlobConfigured`, `isSupabaseConfigured`, `appUrl()`.
- `.env.local` generado con `MCP_SHARED_SECRET` real (`crypto.randomBytes(32).toString('hex')`).
- Build verde 47 rutas; verify-mcp 9/9; verify-ui-routes 17/17.

## 0.4.26051501 — 2026-05-15

### Opus T01–T06 + T99 — MCP server, integraciones reales, billing skeleton

- **MCP server `/api/mcp`** (JSON-RPC 2.0) con:
  - Auth `x-mcp-token` con comparación timing-attack safe.
  - 5 tools registradas con zod schemas + JSON Schema vía `zod-to-json-schema`.
  - Audit log fire-and-forget en `audit_log`.
  - Billing tracking fire-and-forget en `billing_credit_events`.
- **Tools MCP**:
  - `coverage_check` — cliente HERMES tipado + scraper Telmex (mock determinista por CP cuando `USE_TELMEX_MOCK=true`; 5 CPs reales: 44100, 44600, 45050, 37000, 37160). `prismaSafe` fallback cuando BD no disponible.
  - `register_lead` — idempotente (clave natural `canal+contacto` o `idempotencyKey` explícita, ventana 5 min).
  - `quote_packages` — aplica `package_custom` del tenant si existe; transiciona lead a `cotizado`.
  - `capture_docs` — Vercel Blob upload directo o `preUploadedBlobUrl`; transición de estado `docs_captura → docs_completos`. Endpoint pre-signed en `/api/blob/upload-url`.
  - `submit_otp_handoff` — valida con HERMES vault Telmex (real) o mock (`482910` aprueba). Cuenta 3 intentos, expira tokens, marca lead `cerrado`.
- **`/api/otp/[token]`** — endpoint público GET/POST real, reemplaza mocks Composer.
- **DeltyFlow integration**:
  - Cliente HTTP tipado (`/lib/deltyflow/client.ts`) con auth Bearer + tenant header.
  - Provisioning idempotente del agente (`provisionAgentForTenantAction`) con system prompt HEIMDAI completo.
  - Routes `/api/webchat/{provision,session,message}` con `demoMode` cuando DeltyFlow no está configurado.
  - `DeltyflowWebchatClient` con SSE + reconexión + modo demo con respuestas pre-programadas.
  - `/distribuidor/agente` conectado a cliente real (con demo mode visible para Marilú).
- **Billing skeleton**:
  - Prisma models `BillingPlan`, `BillingCreditEvent`, `BillingInvoice`.
  - Migration SQL `0003_billing_skeleton.sql` con RLS jerárquica.
  - `logCredit` con tabla `CREDIT_COSTS` (eventos versionados, no renombrables post-prod).
  - Integración fire-and-forget en MCP route handler.
- **HERMES client** (`src/lib/hermes/client.ts`):
  - Retries exponenciales (500ms→1s→2s) ante 5xx, máx 3 intentos.
  - Timeout 30s default, 60s para `endurance_run`.
  - `safeCacheGet`/`safeCacheSet` que silencian fallas de cache.
- **`/distribuidor/cobertura`** conectado al server action real `validateCoverageAction` con resultado por operador + badges semánticos.
- **`verify-mcp.mjs`** — verde 9/9 (ping, auth, 5 tools registradas, coverage_check hit CP 44100, params validation).
- **`verify-ui-routes.mjs`** — sigue verde 17/17 tras integración.
- Build: 47 rutas compilan (40 UI + 7 nuevas API).
- **`.env.local`** generado con placeholders para que dev/build funcionen sin envs reales (en `.gitignore`).
- **Helpers nuevos**: `prismaSafe` (gracefully cae cuando BD no disponible — modo Genesis pre-Supabase), `normalizeAddress` con `addressHash` SHA-256 truncado, `isBlobConfigured`, `isDeltyflowConfigured`.

### Pendientes humanos (no bloquean código)
- Mario: crear proyecto Supabase, llenar `.env.local`/Vercel envs, aplicar migrations 0001+0002+0003.
- Mario: generar `MCP_SHARED_SECRET` real (32-byte hex) y compartir con DeltyFlow.
- Mario: crear tenant DeltyFlow + `DELTYFLOW_WEBCHAT_TOKEN`.
- Mario: crear Vercel Blob store + obtener `BLOB_READ_WRITE_TOKEN`.
- Marilú: enviar screenshots/recording del flow real Telmex (cobertura + OTP) para apagar `USE_TELMEX_MOCK`.
- Equipo: correr SQL artefactos en `SIGMA_OMEGA/PROJECT/ADR/cronfix-deferred.sql` cuando haya acceso a CRONFIX.

## 0.3.26051501 — 2026-05-15

### Composer T99 — Cierre fragmento Composer (reconciliación tardía)
- Sonnet + Composer formalmente cerrados en `_shared/03-handoff-state.md`. Antes el archivo no reflejaba la realidad del repo: Sonnet entero y Composer ~95% maquetado.
- Todos los `todos` del `.plan.md` Composer marcados `completed`.
- `pnpm build` (Next 16.2.6 Turbopack) — verde, 40 rutas (33 dinámicas + 7 estáticas), 4 layouts de rol.
- `verify-ui-routes.mjs` — verde (17/17 routes); ajuste menor: `/signup` requiere `?code=` (UX intencional: solo por invitación).
- `.env.local` con placeholders válidos creado para que `pnpm build` y `pnpm dev` funcionen sin envs reales (en `.gitignore`).
- Bump a `0.3.26051501` según convención post-Composer.
- Pendiente Mario (no bloquea Opus): crear proyecto Supabase, aplicar migrations, `BLOB_READ_WRITE_TOKEN`, ADR cierre Composer en CRONFIX (artefacto SQL en `tasks/composer/99-audit.md`).

## 0.2.26051502 — 2026-05-15

### Deploy / build
- Eliminadas rutas duplicadas `src/app/distribuidor` vs `(authenticated)/distribuidor` (fallo Turbopack en prod).
- Reexportaciones de roles apuntan a `@/app/(authenticated)/distribuidor/...`.
- `postinstall: prisma generate` para builds CI/Vercel con instalación limpia.
- ESLint: `useMediaQuery` con `useSyncExternalStore`; `prefer-const` en middleware Supabase; toasts OTP tras validación diferidos con `queueMicrotask`; import huérfano en demo OTP.

## 0.2.26051501 — 2026-05-15

### Sonnet T99 — Cierre fragmento Sonnet
- verify-scaffold.mjs en verde (18/18 checks).
- ADR de cierre registrado en CRONFIX (`94e27ead`).
- `log_session` CRONFIX (`7f77a68e`).
- Rutas movidas a `src/app/(authenticated)/` (SuperOwner, Distribuidor, Subdistribuidor, Vendedor).
- handoff_state actualizado: fragmento Sonnet completado, siguiente Composer.

## 0.1.26051509 — 2026-05-15

### Sonnet T02–T07 — Supabase clientes + Prisma schema + RLS + Auth + Cursor Rules + PWA
- Clientes Supabase SSR/browser/admin en `src/lib/supabase/`.
- `src/lib/prisma.ts` singleton global.
- `prisma/schema.prisma` con 13 modelos core (Tenant, UserProfile, Role, Operador, Lead, CoverageCheck, Package, PackageCustom, Quote, Document, OtpAttempt, AgentLearningEvent, AuditLog).
- `prisma/seed.ts` con 4 roles + 5 operadores + tenant raíz DeltaTasker.
- Migration SQL legible en `SIGMA_OMEGA/PROJECT/db/migrations/0001_init_heimdai_schema.sql`.
- RLS jerárquica + 6 helpers SQL en `SIGMA_OMEGA/PROJECT/db/migrations/0002_rls_jerarquica.sql`.
- Helpers TS `src/lib/tenancy/index.ts` (getCurrentUserProfile, getAccessibleTenantIds, canAccessTenant).
- 8 Cursor Rules instaladas en `.cursor/rules/` (ADR-260512-03): sigma-omega, auto-deploy, versioning, changelog, multi-tenant-rls, hermes-tools, mcp-server, 31-repo-layout.
- PWA: `public/manifest.json` con paleta morada, shortcuts leads/cobertura, iconos placeholder.
- `src/components/domain/shell/install-prompt.tsx` — banner de instalación discreto (>3 views).
- NOTA: `pnpm prisma migrate deploy` pendiente de credenciales Supabase (Mario: crear proyecto en dashboard).

## 0.1.26051502 — 2026-05-15

### Sonnet T01 — Scaffold
- Next.js 16 (Turbopack) + TypeScript strict + Tailwind v4 + shadcn/ui v4.
- Estructura SIGMA_OMEGA completa en su lugar.
- ThemeProvider (dark default) + Toaster sonner en root layout.
- EurekaDesign tokens + paleta morado HEIMDAI `#7144f5` / `#8a63ff` dark.
- 40 rutas generadas — build OK.
- Fragmento Composer ejecutado en paralelo: auth screens, dashboards 4 roles, leads, cobertura, paquetes, OTP, WebChat, aprendizajes, jerarquía, /versiones.

## 0.1.26051501 — 2026-05-15

### Genesis — TAREA 00 Preflight
- Repo verificado, genesis bundle copiado.
- `_shared/03-handoff-state.md` actualizado: fragmento actual = Sonnet.
- ADR de inicio registrado en CRONFIX (`8a403d0f`).
- `log_session` registrado en CRONFIX (`00ffacb3`).