Registry automation & security
The registry is one signed, append-only index of published manifests. Today it is curated by hand; this page is the design for making it automatic without weakening it — what the publish pipeline checks, who holds which keys, what "verified" actually proves, and what happens when something has to come off the list. It is written to be auditable: every claim here should be checkable against the registry spec and the served artifacts.
Where things stand today
The parts that already exist and run: the manifest format and its canonical signing string (OMLA-MANIFEST-v1), the signed static registry under /registry/v2/ (a sequence index plus per-model artifacts, Ed25519-signed under a pinned registry key), browser-side verification that fails closed, and the resolver that turns manifests into payments.
The part that is deliberately not switched on: the automated publish endpoint. With the license now operative (OMLA-PL-2.1), submissions arrive by email, are validated with exactly the gates below, and are sequenced by hand. The endpoint ships once the manual pipeline is confirmed stable — automation must not outrun the legal instrument it registers.
The automated pipeline
Publishing is a seven-stage pipeline. A manifest either clears every gate or it does not enter the sequence — there is no partially-registered state.
Submit TODAY: BY EMAIL
POST /registry/v2/submitwith the signed manifest JSON and the submitting public key. No account, no session, no API key: the manifest's own signature is the authentication. Possession of the creator key is the only authority that exists in the system, so it is the only authority the endpoint asks for.Validate
Every gate in the table below, in order, fail-closed. Validation is pure — no state is written on failure, and the submitter gets the exact failing gate back.
Bind the version
New model: assign the next sequence number. Update: the submission must carry an
OMLA-MANIFEST-UPDATE-v2binding — model id, signer, expected current version, hash of the previous manifest, timestamp, and hash of the new manifest — checked atomically so replays, races, and no-op updates are rejected. An update signed by a different key than the original is refused outright; keys, not names, own models.Sequence
The accepted manifest is appended to the sequence — append-only, no in-place edits ever. Each entry records the manifest hash, the sequence number, and the acceptance timestamp. Corrections are new entries; history is never rewritten.
Sign the snapshot
The index (
registry/v2/index.json) is rebuilt: full entry list, a Merkle root over the manifest hashes, a Merkle root over the complete artifacts, and the new high-water sequence number — then signed with the registry's Ed25519 key. The snapshot signature is over the whole state, so serving a stale or doctored index is detectable, not just individual manifests.Serve & mirror
The registry serves static files — no compute in the read path, nothing to inject into. Mirrors rsync the same signed artifacts; because everything is signed and sequenced, a mirror cannot alter anything without breaking verification, only serve or withhold it (and withholding is caught by the high-water check below).
Verify — everyone, every time
Clients (the browser UI, the resolver tooling, a payer's script) verify before trusting: pinned registry key → snapshot signature → sequence high-water mark not lower than any previously seen (rollback detection) → per-manifest signature → weight hash against the downloaded artifact. Any failure shows nothing rather than something unverified.
Validation gates
| Gate | What it rejects |
|---|---|
| schema | Anything that is not a well-formed manifest: unknown top-level shape, missing required fields, wrong types, floats anywhere near money math, non-ASCII object keys (canonical-JSON parity guard). |
| size + rate | Manifests over the size cap; more than a handful of submissions per key per hour. Keeps the pipeline boring under abuse without gatekeeping anyone. |
| canonical | A manifest whose canonical OMLA-MANIFEST-v1 string cannot be reconstructed byte-identically — if canonicalization is ambiguous, signing means nothing. |
| signature | An Ed25519 signature that does not verify over the canonical string with the submitted public key; a key_fingerprint that is not the SHA-256 of that key. |
| identity | A model id that isn't a UUID; an id already owned by a different key; a wallet address that fails Bech32m; a payee share set that doesn't sum to 10000 bp. |
| split | retain_bp + Σ upstream = 10000 exactly, integer basis points, no duplicate parents. Note what is not here: no cap check — §6 splits are suggestions, and the declared split is public. The registry validates arithmetic, not opinions. |
| lineage | Upstream entries pointing at ids that are neither in the registry nor pending in the same submission batch (a warning, not a hard fail — the registry is not the only place manifests live); external: references appearing in split.upstream (external parents document provenance and can never carry a payable share); malformed external: values. |
| safety | A safety_certifications block with any of the four attestations missing or false (Terms §6.2). |
| update-binding | For updates: a missing or stale OMLA-MANIFEST-UPDATE-v2 binding, a wrong previous-manifest hash, an expected version that no longer matches, or a signer that isn't the owning key — the anti-replay, anti-race, anti-hijack gate. |
Security model
No accounts, on purpose
There is nothing to phish, reset, or breach: authority is possession of a creator key, full stop. The flip side is stated honestly everywhere keys are made — lose the key, and the registry cannot help you update your own manifest. That trade is the design, not an oversight.
Registry key custody
The registry's signing key never lives on the web server. Snapshot signing happens in a separate signing step (operator-run today; an isolated signer when automated), so compromising the host that serves files does not yield the key that makes them trustworthy. Rotation is planned as an explicit, published event: a rotation statement signed by the old key endorsing the new one, kept permanently in the sequence, so clients can walk the chain from their original pin. Whole-site compromise resistance — an attacker who owns the origin and wants to serve a fresh-pinned fake history to brand-new visitors — requires independent mirrors or witnesses; that is phase 2, and until then the pin's first-visit trust honestly depends on the origin.
Append-only, with rollback detection
Nothing is ever edited or deleted in place, so "quietly changed" is not an available failure mode — only "stopped being served," and the client-side high-water check turns serving an older sequence into a hard verification failure, not a silent downgrade.
Names are labels; keys are identity
Display names are not unique and not defended — anyone can call a model "Llama-Improved." What verification proves is which key signed, and diligence means checking the fingerprint against where the weights actually live (the manifest next to the weights, the model card link). Name-squatting therefore gets an impostor nothing a payer's checklist doesn't catch, and disputes are handled in the open: evidence appended to the record, never silent edits.
Delisting
Removal (a false safety certification, CSAM, a court order) is itself an append-only event: a signed tombstone entry naming the sequence number and reason. Mirrors and clients see that a model was delisted and why — a registry that can silently un-happen things is worse than no registry. The one exception to slow process is the CSAM policy in Terms §6.3: immediate delisting plus mandatory reporting.
What the automated registry will never do
Hold funds, take usage or payment reports, require an account, or sit in the payment path. Automation changes how manifests get in; it changes nothing about OMLA's no-custody, no-knowledge posture.
Verification — what "trusted" actually means
For a browser or tool reading the registry: pinned key → signed snapshot → monotonic sequence → per-manifest signature. All offline-checkable; the registry page runs exactly this before showing anything.
For a payer about to send money, the five-minute diligence that makes payment safe:
- Verify the manifest signature (the verifier — or any Ed25519 implementation, offline).
- Check
weight_hashagainst the model file you actually run. - Check the manifest is the one published next to the weights (repo, model card) — pointer-swapping is the attack; the signature makes it detectable, this step makes it detected.
- Resolve the lineage with the resolver and eyeball the split — it is public precisely so you can.
- Pay the pointers in the verified manifest, and keep your settlement sheet.
Every check above needs only public material. Anyone who asks you for a creator's key bundle or passphrase — including anyone claiming to be OMLA — is running a scam.
Rollout
| Phase | Gate | What turns on |
|---|---|---|
| Now | — | Manual submissions, full validation, signed static registry, offline verification. Everything on this page except the endpoint. |
| 1 | License operative (outside counsel) | The signature-gated submit endpoint, update bindings, automated snapshot signing from the isolated signer. |
| 2 | Phase 1 stable | Independent mirrors and witness co-signing (first-visit trust stops depending on the origin), registry key rotation drill, payment-rail conversion partner. |
The project plan on the about page tracks the same phases from the organizational side.