You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
12 KiB
12 KiB
Plan: formato 3 en datekeys-ts (spec v0.10, entrega 1)
30 de septiembre de 2026. Implementa en datekeys-ts, rama v0.10, lo que la referencia Go ya hace con el tag spec-v0.10 (cc35d2c): leer y escribir cápsulas de formato 3, en la librería y en las páginas. Fuentes: el spec v0.10, spec_v0.10/formato3_diseno.md, cuyas decisiones de la página ya aprobó el autor (apartados 3 y 5, decisiones 8 a 11 del apartado 9), y el código Go de capsule/format3.go, open3.go, encrypt3.go e internal/pathrule.
Reglas de trabajo
- Cada paso va en su commit, o en varios, sobre la rama
v0.10, y cada commit dejanpm run verifyen verde.mainno se toca mientras el autor no decida si cierra0.2.0(§2.3 del handoff). - Nada se sube sin la autorización del autor.
- Sin dependencias nuevas: las tablas Unicode las genera
datekeys-go(pathrule/gen -ts), y el ZIP y el CRC-32 son código propio. testdatasolo llega dedatekeys-go, conscripts/sync-testdata.mjsy el tagspec-v0.10.- Los textos de error siguen los de Go byte a byte, también los de las reglas de rutas y de texto, y las líneas de los veredictos en español.
src/lib/dkcsigue a la referencia Go. Lo que solo tiene la página va ensrc/lib/inspector: el ZIP, el CRC-32 y el sumidero en OPFS.- Los módulos nuevos se cubren al 100 %, como los de las fases 2 y 3 (
vitest.config.ts).
Pasos
| Paso | Contenido | Resultado |
|---|---|---|
| 0 | Tablas: el generador de datekeys-go escribe src/lib/dkc/pathrule-tables.ts |
Hecho el 30-09: datekeys-go 13910b3, sin subir. El digest recalculado en TypeScript coincide con TablesDigest |
| 1 | pathrule.ts: NFD, pliegue, clave de R7, de R1 a R10 con R4b, R6b, R6c y R9, y las reglas de texto de §29.6 |
Hecho el 30-09: los casos de las pruebas Go con sus textos, y cobertura del 100 % |
| 2 | Códec del formato 3, sin tocar la trama: BODY, security y head, y ERR_HEAD_INVALID |
Hecho el 30-09, d9a9cf5: los casos de las pruebas Go, con los textos de Go sacados de la referencia |
| 3 | Lector y testdata en spec-v0.10: VERSION 3, control de versión 3, paso 17 en subpasos, sumidero y lectura hasta EOF |
Hecho el 30-09, b176ad2: los 209 casos del corpus con el texto exacto de Go, congelado en testing/mutation-texts.json |
| 4 | Escritor: encryptFiles, en dos fases y con dos lecturas; encrypt solo para vectores |
Hecho el 30-09, de 3daa1f7 a 2efc8bc: los cinco fixtures de EncryptFiles byte a byte, los textos de Go, /create en formato 3 con un fichero, y Go abre seis cápsulas de formato 3 de TypeScript |
| 5 | ZIP de la página y su sumidero en OPFS | Hecho el 30-09, 36096a9 y ee82f43: ZipSink con escrituras posicionadas, y archive/zip de Go lee las muestras, 65 535 entradas incluidas |
| 6 | Página /inspect: veredictos, autor, comentario, rutas y descargas |
Hecho el 30-09, 651178a: un fichero suelto o un ZIP en OPFS, con la descarga de cada fichero; en Chromium, el ZIP de format3_tree con sus CRC-32 parcheados y el borrado del temporal |
| 7 | Página /create: ficheros y carpetas, rutas editables, exclusiones, comentario, autor y mtime |
Hecho el 30-09, 7dc88ef: el tamaño exacto antes de escribir, y datekeys decrypt de Go y /inspect abren una cápsula de seis ficheros escrita por la página |
| 8 | Documentación, verificación y revisión adversarial | Hecho el 01-10, de 7527c35 a e6cca0b y el CHANGELOG: tres revisiones con subagentes y sus correcciones confirmadas; /create rediseñado y el sitio siempre claro, a petición del autor. Pendiente: ver el handoff |
Paso 1. Reglas de rutas y de texto
pathrule-tables.tses código generado: no se edita a mano. Se regenera congo run ./internal/pathrule/gen -data .cache -go internal/pathrule/tables.go -ts ../App/src/lib/dkc/pathrule-tables.tsdesdedatekeys-go, y una prueba recalcula su digest.pathrule.tsno usanormalize,toLowerCase,localeCompare,Intlni las clases\p{...}, porque su versión de Unicode cambia con el motor. Los límites cuentan bytes de UTF-8, con elutf8Lengthdebytes.ts.index.tsno lo reexporta: sus tablas pesan 136 KB y se cargan bajo demanda, con el lector y con el formulario de/create(pasos 6 y 7).
Paso 2. Códec
- Módulos por esquema, como
header.tsycontrol.ts:body.ts(la trama de §29.2,AREA_LEN,SECURITY_LENyHEAD_LEN, y el área rellena de ceros),security.ts(el mapa exterior, la firma y el sello, los veredictos X, F0, F1, S0, S1 y S2 con sus textos, y el codificador) yhead.ts(capas 2 a 4 del head, R1 y R8 en la capa 3, y la capa 4 conERR_HEAD_INVALID). ERR_HEAD_INVALIDenerrors.ts, que pasa a 19 códigos, y su glosa enformat.ts.- El objeto de extensiones
HEAD_CBORenextension.ts, con sus claves 6 y 7. - Pruebas: los casos de
format3_test.gocon sus bytes y sus textos. Los vectores dehead_schema.jsonysecurity.jsonllegan en el paso 3.
Paso 3. Lector y datos de prueba
npm run testdata:sync -- --commit spec-v0.10,SPEC_VERSION0.10, y la autocomprobación del arnés conwant 0.10.- Trama:
FORMAT_3, yisFormatacepta de 1 a 3. El control de versión 3 tiene las claves del de versión 2.accessSlotsda 16 en los formatos 2 y 3, y el relleno vale para los dos. open:- Gana
OpenOptions.sink:begin(head),create(i)con unWritableStream,commit()yabort(). Tiene la semántica delSinkde Go: nada se presenta como válido antes decommit. - Sin sumidero, un formato 3 rechaza con un
TypeErrorjusto tras el paso 2, antes de pedir nada, comoErrSinkRequired. - El paso 17 va en los subpasos 17.1 a 17.8, con la precedencia de Go:
- Un fallo de
age, o una longitud distinta de P, prevalece. - Si no, manda el primer subpaso que falle.
- Los códigos distintos de
ERR_INTEGRITYsolo se dan tras leerPAYLOAD_AGEhasta EOF.
- Un fallo de
Openedganahead,verdicts,areaLenyunusableHeadExtensions.
- Gana
inspectacepta el formato 3 en los pasos 1 a 8, y su vista JSON coincide con la de Go.- Un sumidero en memoria en
opener.ts, para los fixtures y para contenidos de hasta 64 MiB. Hasta el paso 6, la página inspecciona el formato 3 y, al abrirlo, dice que aún no entrega ficheros. - Pruebas:
fixtures.test.tscon los formatos 1, 2 y 3.open.test.ts: cada fixture abre, con el SHA-256 deBODYy el de cada fichero.mutations.json: 209 casos, con la claveverdictsy los casosok, desde memoria y desde unBlob, con un sumidero que debe acabar abortado.inspect_differential.json: 5 110 casos sobre 14 bases.cbor.jsoncon el control de versión 3;head_schema.json,security.json,paths.jsonypath_fold.json.ibe-vectors.json, regenerado conscripts/ibe-go-vectors.gopara los nueve fixtures nuevos.
- Los textos de error de los 209 casos quedan congelados desde Go, con un script, en
testing/, igual quecapsule-vectors.json. En la v0.9 se compararon una sola vez, fuera del repositorio. check-build.mjsañade a los secretos de fixture que no pueden publicarse el head, la sal, el comentario, los ficheros yBODY.
Paso 4. Escritor
encryptFiles(files, opts):- Cada fichero trae
path,size,mtimeopcional (en milisegundos, comoFile.lastModified) y una forma de leerlo dos veces: unBloboopen(). - Las opciones ganan
comment,authory las extensiones del head.
- Cada fichero trae
- Primera fase:
- Rutas y textos con las reglas del lector: CR LF y un CR suelto pasan a LF en el comentario.
- La mtime con la regla 16 de §62.1.
- L medido con un head de sal y hashes a cero.
|HEAD|de 16 MiB como máximo, y L como máximo L_MAX.- La primera pasada de SHA-256, en piezas de 64 KiB.
- Segunda fase:
- La sal y
HEAD_CBOR, el control de versión 3 y elSECURITY_CBORvacío. - La autodecodificación de los tres CBOR (MUST).
- La segunda pasada, que aborta si un fichero cambió de tamaño o de SHA-256, con el texto de Go.
- El
.dkk.
- La sal y
capsuleLength3enlengths.ts: el tamaño exacto antes de escribir, para la página.encryptescribe el formato 2 solo contestVectors, con el texto de Go. La página deja de usarlo en el paso 7.- Interoperabilidad:
scripts/capsule-ts-samples.mjsgana muestras del formato 3, yscripts/capsule-go-verdicts.golas abre concapsule.Openy un sumidero.capsule-vectors.jsonse regenera.- Con sorteos fijos, las secciones deterministas coinciden con las de los fixtures
format3_*.
Paso 5. ZIP y sumidero de la página
- Hechos y cubiertos al 100 %:
crc32.ts.zip.ts: entradas almacenadas, nombres UTF-8 con el bit 11, sin descriptores de datos ni entradas de carpeta, el CRC-32 parcheado en la cabecera local, fechas DOS en UTC entre 1980 y 2107, el campo NTFS 0x000A, que manda, el 0x5455 cuando cabe en 32 bits con signo, y ZIP64 por tamaño, posición o número de entradas.
zipsink.ts, un sumidero sobre un solo fichero de OPFS:- Un único fichero de un segmento se escribe tal cual.
- En otro caso va el ZIP, con las cabeceras escritas por adelantado, el CRC-32 con escrituras posicionadas y el directorio central en
commit. - Cada fichero se ofrece como un trozo (
slice) del de OPFS. tempfile.tsgana la escritura posicionada.
- Interoperabilidad:
- Un script escribe ZIP con TypeScript: nombres no ASCII, mtime ausente o fuera de rango, ficheros vacíos y 65 535 entradas.
archive/zipde Go los lee, y el resultado queda congelado entesting/zip-vectors.json.- La entrada de 4 GiB solo se prueba en la disposición: el fichero entero no cabe en una prueba.
Paso 6. Página /inspect
- Primero los veredictos, en sus líneas de §29.7, y después el autor declarado y el comentario, con el prefijo de la regla.
- Las rutas, en
<bdi dir=auto>y con los invisibles escapados. - Avisos según la clave de R7:
.lnk,.url,.library-ms,.searchConnector-ms,desktop.ini,.git, ejecutables y un-inicial. - Descargas:
- Un único fichero de un segmento se descarga con su nombre, pasado por
safeFileName. - Un único fichero dentro de una carpeta se descarga primero, y el ZIP después (decisión 8).
- Con varios ficheros, el ZIP se llama
<primer segmento común>.zip, o<nombre del .dkc>.zip, y cada fichero tiene su descarga.
- Un único fichero de un segmento se descarga con su nombre, pasado por
- El espacio de OPFS se comprueba dos veces: con el contenido cifrado antes de empezar, como en el formato 2, y con la longitud exacta del ZIP al leer el head, antes de escribir nada.
check-build.mjscomprueba que las tablas depathruleno entran en la primera carga de ninguna página.
Paso 7. Página /create
- Ficheros y carpetas, con
multiple,webkitdirectoryy arrastrar y soltar. - Rutas editables, validadas con
pathrulea medida que se escriben. - Exclusiones tachadas, que se pueden reactivar:
.DS_Store,Thumbs.db,desktop.ini,._*y__MACOSX/. - Comentario, autor declarado, y una casilla de mtime marcada por defecto.
- Las dos fases del escritor, con el progreso de las dos pasadas.
- El tamaño exacto del
.dkcy la comprobación de la cuota antes de escribir. creator.tssigue inspeccionando la cápsula escrita y exige el tamaño y la ronda del plan.
Paso 8. Documentación, verificación y revisión
- README: versiones, módulos, páginas, vectores, dependencias y
testdata. CHANGELOG: bajo «sin publicar»; el número de versión lo decide el autor. npm run verifyynpm run testdata:check.- Revisión adversarial de las páginas, del lector y del escritor, con subagentes, como en la fase 3.
- Actualizar el handoff.