name: asset-sourcing description: Source image candidates for a brand-new WorldSeed scene, let an AI visually review them, and generate a local review HTML for human selection.
Asset Sourcing
Use this skill when a user wants image candidates for a new or existing WorldSeed scene and the goal is to build a reviewable asset board, not auto-pick final assets.
Goal
Produce a local review bundle:
- candidate metadata
- selectively downloaded review-size candidate images
- a structured
manifest.json - an entity-first
review.html - a minimal selected-picks export from the HTML picker
Default bundle:
tmp/asset-sourcing/{scene_id}/
manifest.json
review.html
images/{entity_id}/...
This skill is standalone. It stops at a reviewable bundle and selected picks. Import into a scene should happen later as a separate step.
Supported Sources
Default sources:
openverseaicclevelandvamwellcomeycbamet
Optional sources:
wikimediawaltersnasa
Read references/source-catalog.md before using a source you have not used recently.
Execution Rules
- Use supported sources only.
- Treat sourcing as entity-grounded, not exact-illustration-only.
exact,adjacent, andvibecan all be usable. - Do not stop after one keyword search.
- Let the AI choose keywords and source order per entity.
- Search only the sources that are justified for the current entity.
- Search different sources in parallel when useful.
- Start with likely fast sources and widen only when needed.
- Treat
metas a later pass, not a universal first call. - Only use optional sources when they are justified:
wikimediafor known motifs, named figures, or coverage gapswaltersfor watches, keys, portraits, and manuscript-adjacent objectsnasafor cosmic or scientific entities only
- Preserve source URLs, image URLs, and rights text in the manifest.
- Search first. Download only shortlisted candidates by default.
- Treat metadata as recall only. Final retention and top picks must be image-verified.
- Reject obvious homonym and name-collision matches when the image subject is wrong, even if the title contains the entity token.
- Prefer a visually coherent set across entities. When multiple candidates are equally valid, favor the ones that fit the scene's overall medium, period, and mood.
- Avoid obvious horror, gore, medical shock, body horror, or otherwise unsettling imagery unless the user explicitly wants that tone.
- Do not auto-pick final assets. The default output is a candidate board for agent/human review in HTML.
Workflow
1. Define the scene and entities
The input scene JSON must contain:
scene_id- optional
premise entities
Each entity must contain:
idlabelrole
Initialize a bundle with:
python3 skills/asset-sourcing/scripts/init_bundle.py \
tmp/asset-sourcing/{scene_id} \
--fixture tmp/asset-sourcing/{scene_id}/scene.json
2. Generate queries and choose sources
For each entity, start with:
- one
literalquery - one
relatedquery - one
vibequery
Useful defaults:
zoneliteral:{label} interiorrelated:{label} roomvibe:{label} painting
agentliteral:{label} portraitrelated:{label} figurevibe:{label} painting
itemliteral:{label}related:{label} still lifevibe:{label} object
symbolicliteral:{label}related:{label} illustrationvibe:{label} print
Rewrite rules:
- shorten weak queries to one or two strong nouns
- remove decorative adjectives before adding more
- add a medium hint like
portrait,interior,still life,illustration, orengraving - for symbolic entities, accept clear stand-ins but reject person-name homonyms unless the image proves the match
Source strategy:
zone: start withopenverse,aic,cleveland; widen withvam,ycba, thenmetagent: start withopenverse,aic,wellcome; widen withycba, thenmetitem: start withopenverse,aic,cleveland; usewalterswhen objects/manuscripts fit; widen withmetsymbolic: start withopenverse; usewikimediafor motifs andnasafor celestial/scientific entities
3. Search adaptively
For each entity:
- choose the most likely 1-3 sources first
- search those sources in parallel when useful
- inspect the returned candidates, not metadata alone
- if the batch is weak or misleading, rewrite the query and try again
- widen source coverage only when needed
- stop when the entity has enough usable candidates or the search budget is exhausted
Before final retention:
- look at the image, not just the title, filename, or source page metadata
- if the image subject is wrong, mark it
missor drop it - for
symbolic,item, and animal-like entities, treat person-name homonyms as likely false positives until the image proves otherwise - reject candidates that break the scene's tone even if they are semantically correct
- prefer candidate sets that feel stylistically compatible with each other, not just individually plausible
Default target:
4-8usable candidates overall per entity- visual recommendations are optional and should only be added after image review
4. Retain and rank
For each retained candidate, capture:
- source
- entity ID
- query type
- exact query string
- title
- creator
- source page URL
- image URL
- local image path
- rights text
search_fit_labelsearch_fit_notesource_tierquery_round- optional image-verification note when a candidate needed manual disambiguation
- optional
recommended_rankandrecommendation_reasononly after agent/human visual review
5. Search one source and append candidates
search_candidates.py is a thin helper, not a full scene runner. It should be called once per entity + source + query.
By default it performs cheap recall and appends metadata without downloading images.
Save downloaded images under:
tmp/asset-sourcing/{scene_id}/images/{entity_id}/
Example:
python3 skills/asset-sourcing/scripts/search_candidates.py \
--manifest tmp/asset-sourcing/{scene_id}/manifest.json \
--entity-id singer \
--source openverse \
--query 'singer portrait' \
--query-type related \
--query-round 1 \
--source-tier default
The AI should decide:
- which source calls to make
- which queries to use
- when to stop widening search
6. Download only the shortlist
After cheap recall, write a shortlist JSON:
{
"picks": {
"singer": [
{"source": "openverse", "title": "Street singer, portrait"}
]
}
}
Then download only those candidates:
python3 skills/asset-sourcing/scripts/download_candidates.py \
tmp/asset-sourcing/{scene_id}/manifest.json \
tmp/asset-sourcing/{scene_id}/download-plan.json
7. Render the review HTML
Run:
python3 skills/asset-sourcing/scripts/render_review.py \
tmp/asset-sourcing/{scene_id}/manifest.json \
tmp/asset-sourcing/{scene_id}/review.html
The review page is the main product. It should let a human quickly scan the strongest reviewed picks, open more options only when needed, and choose final assets.
The current picker behavior is:
- one long scroll page
- one section per entity
- reviewed picks appear first with
Top 1/2/3only when the manifest contains trusted visual-review recommendations - if there are no reviewed picks yet, the first few candidates still appear in the same slot, but without
Topbadges - no metadata-fit language should drive the unreviewed UI
- click one card per entity to select it
- export a minimal picks object with:
titlesource
8. Apply visual review recommendations
If an agent or human has visually reviewed the downloaded images and chosen ranked picks, write them back into the manifest before the final render.
Review file shape:
{
"reviewer": "agent-name",
"picks": {
"raven": [
{"source": "wikimedia", "title": "Kalila and Dimna - The Owls and the raven", "reason": "Only candidate that clearly reads as a raven scene."}
]
}
}
Apply it with:
python3 skills/asset-sourcing/scripts/apply_visual_review.py \
tmp/asset-sourcing/{scene_id}/manifest.json \
tmp/asset-sourcing/{scene_id}/visual-review.json
Then rerender:
python3 skills/asset-sourcing/scripts/render_review.py \
tmp/asset-sourcing/{scene_id}/manifest.json \
tmp/asset-sourcing/{scene_id}/review.html
What the AI Should Do
When this skill is active, the AI should:
- read the scene and entities
- choose queries and sources per entity
- run independent source searches in parallel when useful
- rewrite weak queries
- visually inspect candidates before treating them as top picks
- compare candidates across sources
- emit a reviewable local bundle
- only write
recommended_rankafter actual image review
The AI should not:
- use unsupported sources by default
- stop after a single keyword
- exhaust every source for every entity by default
- trust metadata alone
- keep a candidate whose image subject is wrong just because the title matches
- choose final assets without human review
References
references/source-catalog.md— supported source list and exact usage patternsreferences/review-output.md— bundle and manifest contract