Identity Bootstrap Record V1

This document defines the canonical identity bootstrap record required for the retained PHP rewrite scope.

Scope

  • One ASCII text file represents one bootstrapped identity.

  • Canonical identity bootstrap files live in records/identity/.

  • The record captures the first accepted key-linked identity for a signer.

  • The public-key body stored here is canonical content, not a derived cache.

File Naming

  • The canonical filename is records/identity/identity-openpgp-<lowercase-fingerprint>.txt.

  • The filename stem must exactly match the Post-ID header.

  • The <lowercase-fingerprint> portion is the normalized signer fingerprint rendered in lowercase ASCII hex.

File Structure

An identity bootstrap file has two parts:

  1. A contiguous header block at the top of the file

  2. A body separated from the headers by one blank line

Headers use this form:

text
Key: Value

The body is the ASCII-armored public key text tied to the identity.

Required Headers

  • Post-ID: canonical record ID, using the form identity-openpgp-<lowercase-fingerprint>

  • Board-Tags: must be identity

  • Subject: must be identity bootstrap

  • Username: the visible bootstrap username derived from the linked public key user ID

  • Identity-ID: canonical identity ID, using the form openpgp:<lowercase-fingerprint>

  • Signer-Fingerprint: normalized signer fingerprint in uppercase ASCII hex

  • Bootstrap-By-Post: post ID that created or first linked this identity

  • Bootstrap-By-Thread: root thread ID for the bootstrap flow

Body Rules

  • The body must contain one non-empty ASCII-armored OpenPGP public key block.

  • The public key text must be ASCII only.

  • The file uses LF line endings and ends with a trailing LF.

  • Detached signatures, if present for related write flows, live beside the signed write record and are not embedded in the identity bootstrap record body.

Invariants

  • Identity-ID must be derived from Signer-Fingerprint.

  • Post-ID must be derived from Identity-ID.

  • Username should match the normalized visible username extracted from the stored public key user ID for newly written records.

  • The fingerprint derived from the public key body must match Signer-Fingerprint.

  • Bootstrap-By-Thread identifies the root thread for the bootstrap event.

  • Bootstrap-By-Post must refer to a post that belongs to Bootstrap-By-Thread.

  • The identity bootstrap record is append-only for V1. Post-bootstrap profile updates remain out of scope.

Legacy Compatibility

  • Older bootstrap records may omit Username.

  • When a legacy record omits Username, V1 readers should fall back to guest.

Relationship To Public-Key Storage

  • The same armored key text must also be storable under records/public-keys/.

  • The identity bootstrap record keeps the bootstrap event and bootstrap references.

  • The public-key storage file keeps the reusable signer-key artifact addressed by fingerprint.

Example

text
Post-ID: identity-openpgp-0168ff20eb09c3ea6193bd3c92a73aa7d20a0954
Board-Tags: identity
Subject: identity bootstrap
Identity-ID: openpgp:0168ff20eb09c3ea6193bd3c92a73aa7d20a0954
Signer-Fingerprint: 0168FF20EB09C3EA6193BD3C92A73AA7D20A0954
Bootstrap-By-Post: thread-20260321175707-asdf-7197c7be
Bootstrap-By-Thread: thread-20260321175707-asdf-7197c7be

-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----

Bundled signed registration

Single-request posting retains a separate signed internal bootstrap post. The client signs both that fixed bootstrap and its ordinary post locally. The server derives the identity metadata and key paths from the inspected signing key; it never points the identity at the ordinary post. New registration is committed with the ordinary post, including both detached signatures.

For known fingerprints, existing identity metadata and bootstrap pointers win. A supplied valid bootstrap proposal is verified but not stored again. This also applies when another concurrent first submission registered the key first.