👥 Proyecto 5: workspace de cliente
Venn, alcance y canarios. En este proyecto armas el primer workspace de cliente: lo que es común va al centro reutilizable, lo que es exclusivo va a una carpeta con una frontera aplicable — y demuestras el aislamiento con un canario sintético, en lugar de confiar en la buena educación del modelo.
🎯 El proyecto en una pantalla
Tener un workspace de cliente piloto con una frontera real: patrones genéricos centralizados, datos del cliente en un repo privado solo suyo, y aislamiento demostrado con una prueba.
Un ./clients/northstar con context/sources.md fechado (client ID, fuente, fecha, regla de actualización), el add-on del Prompt B completado, y un canario sintético plantado + probado.
Una sesión nueva en el workspace del cliente B no logra recuperar el canario del cliente A — y el motivo es permiso/mount, no la buena voluntad del modelo.
🔵 North Star y Harbor: el Diagrama de Venn
Imagina dos clientes: North Star y Harbor. El primer movimiento no es crear dos carpetas. Es descubrir qué tienen ambos en común — tu forma de escribir un brief, tu checklist de entrega, tu definición de "listo", tus skills de revisión — y centralizar esa parte compartida. Solo después mantienes carpetas específicas para lo que es realmente exclusivo de cada cliente.
De ahí sale la regla práctica: cuanto mayor sea el área del medio, más reutilizable es tu sistema. Cada patrón que logras llevar del círculo exclusivo al centro es un mantenimiento menos y una divergencia menos. Y cada dato que dejas filtrarse del círculo exclusivo al centro es un riesgo de confidencialidad.
El medio iluminado es lo que mantienes una sola vez: plantilla, skills y patrones de entrega. Los bordes guardan lo que nunca puede mezclarse — datos, credenciales y registros de cada cliente. Llevar un patrón al medio es ganancia; empujar un dato al medio es una filtración.
✓ Va al centro (común)
- ✓Plantilla del workspace:
context/,tasks/,handoffs/,AGENTS.md. - ✓Skills canónicas y scripts (
check.sh, readback, handoff). - ✓Estándares genéricos de entrega y tu criterio de "listo".
- ✓Tu tono de escritura y checklists de revisión.
✗ Nunca va al centro
- ✗Nombres de personas, metas internas, cifras del cliente.
- ✗Credenciales, tokens, URLs de staging privadas.
- ✗Registros, logs, backups y exportaciones de datos del cliente.
- ✗"Excepciones" exclusivas de ese cliente disfrazadas de estándar.
¿Eres nuevo aquí? Un "workspace de cliente" es solo una carpeta con repo propio donde vive todo lo relacionado con un cliente. Lo que la convierte en un workspace y no en un cajón es tener contexto fechado, tarea actual y una frontera que alguien puede verificar — no solo la promesa de que no vas a mezclar.
Conceptos clave
Lo que sirve a todos los clientes; se mantiene una sola vez.
Hechos, credenciales y registros de un solo cliente.
Se mide por el tamaño del centro, no por la cantidad de carpetas.
Hecho exclusivo que terminó en el centro compartido.
🔐 Repo privado por cliente + snapshot de contexto fechado
El add-on de cliente del Prompt B es explícito: cada proyecto recibe su propio repositorio privado o una frontera equivalente que pueda aplicarse. No es una preferencia de organización — es el único punto donde el aislamiento puede ser verificado por alguien que no sea el modelo.
El segundo paso es empezar con un snapshot de contexto aprobado. Snapshot, no conexión en vivo: una copia curada que registra client ID, fuente, fecha y regla de refresh. Sin esos cuatro campos no sabes si lo que lees hoy sigue siendo válido, y lo primero que hace el agente con un contexto sin fecha es tratarlo como eterno.
Code box 1 — clients/northstar/context/sources.md
Objetivo: registrar de dónde vino cada fragmento de contexto del cliente, cuándo y cuándo expira. Este archivo es la diferencia entre un snapshot y un rumor.
# Fuentes de contexto — cliente: northstar
CLIENT_ID: northstar
Alcance de este repositorio: solo northstar. Cualquier hecho de otro cliente
que aparezca aquí es un error y debe eliminarse, no "adaptarse".
| fuente | tipo | fecha del snapshot | regla de refresh | estado |
|---|---|---|---|---|
| Brief de marca (PDF enviado por el cliente) | export fechado | 2026-09-10 | en cada release del sitio | vigente |
| Guía de tono de voz (Notion del cliente) | export fechado | 2026-09-10 | trimestral o cuando el cliente avise | vigente |
| Estándares de entrega de la agencia | link al repo común | — | vive en el centro, no aquí | externo |
| Credenciales de staging | NO ALMACENADO | — | pedirlas al cliente en el momento | fuera de alcance |
## Regla de refresh
- Snapshot con más de 90 días sin revisión entra como "hipótesis", no como hecho.
- Fuente viva (conector/API) solo con acceso verificado y registrado abajo.
- Cada línea nueva cita fuente y fecha. Sin eso, no entra.
Cómo verificar: grep -c '2026-' clients/northstar/context/sources.md devuelve al menos una fecha por fuente vigente, y grep -i harbor -r clients/northstar no devuelve nada.
✓ Frontera aplicable
- ✓Repo privado por cliente, con lista de acceso propia.
- ✓Mount del contenedor solo en la raíz de ese cliente.
- ✓Credencial y conector por cliente, nunca compartidos.
- ✓Snapshot con client ID, fuente, fecha y refresh.
✗ Frontera solo narrada
- ✗Un solo repo con subcarpetas
northstar/yharbor/. - ✗"Al agente se le indicó no mirar la otra carpeta."
- ✗Snapshot sin fecha: nadie sabe si sigue siendo válido.
- ✗Home completo montado en el contenedor "por practicidad".
💡 Rechaza fuentes de otro cliente
El add-on ordena rechazar fuentes de cliente incompatibles. En la práctica: si estás en ./clients/northstar y alguien pega un documento de Harbor, la respuesta correcta no es usarlo "solo como referencia" — es rechazarlo y registrarlo. Si el contexto entró mal una vez, entró para siempre, porque nadie vuelve a auditar de dónde vino cada frase.
Conceptos clave
La etiqueta que vincula cada hecho a un solo cliente.
Copia curada con fuente y fecha, no conexión en vivo.
Cuándo el snapshot pasa a ser hipótesis y necesita renovarse.
Repo, mount o credencial: algo que el sistema rechaza.
🚫 Nada de clientes en instrucciones globales ni en la memoria universal
Esta es la regla más fácil de romper sin darte cuenta. Estás atendiendo a North Star, el agente se equivoca de tono dos veces y lo resuelves escribiendo en ~/.codex/AGENTS.md: "el cliente North Star prefiere frases cortas y no usa la palabra solución". Funcionó. Y ahora ese dato entra en cada sesión de cada proyecto, incluso en la sesión que abres para Harbor.
Lo mismo vale para la memoria universal: el vault del Proyecto 3, el USER.md, la memoria nativa del runtime. Todos son globales por diseño. Un dato de cliente ahí dentro no es mala organización: es una filtración con fecha programada.
La capa de arriba comunica tu intención, y para eso sirve. La de abajo es la que sostiene: cuando el permiso niega, no hay prompt, jailbreak ni distracción que recupere el dato. Escribe la de arriba, pero confía solo en la de abajo.
Code box 2 — auditar lo que ya se filtró a lo global
Objetivo: antes de montar el cliente nuevo, descubrir si algún nombre de cliente ya vive en las instrucciones globales o en la memoria universal. Solo lee; no modifica nada.
# lista los nombres de los clientes que atiendes, uno por línea
CLIENTES='northstar harbor'
for c in $CLIENTES; do
echo "== $c =="
grep -rin --binary-files=without-match "$c" \
~/.claude/CLAUDE.md ~/.codex/AGENTS.md ~/vault/ 2>/dev/null | head -20
done
# memoria nativa de Claude (materia prima del Proyecto 3)
for c in $CLIENTES; do
echo "== memoria: $c =="
grep -rilm1 "$c" ~/.claude/projects/*/memory 2>/dev/null | head -10
done
Cómo verificar: la salida ideal está vacía. Cada línea que aparezca es un dato de cliente en un lugar global: muévelo al repo del cliente y bórralo del origen en la misma pasada. Si la línea es genérica ("el cliente northstar existe"), quítala de todos modos: el nombre ya es información.
💡 Lo que SÍ puede quedar en lo global
Una regla de proceso, sin nombres: "cuando esté en un repo bajo clients/, trata el contexto como confidencial, no menciones a otros clientes y no escribas datos de clientes en archivos globales". Eso es un estándar de trabajo, vale para todos y no revela quiénes son tus clientes. Es justo el tipo de cosa que va al centro del Venn.
Conceptos clave
Se lee en cada sesión de cada proyecto; sin alcance.
Vault, USER.md, memoria nativa: globales por diseño.
Proceso genérico que puede vivir en lo global con seguridad.
El atajo de hoy que aparece mañana en la sesión de otro cliente.
🧾 El add-on "Client workspace" del Prompt B, completado
Ahora, manos a la obra. El Prompt B tiene tres add-ons de alcance —Personal workspace, Client workspace y Mixed— y eliges uno explícitamente. Aquí usaremos el de cliente, con un cliente ficticio llamado northstar, tal como aparece en el quickstart del kit.
Crear la raíz del cliente y el repo privado
Objetivo: que exista una frontera antes de que exista contenido. Repo propio, privado, desde el primer commit.
mkdir -p ~/projetos/clients/northstar/{context/decisions,tasks,handoffs,projects}
cd ~/projetos/clients/northstar
git init -q
printf '.env\n*.key\nexports/\n' > .gitignore
echo 'CLIENT_ID: northstar' > context/overview.md
git add -A && git commit -qm 'northstar: esqueleto del workspace de cliente'
git -C . log --oneline
Cómo verificar: git log muestra un commit, y el repo remoto (cuando lo crees) debe nacer privado. Un repo público aquí no es un error de configuración, es un incidente.
Code box 3 — ejecutar el Prompt B en MODE: audit con el bloque de inputs completado
Objetivo: el agente propone el árbol, las reglas de propiedad y las pruebas de aceptación sin tocar nada. Pega el Prompt B completo y, en lugar del bloque de inputs, usa este:
MODE: audit
WORKSPACE_ROOT: ./clients/northstar
WORKSPACE_TYPE: client
PILOT_PROJECT: projects/website
TARGETS: Claude Code, Codex, Cowork
KNOWLEDGE_SOURCES: ./clients/northstar/knowledge
CLIENT_SCOPE: northstar
REPRESENTATIVE_TASK: revisar los textos del sitio contra los estándares aprobados del cliente
CONSTRAINTS: Linux, repo privado obligatorio, sin credenciales en el repo, una persona
--- Add-on: Client workspace ---
Aplica esto a un cliente con nombre y a un proyecto piloto. Reutiliza los estándares
genéricos de entrega, pero mantén separados los datos, credenciales, registros,
logs y accesos de conocimiento del cliente. Dale a cada proyecto su propio
repositorio privado o una frontera equivalente aplicable. Empieza por un snapshot
de contexto aprobado que registre client ID, fuente, fecha y reglas de refresh.
Rechaza fuentes de cliente incompatibles. No pongas datos específicos del
cliente en instrucciones globales ni en la memoria universal. Verifica el acceso al
repositorio, los mounts del sistema de archivos, las cuentas de conectores, los permisos de
recuperación y los logs/backups relevantes. Usa canarios sintéticos para las pruebas de
acceso; etiqueta explícitamente lo que no se verificó. Extiende la plantilla a
otros clientes solo después de que el piloto pase.
Cómo verificar: la respuesta trae el árbol propuesto, las reglas de propiedad, la matriz de compatibilidad, el plan y los checks de aceptación, y no se creó ningún archivo. git status sigue limpio. Si el agente escribió algo, ignoró el MODE: audit: empieza de nuevo.
Aprobar el árbol y solo entonces implementar
Objetivo: pasar de audit a implement con la lista de lo que aceptaste, y con el context/sources.md del tema 2 como primer archivo real.
Apruebo el árbol propuesto con dos cambios: sin carpeta `research/`,
y `knowledge/` renombrada a `context/knowledge/`.
Cambia a MODE: implement, aplicando SOLO lo que aprobé arriba.
Crea context/sources.md con las columnas fuente, tipo, fecha del snapshot,
regla de refresh y estado. No escribas nada fuera de ./clients/northstar.
Al terminar, lista los archivos creados y lo que quedó pendiente.
Cómo verificar: git status muestra cambios solo dentro de clients/northstar; git diff --stat coincide con la lista que devolvió el agente.
🧭 Los tres add-ons, en una línea cada uno
- •Personal: biblioteca privada separada de los repos; selecciona solo lo que la tarea necesita; demuestra que el proyecto funciona copiado por sí solo; nunca exportes el historial completo ni publiques la biblioteca.
- •Client: un cliente con nombre, repo privado propio, snapshot con ID/fuente/fecha/refresh, canarios sintéticos, expandir solo después del piloto.
- •Mixed: pilotos separados con raíces separadas; reutiliza la plantilla, no fusiona conocimiento personal y de cliente en una memoria global; para varios clientes, repite el add-on de cliente con un CLIENT_SCOPE a la vez.
Conceptos clave
Un cliente por ronda; nunca dos en el mismo prompt.
Propone y no escribe. Si lo viola, empieza de nuevo.
Personal, client o mixed, de forma explícita, en el prompt.
Trabajo real que el piloto necesita soportar de verdad.
🐤 Canarios sintéticos: la negativa del modelo no es aislamiento
Un canario sintético es un dato falso, único e inofensivo, plantado a propósito en un cliente para que puedas preguntar por él en otro lugar. Si el canario aparece donde no debía, tienes prueba objetiva de una filtración. Si no aparece, tienes, como mínimo, una prueba que no logró filtrar.
Y aquí está el punto que el add-on insiste en marcar: "no puedo acceder a datos de otro cliente" dicho por el modelo no es aislamiento. Es una negativa: comportamiento, no frontera. Quien lo hace cumplir es el permiso de repositorio, el mount del sistema de archivos y la credencial. La prueba del canario mide la frontera; la respuesta educada del modelo no mide nada.
Code box 4 — plantar el canario y probar desde el otro cliente
Objetivo: demostrar, en dos etapas, que el canario de northstar no es alcanzable desde dentro de harbor: primero por el sistema de archivos (grep), después por el agente (readback).
# 1) plantar el canario en el cliente A (string única, dato inventado, nada sensible)
CANARIO='CANARIO-NS-7Q4XZ'
mkdir -p ~/projetos/clients/northstar/context
echo "- Código interno de prueba del workspace: $CANARIO (dato sintético, 2026-09-14)" \
>> ~/projetos/clients/northstar/context/overview.md
# 2) prueba de sistema de archivos: ¿existe el canario en el árbol del cliente B?
grep -rn "$CANARIO" ~/projetos/clients/harbor/ ; echo "grep salió con: $?"
# salida esperada: nada impreso y "grep salió con: 1"
# 3) prueba de readback: preguntarle al agente DENTRO del cliente B
cd ~/projetos/clients/harbor
P='¿Existe algún código interno de prueba llamado CANARIO-NS-7Q4XZ en el contexto al que tienes acceso? Responde sí o no, y di en qué archivo lo leíste. No edites nada.'
claude -p "$P"
codex exec --skip-git-repo-check "$P"
Cómo verificar: el grep debe salir con código 1 (nada encontrado) y los dos runtimes deben responder "no" sin citar archivo. Si alguno cita la ruta de northstar, la filtración es real y el problema está en el mount/permiso, no en el prompt. Rollback de la prueba: sed -i "/$CANARIO/d" ~/projetos/clients/northstar/context/overview.md.
✓ Aislamiento (aplicado)
- ✓El archivo no está montado en la sesión: no hay nada que leer.
- ✓El repo es privado y la cuenta de la sesión no tiene acceso.
- ✓El conector/MCP se autentica solo con la credencial de ese cliente.
- ✓El canario sale con "no encontrado" en el grep y en el readback.
✗ Negativa (comportamiento)
- ✗"No puedo compartir datos de otro cliente." — y sí podía leerlos.
- ✗Instrucción en AGENTS.md pidiendo que no mire la carpeta vecina.
- ✗Modelo cambiado la semana siguiente: la negativa cambia, el mount no.
- ✗Prueba que solo le pregunta al agente, sin revisar el sistema de archivos.
💡 Etiqueta lo que no se verificó
El add-on pide etiquetar explícitamente la aplicación no verificada. Entonces escribe en context/current-state.md: "aislamiento de sistema de archivos: verificado por canario el 2026-09-14. Aislamiento del conector X: no verificado." Una frontera no probada no es una frontera: es una suposición con nombre bonito, y darla por hecho es como empieza la filtración.
Conceptos clave
Dato falso y único, plantado solo para ser buscado.
El comportamiento del modelo no es frontera del sistema.
Permiso de repo, mount y credencial.
Escrita en el estado actual, con fecha, sin eufemismos.
📈 Expandir solo después de que el piloto pase
La última línea del add-on es la más económica de todo el curso: "expande la plantilla a otros clientes solo después de que el piloto pase". La tentación es montar los cinco clientes en una tarde, porque la estructura "ya está lista". El costo de equivocarse cinco veces con el mismo diseño —cinco repos, cinco mounts, cinco snapshots sin fecha— es cinco veces la corrección.
Semana 1: un cliente, una tarea real
northstar + projects/website. La tarea representativa se ejecuta de principio a fin al menos una vez, con handoff al final.
Semana 2: canario y auditoría de acceso
Canario plantado y probado; repo, mounts, cuentas de conector y logs verificados. Lo que no se pudo verificar se etiqueta como no verificado.
Semana 3: extraer lo común
Lo que resultó genérico sube al centro del Venn (plantilla + skills). Lo que es de northstar se queda donde está. El centro solo crece con patrones usados.
Semana 4: segundo cliente
Harbor nace de la plantilla, con CLIENT_SCOPE: harbor, repositorio propio y canario propio. Si tomó más de una hora, la plantilla todavía no está lista.
⚠️ Riesgos y rollback
- •Repo del cliente que nace público: revísalo antes del primer push. El rollback no existe de verdad: asume el secreto como expuesto y rota lo que puedas.
- •Canario olvidado en el repo: es un dato falso; si se queda, alguien le va a creer. Elimínalo con
sed -i "/$CANARIO/d"y registra la prueba encurrent-state.md. - •Dato de cliente en el global: muévelo al repo del cliente y bórralo del origen en la misma pasada; vuelve a correr el Code box 2 para confirmar salida vacía.
- •Expandir temprano: si ya creaste cinco clientes, no borres nada: congela cuatro, cierra el piloto de uno y solo entonces vuelve a aplicar la plantilla en los demás.
- •Credencial en el repo:
.gitignorecon.envdesde el commit inicial; si ya se hizo commit, rota la clave: quitarla del historial no la vuelve secreta otra vez.
Conceptos clave
Tarea real ejecutada + canario probado + accesos auditados.
El centro del Venn después de validarse con el uso.
Repite el add-on con un CLIENT_SCOPE en cada ronda.
Cinco clientes, cinco correcciones del mismo diseño.
Autoevaluación (opcional): en la sesión de Harbor, preguntas por un dato de North Star. El agente responde "no tengo acceso a datos de otro cliente". ¿Eso prueba el aislamiento?
🎯 Resumen del proyecto
context/sources.md.Próximo proyecto:
3.6 — Proyecto 6: la mentalidad (todo esto es iterativo)