Repository navigation
Compare the keys that signed with the keys a linked GitHub account publishes, when asked - #688
Merged
Merged
Conversation
…t publishes, when asked
…rds that count orderings, lines and network files
…hat count verbs, write paths and handed-over commands
…es an account that is no GitHub name
felipesauer
added a commit
that referenced
this pull request
Oct 5, 2026
…blishes, when asked (#688) ## What An identity can now name its GitHub account as a signed fact, and `mnema verify --against-github` compares the key each identity signed with against the SSH keys that account publishes at `github.com/<name>.keys`. - New kind `account.linked` (FORMAT.md, vectors, schema, both readers: TS and the Python verifier accept it and refuse one without its account). - New verb `mnema key github <name>`: records the claim, signed and checkpointed at once. No network. - `verify --against-github`: per identity, either "the account publishes every key it signed with" or, by name, why not covered (no account linked, no such account, no Ed25519 key published, a key not among them, github.com unreachable). The flag is the only thing that reaches the network; the verdict, level and exit are the ones `verify` gives without it. `fetch` is injectable and has a short timeout; no test goes to the network. ## Probe, base x head (sandbox HOME, `env -i`) - Head `verify` without the flag on a record with no link: byte-identical to `origin/main-v1`'s, exit 0. - `origin/main-v1`'s binary reading a record that holds an `account.linked`: `FAILED — part of the record is UNREADABLE`, naming the line and `unknown event kind "account.linked"`, exit 1 (FORMAT section 4.1). ## Known limits - A binary from before this change refuses a record that holds an `account.linked` event (unknown kind), as above. Anyone who links an account makes the record unreadable to older binaries until they upgrade. - What the comparison proves: the key that signed is one the account publishes today. What it does not: that the key was the account's when it signed (accounts add and drop keys), or anything without taking github.com's word for which keys an account has. Only a signed (checkpoint-covered) claim counts. - Only Ed25519 keys are comparable; an account that publishes none reads as such. - `--workspace` combined with the flag is refused rather than guessed at.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
An identity can now name its GitHub account as a signed fact, and
mnema verify --against-githubcompares the key each identity signed with against the SSH keys that account publishes atgithub.com/<name>.keys.account.linked(FORMAT.md, vectors, schema, both readers: TS and the Python verifier accept it and refuse one without its account).mnema key github <name>: records the claim, signed and checkpointed at once. No network.verify --against-github: per identity, either "the account publishes every key it signed with" or, by name, why not covered (no account linked, no such account, no Ed25519 key published, a key not among them, github.com unreachable). The flag is the only thing that reaches the network; the verdict, level and exit are the onesverifygives without it.fetchis injectable and has a short timeout; no test goes to the network.Probe, base x head (sandbox HOME,
env -i)verifywithout the flag on a record with no link: byte-identical toorigin/main-v1's, exit 0.origin/main-v1's binary reading a record that holds anaccount.linked:FAILED — part of the record is UNREADABLE, naming the line andunknown event kind "account.linked", exit 1 (FORMAT section 4.1).Known limits
account.linkedevent (unknown kind), as above. Anyone who links an account makes the record unreadable to older binaries until they upgrade.--workspacecombined with the flag is refused rather than guessed at.