{
 "$schema": "http://json-schema.org/draft-07/schema#",
 "title": "EA-NEGONT-02 register entry — one address of public knowledge, with its dated observations",
 "description": "The /non register records what the composition layer gives at an address on the panel, whether or not the archive appears in it (most often it does not). Flat entry shape shared with the Capture Registry (EA-WG-CAPTURES-01), so that the same tools read both. Ids are derived as the Capture Registry derives them, so an observation seated in both registers carries the same obs_id in each. Seated by scripts/non_intake.py only.",
 "type": "object",
 "additionalProperties": false,
 "required": [
  "slug",
  "addr_id",
  "obs_id",
  "q",
  "date",
  "surface",
  "auth",
  "ev",
  "entity",
  "archive_present",
  "dates",
  "n_observations",
  "observations"
 ],
 "properties": {
  "slug": {
   "type": "string",
   "pattern": "^[a-z0-9-]+$"
  },
  "addr_id": {
   "type": "string",
   "pattern": "^ADDR-[0-9a-f]{12}$"
  },
  "obs_id": {
   "type": "string",
   "pattern": "^OBS-[0-9a-f]{12}$"
  },
  "q": {
   "type": "string",
   "minLength": 1,
   "description": "The exact issued string. Case, punctuation and quotation marks preserved."
  },
  "date": {
   "type": "string",
   "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
   "description": "Michigan local date of the first observation."
  },
  "surface": {
   "type": "string",
   "minLength": 1
  },
  "surface_basis": {
   "type": [
    "string",
    "null"
   ]
  },
  "auth": {
   "type": "string",
   "minLength": 1,
   "description": "Both dimensions, as attested: signed in or out; incognito or not. Never inferred."
  },
  "auth_basis": {
   "type": [
    "string",
    "null"
   ]
  },
  "ev": {
   "type": "string",
   "enum": [
    "paste",
    "capture"
   ],
   "description": "paste: the transcript was supplied and is held here. capture: the transcript is held by the Capture Registry observation named in capture_ref (erasure rows, and panel runs that engaged the archive)."
  },
  "entity": {
   "type": "string",
   "description": "The entity (panel/panel.json) this observation seeks; the address (q) is where it was sought. Entity before address (ruled 2026-10-07)."
  },
  "transcript": {
   "type": [
    "string",
    "null"
   ],
   "description": "Cleaned: verbatim on content, not on copy-paste residue (scripts/clean_transcript.py). Null only when ev is capture."
  },
  "transcript_raw": {
   "type": [
    "string",
    "null"
   ],
   "description": "The bytes as supplied, kept forever."
  },
  "transcript_removed": {
   "type": [
    "array",
    "null"
   ],
   "description": "What the cleaner removed and why."
  },
  "transcript_sha256": {
   "type": [
    "string",
    "null"
   ]
  },
  "transcript_class": {
   "type": [
    "string",
    "null"
   ]
  },
  "transcript_complete": {
   "type": [
    "string",
    "null"
   ]
  },
  "transcript_read": {
   "type": [
    "string",
    "null"
   ]
  },
  "cites": {
   "type": [
    "integer",
    "null"
   ],
   "description": "Source cards shown, counted against the frame. Null is unknown, never zero."
  },
  "cite_list": {
   "type": [
    "array",
    "null"
   ],
   "items": {
    "type": "object"
   }
  },
  "archive_present": {
   "type": "boolean",
   "description": "Whether the composition engages the archive (a card or link on an archive-operated or authored surface, or the archive named in the body). Computed at intake; a declaration may raise it, never lower it."
  },
  "archive_basis": {
   "type": [
    "string",
    "null"
   ]
  },
  "capture_ref": {
   "type": [
    "object",
    "null"
   ],
   "description": "{slug, obs_id} of the Capture Registry observation, required when archive_present is true or ev is capture."
  },
  "sf": {
   "type": [
    "string",
    "null"
   ],
   "description": "Surface frame: what the capture showed of the interface."
  },
  "notes": {
   "type": [
    "object",
    "null"
   ]
  },
  "dates": {
   "type": "array",
   "items": {
    "type": "string"
   }
  },
  "n_observations": {
   "type": "integer",
   "minimum": 1
  },
  "observations": {
   "type": "array",
   "items": {
    "type": "object"
   },
   "description": "Later observations at the same address (same exact string, same surface), each with its own obs_id. Empty while the address has one observation."
  }
 }
}
