Skip to content

Commit 56899a3

Browse files
committed
docs: refine heatmap provenance
1 parent 5fb73ee commit 56899a3

4 files changed

Lines changed: 38 additions & 6 deletions

File tree

CURRENT_STATE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ This repository is a small GitHub Pages static site that publishes a single oral
1616
- The Jekyll config excludes `vendor/`, so the bundled gem tree is kept out of the public site build.
1717
- The validate workflow uses Node 24-compatible `actions/checkout@v6` and `actions/setup-python@v6`.
1818
- `README.CRAWL.md` is explicitly documented as a retained historical artifact in `docs/historical-artifacts.md`.
19+
- The heatmap provenance boundary is explicit: this repo supports PDF-to-PNG regeneration, but the raw source dataset is not published here.
1920
- A repo-local validation command now checks required files, local links, key config values, and tracked OS junk.
2021
- The live GitHub Pages deployment returned HTTP 200 and served the expected page content in this session.
2122

@@ -68,6 +69,6 @@ The pinned build path is now committed in-repo, so local build instructions are
6869

6970
## Immediate Next Moves
7071

71-
1. Start provenance refinement from [docs/agentic-first-buildout-plan.md](docs/agentic-first-buildout-plan.md).
72+
1. QA the provenance refinement branch by confirming the provenance boundary is discoverable in README, CURRENT_STATE, and `docs/heatmap-provenance.md`.
7273
2. Track the follow-on fixes listed in [docs/agentic-first-buildout-plan.md](docs/agentic-first-buildout-plan.md).
7374
3. Keep historical artifacts documented in [docs/historical-artifacts.md](docs/historical-artifacts.md).

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This repository showcases a data visualization project designed to represent the
44

55
This is a small GitHub Pages static site. The repo currently publishes one primary page (`index.md`) and one primary visualization asset (`oral-health-heatmap.png`).
66

7-
The repo also pins a local GitHub Pages build path (`Gemfile` and `.ruby-version`) and keeps the committed source figure (`Figure2-Teeth_v4.1.pdf`) with a rebuild script in `scripts/render_heatmap.py`.
7+
The repo also pins a local GitHub Pages build path (`Gemfile` and `.ruby-version`) and keeps the committed source figure (`Figure2-Teeth_v4.1.pdf`) with a rebuild script in `scripts/render_heatmap.py`. The raw source dataset behind the figure is not published in this repository.
88

99
For the branch/PR/QA loop used by future agents, see `docs/agentic-first-buildout-plan.md`.
1010

@@ -85,6 +85,8 @@ python scripts/render_heatmap.py
8585

8686
The heatmap PNG is regenerated from `Figure2-Teeth_v4.1.pdf` at 200 DPI. The rendered pixels match the published PNG; only PNG encoder metadata can differ.
8787

88+
Current local caveat: on this Windows environment, the heatmap rebuild command is blocked by MiKTeX `pdftoppm` temp/log permission errors. See [`docs/heatmap-provenance.md`](docs/heatmap-provenance.md) for the exact provenance boundary and rebuild status.
89+
8890
## Publication Context
8991

9092
This visualization was created as part of the research published in:

docs/heatmap-provenance.md

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
# Oral Health Heatmap Provenance
22

3-
The published heatmap is derived from the committed source figure PDF and a single rasterization step.
3+
The published heatmap in this repository is reproducible from the committed source figure PDF through a single rasterization step.
44

5-
- Source figure: [Figure2-Teeth_v4.1.pdf](../Figure2-Teeth_v4.1.pdf)
6-
- Published raster: [oral-health-heatmap.png](../oral-health-heatmap.png)
7-
- Rebuild script: [scripts/render_heatmap.py](../scripts/render_heatmap.py)
5+
- Source figure available in this repo: [Figure2-Teeth_v4.1.pdf](../Figure2-Teeth_v4.1.pdf)
6+
- Published raster available in this repo: [oral-health-heatmap.png](../oral-health-heatmap.png)
7+
- Rebuild script available in this repo: [scripts/render_heatmap.py](../scripts/render_heatmap.py)
8+
9+
## Provenance Boundary
10+
11+
This repository does not currently publish the raw or analysis-ready source dataset behind the original heatmap. The committed PDF is the earliest source artifact available here.
12+
13+
That means this repo supports figure-to-PNG regeneration, not full data-to-figure regeneration. Do not claim that the complete underlying dataset or statistical pipeline is reproducible from this repository unless those materials are added later.
814

915
## Rebuild Command
1016

@@ -13,3 +19,7 @@ python scripts/render_heatmap.py
1319
```
1420

1521
The source PDF is letter-sized and the rebuild path exports the image at 200 DPI. That reproduces the same 1700 x 2200 pixel image content as the committed PNG. PNG encoder metadata may differ between exporters, but the pixels match.
22+
23+
## Current Local Rebuild Blocker
24+
25+
On this Windows environment, `python scripts/render_heatmap.py` is currently blocked by MiKTeX `pdftoppm` permission errors while writing log/temp output under `AppData\Local`. The script and source artifact remain committed, but local verification of the rebuild command requires either a working `pdftoppm` installation or a future script change that routes temporary output through a known writable repo-local path.

scripts/validate_repo.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ def check_readme(warnings: list[str]) -> None:
143143
warnings.append("README.md does not document the historical artifact policy.")
144144
if "README.CRAWL.md" not in readme:
145145
warnings.append("README.md does not mention the retained historical crawl snapshot.")
146+
if "raw source dataset" not in readme:
147+
warnings.append("README.md does not document the unpublished raw source dataset boundary.")
148+
if "MiKTeX" not in readme or "pdftoppm" not in readme:
149+
warnings.append("README.md does not document the current Windows heatmap rebuild caveat.")
146150
crawl = ROOT / "README.CRAWL.md"
147151
if crawl.exists():
148152
crawl_text = crawl.read_text(encoding="utf-8")
@@ -152,6 +156,20 @@ def check_readme(warnings: list[str]) -> None:
152156
)
153157

154158

159+
def check_provenance(errors: list[str]) -> None:
160+
provenance = (ROOT / "docs" / "heatmap-provenance.md").read_text(encoding="utf-8")
161+
required_phrases = [
162+
"raw or analysis-ready source dataset",
163+
"figure-to-PNG regeneration",
164+
"not full data-to-figure regeneration",
165+
"MiKTeX",
166+
"pdftoppm",
167+
]
168+
for phrase in required_phrases:
169+
if phrase not in provenance:
170+
errors.append(f"docs/heatmap-provenance.md should document `{phrase}`.")
171+
172+
155173
def main() -> int:
156174
parser = argparse.ArgumentParser(description="Validate the repository structure and key content.")
157175
parser.add_argument(
@@ -169,6 +187,7 @@ def main() -> int:
169187
check_config(errors)
170188
check_index(errors)
171189
check_local_links(errors)
190+
check_provenance(errors)
172191
check_readme(warnings)
173192

174193
if errors:

0 commit comments

Comments
 (0)