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-----