Comma for either/or — dharma, courage. Spelling forgiving — corage finds courage.

    Ontology

    Six collections, one rule

    The atlas is six JSON files under data/, validated by a shared Zod schema and an integrity gate that runs before every build. The rule: a crossing that names no person or cites no source cannot exist in this dataset. The schema makes it unrepresentable.

    The model

    A work is a text: title, original language and title in the original script, author, composition date and place, field. A transmission is one crossing of that work into a language: a translation, revision, adaptation, commentary or printed edition. Transmissions form a tree per work, the stemma, through a from field that points either at "original" or at the parent transmission. Branches are real: the Almagest entered Arabic twice from the Greek, and the Kalila tradition forks at the Arabic into Hebrew and Castilian lines.

    People carry roles per crossing: translator, reviser, patron, commissioner, commentator, editor, scholar. The same person can be an author in one chain and a translator in another. Places, languages and sources are first-class entities with their own pages, so the graph can be read from any direction: a city's output, a language's traffic, a book's spread.

    A record, in full

    This is the actual record of the Latin crossing of al-Ghazali's Aims of the Philosophers, exactly as it sits in data/transmissions.json:

    {
      "id": "maqasid-latin-gundissalinus",
      "work": "maqasid",
      "from": "original",
      "language": "latin",
      "title": {
        "text": "Summa theoricae philosophiae"
      },
      "kind": "translation",
      "people": [
        {
          "person": "gundissalinus",
          "role": "translator"
        },
        {
          "person": "magister-iohannes",
          "role": "translator"
        }
      ],
      "place": "toledo",
      "date": {
        "from": 1162,
        "to": 1180,
        "ca": true
      },
      "note": "The translators omitted the prologue in which al-Ghazali announces he is reporting doctrines in order to demolish them; a Latin rendering survives in exactly one Paris manuscript. Read cold, the book made 'Algazel' a faithful Avicennian for four centuries. The print era fixed the error in place: Venice 1506, as Logica et philosophia Algazelis.",
      "confidence": "attested",
      "evidence": [
        {
          "source": "minnema-2014",
          "detail": "manuscript census, the lone surviving prologue, and the 'cave hic' marginalia"
        },
        {
          "source": "griffel-sep"
        }
      ]
    }

    Note what the shape forces. The date is a span with a ca flag, because precision beyond "third quarter of the twelfth century" would be invented. The evidence array points into the bibliography. The confidence grade is mandatory. The note is prose, because some knowledge only survives as prose.

    Integrity rules

    Beyond the schema, scripts/validate.ts enforces, on every build:

    • referential integrity across all six collections, no dangling ids
    • every stemma is a true tree: parents exist, belong to the same work, no cycles
    • chronology: no crossing predates the version it descends from
    • every transmission cites at least one source that exists
    • orphan detection: entities defined but never referenced are reported

    Reading the atlas by machine

    • /atlas/graph.json: the entire dataset, all six collections, one file
    • markdown siblings: append .md to any work, carrier or place URL, e.g. /atlas/works/panchatantra.md
    • the upstream dataset and a standalone MCP librarian live in the naql repository; chain tools for @falsafa/mcp are planned alongside the next package release