35 KiB
Handoff DateKeys, 26 de septiembre de 2026 (actualizado el 30 por la noche: el formato 3 implementado en la referencia Go y la spec v0.10 cerrada con su tag)
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 y en TypeScript, poner el tag spec-v0.9 y escribir el writer TypeScript con su interoperabilidad con Go (§2.5). El 30 de madrugada se diseñó el formato de cápsula 3 y Fable lo revisó; a mediodía se aplicaron al diseño esa revisión y las decisiones del autor, y quedó separado en tres entregas; por la tarde, el autor cerró las preguntas de la entrega 1, y se redactó y revisó el borrador del spec v0.10 (§2.5, al final). Por la noche, el autor aprobó ese borrador, con Unicode 18.0.0 y la regla de invisibles, y la referencia Go implementó el formato 3 (§2.5, al final). Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
0. Reorganización del espacio de trabajo (29-09, mediodía)
G:\bussines\datekeys se reorganizó el 29-09. El mapa de carpetas y las reglas del proyecto están ahora en el README de este repo. Los cambios:
- Documentos: los del proyecto, este incluido, pasaron de
App/docsa este repo,docs, que es privado y no tiene remoto. Su primer commit es6e8d6c6. Los papeles de trabajo de la v0.9, que solo estaban en una carpeta temporal, están en spec_v0.9/. App: quitódocs/, y el paquete, el README y el aviso de licencias del sitio pasan a llamarsedatekeys-ts(5ee8813, subido).npm run verifysigue en verde, con 2 611 tests.- Archivo y logos:
AppOldpasó aarchive/prototype, sin cambios;- los borradores v0.1 a v0.8.1, que estaban en Descargas, pasaron a
archive/spec-drafts, con los hashes comprobados; - los logos pasaron a
brand/.
- Claude:
- la memoria de Claude es ahora la de la raíz. La de
Appqueda congelada, con una nota que remite a la nueva; - en la raíz hay un
CLAUDE.md, que carga el README, y un.claude/launch.jsonpara las vistas previas.
- la memoria de Claude es ahora la de la raíz. La de
- Nombres: en las secciones siguientes,
Appes el repo que ahora se llamadatekeys-ts. Su remoto sigue siendogo/DateKeys-App.
Pendiente del autor, antes de seguir:
- Cerrar la sesión abierta en
Appy renombrar la carpeta adatekeys-ts. Windows no deja renombrar una carpeta en uso. - Abrir las sesiones siguientes en
G:\bussines\datekeys. La primera compruebanpm run verifyynpm run testdata:checkendatekeys-ts. - Borrar
G:\bussines\datekeys\enquiry.php, que es una copia idéntica deweb/static/api/enquiry.php. Claude no tiene permiso para borrarlo. docsywebsolo existen en esta máquina. Para tener una copia fuera de ella, hay que darles un remoto.
El 30-09 a mediodía seguían pendientes los cuatro: la carpeta se llama todavía App, y la sesión de ese día también se abrió en ella.
1. Repositorios
Los repos con remoto están en el Gitea privado g.activething.com (solo LAN, certificado autofirmado para git.activething.com; git funciona, curl necesita -k). Ese servidor no es del autor: no se proponen cambios en él. La integración continua es el gate local.
| Repo | Rama | Commit | Estado |
|---|---|---|---|
datekeys-go (go/DateKeys) |
main |
cc35d2c |
Spec v0.10, entrega 1 del formato 3, aprobada por el autor el 30-09 y cerrada con el tag anotado spec-v0.10 en cc35d2c; SHA-256 del spec 7f26419a444aa3e89a3aa8afbbba9d952af69e048aee1e93cd70732c2d1d99d1. Implementa el formato 3: lo escribe y lee los formatos 1 a 3, con SpecVersion 0.10. scripts/check.sh 60s limpio. La v0.9 sigue en su tag, spec-v0.9 (7e2d83c), y la v0.8.2 en el suyo, spec-v0.8.2 (9ac9cd9). |
v0.8.2 |
9ac9cd9 |
El commit del tag; ya no hace falta. | |
v0.9 |
7e2d83c |
El commit del tag spec-v0.9; ya no hace falta. |
|
v0.10 |
cc35d2c |
Igual que main; ya no hace falta. |
|
datekeys-ts, antes App (go/DateKeys-App) |
main |
da26862 |
Desde 5ee8813, sin docs/ y con el paquete datekeys-ts (§0). Versión 0.2.0-dev desde 8c08c97, con v0.1.0 cerrada en d577283; implementa el spec 0.9 desde 0118890 (VERSION y SPEC_VERSION, también en el pie de la página). Escribe el formato 2 y tiene la página /create (fase 3, §2.5). Librería TypeScript con la inspección (pasos 1 a 8) y la apertura (pasos 9 a 18) de los formatos 1 y 2, en memoria o desde un Blob hacia un stream de salida, como un fichero OPFS. Página /inspect con la acción "abrir", que muestra el formato y avisa del 1. testdata sincronizado a 7e2d83c (spec-v0.9). Fase 2 completa (pasos 2 a 8), incluidos el cifrado tlock y la interoperabilidad de TypeScript a Go. Los 125 casos del corpus pasan por open con el código, el paso y el texto de Go. En 0118890, 5 425 tests, ninguno saltado; la fase 3 añadió los suyos, con npm run verify en verde en cada paso (§2.5). |
docs (solo local) |
main |
Este repo: handoff, planes, revisiones y reglas. | |
web (solo local) |
main |
f2b8a38 |
Landing de datekeys.com. |
archive/prototype, antes AppOld (solo local) |
master |
4d2b0a1 |
Prototipo antiguo. No se toca. |
Verificación ya hecha sobre datekeys-go:
- fuzzing de 30 min en cada uno de los 15 objetivos sobre
3820066, limpio; - diferencial Go/TypeScript de 407 196 entradas contra
f6f2e9f, con cero diferencias, textos de error incluidos; scripts/check.sh 60ssobre9ac9cd9, el commit del tag, limpio (28-09), y sobre el estado de6fa2b54, con tres objetivos de fuzzing nuevos del formato 3, limpio (30-09);- govulncheck no encuentra nada alcanzable. Avisa, sin llamada alcanzable, de dos problemas:
- GO-2026-6443, en
google.golang.org/grpc1.84.0, arreglado solo en una versión-dev. Hay que subir grpc cuando salga la 1.85.0. - GO-2026-5932, en
golang.org/x/crypto/openpgp, sin arreglo. No lo importamos.
- GO-2026-6443, en
2. Qué queda, en orden
2.1 Hecho el 28-09: cierre de la v0.8.2
- Los 9 retoques de la 2.ª revisión están en
9ac9cd9, un solo commit sobrec57ed48que absorbe el WIP69a3342. La rama WIP está borrada. - §76 los recoge como correcciones 4 a 6:
- un encoder MUST NOT escribir una extensión fuera de su registro;
- §17 y §51 dan los códigos del paso 10 solo para un release suministrado directamente;
- en el paso 9, cualquier fallo de la fuente es
ERR_RELEASE_UNAVAILABLEy ningún otro código.
- La regla del encoder no se comprueba en la librería:
capsule.Encryptyaccesskey.Encodeno recibenRegistry, y la aplica la aplicación. Está documentado enextension.Placement. - El autor aprobó el texto el 28-09. El spec lleva esa fecha, y el SHA-256 de sus bytes LF,
5cfa3203…, está enspec/README.mdy en el mensaje del tag. mainavanzó por fast-forward hasta9ac9cd9y lleva el tagspec-v0.8.2. Los dos están subidos.Appsincronizótestdatacon9ac9cd9en71ab8fb. Solo cambiatestdata/README.md.
Las reglas que siguen valiendo (testdata, textos de error y versiones cerradas del spec) están en el README.
2.2 Fase 2: abrir cápsulas en el navegador
Plan: docs/PLAN_fase2_ibe_noble2.md v2, con las decisiones confirmadas por el autor. Los pasos 2 a 8 de su sección 10:
- hecho el 28-09 (
74e1215):age-encryption0.3.1 y noble 2.4.0 como dependencias de ejecución, con sus guardas ensrc/lib/dependencies.test.tsycheck-build.mjs. El README deApprecoge el coste medido en el bundle, 73 KB con gzip para todo, ynpm audit; - hecho el 28-09 (
35be27c):ibe.tssobre noble 2, con vectores de Go ensrc/lib/dkc/testing/ibe-vectors.json(scripts/ibe-go-vectors.go) y cobertura del 100 % fijada como umbral. Los argumentos del stanza y su paso alStanzadeage-encryption, que guarda el tipo enargs[0], van al paso 7; - hecho el 28-09 (
076f3db):release.ts, converifyReleaseen el orden y con los textos deprovider.Verify,ReleaseSourceysuppliedRelease. Solo verifica el scheme de Quicknet: otro daERR_UNKNOWN_PROFILE. Reproduce los 7 casos del corpus que fallan en el paso 10; - hecho el 28-09 (
97827ae), paso 5a:open.ts, los pasos 9 a 18 con el texto en claro en memoria. Las identidades estrictas deagewrapse apoyan enx25519.ts, que abre los stanzas de uno en uno. Usa@noble/ciphers2.4.0, dependencia directa aprobada ese día: es la copia que ya usaage-encryption. Las identidadesAGE-SECRET-KEY-1…se leen conbech32.ts.index.tsno reexporta aún la apertura, que metería noble en/inspect; - hecho el 28-09 (
a89bee5), paso 5b.openacepta unBlobdel que solo lee el prefijo de los pasos 1 a 8 (prefix.ts, movido de la página a la librería), calcula elcapsule_digesten streaming (digest.ts) y descifraPAYLOAD_AGEen streaming. La salida puede ser unWritableStream, que se cierra tras el paso 18 y se aborta ante cualquier fallo. Comprobado en el navegador con OPFS real: un fallo de STREAM deja intacto el fichero; - el paso 6 está cubierto: la enmienda de canonicidad entró en la v0.8.2;
- hecho el 28-09 (
66970cf), paso 7:encryptOnG2RFC9380ytimeRecipient. Con sigma fijo, el cifrado reproduce byte a byte los vectores de Go. Go abrió los cuerpos IBE y los ficherosageque cifró esta librería, contlock.TimeUnlocky conagewrap.NewTimeIdentity. Todo está ensrc/lib/dkc/testing/tlock-vectors.json; - hecho el 28 y 29-09 (
48d6704), paso 8: la acción "abrir" en/inspect, cargada bajo demanda, con la política aprobada por el autor el 28-09 tras revisar lo que dice el protocolo:- el release lo pega quien abre, o sale del registro del fixture, y la página nunca lo pide a la red;
- el texto en claro de un fichero propio va a un fichero temporal de OPFS (§56), que se borra;
- los avisos de licencia se publican en
licenses.txt. Una revisión adversarial confirmó 15 hallazgos, todos corregidos. Los detalles y las comprobaciones en el navegador están en la fila 8 del plan.
La lectura del protocolo del 28-09 deja dos SHOULD para más adelante: §48 (varios relays) y §49 (obtener el release directamente del proveedor). Los cubrirá una fuente drand opcional del SDK, nunca activa por defecto en la página (sección 12 del plan).
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 Sesiones del 29-09: v0.9 del spec y formato 2 en Go (retomar aquí)
Estado al parar (30-09 por la noche). Retomar por el formato 3, al final de esta sección: la spec v0.10, entrega 1 del formato 3, está aprobada, implementada en la referencia Go y cerrada con el tag spec-v0.10, todo subido en main de datekeys-go (cc35d2c). Lo siguiente es el formato 3 en datekeys-ts.
Estado al cerrar la fase 3 (29-09 por la noche):
- Pasos 1 a 5 hechos. El spec v0.9 está cerrado con el tag
spec-v0.9(7e2d83c, enmaindedatekeys-go), y las dos implementaciones leen el formato 2: Go desdef24a280, que también lo escribe, y TypeScript desde0118890. - Paso 6 hecho: la fase 3 está completa en
datekeys-ts(pasos 0 a 7 del plan, hasta3a9d2b1, subido). La librería escribe el formato 2, Go abre lo que escribe y la página/createcifra en el navegador. La versión0.2.0sigue sin publicar: cerrarla es decisión del autor (§2.3). Después, a petición del autor,/inspectmuestra el contenido al abrir, debajo del veredicto, y nombra la descarga por su tipo. Las páginas explican las claves deage, y la vista previa sirve las páginas sin caché (da2000a,da26862, subidos). - Las 22 correcciones del repaso final (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.
- En este repo están PLAN_fase3_escritura.md, el plan del writer TypeScript, y REVISION_completitud_protocolo.md, la revisión del protocolo. El plan está en su v3: el autor confirmó sus 17 decisiones el 29-09.
Aprobación del 29-09. El autor aprobó el texto de la v0.9 con las respuestas recomendadas a las preguntas abiertas:
- L es un
bstrde 8 bytes, no unuint. - El lector SHOULD informar del formato.
- Se mantienen el objetivo 8 de §4 y el no objetivo nuevo de §5.
- Solo un generador de vectores de prueba MAY escribir el formato 1 (§62.1, regla 1, y §70).
- Los fixtures nuevos llevan el prefijo
format2_. - Se mantiene D1: los señuelos son identidades generadas cuya clave privada se descarta en el acto.
- Rechazar puntos del twist sigue siendo MAY.
- 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_keylleva siempre exactamente 16 stanzas X25519 enINNER_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.
- D3: la longitud real y el código van en
CONTROL_CBORversión 2 (claves 6 y 7). El lector entrega solo L bytes y comprueba que el relleno sea todo ceros y que siga la regla. - D4: el formato pasa a 2 (
VERSION2 del PRELUDE), así que un lector v0.8.2 lo rechaza en el paso 2, sin red. Un lector v0.9 sigue abriendo el formato 1. - D5:
access_policysigue visible. - D6: nueva sección de privacidad, §55.2.
- D7: reglas normativas del escritor, §62.1:
I_PAYLOADsale de un CSPRNG y no se reutiliza;- límites;
- la fecha pedida tiene que ser futura;
- el escritor se autocomprueba;
- rechaza claves X25519 no canónicas o de orden bajo.
Hecho en Go, paso 3 (f24a280):
- Formato 2 en la librería:
capsule:Format,Padding,PaddedLength,PayloadAgeLength;EncodeControlyDecodeControlreciben el formato;Openaplica los pasos 12 a 18 del formato 2.agewrap:AccessSlotsyCheckX25519Recipient.
- Escritura:
Encryptescribe solo el formato 2.EncryptOptions.Lengthes obligatorio;Paddinges reforzado por defecto.- Acepta de 1 a 16 credenciales, con señuelos, orden aleatorio y autocomprobaciones.
- La CLI mide la entrada, acepta
-paddinge 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.
- 7 fixtures
- 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 60slimpio:- 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.mdytestdata/README.mdestán al día.
Orden de trabajo:
-
Aplicar y verificar las 22 correcciones. Hecho el 29-09 (
4a025d1). -
El autor aprueba el texto de la v0.9. Hecho el 29-09.
-
La referencia Go implementa el formato 2, con fixtures nuevos y mutaciones, y pasa
check.sh. Hecho el 29-09 (f24a280). -
Se pone el tag
spec-v0.9. Hecho el 29-09, con la autorización del autor:7e2d83canota el SHA-256 del spec enspec/README.md, que también va en el mensaje del tag;mainavanzó hasta ese commit sin merge;main,v0.9y el tag están subidos.
-
datekeys-tssincronizatestdatay el lector TypeScript abre el formato 2. Hecho el 29-09 (0118890, subido):testdataa7e2d83c;- el prelude lee el formato;
decodeControlyencodeControlreciben el formato;padding.tscon las dos reglas, exactas hasta L_MAX; openexige 16 stanzas en el paso 12, calcula P en el 16 y comprueba el relleno en el 17, entregando solo los L primeros bytes; el paso 17 se registra también cuando se supera;- la página muestra el formato, avisa del 1 y, al abrir una cápsula del formato 2, da la regla y P;
ibe-vectors.jsonañade los siete fixtures del formato 2, calculados conscripts/ibe-go-vectors.go; los valores congelados no cambian;- comprobado: los 125 casos del corpus dan en TypeScript el código, el paso y el texto de error de
capsule.Open, en memoria y desde unBlob.
-
Se replantea el plan de la fase 3 y se escribe el writer TypeScript del formato 2. Hecho el 29-09. El 29-09 por la noche, PLAN_fase3_escritura.md pasó a su v2, sobre las reglas del §62.1:
- 16 huecos con señuelos y orden uniforme;
- relleno
reforzadopor defecto; - L conocida de antemano;
- autocomprobaciones;
- recipients canónicos y no de orden bajo, como Go;
SEALED_CONTROL_LENcon la fórmula del §62.1 y comprobada. Una revisión crítica con sondas no encontró nada bloqueante ni grave, y sus 12 correcciones menores están incorporadas.
Hecho el 29-09 en
datekeys-ts, todo subido y connpm run verifyen verde en cada paso:-
paso 0: el autor confirma las 17 decisiones con su recomendación, entre ellas cerrar
0.1.0ya (D14), la fórmula del §62.1 comprobada con el sellado real (D3) y aceptar los puntos del twist, como Go (D6). El plan pasa a v3 (b97dee2en este repo); -
paso 1:
0.1.0cerrada (d577283, tagv0.1.0) y0.2.0-devabierta (8c08c97); -
paso 2 (
8838c7d):recipient.ts,random.tsyagefile.ts, y las guardas nuevas; -
pasos 3 y 4 (
8473fdf):encrypt.tsywriter.ts. Reproducen byte a byte las secciones deterministas de los siete fixtures del formato 2 de Go, escriben en streaming y abortan la salida ante cualquier fallo. El bucle de propiedades pasa con 500 semillas; -
paso 5 (
da0b39f): Go abre con cada credencial las trece cápsulas de muestra que escribe TypeScript, y las reencodifica a los mismos bytes. Rechaza cuatro mezclas con el mismo código y paso, codifica igual 500 entradas aleatorias y da los mismos textos en 22 recipients y 21 opciones inválidas. Todo queda congelado ensrc/lib/dkc/testing/capsule-vectors.json. -
paso 6: el autor confirma las decisiones de la página con cada recomendación (sección 9 del plan, «Decidido en el paso 6»):
time_onlypor defecto, la zona del dispositivo con un selector, los avisos de §53 y §50 desde 365 días y un aviso de protocolo preliminar; -
paso 7 (
3a9d2b1): la página/create, conlengths.ts(el tamaño del.dkcantes de escribirlo),localtime.ts,create-input.tsycreator.ts. En la compilación de producción, una cápsula creada para dentro de cuatro minutos se abrió después en/inspect, con el release pegado de drand, y condatekeys decryptde Go, con red y su.dkk, al mismo contenido. Una revisión adversarial encontró un fallo mayor y ocho menores, todos corregidos. El mayor: la.dkkque es la única credencial se podía borrar sin confirmación. -
después, a petición del autor (
da2000a):/inspectmuestra el texto en claro de cualquier cápsula que se abre, si es texto, y no solo el de los fixtures. Las dos páginas explican las claves deage: qué es un destinatarioage1…, cómo se consigue conage-keygeny qué se pega al abrir.
Siguiente: que el autor decida si cierra
0.2.0(tagv0.2.0endatekeys-ts). Después, lo de §2.4.
Formato de cápsula 3, en diseño (30-09). El autor quiere que una cápsula guarde varios ficheros y carpetas con sus nombres, tamaños, hashes y fechas, más una firma de autor y un sello de tiempo, ambos opcionales. Hoy el nombre del fichero se pierde: §6 y §55.2 lo dejan fuera del protocolo.
- Decisiones del autor:
- todo va cifrado dentro de
PAYLOAD_AGE, comosecurity | head | content; - hash SHA-256 por fichero, sin hash global;
- con carpetas;
- la fecha de modificación se toma al cargar, marcada por defecto;
- un comentario y un autor declarado, opcionales;
- sin tipo de contenido;
- firma Ed25519 y sello de DateKeys, con registro anclado en OpenTimestamps.
- todo va cifrado dentro de
- Un flujo de diseño con revisión adversarial produjo spec_v0.10/formato3_diseno.md: 28 objeciones, que resultaron ser 24 distintas, corregidas o aceptadas.
- El paquete para la revisión de seguridad externa, con el contexto del protocolo, el modelo de amenazas y las preguntas, era
spec_v0.10/formato3_para_revision.md(56851a9). Se borró al unificar el diseño, pero sigue en git y publicado como artefacto privado, en la versión que revisó Fable: https://claude.ai/artifact/5NY9YxBjZA6DCadZ1aT5Ln. - Revisión de Fable (30-09), guardada en spec_v0.10/revision_fable.md.
- Veredicto: la parte criptográfica aguanta, y confirma la aritmética de tamaños y la necesidad del verificador Ed25519 propio. Los problemas están en los bordes.
- Diez hallazgos, cuatro mayores y seis menores; también hay observaciones sobre el documento.
- Valoración: coincido con todos. Comprobados de memoria: el 2 (la lista de git en
core.protectHFSincluye ZWJ, ZWNJ y U+206A–206F) y el 6 (JavaScript compara en UTF-16: U+FF5E y un emoji quedan al revés que en Go).
- Arreglos que no necesitan decisión:
- 2. R4 por la propiedad
Default_Ignorable_Code_Point, con lista blanca corta (ZWJ, ZWNJ, VS15, VS16); la clave de R7 descarta lo permitido; tags U+E0000 a U+E007F prohibidos. - 5. El tamaño del área de
securityva en la trama, fijo por versión y reservado siempre. - 6. TypeScript compara bytes UTF-8, con un vector en
paths.json. - 7. En la CLI, prefijo en cada línea visual del comentario, y los veredictos repetidos al final.
- 8. Se declara como fuga aceptada que el POST al servicio delata el sello.
- 9. Tabla de verdad firma/sello, expresión regular de R6b y regla para una mtime negativa.
- 10. Prefijos de dominio en
control_commityhead_digest, y el nombre.datekeys-*reservado. - El documento: 24 objeciones en vez de 28, marcadas «corregida» o «aceptada»; un glosario (capas 2 a 4, L_MAX, la sal); un texto para un sello que el lector no sabe verificar; una sola fuente en vez de tres ficheros que repiten el texto.
- 2. R4 por la propiedad
- Decisiones del autor del 30-09 sobre la revisión:
-
Tres entregas, con el formato congelado desde la primera y
securitypresente pero vacío:- 1: contenedor, varios ficheros y rutas;
- 2: firma y claves de autor;
- 3: el sello, cuando exista el documento «Servicio de sellado v1».
Las entregas 2 y 3 no cambian el formato: un lector anterior muestra «no soportado» y abre igual.
-
Origen del servicio (hallazgo 1): el autor no tiene preferencia, así que se toma la recomendación.
- Un subdominio aparte,
seal.datekeys.com, que solo sirve la API y nunca HTML, con cabecerasnosniffyCSP: sandboxde todos modos. - La CSP de
/createañade ese origen aconnect-src, solo en esa página. - Es de la entrega 3 y se puede revisar entonces.
- Un subdominio aparte,
-
Vida del sello (hallazgo 3): la prueba va dentro de la cápsula.
- El token lleva la prueba de inclusión y el checkpoint firmado, y una raíz offline, fijada desde ya, certifica las claves anuales. Así el sello se verifica sin red para siempre, y la auditoría del anclaje queda como comprobación online opcional.
- Esto agranda el área de
security: con el arreglo del hallazgo 5, la entrega 3 define una versión desecuritycon un área fija mayor.
-
Abuso (hallazgo 4): prueba de trabajo SHA-256 en cada petición, de un segundo en el navegador, sin guardar estado sobre quién pide.
-
- Hecho el 30-09 a mediodía (
57dc659), sin flujo y con un único revisor adversarial:- formato3_diseno.md es la única fuente del diseño. Se borraron
formato3_revision_intro.mdyformato3_para_revision.md, que repetían su texto. - Estructura: una parte 0 de contexto, con glosario, decisiones y modelo de amenazas; una parte por entrega, cada una con sus pruebas y sus preguntas abiertas; y tres anexos con las revisiones. El de Fable dice dónde se resuelve cada hallazgo, el de la revisión interna marca sus 24 objeciones como corregidas o aceptadas, y el tercero recoge la revisión adversarial de esta versión.
- Aplicados los arreglos 2 y 5 a 10, los del documento y las cuatro decisiones.
- La revisión adversarial no encontró nada bloqueante ni mayor. Sus 15 hallazgos menores están resueltos en el diseño (anexo C), y una segunda pasada comprobó los arreglos. Los que cambian el diseño:
- el head va siempre en su versión 1, porque §22 exige un formato nuevo para una versión nueva;
- las claves 2 y 3 de
securityvan codificadas aparte, así que una firma o un sello mal formados no arrastran al otro; - el área depende solo de la versión del spec, nunca de
-seal, y hay dos fugas nuevas declaradas: un área de 512 delata que no hay sello, y el registro publica la t de cada sello; - R3 limita el NFD de cada segmento a 255 unidades UTF-16, por HFS+, y R4 prohíbe U+F000–U+F0FF;
- un sello que no verifica se descarta y ya no aborta la cápsula.
- Interpretación que confirmar: la decisión 3 hablaba de «una versión de
securitycon un área fija mayor». El diseño hace que el área la fije la versión del spec y deja el mapasecurityen su versión 1, para que un lector de la entrega 2 siga comprobando la firma en una cápsula de la entrega 3. Es la pregunta 3 de la entrega 1.
- formato3_diseno.md es la única fuente del diseño. Se borraron
- Hecho el 30-09 por la tarde:
- El autor cerró las diez preguntas de la entrega 1, todas con la recomendación (
afd9f76). Los límites quedan como se propusieron y congelados con el formato. Un único fichero dentro de una carpeta se descarga directamente, con el ZIP como opción, y la página ofrece cada fichero del ZIP como un corte suyo. - El borrador del spec v0.10 de la entrega 1 está en
datekeys-go, ramav0.10, sin subir:fa7f95elo redacta y9d1cd2eaplica la revisión final. Lleva el spec, el CDDL yspec/README.md. La referencia sigue implementando la v0.9, y suSpecVersionno cambia. - La revisión final, como la de la v0.9, encontró un problema bloqueante, tres mayores y once menores, todos corregidos (spec_v0.10/revision_borrador.md). El bloqueante: R6c rechazaba «¿», porque bestfit1250 lo lleva a '?'. Ahora solo rechaza '/', '', ':' y U+0000 en una proyección. El diseño recoge los cambios que le afectan en su anexo D.
- Pregunta del autor: la firma de autor con su clave privada está prevista, en la entrega 2. Varias firmas no hace falta decidirlas ahora: un
algfuturo puede definir una lista de firmas sin cambiar el formato (pregunta 3 de la entrega 2 del diseño).
- El autor cerró las diez preguntas de la entrega 1, todas con la recomendación (
- Siguiente:
- Hecho: el autor eligió Unicode 18.0.0 («no vamos a trabajar con unicodes ya pasados») y dio el visto bueno al texto. El borrador lo recoge en su rama, y el diseño, en su decisión 4.
- Hecho: el autor aprobó la regla de invisibles («sí a las dos»), que el spec recoge en R4b y en §29.6 (
631d09c). - Hecho: con su permiso se descargaron los 19 ficheros de datos, 8,25 MB, en
datekeys-go/.cache/, fuera de git. - Hecho: la referencia Go implementa el formato 3, con el plan y el detalle de abajo. Con la autorización del autor («sí, sube la rama y pon el tag»), la rama
v0.10y el tag anotadospec-v0.10están en el remoto, encc35d2c, que solo cambia textos para nombrar el tag. Después, a petición suya («sí, avanza main hasta la v0.10»),mainavanzó hastacc35d2csin fusión y está subida. - Siguiente:
datekeys-tssincronizatestdatay lee y escribe el formato 3, con un plan propio. - La entrega 2 abre la versión siguiente del spec, y la 3 espera al documento «Servicio de sellado DateKeys v1». Para otra revisión externa, el artefacto hay que volver a publicarlo desde el diseño nuevo.
Hecho el 30-09 por la noche: el formato 3 en Go. Rama v0.10 de datekeys-go, subida con el tag spec-v0.10 en cc35d2c, un commit o varios por paso del plan:
631d09c, el spec con la regla de invisibles;6fba1dd, paso 1,internal/pathrulecon las tablas de Unicode 18.0.0 y best-fit generadas y suTablesDigest;72e86b8, paso 2, el códec deBODY,securityy el head.7249ef4, paso 3, el lector:capsule.Sink,ErrSinkRequiredjusto tras el paso 2, el paso 17 en subpasos con su precedencia, y lecturas deBODYque crecen con los bytes recibidos (§57).8955c0f, paso 4, el escritorcapsule.EncryptFiles, que lee cada fichero dos veces;Encryptsolo escribe el formato 2 conEncryptOptions.TestVectors.a0de80f, paso 5, el CLI:encrypt -incon ficheros y carpetas,-comment,-authory-no-mtime;decrypt -out CARPETAconos.Root; la presentación de §29.7, con el ancho del terminal pedido porsyscall, sin dependencias nuevas.- Paso 6, datos de prueba:
3c39336(SpecVersion0.10 yERR_HEAD_INVALID),e070f89(las nueve fixtures),db862d5(paths.json,path_fold.json,head_schema.json,security.jsony el control de versión 3 encbor.json) y18eb3c3(las mutaciones: 209 casos, 169 del §64, tres de los cuales se abren con su veredicto). 20f9959, paso 7, la documentación;735885c, una corrección del CLI: una carpeta de salida sin su carpeta padre falla antes de pedir el release;6fa2b54, paso 8, tres objetivos de fuzzing nuevos (FuzzDecodeHead,FuzzEvaluateSecurity,FuzzCheckPath) y el SHA-256 del spec enspec/README.md.- Verificación:
go test ./...yscripts/check.sh 60slimpios, cobertura decapsule93,1 %; la prueba en vivo contra Quicknet abrió cápsulas de formato 3 de las dos políticas; los tres objetivos nuevos, cerca de un millón de ejecuciones cada uno, sin fallos. - Para el autor, sin urgencia:
- un cambio editorial en el texto aprobado: §67 decía «Serán … (por implementar)» de las fixtures del formato 3, y ahora dice «Son …». El SHA-256 de
spec/README.mdes el del texto con ese cambio; - el corpus de mutaciones pasa de 168 KB a 706 KB. 476 KB son el caso de 65 536 carpetas implícitas que pide el §64, cuyo head mide 235 KB;
- los textos del CLI que el spec no fija son de la referencia: la cabecera «Ficheros escritos en CARPETA (N):», los avisos de nombres peligrosos y los mensajes del escritor. Los que fija, los veredictos y las dos etiquetas, van literales.
- un cambio editorial en el texto aprobado: §67 decía «Serán … (por implementar)» de las fixtures del formato 3, y ahora dice «Son …». El SHA-256 de
- Para
datekeys-ts:- el generador de tablas aún no escribe el módulo TypeScript, que el plan preveía con una bandera: es el primer paso de su plan, con el mismo
TablesDigest; testdatacambia entero de"spec", y añade nueve fixtures, cuatro ficheros de vectores,mutations.jsoncon 209 casos (version changedpone ahoraVERSION4, y hay casos converdicts) y el diferencial con 5 110;- los textos de las reglas de rutas y de texto deben coincidir byte a byte:
paths.jsonyhead_schema.jsonlos traen enresultydetail.
- el generador de tablas aún no escribe el módulo TypeScript, que el plan preveía con una bandera: es el primer paso de su plan, con el mismo
- Herramientas: en esta máquina los heredocs de Bash rompen apóstrofos y barras invertidas, y la herramienta Write convierte
\uXXXXen caracteres literales. Funciona escribir los cambios como scripts de Python en el scratchpad.
Conclusiones de la conversación, sin decisión pendiente:
- El protocolo no contempla un sello de tiempo de creación (§5, §55.1). Si se quiere, lo recomendado es un sello RFC 3161 u OpenTimestamps sobre el SHA-256 del
.dkccompleto, guardado aparte. - Un fichero único
.dkcon.dkcy.dkkjuntos no conviene: contime_and_keyequivaldría atime_only. Ya se envía un solo fichero contime_onlyo con destinatariosage1…. datekeys-tscerró0.1.0el 29-09 (d577283, tagv0.1.0), y la fase 3 va en0.2.0-dev.
2.3 Depende del autor
- Crear
security@datekeys.comy, si se quiere, unsecurity.txten la web. Después, actualizarSECURITY.md, que hoy diceinfo@activething.com. - Elegir la ruta pública del módulo Go (propuesta:
datekeys.com/go/datekeys, en minúsculas) y el espejo público, que no puede ser GitHub (por ejemplo Codeberg). Publicar la páginago-importendatekeys.com. Después: renombrar el módulo y poner el tagv0.1.0cuandogo getfuncione desde una máquina limpia. - Decidir si
datekeys-tscierra0.2.0, ahora que la fase 3 está completa.
2.4 Más adelante
Release API sobre la librería, traducción del spec al inglés y revisión externa antes de la v1.0. Opcional: escribir en OPFS en trozos de 1 MiB, que ahorra un 10 % al cifrar ficheros grandes en la página (README de datekeys-ts, «Crear»).
3. Reglas del proyecto
Están en el README de este repo, que el CLAUDE.md de la raíz carga en cada sesión.
4. Documentos
- En este repo están los planes, la revisión del protocolo y los papeles de la v0.9. El README los lista.
- En
datekeys-go:spec/DateKeys_Protocol_Specification_v0.10.md, cerrado con el tagspec-v0.10;spec/DateKeys_Protocol_Specification_v0.9.md, cerrado con el tagspec-v0.9;spec/DateKeys_Protocol_Specification_v0.8.2.md,spec/datekeys.cddlyspec/README.md;testdata/README.md, que documenta los ficheros compartidos para segundas implementaciones;docs/traceability.mdyCHANGELOG.md.
- Las herramientas de verificación de las sesiones del 26 al 28-09 estaban en carpetas temporales y pueden haber desaparecido: el diferencial Go/TypeScript de
tsreview/y las copias congeladasdkgo-ref-<commit>. Su descripción está en los mensajes de los commits dedatekeys-tsy en su README.