The full graph, downloadable under CC BY 4.0.

Open data

Take the graph

The website is a window; the knowledge graph is the actual project. It is published in full so the reasoning can be audited rather than believed. Free to use with attribution — if you build on it, cite DeepTunisia and the underlying sources.

The graph is released under CC BY 4.0 (attribution only — reuse freely, including commercially, keep the credit). The code that builds it is MIT. See data/LICENSE in the repository for what each covers.

How to read a record

Two fields carry most of the epistemic weight. basis says what kind of claim this is: documented, reported, inferred or unsubstantiated. The interval carries four date fields rather than two, because historical personnel records are rarely precise and collapsing them would invent certainty. raw preserves exactly what was authored, so you can see the difference between a decree date and an estimate.

Here status: "last-verified" means the officeholder was confirmed in post on 1 October 2025 and may well have continued. It does not mean they left. That distinction is the difference between a dataset and a guess, and it is why the Chronicle draws that bar with a soft right edge.

{
  "id": "p-dgsn-saidane",
  "role": "dg-national-security",
  "holder": "mourad-saidane",
  "basis": "documented",
  "datesInferred": false,
  "interval": {
    "startEarliest": 1653955200000,
    "startLatest":   1653955200000,
    "endEarliest":   1759276800000,
    "endLatest":     1785110400000,
    "startPrecision": "day",
    "status": "last-verified",
    "raw": { "start": "2022-05-31", "end": "verified:2025-10-01" }
  },
  "review": { "by": "Initial compilation", "date": "2026-07-26",
              "method": "Checked directly against the JORT decree text" },
  "sources": ["jort-2022-546", "lapresse-saied-securite-2025"]
}

Entity model

TypePurposeKey fields
SourceA citation. Everything else points at these.id, title, publisher, date, url, archive_url, tier (1–5), lang, excerpt
InstitutionMinistries, services, parties, companies, families, foreign states, organisations.id, name_en/fr/ar, abbr, type, layer, parent, active interval, sources
RoleA canonical office. Normalising titles kills transliteration drift.id, title_en/fr/ar, institution, authority (published weight table)
PersonNames in three scripts plus alias spellings, for entity resolution.id, name_en/fr/ar, aliases, birth, death, layers, trajectory, basis, sources
PositionThe join that makes time-travel possible: person × role × span.id, role, holder, interval (4-field fuzzy), basis, datesInferred, reasoning, falsifiable_by, disputes, review, predecessorDerived, successorDerived, sources
RelationshipA typed, dated, graded edge between any two entities.id, from, to, type, subtype, interval, basis, attributed_to, reasoning, falsifiable_by, disputes, sources
EventDated events, with competing characterisations held side by side.id, date, title_en/fr/ar, category, rupture, actors, institutions, contested, disputes, sources
Era, Question, HypothesisThe analytical layer: periodisation, open research tasks, falsifiable claims.era: interval, thesis, formula · question: kind, status · hypothesis: support, reasoning, falsifiable_by

Caveats you should carry with the data

  • 232 records await a primary source. They are marked. Do not cite an inferred span as a date.
  • 64 contradictions are unresolved. Where sources disagree, the dataset records the disagreement instead of choosing. Check the disputes array before using a figure.
  • The pre-2011 police chronology is the weakest area. The sequence of national police chiefs under Ben Ali rests largely on secondary sources.
  • The authority weights are editorial. They are a judgement about formal authority, published on the method page so you can substitute your own.
  • Only 46 of 1715 records have been through independent human review. Treat the rest as compiled but unaudited.

What the map does not contain

The build measures its own shortfalls and publishes them. Every number in this section is written by the build, not by hand.

Presidential network coverageEdgesFamily tiesMissing categories
Kais Saied213party, political-alliance
Moncef Marzouki184all categories present
Zine El Abidine Ben Ali178political-alliance, political-conflict, reported-influence
Habib Bourguiba153political-alliance
Mohamed Ennaceur132all categories present
Fouad Mebazaa111political-alliance
Beji Caid Essebsi111political-alliance, reported-influence

Card completeness

Sections filledPeople
0 / 542
1 / 560
2 / 5107
3 / 5134
4 / 590
5 / 517

Research queue

Senior figures with two sections or fewer — the roadmap's next targets.

Human review by claim kind

Every claim kind the schema can carry a review on, with its denominator. The previous figure counted only positions, relationships and events.

Claim typeReviewedCoverage
Institutions2 / 207 1%
People2 / 450 0%
Positions29 / 422 7%
Relationships8 / 362 2%
Events1 / 112 1%
Agreements0 / 23 0%
World claims4 / 10 40%
Companies0 / 25 0%
Contracts0 / 15 0%
Licences0 / 11 0%
Declarations0 / 9 0%
Education0 / 25 0%
Places0 / 44 0%

Human review by risk flag

Flags overlap: a record carries every flag true of it, so these totals sum to more than the record count. An inferred claim that names its source is counted under both.

Risk bucketReviewedCoverage
Unsubstantiated16 / 19 84%
Attributed19 / 307 6%
Inferred2 / 32 6%
Reported20 / 1161 2%
Documented8 / 321 2%

A review note is not an independent check. No review yet records an independence statement, and the schema has no field for one, so independent coverage is published as zero rather than inferred from a reviewer name.

Rebuilding it yourself

The source of truth is YAML, not this JSON. The build validates every reference, rejects any claim without a source, rejects an inference without stated reasoning and a falsifier, rejects an unattributed low-confidence claim, and derives all succession chains from the position records so gaps surface instead of being smoothed over. If it builds, the referential integrity holds.