Publishers and namespaces
Normative for RUNBOOK.md §7. Implementation: packages/registry.
A namespace is the unit of provenance. Verification, reputation and takedown all attach to it, and a registry without that is a supply-chain compromise waiting to happen (AST02).
Tiers
| Tier | How it is obtained | What it grants |
|---|---|---|
| U — unclaimed | created by us when ingesting a public repository | indexing, no promises, a banner saying the source has not claimed itself |
| V — verified source | DNS TXT on the domain, or GitHub organization ownership | the canonical namespace, and the right to update its own records |
| S — signed | publication with a signature, content_hash in every record |
eligibility for trust T3 and above |
A tier is computed at read time, not stored. It is derived from when control was last confirmed and from today's date, exactly as a trust level is. A stored tier is one that outlives its proof: the job meant to revoke it fails quietly, or nobody wrote the job, and the badge stays up for a year after the domain changed hands.
Proving control
DNS. A TXT record on the domain:
runbooks-directory-verification=<token>
Matched exactly. A prefix match would let …=abc123456 satisfy a check for abc123.
GitHub. Ownership of the organization named by the github:<org> publisher.
Re-verification: every 90 days, with a 14-day grace period. Ninety days is about how long a domain that changes hands goes unnoticed. The grace period exists because a resolver having a bad afternoon is not a publisher losing their domain — but it ends, because a tier resting on a proof nobody has managed to see for a hundred days is resting on a memory.
A proof that is observed to be gone downgrades immediately, without the grace period. The publisher removed it or somebody else holds the name; either way the claim we were making on their behalf has stopped being true.
Names
A name is checked before it is registered, against everything that ever existed — registered names, deleted names, and the vendor list.
Compared as a reader sees them. stripe and strіpe are different strings, resolve
differently, and are the same word to everyone who reads them. Names are folded through a
confusable table (Cyrillic and Greek lookalikes, digit-for-letter substitutions, rn
for m), stripped of separators, and compared by skeleton and by Damerau–Levenshtein
distance ≤ 1 — a transposition counts as one edit because stirpe is the commonest typo
shape there is.
A collision or a near miss goes to a human. It is not refused: the check is deliberately aggressive, and a false positive costs a review while a false negative costs somebody's credentials.
A vendor name is available only through tier V. Prove control of the domain or the
organization and it is yours; otherwise it stays unclaimed. The list is in
registry/vendors.json, maintained by addition on evidence: a name goes in when somebody
could plausibly be impersonated by it. It is a review trigger, not a trademark register.
std/ is not claimable. It is the catalog's own namespace.
Deletion
A namespace is never reused. Not by anyone, including the publisher who gave it up.
Every pin, bookmark and cached agent reference names publisher/slug, and whoever holds
the namespace decides what that resolves to. Returning a deleted name to circulation makes
all of those silently mean something new — which is the substitution attack the provenance
model exists to prevent. "They can prove they had it before" is not a safety property; it
is the same handover with better paperwork.