| name | compose-creative |
| description | Core creative engine. Generates images and video using 4 modes with brand assets, AI compositing, and platform resizing. |
| argument-hint | [--post <id>] [--all] [--variant b] |
| effort | max |
| user-invocable | true |
/socialforge:compose-creative — Creative Production Engine
The core production skill. Takes asset matching results and produces visual and video assets for each post according to its assigned creative mode, using a staged human-in-the-loop approval flow.
Context efficiency
Asset-heavy skill. Grep before Read the asset catalog (${CLAUDE_PLUGIN_DATA}/<brand>/assets/index.json) — never list the asset directory. Reference generated images / videos by path, not by loading metadata. Brand profile loads once per session.
The 4 Creative Modes
MODE 1: ANCHOR_COMPOSE
Brand asset is the untouchable center. AI generates scene around it.
- Remove background from brand asset (rembg)
- Generate surrounding scene via AI using brand style references
- Composite asset onto generated scene (Pillow)
- Add shadow/reflection for natural placement
- Add text overlay + logo
- Resize per platform
MODE 2: ENHANCE_EXTEND
Brand asset is the foundation. AI modifies periphery only.
- Feed real image to AI edit endpoint
- AI extends/enhances while preserving core subject
- Verify core subject preservation
- Add overlay + resize
MODE 3: STYLE_REFERENCED
No brand asset composited. Style reference photos guide AI generation.
- Load 2-8 brand style reference images
- Construct 5-layer prompt (brand identity, post context, creative direction, image rules, technical)
- Feed references + prompt to AI generation
- Quality review — does output match brand DNA?
- Add overlay + resize
MODE 4: PURE_CREATIVE
Full AI generation with only text prompt + brand colors/mood.
- Construct prompt from brief + brand-config visual style
- Generate (text-only, no reference images)
- Quality review
- Add overlay + resize
Prerequisites
asset-matches.json must exist (generated by /socialforge:match-assets -> match_assets.py)
calendar-data.json must exist (generated by /socialforge:parse-calendar)
brand-config.json must exist for active brand
cost-log.json initialized (via status_manager.py --action init-month)
- Valid credentials for Gemini via Vertex AI (images) and WaveSpeed / Kling v3.0 (video) via credential_manager.py
If any prerequisite is missing: "Run /socialforge:match-assets first — creative production needs asset matching results."
Process (For Each IMAGE Post) — 4-Stage Approval Flow
Stage 1: Creative Direction (No API Call)
Present 2-3 creative direction options to the user. Each option includes:
- A description of the visual concept
- Mood, color palette, and composition approach
- How the brand asset will be used (per the assigned creative mode)
- Rough reference to style/tone
No image generation happens here. The user picks a direction before any credits are spent.
Stage 2: Confirm Details
Once the user selects a direction, confirm the specifics before generating:
- Final prompt details and any refinements the user wants
- Aspect ratio and platform targets
- Text overlay copy and placement preferences
- Any special instructions (e.g., "warmer tones", "more negative space")
User explicitly approves to proceed to generation.
Stage 3: Generate and Select (Gemini via Vertex AI)
- Generate 2-3 image versions based on the confirmed direction
- Show all versions inline via the Read tool so the user can compare
- User picks their preferred version (or requests another round with adjustments)
- Max 3 generation rounds per post before escalating
Stage 4: Post-Process and Save
After the user selects their preferred image:
- Apply text overlay via compose_text_overlay.py
- Apply logo per brand-config.json (position, opacity, size, platform exclusions)
- Resize per platform via resize_image.py
- Save final assets to the post-specific folder:
{post_folder}/final/
- Update status-tracker.json
- Log prompt to
shared/prompt-logs/
- Track API cost in cost-log.json
Process (For Each VIDEO Post) — 5-Stage Approval Flow
Stage 1: Video Concept (No API Call)
Present 2-3 video concept ideas to the user. Each option includes:
- A narrative arc or visual concept for the short-form video
- Description of the opening frame, motion/transition, and closing frame
- Mood, pacing, and style notes
- How brand assets or style references will be incorporated
User picks a concept before any generation begins.
Stage 2: First Frame Generation (Gemini via Vertex AI)
- Generate 2 first-frame options based on the selected concept
- Show both inline via the Read tool
- User picks their preferred first frame (or requests adjustments)
Stage 3: Last Frame Generation (Gemini via Vertex AI)
- Generate 2 last-frame options that complement the approved first frame
- Show both inline via the Read tool
- User picks their preferred last frame (or requests adjustments)
Stage 4: Video Generation (WaveSpeed / Kling v3.0)
- Generate 2 video versions using the approved first and last frames as keyframes
- Use WaveSpeed or Kling v3.0 via generate_video.py
- Show both versions for user review
- User picks their preferred video (or requests another round)
- Max 3 generation rounds before escalating
Stage 5: Post-Process + Save
After the user picks the final video, post-processing runs before saving:
- Watermark: Logo overlay is automatically added to the video via video_postprocess.py
- Subtitles: User is asked whether to burn subtitles into the video (optional). SRT was already generated from the script and is saved separately regardless.
- Background music: If the video has no audio (sound=False in Kling config), user is asked whether to add background music (optional).
- Platform resize: Video is automatically resized for each target platform (letterbox/pillarbox with black padding, no stretching)
- Save all platform versions to
{post_folder}/final/
- Save alternatives to
{post_folder}/versions/
- Update status-tracker.json
- Log prompt and generation parameters to
shared/prompt-logs/
- Track API cost in cost-log.json
Batch Mode (/socialforge:generate-all)
When processing all posts via /socialforge:generate-all, the staged approval flow uses group-based approval to avoid per-post bottlenecks:
- Group posts by creative mode — all ANCHOR_COMPOSE posts together, all PURE_CREATIVE together, etc.
- Stage 1 in bulk — present creative direction options for each post in the group at once. User reviews and selects directions for the entire group before generation begins.
- Stage 2 confirmation — confirm details for the group. User can adjust individual posts or approve the batch.
- Stage 3 generation — generate images/videos for the group sequentially. After each post's variants are generated, show them inline. User can approve, request regeneration, or skip.
- Stage 4/5 post-processing — all approved posts are post-processed together (logo, resize, save).
Progress indicator during batch:
[GROUP 1: ANCHOR_COMPOSE — 8 posts]
Presenting directions... awaiting approval
[GROUP 2: STYLE_REFERENCED — 12 posts]
Queued — waiting for Group 1
[GROUP 3: VIDEO — 4 posts]
Queued — waiting for Group 2
Posts that are skipped or fail after 3 rounds are collected into a "needs attention" list presented at the end of the batch.
Rules
- Brand assets are SACRED — never modify the core subject in ANCHOR_COMPOSE
- No text in AI-generated images — text is always added via compose_text_overlay.py
- Logo overlay per brand-config.json (position, opacity, size, platform exclusions)
- Every generated image/video requires user approval at each stage before proceeding
- No API calls before Stage 1 approval — creative direction is confirmed before spending credits
- Max 3 generation rounds per post before escalating to user
- Show all variants inline via the Read tool so the user can visually compare
Progress Indicators
[3/28] Post P03 — IMAGE — ANCHOR_COMPOSE
Stage 1: Presenting 3 creative directions...
[User selects Direction B]
Stage 2: Confirming details...
[User approves]
Stage 3: Generating 3 variants (Gemini via Vertex AI)...
Variant A... done
Variant B... done
Variant C... done
[Images shown inline — user selects Variant B]
Stage 4: Post-processing...
Text overlay... done
Logo... done
Resize (IG, FB, LinkedIn)... done
Saved. done
[4/28] Post P04 — VIDEO — STYLE_REFERENCED
Stage 1: Presenting 2 video concepts...
[User selects Concept A]
Stage 2: Generating 2 first frames (Gemini via Vertex AI)...
[User selects Frame 1]
Stage 3: Generating 2 last frames (Gemini via Vertex AI)...
[User selects Frame 2]
Stage 4: Generating 2 video versions (WaveSpeed)...
[User selects Video A]
Stage 5: Saving final...
Saved. done
Scripts Used
- generate_image.py | compose_image.py | edit_image.py
- generate_video.py | credential_manager.py
- resize_image.py | compose_text_overlay.py | verify_brand_colors.py
Timeout & Fallback
- Image generation (Gemini via Vertex AI): 60-second timeout per image. Retry once with simplified prompt.
- Video generation (WaveSpeed / Kling v3.0): 120-second timeout per video. Retry once with reduced parameters.
- Background removal: 30-second timeout. If fails, flag for manual masking.
- Compositing: 15-second timeout. If Pillow fails, save components for manual assembly.
- Total per image post: 5-minute cap. If exceeded, mark as
production_timeout and move to next.
- Total per video post: 8-minute cap. If exceeded, mark as
production_timeout and move to next.
- Staged approval pauses do not count against timeout — the clock runs only during active generation and processing.