7.4 Asset Management and Versioning
At a hundred assets the folder is fine. At ten thousand it is the thing that determines whether you can answer a question in a minute or a day — and the questions that arrive are not optional. Which model made this? What did we publish under version three? Can this be reproduced? Is this the same image we posted in March?
This chapter is the smallest system that answers those.
The library structure
Five axes, and the structure follows from the questions rather than from aesthetics:
assets/
<persona>/ one folder per persona
00-bible/ canon, timeline register (2.3, 2.4)
10-references/ face, body, outfits, locations, props (5.3)
20-datasets/ training inputs (4.4)
30-models/ adapters, hashes, base version (4.5)
40-prompt-lists/ variant files (5.2)
50-output/ raw generations, by run
<run-id>/ one folder per batch
manifest.json prompts, seeds, model, references
60-approved/ passed QA, not yet published (5.6)
70-published/ what went out, when, where
80-queue/ fix queue and bank
99-archive/ retired versions, never overwritten
Three structural decisions worth defending.
A folder per run. Outputs are grouped by the One production run, sized from the survival rate rather than from ambition. that produced them, because that is the unit you will need to invalidate. If a run used a bad adapter, you want to identify everything it made, and that is a folder operation rather than a database query.
Approved and published are separate. The bank from 5.6 is approved-but-unpublished, and it is a different state from published. Merging them means you cannot tell what the audience has seen.
Archive, never delete. Retired references and adapters move to archive with their dates. Chapter 4.7's retirement procedure and 11.3's disclosure records both need the old versions to exist.
Asset status
Six states, and every asset is in exactly one:
| Status | Meaning | Next |
|---|---|---|
generated |
Raw output, not yet reviewed | QA |
rejected |
Failed QA, with the defect code | Fix queue or discard |
approved |
Passed all three QA stages | Bank or publish |
scheduled |
Has a publication slot | Publish |
published |
Live, with URL and date | Analytics |
archived |
Retired, kept for records | — |
Why statuses rather than folders alone. A status is a query. "How many approved assets do I have?" and "what has been approved for more than thirty days without publishing?" are questions that change decisions, and they are only answerable if the state is explicit.
The one status that needs discipline: rejected requires a defect code from 5.6's twelve-row table,
not merely a flag. The codes are what turn the rejection history into a diagnosis of your pipeline — the
difference between knowing your rejection rate is 30% and knowing it is 30% because of hands.
Metadata: the fields that earn their place
Per asset, with a reason for each:
| Field | Why it exists |
|---|---|
asset_id |
Stable reference |
persona |
Multi-persona disambiguation |
created |
Date, for the timeline register |
prompt |
Reproduction; also 11.5's record |
prompt_variant |
Which of the forty (5.2) |
seed |
Reproduction (5.2) |
model + version |
Reproduction and diagnosis |
base_model_hash |
The 4.5 mismatch trap |
adapter + version + hash |
Identity version |
references_used |
Which sheet/outfit/location (5.1, 5.3) |
qa_score |
4.6 dimensions |
defect_code |
For rejections (5.6) |
edits |
What was changed after generation |
status |
The six states above |
published_url + date |
Compliance and analytics |
disclosure_label |
11.3 |
Six of the sixteen exist for compliance. prompt, model, adapter, created, published_url,
and disclosure_label are the fields that let you answer a regulator's or a platform's question about
what you published and how it was made. Chapter 11.5's Provider-side marking as C2PA credentials or pixel watermarks; not your obligation and not reliable. obligations and 11.3's
disclosure records depend on this data existing, and it cannot be reconstructed later.
The practical test: if a brand asks you to prove how a frame in an advertisement was produced, can you answer from the system in one minute? If not, a field is missing.
Automating the metadata
Manual metadata entry does not survive contact with volume. The system has to write it.
At generation time: the The automation layer that calls the engine, passes parameters, and files outputs; n8n here. (7.3) writes prompt, One prompt-and-settings combination inside a batch, tracked so its survival can be measured., The random starting point; the same seed with the same settings reproduces the same image., model version, adapter version, and reference paths into the run manifest. All of these are already known to the pipeline — this is a read-and-record step, not new work.
At QA time: the human adds the score and the status, which are the two fields that genuinely require judgement. Everything else was written already.
At publication time: the The noise schedule the sampler follows, such as normal or karras. records the URL, the date, the platform, and the disclosure label. Again mechanical.
The consequence: the only fields a human touches are qa_score, defect_code, and status. Three
fields, which is why the system is feasible.
Where to store it. A structured file per asset (JSON beside the image) or a database. A single JSON per asset survives tool changes, is greppable, and needs no infrastructure; a database is faster at scale and worse at portability. Start with files, and move when you have a query you cannot answer.
Deduplication and near-duplicate detection
Publishing the same frame twice is a specific failure with a specific cause: prompt variant lists get reused and the operator does not remember.
Two checks, both cheap:
Exact duplicates by hash. Trivial and catches the copy.
Near-duplicates by perceptually comparing a new asset against the last N published. An image hash or an embedding comparison catches the "same scene, slightly re-generated" case, which is the one that actually reaches the audience.
And a human check that no system replaces: does this feel like something we posted recently? Chapter 5.3's rolling exclusion rule is the manual version, and it is worth keeping even with automation, because a near-duplicate is a judgment about the audience's memory rather than a pixel comparison.
Versioning the assets themselves
Three separate version spaces, which people conflate:
Identity versions. A small low-rank adapter, tens to a couple hundred megabytes, that nudges a base toward one face. v1, v2, v3, each with its base hash. Changing this changes the
persona's face and is a major event (4.5, 4.7).
Reference versions. Sheet v1 for LoRA v1. A new sheet for the same adapter is a minor event
(5.1).
Production versions. The maintained set of forty reusable prompt variants, refilled in the weekly review slot. 2026-Q3, graph version, preset version. Changing these changes
how the same identity is rendered.
The rule: every asset records all three, because the answer to "why does this look different" depends on which space changed. An asset store that records only one cannot answer the question.
Backups
Unglamorous and mandatory, because the library is the business. Losing the reference library means losing the persona's ability to be reproduced.
Three copies, two media, one offsite. The classic formulation, and it holds here. A local drive, a second local copy on different hardware, and a cloud or remote copy.
Back up the references, adapters, prompt lists, and metadata first. These are small and irreplaceable. The generated outputs are large and regenerable, and they are the lowest-priority backup target.
Test a restore once. An untested backup is a file, as 3.6's hygiene rule says. Restoring one folder from your backup is a fifteen-minute exercise that proves the whole system.
Where this goes wrong
One flat folder. Unanswerable questions within months.
Merging approved and published. You lose track of what the audience has seen.
Deleting retired versions. You lose the ability to explain your own history.
Manual metadata. It will not be maintained.
Recording the model but not the base hash. The mismatch trap, undiagnosable.
No near-duplicate check. Repetition reaches the audience.
Conflating the three version spaces. "Why does this look different" becomes unanswerable.
No tested backup. The library is the business.
The gate
- Does the library have one folder per persona with separate run, approved, published, and archive areas?
- Is every asset in exactly one of six states?
- Do you record the sixteen fields, including the six that exist for compliance?
- Are metadata fields written automatically at generation and publication time, with only three fields touched by a human?
- Do you have both an exact and a near-duplicate check?
- Do you distinguish identity, reference, and production versions?
- Do you have three copies, and have you tested a restore?
What you leave with
A five-axis library structure with a folder per run and separate approved and published states, six asset statuses with the discipline that rejections carry a defect code, sixteen metadata fields with the six that exist for compliance, an automation plan that reduces human entry to three fields, exact and near-duplicate detection, three version spaces that must be recorded separately, and a backup rule with one test.