Fill out Step 4 (References & Assets) for AIMVDashboard by completing character/location reference libraries and keeping them aligned with canon IDs. Use when asked to complete or verify Step 4 page content.
Complete reference libraries for every character and location defined in the canon. Reference images provide visual continuity anchors that the generation system uses to maintain consistent character appearance and location identity across all shots.
projects/<project-id>/bible/characters.json — lists all character IDsprojects/<project-id>/bible/locations.json — lists all location IDsprojects/<project-id>/reference/
├── characters/
│ └── <CHAR_ID>/
│ ├── ref_01.png (or .jpg/.jpeg/.webp)
│ ├── ref_02.png
│ ├── ref_03.png
│ └── guide.json (optional)
└── locations/
└── <LOC_ID>/
├── ref_01.png
├── ref_02.png
├── ref_03.png
└── guide.json (optional)
Each reference directory must contain at least 3 images in .png, .jpg, .jpeg, or .webp format.
default if not specified.bible/characters.json and extract all character IDs.bible/locations.json and extract all location IDs.reference/characters/<CHAR_ID>/.
b. Verify at least 3 reference images are present.
c. Optionally create/update guide.json with invariants and allowed variations.reference/locations/<LOC_ID>/.
b. Verify at least 3 reference images are present.
c. Optionally create/update guide.json.If the server is running:
GET /api/references/characters?project=<id> — list character reference directories and image countsGET /api/references/locations?project=<id> — list location reference directories and image countsPOST /api/references/characters/upload?project=<id> — upload a character reference image (multipart form: entityId, file)POST /api/references/locations/upload?project=<id> — upload a location reference image (multipart form: entityId, file){
"invariants": [
"Always wears the asymmetric draped outer layer",
"Hair flows past shoulders in every shot",
"Warm brown skin tone consistent across all lighting"
],
"allowedVariations": [
"Lighting angle and intensity may change",
"Expression ranges from neutral to emotional",
"Camera distance varies from close-up to wide"
],
"notes": "Primary character — highest reference priority in generation"
}
For each character, aim for:
For each location, aim for:
If generating reference images via AI, use this structure:
Front-facing, full body portrait, neutral standing pose
[Character physical description from characters.json]
[Face signature from characters.json]
[Costume description with colors]
Framing: centered composition, full body visible
Shot Size: full body portrait
Angle: eye level, straight-on front view
Background: neutral dark studio backdrop
Lighting: soft even studio lighting from front
Style: clean character reference sheet, high detail, cinematic realism
Negative: no text, logos, watermarks, distorted anatomy, motion blur, cartoon style
During shot generation (Step 5), the system auto-collects references in this priority:
reference/characters/ and reference/locations/Maximum: 14 input reference images per generation call. Primary characters get priority allocation.
Before marking complete:
characters.json has a matching directory under reference/characters/.locations.json has a matching directory under reference/locations/..png/.jpg/.jpeg/.webp).project=default
node -e "
const fs = require('fs');
const path = require('path');
const base = 'projects/' + process.env.P + '/';
let ok = true;
const imgExts = ['.png', '.jpg', '.jpeg', '.webp'];
function countImages(dir) {
if (!fs.existsSync(dir)) return 0;
return fs.readdirSync(dir).filter(f => imgExts.includes(path.extname(f).toLowerCase())).length;
}
// Check characters
try {
const chars = JSON.parse(fs.readFileSync(base + 'bible/characters.json', 'utf8'));
for (const c of (chars.characters || [])) {
const d = base + 'reference/characters/' + c.id;
const n = countImages(d);
if (n < 3) { console.error(c.id + ': ' + n + ' images (need 3+)'); ok = false; }
else { console.log(c.id + ': ' + n + ' images OK'); }
}
} catch (e) { console.error('characters.json: ' + e.message); ok = false; }
// Check locations
try {
const locs = JSON.parse(fs.readFileSync(base + 'bible/locations.json', 'utf8'));
for (const l of (locs.locations || [])) {
const d = base + 'reference/locations/' + l.id;
const n = countImages(d);
if (n < 3) { console.error(l.id + ': ' + n + ' images (need 3+)'); ok = false; }
else { console.log(l.id + ': ' + n + ' images OK'); }
}
} catch (e) { console.error('locations.json: ' + e.message); ok = false; }
if (!ok) process.exit(1);
console.log('Step 4 complete.');
" P="$project"
skills/_shared/references/universal-prompt-rules.md for reference image system details.references/reference-image-guide.md for detailed curation best practices.Step 4 is complete only when every canon character and location has a reference directory with 3+ images.