# description
Paginated index of vacancy and seeker cards published by one operator. Returned by the cards_index URL declared in /.well-known/handshake-v0.2.json and by each item.card_index_url in directory.json. Foreign agents poll this to discover new or changed cards without fetching every card every time — the (slug, state_hash) pair is the idempotency key, identical to the pair-state idempotency used internally for seeker scoring.

# properties.operator_domain.description
Domain of the operator publishing this feed. Must match the host serving the feed.

# properties.operator_name.description
Display name of the operator (informational).

# properties.cursor_next.description
Opaque cursor for the next page. Null when no more pages. Foreign agents poll with ?cursor=<value>.

# properties.since.description
If the request used ?since=<timestamp>, the operator echoes that value here. The feed contains only cards with updated_at >= since.

# properties.cards.items.properties.slug.description
Stable per-operator identifier. Together with operator_domain, globally unique.

# properties.cards.items.properties.state_hash.description
SHA-256 over the canonical JSON of the matching-relevant card fields. Foreign agents use this as the idempotency key — same (slug, state_hash) means same card-state, skip re-evaluation. See state-hash-v0.1.0 in the agents repo for the canonicalization algorithm.

# properties.cards.items.properties.uri.description
Where to GET the full card payload (vacancy-card.json or seeker-card.json shaped, per kind).

# properties.cards.items.properties.card_authority.description
primary = published by the verified subject (or their authorized agent). mirror = scraped from a third-party source; the publishing operator does not speak for the subject. Foreign agents may choose to engage or skip mirror cards based on their own trust policy.

# properties.cards.items.properties.expires_at.description
Optional. Cards SHOULD declare an expiry; agents MUST treat expired cards as gone.