v0.16 implemented in the three libraries, and the license CC BY-ND 4.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main
dev 2 hours ago
parent 569d8c369f
commit f2be6f086b

@ -15,18 +15,18 @@ Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
| Repo | Rama y commit | Tags | Qué es |
|---|---|---|---|
| `datekeys-go` | `v0.16` en `2c29625`, el borrador; `v0.15` en `6158be2`; `main` en `fe50885` | `spec-v0.15` en `fe50885`, y los de las versiones anteriores | Spec v0.15 aprobada, implementación de referencia, `testdata` compartido; `c49c67c` añade las palabras al azar, `27a75ee` el alfabeto de cada lista y la fuerza de las palabras, `96d8992` arregla `TestGenerate`, `e671032` añade la lista inglesa de la EFF, `92e7154` los dados y `aefc8f6` lo que dice el SDK al sellar |
| `App` (`datekeys-ts`) | `v0.10` en `e8b5d35`; `main` en `7650418` | `v0.4.0` en `7650418`, `v0.3.0`, `v0.2.0`, `v0.1.0` | Librería TypeScript `0.5.0-dev`, de la spec 0.15, y páginas `/inspect` y `/create`, con las palabras al azar; la última publicada es la 0.4.0 |
| `datekeys-dart` | `v0.15` en `e2296b0` | ninguno | Librería Dart completa, de la spec 0.15, con las palabras al azar; las ramas `v0.11` a `v0.14` se quedan atrás |
| `datekeys-go` | `v0.16` en `3fd0e93`, el borrador implementado; `v0.15` en `70d907b`; `main` en `fe50885` | `spec-v0.15` en `fe50885`, y los de las versiones anteriores | Spec v0.15 aprobada y borrador v0.16, implementación de referencia, `testdata` compartido. En `v0.15`, tras el tag: `c49c67c` las palabras al azar, `27a75ee` el alfabeto de cada lista y la fuerza de las palabras, `96d8992` arregla `TestGenerate`, `e671032` la lista inglesa de la EFF, `92e7154` los dados, `aefc8f6` lo que dice el SDK al sellar y `70d907b` la licencia CC BY-ND 4.0. En `v0.16`: el borrador (`a2b71c2`, `2c29625`) y su implementación (`7e3b810` a `3fd0e93`) |
| `App` (`datekeys-ts`) | `v0.10` en `59d7607`; `main` en `7650418` | `v0.4.0` en `7650418`, `v0.3.0`, `v0.2.0`, `v0.1.0` | Librería TypeScript `0.5.0-dev`, del borrador de la spec 0.16, y páginas `/inspect` y `/create`, con las palabras al azar; la última publicada es la 0.4.0, de la spec 0.15 |
| `datekeys-dart` | `v0.16` en `0609e9e`, el borrador; `v0.15` en `e2296b0` | ninguno | Librería Dart completa, del borrador de la spec 0.16, con las palabras al azar; las ramas `v0.11` a `v0.15` se quedan atrás |
| `docs` | `main` | — | Este repo |
| `web` | `main` en `f2b8a38` | — | Landing de datekeys.com, sin remoto |
- **Spec:** la v0.15 está aprobada desde el 7-10, con SHA-256 `45105e693be4187af4dd30f4d254402612587b6427c746f5d29f07a541c1e3f3`. Es la recuperación a largo plazo: el objeto release, los archivos y servicios de caché que guardan todas las rondas, el release en la mano en el paso 9.c (opción B: no se compara con el reloj) y el anexo de recuperación del §79. No cambia ningún formato de `.dkc` ni de `.dkk`. El borrador de la v0.16 está abierto en la rama `v0.16` (ver «Protocolo», punto 0). Las versiones aprobadas y sus SHA-256 están en `datekeys-go/spec/README.md`.
- **Spec:** la v0.15 está aprobada desde el 7-10, con SHA-256 `45105e693be4187af4dd30f4d254402612587b6427c746f5d29f07a541c1e3f3`. Es la recuperación a largo plazo: el objeto release, los archivos y servicios de caché que guardan todas las rondas, el release en la mano en el paso 9.c (opción B: no se compara con el reloj) y el anexo de recuperación del §79. No cambia ningún formato de `.dkc` ni de `.dkk`. El borrador de la v0.16 está abierto e implementado en las tres librerías, sin aprobar todavía (ver «Protocolo», punto 0). Las versiones aprobadas y sus SHA-256 están en `datekeys-go/spec/README.md`.
- **El fichero `.dkr` se descartó** antes de aprobar (7-10). El autor no lo había aprobado conscientemente, y no tiene sentido: al crear la cápsula no hay release que guardar, y cuando llega la ronda la cápsula ya se abre. El objeto release no tiene extensión propia; sale de un archivo o de un servicio de caché. El §76 lo registra.
- **Las tres implementaciones** coinciden en todos los vectores compartidos de `datekeys-go/testdata` en `fe50885`, 142 ficheros, los mismos que en `aefc8f6`, de donde TypeScript y Dart copian hoy `testdata`, `wordlists` y `annex`. Gates el 7-10:
- Go: `scripts/check.sh` entero en `fe50885`, con el anexo de recuperación abriendo fixtures sin código de DateKeys, y `scripts/fuzz.sh 20s` en `fe50885` con sus 27 objetivos, sin fallos; `scripts/check.sh` entero otra vez en `27a75ee`, `96d8992`, `e671032`, `92e7154`, `aefc8f6` y `6158be2`;
- TypeScript: `npm run verify` en `728c3bb`, con 8 132 pruebas;
- Dart: `tool/check.sh` en `e2296b0`, con 2 250 pruebas en la VM y 716 en Node.
- **Las tres implementaciones** coinciden en todos los vectores compartidos de `datekeys-go/testdata` en `3fd0e93`, el borrador v0.16, 150 ficheros, de donde TypeScript y Dart copian hoy `testdata`, `wordlists` y `annex`. Gates el 7-10 por la noche:
- Go: `scripts/check.sh` entero en `4f78854` y otra vez en `3fd0e93`, con el anexo abriendo con palabras y con un último bloque completo; en la v0.15, `scripts/fuzz.sh 20s` en `fe50885` con sus 27 objetivos, sin fallos;
- TypeScript: `npm run verify` en `59d7607`, con 8 273 pruebas;
- Dart: `tool/check.sh` en `0609e9e`, con 2 286 pruebas en la VM y 720 en Node.
- **Palabras al azar (7-10, después de cerrar la v0.15):** es el SHOULD de §38.1 de ofrecer palabras generadas; no cambia ningún formato ni la derivación.
- Go: `c49c67c` añade `wordkey.Generate`, `List` y `CheckList`, y `datekeys encrypt -new-words FICHERO [-dic es] [-word-count 7]`. `27a75ee` hace que `CheckList(lang, words)` compruebe cada palabra contra el alfabeto de su idioma, que da el código y no la lista (para `es`, de la `a` a la `z`, `á`, `é`, `í`, `ó`, `ú`, `ü` y `ñ`, en minúscula y NFC): una letra cirílica que parece latina, una mayúscula, una cifra o el retorno de carro de un fichero CRLF dejarían la cápsula sin abrir. También añade `Bits`, la fuerza de lo sorteado, que `encrypt` muestra (90 bits para 7 de 7 776). `scripts/check.sh` pasa entero en los dos.
- TypeScript (`0.5.0-dev`, de `012cd74` a `4057607`): `scripts/sync-testdata.mjs` copia del mismo commit de Go `wordkey/lists` en `wordlists/`, con su `SOURCE.json` (`testdata` y `wordlists` en `27a75ee`, cuyo `testdata` es el del tag). `wordlist.ts` hace lo de Go, con sus textos: `readWordList` solo acepta una lista con el SHA-256 fijado para su idioma, `checkWordList`, `generateWords` y `wordBits`. `/create` ofrece palabras al azar por defecto tras una casilla, con su fuerza y «Otras palabras», y deja escribir las propias con el aviso de que son más débiles; `licenses.txt` lleva la licencia de la lista. `npm run verify` pasa con 8 119 pruebas, y el flujo se comprobó en el navegador sobre el build de producción.
@ -44,7 +44,7 @@ Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
- **Las palabras propias** (§38.1): `/create` y la ayuda de la CLI dicen que no bastan para algo valioso y que no se use una contraseña de otro sitio, porque pasada la fecha la cápsula permite probarla.
- **El estado del perfil** (§71): `profile.Status`/`StatusOf` en Go, `profileStatusOf` en TypeScript, con la tabla de los perfiles fijados que trae cada versión, porque el registro firmado no existe: Quicknet, activo. Con un perfil que no esté activo no se escribe ninguna cápsula, y `decrypt`, `inspect` e `/inspect` avisan si el de una cápsula está comprometido.
- Go `aefc8f6` y `6158be2`, TypeScript `728c3bb` y `e8b5d35`, Dart `8eed96f` y `e2296b0` (de un agente Opus revisado contra Go: el anexo es una constante generada, `lib/src/recovery_annex.g.dart`, que escribe `tool/recovery_annex_copy.dart` tras cada sincronización que cambie `annex/`).
- Pendiente menor: el anexo es texto del spec, con licencia CC BY 4.0 (`spec/README.md`), pero ni su cabecera ni el README de Go lo dicen.
- **La licencia** (7-10, decisión del autor): el spec y su anexo son CC BY-ND 4.0, no CC BY 4.0, que no le gustaba. Se pueden copiar y compartir sin cambios, citando su origen; una versión modificada o una traducción necesita su permiso por escrito. El anexo lo dice en su cabecera (`70d907b`). Las listas de palabras conservan las suyas.
- **La revisión externa:** el paquete de [revision_externa/](revision_externa/NOTA_PARA_EL_AUTOR.md) está al día con la v0.15. Su nota dice qué decidió el autor y qué falta: elegir revisor, alcance y presupuesto, el NDA, los bundles y el envío.
---
@ -55,15 +55,12 @@ La recuperación a largo plazo quedó hecha con la v0.15, y las palabras al azar
### Protocolo
0. **El borrador de la v0.16 (7-10), con la revisión de Astra de la v0.15.** En la rama `v0.16` de `datekeys-go` (`a2b71c2` y `2c29625`), sin código todavía: `SpecVersion` sigue en 0.15. Las [decisiones para el autor](spec_v0.16/decisiones.md) traen ocho, con su recomendación. En resumen:
- un sello sin `accuracy` da S5, con su motivo, y uno propio para la política BTSP de ETSI (cláusulas comprobadas en los textos de ETSI);
- el anexo trae la llave de palabras (79.7), con una receta sin tablas para las letras de las listas y `UnicodeData.txt` 18.0.0 por su SHA-256 para lo demás. Se aparta de Astra en un punto: no hay paquete de recuperación, porque el anexo no puede dar el SHA-256 de un paquete que lo contiene y no hay sitio público donde alojarlo (decisión 5);
- el último bloque de `age` puede estar completo;
- la regla 21 guarda las cadenas sin la raíz y las respuestas OCSP que quepan, y dice lo que deja fuera;
- el JSON de drand se lee estricto: sin nombres repetidos, nombres exactos y una ronda entera de 1 a 2⁵³ − 1;
- las erratas de K17 y de `drand/kyber` que estaban pendientes (punto 1) ya van aquí.
Pendiente del autor: aprobar el borrador, y si el anexo dice en su cabecera que es CC BY 4.0. Al aprobarlo, se implementa en Go y después en TypeScript y Dart (ver «Al aprobar» en las decisiones).
0. **La v0.16, implementada y sin cerrar (7-10).** Es el borrador con la revisión de Astra de la v0.15; el autor pidió implementarla («ponte con la implementación de la 0.16»), y se tomó como aprobación de las ocho [decisiones](spec_v0.16/decisiones.md) con su recomendación.
- Go (`7e3b810` a `3fd0e93`, rama `v0.16`): el sello sin `accuracy` da S5 con su motivo (`capsule.SealReason`), y el escritor devuelve el veredicto del área que escribió (`Result.Security`, regla 19); el JSON de drand se lee estricto con un solo lector, también el de los relays; `scripts/recovery` abre con palabras (`-words`, y `-unicodedata` para otro texto que el de las listas), y sus dos normalizaciones dan las palabras de todos los casos de `wordkey.json`; dos fixtures nuevos, `format3_time_and_key_words` y `format3_full_chunk`; `security_cms.json` hecho de nuevo, 143 casos; `SpecVersion` 0.16.
- TypeScript (`f79d8e2`, `59d7607`) y Dart (`290d97e`, `0609e9e`), de dos agentes Opus revisados contra Go. TypeScript usa también el lector estricto para un release pegado en la página. Dart regeneró sus vectores propios desde un `git archive` de Go.
- Un tropiezo: las herramientas de edición convierten un escape `\u0072` en el carácter. Los casos «escaped as» de `release.json` llevaban un `round` llano en `b570338`; lo vio el agente de TypeScript y se arregló en `3fd0e93`. Ver la memoria.
- Pendiente del autor: cerrar la versión. Al cerrarla: la cabecera con «aprobado», el SHA-256 en `spec/README.md`, el anexo regenerado, el tag `spec-v0.16` y `main` en Go; TypeScript y Dart, sin cambios de código. El paquete de la revisión externa se pone al día.
- No hay paquete de recuperación (decisión 5): el anexo nombra `UnicodeData.txt` por su SHA-256.
1. **La revisión externa.** El paquete está listo; lo que falta es del autor. Al recibir el informe, se abre la versión siguiente con sus hallazgos, el párrafo de idioma y precedencia del final del §1, las etiquetas del §76 que hoy llaman independientes a revisiones de IA, y el registro de la revisión (§75, punto 10). Todo eso lo aprobó el autor el 6-10; ver [revision_externa/precedence_and_language.md](revision_externa/precedence_and_language.md).
2. **Un archivo o servicio de caché de releases** (§50). El protocolo ya lo admite y las librerías leen un archivo local, pero nadie aloja uno todavía. Es decisión del autor: dónde, quién lo mantiene y si DateKeys ofrece el suyo.
3. **Medir el área de 32 KiB y cerrar el perfil CMS** (§74; §75, punto 13), con firmas reales con certificado de varios países y sellos de autoridades reales. Necesita firmas del autor o permiso para pedir sellos a una autoridad pública.
@ -107,6 +104,7 @@ La recuperación a largo plazo quedó hecha con la v0.15, y las palabras al azar
- `words.datekeys.com` solo servirá las listas públicas: ficheros estáticos con el hash en la URL, el SHA-256 fijado en la app o un índice firmado por DateKeys. La clave de DateKeys firma; no cifra nada.
- **La app será auditable** (7-10): código publicado de todo lo que toca las llaves, builds reproducibles, releases firmadas y una auditoría externa (§59). Con eso, las palabras generadas por la app son la opción por defecto; los dados (diceware, lista numerada del 11111 al 66666 y publicada con su hash) quedan como opción para quien desconfíe, y las palabras propias con su aviso. Límite: en iOS la App Store vuelve a firmar y cifrar, y no se puede comprobar el binario; en Android sí (F-Droid). Dónde se publica el código está por decidir: ni GitHub ni el Gitea.
- **Sin fichero `.dkr`** (7-10): el objeto release no se guarda junto a la cápsula ni tiene extensión propia.
- **La licencia del spec es CC BY-ND 4.0** (7-10): copiar y compartir sin cambios, citando su origen; una versión modificada o una traducción, solo con su permiso. El código sigue siendo Apache-2.0.
- **`locator.Open` sigue leyendo como mucho 1 MiB** del localizador (6-10).
- **El cifrado tlock queda en `BigInt`, sin tiempo constante**, documentado en Dart y TypeScript («continúa», 6-10).
- **El reporte del posible fallo de dart2js** al equipo de Dart, solo con permiso del autor. Está documentado en el README de `datekeys-dart`.

@ -11,8 +11,8 @@ Para retomar el trabajo, lee [HANDOFF.md](HANDOFF.md): el estado de cada repo, l
| Carpeta | Qué es | Remoto |
|---|---|---|
| `datekeys-go/` | Especificación del protocolo (`spec/`), CDDL, testdata compartido e implementación de referencia en Go: librería y CLI | `go/DateKeys` |
| `datekeys-ts/` | Implementación en TypeScript y páginas `/inspect` y `/create`; la carpeta sigue llamándose `App`. Versión `0.4.0` (tag `v0.4.0`), de la especificación 0.15; en desarrollo, la `0.5.0`, con las palabras al azar | `go/DateKeys-App` |
| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.15`: todas las etapas hechas, de la 0 a la 7, las palabras al azar y los dados, con `testdata/` y `wordlists/` en `92e7154` de `datekeys-go`, cuyo `testdata` es el del tag `spec-v0.15`. La app Flutter está archivada desde el 6-10 | `go/dateKeys-dart`, desde el 6-10 |
| `datekeys-ts/` | Implementación en TypeScript y páginas `/inspect` y `/create`; la carpeta sigue llamándose `App`. Versión `0.4.0` (tag `v0.4.0`), de la especificación 0.15; en desarrollo, la `0.5.0`, con las palabras al azar y el borrador v0.16 | `go/DateKeys-App` |
| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.16`, del borrador v0.16: todas las etapas hechas, de la 0 a la 7, las palabras al azar y los dados, con `testdata/`, `wordlists/` y `annex/` en `3fd0e93` de `datekeys-go`. La app Flutter está archivada desde el 6-10 | `go/dateKeys-dart`, desde el 6-10 |
| `web/` | Landing de datekeys.com, con `api/enquiry.php` | ninguno |
| `docs/` | Este repositorio | `go/datekeys-doc`, desde el 6-10 |
| `brand/` | Logos | no es un repo |
@ -51,7 +51,7 @@ Para retomar el trabajo, lee [HANDOFF.md](HANDOFF.md): el estado de cada repo, l
| [revision_externa/](revision_externa/NOTA_PARA_EL_AUTOR.md) | El paquete para una revisión criptográfica externa, en inglés, con una [nota para el autor](revision_externa/NOTA_PARA_EL_AUTOR.md) |
| [diseno_recuperacion.md](diseno_recuperacion.md) | Diseño de la recuperación a largo plazo: el objeto de release, el reloj del paso 9.c, el archivo de releases y el anexo de recuperación, con las decisiones para el autor. Su fichero `.dkr` se descartó al aprobar la v0.15 |
| [spec_v0.15/](spec_v0.15/decisiones.md) | La v0.15, aprobada el 7-10, la recuperación a largo plazo: las [decisiones del autor](spec_v0.15/decisiones.md), sin el fichero `.dkr`, que se descartó |
| [spec_v0.16/](spec_v0.16/decisiones.md) | El borrador v0.16 (7-10), con la revisión de Astra de la v0.15: las [decisiones para el autor](spec_v0.16/decisiones.md), con su recomendación |
| [spec_v0.16/](spec_v0.16/decisiones.md) | El borrador v0.16 (7-10), con la revisión de Astra de la v0.15, implementado en las tres librerías y sin cerrar: las [decisiones para el autor](spec_v0.16/decisiones.md), con su recomendación |
| [spec_v0.9/](spec_v0.9/README.md) | Papeles de trabajo del borrador v0.9: diseño, revisiones y correcciones pendientes |
| [spec_v0.10/](spec_v0.10/formato3_diseno.md) | Formato de cápsula 3 en diseño, en tres entregas: varios ficheros, firma de autor y sello de tiempo. El diseño, con sus revisiones incorporadas, la revisión de Fable y la revisión final del borrador del spec |
| [spec_v0.11/](spec_v0.11/llave_palabras.md) | Papeles de trabajo de la v0.11, ya etiquetada. Contiene: <br>la [llave de palabras](spec_v0.11/llave_palabras.md); <br>la [consulta a Fable y Astra sobre el tamaño del área de firmas y sellos](spec_v0.11/area_firmas_para_revision.md) y [su propuesta](spec_v0.11/revision_fable_astra.md); <br>la [revisión del borrador](spec_v0.11/revision_borrador.md); <br>la [revisión de lo hecho en la sesión del 1 y 2 de octubre](spec_v0.11/revision_sesion_1_2_octubre.md), con los fallos pendientes de arreglar |

@ -2,6 +2,8 @@
*7 de octubre de 2026. El borrador está en la rama `v0.16` de `datekeys-go` (`2c29625`), en `spec/DateKeys_Protocol_Specification_v0.16.md`. Recoge la revisión de Astra de la v0.15, con la dirección acordada tras su segunda y su tercera respuesta: cinco hallazgos, todos comprobados contra el texto y el código. Todavía no hay código: `SpecVersion` sigue en 0.15, y el anexo que escribe la CLI es el de la v0.15.*
> **Nota del 7-10 por la noche.** El autor pidió implementarla («ponte con la implementación de la 0.16»), y se tomó como aprobación de las ocho decisiones con su recomendación. Está implementada en Go (`7e3b810` a `3fd0e93`), TypeScript (`f79d8e2`, `59d7607`) y Dart (`290d97e`, `0609e9e`), con los tres gates en verde. Falta cerrarla con su tag. La licencia quedó decidida: CC BY-ND 4.0, también en la cabecera del anexo (`70d907b`).
Si apruebas lo que sigue tal como está, basta con decir «apruebo el borrador». Después se implementa en Go, con sus vectores, y se lleva a TypeScript y a Dart. La versión se cierra con su tag cuando las tres pasen.
## Lo que hace el borrador
@ -71,7 +73,7 @@ No cambia ningún formato. Cambian dos veredictos, el del sello sin `accuracy` y
## Lo que queda para después
- **La revisión externa.** Su paquete sigue en la v0.15. Al cerrar la v0.16 se le añade este cambio, que responde a una revisión.
- **La licencia del anexo.** El anexo es texto del spec, CC BY 4.0, y ni su cabecera ni el README de Go lo dicen. Está pendiente de tu respuesta: si apruebas añadirla, irá en la cabecera que genera `annex_test.go`.
- **La licencia del anexo.** Decidida el 7-10: el spec es CC BY-ND 4.0, y la cabecera del anexo lo dice (`70d907b`).
## Al aprobar

Loading…
Cancel
Save

Powered by TurnKey Linux.