# Asset Graph Desk > Mid-production the question is never whether a prompt is good. It is what has to be made > again. Five lanes over one project, plus a free browser-side engine that builds the > dependency graph and computes the blast radius by reachability. URL: https://asset-graph-desk.skillsafe.ai/ API: https://asset-graph-desk.skillsafe.ai/api.html Derived from jijiutong/ai-visual-director (https://github.com/jijiutong/ai-visual-director), MIT: its project-graph engine and its four query primitives, its incremental-update change classification with field-level effects, and its asset-plan tiers. Not affiliated with or endorsed by jijiutong. ## What the free engine does It runs entirely in the browser, on the project you paste, with no account and no credits. 1. **Parses** the project into a typed graph and builds two indices: forward (entity -> the shots and assets that depend on it) and reverse (shot -> everything it depends on). 2. **Validates** it - dangling references, orphans, duplicate ids, assets locked to nothing. A graph with a broken edge answers every later question confidently and wrongly, so this comes first. 3. **Computes the blast radius** of a change by reverse reachability: every shot, asset and line that is now stale, and which fields of each. 4. **Orders the regeneration** by tier, so a board is never rebuilt from a character sheet that is itself about to change. A note on cycles, since a dependency graph invites the question: this one cannot have any. Assets lock to characters, scenes or shots; shots use characters and a scene; nothing points back. The graph is layered by construction, so a cycle check would be code that can never fire - and a check that can never fail is worse than no check, because it reads as coverage. ## The entity types - `character` (prefix `C`) - someone who appears in shots - `scene` (prefix `S`) - a place shots happen in - `style` (prefix `VS`) - the visual grammar, which touches every shot - `shot` (prefix `SH`) - one generated clip - `dialogue` (prefix `D`) - one spoken line, in one shot - `asset` (prefix `@`) - a generated image a shot locks to ## The asset kinds, and their regeneration tiers - `character_sheet` - locks to a character, tier 1. the reference every shot with that character is drawn against - `scene_reference` - locks to a scene, tier 1. the plate every shot in that scene is drawn against - `storyboard_board` - locks to a shot, tier 2. the frame a shot is composed from - `keyframe` - locks to a shot, tier 3. the first frame a generation starts from - `end_frame` - locks to a shot, tier 3. the last frame a generation lands on Everything in tier 1 rebuilds before anything in tier 2. Within a tier the work is independent and can run in parallel. ## The ten change kinds ### `character_look` - Character appearance - Example: give the lead long hair, put her in red - Entity: `character`. Reaches: entity - Fields touched: `action` - Assets to rebuild: `character_sheet` - Reassess: Character RM ### `character_face` - Character features - Example: change the eye colour, add a scar - Entity: `character`. Reaches: entity - Fields touched: `action` - Assets to rebuild: `character_sheet` - Reassess: Character RM ### `character_new` - New character - Example: add a supporting character - Entity: `character`. Reaches: entity - Fields touched: `characters` - Assets to rebuild: `character_sheet` - Reassess: Character RM ### `scene_element` - Scene element - Example: add a stele to the tomb, a tree outside the window - Entity: `scene`. Reaches: entity - Fields touched: `action` - Assets to rebuild: `scene_reference` - Reassess: Scene RM ### `scene_weather` - Scene weather or time - Example: rain becomes snow, day becomes dusk - Entity: `scene`. Reaches: entity - Fields touched: `color`, `lighting`, `action` - Assets to rebuild: `scene_reference` - Reassess: Scene RM ### `shot_scene` - One shot moves scene - Example: shot 3 moves indoors - Entity: `shot`. Reaches: shot - Fields touched: `scene_id`, `lighting`, `color` - Assets to rebuild: `storyboard_board`, `keyframe`, `end_frame` - Reassess: Scene RM ### `style_change` - Style change - Example: switch to a Wong Kar-wai look - Entity: `style`. Reaches: **every shot in the project** - Fields touched: `color`, `lighting` - Assets to rebuild: `scene_reference`, `storyboard_board` - Reassess: Style RM ### `style_tweak` - Style adjustment - Example: warm the palette slightly - Entity: `style`. Reaches: **every shot in the project** - Fields touched: `color` - Assets to rebuild: none - Reassess: Style RM ### `shot_content` - One shot's content - Example: shot 3 darker, shot 5 becomes a close-up - Entity: `shot`. Reaches: shot - Fields touched: `action`, `camera` - Assets to rebuild: `storyboard_board`, `keyframe`, `end_frame` - Reassess: Shot RM ### `dialogue_edit` - Dialogue - Example: reword the line in shot 7 - Entity: `dialogue`. Reaches: dialogue - Fields touched: `text`, `delivery` - Assets to rebuild: none - Reassess: - ## The project format ```text CHARACTERS C1 | Mo Yuan | protagonist SCENES S1 | The sword tomb STYLE VS7 | Wong Kar-wai SHOTS SH01 | S1 | C1,C2 | wide establishing on the tomb ASSETS @0 | character_sheet | C1 DIALOGUE D1 | SH02 | C1 | I have waited long enough. ``` ## A worked blast radius On a fourteen-shot project with three characters and two scenes: - **the protagonist changes coat**: 11 shots and 1 assets - 12 things to remake - **a supporting character changes coat**: 2 shots and 1 assets - 3 things to remake - **the style changes**: 14 shots and 5 assets - 19 things to remake - **one shot becomes a close-up**: 1 shots and 2 assets - 3 things to remake - **a line is reworded**: 0 shots and 0 assets - 0 things to remake The spread is the point. The same kind of note costs twelve or three depending only on how many shots the entity appears in, and nobody can see that by reading the shot list. ## The five lanes ### `map` - Build the graph Every character, scene, shot, line and asset, and every edge between them. The forward index says which shots an entity reaches; the reverse index says what each shot depends on. Neither is readable off the source files. Sections: `Summary`, `Graph`, `Forward Index`, `Reverse Index`, `Next Step`. Fields: `project`*, `focus`. ### `impact` - What has to be made again The only question that matters mid-production. Change one thing and this returns every shot, asset and line that is now wrong - by reachability, not by guesswork - along with which fields of each. Sections: `Summary`, `Blast Radius`, `Field Effects`, `Reassessment`, `Next Step`. Fields: `project`*, `change`*, `entity`, `detail`. ### `order` - Regeneration order A blast radius is a set; a work queue is a sequence. Character sheets and scene plates rebuild before the boards drawn from them, and boards before the shots that lock to them - otherwise the second pass inherits the first pass's mistake. Sections: `Summary`, `Work Queue`, `Batches`, `Blocked By`, `Next Step`. Fields: `project`*, `change`*, `entity`, `capacity`. ### `audit` - Audit the graph A graph with a dangling reference gives a confident wrong answer to every impact question afterwards. This finds the references that point at nothing, the entities nothing points at, and the ids declared twice. Sections: `Summary`, `Verdict`, `Findings`, `Repaired Project`, `Next Step`. Fields: `project`*, `focus`. ### `plan` - Size a change before making it Three ways to get the same note done, priced by how much has to be regenerated. Changing the character's coat costs one sheet and nine shots; changing the style costs every plate, every board and all fourteen. Sections: `Summary`, `Options`, `Cost Table`, `Recommendation`, `Next Step`. Fields: `project`*, `note`*, `budget`. ## What this app does not do It reasons about a project structure. It does not generate video or images, it calls no generation API on your behalf, and the graph is only as good as the project you paste - a dangling reference makes every impact answer confidently wrong, which is why the audit lane exists.