Repository navigation
ATRIUM IMAGERY SPEC
Status: proposed
Supersedes: the atr- Wikimedia category system in src/content/atrium/atrium-categories.js
Constraint: must not alter Chamber behavior for any non-Atrium reading
The Atrium's subject imagery is built on Wikimedia Commons categories. A live
audit of all 20 atr- categories (2026-07-21) found the approach unsound —
not misconfigured, but structurally wrong.
Commons categories are filing, not curation. "Category:Thomas Paine" means "files someone tagged as related to Thomas Paine." That correctly includes his death mask, a modern pub sign bearing his name, a French basic-income article quoting him, and a NASA Apollo 13 staff photo (tagged for a Rights of Man quotation). None are wrong as filing. All are wrong as imagery for a reading.
Measured, against the exact filters the provider applies:
| Category | Displayable | Genuinely on-subject | Notable strays |
|---|---|---|---|
atr-stoicism |
11 | 6 | Balinese toddler, children's picture books, Egyptian god Heh |
atr-us-declaration |
44 | 18 | archive-sleepover event photos, 1926 postage envelope |
atr-marcus-aurelius |
38 | 19 | Sarmatian campaign maps, a Brussels guildhall |
atr-bastille |
36 | 22 | modern Métro sign, unrelated Don Quixote print |
atr-thomas-paine |
32 | 23 | Apollo 13 staff, a house, a modern pub sign |
The measurement itself is unreliable. atr-james-watt scored clean on
every automated metric (36 displayable, 19% off-subject) and is still poor in
practice. Filename plausibility is not image quality, and no regex over titles
will become one. This is the decisive finding: the problem cannot be managed
by better filtering, because we cannot measure what we need to measure.
The target moves. verifiedFiles counts were accurate when written and are
now wrong. Any category can gain a tourist photo tomorrow. An audit of a
mutable upstream is valid only on the day it runs.
Search does not fix it. Free-text search against museum APIs reproduces the same failure: the Met returns a dog kennel for "French Revolution" and an unrelated landscape painter for "James Watt." Even title-scoped search returns The Death of the Virgin for "Death of Socrates," and returns nothing at all for objects known to exist. Search ranks; it does not curate.
Conclusion: the primitive must be the work, not the query.
An Atrium collection is an explicit, ordered list of specific artworks, each pinned by stable identifier in a named collection.
'atr-socrates': {
name: 'Socrates',
works: [
{ source: 'met', id: 436105 }, // David, The Death of Socrates, 1787
{ source: 'met', id: 437296 },
{ source: 'aic', id: 111628 }
]
}This is what a museum exhibition is: chosen works, not a random draw from the archive. It is more work per collection, but it is finite, stable, and — critically — verifiable, because every field the reader sees comes from the institution's own catalog record rather than from an assertion in a comment.
Every source adapter normalizes to one shape. Nothing display-side may invent these fields:
{
id: 'met:436105',
title: 'The Death of Socrates',
artist: 'Jacques Louis David',
artistBio: 'French, Paris 1748–1825 Brussels',
date: '1787',
medium: 'Oil on canvas',
rights: 'CC0', // normalized; see §4
imageUrl: 'https://…/web-large/DP-13139-001.jpg',
fullImageUrl: 'https://…/original/DP-13139-001.jpg',
sourceName: 'The Metropolitan Museum of Art',
sourceUrl: 'https://www.metmuseum.org/art/collection/search/436105'
}sourceUrl is mandatory. A curated reading must be able to cite its imagery,
and Study mode (roadmap item 2) will need exactly this.
Adapters are added in priority order. Each is a thin module implementing
resolve(id) -> Work | null.
| Adapter | API | Notes |
|---|---|---|
met |
collectionapi.metmuseum.org |
No key. ~490k objects, ~400k CC0. Best for classical antiquity and European painting. |
aic |
api.artic.edu |
Already implemented; reuse the existing client. |
rijks |
rijksmuseum.nl/api |
Key required. Enlightenment portraiture, vast print collection. |
ycba |
Yale Center for British Art | Open. British Enlightenment — Paine, Watt. |
nypl |
NYPL Digital Collections | Key required. American and Haitian revolutionary material. |
cleveland |
openaccess-api.clevelandart.org |
No key. ~60k CC0. |
Wikimedia is retained but demoted: usable only as an explicitly labeled fallback for subjects no museum covers, never as the primary source for a curated reading, and never silently.
rights is normalized to one of: CC0, PUBLIC_DOMAIN, CC-BY, CC-BY-SA,
UNKNOWN.
A work whose rights cannot be established as public-domain-equivalent is not eligible for display. This mirrors the Atrium's existing readiness gates for text, and it is not negotiable for the same reason: the Atrium's value is that its material is defensible. Adapters must map their institution's own field — never infer from the absence of a restriction.
The hard requirement. The service must be additive.
-
Separate module tree.
src/content/atrium/imagery/— the service, the adapters, and the collections. Nothing undersrc/sources/visual/changes behavior for existing categories. -
Registration, not modification. The Atrium registers its collections
through the existing
registerWikimediaCategoryResolverseam pattern (content → source, never source → content), or an equivalentregisterAtriumImageryResolver. The Chamber's provider registry is untouched. -
Namespace. Ids stay
atr-prefixed and remain absent from the browsable Collections list. A reader browsing categories must never encounter "Toussaint Louverture" as a generic option; it arrives only with the launch that curated it. - No new Chamber defaults. No Chamber preset, archetype, or SOL sequence gains an Atrium collection as a side effect.
-
Payload boundary holds.
imagery/joins thepayload-boundary.test.jsroots: the browse graph stays metadata-only.
A test asserts (1)–(3) mechanically: the Chamber's resolved category list must be byte-identical before and after the service is registered.
- Resolved works are cached through the existing
SourceCacheunder a service-specific provider id, so an Atrium launch does not warm or pollute Chamber caches. - A work that fails to resolve is skipped, not substituted. A collection that resolves to zero works degrades exactly like any other empty source: the cortex falls back to the rest of the pool. Silent substitution would reintroduce the failure this spec exists to remove.
- Resolution happens at launch (handoff), never during reading.
Because pinning is manual, the spec includes the tool that makes it tractable:
- Propose — a candidate list per subject, drawn from art-historical reference rather than from search results.
- Resolve — a script fetches each candidate and prints title, artist, date, medium, rights, and image dimensions.
- Review — a contact sheet (static HTML) renders every candidate at thumbnail size. A human looks at it. This is the step the current system lacks, and no automated metric replaces it.
- Commit — approved works are written to the collection with a comment naming the work, so a future reader of the code can verify the pin without an API call.
Step 3 is the point of the whole exercise. atr-james-watt passed every
machine check and still fails on sight.
Per Atrium sequence, not big-bang:
- Build the service, the
metadapter, and the contact-sheet tool. - Curate the philosophy collections (Plato, Socrates, Aristotle, Marcus Aurelius, Stoicism) — the strongest museum coverage.
- Curate the history collections.
- Delete
atrium-categories.jsonly when every sequence has migrated. Until then both resolve, with pinned works taking precedence. - Correct or remove the stale
verifiedFilesclaims immediately, ahead of the migration, since they are currently inaccurate in shipped code.
- Every Atrium collection resolves to works with complete attribution
- Every displayed work carries a citable
sourceUrl - No work displays without established public-domain-equivalent rights
- Chamber category resolution is provably unchanged
-
imagery/is inside the payload boundary - Every shipped collection has been reviewed on a contact sheet by a human
- No stale
verifiedFiles-style claim remains anywhere in the tree
Published from docs/specs/ATRIUM-IMAGERY-SPEC.md. Edits made here are overwritten on the next push to main.
Start here
- COMPOSER-FIRST-ROADMAP
- VISION
- PROJECT-KNOWLEDGE
- ARCHITECTURE
- SYSTEM-DESIGN-REVIEW-2026-08-22
- ACCOUNT-SAVES
- RELEASING
- PLUS-CUSTOMER-LIFECYCLE
- AGENTS
Release
Pilot
- LIVE-CURRENT
- LIVE-HANDOFF
- LIVE-MCP
- DIRECTORY-SCREENSHOTS
- INSPECTOR-RUN-2026-10-10
- CLAUDE-RUN-2026-10-10
- CREATIVE-CONTROL-EVALS
- PERCEPTION-EVAL
- SOUND-LEVELS
- WORDING
- RUN-2026-10-08
- COMPOSER-INSTRUMENTS
- CHATGPT-DEMO
- EMBED-WITNESS
- RISE-GATE0
- CHATGPT-HOST-2026-10-04
- LIVE-002-HOST-2026-10-05
- EMBED-STAGE-HOST-2026-10-07
- RELEASE-GATES-2026-10-07
- EMBED-SAFETY-2026-10-05
- LIVE-GEMINI
- LIVE-EVALUATION
- LIVE-RED-TEAM
- CURRENT-CONSOLIDATION
- RISE-CHANGES
The Archive - texts and their editing
- ARCHIVE-CANON-SPEC
- ARCHIVE-CLEANSING-SPEC
- CORPUS-REVIEWER-PROMPT
- TYPESETTING-CANON
- PHRASE-CHUNKING-STUDY
- CHUNKER-AWARENESS-STUDY
- LIBRARY-SPEC
- SOL-PD-ACQUISITIONS-DOSSIER-LITERATURE-2026-07-28
Authoring - scores, rooms, and rendering
- EXPERIENCE-PROGRAM-SPEC
- LIVE-CURRENT-EVENTS-V1
- RISE-CURRENT-V1-SLICE
- RISE-SDK
- SCRIPTORIUM-SPEC
- WORKSHOP-COMPOSITION-STUDIO-SPEC
- AGENT-COMPOSITION-AND-RENDER-SPEC
- NARRATION-LANE-SPEC
- RECITATION-SPEC
- SCRIPTORIUM-STRENGTHENING-SPEC
Reading surfaces
- PAGE-MODE-SPEC
- RHYTHMIC-VISUAL-PRESENCE-SPEC
- LATERAL-TRAVERSAL-SPEC
- CONTINUOUS-FIELD-SPEC
- JEV-VARIANCE
- INVOCATION-SKINS
- PHASE-2-SAFETY-SPEC
- SPATIAL-CHAMBER-SPEC
- Premium_Mobile_Chamber
Imagery - what may be shown, and on whose authority
- MUSEUM-ATLAS
- SOURCE-CURATION-SPEC
- SOURCE-EXPANSION-SPEC
- ATRIUM-IMAGERY-SPEC
- PERICOPE-IMAGERY-SPEC
- icon-museum-request-draft
- TEXT-ATTUNED-IMAGERY-SPEC
The Chapel
Direction and unbuilt work
Affect and the Emotions room
Reading decision service and retired gate
Product direction and team tracking
- README
- READER-DIRECTION
- CONSOLIDATED-READER
- COMPOSER-FIRST-ROADMAP
- TRACKER-DESIGN
- 2026-10-03-direction-decisions
- 2026-10-04-composer-decision
- 2026-10-05-consolidated-reader-decisions
- 2026-10-05-embed-stage-decision
- 2026-10-06-score-speech-service-roadmap
- 2026-10-07-current-with-a-look
- 2026-10-07-reader-control-and-replay
- 2026-10-05-one-colour-vocabulary-design
- 2026-10-07-chrome-follows-theme
- 2026-10-07-gallery-follows-with-works
- 2026-10-05-canonical-home-design
- 2026-10-04-reader-evidence
- 2026-10-original-performance-roadmap
- 2026-10-08-voice-hardening-2-findings
- 2026-10-09-feelings-sounds-parked
- 2026-10-10-connector-directory-readiness
- 2026-10-10-connector-submission-packet
- 2026-10-16-mystery-school-complete-library
- 2026-10-13-mystery-school-plan