diff --git a/app.md b/app.md index f3b83ee..150219f 100644 --- a/app.md +++ b/app.md @@ -2,7 +2,7 @@ name: unibus lang: go domain: infra -version: 0.8.0 +version: 0.9.0 description: "Bus de mensajería unificado sobre NATS+JetStream con cifrado E2E por room (megolm/olm reducido): service de membresía/claves, librería cliente y peers demo." tags: [service, messaging, nats, e2e] uses_functions: @@ -154,6 +154,30 @@ agent..{in,out} inbox/outbox de agente LLM (agent.scout.in) ## Capability growth log +- v0.9.0 (2026-06-07) — cierre de los gaps que el despliegue del cluster (report + 0011) dejó abiertos (report 0012). (GAP A) Nueva capability `membershipd user + add|list|revoke --store kv`: alta/baja de usuarios contra el KV replicado del + cluster EN MARCHA, sin el procedimiento de parar-sembrar-rearrancar. Usa la + conexión interna privilegiada — el daemon persiste su identidad de servicio con + `--internal-id-file` (cada nodo genera/carga la suya, 0600 junto a las claves TLS) + y la CLI, ejecutada por loopback en un nodo, presenta esa nkey que el + autenticador reconoce con permisos plenos de JetStream; ninguna identidad de + usuario normal puede tocar los buckets `KV_UNIBUS_*` bajo la ACL por-subject. El + alta es idempotente (re-alta de la misma clave = `ErrUserExists` explícito, sin + sobrescribir ni elevar rol), commitea con quórum 2/3 (HA, imprime + `followers_current`) y rechaza un destino remoto sin `--ca` (igual que + `migrate-to-kv`). (GAP B) Nuevo `cmd/clientcheck`: verificación end-to-end real + con un cliente autenticado (identidad operator, nkey+TLS+https) que crea una room + E2E, publica y recibe descifrado contra el cluster vivo, incluido un nodo parado a + media transmisión donde el cliente hace failover a un superviviente y sigue + recibiendo con cero pérdida (quórum 2/3) — el plano de datos que el chaos test del + 0011 nunca probó. (GAP C) Runbook `deploy/cluster/README.md` corregido: el orden + de arranque "magnus solo y verifica healthz" deadlockeaba (un nodo solo no tiene + quórum del meta-group y nunca sirve healthz); se documenta el arranque por quórum, + que R1 es un SPOF inservible (ir directo a R3) y la nueva vía de alta con el + cluster vivo. La plantilla de deploy (unit + `deploy-cluster.sh`) emite ya + `INTERNAL_ID_FILE` y el flag. Verificado contra los 3 VPS reales (magnus + homer + + datardos); posture enforce+ACL+TLS+R3 intacta. - v0.8.0 (2026-06-07) — completar y endurecer el cluster (issue 0006, fases 0006a–0006g) que cierra los bloqueantes de la auditoría dedicada del cluster (report 0008) y cablea el control plane descentralizado que 0003 dejó a medias.