From 3f846888cc9ae09ad891172ee03ca6c86b1dacfd Mon Sep 17 00:00:00 2001 From: erikson1970 Date: Sun, 6 Sep 2026 17:56:33 -0400 Subject: [PATCH 01/22] Milestone 0: repo reset and data intake - Replace unrelated 'Portfolio template' theme (index.html, static/) with a minimal placeholder page. - Remove stray unrelated files (HotelList.txt, chat_log.md). - Move planning docs into docs/ (STATUS, DATA_MODEL, VISUALIZATION, IMPLEMENTATION_PLAN) matching the paths AGENTS.md/README.md already point to. - Add source/, tools/, css/, js/, data/ scaffold per the recommended site structure, each with a short README stating its purpose. - Add source/world_history_chart_dataset_v2.xlsx as the human-editable source of truth (198 Boxes, 83 SEAIs, 390 Population rows, 89 Regions rows; verified against docs/STATUS.md counts, no duplicate/orphan IDs found). - Add ISSUES.md and TRACEABILITY.md, and document the branching / issue-tracking / milestone-council-review workflow in AGENTS.md. - Tidy .gitignore (was a placeholder). --- .gitignore | 19 +- AGENTS.md | 183 ++++++++++++++ HotelList.txt | 20 -- ISSUES.md | 51 ++++ README.md | 173 ++++++++++++- TRACEABILITY.md | 55 ++++ css/README.md | 4 + data/README.md | 8 + docs/DATA_MODEL.md | 277 +++++++++++++++++++++ docs/IMPLEMENTATION_PLAN.md | 255 +++++++++++++++++++ docs/STATUS.md | 184 ++++++++++++++ docs/VISUALIZATION.md | 256 +++++++++++++++++++ index.html | 37 ++- js/README.md | 5 + source/world_history_chart_dataset_v2.xlsx | Bin 0 -> 77011 bytes tools/README.md | 10 + 16 files changed, 1514 insertions(+), 23 deletions(-) create mode 100644 AGENTS.md delete mode 100644 HotelList.txt create mode 100644 ISSUES.md create mode 100644 TRACEABILITY.md create mode 100644 css/README.md create mode 100644 data/README.md create mode 100644 docs/DATA_MODEL.md create mode 100644 docs/IMPLEMENTATION_PLAN.md create mode 100644 docs/STATUS.md create mode 100644 docs/VISUALIZATION.md create mode 100644 js/README.md create mode 100644 source/world_history_chart_dataset_v2.xlsx create mode 100644 tools/README.md diff --git a/.gitignore b/.gitignore index 37bee45..86487ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,18 @@ -#foo +# OS cruft +.DS_Store +Thumbs.db + +# Editor/tooling +.vscode/ +.idea/ + +# Python (build-time tooling only, never shipped) +__pycache__/ +*.pyc +.venv/ +venv/ + +# Serena project cache/local config (kept out of version control by its own +# .serena/.gitignore too; this covers the top-level entry point) +.serena/cache/ +.serena/project.local.yml diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7c52b7d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,183 @@ +# Agent Instructions + +This repository is being developed interactively using Codex and Claude Code. + +## Project intent + +Build a fully static, graphically rich, interactive world-history explorer for GitHub Pages. + +Do not introduce: + +- a production backend; +- authentication; +- a database server; +- API keys; +- runtime Python dependencies. + +Python is acceptable for build-time preprocessing. + +## Source of truth + +Excel files in `source/` are the human-editable source data. + +Generated JSON in `data/` should be reproducible from those files. + +Do not silently modify generated JSON in a way that cannot be recreated from the source workbook or build script. + +## Read first + +Before substantial work, read: + +- `README.md` +- `docs/STATUS.md` +- `docs/DATA_MODEL.md` +- `docs/VISUALIZATION.md` +- `docs/IMPLEMENTATION_PLAN.md` + +## Historical-data discipline + +Do not silently “correct” source-poster data using general knowledge. + +Distinguish among: + +1. data transcribed from the ChartOrigin poster; +2. externally researched additions; +3. implementation assumptions. + +When adding researched data, preserve source URL, notes, confidence, and uncertainty where appropriate. + +## IDs + +Stable IDs are important. + +Before renaming `box_id`, `seai_id`, `link_id`, or `segment_id`, search all dependent tables and generated files. + +Prefer migrations over casual renaming. + +## Wikipedia TODO URL + +This URL is an intentional placeholder: + +```text +https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals +``` + +Treat it as `TODO`, not as actual metadata. + +## Initial stack preference + +Preferred progression: + +1. Plotly for rapid Sankey prototype; +2. D3 if custom timeline/alluvial geometry is needed; +3. ECharts is acceptable if it materially simplifies interaction. + +Do not prematurely rewrite a working prototype merely to change libraries. + +## Browser architecture + +Prefer plain HTML, CSS, modular JavaScript, and static JSON. + +Avoid framework introduction unless there is a demonstrated need. + +## Data build + +Implement validation as early as practical. + +The build should detect: + +- duplicate IDs; +- broken foreign keys; +- malformed years; +- invalid population ranges; +- unknown relation types. + +Warnings should include: + +- TODO URLs; +- missing population; +- low-confidence records. + +## Visualization semantics + +A Sankey/alluvial link does **not** mean literal conservation of people. + +Ribbon width means estimated historical scale unless a particular view explicitly defines another metric. + +Chronology must remain semantically correct. + +Do not allow an auto-layout to reorder nodes in a historically misleading way. + +## Accessibility + +Interactive marks should not require hover. + +Where practical: + +- click/tap selects; +- keyboard access is available; +- inspector mirrors tooltip information; +- color is not the sole encoding. + +## Scope control + +Prefer small vertical slices: + +1. load data; +2. validate; +3. render a small subset; +4. synchronize selection; +5. add filtering; +6. expand data coverage. + +Do not attempt to perfect every historical region before producing a working visualization. + +## Source control workflow + +`main` is treated as sacred, even though it is not branch-protected on GitHub. + +- Do work on `feature/` or `fix/` branches, never directly on `main`. +- Merge to `main` only after a milestone's goal is verified closed (see + "Milestone review process" below). +- Commit frequently on the working branch — small, real commits, not one + giant squash at the end. + +## Issue and requirement tracking + +- `ISSUES.md` tracks open defects/deferred work, each tagged **Gatekeeper** + (blocks the current milestone) or **Minor** (tabled — tracked, not + blocking). +- `TRACEABILITY.md` tracks closure of stated requirements/goals (from this + file, `README.md`, `docs/DATA_MODEL.md`, `docs/IMPLEMENTATION_PLAN.md`) + against verification evidence. +- Gatekeeper issues must be resolved (or explicitly reclassified as minor, + with reasoning) before a milestone branch merges to `main`. Minor issues + are fine to table indefinitely. + +## Milestone review process + +Before merging a milestone branch to `main`, close out the milestone by +instantiating a small **council of experts**: independent reviewers (each a +subagent with a distinct lens — e.g. data integrity, architecture/static-site +constraints, accessibility/visualization semantics) who each check the +milestone's stated goal against the actual repo state and report findings. + +- Feed the council the milestone's requirements (from `TRACEABILITY.md`/this + file) and the current diff/state — not just a summary. +- Reconcile their findings into `ISSUES.md` (new issues) and + `TRACEABILITY.md` (status updates) before deciding to merge. +- A milestone can close with tabled minor issues; it should not close with + open gatekeeper issues. + +## Definition of done for v0.1 + +A successful v0.1: + +- runs as a static site; +- loads generated JSON; +- shows an interactive chronological Sankey/alluvial subset; +- shows a simple timeline; +- supports selecting a historical box; +- updates an inspector; +- supports at least one region filter; +- is deployable directly to GitHub Pages. diff --git a/HotelList.txt b/HotelList.txt deleted file mode 100644 index 16d8cf7..0000000 --- a/HotelList.txt +++ /dev/null @@ -1,20 +0,0 @@ -Near Natick Mall -https://www.google.com/maps/place/Magnuson+Hotel+Framingham/@42.375724,-71.3588041,11.94z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e388899793653d:0x311c731fa3c55bd2 -https://www.google.com/maps/place/Crowne+Plaza+Boston-Natick/@42.375724,-71.3588041,11.94z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e38886b31319e7:0xce21e72878a39355 -https://www.google.com/maps/place/Boston%2FNatick+Travelodge/@42.297921,-71.5519922,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e38883dd75517d:0x34d43e2dd8208bba -https://www.google.com/maps/place/Courtyard+Boston+Natick/@42.297921,-71.5519922,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e3889d9832d973:0x51b30ad7146c6cf1 -https://www.google.com/maps/place/Hampton+Inn+Boston%2FNatick/@42.2845889,-71.4135279,13z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x0000000000000000:0x90ce182cc66f4946 -https://www.google.com/maps/place/Red+Roof+Inn+Boston+-+Framingham/@42.2845889,-71.4135279,13z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x0000000000000000:0x20ff70aff91febc5 - - -On RT-9 in Framingham -https://www.google.com/maps/place/Sheraton+Framingham+Hotel+%26+Conference+Center/@42.297921,-71.5519922,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e38a27a40998f7:0xc901f7bfb3e62eaa -https://www.google.com/maps/place/Motel+6+Bstn-Frmgham/@42.297921,-71.5519922,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e38a26c0032c15:0x75e183388d06656 - - -On Rt-128 -https://www.google.com/maps/place/Hotel+Indigo+Boston+-+Newton+Riverside/@42.3339714,-71.3944735,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x89e383ba69fea8f3:0xd340c878a4e20c8a -https://www.google.com/maps/place/Boston+Marriott+Newton/@42.3339714,-71.3944735,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x0000000000000000:0xe9780f9eba24e960 - -On Rt-128 in Waltham -https://www.google.com/maps/place/Embassy+Suites+by+Hilton+Boston%2FWaltham/@42.3339714,-71.3944735,11z/data=!4m5!1m2!2m1!1shotels+near+home!3m1!1s0x0000000000000000:0xcd882ff41d9ace68 diff --git a/ISSUES.md b/ISSUES.md new file mode 100644 index 0000000..369b85e --- /dev/null +++ b/ISSUES.md @@ -0,0 +1,51 @@ +# Issues + +Open-issue tracker for the World History Explorer project. + +Severity: + +- **Gatekeeper** — blocks closing the current milestone. Must be fixed or explicitly downgraded before merging the milestone branch to `main`. +- **Minor** — tabled. Tracked but does not block milestone closure. + +Status: `Open`, `Tabled`, `Resolved`. + +An issue closed by a milestone council review notes which review closed it. + +--- + +## Open + +_(none yet — see Tabled below)_ + +## Tabled (minor, deferred) + +### ISSUE-001 — `Regions` rows lack a unique per-row identifier +- **Severity:** Minor +- **Source:** `docs/DATA_MODEL.md`, workbook `Regions` sheet +- **Description:** `region_id` is a grouping key shared by every country row in a region (e.g. `NE_SCAND` repeats once per country), not a unique row key. Fine for filtering today; will need a real per-row key (or a composite `region_id`+`country`) if `Regions` grows into real historical timelines per Phase 8. +- **Deferred until:** Phase 8 (region expansion) or whenever a `Regions`-keyed foreign key is needed. + +### ISSUE-002 — All `Boxes`/`SEAIs` URLs are still the TODO placeholder +- **Severity:** Minor +- **Source:** `docs/STATUS.md` +- **Description:** Confirmed by validation: 198/198 `Boxes` rows and 83/83 `SEAIs` rows currently hold `https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals`. Expected at this stage; tracked here so it isn't mistaken for a data bug later. +- **Deferred until:** "Add real Wikipedia URLs gradually" (STATUS.md recommended next work, priority 4). + +### ISSUE-003 — `Population` table has zero filled estimates +- **Severity:** Minor +- **Source:** `docs/STATUS.md` +- **Description:** All 390 seeded knot-point rows have no `population` value yet, by design (values intentionally not invented). No width-by-population rendering is possible until a representative subset is filled. +- **Deferred until:** Phase 6 (population experiment); STATUS.md's recommended first-subset list (Roman, Byzantine, Persian, Ottoman, major Chinese dynasties, etc.). + +### ISSUE-004 — `Links` and `BoxSegments` tables do not exist yet +- **Severity:** Minor +- **Source:** `docs/DATA_MODEL.md`, `docs/STATUS.md` +- **Description:** No succession/relationship data and no per-country-lane segmentation exist yet. Alluvial/Sankey view and accurate multi-country boxes (Rome, Ottomans, etc.) are blocked on these. +- **Deferred until:** Phase 3 (`Links`, minimal subset) and Phase 7 (`BoxSegments`). + +## Resolved + +### ISSUE-000 — Repo contained an unrelated portfolio template and stray files +- **Severity:** was Gatekeeper for Milestone 0 +- **Description:** `index.html` and `static/` held a generic "Portfolio template" theme (Lorem Ipsum, fake bios) unrelated to this project; `HotelList.txt` (personal hotel-search links) and `chat_log.md` (dead sandbox links from doc handoff) were also present. +- **Resolution:** Removed `static/`, `HotelList.txt`, `chat_log.md`; replaced `index.html` with a minimal placeholder. Closed by Milestone 0 council review. diff --git a/README.md b/README.md index 552e434..8c6f602 100644 --- a/README.md +++ b/README.md @@ -1 +1,172 @@ -# erikson1970.github.io +# World History Explorer + +## Purpose + +This project turns the ChartOrigin **Timeline of World History** poster into a richer, interactive, static web visualization that can be hosted on GitHub Pages. + +Canonical visual source: + +- https://chartorigin.com/product/timeline-of-world-history/ + +Target repository: + +- https://github.com/erikson1970/erikson1970.github.io + +The current contents of that repository are disposable. It is acceptable to replace the existing test page with this project. + +## Core idea + +The original poster presents historical polities/civilizations as colored boxes arranged vertically through time and horizontally by modern-country alignment. + +The project should preserve that basic model, but make it interactive and extensible: + +- zoom and pan through time; +- filter by region/country; +- click a historical box to inspect details; +- show significant events / architecture items (SEAIs); +- vary visual width using population, `log10(population)`, or other transforms; +- experiment with Sankey/alluvial-style succession flows; +- eventually support additional regions missing from the original poster. + +The project should remain **fully static in production**. No server-side application or database is required. + +## Data authority + +The Excel workbook is intended to remain the human-editable source of truth. + +Current logical tables: + +1. `Boxes` +2. `SEAIs` +3. `Population` +4. `Regions` + +Proposed next tables: + +5. `Links` +6. `BoxSegments` + +The browser should consume generated JSON, not parse Excel directly. + +Recommended pipeline: + +```text +Excel workbook + ↓ +Python validation/build script + ↓ +JSON files + ↓ +Static HTML/CSS/JavaScript + ↓ +GitHub Pages +``` + +## Recommended site structure + +```text +/ +├── index.html +├── css/ +│ └── history.css +├── js/ +│ ├── app.js +│ ├── timeline.js +│ ├── sankey.js +│ └── data.js +├── data/ +│ ├── boxes.json +│ ├── seais.json +│ ├── population.json +│ ├── regions.json +│ ├── links.json +│ └── box-segments.json +├── source/ +│ └── *.xlsx +├── tools/ +│ ├── build_data.py +│ └── validate_data.py +└── docs/ + ├── STATUS.md + ├── DATA_MODEL.md + ├── VISUALIZATION.md + └── IMPLEMENTATION_PLAN.md +``` + +A simpler initial implementation is fine. The important architectural choice is that the site remains static and the generated data remains separate from rendering code. + +## Technology direction + +### Prototype + +Use Plotly first for a quick interactive Sankey/alluvial experiment. + +Why: + +- fast iteration; +- good hover behavior; +- easy static HTML export; +- Python preprocessing is convenient; +- useful for learning what the data wants to do. + +### Likely final renderer + +Use D3 for the primary visualization if Plotly becomes restrictive. + +D3 is likely better for: + +- exact historical placement along the time axis; +- custom time-varying widths; +- linked interactions across multiple views; +- custom SEAIs and annotations; +- unusual alluvial / timeline hybrid geometry. + +Apache ECharts is also a reasonable intermediate option and may be preferable to Plotly for dashboard-like interaction. + +## Initial user experience + +A useful first public page would have three synchronized areas: + +1. **Main flow view** — Sankey/alluvial representation of historical succession. +2. **Timeline view** — original-poster-inspired chronological boxes. +3. **Inspector panel** — selected box details, dates, population, uncertainty, SEAIs, region, Wikipedia link. + +Suggested controls: + +- region filter; +- date range; +- width basis: equal / population / `log10(population)` / square root population; +- show/hide SEAIs; +- show/hide uncertainty; +- show/hide modern-country labels. + +## Important modeling principle + +A Sankey diagram implies flow, but historical population is not literally conserved from one polity to another. + +The intended meaning should be explicit: + +> Ribbon width represents the estimated scale of the historical entity at that point in time, not a literal transfer of people. + +The preferred terminology is therefore **alluvial history view** or **civilizational flow view**, even if implemented using a Sankey library. + +## Current project status + +The initial source chart has been transcribed into spreadsheet form. + +Current known counts: + +- 198 historical boxes; +- 83 SEAIs; + - 30 numbered “Milestones of Civilization”; + - 53 labeled landmark / architectural items; +- 390 seeded population boundary rows; +- 89 country rows across five added regional groupings. + +See `docs/STATUS.md` for details and known limitations. + +## Guiding principle + +The goal is not to create a definitive universal history ontology on the first pass. + +Start with a clean, inspectable, extensible model that supports visualization experiments. Add historical precision incrementally, with sources and uncertainty preserved rather than hidden. diff --git a/TRACEABILITY.md b/TRACEABILITY.md new file mode 100644 index 0000000..66208c5 --- /dev/null +++ b/TRACEABILITY.md @@ -0,0 +1,55 @@ +# Traceability + +Maps stated requirements/goals to verification status. Updated at each milestone +council review (see `AGENTS.md` § Milestone review process). Not a substitute for +`ISSUES.md` — this tracks *closure of stated requirements*, `ISSUES.md` tracks +*defects and deferred work*. + +Status values: `Met`, `Partial`, `Not started`. + +--- + +## Milestone 0 — Repository reset & data intake + +Goal (`AGENTS.md` Phase 0 / `IMPLEMENTATION_PLAN.md` Phase 0): replace disposable +repo contents with a clean project structure and bring the source workbook in. + +| Req | Requirement | Source | Status | Evidence | +|---|---|---|---|---| +| M0-1 | Recommended site structure in place (`index.html`, `css/`, `js/`, `data/`, `source/`, `tools/`, `docs/`) | README.md § Recommended site structure | Met | Directories created; docs moved into `docs/`; workbook moved into `source/` | +| M0-2 | Docs readable from paths `AGENTS.md`/README point to | AGENTS.md § Read first | Met | `docs/STATUS.md`, `docs/DATA_MODEL.md`, `docs/VISUALIZATION.md`, `docs/IMPLEMENTATION_PLAN.md` now exist at those paths | +| M0-3 | No disposable/unrelated content remains | README.md § Purpose ("current contents disposable") | Met | Portfolio-template `index.html`/`static/`, `HotelList.txt`, `chat_log.md` removed | +| M0-4 | Excel workbook present as source of truth | README.md § Data authority | Met | `source/world_history_chart_dataset_v2.xlsx` added | +| M0-5 | Workbook row counts match documented counts | docs/STATUS.md | Met | Verified: Boxes 198/198, SEAIs 83/83, Population 390/390, Regions 89/89 | +| M0-6 | No production backend/DB/auth/API keys introduced | AGENTS.md § Project intent | Met | Reset introduced only static assets and docs | + +### Data validation spot-checks (informational, feeds Phase 1 `validate_data.py`) + +| Check | Result | +|---|---| +| Duplicate `box_id` | none found (198 unique) | +| `start_year <= end_year` | holds for all rows with both years present | +| `color_hex` matches `#RRGGBB` | all 198 valid | +| `box_id` confidence vocabulary in use | `High`, `Medium` | +| Duplicate `seai_id` | none found (83 unique) | +| Orphan `SEAIs.box_id` (no matching Box) | none | +| Orphan `Population.box_id` (no matching Box) | none | +| TODO placeholder URL count | Boxes 198/198, SEAIs 83/83 (expected — see ISSUE-002) | +| `Population.population` filled | 0/390 (expected — see ISSUE-003) | +| Duplicate `Regions.region_id` | 5 groups repeat by design, one row per country (see ISSUE-001) | + +## v0.1 definition of done (forward-looking; not yet in scope) + +Tracked here so later milestones can check items off against `AGENTS.md`'s +"Definition of done for v0.1" without re-deriving the list. + +| Req | Requirement | Status | +|---|---|---| +| V1-1 | Runs as a static site | Not started | +| V1-2 | Loads generated JSON | Not started | +| V1-3 | Interactive chronological Sankey/alluvial subset | Not started | +| V1-4 | Simple timeline | Not started | +| V1-5 | Select a historical box | Not started | +| V1-6 | Updates an inspector | Not started | +| V1-7 | At least one region filter | Not started | +| V1-8 | Deployable to GitHub Pages | Not started | diff --git a/css/README.md b/css/README.md new file mode 100644 index 0000000..a0db8ad --- /dev/null +++ b/css/README.md @@ -0,0 +1,4 @@ +# css/ + +Hand-written stylesheets for the static site (no framework/build step assumed +unless a real need shows up). Planned: `history.css`. diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000..aef5d1f --- /dev/null +++ b/data/README.md @@ -0,0 +1,8 @@ +# data/ + +Generated output only. Everything here must be reproducible from `source/*.xlsx` +via `tools/build_data.py`. Do not hand-edit files in this directory — fix the +workbook or the build script instead. + +Planned outputs: `boxes.json`, `seais.json`, `population.json`, `regions.json`, +and later `links.json`, `box-segments.json`. diff --git a/docs/DATA_MODEL.md b/docs/DATA_MODEL.md new file mode 100644 index 0000000..c116c7e --- /dev/null +++ b/docs/DATA_MODEL.md @@ -0,0 +1,277 @@ +# Data Model + +## Design goals + +The model should support poster-style chronology, filtering by modern-country alignment, alluvial/Sankey succession, population-dependent widths, SEAIs, uncertainty, and future geographic refinement. + +The Excel workbook remains the editable source of truth. + +# 1. Boxes + +A **Box** represents one labeled historical entity or era from the source poster. + +Examples: + +- Roman Empire +- Byzantine Empire +- Han Dynasty +- Kingdom of France +- Colonial America + +Primary key: `box_id` + +Important fields: + +| Field | Meaning | +|---|---| +| `box_id` | Stable machine-readable identifier | +| `box_name` | Display name | +| `url` | Wikipedia URL or TODO placeholder | +| `start_year` | Numeric plotting year; BCE negative | +| `end_year` | Numeric plotting year | +| `start_label` | Human-readable source-style label | +| `end_label` | Human-readable source-style label | +| `color_name` | Palette category | +| `color_hex` | Poster color | +| `span` | Semicolon-delimited modern-country alignment | +| `region_group` | Broad grouping | +| `notes` | Exceptions / interpretation | +| `confidence` | Confidence in transcription | + +## Year convention + +BCE years are negative: + +```text +500 BCE -> -500 +27 BCE -> -27 +``` + +CE years are positive. + +There is no attempt to model a historical year zero. + +`Present` is currently represented numerically as 2026 while retaining `Present` in the label field. + +# 2. SEAIs + +SEAI means **Significant Event / Architectural Item**. + +SEAIs are intentionally separate from boxes. + +Current categories: + +- `Milestone of Civilization` +- `Historical Landmark` + +Primary key: `seai_id` + +Foreign key: + +```text +box_id -> Boxes.box_id +``` + +Important fields include name, URL, category, plotting year, parent box, icon metadata, historical year, notes, and confidence. + +# 3. Population + +Population is a **time series**, not a scalar property of a box. + +Primary key: `population_id` + +Foreign keys: + +```text +box_id -> Boxes.box_id +segment_id -> BoxSegments.segment_id (optional / future) +``` + +Current proposed fields: + +| Field | Meaning | +|---|---| +| `population_id` | Unique row identifier | +| `box_id` | Historical entity | +| `box_name` | Convenience display field | +| `segment_id` | Optional geographic segment | +| `year` | Knot-point year | +| `year_label` | Display label | +| `sample_type` | Boundary, census, event, breakpoint | +| `population` | Best estimate | +| `log10_population` | Derived value | +| `population_low` | Lower estimate | +| `population_high` | Upper estimate | +| `population_basis` | What population means | +| `estimate_method` | How estimate was produced | +| `source_url` | Direct source | +| `source_citation` | Citation text | +| `confidence` | High / Medium / Low / Unknown | +| `status` | TODO / Estimated / Verified | +| `notes` | Caveats | + +Recommended `population_basis` values: + +- `polity_total` +- `territorial_segment` +- `modern_country_total` +- `other` + +If the Roman Empire has an estimate of 60M, that should generally be one `polity_total` estimate, not 60M duplicated into every modern-country lane. + +Prefer sparse, meaningful knot points rather than annual rows. + +Good knots include: + +- box start; +- box end; +- census; +- plague; +- conquest; +- territorial split; +- demographic collapse; +- expansion; +- benchmark year. + +Interpolation can occur at build/render time. + +# 4. Regions + +`Regions` is currently a modern-country grouping table for omitted areas. + +Current groupings: + +- Northern Europe / Scandinavia +- Eastern Europe / Slavic world +- Southeast Asia +- Arabia and the Levant +- Sub-Saharan Africa + +This is an intermediate model, not a claim that all five are formal geographic/cultural ontologies. + +# 5. Proposed: Links + +This table is required for serious Sankey/alluvial work. + +A Link documents a relationship between historical boxes. + +Proposed fields: + +| Field | Meaning | +|---|---| +| `link_id` | Unique identifier | +| `source_box_id` | Source entity | +| `target_box_id` | Target entity | +| `year` | Transition/relationship year | +| `relation_type` | Nature of relationship | +| `weight_basis` | How link width should be computed | +| `confidence` | Confidence | +| `source_url` | Supporting source | +| `notes` | Interpretation | + +Recommended relation types: + +- `successor` +- `partition` +- `unification` +- `conquest` +- `colonization` +- `decolonization` +- `dynastic_transition` +- `institutional_successor` +- `cultural_continuity` +- `migration` +- `other` + +Example: + +| source | target | year | relation | +|---|---|---:|---| +| Roman Empire | Western Roman Empire | 395 | partition | +| Roman Empire | Byzantine Empire | 395 | partition | +| Frankish Kingdom | West Francia | 843 | partition | +| East Francia | Holy Roman Empire | 962 | institutional_successor | + +Not every chronological adjacency should automatically become a link. + +# 6. Proposed: BoxSegments + +`BoxSegments` should normalize the current `span` representation. + +A BoxSegment represents one historical entity occupying one modern-country lane over one time interval. + +Proposed fields: + +| Field | Meaning | +|---|---| +| `segment_id` | Unique identifier | +| `box_id` | Parent box | +| `modern_country` | Modern-country alignment | +| `start_year` | Segment start | +| `end_year` | Segment end | +| `confidence` | Confidence | +| `notes` | Caveat | + +This solves step-shaped poster boxes, differing start/end dates across modern-country lanes, geographic filtering, population allocation, and better alluvial layouts. + +# 7. Generated JSON + +Suggested outputs: + +```text +data/ +├── boxes.json +├── seais.json +├── population.json +├── regions.json +├── links.json +└── box-segments.json +``` + +The build process should validate all IDs and foreign keys. + +# 8. Validation rules + +At minimum: + +### Boxes + +- `box_id` unique; +- `start_year <= end_year` when both exist; +- valid color hex; +- controlled confidence vocabulary. + +### SEAIs + +- `seai_id` unique; +- every `box_id` exists; +- event year numeric when present; +- TODO Wikipedia URLs recognizable. + +### Population + +- every `box_id` exists; +- `population > 0` when populated; +- `population_low <= population <= population_high`; +- duplicate knot points flagged; +- controlled basis/method vocabulary. + +### Links + +- source and target boxes exist; +- relation type valid; +- transition year sensible. + +### BoxSegments + +- parent box exists; +- dates fall reasonably within parent box envelope; +- modern country exists in vocabulary. + +# 9. Preserve uncertainty + +Do not silently clean up ambiguous history. + +Store source, confidence, low/high population, approximate labels, and notes. + +The visual layer can decide how uncertainty is displayed. diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000..3cab2ce --- /dev/null +++ b/docs/IMPLEMENTATION_PLAN.md @@ -0,0 +1,255 @@ +# Implementation Plan + +## Objective + +Build a graphically rich, interactive, static world-history explorer and deploy it through GitHub Pages. + +No production server is required. + +The existing contents of `erikson1970.github.io` may be replaced. + +# Phase 0 — Repository reset + +- inspect current repository; +- preserve anything worth keeping only if desired; +- replace test content with a clean project structure; +- add a source-data directory for spreadsheets; +- add project documentation. + +Suggested tree: + +```text +/ +├── index.html +├── css/ +├── js/ +├── data/ +├── source/ +├── tools/ +└── docs/ +``` + +# Phase 1 — Data build pipeline + +## Goal + +Convert Excel workbook tables to validated JSON. + +Suggested tool: Python. + +Recommended libraries: + +- `openpyxl` or `pandas`; +- built-in `json`; +- optional `pydantic`. + +Suggested script: + +```text +tools/build_data.py +``` + +Inputs: + +```text +source/*.xlsx +``` + +Outputs: + +```text +data/boxes.json +data/seais.json +data/population.json +data/regions.json +``` + +Later: + +```text +data/links.json +data/box-segments.json +``` + +Fail the build on duplicate IDs, broken foreign keys, malformed years, invalid numeric population, inconsistent low/high bounds, and invalid relation types. + +Warn on TODO Wikipedia URLs, missing population, low-confidence records, and suspicious dates. + +# Phase 2 — Minimal static application + +Suggested shared state: + +```javascript +{ + selectedBoxId: null, + selectedSeaiId: null, + regionFilter: "all", + countryFilter: "all", + yearStart: -3000, + yearEnd: 2026, + widthMode: "equal", + showSeais: true +} +``` + +Separate data loading, state management, and rendering. + +# Phase 3 — Plotly alluvial prototype + +Use a small subset first. + +Good candidates: + +### Mediterranean / Europe + +- Roman Empire; +- Western Roman Empire; +- Byzantine Empire; +- Frankish Kingdom; +- West Francia; +- Kingdom of France; +- East Francia; +- Holy Roman Empire; +- Ottoman Empire. + +### China + +- Zhou; +- Qin; +- Han; +- Age of Division; +- Sui; +- Tang; +- Five Dynasties; +- Song; +- Yuan; +- Ming; +- Qing. + +Create a minimal `Links` table for the chosen subset. + +Acceptance criteria: + +- nodes ordered chronologically; +- links clickable; +- selected node updates inspector; +- page remains static. + +# Phase 4 — Timeline view + +Render source-poster-inspired boxes from `Boxes`. + +Likely renderer: SVG + D3. + +Initial version may use current `span` approximately and defer exact `BoxSegments`. + +Acceptance criteria: + +- boxes appear at correct dates; +- colors match source data; +- click selection works; +- date zoom/filter works; +- SEAIs can be overlaid. + +# Phase 5 — Shared interaction + +Synchronize Sankey, timeline, and inspector. + +Selecting one entity anywhere should update every panel. + +Possible future deep link: + +```text +?box=BYZANTINE&year=537 +``` + +# Phase 6 — Population experiment + +Populate only enough data to test width encodings. + +Target roughly 10–20 important boxes with a few knot points each. + +Support: + +- equal; +- raw population; +- `log10(population)`; +- square root. + +Questions: + +- Is raw population usable? +- Does `log10` compress too much? +- Is square root a better compromise? +- Is a minimum visual width needed? + +# Phase 7 — BoxSegments + +Normalize complex multi-country boxes. + +Start with: + +- Roman Empire; +- Persian Empire; +- Byzantine Empire; +- Arab Caliphate; +- Ottoman Empire; +- First French Empire. + +# Phase 8 — Expand omitted regions + +Current intermediate groups: + +- Northern Europe / Scandinavia; +- Eastern Europe / Slavic world; +- Southeast Asia; +- Arabia and the Levant; +- Sub-Saharan Africa. + +Recommended development order: + +1. Northern Europe / Scandinavia +2. Eastern Europe / Slavic world +3. Arabia and Levant +4. Southeast Asia +5. Sub-Saharan Africa + +This is only a development sequence, not a statement of historical importance. + +# Phase 9 — Static deployment + +Production should require only: + +```text +HTML +CSS +JavaScript +JSON +``` + +No Python executes in production. + +Python is build/preprocessing only. + +# Development principles + +1. Build visualization before perfecting the ontology. +2. Stable IDs matter. +3. Preserve uncertainty. +4. Separate source data from generated data. +5. Keep browser stateless initially. +6. Prefer inspectable code over framework complexity. + +# Suggested first coding session + +1. Reset repo into clean project structure. +2. Copy spreadsheet(s) into `source/`. +3. Implement `build_data.py`. +4. Generate JSON. +5. Render a simple list/count sanity-check page. +6. Add a small hand-authored `links.json`. +7. Render first Plotly Sankey. +8. Add click-to-inspector behavior. +9. Commit. + +At that point the project will have crossed the important boundary from “dataset” to “interactive application.” diff --git a/docs/STATUS.md b/docs/STATUS.md new file mode 100644 index 0000000..2fcb51f --- /dev/null +++ b/docs/STATUS.md @@ -0,0 +1,184 @@ +# Project Status + +## Status summary + +**Phase:** data transcription complete enough for visualization prototyping. + +The project currently has a usable first-pass dataset derived from the ChartOrigin *Timeline of World History* poster. + +Canonical poster/source page: + +- https://chartorigin.com/product/timeline-of-world-history/ + +## Completed + +### Historical boxes + +The poster has been transcribed into a `Boxes` table. + +Current count: **198 boxes** + +Current fields include: + +- `box_id` +- `box_name` +- `url` +- `start_year` +- `end_year` +- `start_label` +- `end_label` +- `color_name` +- `color_hex` +- `span` +- `span_count` +- `span_start` +- `span_end` +- `region_group` +- `notes` +- `confidence` + +### SEAIs + +Significant events / architectural items are stored separately. + +Current count: **83 SEAIs** + +- 30 numbered civilization milestones; +- 53 labeled historical landmarks / architectural items. + +### Wikipedia URL placeholders + +Both `Boxes` and `SEAIs` include a URL field. + +The intentionally bogus/TODO placeholder is: + +```text +https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals +``` + +Do not interpret that URL as meaningful data. + +### Population scaffold + +A separate `Population` table exists. + +Current count: **390 seeded rows** + +Rows were seeded at known box start/end boundaries. + +Population values were deliberately **not invented**. + +The table is designed to hold historical knot points with estimate, low/high range, basis, method, source, confidence, and status. + +### Added missing regional groupings + +A `Regions` table currently includes five intermediate regional groupings not covered well by the source poster: + +1. Northern Europe / Scandinavia +2. Eastern Europe / Slavic world +3. Southeast Asia +4. Arabia and the Levant +5. Sub-Saharan Africa + +These currently function as modern-country grouping metadata, not yet as full historical timelines. + +Current region-country rows: **89** + +## Important known limitations + +### 1. The original poster is selective + +It is not a complete world history. + +Major omissions include, among others: + +- Scandinavia / Nordics; +- Eastern Europe / Slavic histories; +- Korea; +- Southeast Asia; +- Arabia and the Levant; +- Central Asia; +- most of Sub-Saharan Africa; +- much of North Africa west of Egypt; +- Brazil; +- Andes; +- Central America / Caribbean; +- Oceania beyond Australia; +- Low Countries; +- Switzerland. + +The five requested regions above are the first extension step. + +### 2. Some dates are approximate + +The poster itself contains approximate dates, very thin transition boxes, step-shaped multi-country boxes, and some labels that are difficult to read at image resolution. + +The dataset preserves uncertainty in `notes` and `confidence`. + +### 3. `span` is not a proper geometry model yet + +Current `span` is a semicolon-delimited list of modern countries. + +That is useful for filtering, but insufficient for historical geography. + +A large entity such as the Roman Empire or Ottoman Empire occupies different modern-country lanes over different time intervals. + +A proposed `BoxSegments` table should normalize this. + +### 4. Population is not filled + +The `Population` table is a scaffold only. + +The next population work should prioritize historically significant entities and major breakpoints rather than attempting annual estimates. + +### 5. Historical succession is not modeled yet + +A Sankey/alluvial visualization needs explicit relationships. + +The current tables know **what existed and when**, but not reliably **what became what**. + +A proposed `Links` table should store source box, target box, transition year, relationship type, confidence, and optional weight method. + +### 6. Architectural item dates may differ from the poster + +Some SEAIs did not have explicit years printed on the poster. + +Representative historical years were supplied for plotting and documented in notes. + +These should be reviewed before treating them as authoritative. + +## Recommended next data work + +Priority order: + +1. Add `Links`. +2. Add `BoxSegments`. +3. Populate a small, representative subset of `Population`. +4. Add real Wikipedia URLs gradually. +5. Build first interactive prototype. +6. Let visualization needs drive further data refinement. + +## Recommended first population subset + +Do not fill everything at once. + +Start with: + +- Roman Empire; +- Byzantine Empire; +- Western Roman Empire; +- Persian Empire; +- Ottoman Empire; +- major Chinese dynasties; +- Maurya / Gupta / Mughal; +- major Egyptian periods; +- Frankish / French sequence; +- Holy Roman Empire / German sequence. + +This is enough to test equal-width vs. population vs. logarithmic-width rendering. + +## Source discipline + +Treat the source poster as authoritative for box labels, poster colors, visual alignment, poster dates, and which SEAIs appear. + +External research should be clearly distinguished when used for population, exact historical dates, territorial interpretation, succession links, Wikipedia URLs, or expansion beyond the original poster. diff --git a/docs/VISUALIZATION.md b/docs/VISUALIZATION.md new file mode 100644 index 0000000..2210f4a --- /dev/null +++ b/docs/VISUALIZATION.md @@ -0,0 +1,256 @@ +# Visualization Concepts + +## Overall direction + +The project should not simply redraw the original poster. + +The poster is the source dataset and visual inspiration. The site should expose relationships that are hard to see on paper. + +The strongest direction is a synchronized set of views built from one shared data model. + +# View 1: Timeline + +## Goal + +Provide a recognizable, interactive descendant of the source poster. + +Possible orientation: + +- time horizontally for stronger compatibility with Sankey/alluvial views; +- region / modern-country lanes vertically. + +The original poster's vertical-time orientation can still be tested. + +## Box width modes + +Allow: + +- equal width; +- population; +- `log10(population)`; +- `sqrt(population)`. + +Raw population may make smaller ancient polities disappear visually. `log10` or square root may be better compromises. + +## Interaction + +Clicking a box should: + +- select it persistently; +- highlight corresponding SEAIs; +- update the inspector; +- highlight predecessor/successor links; +- dim unrelated boxes. + +Hover can enhance but must not be the only interaction. + +# View 2: Alluvial / Sankey + +## Goal + +Show succession, fragmentation, unification, conquest, and institutional continuity. + +This is conceptually an **alluvial history view**, even if implemented with a Sankey library. + +Recommended explanatory text: + +> Ribbon width represents the estimated scale of the historical entity, not a literal transfer of people. + +Chronology should constrain horizontal placement. + +Do not allow generic auto-layout to place a 500 BCE node to the right of a 500 CE node. + +# View 3: Population river / streamgraph + +## Goal + +Show demographic scale through time. + +Potential hierarchy: + +```text +World + → Region + → Civilization / polity +``` + +This becomes especially useful once population estimates are filled. + +The browser or build script can interpolate between sparse knot points. + +Candidate interpolation: + +- linear population; +- log-linear population. + +# View 4: Genealogy / relationship graph + +This emphasizes relationship type rather than width. + +Potential use: + +- inspect one polity’s predecessors; +- inspect successors; +- distinguish conquest from dynastic transition; +- explore cross-regional relationships. + +This can wait until `Links` matures. + +# Proposed first page + +```text +┌─────────────────────────────────────────────────────────────┐ +│ WORLD HISTORY EXPLORER │ +│ Date range Region Width basis SEAIs │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ ALLUVIAL / SANKEY │ +│ │ +├──────────────────────────────────────┬──────────────────────┤ +│ Timeline │ Inspector │ +│ │ │ +│ │ Selected box │ +│ │ Dates │ +│ │ Population │ +│ │ SEAIs │ +│ │ Wikipedia │ +└──────────────────────────────────────┴──────────────────────┘ +``` + +On narrow screens, stack vertically. + +# Technology comparison + +## Plotly + +Best for rapid prototype and initial Sankey. + +Advantages: + +- fast; +- mature; +- good tooltips; +- easy static output. + +Limitations: + +- custom timeline/Sankey hybrid geometry may become awkward; +- exact node placement can be restrictive; +- advanced cross-view interaction may feel like fighting the library. + +Recommendation: **use Plotly for the first functional experiment.** + +## Apache ECharts + +Good for a polished interactive dashboard with strong built-in interaction. + +Recommendation: consider it if Plotly works conceptually but feels too scientific or generic. + +## D3 + +Best for the likely final bespoke visualization. + +Advantages: + +- maximum control; +- direct SVG geometry; +- exact chronology; +- variable-width ribbons; +- synchronized custom views. + +Cost: + +- more code; +- more layout responsibility. + +Recommendation: **likely final renderer if the project becomes a custom temporal Sankey.** + +# Temporal Sankey concept + +Instead of constant-width links, let ribbon width vary with time. + +This produces a hybrid of: + +- Sankey; +- alluvial; +- streamgraph; +- timeline. + +That is a strong reason to keep population as a time series. + +# Filtering + +Recommended controls: + +### Geography + +- all; +- region; +- modern country. + +### Time + +- brush/slider; +- optional typed year range. + +### Width + +- equal; +- population; +- log population; +- square root population. + +### Layers + +- SEAIs; +- population uncertainty; +- modern-country lanes; +- succession links; +- selected ancestry/descendency only. + +# Inspector behavior + +Selecting a Box should show: + +- name; +- dates; +- region/span; +- source color; +- population at selected date; +- low/high estimate; +- population method; +- confidence; +- SEAIs; +- notes; +- Wikipedia link. + +Selecting a SEAI should show name, year, parent box, icon type, notes, and Wikipedia link. + +# Visual uncertainty + +Possible future encodings: + +- dotted outline for uncertain boundaries; +- translucent population bands for low/high; +- warning glyph for low-confidence transcription; +- approximate-date prefix preserved in labels. + +# Accessibility + +- selection should not depend on hover; +- interactive marks should be keyboard reachable where practical; +- inspector should mirror tooltip information; +- color should not be the sole encoding. + +# First prototype success criteria + +The first prototype is successful if it can: + +1. load generated static JSON; +2. render a chronological Sankey/alluvial subset; +3. render a simple timeline; +4. select a box in either view; +5. update a shared inspector; +6. filter by region; +7. switch width basis between equal and placeholder population mode; +8. deploy with no server-side component. diff --git a/index.html b/index.html index efb40bc..11ef4d5 100644 --- a/index.html +++ b/index.html @@ -1 +1,36 @@ -Hello cruel World + + + + + +World History Explorer + + + + +

World History Explorer

+

Under construction — data intake in progress.

+

+ This site will become an interactive, static visualization of world history, + based on the ChartOrigin Timeline of World History poster: a synchronized + timeline, alluvial/Sankey succession view, and inspector panel driven by generated + JSON in data/. +

+

+ See docs/IMPLEMENTATION_PLAN.md for the build plan and + docs/STATUS.md for current data coverage. +

+ + diff --git a/js/README.md b/js/README.md new file mode 100644 index 0000000..f87437e --- /dev/null +++ b/js/README.md @@ -0,0 +1,5 @@ +# js/ + +Plain modular JavaScript for the static site. Planned modules: `data.js` +(loading), `timeline.js`, `sankey.js`, `app.js` (shared state/wiring). See +`docs/IMPLEMENTATION_PLAN.md` Phase 2. diff --git a/source/world_history_chart_dataset_v2.xlsx b/source/world_history_chart_dataset_v2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2553210ea90750a981279f9cd45e31f9202685eb GIT binary patch literal 77011 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 LEaaR(-Dw5@2gC0z literal 0 HcmV?d00001 diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..25511f2 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,10 @@ +# tools/ + +Build-time scripts only. Nothing here runs in production. + +Planned: + +- `build_data.py` — reads `source/*.xlsx`, validates it, and writes `data/*.json`. +- `validate_data.py` — standalone validation pass (duplicate IDs, broken foreign keys, malformed years, invalid population ranges, unknown relation types). + +See `docs/IMPLEMENTATION_PLAN.md` Phase 1. From bfefe0bd7d8f00822f7500a126f97897fd75247f Mon Sep 17 00:00:00 2001 From: erikson1970 Date: Sun, 6 Sep 2026 18:01:35 -0400 Subject: [PATCH 02/22] Close out Milestone 0 council review - Three-lens council review (data integrity, static-site architecture, process/docs consistency) found no gatekeeper issues. - Fix process/docs reviewer's nits inline: ISSUES.md severity field now uses the declared enum consistently, every issue has an explicit Status field, file a new minor ISSUE-005 for the 6 Boxes rows with no start_year (benign, documented poster-illegibility gap). - Clarify AGENTS.md milestone review process: define 'milestone branch', require a minimum of 3 review lenses including process/docs consistency, specify who reconciles findings and the expected report format. - Ignore .serena/ entirely (tool-local metadata, was partially untracked). - Record council verdicts in ISSUES.md and TRACEABILITY.md. --- .gitignore | 6 ++---- AGENTS.md | 43 +++++++++++++++++++++++++++++++------------ ISSUES.md | 27 ++++++++++++++++++++++++++- TRACEABILITY.md | 7 +++++++ 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 86487ae..e97f437 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,5 @@ __pycache__/ .venv/ venv/ -# Serena project cache/local config (kept out of version control by its own -# .serena/.gitignore too; this covers the top-level entry point) -.serena/cache/ -.serena/project.local.yml +# Serena MCP tool metadata (local dev-tool state, not project content) +.serena/ diff --git a/AGENTS.md b/AGENTS.md index 7c52b7d..c02a744 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -156,18 +156,37 @@ Do not attempt to perfect every historical region before producing a working vis ## Milestone review process -Before merging a milestone branch to `main`, close out the milestone by -instantiating a small **council of experts**: independent reviewers (each a -subagent with a distinct lens — e.g. data integrity, architecture/static-site -constraints, accessibility/visualization semantics) who each check the -milestone's stated goal against the actual repo state and report findings. - -- Feed the council the milestone's requirements (from `TRACEABILITY.md`/this - file) and the current diff/state — not just a summary. -- Reconcile their findings into `ISSUES.md` (new issues) and - `TRACEABILITY.md` (status updates) before deciding to merge. -- A milestone can close with tabled minor issues; it should not close with - open gatekeeper issues. +A **milestone branch** is one that closes out a numbered phase/milestone from +`docs/IMPLEMENTATION_PLAN.md` or `TRACEABILITY.md` (e.g. `feature/repo-reset` +for Milestone 0). Small `fix/` branches for sub-tasks within a milestone +don't need their own council; only the milestone-closing merge to `main` does. + +Before that merge, close out the milestone by instantiating a small **council +of experts**: independent reviewers (each a subagent with a distinct lens) +who check the milestone's stated goal against the actual repo state — not a +summary of it — and report findings. At minimum, run: + +1. a **data/content integrity** lens (whatever the milestone touched: + workbook, generated JSON, etc.); +2. an **architecture/static-site constraints** lens (this file's Project + intent constraints, recommended structure, no leftover disposable + content); +3. a **process & documentation consistency** lens (do `ISSUES.md` and + `TRACEABILITY.md` cross-reference each other correctly, do stated file + paths actually resolve, is anything stale) — do not skip this one; it has + caught real issues that the other two lenses miss. + +Whoever drives the merge (the session/agent orchestrating the milestone) +reconciles the council's findings into `ISSUES.md` (new issues, filed at the +correct severity) and `TRACEABILITY.md` (status updates), and fixes cheap +wording/process nits inline rather than filing them. Each reviewer should +report a `VERDICT: PASS | PASS_WITH_MINOR_ISSUES | FAIL` plus a `FINDINGS` +list tagged `[gatekeeper]` or `[minor]`, citing concrete evidence (file +paths, counts, quoted lines) rather than impressions. + +A milestone can close with tabled minor issues; it should not close with +open gatekeeper issues, and a `FAIL` verdict from any reviewer blocks the +merge until resolved or the finding is reclassified with stated reasoning. ## Definition of done for v0.1 diff --git a/ISSUES.md b/ISSUES.md index 369b85e..511d973 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -21,24 +21,28 @@ _(none yet — see Tabled below)_ ### ISSUE-001 — `Regions` rows lack a unique per-row identifier - **Severity:** Minor +- **Status:** Tabled - **Source:** `docs/DATA_MODEL.md`, workbook `Regions` sheet - **Description:** `region_id` is a grouping key shared by every country row in a region (e.g. `NE_SCAND` repeats once per country), not a unique row key. Fine for filtering today; will need a real per-row key (or a composite `region_id`+`country`) if `Regions` grows into real historical timelines per Phase 8. - **Deferred until:** Phase 8 (region expansion) or whenever a `Regions`-keyed foreign key is needed. ### ISSUE-002 — All `Boxes`/`SEAIs` URLs are still the TODO placeholder - **Severity:** Minor +- **Status:** Tabled - **Source:** `docs/STATUS.md` - **Description:** Confirmed by validation: 198/198 `Boxes` rows and 83/83 `SEAIs` rows currently hold `https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals`. Expected at this stage; tracked here so it isn't mistaken for a data bug later. - **Deferred until:** "Add real Wikipedia URLs gradually" (STATUS.md recommended next work, priority 4). ### ISSUE-003 — `Population` table has zero filled estimates - **Severity:** Minor +- **Status:** Tabled - **Source:** `docs/STATUS.md` - **Description:** All 390 seeded knot-point rows have no `population` value yet, by design (values intentionally not invented). No width-by-population rendering is possible until a representative subset is filled. - **Deferred until:** Phase 6 (population experiment); STATUS.md's recommended first-subset list (Roman, Byzantine, Persian, Ottoman, major Chinese dynasties, etc.). ### ISSUE-004 — `Links` and `BoxSegments` tables do not exist yet - **Severity:** Minor +- **Status:** Tabled - **Source:** `docs/DATA_MODEL.md`, `docs/STATUS.md` - **Description:** No succession/relationship data and no per-country-lane segmentation exist yet. Alluvial/Sankey view and accurate multi-country boxes (Rome, Ottomans, etc.) are blocked on these. - **Deferred until:** Phase 3 (`Links`, minimal subset) and Phase 7 (`BoxSegments`). @@ -46,6 +50,27 @@ _(none yet — see Tabled below)_ ## Resolved ### ISSUE-000 — Repo contained an unrelated portfolio template and stray files -- **Severity:** was Gatekeeper for Milestone 0 +- **Severity:** Gatekeeper +- **Status:** Resolved - **Description:** `index.html` and `static/` held a generic "Portfolio template" theme (Lorem Ipsum, fake bios) unrelated to this project; `HotelList.txt` (personal hotel-search links) and `chat_log.md` (dead sandbox links from doc handoff) were also present. - **Resolution:** Removed `static/`, `HotelList.txt`, `chat_log.md`; replaced `index.html` with a minimal placeholder. Closed by Milestone 0 council review. + +### ISSUE-005 — Six `Boxes` rows have no `start_year` +- **Severity:** Minor +- **Status:** Tabled +- **Source:** Data-integrity council review of `source/world_history_chart_dataset_v2.xlsx` +- **Description:** A handful of "Indigenous Era" boxes (e.g. `US_INDIG`, `CA_INDIG`, `AR_INDIG`, `AU_INDIG`) have a null `start_year` because the poster prints an illegible "c. [BCE]" with no parseable number there. `end_year` is always present, and `DATA_MODEL.md`'s rule only requires `start_year <= end_year` "when both exist," so this is not a validation-rule violation — just an open transcription gap, consistent with STATUS.md limitation #2. +- **Resolution:** None yet. Left for whoever transcribes those boxes' start dates, or for the build script to render them with an explicit "unknown start" treatment. + +## Milestone council reviews + +### Milestone 0 — Repository reset & data intake +Reviewed 2026-09-06 against commit `3f84688` (branch `feature/repo-reset`), three lenses: + +| Reviewer | Verdict | +|---|---| +| Data integrity | PASS | +| Static-site architecture / constraints | PASS | +| Process & documentation consistency | PASS_WITH_MINOR_ISSUES | + +No gatekeeper findings. The process/docs reviewer's minor findings (severity-field enum drift on a resolved issue, no per-entry `Status:` field, ambiguity in `AGENTS.md`'s milestone-review process) were fixed inline in this document and in `AGENTS.md` rather than filed as separate issues. Milestone approved to merge to `main`. diff --git a/TRACEABILITY.md b/TRACEABILITY.md index 66208c5..6bf3b31 100644 --- a/TRACEABILITY.md +++ b/TRACEABILITY.md @@ -38,6 +38,13 @@ repo contents with a clean project structure and bring the source workbook in. | `Population.population` filled | 0/390 (expected — see ISSUE-003) | | Duplicate `Regions.region_id` | 5 groups repeat by design, one row per country (see ISSUE-001) | +### Milestone 0 council review + +Reviewed 2026-09-06 against commit `3f84688`: data integrity PASS, static-site +architecture/constraints PASS, process & documentation consistency +PASS_WITH_MINOR_ISSUES (wording/process nits, no gatekeeper findings — see +`ISSUES.md` § Milestone council reviews). Merged to `main`. + ## v0.1 definition of done (forward-looking; not yet in scope) Tracked here so later milestones can check items off against `AGENTS.md`'s From 74459d753d265c0fda9f37215f8184cde2005f56 Mon Sep 17 00:00:00 2001 From: erikson1970 Date: Sun, 6 Sep 2026 18:14:38 -0400 Subject: [PATCH 03/22] Milestone 1: data build pipeline (Phase 1) - Add tools/wh_data.py: shared workbook loader + validation, with an explicit ERROR (structural, fails build) vs WARNING (content-quality, reported only) severity split, documented back into docs/DATA_MODEL.md #8. - Add tools/build_data.py: source/*.xlsx -> data/*.json, refuses to write output when any ERROR-level problem is found. - Add tools/validate_data.py: same validation, report-only, no writes. - Verified against the real workbook: 198/83/390/89 rows load cleanly, 0 errors, 671 warnings (198+83 TODO URLs, 390 unfilled population rows -- all expected per docs/STATUS.md). - Verified the failure path against a deliberately corrupted copy of the workbook (duplicate box_id, invalid color_hex, cascading FK break): build exits 1 and writes nothing. - Commit generated data/boxes.json, data/seais.json, data/population.json, data/regions.json -- the static site has no build step in production, so these are checked in like any other build artifact. - File ISSUE-006 (no automated test suite yet) and update TRACEABILITY.md with Milestone 1's requirement closure table. --- ISSUES.md | 7 + TRACEABILITY.md | 20 + data/README.md | 16 +- data/boxes.json | 3566 ++++++++++++++++++ data/population.json | 7802 ++++++++++++++++++++++++++++++++++++++++ data/regions.json | 625 ++++ data/seais.json | 1413 ++++++++ docs/DATA_MODEL.md | 10 + tools/README.md | 29 +- tools/build_data.py | 77 + tools/requirements.txt | 1 + tools/validate_data.py | 53 + tools/wh_data.py | 266 ++ 13 files changed, 13876 insertions(+), 9 deletions(-) create mode 100644 data/boxes.json create mode 100644 data/population.json create mode 100644 data/regions.json create mode 100644 data/seais.json create mode 100644 tools/build_data.py create mode 100644 tools/requirements.txt create mode 100644 tools/validate_data.py create mode 100644 tools/wh_data.py diff --git a/ISSUES.md b/ISSUES.md index 511d973..d7225a8 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -47,6 +47,13 @@ _(none yet — see Tabled below)_ - **Description:** No succession/relationship data and no per-country-lane segmentation exist yet. Alluvial/Sankey view and accurate multi-country boxes (Rome, Ottomans, etc.) are blocked on these. - **Deferred until:** Phase 3 (`Links`, minimal subset) and Phase 7 (`BoxSegments`). +### ISSUE-006 — No automated test suite for `tools/wh_data.py` +- **Severity:** Minor +- **Status:** Tabled +- **Source:** Milestone 1 implementation +- **Description:** `build_data.py`/`validate_data.py` were exercised manually against the real workbook and against a deliberately corrupted copy (duplicate `box_id`, invalid `color_hex`, cascading FK break) to confirm the ERROR path genuinely blocks output. There's no repeatable test file for this yet. +- **Deferred until:** whenever the validation logic grows complex enough that manual spot-checks stop being sufficient, or before a CI step is added. + ## Resolved ### ISSUE-000 — Repo contained an unrelated portfolio template and stray files diff --git a/TRACEABILITY.md b/TRACEABILITY.md index 6bf3b31..6cbda97 100644 --- a/TRACEABILITY.md +++ b/TRACEABILITY.md @@ -45,6 +45,26 @@ architecture/constraints PASS, process & documentation consistency PASS_WITH_MINOR_ISSUES (wording/process nits, no gatekeeper findings — see `ISSUES.md` § Milestone council reviews). Merged to `main`. +## Milestone 1 — Data build pipeline + +Goal (`docs/IMPLEMENTATION_PLAN.md` Phase 1): convert the Excel workbook to +validated JSON, failing the build on structural problems and warning on +content-quality issues. + +| Req | Requirement | Source | Status | Evidence | +|---|---|---|---|---| +| M1-1 | Build script reads `source/*.xlsx`, writes `data/*.json` | README.md § Data authority, IMPLEMENTATION_PLAN.md Phase 1 | Met | `tools/build_data.py`; run produces `data/{boxes,seais,population,regions}.json` | +| M1-2 | Fails on duplicate IDs | IMPLEMENTATION_PLAN.md Phase 1 | Met | `wh_data.py` `validate_boxes`/`validate_seais`/`validate_population`; verified against an injected duplicate `box_id` (exit 1, no output written) | +| M1-3 | Fails on broken foreign keys | IMPLEMENTATION_PLAN.md Phase 1 | Met | `SEAIs.box_id`/`Population.box_id` checked against `Boxes`; verified via injected corruption (cascading FK errors correctly detected) | +| M1-4 | Fails on malformed years | IMPLEMENTATION_PLAN.md Phase 1 | Met | numeric-type check on all year fields | +| M1-5 | Fails on invalid population ranges | IMPLEMENTATION_PLAN.md Phase 1 | Met | `population > 0`, `low <= population <= high` | +| M1-6 | Fails on unknown relation types | IMPLEMENTATION_PLAN.md Phase 1 | Not started | No `Links` table exists yet (tracked as ISSUE-004); nothing to validate until Phase 3 | +| M1-7 | Warns on TODO URLs, missing population, low-confidence records, suspicious dates | IMPLEMENTATION_PLAN.md Phase 1 | Met | Verified: real workbook run produces exactly 671 warnings (198 Box + 83 SEAI TODO URLs, 390 unfilled Population rows), 0 errors | +| M1-8 | `data/*.json` reproducible from `source/*.xlsx`, never hand-edited | AGENTS.md § Source of truth | Met | `data/README.md` states the rule; build overwrites deterministically on every run | +| M1-9 | No runtime Python — build-time only | AGENTS.md § Project intent | Met | `tools/` scripts run only at build time; no Python referenced from `index.html`/`js/` | + +Council review: not yet run for this milestone — pending before merge to `main`. + ## v0.1 definition of done (forward-looking; not yet in scope) Tracked here so later milestones can check items off against `AGENTS.md`'s diff --git a/data/README.md b/data/README.md index aef5d1f..ee895e1 100644 --- a/data/README.md +++ b/data/README.md @@ -1,8 +1,14 @@ # data/ -Generated output only. Everything here must be reproducible from `source/*.xlsx` -via `tools/build_data.py`. Do not hand-edit files in this directory — fix the -workbook or the build script instead. +Generated output only. Everything here is produced by `tools/build_data.py` +from `source/*.xlsx` and must be reproducible from it. Do not hand-edit files +in this directory — fix the workbook or the build script instead, then +regenerate: -Planned outputs: `boxes.json`, `seais.json`, `population.json`, `regions.json`, -and later `links.json`, `box-segments.json`. +``` +python3 tools/build_data.py +``` + +Current outputs: `boxes.json`, `seais.json`, `population.json`, `regions.json`. +Later: `links.json`, `box-segments.json` once those tables exist in the +workbook (see `docs/DATA_MODEL.md` #5–#6). diff --git a/data/boxes.json b/data/boxes.json new file mode 100644 index 0000000..1690fd1 --- /dev/null +++ b/data/boxes.json @@ -0,0 +1,3566 @@ +[ + { + "box_id": "US_INDIG", + "box_name": "Indigenous Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": 1607, + "start_label": "c. BCE", + "end_label": "1607", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "United States", + "span_count": 1, + "span_start": "United States", + "span_end": "United States", + "region_group": "Americas", + "notes": "The chart prints 'c. BCE' without a legible/visible number at the top of this box.", + "confidence": "Medium" + }, + { + "box_id": "US_COLONIAL", + "box_name": "Colonial America", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1607, + "end_year": 1776, + "start_label": "1607", + "end_label": "1776", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "United States", + "span_count": 1, + "span_start": "United States", + "span_end": "United States", + "region_group": "Americas", + "notes": null, + "confidence": "High" + }, + { + "box_id": "US_MODERN", + "box_name": "United States", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1776, + "end_year": 2026, + "start_label": "1776", + "end_label": "Present", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "United States", + "span_count": 1, + "span_start": "United States", + "span_end": "United States", + "region_group": "Americas", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "CA_INDIG", + "box_name": "Indigenous Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": 1608, + "start_label": "c. BCE", + "end_label": "1608", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Canada", + "span_count": 1, + "span_start": "Canada", + "span_end": "Canada", + "region_group": "Americas", + "notes": "The chart prints 'c. BCE' without a legible/visible number at the top of this box.", + "confidence": "Medium" + }, + { + "box_id": "CA_COLONIAL", + "box_name": "Colonial Canada", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1608, + "end_year": 1867, + "start_label": "1608", + "end_label": "1867", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Canada", + "span_count": 1, + "span_start": "Canada", + "span_end": "Canada", + "region_group": "Americas", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CA_MODERN", + "box_name": "Canada", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1867, + "end_year": 2026, + "start_label": "1867", + "end_label": "Present", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Canada", + "span_count": 1, + "span_start": "Canada", + "span_end": "Canada", + "region_group": "Americas", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2000, + "end_year": 1521, + "start_label": "c. 2000 BCE", + "end_label": "1521", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Mexico", + "span_count": 1, + "span_start": "Mexico", + "span_end": "Mexico", + "region_group": "Americas", + "notes": null, + "confidence": "High" + }, + { + "box_id": "LATAM_COLONIAL", + "box_name": "Colonial Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1500, + "end_year": 1821, + "start_label": "1500 / 1521", + "end_label": "1816 / 1821", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Mexico; Argentina", + "span_count": 2, + "span_start": "Mexico", + "span_end": "Argentina", + "region_group": "Americas", + "notes": "Step-shaped shared box: Argentina segment is approximately 1500–1816; Mexico segment 1521–1821.", + "confidence": "High" + }, + { + "box_id": "MX_MODERN", + "box_name": "Mexico", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1821, + "end_year": 2026, + "start_label": "1821", + "end_label": "Present", + "color_name": "green", + "color_hex": "#60B787", + "span": "Mexico", + "span_count": 1, + "span_start": "Mexico", + "span_end": "Mexico", + "region_group": "Americas", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "AR_INDIG", + "box_name": "Indigenous Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": 1500, + "start_label": "c. BCE", + "end_label": "1500", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Argentina", + "span_count": 1, + "span_start": "Argentina", + "span_end": "Argentina", + "region_group": "Americas", + "notes": "Mapuche & other Indigenous cultures; top date is printed only as 'c. BCE'.", + "confidence": "Medium" + }, + { + "box_id": "AR_MODERN", + "box_name": "Argentina", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1816, + "end_year": 2026, + "start_label": "1816", + "end_label": "Present", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Argentina", + "span_count": 1, + "span_start": "Argentina", + "span_end": "Argentina", + "region_group": "Americas", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "AU_INDIG", + "box_name": "Indigenous Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": 1788, + "start_label": "c. BCE", + "end_label": "1788", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Australia", + "span_count": 1, + "span_start": "Australia", + "span_end": "Australia", + "region_group": "Oceania", + "notes": "Aboriginal and Torres Strait Islander cultures; top date is printed only as 'c. BCE'.", + "confidence": "Medium" + }, + { + "box_id": "AU_COLONIAL", + "box_name": "Colonial Australia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1788, + "end_year": 1901, + "start_label": "1788", + "end_label": "1901", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Australia", + "span_count": 1, + "span_start": "Australia", + "span_end": "Australia", + "region_group": "Oceania", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AU_MODERN", + "box_name": "Australia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1901, + "end_year": 2026, + "start_label": "1901", + "end_label": "Present", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Australia", + "span_count": 1, + "span_start": "Australia", + "span_end": "Australia", + "region_group": "Oceania", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "UK_CELTIC", + "box_name": "Celtic Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": 43, + "start_label": "c. BCE", + "end_label": "43", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": "Top date is printed as 'c. BCE' with no legible number in the supplied image.", + "confidence": "Medium" + }, + { + "box_id": "UK_SUBROMAN", + "box_name": "Sub-Roman Britain", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 410, + "end_year": 500, + "start_label": "410", + "end_label": "500", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_ANGLOSAXON", + "box_name": "Anglo-Saxon Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 500, + "end_year": 829, + "start_label": "500", + "end_label": "829", + "color_name": "green", + "color_hex": "#60B787", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_WESSEX", + "box_name": "Wessex Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 829, + "end_year": 1066, + "start_label": "829", + "end_label": "1066", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_NORMAN", + "box_name": "Norman Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1066, + "end_year": 1154, + "start_label": "1066", + "end_label": "1154", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_PLANTAGENET", + "box_name": "Plantagenet Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1154, + "end_year": 1485, + "start_label": "1154", + "end_label": "1485", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_TUDOR", + "box_name": "Tudor Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1485, + "end_year": 1603, + "start_label": "1485", + "end_label": "1603", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_STUART", + "box_name": "Stuart Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1603, + "end_year": 1714, + "start_label": "1603", + "end_label": "1714", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1714, + "end_year": 1917, + "start_label": "1714", + "end_label": "1917", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "UK_MODERN", + "box_name": "United Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1917, + "end_year": 2026, + "start_label": "1917", + "end_label": "Present", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "United Kingdom", + "span_count": 1, + "span_start": "United Kingdom", + "span_end": "United Kingdom", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "PT_TRIBES", + "box_name": "Lusitanians and Other Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -600, + "end_year": -218, + "start_label": "c. 600 BCE", + "end_label": "218 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IBERIA_VISIGOTH", + "box_name": "Visigothic Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 418, + "end_year": 711, + "start_label": "418", + "end_label": "711", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Portugal; Spain", + "span_count": 2, + "span_start": "Portugal", + "span_end": "Spain", + "region_group": "Europe", + "notes": "The Suebi Kingdom overlays part of the Portuguese/northwestern Iberian portion until 585.", + "confidence": "High" + }, + { + "box_id": "PT_SUEBI", + "box_name": "Suebi Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 409, + "end_year": 585, + "start_label": "409", + "end_label": "585", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Portugal; Spain", + "span_count": 2, + "span_start": "Portugal", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IBERIA_ALANDALUS", + "box_name": "Al-Andalus", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 711, + "end_year": 1238, + "start_label": "711", + "end_label": "1238", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Portugal; Spain", + "span_count": 2, + "span_start": "Portugal", + "span_end": "Spain", + "region_group": "Europe", + "notes": "The chart shows this concurrently with Christian Iberian kingdoms; 1238 is the visible boundary with Late Reconquista.", + "confidence": "High" + }, + { + "box_id": "PT_COUNTY1", + "box_name": "First County of Portugal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 868, + "end_year": 1095, + "start_label": "868", + "end_label": "1095", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_COUNTY2", + "box_name": "Second County of Portugal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1095, + "end_year": 1139, + "start_label": "1095", + "end_label": "1139", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1139, + "end_year": 1580, + "start_label": "1139", + "end_label": "1580", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_IBERIAN_UNION", + "box_name": "Iberian Union", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1580, + "end_year": 1640, + "start_label": "1580", + "end_label": "1640", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Portugal; Spain", + "span_count": 2, + "span_start": "Portugal", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_RESTORED", + "box_name": "Restored Kingdom of Portugal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1640, + "end_year": 1807, + "start_label": "1640", + "end_label": "1807", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_CONST_MON", + "box_name": "Constitutional Monarchy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1807, + "end_year": 1910, + "start_label": "1807", + "end_label": "1910", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_FIRST_REP", + "box_name": "First Portuguese Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1910, + "end_year": 1933, + "start_label": "1910", + "end_label": "1933", + "color_name": "green", + "color_hex": "#60B787", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_ESTADO_NOVO", + "box_name": "Estado Novo", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1933, + "end_year": 1976, + "start_label": "1933", + "end_label": "1976", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PT_MODERN", + "box_name": "Portugal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1976, + "end_year": 2026, + "start_label": "1976", + "end_label": "Present", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Portugal", + "span_count": 1, + "span_start": "Portugal", + "span_end": "Portugal", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "ES_IBERIAN", + "box_name": "Iberian & Celtic Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1200, + "end_year": -241, + "start_label": "c. 1200 BCE", + "end_label": "241 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_CARTHAGE", + "box_name": "Carthaginian Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -241, + "end_year": -218, + "start_label": "241 BCE", + "end_label": "218 BCE", + "color_name": "green", + "color_hex": "#60B787", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_ASTURIAS", + "box_name": "Kingdom of Asturias", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 718, + "end_year": 910, + "start_label": "718", + "end_label": "910", + "color_name": "green", + "color_hex": "#60B787", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_LEON", + "box_name": "Kingdom of León", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 910, + "end_year": 1238, + "start_label": "910", + "end_label": "1238", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_LATE_RECON", + "box_name": "Late Reconquista", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1238, + "end_year": 1479, + "start_label": "1238", + "end_label": "1479", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_UNIFICATION", + "box_name": "Unification of Spain", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1479, + "end_year": 1516, + "start_label": "1479", + "end_label": "1516", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_HABSBURG", + "box_name": "Habsburg Spain", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1516, + "end_year": 1700, + "start_label": "1516", + "end_label": "1700", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_BOURBON_REFORMS", + "box_name": "Bourbon Reforms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1700, + "end_year": 1808, + "start_label": "1700", + "end_label": "1808", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_CONSTITUTIONAL", + "box_name": "Constitutional Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1808, + "end_year": 1939, + "start_label": "1808", + "end_label": "1939", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_FRANCO", + "box_name": "Francoist Spain", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1939, + "end_year": 1978, + "start_label": "1939", + "end_label": "1978", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ES_MODERN", + "box_name": "Spain", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1978, + "end_year": 2026, + "start_label": "1978", + "end_label": "Present", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain", + "span_count": 1, + "span_start": "Spain", + "span_end": "Spain", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "FR_GAUL", + "box_name": "Gaul", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -800, + "end_year": -58, + "start_label": "c. 800 BCE", + "end_label": "58 BCE", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_FRANKISH", + "box_name": "Frankish Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 481, + "end_year": 843, + "start_label": "481", + "end_label": "843", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_WEST_FRANCIA", + "box_name": "West Francia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 843, + "end_year": 987, + "start_label": "843", + "end_label": "987", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_KINGDOM", + "box_name": "Kingdom of France", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 987, + "end_year": 1589, + "start_label": "987", + "end_label": "1589", + "color_name": "green", + "color_hex": "#60B787", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_BOURBON", + "box_name": "Bourbon France", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1589, + "end_year": 1792, + "start_label": "1589", + "end_label": "1792", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_UNNAMED_1792", + "box_name": "[Unlabeled France segment]", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1792, + "end_year": 1804, + "start_label": "1792", + "end_label": "1804", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": "Very thin teal segment; the supplied image shows the 1792 date and milestone #14 but no legible box name.", + "confidence": "Medium" + }, + { + "box_id": "NAPOLEON", + "box_name": "First French Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1804, + "end_year": 1815, + "start_label": "1804", + "end_label": "1815", + "color_name": "black", + "color_hex": "#151515", + "span": "Portugal; Spain; France; Italy; Germany", + "span_count": 5, + "span_start": "Portugal", + "span_end": "Germany", + "region_group": "Europe", + "notes": "Irregular/step-shaped occupation band; edge labels vary by modern-country column (e.g. 1807 Portugal, 1808 Spain, 1805 Italy, 1806 Germany).", + "confidence": "High" + }, + { + "box_id": "FR_REPUBLICAN", + "box_name": "Republican France", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1815, + "end_year": 1946, + "start_label": "1815", + "end_label": "1946", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "FR_MODERN", + "box_name": "France", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1946, + "end_year": 2026, + "start_label": "1946", + "end_label": "Present", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "France", + "span_count": 1, + "span_start": "France", + "span_end": "France", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "IT_ITALIC", + "box_name": "Italic Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1200, + "end_year": -753, + "start_label": "c. 1200 BCE", + "end_label": "753 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_ROMAN_KINGDOM", + "box_name": "Roman Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -753, + "end_year": -509, + "start_label": "753 BCE", + "end_label": "509 BCE", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_OSTROGOTH", + "box_name": "Ostrogothic Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 493, + "end_year": 553, + "start_label": "493", + "end_label": "553", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_BYZANTINE", + "box_name": "Byzantine Italy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 553, + "end_year": 774, + "start_label": "553", + "end_label": "774", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_LOMBARD", + "box_name": "Lombard Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 568, + "end_year": 774, + "start_label": "568", + "end_label": "774", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_MEDIEVAL_STATES", + "box_name": "Medieval Italian States", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 774, + "end_year": 1494, + "start_label": "774", + "end_label": "1494", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_SICILY", + "box_name": "Kingdom of Sicily", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1130, + "end_year": 1816, + "start_label": "1130", + "end_label": "1816", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": "Shown concurrently with the Medieval Italian States / Age of Divided Italy in the same modern-country column.", + "confidence": "High" + }, + { + "box_id": "IT_DIVIDED", + "box_name": "Age of Divided Italy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1494, + "end_year": 1805, + "start_label": "1494", + "end_label": "1805", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_BOURBON_SICILY", + "box_name": "Bourbon Sicily", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1816, + "end_year": 1861, + "start_label": "1816", + "end_label": "1861", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_KINGDOM", + "box_name": "Kingdom of Italy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1861, + "end_year": 1946, + "start_label": "1861", + "end_label": "1946", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IT_MODERN", + "box_name": "Italy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1946, + "end_year": 2026, + "start_label": "1946", + "end_label": "Present", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Italy", + "span_count": 1, + "span_start": "Italy", + "span_end": "Italy", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "DE_TRIBES", + "box_name": "Celtic & Germanic Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -800, + "end_year": 406, + "start_label": "c. 800 BCE", + "end_label": "406", + "color_name": "green", + "color_hex": "#60B787", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_GERMANIC", + "box_name": "Germanic Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 406, + "end_year": 481, + "start_label": "406", + "end_label": "481", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_MIGRATION", + "box_name": "Migration Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 481, + "end_year": 843, + "start_label": "481", + "end_label": "843", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Germany; Austria", + "span_count": 2, + "span_start": "Germany", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EAST_FRANCIA", + "box_name": "East Francia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 843, + "end_year": 962, + "start_label": "843", + "end_label": "962", + "color_name": "green", + "color_hex": "#60B787", + "span": "Germany; Austria", + "span_count": 2, + "span_start": "Germany", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 962, + "end_year": 1806, + "start_label": "962", + "end_label": "1806", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_PRUSSIA", + "box_name": "Kingdom of Prussia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1701, + "end_year": 1871, + "start_label": "1701", + "end_label": "1871", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": "Shown concurrently with the Holy Roman Empire until 1806 and the German Confederation after 1815.", + "confidence": "High" + }, + { + "box_id": "DE_CONFED", + "box_name": "German Confederation", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1815, + "end_year": 1871, + "start_label": "1815", + "end_label": "1871", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_EMPIRE", + "box_name": "German Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1871, + "end_year": 1919, + "start_label": "1871", + "end_label": "1919", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_WEIMAR", + "box_name": "Weimar Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1919, + "end_year": 1933, + "start_label": "1919", + "end_label": "1933", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_NAZI", + "box_name": "Nazi Germany", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1933, + "end_year": 1945, + "start_label": "1933", + "end_label": "1945", + "color_name": "black", + "color_hex": "#151515", + "span": "Germany; Austria", + "span_count": 2, + "span_start": "Germany", + "span_end": "Austria", + "region_group": "Europe", + "notes": "The black segment extends into the Austrian alignment for the Anschluss period.", + "confidence": "High" + }, + { + "box_id": "DE_EW", + "box_name": "East and West Germany", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1945, + "end_year": 1990, + "start_label": "1945", + "end_label": "1990", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "DE_MODERN", + "box_name": "Germany", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1990, + "end_year": 2026, + "start_label": "1990", + "end_label": "Present", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Germany", + "span_count": 1, + "span_start": "Germany", + "span_end": "Germany", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "AT_HALLSTATT", + "box_name": "Hallstatt Culture", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -800, + "end_year": -400, + "start_label": "c. 800 BCE", + "end_label": "c. 400 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_NORICUM", + "box_name": "Celtic Kingdom of Noricum", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -400, + "end_year": -16, + "start_label": "c. 400 BCE", + "end_label": "16 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_POSTROMAN", + "box_name": "Post-Roman Germanic Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 476, + "end_year": 568, + "start_label": "476", + "end_label": "568", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_BAVARIA", + "box_name": "Duchy of Bavaria", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 568, + "end_year": 788, + "start_label": "568", + "end_label": "788", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_MARGRAVIATE", + "box_name": "Margraviate of Austria", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 976, + "end_year": 1156, + "start_label": "976", + "end_label": "1156", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_DUCHY", + "box_name": "Duchy of Austria", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1156, + "end_year": 1453, + "start_label": "1156", + "end_label": "1453", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_HABSBURG", + "box_name": "Habsburg Austria", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1453, + "end_year": 1804, + "start_label": "1453", + "end_label": "1804", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_EMPIRE", + "box_name": "Austrian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1804, + "end_year": 1867, + "start_label": "1804", + "end_label": "1867", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_AH", + "box_name": "Austria-Hungary", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1867, + "end_year": 1918, + "start_label": "1867", + "end_label": "1918", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "AT_FIRST_REP", + "box_name": "First Austrian Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1918, + "end_year": 1938, + "start_label": "1918", + "end_label": "1938", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": "The 1938 end is inferred from the adjacent Nazi Germany/Anschluss band; the supplied crop shows 1918 clearly.", + "confidence": "Medium" + }, + { + "box_id": "AT_SECOND_REP", + "box_name": "Second Austrian Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1945, + "end_year": 1955, + "start_label": "1945", + "end_label": "1955", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": "Thin labeled segment between the wartime gap and the modern Austria box.", + "confidence": "Medium" + }, + { + "box_id": "AT_MODERN", + "box_name": "Austria", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1955, + "end_year": 2026, + "start_label": "1955", + "end_label": "Present", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Austria", + "span_count": 1, + "span_start": "Austria", + "span_end": "Austria", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "GR_AEGEAN", + "box_name": "Aegean Civilizations", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -3000, + "end_year": -1600, + "start_label": "c. 3000 BCE", + "end_label": "c. 1600 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_MYCENAEAN", + "box_name": "Mycenaean Civilization", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1600, + "end_year": -1100, + "start_label": "c. 1600 BCE", + "end_label": "c. 1100 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_DARK", + "box_name": "Greek Dark Age", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1100, + "end_year": -800, + "start_label": "c. 1100 BCE", + "end_label": "c. 800 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_CLASSICAL", + "box_name": "Classical Greek City-States", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -800, + "end_year": -338, + "start_label": "c. 800 BCE", + "end_label": "338 BCE", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_HELLENISTIC", + "box_name": "Hellenistic Age", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -323, + "end_year": -146, + "start_label": "323 BCE", + "end_label": "146 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_SUCCESSOR", + "box_name": "Greek Successor States", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1204, + "end_year": 1453, + "start_label": "1204", + "end_label": "1453", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_KINGDOM1", + "box_name": "Kingdom of Greece", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1832, + "end_year": 1924, + "start_label": "1832", + "end_label": "1924", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_REPUBLIC", + "box_name": "Greek Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1924, + "end_year": 1935, + "start_label": "1924", + "end_label": "1935", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_KINGDOM2", + "box_name": "Kingdom of Greece", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1935, + "end_year": 1973, + "start_label": "1935", + "end_label": "1973", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "GR_MODERN", + "box_name": "Greece", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1973, + "end_year": 2026, + "start_label": "1973", + "end_label": "Present", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Greece", + "span_count": 1, + "span_start": "Greece", + "span_end": "Greece", + "region_group": "Europe", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "TR_HITTITE", + "box_name": "Hittite Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1700, + "end_year": -1200, + "start_label": "c. 1700 BCE", + "end_label": "c. 1200 BCE", + "color_name": "green", + "color_hex": "#60B787", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_NEOHITTITE", + "box_name": "Neo-Hittite Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1200, + "end_year": -700, + "start_label": "c. 1200 BCE", + "end_label": "c. 700 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_LYDIA", + "box_name": "Kingdom of Lydia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -700, + "end_year": -546, + "start_label": "c. 700 BCE", + "end_label": "546 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_HELLENISTIC", + "box_name": "Hellenistic Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -323, + "end_year": -133, + "start_label": "323 BCE", + "end_label": "133 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_LATIN", + "box_name": "Latin Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1204, + "end_year": 1261, + "start_label": "1204", + "end_label": "1261", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_RESTORED_BYZ", + "box_name": "Restored Byzantine Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1261, + "end_year": 1453, + "start_label": "1261", + "end_label": "1453", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_RUM", + "box_name": "Sultanate of Rum", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1077, + "end_year": 1308, + "start_label": "1077", + "end_label": "1308", + "color_name": "green", + "color_hex": "#60B787", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "TR_MODERN", + "box_name": "Turkey", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1923, + "end_year": 2026, + "start_label": "1923", + "end_label": "Present", + "color_name": "green", + "color_hex": "#60B787", + "span": "Turkey", + "span_count": 1, + "span_start": "Turkey", + "span_end": "Turkey", + "region_group": "Europe/Asia", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "ROMAN_REPUBLIC", + "box_name": "Roman Republic", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -509, + "end_year": -27, + "start_label": "509 BCE", + "end_label": "27 BCE", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Portugal; Spain; France; Italy; Greece; Turkey", + "span_count": 6, + "span_start": "Portugal", + "span_end": "Turkey", + "region_group": "Europe", + "notes": "Step-shaped expansion: the chart shows different entry dates by modern-country alignment (e.g. 218 BCE Iberia, 58 BCE Gaul, 146/133 BCE Greece/Anatolia).", + "confidence": "High" + }, + { + "box_id": "ROMAN_EMPIRE", + "box_name": "Roman Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -27, + "end_year": 410, + "start_label": "27 BCE", + "end_label": "395 / 406 / 410", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "United Kingdom; Portugal; Spain; France; Italy; Germany; Austria; Greece; Turkey; Egypt", + "span_count": 10, + "span_start": "United Kingdom", + "span_end": "Egypt", + "region_group": "Europe/Mediterranean", + "notes": "Large step-shaped box. The core split is labeled 395; peripheral country segments terminate at different dates, including 406 and 410.", + "confidence": "High" + }, + { + "box_id": "WESTERN_ROMAN", + "box_name": "Western Roman Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 395, + "end_year": 476, + "start_label": "395", + "end_label": "476", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Spain; France; Italy; Germany", + "span_count": 4, + "span_start": "Spain", + "span_end": "Germany", + "region_group": "Europe", + "notes": null, + "confidence": "High" + }, + { + "box_id": "BYZANTINE", + "box_name": "Byzantine Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 395, + "end_year": 1453, + "start_label": "395", + "end_label": "1453", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Greece; Turkey; Egypt", + "span_count": 3, + "span_start": "Greece", + "span_end": "Egypt", + "region_group": "Europe/Middle East", + "notes": "Step-shaped survival: Egypt exits to the Arab Caliphate in 641; Greek/Turkish segments continue through the medieval period.", + "confidence": "High" + }, + { + "box_id": "PERSIAN", + "box_name": "Persian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -550, + "end_year": -330, + "start_label": "550 / 546 / 539 / 525 BCE", + "end_label": "330 BCE", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "Turkey; Egypt; Iraq; Iran; Pakistan; India", + "span_count": 6, + "span_start": "Turkey", + "span_end": "India", + "region_group": "Middle East/South Asia", + "notes": "Step-shaped western expansion; chart entry dates vary by country alignment.", + "confidence": "High" + }, + { + "box_id": "MACEDONIAN", + "box_name": "Macedonian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -338, + "end_year": -323, + "start_label": "338 / 334 / 332 / 331 / 330 BCE", + "end_label": "323 BCE", + "color_name": "black", + "color_hex": "#151515", + "span": "Greece; Turkey; Egypt; Iraq; Iran; Pakistan; India", + "span_count": 7, + "span_start": "Greece", + "span_end": "India", + "region_group": "Europe/Middle East/South Asia", + "notes": "Thin black conquest band; dates vary along the horizontal extent.", + "confidence": "High" + }, + { + "box_id": "OTTOMAN", + "box_name": "Ottoman Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1308, + "end_year": 1923, + "start_label": "1308", + "end_label": "1832 / 1923", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Greece; Turkey; Egypt; Iraq", + "span_count": 4, + "span_start": "Greece", + "span_end": "Iraq", + "region_group": "Europe/Middle East", + "notes": "Large step-shaped box: Turkey segment begins around 1308 and ends 1923; Greece exits 1832; Egypt is shown to 1805; Iraq to 1921.", + "confidence": "High" + }, + { + "box_id": "EG_EARLY_DYN", + "box_name": "Early Dynastic Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -3100, + "end_year": -2686, + "start_label": "c. 3100 BCE", + "end_label": "2686 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_OLD", + "box_name": "Old Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2686, + "end_year": -2181, + "start_label": "2686 BCE", + "end_label": "2181 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_FIRST_INT", + "box_name": "First Intermediate Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2181, + "end_year": -2055, + "start_label": "2181 BCE", + "end_label": "2055 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_MIDDLE", + "box_name": "Middle Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2055, + "end_year": -1650, + "start_label": "2055 BCE", + "end_label": "1650 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_SECOND_INT", + "box_name": "Second Intermediate Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1650, + "end_year": -1550, + "start_label": "1650 BCE", + "end_label": "1550 BCE", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_NEW", + "box_name": "New Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1550, + "end_year": -1070, + "start_label": "1550 BCE", + "end_label": "1070 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_THIRD_INT", + "box_name": "Third Intermediate Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1070, + "end_year": -664, + "start_label": "1070 BCE", + "end_label": "664 BCE", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_LATE", + "box_name": "Late Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -664, + "end_year": -525, + "start_label": "664 BCE", + "end_label": "525 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_PTOLEMAIC", + "box_name": "Ptolemaic Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -305, + "end_year": -30, + "start_label": "305 BCE", + "end_label": "30 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_FATIMID", + "box_name": "Fatimid Caliphate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 969, + "end_year": 1171, + "start_label": "969", + "end_label": "1171", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_AYYUBID", + "box_name": "Ayyubid Sultanate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1171, + "end_year": 1250, + "start_label": "1171", + "end_label": "1250", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_MAMLUK", + "box_name": "Mamluk Sultanate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1250, + "end_year": 1517, + "start_label": "1250", + "end_label": "1517", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_MUHAMMAD_ALI", + "box_name": "Muhammad Ali Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1805, + "end_year": 1882, + "start_label": "1805", + "end_label": "1882", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_COLONIAL", + "box_name": "Colonial Egypt", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1882, + "end_year": 1922, + "start_label": "1882", + "end_label": "1922", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_KINGDOM", + "box_name": "Kingdom of Egypt", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1922, + "end_year": 1953, + "start_label": "1922", + "end_label": "1953", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": null, + "confidence": "High" + }, + { + "box_id": "EG_MODERN", + "box_name": "Egypt", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1953, + "end_year": 2026, + "start_label": "1953", + "end_label": "Present", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Egypt", + "span_count": 1, + "span_start": "Egypt", + "span_end": "Egypt", + "region_group": "Middle East/North Africa", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "IQ_SUMER", + "box_name": "Sumerian Civilization", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -4500, + "end_year": -2334, + "start_label": "c. 4500 BCE", + "end_label": "2334 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": "Box begins above the chart's 3000 BCE reference range.", + "confidence": "High" + }, + { + "box_id": "IQ_AKKAD", + "box_name": "Akkadian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2334, + "end_year": -2154, + "start_label": "2334 BCE", + "end_label": "2154 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_SUMER_REN", + "box_name": "Sumerian Renaissance", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2154, + "end_year": -1894, + "start_label": "2154 BCE", + "end_label": "1894 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_OLD_BAB", + "box_name": "Old Babylonian Kingdom", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1894, + "end_year": -1595, + "start_label": "1894 BCE", + "end_label": "1595 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_KASSITE", + "box_name": "Kassite Babylon", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1595, + "end_year": -1365, + "start_label": "1595 BCE", + "end_label": "1365 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_ASSYRIA", + "box_name": "Assyrian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1365, + "end_year": -625, + "start_label": "1365 BCE", + "end_label": "625 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_NEO_BAB", + "box_name": "Neo-Babylonian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -625, + "end_year": -539, + "start_label": "625 BCE", + "end_label": "539 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_ABBASID", + "box_name": "Abbasid Caliphate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 750, + "end_year": 1258, + "start_label": "750", + "end_label": "1258", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Iraq; Iran", + "span_count": 2, + "span_start": "Iraq", + "span_end": "Iran", + "region_group": "Middle East", + "notes": "Centered on Baghdad; the chart visually extends the blue Abbasid box across the Iraq/Iran alignment.", + "confidence": "High" + }, + { + "box_id": "IQ_IR_POST_ABB", + "box_name": "Post-Abbasid Regional Dynasties", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1258, + "end_year": 1501, + "start_label": "1258", + "end_label": "1501", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Iraq; Iran", + "span_count": 2, + "span_start": "Iraq", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_KINGDOM", + "box_name": "Kingdom of Iraq", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1921, + "end_year": 1958, + "start_label": "1921", + "end_label": "1958", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IQ_MODERN", + "box_name": "Iraq", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1958, + "end_year": 2026, + "start_label": "1958", + "end_label": "Present", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "Iraq", + "span_count": 1, + "span_start": "Iraq", + "span_end": "Iraq", + "region_group": "Middle East", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "IR_ELAM", + "box_name": "Elamite Civilization", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2700, + "end_year": -550, + "start_label": "c. 2700 BCE", + "end_label": "550 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_TRIBES", + "box_name": "Iranian Tribes", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1500, + "end_year": -678, + "start_label": "c. 1500 BCE", + "end_label": "678 BCE", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_MEDIAN", + "box_name": "Median Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -678, + "end_year": -550, + "start_label": "678 BCE", + "end_label": "550 BCE", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_SELEUCID", + "box_name": "Seleucid Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -312, + "end_year": -141, + "start_label": "312 BCE", + "end_label": "141 BCE", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Iraq; Iran", + "span_count": 2, + "span_start": "Iraq", + "span_end": "Iran", + "region_group": "Middle East", + "notes": "The Iranian portion transitions to Parthian rule earlier (247 BCE); 141 BCE is the later western boundary shown.", + "confidence": "High" + }, + { + "box_id": "IR_PARTHIAN", + "box_name": "Parthian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -247, + "end_year": 224, + "start_label": "247 / 141 BCE", + "end_label": "224", + "color_name": "green", + "color_hex": "#60B787", + "span": "Iraq; Iran", + "span_count": 2, + "span_start": "Iraq", + "span_end": "Iran", + "region_group": "Middle East", + "notes": "Step-shaped start: the Iranian segment begins 247 BCE; the western/Iraqi segment is labeled 141 BCE.", + "confidence": "High" + }, + { + "box_id": "IR_SASANIAN", + "box_name": "Sasanian Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 224, + "end_year": 651, + "start_label": "224", + "end_label": "651", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Iraq; Iran", + "span_count": 2, + "span_start": "Iraq", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "ARAB_CALIPHATE", + "box_name": "Arab Caliphate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 633, + "end_year": 969, + "start_label": "633 / 641 / 651", + "end_label": "750 / 969", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "Egypt; Iraq; Iran", + "span_count": 3, + "span_start": "Egypt", + "span_end": "Iran", + "region_group": "Middle East/North Africa", + "notes": "Step-shaped expansion and succession: 633/641/651 entry labels are visible; Abbasid rule begins 750 while the Egyptian red segment persists to the Fatimid transition in 969.", + "confidence": "High" + }, + { + "box_id": "IR_SAFAVID", + "box_name": "Safavid Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1501, + "end_year": 1736, + "start_label": "1501", + "end_label": "1736", + "color_name": "green", + "color_hex": "#60B787", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_AFSHARID", + "box_name": "Afsharid Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1736, + "end_year": 1796, + "start_label": "1736", + "end_label": "1796", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_QAJAR", + "box_name": "Qajar Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1796, + "end_year": 1925, + "start_label": "1796", + "end_label": "1925", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_PAHLAVI", + "box_name": "Pahlavi Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1925, + "end_year": 1979, + "start_label": "1925", + "end_label": "1979", + "color_name": "green", + "color_hex": "#60B787", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": null, + "confidence": "High" + }, + { + "box_id": "IR_MODERN", + "box_name": "Iran", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1979, + "end_year": 2026, + "start_label": "1979", + "end_label": "Present", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Iran", + "span_count": 1, + "span_start": "Iran", + "span_end": "Iran", + "region_group": "Middle East", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "SA_INDUS", + "box_name": "Indus Valley Civilization", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -3300, + "end_year": -1500, + "start_label": "c. 3300 BCE", + "end_label": "c. 1500 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_VEDIC", + "box_name": "Vedic Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1500, + "end_year": -550, + "start_label": "c. 1500 BCE", + "end_label": "c. 550 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_MAHAJANAPADAS", + "box_name": "Mahajanapadas", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -550, + "end_year": -322, + "start_label": "c. 550 BCE", + "end_label": "322 BCE", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": "Narrow vertical segment immediately before the Maurya Empire.", + "confidence": "High" + }, + { + "box_id": "SA_MAURYA", + "box_name": "Maurya Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -322, + "end_year": -185, + "start_label": "322 BCE", + "end_label": "185 BCE", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_POST_MAURYA", + "box_name": "Post-Mauryan Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -185, + "end_year": 320, + "start_label": "185 BCE", + "end_label": "320", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_GUPTA", + "box_name": "Gupta Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 320, + "end_year": 550, + "start_label": "320", + "end_label": "550", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_POST_GUPTA", + "box_name": "Post-Gupta Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 550, + "end_year": 606, + "start_label": "550", + "end_label": "606", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_HARSHA", + "box_name": "Harsha's Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 606, + "end_year": 647, + "start_label": "606", + "end_label": "647", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_REGIONAL", + "box_name": "Regional Kingdoms", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 647, + "end_year": 1206, + "start_label": "647", + "end_label": "1206", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_DELHI", + "box_name": "Delhi Sultanate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1206, + "end_year": 1526, + "start_label": "1206", + "end_label": "1526", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_MUGHAL", + "box_name": "Mughal Empire", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1526, + "end_year": 1858, + "start_label": "1526", + "end_label": "1858", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "SA_COLONIAL_INDIA", + "box_name": "Colonial India", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1858, + "end_year": 1947, + "start_label": "1858", + "end_label": "1947", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Pakistan; India", + "span_count": 2, + "span_start": "Pakistan", + "span_end": "India", + "region_group": "South Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "PK_MODERN", + "box_name": "Pakistan", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1947, + "end_year": 2026, + "start_label": "1947", + "end_label": "Present", + "color_name": "blue", + "color_hex": "#4FB0EC", + "span": "Pakistan", + "span_count": 1, + "span_start": "Pakistan", + "span_end": "Pakistan", + "region_group": "South Asia", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "IN_MODERN", + "box_name": "India", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1947, + "end_year": 2026, + "start_label": "1947", + "end_label": "Present", + "color_name": "light_blue", + "color_hex": "#8FBFEA", + "span": "India", + "span_count": 1, + "span_start": "India", + "span_end": "India", + "region_group": "South Asia", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "CN_LIANGZHU", + "box_name": "Liangzhu Culture", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -3000, + "end_year": -2070, + "start_label": "c. 3000 BCE", + "end_label": "c. 2070 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_XIA", + "box_name": "Xia Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -2070, + "end_year": -1600, + "start_label": "c. 2070 BCE", + "end_label": "c. 1600 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_SHANG", + "box_name": "Shang Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1600, + "end_year": -1046, + "start_label": "c. 1600 BCE", + "end_label": "1046 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_ZHOU", + "box_name": "Zhou Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -1046, + "end_year": -221, + "start_label": "1046 BCE", + "end_label": "221 BCE", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_QIN", + "box_name": "Qin Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -221, + "end_year": -202, + "start_label": "221 BCE", + "end_label": "202 BCE", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_HAN", + "box_name": "Han Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -202, + "end_year": 220, + "start_label": "202 BCE", + "end_label": "220", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_DIVISION", + "box_name": "Age of Division", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 220, + "end_year": 589, + "start_label": "220", + "end_label": "589", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_SUI", + "box_name": "Sui Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 589, + "end_year": 618, + "start_label": "589", + "end_label": "618", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_TANG", + "box_name": "Tang Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 618, + "end_year": 907, + "start_label": "618", + "end_label": "907", + "color_name": "red", + "color_hex": "#FF6F75", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_FIVE", + "box_name": "Five Dynasties Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 907, + "end_year": 960, + "start_label": "907", + "end_label": "960", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_SONG", + "box_name": "Song Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 960, + "end_year": 1271, + "start_label": "960", + "end_label": "1271", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_YUAN", + "box_name": "Yuan Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1271, + "end_year": 1368, + "start_label": "1271", + "end_label": "1368", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_MING", + "box_name": "Ming Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1368, + "end_year": 1644, + "start_label": "1368", + "end_label": "1644", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_QING", + "box_name": "Qing Dynasty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1644, + "end_year": 1912, + "start_label": "1644", + "end_label": "1912", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_REPUBLIC", + "box_name": "Republic of China", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1912, + "end_year": 1949, + "start_label": "1912", + "end_label": "1949", + "color_name": "orange", + "color_hex": "#FD9E3A", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "CN_MODERN", + "box_name": "China", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1949, + "end_year": 2026, + "start_label": "1949", + "end_label": "Present", + "color_name": "yellow", + "color_hex": "#FFD682", + "span": "China", + "span_count": 1, + "span_start": "China", + "span_end": "China", + "region_group": "East Asia", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + }, + { + "box_id": "JP_JOMON", + "box_name": "Jōmon Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": null, + "end_year": -300, + "start_label": "c. Prehistory", + "end_label": "c. 300 BCE", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": "The chart uses 'c. Prehistory' rather than a numeric start year.", + "confidence": "High" + }, + { + "box_id": "JP_YAYOI", + "box_name": "Yayoi Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": -300, + "end_year": 250, + "start_label": "c. 300 BCE", + "end_label": "250", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_YAMATO", + "box_name": "Yamato State", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 250, + "end_year": 710, + "start_label": "250", + "end_label": "710", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_NARA", + "box_name": "Nara Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 710, + "end_year": 794, + "start_label": "710", + "end_label": "794", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_HEIAN", + "box_name": "Heian Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 794, + "end_year": 1185, + "start_label": "794", + "end_label": "1185", + "color_name": "peach", + "color_hex": "#EDC7BF", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_KAMAKURA", + "box_name": "Kamakura Shogunate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1185, + "end_year": 1336, + "start_label": "1185", + "end_label": "1336", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_MUROMACHI", + "box_name": "Muromachi Shogunate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1336, + "end_year": 1467, + "start_label": "1336", + "end_label": "1467", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": "The small following Sengoku strip begins around 1467; the date is hard to read but consistent with the chart placement.", + "confidence": "Medium" + }, + { + "box_id": "JP_SENGOKU", + "box_name": "Sengoku Period", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1467, + "end_year": 1603, + "start_label": "c. 1467", + "end_label": "1603", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": "Thin strip; start year is partly obscured in the supplied image.", + "confidence": "Medium" + }, + { + "box_id": "JP_TOKUGAWA", + "box_name": "Tokugawa Shogunate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1603, + "end_year": 1868, + "start_label": "1603", + "end_label": "1868", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_MEIJI", + "box_name": "Meiji Era", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1868, + "end_year": 1912, + "start_label": "1868", + "end_label": "1912", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_EMPIRE", + "box_name": "Empire of Japan", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1912, + "end_year": 1947, + "start_label": "1912", + "end_label": "1947", + "color_name": "teal", + "color_hex": "#89DCCB", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": null, + "confidence": "High" + }, + { + "box_id": "JP_MODERN", + "box_name": "Japan", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "start_year": 1947, + "end_year": 2026, + "start_label": "1947", + "end_label": "Present", + "color_name": "green", + "color_hex": "#60B787", + "span": "Japan", + "span_count": 1, + "span_start": "Japan", + "span_end": "Japan", + "region_group": "East Asia", + "notes": "Present encoded as 2026 for plotting.", + "confidence": "High" + } +] diff --git a/data/population.json b/data/population.json new file mode 100644 index 0000000..31a0d38 --- /dev/null +++ b/data/population.json @@ -0,0 +1,7802 @@ +[ + { + "population_id": "US_INDIG:1607:end", + "box_id": "US_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": 1607, + "year_label": "1607", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "US_COLONIAL:1607:start", + "box_id": "US_COLONIAL", + "box_name": "Colonial America", + "segment_id": null, + "year": 1607, + "year_label": "1607", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "US_COLONIAL:1776:end", + "box_id": "US_COLONIAL", + "box_name": "Colonial America", + "segment_id": null, + "year": 1776, + "year_label": "1776", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "US_MODERN:1776:start", + "box_id": "US_MODERN", + "box_name": "United States", + "segment_id": null, + "year": 1776, + "year_label": "1776", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "US_MODERN:2026:end", + "box_id": "US_MODERN", + "box_name": "United States", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CA_INDIG:1608:end", + "box_id": "CA_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": 1608, + "year_label": "1608", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CA_COLONIAL:1608:start", + "box_id": "CA_COLONIAL", + "box_name": "Colonial Canada", + "segment_id": null, + "year": 1608, + "year_label": "1608", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CA_COLONIAL:1867:end", + "box_id": "CA_COLONIAL", + "box_name": "Colonial Canada", + "segment_id": null, + "year": 1867, + "year_label": "1867", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CA_MODERN:1867:start", + "box_id": "CA_MODERN", + "box_name": "Canada", + "segment_id": null, + "year": 1867, + "year_label": "1867", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CA_MODERN:2026:end", + "box_id": "CA_MODERN", + "box_name": "Canada", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "MX_INDIG:-2000:start", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": -2000, + "year_label": "c. 2000 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "MX_INDIG:1521:end", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": 1521, + "year_label": "1521", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "LATAM_COLONIAL:1500:start", + "box_id": "LATAM_COLONIAL", + "box_name": "Colonial Era", + "segment_id": null, + "year": 1500, + "year_label": "1500 / 1521", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "LATAM_COLONIAL:1821:end", + "box_id": "LATAM_COLONIAL", + "box_name": "Colonial Era", + "segment_id": null, + "year": 1821, + "year_label": "1816 / 1821", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "MX_MODERN:1821:start", + "box_id": "MX_MODERN", + "box_name": "Mexico", + "segment_id": null, + "year": 1821, + "year_label": "1821", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "MX_MODERN:2026:end", + "box_id": "MX_MODERN", + "box_name": "Mexico", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AR_INDIG:1500:end", + "box_id": "AR_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": 1500, + "year_label": "1500", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AR_MODERN:1816:start", + "box_id": "AR_MODERN", + "box_name": "Argentina", + "segment_id": null, + "year": 1816, + "year_label": "1816", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AR_MODERN:2026:end", + "box_id": "AR_MODERN", + "box_name": "Argentina", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AU_INDIG:1788:end", + "box_id": "AU_INDIG", + "box_name": "Indigenous Era", + "segment_id": null, + "year": 1788, + "year_label": "1788", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AU_COLONIAL:1788:start", + "box_id": "AU_COLONIAL", + "box_name": "Colonial Australia", + "segment_id": null, + "year": 1788, + "year_label": "1788", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AU_COLONIAL:1901:end", + "box_id": "AU_COLONIAL", + "box_name": "Colonial Australia", + "segment_id": null, + "year": 1901, + "year_label": "1901", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AU_MODERN:1901:start", + "box_id": "AU_MODERN", + "box_name": "Australia", + "segment_id": null, + "year": 1901, + "year_label": "1901", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AU_MODERN:2026:end", + "box_id": "AU_MODERN", + "box_name": "Australia", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_CELTIC:43:end", + "box_id": "UK_CELTIC", + "box_name": "Celtic Era", + "segment_id": null, + "year": 43, + "year_label": "43", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_SUBROMAN:410:start", + "box_id": "UK_SUBROMAN", + "box_name": "Sub-Roman Britain", + "segment_id": null, + "year": 410, + "year_label": "410", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_SUBROMAN:500:end", + "box_id": "UK_SUBROMAN", + "box_name": "Sub-Roman Britain", + "segment_id": null, + "year": 500, + "year_label": "500", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_ANGLOSAXON:500:start", + "box_id": "UK_ANGLOSAXON", + "box_name": "Anglo-Saxon Era", + "segment_id": null, + "year": 500, + "year_label": "500", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_ANGLOSAXON:829:end", + "box_id": "UK_ANGLOSAXON", + "box_name": "Anglo-Saxon Era", + "segment_id": null, + "year": 829, + "year_label": "829", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_WESSEX:829:start", + "box_id": "UK_WESSEX", + "box_name": "Wessex Dynasty", + "segment_id": null, + "year": 829, + "year_label": "829", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_WESSEX:1066:end", + "box_id": "UK_WESSEX", + "box_name": "Wessex Dynasty", + "segment_id": null, + "year": 1066, + "year_label": "1066", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_NORMAN:1066:start", + "box_id": "UK_NORMAN", + "box_name": "Norman Dynasty", + "segment_id": null, + "year": 1066, + "year_label": "1066", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_NORMAN:1154:end", + "box_id": "UK_NORMAN", + "box_name": "Norman Dynasty", + "segment_id": null, + "year": 1154, + "year_label": "1154", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_PLANTAGENET:1154:start", + "box_id": "UK_PLANTAGENET", + "box_name": "Plantagenet Dynasty", + "segment_id": null, + "year": 1154, + "year_label": "1154", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_PLANTAGENET:1485:end", + "box_id": "UK_PLANTAGENET", + "box_name": "Plantagenet Dynasty", + "segment_id": null, + "year": 1485, + "year_label": "1485", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_TUDOR:1485:start", + "box_id": "UK_TUDOR", + "box_name": "Tudor Dynasty", + "segment_id": null, + "year": 1485, + "year_label": "1485", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_TUDOR:1603:end", + "box_id": "UK_TUDOR", + "box_name": "Tudor Dynasty", + "segment_id": null, + "year": 1603, + "year_label": "1603", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_STUART:1603:start", + "box_id": "UK_STUART", + "box_name": "Stuart Dynasty", + "segment_id": null, + "year": 1603, + "year_label": "1603", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_STUART:1714:end", + "box_id": "UK_STUART", + "box_name": "Stuart Dynasty", + "segment_id": null, + "year": 1714, + "year_label": "1714", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_HANOVER:1714:start", + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "segment_id": null, + "year": 1714, + "year_label": "1714", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_HANOVER:1917:end", + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "segment_id": null, + "year": 1917, + "year_label": "1917", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_MODERN:1917:start", + "box_id": "UK_MODERN", + "box_name": "United Kingdom", + "segment_id": null, + "year": 1917, + "year_label": "1917", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "UK_MODERN:2026:end", + "box_id": "UK_MODERN", + "box_name": "United Kingdom", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_TRIBES:-600:start", + "box_id": "PT_TRIBES", + "box_name": "Lusitanians and Other Tribes", + "segment_id": null, + "year": -600, + "year_label": "c. 600 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_TRIBES:-218:end", + "box_id": "PT_TRIBES", + "box_name": "Lusitanians and Other Tribes", + "segment_id": null, + "year": -218, + "year_label": "218 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IBERIA_VISIGOTH:418:start", + "box_id": "IBERIA_VISIGOTH", + "box_name": "Visigothic Kingdom", + "segment_id": null, + "year": 418, + "year_label": "418", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IBERIA_VISIGOTH:711:end", + "box_id": "IBERIA_VISIGOTH", + "box_name": "Visigothic Kingdom", + "segment_id": null, + "year": 711, + "year_label": "711", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_SUEBI:409:start", + "box_id": "PT_SUEBI", + "box_name": "Suebi Kingdom", + "segment_id": null, + "year": 409, + "year_label": "409", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_SUEBI:585:end", + "box_id": "PT_SUEBI", + "box_name": "Suebi Kingdom", + "segment_id": null, + "year": 585, + "year_label": "585", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IBERIA_ALANDALUS:711:start", + "box_id": "IBERIA_ALANDALUS", + "box_name": "Al-Andalus", + "segment_id": null, + "year": 711, + "year_label": "711", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IBERIA_ALANDALUS:1238:end", + "box_id": "IBERIA_ALANDALUS", + "box_name": "Al-Andalus", + "segment_id": null, + "year": 1238, + "year_label": "1238", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_COUNTY1:868:start", + "box_id": "PT_COUNTY1", + "box_name": "First County of Portugal", + "segment_id": null, + "year": 868, + "year_label": "868", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_COUNTY1:1095:end", + "box_id": "PT_COUNTY1", + "box_name": "First County of Portugal", + "segment_id": null, + "year": 1095, + "year_label": "1095", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_COUNTY2:1095:start", + "box_id": "PT_COUNTY2", + "box_name": "Second County of Portugal", + "segment_id": null, + "year": 1095, + "year_label": "1095", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_COUNTY2:1139:end", + "box_id": "PT_COUNTY2", + "box_name": "Second County of Portugal", + "segment_id": null, + "year": 1139, + "year_label": "1139", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_KINGDOM:1139:start", + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "segment_id": null, + "year": 1139, + "year_label": "1139", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_KINGDOM:1580:end", + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "segment_id": null, + "year": 1580, + "year_label": "1580", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_IBERIAN_UNION:1580:start", + "box_id": "PT_IBERIAN_UNION", + "box_name": "Iberian Union", + "segment_id": null, + "year": 1580, + "year_label": "1580", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_IBERIAN_UNION:1640:end", + "box_id": "PT_IBERIAN_UNION", + "box_name": "Iberian Union", + "segment_id": null, + "year": 1640, + "year_label": "1640", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_RESTORED:1640:start", + "box_id": "PT_RESTORED", + "box_name": "Restored Kingdom of Portugal", + "segment_id": null, + "year": 1640, + "year_label": "1640", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_RESTORED:1807:end", + "box_id": "PT_RESTORED", + "box_name": "Restored Kingdom of Portugal", + "segment_id": null, + "year": 1807, + "year_label": "1807", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_CONST_MON:1807:start", + "box_id": "PT_CONST_MON", + "box_name": "Constitutional Monarchy", + "segment_id": null, + "year": 1807, + "year_label": "1807", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_CONST_MON:1910:end", + "box_id": "PT_CONST_MON", + "box_name": "Constitutional Monarchy", + "segment_id": null, + "year": 1910, + "year_label": "1910", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_FIRST_REP:1910:start", + "box_id": "PT_FIRST_REP", + "box_name": "First Portuguese Republic", + "segment_id": null, + "year": 1910, + "year_label": "1910", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_FIRST_REP:1933:end", + "box_id": "PT_FIRST_REP", + "box_name": "First Portuguese Republic", + "segment_id": null, + "year": 1933, + "year_label": "1933", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_ESTADO_NOVO:1933:start", + "box_id": "PT_ESTADO_NOVO", + "box_name": "Estado Novo", + "segment_id": null, + "year": 1933, + "year_label": "1933", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_ESTADO_NOVO:1976:end", + "box_id": "PT_ESTADO_NOVO", + "box_name": "Estado Novo", + "segment_id": null, + "year": 1976, + "year_label": "1976", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_MODERN:1976:start", + "box_id": "PT_MODERN", + "box_name": "Portugal", + "segment_id": null, + "year": 1976, + "year_label": "1976", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PT_MODERN:2026:end", + "box_id": "PT_MODERN", + "box_name": "Portugal", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_IBERIAN:-1200:start", + "box_id": "ES_IBERIAN", + "box_name": "Iberian & Celtic Tribes", + "segment_id": null, + "year": -1200, + "year_label": "c. 1200 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_IBERIAN:-241:end", + "box_id": "ES_IBERIAN", + "box_name": "Iberian & Celtic Tribes", + "segment_id": null, + "year": -241, + "year_label": "241 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_CARTHAGE:-241:start", + "box_id": "ES_CARTHAGE", + "box_name": "Carthaginian Era", + "segment_id": null, + "year": -241, + "year_label": "241 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_CARTHAGE:-218:end", + "box_id": "ES_CARTHAGE", + "box_name": "Carthaginian Era", + "segment_id": null, + "year": -218, + "year_label": "218 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_ASTURIAS:718:start", + "box_id": "ES_ASTURIAS", + "box_name": "Kingdom of Asturias", + "segment_id": null, + "year": 718, + "year_label": "718", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_ASTURIAS:910:end", + "box_id": "ES_ASTURIAS", + "box_name": "Kingdom of Asturias", + "segment_id": null, + "year": 910, + "year_label": "910", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_LEON:910:start", + "box_id": "ES_LEON", + "box_name": "Kingdom of León", + "segment_id": null, + "year": 910, + "year_label": "910", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_LEON:1238:end", + "box_id": "ES_LEON", + "box_name": "Kingdom of León", + "segment_id": null, + "year": 1238, + "year_label": "1238", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_LATE_RECON:1238:start", + "box_id": "ES_LATE_RECON", + "box_name": "Late Reconquista", + "segment_id": null, + "year": 1238, + "year_label": "1238", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_LATE_RECON:1479:end", + "box_id": "ES_LATE_RECON", + "box_name": "Late Reconquista", + "segment_id": null, + "year": 1479, + "year_label": "1479", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_UNIFICATION:1479:start", + "box_id": "ES_UNIFICATION", + "box_name": "Unification of Spain", + "segment_id": null, + "year": 1479, + "year_label": "1479", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_UNIFICATION:1516:end", + "box_id": "ES_UNIFICATION", + "box_name": "Unification of Spain", + "segment_id": null, + "year": 1516, + "year_label": "1516", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_HABSBURG:1516:start", + "box_id": "ES_HABSBURG", + "box_name": "Habsburg Spain", + "segment_id": null, + "year": 1516, + "year_label": "1516", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_HABSBURG:1700:end", + "box_id": "ES_HABSBURG", + "box_name": "Habsburg Spain", + "segment_id": null, + "year": 1700, + "year_label": "1700", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_BOURBON_REFORMS:1700:start", + "box_id": "ES_BOURBON_REFORMS", + "box_name": "Bourbon Reforms", + "segment_id": null, + "year": 1700, + "year_label": "1700", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_BOURBON_REFORMS:1808:end", + "box_id": "ES_BOURBON_REFORMS", + "box_name": "Bourbon Reforms", + "segment_id": null, + "year": 1808, + "year_label": "1808", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_CONSTITUTIONAL:1808:start", + "box_id": "ES_CONSTITUTIONAL", + "box_name": "Constitutional Era", + "segment_id": null, + "year": 1808, + "year_label": "1808", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_CONSTITUTIONAL:1939:end", + "box_id": "ES_CONSTITUTIONAL", + "box_name": "Constitutional Era", + "segment_id": null, + "year": 1939, + "year_label": "1939", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_FRANCO:1939:start", + "box_id": "ES_FRANCO", + "box_name": "Francoist Spain", + "segment_id": null, + "year": 1939, + "year_label": "1939", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_FRANCO:1978:end", + "box_id": "ES_FRANCO", + "box_name": "Francoist Spain", + "segment_id": null, + "year": 1978, + "year_label": "1978", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_MODERN:1978:start", + "box_id": "ES_MODERN", + "box_name": "Spain", + "segment_id": null, + "year": 1978, + "year_label": "1978", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ES_MODERN:2026:end", + "box_id": "ES_MODERN", + "box_name": "Spain", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_GAUL:-800:start", + "box_id": "FR_GAUL", + "box_name": "Gaul", + "segment_id": null, + "year": -800, + "year_label": "c. 800 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_GAUL:-58:end", + "box_id": "FR_GAUL", + "box_name": "Gaul", + "segment_id": null, + "year": -58, + "year_label": "58 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_FRANKISH:481:start", + "box_id": "FR_FRANKISH", + "box_name": "Frankish Kingdom", + "segment_id": null, + "year": 481, + "year_label": "481", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_FRANKISH:843:end", + "box_id": "FR_FRANKISH", + "box_name": "Frankish Kingdom", + "segment_id": null, + "year": 843, + "year_label": "843", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_WEST_FRANCIA:843:start", + "box_id": "FR_WEST_FRANCIA", + "box_name": "West Francia", + "segment_id": null, + "year": 843, + "year_label": "843", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_WEST_FRANCIA:987:end", + "box_id": "FR_WEST_FRANCIA", + "box_name": "West Francia", + "segment_id": null, + "year": 987, + "year_label": "987", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_KINGDOM:987:start", + "box_id": "FR_KINGDOM", + "box_name": "Kingdom of France", + "segment_id": null, + "year": 987, + "year_label": "987", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_KINGDOM:1589:end", + "box_id": "FR_KINGDOM", + "box_name": "Kingdom of France", + "segment_id": null, + "year": 1589, + "year_label": "1589", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_BOURBON:1589:start", + "box_id": "FR_BOURBON", + "box_name": "Bourbon France", + "segment_id": null, + "year": 1589, + "year_label": "1589", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_BOURBON:1792:end", + "box_id": "FR_BOURBON", + "box_name": "Bourbon France", + "segment_id": null, + "year": 1792, + "year_label": "1792", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_UNNAMED_1792:1792:start", + "box_id": "FR_UNNAMED_1792", + "box_name": "[Unlabeled France segment]", + "segment_id": null, + "year": 1792, + "year_label": "1792", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_UNNAMED_1792:1804:end", + "box_id": "FR_UNNAMED_1792", + "box_name": "[Unlabeled France segment]", + "segment_id": null, + "year": 1804, + "year_label": "1804", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "NAPOLEON:1804:start", + "box_id": "NAPOLEON", + "box_name": "First French Empire", + "segment_id": null, + "year": 1804, + "year_label": "1804", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "NAPOLEON:1815:end", + "box_id": "NAPOLEON", + "box_name": "First French Empire", + "segment_id": null, + "year": 1815, + "year_label": "1815", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_REPUBLICAN:1815:start", + "box_id": "FR_REPUBLICAN", + "box_name": "Republican France", + "segment_id": null, + "year": 1815, + "year_label": "1815", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_REPUBLICAN:1946:end", + "box_id": "FR_REPUBLICAN", + "box_name": "Republican France", + "segment_id": null, + "year": 1946, + "year_label": "1946", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_MODERN:1946:start", + "box_id": "FR_MODERN", + "box_name": "France", + "segment_id": null, + "year": 1946, + "year_label": "1946", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "FR_MODERN:2026:end", + "box_id": "FR_MODERN", + "box_name": "France", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_ITALIC:-1200:start", + "box_id": "IT_ITALIC", + "box_name": "Italic Tribes", + "segment_id": null, + "year": -1200, + "year_label": "c. 1200 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_ITALIC:-753:end", + "box_id": "IT_ITALIC", + "box_name": "Italic Tribes", + "segment_id": null, + "year": -753, + "year_label": "753 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_ROMAN_KINGDOM:-753:start", + "box_id": "IT_ROMAN_KINGDOM", + "box_name": "Roman Kingdom", + "segment_id": null, + "year": -753, + "year_label": "753 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_ROMAN_KINGDOM:-509:end", + "box_id": "IT_ROMAN_KINGDOM", + "box_name": "Roman Kingdom", + "segment_id": null, + "year": -509, + "year_label": "509 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_OSTROGOTH:493:start", + "box_id": "IT_OSTROGOTH", + "box_name": "Ostrogothic Kingdom", + "segment_id": null, + "year": 493, + "year_label": "493", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_OSTROGOTH:553:end", + "box_id": "IT_OSTROGOTH", + "box_name": "Ostrogothic Kingdom", + "segment_id": null, + "year": 553, + "year_label": "553", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_BYZANTINE:553:start", + "box_id": "IT_BYZANTINE", + "box_name": "Byzantine Italy", + "segment_id": null, + "year": 553, + "year_label": "553", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_BYZANTINE:774:end", + "box_id": "IT_BYZANTINE", + "box_name": "Byzantine Italy", + "segment_id": null, + "year": 774, + "year_label": "774", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_LOMBARD:568:start", + "box_id": "IT_LOMBARD", + "box_name": "Lombard Kingdom", + "segment_id": null, + "year": 568, + "year_label": "568", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_LOMBARD:774:end", + "box_id": "IT_LOMBARD", + "box_name": "Lombard Kingdom", + "segment_id": null, + "year": 774, + "year_label": "774", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_MEDIEVAL_STATES:774:start", + "box_id": "IT_MEDIEVAL_STATES", + "box_name": "Medieval Italian States", + "segment_id": null, + "year": 774, + "year_label": "774", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_MEDIEVAL_STATES:1494:end", + "box_id": "IT_MEDIEVAL_STATES", + "box_name": "Medieval Italian States", + "segment_id": null, + "year": 1494, + "year_label": "1494", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_SICILY:1130:start", + "box_id": "IT_SICILY", + "box_name": "Kingdom of Sicily", + "segment_id": null, + "year": 1130, + "year_label": "1130", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_SICILY:1816:end", + "box_id": "IT_SICILY", + "box_name": "Kingdom of Sicily", + "segment_id": null, + "year": 1816, + "year_label": "1816", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_DIVIDED:1494:start", + "box_id": "IT_DIVIDED", + "box_name": "Age of Divided Italy", + "segment_id": null, + "year": 1494, + "year_label": "1494", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_DIVIDED:1805:end", + "box_id": "IT_DIVIDED", + "box_name": "Age of Divided Italy", + "segment_id": null, + "year": 1805, + "year_label": "1805", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_BOURBON_SICILY:1816:start", + "box_id": "IT_BOURBON_SICILY", + "box_name": "Bourbon Sicily", + "segment_id": null, + "year": 1816, + "year_label": "1816", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_BOURBON_SICILY:1861:end", + "box_id": "IT_BOURBON_SICILY", + "box_name": "Bourbon Sicily", + "segment_id": null, + "year": 1861, + "year_label": "1861", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_KINGDOM:1861:start", + "box_id": "IT_KINGDOM", + "box_name": "Kingdom of Italy", + "segment_id": null, + "year": 1861, + "year_label": "1861", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_KINGDOM:1946:end", + "box_id": "IT_KINGDOM", + "box_name": "Kingdom of Italy", + "segment_id": null, + "year": 1946, + "year_label": "1946", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_MODERN:1946:start", + "box_id": "IT_MODERN", + "box_name": "Italy", + "segment_id": null, + "year": 1946, + "year_label": "1946", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IT_MODERN:2026:end", + "box_id": "IT_MODERN", + "box_name": "Italy", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_TRIBES:-800:start", + "box_id": "DE_TRIBES", + "box_name": "Celtic & Germanic Tribes", + "segment_id": null, + "year": -800, + "year_label": "c. 800 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_TRIBES:406:end", + "box_id": "DE_TRIBES", + "box_name": "Celtic & Germanic Tribes", + "segment_id": null, + "year": 406, + "year_label": "406", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_GERMANIC:406:start", + "box_id": "DE_GERMANIC", + "box_name": "Germanic Tribes", + "segment_id": null, + "year": 406, + "year_label": "406", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_GERMANIC:481:end", + "box_id": "DE_GERMANIC", + "box_name": "Germanic Tribes", + "segment_id": null, + "year": 481, + "year_label": "481", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_MIGRATION:481:start", + "box_id": "DE_MIGRATION", + "box_name": "Migration Period", + "segment_id": null, + "year": 481, + "year_label": "481", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_MIGRATION:843:end", + "box_id": "DE_MIGRATION", + "box_name": "Migration Period", + "segment_id": null, + "year": 843, + "year_label": "843", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EAST_FRANCIA:843:start", + "box_id": "EAST_FRANCIA", + "box_name": "East Francia", + "segment_id": null, + "year": 843, + "year_label": "843", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EAST_FRANCIA:962:end", + "box_id": "EAST_FRANCIA", + "box_name": "East Francia", + "segment_id": null, + "year": 962, + "year_label": "962", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_HRE:962:start", + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "segment_id": null, + "year": 962, + "year_label": "962", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_HRE:1806:end", + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "segment_id": null, + "year": 1806, + "year_label": "1806", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_PRUSSIA:1701:start", + "box_id": "DE_PRUSSIA", + "box_name": "Kingdom of Prussia", + "segment_id": null, + "year": 1701, + "year_label": "1701", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_PRUSSIA:1871:end", + "box_id": "DE_PRUSSIA", + "box_name": "Kingdom of Prussia", + "segment_id": null, + "year": 1871, + "year_label": "1871", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_CONFED:1815:start", + "box_id": "DE_CONFED", + "box_name": "German Confederation", + "segment_id": null, + "year": 1815, + "year_label": "1815", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_CONFED:1871:end", + "box_id": "DE_CONFED", + "box_name": "German Confederation", + "segment_id": null, + "year": 1871, + "year_label": "1871", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_EMPIRE:1871:start", + "box_id": "DE_EMPIRE", + "box_name": "German Empire", + "segment_id": null, + "year": 1871, + "year_label": "1871", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_EMPIRE:1919:end", + "box_id": "DE_EMPIRE", + "box_name": "German Empire", + "segment_id": null, + "year": 1919, + "year_label": "1919", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_WEIMAR:1919:start", + "box_id": "DE_WEIMAR", + "box_name": "Weimar Republic", + "segment_id": null, + "year": 1919, + "year_label": "1919", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_WEIMAR:1933:end", + "box_id": "DE_WEIMAR", + "box_name": "Weimar Republic", + "segment_id": null, + "year": 1933, + "year_label": "1933", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_NAZI:1933:start", + "box_id": "DE_NAZI", + "box_name": "Nazi Germany", + "segment_id": null, + "year": 1933, + "year_label": "1933", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_NAZI:1945:end", + "box_id": "DE_NAZI", + "box_name": "Nazi Germany", + "segment_id": null, + "year": 1945, + "year_label": "1945", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_EW:1945:start", + "box_id": "DE_EW", + "box_name": "East and West Germany", + "segment_id": null, + "year": 1945, + "year_label": "1945", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_EW:1990:end", + "box_id": "DE_EW", + "box_name": "East and West Germany", + "segment_id": null, + "year": 1990, + "year_label": "1990", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_MODERN:1990:start", + "box_id": "DE_MODERN", + "box_name": "Germany", + "segment_id": null, + "year": 1990, + "year_label": "1990", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "DE_MODERN:2026:end", + "box_id": "DE_MODERN", + "box_name": "Germany", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_HALLSTATT:-800:start", + "box_id": "AT_HALLSTATT", + "box_name": "Hallstatt Culture", + "segment_id": null, + "year": -800, + "year_label": "c. 800 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_HALLSTATT:-400:end", + "box_id": "AT_HALLSTATT", + "box_name": "Hallstatt Culture", + "segment_id": null, + "year": -400, + "year_label": "c. 400 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_NORICUM:-400:start", + "box_id": "AT_NORICUM", + "box_name": "Celtic Kingdom of Noricum", + "segment_id": null, + "year": -400, + "year_label": "c. 400 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_NORICUM:-16:end", + "box_id": "AT_NORICUM", + "box_name": "Celtic Kingdom of Noricum", + "segment_id": null, + "year": -16, + "year_label": "16 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_POSTROMAN:476:start", + "box_id": "AT_POSTROMAN", + "box_name": "Post-Roman Germanic Kingdoms", + "segment_id": null, + "year": 476, + "year_label": "476", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_POSTROMAN:568:end", + "box_id": "AT_POSTROMAN", + "box_name": "Post-Roman Germanic Kingdoms", + "segment_id": null, + "year": 568, + "year_label": "568", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_BAVARIA:568:start", + "box_id": "AT_BAVARIA", + "box_name": "Duchy of Bavaria", + "segment_id": null, + "year": 568, + "year_label": "568", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_BAVARIA:788:end", + "box_id": "AT_BAVARIA", + "box_name": "Duchy of Bavaria", + "segment_id": null, + "year": 788, + "year_label": "788", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_MARGRAVIATE:976:start", + "box_id": "AT_MARGRAVIATE", + "box_name": "Margraviate of Austria", + "segment_id": null, + "year": 976, + "year_label": "976", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_MARGRAVIATE:1156:end", + "box_id": "AT_MARGRAVIATE", + "box_name": "Margraviate of Austria", + "segment_id": null, + "year": 1156, + "year_label": "1156", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_DUCHY:1156:start", + "box_id": "AT_DUCHY", + "box_name": "Duchy of Austria", + "segment_id": null, + "year": 1156, + "year_label": "1156", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_DUCHY:1453:end", + "box_id": "AT_DUCHY", + "box_name": "Duchy of Austria", + "segment_id": null, + "year": 1453, + "year_label": "1453", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_HABSBURG:1453:start", + "box_id": "AT_HABSBURG", + "box_name": "Habsburg Austria", + "segment_id": null, + "year": 1453, + "year_label": "1453", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_HABSBURG:1804:end", + "box_id": "AT_HABSBURG", + "box_name": "Habsburg Austria", + "segment_id": null, + "year": 1804, + "year_label": "1804", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_EMPIRE:1804:start", + "box_id": "AT_EMPIRE", + "box_name": "Austrian Empire", + "segment_id": null, + "year": 1804, + "year_label": "1804", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_EMPIRE:1867:end", + "box_id": "AT_EMPIRE", + "box_name": "Austrian Empire", + "segment_id": null, + "year": 1867, + "year_label": "1867", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_AH:1867:start", + "box_id": "AT_AH", + "box_name": "Austria-Hungary", + "segment_id": null, + "year": 1867, + "year_label": "1867", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_AH:1918:end", + "box_id": "AT_AH", + "box_name": "Austria-Hungary", + "segment_id": null, + "year": 1918, + "year_label": "1918", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_FIRST_REP:1918:start", + "box_id": "AT_FIRST_REP", + "box_name": "First Austrian Republic", + "segment_id": null, + "year": 1918, + "year_label": "1918", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_FIRST_REP:1938:end", + "box_id": "AT_FIRST_REP", + "box_name": "First Austrian Republic", + "segment_id": null, + "year": 1938, + "year_label": "1938", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_SECOND_REP:1945:start", + "box_id": "AT_SECOND_REP", + "box_name": "Second Austrian Republic", + "segment_id": null, + "year": 1945, + "year_label": "1945", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_SECOND_REP:1955:end", + "box_id": "AT_SECOND_REP", + "box_name": "Second Austrian Republic", + "segment_id": null, + "year": 1955, + "year_label": "1955", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_MODERN:1955:start", + "box_id": "AT_MODERN", + "box_name": "Austria", + "segment_id": null, + "year": 1955, + "year_label": "1955", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "AT_MODERN:2026:end", + "box_id": "AT_MODERN", + "box_name": "Austria", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_AEGEAN:-3000:start", + "box_id": "GR_AEGEAN", + "box_name": "Aegean Civilizations", + "segment_id": null, + "year": -3000, + "year_label": "c. 3000 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_AEGEAN:-1600:end", + "box_id": "GR_AEGEAN", + "box_name": "Aegean Civilizations", + "segment_id": null, + "year": -1600, + "year_label": "c. 1600 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_MYCENAEAN:-1600:start", + "box_id": "GR_MYCENAEAN", + "box_name": "Mycenaean Civilization", + "segment_id": null, + "year": -1600, + "year_label": "c. 1600 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_MYCENAEAN:-1100:end", + "box_id": "GR_MYCENAEAN", + "box_name": "Mycenaean Civilization", + "segment_id": null, + "year": -1100, + "year_label": "c. 1100 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_DARK:-1100:start", + "box_id": "GR_DARK", + "box_name": "Greek Dark Age", + "segment_id": null, + "year": -1100, + "year_label": "c. 1100 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_DARK:-800:end", + "box_id": "GR_DARK", + "box_name": "Greek Dark Age", + "segment_id": null, + "year": -800, + "year_label": "c. 800 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_CLASSICAL:-800:start", + "box_id": "GR_CLASSICAL", + "box_name": "Classical Greek City-States", + "segment_id": null, + "year": -800, + "year_label": "c. 800 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_CLASSICAL:-338:end", + "box_id": "GR_CLASSICAL", + "box_name": "Classical Greek City-States", + "segment_id": null, + "year": -338, + "year_label": "338 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_HELLENISTIC:-323:start", + "box_id": "GR_HELLENISTIC", + "box_name": "Hellenistic Age", + "segment_id": null, + "year": -323, + "year_label": "323 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_HELLENISTIC:-146:end", + "box_id": "GR_HELLENISTIC", + "box_name": "Hellenistic Age", + "segment_id": null, + "year": -146, + "year_label": "146 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_SUCCESSOR:1204:start", + "box_id": "GR_SUCCESSOR", + "box_name": "Greek Successor States", + "segment_id": null, + "year": 1204, + "year_label": "1204", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_SUCCESSOR:1453:end", + "box_id": "GR_SUCCESSOR", + "box_name": "Greek Successor States", + "segment_id": null, + "year": 1453, + "year_label": "1453", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_KINGDOM1:1832:start", + "box_id": "GR_KINGDOM1", + "box_name": "Kingdom of Greece", + "segment_id": null, + "year": 1832, + "year_label": "1832", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_KINGDOM1:1924:end", + "box_id": "GR_KINGDOM1", + "box_name": "Kingdom of Greece", + "segment_id": null, + "year": 1924, + "year_label": "1924", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_REPUBLIC:1924:start", + "box_id": "GR_REPUBLIC", + "box_name": "Greek Republic", + "segment_id": null, + "year": 1924, + "year_label": "1924", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_REPUBLIC:1935:end", + "box_id": "GR_REPUBLIC", + "box_name": "Greek Republic", + "segment_id": null, + "year": 1935, + "year_label": "1935", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_KINGDOM2:1935:start", + "box_id": "GR_KINGDOM2", + "box_name": "Kingdom of Greece", + "segment_id": null, + "year": 1935, + "year_label": "1935", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_KINGDOM2:1973:end", + "box_id": "GR_KINGDOM2", + "box_name": "Kingdom of Greece", + "segment_id": null, + "year": 1973, + "year_label": "1973", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_MODERN:1973:start", + "box_id": "GR_MODERN", + "box_name": "Greece", + "segment_id": null, + "year": 1973, + "year_label": "1973", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "GR_MODERN:2026:end", + "box_id": "GR_MODERN", + "box_name": "Greece", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_HITTITE:-1700:start", + "box_id": "TR_HITTITE", + "box_name": "Hittite Empire", + "segment_id": null, + "year": -1700, + "year_label": "c. 1700 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_HITTITE:-1200:end", + "box_id": "TR_HITTITE", + "box_name": "Hittite Empire", + "segment_id": null, + "year": -1200, + "year_label": "c. 1200 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_NEOHITTITE:-1200:start", + "box_id": "TR_NEOHITTITE", + "box_name": "Neo-Hittite Kingdoms", + "segment_id": null, + "year": -1200, + "year_label": "c. 1200 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_NEOHITTITE:-700:end", + "box_id": "TR_NEOHITTITE", + "box_name": "Neo-Hittite Kingdoms", + "segment_id": null, + "year": -700, + "year_label": "c. 700 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_LYDIA:-700:start", + "box_id": "TR_LYDIA", + "box_name": "Kingdom of Lydia", + "segment_id": null, + "year": -700, + "year_label": "c. 700 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_LYDIA:-546:end", + "box_id": "TR_LYDIA", + "box_name": "Kingdom of Lydia", + "segment_id": null, + "year": -546, + "year_label": "546 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_HELLENISTIC:-323:start", + "box_id": "TR_HELLENISTIC", + "box_name": "Hellenistic Kingdoms", + "segment_id": null, + "year": -323, + "year_label": "323 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_HELLENISTIC:-133:end", + "box_id": "TR_HELLENISTIC", + "box_name": "Hellenistic Kingdoms", + "segment_id": null, + "year": -133, + "year_label": "133 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_LATIN:1204:start", + "box_id": "TR_LATIN", + "box_name": "Latin Empire", + "segment_id": null, + "year": 1204, + "year_label": "1204", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_LATIN:1261:end", + "box_id": "TR_LATIN", + "box_name": "Latin Empire", + "segment_id": null, + "year": 1261, + "year_label": "1261", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_RESTORED_BYZ:1261:start", + "box_id": "TR_RESTORED_BYZ", + "box_name": "Restored Byzantine Empire", + "segment_id": null, + "year": 1261, + "year_label": "1261", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_RESTORED_BYZ:1453:end", + "box_id": "TR_RESTORED_BYZ", + "box_name": "Restored Byzantine Empire", + "segment_id": null, + "year": 1453, + "year_label": "1453", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_RUM:1077:start", + "box_id": "TR_RUM", + "box_name": "Sultanate of Rum", + "segment_id": null, + "year": 1077, + "year_label": "1077", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_RUM:1308:end", + "box_id": "TR_RUM", + "box_name": "Sultanate of Rum", + "segment_id": null, + "year": 1308, + "year_label": "1308", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_MODERN:1923:start", + "box_id": "TR_MODERN", + "box_name": "Turkey", + "segment_id": null, + "year": 1923, + "year_label": "1923", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "TR_MODERN:2026:end", + "box_id": "TR_MODERN", + "box_name": "Turkey", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ROMAN_REPUBLIC:-509:start", + "box_id": "ROMAN_REPUBLIC", + "box_name": "Roman Republic", + "segment_id": null, + "year": -509, + "year_label": "509 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ROMAN_REPUBLIC:-27:end", + "box_id": "ROMAN_REPUBLIC", + "box_name": "Roman Republic", + "segment_id": null, + "year": -27, + "year_label": "27 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ROMAN_EMPIRE:-27:start", + "box_id": "ROMAN_EMPIRE", + "box_name": "Roman Empire", + "segment_id": null, + "year": -27, + "year_label": "27 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ROMAN_EMPIRE:410:end", + "box_id": "ROMAN_EMPIRE", + "box_name": "Roman Empire", + "segment_id": null, + "year": 410, + "year_label": "395 / 406 / 410", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "WESTERN_ROMAN:395:start", + "box_id": "WESTERN_ROMAN", + "box_name": "Western Roman Empire", + "segment_id": null, + "year": 395, + "year_label": "395", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "WESTERN_ROMAN:476:end", + "box_id": "WESTERN_ROMAN", + "box_name": "Western Roman Empire", + "segment_id": null, + "year": 476, + "year_label": "476", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "BYZANTINE:395:start", + "box_id": "BYZANTINE", + "box_name": "Byzantine Empire", + "segment_id": null, + "year": 395, + "year_label": "395", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "BYZANTINE:1453:end", + "box_id": "BYZANTINE", + "box_name": "Byzantine Empire", + "segment_id": null, + "year": 1453, + "year_label": "1453", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PERSIAN:-550:start", + "box_id": "PERSIAN", + "box_name": "Persian Empire", + "segment_id": null, + "year": -550, + "year_label": "550 / 546 / 539 / 525 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PERSIAN:-330:end", + "box_id": "PERSIAN", + "box_name": "Persian Empire", + "segment_id": null, + "year": -330, + "year_label": "330 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "MACEDONIAN:-338:start", + "box_id": "MACEDONIAN", + "box_name": "Macedonian Empire", + "segment_id": null, + "year": -338, + "year_label": "338 / 334 / 332 / 331 / 330 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "MACEDONIAN:-323:end", + "box_id": "MACEDONIAN", + "box_name": "Macedonian Empire", + "segment_id": null, + "year": -323, + "year_label": "323 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "OTTOMAN:1308:start", + "box_id": "OTTOMAN", + "box_name": "Ottoman Empire", + "segment_id": null, + "year": 1308, + "year_label": "1308", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "OTTOMAN:1923:end", + "box_id": "OTTOMAN", + "box_name": "Ottoman Empire", + "segment_id": null, + "year": 1923, + "year_label": "1832 / 1923", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_EARLY_DYN:-3100:start", + "box_id": "EG_EARLY_DYN", + "box_name": "Early Dynastic Period", + "segment_id": null, + "year": -3100, + "year_label": "c. 3100 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_EARLY_DYN:-2686:end", + "box_id": "EG_EARLY_DYN", + "box_name": "Early Dynastic Period", + "segment_id": null, + "year": -2686, + "year_label": "2686 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_OLD:-2686:start", + "box_id": "EG_OLD", + "box_name": "Old Kingdom", + "segment_id": null, + "year": -2686, + "year_label": "2686 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_OLD:-2181:end", + "box_id": "EG_OLD", + "box_name": "Old Kingdom", + "segment_id": null, + "year": -2181, + "year_label": "2181 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_FIRST_INT:-2181:start", + "box_id": "EG_FIRST_INT", + "box_name": "First Intermediate Period", + "segment_id": null, + "year": -2181, + "year_label": "2181 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_FIRST_INT:-2055:end", + "box_id": "EG_FIRST_INT", + "box_name": "First Intermediate Period", + "segment_id": null, + "year": -2055, + "year_label": "2055 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MIDDLE:-2055:start", + "box_id": "EG_MIDDLE", + "box_name": "Middle Kingdom", + "segment_id": null, + "year": -2055, + "year_label": "2055 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MIDDLE:-1650:end", + "box_id": "EG_MIDDLE", + "box_name": "Middle Kingdom", + "segment_id": null, + "year": -1650, + "year_label": "1650 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_SECOND_INT:-1650:start", + "box_id": "EG_SECOND_INT", + "box_name": "Second Intermediate Period", + "segment_id": null, + "year": -1650, + "year_label": "1650 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_SECOND_INT:-1550:end", + "box_id": "EG_SECOND_INT", + "box_name": "Second Intermediate Period", + "segment_id": null, + "year": -1550, + "year_label": "1550 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_NEW:-1550:start", + "box_id": "EG_NEW", + "box_name": "New Kingdom", + "segment_id": null, + "year": -1550, + "year_label": "1550 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_NEW:-1070:end", + "box_id": "EG_NEW", + "box_name": "New Kingdom", + "segment_id": null, + "year": -1070, + "year_label": "1070 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_THIRD_INT:-1070:start", + "box_id": "EG_THIRD_INT", + "box_name": "Third Intermediate Period", + "segment_id": null, + "year": -1070, + "year_label": "1070 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_THIRD_INT:-664:end", + "box_id": "EG_THIRD_INT", + "box_name": "Third Intermediate Period", + "segment_id": null, + "year": -664, + "year_label": "664 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_LATE:-664:start", + "box_id": "EG_LATE", + "box_name": "Late Period", + "segment_id": null, + "year": -664, + "year_label": "664 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_LATE:-525:end", + "box_id": "EG_LATE", + "box_name": "Late Period", + "segment_id": null, + "year": -525, + "year_label": "525 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_PTOLEMAIC:-305:start", + "box_id": "EG_PTOLEMAIC", + "box_name": "Ptolemaic Kingdom", + "segment_id": null, + "year": -305, + "year_label": "305 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_PTOLEMAIC:-30:end", + "box_id": "EG_PTOLEMAIC", + "box_name": "Ptolemaic Kingdom", + "segment_id": null, + "year": -30, + "year_label": "30 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_FATIMID:969:start", + "box_id": "EG_FATIMID", + "box_name": "Fatimid Caliphate", + "segment_id": null, + "year": 969, + "year_label": "969", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_FATIMID:1171:end", + "box_id": "EG_FATIMID", + "box_name": "Fatimid Caliphate", + "segment_id": null, + "year": 1171, + "year_label": "1171", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_AYYUBID:1171:start", + "box_id": "EG_AYYUBID", + "box_name": "Ayyubid Sultanate", + "segment_id": null, + "year": 1171, + "year_label": "1171", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_AYYUBID:1250:end", + "box_id": "EG_AYYUBID", + "box_name": "Ayyubid Sultanate", + "segment_id": null, + "year": 1250, + "year_label": "1250", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MAMLUK:1250:start", + "box_id": "EG_MAMLUK", + "box_name": "Mamluk Sultanate", + "segment_id": null, + "year": 1250, + "year_label": "1250", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MAMLUK:1517:end", + "box_id": "EG_MAMLUK", + "box_name": "Mamluk Sultanate", + "segment_id": null, + "year": 1517, + "year_label": "1517", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MUHAMMAD_ALI:1805:start", + "box_id": "EG_MUHAMMAD_ALI", + "box_name": "Muhammad Ali Dynasty", + "segment_id": null, + "year": 1805, + "year_label": "1805", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MUHAMMAD_ALI:1882:end", + "box_id": "EG_MUHAMMAD_ALI", + "box_name": "Muhammad Ali Dynasty", + "segment_id": null, + "year": 1882, + "year_label": "1882", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_COLONIAL:1882:start", + "box_id": "EG_COLONIAL", + "box_name": "Colonial Egypt", + "segment_id": null, + "year": 1882, + "year_label": "1882", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_COLONIAL:1922:end", + "box_id": "EG_COLONIAL", + "box_name": "Colonial Egypt", + "segment_id": null, + "year": 1922, + "year_label": "1922", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_KINGDOM:1922:start", + "box_id": "EG_KINGDOM", + "box_name": "Kingdom of Egypt", + "segment_id": null, + "year": 1922, + "year_label": "1922", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_KINGDOM:1953:end", + "box_id": "EG_KINGDOM", + "box_name": "Kingdom of Egypt", + "segment_id": null, + "year": 1953, + "year_label": "1953", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MODERN:1953:start", + "box_id": "EG_MODERN", + "box_name": "Egypt", + "segment_id": null, + "year": 1953, + "year_label": "1953", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "EG_MODERN:2026:end", + "box_id": "EG_MODERN", + "box_name": "Egypt", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_SUMER:-4500:start", + "box_id": "IQ_SUMER", + "box_name": "Sumerian Civilization", + "segment_id": null, + "year": -4500, + "year_label": "c. 4500 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_SUMER:-2334:end", + "box_id": "IQ_SUMER", + "box_name": "Sumerian Civilization", + "segment_id": null, + "year": -2334, + "year_label": "2334 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_AKKAD:-2334:start", + "box_id": "IQ_AKKAD", + "box_name": "Akkadian Empire", + "segment_id": null, + "year": -2334, + "year_label": "2334 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_AKKAD:-2154:end", + "box_id": "IQ_AKKAD", + "box_name": "Akkadian Empire", + "segment_id": null, + "year": -2154, + "year_label": "2154 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_SUMER_REN:-2154:start", + "box_id": "IQ_SUMER_REN", + "box_name": "Sumerian Renaissance", + "segment_id": null, + "year": -2154, + "year_label": "2154 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_SUMER_REN:-1894:end", + "box_id": "IQ_SUMER_REN", + "box_name": "Sumerian Renaissance", + "segment_id": null, + "year": -1894, + "year_label": "1894 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_OLD_BAB:-1894:start", + "box_id": "IQ_OLD_BAB", + "box_name": "Old Babylonian Kingdom", + "segment_id": null, + "year": -1894, + "year_label": "1894 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_OLD_BAB:-1595:end", + "box_id": "IQ_OLD_BAB", + "box_name": "Old Babylonian Kingdom", + "segment_id": null, + "year": -1595, + "year_label": "1595 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_KASSITE:-1595:start", + "box_id": "IQ_KASSITE", + "box_name": "Kassite Babylon", + "segment_id": null, + "year": -1595, + "year_label": "1595 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_KASSITE:-1365:end", + "box_id": "IQ_KASSITE", + "box_name": "Kassite Babylon", + "segment_id": null, + "year": -1365, + "year_label": "1365 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_ASSYRIA:-1365:start", + "box_id": "IQ_ASSYRIA", + "box_name": "Assyrian Empire", + "segment_id": null, + "year": -1365, + "year_label": "1365 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_ASSYRIA:-625:end", + "box_id": "IQ_ASSYRIA", + "box_name": "Assyrian Empire", + "segment_id": null, + "year": -625, + "year_label": "625 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_NEO_BAB:-625:start", + "box_id": "IQ_NEO_BAB", + "box_name": "Neo-Babylonian Empire", + "segment_id": null, + "year": -625, + "year_label": "625 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_NEO_BAB:-539:end", + "box_id": "IQ_NEO_BAB", + "box_name": "Neo-Babylonian Empire", + "segment_id": null, + "year": -539, + "year_label": "539 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_ABBASID:750:start", + "box_id": "IQ_ABBASID", + "box_name": "Abbasid Caliphate", + "segment_id": null, + "year": 750, + "year_label": "750", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_ABBASID:1258:end", + "box_id": "IQ_ABBASID", + "box_name": "Abbasid Caliphate", + "segment_id": null, + "year": 1258, + "year_label": "1258", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_IR_POST_ABB:1258:start", + "box_id": "IQ_IR_POST_ABB", + "box_name": "Post-Abbasid Regional Dynasties", + "segment_id": null, + "year": 1258, + "year_label": "1258", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_IR_POST_ABB:1501:end", + "box_id": "IQ_IR_POST_ABB", + "box_name": "Post-Abbasid Regional Dynasties", + "segment_id": null, + "year": 1501, + "year_label": "1501", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_KINGDOM:1921:start", + "box_id": "IQ_KINGDOM", + "box_name": "Kingdom of Iraq", + "segment_id": null, + "year": 1921, + "year_label": "1921", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_KINGDOM:1958:end", + "box_id": "IQ_KINGDOM", + "box_name": "Kingdom of Iraq", + "segment_id": null, + "year": 1958, + "year_label": "1958", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_MODERN:1958:start", + "box_id": "IQ_MODERN", + "box_name": "Iraq", + "segment_id": null, + "year": 1958, + "year_label": "1958", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IQ_MODERN:2026:end", + "box_id": "IQ_MODERN", + "box_name": "Iraq", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_ELAM:-2700:start", + "box_id": "IR_ELAM", + "box_name": "Elamite Civilization", + "segment_id": null, + "year": -2700, + "year_label": "c. 2700 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_ELAM:-550:end", + "box_id": "IR_ELAM", + "box_name": "Elamite Civilization", + "segment_id": null, + "year": -550, + "year_label": "550 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_TRIBES:-1500:start", + "box_id": "IR_TRIBES", + "box_name": "Iranian Tribes", + "segment_id": null, + "year": -1500, + "year_label": "c. 1500 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_TRIBES:-678:end", + "box_id": "IR_TRIBES", + "box_name": "Iranian Tribes", + "segment_id": null, + "year": -678, + "year_label": "678 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_MEDIAN:-678:start", + "box_id": "IR_MEDIAN", + "box_name": "Median Empire", + "segment_id": null, + "year": -678, + "year_label": "678 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_MEDIAN:-550:end", + "box_id": "IR_MEDIAN", + "box_name": "Median Empire", + "segment_id": null, + "year": -550, + "year_label": "550 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SELEUCID:-312:start", + "box_id": "IR_SELEUCID", + "box_name": "Seleucid Empire", + "segment_id": null, + "year": -312, + "year_label": "312 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SELEUCID:-141:end", + "box_id": "IR_SELEUCID", + "box_name": "Seleucid Empire", + "segment_id": null, + "year": -141, + "year_label": "141 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_PARTHIAN:-247:start", + "box_id": "IR_PARTHIAN", + "box_name": "Parthian Empire", + "segment_id": null, + "year": -247, + "year_label": "247 / 141 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_PARTHIAN:224:end", + "box_id": "IR_PARTHIAN", + "box_name": "Parthian Empire", + "segment_id": null, + "year": 224, + "year_label": "224", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SASANIAN:224:start", + "box_id": "IR_SASANIAN", + "box_name": "Sasanian Empire", + "segment_id": null, + "year": 224, + "year_label": "224", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SASANIAN:651:end", + "box_id": "IR_SASANIAN", + "box_name": "Sasanian Empire", + "segment_id": null, + "year": 651, + "year_label": "651", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "ARAB_CALIPHATE:633:start", + "box_id": "ARAB_CALIPHATE", + "box_name": "Arab Caliphate", + "segment_id": null, + "year": 633, + "year_label": "633 / 641 / 651", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "ARAB_CALIPHATE:969:end", + "box_id": "ARAB_CALIPHATE", + "box_name": "Arab Caliphate", + "segment_id": null, + "year": 969, + "year_label": "750 / 969", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SAFAVID:1501:start", + "box_id": "IR_SAFAVID", + "box_name": "Safavid Empire", + "segment_id": null, + "year": 1501, + "year_label": "1501", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_SAFAVID:1736:end", + "box_id": "IR_SAFAVID", + "box_name": "Safavid Empire", + "segment_id": null, + "year": 1736, + "year_label": "1736", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_AFSHARID:1736:start", + "box_id": "IR_AFSHARID", + "box_name": "Afsharid Empire", + "segment_id": null, + "year": 1736, + "year_label": "1736", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_AFSHARID:1796:end", + "box_id": "IR_AFSHARID", + "box_name": "Afsharid Empire", + "segment_id": null, + "year": 1796, + "year_label": "1796", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_QAJAR:1796:start", + "box_id": "IR_QAJAR", + "box_name": "Qajar Dynasty", + "segment_id": null, + "year": 1796, + "year_label": "1796", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_QAJAR:1925:end", + "box_id": "IR_QAJAR", + "box_name": "Qajar Dynasty", + "segment_id": null, + "year": 1925, + "year_label": "1925", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_PAHLAVI:1925:start", + "box_id": "IR_PAHLAVI", + "box_name": "Pahlavi Dynasty", + "segment_id": null, + "year": 1925, + "year_label": "1925", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_PAHLAVI:1979:end", + "box_id": "IR_PAHLAVI", + "box_name": "Pahlavi Dynasty", + "segment_id": null, + "year": 1979, + "year_label": "1979", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_MODERN:1979:start", + "box_id": "IR_MODERN", + "box_name": "Iran", + "segment_id": null, + "year": 1979, + "year_label": "1979", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IR_MODERN:2026:end", + "box_id": "IR_MODERN", + "box_name": "Iran", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_INDUS:-3300:start", + "box_id": "SA_INDUS", + "box_name": "Indus Valley Civilization", + "segment_id": null, + "year": -3300, + "year_label": "c. 3300 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_INDUS:-1500:end", + "box_id": "SA_INDUS", + "box_name": "Indus Valley Civilization", + "segment_id": null, + "year": -1500, + "year_label": "c. 1500 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_VEDIC:-1500:start", + "box_id": "SA_VEDIC", + "box_name": "Vedic Period", + "segment_id": null, + "year": -1500, + "year_label": "c. 1500 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_VEDIC:-550:end", + "box_id": "SA_VEDIC", + "box_name": "Vedic Period", + "segment_id": null, + "year": -550, + "year_label": "c. 550 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MAHAJANAPADAS:-550:start", + "box_id": "SA_MAHAJANAPADAS", + "box_name": "Mahajanapadas", + "segment_id": null, + "year": -550, + "year_label": "c. 550 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MAHAJANAPADAS:-322:end", + "box_id": "SA_MAHAJANAPADAS", + "box_name": "Mahajanapadas", + "segment_id": null, + "year": -322, + "year_label": "322 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MAURYA:-322:start", + "box_id": "SA_MAURYA", + "box_name": "Maurya Empire", + "segment_id": null, + "year": -322, + "year_label": "322 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MAURYA:-185:end", + "box_id": "SA_MAURYA", + "box_name": "Maurya Empire", + "segment_id": null, + "year": -185, + "year_label": "185 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_POST_MAURYA:-185:start", + "box_id": "SA_POST_MAURYA", + "box_name": "Post-Mauryan Kingdoms", + "segment_id": null, + "year": -185, + "year_label": "185 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_POST_MAURYA:320:end", + "box_id": "SA_POST_MAURYA", + "box_name": "Post-Mauryan Kingdoms", + "segment_id": null, + "year": 320, + "year_label": "320", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_GUPTA:320:start", + "box_id": "SA_GUPTA", + "box_name": "Gupta Empire", + "segment_id": null, + "year": 320, + "year_label": "320", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_GUPTA:550:end", + "box_id": "SA_GUPTA", + "box_name": "Gupta Empire", + "segment_id": null, + "year": 550, + "year_label": "550", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_POST_GUPTA:550:start", + "box_id": "SA_POST_GUPTA", + "box_name": "Post-Gupta Kingdoms", + "segment_id": null, + "year": 550, + "year_label": "550", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_POST_GUPTA:606:end", + "box_id": "SA_POST_GUPTA", + "box_name": "Post-Gupta Kingdoms", + "segment_id": null, + "year": 606, + "year_label": "606", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_HARSHA:606:start", + "box_id": "SA_HARSHA", + "box_name": "Harsha's Empire", + "segment_id": null, + "year": 606, + "year_label": "606", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_HARSHA:647:end", + "box_id": "SA_HARSHA", + "box_name": "Harsha's Empire", + "segment_id": null, + "year": 647, + "year_label": "647", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_REGIONAL:647:start", + "box_id": "SA_REGIONAL", + "box_name": "Regional Kingdoms", + "segment_id": null, + "year": 647, + "year_label": "647", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_REGIONAL:1206:end", + "box_id": "SA_REGIONAL", + "box_name": "Regional Kingdoms", + "segment_id": null, + "year": 1206, + "year_label": "1206", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_DELHI:1206:start", + "box_id": "SA_DELHI", + "box_name": "Delhi Sultanate", + "segment_id": null, + "year": 1206, + "year_label": "1206", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_DELHI:1526:end", + "box_id": "SA_DELHI", + "box_name": "Delhi Sultanate", + "segment_id": null, + "year": 1526, + "year_label": "1526", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MUGHAL:1526:start", + "box_id": "SA_MUGHAL", + "box_name": "Mughal Empire", + "segment_id": null, + "year": 1526, + "year_label": "1526", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_MUGHAL:1858:end", + "box_id": "SA_MUGHAL", + "box_name": "Mughal Empire", + "segment_id": null, + "year": 1858, + "year_label": "1858", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_COLONIAL_INDIA:1858:start", + "box_id": "SA_COLONIAL_INDIA", + "box_name": "Colonial India", + "segment_id": null, + "year": 1858, + "year_label": "1858", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "SA_COLONIAL_INDIA:1947:end", + "box_id": "SA_COLONIAL_INDIA", + "box_name": "Colonial India", + "segment_id": null, + "year": 1947, + "year_label": "1947", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "PK_MODERN:1947:start", + "box_id": "PK_MODERN", + "box_name": "Pakistan", + "segment_id": null, + "year": 1947, + "year_label": "1947", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "PK_MODERN:2026:end", + "box_id": "PK_MODERN", + "box_name": "Pakistan", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "IN_MODERN:1947:start", + "box_id": "IN_MODERN", + "box_name": "India", + "segment_id": null, + "year": 1947, + "year_label": "1947", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "IN_MODERN:2026:end", + "box_id": "IN_MODERN", + "box_name": "India", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_LIANGZHU:-3000:start", + "box_id": "CN_LIANGZHU", + "box_name": "Liangzhu Culture", + "segment_id": null, + "year": -3000, + "year_label": "c. 3000 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_LIANGZHU:-2070:end", + "box_id": "CN_LIANGZHU", + "box_name": "Liangzhu Culture", + "segment_id": null, + "year": -2070, + "year_label": "c. 2070 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_XIA:-2070:start", + "box_id": "CN_XIA", + "box_name": "Xia Dynasty", + "segment_id": null, + "year": -2070, + "year_label": "c. 2070 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_XIA:-1600:end", + "box_id": "CN_XIA", + "box_name": "Xia Dynasty", + "segment_id": null, + "year": -1600, + "year_label": "c. 1600 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SHANG:-1600:start", + "box_id": "CN_SHANG", + "box_name": "Shang Dynasty", + "segment_id": null, + "year": -1600, + "year_label": "c. 1600 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SHANG:-1046:end", + "box_id": "CN_SHANG", + "box_name": "Shang Dynasty", + "segment_id": null, + "year": -1046, + "year_label": "1046 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_ZHOU:-1046:start", + "box_id": "CN_ZHOU", + "box_name": "Zhou Dynasty", + "segment_id": null, + "year": -1046, + "year_label": "1046 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_ZHOU:-221:end", + "box_id": "CN_ZHOU", + "box_name": "Zhou Dynasty", + "segment_id": null, + "year": -221, + "year_label": "221 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_QIN:-221:start", + "box_id": "CN_QIN", + "box_name": "Qin Dynasty", + "segment_id": null, + "year": -221, + "year_label": "221 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_QIN:-202:end", + "box_id": "CN_QIN", + "box_name": "Qin Dynasty", + "segment_id": null, + "year": -202, + "year_label": "202 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_HAN:-202:start", + "box_id": "CN_HAN", + "box_name": "Han Dynasty", + "segment_id": null, + "year": -202, + "year_label": "202 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_HAN:220:end", + "box_id": "CN_HAN", + "box_name": "Han Dynasty", + "segment_id": null, + "year": 220, + "year_label": "220", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_DIVISION:220:start", + "box_id": "CN_DIVISION", + "box_name": "Age of Division", + "segment_id": null, + "year": 220, + "year_label": "220", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_DIVISION:589:end", + "box_id": "CN_DIVISION", + "box_name": "Age of Division", + "segment_id": null, + "year": 589, + "year_label": "589", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SUI:589:start", + "box_id": "CN_SUI", + "box_name": "Sui Dynasty", + "segment_id": null, + "year": 589, + "year_label": "589", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SUI:618:end", + "box_id": "CN_SUI", + "box_name": "Sui Dynasty", + "segment_id": null, + "year": 618, + "year_label": "618", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_TANG:618:start", + "box_id": "CN_TANG", + "box_name": "Tang Dynasty", + "segment_id": null, + "year": 618, + "year_label": "618", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_TANG:907:end", + "box_id": "CN_TANG", + "box_name": "Tang Dynasty", + "segment_id": null, + "year": 907, + "year_label": "907", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_FIVE:907:start", + "box_id": "CN_FIVE", + "box_name": "Five Dynasties Period", + "segment_id": null, + "year": 907, + "year_label": "907", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_FIVE:960:end", + "box_id": "CN_FIVE", + "box_name": "Five Dynasties Period", + "segment_id": null, + "year": 960, + "year_label": "960", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SONG:960:start", + "box_id": "CN_SONG", + "box_name": "Song Dynasty", + "segment_id": null, + "year": 960, + "year_label": "960", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_SONG:1271:end", + "box_id": "CN_SONG", + "box_name": "Song Dynasty", + "segment_id": null, + "year": 1271, + "year_label": "1271", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_YUAN:1271:start", + "box_id": "CN_YUAN", + "box_name": "Yuan Dynasty", + "segment_id": null, + "year": 1271, + "year_label": "1271", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_YUAN:1368:end", + "box_id": "CN_YUAN", + "box_name": "Yuan Dynasty", + "segment_id": null, + "year": 1368, + "year_label": "1368", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_MING:1368:start", + "box_id": "CN_MING", + "box_name": "Ming Dynasty", + "segment_id": null, + "year": 1368, + "year_label": "1368", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_MING:1644:end", + "box_id": "CN_MING", + "box_name": "Ming Dynasty", + "segment_id": null, + "year": 1644, + "year_label": "1644", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_QING:1644:start", + "box_id": "CN_QING", + "box_name": "Qing Dynasty", + "segment_id": null, + "year": 1644, + "year_label": "1644", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_QING:1912:end", + "box_id": "CN_QING", + "box_name": "Qing Dynasty", + "segment_id": null, + "year": 1912, + "year_label": "1912", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_REPUBLIC:1912:start", + "box_id": "CN_REPUBLIC", + "box_name": "Republic of China", + "segment_id": null, + "year": 1912, + "year_label": "1912", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_REPUBLIC:1949:end", + "box_id": "CN_REPUBLIC", + "box_name": "Republic of China", + "segment_id": null, + "year": 1949, + "year_label": "1949", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_MODERN:1949:start", + "box_id": "CN_MODERN", + "box_name": "China", + "segment_id": null, + "year": 1949, + "year_label": "1949", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "CN_MODERN:2026:end", + "box_id": "CN_MODERN", + "box_name": "China", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_JOMON:-300:end", + "box_id": "JP_JOMON", + "box_name": "Jōmon Period", + "segment_id": null, + "year": -300, + "year_label": "c. 300 BCE", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_YAYOI:-300:start", + "box_id": "JP_YAYOI", + "box_name": "Yayoi Period", + "segment_id": null, + "year": -300, + "year_label": "c. 300 BCE", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_YAYOI:250:end", + "box_id": "JP_YAYOI", + "box_name": "Yayoi Period", + "segment_id": null, + "year": 250, + "year_label": "250", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_YAMATO:250:start", + "box_id": "JP_YAMATO", + "box_name": "Yamato State", + "segment_id": null, + "year": 250, + "year_label": "250", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_YAMATO:710:end", + "box_id": "JP_YAMATO", + "box_name": "Yamato State", + "segment_id": null, + "year": 710, + "year_label": "710", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_NARA:710:start", + "box_id": "JP_NARA", + "box_name": "Nara Period", + "segment_id": null, + "year": 710, + "year_label": "710", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_NARA:794:end", + "box_id": "JP_NARA", + "box_name": "Nara Period", + "segment_id": null, + "year": 794, + "year_label": "794", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_HEIAN:794:start", + "box_id": "JP_HEIAN", + "box_name": "Heian Period", + "segment_id": null, + "year": 794, + "year_label": "794", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_HEIAN:1185:end", + "box_id": "JP_HEIAN", + "box_name": "Heian Period", + "segment_id": null, + "year": 1185, + "year_label": "1185", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_KAMAKURA:1185:start", + "box_id": "JP_KAMAKURA", + "box_name": "Kamakura Shogunate", + "segment_id": null, + "year": 1185, + "year_label": "1185", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_KAMAKURA:1336:end", + "box_id": "JP_KAMAKURA", + "box_name": "Kamakura Shogunate", + "segment_id": null, + "year": 1336, + "year_label": "1336", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MUROMACHI:1336:start", + "box_id": "JP_MUROMACHI", + "box_name": "Muromachi Shogunate", + "segment_id": null, + "year": 1336, + "year_label": "1336", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MUROMACHI:1467:end", + "box_id": "JP_MUROMACHI", + "box_name": "Muromachi Shogunate", + "segment_id": null, + "year": 1467, + "year_label": "1467", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_SENGOKU:1467:start", + "box_id": "JP_SENGOKU", + "box_name": "Sengoku Period", + "segment_id": null, + "year": 1467, + "year_label": "c. 1467", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_SENGOKU:1603:end", + "box_id": "JP_SENGOKU", + "box_name": "Sengoku Period", + "segment_id": null, + "year": 1603, + "year_label": "1603", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_TOKUGAWA:1603:start", + "box_id": "JP_TOKUGAWA", + "box_name": "Tokugawa Shogunate", + "segment_id": null, + "year": 1603, + "year_label": "1603", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_TOKUGAWA:1868:end", + "box_id": "JP_TOKUGAWA", + "box_name": "Tokugawa Shogunate", + "segment_id": null, + "year": 1868, + "year_label": "1868", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MEIJI:1868:start", + "box_id": "JP_MEIJI", + "box_name": "Meiji Era", + "segment_id": null, + "year": 1868, + "year_label": "1868", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MEIJI:1912:end", + "box_id": "JP_MEIJI", + "box_name": "Meiji Era", + "segment_id": null, + "year": 1912, + "year_label": "1912", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_EMPIRE:1912:start", + "box_id": "JP_EMPIRE", + "box_name": "Empire of Japan", + "segment_id": null, + "year": 1912, + "year_label": "1912", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_EMPIRE:1947:end", + "box_id": "JP_EMPIRE", + "box_name": "Empire of Japan", + "segment_id": null, + "year": 1947, + "year_label": "1947", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MODERN:1947:start", + "box_id": "JP_MODERN", + "box_name": "Japan", + "segment_id": null, + "year": 1947, + "year_label": "1947", + "sample_type": "start_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box start. Add/replace with a sourced population estimate." + }, + { + "population_id": "JP_MODERN:2026:end", + "box_id": "JP_MODERN", + "box_name": "Japan", + "segment_id": null, + "year": 2026, + "year_label": "Present", + "sample_type": "end_boundary", + "population": null, + "log10_population": null, + "population_low": null, + "population_high": null, + "population_basis": "TBD", + "estimate_method": "TBD", + "source_url": null, + "source_citation": null, + "confidence": "Unknown", + "status": "TODO", + "notes": "Seed row at box end. Add/replace with a sourced population estimate." + } +] diff --git a/data/regions.json b/data/regions.json new file mode 100644 index 0000000..c72ff70 --- /dev/null +++ b/data/regions.json @@ -0,0 +1,625 @@ +[ + { + "region_id": "NE_SCAND", + "region_name": "Northern Europe / Scandinavia", + "country": "Denmark", + "country_order": 1, + "notes": "Operational grouping uses the five Nordic sovereign states; broader than strict 'Scandinavia'." + }, + { + "region_id": "NE_SCAND", + "region_name": "Northern Europe / Scandinavia", + "country": "Finland", + "country_order": 2, + "notes": null + }, + { + "region_id": "NE_SCAND", + "region_name": "Northern Europe / Scandinavia", + "country": "Iceland", + "country_order": 3, + "notes": null + }, + { + "region_id": "NE_SCAND", + "region_name": "Northern Europe / Scandinavia", + "country": "Norway", + "country_order": 4, + "notes": null + }, + { + "region_id": "NE_SCAND", + "region_name": "Northern Europe / Scandinavia", + "country": "Sweden", + "country_order": 5, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Belarus", + "country_order": 1, + "notes": "Cultural/linguistic Slavic grouping spanning parts of Eastern, Central, and Southeastern Europe; not a strict UN geographic region." + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Bosnia and Herzegovina", + "country_order": 2, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Bulgaria", + "country_order": 3, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Croatia", + "country_order": 4, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Czechia", + "country_order": 5, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Montenegro", + "country_order": 6, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "North Macedonia", + "country_order": 7, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Poland", + "country_order": 8, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Russia", + "country_order": 9, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Serbia", + "country_order": 10, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Slovakia", + "country_order": 11, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Slovenia", + "country_order": 12, + "notes": null + }, + { + "region_id": "EE_SLAVIC", + "region_name": "Eastern Europe / Slavic world", + "country": "Ukraine", + "country_order": 13, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Brunei", + "country_order": 1, + "notes": "Modern sovereign states conventionally grouped as Southeast Asia." + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Cambodia", + "country_order": 2, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Indonesia", + "country_order": 3, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Laos", + "country_order": 4, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Malaysia", + "country_order": 5, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Myanmar", + "country_order": 6, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Philippines", + "country_order": 7, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Singapore", + "country_order": 8, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Thailand", + "country_order": 9, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Timor-Leste", + "country_order": 10, + "notes": null + }, + { + "region_id": "SE_ASIA", + "region_name": "Southeast Asia", + "country": "Vietnam", + "country_order": 11, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Bahrain", + "country_order": 1, + "notes": "Arabian Peninsula plus the core Levant. Iraq is not duplicated here because it already has a dedicated original-chart span." + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Israel", + "country_order": 2, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Jordan", + "country_order": 3, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Kuwait", + "country_order": 4, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Lebanon", + "country_order": 5, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Oman", + "country_order": 6, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Palestine", + "country_order": 7, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Qatar", + "country_order": 8, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Saudi Arabia", + "country_order": 9, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Syria", + "country_order": 10, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "United Arab Emirates", + "country_order": 11, + "notes": null + }, + { + "region_id": "ARAB_LEVANT", + "region_name": "Arabia and the Levant", + "country": "Yemen", + "country_order": 12, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Angola", + "country_order": 1, + "notes": "Broad modern-country grouping; Sudan is kept with North Africa, while Mauritania is included with sub-Saharan/West Africa." + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Benin", + "country_order": 2, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Botswana", + "country_order": 3, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Burkina Faso", + "country_order": 4, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Burundi", + "country_order": 5, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Cabo Verde", + "country_order": 6, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Cameroon", + "country_order": 7, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Central African Republic", + "country_order": 8, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Chad", + "country_order": 9, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Comoros", + "country_order": 10, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Democratic Republic of the Congo", + "country_order": 11, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Djibouti", + "country_order": 12, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Equatorial Guinea", + "country_order": 13, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Eritrea", + "country_order": 14, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Eswatini", + "country_order": 15, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Ethiopia", + "country_order": 16, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Gabon", + "country_order": 17, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Gambia", + "country_order": 18, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Ghana", + "country_order": 19, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Guinea", + "country_order": 20, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Guinea-Bissau", + "country_order": 21, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Côte d’Ivoire", + "country_order": 22, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Kenya", + "country_order": 23, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Lesotho", + "country_order": 24, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Liberia", + "country_order": 25, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Madagascar", + "country_order": 26, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Malawi", + "country_order": 27, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Mali", + "country_order": 28, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Mauritania", + "country_order": 29, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Mauritius", + "country_order": 30, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Mozambique", + "country_order": 31, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Namibia", + "country_order": 32, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Niger", + "country_order": 33, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Nigeria", + "country_order": 34, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Republic of the Congo", + "country_order": 35, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Rwanda", + "country_order": 36, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "São Tomé and Príncipe", + "country_order": 37, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Senegal", + "country_order": 38, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Seychelles", + "country_order": 39, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Sierra Leone", + "country_order": 40, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Somalia", + "country_order": 41, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "South Africa", + "country_order": 42, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "South Sudan", + "country_order": 43, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Tanzania", + "country_order": 44, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Togo", + "country_order": 45, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Uganda", + "country_order": 46, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Zambia", + "country_order": 47, + "notes": null + }, + { + "region_id": "SSA", + "region_name": "Sub-Saharan Africa", + "country": "Zimbabwe", + "country_order": 48, + "notes": null + } +] diff --git a/data/seais.json b/data/seais.json new file mode 100644 index 0000000..44e9ed6 --- /dev/null +++ b/data/seais.json @@ -0,0 +1,1413 @@ +[ + { + "seai_id": "M01", + "name": "Moon Landing", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1969, + "year_label": "1969", + "box_id": "US_MODERN", + "box_name": "United States", + "span": "United States", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 1, + "historical_year": 1969, + "notes": "Apollo 11.", + "confidence": "High" + }, + { + "seai_id": "M02", + "name": "Digital Revolution", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1970, + "year_label": "c. 1970", + "box_id": "US_MODERN", + "box_name": "United States", + "span": "United States", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 2, + "historical_year": 1970, + "notes": "Representative plotting year for the chart's broad 'Digital Revolution' milestone.", + "confidence": "High" + }, + { + "seai_id": "M03", + "name": "Discovery of Insulin", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1921, + "year_label": "1921", + "box_id": "CA_MODERN", + "box_name": "Canada", + "span": "Canada", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 3, + "historical_year": 1921, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "M04", + "name": "Maize Cultivation", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": -2000, + "year_label": "c. 2000 BCE", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "span": "Mexico", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 4, + "historical_year": -2000, + "notes": "Chart placement is near the start of the Mexico Indigenous Era; this is not the earliest archaeological domestication date.", + "confidence": "High" + }, + { + "seai_id": "M05", + "name": "Maya Astronomy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 500, + "year_label": "c. 500", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "span": "Mexico", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 5, + "historical_year": 500, + "notes": "Representative plotting year for the chart milestone.", + "confidence": "High" + }, + { + "seai_id": "M06", + "name": "Tango", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1880, + "year_label": "c. 1880", + "box_id": "AR_MODERN", + "box_name": "Argentina", + "span": "Argentina", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 6, + "historical_year": 1880, + "notes": "Representative emergence date.", + "confidence": "High" + }, + { + "seai_id": "M07", + "name": "Wi-Fi Innovation", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1992, + "year_label": "c. 1992", + "box_id": "AU_MODERN", + "box_name": "Australia", + "span": "Australia", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 7, + "historical_year": 1992, + "notes": "Representative CSIRO-era WLAN innovation date.", + "confidence": "High" + }, + { + "seai_id": "M08", + "name": "Laws of Motion & Gravity", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1687, + "year_label": "1687", + "box_id": "UK_STUART", + "box_name": "Stuart Dynasty", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 8, + "historical_year": 1687, + "notes": "Newton's Principia.", + "confidence": "High" + }, + { + "seai_id": "M09", + "name": "Watt's Steam Engine", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1769, + "year_label": "1769", + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 9, + "historical_year": 1769, + "notes": "Watt's separate-condenser steam-engine patent era.", + "confidence": "High" + }, + { + "seai_id": "M10", + "name": "Natural Selection", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1859, + "year_label": "1859", + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 10, + "historical_year": 1859, + "notes": "Publication of On the Origin of Species.", + "confidence": "High" + }, + { + "seai_id": "M11", + "name": "Route to India", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1498, + "year_label": "1498", + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "span": "Portugal", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 11, + "historical_year": 1498, + "notes": "Vasco da Gama reaches India by sea.", + "confidence": "High" + }, + { + "seai_id": "M12", + "name": "Discovery of the Americas", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1492, + "year_label": "1492", + "box_id": "ES_UNIFICATION", + "box_name": "Unification of Spain", + "span": "Spain", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 12, + "historical_year": 1492, + "notes": "Columbus's first Atlantic voyage.", + "confidence": "High" + }, + { + "seai_id": "M13", + "name": "Rights of Man", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1789, + "year_label": "1789", + "box_id": "FR_BOURBON", + "box_name": "Bourbon France", + "span": "France", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 13, + "historical_year": 1789, + "notes": "Declaration of the Rights of Man and of the Citizen.", + "confidence": "High" + }, + { + "seai_id": "M14", + "name": "Metric System", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1792, + "year_label": "1792", + "box_id": "FR_UNNAMED_1792", + "box_name": "[Unlabeled France segment]", + "span": "France", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 14, + "historical_year": 1792, + "notes": "Marker sits in the thin unlabeled French transition segment beginning in 1792.", + "confidence": "High" + }, + { + "seai_id": "M15", + "name": "Renaissance", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1494, + "year_label": "c. 1494", + "box_id": "IT_DIVIDED", + "box_name": "Age of Divided Italy", + "span": "Italy", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 15, + "historical_year": 1494, + "notes": "The chart marker is placed at the start of the Age of Divided Italy; Renaissance dating is conventionally broader.", + "confidence": "High" + }, + { + "seai_id": "M16", + "name": "Printing Press", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1450, + "year_label": "c. 1450", + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "span": "Germany", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 16, + "historical_year": 1450, + "notes": "Gutenberg-era movable-type printing.", + "confidence": "High" + }, + { + "seai_id": "M17", + "name": "Automobile", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1886, + "year_label": "1886", + "box_id": "DE_EMPIRE", + "box_name": "German Empire", + "span": "Germany", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 17, + "historical_year": 1886, + "notes": "Benz Patent-Motorwagen era.", + "confidence": "High" + }, + { + "seai_id": "M18", + "name": "Theory of Relativity", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1905, + "year_label": "1905", + "box_id": "DE_EMPIRE", + "box_name": "German Empire", + "span": "Germany", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 18, + "historical_year": 1905, + "notes": "Einstein's special-relativity paper.", + "confidence": "High" + }, + { + "seai_id": "M19", + "name": "Classical Music", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1750, + "year_label": "c. 1750", + "box_id": "AT_HABSBURG", + "box_name": "Habsburg Austria", + "span": "Austria", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 19, + "historical_year": 1750, + "notes": "Representative plotting year for the Classical era.", + "confidence": "High" + }, + { + "seai_id": "M20", + "name": "Olympic Games", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1896, + "year_label": "1896", + "box_id": "GR_KINGDOM1", + "box_name": "Kingdom of Greece", + "span": "Greece", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 20, + "historical_year": 1896, + "notes": "First modern Olympic Games in Athens.", + "confidence": "High" + }, + { + "seai_id": "M21", + "name": "Birth of Democracy", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": -508, + "year_label": "c. 508 BCE", + "box_id": "GR_CLASSICAL", + "box_name": "Classical Greek City-States", + "span": "Greece", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 21, + "historical_year": -508, + "notes": "Athenian democratic reforms.", + "confidence": "High" + }, + { + "seai_id": "M22", + "name": "Justinian Code", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 529, + "year_label": "529", + "box_id": "BYZANTINE", + "box_name": "Byzantine Empire", + "span": "Greece; Turkey; Egypt", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 22, + "historical_year": 529, + "notes": "Codification under Justinian I.", + "confidence": "High" + }, + { + "seai_id": "M23", + "name": "Pyramids", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": -2560, + "year_label": "c. 2560 BCE", + "box_id": "EG_OLD", + "box_name": "Old Kingdom", + "span": "Egypt", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 23, + "historical_year": -2560, + "notes": "Great Pyramid era.", + "confidence": "High" + }, + { + "seai_id": "M24", + "name": "Code of Hammurabi", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": -1754, + "year_label": "c. 1754 BCE", + "box_id": "IQ_OLD_BAB", + "box_name": "Old Babylonian Kingdom", + "span": "Iraq", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 24, + "historical_year": -1754, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "M25", + "name": "Yoga", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": -3000, + "year_label": "c. 3000 BCE", + "box_id": "SA_INDUS", + "box_name": "Indus Valley Civilization", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 25, + "historical_year": -3000, + "notes": "Chart marker is placed high in the Indus Valley Civilization box; precise origins are debated.", + "confidence": "High" + }, + { + "seai_id": "M26", + "name": "The Concept of Zero", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 628, + "year_label": "628", + "box_id": "SA_HARSHA", + "box_name": "Harsha's Empire", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 26, + "historical_year": 628, + "notes": "Brahmagupta's formal treatment of zero.", + "confidence": "High" + }, + { + "seai_id": "M27", + "name": "Papermaking", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 105, + "year_label": "105", + "box_id": "CN_HAN", + "box_name": "Han Dynasty", + "span": "China", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 27, + "historical_year": 105, + "notes": "Traditionally associated with Cai Lun.", + "confidence": "High" + }, + { + "seai_id": "M28", + "name": "Compass", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1044, + "year_label": "c. 1044", + "box_id": "CN_SONG", + "box_name": "Song Dynasty", + "span": "China", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 28, + "historical_year": 1044, + "notes": "Representative Song-era written description of a magnetic compass.", + "confidence": "High" + }, + { + "seai_id": "M29", + "name": "Lean Manufacturing", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1950, + "year_label": "c. 1950", + "box_id": "JP_MODERN", + "box_name": "Japan", + "span": "Japan", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 29, + "historical_year": 1950, + "notes": "Representative Toyota Production System era.", + "confidence": "High" + }, + { + "seai_id": "M30", + "name": "Bullet Train", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Milestone of Civilization", + "year": 1964, + "year_label": "1964", + "box_id": "JP_MODERN", + "box_name": "Japan", + "span": "Japan", + "icon_present": true, + "icon_type": "numbered_circle", + "icon_number": 30, + "historical_year": 1964, + "notes": "Opening of the Tōkaidō Shinkansen.", + "confidence": "High" + }, + { + "seai_id": "L01", + "name": "Mesa Verde", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1200, + "year_label": "c. 1200", + "box_id": "US_INDIG", + "box_name": "Indigenous Era", + "span": "United States", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1200, + "notes": "Representative date for the major cliff-dwelling period.", + "confidence": "High" + }, + { + "seai_id": "L02", + "name": "Chaco Culture", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1050, + "year_label": "c. 1050", + "box_id": "US_INDIG", + "box_name": "Indigenous Era", + "span": "United States", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1050, + "notes": "Representative peak-era date.", + "confidence": "High" + }, + { + "seai_id": "L03", + "name": "Cahokia Mounds", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1100, + "year_label": "c. 1100", + "box_id": "US_INDIG", + "box_name": "Indigenous Era", + "span": "United States", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1100, + "notes": "Representative peak-era date.", + "confidence": "High" + }, + { + "seai_id": "L04", + "name": "Statue of Liberty", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1886, + "year_label": "1886", + "box_id": "US_MODERN", + "box_name": "United States", + "span": "United States", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1886, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L05", + "name": "Head-Smashed-In Buffalo Jump", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1000, + "year_label": "c. 1000", + "box_id": "CA_INDIG", + "box_name": "Indigenous Era", + "span": "Canada", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1000, + "notes": "Single plotting year is representative; the site was used over millennia.", + "confidence": "High" + }, + { + "seai_id": "L06", + "name": "Parliament Hill", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1859, + "year_label": "1859", + "box_id": "CA_COLONIAL", + "box_name": "Colonial Canada", + "span": "Canada", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1859, + "notes": "Start of the original parliamentary complex construction era.", + "confidence": "High" + }, + { + "seai_id": "L07", + "name": "Chichen Itza", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 600, + "year_label": "c. 600", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "span": "Mexico", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 600, + "notes": "Representative founding/flourishing date.", + "confidence": "High" + }, + { + "seai_id": "L08", + "name": "Teotihuacan", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 200, + "year_label": "c. 200", + "box_id": "MX_INDIG", + "box_name": "Indigenous Era", + "span": "Mexico", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 200, + "notes": "Representative flourishing date.", + "confidence": "High" + }, + { + "seai_id": "L09", + "name": "Obelisk of Buenos Aires", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1936, + "year_label": "1936", + "box_id": "AR_MODERN", + "box_name": "Argentina", + "span": "Argentina", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1936, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L10", + "name": "Uluru", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": null, + "year_label": "Natural landmark", + "box_id": "AU_INDIG", + "box_name": "Indigenous Era", + "span": "Australia", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": null, + "notes": "No single historical construction year; retained as a chart landmark with null year.", + "confidence": "High" + }, + { + "seai_id": "L11", + "name": "Sydney Opera House", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1973, + "year_label": "1973", + "box_id": "AU_MODERN", + "box_name": "Australia", + "span": "Australia", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1973, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L12", + "name": "Stonehenge", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -2500, + "year_label": "c. 2500 BCE", + "box_id": "UK_CELTIC", + "box_name": "Celtic Era", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -2500, + "notes": "Representative late-Neolithic construction phase; predates the chart's Celtic framing.", + "confidence": "High" + }, + { + "seai_id": "L13", + "name": "Windsor Castle", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1070, + "year_label": "c. 1070", + "box_id": "UK_NORMAN", + "box_name": "Norman Dynasty", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1070, + "notes": "Founded shortly after the Norman Conquest.", + "confidence": "High" + }, + { + "seai_id": "L14", + "name": "Big Ben", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1859, + "year_label": "1859", + "box_id": "UK_HANOVER", + "box_name": "Hanoverian Dynasty", + "span": "United Kingdom", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1859, + "notes": "Clock/bell era.", + "confidence": "High" + }, + { + "seai_id": "L15", + "name": "Dolmens of Antequera", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -3500, + "year_label": "c. 3500 BCE", + "box_id": "PT_TRIBES", + "box_name": "Lusitanians and Other Tribes", + "span": "Portugal", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -3500, + "notes": "Historical construction predates the dated Lusitanian box; the poster uses the landmark illustratively.", + "confidence": "High" + }, + { + "seai_id": "L16", + "name": "Jerónimos Monastery", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1502, + "year_label": "1502", + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "span": "Portugal", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1502, + "notes": "Construction began in the early 16th century.", + "confidence": "High" + }, + { + "seai_id": "L17", + "name": "Belém Tower", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1514, + "year_label": "1514", + "box_id": "PT_KINGDOM", + "box_name": "Kingdom of Portugal", + "span": "Portugal", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1514, + "notes": "Construction began 1514; completed 1519.", + "confidence": "High" + }, + { + "seai_id": "L18", + "name": "Cave of Altamira", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -14500, + "year_label": "c. 14,500 BCE", + "box_id": "ES_IBERIAN", + "box_name": "Iberian & Celtic Tribes", + "span": "Spain", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -14500, + "notes": "Paleolithic cave art greatly predates the chart's Iberian/Celtic box; included because it is explicitly labeled there.", + "confidence": "High" + }, + { + "seai_id": "L19", + "name": "Alhambra", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1238, + "year_label": "1238", + "box_id": "ES_LATE_RECON", + "box_name": "Late Reconquista", + "span": "Spain", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1238, + "notes": "Start of the Nasrid palace complex / chart boundary.", + "confidence": "High" + }, + { + "seai_id": "L20", + "name": "Sagrada Família", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1882, + "year_label": "1882", + "box_id": "ES_CONSTITUTIONAL", + "box_name": "Constitutional Era", + "span": "Spain", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1882, + "notes": "Construction began.", + "confidence": "High" + }, + { + "seai_id": "L21", + "name": "Lascaux Cave", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -17000, + "year_label": "c. 17,000 BCE", + "box_id": "FR_GAUL", + "box_name": "Gaul", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -17000, + "notes": "Paleolithic cave art predates the Gaul box; poster uses it illustratively.", + "confidence": "High" + }, + { + "seai_id": "L22", + "name": "Mont-Saint-Michel", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 708, + "year_label": "708", + "box_id": "FR_FRANKISH", + "box_name": "Frankish Kingdom", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 708, + "notes": "Traditional foundation of the first sanctuary.", + "confidence": "High" + }, + { + "seai_id": "L23", + "name": "Notre-Dame de Paris", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1163, + "year_label": "1163", + "box_id": "FR_KINGDOM", + "box_name": "Kingdom of France", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1163, + "notes": "Construction began.", + "confidence": "High" + }, + { + "seai_id": "L24", + "name": "Louvre Museum", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1190, + "year_label": "c. 1190", + "box_id": "FR_KINGDOM", + "box_name": "Kingdom of France", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1190, + "notes": "Uses the original Louvre fortress construction as the plotting date; museum opened much later.", + "confidence": "High" + }, + { + "seai_id": "L25", + "name": "Palace of Versailles", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1682, + "year_label": "1682", + "box_id": "FR_BOURBON", + "box_name": "Bourbon France", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1682, + "notes": "Court moved to Versailles; construction began earlier.", + "confidence": "High" + }, + { + "seai_id": "L26", + "name": "Eiffel Tower", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1889, + "year_label": "1889", + "box_id": "FR_REPUBLICAN", + "box_name": "Republican France", + "span": "France", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1889, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L27", + "name": "Temple of Saturn", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -497, + "year_label": "c. 497 BCE", + "box_id": "ROMAN_REPUBLIC", + "box_name": "Roman Republic", + "span": "Portugal; Spain; France; Italy; Greece; Turkey", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -497, + "notes": "Traditional dedication date.", + "confidence": "High" + }, + { + "seai_id": "L28", + "name": "Colosseum", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 80, + "year_label": "80", + "box_id": "ROMAN_EMPIRE", + "box_name": "Roman Empire", + "span": "United Kingdom; Portugal; Spain; France; Italy; Germany; Austria; Greece; Turkey; Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 80, + "notes": "Completion/inauguration era.", + "confidence": "High" + }, + { + "seai_id": "L29", + "name": "Roman Forum", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 100, + "year_label": "c. 100", + "box_id": "ROMAN_EMPIRE", + "box_name": "Roman Empire", + "span": "United Kingdom; Portugal; Spain; France; Italy; Germany; Austria; Greece; Turkey; Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 100, + "notes": "The Forum developed over many centuries; 100 CE is a representative plotting year consistent with the poster's placement.", + "confidence": "High" + }, + { + "seai_id": "L30", + "name": "Leaning Tower of Pisa", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1173, + "year_label": "1173", + "box_id": "IT_MEDIEVAL_STATES", + "box_name": "Medieval Italian States", + "span": "Italy", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1173, + "notes": "Construction began.", + "confidence": "High" + }, + { + "seai_id": "L31", + "name": "Cologne Cathedral", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1248, + "year_label": "1248", + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "span": "Germany", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1248, + "notes": "Construction began.", + "confidence": "High" + }, + { + "seai_id": "L32", + "name": "Brandenburg Gate", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1791, + "year_label": "1791", + "box_id": "DE_HRE", + "box_name": "Holy Roman Empire", + "span": "Germany", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1791, + "notes": "Completed 1791.", + "confidence": "High" + }, + { + "seai_id": "L33", + "name": "St. Stephen's Cathedral", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1147, + "year_label": "1147", + "box_id": "AT_MARGRAVIATE", + "box_name": "Margraviate of Austria", + "span": "Austria", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1147, + "notes": "Early church dedication; later Gothic rebuilding.", + "confidence": "High" + }, + { + "seai_id": "L34", + "name": "Schönbrunn Palace", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1740, + "year_label": "c. 1740", + "box_id": "AT_HABSBURG", + "box_name": "Habsburg Austria", + "span": "Austria", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1740, + "notes": "Representative mid-18th-century rebuilding/imperial-palace date.", + "confidence": "High" + }, + { + "seai_id": "L35", + "name": "Parthenon", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -438, + "year_label": "438 BCE", + "box_id": "GR_CLASSICAL", + "box_name": "Classical Greek City-States", + "span": "Greece", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -438, + "notes": "Completed c. 438 BCE.", + "confidence": "High" + }, + { + "seai_id": "L36", + "name": "Hagia Sophia", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 537, + "year_label": "537", + "box_id": "BYZANTINE", + "box_name": "Byzantine Empire", + "span": "Greece; Turkey; Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 537, + "notes": "Current structure completed under Justinian I.", + "confidence": "High" + }, + { + "seai_id": "L37", + "name": "Blue Mosque", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1616, + "year_label": "1616", + "box_id": "OTTOMAN", + "box_name": "Ottoman Empire", + "span": "Greece; Turkey; Egypt; Iraq", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1616, + "notes": "Completed 1616.", + "confidence": "High" + }, + { + "seai_id": "L38", + "name": "Great Pyramid of Giza", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -2560, + "year_label": "c. 2560 BCE", + "box_id": "EG_OLD", + "box_name": "Old Kingdom", + "span": "Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -2560, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L39", + "name": "Karnak", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -2000, + "year_label": "c. 2000 BCE", + "box_id": "EG_MIDDLE", + "box_name": "Middle Kingdom", + "span": "Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -2000, + "notes": "Representative early major construction phase.", + "confidence": "High" + }, + { + "seai_id": "L40", + "name": "Abu Simbel", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -1264, + "year_label": "c. 1264 BCE", + "box_id": "EG_NEW", + "box_name": "New Kingdom", + "span": "Egypt", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -1264, + "notes": "Construction under Ramesses II.", + "confidence": "High" + }, + { + "seai_id": "L41", + "name": "Ziggurat of Ur", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -2100, + "year_label": "c. 2100 BCE", + "box_id": "IQ_SUMER_REN", + "box_name": "Sumerian Renaissance", + "span": "Iraq", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -2100, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L42", + "name": "Choqha Zanbil", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -1250, + "year_label": "c. 1250 BCE", + "box_id": "IR_TRIBES", + "box_name": "Iranian Tribes", + "span": "Iran", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -1250, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L43", + "name": "Persepolis", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -515, + "year_label": "c. 515 BCE", + "box_id": "PERSIAN", + "box_name": "Persian Empire", + "span": "Turkey; Egypt; Iraq; Iran; Pakistan; India", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -515, + "notes": "Construction began under Darius I.", + "confidence": "High" + }, + { + "seai_id": "L44", + "name": "Naqsh-e Jahan Square", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1602, + "year_label": "c. 1602", + "box_id": "IR_SAFAVID", + "box_name": "Safavid Empire", + "span": "Iran", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1602, + "notes": "Safavid-era construction.", + "confidence": "High" + }, + { + "seai_id": "L45", + "name": "Mohenjo-daro", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -2500, + "year_label": "c. 2500 BCE", + "box_id": "SA_INDUS", + "box_name": "Indus Valley Civilization", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -2500, + "notes": "Representative mature Harappan phase.", + "confidence": "High" + }, + { + "seai_id": "L46", + "name": "Taxila", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -600, + "year_label": "c. 600 BCE", + "box_id": "SA_VEDIC", + "box_name": "Vedic Period", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -600, + "notes": "Representative early urban/learning-center date; the site spans multiple periods.", + "confidence": "High" + }, + { + "seai_id": "L47", + "name": "Qutub Minar", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1220, + "year_label": "c. 1220", + "box_id": "SA_DELHI", + "box_name": "Delhi Sultanate", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1220, + "notes": "Representative completion of the early tower stages.", + "confidence": "High" + }, + { + "seai_id": "L48", + "name": "Taj Mahal", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1653, + "year_label": "1653", + "box_id": "SA_MUGHAL", + "box_name": "Mughal Empire", + "span": "Pakistan; India", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1653, + "notes": "Completion date.", + "confidence": "High" + }, + { + "seai_id": "L49", + "name": "Great Wall of China", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -700, + "year_label": "c. 700 BCE", + "box_id": "CN_ZHOU", + "box_name": "Zhou Dynasty", + "span": "China", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -700, + "notes": "Representative early wall-building era; later dynasties rebuilt extensively.", + "confidence": "High" + }, + { + "seai_id": "L50", + "name": "Terracotta Army", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": -210, + "year_label": "c. 210 BCE", + "box_id": "CN_QIN", + "box_name": "Qin Dynasty", + "span": "China", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": -210, + "notes": "Qin Shi Huang mausoleum complex.", + "confidence": "High" + }, + { + "seai_id": "L51", + "name": "Forbidden City", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1420, + "year_label": "1420", + "box_id": "CN_MING", + "box_name": "Ming Dynasty", + "span": "China", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1420, + "notes": "Completed 1420.", + "confidence": "High" + }, + { + "seai_id": "L52", + "name": "Kinkaku-ji", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1397, + "year_label": "1397", + "box_id": "JP_MUROMACHI", + "box_name": "Muromachi Shogunate", + "span": "Japan", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1397, + "notes": null, + "confidence": "High" + }, + { + "seai_id": "L53", + "name": "Himeji Castle", + "url": "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals", + "category": "Historical Landmark", + "year": 1609, + "year_label": "1609", + "box_id": "JP_TOKUGAWA", + "box_name": "Tokugawa Shogunate", + "span": "Japan", + "icon_present": true, + "icon_type": "landmark_icon", + "icon_number": null, + "historical_year": 1609, + "notes": "Major early-Edo reconstruction completed.", + "confidence": "High" + } +] diff --git a/docs/DATA_MODEL.md b/docs/DATA_MODEL.md index c116c7e..3defb3a 100644 --- a/docs/DATA_MODEL.md +++ b/docs/DATA_MODEL.md @@ -234,6 +234,16 @@ The build process should validate all IDs and foreign keys. At minimum: +Implemented in `tools/wh_data.py`. That implementation splits these rules into +two severities: **ERROR** (structural — duplicate/missing ID, broken foreign +key, malformed year, invalid numeric population, inconsistent low/high +bounds; fails the build) and **WARNING** (content-quality — TODO URLs, +missing population, off-vocabulary confidence/status/basis values, duplicate +knot points; reported but does not block the build). Where a rule below +doesn't say which, treat "unique"/"exists"/"malformed"/"invalid numeric" as +ERROR and "controlled vocabulary" as WARNING, since the workbook is expected +to be ahead of the documented vocabularies at this stage. + ### Boxes - `box_id` unique; diff --git a/tools/README.md b/tools/README.md index 25511f2..9bd4f55 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,10 +1,31 @@ # tools/ -Build-time scripts only. Nothing here runs in production. +Build-time scripts only. Nothing here runs in production — the deployed site +only ever reads the generated JSON in `data/`. -Planned: +- `wh_data.py` — shared loading/validation library (workbook -> row dicts, + the validation rules, and the ERROR/WARNING severity policy). Imported by + both scripts below; not a CLI itself. +- `build_data.py` — reads `source/*.xlsx`, validates it, and writes + `data/*.json`. Fails (exit 1, writes nothing) if validation finds any + ERROR-level problem; warnings are printed but don't block the build. + ``` + python3 tools/build_data.py + ``` +- `validate_data.py` — same validation as `build_data.py`, but only reports; + writes nothing. Useful as a quick check on the workbook alone. + ``` + python3 tools/validate_data.py + ``` -- `build_data.py` — reads `source/*.xlsx`, validates it, and writes `data/*.json`. -- `validate_data.py` — standalone validation pass (duplicate IDs, broken foreign keys, malformed years, invalid population ranges, unknown relation types). +Both accept `--source `; `build_data.py` also accepts `--out `. + +Requires `openpyxl` (`pip install openpyxl`). + +Run `validate_data.py` (or `build_data.py`, which validates first) after any +edit to the workbook, and regenerate `data/*.json` before committing a +workbook change. `data/*.json` should always be reproducible from +`source/*.xlsx` — if it isn't, that's a bug in these scripts, not something +to hand-patch in `data/`. See `docs/IMPLEMENTATION_PLAN.md` Phase 1. diff --git a/tools/build_data.py b/tools/build_data.py new file mode 100644 index 0000000..ac61140 --- /dev/null +++ b/tools/build_data.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +"""Build data/*.json from source/*.xlsx. + +Build-time only -- nothing in this script or its output requires a server. +See docs/IMPLEMENTATION_PLAN.md Phase 1. + +Usage: + python3 tools/build_data.py + python3 tools/build_data.py --source source/world_history_chart_dataset_v2.xlsx --out data + +Exits non-zero and writes nothing if validation finds any ERROR-level problem +(see tools/wh_data.py for the severity policy). Warnings are printed but do +not block the build. +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import wh_data # noqa: E402 + +# Maps sheet name -> output filename. Links/BoxSegments aren't in the +# workbook yet (see docs/DATA_MODEL.md #5, #6) so they aren't produced here. +OUTPUTS = { + "Boxes": "boxes.json", + "SEAIs": "seais.json", + "Population": "population.json", + "Regions": "regions.json", +} + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--source", default="source/world_history_chart_dataset_v2.xlsx") + parser.add_argument("--out", default="data") + args = parser.parse_args() + + source_path = Path(args.source) + if not source_path.exists(): + print(f"error: source workbook not found: {source_path}", file=sys.stderr) + return 1 + + tables = wh_data.load_workbook(str(source_path)) + report = wh_data.validate_all(tables) + + for w in report.warnings: + print(f"warning: {w}", file=sys.stderr) + for e in report.errors: + print(f"error: {e}", file=sys.stderr) + + counts = {name: len(rows) for name, rows in tables.items()} + print(f"loaded: {counts}", file=sys.stderr) + print(f"{len(report.warnings)} warning(s), {len(report.errors)} error(s)", file=sys.stderr) + + if not report.ok: + print("build FAILED: fix the error(s) above before data/*.json is regenerated", file=sys.stderr) + return 1 + + out_dir = Path(args.out) + out_dir.mkdir(parents=True, exist_ok=True) + for sheet_name, filename in OUTPUTS.items(): + out_path = out_dir / filename + with out_path.open("w", encoding="utf-8") as f: + json.dump(tables[sheet_name], f, indent=2, ensure_ascii=False, sort_keys=False) + f.write("\n") + print(f"wrote {out_path} ({len(tables[sheet_name])} rows)", file=sys.stderr) + + print("build OK", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/requirements.txt b/tools/requirements.txt new file mode 100644 index 0000000..4a16a09 --- /dev/null +++ b/tools/requirements.txt @@ -0,0 +1 @@ +openpyxl>=3.1,<4 diff --git a/tools/validate_data.py b/tools/validate_data.py new file mode 100644 index 0000000..843b2c1 --- /dev/null +++ b/tools/validate_data.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +"""Validate source/*.xlsx without writing anything to data/. + +Useful as a fast pre-commit check on the workbook alone. build_data.py runs +the same validation before it writes JSON; this script exists for the case +where you just want the report. See docs/IMPLEMENTATION_PLAN.md Phase 1. + +Usage: + python3 tools/validate_data.py + python3 tools/validate_data.py --source source/world_history_chart_dataset_v2.xlsx +""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import wh_data # noqa: E402 + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--source", default="source/world_history_chart_dataset_v2.xlsx") + args = parser.parse_args() + + source_path = Path(args.source) + if not source_path.exists(): + print(f"error: source workbook not found: {source_path}", file=sys.stderr) + return 1 + + tables = wh_data.load_workbook(str(source_path)) + report = wh_data.validate_all(tables) + + counts = {name: len(rows) for name, rows in tables.items()} + print(f"loaded: {counts}") + for w in report.warnings: + print(f"warning: {w}") + for e in report.errors: + print(f"error: {e}") + print(f"{len(report.warnings)} warning(s), {len(report.errors)} error(s)") + + if not report.ok: + print("VALIDATION FAILED") + return 1 + + print("VALIDATION OK") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tools/wh_data.py b/tools/wh_data.py new file mode 100644 index 0000000..46b7014 --- /dev/null +++ b/tools/wh_data.py @@ -0,0 +1,266 @@ +"""Shared loading/validation for the World History Explorer data pipeline. + +Used by build_data.py (loads -> validates -> writes data/*.json) and +validate_data.py (loads -> validates -> reports, writes nothing). Keeping the +logic here means both scripts see exactly the same rules. + +This module is build-time only. Nothing here ships to the browser. + +Severity policy (see docs/DATA_MODEL.md #8 and docs/IMPLEMENTATION_PLAN.md +Phase 1): + +- ERROR = structural problem (duplicate/missing ID, broken foreign key, + malformed year, invalid numeric population, inconsistent low/high bounds). + The build must fail rather than emit generated JSON that can't be trusted. +- WARNING = content-quality flag (TODO URLs, missing population, low/unknown + confidence, off-vocabulary values not yet reconciled with docs/DATA_MODEL.md's + recommended lists, suspicious dates). These are expected at this stage of + the project and are not blockers. +""" + +from __future__ import annotations + +import math +import re +from dataclasses import dataclass, field + +import openpyxl + +TODO_URL = "https://en.wikipedia.org/wiki/Time_management#Implementation_of_goals" + +HEX_RE = re.compile(r"^#[0-9A-Fa-f]{6}$") + +# Recommended/expected controlled vocabularies. Values outside these are +# WARNed on, not rejected -- the workbook is allowed to be ahead of the docs. +CONFIDENCE_LEVELS = {"High", "Medium", "Low", "Unknown"} +POPULATION_STATUS = {"TODO", "Estimated", "Verified"} +POPULATION_BASIS_RECOMMENDED = { + "polity_total", + "territorial_segment", + "modern_country_total", + "other", +} +# "TBD" is the workbook's own placeholder for basis/method, distinct from the +# recommended vocabulary above -- treated like the TODO URL: expected for now. +PLACEHOLDER_BASIS_METHOD = "TBD" + +SHEETS = { + "Boxes": {"header_row": 1}, + "SEAIs": {"header_row": 1}, + "Population": {"header_row": 3}, + "Regions": {"header_row": 3}, +} + + +@dataclass +class Report: + errors: list[str] = field(default_factory=list) + warnings: list[str] = field(default_factory=list) + + def error(self, msg: str) -> None: + self.errors.append(msg) + + def warn(self, msg: str) -> None: + self.warnings.append(msg) + + @property + def ok(self) -> bool: + return not self.errors + + +def _clean(value): + """Normalize a raw cell value: strip strings, blank string -> None.""" + if isinstance(value, str): + value = value.strip() + return value or None + return value + + +def load_sheet(wb, name: str) -> list[dict]: + header_row = SHEETS[name]["header_row"] + ws = wb[name] + header = list(next(ws.iter_rows(min_row=header_row, max_row=header_row, values_only=True))) + rows = [] + for raw in ws.iter_rows(min_row=header_row + 1, values_only=True): + if all(c is None for c in raw): + continue # skip fully blank rows + rows.append({col: _clean(v) for col, v in zip(header, raw) if col is not None}) + return rows + + +def load_workbook(path: str) -> dict[str, list[dict]]: + wb = openpyxl.load_workbook(path, data_only=True) + missing = [name for name in SHEETS if name not in wb.sheetnames] + if missing: + raise ValueError(f"workbook is missing expected sheet(s): {missing}") + return {name: load_sheet(wb, name) for name in SHEETS} + + +def _is_number(value) -> bool: + return isinstance(value, (int, float)) and not isinstance(value, bool) + + +def validate_boxes(boxes: list[dict], report: Report) -> dict[str, dict]: + by_id: dict[str, dict] = {} + seen_ids: set[str] = set() + for row in boxes: + box_id = row.get("box_id") + if not box_id: + report.error(f"Boxes: row missing box_id: {row!r}") + continue + if box_id in seen_ids: + report.error(f"Boxes: duplicate box_id '{box_id}'") + seen_ids.add(box_id) + by_id[box_id] = row + + for field_name in ("start_year", "end_year"): + v = row.get(field_name) + if v is not None and not _is_number(v): + report.error(f"Boxes[{box_id}]: malformed {field_name} = {v!r}") + + sy, ey = row.get("start_year"), row.get("end_year") + if _is_number(sy) and _is_number(ey) and sy > ey: + report.error(f"Boxes[{box_id}]: start_year ({sy}) > end_year ({ey})") + + color_hex = row.get("color_hex") + if not color_hex or not HEX_RE.match(str(color_hex)): + report.error(f"Boxes[{box_id}]: invalid color_hex {color_hex!r}") + + confidence = row.get("confidence") + if confidence not in CONFIDENCE_LEVELS: + report.warn(f"Boxes[{box_id}]: confidence {confidence!r} outside {sorted(CONFIDENCE_LEVELS)}") + + url = row.get("url") + if not url: + report.error(f"Boxes[{box_id}]: missing url (should at least hold the TODO placeholder)") + elif url == TODO_URL: + report.warn(f"Boxes[{box_id}]: url is still the TODO placeholder") + + return by_id + + +def validate_seais(seais: list[dict], box_ids: set[str], report: Report) -> None: + seen_ids: set[str] = set() + for row in seais: + seai_id = row.get("seai_id") + if not seai_id: + report.error(f"SEAIs: row missing seai_id: {row!r}") + continue + if seai_id in seen_ids: + report.error(f"SEAIs: duplicate seai_id '{seai_id}'") + seen_ids.add(seai_id) + + box_id = row.get("box_id") + if not box_id: + report.error(f"SEAIs[{seai_id}]: missing box_id") + elif box_id not in box_ids: + report.error(f"SEAIs[{seai_id}]: box_id '{box_id}' does not exist in Boxes") + + for field_name in ("year", "historical_year"): + v = row.get(field_name) + if v is not None and not _is_number(v): + report.error(f"SEAIs[{seai_id}]: malformed {field_name} = {v!r}") + + confidence = row.get("confidence") + if confidence not in CONFIDENCE_LEVELS: + report.warn(f"SEAIs[{seai_id}]: confidence {confidence!r} outside {sorted(CONFIDENCE_LEVELS)}") + + url = row.get("url") + if not url: + report.error(f"SEAIs[{seai_id}]: missing url (should at least hold the TODO placeholder)") + elif url == TODO_URL: + report.warn(f"SEAIs[{seai_id}]: url is still the TODO placeholder") + + +def validate_population(pop: list[dict], box_ids: set[str], report: Report) -> None: + seen_ids: set[str] = set() + seen_knots: dict[tuple, int] = {} + for row in pop: + pid = row.get("population_id") + if not pid: + report.error(f"Population: row missing population_id: {row!r}") + continue + if pid in seen_ids: + report.error(f"Population: duplicate population_id '{pid}'") + seen_ids.add(pid) + + box_id = row.get("box_id") + if not box_id: + report.error(f"Population[{pid}]: missing box_id") + elif box_id not in box_ids: + report.error(f"Population[{pid}]: box_id '{box_id}' does not exist in Boxes") + + year = row.get("year") + if year is not None and not _is_number(year): + report.error(f"Population[{pid}]: malformed year = {year!r}") + + knot = (box_id, year, row.get("sample_type")) + if knot in seen_knots: + report.warn(f"Population[{pid}]: duplicate knot point {knot} (also row {seen_knots[knot]!r})") + else: + seen_knots[knot] = pid + + population = row.get("population") + low, high = row.get("population_low"), row.get("population_high") + if population is None: + report.warn(f"Population[{pid}]: population not yet filled") + else: + if not _is_number(population): + report.error(f"Population[{pid}]: malformed population = {population!r}") + elif population <= 0: + report.error(f"Population[{pid}]: population must be > 0, got {population}") + if _is_number(low) and _is_number(population) and low > population: + report.error(f"Population[{pid}]: population_low ({low}) > population ({population})") + if _is_number(high) and _is_number(population) and population > high: + report.error(f"Population[{pid}]: population ({population}) > population_high ({high})") + + status = row.get("status") + if status not in POPULATION_STATUS: + report.warn(f"Population[{pid}]: status {status!r} outside {sorted(POPULATION_STATUS)}") + + for field_name in ("population_basis", "estimate_method"): + v = row.get(field_name) + if v is not None and v != PLACEHOLDER_BASIS_METHOD and field_name == "population_basis" and v not in POPULATION_BASIS_RECOMMENDED: + report.warn(f"Population[{pid}]: {field_name} {v!r} outside recommended vocabulary {sorted(POPULATION_BASIS_RECOMMENDED)}") + + +def validate_regions(regions: list[dict], report: Report) -> None: + seen_pairs: set[tuple] = set() + for row in regions: + region_id, country = row.get("region_id"), row.get("country") + if not region_id or not row.get("region_name") or not country: + report.error(f"Regions: row missing region_id/region_name/country: {row!r}") + continue + pair = (region_id, country) + if pair in seen_pairs: + report.error(f"Regions: duplicate (region_id, country) pair {pair}") + seen_pairs.add(pair) + + +def compute_log10_population(pop: list[dict], report: Report) -> None: + """Recompute log10_population from population at build time -- it's a + derived field per docs/DATA_MODEL.md, not hand-authored.""" + for row in pop: + population = row.get("population") + if _is_number(population) and population > 0: + computed = round(math.log10(population), 4) + existing = row.get("log10_population") + if _is_number(existing) and abs(existing - computed) > 1e-3: + report.warn( + f"Population[{row.get('population_id')}]: workbook log10_population " + f"{existing} does not match computed {computed}; overwriting with computed value" + ) + row["log10_population"] = computed + else: + row["log10_population"] = None + + +def validate_all(tables: dict[str, list[dict]]) -> Report: + report = Report() + boxes_by_id = validate_boxes(tables["Boxes"], report) + box_ids = set(boxes_by_id) + validate_seais(tables["SEAIs"], box_ids, report) + validate_population(tables["Population"], box_ids, report) + validate_regions(tables["Regions"], report) + compute_log10_population(tables["Population"], report) + return report From 367953b7935c26c056d12ac29cc5dd635243213a Mon Sep 17 00:00:00 2001 From: erikson1970 Date: Sun, 6 Sep 2026 18:22:10 -0400 Subject: [PATCH 04/22] Milestone 1 council review: reconcile findings, close out to main Three-lens review (data integrity, static-site architecture/constraints, process & documentation consistency) completed with no gatekeeper findings: - Data integrity: PASS - Architecture/constraints: PASS - Process/docs: PASS_WITH_MINOR_ISSUES Fixed inline: - ISSUE-005 was misfiled under '## Resolved' despite its own Status field saying Tabled since Milestone 0; moved to '## Tabled'. - tools/README.md now points at tools/requirements.txt instead of a bare 'pip install openpyxl'. - docs/STATUS.md refreshed to mention the build/validation pipeline. Filed as tabled minor issues (not gatekeepers): - ISSUE-007: dead code in wh_data.py's vocabulary-check loop (estimate_method branch can never fire). - ISSUE-008: malformed/corrupt workbook produces a raw Python traceback instead of a clean CLI error (fails safely either way). TRACEABILITY.md and ISSUES.md updated with the Milestone 1 council review record. --- ISSUES.md | 40 +++++++++++++++++++++++++++++++++------- TRACEABILITY.md | 8 +++++++- docs/STATUS.md | 4 +++- tools/README.md | 2 +- 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/ISSUES.md b/ISSUES.md index d7225a8..2b6a5d9 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -54,6 +54,28 @@ _(none yet — see Tabled below)_ - **Description:** `build_data.py`/`validate_data.py` were exercised manually against the real workbook and against a deliberately corrupted copy (duplicate `box_id`, invalid `color_hex`, cascading FK break) to confirm the ERROR path genuinely blocks output. There's no repeatable test file for this yet. - **Deferred until:** whenever the validation logic grows complex enough that manual spot-checks stop being sufficient, or before a CI step is added. +### ISSUE-005 — Six `Boxes` rows have no `start_year` +- **Severity:** Minor +- **Status:** Tabled +- **Source:** Data-integrity council review of `source/world_history_chart_dataset_v2.xlsx` +- **Description:** A handful of "Indigenous Era" boxes (e.g. `US_INDIG`, `CA_INDIG`, `AR_INDIG`, `AU_INDIG`) have a null `start_year` because the poster prints an illegible "c. [BCE]" with no parseable number there. `end_year` is always present, and `DATA_MODEL.md`'s rule only requires `start_year <= end_year` "when both exist," so this is not a validation-rule violation — just an open transcription gap, consistent with STATUS.md limitation #2. +- **Resolution:** None yet. Left for whoever transcribes those boxes' start dates, or for the build script to render them with an explicit "unknown start" treatment. +- **Note:** This entry was misfiled under `## Resolved` from Milestone 0 through Milestone 1 despite its own `Status:` field always saying `Tabled` — caught and moved here by the Milestone 1 process/docs council review. + +### ISSUE-007 — `wh_data.py` vocabulary-check loop has dead code for `estimate_method` +- **Severity:** Minor +- **Status:** Tabled +- **Source:** Milestone 1 data-integrity council review +- **Description:** The loop in `validate_population` iterates `for field_name in ("population_basis", "estimate_method")`, but the guard condition only fires for `field_name == "population_basis"`, so the `estimate_method` branch can never execute. Harmless today because `DATA_MODEL.md` §3 defines no recommended vocabulary for `estimate_method` (nothing is actually missed), but the code reads as if both fields are checked. +- **Deferred until:** whenever `estimate_method` gets a real controlled vocabulary, or general pipeline cleanup. + +### ISSUE-008 — Malformed/corrupt source workbook produces a raw Python traceback, not a clean CLI error +- **Severity:** Minor +- **Status:** Tabled +- **Source:** Milestone 1 data-integrity council review +- **Description:** A truncated/non-zip `.xlsx` raises an uncaught `zipfile.BadZipFile` from inside `openpyxl.load_workbook`, and a workbook missing an expected sheet raises an uncaught `ValueError` from `wh_data.load_workbook`; neither is wrapped in a try/except in `build_data.py`/`validate_data.py`. Confirmed safe in both cases (exit code 1, no output written) — just not a clean `error:`-prefixed message like the already-handled missing-`--source`-file case. +- **Deferred until:** whenever the CLI's error UX is revisited, or before non-maintainers start editing the workbook directly. + ## Resolved ### ISSUE-000 — Repo contained an unrelated portfolio template and stray files @@ -62,13 +84,6 @@ _(none yet — see Tabled below)_ - **Description:** `index.html` and `static/` held a generic "Portfolio template" theme (Lorem Ipsum, fake bios) unrelated to this project; `HotelList.txt` (personal hotel-search links) and `chat_log.md` (dead sandbox links from doc handoff) were also present. - **Resolution:** Removed `static/`, `HotelList.txt`, `chat_log.md`; replaced `index.html` with a minimal placeholder. Closed by Milestone 0 council review. -### ISSUE-005 — Six `Boxes` rows have no `start_year` -- **Severity:** Minor -- **Status:** Tabled -- **Source:** Data-integrity council review of `source/world_history_chart_dataset_v2.xlsx` -- **Description:** A handful of "Indigenous Era" boxes (e.g. `US_INDIG`, `CA_INDIG`, `AR_INDIG`, `AU_INDIG`) have a null `start_year` because the poster prints an illegible "c. [BCE]" with no parseable number there. `end_year` is always present, and `DATA_MODEL.md`'s rule only requires `start_year <= end_year` "when both exist," so this is not a validation-rule violation — just an open transcription gap, consistent with STATUS.md limitation #2. -- **Resolution:** None yet. Left for whoever transcribes those boxes' start dates, or for the build script to render them with an explicit "unknown start" treatment. - ## Milestone council reviews ### Milestone 0 — Repository reset & data intake @@ -81,3 +96,14 @@ Reviewed 2026-09-06 against commit `3f84688` (branch `feature/repo-reset`), thre | Process & documentation consistency | PASS_WITH_MINOR_ISSUES | No gatekeeper findings. The process/docs reviewer's minor findings (severity-field enum drift on a resolved issue, no per-entry `Status:` field, ambiguity in `AGENTS.md`'s milestone-review process) were fixed inline in this document and in `AGENTS.md` rather than filed as separate issues. Milestone approved to merge to `main`. + +### Milestone 1 — Data build pipeline +Reviewed 2026-09-06 against commit `74459d7` (branch `feature/build-data-pipeline`), three lenses: + +| Reviewer | Verdict | +|---|---| +| Data integrity | PASS | +| Static-site architecture / constraints | PASS | +| Process & documentation consistency | PASS_WITH_MINOR_ISSUES | + +No gatekeeper findings. New minor issues filed: ISSUE-007 (dead code in a vocabulary-check loop), ISSUE-008 (raw traceback on a malformed/corrupt workbook instead of a clean CLI error). The process reviewer's misfiled-`ISSUE-005` finding was fixed inline (moved from `## Resolved` to `## Tabled`, matching its own `Status:` field). Also fixed inline: `tools/README.md` now points at `tools/requirements.txt`, and `docs/STATUS.md` was refreshed to mention the build/validation pipeline. Milestone approved to merge to `main`. diff --git a/TRACEABILITY.md b/TRACEABILITY.md index 6cbda97..e895463 100644 --- a/TRACEABILITY.md +++ b/TRACEABILITY.md @@ -63,7 +63,13 @@ content-quality issues. | M1-8 | `data/*.json` reproducible from `source/*.xlsx`, never hand-edited | AGENTS.md § Source of truth | Met | `data/README.md` states the rule; build overwrites deterministically on every run | | M1-9 | No runtime Python — build-time only | AGENTS.md § Project intent | Met | `tools/` scripts run only at build time; no Python referenced from `index.html`/`js/` | -Council review: not yet run for this milestone — pending before merge to `main`. +### Milestone 1 council review + +Reviewed 2026-09-06 against commit `74459d7`: data integrity PASS, static-site +architecture/constraints PASS, process & documentation consistency +PASS_WITH_MINOR_ISSUES (a misfiled issue entry and two stale-docs nits, no +gatekeeper findings — see `ISSUES.md` § Milestone council reviews). Merged to +`main`. ## v0.1 definition of done (forward-looking; not yet in scope) diff --git a/docs/STATUS.md b/docs/STATUS.md index 2fcb51f..9f4bc6a 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -2,10 +2,12 @@ ## Status summary -**Phase:** data transcription complete enough for visualization prototyping. +**Phase:** data transcription complete enough for visualization prototyping; a validated build pipeline (`tools/build_data.py`) now converts the workbook into the `data/*.json` the site actually loads. The project currently has a usable first-pass dataset derived from the ChartOrigin *Timeline of World History* poster. +`data/*.json` is generated, not authored, and must never be hand-edited — see `data/README.md`/`tools/README.md`. Re-run `python3 tools/build_data.py` after any workbook edit; it fails (writes nothing) on structural problems and warns on content-quality gaps (see `docs/DATA_MODEL.md` §8). + Canonical poster/source page: - https://chartorigin.com/product/timeline-of-world-history/ diff --git a/tools/README.md b/tools/README.md index 9bd4f55..56cc975 100644 --- a/tools/README.md +++ b/tools/README.md @@ -20,7 +20,7 @@ only ever reads the generated JSON in `data/`. Both accept `--source `; `build_data.py` also accepts `--out `. -Requires `openpyxl` (`pip install openpyxl`). +Requires `openpyxl` (`pip install -r tools/requirements.txt`). Run `validate_data.py` (or `build_data.py`, which validates first) after any edit to the workbook, and regenerate `data/*.json` before committing a From 7511beed3a85ab59e12d9abd71732799c3fd2a92 Mon Sep 17 00:00:00 2001 From: erikson1970 Date: Sun, 6 Sep 2026 18:24:39 -0400 Subject: [PATCH 05/22] Milestone 2: minimal static application (Phase 2) A genuinely interactive first slice: load the generated JSON, list all Boxes sorted by start year with color swatches, click to select and see an inspector panel (name, dates, region, span, confidence, notes, URL, linked SEAIs), and filter the list by region_group. - js/data.js: loadAllData() fetches data/*.json in parallel and builds boxesById/seaisByBoxId/populationByBoxId indices; regionGroups() for the filter control. - js/state.js: createStore(), a minimal pub-sub state container with the field shapes from docs/IMPLEMENTATION_PLAN.md Phase 2. - js/app.js: wires data + state + DOM rendering; no framework, plain ES modules per AGENTS.md. - css/history.css: minimal responsive styling; light/dark via prefers-color-scheme; selection state carries a checkmark + bold text, not just background color (AGENTS.md accessibility: color isn't the sole encoding); list items are real