===============================================================
  HUMAN-IN-THE-LOOP — Lo que NO puede automatizarse 100%
===============================================================

POR QUÉ NO ES VIABLE EL FULL-AUTO
---------------------------------
Hay archivos donde el upstream y nuestro fork divergen
intencionadamente. Aplicar automáticamente el upstream
ROMPERÍA nuestra app móvil.

Estos archivos SIEMPRE requieren revisión humana antes de
aplicar cualquier cambio.


LISTA DE ARCHIVOS "PROHIBIDOS" PARA AUTO-MERGE
----------------------------------------------

  src/client/assets/themes/OasisMobile.css
    Razón: Es nuestro tema de móvil, escrito desde cero.
    El upstream lo trata como tema de escritorio.
    Aplicar el de upstream rompería: hamburger nav, QR
    lightbox, panel-quicklinks, sidebar-panel drawer.

  src/client/assets/styles/mobile.css
    Razón: 100% nuestro. Contiene el paginador actpager,
    safe-area iOS, header móvil de 1-fila + 2-fila, todo
    el sistema mobile.

  src/client/public/js/mobile-ui.js
    Razón: Ya no se usa (paginador pasó a CSS-only) pero
    si upstream añade un mobile-ui.js distinto, NO copiar.

  src/views/mobile_pager.js
    Razón: Helper nuestro, no existe en upstream.

  src/views/main_views.js
    Razón: Contiene nuestro menú hamburger CSS-only,
    sidebar-panel drawer, panel-quicklinks. El upstream
    no tiene esto. Aplicar pisaría todo nuestro layout.

    EXCEPCIÓN: Si solo cambian textos / strings i18n,
    se puede hacer merge cuidadoso. Pero requiere mirada.

  src/views/inhabitants_view.js
    Razón: Tiene nuestros QR codes integrados (qr-share
    con <details>/<summary>). El upstream no.
    Hay que merge manual preservando los QR.

  src/views/invites_view.js
    Razón: Tiene nuestros QR por cada pub + IIFE async
    + inviteLog renderInviteExtra.

  src/views/tribes_view.js
    Razón: QR de tribe invite + nuestros campos del form
    (isAnonymous, isLARP, isSubEdit).

  src/models/tribes_model.js
    Razón: Tiene NUESTRO inviteLog (generateInvite +
    joinByInvite). El upstream no. Si copiamos, perdemos
    la trazabilidad de invites.

  src/models/main_models.js
    Razón: Publica SSB msg type:'pub-invite' al aceptar
    pub invite. Es nuestro.

  src/backend/backend.js
    Razón: Tiene rutas custom (POST /settings/invite/accept,
    nuestro orden de constructores). Cualquier cambio
    upstream debe integrarse manualmente.

  src/configs/config-manager.js
    Razón: Defaults modificados (wish, pmVisibility,
    economy modules on, etc).

  src/server/package.json
    Razón: NO añadir las deps nuevas del upstream:
       - @xenova/transformers (60MB+)
       - node-llama-cpp (no funciona arm64 mobile)
       - pdfjs-dist (pendiente probar, anotar para luego)

  src/client/middleware.js
    Razón: Tiene 'unsafe-inline' en CSP necesario para
    nosotros + mounts /game-assets /maptiles /mapcache
    custom + frame-src 'self'.


LISTA DE ARCHIVOS "SAFE" PARA AUTO-MERGE
----------------------------------------

  src/client/assets/translations/*.js
    Las traducciones son aditivas. Pueden copiarse al
    100% del upstream sin riesgo.

  src/client/assets/themes/Clear-SNH.css
  src/client/assets/themes/Dark-SNH.css
  src/client/assets/themes/Matrix-SNH.css
  src/client/assets/themes/Purple-SNH.css
    Temas de escritorio, no afectan a móvil.

  src/views/*_view.js  (NUEVOS)
    Si el archivo no existe en nuestro fork, copia auto.
    Ej: graphos_view.js, markdown.js.

  src/views/peers_view.js
  src/views/stats_view.js
  src/views/courts_view.js
  src/views/parliament_view.js
    Vistas que no tienen nuestros customizations, safe
    para refresh completo.

  src/models/*.js  (NUEVOS)
    Si es un modelo nuevo, copia auto.

  docs/CHANGELOG.md
    Copia auto, solo es informativo.


SEÑALES DE ALARMA QUE EL AGENTE DEBE DETECTAR
---------------------------------------------

Si el scout detecta cualquiera de estos patrones en el
diff, debe marcar la sync entera como "needs human":

  - Cambios en mobile.css / OasisMobile.css del upstream
    (no debería pasar, pero si pasa, alguien añadió tema
    móvil al upstream y hay que decidir qué hacer)

  - Nuevas dependencias en server/package.json que no
    están en una whitelist conocida

  - Cambios en CSP de middleware.js que reduzcan permisos

  - Cambios en SSB_server.js que afecten al modo public
    de nuestro APK

  - Cambios en blobHandler.js (lo modificamos a veces)


DECISIÓN POR DEFECTO
--------------------
Cuando el scout no puede decidir con seguridad:

  "Si tengo duda, marcar como REVIEW. Es preferible que
   el humano apruebe cinco minutos a romper la APK."


PROCESO DE REVISIÓN HUMANA (5 min lunes mañana)
------------------------------------------------
1. Abrir scout.md generado el lunes 03:00
2. Lectura rápida de la lista SAFE (debe verse razonable)
3. Lectura cuidadosa de la lista REVIEW
4. Si todo OK: curl POST /api/approve o nada (auto-approve)
5. Si algo no OK: ejecutar manualmente claude con prompt
   específico para ese conflicto
6. El builder corre solo a las 05:00


REGLA DE ORO
------------
NUNCA bajar AUTO_APPROVE_THRESHOLD por debajo de 0.5.
Mejor perder 5 min revisando que perder 2 horas
reconstruyendo la APK porque un cambio rompió algo.
