ARCHITECTURE_DECISIONS
Etapa D - decisiones
- Adaptador del proveedor sobre casos de uso y repositorio genericos.
- Se conserva la identidad por cuenta/familia/entorno; no se hereda UID de TEST.
- Dos barreras de release independientes y cerradas, sin desbloqueo web.
- Un ACK de creacion no es tracking: timestamp separado y evento local ACK.
- Recibo cifrado antes de interpretar; replay local, nunca retry de GrabaServicios.
- Escritura HTTP parcial es incierta, no ausencia demostrada de transmision.
- Centros N:M por cuenta, direccion cifrada y snapshot de revision en borrador.
- Trabajador de conocidas sin enumeracion; una ejecucion acotada sin scheduler.
- Pausar conserva la llamada en curso y detiene antes del siguiente elemento.
- Respuesta recibida es recuperable tras reinicio sin consumir otra llamada.
- Importador es administrativo/temporal, manual, pausado y de cobertura parcial.
- Seis areas de navegacion no sustituyen las comprobaciones de permiso reales.
- Se conserva el aislamiento de red/UID del servicio 80 hasta nueva autorizacion.
- No se aclara una incidencia multiple mediante inferencia global de SOLUCION.
Decisiones historicas
ADR C01 - canal JSON sin ampliar privilegios
El runtime 85 sigue siendo un paquete minimo de libreria estandar, sin BD, credenciales, clientes GLS ni ejecucion de comandos. JSON se construye solo desde el manifiesto y los Markdown sanitizados fijados por hash del release. No se publica el arbol docs original ni se aceptan rutas arbitrarias.
Respuesta individual: id, title, version, date, classification, sha256, content_markdown. El hash corresponde a bytes UTF-8 del Markdown completo, no al JSON serializado. Index y bundle conservan esos metadatos.
Limites: JSON 1 MiB, documento completo preferido hasta 512 KiB, fragmentos UTF-8 de hasta 64 KiB y ocho documentos por bundle. No se corta una secuencia UTF-8. Cada fragmento tiene indice, offset, longitud y SHA; el documento mantiene hash total. Si el bundle no cabe, 413 y URLs individuales; no se devuelve un subconjunto como si fuese completo.
ADR C02 - operativa y administracion separadas
80 ofrece solo operativa local autenticada; 88 conserva administracion, diagnosticos y laboratorio. Se comparte usuarios, PostgreSQL y servicios; no se crea otra administracion ni un repositorio paralelo.
Cookie y audiencia de 80 distintas de 88. Usuario activo y rol se consultan en cada acceso; la version de usuario invalida sesiones tras cambios. CSRF tambien en login, cookies HttpOnly/SameSite y expiracion. Login con limitacion de fallos. No se registran passwords, consultas de destinatario ni URLs completas en el access log operativo, que esta desactivado.
El servicio 80 se vincula solo a la IP LAN. Se configura IPAddressDeny any y allow para LAN/localhost, sin cambiar proxy ni abrir publicacion externa. UID y laboratorio quedan inaccesibles en su namespace de filesystem. Sigue usando el usuario de aplicacion existente; separar un rol PostgreSQL operativo mas fino puede abordarse despues, sin presentar esto como un aislamiento completo de usuarios Unix/BD entre 80 y 88.
ADR C03 - simulacion no es TEST GLS
La simulacion LOCAL no usa UID TEST ni PRODUCCION y no contacta endpoint. Cuenta, transportista, namespace y data_mode propios evitan que identificadores inventados aparezcan como expediciones reales. Se preserva la cuenta GLS prevista en el borrador/snapshot, no se utiliza para transmitir.
La respuesta sintetica se procesa con el parser existente y se persiste por el mismo coordinador de intento unico. Tiene su presupuesto local; no se registra como llamada externa ni se mezcla con historicos GLS. La etiqueta generada lleva SIMULACION y no tiene barcode operativo.
ADR C04 - borradores, confirmacion e idempotencia
PK interna UUID. Payload cifrado. Creacion idempotente por usuario y clave; edicion por revision compare-and-set. Solo propietario o admin; escritura solo admin/operador. Revisar datos guardados antes de confirmar.
El borrador y la operacion se vinculan en una transaccion. Snapshot de negocio y XML con UID REDACTED quedan cifrados antes de la simulacion. Intento unico, respuesta cifrada previa al commit y replay local reutilizan etapa B. No se reenvia un resultado ambiguo. Un fallo de cuota anterior a cualquier claim se cierra como not_sent con cero intentos y permite una nueva revision manual; no se confunde con reintentar un alta enviada.
El endpoint real permanece 423 incluso si alguien modifica flags internos. Activar operaciones reales requiere revision/autorizacion y conectar el sender real validado; no basta con quitar disabled en el navegador.
ADR C05 - buscar no es sincronizar
Solo PostgreSQL. Fecha operativa shipment_date, sin inventar fechas ausentes. Filtros combinables y paginacion ordenada fecha/id. Estados COD/incidencia desconocidos no equivalen a false. Comodines de texto se tratan literalmente. La ficha ofrece cronologia y documentos ya almacenados, sin llamadas GLS. El inventario activo puede estar vacio: no se afirma cobertura historica.
ADR C06 - preparacion administrativa revisable
Importador solo 88, texto pegado, candidatos tipados, otra agencia/ambiguos apartados, revision firmada de 15 minutos y seleccion explicita hasta 25. Coincidir agencia no demuestra pertenencia al cliente. No se conserva el texto original con posibles datos personales, solo candidatos revisados en payload cifrado. El job queda pausado, parcial y deduplicado.
Preparar actualizacion/POD tampoco ejecuta un worker. Los jobs conocidos son acotados y reutilizan leases/checkpoints. No hay barridos ni XML especulativo para GetEnvios. Las politicas de cuota se editan en 88 sin llamadas; el limite oficial no acreditado no se inventa.
ADR C07 - inventario antes de reorganizar
Se conservan las 21 entradas del menu principal. Las nuevas herramientas se enlazan secundariamente desde Plataforma. ADMIN88_INVENTORY describe 90 rutas y 36 plantillas, incluidos placeholders y legacy. La propuesta de seis areas es documental y no modifica URLs ni elimina capacidades.
Registro historico: etapa B
ADR B01 - un repositorio y cuentas explicitas
Se extienden las entidades existentes en PostgreSQL. Cuenta y entorno son parte de la identidad, no atributos intercambiables de una URL. Una cuenta apunta al secreto mediante referencia; no contiene UID, password ni token. Los identificadores del proveedor no son PK internas y se guardan como texto. No se atribuyen expediciones de otra agencia a la cuenta actual.
ADR B02 - evidencia, observacion y proyeccion
La evidencia original cifrada es diferente de la observacion normalizada y de la proyeccion actual de shipment. La observacion conserva fecha capturada, fuente y hash; el replay reutiliza esa fecha. Una observacion antigua no pisa la proyeccion mas reciente. Los acontecimientos se conservan y versionan: un mismo codigo en dos momentos no es necesariamente un duplicado.
Los nombres/codigos postales minimos de busqueda son privados en BD; las direcciones y detalles completos se cifran. No se publican expediciones en 85. La autorizacion de acceso a datos y su retencion se aplicaran en las pantallas de etapa C; la nueva pantalla administrativa solo muestra totales.
ADR B03 - estados no equivalentes
Se separan estado administrativo, ciclo de vida, resultado y terminalidad. Un cierre no prueba entrega; una anulacion administrativa no demuestra tracking operativo; devolucion en curso no equivale a devuelto al remitente. Los codigos GLS conservan namespace y valor original. El nucleo admite otros transportistas sin compartir indebidamente las tablas de maestros GLS.
ADR B04 - creacion de un solo intento
1. Borrador de negocio cifrado e idempotency_key persistidos localmente. 2. Diario privado cifrado preparado y fsync previo al posible efecto externo. 3. Reserva de cuota y claim compare-and-set; attempts solo puede ser 0 o 1. 4. Marcador de dispatch duradero y una unica invocacion al sender. 5. Recibo original cifrado guardado antes de interpretar o hacer commit. 6. Ingesta de shipment/eventos y finalizacion de operation en una transaccion.
Si falla el commit, el recibo permite replay local, sin red. Si falla el fichero de recibo, se intenta conservar una copia cifrada en BD. Si faltan ambos, permanecen la intencion y el marcador: requiere conciliacion manual, no repeticion. Ninguna arquitectura local garantiza reconstruir un recibo que se perdio simultaneamente en red, disco y BD.
Un timeout no demuestra que GLS no haya creado el envio. Se mantiene el consumo incierto y el bloqueo de reenvio. Solo una prueba de no transmision permite devolver la reserva. El contador de peticiones confirmadas no se fabrica cuando se desconoce si hubo envio.
La futura recuperacion por identificador/referencia se preparara conforme al contrato de cada conector, con permiso y cuota propios; no se ejecuta automaticamente desde el replay.
ADR B05 - trabajos y reintentos solo de lectura
Reutilizar synchronizations con lease, prioridad y checkpoint por item. No instalar worker en esta fase. La cola solo acepta refresh_known, manual_import y pod_fetch. Las creaciones ambiguas nunca entran en una cola de reintentos. Los trabajos reanudados conservan items ya procesados y coverage parcial/completa explicita; parcial no se presenta como completo.
ADR B06 - cuotas compartidas, no consumo inventado
Las reservas se aplican a todos los ambitos requeridos en una transaccion, con locks ordenados y clave idempotente. El presupuesto habitual es 50 % del oficial conocido; el limite interno puede ser mas estricto. Si no hay cuota acreditada se exige limite interno, rotulado como tal.
La reserva se protege para prioridades interactivas. Solo una excepcion critica con permiso, motivo, vencimiento y coste acotado permite superar presupuesto/horario interno. Nunca salta el limite del proveedor. 429 crea cooldown, no un bucle de reintentos. El reset calendario oficial solo se usa si esta verificado; por defecto ventana movil conservadora.
La cuota puede ser compartida por credencial/familia y varias cuentas sin duplicar el secreto. El consumo legacy sin cuenta se imputa conservadoramente a los ambitos compatibles. Integrar todos los clientes legacy y acordar sus ambitos reales es condicion previa a afirmar control global efectivo.
ADR B07 - siguiente etapa y ausencia de efectos
El coordinador no trae un sender GLS conectado. Tres barreras locales: activacion del componente, interruptor global y flags de cuenta. Por defecto todo esta inactivo. No se modifican permisos ni comportamiento del laboratorio previo, que sigue siendo una herramienta distinta hasta su integracion. No se inicia 80 ni Cerrar dia. El contrato de cierre sigue pendiente.
ADR B08 - publicacion coordinada
El control administrativo y la publicacion usan un bloqueo compartido. Una actualizacion expresamente autorizada puede conservar el interruptor actual al aprobar el hash del release nuevo. Si el operador lo apaga, se respeta. Una combinacion incompleta de politica/estado falla cerrada con 503. El proceso 85 conserva su aislamiento, allowlist y hashes fijos.
Registro historico: decisiones A
Las decisiones de etapa A se conservan a continuacion como historial. La aprobacion de un release nuevo se coordina ahora por ADR B08; no se hereda habilitacion por el mero hecho de copiar archivos.
ADR A01 - publicacion separada
Puerto 85 sirve copias revisadas, no el arbol original. El runtime se instala como paquete minimo separado, usuario dedicado y filesystem de solo lectura. Se impide connect mediante el aislamiento del servicio; no usa PostgreSQL, credenciales, cliente GLS, ejecucion de documentos ni formularios.
ADR A02 - publicacion autorizada y fail-closed
Lista explicita de documentos, formatos pasivos, revision de datos personales, comparacion contra inventario real de secretos, validacion estructural JSON/HTML y hashes fijados en politica propiedad de root. No hay descubrimiento automatico de nuevos documentos privados. Las imagenes exigen revision visual expresa.
Los archivos aprobados se copian a una release independiente. Los originales no se modifican. El usuario del servicio publico no puede cambiar ni los archivos ni su politica. No basta con pasar unas expresiones regulares.
ADR A03 - control inmediato
El estado se lee en cada peticion; una sustitucion atomica controla nuevas solicitudes sin reiniciar. Una nueva release no hereda habilitacion de otra. Todos los resultados HTTP llevan no-store; no hay ETag/304 ni cache de contenido. Un proxy que ignore estas cabeceras debe configurarse expresamente sin cache.
No es posible retirar una copia que alguien haya descargado mientras el canal estaba habilitado; por eso solo se publica informacion autorizada. Una descarga que ya estaba en curso al deshabilitar no puede prometerse revocada.
ADR A04 - continuidad
Puerto 88 conserva sus funciones; no se crea cuenta especial de Work. Puerto 80 y los servicios comunes se abordaran despues de este primer hito. Persistencia y cuotas compartiran PostgreSQL existente, sin nuevo repositorio. La migracion pendiente no se registra para evitar su aplicacion al reiniciar.