main local (WSL) y origin/main sin historial comun: 46 commits sin reconciliar #194

Closed
opened 2026-08-05 11:38:24 +00:00 by rafa · 2 comments
Owner

Hallazgo

Trabajando en el fix de los scripts sync_*_to_prod.py para el Hetzner nuevo (rama fix/hetzner-prod-sync-scripts, ya mergeada a main), descubrí que el main local de ~/joomla-migration (en el PC de Rafa, WSL) y origin/main (este repo, Gitea) son dos historias sin ancestro común:

  • origin/main viene de la reconciliación de julio (Sincronizar mu-plugins/ y scripts/ con el estado real del sitio, PR #179, 2026-07-16): aplanó la estructura y volcó el estado REAL del sitio en vez de reproducir el historial completo.
  • El main local nunca se rebaseó/fast-forward sobre esa reconciliación. Sigue una línea propia con 46 commits que nunca llegaron a Gitea, desde el Initial commit original de la migración Joomla→WP hasta un commit reciente 69e849d "Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco".

Alcance real (primera pasada, sin verificar a fondo)

Comparando solo los directorios que SÍ vive en origin/main (scripts/, docs/, mu-plugins/, tests/):

45 files changed, 1632 insertions(+), 6904 deletions(-)

La mayoría de las líneas en rojo son mu-plugins/*.php que el main local nunca tuvo (no es contenido divergente, es ausencia — origin/main ya es la versión viva del sitio). Lo que sí parece aporte real y no reconciliado:

  • docs/ — adiciones limpias, sin conflicto aparente: guia-publicacion-carta-inma.md, guia-tts-traduccion-inma.md, handoff-carta-46956-2026-06-17.md, handoff-tecnico-rafa-issues-174-175-2026-07-15.md, revision-issues-2026-07-15.md, revision-issues-live-gitea-2026-07-15.md, plan-buscador-avanzado-nativo.md, plan-buscador-typesense.md, benchmarks/gemma4-12b-vs-4b.md, actualizar-wordpress-desde-joomla-prod.md.
  • scripts/ — YA RESUELTO: sync_translations_to_prod.py, sync_audio_to_prod.py, sync_carta_from_prod.py (commit 638f5b7, apuntan al Hetzner nuevo). El resto de scripts/ en origin/main ya coincide con el estado local — probablemente porque la reconciliación de julio ya capturó esas versiones desde el sitio real.

Sin verificar todavía: si alguno de los 46 commits (buscador avanzado nativo #8, TTS multi-voz por autor #152, eventos GA4, endpoint crear-autor #166, verify_carta_lang_links.php, etc.) contiene lógica que NO llegó a desplegarse nunca a prod y que por tanto no está capturada en el snapshot de origin/main — o si todo eso ya vive en producción y el snapshot de julio ya lo recogió, y el gap es solo documentación + los 3 scripts ya arreglados.

Lista completa de los 46 commits solo-en-local

69e849d Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco
2504666 Buscador: AND obligatorio en FULLTEXT, excluir paginas-indice K2 y soportar frase exacta entre comillas
f747ec3 feat: sync_carta_from_prod.py para copiar el cluster de una carta prod->local (#174)
f059ed1 feat(api): endpoint fea/v1/crear-autor para alta de autores (#166)
7188adf feat(analytics): eventos GA4 audio_play y share_click
db0d0a0 feat: TTS multi-voz por autor (MiniMax voice cloning, gitea.feadulta.com #152)
82ca122 Add verify_carta_lang_links.php QA script for multilingual carta links
e2f23ac feat(#8): buscador avanzado nativo (FULLTEXT + filtros)
d959331 docs(#8): plan del buscador avanzado nativo (sin Typesense)
493fd4d docs(#8): plan de implementación del buscador Typesense (fase 2)
63e0057 chore(#143): avisar en el importer cuando un autor K2 cae a 'Fe Adulta'
6c0e366 docs: guía de publicación de la carta semanal para Inma (REST API)
8ea4d51 feat(#8): buscador visible (MVP nativo)
84ec916 fix(#143): corregir autoría 'Fe Adulta' y avatares de iniciales
6d9afaa fix(#142): player de audio visible en móvil vertical
3d3ca03 feat(i18n): traducir nombre del libro en títulos de lecturas EN/FR/IT/PT (#140)
a2aefd8 scripts(homenajes): migración Mardones/Galarreta + sync prod #130/#131/#133/#137/#138
e26b279 fix(avatares): traducciones de lecturas heredan el símbolo del ES (#135/#66)
d5475ed chore(sync): scripts ajustados para deploy a prod (staging wp-nuevo)
70831f1 feat(i18n): #136 reasignación de categorías traducidas + autores bíblicos por idioma
0bc58bf feat(lecturas): lote masivo de lecturas bíblicas vía índice del leccionario
0da0c0e feat(lecturas): descargador de lecturas bíblicas litúrgicas (evangelizo.org)
9ac857b fix(portada): artículos por idioma y enlace evangelio del día (#132)
66ee943 chore(verify): recuperar enum_urls.php y commitear tooling de verificación #121
863a3c6 feat(analytics): GA4 (gtag) + banner de consentimiento de cookies (#93)
6791afd Handoff carta 46956: traducciones Haiku + evangelios descargados + scripts; despliegue prod pendiente (issue #88, #87)
27aad22 Merge remote-tracking branch 'origin/main'
378ff65 Update tracked WordPress core files
3ddfd8d Add Joomla PHP 8.3 local service
efff1b9 Document Joomla production delta import
fb7eec8 docs: add Gemma 4 benchmark plan for Feadulta
e2ea90d chore(wp): registrar borrado de scripts de raíz WP
587d718 chore(wp): limpieza wordpress/ — backdoor reset.php, scripts migración, updraft
39431c9 chore: reorganizar carpetas de backups y archivar scripts/logs
08d2032 script(cats): aplicar clasificacion_articulos.csv a wp_term_relationships
6467285 script(cats): sub-clasifica evangelio por posición (lectura/editorial/comentario)
89fcd10 script: regenerar clasificacion_articulos.csv desde las cartas
d21e7f1 script(avatars): face-crop con OpenCV + regen thumbnails
54132b7 script(avatars): import bulk col_*.png de Joomla → user_meta foto_perfil
382a6a6 feat(portada): modelo carta→portada + slider sync desde filesystem
56ee158 fix(content) + tools(e2e): rutas de imagen Joomla + suite E2E
f857734 docs: migrar documentación a la wiki del repo
7965928 fix: bloque central footer — noticias_2025.jpg dinámico (corrige duplicación)
c6f16ba fix: sección pre-footer portada + scripts importación delta marzo-mayo 2026
18522a0 fix: portada WP — slider, h2 Portada, separadores y tipografía secciones
668d973 Initial commit — migración Joomla→WordPress feadulta.org

Petición

Necesito un análisis (sin tocar el repo remoto, sin merges ni pushes — solo lectura e informe) que responda:

  1. De estos 46 commits, ¿cuáles tocan código que ya está reflejado en origin/main (vía el snapshot de julio) y por tanto no aportan nada nuevo?
  2. ¿Cuáles contienen funcionalidad real que NO está en origin/main ni en producción, y por tanto se perdería si no se rescata?
  3. Para lo del punto 2: ¿cuál es la forma más segura de llevarlo a origin/main dado que no comparte historial (cherry-pick a mano, cita de fichero suelto, o reescribir sobre la base actual)?
  4. Los 10 ficheros de docs/ — confirmar que son adiciones limpias sin conflicto y listarlos con una frase de qué documentan.

Repo: /home/rafa/joomla-migration (WSL). Referencias: origin/main, rama local main (NO tocar, es la fuente del gap), rama fix/hetzner-prod-sync-scripts (ya mergeada, solo referencia).

## Hallazgo Trabajando en el fix de los scripts `sync_*_to_prod.py` para el Hetzner nuevo (rama `fix/hetzner-prod-sync-scripts`, ya mergeada a `main`), descubrí que el `main` **local** de `~/joomla-migration` (en el PC de Rafa, WSL) y `origin/main` (este repo, Gitea) son **dos historias sin ancestro común**: - `origin/main` viene de la reconciliación de julio (`Sincronizar mu-plugins/ y scripts/ con el estado real del sitio`, PR #179, 2026-07-16): aplanó la estructura y volcó el estado REAL del sitio en vez de reproducir el historial completo. - El `main` local nunca se rebaseó/fast-forward sobre esa reconciliación. Sigue una línea propia con **46 commits que nunca llegaron a Gitea**, desde el `Initial commit` original de la migración Joomla→WP hasta un commit reciente `69e849d "Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco"`. ## Alcance real (primera pasada, sin verificar a fondo) Comparando solo los directorios que SÍ vive en `origin/main` (`scripts/`, `docs/`, `mu-plugins/`, `tests/`): ``` 45 files changed, 1632 insertions(+), 6904 deletions(-) ``` La mayoría de las líneas en rojo son `mu-plugins/*.php` que el `main` local **nunca tuvo** (no es contenido divergente, es ausencia — origin/main ya es la versión viva del sitio). Lo que sí parece aporte real y no reconciliado: - **`docs/` — adiciones limpias, sin conflicto aparente:** `guia-publicacion-carta-inma.md`, `guia-tts-traduccion-inma.md`, `handoff-carta-46956-2026-06-17.md`, `handoff-tecnico-rafa-issues-174-175-2026-07-15.md`, `revision-issues-2026-07-15.md`, `revision-issues-live-gitea-2026-07-15.md`, `plan-buscador-avanzado-nativo.md`, `plan-buscador-typesense.md`, `benchmarks/gemma4-12b-vs-4b.md`, `actualizar-wordpress-desde-joomla-prod.md`. - **`scripts/` — YA RESUELTO:** `sync_translations_to_prod.py`, `sync_audio_to_prod.py`, `sync_carta_from_prod.py` (commit `638f5b7`, apuntan al Hetzner nuevo). El resto de `scripts/` en origin/main ya coincide con el estado local — probablemente porque la reconciliación de julio ya capturó esas versiones desde el sitio real. **Sin verificar todavía:** si alguno de los 46 commits (buscador avanzado nativo #8, TTS multi-voz por autor #152, eventos GA4, endpoint crear-autor #166, verify_carta_lang_links.php, etc.) contiene lógica que NO llegó a desplegarse nunca a prod y que por tanto no está capturada en el snapshot de `origin/main` — o si todo eso ya vive en producción y el snapshot de julio ya lo recogió, y el gap es solo documentación + los 3 scripts ya arreglados. ## Lista completa de los 46 commits solo-en-local ``` 69e849d Sync: guardar en el historial el trabajo de las ultimas semanas que solo vivia en el disco 2504666 Buscador: AND obligatorio en FULLTEXT, excluir paginas-indice K2 y soportar frase exacta entre comillas f747ec3 feat: sync_carta_from_prod.py para copiar el cluster de una carta prod->local (#174) f059ed1 feat(api): endpoint fea/v1/crear-autor para alta de autores (#166) 7188adf feat(analytics): eventos GA4 audio_play y share_click db0d0a0 feat: TTS multi-voz por autor (MiniMax voice cloning, gitea.feadulta.com #152) 82ca122 Add verify_carta_lang_links.php QA script for multilingual carta links e2f23ac feat(#8): buscador avanzado nativo (FULLTEXT + filtros) d959331 docs(#8): plan del buscador avanzado nativo (sin Typesense) 493fd4d docs(#8): plan de implementación del buscador Typesense (fase 2) 63e0057 chore(#143): avisar en el importer cuando un autor K2 cae a 'Fe Adulta' 6c0e366 docs: guía de publicación de la carta semanal para Inma (REST API) 8ea4d51 feat(#8): buscador visible (MVP nativo) 84ec916 fix(#143): corregir autoría 'Fe Adulta' y avatares de iniciales 6d9afaa fix(#142): player de audio visible en móvil vertical 3d3ca03 feat(i18n): traducir nombre del libro en títulos de lecturas EN/FR/IT/PT (#140) a2aefd8 scripts(homenajes): migración Mardones/Galarreta + sync prod #130/#131/#133/#137/#138 e26b279 fix(avatares): traducciones de lecturas heredan el símbolo del ES (#135/#66) d5475ed chore(sync): scripts ajustados para deploy a prod (staging wp-nuevo) 70831f1 feat(i18n): #136 reasignación de categorías traducidas + autores bíblicos por idioma 0bc58bf feat(lecturas): lote masivo de lecturas bíblicas vía índice del leccionario 0da0c0e feat(lecturas): descargador de lecturas bíblicas litúrgicas (evangelizo.org) 9ac857b fix(portada): artículos por idioma y enlace evangelio del día (#132) 66ee943 chore(verify): recuperar enum_urls.php y commitear tooling de verificación #121 863a3c6 feat(analytics): GA4 (gtag) + banner de consentimiento de cookies (#93) 6791afd Handoff carta 46956: traducciones Haiku + evangelios descargados + scripts; despliegue prod pendiente (issue #88, #87) 27aad22 Merge remote-tracking branch 'origin/main' 378ff65 Update tracked WordPress core files 3ddfd8d Add Joomla PHP 8.3 local service efff1b9 Document Joomla production delta import fb7eec8 docs: add Gemma 4 benchmark plan for Feadulta e2ea90d chore(wp): registrar borrado de scripts de raíz WP 587d718 chore(wp): limpieza wordpress/ — backdoor reset.php, scripts migración, updraft 39431c9 chore: reorganizar carpetas de backups y archivar scripts/logs 08d2032 script(cats): aplicar clasificacion_articulos.csv a wp_term_relationships 6467285 script(cats): sub-clasifica evangelio por posición (lectura/editorial/comentario) 89fcd10 script: regenerar clasificacion_articulos.csv desde las cartas d21e7f1 script(avatars): face-crop con OpenCV + regen thumbnails 54132b7 script(avatars): import bulk col_*.png de Joomla → user_meta foto_perfil 382a6a6 feat(portada): modelo carta→portada + slider sync desde filesystem 56ee158 fix(content) + tools(e2e): rutas de imagen Joomla + suite E2E f857734 docs: migrar documentación a la wiki del repo 7965928 fix: bloque central footer — noticias_2025.jpg dinámico (corrige duplicación) c6f16ba fix: sección pre-footer portada + scripts importación delta marzo-mayo 2026 18522a0 fix: portada WP — slider, h2 Portada, separadores y tipografía secciones 668d973 Initial commit — migración Joomla→WordPress feadulta.org ``` ## Petición Necesito un análisis (sin tocar el repo remoto, sin merges ni pushes — solo lectura e informe) que responda: 1. De estos 46 commits, ¿cuáles tocan código que **ya está reflejado** en `origin/main` (vía el snapshot de julio) y por tanto no aportan nada nuevo? 2. ¿Cuáles contienen **funcionalidad real que NO está en origin/main ni en producción**, y por tanto se perdería si no se rescata? 3. Para lo del punto 2: ¿cuál es la forma más segura de llevarlo a `origin/main` dado que no comparte historial (cherry-pick a mano, cita de fichero suelto, o reescribir sobre la base actual)? 4. Los 10 ficheros de `docs/` — confirmar que son adiciones limpias sin conflicto y listarlos con una frase de qué documentan. Repo: `/home/rafa/joomla-migration` (WSL). Referencias: `origin/main`, rama local `main` (NO tocar, es la fuente del gap), rama `fix/hetzner-prod-sync-scripts` (ya mergeada, solo referencia).
Author
Owner

Análisis del gap main local ↔ origin/main (solo lectura, sin tocar el repo)

Hallazgo previo, importante: nada corre riesgo real de "vivir solo en este disco"

Antes de entrar en las 4 preguntas: comprobé git branch -a y hay dos ramas remotas que nadie mencionaba en el hallazgo original — origin/local-full y origin/local-completo-2026-07-16. Ambas apuntan exactamente al mismo commit que la punta de main local (69e849d, mismo hash, git diff --stat main origin/local-full vacío, git merge-base = el propio 69e849d).

Es decir: los 46 commits íntegros ya están empujados a Gitea, solo que no en main sino en esas dos ramas de respaldo (con toda pinta de haberse subido como backup en el mismo momento de la reconciliación de julio, antes de aplanar main con el PR #179). Así que el marco "se perdería si nadie hace nada" del punto 2 de la petición no aplica en sentido estricto — nada está solo en el disco de este PC. El problema real es de reconciliación/visibilidad (nada vive en main, la rama que la gente mira), no de pérdida de datos.

Dicho esto, respondo las 4 preguntas tal como se pidieron, comparando contenido real byte a byte (git show <ref>:<ruta> | md5sum) en vez de fiarme del nombre de los commits.


1. Commits ya reflejados en origin/main (rescatarlos no aporta nada)

Metodología: por cada fichero que estos commits tocan en mu-plugins/, scripts/ y tests/, comparé el contenido final en main local contra el mismo fichero en origin/main.

Resultado:

  • mu-plugins/: los 28 ficheros (+1 subcarpeta fea-support-campaign/template.php) que existen en ambos lados son idénticos byte a byte. Incluye explícitamente fea-search-advanced.php y fea-search-fulltext.php del commit e2f23ac (verifiqué que NO es una coincidencia de nombre: el contenido con los filtros FULLTEXT, formulario avanzado, i18n, etc. ya está en origin/main tal cual).
  • scripts/: 97 ficheros en cada lado, con correspondencia 1:1 por ruta (0 "solo en origin", 0 "solo en local"). De esos, 94 son idénticos byte a byte. Los otros 3 se tratan en el punto 2.
  • tests/: sin diferencias de contenido (el único fichero no compartido, test_subir_avatar_api.sh, existe solo en origin/main, porque pertenece a la feature #175 que nunca pasó por main local — dirección contraria, no es un gap).

Con eso, estos commits (o la parte de ellos que toca esos 3 directorios) no aportan nada al rescatarlos, porque su resultado final ya vive en origin/main:

18522a0, c6f16ba, 7965928, f857734 (superado incluso: origin ya movió todo a la wiki), 382a6a6, 54132b7, d21e7f1, 89fcd10, 6467285, 08d2032, 6791afd (los scripts que aporta), 863a3c6, 9ac857b, 0da0c0e, 0bc58bf (los scripts), 70831f1, d5475ed, e26b279, a2aefd8, 3d3ca03, 6d9afaa, 84ec916, 8ea4d51, 63e0057, e2f23ac, 82ca122, db0d0a0 (el código; el script sync ver punto 2), 7188adf, f059ed1, f747ec3 (el código; el script sync ver punto 2), 2504666, y la parte de código de 69e849d (docenas de scripts y mu-plugins nuevos, todos confirmados idénticos: fea-beta-feedback.php, fea-cloudflare-realip.php, fea-legacy-redirect.php, fea-gsc-verification.php, fea-support-campaign.php, fea-ui.php, fea-menu-i18n.php, fea-pensamientos.php, fea-recopilatorios.php, fea-avatar-cachebust.php, fea-carta-id-api.php, fea-compact-entry-spacing.php, fea-disable-comments.php, fea-hide-bad-tag.php, y toda la tanda de scripts de traducción/TTS/lecturas).

Caso especial — 56ee158, 66ee943, la parte no-doc de 69e849d, 0bc58bf (el .txt) y e2f23ac (los shot_*.cjs): tocan tools/e2e/, que no está en el alcance de origin/main (ver nota al final del punto 2). No aportan "nada nuevo a origin/main" simplemente porque origin/main nunca trackeó ese directorio, no porque el contenido ya esté allí.

Fuera de esta clasificación, por no tocar ninguno de los 4 directorios que vive origin/main:

  • 668d973 (initial commit, 1925 ficheros — es el dump completo del WordPress migrado; origin/main nunca trackeó wordpress/, así que no hay "reflejo" que comparar, es simplemente fuera de alcance por diseño).
  • 39431c9, 587d718, e2ea90d — housekeeping de backups//archive//wordpress/ (borrados y reorganización, nada que rescatar).
  • 3ddfd8ddocker-compose.yml (servicio Joomla PHP 8.3 local).
  • 378ff65 — ficheros core de WordPress (wp-login.php, etc.), fuera de alcance por diseño (WP core no se versiona en origin/main).
  • 27aad22 — merge vacío de contenido propio.

2. Contenido real NO reflejado en origin/main

Tras comparar contenido (no nombres), lo único con diferencias reales son:

a) Los 10 ficheros de docs/ — ver punto 4, es contenido 100% nuevo, origin/main no tiene nada equivalente.

b) Los 3 scripts de sync a prod (sync_audio_to_prod.py, sync_carta_from_prod.py, sync_translations_to_prod.py, tocados por db0d0a0, f747ec3 y el propio 69e849d) sí difieren, pero al revés de lo que parece un "gap": la versión de origin/main (commit 638f5b7, ya identificado en el hallazgo original como "YA RESUELTO") es la que está por delante — apunta al Hetzner nuevo, usa auth por clave SSH y añade el wrapper _remote_wrap/docker exec para el contenedor Coolify. La versión de main local es la antigua, apuntando a CDMON (134.0.10.170) con workaround del glibc roto y, más grave, con una contraseña de producción hardcodeada en texto plano en el propio fichero (PROD_PASS = os.environ.get("FEA_PROD_PASS", "$FEA_PROD_SSH_PASS (redactado)")). Rescatar esta versión sería un retroceso funcional y una regresión de seguridad — no hay nada que rescatar aquí, al contrario.

c) Fuera del alcance estricto de origin/main por diseño (la reconciliación de julio deliberadamente solo trackea docs/, mu-plugins/, scripts/, tests/ — según la propia memoria del proyecto, "estructura plana mantenida a propósito"), pero que sí representa trabajo de ingeniería real que no vive en ningún sitio "oficial":

  • tools/e2e/ — suite de QA con Playwright + visión Gemma 4 local (commits 56ee158, 66ee943, 0bc58bf, e2f23ac, 69e849d): ~40 ficheros (run.js, ask-vision.js, verify/ con enum_urls.php, classify_gaps.py, link_audit.py, llm_review.py, capturas shot_*.cjs). No es funcionalidad de sitio, es tooling de verificación local — no se despliega a prod, así que el snapshot de julio nunca lo iba a capturar.
  • docker-compose.yml (commit 3ddfd8d) — definición del servicio Joomla PHP 8.3 local.

Como se explicó arriba, esto tampoco está en riesgo real de pérdida: vive íntegro en origin/local-full / origin/local-completo-2026-07-16. Es una decisión de alcance del repo, no un olvido — pero si en algún momento se quiere que tools/e2e/ sea "oficial" en main, habría que decidirlo explícitamente (añadir un 5º directorio al alcance de la reconciliación).


3. Forma más segura de llevar lo del punto 2 a origin/main

Solo aplica a los 10 ficheros de docs/ (lo demás, como se ha visto, o ya está allí, o es un retroceso, o es una decisión de alcance pendiente de decidir con calma, no una migración de código).

No usar cherry-pick de los commits originales. Dos razones:

  1. No hay ancestro común — un cherry-pick de un commit de main local sobre origin/main obligaría a git a intentar un merge de 3 vías contra un padre que origin/main no tiene en su historia; en el mejor caso funciona como aplicación de parche "a ciegas", en el peor da conflictos espurios en contexto que no existe al otro lado.
  2. Algunos de estos ficheros fueron tocados por más de un commit (p.ej. docs/guia-publicacion-carta-inma.md: creado en 6c0e366, modificado después en 69e849d). Cherry-pickear solo el commit de creación dejaría el fichero desactualizado; habría que encadenar cherry-picks en orden y con éxito en los 2, con más superficie de fallo para ningún beneficio.

Método recomendado — copiar el estado final directamente:

git branch docs-gap-194 origin/main        # rama nueva, sin tocar main/origin/main
git worktree add ../fea-docs-gap docs-gap-194   # opcional, para no tocar el working tree actual
cd ../fea-docs-gap
mkdir -p docs/benchmarks
for f in actualizar-wordpress-desde-joomla-prod.md \
         benchmarks/gemma4-12b-vs-4b.md \
         guia-publicacion-carta-inma.md \
         guia-tts-traduccion-inma.md \
         handoff-carta-46956-2026-06-17.md \
         handoff-tecnico-rafa-issues-174-175-2026-07-15.md \
         plan-buscador-avanzado-nativo.md \
         plan-buscador-typesense.md \
         revision-issues-2026-07-15.md \
         revision-issues-live-gitea-2026-07-15.md; do
  git show main:docs/$f > docs/$f
done
git add docs/
git commit -m "docs: rescatar 10 ficheros de docs/ del main local no reconciliado (#194)"
git push origin docs-gap-194
# → abrir PR docs-gap-194 -> main normal

Son adiciones limpias (confirmado en el punto 4: ninguna ruta colisiona con algo que ya exista en origin/main), así que este PR se puede mergear sin resolver ningún conflicto.


4. Los 10 ficheros de docs/ — confirmación y qué documenta cada uno

Confirmado con git diff --stat origin/main main -- docs/: son 10 adiciones limpias, ninguna colisiona con un fichero existente en origin/main ni requiere merge. (Hay un 11º cambio en ese diff, docs/plans/2026-07-16-subir-avatar-api-175.md, pero es al revés: existe solo en origin/main, no en main local — no es parte del gap.)

Fichero Qué documenta
docs/actualizar-wordpress-desde-joomla-prod.md Runbook para refrescar la copia local de WordPress con los artículos nuevos de Joomla en producción.
docs/benchmarks/gemma4-12b-vs-4b.md Diseño de un benchmark para decidir si Gemma 4 12B mejora de forma material el flujo de traducción/TTS de Feadulta frente a Gemma 4 4B.
docs/guia-publicacion-carta-inma.md Guía para el asistente de Inma (Claude Code/Cowork) sobre cómo publicar la carta semanal y artículos en el WordPress nuevo vía REST API.
docs/guia-tts-traduccion-inma.md Guía de traducción y generación de audio (TTS) para Inma/Mixbot, aclarando qué partes del pipeline son manuales y cuáles (todavía) no están automatizadas.
docs/handoff-carta-46956-2026-06-17.md Handoff de sesión (17-jun-2026) sobre el estado de la carta 46956 «Entre todos», trabajado en local y pendiente de desplegar a prod.
docs/handoff-tecnico-rafa-issues-174-175-2026-07-15.md Preparación técnica (sin aplicar en prod) para los issues #174 (cierre autónomo de la carta) y #175.
docs/plan-buscador-avanzado-nativo.md Plan de ejecución del buscador avanzado nativo con MySQL FULLTEXT (feadulta #8), sin depender de Typesense.
docs/plan-buscador-typesense.md Plan de la fase 2 del buscador (#8): sustituir el motor por Typesense manteniendo la UI y añadiendo búsqueda por autor.
docs/revision-issues-2026-07-15.md Revisión diagnóstica de issues mencionados por Inma/Rafa, con nota de que la numeración de issues citada no coincidía con el tracker vigente en ese momento.
docs/revision-issues-live-gitea-2026-07-15.md Segunda pasada de esa revisión, ya contra la instancia viva de gitea.feadulta.com con la numeración correcta de issues (#166, #168, #170, #174, #175).

Resumen ejecutivo

  • No hay pérdida de datos real: los 46 commits ya están íntegros en Gitea bajo origin/local-full / origin/local-completo-2026-07-16 (mismo hash que la punta de main local).
  • Código funcional (mu-plugins/scripts/tests): 0 gap. Confirmado byte a byte — todo lo que aportan los 46 commits en esos 3 directorios ya vive en origin/main, capturado por el snapshot de julio.
  • Los 3 scripts de sync a prod que sí difieren tienen la versión de origin/main por delante (Hetzner) — nada que rescatar, y la versión local tiene una contraseña en claro que mejor no resucitar.
  • El único gap real de contenido son los 10 ficheros de docs/, adiciones limpias sin conflicto — método recomendado: copiar el estado final con git show main:docs/X > docs/X sobre una rama nueva basada en origin/main, no cherry-pick.
  • Punto abierto, no urgente: tools/e2e/ (suite QA) y docker-compose.yml (servicio Joomla local) no están en el alcance actual de origin/main por decisión deliberada de la reconciliación de julio — decidir si conviene incorporarlos como 5º directorio con calma, no como parte de este rescate.

Análisis realizado en modo solo lectura: sin push, sin merge, sin tocar main/origin/main/working tree. No se creó ninguna rama local (bastó con git show/git diff sobre refs existentes).

## Análisis del gap `main` local ↔ `origin/main` (solo lectura, sin tocar el repo) ### Hallazgo previo, importante: nada corre riesgo real de "vivir solo en este disco" Antes de entrar en las 4 preguntas: comprobé `git branch -a` y hay dos ramas remotas que nadie mencionaba en el hallazgo original — `origin/local-full` y `origin/local-completo-2026-07-16`. Ambas apuntan **exactamente** al mismo commit que la punta de `main` local (`69e849d`, mismo hash, `git diff --stat main origin/local-full` vacío, `git merge-base` = el propio `69e849d`). Es decir: **los 46 commits íntegros ya están empujados a Gitea**, solo que no en `main` sino en esas dos ramas de respaldo (con toda pinta de haberse subido como backup en el mismo momento de la reconciliación de julio, antes de aplanar `main` con el PR #179). Así que el marco "se perdería si nadie hace nada" del punto 2 de la petición no aplica en sentido estricto — nada está solo en el disco de este PC. El problema real es de **reconciliación/visibilidad** (nada vive en `main`, la rama que la gente mira), no de pérdida de datos. Dicho esto, respondo las 4 preguntas tal como se pidieron, comparando contenido real byte a byte (`git show <ref>:<ruta> | md5sum`) en vez de fiarme del nombre de los commits. --- ### 1. Commits ya reflejados en `origin/main` (rescatarlos no aporta nada) Metodología: por cada fichero que estos commits tocan en `mu-plugins/`, `scripts/` y `tests/`, comparé el contenido **final** en `main` local contra el mismo fichero en `origin/main`. Resultado: - **mu-plugins/**: los 28 ficheros (+1 subcarpeta `fea-support-campaign/template.php`) que existen en ambos lados son **idénticos byte a byte**. Incluye explícitamente `fea-search-advanced.php` y `fea-search-fulltext.php` del commit `e2f23ac` (verifiqué que NO es una coincidencia de nombre: el contenido con los filtros FULLTEXT, formulario avanzado, i18n, etc. ya está en `origin/main` tal cual). - **scripts/**: 97 ficheros en cada lado, con correspondencia 1:1 por ruta (0 "solo en origin", 0 "solo en local"). De esos, 94 son idénticos byte a byte. Los otros 3 se tratan en el punto 2. - **tests/**: sin diferencias de contenido (el único fichero no compartido, `test_subir_avatar_api.sh`, existe solo en `origin/main`, porque pertenece a la feature #175 que nunca pasó por `main` local — dirección contraria, no es un gap). Con eso, estos commits (o la parte de ellos que toca esos 3 directorios) **no aportan nada al rescatarlos**, porque su resultado final ya vive en `origin/main`: `18522a0`, `c6f16ba`, `7965928`, `f857734` (superado incluso: origin ya movió todo a la wiki), `382a6a6`, `54132b7`, `d21e7f1`, `89fcd10`, `6467285`, `08d2032`, `6791afd` (los scripts que aporta), `863a3c6`, `9ac857b`, `0da0c0e`, `0bc58bf` (los scripts), `70831f1`, `d5475ed`, `e26b279`, `a2aefd8`, `3d3ca03`, `6d9afaa`, `84ec916`, `8ea4d51`, `63e0057`, `e2f23ac`, `82ca122`, `db0d0a0` (el código; el script sync ver punto 2), `7188adf`, `f059ed1`, `f747ec3` (el código; el script sync ver punto 2), `2504666`, y la parte de código de `69e849d` (docenas de scripts y mu-plugins nuevos, todos confirmados idénticos: `fea-beta-feedback.php`, `fea-cloudflare-realip.php`, `fea-legacy-redirect.php`, `fea-gsc-verification.php`, `fea-support-campaign.php`, `fea-ui.php`, `fea-menu-i18n.php`, `fea-pensamientos.php`, `fea-recopilatorios.php`, `fea-avatar-cachebust.php`, `fea-carta-id-api.php`, `fea-compact-entry-spacing.php`, `fea-disable-comments.php`, `fea-hide-bad-tag.php`, y toda la tanda de scripts de traducción/TTS/lecturas). Caso especial — `56ee158`, `66ee943`, la parte no-doc de `69e849d`, `0bc58bf` (el `.txt`) y `e2f23ac` (los `shot_*.cjs`): tocan `tools/e2e/`, que **no está en el alcance de origin/main** (ver nota al final del punto 2). No aportan "nada nuevo a origin/main" simplemente porque origin/main nunca trackeó ese directorio, no porque el contenido ya esté allí. Fuera de esta clasificación, por no tocar ninguno de los 4 directorios que vive `origin/main`: - `668d973` (initial commit, 1925 ficheros — es el dump completo del WordPress migrado; `origin/main` nunca trackeó `wordpress/`, así que no hay "reflejo" que comparar, es simplemente fuera de alcance por diseño). - `39431c9`, `587d718`, `e2ea90d` — housekeeping de `backups/`/`archive/`/`wordpress/` (borrados y reorganización, nada que rescatar). - `3ddfd8d` — `docker-compose.yml` (servicio Joomla PHP 8.3 local). - `378ff65` — ficheros core de WordPress (`wp-login.php`, etc.), fuera de alcance por diseño (WP core no se versiona en `origin/main`). - `27aad22` — merge vacío de contenido propio. --- ### 2. Contenido real NO reflejado en `origin/main` Tras comparar contenido (no nombres), lo único con diferencias reales son: **a) Los 10 ficheros de `docs/`** — ver punto 4, es contenido 100% nuevo, `origin/main` no tiene nada equivalente. **b) Los 3 scripts de sync a prod** (`sync_audio_to_prod.py`, `sync_carta_from_prod.py`, `sync_translations_to_prod.py`, tocados por `db0d0a0`, `f747ec3` y el propio `69e849d`) **sí difieren, pero al revés de lo que parece un "gap"**: la versión de `origin/main` (commit `638f5b7`, ya identificado en el hallazgo original como "YA RESUELTO") es la que está **por delante** — apunta al Hetzner nuevo, usa auth por clave SSH y añade el wrapper `_remote_wrap`/`docker exec` para el contenedor Coolify. La versión de `main` local es la **antigua**, apuntando a CDMON (`134.0.10.170`) con workaround del glibc roto y, más grave, con una contraseña de producción **hardcodeada en texto plano** en el propio fichero (`PROD_PASS = os.environ.get("FEA_PROD_PASS", "$FEA_PROD_SSH_PASS (redactado)")`). Rescatar esta versión sería un retroceso funcional y una regresión de seguridad — no hay nada que rescatar aquí, al contrario. **c) Fuera del alcance estricto de `origin/main` por diseño** (la reconciliación de julio deliberadamente solo trackea `docs/`, `mu-plugins/`, `scripts/`, `tests/` — según la propia memoria del proyecto, "estructura plana mantenida a propósito"), pero que sí representa trabajo de ingeniería real que no vive en ningún sitio "oficial": - **`tools/e2e/`** — suite de QA con Playwright + visión Gemma 4 local (commits `56ee158`, `66ee943`, `0bc58bf`, `e2f23ac`, `69e849d`): ~40 ficheros (`run.js`, `ask-vision.js`, `verify/` con `enum_urls.php`, `classify_gaps.py`, `link_audit.py`, `llm_review.py`, capturas `shot_*.cjs`). No es funcionalidad de sitio, es tooling de verificación local — no se despliega a prod, así que el snapshot de julio nunca lo iba a capturar. - **`docker-compose.yml`** (commit `3ddfd8d`) — definición del servicio Joomla PHP 8.3 local. Como se explicó arriba, esto tampoco está en riesgo real de pérdida: vive íntegro en `origin/local-full` / `origin/local-completo-2026-07-16`. Es una decisión de alcance del repo, no un olvido — pero si en algún momento se quiere que `tools/e2e/` sea "oficial" en `main`, habría que decidirlo explícitamente (añadir un 5º directorio al alcance de la reconciliación). --- ### 3. Forma más segura de llevar lo del punto 2 a `origin/main` Solo aplica a los **10 ficheros de `docs/`** (lo demás, como se ha visto, o ya está allí, o es un retroceso, o es una decisión de alcance pendiente de decidir con calma, no una migración de código). **No usar cherry-pick de los commits originales.** Dos razones: 1. No hay ancestro común — un cherry-pick de un commit de `main` local sobre `origin/main` obligaría a git a intentar un merge de 3 vías contra un padre que `origin/main` no tiene en su historia; en el mejor caso funciona como aplicación de parche "a ciegas", en el peor da conflictos espurios en contexto que no existe al otro lado. 2. Algunos de estos ficheros fueron tocados por **más de un commit** (p.ej. `docs/guia-publicacion-carta-inma.md`: creado en `6c0e366`, modificado después en `69e849d`). Cherry-pickear solo el commit de creación dejaría el fichero desactualizado; habría que encadenar cherry-picks en orden y con éxito en los 2, con más superficie de fallo para ningún beneficio. **Método recomendado — copiar el estado final directamente:** ```bash git branch docs-gap-194 origin/main # rama nueva, sin tocar main/origin/main git worktree add ../fea-docs-gap docs-gap-194 # opcional, para no tocar el working tree actual cd ../fea-docs-gap mkdir -p docs/benchmarks for f in actualizar-wordpress-desde-joomla-prod.md \ benchmarks/gemma4-12b-vs-4b.md \ guia-publicacion-carta-inma.md \ guia-tts-traduccion-inma.md \ handoff-carta-46956-2026-06-17.md \ handoff-tecnico-rafa-issues-174-175-2026-07-15.md \ plan-buscador-avanzado-nativo.md \ plan-buscador-typesense.md \ revision-issues-2026-07-15.md \ revision-issues-live-gitea-2026-07-15.md; do git show main:docs/$f > docs/$f done git add docs/ git commit -m "docs: rescatar 10 ficheros de docs/ del main local no reconciliado (#194)" git push origin docs-gap-194 # → abrir PR docs-gap-194 -> main normal ``` Son adiciones limpias (confirmado en el punto 4: ninguna ruta colisiona con algo que ya exista en `origin/main`), así que este PR se puede mergear sin resolver ningún conflicto. --- ### 4. Los 10 ficheros de `docs/` — confirmación y qué documenta cada uno Confirmado con `git diff --stat origin/main main -- docs/`: son **10 adiciones limpias**, ninguna colisiona con un fichero existente en `origin/main` ni requiere merge. (Hay un 11º cambio en ese diff, `docs/plans/2026-07-16-subir-avatar-api-175.md`, pero es al revés: existe solo en `origin/main`, no en `main` local — no es parte del gap.) | Fichero | Qué documenta | |---|---| | `docs/actualizar-wordpress-desde-joomla-prod.md` | Runbook para refrescar la copia local de WordPress con los artículos nuevos de Joomla en producción. | | `docs/benchmarks/gemma4-12b-vs-4b.md` | Diseño de un benchmark para decidir si Gemma 4 12B mejora de forma material el flujo de traducción/TTS de Feadulta frente a Gemma 4 4B. | | `docs/guia-publicacion-carta-inma.md` | Guía para el asistente de Inma (Claude Code/Cowork) sobre cómo publicar la carta semanal y artículos en el WordPress nuevo vía REST API. | | `docs/guia-tts-traduccion-inma.md` | Guía de traducción y generación de audio (TTS) para Inma/Mixbot, aclarando qué partes del pipeline son manuales y cuáles (todavía) no están automatizadas. | | `docs/handoff-carta-46956-2026-06-17.md` | Handoff de sesión (17-jun-2026) sobre el estado de la carta 46956 «Entre todos», trabajado en local y pendiente de desplegar a prod. | | `docs/handoff-tecnico-rafa-issues-174-175-2026-07-15.md` | Preparación técnica (sin aplicar en prod) para los issues #174 (cierre autónomo de la carta) y #175. | | `docs/plan-buscador-avanzado-nativo.md` | Plan de ejecución del buscador avanzado nativo con MySQL FULLTEXT (feadulta #8), sin depender de Typesense. | | `docs/plan-buscador-typesense.md` | Plan de la fase 2 del buscador (#8): sustituir el motor por Typesense manteniendo la UI y añadiendo búsqueda por autor. | | `docs/revision-issues-2026-07-15.md` | Revisión diagnóstica de issues mencionados por Inma/Rafa, con nota de que la numeración de issues citada no coincidía con el tracker vigente en ese momento. | | `docs/revision-issues-live-gitea-2026-07-15.md` | Segunda pasada de esa revisión, ya contra la instancia viva de `gitea.feadulta.com` con la numeración correcta de issues (#166, #168, #170, #174, #175). | --- ### Resumen ejecutivo - **No hay pérdida de datos real**: los 46 commits ya están íntegros en Gitea bajo `origin/local-full` / `origin/local-completo-2026-07-16` (mismo hash que la punta de `main` local). - **Código funcional (mu-plugins/scripts/tests): 0 gap.** Confirmado byte a byte — todo lo que aportan los 46 commits en esos 3 directorios ya vive en `origin/main`, capturado por el snapshot de julio. - Los 3 scripts de sync a prod que sí difieren tienen la versión de `origin/main` **por delante** (Hetzner) — nada que rescatar, y la versión local tiene una contraseña en claro que mejor no resucitar. - **El único gap real de contenido son los 10 ficheros de `docs/`**, adiciones limpias sin conflicto — método recomendado: copiar el estado final con `git show main:docs/X > docs/X` sobre una rama nueva basada en `origin/main`, no cherry-pick. - Punto abierto, no urgente: `tools/e2e/` (suite QA) y `docker-compose.yml` (servicio Joomla local) no están en el alcance actual de `origin/main` por decisión deliberada de la reconciliación de julio — decidir si conviene incorporarlos como 5º directorio con calma, no como parte de este rescate. *Análisis realizado en modo solo lectura: sin `push`, sin `merge`, sin tocar `main`/`origin/main`/working tree. No se creó ninguna rama local (bastó con `git show`/`git diff` sobre refs existentes).*
Author
Owner

Resuelto

Rescatados los 10 ficheros de docs/ (guias, handoffs, planes del buscador, benchmark Gemma, revisiones de issues) en el commit 5055e92, ya en main.

No hace falta ninguna otra accion sobre el resto de las 46 commits: el analisis confirmo que su contenido ya esta reflejado en origin/main via el snapshot de julio (PR #179), y ademas quedan respaldadas intactas en las ramas remotas local-full / local-completo-2026-07-16 por si hiciera falta consultarlas en el futuro.

Nota aparte: uno de los docs rescatados (handoff-carta-46956-2026-06-17.md) traia dos credenciales del servidor CDMON antiguo en texto plano (password SSH y password cPanel/FTP); las redacte antes de commitear -- ver .env, nunca en docs versionados.

## Resuelto Rescatados los 10 ficheros de docs/ (guias, handoffs, planes del buscador, benchmark Gemma, revisiones de issues) en el commit 5055e92, ya en main. No hace falta ninguna otra accion sobre el resto de las 46 commits: el analisis confirmo que su contenido ya esta reflejado en origin/main via el snapshot de julio (PR #179), y ademas quedan respaldadas intactas en las ramas remotas local-full / local-completo-2026-07-16 por si hiciera falta consultarlas en el futuro. Nota aparte: uno de los docs rescatados (handoff-carta-46956-2026-06-17.md) traia dos credenciales del servidor CDMON antiguo en texto plano (password SSH y password cPanel/FTP); las redacte antes de commitear -- ver .env, nunca en docs versionados.
rafa closed this issue 2026-08-05 12:39:48 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#194