# description
Schema for /rave/catalog.json — the master index that lists every plugin in the rave catalog with summary metadata sufficient to render a grid view without fetching per-plugin entries. Per-plugin detail lives at /rave/catalog/<id>.json (see catalog-entry.json).

# properties.$schema.description
Optional schema reference for IDE autocomplete.

# properties.schema_version.description
Catalog index format version. Bound into the client's provenance receipt so a run records which catalog format was in effect (PLATFORM-VISION keystone). Distinct from the per-entry catalog-entry schema_version. REQUIRED going forward: tools/regenerate-catalog always emits it, so every signed catalog produced at or after the v1.19 re-sign ceremony carries it. Kept out of `required` here only so the pre-ceremony signed bytes still validate; promote to `required` in the same commit that lands the re-signed catalog.json.

# properties.catalog_serial.description
Monotonic freshness serial for the master index itself, incremented every time tools/regenerate-catalog rewrites catalog.json. Because catalog.json is Ed25519-signed, this is a SIGNED freshness counter: a client that has seen serial N MUST reject any later-fetched, validly-signed catalog whose catalog_serial < N as a stale-catalog (rollback/replay) attack — a network attacker cannot forge a higher serial without the offline catalog key. Pairs with `generated_at` (human/diagnostic) but, unlike a bare timestamp, is strictly ordered and signed. REQUIRED going forward (see schema_version note); emitted by tools/regenerate-catalog.

# properties.generated_at.description
When the master index was last regenerated. Useful for cache-busting + diagnostics. Not load-bearing for verification — use catalog_serial for replay/staleness ordering.

# properties.count.description
Number of plugins in the index. Equals len(plugins).

# properties.plugins.description
Map of plugin-id → summary. Same id pattern as catalog-entry.id.

# $defs.PluginSummary.properties.signer_public_key_sha256.description
First-class trust handle, surfaced from catalog-entry.signer_public_key_sha256 so the in-app grid can show + key-pin a plugin without a per-plugin round-trip. SHA-256 fingerprint of the publisher's 32-byte Ed25519 public key. REQUIRED going forward (see top-level schema_version note): emitted by tools/regenerate-catalog; kept out of `required` only so the pre-ceremony signed catalog.json still validates.