Skip to content
Demonstrator · items marked Example are invented · what exists today
E2ER

Documentation · Data model

The data model

Everything on this site is stored in one star schema. Dimensions describe things: records, the people and organisations credited for them, vocabulary terms, roles, sources, checks, AI models and dates. Facts record what happened between them: a record uses another, someone contributed to a record in a role, a record carries a tag, a check ran on a study, a specialist called a model. The analytics shown in every Insights tab are aggregates computed from the facts alone.

18 tables, generated at every buildschema.json · How records are described and tagged

The schema

Facts in the middle, dimensions on both sides. A line is a foreign key; dashed lines link one dimension to another. Select a table to jump to its columns.

dimension fact aggregate (analytics)

Rules

  • ·Every fact names its grain: what one row stands for.
  • ·Keys are the record and person identifiers used across the site, so a row can be followed to its page.
  • ·Every fact and every example record carries is_example. Real figures filter on it; nothing invented reaches a real figure.
  • ·Every tag records where it comes from (via: declared, mapped, inferred, default).
  • ·Every record has at least one row in fact_contribution: nothing is published without its creators.
  • ·The build stops if a foreign key does not resolve.

Download

Each table as CSV and JSON. Load them into any database or spreadsheet; the queries below run as written in SQLite and DuckDB.

Dimensions

dim_record · 796 rows · One row per record: study, template, specialist, skill, dataset or external tool.
ColumnTypeDescriptionKey to
record_idtextKey, e.g. skill:e2er/econometrics/did or run:bhanneke/spot-bitcoin-etf-comovement
kindtextstudy (run), template, specialist, skill, dataset, pipeline
nametextTitle or name
statustextin-place, prototype, planned, illustration
is_exampleboolInvented record of the demonstrator
source_idtextWhere the record comes fromdim_source
collectiontextPack, folder or collection within the source
licensetextLicence as the source declares it
versiontextVersion, where the source has one
published_date_iddatePublication date of a studydim_date
hreftextPage on the site

CSV · JSON

dim_party · 241 rows · One row per person, group or organisation credited anywhere.
ColumnTypeDescriptionKey to
party_idtextKey: person:<id> for profiles, creator:<name> for creators named by a source
nametextName
party_typetextresearcher, group or creator
is_organisationboolA group, lab or company
is_exampleboolInvented example researcher
has_profileboolHas an E2ER profile (else credited by its source only)
orcidtextORCID iD where known
githubtextGitHub login where known
affiliationtextFirst recorded affiliation

CSV · JSON

dim_term · 56 rows · One row per term of the controlled vocabularies.
ColumnTypeDescriptionKey to
term_idtextKey: <facet>:<term>
facettextdiscipline, method, design, stage, kind, status
termtextTerm id
labeltextLabel
broadertextBroader termdim_term
origintextVocabulary origin (RISE, E2ER proposal)

CSV · JSON

dim_role · 15 rows · One row per CRediT contributor role.
ColumnTypeDescriptionKey to
role_idtextKey: CRediT role id, or unspecified
labeltextLabel

CSV · JSON

dim_source · 9 rows · One row per source E2ER reads.
ColumnTypeDescriptionKey to
source_idtextKey
labeltextLabel
urltextAddress

CSV · JSON

dim_check · 7 rows · One row per kind of check.
ColumnTypeDescriptionKey to
check_idtextKey
performed_bytextauthor (the author's own e2er verify) or e2er (the site's re-check)
descriptiontextWhat it checks

CSV · JSON

dim_model · 1 rows · One row per AI backend and model that a published study recorded.
ColumnTypeDescriptionKey to
model_idtextKey: <backend>/<model>
backendtextBackend
modeltextModel

CSV · JSON

dim_date · 33 rows · One row per calendar day that occurs in a fact.
ColumnTypeDescriptionKey to
date_iddateKey: YYYY-MM-DD
yearintYear
quarterintQuarter
monthintMonth

CSV · JSON

dim_dossier · 32 rows · One row per study dossier: the settings a study was produced with, addressed by the SHA-256 of their canonical JSON.
ColumnTypeDescriptionKey to
dossier_idtextKey: sha256 of the canonical dossier JSON; resolves at /d/<short_id>
short_idtextFirst 16 hex characters, used in the link
record_idtextThe studydim_record
e2er_versiontextE2ER version the run recorded
e2er_committextE2ER commit the components are pinned at
templatetextTemplate
modetextRun mode
governancetextGovernance setting
backendtextAI backend
modelstextModels used, separated by ;
is_exampleboolExample study

CSV · JSON

Facts

fact_use · 423 rows · One row per directed dependency: a record uses, extends or forks another.
ColumnTypeDescriptionKey to
from_record_idtextThe record that usesdim_record
to_record_idtextThe record useddim_record
relationtextuses, extends (study → study), forkOf (template → template)
is_exampleboolEither end is an example
date_iddatePublication date of the using studydim_date

CSV · JSON

fact_contribution · 1269 rows · One row per party, record and role: who is credited for what.
ColumnTypeDescriptionKey to
party_idtextWhodim_party
record_idtextWhatdim_record
role_idtextCRediT roledim_role
is_exampleboolRecord or party is an example

CSV · JSON

fact_tag · 2446 rows · One row per tag on a record, with where the tag comes from.
ColumnTypeDescriptionKey to
record_idtextRecorddim_record
term_idtextTermdim_term
viatextdeclared, mapped, inferred or default
ruletextInference rule or source term

CSV · JSON

fact_check · 162 rows · One row per check run on a study, by its author or by E2ER.
ColumnTypeDescriptionKey to
record_idtextStudydim_record
check_idtextCheckdim_check
statustextPASS, FAIL or SKIP
checkedintItems checked, where stated
totalintItems in total, where stated
detailtextDetail as reported
date_iddateWhendim_date
is_exampleboolInvented check of an example study

CSV · JSON

fact_ai_usage · 17 rows · One row per study, specialist and model: AI calls recorded by the run.
ColumnTypeDescriptionKey to
record_idtextStudydim_record
agent_record_idtextThe specialist as a record, where it existsdim_record
agenttextSpecialist name as recorded
model_idtextBackend and modeldim_model
callsintCalls
input_tokensintInput tokens
output_tokensintOutput tokens
cost_usdrealCost in USD (0 on subscription backends)
date_iddateFirst calldim_date
is_exampleboolExample study

CSV · JSON

fact_workflow_step · 39 rows · One row per step of a study's run, from its dossier: the specialist or check, the model, whether it was accepted, and the intermediate file it wrote with its SHA-256.
ColumnTypeDescriptionKey to
dossier_idtextDossierdim_dossier
step_nointPosition in the run
step_typetextspecialist or check
phasetextPhase of the template
agent_record_idtextSpecialistdim_record
nametextSpecialist or check name
model_idtextModeldim_model
acceptedboolStep accepted, or check passed
output_filetextIntermediate file the step wrote
output_sha256textSHA-256 of that file in the exported folder
exportedboolThe file is in the exported folder
is_exampleboolExample study

CSV · JSON

fact_dossier_component · 148 rows · One row per component pinned in a dossier: which version of a template, specialist, skill or connector a study used.
ColumnTypeDescriptionKey to
dossier_idtextDossierdim_dossier
record_idtextComponentdim_record
pin_kindtextgit_blob (content hash of the file at the commit), example_sha256, source_address, or none
pin_valuetextThe hash or address
pathtextFile path in the repository
is_exampleboolExample study

CSV · JSON

Analytics

The Insights tab of every page shows these figures; they are computed from fact_use and fact_contribution. A study reaches a record when it uses it directly or through a chain of uses (study → template → specialist → skill). For people, studies credited to themselves or to their groups are left out.

agg_record_reach · 796 rows · One row per record: how far it reaches. Computed from fact_use and fact_contribution.
ColumnTypeDescriptionKey to
record_idtextRecorddim_record
direct_realintReal records that use it directly
direct_exampleintExample records that use it directly
studies_realintReal studies that reach it directly or through a chain
studies_exampleintExample studies that reach it
partiesintParties credited for those studies

CSV · JSON

agg_party_reach · 241 rows · One row per party: how far their work reaches, own party excluded. Computed from fact_use and fact_contribution.
ColumnTypeDescriptionKey to
party_idtextPartydim_party
worksintRecords they are credited for
studies_by_others_realintReal studies by others that reach their work
studies_by_others_exampleintExample studies by others that reach their work
reused_by_partiesintOther parties credited for those studies

CSV · JSON

Example queries

Each query was run against the tables of this build.

Most reused templates, specialists and skills: studies that use them directly, real and example apart

SELECT r.kind, r.name,
  SUM(CASE WHEN s.is_example = 0 THEN 1 ELSE 0 END) AS real_studies,
  SUM(CASE WHEN s.is_example = 1 THEN 1 ELSE 0 END) AS example_studies
FROM fact_use u
JOIN dim_record r ON r.record_id = u.to_record_id
JOIN dim_record s ON s.record_id = u.from_record_id AND s.kind = 'run'
WHERE r.kind IN ('template', 'agent', 'skill')
GROUP BY r.kind, r.name
ORDER BY real_studies DESC, example_studies DESC, r.name
LIMIT 10;

Who is credited for the blocks a study uses directly, with their roles

SELECT p.name, p.party_type, COUNT(DISTINCT c.record_id) AS blocks, GROUP_CONCAT(DISTINCT c.role_id) AS roles
FROM fact_use u
JOIN fact_contribution c ON c.record_id = u.to_record_id
JOIN dim_party p ON p.party_id = c.party_id
WHERE u.from_record_id = 'run:bhanneke/spot-bitcoin-etf-comovement'
GROUP BY p.name, p.party_type
ORDER BY blocks DESC;

Checks by who performed them, real studies only

SELECT k.performed_by, f.check_id, f.status, COUNT(*) AS n
FROM fact_check f JOIN dim_check k ON k.check_id = f.check_id
WHERE f.is_example = 0
GROUP BY k.performed_by, f.check_id, f.status
ORDER BY k.performed_by, f.check_id;

Reach of a record through chains of use (recursive)

WITH RECURSIVE reach(record_id) AS (
  SELECT from_record_id FROM fact_use WHERE to_record_id = 'skill:e2er/econometrics/did'
  UNION
  SELECT u.from_record_id FROM fact_use u JOIN reach r ON u.to_record_id = r.record_id
)
SELECT r.is_example, COUNT(*) AS studies
FROM reach JOIN dim_record r ON r.record_id = reach.record_id
WHERE r.kind = 'run'
GROUP BY r.is_example;

Tokens per specialist in the published study

SELECT a.agent, m.model, a.calls, a.input_tokens + a.output_tokens AS tokens
FROM fact_ai_usage a JOIN dim_model m ON m.model_id = a.model_id
WHERE a.is_example = 0
ORDER BY tokens DESC
LIMIT 5;