## Asset Header

- **Asset ID:** SOP-EL-SX-SysOps-v01
- **Version:** v01
- **Status:** Draft
- **Owner:** Victor Heredia
- **IntellBank:** IB-EL-EmpowerLabs
- **Tipo:** SOP — Standard Operating Procedure
- **Propósito:** BrainOS as a Service — SOP de Operaciones
- **Última actualización:** 2026-04-11

---

# BrainOS as a Service — SOP de Operaciones
## SHA-SOP-SysOps-v01

---


---

## Propósito de este documento

EmpowerLabs opera el BrainOS de cada cliente de Tu Sherpa IA como un servicio gestionado (Track A). El cliente nunca toca la infraestructura — solo recibe una URL y una clave para conectar desde Claude Desktop.

Este SOP documenta todo lo que el equipo de sistemas necesita saber para:

1. **Provisionar** un nuevo cliente (setup completo en 15-20 min)
2. **Operar** la infraestructura de forma continua (monitoreo, costos, mantenimiento)
3. **Gestionar incidentes** (troubleshooting, errores conocidos, escalación)
4. **Offboardear** a un cliente cuando termina el contrato

---

## Sección 1 — Arquitectura del Servicio

### ¿Qué es el BrainOS?

El BrainOS es la memoria persistente de Tu Sherpa IA. Permite que el asistente IA de un cliente recuerde decisiones, aprendizajes, proyectos y compromisos a lo largo del tiempo — incluso entre sesiones distintas.

Tecnológicamente es: una base de datos vectorial en la nube + un servidor MCP (Model Context Protocol) + un modelo de embeddings.

![[Pasted image 20260323104634.png]]
### Stack técnico

| Capa | Tecnología | Función | Quién lo opera |
|------|-----------|---------|---------------|
| **Base de datos** | Supabase (PostgreSQL + pgvector) | Almacena los "thoughts" con embeddings semánticos | EmpowerLabs |
| **Servidor MCP** | Supabase Edge Functions (Deno) | Protocolo que conecta Claude con la base de datos | EmpowerLabs |
| **Embeddings** | OpenRouter → `text-embedding-3-small` | Convierte texto en vectores semánticos para búsqueda | EmpowerLabs (API key compartida) |
| **Cliente IA** | Claude Desktop | La interfaz que usa el cliente | El cliente |
| **Connector** | MCP Connector en Claude Desktop | Enlaza Claude con el servidor MCP | El cliente (configuración una sola vez) |

### Modelo de datos

```
Tabla: thoughts
├── id          UUID (primary key, autogenerado)
├── content     TEXT (el thought capturado — texto libre)
├── embedding   VECTOR(1536) (generado por OpenRouter al insertar)
├── metadata    JSONB (etiquetas, fuente, proyecto, etc.)
├── created_at  TIMESTAMPTZ (timestamp de creación)
└── updated_at  TIMESTAMPTZ (timestamp de última modificación)
```

### Arquitectura por cliente

Cada cliente tiene su propio proyecto Supabase independiente. **No hay base de datos compartida.** Esta es una decisión de diseño intencional:

- **Seguridad:** los datos de un cliente nunca están en el mismo proyecto que otro
- **Soberanía:** se puede entregar el proyecto completo al cliente si lo solicita
- **Independencia de fallos:** un problema en el proyecto de un cliente no afecta a los demás

```
EmpowerLabs (cuenta Supabase central)
├── BrainOS-cliente-A   ← Proyecto independiente, cliente A
├── BrainOS-cliente-B   ← Proyecto independiente, cliente B
├── BrainOS-cliente-C   ← Proyecto independiente, cliente C
└── BrainOS-victor      ← Instancia de referencia interna
```

### Flujo de una operación (ejemplo: capturar un thought)

```
Cliente escribe: "Recuerda que decidí lanzar el producto en mayo"
         ↓
Claude detecta la instrucción y llama al tool capture_thought
         ↓
Servidor MCP recibe el texto + autenticación (key)
         ↓
Servidor llama a OpenRouter para generar el embedding (vector 1536 dims)
         ↓
Embedding + texto se guardan en Supabase tabla thoughts
         ↓
Claude confirma al cliente: "Guardado en tu BrainOS ✅"
```

---

## Sección 2 — Prerequisitos del Equipo

Antes de operar el servicio, el miembro del equipo de sistemas necesita:

### Cuentas y accesos

| Recurso | Acceso necesario | Dónde obtenerlo |
|---------|-----------------|----------------|
| **Supabase** | Miembro de la organización EmpowerLabs | Pedirle a Victor acceso a la org |
| **OpenRouter** | API Key de la cuenta EmpowerLabs | Credential Tracker — EmpowerLabs Master |
| **Supabase CLI** | Instalado en la computadora de trabajo | Ver Paso de instalación abajo |
| **Credential Tracker** | Acceso al tracker de credenciales de clientes | Victor lo provee al onboardear al equipo |

### Instalar Supabase CLI (una sola vez)

**Mac con Homebrew:**
```bash
brew install supabase/tap/supabase
supabase --version   # verificar instalación
```

**Mac sin Homebrew:**
```bash
npm install -g supabase
```

**Windows (Scoop):**
```powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
scoop bucket add supabase https://github.com/supabase/scoop-bucket.git
scoop install supabase
```

### Autenticarse con Supabase (una sola vez)

```bash
supabase login
# Se abre el browser — autenticarse con la cuenta de la organización EmpowerLabs
```

---

## Sección 3 — Provisioning de Nuevo Cliente

Tiempo estimado: **15-20 minutos**. Ejecutar en orden.

### Checklist de provisioning

Antes de empezar, verificar que tienes:
- [ ] Nombre del cliente (para nombrar el proyecto)
- [ ] Sesión activa en Supabase CLI (`supabase login`)
- [ ] OpenRouter API Key (del Credential Tracker central)
- [ ] Credential Tracker del cliente creado (o espacio listo en el tracker central)

---

### Paso 1 — Crear proyecto Supabase

1. Ir a [supabase.com/dashboard](https://supabase.com/dashboard) → logueado con la cuenta EmpowerLabs
2. **New Project** → seleccionar la organización EmpowerLabs
3. Configurar:
   - **Nombre del proyecto:** `BrainOS-[nombre-cliente]`
     - Ejemplos: `BrainOS-carlos`, `BrainOS-ana-martinez`, `BrainOS-acme`
     - Usar solo minúsculas, sin espacios, guiones permitidos
   - **Database Password:** usar generador del mismo Supabase → **guardar inmediatamente** en el Credential Tracker del cliente
   - **Región:** elegir la más cercana a la ubicación geográfica del cliente
     - México/LATAM: `South America (São Paulo)` o `US East (N. Virginia)`
     - España: `Europe (Frankfurt)`
4. Click **Create new project** → esperar ~2 minutos para que inicialice
5. Una vez cargado el dashboard, guardar en el Credential Tracker:

| Campo | Dónde encontrarlo | Ejemplo |
|-------|------------------|---------|
| **Project URL** | Settings → API → Project URL | `https://abcdef123.supabase.co` |
| **Project Ref** | La URL del browser: `/project/ESTE_STRING` | `abcdef123` |
| **Service Role Key** | Settings → API Keys → `service_role` secret | `eyJ...` (token largo) |
| **DB Password** | El que configuraste en el paso anterior | `Xk9#mP2...` |

---

### Paso 2 — Configurar la base de datos

1. En el dashboard del proyecto nuevo → **SQL Editor** (panel izquierdo)
2. **IMPORTANTE:** Antes de pegar el SQL, copiarlo a un editor de texto externo (VS Code, TextEdit, Notepad) y luego copiarlo desde ahí. El editor del browser a veces corrompe caracteres especiales como `$$` o comillas simples.
3. Crear **New query** y pegar el siguiente SQL completo:

```sql
-- 1. Activar extensión vectorial
create extension if not exists vector;

-- 2. Crear tabla principal
create table thoughts (
  id uuid default gen_random_uuid() primary key,
  content text not null,
  embedding vector(1536),
  metadata jsonb default '{}'::jsonb,
  created_at timestamptz default now(),
  updated_at timestamptz default now()
);

-- 3. Índices de performance
create index on thoughts using hnsw (embedding vector_cosine_ops);
create index on thoughts using gin (metadata);
create index on thoughts (created_at desc);

-- 4. Trigger de actualización automática
create or replace function update_updated_at()
returns trigger as $$
begin
  new.updated_at = now();
  return new;
end;
$$ language plpgsql;

create trigger thoughts_updated_at
  before update on thoughts
  for each row
  execute function update_updated_at();

-- 5. Función de búsqueda semántica
create or replace function match_thoughts(
  query_embedding vector(1536),
  match_threshold float default 0.7,
  match_count int default 10,
  filter jsonb default '{}'::jsonb
)
returns table (
  id uuid,
  content text,
  metadata jsonb,
  similarity float,
  created_at timestamptz
)
language plpgsql
as $$
begin
  return query
  select
    t.id,
    t.content,
    t.metadata,
    1 - (t.embedding <=> query_embedding) as similarity,
    t.created_at
  from thoughts t
  where 1 - (t.embedding <=> query_embedding) > match_threshold
  and (filter = '{}'::jsonb or t.metadata @> filter)
  order by t.embedding <=> query_embedding
  limit match_count;
end;
$$;

-- 6. Seguridad: habilitar RLS
alter table thoughts enable row level security;

create policy "Service role full access"
  on thoughts
  for all
  using (auth.role() = 'service_role');

-- 7. Permisos del rol de servicio
grant select, insert, update, delete on table public.thoughts to service_role;
```

4. Click **Run** → verificar que no hay errores en la salida
5. Ir a **Table Editor** → debe aparecer la tabla `thoughts` con sus columnas

✅ **Checkpoint:** Si la tabla `thoughts` aparece, el paso 2 fue exitoso.

---

### Paso 3 — Generar MCP Access Key del cliente

Esta clave es la contraseña que el cliente usa para autenticarse con el servidor MCP. Es independiente de las claves de Supabase.

**Mac/Linux:**
```bash
openssl rand -hex 32
```

**Windows PowerShell:**
```powershell
-join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Maximum 256) })
```

El resultado es una cadena de 64 caracteres hexadecimales. Guardar como **MCP Access Key** en el Credential Tracker del cliente.

---

### Paso 4 — Desplegar el servidor MCP

En terminal, ejecutar en orden:

```bash
# 1. Crear carpeta de trabajo temporal para este cliente
mkdir BrainOS-[nombre-cliente] && cd BrainOS-[nombre-cliente]

# 2. Inicializar proyecto Supabase local
supabase init

# 3. Conectar con el proyecto del cliente en la nube
#    (usar el Project Ref guardado en el Paso 1)
supabase link --project-ref PROJECT_REF_DEL_CLIENTE

# 4. Configurar los secretos del servidor
#    IMPORTANTE: usar guiones_bajos, NO guiones-medios
supabase secrets set MCP_ACCESS_KEY=LA_KEY_GENERADA_EN_PASO_3
supabase secrets set OPENROUTER_API_KEY=LA_KEY_DE_EMPOWERLABS

# 5. Crear la función Edge
supabase functions new BrainOS-mcp

# 6. Descargar el servidor MCP desde el repositorio OB1
curl -o supabase/functions/BrainOS-mcp/index.ts \
  https://raw.githubusercontent.com/NateBJones-Projects/OB1/main/server/index.ts

curl -o supabase/functions/BrainOS-mcp/deno.json \
  https://raw.githubusercontent.com/NateBJones-Projects/OB1/main/server/deno.json

# 7. Verificar que se descargó correctamente
head -3 supabase/functions/BrainOS-mcp/index.ts
# Debe mostrar algo como: import "jsr:@supabase/functions-js/edge-runtime.d.ts";

# 8. Deploy
supabase functions deploy BrainOS-mcp --no-verify-jwt
```

✅ **Checkpoint:** El deploy termina con mensaje `Done: Deployed Function BrainOS-mcp`.

---

### Paso 5 — Construir las credenciales del cliente

Con el **Project Ref** y el **MCP Access Key**, construir:

```
URL base del servidor MCP:
https://[PROJECT_REF].supabase.co/functions/v1/BrainOS-mcp

Connection URL (la que va al cliente):
https://[PROJECT_REF].supabase.co/functions/v1/BrainOS-mcp?key=[MCP_ACCESS_KEY]
```

Guardar ambas en el Credential Tracker del cliente.

---

### Paso 6 — Prueba de funcionamiento

Antes de entregar al cliente, verificar que el servidor responde:

```bash
# Test básico con curl — debe retornar JSON con herramientas disponibles
curl -s "https://[PROJECT_REF].supabase.co/functions/v1/BrainOS-mcp?key=[MCP_ACCESS_KEY]" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/list"}' | head -50
```

La respuesta debe incluir `thought_stats`, `capture_thought`, `search_thoughts`, `list_thoughts`.

Si retorna `{"error":"Unauthorized"}` → revisar que el secret `MCP_ACCESS_KEY` está bien escrito (con guiones bajos).

---

### Paso 7 — Entrega al cliente

Lo único que el cliente necesita:

1. La **Connection URL** completa (con el `?key=...` al final)
2. Las instrucciones de conexión (ver Apéndice A — Instrucciones para el cliente)

El cliente **nunca debe ver** ni necesitar:
- Project Ref de Supabase
- Service Role Key
- OpenRouter API Key
- Contraseña de la base de datos

---

### Checklist final de provisioning

- [ ] Proyecto Supabase creado con nombre `BrainOS-[cliente]`
- [ ] Tabla `thoughts` visible en Table Editor
- [ ] Función `match_thoughts` visible en SQL Functions
- [ ] RLS activo y policy `Service role full access` creada
- [ ] Grant de permisos al service_role confirmado
- [ ] Secretos `MCP_ACCESS_KEY` y `OPENROUTER_API_KEY` configurados
- [ ] Función `BrainOS-mcp` desplegada (sin errores)
- [ ] Test de curl exitoso (tools/list retorna 4 herramientas)
- [ ] Connection URL construida y guardada en Credential Tracker
- [ ] Todas las credenciales en el Credential Tracker del cliente
- [ ] Connection URL entregada al cliente

---

## Sección 4 — Operación Continua

### Credential Tracker — Estructura por cliente

Para cada cliente, mantener un registro con estos campos:

| Campo | Descripción |
|-------|-------------|
| **Cliente** | Nombre del cliente |
| **Fecha de activación** | Cuando se entregó el servicio |
| **Project Name** | `BrainOS-[nombre-cliente]` |
| **Project Ref** | String del Project Ref de Supabase |
| **Project URL** | `https://[ref].supabase.co` |
| **DB Password** | Contraseña de la base de datos (generada en Step 1) |
| **Service Role Key** | Key de Supabase (uso interno EmpowerLabs — no compartir) |
| **MCP Access Key** | Key de autenticación del servidor MCP |
| **Connection URL** | URL completa con key — la que tiene el cliente |
| **Estado** | Activo / Suspendido / Offboarded |
| **Plan** | Setup $2,500 + $300/mes |
| **Próxima facturación** | Fecha del próximo cobro mensual |
| **Contacto técnico** | Quien del equipo gestiona este cliente |

### Monitoreo de salud del servicio

**¿Qué monitorear?**

| Señal | Frecuencia de revisión | Cómo verificar |
|-------|----------------------|----------------|
| **Thought count activo** | Semanal (via tarea programada del cliente o manual) | MCP tool `thought_stats` |
| **Edge Function activa** | Quincenal | Supabase → Edge Functions → Status |
| **Crédito OpenRouter** | Mensual | openrouter.ai → Usage |
| **Uso de base de datos Supabase** | Mensual | Supabase → Settings → Usage |
| **Errores en logs** | Cuando cliente reporta problemas | Supabase → Edge Functions → Logs |

**Cómo revisar logs de un cliente:**

1. Ir al dashboard del proyecto del cliente en Supabase
2. Panel izquierdo → **Edge Functions** → `BrainOS-mcp`
3. Tab **Logs** → filtrar por errores recientes
4. Los logs más comunes a revisar son errores `500` (servidor) y `401` (autenticación)

### Costos del servicio

**Costo por cliente activo (estimado):**

| Componente | Costo | Periodicidad |
|-----------|-------|-------------|
| **Supabase Free Tier** | $0 | Hasta 500MB de datos (~50,000-100,000 thoughts) |
| **Supabase Pro** (si supera Free) | ~$25/mes | Al superar el tier gratuito |
| **OpenRouter** (embeddings) | ~$0.02-0.10/mes | Por volumen de thoughts capturados |
| **Total estimado** | **~$0-$25/mes por cliente** | |

**Notas de costos:**
- El tier gratuito de Supabase cubre holgadamente a clientes que capturan <500 thoughts/mes
- OpenRouter `text-embedding-3-small` cuesta ~$0.02 por millón de tokens. Un thought promedio = ~100 tokens. 1,000 thoughts = ~$0.002
- EmpowerLabs puede usar **una sola API key de OpenRouter** para todos los clientes (centralizada)
- El margen del servicio es muy alto: costo real ~$0-3/mes, precio al cliente $300/mes

### Actualización del servidor MCP

Cuando OB1 (el repositorio base) publique actualizaciones importantes:

```bash
# Para un cliente específico
cd BrainOS-[nombre-cliente]
supabase link --project-ref PROJECT_REF

# Descargar nueva versión del servidor
curl -o supabase/functions/BrainOS-mcp/index.ts \
  https://raw.githubusercontent.com/NateBJones-Projects/OB1/main/server/index.ts

# Verificar cambios antes de desplegar
diff supabase/functions/BrainOS-mcp/index.ts [version-anterior]

# Desplegar actualización
supabase functions deploy BrainOS-mcp --no-verify-jwt
```

**Política de actualizaciones:**
- Actualizaciones de seguridad: desplegar inmediatamente en todos los clientes
- Nuevas features: notificar a Victor antes de desplegar
- Cambios de schema (base de datos): requieren aprobación de Victor y notificación al cliente

---

## Sección 5 — Troubleshooting

### Los 6 problemas conocidos

| # | Síntoma | Causa raíz | Solución |
|---|---------|-----------|----------|
| **1** | `Relative import path not prefixed with / or ./` en el deploy | El `index.ts` descargado tiene imports sin prefijo `npm:` compatible con Deno | Verificar que el archivo descargado de OB1 ya tenga los prefijos correctos. Si fue editado manualmente, restaurar desde el repositorio. |
| **2** | MCP responde `{"error":"Unauthorized"}` o `401` | El secret se guardó como `MCP-ACCESS-KEY` (guiones medios) en lugar de `MCP_ACCESS_KEY` (guiones bajos) | En Supabase → Settings → Secrets → verificar nombre exacto. Si es incorrecto, eliminar y crear de nuevo con guiones bajos. |
| **3** | Claude dice `Could not find the table 'public.thoughts'` | El SQL del Paso 2 no fue ejecutado, o falló silenciosamente con un error | Ir a Table Editor → verificar si existe `thoughts`. Si no, ejecutar el SQL completo de nuevo desde un archivo de texto externo. |
| **4** | Logs muestran `OAuth discovery 401` | El endpoint de OAuth discovery no está configurado como público | **No es un error real.** El servidor MCP usa key-based auth, no OAuth. Ignorar este log. |
| **5** | El SQL se ejecuta sin errores pero la tabla no aparece o tiene estructura incompleta | El editor del browser de Supabase corrompió caracteres como `$$` o comillas simples al tipear/pegar | Copiar el SQL a un editor de texto externo (VS Code, etc), copiarlo desde ahí al clipboard, y pegarlo con Cmd+V (nunca tipear directo en el browser SQL Editor). |
| **6** | `Permission denied for table thoughts` al usar `capture_thought` | Falta el `GRANT` del último bloque SQL | Ejecutar solo en el SQL Editor: `grant select, insert, update, delete on table public.thoughts to service_role;` |

### Diagnóstico rápido de incidentes

Cuando un cliente reporta que su BrainOS no funciona, seguir este árbol:

```
¿Claude puede ver el conector BrainOS?
│
├── NO → El conector se desactivó o se borró en Claude Desktop
│         → Pedir al cliente que verifique en Settings → Connectors
│         → Si fue borrado, reenviar Connection URL para reconectar
│
└── SÍ → ¿El conector retorna error o no responde?
         │
         ├── Error 401 → Problema de autenticación
         │   → Verificar que Connection URL del cliente tiene el ?key= correcto
         │   → Verificar secret MCP_ACCESS_KEY en Supabase (guiones bajos)
         │
         ├── Error 500 → Error interno del servidor
         │   → Revisar logs en Edge Functions → BrainOS-mcp
         │   → Posibles causas: OPENROUTER_API_KEY inválida o sin crédito
         │
         ├── Tool no encontrado → La función no está desplegada
         │   → Verificar en Supabase → Edge Functions que existe BrainOS-mcp
         │   → Si no existe, re-ejecutar el deploy del Paso 4
         │
         └── Conector "activo" pero no guarda thoughts → Problema de tabla
             → Verificar que la tabla thoughts existe en Table Editor
             → Si no existe, ejecutar el SQL del Paso 2
```

### Protocolo de escalación

| Severidad | Descripción | Tiempo de respuesta | Escalar a |
|-----------|-------------|--------------------|-----------|
| **P1 — Crítico** | Cliente sin servicio, ninguna operación funciona | < 2 horas | Victor directamente |
| **P2 — Alto** | Degradación parcial (ej. búsqueda no funciona, captura sí) | < 24 horas | Equipo técnico → Victor si >4h sin solución |
| **P3 — Medio** | Comportamiento inesperado sin pérdida de funcionalidad | < 72 horas | Equipo técnico |
| **P4 — Bajo** | Dudas, preguntas, mejoras | Próxima sesión disponible | Equipo técnico |

---

## Sección 6 — Offboarding de Cliente

Cuando un cliente termina su contrato o solicita la soberanía de sus datos:

### Opción A — Entrega del proyecto al cliente

El cliente quiere mantener su BrainOS pero operarlo él mismo:

1. Exportar todos los thoughts como CSV:
   - Supabase → Table Editor → `thoughts` → Export CSV
   - Guardar en el Credential Tracker del cliente

2. Cambiar el owner del proyecto Supabase:
   - Settings → Members → Invite al email del cliente como Owner
   - Una vez que el cliente acepta, removerlo de la organización EmpowerLabs

3. Documentar en el Credential Tracker: `Estado: Entregado — [fecha]`

4. El cliente deberá configurar su propia OpenRouter API Key en los secretos

### Opción B — Cierre y eliminación de datos

El cliente no quiere continuar y no necesita sus datos:

1. Exportar backup como en Opción A (para registro interno de EmpowerLabs)
2. En Supabase → Settings → General → **Delete Project**
3. Confirmar la eliminación
4. Actualizar Credential Tracker: `Estado: Offboarded — [fecha]`
5. Archivar las credenciales (no eliminar — pueden necesitarse para disputas o auditoría)

---

## Sección 7 — Gestión de OpenRouter (Cuenta Centralizada)

EmpowerLabs opera con **una sola cuenta de OpenRouter** cuya API Key se usa para todos los proyectos de clientes.

### Por qué es seguro usar una clave centralizada

La OpenRouter API Key vive en los secretos de Supabase de cada proyecto — no la tiene el cliente, no está expuesta en ninguna URL pública, y solo el servidor MCP en Supabase la usa internamente.

### Monitoreo de costos de OpenRouter

1. Ir a [openrouter.ai/usage](https://openrouter.ai/usage)
2. Revisar el consumo mensual total
3. Comparar con el número de clientes activos para detectar uso anómalo
4. Mantener un mínimo de $10 de crédito disponible siempre

**Alerta:** Si el consumo de embeddings supera $5/mes, revisar si algún cliente está haciendo capturas masivas o si hay alguna integración en loop.

### Política si se compromete la clave

1. Ir a OpenRouter → revocar la clave comprometida
2. Generar nueva clave
3. Actualizar el secret `OPENROUTER_API_KEY` en **todos** los proyectos de clientes:
   ```bash
   supabase secrets set OPENROUTER_API_KEY=NUEVA_KEY --project-ref PROJECT_REF_CLIENTE
   ```
4. Hacer redeploy de las Edge Functions de todos los clientes

---

## Sección 8 — Backups y Continuidad

### Política de backups

| Tipo | Frecuencia | Responsable | Dónde se guarda |
|------|-----------|-------------|-----------------|
| **Supabase automático** | Diario (Plan Pro) / Sin backup en Free Tier | Supabase | Dashboard → Backups |
| **Export manual CSV** | Mensual o ante cambios mayores | Equipo de sistemas | Credential Tracker del cliente |
| **Backup pre-offboarding** | Antes de cada cierre | Equipo de sistemas | Registro interno EmpowerLabs |

**Importante:** El Free Tier de Supabase no incluye backups automáticos. Si un cliente tiene datos críticos y alto volumen, considerar upgrade a Pro (~$25/mes).

### Plan de contingencia ante fallo de Supabase

Si Supabase tiene una caída de servicio (ver [status.supabase.com](https://status.supabase.com)):

1. Notificar a Victor para que comunique a los clientes afectados
2. Los clientes pueden seguir usando Tu Sherpa IA en modo L1 (Prompt Portable) mientras tanto
3. No hacer nada más — el servicio se restaura automáticamente cuando Supabase vuelve

---

## Apéndice A — Instrucciones de Conexión para el Cliente

> *Copiar y enviar al cliente cuando el BrainOS esté listo. No incluir nada más.*

---

**Tu BrainOS está listo. Para conectarlo:**

1. Abrir **Claude Desktop** en tu computadora
2. Hacer click en el ícono **+** en la parte inferior izquierda → **Add MCP Server**
3. En el campo URL, pegar exactamente:

```
[CONNECTION_URL_DEL_CLIENTE]
```

4. En el campo Nombre, escribir: `BrainOS`
5. Guardar y activar el toggle

**Verificar que funciona:**
En cualquier conversación de Claude, escribe:
```
Usa la herramienta thought_stats para decirme cuántos thoughts tengo
```

Si Claude responde con un número (probablemente 0 al inicio), tu BrainOS está conectado y listo.

**Guarda bien esta URL** — es todo lo que necesitas para reconectar si cambias de computadora.

Para soporte: victor@masterplaybooks.com

---

## Apéndice B — Glosario Técnico

| Término | Definición |
|---------|-----------|
| **BrainOS** | La base de datos vectorial que actúa como memoria persistente del Sherpa IA |
| **Thought** | Una unidad de memoria: decisión, aprendizaje, compromiso o contexto capturado |
| **Embedding** | Representación matemática del significado de un texto (vector de 1536 números) |
| **MCP** | Model Context Protocol — el protocolo estándar que permite a Claude usar herramientas externas |
| **Edge Function** | Código que corre en los servidores de Supabase, actúa como el servidor MCP |
| **Project Ref** | El identificador único de un proyecto Supabase (string de ~20 caracteres) |
| **Service Role Key** | La clave maestra de Supabase — acceso total a la base de datos. Uso exclusivo interno |
| **MCP Access Key** | La clave que usa el servidor MCP para autenticar las peticiones de Claude |
| **Connection URL** | La URL completa con el `?key=` que el cliente pega en Claude Desktop |
| **RLS** | Row Level Security — capa de seguridad de Supabase que controla acceso a filas |
| **pgvector** | Extensión de PostgreSQL que habilita la búsqueda vectorial (semántica) |
| **OpenRouter** | Servicio que provee acceso a modelos de embeddings (y otros modelos de IA) |
| **Track A** | Modelo de instalación donde EmpowerLabs opera toda la infraestructura |
| **Track B** | Modelo de instalación donde el cliente instala su propio BrainOS |

---

## Registro de versiones

| Versión | Fecha | Cambio |
|---------|-------|--------|
| v1.0 | 2026-03-23 | Creación inicial. Cubre provisioning completo, operación, troubleshooting, offboarding, costos y apéndices. Basado en aprendizajes de FI-SHA-VICTOR (Caso 0) y SHA-GuiaInstalacion-v01. |

---

*[[SHA-SOP-SysOps-v01]] v1.0 — EmpowerLabs / Victor Heredia — 2026-03-23*
*Documento interno. No compartir con clientes.*
*Actualizar después de cada incidente relevante o cambio de arquitectura.*
