# UAP Record — data contract (binding for every writer)

`13_uap/` is the rebuilt UAP-research knowledge base for `uap.ab7.ai`. It replaces the retired
Anomaly Atlas (`10_atlas/`, three.js globe) and the Evidence Control Room (`05_graph/site/`), which
stay on disk as the archive. The new site is **map-first**: one events map with filters and
cross-links, plus knowledge-base pages for crafts, beings, sites (bases / storage / retrieval),
people, documents, footage, and a readable open corpus.

The evidence rules of `05_graph/CONTRACT.md` still bind: cite only `video + ts` from
`05_graph/text/<videoId>.txt` for corpus claims; never invent a quote or a document; testimony is a
FACT about the testimony and SPECULATION about the world; contested / thin claims are never
flattened into fact. World-layer entries (things the corpus never covers) cite a published source
with a URL and a date, exactly as `10_atlas` world sites do.

## 0. Ownership — one writer per file

| File | Writer | Content |
|---|---|---|
| `data/sites.json` | Sites worker | bases, storage / retrieval sites, encounter sites, anomaly sites — everything that gets a pin and is a *place* |
| `data/events.json` | Events worker | incidents: encounters, sightings, retrievals, releases, hearings, waves |
| `data/footage.json` | Events worker | videos / photos / sensor recordings and where they were shot |
| `data/crafts.json` + `assets/crafts/*.svg` | Crafts worker | craft types |
| `data/beings.json` + `assets/beings/*.svg` | Beings worker | beings / races as reported |
| `data/people.json` | People & documents worker | witnesses, whistleblowers, investigators, officials, journalists, scientists |
| `data/documents.json` | People & documents worker | unified document catalogue (LEDGER 122 + the 58 `type:document` nodes) |
| `build/`, `assets/uap.css`, `assets/app.js`, `assets/map.js`, `assets/vendor/`, `site/` | Site builder | generator + front end |
| `agent/` | Curator-agent worker | the SDK service |

Nobody edits another writer's file. A cross-reference to a record that does not exist yet is
allowed — the builder renders it as a plain chip and lists it in `site/_build_report.json` so the
integrator fixes it.

## 1. Slugs and ids

- `slug`: lowercase, ascii, hyphens, unique **within its file**. Events are prefixed with the year:
  `1980-rendlesham-forest`, `2004-nimitz-tic-tac`, `1947-roswell`. Unknown year → `undated-<name>`.
- `graph_ids`: list of `05_graph` node ids the record was built from (`N-SITES-0001`), for provenance.
- Cross-references are **slug strings** in typed arrays: `crafts[]`, `beings[]`, `sites[]`,
  `people[]`, `documents[]`, `footage[]`, `events[]`.

### Slug registry (use these exact slugs when the thing is one of these)

**crafts**: `flying-saucer-disc`, `black-triangle`, `tic-tac`, `cigar-cylinder`, `orb-sphere`,
`egg-shaped`, `boomerang-chevron`, `cube-in-sphere`, `mothership`, `bell-shaped`, `diamond`,
`plasma-light`, `lazar-sport-model` (named craft go in as their own slugs; add freely).

**beings**: `grey`, `nordic`, `tall-white`, `reptilian`, `mantis-insectoid`, `hybrid`,
`ultraterrestrial`, `future-human`, `plasma-light-being`, `blue-being`, `nephilim-watcher`,
`men-in-black`, `varginha-being`, `tridactyl`, `little-people-fae`, `jinn` (add freely).

**sites** (kind in brackets): `area-51-groom-lake` [base], `s4-papoose-lake` [base/storage],
`wright-patterson-afb` [base/storage], `dugway-proving-ground` [base], `kirtland-afb-manzano` [base/storage],
`nellis-range` [base], `los-alamos` [facility], `dulce` [claimed-base], `pine-gap` [base],
`lockheed-skunk-works-helendale` [contractor/storage], `battelle-columbus` [contractor],
`roswell` [retrieval], `kecksburg` [retrieval], `rendlesham-forest` [encounter], `varginha` [retrieval/encounter],
`skinwalker-ranch` [anomaly], `giza-plateau` [anomaly], `hessdalen` [anomaly], `baltic-sea-anomaly` [anomaly],
`malmstrom-afb` [encounter], `nimitz-carrier-group-2004` [encounter — sea area], `phoenix` [sighting],
`kandahar-cave` [control].

**footage**: `flir1`, `gimbal`, `gofast`, `chilean-navy-2014`, `aguadilla-2013`, `calvine-1990`,
`phoenix-lights-1997`, `turkey-kumburgaz-2008`, `mcminnville-1950`, `tremonton-1952`, `great-falls-1950`.

**documents**: `twining-memo-1947`, `wilson-davis-notes`, `project-blue-book`, `blue-book-special-report-14`,
`condon-report`, `grusch-testimony-2023`, `aaro-historical-record-report-2024`, `ndaa-uap-provisions`,
`roswell-report-1994`, `gao-roswell-1995`, `estimate-of-the-situation`, `robertson-panel`,
`majestic-12-documents`, `aatip-dia-papers`, `schumer-rounds-amendment-2023`.

**people**: `bob-lazar`, `david-grusch`, `luis-elizondo`, `david-fravor`, `ryan-graves`,
`ross-coulthart`, `richard-doty`, `robert-salas`, `robert-hastings`, `jesse-michels`, `harald-malmgren`,
`christopher-mellon`, `hal-puthoff`, `eric-davis`, `jacques-vallee`, `garry-nolan`, `avi-loeb`,
`diana-pasulka`, `tim-gallaudet`, `jay-stratton`, `jim-semivan`, `george-knapp`, `john-mack`,
`travis-taylor`, `brandon-fugal`, `robert-bigelow`, `karl-nell`, `michael-herrera`, `matthew-brown`,
`george-adamski`, `betty-barney-hill`, `travis-walton`, `whitley-strieber`.

**events** (year-prefixed): `1947-roswell`, `1947-kenneth-arnold`, `1950-mcminnville`, `1952-washington-flap`,
`1957-levelland`, `1961-betty-barney-hill`, `1964-socorro`, `1965-kecksburg`, `1967-malmstrom-shutdown`,
`1967-shag-harbour`, `1973-pascagoula`, `1975-travis-walton`, `1976-tehran`, `1980-rendlesham-forest`,
`1980-cash-landrum`, `1989-belgian-wave`, `1989-lazar-s4`, `1994-ariel-school`, `1996-varginha`,
`1997-phoenix-lights`, `2004-nimitz-tic-tac`, `2008-stephenville`, `2014-2015-roosevelt-gimbal-gofast`,
`2017-nyt-aatip-disclosure`, `2023-grusch-hearing`, `2024-aaro-report`, `2024-uap-hearing`.

## 2. Shared field conventions

```jsonc
"band": "documented | well-supported | contested | thin | unsupported"   // CCS bands from CONTRACT.md
"class": "FACT | INFERENCE | SPECULATION"                                // per statement / claim
"sources": [                                                             // every record has ≥1
  { "kind": "corpus", "video": "EzPmG_7WhXc", "ts": "1:24:48", "speaker": "Jesse Michels",
    "speaker_slug": "jesse-michels", "quote": "verbatim from 05_graph/text" },
  { "kind": "external", "title": "…", "url": "https://…", "publisher": "…", "date": "2023-07-26" }
]
"side": "military | intelligence | government | scientist | contractor | civilian | journalist | researcher"
"precision": "exact | approximate | region | unplaced"                    // for any lat/lon
"first_year": 1947, "last_year": 2024                                      // integer years for the time slider
"summary": "≤ 60 words, plain English, reported-speech framing (\"Witnesses describe…\", \"Lazar says…\")"
"body_html": "optional longer prose in HTML (p, h3, ul, blockquote only; no inline styles)"
```

Language rules (same policy as the rest of ab7.ai): no alarm words, no sensational adjectives, no
"shocking / bombshell / proof". Report what was said, by whom, when, and how well it is supported.
Never assert that a being or craft exists; describe the reports. Write for a reader who has never
heard of the case.

## 3. Record schemas

### sites.json — `{"built": iso, "sites": [Site]}`

```jsonc
{
  "slug": "s4-papoose-lake", "name": "S-4 / Papoose Lake", "aka": ["S4", "Papoose Lake facility"],
  "kind": "base | storage | retrieval | encounter | anomaly | facility | contractor | control",
  "kinds": ["base", "storage"],                        // a place can be several
  "lat": 37.01, "lon": -115.86, "precision": "approximate",
  "coord_source": "why the pin is where it is (gazetteer / imagery / testimony)",
  "country": "United States", "region": "Nevada Test and Training Range",
  "status": "verified_entity | contested | unverified",   // does the PLACE exist (not the claims about it)
  "summary": "…", "body_html": "…",
  "what_is_claimed": [                                   // the map's 'mention' layer lives here
    { "text": "Nine recovered craft were kept in hangars built into the mountainside.",
      "class": "SPECULATION", "band": "contested", "speaker_slug": "bob-lazar", "side": "contractor",
      "year": 1989, "sources": [ … ] }
  ],
  "first_year": 1989, "last_year": 2025,
  "crafts": [], "beings": [], "people": [], "documents": [], "footage": [], "events": [],
  "photo": "assets/sites/s4-papoose-lake.jpg",           // optional; from 10_atlas/assets/sites/ (P-/W- ids mapped)
  "graph_ids": ["N-SITES-0010"], "sources": [ … ]
}
```

### events.json — `{"built": iso, "events": [Event]}`

```jsonc
{
  "slug": "1980-rendlesham-forest", "name": "Rendlesham Forest incident", "aka": [],
  "kind": "encounter | sighting | retrieval | abduction-report | release | hearing | wave | shutdown | testimony",
  "date": "1980-12-26", "date_precision": "day | month | year | decade", "year": 1980, "end_year": 1980,
  "lat": 52.0889, "lon": 1.4492, "precision": "exact", "site": "rendlesham-forest",   // site slug OR own coords
  "country": "United Kingdom",
  "summary": "…", "body_html": "…",
  "reported_by": [ { "person": "charles-halt", "side": "military", "role": "deputy base commander" } ],
  "investigated_by": [ { "person": "…", "side": "…" } ],
  "interviews": [ { "person": "…", "video": "…", "ts": "…", "year": 2024 } ],  // who later spoke about it, where
  "band": "well-supported", "class_of_core_claim": "FACT",
  "official_response": "one sentence on what any government body said, if anything",
  "crafts": ["black-triangle"], "beings": [], "sites": ["rendlesham-forest"], "people": [],
  "documents": ["halt-memo-1981"], "footage": [], "related_events": [],
  "graph_ids": [], "sources": [ … ]
}
```

### footage.json — `{"built": iso, "footage": [Footage]}`

```jsonc
{
  "slug": "gimbal", "name": "GIMBAL", "kind": "video | photo | radar | sensor | audio",
  "date": "2015-01-21", "year": 2015, "lat": 30.5, "lon": -78.0, "precision": "region",
  "shot_by": "US Navy F/A-18F ATFLIR pod, Roosevelt carrier group", "side": "military",
  "released": "2017-12-16", "released_by": "To The Stars Academy; DoD confirmed 2020-04-27",
  "official_status": "US Navy: 'unidentified aerial phenomena'",
  "public_domain": true, "still_url": "https://commons.wikimedia.org/…",   // only if PD / gov work
  "summary": "…", "band": "documented",
  "crafts": [], "events": ["2014-2015-roosevelt-gimbal-gofast"], "people": ["ryan-graves"], "sites": [],
  "documents": [], "graph_ids": [], "sources": [ … ]
}
```

### crafts.json — `{"built": iso, "crafts": [Craft]}`

```jsonc
{
  "slug": "black-triangle", "name": "Black triangle", "aka": ["flying triangle", "TR-3B (claimed)"],
  "silhouette": "assets/crafts/black-triangle.svg",       // simple flat SVG drawn by the writer
  "summary": "…", "body_html": "…",
  "reported_characteristics": {                         // as reported; every value is a report, not a spec
    "shape": "equilateral or isosceles triangle, dark, matte", "size": "reports range from 30 m to 'football fields'",
    "lights": "one at each vertex, often a red/orange one at centre", "sound": "silent or low hum",
    "motion": "slow hover, then rapid departure", "era": "1980s onward; Belgian wave 1989–90"
  },
  "explanations_offered": [ { "text": "classified US aircraft (e.g. stealth programmes)", "class": "INFERENCE", "band": "contested" } ],
  "first_year": 1980, "last_year": 2025,
  "events": [], "sites": [], "beings": [], "people": [], "footage": [], "documents": [],
  "graph_ids": ["N-CRAFT-…"], "sources": [ … ]           // include corpus quotes with ts; 3–10 per craft
}
```

### beings.json — `{"built": iso, "beings": [Being]}`

```jsonc
{
  "slug": "nordic", "name": "Nordic", "aka": ["Nordics", "tall blonds", "Pleiadians (claimed)"],
  "glyph": "assets/beings/nordic.svg",
  "summary": "…", "body_html": "…",
  "as_described": { "appearance": "…", "behaviour": "…", "communication": "…", "claimed_origin": "…" },
  "origin_of_the_archetype": { "text": "George Adamski's 1952 'Orthon' account", "class": "FACT", "band": "documented", "sources": [ … ] },
  "chronology": [ { "year": 1952, "text": "…", "event": "slug-or-null", "sources": [ … ] } ],
  "first_year": 1952, "last_year": 2025,
  "crafts": [], "events": [], "sites": [], "people": [], "documents": [], "footage": [],
  "graph_ids": ["N-SPECIES-…"], "sources": [ … ]
}
```

### people.json — `{"built": iso, "people": [Person]}`

```jsonc
{
  "slug": "bob-lazar", "name": "Bob Lazar", "aka": ["Robert Lazar"],
  "role": "self-described S-4 physicist", "side": "contractor",
  "status": "verified_public_figure | verified_entity | contested | unverified",
  "summary": "…", "body_html": "…",
  "interviews": [ { "video": "…", "ts": "0:00:00", "title": "episode title", "year": 2024, "as": "guest | discussed" } ],
  "claims_made": [ { "text": "…", "class": "SPECULATION", "band": "contested", "year": 1989, "sources": [ … ] } ],
  "events": [], "sites": [], "crafts": [], "beings": [], "documents": [], "footage": [],
  "external": { "wikipedia": "https://…", "wikidata": "Q…" },
  "graph_ids": ["N-PEOPLE-…"], "sources": [ … ]
}
```

Include everyone the corpus treats as a witness, whistleblower, investigator, official or
recurring guest (aim for 120–200 people from the 301 person nodes; skip incidental names).

### documents.json — `{"built": iso, "documents": [Document]}`

```jsonc
{
  "slug": "twining-memo-1947", "title": "AMC Opinion Concerning \"Flying Discs\" (Twining memo)",
  "identifier": "N. F. Twining to Brig. Gen. George Schulgen, 23 September 1947",
  "body": "US Army Air Forces, Air Materiel Command", "date": "1947-09-23", "year": 1947,
  "kind": "memo | report | hearing | legislation | letter | notes | file-release | book | paper",
  "real": true, "retrieved": true, "url": "https://…",
  "passage": "verbatim passage from the document itself, when retrieved",
  "summary": "…", "band": "documented",
  "authors": ["nathan-twining"], "cited_by": [ { "video": "…", "ts": "…", "speaker_slug": "…" } ],
  "events": [], "sites": [], "people": [], "crafts": [], "beings": [], "footage": [],
  "graph_ids": ["DOC-L-0001", "N-…"], "sources": [ … ]
}
```

## 4. The map's filter model (what the builder needs from the data)

The map draws **sites** and **events** (and footage with coordinates). Filters, all client-side:

- **Layer**: encounter · sighting · retrieval · base · storage · footage · anomaly · hearing/release
  (events use `kind`; sites use `kinds`).
- **Who reported / which side**: from `reported_by[].side` and `what_is_claimed[].side`.
- **Involved**: craft slug, being slug, person slug (chips; multi-select).
- **Evidence**: band floor (documented → unsupported).
- **Has**: footage · documents · interviews.
- **Time**: year range slider over `year` / `first_year`–`last_year`.

Clicking a pin opens the dossier: summary, band, who reported (side), what was claimed, crafts /
beings / people / documents / footage chips. Clicking a chip **filters the map to that entity** and
shows its card with a link to its page. Every entity page links back to `/?<type>=<slug>`.

## 5. Output tree (builder) — published as `uap.ab7.ai/` (deploy prefix `/uap`)

```
/                        map app (full viewport)
/crafts/  /crafts/<slug>/       /beings/  /beings/<slug>/
/sites/   /sites/<slug>/        /events/  /events/<slug>/
/people/  /people/<slug>/       /documents/  /documents/<slug>/
/footage/ /footage/<slug>/
/corpus/  /corpus/<videoId>/    transcript reader, timestamp anchors, YouTube deep links, entity highlights
/data/                          open data: every JSON, schema, licence, changelog
/agent/                         the curator agent: what it does, its change log
/about/                         method, evidence bands, what is masked, archive links
```

All internal links are **root-relative** (`/crafts/black-triangle/`), because the host maps `/` onto
the deploy prefix; never write `/uap/...` inside the site.

## 6. Quality bar for extraction workers

### Source-aware photo review (v2 sidecar, September 2026)

`data/evidence-reviews.json` is an additive pilot, not a replacement for legacy CCS fields.
`build/evidence_assessment.py` validates and computes three separate outputs. Editorial
utility uses six 0–2 components (`identity`, `specificity`, `context`, `traceability`,
`access`, `calibration`), each with a rationale and source IDs; unassessed values remain
null. These points are not probabilities or universal personal credibility scores.
Checks track original availability, custody, exact analysis match, method availability,
independent replication and event linkage as documented/partial/unknown/not_applicable.
A non-unresolved examination outcome requires `artifact_id` and an `examination_basis`
with cited reason and explicit scope. Original status unknown never implies a derivative;
`input_type: derivative` is explicit. Independent observations require a cited basis and
deduplicated `origin_id`; copied reports and extra analysts are not independent encounters.
The host builder validates cited IDs and renders the computed result only on `targets`.
`media-photo-review.json` adds attributed, rights-retained source excerpts to the gallery;
`gallery_only` excludes them from universal category heroes and map thumbnails.
The public `/photo-review/review.json` carries bounded capture metadata, frame hashes,
source ledger and item-level findings. No full video, raw audio, source PDFs or private
transcripts ship with it. Third-party excerpt media are **not CC BY**. The curator prompt
requires this separation but does not extend its tools or enable writes/schedules.

1. Every record: ≥ 1 source. Corpus sources are verbatim from `05_graph/text/<video>.txt` with the
   `[h:mm:ss]` stamp of the block the quote sits in. Check the quote exists with `rg -F`.
2. Prefer the graph (`05_graph/nodes|edges|claims`, `documents/LEDGER.json`, `10_atlas/atlas.json`,
   `10_atlas/coordinates.py`) as the seed, then sweep `05_graph/text/` for the owner's wishlist items
   the graph lacks (`rg -i --no-ignore`), then fill world-layer gaps from published sources with URLs.
3. Coordinates carry `precision` and `coord_source`. A sea encounter is a `region`. A claimed
   underground base whose location is testimony-only is `approximate` or `region` with the source
   saying so.
4. `band` is inherited from the best supporting claim's CCS band when the record comes from the
   graph; for new records, set it honestly: an official video with a DoD statement is
   `documented`; a single uncorroborated account is `thin`.
5. Cross-link generously and only with registry slugs or slugs you create yourself in your own
   file. List every slug you *reference but did not create* in `data/_xrefs_<yourfile>.txt` so the
   integrator can reconcile.
6. Validate your JSON parses and run `python3 build/validate.py data/<yourfile>.json` if the
   validator exists by the time you finish; otherwise `python3 -c "import json;json.load(open(...))"`.
