From 18f2b004d22d217f864fbd8feca7cb9393a64223 Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 29 Sep 2026 14:41:42 +0200 Subject: [PATCH] Handoff: v0.9 approved and format 2 implemented in Go (f24a280) Co-Authored-By: Claude Opus 5.5 --- HANDOFF.md | 71 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 23 deletions(-) diff --git a/HANDOFF.md b/HANDOFF.md index 9608f1b..510662f 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,6 +1,6 @@ -# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 29 a mediodía) +# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 29 por la noche) -Estado al parar la sesión del 26 por el límite semanal de uso. Se actualizó el 28 de septiembre tras cerrar la v0.8.2 del spec (§2.1), el 29 de madrugada tras cerrar la fase 2 (§2.2) y el 29 a mediodía tras reorganizar el espacio de trabajo (§0). Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude. +Estado al parar la sesión del 26 por el límite semanal de uso. Se actualizó el 28 de septiembre tras cerrar la v0.8.2 del spec (§2.1), el 29 de madrugada tras cerrar la fase 2 (§2.2) el 29 a mediodía tras reorganizar el espacio de trabajo (§0) y el 29 por la noche tras implementar el formato 2 de la v0.9 en Go (§2.5). Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude. --- @@ -34,7 +34,7 @@ Los repos con remoto están en el Gitea privado `g.activething.com` (solo LAN, c |---|---|---|---| | `datekeys-go` (`go/DateKeys`) | `main` | `3e4755e` | Spec v0.8.2 cerrada, con el tag anotado **`spec-v0.8.2`** en `9ac9cd9`. Después, `datekeys.SpecVersion`, `datekeys.Version()` y `datekeys version`, sin cambios en `testdata`. | | | `v0.8.2` | `9ac9cd9` | El commit del tag; ya no hace falta. | -| | `v0.9` | `4a025d1` | Borrador del spec v0.9 con las 22 correcciones del repaso final, sin aprobar (§2.5). | +| | `v0.9` | `f24a280` | Spec v0.9, aprobada por el autor el 29-09, e implementación del formato 2 con sus fixtures y mutaciones. `scripts/check.sh 60s` limpio. Falta el tag `spec-v0.9` (§2.5, paso 4). | | `datekeys-ts`, antes `App` (`go/DateKeys-App`) | `main` | `5ee8813` | Desde `5ee8813`, sin `docs/` y con el paquete `datekeys-ts` (§0). Versión `0.1.0-dev`, que implementa el spec 0.8.2 (`VERSION` y `SPEC_VERSION`, también en el pie de la página). Librería TypeScript con la inspección (pasos 1 a 8) y la apertura (pasos 9 a 18), en memoria o desde un `Blob` hacia un stream de salida, como un fichero OPFS. Página `/inspect` con la acción "abrir". `testdata` sincronizado a `9ac9cd9`. Fase 2 completa (pasos 2 a 8), incluidos el cifrado tlock y la interoperabilidad de TypeScript a Go. Los 65 casos del corpus pasan por `open` con el código y el paso de Go. 2 611 tests, ninguno saltado; `npm run verify` en verde. | | `docs` (solo local) | `main` | | Este repo: handoff, planes, revisiones y reglas. | | `web` (solo local) | `main` | `f2b8a38` | Landing de datekeys.com. | @@ -86,19 +86,27 @@ La lectura del protocolo del 28-09 deja dos SHOULD para más adelante: §48 (var El vector de GT (`vectors/tlock_ibe.json`) ya está cubierto en `App`. El paso 9 de `open.ts` debe seguir la corrección 6: cualquier fallo de una fuente es `ERR_RELEASE_UNAVAILABLE` y ningún otro código. -### 2.5 Sesión del 29-09 por la noche: fase 3 y v0.9 del spec (retomar aquí) +### 2.5 Sesiones del 29-09: v0.9 del spec y formato 2 en Go (retomar aquí) -**Estado al parar:** -- `datekeys-go`, rama `v0.9` (`4a025d1`, subida): borrador del spec v0.9, sin aprobar, en `spec/DateKeys_Protocol_Specification_v0.9.md`, con `spec/datekeys.cddl` y la entrada v0.9 de `spec/README.md`. `main` no cambia. -- El repaso final encontró 22 problemas, no 21, cada uno con su arreglo propuesto: [spec_v0.9/review.md](spec_v0.9/review.md). El 29-09 a mediodía no había ninguno aplicado. -- **Hecho el 29-09 (`4a025d1`):** aplicadas las 22 correcciones, más cuatro sitios que repetían los mismos problemas: las reglas 1 y 4 del §62.1 y los cambios 4 y 10 del §76. Los números de la corrección 1 se recalcularon con un Padmé en BigInt, y `go test ./...` pasa. +**Estado al parar (29-09 por la noche):** +- `datekeys-go`, rama `v0.9` (`f24a280`, subida): el spec v0.9, aprobado por el autor, y su implementación en la referencia Go. `main` no cambia hasta el tag (paso 4). +- Las 22 correcciones del repaso final ([spec_v0.9/review.md](spec_v0.9/review.md)) se aplicaron en `4a025d1`, más cuatro sitios que repetían los mismos problemas: las reglas 1 y 4 del §62.1 y los cambios 4 y 10 del §76. Los números de la corrección 1 se recalcularon con un Padmé en BigInt. - La corrección 2 la decidió el autor el 29-09: se suaviza el §56. - El lector MUST NOT presentar el contenido como válido antes de que termine el paso 17. - Un lector en streaming MUST NOT escribir el relleno y MUST señalar el error para que se descarte lo escrito. - Así siguen valiendo `Open(dst)` de Go y la salida en streaming de TypeScript. -- La corrección 10 redacta la pregunta abierta 4 como MAY: solo un generador de vectores de prueba puede escribir el formato 1 (§62.1, regla 1, y §70). El autor puede cambiarlo al aprobar el texto. - En este repo están [PLAN_fase3_escritura.md](PLAN_fase3_escritura.md), el plan del writer TypeScript, y [REVISION_completitud_protocolo.md](REVISION_completitud_protocolo.md), la revisión del protocolo. El plan describe aún el writer de la v0.8.2 y hay que replantearlo sobre la v0.9. +**Aprobación del 29-09.** El autor aprobó el texto de la v0.9 con las respuestas recomendadas a las preguntas abiertas: +1. L es un `bstr` de 8 bytes, no un `uint`. +2. El lector SHOULD informar del formato. +3. Se mantienen el objetivo 8 de §4 y el no objetivo nuevo de §5. +4. Solo un generador de vectores de prueba MAY escribir el formato 1 (§62.1, regla 1, y §70). +5. Los fixtures nuevos llevan el prefijo `format2_`. +6. Se mantiene D1: los señuelos son identidades generadas cuya clave privada se descarta en el acto. +7. Rechazar puntos del twist sigue siendo MAY. +8. Se confirman las reglas añadidas: L_MAX = 2⁵³ − 2⁴⁶, el orden uniforme de los stanzas, que el SDK SHOULD mostrar el instante efectivo de la ronda y que el lector MAY comprobar la longitud de PAYLOAD_AGE. + **Decisiones del autor del 29-09 para la v0.9:** - D1: `time_and_key` lleva siempre exactamente 16 stanzas X25519 en `INNER_ACCESS_AGE`. Los que sobran son señuelos, y todos van en orden aleatorio. Como mucho hay 16 credenciales, contando la `.dkk`. - D2: el contenido se rellena siempre. El código 1 redondea al siguiente múltiplo de 256, con un mínimo de 256. El código 2, "reforzado", es max(bloque256, Padmé) y es el de por defecto. No hay opción sin relleno. @@ -113,23 +121,40 @@ El vector de GT (`vectors/tlock_ibe.json`) ya está cubierto en `App`. El paso 9 - el escritor se autocomprueba; - rechaza claves X25519 no canónicas o de orden bajo. -**Preguntas abiertas del borrador para el autor:** -1. L como `bstr` de 8 bytes, no como `uint`. -2. Si el lector informa del formato con SHOULD o con MAY. -3. Si se mantienen el objetivo 8 de §4 y el no objetivo nuevo de §5. -4. Un generador de pruebas que escriba el formato 1. Está redactada como MAY (corrección 10). -5. El prefijo `format2_` en los fixtures. -6. Señuelos como claves públicas aleatorias válidas, sin clave privada. -7. Puntos del twist: MAY o SHOULD. - -Hay además dos reglas añadidas fuera de D1-D7 que confirmar: L_MAX = 2⁵³ − 2⁴⁶ y el orden uniforme de los stanzas. La tercera, la del §56, ya está decidida: se suaviza (corrección 2). +**Hecho en Go, paso 3 (`f24a280`):** +- **Formato 2 en la librería:** + - `capsule`: `Format`, `Padding`, `PaddedLength`, `PayloadAgeLength`; `EncodeControl` y `DecodeControl` reciben el formato; `Open` aplica los pasos 12 a 18 del formato 2. + - `agewrap`: `AccessSlots` y `CheckX25519Recipient`. +- **Escritura:** + - `Encrypt` escribe solo el formato 2. + - `EncryptOptions.Length` es obligatorio; `Padding` es reforzado por defecto. + - Acepta de 1 a 16 credenciales, con señuelos, orden aleatorio y autocomprobaciones. + - La CLI mide la entrada, acepta `-padding` e informa del formato. +- **`testdata`:** + - 7 fixtures `format2_*`, dos de ellos con `.dkk`; + - `vectors/padding.json`; + - los vectores CBOR del formato 2; + - un corpus de mutaciones de 125 casos: 88 del §64 (33 en cada formato y los 22 de la tercera lista) y 37 más; + - un diferencial de 4 380 casos, en el que los 1 825 anteriores no cambian. + - Los fixtures del formato 1 se conservan byte a byte. +- **Mutaciones sin aleatoriedad:** se vuelven a sellar los fixtures con sus claves y nonces conocidos (`internal/testkit/reseal.go`), así que se regeneran byte a byte. +- **`scripts/check.sh 60s` limpio:** + - cobertura: codec 100 %, capsule 94,2 %, accesskey 97,2 %, datekey 94,6 %, agewrap 92,8 %; + - govulncheck, con los mismos dos avisos de §1; + - 60 s de fuzzing en cada uno de los 15 objetivos. +- **Documentación:** la copia del spec del repo pierde las marcas "(por implementar)". README, README.es, CHANGELOG, `docs/traceability.md` y `testdata/README.md` están al día. **Orden de trabajo:** 1. Aplicar y verificar las 22 correcciones. Hecho el 29-09 (`4a025d1`). -2. El autor aprueba el texto de la v0.9, con las preguntas abiertas y las dos reglas de arriba. -3. La referencia Go implementa el formato 2, con fixtures nuevos y mutaciones, y pasa `check.sh`. -4. Se pone el tag `spec-v0.9`. -5. `datekeys-ts` sincroniza `testdata` y el lector TypeScript abre el formato 2. +2. El autor aprueba el texto de la v0.9. Hecho el 29-09. +3. La referencia Go implementa el formato 2, con fixtures nuevos y mutaciones, y pasa `check.sh`. Hecho el 29-09 (`f24a280`). +4. Se pone el tag `spec-v0.9`. Pendiente de que el autor lo autorice: + - avanzar `main` hasta `v0.9`; + - anotar el SHA-256 del spec en `spec/README.md` y en el mensaje del tag. +5. `datekeys-ts` sincroniza `testdata` y el lector TypeScript abre el formato 2. Cambia, además de los ficheros nuevos: + - los `.inspect.json` del formato 1 ganan el campo `format`; + - los registros de los fixtures dicen `"spec": "0.9"` y ganan `format`, `payload_length` y la etapa 17; + - el corpus de mutaciones pasa de 65 a 125 casos, y "version changed" escribe `VERSION` 3. 6. Se replantea el plan de la fase 3 y se escribe el writer TypeScript del formato 2. **Conclusiones de la conversación, sin decisión pendiente:**