Platform Docs

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

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

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