multiply-ugc — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited multiply-ugc (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Two-stage workflow:
Output saved to ./brands/[brand-name]/multiply-ugc/[output-name]/.
Scan ./brands/ for subfolders that contain a brand-identity/visual-guidelines.md file.
/brand firstAsk:
"Is the UGC you want to multiply one you created with the/ugcor/product-ugcskill, or an external video you've shot or downloaded?"
Option A — From `/ugc` skill output:
List available UGC outputs from ./brands/[brand-name]/ugc/:
Available UGC outputs:
• jade-park-run
• marcus-kitchen-hydrationThe user selects one. Locate:
.mp4 in brands/[brand-name]/ugc/[output-name]/jade-park-run_v2-run1.mp4 → use jade-park-run_v2.png). This must be the image that was used to generate the video, not necessarily the latest image version.If no video is found in the folder, tell the user: "No video found for [output-name] — make sure you generated the video in the /ugc skill first."
Option B — From `/product-ugc` skill output:
List available product UGC outputs from ./brands/[brand-name]/product-ugc/:
Available product UGC outputs:
• jade-electrolytes-kitchen
• marcus-protein-outdoorsThe user selects one. Locate:
.mp4 in brands/[brand-name]/product-ugc/[output-name]/luna-energy-gel-yarra-bench_v1-run1.mp4 → use luna-energy-gel-yarra-bench_v1.png). This must be the image that was used to generate the video, not necessarily the latest image version.If no video is found in the folder, tell the user: "No video found for [output-name] — make sure you generated the video in the /product-ugc skill first."
Option C — External UGC:
Create the uploads folder and ask the user to drop their video in:
mkdir -p brands/[brand-name]/multiply-ugc/uploads"Drop your UGC video into:brands/[brand-name]/multiply-ugc/uploads/Name it descriptively — e.g.jade-outdoor.mp4. Let me know the filename when it's in."
Wait for the user to confirm. Then:
brands/[brand-name]/multiply-ugc/uploads/[filename].mp4 ffmpeg -i brands/[brand-name]/multiply-ugc/uploads/[filename].mp4 -vframes 1 -q:v 2 brands/[brand-name]/multiply-ugc/uploads/[filename]-frame1.jpgList available models from ./brands/[brand-name]/models/:
Available models:
• jade
• marcus-02
• priyaThe user selects one. The model's headshot will be used: brands/[brand-name]/models/[name]/headshot.png.
Confirm:
"Swapping into model: [model name] Headshot: brands/[brand-name]/models/[name]/headshot.png"Derive a slug from the source UGC name and the target model:
jade-park-run-marcusoutdoor-priyaConfirm with the user or let them rename.
Create the output folder and write the spec:
brands/[brand-name]/multiply-ugc/[output-name]/
multiply-ugc-spec.json{
"output_name": "jade-park-run-marcus",
"brand": "[brand-name]",
"source_ugc_image": "brands/[brand-name]/ugc/jade-park-run/jade-park-run_v2.png",
"source_ugc_video": "brands/[brand-name]/ugc/jade-park-run/jade-park-run_v2-run1.mp4",
"model_dir": "brands/[brand-name]/models/marcus"
}For external UGC:
{
"output_name": "outdoor-priya",
"brand": "[brand-name]",
"source_ugc_image": "brands/[brand-name]/multiply-ugc/uploads/outdoor-frame1.jpg",
"source_ugc_video": "brands/[brand-name]/multiply-ugc/uploads/outdoor.mp4",
"model_dir": "brands/[brand-name]/models/priya"
}Run from the project root:
python3 skills/references/generate-multiply-ugc.py brands/[brand-name]/multiply-ugc/[output-name]This runs both stages sequentially:
source_ugc_image (Image 1) and model headshot (Image 2) to Nano Banana 2 — prompt: "swap the model in image 1 with the model in image 2"[output-name]-swap_v{n}.pngsource_ugc_video to Kling Motion Control v2.6 Standard with character_orientation: "video", no prompt[output-name]_v{n}.mp4Cost: ~$0.12 (model swap) + ~$0.07/sec of video output (Kling Motion Control)
After the swap image is generated, read and assess it internally before proceeding to motion transfer. Do not mention this check to the user.
Check for:
If the check fails: silently re-run --swap-only once using the same spec. Do not tell the user.
If the re-run also fails: show the user the image and explain what's off. Ask if they'd like to regenerate again or adjust the source image.
If the check passes (first or second run): proceed directly to motion transfer without mentioning the check.
Tell the user the exact paths:
Generated:
✓ brands/[brand-name]/multiply-ugc/[output-name]/[output-name]-swap_v1.png
✓ brands/[brand-name]/multiply-ugc/[output-name]/[output-name]_v1.mp4Ask: "Happy with these? You can:
model_dir and regenerate"To regenerate (both stages):
python3 skills/references/generate-multiply-ugc.py brands/[brand-name]/multiply-ugc/[output-name]To run swap only (check the image before committing to motion transfer):
python3 skills/references/generate-multiply-ugc.py brands/[brand-name]/multiply-ugc/[output-name] --swap-onlyTo retry motion transfer only (reuses the latest swap image — useful after approving the swap or if Stage 2 timed out):
python3 skills/references/generate-multiply-ugc.py brands/[brand-name]/multiply-ugc/[output-name] --motion-onlyEach run auto-increments — previous outputs are never overwritten.
character_orientation: "video" is always used — it supports up to 30s and handles complex motion better than "image" modekeep_original_sound: true is set by default — the original audio carries through to the output videomultiply-ugc/ subfolder — multiple brands can run independent workflows in the same project~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.