product-shoot — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited product-shoot (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.
Places a product into a composition reference image, optionally matching the lighting and tonal atmosphere of a third reference.
Three inputs drive the output:
Output saved to ./brands/[brand-name]/product-shoot/[output-name]/.
Scan ./brands/ for subfolders that contain a brand-identity/visual-guidelines.md file.
/brand firstCreate the shared reference folders if they don't exist:
mkdir -p brands/[brand-name]/product-shoot/composition-references
mkdir -p brands/[brand-name]/product-shoot/lighting-referencesTell the user what this skill needs and where to put things. Lead with the explanation — do NOT mention folder contents or whether folders are empty before explaining what they're for. Be clear — they may not know what "composition reference" means:
"To generate your product shot I need two things from you (a third is optional):
>
1. Composition reference (required) A photo that shows the kind of scene, framing, and environment you want — e.g. a hand holding a product, an overhead flat-lay on marble, a bottle leaning against a wall. The product in the reference photo doesn't matter — I'll swap it out for yours. Save it to: brands/[brand-name]/product-shoot/composition-references/>
2. Product image (required) I'll pull this from your brand's product images folder — just tell me which product you want to shoot.
>
3. Lighting reference (optional) A photo whose lighting mood you want to match — e.g. a moody dark studio shot, a soft natural window light image. If you skip this, I'll use the lighting from your composition reference as-is. Save it to: brands/[brand-name]/product-shoot/lighting-references/>
Name your files clearly — e.g.hand-hold-concrete.jpg,moody-dark-studio.jpg. Drop them in and let me know when ready."
After delivering this message, check what's already in each folder. If either has files, follow up with what's already available so the user knows they can reuse them:
ls brands/[brand-name]/product-shoot/composition-references/
ls brands/[brand-name]/product-shoot/lighting-references/Show available composition references:
Composition references:
1. hand-hold-dark-bg.jpg
2. overhead-marble.jpg
3. hero-leaning-wall.jpgAsk: "Which composition reference would you like to use? (number or name)"
If the folder is empty, tell the user:
"No composition references found. Drop at least one image into brands/[brand-name]/product-shoot/composition-references/ and let me know."Wait for confirmation before proceeding.
Ask: "Which product would you like to shoot?"
Check brands/[brand-name]/brand-identity/product-images/ for a match. Show what was found:
Found:
✓ hey-bud-face-tint.jpg
Not found:
✗ [product name] — not in product imagesIf not found:
brands/[brand-name]/brand-identity/products.json for the product URL curl -L "[product-image-url]" -o "brands/[brand-name]/brand-identity/product-images/[slug].jpg"brand-identity/product-images/ and confirm.Show available lighting references:
Lighting references:
1. talgh-soft-wrap.jpg
2. moody-dark-studio.jpg
(or skip to use the composition reference's existing lighting)Ask: "Would you like to apply a lighting reference? Pick one from the list, or say 'skip' to use the composition reference's lighting as-is."
If the folder is empty, skip this step and note that no lighting reference will be used.
Ask: "Any specific requests? e.g. 'add a slight shadow under the product', 'keep the background muted', 'match the product orientation to the original'. Leave blank to skip."
These get appended to the prompt.
Ask: "What aspect ratio? Default is 3:4. Other options: 1:1, 4:5, 2:3, 4:3, 16:9, 9:16."
Use 3:4 if the user doesn't specify.
Derive a slug from the product name and composition reference:
hey-bud-tint-hand-holdmutimer-jacket-overhead-marblebrand-hero-leaning-wallAsk the user to confirm or rename.
Create the output folder and write the spec:
brands/[brand-name]/product-shoot/[output-name]/
product-shot-spec.jsonWith lighting reference:
{
"output_name": "hey-bud-tint-hand-hold",
"brand": "[brand-name]",
"product_name": "Hey Bud Acne Face Tint",
"product_image": "brands/[brand-name]/brand-identity/product-images/hey-bud-face-tint.jpg",
"composition_reference": "brands/[brand-name]/product-shoot/composition-references/hand-hold-dark-bg.jpg",
"lighting_reference": "brands/[brand-name]/product-shoot/lighting-references/talgh-soft-wrap.jpg",
"additional_notes": "Add a slight shadow beneath the product.",
"aspect_ratio": "3:4"
}Without lighting reference:
{
"output_name": "hey-bud-tint-hand-hold",
"brand": "[brand-name]",
"product_name": "Hey Bud Acne Face Tint",
"product_image": "brands/[brand-name]/brand-identity/product-images/hey-bud-face-tint.jpg",
"composition_reference": "brands/[brand-name]/product-shoot/composition-references/hand-hold-dark-bg.jpg",
"lighting_reference": null,
"additional_notes": "",
"aspect_ratio": "3:4"
}Run from the project root:
python3 skills/references/generate-product-shot.py brands/[brand-name]/product-shoot/[output-name]Prompt used (with lighting reference):
"Regenerate image 1 by substituting its primary subject with the exact product shown in image 2. Preserve everything that makes image 1 compelling: the camera angle and perspective exactly (low angle, eye level, overhead — whatever is shown), the lighting quality and direction, the background, colour grade, depth of field, mood, and overall atmosphere. The product from image 2 must match in form, proportions, and branding exactly — do not distort its shape to fit the reference product's silhouette. Only the subject changes. Everything else stays. Adopt the lighting and tonal atmosphere of image 3."
Prompt used (without lighting reference):
"Regenerate image 1 by substituting its primary subject with the exact product shown in image 2. Preserve everything that makes image 1 compelling: the camera angle and perspective exactly (low angle, eye level, overhead — whatever is shown), the lighting quality and direction, the background, colour grade, depth of field, mood, and overall atmosphere. The product from image 2 must match in form, proportions, and branding exactly — do not distort its shape to fit the reference product's silhouette. Only the subject changes. Everything else stays."
Additional notes are appended to either prompt if provided.
Image order passed to Nano Banana: composition reference → product image → lighting reference (if present).
Cost: ~$0.12 per image.
Tell the user the exact path where the file was saved, e.g.: brands/[brand-name]/product-shoot/[output-name]/[output-name]_v1.png
Ask: "Happy with this? Or would you like to regenerate, try a different composition, or swap the lighting reference?"
Once the user is happy, suggest the next step:
"Great shot. If you'd like to animate this into a short video clip, run /add-motion."To regenerate (same spec):
python3 skills/references/generate-product-shot.py brands/[brand-name]/product-shoot/[output-name]Saves as the next version — does not overwrite.
To try a different composition: update composition_reference in product-shot-spec.json and re-run.
To add or change lighting: update lighting_reference and re-run.
To adjust the prompt: update additional_notes and re-run.
brands/[brand-name]/product-shoot/ — they can be reused across multiple product shots without re-uploadingproduct-shoot/ subfolder — multiple brands can run independent product shot workflows in the same project~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.