diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 435ea87..fb2a82b 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -12,7 +12,7 @@ Los dos repos están en el Gitea privado `g.activething.com` (solo LAN, certific |---|---|---|---| | `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. | -| `App` (`go/DateKeys-App`) | `main` | `97827ae` | 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), página `/inspect`, contraste BLS. `testdata` sincronizado a `9ac9cd9`. Fase 2, pasos 2 a 5a hechos. Los 65 casos del corpus pasan por `open` con el código y el paso de Go. 2 490 tests, ninguno saltado; `npm run verify` en verde. | +| `App` (`go/DateKeys-App`) | `main` | `a89bee5` | 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`; contraste BLS. `testdata` sincronizado a `9ac9cd9`. Fase 2, pasos 2 a 5b hechos. Los 65 casos del corpus pasan por `open` con el código y el paso de Go. 2 560 tests, ninguno saltado; `npm run verify` en verde. | | `AppOld` (solo local) | `master` | `4d2b0a1` | Prototipo antiguo. No se toca. | Verificación ya hecha sobre `datekeys-go`: @@ -51,7 +51,8 @@ Plan: `docs/PLAN_fase2_ibe_noble2.md` v2, con las decisiones confirmadas por el - hecho el 28-09 (`35be27c`): `ibe.ts` sobre noble 2, con vectores de Go en `src/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 al `Stanza` de `age-encryption`, que guarda el tipo en `args[0]`, van al paso 7; - hecho el 28-09 (`076f3db`): `release.ts`, con `verifyRelease` en el orden y con los textos de `provider.Verify`, `ReleaseSource` y `suppliedRelease`. Solo verifica el scheme de Quicknet: otro da `ERR_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 de `agewrap` se apoyan en `x25519.ts`, que abre los stanzas de uno en uno. Usa `@noble/ciphers` 2.4.0, dependencia directa aprobada ese día: es la copia que ya usa `age-encryption`. Las identidades `AGE-SECRET-KEY-1…` se leen con `bech32.ts`. `index.ts` no reexporta aún la apertura, que metería noble en `/inspect`; -- siguiente, el paso 5b: `PAYLOAD_AGE` en streaming a OPFS; +- hecho el 28-09 (`a89bee5`), paso 5b. `open` acepta un `Blob` del que solo lee el prefijo de los pasos 1 a 8 (`prefix.ts`, movido de la página a la librería), calcula el `capsule_digest` en streaming (`digest.ts`) y descifra `PAYLOAD_AGE` en streaming. La salida puede ser un `WritableStream`, 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; +- siguiente, el paso 6, ya cubierto: la enmienda de canonicidad entró en la v0.8.2. Después viene el paso 7: el cifrado del stanza tlock (`encryptOnG2RFC9380` y un `Recipient` propio) y la interoperabilidad de TypeScript a Go; - cifrado a nivel de stanza e interoperabilidad con Go; - la acción "abrir" en `/inspect`.