# Atlas Response Schema v2

This file defines the canonical response contract for `resolve_entity`.

## Design goals
- One coherent entity record across Raw / Canonical / Derived layers
- Claim-level provenance (no floating provenance blobs)
- Same data model for normal + debug output, with debug as superset

---

## 1) Normal response (default)

```json
{
  "entity": {
    "entity_id": "atlas:1c7ce7c18db59332",
    "canonical_label": "Donald Trump",
    "canonical_description": "45th and 47th U.S. President",
    "canonical_type": "atlas:Person",
    "needs_curation": false,
    "identifiers": [
      {"type": "atlas:Mid", "value": "/m/0cqt90"},
      {"type": "atlas:WikidataQID", "value": "Q22686"}
    ]
  },
  "active_claims": [
    {
      "claim_id": "clm_raw_ident_mid_/m/0cqt90",
      "layer": "raw",
      "status": "active",
      "subject": "atlas:1c7ce7c18db59332",
      "predicate": "atlas:hasIdentifier",
      "object": {"kind": "identifier", "id_type": "atlas:Mid", "value": "/m/0cqt90"},
      "provenance": {
        "source": "google-trends",
        "method": "trends-resolution",
        "confidence": 0.9,
        "retrieved_at": "2026-04-03T18:00:00Z"
      }
    }
  ],
  "summary": {
    "raw_claim_count": 5,
    "derived_claim_count": 1,
    "sources": ["google-trends", "wikidata", "groq-llm"]
  }
}
```

### Notes
- Normal response is compact and consumer-friendly.
- No giant payload blobs by default.
- Identifiers and canonical type are always easy to access.

---

## 2) Debug response (`debug=true`)

Debug mode returns the normal response plus:

```json
{
  "debug": {
    "raw_claims": [
      {
        "claim_id": "clm_raw_mid_1",
        "layer": "raw",
        "subject": "atlas:mid:/m/0cqt90",
        "predicate": "atlas:hasIdentifier",
        "object": {"kind": "identifier", "id_type": "atlas:Mid", "value": "/m/0cqt90"},
        "provenance": {
          "source": "google-trends",
          "method": "trends-resolution",
          "confidence": 0.90,
          "retrieved_at": "2026-04-03T18:00:00Z"
        }
      }
    ],
    "derived_claims": [
      {
        "claim_id": "clm_drv_type_1",
        "layer": "derived",
        "subject": "atlas:mid:/m/0cqt90",
        "predicate": "atlas:hasCanonicalType",
        "object": {"kind": "type", "value": "atlas:Person"},
        "provenance": {
          "source": "wikidata+llm",
          "method": "type-adjudication",
          "confidence": 0.97,
          "retrieved_at": "2026-04-03T18:00:02Z"
        }
      }
    ],
    "source_payloads": {
      "g_trends_payload": {},
      "wikidata_payload": {},
      "llm_payload": {}
    },
    "turtle": "...",
    "turtle_path": "/tmp/atlas-debug/trump.ttl"
  }
}
```

### Notes
- Debug is strictly a superset of normal.
- Provenance belongs to each claim.
- Payload snapshots are debug-only.

---

## 3) Layer interpretation

- **Raw layer**: source-aligned facts (MIDs, QIDs, external type claims, labels)
- **Canonical layer**: Atlas normalized entity fields (canonical label/type/description)
- **Derived layer**: computed claims (e.g., canonical type adjudication, enrichment links)

All three layers must align around the same `entity_id`.

---

## 4) Field policy

### Required in normal mode
- `entity.entity_id`
- `entity.canonical_label`
- `entity.canonical_type`
- `entity.needs_curation`
- `entity.identifiers[]`
- `active_claims[]`

### Required in debug mode
- `debug.raw_claims[]`
- `debug.derived_claims[]`
- `debug.source_payloads`
- `debug.turtle`

## 5) Maintenance model

Atlas maintenance jobs may fetch the full Wikidata entity payload when a Wikidata hit exists.
That payload can generate additional identifier claims; the adjudicator may activate or supersede
claims based on identifier alignment (for example, MID vs Wikidata QID vs other external IDs).

Recommended maintenance interface:
- `scripts/maintain_entities.py SUBJECT...`
- `--dry-run` prints planned claim changes without writing
- `--include-wikidata-entity` fetches the full Wikidata entity object for richer identifier claims

---

## 6) Backward compatibility

Current implementation fields (`atlas_id`, `entity_type`, etc.) may remain temporarily,
but target output should migrate to this schema to avoid ambiguity and drift.
