# Curious Planet: live sample and provenance

Open [report.html](report.html) for the buyer-facing repair queue, then
[teacher-workbook.pdf](teacher-workbook.pdf) to see the source pages.
The workbook is an original demonstration for ages 10–13, with ten inquiry lessons,
four linked activities per lesson, response spaces and an exit ticket. It is not a
vetted curriculum or affiliated with any linked organization. Site content, age
suitability and access requirements have not been editorially validated.

## What ran live

`run.log` is the actual CLI output. The public-site run started at
**2026-11-01 16:36:28.866 UTC** and finished at **16:36:53.071 UTC**
(2026-11-02 00:36 in Singapore). Exact request/attempt timestamps and settings are
in [state.json](state.json); [report.csv](report.csv) contains page-specific rows.

```bash
.venv/bin/python -u check.py sample/teacher-workbook.pdf --out sample --fresh \
  --label 'Live public-site sample; no fixture or simulated HTTP results'
```

| Finding | Unique URLs |
| --- | ---: |
| Confirmed broken | 4 |
| Materially redirected | 5 |
| Unverified | 11 |
| OK at HTTP level | 20 |
| **Total** | **40** |

All findings derive from this network run. Of 40 URLs, **38 were actually requested**;
two were **not sent** after another URL on their hostname encountered an access
restriction. The 95 request records contain **93 sent HTTP requests** (51 HEAD,
42 GET) and two host-pause records. The latter have no HTTP status and remain
unverified. No fixtures, mocks or invented responses were substituted.

The eleven unverified entries include eight HTTP 403 answers, one HTTP 429 answer,
and two paused URLs (Library of Congress and The Met). They are not reported as
broken, and restrictions were not bypassed. No timeout, DNS-failure, 410, or login-wall
outcome happened in this live sample; those behaviors are covered by local tests.

The five redirected URLs include NASA Climate Kids, Scratch educators, Code.org,
Poetry Foundation and News Literacy Project resources. A redirect does not establish
that a teaching activity is unusable. The final destinations need editorial review.
The ordinary `https://microbit.org/projects/` link returned 404 twice during this
run; it was not one of the seeded synthetic paths. This is an observation from this
checker/location, not a claim about availability everywhere or permanence.

## Deliberate stale-link seeds and the limits they expose

[manifest.json](manifest.json) records all 40 URLs, page numbers, extraction forms
and a seed flag. Six paths on real public domains were invented to resemble old
resource links. They are explicitly **not** historical resources that we know existed.
Their observed results were not forced:

| Workbook page | Synthetic path host | Live result |
| --- | --- | --- |
| 1 | NASA | BROKEN: delayed 404 confirmed |
| 2 | USGS | OK: server returned 200 for the invented path |
| 3 | NCES | BROKEN: delayed 404 confirmed |
| 5 | Library of Congress | UNVERIFIED: paused after that hostname returned 403 |
| 7 | Scratch | BROKEN: delayed 404 confirmed |
| 8 | The Met | UNVERIFIED: paused after that hostname returned 429 |

The USGS seed is an especially useful limitation: an invented URL can return 200.
The checker calls that **HTTP OK**, not “a verified teaching resource.” No semantic
or browser validation was performed. We preserve that result rather than changing
it to make the sample look more successful.

This is an **initial baseline**, so there are no live “new breakages” or “fixed”
claims. Controlled local tests exercise those transitions. A later rerun into this
directory will compare against this snapshot and overwrite the three report files;
copy them first if you want to retain the original evidence. Use the same supplied
PDF path from the same working directory for a meaningful comparison.

## Reproduce

From the repository root, after installing `requirements-dev.txt`:

```bash
.venv/bin/python tools/make_sample.py --out sample
.venv/bin/python check.py sample/teacher-workbook.pdf --out sample \
  --label 'Live public-site rerun'
```

PDF generation uses ReportLab's invariant mode and does not fetch websites. The
workbook mixes annotation-only, text-only and both-source URLs. All 40 unique
page references were extracted, with no text-coverage warnings. Live checking used
Python 3.13.5, PyMuPDF 1.28.2, Requests 2.34.2 and ReportLab 4.5.1 for generation,
with the CLI defaults: four workers, 0.5-second hostname pacing, 5-second connect/read
timeouts, five redirects and a 2-second confirmation delay. No proxy environment
variables were present during this run. Repeating the command may legitimately
produce different results. The public sample is not a deterministic test fixture.
