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