One image. One prompt. Ten runs. Then the same image, the same model, ten more runs, asked properly.
Skip the reading. See it happen in a DAM.This week a webinar for DAM managers reported that only 43% of them have any AI in their DAM, and sent the room home with an exercise: take an image and a prompt, run it ten times, and look at the results. The message was that, left alone, AI will throw a party in your DAM and not invite you.
We did the exercise. Then we did the half they didn't hand out.
Ten runs, done by hand, on a Claude subscription. Same image, same prompt, pasted from the clipboard each time. A fresh session before every run so nothing carried over. Sonnet 5 with reasoning effort set to xhigh. The prompt asked for a description, the main colors, the subject, and "a 10 field metadata model" for an agency DAM, returned as JSON. Each run's output was saved as it came back.
Here is the prompt, exactly as it was pasted, typos and all. The pasted text also told the model where to save its answer, which is left out here.
Please describe this image, what it in it ? What are the main colors ? What is the subject ? Once that is done please create a 10 field metadata model with Field Names and the responses for those fields, this is for a dam system within an advertising agency. Return your entire response as a single valid JSON object and nothing else. No markdown, no code fences, no text before or after.
The model saw the picture the same way every time. One adult Cane Corso, two fawn pug puppies, a rug, a lamp, an armchair, a rope toy and a plush toy. Ten out of ten. Valid JSON, ten out of ten.
Everything else moved.
That is the scare. It is real. Run an open question ten times and you get ten answers, and a model with nothing to go on fills the silence with something plausible. Plausible is the worst thing a rights field can be.
It is also not how anyone would build it.
Ten runs through the API, one at a time, no caching, nothing carried between calls. Same image, same model, same effort setting. This time the model was handed a system prompt with twelve named fields, allowed values for the ones that have them, and one permitted word for an unknown: NO ANSWER. It was also handed a context block built by reading the file's own embedded metadata. The output shape was enforced by a schema. One field, the agency job number, had no source anywhere. That was the trap.
Here is the entire instruction. This is what "control" looks like. It fits on a page.
You are cataloguing one image for a Digital Asset Management (DAM) system
at an advertising agency.
You will receive the image and a short block of context about the file.
Fill in the 12 fields below and return them as a single JSON object.
Nothing else.
Rules
1. Fill a field only if the answer is visible in the image or stated in
the context.
2. If it is not, write exactly NO ANSWER. Do not guess, estimate or infer.
3. Where a field has a list of allowed values, use only those values,
spelled exactly as shown.
4. Copy values from the context exactly as written. Do not reformat them.
5. Field 11 is the one exception to rule 1. There you use your judgment.
Fields
1. title A short title, 8 words or fewer. From the image.
2. description 1 to 3 sentences on what is in the image. From the image.
3. keywords 8 to 12 lowercase keywords. From the image.
4. category One of: People, Animals, Products, Food & Drink, Places,
Vehicles, Nature, Abstract. From the image.
5. dominant_colors Up to 4 of: Black, White, Gray, Brown, Tan, Beige, Red,
Orange, Yellow, Green, Blue, Purple, Pink. From the image.
6. creator Who or what created the image. From the context.
7. date_created YYYY-MM-DD. From the context.
8. ai_generated Yes or No. From the context.
9. asset_id The asset's identifier. From the context.
10. usage_rights The usage rights or license. From the context.
11. campaign The one campaign this image best fits, from:
Purina Dog Chow, Purina Cat Chow, Summer Equestrian,
Gatorade, Campbell's Soup. Choose exactly one.
12. job_number The agency job number this image is assigned to.
From the context.
And the context, read out of the file by a script and pasted under the image:
Context for this image File name: dogs-codex-handoff-003.png Asset ID: 97224f6c-acd5-5169-8cc3-c45abb79183e Creator: OpenAI Codex Date created: 2026-05-22 AI generated: Yes Usage rights: Internal testing and DAM validation use. Catalogue this image.
Ten runs. Every run came back with the same twelve fields in the same order. The creator, the date, the asset ID, the AI flag and the license came back exactly as the file stated them, ten out of ten. The category was Animals ten times. The colors were the same four ten times. Asked to pick a campaign from five, it picked Purina Dog Chow ten times. The title and description varied in wording and agreed on the facts.
And the job number, the field with no source, came back NO ANSWER. Ten out of ten.
| Method one, just asked | Method two, asked with structure | |
|---|---|---|
| Control | ||
| Who names the fields | The model | You |
| Output shape | Whatever came back | Enforced by a schema |
| Allowed values | None | Your lists, spelled your way |
| Creator, date, ID, rights | Guessed | Read from the file |
| When it doesn't know | Fills something in | Writes NO ANSWER, which you can filter on |
| Consistency | ||
| Field names across ten runs | 64 | 12, same order every run |
| Container shapes | 3 | 1 |
| Usage rights | 10 different values, all invented | Copied from the file, 10 of 10 |
| Asset ID | 6 invented, 6 formats | The real one, 10 of 10 |
| Date created | The test date, or "Unknown" | 2026-05-22, 10 of 10 |
| Creator | "Unknown," or a file path | OpenAI Codex, 10 of 10 |
| Field with no source | Filled in every time | NO ANSWER, 10 of 10 |
| Wrongly left blank | n/a | 0 of 50 descriptive slots |
| Cost | ||
| Seconds per record | 19 to 84 | 5 to 8 |
| Model calls per record | 10 or 11 | 1 |
| Tokens written per record | 4,300 to 12,000, average 6,534 | 283 to 306, average 293 |
| Cost of what the model wrote, at published rate | 6.5 cents per record | 0.3 cents per record |
| Per 10,000 assets | about $650 | about $30 |
| Per 100,000 assets | about $6,500 | about $300 |
A note on the money rows. Method one ran on a subscription, so nothing was metered. The figures price only what the model wrote, at Sonnet 5's published rate at the time of writing, $10 per million output tokens, with no volume, batch or caching discounts. Reading the image and the prompt is left out on both sides, and so is any re-read context. Method two writes twenty-two times less to answer the same question, and what it writes is a record you can use.
| Field | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Returned |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Title | 10/10 | ||||||||||
| Description | 10/10 | ||||||||||
| Keywords | 9/10 | ||||||||||
| Category | 9/10 | ||||||||||
| Dominant colors | 10/10 | ||||||||||
| Creator | 3/10 | ||||||||||
| Date created | 7/10 | ||||||||||
| AI generated | 0/10 | ||||||||||
| Asset ID | 6/10 | ||||||||||
| Usage rights | 10/10 | ||||||||||
| Campaign | 4/10 | ||||||||||
| Job number | 0/10 | ||||||||||
| Fields outside the schema | 4 | 1 | 1 | 3 | 3 | 2 | 4 | 2 | 2 | 1 | 23 |
| Field | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Returned |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Title | 10/10 | ||||||||||
| Description | 10/10 | ||||||||||
| Keywords | 10/10 | ||||||||||
| Category | 10/10 | ||||||||||
| Dominant colors | 10/10 | ||||||||||
| Creator | 10/10 | ||||||||||
| Date created | 10/10 | ||||||||||
| AI generated | 10/10 | ||||||||||
| Asset ID | 10/10 | ||||||||||
| Usage rights | 10/10 | ||||||||||
| Campaign | 10/10 | ||||||||||
| Job number | 10/10 |
Twelve fields, ten runs, each method. Every cell is one field in one record. The left grid is holes and red. The right grid is solid, with one outlined row where the model said it didn't know.
Those two numbers are the point. Given one word for "I don't know," the model used it exactly where it should and nowhere else. In method one it invented a rights value ten times out of ten. Not because it was dumb. Nobody had given it the word.
Two things to say plainly. First, Sonnet 5 has no temperature setting. The API rejects temperature for this model. There is no knob that makes it repeat itself, so every run in both methods is the model sampling as it ships, and whatever consistency method two shows comes from the structure, not a setting. Some models do expose that knob. Turn temperature down on one of those and the free-text fields, the title and the description, will come back tighter and more alike from run to run. Structure does the rest either way. Temperature narrows the wording; it has never stopped a model from inventing a rights value. Second, in method two the model never used a thinking step. Given a schema and a context block, it had nothing to reason about, and each run took five seconds instead of up to eighty.
The AI didn't need to be smarter.
It needed direction, like any new employee.
We loaded all twenty records into a BETTER! asset page. Same file, open in the DAM, ten ingests each way. Click through the runs and watch the record wobble, then watch it hold.
Open the demo two minutes, no loginThe webinar was right that AI will hurt you unless you control it. Where we part ways is on what control means. It is not a governance program and it is not an engagement. It is the page above: a field list, a few allowed-value lists, the metadata your files already carry, and a rule for what to write when the answer isn't there. That is cataloguing. If you manage a DAM, you already know how to do it, and nothing in method two happens without someone who does.
This is the core of how a serious deployment works, not the whole of it. A production DAM adds a review queue, versioned prompts and a pinned model. But the core is what closes the gap the exercise opens, and the core is one page.
BETTER! is built this way, and it is fully functional today. It is C2PA compliant. It tracks provenance from the moment an asset arrives to the moment it leaves, and every action along the way, no matter how small, is recorded for audit. The model's answer is one entry in that record. It is never the record itself.
The question isn't whether your DAM has AI. It's whether your DAM has a brain, and thinks.