MetaHistoryBook Reciprocal Harvest Checklist
Last updated: 2026-07-05
MetaHistoryBook has offered its IIIF Change Discovery 1.0 stream as a reciprocal Linked Art source:
- Collection: `https://www.metahistorybook.com/api/activity-stream`
- Pages: `https://www.metahistorybook.com/api/activity-stream/page/{n}`
- Page size: fixed `100`
- Activity shape: thin `Update` activities
- Object contract: each `object.id` dereferences to a Linked Art record
- Reconciliation hook: records carry Wikidata `equivalent` QIDs
- Header: `X-API-Version: 1`
- Metadata rights header: `Link: <https://creativecommons.org/publicdomain/zero/1.0/>; rel="license"`
This checklist is for bounded, read-only reciprocal harvest evidence. It is not a full-corpus import plan and does not make MetaHistoryBook one of the counted collection-data source providers until a separate provider adapter/import path is reviewed and shipped.
The CC0 license declaration applies to MetaHistoryBook's derived JSON metadata only. Image URLs and media representations still point to Wikimedia Commons or museum media under their own licenses; rights mapping must preserve those separate media-level statements.
Current Partner Status
MetaHistoryBook reran the walk-back harvest against Meta Museum as `metahistorybook-harvester-test` and reported a structural pass: valid UTC `endTime`, canonical activity `object.id` URLs, thin default pages, optional `embed=linked-art`, and omitted absent `prev`/`next` links. A later production-ID run reported `3/4` pass: multi-page walk-back ordering, real non-epoch timestamps, and duplicate collapse passed, but production evidence stayed clean because dereferenced records still exposed empty `equivalent[]` and activity `object.id` values pointed at upstream Met JSON instead of MetaMuseum Linked Art records. The follow-up fix projects record-backed activity objects to canonical `/api/records/{encodedSourceRecordId}` URLs and synthesizes object-level `equivalent[]` from the stored/source record URI, provider collection URL, provider object URL, and object Wikidata URL.
MetaHistoryBook then reran the identical production harvest as `metahistorybook-harvester-prod` and reported a `4/4` pass. The run validated `53` Met activities over three pages, strictly ascending non-epoch `endTime` values, `53/53` unique default-view `object.id` values, dereferenceable MetaMuseum Linked Art records with `record.id === _links.self.href`, upstream Met URL preservation in `object.sourceId`, and `equivalent[]` hooks for the Met collection API URL, Met public URL, and Wikidata entity where upstream data exposes one. The partner confirmed `47/53` records have QIDs and verified the first concrete cross-corpus join on `Q432253` (`Garden at Sainte-Adresse`). Daily (`daily.metahistorybook.com`) then confirmed a second distinct production app consumer as `daily-metahistorybook-prod`, reading the same `53` Met activities into a supplementary artwork-of-the-day candidate pool with `15` paintings and cursor `2026-05-31T10:40:54.290Z`. Full note: metahistorybook-prod-harvest-evidence.md(metahistorybook-prod-harvest-evidence.md).
MetaHistoryBook's license gate is now cleared on their side and verified by Meta Museum with live response headers on `https://www.metahistorybook.com/api/activity-stream` and a sample `/api/linked-art/{qid}` record. The reciprocal probe treats the CC0 `Link rel=license` header as required collection and record evidence before a run can pass.
Meta Museum now has a local provider-backfill evidence gate for that production-ID run:
pnpm activity:provider-backfill:check -- --provider=met --page-size=25 --minimum-backfill-rows=10
The latest local run passed with `53` Met `record-backfill` rows, `53/53` real non-epoch timestamps, `53/53` rows carrying equivalents, and `3` fixed pages at `25` rows per page. Semantic record events still publish separately for `source=record-semantic`, but default IIIF Change Discovery collection/page responses collapse duplicate rows for the same object and prefer the publication/backfill row over historic semantic rows.
The `metahistorybook-harvester-prod`, `daily-metahistorybook-prod`, and `wikidataexplorer-metamuseum-prod` runs are now filed as the first three production-grade external-consumer read evidence rows for MetaMuseum. They count as three real declared external consumer reads in the syndication evidence artifact, and all three now have accepted durable callback verification rows. The strict syndication gate remains blocked until real `Update`/`Delete` activity-type read coverage is captured.
Run The Probe
Run the structural harvest probe first:
pnpm activity:metahistorybook:harvest
For CI-style failure on any failed check:
pnpm activity:metahistorybook:harvest:check
Then run the read-only bounded import rehearsal:
pnpm activity:metahistorybook:import-rehearsal -- --page-limit=2 --record-limit=5
For the partner-approved larger rehearsal window, walk the full current page set and sample a larger record set:
pnpm activity:metahistorybook:import-rehearsal:check -- --page-limit=562 --record-limit=250
For CI-style failure on any failed rehearsal check:
pnpm activity:metahistorybook:import-rehearsal:check
The structural probe writes:
- `artifacts/activity-syndication/metahistorybook/metahistorybook-harvest-latest.json`
- `artifacts/activity-syndication/metahistorybook/metahistorybook-harvest-latest.md`
- `artifacts/activity-syndication/metahistorybook/runs/metahistorybook-harvest-<timestamp>.json`
The bounded import rehearsal writes:
- `artifacts/activity-syndication/metahistorybook/metahistorybook-import-rehearsal-latest.json`
- `artifacts/activity-syndication/metahistorybook/metahistorybook-import-rehearsal-latest.md`
- `artifacts/activity-syndication/metahistorybook/runs/metahistorybook-import-rehearsal-<timestamp>.json`
The Meta Museum provider-backfill evidence command writes:
- `artifacts/activity-syndication/activity-provider-backfill-evidence-latest.json`
- `artifacts/activity-syndication/activity-provider-backfill-evidence-latest.md`
- `artifacts/activity-syndication/runs/activity-provider-backfill-evidence-<timestamp>.json`
Acceptance Checks
The probe must pass these checks before we call the reciprocal stream structurally harvestable:
- Collection endpoint returns HTTP `200`.
- Collection response advertises the IIIF Change Discovery context profile.
- Collection response includes `X-API-Version`.
- Collection response includes the CC0 metadata `Link rel=license` header.
- Collection is an `OrderedCollection` with `first` and `last` links.
- Collection reports a non-empty `totalItems`.
- First page is readable as an `OrderedCollectionPage`.
- First page has `100` activity items.
- First page activities are oldest-first by valid UTC `endTime`.
- Sample activity is thin `Update` and does not embed `linkedArt`.
- Sample activity `object.id` is HTTP(S).
- Last page is readable, non-empty, and has no `next` link.
- Sample `object.id` dereferences to a Linked Art record.
- Sample Linked Art record response includes the CC0 metadata `Link rel=license` header.
- Sample record has a Wikidata `equivalent` URL.
The bounded import rehearsal must pass these checks before we consider provider-style import planning ready:
- Collection maps to CC0 metadata rights.
- A capped page walk reads activity pages without writing imported records.
- Walked activities remain oldest-first by valid UTC `endTime`.
- A capped object sample dereferences as Linked Art records.
- Every sampled record maps the CC0 header as metadata-only public-domain evidence.
- Every sampled record exposes a Wikidata QID reconciliation hook.
- Media references and representations stay separate from the metadata CC0 mapping.
Evidence Use
A passing probe can be recorded as reciprocal interoperability evidence. It is not strict Meta Museum ActivityStreams adoption evidence by itself; strict adoption still requires MetaHistoryBook to read our public feed with a partner-owned consumer ID, then complete the feed-read, type-coverage, durable-subscription, callback-verification, and strict-packet refresh rows.
A passing bounded import rehearsal is still rehearsal evidence only. It does not count MetaHistoryBook as a source provider and does not authorize full-corpus ingest; the partner-approved larger rehearsal on 2026-07-05 walked `562/562` pages, saw `56,196` activities, sampled `250/250` records, mapped `250/250` CC0 metadata-rights headers, and found `250/250` Wikidata QID reconciliation hooks. The remaining promotion gate is a separate provider/import decision.
A passing Meta Museum provider-backfill evidence artifact is the local gate for asking MetaHistoryBook to run `metahistorybook-harvester-prod`. The July 5 production-ID partner report has now passed, Daily has reported a separate production app read, and Wikidata Explorer has reported a third production walk-back read, so MetaMuseum has `3/3` production-grade external consumer reads. All three callback rows are now accepted, but this does not by itself complete strict syndication adoption until MetaMuseum also has full `Create`/`Update`/`Delete` read coverage.
Reply Checklist To Send
Thanks. Your reciprocal stream is live and the first read-only probe is ready on our side.
We will run:
pnpm activity:metahistorybook:harvest
The probe checks:
1. /api/activity-stream returns an IIIF Change Discovery OrderedCollection with first/last links.
2. X-API-Version is present.
3. The collection and a sample Linked Art record declare CC0 metadata via Link rel=license.
4. /api/activity-stream/page/0 returns 100 oldest-first Update activities with UTC endTime values.
5. The last page is readable and has no next link.
6. A sample object.id dereferences to a Linked Art record.
7. The dereferenced record carries a Wikidata equivalent QID.
If it passes, we’ll file the artifact as reciprocal interoperability evidence and then plan a bounded import rehearsal before any full-corpus ingest. We’ll map CC0 as applying to your derived JSON metadata only and keep image/media rights separate.
On our side, fixes 1-3 for your failed harvest test have now landed: valid UTC page endTime, dereferenceable object IDs, and thin-by-default IIIF pages with ?embed=linked-art as opt-in. Once that deploy is live, please rerun the identical walk-back test as metahistorybook-harvester-test.