Repository source: docs/specs/identity_bootstrap_record_v1.md
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-IDheader. - The
<lowercase-fingerprint>portion is the normalized signer fingerprint rendered in lowercase ASCII hex.
File Structure
An identity bootstrap file has two parts:
- A contiguous header block at the top of the file
- A body separated from the headers by one blank line
Headers use this form:
Key: Value
The body is the ASCII-armored public key text tied to the identity.
Required Headers
Post-ID: canonical record ID, using the formidentity-openpgp-<lowercase-fingerprint>Board-Tags: must beidentitySubject: must beidentity bootstrapUsername: the visible bootstrap username derived from the linked public key user IDIdentity-ID: canonical identity ID, using the formopenpgp:<lowercase-fingerprint>Signer-Fingerprint: normalized signer fingerprint in uppercase ASCII hexBootstrap-By-Post: post ID that created or first linked this identityBootstrap-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-IDmust be derived fromSigner-Fingerprint.Post-IDmust be derived fromIdentity-ID.Usernameshould 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-Threadidentifies the root thread for the bootstrap event.Bootstrap-By-Postmust refer to a post that belongs toBootstrap-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 toguest.
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
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-----