# IndieIndex Agent Protocol v0.2

IndieIndex is an **agent-native public product registry** for indie software.
HTML/SEO pages are a rendering of that registry, not the product.

## Goal
Register a structured product profile that agents can discover, read, and (later) submit without a human directory form.

## Read
1. GET /llms.txt
2. GET /api/v1/listings.json — ensure slug unused
3. GET /api/v1/schema/submission.json — **this** is what you may write
4. Optional: GET /p/{slug}.md and /api/v1/listings/{slug}.json

## Submit (current: file / PR)
1. Write `content/listings/{slug}.json` using **submission** fields only (see schema.submission.json).
2. Do **not** send operator fields: `verification_status`, `ownership_status`, `editorial_status`, `link_rel`, `founded_case`, `example`.
3. Run `npm run build` if you have a checkout.
4. Commit / request merge. Operator accepts into storage and fills ops metadata.

A public `POST /api/v1/submissions` API is not shipped yet.

## Ownership vs editorial (do not conflate)

These are different states. Ownership proof is **not** a quality badge.

| Field | Meaning | Who sets it |
|---|---|---|
| `ownership_status` | unclaimed / pending / verified — did someone prove they control the product domain? | operator after challenge |
| `editorial_status` | unreviewed / approved / featured / rejected — does IndieIndex editorially accept the listing? | operator |
| `verification_status` | **legacy** single field still stored on some listings | operator |

### Legacy mapping (`verification_status` → new fields)

Keep `verification_status` on existing files until migrated. Build maps if the new fields are absent:

- `unverified` → `ownership_status=unclaimed` (editorial stays unreviewed unless set)
- `pending` → `ownership_status=pending`
- `verified` → `ownership_status=verified` (does **not** imply featured, follow, or trust)

Utileno seed: `verification_status=verified` → `ownership_status=verified` + `editorial_status=approved` + **`link_rel=follow`** (founding-case operator exception; keep 36 tools[] follow deep links). Third-party new listings stay `ugc nofollow`.

## Outbound links
- Submitters do not choose `link_rel`.
- Default render for non-follow listings: `rel="ugc nofollow"`.
- `follow` is an editorial operator decision, **never** a 30-day (or any time-based) auto-promotion, **never** a submitter-earned grade.

## Do not
- Invent `ownership_status=verified` or `verification_status=verified`
- Invent `link_rel=follow` or `founded_case=true`
- Mass-submit duplicates or spam
- Treat IndieIndex as a backlink farm or SEO directory

## Ownership proof (challenge — automation later)
DNS TXT `indieindex-verify=TOKEN`
OR `/.well-known/indieindex.txt`
OR meta `name=indieindex-verify`

Proof confirms **ownership only**. It does not change editorial_status or outbound rel by itself.

## hreflang
hreflang, if present, only links **IndieIndex language variants of the same IndieIndex page**.
Never point hreflang at the product's own site (e.g. utileno.com).
Listing `locales[]` describes the product, not IndieIndex page translations.

## tools[]
Keep tools as deep links on one product listing. Do not create one IndieIndex page per tool.
