28 KiB
Handoff DateKeys
Estado al 7 de octubre de 2026 por la tarde. Lo que pasó hasta aquí, sesión a sesión, está en HANDOFF_historial.md.
Sirve para retomar sin contexto previo, sea una persona o una sesión de Claude.
Antes de empezar:
- La sesión se abre en
G:\bussines\datekeys, la raíz, que es la que tiene la memoria y elCLAUDE.md. - Comprueba que corre en Opus. Una sesión del 1-10 corrió por descuido con Sonnet 5.5 y hubo que revisarla entera. Los trailers
Co-Authored-Byde los commits dicen qué modelo escribió cada uno. - Comprueba cada repo con
git statusygit log: todo lo de abajo estaba subido al cerrar.
Estado
| Repo | Rama y commit | Tags | Qué es |
|---|---|---|---|
datekeys-go |
v0.16 en 92f8cdc; main en b6ff17a, el tag; v0.15 en 70d907b |
spec-v0.16 en b6ff17a, y los de las versiones anteriores |
Spec v0.16 aprobada, implementación de referencia, testdata compartido. En v0.15, tras su 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), su implementación (7e3b810 a 3fd0e93) el cierre (b6ff17a) y, tras el tag, el fuzzing del JSON estricto y el recordatorio (0eb5aa0 a 92f8cdc) |
App (datekeys-ts) |
v0.10 en f37da12; main en 2c305cf |
v0.5.0 en 2c305cf, v0.4.0, v0.3.0, v0.2.0, v0.1.0 |
Librería TypeScript 0.5.0, publicada el 7-10, de la spec 0.16, y páginas /inspect y /create; en desarrollo la 0.6.0, con el recordatorio |
datekeys-dart |
v0.16 en b53afdc; v0.15 en e2296b0 |
ninguno | Librería Dart completa, 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.16 está aprobada desde el 7-10, con SHA-256
807d4fe85ac09ad6f97abc75ab3e2156bb2f3fb0dc589777f4420627fad545e1y el tagspec-v0.16(b6ff17a, tambiénmain). Recoge la revisión de Astra de la v0.15: un sello sinaccuracyno acredita nada antes de la fecha (S5, con su motivo); el anexo de recuperación deriva una llave de palabras y admite un último bloque deagecompleto; la firma con certificados guarda las cadenas y las respuestas OCSP que caben y dice lo que deja fuera; y el JSON de drand se lee estricto. No cambia ningún formato. La v0.15, la recuperación a largo plazo, sigue enspec-v0.15(fe50885). No hay ningún borrador abierto. Las versiones aprobadas y sus SHA-256 están endatekeys-go/spec/README.md. - El fichero
.dkrse 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/testdataenspec-v0.16(b6ff17a), 150 ficheros, de donde TypeScript y Dart copian hoytestdata,wordlistsyannex. Gates el 7-10 por la noche:- Go:
scripts/check.shentero en4f78854, en3fd0e93y enb6ff17a, con el anexo abriendo con palabras y con un último bloque completo; en la v0.15,scripts/fuzz.sh 20senfe50885con sus 27 objetivos, sin fallos; - TypeScript:
npm run verifyenc74a37ey en2c305cf, la0.5.0, con 8 273 pruebas; - Dart:
tool/check.shenb53afdc, con 2 286 pruebas en la VM y 720 en Node.
- Go:
- 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:
c49c67cañadewordkey.Generate,ListyCheckList, ydatekeys encrypt -new-words FICHERO [-dic es] [-word-count 7].27a75eehace queCheckList(lang, words)compruebe cada palabra contra el alfabeto de su idioma, que da el código y no la lista (paraes, de laaa laz,á,é,í,ó,ú,ü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ñadeBits, la fuerza de lo sorteado, queencryptmuestra (90 bits para 7 de 7 776).scripts/check.shpasa entero en los dos. - TypeScript (
0.5.0-dev, de012cd74a4057607):scripts/sync-testdata.mjscopia del mismo commit de Gowordkey/listsenwordlists/, con suSOURCE.json(testdataywordlistsen27a75ee, cuyotestdataes el del tag).wordlist.tshace lo de Go, con sus textos:readWordListsolo acepta una lista con el SHA-256 fijado para su idioma,checkWordList,generateWordsywordBits./createofrece 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.txtlleva la licencia de la lista.npm run verifypasa con 8 119 pruebas, y el flujo se comprobó en el navegador sobre el build de producción. - En
/createapareció y se corrigió un fallo de la 0.4.0 (4057607): el efecto que comprueba las rutas se relanzaba sin fin (effect_update_depth_exceeded) en cuanto había un fichero, un comentario o un autor. wordBitsde TypeScript usaMath.log2, que puede diferir delmath.Log2de Go en el último bit; la página muestra los bits truncados, como la CLI, así que no se nota.- Dart (
a770d4dafcc7780, de un agente Opus en un worktree, revisado contra Go):tool/sync_testdata.dartcopia tambiénwordlists/, ylib/src/wordlist.darthace lo mismo que Go, exportado desdelib/datekeys.dart. Sus vectores (test/vectors/wordlist_vectors.json) los genera Go contool/wordlist_go_vectors.go:List,CheckListen 83 listas, el veredicto de cada punto de código de los planos 0, 1 y 14,Generateen 51 casos con los mismos bytes que Go, yBitsbit a bit (porta elmath.Log2de Go). - El agente de Dart vio que
TestGeneratede Go no probaba nada: su semilla solo daba dos índices, las dos llamadas acababan enEOFy el test comparaba dos resultados vacíos. Está arreglado en96d8992. - La lista inglesa (7-10 por la tarde, con permiso del autor):
wordkey/lists/en.txtes la lista grande de la EFF (Joseph Bonneau, 2016), 7 776 palabras, CC BY 4.0 según la política de copyright de eff.org, en su orden y sin los números de los dados, así que la posición de cada palabra sigue dando su número.-dicla toma por defecto, como decidió el autor. El alfabeto deenes de laaa lazy el guion ASCII de sus cuatro palabras compuestas (drop-down,felt-tip,t-shirtyyo-yo), para no quitar ninguna ni romper su numeración. Goe671032, TypeScript13df99b(la página sigue ofreciendo solo la española, ycheck-build.mjsexige que publique solo esa) y Dartbf0f3d3, con sus vectores regenerados con Go. - Los dados (7-10 por la tarde, decisión del autor «sí, hazlo así»): para quien no se fía del azar del ordenador, cinco dados por palabra dan un número del 11111 al 66666, la posición de la palabra en la lista (7 776 = 6⁵), con el primer dado como cifra más significativa. Go
92e7154:wordkey.DiceNumber,DiceWord,DiceWords(al menos 6 números y ninguna palabra repetida, que se vuelve a tirar) yDiceList, la lista numerada como la publica la EFF (la deenes su fichero byte a byte, SHA-256addd3553…903e; la dees,611f779a…fddb, enwordkey/lists/README.md);encrypt -dice TEXTy-dice-file FILE, que muestran las palabras (las que abren la cápsula, no los números), ydatekeys wordlist [-dic LISTA], que escribe la lista numerada y su SHA-256. TypeScriptf5044e3: lo mismo enwordlist.ts, y en/createla opción «Con dados» entre «Al azar» y «Las elijo yo», que convierte los números en palabras a medida que se escriben, avisa de un número que no vale o de una palabra repetida y ofrece la lista numerada para imprimirla, con su SHA-256. Comprobado en el navegador sobre el build de producción: la lista descargada tiene el SHA-256 de Go y la cápsula se crea con las palabras de los dados. Dart00f4ad4, de un agente Opus revisado contra Go: lo mismo enwordlist.dart, con vectores de Go de los dados (DiceWordscon cada punto de código de los planos 0, 1 y 14 entre dos números, entre otros). - La lista española,
wordkey/lists/es.txt(7 776 palabras, SHA-256ff77b487…34fe), es un borrador sin revisar, CC BY-SA 4.0, sacado de las frecuencias de subtítulos de FrequencyWords filtradas con el diccionario de LibreOffice; el método está enwordkey/lists/README.mdy el script en wordlists/build_es.py. Cumple el alfabeto tal cual.
- Go:
- Lo que dice el SDK oficial al sellar (7-10 por la tarde): los SHOULD de la v0.14 y la v0.15 que no cumplían ni la CLI ni
/create.- El anexo junto a la cápsula (§62.1, regla 27):
annex/recovery.mdendatekeys-go, el §79 del spec bajo un título con su versión y el SHA-256 de su texto, igual para toda cápsula.datekeys.RecoveryAnnexlo incrusta yTestRecoveryAnnexexige que sea el §79 del spec deSpecVersion: al aprobar una versión nueva se regenera conDATEKEYS_WRITE_ANNEX=1 go test -run TestRecoveryAnnex ..encryptlo escribe comoFICHERO.dkc.recuperacion.txt(-no-recoverylo evita), y/createlo ofrece para descargar con ese nombre. TypeScript y Dart lo copian de Go enannex/, como las listas. - Qué hará falta para abrirla (regla 26):
encrypty/createlo dicen al sellar: el.dkc, una credencial si estime_and_key, y el release de su ronda, que tendrá que guardar un archivo o un servicio de caché si drand ya no lo sirve (§50). El aviso local opcional pararound_time(MAY) no se ha hecho. time_and_keypara horizontes largos (§7.6): a más de un año y contime_only, la CLI y/createla recomiendan.- Las palabras propias (§38.1):
/createy 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/StatusOfen Go,profileStatusOfen 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, ydecrypt,inspecte/inspectavisan si el de una cápsula está comprometido. - Go
aefc8f6y6158be2, TypeScript728c3bbye8b5d35, Dart8eed96fye2296b0(de un agente Opus revisado contra Go: el anexo es una constante generada,lib/src/recovery_annex.g.dart, que escribetool/recovery_annex_copy.darttras cada sincronización que cambieannex/). - 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.
- El anexo junto a la cápsula (§62.1, regla 27):
- La revisión externa: el paquete de revision_externa/ está al día con la v0.16. Su nota dice qué decidió el autor y qué falta: elegir revisor, alcance y presupuesto, el NDA, los bundles y el envío.
Qué queda
La recuperación a largo plazo quedó hecha con la v0.15, las palabras al azar en las tres librerías y en /create, y la revisión de Astra con la v0.16, publicada en TypeScript como la 0.5.0; el paquete de la revisión externa está al día (7-10).
Decisiones que esperan al autor, por orden de lo que desbloquean:
- La revisión externa (nota, «Orden», 4 a 6): elegir revisor, primero uno que lea español; el nivel, 1 o 1 y 2; pedir presupuesto; el NDA, los bundles y el envío. Antes, si se enseñan Q1 y Q10 al equipo de drand (gratis, pero enseña el proyecto fuera). Si el revisor no lee español, traducir el núcleo, unas 31 800 palabras, y decidir si con §47.1, §49 y §50.
- Medir el área de 32 KiB (§74; §75, punto 13; K2 del paquete): firmas reales con un certificado del autor (DNIe, FNMT u otro) y permiso para pedir sellos a una autoridad pública. Cierra el perfil CMS y da código a las reglas 21 y 22 de la v0.16, que hoy no tienen ningún escritor.
- La página para firmar con certificado (DNIe, FNMT), pedida por el autor el 7-10, espera esto. Cada firma de
alg2 necesita su sello CAdES-T (si no, F5 y el escritor no escribe, regla 19), y una página no puede pedirlo a una autoridad pública: FreeTSA responde 403 a la petición previa de CORS y DigiCert no responde (comprobado el 7-10). Caminos: que AutoFirma selle la firma (las fuentes se contradicen: hay que probarlo con una firma real del autor), o un servicio de DateKeys que reenvíe la petición (decisión 5), o hacerlo en la CLI, que no tiene CORS. El flujo propuesto en/create: una firma de prueba con AutoFirma da el certificado y cierraSIGNERS(regla 20); la página prepara la cápsula, muestra el código y da el mensaje a firmar; la persona lo firma con AutoFirma y sube el.csig; la página quita el contenido de una firma implícita (regla 21), comprueba F6 y escribe. Falta del autor: un.csigde prueba.
- La página para firmar con certificado (DNIe, FNMT), pedida por el autor el 7-10, espera esto. Cada firma de
- La lista española de palabras: que la revise alguien que hable español, o rehacerla con el corpus de Leipzig cuando su web vuelva (la descarga el autor: bloquea a los agentes).
- Un archivo o servicio de caché de releases (§50): dónde, quién lo mantiene y si DateKeys ofrece el suyo.
- Dónde se publica: el código (ni GitHub ni el Gitea), la página web (§59) y con ello
words.datekeys.com, el paquete de recuperación (decisión 5 de la v0.16) y la primera release del módulo de Go. - El localizador en las páginas (§44.1): el lector MUST comprobar en cada conexión que la IP a la que resuelve una dirección es pública, y un navegador no ve esa IP. Propuesta:
/inspectabre el localizador y muestra sus direcciones, la persona descarga el resto por su cuenta y lo da a la página, que no se conecta a nada;/createno crea sobres hasta que haya dónde alojar el resto. La otra opción, descargar desde la página, incumple el §44.1. - Menores: renombrar la carpeta
Appy borrarenquiry.phpde la raíz (desde el 29-09); un remoto paraweb.
Hecho después del cierre de la v0.16, sin decisiones (7-10 por la noche):
provider.FuzzStrictJSON(0eb5aa0), el objetivo 28 descripts/fuzz.sh: lo que acepta el lector estricto del JSON de drand,encoding/jsonlo lee con los mismos nombres, textos, cadenas y ronda; 60 s sin diferencias.- El recordatorio en el calendario (§62.1, regla 26, MAY):
encrypt -reminderen Go (7e6a03d,92f8cdc) y «Descargar el recordatorio» en/create(f37da12, TypeScript0.6.0-dev). Un.ics(RFC 5545) a la hora de la ronda, con alarma y lo que hará falta para abrirla; los mismos bytes en Go y TypeScript, comparados con un texto calculado aparte. UID al azar; avisa de que un calendario sincronizado sabrá el nombre y la fecha. Probado en la página construida. - La fila §62.1 de la trazabilidad decía en
b6ff17aque la CLI no cumplía las reglas 26 y 27, que cumple desdeaefc8f6: corregida en7e6a03d. El paquete de la revisión congelab6ff17a, con esa errata.
Sin decisiones no queda nada en «Librerías y clientes» salvo esperar a grpc 1.85.0.
Protocolo
- La v0.16, cerrada (7-10). Es la revisión de Astra de la v0.15, con las ocho decisiones y su recomendación; el autor pidió implementarla («ponte con la implementación de la 0.16») y después cerrarla («sí, cierra la v0.16»).
- Go (
7e3b810a3fd0e93, cierre enb6ff17a): el sello sinaccuracyda 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/recoveryabre con palabras (-words, y-unicodedatapara otro texto que el de las listas), y sus dos normalizaciones dan las palabras de todos los casos dewordkey.json; dos fixtures nuevos,format3_time_and_key_wordsyformat3_full_chunk;security_cms.jsonhecho de nuevo, 143 casos. - TypeScript (
f79d8e2,59d7607,c74a37e) y Dart (290d97e,0609e9e,b53afdc), 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 ungit archivede Go. - Un tropiezo: las herramientas de edición convierten un escape
\u0072en el carácter. Los casos «escaped as» derelease.jsonllevaban unroundllano enb570338; lo vio el agente de TypeScript y se arregló en3fd0e93. Ver la memoria. - No hay paquete de recuperación (decisión 5): el anexo nombra
UnicodeData.txtpor su SHA-256. - TypeScript 0.5.0 (7-10, «sí» del autor): tag
v0.5.0en2c305cf,mainmovido; la v0.16, las palabras al azar con dados y lo que dice el SDK al sellar. - El paquete de la revisión externa está al día con la v0.16: congela
spec-v0.16(b6ff17a), TypeScriptv0.5.0y Dartb53afdc; gana Q13, sobre los cambios de la v0.16, y cierra K17. Ver su nota. - Las reglas 21 y 22 de la v0.16 (guardar las cadenas y las respuestas OCSP, decir lo que queda fuera) no tienen código: ningún escritor de las librerías pide sellos ni firmas con certificado todavía.
- Go (
- 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.
- 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.
- 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.
- Lo que el §74 aún llama provisional: los esquemas de bytes de la cabecera, el control y la
.dkk, los límites de los campos y los vectores definitivos del perfil. Conviene congelarlo con el informe de la revisión delante. - El registro de perfiles firmado (§71), que no existe.
- Más adelante: un tipo de acceso post-cuántico, y quizá una derivación más dura que PBKDF2 para la llave de palabras.
Librerías y clientes
- Las palabras al azar (§38.1) están en Go, TypeScript,
/createy Dart, con el SHA-256 fijado de cada lista, el alfabeto de su idioma y la fuerza calculada con la lista cargada (ver «Estado»). Ninguna lista se da por buena, tampoco las de DateKeys (el autor, 7-10: un empleado malicioso podría servir una lista con las mismas 6 palabras). Falta:- la lista española definitiva: el autor espera a que vuelva la web de la Universidad de Leipzig (el 7-10 daba un error de servidor), cuyos corpus de unos 256 idiomas se descargan con CC BY. El script sirve cambiando la fuente de frecuencias. Su web bloquea a los agentes (Anubis): descarga el autor. Cada lista la revisa alguien que hable el idioma antes de fijar su hash. En el borrador hay nombres propios, préstamos y palabras malsonantes, como «claudia», «green», «sport» o «cojonudo»: que los mire quien la revise, con
descartes.txtdelante; - los dados protegen de un generador trucado, no de una app que se quede con las palabras: eso solo lo cubre una app auditable (§59);
- el servicio
words.datekeys.com, cuando haya sitio propio: ver las decisiones; - quizá el alfabeto por idioma como regla del SDK en la versión siguiente del spec (§38.1). El riesgo de fondo es la app misma, que puede cambiar el generador: §59, builds reproducibles y releases firmadas.
- la lista española definitiva: el autor espera a que vuelva la web de la Universidad de Leipzig (el 7-10 daba un error de servidor), cuyos corpus de unos 256 idiomas se descargan con CC BY. El script sirve cambiando la fuente de frecuencias. Su web bloquea a los agentes (Anubis): descarga el autor. Cada lista la revisa alguien que hable el idioma antes de fijar su hash. En el borrador hay nombres propios, préstamos y palabras malsonantes, como «claudia», «green», «sport» o «cojonudo»: que los mire quien la revise, con
- Las recomendaciones al SDK están todas: el aviso local para
round_time(§62.1, regla 26, MAY) es el recordatorio en el calendario (7-10). - La página web, cuando se publique (§59): builds reproducibles con sus hashes, Subresource Integrity y un cliente sin conexión.
- El localizador en las páginas: las tres librerías lo tienen, pero
/createno crea sobres e/inspectno descarga el resto. Espera la decisión 6 de arriba: un navegador no puede comprobar la IP del §44.1. - Go no tiene ninguna release del módulo; la primera, cuando haya un repo accesible desde fuera para
go get. govulncheck avisa de GO-2026-6443 en grpc, que el código no alcanza: subir grpc cuando salga la 1.85.0. - Dart: sin versión ni tag. Medir los tiempos en un móvil espera a la app.
Espacio de trabajo
- Del autor: renombrar la carpeta
Appadatekeys-tsy borrarenquiry.phpde la raíz, pendientes desde el 29-09. websigue sin remoto.
Decisiones del autor que siguen vigentes
- La app Flutter está archivada «para un futuro» (6-10). No se empieza sin que lo pida.
- La app Flutter no tendrá versión web (7-10): la web se hace con TypeScript y Svelte. Que la librería Dart dé lo mismo compilada a JavaScript ya no es un requisito; el gate sigue pasando las pruebas en Node mientras no estorbe. El posible fallo de dart2js no se reporta: ninguna app nuestra compila Dart a JavaScript.
- La revisión externa (6-10):
- primero, buscar un revisor que lea español; si no lo hay, traducir solo el núcleo normativo;
- dos niveles de alcance, con presupuesto cerrado por nivel;
- código entero en bundles de git cifrados con
age; - un NDA mutuo;
- la versión siguiente, después del informe. La v0.15 se adelantó a petición del autor (7-10).
- Las palabras al azar (7-10):
- listas de 7 776 palabras por idioma y 7 palabras por defecto; BIP-39 (2 048) se le queda pequeña al autor;
- la app descarga la lista del idioma del usuario; la CLI las lleva dentro, inglés por defecto, y otra con
-dic es,-dic fr; - las palabras se sortean siempre en el dispositivo y nunca viajan: el servidor no las genera ni las ve, ni cifradas. El autor propuso un servicio que las mandara cifradas con la clave de DateKeys y aceptó esto en su lugar;
words.datekeys.comsolo 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.Opensigue 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). - Mostrar Q1 y Q10 de la revisión al equipo de drand antes de pagar una revisión es decisión del autor, porque supone enseñar el proyecto fuera.
- El diseño de las páginas: nunca un fondo oscuro, nada del estilo de la landing, usar la skill
frontend-designsobre la página real y no gastar en maquetas. Ver la memoria.
Para trabajar
-
Subir al Gitea. El nombre
g.activething.coma veces resuelve a 89.46.247.16, que no responde. Entonces se sube a la IP de la red local, sin tocar el remoto:git -C <repo> push https://192.168.18.112/go/<repo-remoto>.git <rama>y después
git -C <repo> update-ref refs/remotes/origin/<rama> <rama>. Los remotos songo/DateKeys,go/DateKeys-App,go/dateKeys-dartygo/datekeys-doc. El servidor no es del autor: no se propone ningún cambio en él. -
Cerrar una versión del spec, como la v0.12 a la v0.15:
- en Go, la cabecera del spec con «aprobado por su autor ese día» y nada más del texto;
SpecVersion;go run ./internal/testkit/genfixtures -out testdata, y el campospeca mano en los dos congelados,security_cms.jsonylocator.json;- el SHA-256 en
spec/README.md, y los README,SECURITY.md, la trazabilidad,testdata/README.mdy el CHANGELOG; scripts/check.sh, con el árbol limpio tras el commit;- el tag anotado
spec-vX.Yymainavanzado sin fusión (git fetch . <rama>:main); - en TypeScript y Dart, la versión del spec,
testdatasincronizado con sus scripts,mutation-texts.jsonregenerado con Go en un módulo temporal (G:\tmp\mutgo), y el campospecde los vectores propios que salen de Go.
Tras aprobar no se añade texto normativo sin enseñarlo: fue el fallo E1 de la v0.11.
-
Encargos a agentes:
- con
model: "opus"; - en worktrees junto a los repos, para que
../datekeys-goresuelva; - nunca dos agentes en los mismos ficheros;
- solo ficheros nuevos, y los comunes en un último commit;
- la sesión revisa contra Go antes de integrar.
- con
-
Herramientas de esta máquina:
- los heredocs de Bash rompen las barras invertidas,
\nincluido; - la herramienta Write quita los espacios de final de línea (los saltos de Markdown del §77) y convierte
\uXXXXen caracteres; - para cambios con barras o espacios exactos, un script de Python escrito con Write que use
chr(92), o la herramienta Edit; - en Windows,
write_textde Python escribe CRLF: abre connewline=''o escribe bytes, ogofmty los hashes fallan; cden Bash mueve el directorio de la sesión: usa( cd … )ogit -C.
- los heredocs de Bash rompen las barras invertidas,
-
Vista previa de la página: la configuración
inspector-dev-appde.claude/launch.jsonarrancaApp, mientras la carpeta no se renombre, einspector-preview-appsirve su build de producción (npm run buildantes, y reiniciarla tras cada build: si no, los chunks nuevos dan 404 y la página no se hidrata). No pares el servidor mientras el autor lo usa.vite.config.tsprepara las dependencias que se cargan bajo demanda (optimizeDeps.include), para que la primera apertura no recargue la página. -
Fuzzing: usa
FUZZ_PARALLEL=4. Un «context deadline exceeded» sin entrada que falle es del motor de Go, no del código; se vuelve a pasar. -
Disco: C: está casi lleno con las cachés de Go y Dart; los temporales van en
G:\tmp, y nunca se borra con comodines.
Documentos
El README los lista. Para retomar, lo principal es:
- revision_externa/: el paquete y su nota;
- REVISION_completitud_v0.13.md: qué falta antes de la v1.0;
- spec_v0.16/decisiones.md: las decisiones de la última versión;
- spec_v0.15/decisiones.md: las de la v0.15, y diseno_recuperacion.md, su diseño.