Skip to content
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
22
36 changes: 30 additions & 6 deletions docs/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@

## ADR-007 — Toda credencial que aparezca en lo limpiado se rota

- **Estado:** ✅ aceptada (2026-09-28)
- **Estado:** ✅ aceptada (2026-09-28) · 📌 momento revisado por
[ADR-036](#adr-036--el-original-se-archiva-al-final-y-la-rotación-va-después-de-publicar)
- **Fecha:** 2026-09-28
- **Decisión:** si alguna ruta eliminada del historial contenía credenciales o
hashes de contraseñas, se rotan aunque la limpieza haya salido bien.
Expand All @@ -106,8 +107,8 @@
- **Decisión:**
- En la raíz queda un `README.md` breve que enlaza a `docs/`.
- `README.md`, `ROADMAP.md`, `TODO.md`, `DECISIONS.md` y `SESSION.md` viven en
`docs/`, partiendo de las plantillas de
`c:\Users\dz\projects\harness\templates\`, y se escriben en español.
`docs/`, partiendo de las plantillas del repo `harness` (privado), y se
escriben en español.
- Lo que se va terminando sale de `docs/` y se registra en
`docs/_archive/roadmap-history.md`.
- **Motivo:** mantener `docs/` limpio. GitHub muestra el `README.md` de la raíz,
Expand Down Expand Up @@ -592,8 +593,8 @@
- `claude/compassionate-planck-gh6aof` entra en `main` con un **merge
normal** («Create a merge commit»), **no con squash**. Los commits llegan a
`main` uno a uno.
- Los **5 commits con autor `Claude <noreply@anthropic.com>`** (`ec8e901`,
`f9d1541`, `2ed0abb`, `8584e93`, `6a67ab3`) **no se rehacen ahora**: su
- Los **5 commits con autor `Claude <noreply@anthropic.com>`** (`c4719b2`,
`8af5641`, `9c583eb`, `1d5b3ca`, `d432c30`) **no se rehacen ahora**: su
autor pasa a `bpstack` en la reescritura de la fase 2, con
`git-filter-repo --mailmap`, la misma pasada que quita los ficheros
privados (`GITCLEAN.md`).
Expand Down Expand Up @@ -705,7 +706,8 @@

## ADR-035 — Se publican dos ramas y el repositorio actual se archiva con otro nombre

- **Estado:** ✅ aceptada (2026-10-05)
- **Estado:** ✅ aceptada (2026-10-05) · 📌 orden revisado por
[ADR-036](#adr-036--el-original-se-archiva-al-final-y-la-rotación-va-después-de-publicar)
- **Fecha:** 2026-10-05
- **Decisión:**
- Se limpian y se publican **solo `main` y
Expand All @@ -729,3 +731,25 @@
nuevo repositorio, GitHub deja de redirigir `bpstack/four-points` al
archivado: un clon viejo sin el `origin` cambiado subiría al público.
- **Revisa:** ADR-026 en las ramas que se publican.

## ADR-036 — El original se archiva al final y la rotación va después de publicar

- **Estado:** ✅ aceptada (2026-10-05)
- **Fecha:** 2026-10-05
- **Decisión:**
- **Orden de la publicación:** renombrar el original a
`four-points-archive`; crear `four-points` privado con el historial
limpio; sustituir los clones locales por clones nuevos (no se cambia el
`origin`); reconectar Vercel y Render, producción y preview; y solo
entonces archivar el original y pasar el nuevo a público.
- **La rotación de credenciales no bloquea la publicación:** se hace
después, en «Después de publicar» de `TODO.md`.
- **El procedimiento de rotación queda fuera del repositorio**, con el
propietario.
- **Motivo:** decisión del propietario. Un repositorio archivado no admite
push: mientras producción despliegue desde el original, tiene que poder
recibir un arreglo urgente. El historial
publicado no contiene credenciales y la BD de producción solo tiene datos de
prueba. El procedimiento describe paneles, equipos y claves concretas que no
sirven a quien lea el repositorio.
- **Revisa:** ADR-035 en el orden; ADR-007 en el momento de la rotación.
39 changes: 28 additions & 11 deletions docs/GITCLEAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,8 @@ el historial.
`claude/compassionate-planck-gh6aof`. Las otras cuatro no tienen ningún commit
fuera de `main` (comprobado el 2026-10-05). Sin tags; las referencias
`pull/*` de GitHub no se publican.
- **Dónde**: `C:\Users\dz\projects\four-points-phase2\`, fuera del
repositorio. `git-filter-repo` 2.47.0 está en
`C:\Users\dz\tools\git-filter-repo` (venv propio, 2026-10-05).
- **Dónde**: una carpeta de trabajo fuera del repositorio, con
`git-filter-repo` 2.47.0 en un entorno virtual propio (2026-10-05).

### Estado (2026-10-05)

Expand All @@ -50,7 +49,7 @@ el historial.
sustitutos que el árbol actual;
- `replacements-names.txt`: nombres del personal. En mayúsculas pasan a
`EMP_01`…`EMP_11`, como el corpus del solver; en el resto, a nombres
inventados (los mismos que el árbol desde `4c6a038`). `Salvador Pérez`
inventados (los mismos que el árbol desde `42f6ac0`). `Salvador Pérez`
se queda como autor;
- `mailmap.txt`: `Claude`, `Azyd` y `bp` pasan a `bpstack` (los tres son
el propietario);
Expand All @@ -61,7 +60,7 @@ el historial.
- `strip-blobs.txt`: los 2 blobs del informe Opera real de ingresos
(`OperaPrint-sample.pdf`, su copia en `backend/test/data/` y el `.txt`
que genera `pdf-parse`), hallado en el barrido de OpenCode y sustituido
en el árbol por una muestra sintética (`a2cfbec`)
en el árbol por una muestra sintética (`c50b09a`)
(`--strip-blobs-with-ids`).
- ✅ Barrido de OpenCode (2026-10-05): no añade secretos ni rutas nuevas;
sí el informe Opera. Su informe escribió en claro la contraseña y el host
Expand All @@ -80,7 +79,7 @@ el historial.
`bpstack` y `GitHub`), pero las puntas no son idénticas: `main` aún no
tenía los arreglos de la rama (nombres, informe Opera) y una regla tocaba
una línea de este documento. Se repite tras fusionar la rama en `main`.
- ✅ Rama fusionada en `main` (PR #9, `289c737`).
- ✅ Rama fusionada en `main` (PR #9, `2d1005a`).
- ✅ Ejecución definitiva en `work.git` (clon nuevo de GitHub, 2026-10-05),
auditada:
- 0 secretos, 0 dominios y nombres reales, 0 restos del informe Opera en
Expand All @@ -92,8 +91,26 @@ el historial.
- **árbol de la punta idéntico** al de GitHub en las dos ramas (`main`
624 → 621 commits; la rama 622 → 619), así que los tests son los mismos
que pasaron en CI con la PR #9.
- ⏳ Publicación
final y publicación (ADR-035).
- ✅ Tercera pasada en `work.git` (2026-10-05), tras fusionar la PR #10, que
generalizó las guías del checklist: las mismas listas, ampliadas con rutas,
reemplazos y mensajes nuevos. Además quita del historial los 2 blobs del
informe Opera, 120 versiones antiguas de las guías del checklist y una
imagen confidencial, y mantiene el renombrado de la guía del F&B. 12
commits quedan vacíos (solo tocaban lo borrado) y se podan: `main` queda en
624 commits y la rama en 621, con el árbol de las dos puntas idéntico al del
repositorio original.
- ✅ Auditoría de la tercera pasada, hecha dos veces por separado (los 4.960
blobs, mensajes y rutas): 0 secretos, 0 datos personales, 0 referencias al
hotel, la cadena o sus socios y 0 rastros de IA en los commits; autoría
`bpstack` y `GitHub`. Comprobar siempre que el volcado de blobs no sale
vacío antes de dar una búsqueda por limpia.
- ✅ Publicación en privado (ADR-035, 2026-10-05): `bpstack/four-points` con
las dos ramas; el original pasa a `four-points-archive`, privado. Vercel y
Render despliegan ya desde el nuevo, en producción y en preview. Las
referencias a commits de los documentos apuntan a los hashes nuevos.
- ⏳ Archivar `four-points-archive`, pasar `four-points` a público y activar
secret scanning y push protection (GitHub no los deja activar en un
repositorio privado gratuito).

## Reglas

Expand Down Expand Up @@ -160,7 +177,7 @@ propietario.
- **Volcados de BD**: `backend/db-mysql/backup/backup_hotel_db_*.sql` (cuatro;
versionados hasta el 2026-10-04, aunque `.gitignore` ya los ignoraba) y los
ya borrados `backup_hotel_db-aiven.sql` y `backup_hotel_db-local.sql`
(commits `dad3cdc`, `f5d47d6` y `7ac45e7`).
(commits `f3d9898`, `d04504f` y `8109e5e`).
- **Scripts con la contraseña de Aiven**, quitados del árbol el 2026-10-04:
`backend/db-mysql/scripts/basics/` (10), `add-libre-number.ts`,
`backfill-libre-numbers.ts`, `set-holidays-2026.ts` y `backup-aiven.sh`.
Expand Down Expand Up @@ -229,8 +246,8 @@ Decidido en ADR-031 (2026-10-04). Se hace en la misma pasada de
`git-filter-repo`, con `--mailmap`; no cambia el contenido de ningún commit.

- **Obligatorio**: los 5 commits con autor `Claude <noreply@anthropic.com>`,
todos de la rama `claude/compassionate-planck-gh6aof` (`ec8e901`, `f9d1541`,
`2ed0abb`, `8584e93`, `6a67ab3`), pasan a `bpstack <contact.bstack@gmail.com>`.
todos de la rama `claude/compassionate-planck-gh6aof` (`c4719b2`, `8af5641`,
`9c583eb`, `1d5b3ca`, `d432c30`), pasan a `bpstack <contact.bstack@gmail.com>`.
Ninguna otra rama tiene commits de ese autor (_comprobado el 2026-10-04_).
- **A confirmar en el paso 2 (Propuesta)**: unificar también `Azyd` y `bp`, los
dos con el mismo correo, en `bpstack`.
Expand Down
42 changes: 16 additions & 26 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ cosa va a `TODO.md`.
| 1 | `docs/` nueva por módulos, escrita desde el código; lo antiguo archivado | — |
| 1b | Lo trascendental de `docs/_archive/` rescatado a `docs/` o a `TODO.md` | 1 |
| 1c | «Antes de publicar» de `TODO.md` resuelto y probado en producción | 1b |
| 2 | Clon con el historial limpio (todas las ramas) + `docs/GITCLEAN.md` | 1c |
| 4 | Repositorio público nuevo con el historial limpio (todas las ramas) | 2 |
| 2 | Clon con el historial limpio (dos ramas) + `docs/GITCLEAN.md` | 1c |
| 4 | Repositorio público nuevo con el historial limpio (dos ramas) | 2 |
| 5 | Demo pública en un entorno aparte, con datos ficticios y reinicio diario | 4 |

El orden lo fija ADR-001, revisado por ADR-022 (fase 1b) y ADR-027 (fase 1c, que
además absorbe la antigua fase 3 de tareas pendientes). ADR-033 limita la 1c a lo
que hay que resolver antes de publicar. La fase 4 sigue ADR-006, ya aceptada.
que hay que resolver antes de publicar. La fase 4 sigue ADR-006, ya aceptada, y
ADR-035 deja en dos las ramas que se publican.

---

Expand All @@ -40,34 +41,23 @@ Lo trascendental de `docs/_archive/` rescatado a `docs/` y `TODO.md`, comprobado
contra el código; `TODO-old.md` vaciado y borrado. Detalle en
`docs/_archive/roadmap-history.md` (local).

## Fase 1c — Resolver «Antes de publicar» y probarlo en producción ← **actual**
## Fase 1c — Resolver «Antes de publicar» ✅ cerrada (2026-10-05)

La sección «Antes de publicar» de `TODO.md`, de 🔴 a 🟢, arreglada y probada en
producción (Render, Vercel y Aiven) antes de tocar el historial (ADR-027,
alcance limitado por ADR-033). Cada punto se borra de `TODO.md` cuando está
hecho y probado. «Después de publicar» queda para el repositorio público.

- **Orden:** primero los fallos transversales de autenticación (hechos), después
las brechas de cada módulo, y al final las decisiones de publicación (licencia
y analítica). Los secretos y datos privados del repo se resuelven en la fase 2.
- **Flujo:** en la rama `claude/compassionate-planck-gh6aof` y su entorno
preview (ADR-030). El agente arregla, verifica y commitea; el propietario hace
push, el agente lo prueba en preview y lo anota en `VERIFY.md`. A `main` entra
por PR con merge commit (ADR-031).
- Hecho al empezar: los 4 volcados de BD fuera del árbol (`git rm --cached` +
`.gitignore`); del historial se quitan en la fase 2.
Las brechas de seguridad arregladas y probadas en producción antes de tocar el
historial (ADR-027, ADR-033), PR #7 a #10. Detalle en
`docs/_archive/roadmap-history.md` (local).

## Fase 2 — Limpieza del historial
## Fase 2 — Limpieza del historial ✅ cerrada (2026-10-05)

Análisis, propuesta, limpieza con `git-filter-repo` y auditoría, sobre un clon y
sin push, **en todas las ramas** (ADR-026). Reglas, procedimiento y candidatos
conocidos en `GITCLEAN.md`; la lista de privados la aprueba el propietario
(ADR-005).
Historial de `main` y `claude/compassionate-planck-gh6aof` reescrito y auditado
(ADR-035). Resultado en `GITCLEAN.md`.

## Fase 4 — Publicación
## Fase 4 — Publicación ← **actual**

Crear el repositorio público y subir el historial limpio de todas las ramas
(ADR-026). Rotar las credenciales que aparezcan en lo eliminado (ADR-007).
El historial limpio está en `bpstack/four-points`, todavía privado, y Vercel y
Render ya despliegan desde él. Falta archivar el repositorio original, pasar el
nuevo a público y activar secret scanning y push protection. La rotación de
credenciales (ADR-007) no bloquea: va en «Después de publicar» de `TODO.md`.

## Fase 5 — Demo pública

Expand Down
69 changes: 28 additions & 41 deletions docs/SESSION.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,58 +7,48 @@
Lo que no encaje aquí es una decisión (a `DECISIONS.md`), un hallazgo (a su
propio fichero) o ruido (se borra).

**Última actualización:** 2026-09-28 · PC principal (`dz`)
**Última actualización:** 2026-10-05

---

## Estado

Preparación del repositorio para publicarlo como open source. Orden de fases en
`ROADMAP.md`; decisiones en `DECISIONS.md` (ADR-001 a ADR-028); procedimiento de
la limpieza del historial en `GITCLEAN.md`. El plan original (`OPEN-SOURCE.md`)
está en `docs/_archive/`.
Fase actual: **4 — Publicación** (`ROADMAP.md`). Las fases 1c y 2 quedaron
cerradas el 2026-10-05: las brechas de «Antes de publicar» arregladas y
probadas, y el historial de `main` y `claude/compassionate-planck-gh6aof` limpio
y auditado (`GITCLEAN.md`).

Fase actual: **1c — Resolver `TODO.md` y probarlo en producción** (ADR-027). Las
fases 1 y 1b quedaron cerradas el 2026-09-28; detalle en
`docs/_archive/roadmap-history.md` (local).
El historial limpio está en `bpstack/four-points`, **todavía privado**. El
original sigue privado como `four-points-archive`. Vercel y Render despliegan ya
desde el nuevo, en producción y en preview (`VERIFY.md`, «Cambio al repositorio
nuevo»). Decisiones en `DECISIONS.md`, hasta ADR-036.

## ⚠️ Empieza por aquí

1. **Fase 1c**: se hace todo `TODO.md`, de 🔴 a 🟢, y se prueba en producción
antes de limpiar el historial. El clon limpio y el repo público nuevo
(ADR-006, ya aceptada) vienen después.
2. **Qué se publica** (ADR-026): los ficheros de trabajo, todas las ramas y los
`AGENTS.md`/`CLAUDE.md`. No se publica `docs/_archive/`.
1. **Este repositorio va a ser público**, también su historial: lo que se
commitee no se puede borrar después sin reescribirlo. Nada de secretos, hosts
o usuarios de la BD, IDs de servicios, rutas locales ni datos del personal o
de la empresa.
2. **Clones nuevos:** activar los hooks una vez con
`git config core.hooksPath .githooks` (no viene con el clon; ver
`AGENTS.md`).
3. **Idiomas:** se trabaja en español; la documentación pública de `docs/` va en
inglés y no cita ADR ni `TODO.md`. `DECISIONS.md`, `ROADMAP.md`, `SESSION.md`
y `TODO.md` siguen en español.
4. **Material de consulta:** `docs/_archive/` refleja las rutas originales.
inglés y no cita ADR ni `TODO.md`. `DECISIONS.md`, `ROADMAP.md`,
`SESSION.md`, `TODO.md`, `VERIFY.md` y `GITCLEAN.md` siguen en español.

## Hallazgos
## Siguiente

**Método por módulo** (ADR-018): documentar → revisión `security` L3 → comprobar
lo grave → `TODO.md`. Aplicado el 2026-09-28 a los 12 módulos (general con
mensajería y base de datos incluidas).

Los hallazgos de la lectura del código (seguridad, docs desalineadas, código
muerto, decisiones previas a publicar) están en `TODO.md`, y **se resuelven
todos antes de publicar** (ADR-027).
1. Push de la rama y comprobar que Vercel y Render despliegan solos desde el
repositorio nuevo (queda sin comprobar en `VERIFY.md`).
2. Fusionar la rama en `main` por PR con merge commit (ADR-031).
3. Archivar `four-points-archive` (ADR-036).
4. Pasar `four-points` a público y activar secret scanning y push protection.
5. Después, «Después de publicar» de `TODO.md`, empezando por la rotación de
credenciales.

## Esperando decisión

Nada ahora mismo. Cómo se trabaja en la 1c (orden y flujo de push) está en
`ROADMAP.md`.

## Volcados de BD

Los cuatro `backend/db-mysql/backup/backup_hotel_db_{aiven,local}_2026*.sql`
salieron del árbol el 2026-09-28 (`git rm --cached`; siguen en el disco del PC
`dz`, ignorados por `.gitignore`). En el historial siguen estos cuatro y además
`backup_hotel_db-aiven.sql` y `backup_hotel_db-local.sql`; entraron en
`dad3cdc`, `f5d47d6` y `7ac45e7`. **No se han abierto.** Se eliminan del
historial en la fase 2, en todas las ramas: `main`, `chore/audit-prep-sprint-0`,
`feature/ai-schedule-generator`, `feature/auth-hardening` y
`feature/observability-pino` (sin tags).
Nada ahora mismo.

## Cuidado con esto

Expand All @@ -75,7 +65,4 @@ historial en la fase 2, en todas las ramas: `main`, `chore/audit-prep-sprint-0`,
- **Enlaces rotos conocidos** tras archivar: `backend/README.md` (enlaces a
`docs/backend/…`) y comentarios que citan `Global-Plan.md` o
`SCHEDULING-SOLVER-PLAN.md`. Se arreglan al escribir cada módulo (ADR-010).
- **Candidatos a privados para la fase 2**, además de los volcados: los dos
Excel archivados (`PLANNING 2026.xlsx`, el Excel de presencias),
que siguen en el historial, y los 18 `.http` de `backend/API REST/`
(peticiones de prueba; suelen llevar tokens o contraseñas). Ninguno abierto.
_Sin repasar desde el 2026-09-28._
Loading
Loading