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.