Session Wrap (cierre consciente del proyecto)
Dos partes: §1 es universal; §2 se bifurca por proyecto (las tablas de estado son específicas de cada proyecto — nunca escribir las tablas de un proyecto para otro). §0 = latido a mitad de sesión (abajo). <MEM> = el directorio de memoria que imprime bash ~/.claude/hooks/session-resume.sh --dir.
Redactar antes de CUALQUIER guardado (latido, memoria de transferencia, archivos de reglas/ahora, filas de BD, mensaje de reanudación): eliminar claves API, tokens, contraseñas, claves privadas, números y saldos de cuentas, datos personales, cualquier cosa que identifique cuentas reales. Escribir <REDACTED — ver bóveda> o parafrasear ("saldo activo verificado, no registrado aquí"). Nombrar DÓNDE vive el valor real está bien; el valor no. Mismo patrón que la regla de paráfrasis de protección en §2 — mantener ambas.
0. Punto de control de latido — A MITAD DE SESIÓN (solo memoria de transferencia)
Después de cada subtarea completada, y ANTES de cualquier paso largo/arriesgado (refactorización grande, despliegue, migración de BD), actualizar SÓLO el archivo de transferencia §1 del proyecto actual (crearlo si no existe): un bloque ## LIVE STATE (latido) — qué acaba de finalizar, qué está en curso, el siguiente paso. Reemplazar el bloque anterior, nunca añadir; objetivo <15 líneas escritas. Mantener el encabezado exacto: el hook lo reconoce.
- NO reetiquetar
MEMORY.md, tocar ninguna base de datos, ni emitir el mensaje de reanudación — esos se quedan para el final de la sesión (§1 etiquetar, §2, §3). Al cerrar, fusionar el bloque en el estado verificado y eliminarlo. - Un bloqueo en cualquier punto ahora cuesta como máximo un paso de memoria.
session-resume.shlista todos los archivos de transferencia que aún contienen el bloque comoUNWRAPPED HEARTBEATal iniciar, por lo que un archivo de primer latido sin etiquetar aún se encuentra.
1. Memoria de transferencia — SIEMPRE (cualquier proyecto)
Escribir/actualizar <MEM>/proyecto_<proy>_transferencia_<AAAAMMDD>.md: estado verificado (SHAs clave, qué se ha implementado, DECISIONES abiertas, próximo trabajo ordenado, mandatos). En <MEM>/MEMORY.md, etiquetar su línea de índice ★LEER PRIMERO PARA <PROYECTO> (actual)★; marcar la anterior como "(reemplazada)". Las transferencias antiguas permanecen en disco: la cadena de reemplazos es el historial del proyecto.
- El hook SessionStart
~/.claude/hooks/session-resume.shes INDEPENDIENTE DEL PROYECTO: inyecta CADA línea que coincida conLEER PRIMERO PARA <CUALQUIER-PROYECTO>que no esté marcada como reemplazada → etiquetar la línea ES la garantía de reanudación para CUALQUIER proyecto (no se necesita un hook por proyecto). Mantener el hook aunque MEMORY.md se cargue automáticamente: añade la instrucción "leer la transferencia ANTES de trabajar", funciona desde cualquier directorio, y sobrevive a que MEMORY.md supere el límite de carga de 200 líneas. También advierte cuando un proyecto tiene dos punteros activos o un puntero a un archivo faltante — corregir esos al cerrar.
Las reglas se transmiten. Cualquier nueva regla del propietario, guía permanente, comando de trabajo o lección pagada va al archivo de reglas de carga siempre de ese proyecto en el momento en que se da, no solo en una transferencia. Archivo de reglas: <MEM>/<proy>_reglas.md, forzado a cargar completo por session-resume.sh para cada proyecto listado en <MEM>/session-wrap.conf. Mantenerlo breve; reemplazar en lugar de añadir. Verificar al cerrar: cualquier cosa que el propietario haya tenido que repetir esta sesión ahora debe estar ahí. También reescribir <MEM>/<proy>_ahora.md (estado actual y próximos pasos, mantener breve: el contexto del hook se corta aproximadamente a 10 000 caracteres).
2. Sincronización del almacén de estado del proyecto — ENRUTAR primero
Detectar el proyecto desde el directorio de trabajo / el trabajo de esta sesión. Luego seguir la ruta de ese proyecto. Añadir una ruta ### por cada proyecto que poseas; las tres siguientes son los patrones.
<proyecto con almacén Postgres> → su propia base de datos
Conectar con credenciales del entorno (psql "$PROJECT_DB_URL"), nunca un literal en el comando. Tablas de ejemplo en examples/state-store.sql:
INSERT INTO session_handoff (session_id, handoff_prompt, created_at) VALUES ('<sid>','<resume>',now());
INSERT INTO decisions (title,rationale,applies_to,status,session,"timestamp",decided_at)
VALUES ('<d>','<why>','<project>','implemented','<sid>',now()::text,now()); -- un INSERT por fila
INSERT INTO code_map (module,path,lines,purpose,bounded_context) VALUES (...); -- DELETE la ruta primero si no hay restricción única
PELIGROS (escribe los tuyos aquí; estos son los que cuestan una sesión cada uno): entrecomillar columnas con nombres de palabras clave (decisions."timestamp"; requerido para palabras reservadas como "order", inofensivo en otros casos) y tener en cuenta su tipo (esta es texto + NOT NULL, por lo tanto now()::text); una columna con restricción CHECK solo acepta sus valores listados (pending|implemented|superseded|deferred|rejected); no asumir que una tabla existe — usar \d primero; VALUES de varias filas es atómico, por lo que una fila mala las elimina todas → hacerlo por fila con -v ON_ERROR_STOP=off. Falso positivo de protección: un hook PreToolUse que bloquea comandos peligrosos examina TODO el comando Bash — si tu texto SQL contiene un patrón bloqueado literal (reset --hard, git push, git clean), todo el comando queda BLOQUEADO. Parafrasear dichas cadenas en el texto de transferencia/decisión (p. ej. "git destructivo" no el literal).
→ su propio almacén (NO de otro proyecto)
VERIFICAR el esquema antes de escribir; las notas sobre él se vuelven obsoletas. Infraestructura en vivo — el sistema de registro externo (proveedor de pagos, BD de producción, el servicio en ejecución) es la verdad, no la transferencia; nunca cambiar una bandera o configuración en vivo como parte de un cierre.
<todo lo demás> → solo memoria
Sin almacén de estado en BD — la memoria de transferencia §1 ES el registro. Anotar esto; no escribir las tablas de ningún otro proyecto.
3. Emitir el PROMPT DE REANUDACIÓN (el último artefacto — lo que el usuario pega en el próximo Claude)
Después de guardar, GENERAR una copia con formato de bloque del prompt para la próxima sesión. El hook SessionStart ya inyecta el puntero de transferencia, por lo que este prompt solo añade: comprobaciones de recarga + la(s) DECISIÓN(ES) abierta(s) que el usuario debe tomar. Plantilla:
Reanudar <proyecto>. Leer memoria <archivo-transferencia> primero, luego skill /<skill-mapa-proyecto>.
Estado verificado: <1 línea: SHA clave + qué está activo + lo bloqueado/limitado>.
Primero: 1) /context — <cualquier comprobación de recarga, p. ej. medir costo del plugin recién cargado>; 2) <comprobación de confirmación de carga>.
Luego mi decisión sobre <BIFURCACIÓN ABIERTA>: [ELEGIR UNA] (a) <rec> (b) … (c) …
<tus instrucciones permanentes por sesión, p. ej. verificar antes de declarar terminado>
Mantenerlo CORTO — punteros + decisiones, no un volcado de estado (el estado vive en la memoria de transferencia + BD; no duplicar → contaminación del contexto). También pegar este prompt en la memoria de transferencia bajo un encabezado ## PROMPT DE REANUDACIÓN para que sea consultable, no perdido en el chat.
Finalización (verificar, citar resultados)
- Compuerta de conciliación — ejecutar PRIMERO, obligatoria. Escanear toda la conversación (no solo la memoria) y listar cada decisión, elemento abierto, corrección del propietario y mandato de esta sesión. Para CADA UNO, citarlo + dónde ha quedado (línea en la memoria de transferencia, línea en el archivo de reglas, o fila en la BD) o marcar
DESCARTADO: <motivo de una línea>. "Creo que está cubierto" no está permitido — señalar la línea o marcarlo como descartado. Cualquier cosa no contabilizada → escribirla ahora (refrescar §3 si una DECISIÓN abierta cambió), luego volver a listar. - §1: la línea de MEMORY.md de la memoria de transferencia lleva
(actual); la anterior marcada como reemplazada;grep -c 'LIVE STATE (latido)' <transferencia>= 0. - §2: para un proyecto con BD,
SELECT max(created_at) FROM session_handoff;≈ ahora + los recuentos de filas que escribiste. Para solo memoria, decirlo. - §3: el prompt de reanudación está emitido Y guardado en la memoria de transferencia.