# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 6 de octubre por la noche: etapas 2 a 5 de Dart, y 6a y 7a)
# Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 6 de octubre por la tarde: la librería Dart, completa)
Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude. Las secciones 0 a 4, al final, son el historial; el estado actual es este apartado.
@ -6,37 +6,36 @@ Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
---
## Retomar aquí (para la sesión del 7 de octubre)
## Retomar aquí
**Para empezar:**
1. Abre la sesión en `G:\bussines\datekeys`, la raíz, no en `App`. Comprueba que corre en Opus. La memoria buena es la de la raíz.
2. Comprueba los repos con `git status` y `git log`. Todos estaban limpios y subidos al cerrar:
- `datekeys-go`: rama `v0.12` en `c531e93`;
- `App`: rama `v0.10` en `289fe71`;
- `datekeys-dart`: rama `v0.11` en `b23a0ee`, con el remoto `go/dateKeys-dart`, que el autor creó el 6-10;
- `docs`: rama `main` en el commit de este handoff, con el remoto `go/datekeys-doc`, creado también el 6-10.
3. **Dart, fase 2 de las etapas 6 y 7.** Las dos partes van en paralelo, con el esquema de siempre:
- un agente Opus por parte, uno en la copia principal y otro en un worktree junto a los repos;
- solo ficheros nuevos, y los cambios a los comunes en un último commit;
- después, la sesión revisa contra Go, integra con `rebase`, pasa `tool/check.sh` y sube.
[PLAN_dart.md](PLAN_dart.md) tiene, al final, la revisión de cada parte y el esquema de los encargos.
- **6b, el escritor de cápsulas del formato 3,** sobre la 6a:
- el área de 32 KiB, `time_only` y `time_and_key`, la `.dkk`, la llave de palabras y la nota;
- los 16 huecos con señuelos y su orden al azar, con `permute` de la 6a, que es la de Go;
- el relleno, la longitud del `.dkc` antes de escribirlo y las reglas del §62.1 con sus autocomprobaciones;
- la escritura en streaming;
- los enganches de firma CMS y de sello, como `CMSSigner` y `Sealer` de Go;
- interoperabilidad: Go abre con cada credencial lo que escribe Dart y lo vuelve a codificar a los mismos bytes, como hizo TypeScript con `capsule-vectors.json`. Con el azar fijo, las secciones deterministas salen iguales que las de Go.
- **7b, las claves de autor y el sellado del localizador:**
- `authorkey` de Go: generar una clave, `dkauthor1…` y su fichero cifrado con scrypt de logN 16, que se escribe con `ScryptRecipient` de la 6a;
- la firma Ed25519, en código propio, como la de TweetNaCl, con el SHA-512 de `package:crypto`;
- `Seal` y `NewEnvelope` del localizador, sobre `TimeRecipient` y `ageEncrypt` de la 6a, y la parte ya portada en la 7a, `splitEnvelope`.
- **Al final:** la firma `alg` 1 en el escritor, con la clave de autor de la 7b.
La API de la 6a y la 7a está en el README y en el CHANGELOG de `datekeys-dart`.
**Qué hizo la sesión del 5 y 6 de octubre.** Corrió en Opus 5.5. Se abrió en `App` y pasó a la raíz sin cerrarse. Cada parte la hizo un agente Opus, y la sesión la revisó contra Go, la integró y pasó el gate. Ninguna revisión encontró fallos.
2. Comprueba los repos con `git status` y `git log`:
- `datekeys-go`: rama `v0.12` en `c531e93`, subida;
- `App`: rama `v0.10` en `289fe71`, subida;
- `datekeys-dart`: rama `v0.11` en `d77ef9e`;
- `docs`: rama `main` en el commit de este handoff.
Si al cerrar la sesión del 6-10 por la tarde no se subieron `datekeys-dart` y `docs`, lo dice el apartado siguiente.
3. **Lo siguiente lo decide el autor.** La librería Dart está completa: todas las etapas del plan. Lo abierto:
- las cinco decisiones pendientes del localizador, en el apartado de la sesión del 5 y 6 de octubre, que tocan a Go primero;
- la aprobación del borrador v0.12 y la medida del área de 32 KiB;
- el TypeScript: el localizador, la nota en la página y cerrar `0.2.0`;
- la app Flutter, que ya puede usar la librería como dependencia de ruta.
**Qué hizo la sesión del 6 de octubre por la tarde.** Corrió en Opus 5.5, abierta en la raíz. El autor dijo «SI» a la fase 2 de las etapas 6 y 7 de Dart:
- **6b, el escritor del formato 3** (`4c9bc72` a `6239e30`), de un agente Opus en la copia principal: escribe cápsulas byte a byte como `EncryptFiles` de Go con los mismos valores al azar, y Go las abre con cada credencial.
- **7b, las claves de autor y el sellado del localizador** (`3358f5c` a `d77ef9e`), de otro agente Opus en un worktree: `authorkey`, la firma Ed25519 propia, y `Seal` y `NewEnvelope`, también byte a byte como Go.
- **Integración:** la 7b, encima de la 6b con `rebase`. El enganche de la firma de `alg` 1 pasó a llamarse `AuthorSigner`, y la `AuthorKey` de la 7b lo implementa: el escritor firma ya con la clave real. El gate pasa con 2 059 pruebas en la VM y 665 en Node.
- **Revisión** de la sesión contra Go: sin fallos. Los detalles están en [PLAN_dart.md](PLAN_dart.md), al final.
- **Cosas de Go que Dart copia,** encontradas por los agentes:
- el texto de `PublicString` de `authorkey` con una clave de otra longitud tiene los números al revés: «a public key has 32 bytes, not 31»;
- el error de una nota pública con un carácter de control habla del «declared author», ya anotado el 5-10;
- un comentario que es solo `\r` pasa a `\n` y se acepta.
## La sesión del 5 y 6 de octubre (histórico: lo actual está arriba)
**Qué hizo.** Corrió en Opus 5.5. Se abrió en `App` y pasó a la raíz sin cerrarse. Cada parte la hizo un agente Opus, y la sesión la revisó contra Go, la integró y pasó el gate. Ninguna revisión encontró fallos.
- **`datekeys-go`:** `internal/pathrule/gen -dart` escribe las tablas de Unicode para Dart. Es `c531e93`, subido.
- **Etapas de Dart:**
- **2**, primitivas y `age`; y **3**, BLS12-381 y tlock, en paralelo;
@ -11,7 +11,7 @@ Un paquete Dart **puro**: sin Flutter y sin plataforma.
Estado de la máquina: el 5-10, Flutter está instalado en `C:\dev\flutter`, y su Dart 3.13.0 es el `dart` del PATH. La librería no necesita Flutter; la app sí.
**Hecho:** las etapas 0 a 5 y las partes 6a y 7a, el 5 y el 6-10, en la rama `v0.11` de `datekeys-dart`, hasta `b23a0ee`. Los commits de cada parte están al final de este plan, y el estado de cada etapa en el README del repo.
**Hecho:** todas las etapas, 0 a 7, el 5 y el 6-10, en la rama `v0.11` de `datekeys-dart`, hasta `d77ef9e`. Los commits de cada parte están al final de este plan, y el estado de cada etapa en el README del repo.
## Decidido (2 de octubre)
@ -252,7 +252,23 @@ La revisión de la sesión comparó `securitycms.dart` con `signature2.go`: el o
El gate pasa con 1 713 pruebas en la VM y 432 en Node.
**Fase 2, para la sesión siguiente, en paralelo:**
- **6b:** el escritor de cápsulas del formato 3, con el área, `time_only` y `time_and_key`, la `.dkk`, la llave de palabras, la nota, los señuelos, las autocomprobaciones del §62.1, los enganches de firma CMS y de sello, y la interoperabilidad con Go.
- **7b:** las claves de autor `dkauthor1…`, con la firma Ed25519 y su fichero cifrado con scrypt de logN 16, y el `Seal` y el `NewEnvelope` del localizador.
- **Al final:** la firma `alg` 1 en el escritor.
**Fase 2, hecha, revisada e integrada el 6-10.** El autor dijo «sí» a lanzarla. Dos agentes Opus en paralelo, con el esquema de siempre: la 6b en la copia principal, rama `v0.11`, y la 7b en el worktree `datekeys-dart-stage7b`, rama `stage7b`, desde `b23a0ee`. La 7b se integró encima de la 6b con `rebase`; el worktree y la rama están borrados. El gate pasa con 2 059 pruebas en la VM y 665 en Node, y `v0.11` está en `d77ef9e`.
- **6b, el escritor de cápsulas del formato 3:**`4c9bc72` a `6239e30`.
- `encrypt3.dart`: `encryptFiles`, port de `EncryptFiles`, `sealer` y el área de seguridad, con `EncryptOptions`, `FileSource`, `EncryptResult`, `CapsuleWriteException` y los enganches `AuthorSigner`, `CmsSigner` y `Sealer`, que pueden devolver un `Future`. El reloj es la opción `now`, obligatoria. El sink se cierra solo con la cápsula completa y comprobada, y se aborta ante cualquier fallo.
- Vectores de Go, como una prueba de Go en una exportación: 87 recetas. Las 21 cápsulas salen iguales byte a byte, con su `.dkk`, su resultado y los mismos valores al azar en el mismo orden; los 66 errores dan el mismo texto, el mismo código y los mismos bytes escritos antes.
- En la otra dirección, Go abre con cada credencial las 12 muestras de Dart, sola y todas juntas, y vuelve a codificar cada capa a los mismos bytes.
- Las pruebas detectaron los 20 fallos inyectados.
- Una diferencia a propósito: Go sella un control de prueba para medir `SEALED_CONTROL`; Dart calcula la longitud y saca y descarta los mismos valores al azar, para que los siguientes coincidan. El formato 2 (`Encrypt`) no se porta.
- Tiempos: una cápsula pequeña `time_only`, 48 ms en la VM y 0,71 s en Node; un fichero de 64 MiB, 4,7 s en la VM, por el SHA-256.
- **7b, las claves de autor y el sellado del localizador:**`3358f5c` a `d77ef9e`.
- `authorkey.dart`, port de `authorkey`: `AuthorKey`, las cadenas `dkauthor1…` y `DKAUTHOR-SECRET-KEY-1…` y el fichero cifrado con scrypt de logN 16. `go_unicode.dart`, generado con Go, da la caja y los espacios de Go, para que los textos de error coincidan con cualquier entrada.
- `ed25519_sign.dart`: la firma de TweetNaCl con el SHA-512 de `package:crypto`, exacta en la VM y en JavaScript, sin `BigInt` con secretos.
- `locator_seal.dart`: `sealLocator` y `newEnvelope`, `Seal` y `NewEnvelope` de Go.
- Con los mismos valores al azar, Dart escribe los bytes de Go en todos los casos, y Go abre las 15 muestras de Dart. Las pruebas detectaron los 20 fallos inyectados.
- Diferencias: tras `clear`, la clave lanza un `StateError`, donde Go firma con una clave a ceros; y se copia un fallo de Go, el texto de `PublicString` con los números al revés.
- Tiempos en la VM: una firma, 4,5 ms; el fichero de clave, 0,57 s al escribirlo y al leerlo.
- **Al integrar:** la interfaz de la firma de `alg` 1, que la 6b llamaba `AuthorKey`, pasa a `AuthorSigner`, y la `AuthorKey` de la 7b la implementa. Las pruebas del escritor firman las cápsulas de `alg` 1 con la clave de la semilla de Go, y escriben los mismos bytes que Go.
La revisión de la sesión comparó con Go `EncryptFiles`, `newSealer`, `newHead`, `security`, `write`, `readSource`, `accessRecipients` y `fillSlots`, y `authorkey`, `Seal` y `NewEnvelope`. No encontró fallos. Una nota menor: si `AuthorSigner.sign` lanza, el error no lleva el prefijo `capsule:`; en Go esa firma no puede fallar.
**Con esto están hechas todas las etapas del plan.**
@ -12,7 +12,7 @@ Para retomar el trabajo, lee [HANDOFF.md](HANDOFF.md): el estado de cada repo, l
|---|---|---|
| `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ágina `/inspect` | `go/DateKeys-App` |
| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.11`: etapas 0 a 5 hechas,`testdata/` en `c531e93` (el borrador v0.12), y la 6 y la 7 en marcha | `go/dateKeys-dart`, desde el 6-10 |
| `datekeys-dart/` | Librería Dart para la app Flutter, según [PLAN_dart.md](PLAN_dart.md). Rama `v0.11`: todas las etapas hechas, de la 0 a la 7, con`testdata/` en `c531e93` (el borrador v0.12) | `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 |