{"contenido":{"asientos":[{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-05","hash":"aadbd71c905322af5cbf9515c6849f60991b77d429d73196be499ebc9e4d1ed3","hashPrevio":"0000000000000000000000000000000000000000000000000000000000000000","id":"as_1","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791180000000,"origen":"app","registradoEn":1791230400001,"secuencia":1,"tipo":"entrada"},{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-05","hash":"0b303ec6547fd341f0869267058fcd3ac6c0f953ccd7ce7e86ff3edfec91704d","hashPrevio":"aadbd71c905322af5cbf9515c6849f60991b77d429d73196be499ebc9e4d1ed3","id":"as_2","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791208800000,"origen":"app","registradoEn":1791230400002,"secuencia":2,"tipo":"salida"},{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-06","hash":"aa6a75bd3ba7d33f5aca517df2132f20fef8383b06f58a817eaf2dc78dd7816d","hashPrevio":"0b303ec6547fd341f0869267058fcd3ac6c0f953ccd7ce7e86ff3edfec91704d","id":"as_3","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791270000000,"origen":"app","registradoEn":1791316800003,"secuencia":3,"tipo":"entrada"},{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-06","hash":"3290f06e028022aa7e6f00dd7cc58c30d8ac57e75b85b2857db8d35124427f48","hashPrevio":"aa6a75bd3ba7d33f5aca517df2132f20fef8383b06f58a817eaf2dc78dd7816d","id":"as_4","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791295200000,"origen":"app","registradoEn":1791316800004,"secuencia":4,"tipo":"salida"},{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-07","hash":"faea5c57f8ac41afb7198bc7b8833804bad0f57b78e2636f7e9a44bf9d00491b","hashPrevio":"3290f06e028022aa7e6f00dd7cc58c30d8ac57e75b85b2857db8d35124427f48","id":"as_5","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791352800000,"origen":"app","registradoEn":1791403200005,"secuencia":5,"tipo":"entrada"},{"autorId":"tra_ejemplo","desfaseMin":120,"empleadoId":"tra_ejemplo","empresaId":"emp_ejemplo","fechaLaboral":"2026-10-07","hash":"03df717e47337561c8a72070c9eb0e209024db92994bc4cc26d91901d020b699","hashPrevio":"faea5c57f8ac41afb7198bc7b8833804bad0f57b78e2636f7e9a44bf9d00491b","id":"as_6","metodo":"sesion","modalidad":"presencial","naturaleza":"ordinaria","ocurridoEn":1791381600000,"origen":"app","registradoEn":1791403200006,"secuencia":6,"tipo":"salida"}],"clavesPublicas":{"keys":[{"jwk":{"crv":"Ed25519","kty":"OKP","x":"Na8MD8nyC2eO3_dYklSVpPbQCaSk7UoMByP90zgGhXA"},"kid":"prueba-1"}]},"clavesSellos":{"keys":[{"jwk":{"crv":"Ed25519","kty":"OKP","x":"Na8MD8nyC2eO3_dYklSVpPbQCaSk7UoMByP90zgGhXA"},"kid":"prueba-1"}]},"empleados":[],"empresa":{"id":"emp_ejemplo","razonSocial":"Empresa de Ejemplo, S.L."},"incidencias":[],"informe":{"html":"<!doctype html>\n<html lang=\"es\"><head><meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'\">\n<title>Paquete pericial 2026-10-05 a 2026-10-07</title>\n<style>\n:root{--f:#fff;--t:#111;--g:#666;--b:#ccc}\n@media (prefers-color-scheme:dark){:root{--f:#000;--t:#eee;--g:#999;--b:#444}}\nbody{margin:0 auto;max-width:760px;padding:16px;background:var(--f);color:var(--t);font:16px/1.5 Inter,system-ui,sans-serif}\nh1{font-size:24px;margin:0 0 8px}h2{font-size:18px;margin:32px 0 8px;border-bottom:1px solid var(--b);padding-bottom:4px}\ntable{border-collapse:collapse;width:100%;font-variant-numeric:tabular-nums}th,td{border:1px solid var(--b);padding:4px 8px;text-align:left;vertical-align:top}\ncode{font-family:ui-monospace,monospace;font-size:13px;word-break:break-all}.g{color:var(--g)}\n</style></head><body>\n<h1>Paquete pericial de registro de jornada</h1>\n<p><strong>Empresa de Ejemplo, S.L.</strong> <span class=\"g\">[emp_ejemplo]</span><br>Periodo: 2026-10-05 a 2026-10-07<br>Generado: 2026-10-08T09:00:00.000Z</p>\n<h2>Resumen</h2>\n<p>Asientos: 6 (secuencias 1 a 6), de ellos 0 correcciones y 0 diferidos.<br>Personas con registro: 1. Horas trabajadas en total: 24,00.</p>\n<h2>Prueba de la cadena</h2>\n<p>Hash de cabeza (eslabón anterior al primer asiento):<br><code>0000000000000000000000000000000000000000000000000000000000000000</code></p>\n<p>Hash de cola (último asiento):<br><code>e2ed50962fdfef8ca2c54354835595883aa7bd8df78f5c88c40e1777e6d5440f</code></p>\n<p>Estado al generar: <strong>íntegra</strong></p>\n<h2>Sellos diarios y recibos</h2>\n<p>Sellos: 3 (del 2026-10-05 al 2026-10-07)<br>Recibos firmados: 2<br>Sellos diarios firmados (Ed25519): 3</p>\n<h2>Horas por persona</h2>\n<table>\n<tr><th>Persona</th><th>Días</th><th>Horas</th><th>H. extraordinarias</th></tr>\n<tr><td>tra_ejemplo</td><td>3</td><td>24,00</td><td>0,00</td></tr>\n</table>\n<h2>Incidencias del periodo (0)</h2>\n<p>Ninguna.</p>\n<h2>Lo que este paquete no acredita</h2>\n<ul><li>Este informe resume los asientos del periodo; la prueba son los asientos y su cadena, no este texto.</li><li>La cadena prueba que el registro no cambió después de grabarse; no prueba que el hecho registrado sea cierto.</li><li>La huella global prueba que el archivo no se ha alterado; no prueba quién lo generó. Anótela al entregarlo.</li><li>No sustituye a un peritaje ni a la valoración de un asesor jurídico.</li></ul>\n</body></html>\n","txt":"PAQUETE PERICIAL DE REGISTRO DE JORNADA\nEmpresa: Empresa de Ejemplo, S.L. [emp_ejemplo]\nPeriodo: 2026-10-05 a 2026-10-07\nGenerado: 2026-10-08T09:00:00.000Z\n\nRESUMEN\nAsientos: 6 (secuencias 1 a 6), de ellos 0 correcciones y 0 diferidos\nPersonas con registro: 1. Horas trabajadas en total: 24,00\n\nPRUEBA DE LA CADENA\nHash de cabeza (eslabón anterior al primer asiento): 0000000000000000000000000000000000000000000000000000000000000000\nHash de cola (último asiento):                       e2ed50962fdfef8ca2c54354835595883aa7bd8df78f5c88c40e1777e6d5440f\nEstado al generar: íntegra\n\nSELLOS DIARIOS Y RECIBOS\nSellos: 3 (del 2026-10-05 al 2026-10-07)\nRecibos firmados: 2\nSellos diarios firmados (Ed25519): 3\n\nHORAS POR PERSONA (horas con coma decimal)\n- tra_ejemplo: 3 día(s), 24,00 h trabajadas, 0,00 h extraordinarias\n\nINCIDENCIAS DEL PERIODO (0)\nNinguna.\n\nLO QUE ESTE PAQUETE NO ACREDITA\n- Este informe resume los asientos del periodo; la prueba son los asientos y su cadena, no este texto.\n- La cadena prueba que el registro no cambió después de grabarse; no prueba que el hecho registrado sea cierto.\n- La huella global prueba que el archivo no se ha alterado; no prueba quién lo generó. Anótela al entregarlo.\n- No sustituye a un peritaje ni a la valoración de un asesor jurídico.\n"},"instrucciones":"VERIFICACIÓN INDEPENDIENTE, SIN EL SERVIDOR\n\n1. Obtenga el verificador abierto (carpeta «verificador/» del código de El Registro de Jornada):\n   basta el archivo verificar-paquete.mjs junto con verificar-cadena.mjs. Solo requiere Node.js 20 o superior; no usa red ni dependencias.\n2. Ejecute, con el paquete en la misma carpeta:\n     node verificar-paquete.mjs paquete.json\n   Para sacar el informe y los asientos a archivos normales:\n     node verificar-paquete.mjs paquete.json --extraer salida\n3. Resultado: «PAQUETE VÁLIDO» (código de salida 0) o la lista de problemas (código 1).\n4. Compare la huella global que imprime con la que se anotó al recibir el paquete.\n\nQUÉ SE COMPRUEBA\n- El archivo es, byte a byte, el generado: JSON canónico (claves ordenadas, sin espacios) y su huella global SHA-256 coincide.\n- Cada parte coincide con la huella del manifiesto.\n- Cadena: cada asiento repite su SHA-256 («hashPrevio|» + JSON canónico de sus campos, sin id, secuencia, hashPrevio, hash ni registradoEn), enlaza con el anterior y la secuencia no salta; el tramo parte del hash de cabeza y acaba en el de cola.\n- Sellos diarios: cada sello coincide con su resumen, enlaza con el anterior, no hay días saltados y su cierre coincide con los asientos.\n- Recibos: firma Ed25519 válida con las claves públicas incluidas y coincidencia con un asiento del tramo.\n- Sellos diarios firmados (si el paquete los lleva): firma Ed25519 válida con las claves públicas incluidas, carga coherente con el índice y, para los días del periodo, mismo recuento y misma huella que los asientos del día.\n\nCOMPROBACIÓN MANUAL (sin este verificador): huella global = SHA-256 en hexadecimal del texto UTF-8 de «contenido» en JSON canónico, tal como aparece en el archivo.\n\nADVERTENCIA: comprobar que el paquete cuadra no prueba que los hechos registrados sean ciertos ni quién lo generó. No sustituye a un perito.\n","manifiesto":{"empresa":{"id":"emp_ejemplo","razonSocial":"Empresa de Ejemplo, S.L."},"formato":"erj-paquete-pericial","generadoEn":1791450000000,"huellas":{"asientos":"5e55830377b58eaefaad65f8913c978387aa2cf21d2b8fe3857dc299b0e2ccda","incidencias":"4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945","informeHtml":"c13e80ef70ef73787aac9fbbc7044619cfff6f511a287d439774b8047fece032","informeTxt":"25677f257bd29c785588251ba3ac9f27d876dedbbc17b95878b2b95e2fd3e283","instrucciones":"f5507459598ea96c59c5d5a7ada1e02e0fa810b7309667124d97b500145f1617","recibos":"0c75b3e2e26fdede5ae916cd0dcf61d3aee01b4fb8121b4091652e20f20d82f7","sellos":"027b5bfaeb24396e23fdf566f7cdc7b19d8f118d6566197d16ad18f172b0c07a","sellosFirmados":"dfac95c9035ee47999c65d9751c2302a84d97b51a835b453b7d7b922ec802d94"},"periodo":{"desde":"2026-10-05","hasta":"2026-10-07"},"recuentos":{"asientos":6,"recibos":2,"sellos":3,"sellosFirmados":3},"version":1},"recibos":["eyJhbGciOiJFZERTQSIsInR5cCI6ImVyai1yZWNpYm8randzIiwia2lkIjoicHJ1ZWJhLTEifQ.eyJ2IjoxLCJpc3MiOiJlcmoiLCJlbXAiOiJlbXBfZWplbXBsbyIsImlkIjoiYXNfMSIsInNlcSI6MSwiaGFzaCI6ImFhZGJkNzFjOTA1MzIyYWY1Y2JmOTUxNWM2ODQ5ZjYwOTkxYjc3ZDQyOWQ3MzE5NmJlNDk5ZWJjOWU0ZDFlZDMiLCJwcmV2IjoiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsInRpcG8iOiJlbnRyYWRhIiwidCI6MTc5MTE4MDAwMDAwMCwiaWF0IjoxNzkxMjMwNDYwMDAwfQ.p92LZn2kvH0gqvNxg-gaIyxdQYR5lPWfZ8hcwDCvZkDDLqWePGMhdmY3Gzky8D2fT9DU2DzOx2rac2jsvKwKAg","eyJhbGciOiJFZERTQSIsInR5cCI6ImVyai1yZWNpYm8randzIiwia2lkIjoicHJ1ZWJhLTEifQ.eyJ2IjoxLCJpc3MiOiJlcmoiLCJlbXAiOiJlbXBfZWplbXBsbyIsImlkIjoiYXNfNCIsInNlcSI6NCwiaGFzaCI6IjE4YzM5MjI5ZmNjMDRlNzVhOWYxODAxMTk1MjNjMTc4NTViZjhlMTA0ZWY5OWViNzZlNmU2ZTk2NDk0MjQ4OGUiLCJwcmV2IjoiMzhjNjMxZTc4ZTE0MTgzZjI1YmNlNjBiYzMwNjc5MjEyNzE0MTYyMjA2YTRlM2M2MzI2MTJjZWRjMWNiMDNmOSIsInRpcG8iOiJzYWxpZGEiLCJ0IjoxNzkxMjk1MjAwMDAwLCJpYXQiOjE3OTEzMTcwNDAwMDB9.T0ElkO800sdVs_DJ_VOhoubnv-LCOZgK5gu9jOn8iIPN3HAoZTrK9doSNB2ietIeTWN8dzx4sNOGEJyjEQGXCw"],"sellos":[{"asientos":2,"empresaId":"emp_ejemplo","fecha":"2026-10-05","hash":"c089285e4dd0c9ae2fc66af7687e2cc25ea391f7fbea2bb287efc14a6d24ae3d","hashCierre":"0b303ec6547fd341f0869267058fcd3ac6c0f953ccd7ce7e86ff3edfec91704d","hastaSecuencia":2,"selladoEn":1791244740000,"selloPrevio":"0000000000000000000000000000000000000000000000000000000000000000"},{"asientos":2,"empresaId":"emp_ejemplo","fecha":"2026-10-06","hash":"efda973b77842d190eae08c42b2c7172afe1c862ac9a6622d22933d81de55cdb","hashCierre":"18c39229fcc04e75a9f180119523c17855bf8e104ef99eb76e6e6e964942488e","hastaSecuencia":4,"selladoEn":1791331140000,"selloPrevio":"c089285e4dd0c9ae2fc66af7687e2cc25ea391f7fbea2bb287efc14a6d24ae3d"},{"asientos":2,"empresaId":"emp_ejemplo","fecha":"2026-10-07","hash":"595243ec9223b2bb74b2ff75566b1a1076c9e7b08e90f6f27967743a1733c74a","hashCierre":"e2ed50962fdfef8ca2c54354835595883aa7bd8df78f5c88c40e1777e6d5440f","hastaSecuencia":6,"selladoEn":1791417540000,"selloPrevio":"efda973b77842d190eae08c42b2c7172afe1c862ac9a6622d22933d81de55cdb"}],"sellosFirmados":[{"asientos":2,"emitidoEn":1791244740001,"empresaId":"emp_ejemplo","fecha":"2026-10-05","hastaSecuencia":2,"huella":"3941b99be59d9c0c9c664b8a2be1ce3b73e6aecc7373b43fe35b49c6116e2d41","jws":"eyJhbGciOiJFZERTQSIsInR5cCI6ImVyai1zZWxsby1kaWErandzIiwia2lkIjoicHJ1ZWJhLTEifQ.eyJ2IjoxLCJpc3MiOiJlcmoiLCJlbXAiOiJlbXBfZWplbXBsbyIsImZlY2hhIjoiMjAyNi0xMC0wNSIsIm4iOjIsInNlcSI6MiwiaHVlbGxhIjoiMzk0MWI5OWJlNTlkOWMwYzljNjY0YjhhMmJlMWNlM2I3M2U2YWVjYzczNzNiNDNmZTM1YjQ5YzYxMTZlMmQ0MSIsImlhdCI6MTc5MTI0NDc0MDAwMX0.mHS5miHNHx2ValdwoJGIxOnKr96hSURBCwT8Pd4Npcv-MuVv6LUtdDxzUJU3QGjIGF2ayzacGQl6wEJfUPsnCw","kid":"prueba-1"},{"asientos":2,"emitidoEn":1791331140001,"empresaId":"emp_ejemplo","fecha":"2026-10-06","hastaSecuencia":4,"huella":"719a7d0413a5c0e7216b5000675988190d2f111cbdefc3eb75a72b0a1fb80673","jws":"eyJhbGciOiJFZERTQSIsInR5cCI6ImVyai1zZWxsby1kaWErandzIiwia2lkIjoicHJ1ZWJhLTEifQ.eyJ2IjoxLCJpc3MiOiJlcmoiLCJlbXAiOiJlbXBfZWplbXBsbyIsImZlY2hhIjoiMjAyNi0xMC0wNiIsIm4iOjIsInNlcSI6NCwiaHVlbGxhIjoiNzE5YTdkMDQxM2E1YzBlNzIxNmI1MDAwNjc1OTg4MTkwZDJmMTExY2JkZWZjM2ViNzVhNzJiMGExZmI4MDY3MyIsImlhdCI6MTc5MTMzMTE0MDAwMX0.J7z8CclJWJKz7bZzF53Om5eAkvZNULquw2_K8btfOnrCUVDd74ly5ervcTTzTh5rMrBhhmWIfZoAaXihH5qyAg","kid":"prueba-1"},{"asientos":2,"emitidoEn":1791417540001,"empresaId":"emp_ejemplo","fecha":"2026-10-07","hastaSecuencia":6,"huella":"db9688ad90fb14a591250363caa649dea61abf0af0e8e74ea3b445d75bb5a039","jws":"eyJhbGciOiJFZERTQSIsInR5cCI6ImVyai1zZWxsby1kaWErandzIiwia2lkIjoicHJ1ZWJhLTEifQ.eyJ2IjoxLCJpc3MiOiJlcmoiLCJlbXAiOiJlbXBfZWplbXBsbyIsImZlY2hhIjoiMjAyNi0xMC0wNyIsIm4iOjIsInNlcSI6NiwiaHVlbGxhIjoiZGI5Njg4YWQ5MGZiMTRhNTkxMjUwMzYzY2FhNjQ5ZGVhNjFhYmYwYWYwZThlNzRlYTNiNDQ1ZDc1YmI1YTAzOSIsImlhdCI6MTc5MTQxNzU0MDAwMX0.tdTxDy0LL6hR8Xu3cYK7L25GMaW0C09dJpwyqDCya6oOpWMFyzLO1yZZt8Y5MD2Qz8-kuYOQoZRAiu68IeQPDQ","kid":"prueba-1"}],"tramo":{"desdeSecuencia":1,"hashCabeza":"0000000000000000000000000000000000000000000000000000000000000000","hashCola":"03df717e47337561c8a72070c9eb0e209024db92994bc4cc26d91901d020b699","hastaSecuencia":6,"intactaAlGenerar":true}},"formato":"erj-paquete-pericial","huella":"068d12fb871760d04e65eda455aabb566b6fb6a2f0cec14b220540a43b4959a7","version":1}