{fileName.text}

{formatByteCount(report.size)}{#if report.readLength < report.size}. Se leyeron los primeros {formatByteCount( report.readLength, )}: el resto {report.prelude ? 'de PAYLOAD_AGE' : 'del fichero'} no interviene en los pasos 1 a 8{/if}.

{copyStatus}

{#if report.valid}

Estructura válida

Supera los pasos 1 a 8 de §63 sin red y sin secretos. Es una comprobación de estructura: la cabecera pública solo queda vinculada al control al abrir la cápsula (paso 15), y ni siquiera entonces prueba quién la escribió ni cuándo (§55.1).

{:else if report.failure}

Rechazada en el paso {report.failure.step}

{report.failure.code}

{errorGloss(report.failure.code)}

{/if}

Fecha de apertura

{#if report.unlock && unlockMs !== undefined}

En tu hora local{timeZone ? ` (${timeZone})` : ''}: {formatDateTime(unlockMs)}

Ronda {report.capsule?.round} de {report.profile?.network ?? report.capsule?.network}; {unlockMs <= nowMs ? `la fecha ya pasó, ${formatRelative(unlockMs, nowMs)}` : `la fecha todavía no ha llegado: ${formatRelative(unlockMs, nowMs)}`}.

{:else if report.unlock}

{:else}

Sin calcular: sale de la DateKey en el paso 7, {report.steps[6]?.state === 'failed' ? 'que falló' : 'que no llegó a ejecutarse'}.

{/if}

Pasos 1 a 8

{@render opening?.()}

Cabecera pública

{#if report.capsule} {@const c = report.capsule}
capsule_id
{c.capsuleId}
access_policy
{c.accessPolicy} {policyGloss(c.accessPolicy)}
DateKey
{c.dateKey}
DateKey decodificada
{c.dateKeyJSON}
Red (network)
{c.network}
Ronda
{c.round}
unlock_at
{report.unlock?.rfc3339 ?? 'sin calcular'}
{:else}

PUBLIC_HEADER no llegó a decodificarse.

{/if}

Perfil fijado

{#if report.profile} {@const p = report.profile}
profile_id
{p.id}
Proveedor y red
{p.provider}, {p.network}
Cadena (chain hash)
{p.chainHash}
Periodo
{p.period} s por ronda
Génesis
{p.genesis}
Esquema
{p.scheme}
{:else if report.capsule}

La DateKey nombra el perfil {report.capsule.network}, que este lector no tiene fijado.

{:else}

Se elige con la DateKey de PUBLIC_HEADER, que no llegó a decodificarse.

{/if}

Prelude

{#if report.prelude} {@const p = report.prelude}
Bytes
{p.hex}
Marca y versión
{p.magic}, versión {p.version}
FLAGS y RESERVED
{p.flags}, {p.reserved}
PUBLIC_HEADER_LEN
{formatByteCount(p.publicHeaderLen)}
SEALED_CONTROL_LEN
{formatByteCount(p.sealedControlLen)}
PAYLOAD_AGE
desde el byte {formatInteger(p.payloadOffset)}{#if p.payloadLength !== undefined}, {formatByteCount( p.payloadLength, )}{:else}, fuera del fichero{/if}
{:else}

El prelude no se superó.

{/if}

Stanzas age

OUTER_TIME_AGE
{#if report.outerStanzas} {report.outerStanzas.length} {report.outerStanzas.length === 1 ? 'stanza' : 'stanzas'}: {stanzaTypes(report.outerStanzas)} (se exige exactamente uno, tlock) {:else} sin leer {/if}
PAYLOAD_AGE
{#if report.payloadStanzas} {report.payloadStanzas.length} {report.payloadStanzas.length === 1 ? 'stanza' : 'stanzas'}: {stanzaTypes(report.payloadStanzas)} (se exige exactamente uno, X25519) {:else} sin leer {/if}

Stanza tlock frente al perfil fijado

{#if report.tlock}
    {#each report.tlock as c (c.label)}
  • {c.label} {comparisonState(c)}

    En el stanza: {c.found ?? 'falta'}

    Esperado: {c.expected}

  • {/each}
{:else if report.outerStanzas}

OUTER_TIME_AGE no trae ningún stanza tlock.

{:else}

Se compara cuando se leen la cabecera, el perfil y OUTER_TIME_AGE.

{/if}

Extensiones de PUBLIC_HEADER

Este inspector implementa el protocolo base V1 y no conoce ninguna extensión: una crítica hace fallar el paso 4 y las no críticas se ignoran. Sus datos son bytes opacos para el protocolo.

{#if report.extensions} {:else}

PUBLIC_HEADER no llegó a decodificarse.

{/if}

Salida de la CLI

JSON de datekeys inspect -json {#if shownJSON !== report.json}

Los caracteres invisibles o de control se muestran escapados (\uXXXX, el mismo JSON). Copiar JSON copia la salida exacta de la CLI.

{/if}
{shownJSON}