social-media-shorts-automation

---
name: social-media-shorts-automation
description: Design, generate, review, publish, and optimize automated short-form social videos across YouTube Shorts, TikTok, Instagram Reels, and related channels.
version: 1.0.0
tags: [shorts, tiktok, youtube-shorts, reels, creator-monetization, content-automation, social-media]
---

# Social-Media Shorts Automation

Reference note: see `references/controlled-pilot-production-v2.md` for the controlled first-video workflow: resource tiers, media-generation gates, pilot package shape, Wan prompt planning without generation, and no auto-posting. See `references/pilot-preview-render-v2.md` for the next approval step: `APPROVED_FOR_PREVIEW_RENDER`, EdgeTTS preview audio, time/word cue generation, deterministic 9:16 animatic MP4, checksums, and Telegram media delivery without Wan/AI-image/platform side effects. See `references/static-active-word-captions-and-final-pilot-render.md` for the corrected caption style and controlled final pilot render pattern: static 3–7 word phrase segments with only the active spoken word highlighted, hash-bound final render gates, one Wan text-free background layer, deterministic overlays, and draft-only manual posting packages. If a final render is rejected as preview-overlay-dominated or not visual-first, follow `references/visual-first-final-render-repair.md`: mark the render rejected/not-postable, fix Wan output parsing, enforce final overlay limits, produce only a short visual proof under `APPROVED_FOR_VISUAL_PROOF`, and do not run another full final until the visual direction is accepted. If even the visual proof is rejected as abstract/generic/dark or “blind T2V”, switch to `references/keyframe-first-final-visuals.md`: plan and approve start/end/style keyframes first, then run only a short I2V/first-last-frame proof with minimal renderer-owned overlays. If the user says the production method itself is wrong, keyframes are not I2V-ready, or an animatic was incorrectly substituted for a failed Wan proof, follow `references/visual-production-reset-i2v-first.md`: reject/audit the proof, stop content rendering, run technical I2V sanity first, then generate at most three styleframes for direction review. If deterministic layout proofs are useful as composition blueprints but rejected as too wireframe/PowerPoint for final style, switch to `references/premium-ai-styleframe-direction.md`: use the layouts only as mechanism blueprints, generate at most 3 tightly briefed premium text-free AI styleframes, deliver a contact sheet with verified media metadata, and keep Wan/I2V/endframes/full-final blocked until style direction approval. If those premium styleframes are better quality but still too abstract, switch to `references/real-life-premium-styleframes.md`: anchor the mechanism in a realistic work/meeting/desk scene, keep all readable overlays renderer-owned, generate at most 3 new real-life styleframes plus contact sheet, and still block Wan/I2V/endframes/full-final until explicit approval. If the user approves one or more real-life styleframe directions but wants to compare A/B/C before Wan, use `references/prerelease-animatic-preview.md`: build only a small AI-keyframe + deterministic-motion animatic per approved direction, reuse existing voiceover/captions, deliver MP4/contact/QA sheets with metadata, and keep Wan/I2V/final/posting blocked. If the user then rejects the renderer-added circles/arrows/labels/boxes/decision-target markers as destroying the premium look, switch to `references/clean-image-cut-no-overlay-pilot.md`: render only AI images + voiceover + clean subtitles, with a hard subtitles-only NoOverlayPolicy and no Wan/I2V/full-final/posting. If the user performs a strategic reset because the pilot is pretty but semantically weak, stop optimizing that candidate and follow `references/proof-short-real-problem-reset.md`: archive the old pilot as a learning case, enforce the Pretty Empty Visual Blocker, and build a screen/mockup-led Proof Short around an immediately visible real viewer problem before any premium/Wan production. If the next review focuses on image provider quality/provenance or subtitles running off-screen, follow `references/image-provider-audit-and-caption-safezone.md`: audit the configured image provider/model/tier from config + provider registry + cache metadata, run at most one neutral capability test, keep UI/invoice mockups deterministic, and add tested caption layout safe-zone bounds before re-rendering. If an approved Proof Short feels too visually flat and the user asks why no AI images were used, follow `references/proof-short-ai-visual-upgrade.md`: use AI images as a controlled text-free atmosphere/background/keyframe layer while keeping invoices, emails, payment routes, labels, facts, and captions deterministic renderer-owned. For the concrete rendering/QA pattern — small 2–3 keyframe pass, contact-sheet inspection, discard pseudo-text frames, blur/darken/subordinate AI backgrounds, and report used/discarded keyframes — see `references/proof-short-ai-background-rendering-qa.md`. For the follow-up A/B test where the user asks whether pure KI images can match or beat hybrid mockups, see `references/clean-ai-cut-vs-hybrid-mechanism.md`: compare clean image-only premium feel against mechanism clarity, keep word-aligned subtitles, and consider `90% clean AI images + 10% minimal deterministic mechanism` as the likely next style.

Use this skill when building or operating systems that generate short-form social videos, especially faceless or semi-automated pipelines for YouTube Shorts, TikTok, Instagram Reels, Facebook Reels, Pinterest video pins, X video, or LinkedIn video.

## Core principle

Treat the system as a **Shorts Growth Engine** / **semi-automatic Retention Studio**, not merely a renderer. A working video generator can still fail if it produces generic, low-retention, AI-slop content. Optimize for audience identity, hook quality, retention mechanics, visual mechanism reveals, platform fit, and analytics feedback. For the user's strongest strategic direction, see `references/retention-studio-strategy.md`.

For this user's AutoShorts workflows, approval previews should be German for concept comprehension, while final social-media videos should remain English unless explicitly changed. Treat preview legibility as a quality gate: readable font sizes, pixel-width-aware line wrapping, no clipped words, and no overcrowded cards.

For the user's TrueTraceShorts / AutoShortsBot strategy, do **not** default to a narrow AI/prompt-tips channel. The current strategic direction is broader: explain hidden digital everyday mechanisms — AI, work, attention, decisions, scams, productivity, workflows, social search — and end each video with one small system rule that fixes the outcome. Use the frame `Trace the hidden system. Fix the outcome.` AI should remain an important pillar, but normally only about 30–40% of the topic mix, not the whole product. See `references/truetrace-strategic-neuausrichtung.md`.

When the user asks to start implementation work on this strategy, especially “Sprint 1: Strategic Spine Refactor”, follow `references/truetrace-strategic-spine-refactor-v2.md`: implement a side-effect-free V2 spine in parallel to existing V1 models, with mandatory strategic fields, hard quality gates, anti-AI-slop blockers, hash/version-bound ReviewPackageV2, and tests before integration with renderers or platform workflows.

When the user asks for “Sprint 1.5” or to make the V2 spine operational without production, follow `references/truetrace-v2-operational-bridge.md`: first secure/commit the Sprint-1 baseline, then add only minimal side-effect-free bridges (`to_candidate_v2`, `workflow_v2`, `demo_review_batch_v2`), deterministic ReviewPackageV2 JSON, strict approval parsing, calibrated non-generous scoring, anti-example/human-texture gates, minimal manual claim/disclosure stubs, LinkedIn manual metadata, and a Remotion-as-later-spike note. Keep it capped at 3 demo candidates and avoid rendering, platform APIs, dashboards, auto-posting, or 30-day batches.

## Retention-Studio / Mechanism-Reveal Pipeline

For quality-first automated Shorts, especially Hidden Money & AI Systems concepts, prefer the pipeline documented in `references/retention-studio-pipeline-pattern.md`:

```text
strategy → scored ideas → mechanism explainer → shot plan → keyframe/I2V prompt plan → seeded clip jobs → clip review → deterministic final renderer
```

When implementing a new repo or core pipeline, first scaffold the approval-first typed artifact chain in `references/approval-first-retention-studio-core.md`:

```text
ContentPillar → ContentBrief → ScriptDraft → VideoCandidate → TestBatch → ReviewBatch → Telegram ReviewDelivery → ShotPlan
```

Hard rule for this class: AI-video clips provide photorealistic texture and motion only. Captions, numbers, labels, arrows, UI text, price/risk/margin layers, and factual claims are renderer-owned. Final content should keep `static_card_limit = 0`, use visual changes every 1–2 seconds, and reject technically successful clips that do not serve the retention beat.

Before video generation, build an inspectable content-to-review spine: `ContentBrief → ScriptDraft → CandidateDraft → VideoCandidate → TestBatch → ReviewBatch → Telegram ReviewDelivery`. Keep it deterministic, side-effect free, and human-approval-first so hooks, retention beats, visual concepts, policy notes, and review copy can be optimized before spending GPU/API time. See `references/content-to-review-pipeline.md` for the implementation pattern and guardrails.

Hard rule for this class: AI-video clips provide photorealistic texture and motion only. Captions, numbers, labels, arrows, UI text, price/risk/margin layers, and factual claims are renderer-owned. Final content should keep `static_card_limit = 0`, use visual changes every 1–2 seconds, and reject technically successful clips that do not serve the retention beat.

## Recommended workflow

1. **Define channel position**
   - Niche(s): e.g. life optimization, AI life systems, Christian faith/FaithTok.
   - Target audience and emotional problem.
   - Language and tone.
   - Whether the brand is faceless, AI-persona-led, or creator-led.
   - No-go topics and theological/ethical boundaries if faith-related.

2. **Generate test ideas before code-heavy automation**
   - Create 20–30 candidate ideas across 2–4 content pillars.
   - For each: hook, script kernel, visual concept, caption, CTA, risk/quality score.
   - Select a small first batch (e.g. 3 per pillar) for real testing.
   - Before renderers or external AI APIs, add a deterministic content-development core: `ContentPillar → ContentBrief → ScriptDraft → CandidateDraft → VideoCandidate`. See `references/content-development-core.md`.

3. **Use hook-first, retention-led scripting**
   - First 1–2 seconds must contain a clear tension, identity statement, pain point, contrarian line, or immediate self-recognition.
   - Prefer one idea per video over generic “4 tips” unless the list format is the explicit series.
   - Avoid generic advice viewers have already heard unless framed with a new angle, concrete payoff, or strong story.
   - For TrueTraceShorts, prefer the structure `visible fail → identification → mechanism → fix → before/after → memorable takeaway` over generic AI-tip narration. Every video must answer: what goes wrong, why it happens, what rule fixes it, what sentence sticks, why viewers save/share it, and why they follow the series.
   - For unvalidated first pilots, apply the `Pretty Empty Visual Blocker`: if the first frame is beautiful but does not show a concrete viewer pain without voiceover, block the concept and switch to a Proof Short. Do not keep polishing abstract AI visuals, glass metaphors, or generic laptop B-roll before validating the real problem. See `references/proof-short-real-problem-reset.md`.
   - After a Proof Short concept is approved for usefulness/clarity, do not interpret `ProofShortMode` as a permanent ban on AI images. If the user wants the video “aufgepeppt”, add a controlled AI visual-upgrade layer: 2–3 text-free premium backgrounds/keyframes, while all invoice/email/UI/payment-route text, labels, facts, captions, claims, and red-flag overlays remain deterministic renderer-owned. See `references/proof-short-ai-visual-upgrade.md`.
   - Reward hooks with direct address, specificity, open loops, tension, and a visible payoff; reject slow intros such as “In this video...”.
   - See `references/retention-led-shorts.md` for scoring signals, penalties, and voiceover finalization rules.

4. **Quality gate before rendering**
   Score drafts on:
   - hook strength
   - novelty
   - emotional pull
   - clarity
   - retention risk
   - comment/share potential
   - AI-slop risk
   - platform/policy risk
   - first-frame clarity
   - mechanism value
   - practical payoff
   - save/share/follow reason
   - trust/human texture
   - series fit and saturation defense
   Render only drafts above the chosen threshold, e.g. 8/10.
   For TrueTraceShorts, use the 100-point scoring and hard blockers in `references/truetrace-strategic-neuausrichtung.md`: block generic AI hooks, pure text first frames, unsourced claims, missing before/after, missing human texture, unclear AI disclosure, and candidates too similar to recent videos.

5. **Visual strategy**
   - Avoid obvious AI artifacts, fake UI text, illegible generated lettering, generic charts, and soulless stock visuals.
   - Prefer high-contrast kinetic captions, visible hook text in first seconds, relatable B-roll, screen recordings for AI/tutorial content, phone/screen close-ups, before/after transformations, cards, and timer visuals.
   - Use pattern interrupts every 2–3 seconds for retention.
   - Before rendering, generate a shot plan from the finalized voiceover: first-frame hook, pattern interrupt, core explanation, screen/card visual, CTA, caption beats, and asset type.
   - Before writing a renderer, convert shot plans into deterministic render manifests: machine-readable timeline items, asset placeholders, caption tracks, style constraints, and approval constraints. See `references/render-manifest-pipeline.md`.
   - Treat this as a deterministic intermediate artifact, not optional prose. See `references/retention-render-planning.md` for the five-scene shot-plan pattern and renderer-facing fields.
   - For the first video output, build a manifest-driven preview renderer before any AI-video or polished asset pipeline: first create a side-effect-free local preview plan, then write deterministic PNG scene cards, then build a side-effect-free FFmpeg concat plan, and only then call FFmpeg from an explicit renderer boundary. The boundary should report side effects such as `write_png`, `write_concat`, `call_ffmpeg`, and `write_mp4`; keep generated PNG/MP4 artifacts out of Git. See `references/manifest-preview-renderer.md`.
   - When the user rejects static/slideshow output, add an `asset_plan.v2` layer that maps each scene to motion-led local asset modes such as `cinematic_ai_video`, `screen_recording_simulation`, `mechanism_animation`, or `kinetic_text_overlay` with no baked text. If the user requires a free workflow, do not depend on paid video-credit tools; use local procedural motion and optional free NVIDIA LLM text refinement. See `references/ai-video-asset-planning.md`.
   - For hybrid workflows, add an imported-clip assembly layer: provider handoff prompts create short manual AI-video clips, humans drop them into deterministic `data/imported_ai_clips/<slug>/scene_XX.mp4` paths, and the final renderer combines imported clips with local mechanism animations/captions. See `references/imported-ai-clip-assembly.md`.
   - For local Wan2.2 quality workflows, prefer keyframe/image-to-video over raw text-to-video: generate/select a clean keyframe, run native Wan2.2 I2V variants, review clips bluntly for subject clarity/motion/artifacts, then add all labels/numbers/captions via deterministic renderer. See `references/wan-i2v-retention-studio.md`.
   - For final renders, Wan must carry the visual scene, not merely provide a blurred/looped background underneath preview cards. Use full-bleed, scene-specific Wan clips, minimal renderer-owned overlays, and a final overlay policy that blocks preview frames, large UI cards/textboxes, debug bars, and overlay overload. If architecture is rejected, create a short visual proof first; see `references/visual-first-final-render-repair.md`.
   - If a visual proof still looks like blind text-to-video or random abstract AI output, stop T2V and move to a keyframe-first workflow: generate/approve 1–2 text-free start/end/style keyframes for the scene, then attempt only a short Wan I2V/first-last-frame proof. See `references/keyframe-first-final-visuals.md`.
   - When using NVIDIA Build/API Catalog for keyframes, prefer hosted `ai.api.nvidia.com` calls before considering self-hosted NIM deployment; implement a configurable model fallback chain, store the key as a runtime secret, and inspect/clean logos, emblems, license plates, and fake text before I2V. See `references/nvidia-keyframe-generation.md`.

6. **Social-media draft and content-preview approval packages before TTS/rendering polish**
   - Before TTS, platform APIs, or polished video generation, build a typed `SocialMediaDraft` from the approved candidate plus render manifest/preview.
   - Include platform targets, title variants, caption, hashtags, CTA, hook, duration, quality/risk summary, and preview reference.
   - Render this into a Telegram-safe approval message and wrap it in a side-effect-free delivery plan with `requires_human_approval=True` and `side_effects=()`.
   - After a local MP4 timing preview exists, combine the MP4 path plus social draft review into a side-effect-free content preview approval package. This package should carry `approval_language=de`, `final_video_language=en`, explicit approval commands, no external calls, and no side effects.
   - Add local demo CLIs that print metadata first, then review text; draft-only CLIs must not write files, call renderers, call Telegram, or access credentials. MP4 preview CLIs may write local artifacts and call FFmpeg only at explicit renderer boundaries that report side effects.
   - See `references/social-draft-approval-package.md` and `references/content-automation-patterns.md` for concrete artifact sequence, user-specific language rules, and external workflow patterns.

7. **Human approval loop before posting**
   - Send preview to the user through the requested channel, usually Telegram.
   - Include: video or preview reference, title, caption, hashtags, platform recommendation, duration, quality/risk score.
   - When sending multiple preview videos, verify and label distinct artifacts before delivery: candidate ID/title, absolute path, duration, and preferably checksum/hash. If several previews are visually similar timing cards, do not spam them as separate unlabeled media; send a concise indexed list first or bundle with clear labels so the user can tell them apart.
   - Wait for explicit approval such as `Freigabe alle`, `Freigabe YouTube`, `Freigabe TikTok`, `Ablehnen`, or `Ändern: ...`.
   - Do not publish automatically unless the user has explicitly authorized that workflow.

8. **TTS / voice layer after draft approval**
   - Treat TTS as a later layer, not the starting point for a first post draft.
   - Decide voice, final voiceover script, words-per-second, scene timing, caption sync, audio format, provider, and separate voice approval only after the social draft package is reviewable.
   - This avoids spending TTS/rendering effort on unapproved hooks, captions, or platform positioning.
  - For final-near previews, keep one copy source of truth: final voiceover → script draft/retention beats → shot plan → top card text → scene captions → subtitle track → TTS audio. Do not mix old approval-card text with new spoken/subtitle text.
  - If the user says the result is too abstract/abgehoben, rewrite around a concrete beginner-friendly everyday failure example before polishing visuals. Prefer “one weird email arrives” / missing field / unclear request / wrong confident action over jargon such as `exception path`, `input boundary`, or `output standard`. See `references/beginner-friendly-audio-caption-alignment.md`.
  - If the user says subtitles are irritating or not simultaneous with voiceover, treat this as a blocking quality issue: use forced alignment or provider word-boundary events before sending another final-near clip. For EdgeTTS previews, request `boundary='WordBoundary'` and render active-word highlights from those offsets; do not merely distribute words evenly over sentence SRT durations. For this user's AutoShorts/TrueTraceShorts default, do **not** show one word alone and do **not** slide a changing word-window every word. Use static phrase segments: keep 3–7 words fixed on screen while only the currently spoken word highlights/pulses left-to-right; replace the full segment only at a sentence/phrase boundary. See `references/static-active-word-captions-and-final-pilot-render.md`.
  - If the user says the ending is confusing, rushed, or does not offer a real solution, treat this as a content-blocking issue, not a minor copy tweak. Rewrite the final third so non-technical viewers are explicitly walked through the concrete action: what to close/avoid, what to open/check instead, how they know it worked, and the memorable rule/fazit. Avoid vague imperatives like “open the service yourself” unless immediately unpacked with a concrete example such as “close the invite; open the calendar/work app from the normal icon or bookmark; if the meeting is real, it will still be there.”
  - If deterministic layouts explain the mechanism but look like wireframes/PowerPoint, do not promote them to final style.
  - If deterministic layouts explain the mechanism but look like wireframes/PowerPoint, do not promote them to final style. Treat them as composition blueprints and run a small, tightly prompted premium AI styleframe pass instead: AI supplies glassmorphism/product-film quality and atmosphere; the renderer still owns labels, arrows, captions, facts, and final assembly. See `references/premium-ai-styleframe-direction.md`.
  - If premium AI styleframes improve quality but still feel like abstract SaaS symbolism, do not continue iterating abstract funnels/rings. Move to real-life anchored work scenes: desk/laptop, empty meeting room/glass board, or project table/work evidence, with only subtle glass/holographic mechanism overlays. See `references/real-life-premium-styleframes.md`.
  - If real-life styleframe directions are accepted but the user has not approved Wan/I2V yet, insert a pre-release animatic comparison step rather than jumping to endframes or video generation. Create small per-direction AI keyframe sets, deterministic push-ins/crossfades, existing voiceover, static active-word captions, contact sheets, and QA frame sheets; report Telegram delivery metadata. See `references/prerelease-animatic-preview.md`.
If the user rejects the added visual explanation overlays as making the result look like a technical explainer board, treat this as a hard style failure. For the clean pilot, use only AI images, voiceover, and clean subtitles; block circles, arrows, labels, boxes, connector lines, decision-target markers, debug/diagram elements, and caption boxes/bars. See `references/clean-image-cut-no-overlay-pilot.md`. If the user then asks whether pure KI-Bilder can achieve the same or better effect, run an A/B proof against the hybrid version and assess premium look vs mechanism clarity; the likely final style may be `90% clean AI images + 10% minimal renderer-owned mechanism`. See `references/clean-ai-cut-vs-hybrid-mechanism.md`.
  - For mechanism-reveal final renders, use the hybrid pattern in `references/final-motion-hybrid-rendering.md`: ChatGPT Image/Codex or similar tools create text-free scene backgrounds only; deterministic renderer owns cards, labels, arrows, subtitles, and FFmpeg assembly. Use compact phrase-boundary subtitle cues before 1080 export.

9. **Publish and measure**
   Track at minimum:
   - platform, video id/url, niche, format, hook, duration
   - views at 2h/24h/7d
   - likes, comments, shares, saves, follows
   - retention metrics if available
   Use results to generate the next batch.

## Platform duration/monetization notes

See `references/preview-media-delivery-guardrails.md` for avoiding duplicate-looking/unlabeled preview-video spam in Telegram review workflows.

See `references/truetrace-strategic-spine-refactor-v2.md` for implementing the new TrueTraceShorts strategy in code: V2 strategic models, hard gates, anti-AI-slop blockers, SeriesRegistry, 100-point scoring, hash-bound ReviewPackageV2, and deterministic five-candidate examples without rendering or platform side effects. See `references/truetrace-v2-operational-bridge.md` for the next implementation step: secure the Sprint-1 commit, add minimal side-effect-free bridge/workflow/CLI modules, deterministic ReviewPackageV2 JSON, strict approval parsing, calibrated scoring, anti-example/human-texture gates, manual claim/disclosure stubs, LinkedIn manual metadata, and Remotion-as-later-spike documentation without production expansion.

See `references/audio-caption-preview-pipeline.md` for the approval-first EdgeTTS + ASS subtitles + FFmpeg review-MP4 pipeline, including actual-audio-duration probing and the explicit `preserve_video` vs `trim_to_audio` duration-mode guardrail. See `references/pilot-preview-render-v2.md` for the stricter first-pilot preview pattern: preview-only approval state, EdgeTTS sentence SRT to preview word cues when forced alignment is unavailable, deterministic card/diagram animatic rendering, SHA256/duration verification, and Telegram media delivery while Wan/AI-image/platform calls remain blocked. See `references/static-active-word-captions-and-final-pilot-render.md` for the corrected Hormozi-style caption behaviour and the one-render final pilot review-package checklist. See `references/word-boundary-caption-sync-and-solution-gate.md` for the stronger EdgeTTS `WordBoundary` timing pattern and the explicit solution/fazit gate for Proof Shorts.

See `references/final-motion-hybrid-rendering.md` for the final-near hybrid renderer pattern: ChatGPT Image/Codex or other AI tools provide text-free background/keyframe texture while deterministic renderer overlays own text, arrows, labels, captions, and final assembly. For quick prototypes, prefer ChatGPT Image/Codex backgrounds before local Qwen/ComfyUI unless privacy/cost/local-only constraints dominate. After a 1080 export, create a side-effect-free final approval package with media path, SHA256, platform metadata, social copy, quality notes, and approval commands before any delivery or platform step.

See `references/visual-first-final-render-repair.md` for the repaired final-render architecture after a rejected pilot: mark rejected renders as not-postable, avoid preview-board overlays, enforce `FinalOverlayPolicy`, validate ComfyUI/Wan output histories robustly, and use `APPROVED_FOR_VISUAL_PROOF` for one short visual proof before any second full final.

See `references/hybrid-scene-backgrounds-codex.md` for the concrete ChatGPT Image/Codex scene-background workflow: side-effect-free `SceneBackgroundPlan`, per-scene text-free backgrounds, renderer-owned overlays, and visual QA before review delivery. Prefer this over local Qwen/ComfyUI when the user allows Codex image generation and local GPU should be reserved for video/model work.

See `references/monetization-and-approval-notes.md` for current working notes captured from official YouTube/TikTok docs and the recommended approval/posting setup. See `references/retention-led-shorts.md` for retention scoring signals, no-faith/adjacent-pillar handling, and voiceover finalization rules. See `references/render-manifest-pipeline.md` for the script → shot plan → render manifest → renderer sequence that prevents generic AI slideshow output. See `references/manifest-preview-renderer.md` for the first deterministic Pillow/FFmpeg preview-renderer pattern. See `references/local-preview-frame-writer.md` for the staged `LocalPreviewPlan → PNG scene cards → FFmpeg concat plan` boundary before MP4 rendering. See `references/social-draft-approval-package.md` for the typed first-post approval package to build before TTS or platform APIs. See `references/content-automation-patterns.md` for public workflow patterns, queue/status/cost tracking, versioned approval, synthetic-content disclosure, originality gates, and the user's German-preview/English-final rule. See `references/ai-video-asset-planning.md` for motion-led final-render asset planning with Kling/Hailuo/Runway-style clips and screen simulations. See `references/imported-ai-clip-assembly.md` for hybrid assembly where manually generated provider clips are imported into a deterministic local renderer. See `references/nvidia-keyframe-generation.md` for NVIDIA-hosted keyframe generation, model fallback, secret handling, and pre-I2V logo/plate cleanup. Re-check official docs before making business-critical decisions because platform programs change often.

## Project/repo hygiene for automated video bots

- Keep source code in Git; keep generated videos, assets, `.env`, OAuth tokens, API keys, and downloaded secrets out of Git.
- Use `.gitignore` aggressively for outputs, media caches, local credentials, and temp files.
- Store platform credentials as runtime secrets; never print raw tokens.
- Build the repo as modular components: idea generation, scripting, rendering, review, publishing, analytics.
- For approval-first Retention Studio implementations, use a typed side-effect-free core before real I/O: `ContentBrief`, `ScriptDraft`, `VideoCandidate`, review batches, Telegram delivery plans, then shot plans. See `references/approval-first-retention-studio-core.md`.

## Sensitive-content positioning

When AI/productivity automation is the primary brand, be cautious about mixing in religious/FaithTok, health, finance, or other high-trust themes. If the user flags the combination as sensitive, pause that pillar rather than forcing it into the same testbatch. Replace it with a safer adjacent pillar (for example `attention_design`) and document the paused pillar in config so it can be revisited only with explicit approval and a separate brand strategy.

## Pitfalls

- Do not send several generated preview videos as unlabeled media attachments just because they are distinct files. Telegram/mobile previews can make timing-card MP4s look identical. Verify uniqueness (path + title + hash/duration) and provide labels or an indexed summary; if the user complains about duplicate-looking media, stop resending, verify artifacts, and continue the pipeline.
- Do not let final-near preview layers drift apart: if the top field, voiceover, and subtitles do not say the same thing, rebuild the render plan from one final script source before sending another clip.
- Do not make broad-audience AI-system shorts sound like architecture lectures. For early-AI users, convert abstract workflow concepts into concrete everyday failures first, then reveal the principle.
- Do not over-optimize renderer quality before testing whether the content format earns retention.
- Do not keep iterating a polished pilot when the user identifies the core failure as “pretty but semantically weak.” Archive it as a learning case, preserve what worked, and restart with a Proof Short whose first second shows a real visible fail and an immediately useful rule.
- Do not overcorrect from “validate with Proof Shorts” into “never use AI images.” Once the real problem/rule is approved, AI images can legitimately improve perceived quality as text-free atmosphere, backgrounds, keyframes, or thumbnails. Keep factual UI/document/payment layers deterministic; use AI for polish, not truth.
- Do not let German approval previews become unreadable technical cards: use pixel-width-aware wrapping, readable fonts, limited line counts, visual checks for clipped/overcrowded text, and hard mobile safe-zone tests for captions/highlights before delivery.
- Do not confuse approval language with final audience language. For this user, approval previews are German by default; final social videos remain English unless explicitly changed.
- Do not copy public automation workflows wholesale: keep their queue/status/cost tracking and template structure, but remove blind auto-publishing until a human approval/version lock exists.
- Do not mass-generate repetitive shorts without originality/inauthentic-content gates; this can harm monetization/account health and create AI slop.
- Do not jump directly from a script idea to ComfyUI/Wan/Qwen/Image/video generation. First build and inspect the content-to-review spine so weak hooks, generic scripts, policy issues, and static visual concepts are killed before render time.
- Do not assume local Qwen/ComfyUI is the best first image step for every final-near short. If the user permits ChatGPT Image/Codex, use it for text-free scene backgrounds/keyframes when the deterministic renderer owns labels/captions and local GPU should be saved for video/model work. When provider quality matters, verify the actual `image_gen.provider`/model from config and the image cache filenames/metadata rather than guessing; for premium styleframes prefer the highest available reasonable GPT Image tier, but keep fake invoice/email/UI/payment-route mockups deterministic.
- Do not create a parallel candidate path for content experiments; convert content artifacts into the existing candidate factory input so IDs, hashtags, duration classes, quality gates, and pillar/platform validation stay centralized.
- Do not use `x or default` for optional content/script overrides in factories; explicit blank strings and zero durations must pass through to validation so tests can catch them.
- Do not assume TikTok monetization rules match YouTube: TikTok Creator Rewards emphasizes 1min+ eligible videos, while shorter videos may still be better for growth.
- Do not treat a keyframe animatic as a successful Wan/I2V proof. If ComfyUI/Wan I2V fails or history contains no valid video output, label any fallback MP4 as `not_wan` / composition-review-only and block full-final progression.
- Do not treat deterministic layout proofs as the final premium visual style when the user asked for a high-end social-video look. Layouts are for mechanism composition; after approval, use a tightly scoped premium AI styleframe pass with strict negative prompts and verified delivery before endframes/Wan.
- Do not mistake premium abstract glassmorphism for an approved final direction if the user wants a credible everyday work scene. When the user says the motif is still too abstract, switch to real-life work-scene styleframes with laptop/tablet/meeting-room/project-table anchors; keep motion graphics subtle and renderer-owned.
- If the user rejects the production method itself, do not keep iterating content visuals. Reject/audit the proof, run a technical I2V sanity test with a trivial non-content image, and only after it passes generate a small set of styleframes for direction review; see `references/visual-production-reset-i2v-first.md`.
- Do not keep trying blind text-to-video after the user rejects a proof as abstract, dark, generic, or semantically ungrounded. Move to keyframe-first planning, review the keyframes, then run at most one short I2V/first-last-frame proof.
- Do not publish religious or health-adjacent content with overconfident claims; preserve humility, nuance, and platform safety.
- Do not rely on platform payout as the only monetization path; plan indirect monetization such as newsletter, templates, affiliates, digital products, or services.

To view linked files, call skill_view(name, file_path) where file_path is e.g. 'references/api.md' or 'assets/config.yaml'


# Clean AI Cut vs Hybrid Mechanism — session learning

Use this when comparing a pure premium AI-image sequence against a proof short with deterministic mechanism/UI overlays.

## Session-derived pattern

For a scam/cybersecurity proof short, a clean image sequence can look significantly more premium and native to TikTok/Reels, but it often weakens immediate mechanism clarity.

Observed comparison:

```text
Clean AI Cut = premium mood, calmer, less explainer-board
Hybrid = clearer mechanism, more immediately useful
Best likely final direction = mostly clean images + one minimal deterministic mechanism moment
```

Recommended framing:

```text
90% Clean AI Images
10% precise renderer-owned mechanism
```

Examples of acceptable minimal mechanism moments:

- one brief `suspicious link/domain` reveal
- one brief `close invite -> open trusted app/bookmark` action moment
- one simple before/after state, not a full checklist board

Avoid returning to:

- checklist-heavy UI cards
- boxed explainer overlays
- arrows/circles/diagram markers
- repeated labels and decision-target graphics

## Viewer explanation rule

When the viewer is not technical, do not use shorthand such as `open the service yourself` without explanation. Spell out the exact action:

```text
Close the invite.
Open your calendar or work app from the normal icon/bookmark.
If the meeting is real, it will still be there.
Trust the path you chose, not the button that chose you.
```

This converts a security maxim into a concrete next action.

## Caption synchronization rule

For final-near shorts where the user complains that subtitles do not match voiceover exactly, use actual word-boundary/forced-alignment timing rather than distributing words evenly across sentence SRT blocks. For EdgeTTS previews, request `boundary='WordBoundary'`, store word cues, then render static phrase segments where only the active spoken word highlights.

Keep the established caption policy:

- static phrase segment, usually 3–7 words
- active spoken word highlighted in yellow
- inactive words white
- no subtitle box/bar
- bottom mobile-safe position

## A/B decision criteria

After rendering both versions, explicitly answer:

1. Which version looks more premium?
2. Which version explains the mechanism faster without audio?
3. Does the clean cut rely too much on VO/subtitles?
4. Would one minimal deterministic mechanism moment recover clarity without killing the premium look?
5. Is Wan/I2V worth testing, or is image-sequence motion enough for this stage?

Default recommendation: do not jump to full Wan/I2V after this test. If clean images work visually, test exactly one short motion micro-proof only after approval.


# Word-boundary caption sync + explicit solution gate

Session learning from a TrueTraceShorts Proof Short review where the user found captions irritating because they were not exactly simultaneous with the voiceover, and also noted that the video lacked a real solution/fazit.

## Trigger

Use this pattern when producing final-near Shorts with voiceover + subtitles, especially Proof Shorts / Digital Red Flags / mechanism reveal videos.

User-visible failure signals:

- subtitles lag or lead the voiceover;
- captions are approximated by sentence duration and feel “off” while listening/reading;
- the video explains a mechanism but the viewer does not leave with a concrete action;
- the ending feels like an observation rather than a solution.

## Caption timing rule

Do not rely on evenly distributing words across sentence SRT durations when a better timing source is available. For EdgeTTS, request word-boundary metadata directly:

```python
communicate = edge_tts.Communicate(
    script,
    voice,
    rate='+0%',
    boundary='WordBoundary',
)

async for chunk in communicate.stream():
    if chunk['type'] == 'audio':
        audio_bytes.extend(chunk['data'])
    elif chunk['type'] == 'WordBoundary':
        start = chunk['offset'] / 10_000_000
        duration = chunk['duration'] / 10_000_000
        word = chunk['text']
```

Build `WordCue(start, end, word, sentence)` from those offsets, then feed the existing static active-word caption renderer:

```text
EdgeTTS WordBoundary cues
→ 3–7 word static phrase segments
→ active spoken word highlighted/pulsed
→ phrase changes only at phrase/sentence boundary
```

This gives the Hormozi/TikTok-style feel the user prefers: several words remain stable, while the currently spoken word lights up exactly when spoken.

## Caption QA gates

Before delivery, verify and report:

- `caption_sync_source = edge_tts_word_boundary_offsets` or another forced-alignment source;
- `static_phrase_active_word = true`;
- no default one-word-only captions;
- no sliding word window where all visible words change each word;
- no subtitle box/bar unless explicitly requested;
- mobile-safe bottom placement;
- contact sheet inspected for clipping/legibility.

If WordBoundary / forced alignment is unavailable, label the render as approximation-only and do not present it as final-near.

## Explicit solution/fazit gate

Every Proof Short must answer the viewer’s post-watch question: “What do I do now?” Add a concrete end-state action, not just a clever line.

Good ending shape:

```text
Mechanism revealed → simple safe action → memorable rule
```

Examples:

- Calendar login trap: “Open the service yourself. Trust the app you opened, not the button that rushed you.”
- Invoice route trap: “Do not pay from the email. Verify route changes through a second channel.”

Review-package fields to include:

```json
{
  "usefulness_fix": "Concrete action the viewer should take",
  "takeaway": "Short memorable rule",
  "summary_fazit_present": true,
  "final_solution": "..."
}
```

## Pitfall

A video can be factually correct and still feel unsatisfying if it only diagnoses the trap. The final beat must solve the viewer’s immediate problem in one simple action.


from hermes_tools import terminal
import json, subprocess, os
paths=['/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b1/calendar-invite-login-trap-30s_b1.mp4','/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b2/calendar-invite-login-trap-30s_b2.mp4']
for p in paths:
    cmd=f"ffprobe -v error -show_entries format=duration,size:stream=codec_type,width,height,r_frame_rate -of json {p!r}"
    res=terminal(cmd, timeout=30)
    print('---', os.path.basename(p), '---')
    print(res['output'])


Output:
--- calendar-invite-login-trap-30s_b1.mp4 ---
{
    "programs": [

    ],
    "streams": [
        {
            "codec_type": "video",
            "width": 1080,
            "height": 1920,
            "r_frame_rate": "24/1"
        },
        {
            "codec_type": "audio",
            "r_frame_rate": "0/0"
        }
    ],
    "format": {
        "duration": "41.875000",
        "size": "12551970"
    }
}
--- calendar-invite-login-trap-30s_b2.mp4 ---
{
    "programs": [

    ],
    "streams": [
        {
            "codec_type": "video",
            "width": 1080,
            "height": 1920,
            "r_frame_rate": "24/1"
        },
        {
            "codec_type": "audio",
            "r_frame_rate": "0/0"
        }
    ],
    "format": {
        "duration": "41.875000",
        "size": "12650916"
    }
}


todo

Variant B1 rendern: AI-visible invite only + Voiceover + Subtitles

Variant B2 rendern: AI-visible invite + minimaler Fokus-Layer + Subtitles

A/B QA, Manifest, SHA256 und Lieferung mit Empfehlung


6 konkrete Visible-Invite-Cinematic KI-Keyframes erzeugen

Keyframes prüfen: sichtbare Einladung, kein lesbarer Text/Logo/QR/People


Erledigt, Sir. Zwei sauber gelabelte A/B-Previews — **nicht gepostet**, nur Review.

## A/B Preview

**B1 — Clean AI Visible Invite**
- Nur KI-Bilder + Voiceover + aktive Wort-Subtitles
- Premium/Cinematic wirkt ruhiger
- Mechanismus ist sichtbar, aber etwas stärker abhängig von Voiceover/Subtitles

MEDIA:/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b1/calendar-invite-login-trap-30s_b1.mp4

**B2 — Visible Invite + minimaler Fokus-Layer**
- Gleiche KI-Bilder + sehr dezente Fokus-Outlines
- Mechanismus ist schneller verständlich
- Minimal mehr „explainer“, aber noch nicht PowerPoint-Hölle. Ein kleiner Sieg der Zivilisation.

MEDIA:/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b2/calendar-invite-login-trap-30s_b2.mp4

## QA / Fakten

- Format: 1080×1920, 24 fps
- Länge: 41.875 s
- Audio: enthalten
- Caption-Sync: Word-boundary/aktive Wort-Hervorhebung verwendet
- Ende/Fazit: konkret ergänzt:
  - Close the invite
  - Open calendar/work app via normal icon/bookmark
  - If real, it will still be there
  - Rule: trust the path you chose, not the button that chose you
- Kein Wan/I2V
- Kein Platform-Posting
- Keine Menschen/Hände/Gesichter/QRs/Logos in den geprüften Keyframes

## Hashes

- B1 SHA256: `04d26c5eff645ec852755f072695693c3f862232ad9e49b891656054933ab16e`
- B2 SHA256: `63d8cdd8347f27b86ed4e03046160a1d19e10491ad747b0c1df72fa0897480b7`

## Meine Empfehlung

**B2 gewinnt für diesen Proof Short.**
B1 sieht cleaner aus, aber B2 erklärt den Scam schneller — und genau das war der Kernkritikpunkt: Der Zuschauer muss nach dem Video denken: *„Ah, ich weiss jetzt konkret, was ich tun soll.“*

Wenn du freigeben willst:

`APPROVED_PROOF_SHORT calendar-invite-login-trap-30s v1.3.0-b2-visible-invite-minimal-focus`

Oder Revision:

`REVISE_PROOF_SHORT calendar-invite-login-trap-30s "..."`


[M G] B2 bringt keinen mehrwert mit den linien im bild… versuche die KI bilder mit mehr details zu füllen (sichtbare outlookeinladung mit text usw). Das Image-modell ist hier ziemlich zuverlässig; du musst nur den prompt sehr detailiert formulieren.


Neue B3-KI-Keyframes mit detaillierter sichtbarer Outlook-artiger Einladung/Text erzeugen

Keyframes auf Lesbarkeit, Details und Artefakte prüfen

B3 ohne Linien/Fokus-Overlay rendern, nur KI-Bilder + Voiceover + aktive Wort-Subtitles

B3 technisch prüfen, Hash/Manifest erstellen und liefern


Prompt: Premium vertical 9:16 cinematic social-video keyframe, realistic modern desk with laptop screen in sharp focus. The laptop shows a detailed Outlook-style calendar invitation email UI, but no Microsoft logo and no brand logo. Use clean readable English text on the invite only. Exact visible UI text: Title line: “Quarterly Review Meeting”; sender: “Alex Morgan”; time row: “Today, 10:00 AM”; location row: “Online meeting”; large blue button text: “Join meeting”; smaller link line below: “Sign in to continue”. Add attendee avatars, calendar icon, email header bars, sidebar folders, and realistic UI details. The visual problem must be instantly clear: a normal-looking meeting invite asks for login. No people, no hands, no faces, no QR codes, no watermarks. Premium navy/amber lighting, shallow depth of field, clean lower safe space for subtitles.

Prompt: Premium vertical 9:16 cinematic close-up of a smartphone on a desk, screen sharp and readable. The phone displays a detailed Outlook-style calendar invite notification/email, no logo or brand mark. Exact visible text: “Quarterly Review Meeting”; “Today 10:00 AM”; “Organizer: Alex Morgan”; “Join meeting”; “Sign in to continue”; “This meeting starts soon”. Include realistic message rows, attendee circles, a blue join button, small calendar header, and subtle warning red/amber glow around the sign-in area. No people, no hands, no faces, no QR codes, no watermark. High-end social video style, clean bottom safe zone for subtitles.

Prompt: Premium vertical 9:16 cybersecurity keyframe, laptop screen close-up showing an Outlook-style meeting invitation with many believable UI details, no logo. The invite should be readable and concrete. Exact text on screen: “Quarterly Review Meeting”; “Today, 10:00 AM”; “Join meeting”; “Sign in to continue”; “meeting-login.example-security.com”. Show a suspicious login prompt panel opening after the invite button, with fields labeled “Email” and “Password” and button “Sign in”. The login panel should look slightly suspicious but still professional. No people, no hands, no faces, no QR/barcodes, no watermarks. Cinematic dark desk lighting, premium, subtitles-safe lower area.


Prompt: Premium vertical 9:16 cinematic social-video keyframe, realistic modern desk with laptop screen in sharp focus. The laptop shows a detailed Outlook-style calendar invitation email UI, but no Microsoft logo and no brand logo. Use clean readable English text on the invite only. Exact visible UI text: Title line: “Quarterly Review Meeting”; sender: “Alex Morgan”; time row: “Today, 10:00 AM”; location row: “Online meeting”; large blue button text: “Join meeting”; smaller link line below: “Sign in to continue”. Add attendee avatars, calendar icon, email header bars, sidebar folders, and realistic UI details. The visual problem must be instantly clear: a normal-looking meeting invite asks for login. No people, no hands, no faces, no QR codes, no watermarks. Premium navy/amber lighting, shallow depth of field, clean lower safe space for subtitles.


Prompt: Premium vertical 9:16 cinematic close-up of a smartphone on a desk, screen sharp and readable. The phone displays a detailed Outlook-style calendar invite notification/email, no logo or brand mark. Exact visible text: “Quarterly Review Meeting”; “Today 10:00 AM”; “Organizer: Alex Morgan”; “Join meeting”; “Sign in to continue”; “This meeting starts soon”. Include realistic message rows, attendee circles, a blue join button, small calendar header, and subtle warning red/amber glow around the sign-in area. No people, no hands, no faces, no QR codes, no watermark. High-end social video style, clean bottom safe zone for subtitles.


Prompt: Premium vertical 9:16 cybersecurity keyframe, laptop screen close-up showing an Outlook-style meeting invitation with many believable UI details, no logo. The invite should be readable and concrete. Exact text on screen: “Quarterly Review Meeting”; “Today, 10:00 AM”; “Join meeting”; “Sign in to continue”; “meeting-login.example-security.com”. Show a suspicious login prompt panel opening after the invite button, with fields labeled “Email” and “Password” and button “Sign in”. The login panel should look slightly suspicious but still professional. No people, no hands, no faces, no QR/barcodes, no watermarks. Cinematic dark desk lighting, premium, subtitles-safe lower area.


Prompt: Premium vertical 9:16 cinematic keyframe, realistic laptop on desk, screen sharp. Show a detailed email/calendar invite UI like Outlook, no brand logo. This is the safe action beat: the suspicious email invite is minimized in the background and a clean calendar app window is open in front. Exact readable text in the calendar window: “Calendar”; “Quarterly Review Meeting”; “Today 10:00 AM”; “Online meeting”; “Open from calendar”. The suspicious invite in background can show “Sign in to continue” dimmed. Add realistic panes, event list, calendar grid, attendee dots. No people, no hands, no faces, no QR codes, no watermarks. Premium blue secure lighting, lower safe space for subtitles.

Prompt: Premium vertical 9:16 cybersecurity social-video keyframe. Detailed close-up of laptop and phone together on a modern desk. Laptop shows a browser/email invite UI, phone shows calendar app. Both screens have readable text, no logos. Exact visible text on laptop: “Quarterly Review Meeting”, “Join meeting”, “Sign in to continue”. Exact visible text on phone: “Calendar”, “Quarterly Review Meeting”, “Today 10:00 AM”. The contrast should explain the safe rule: do not trust the button; open your own calendar. Make it cinematic and realistic, with many small UI details but no extra gibberish text. No people, no hands, no faces, no QR/barcodes, no watermarks. Clean lower subtitle-safe area.

Prompt: Premium vertical 9:16 final resolution keyframe for a cybersecurity short. A calm modern desk with laptop screen showing a detailed clean calendar event page, no logo. Exact readable text: “Calendar”; “Quarterly Review Meeting”; “Today, 10:00 AM”; “Meeting verified”; “Open meeting from calendar”. In the corner/background, a dim email invite card says “Sign in to continue” but it is visually ignored. Add realistic UI details: sidebar, calendar grid, attendee circles, blue meeting card, subtle secure glow. No people, no hands, no faces, no QR codes, no watermarks. Premium cinematic look, bottom safe area for subtitles.


Prompt: Premium vertical 9:16 cinematic keyframe, realistic laptop on desk, screen sharp. Show a detailed email/calendar invite UI like Outlook, no brand logo. This is the safe action beat: the suspicious email invite is minimized in the background and a clean calendar app window is open in front. Exact readable text in the calendar window: “Calendar”; “Quarterly Review Meeting”; “Today 10:00 AM”; “Online meeting”; “Open from calendar”. The suspicious invite in background can show “Sign in to continue” dimmed. Add realistic panes, event list, calendar grid, attendee dots. No people, no hands, no faces, no QR codes, no watermarks. Premium blue secure lighting, lower safe space for subtitles.


Prompt: Premium vertical 9:16 cybersecurity social-video keyframe. Detailed close-up of laptop and phone together on a modern desk. Laptop shows a browser/email invite UI, phone shows calendar app. Both screens have readable text, no logos. Exact visible text on laptop: “Quarterly Review Meeting”, “Join meeting”, “Sign in to continue”. Exact visible text on phone: “Calendar”, “Quarterly Review Meeting”, “Today 10:00 AM”. The contrast should explain the safe rule: do not trust the button; open your own calendar. Make it cinematic and realistic, with many small UI details but no extra gibberish text. No people, no hands, no faces, no QR/barcodes, no watermarks. Clean lower subtitle-safe area.


Prompt: Premium vertical 9:16 final resolution keyframe for a cybersecurity short. A calm modern desk with laptop screen showing a detailed clean calendar event page, no logo. Exact readable text: “Calendar”; “Quarterly Review Meeting”; “Today, 10:00 AM”; “Meeting verified”; “Open meeting from calendar”. In the corner/background, a dim email invite card says “Sign in to continue” but it is visually ignored. Add realistic UI details: sidebar, calendar grid, attendee circles, blue meeting card, subtle secure glow. No people, no hands, no faces, no QR codes, no watermarks. Premium cinematic look, bottom safe area for subtitles.


from pathlib import Path
import shutil, json, hashlib
from PIL import Image, ImageDraw, ImageFont
srcs=['/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_230948_055dd350.png','/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_231101_a6d41601.png','/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_231303_bdbc188f.png','/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_231408_c83f61fc.png','/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_231615_47b2fd03.png','/home/agent/.hermes/cache/images/openai_codex_gpt-image-2-high_20260525_231708_8f122fd9.png']
base=Path('/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1')
ai=base/'ai_keyframes_b3_text_detail'; ai.mkdir(parents=True, exist_ok=True)
items=[]
for i,s in enumerate(srcs,1):
    dst=ai/f'b3_text_detail_keyframe_{i:02d}_openai_codex_gpt-image-2-high.png'
    shutil.copy2(s,dst)
    im=Image.open(dst)
    items.append({'index':i,'path':str(dst),'sha256':hashlib.sha256(dst.read_bytes()).hexdigest(),'resolution':f'{im.width}x{im.height}'})
sheet=Image.new('RGB',(1080,1120),(12,16,24)); d=ImageDraw.Draw(sheet)
try: f=ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf',28)
except: f=None
for idx,item in enumerate(items):
    im=Image.open(item['path']).convert('RGB'); im.thumbnail((330,495))
    cell=Image.new('RGB',(360,560),(12,16,24)); cd=ImageDraw.Draw(cell)
    cell.paste(im,((360-im.width)//2,42)); cd.text((14,14),f"B3 KF {item['index']:02d}",font=f,fill=(247,202,76)); cd.text((14,525),item['resolution'],fill=(220,225,235))
    x=(idx%3)*360; y=(idx//3)*560
    sheet.paste(cell,(x,y)); d.rectangle((x,y,x+359,y+559),outline=(55,65,90),width=2)
contact=base/'b3_text_detail_keyframes_contact_sheet_v1.jpg'; sheet.save(contact,quality=92)
manifest={'generated_keyframes':items,'contact_sheet':str(contact),'purpose':'B3 no focus lines: detailed AI-generated Outlook-style visible invite/login/safe-calendar images with readable text.'}
(base/'b3_text_detail_keyframes_manifest_v1.json').write_text(json.dumps(manifest,indent=2),encoding='utf-8')
print(contact)


Question: QA the six B3 keyframes. Need detailed visible Outlook-style calendar invite/login/safe-calendar screens with readable text. Identify which frames are usable, weak, or problematic. Check for gibberish text, logos, QR, people/hands/faces, and whether the core scam mechanism is clearer without added focus lines.


Image loaded into your context — you can see it natively now. Use your built-in vision to answer the user.

Question: QA the six B3 keyframes. Need detailed visible Outlook-style calendar invite/login/safe-calendar screens with readable text. Identify which frames are usable, weak, or problematic. Check for gibberish text, logos, QR, people/hands/faces, and whether the core scam mechanism is clearer without added focus lines.


Explanation:
**Considering script modifications**

I need to focus on modifying the script for b3. Currently, the script renders both b1 and b2 when set to main, and I’m wondering if we could create the b3 script by programmatically changing KEYFRAMES and the render functionality. The b3 variant should choose between modes based on whether it's b1 or not. It looks like I'd need to manage output paths carefully so they don't overwrite each other. I might script these changes to streamline the process.
**Modifying output paths**

I'm considering creating a new version from the previous file and adjusting the output path to 'visible_invite_cinematic_ab_v1/b3_text_detail_v1'. However, the function seems to expect a specific OUT/ai_keyframes setup, and I need to set KEYFRAMES as absolute. I might use render_variant('b1', 'v1.4.0-b3-text-detail-ai-only') initially, but ideally, I want to call render_variant('b3') directly. There shouldn’t be any focus because it will only draw when variant == 'b2'. It's a bit messy, but it’s manageable.
**Fixing variant issues**

It looks like the current variant isn't matching b1, which is incorrect. I think it's important to patch the ternary function to handle b3 properly. I'll write out the necessary Python transformations and run them. I also wonder if lowering subtitles might help obscure the screen better since there's already a safe black veil at the bottom. After rendering, I definitely need to consider doing a contact sheet quality assurance check. I'll utilize the available tools for this.

from pathlib import Path
old=Path('/tmp/autoshorts_proof_short_sprint31/render_visible_invite_cinematic_ab_v1.py').read_text()
new=old
new=new.replace("OUT = BASE / 'visible_invite_cinematic_ab_v1'", "OUT = BASE / 'visible_invite_cinematic_ab_v1'")
old_key="KEYFRAMES = [OUT/'ai_keyframes'/f'visible_invite_keyframe_{i:02d}_openai_codex_gpt-image-2-high.png' for i in range(1,7)]"
new_key="KEYFRAMES = [OUT/'ai_keyframes_b3_text_detail'/f'b3_text_detail_keyframe_{i:02d}_openai_codex_gpt-image-2-high.png' for i in range(1,7)]"
new=new.replace(old_key,new_key)
new=new.replace("'mode':'visible_invite_cinematic_'+('ai_only' if variant=='b1' else 'minimal_focus_layer')", "'mode': ('visible_invite_cinematic_ai_only' if variant in ('b1','b3') else 'visible_invite_cinematic_minimal_focus_layer')")
new=new.replace("'NoOverlayPolicy':{'result':'pass' if variant=='b1' else 'modified_for_B2_minimal_focus','allowed':['subtitles_only'] if variant=='b1' else ['subtitles','subtle_focus_outline_no_text_no_labels_no_arrows']}", "'NoOverlayPolicy': {'result': 'pass' if variant in ('b1','b3') else 'modified_for_B2_minimal_focus', 'allowed': ['subtitles_only'] if variant in ('b1','b3') else ['subtitles','subtle_focus_outline_no_text_no_labels_no_arrows']}")
start=new.index('def main():')
new=new[:start]+"def main():\n    b3=render_variant('b3','v1.4.0-b3-text-detail-ai-only')\n    review={'candidate_id':CANDIDATE,'version':'v1.4.0-b3-text-detail-ai-only','status':'review_preview_only_not_posted','variant':b3,'assessment':'B3 removes B2 focus lines and relies on more detailed AI-generated Outlook-style invite/login/calendar screens with readable UI text.','approval_commands':[f'APPROVED_PROOF_SHORT {CANDIDATE} v1.4.0-b3-text-detail-ai-only', f'REVISE_PROOF_SHORT {CANDIDATE} \\\"...\\\"']}\n    (OUT/'review_package_b3_text_detail_v1.json').write_text(json.dumps(review,indent=2),encoding='utf-8')\n    print(json.dumps(review,indent=2))\nif __name__=='__main__': main()\n"
Path('/tmp/autoshorts_proof_short_sprint31/render_b3_text_detail_v1.py').write_text(new)
print('/tmp/autoshorts_proof_short_sprint31/render_b3_text_detail_v1.py')


terminal

Output:
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
  configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, rawvideo, from 'fd:':
  Duration: N/A, start: 0.000000, bitrate: 1194393 kb/s
  Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 1080x1920, 1194393 kb/s, 24 tbr, 24 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
[libx264 @ 0x64f9dd5343c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2 AVX512
[libx264 @ 0x64f9dd5343c0] profile High, level 4.0, 4:2:0, 8-bit
[libx264 @ 0x64f9dd5343c0] 264 - core 164 r3108 31e19f9 - H.264/MPEG-4 AVC codec - Copyleft 2003-2023 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=9 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to '/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3_silent.mp4':
  Metadata:
    encoder         : Lavf60.16.100
  Stream #0:0: Video: h264 (avc1 / 0x31637661), yuv420p(tv, progressive), 1080x1920, q=2-31, 24 fps, 12288 tbn
    Metadata:
      encoder         : Lavc60.31.102 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    0 fps=0.0 q=0.0 size=       0kB time=N/A bitrate=N/A speed=N/A
frame=    4 fps=0.7 q=23.0 size=       0kB time=00:00:00.08 bitrate=   4.6kbits/s speed=0.015x
frame=   10 fps=1.6 q=23.0 size=     256kB time=00:00:00.33 bitrate=6292.6kbits/s speed=0.0542x
frame=   15 fps=2.2 q=23.0 size=     256kB time=00:00:00.54 bitrate=3872.4kbits/s speed=0.0811x
frame=   20 fps=2.8 q=23.0 size=     256kB time=00:00:00.75 bitrate=2796.7kbits/s speed=0.104x
frame=   25 fps=3.3 q=23.0 size=     256kB time=00:00:00.95 bitrate=2188.7kbits/s speed=0.125x
frame=   30 fps=3.7 q=23.0 size=     256kB time=00:00:01.16 bitrate=1797.9kbits/s speed=0.142x
frame=   35 fps=4.0 q=23.0 size=     512kB time=00:00:01.37 bitrate=3050.7kbits/s speed=0.157x
frame=   41 fps=4.4 q=23.0 size=     512kB time=00:00:01.62 bitrate=2581.3kbits/s speed=0.174x
frame=   46 fps=4.6 q=23.0 size=     512kB time=00:00:01.83 bitrate=2288.0kbits/s speed=0.185x
frame=   51 fps=4.9 q=23.0 size=     768kB time=00:00:02.04 bitrate=3081.7kbits/s speed=0.196x
frame=   56 fps=5.1 q=23.0 size=     768kB time=00:00:02.25 bitrate=2796.4kbits/s speed=0.205x
frame=   61 fps=5.3 q=23.0 size=     768kB time=00:00:02.45 bitrate=2559.4kbits/s speed=0.213x
frame=   66 fps=5.4 q=23.0 size=     768kB time=00:00:02.66 bitrate=2359.4kbits/s speed=0.22x
frame=   71 fps=5.6 q=23.0 size=    1024kB time=00:00:02.87 bitrate=2917.9kbits/s speed=0.227x
frame=   76 fps=5.8 q=23.0 size=    1024kB time=00:00:03.08 bitrate=2720.8kbits/s speed=0.235x
frame=   80 fps=5.8 q=23.0 size=    1024kB time=00:00:03.25 bitrate=2581.2kbits/s speed=0.238x
frame=   84 fps=5.9 q=23.0 size=    1024kB time=00:00:03.41 bitrate=2455.3kbits/s speed=0.239x
frame=   88 fps=5.9 q=23.0 size=    1280kB time=00:00:03.58 bitrate=2926.4kbits/s speed=0.24x
frame=   92 fps=5.9 q=23.0 size=    1280kB time=00:00:03.75 bitrate=2796.3kbits/s speed=0.241x
frame=   96 fps=5.9 q=23.0 size=    1280kB time=00:00:03.91 bitrate=2677.3kbits/s speed=0.242x
frame=  101 fps=6.0 q=23.0 size=    1280kB time=00:00:04.12 bitrate=2542.1kbits/s speed=0.247x
frame=  107 fps=6.2 q=23.0 size=    1536kB time=00:00:04.37 bitrate=2876.2kbits/s speed=0.253x
frame=  112 fps=6.3 q=23.0 size=    1536kB time=00:00:04.58 bitrate=2745.4kbits/s speed=0.258x
frame=  118 fps=6.4 q=23.0 size=    1536kB time=00:00:04.83 bitrate=2603.4kbits/s speed=0.264x
frame=  124 fps=6.6 q=23.0 size=    1536kB time=00:00:05.08 bitrate=2475.4kbits/s speed=0.269x
frame=  129 fps=6.6 q=23.0 size=    1792kB time=00:00:05.29 bitrate=2774.3kbits/s speed=0.272x
frame=  135 fps=6.7 q=23.0 size=    1792kB time=00:00:05.54 bitrate=2649.1kbits/s speed=0.277x
frame=  141 fps=6.8 q=23.0 size=    2048kB time=00:00:05.79 bitrate=2896.9kbits/s speed=0.281x
frame=  146 fps=6.9 q=23.0 size=    2304kB time=00:00:06.00 bitrate=3145.8kbits/s speed=0.284x
frame=  151 fps=7.0 q=23.0 size=    2560kB time=00:00:06.20 bitrate=3378.0kbits/s speed=0.286x
frame=  156 fps=7.0 q=23.0 size=    2560kB time=00:00:06.41 bitrate=3268.3kbits/s speed=0.289x
frame=  163 fps=7.2 q=23.0 size=    2816kB time=00:00:06.66 bitrate=3460.4kbits/s speed=0.293x
frame=  168 fps=7.2 q=23.0 size=    2816kB time=00:00:06.91 bitrate=3335.3kbits/s speed=0.297x
frame=  173 fps=7.3 q=23.0 size=    2816kB time=00:00:07.12 bitrate=3237.8kbits/s speed=0.299x
frame=  178 fps=7.3 q=23.0 size=    3072kB time=00:00:07.33 bitrate=3431.8kbits/s speed=0.301x
frame=  183 fps=7.3 q=23.0 size=    3072kB time=00:00:07.54 bitrate=3337.0kbits/s speed=0.302x
frame=  188 fps=7.4 q=23.0 size=    3072kB time=00:00:07.75 bitrate=3247.3kbits/s speed=0.303x
frame=  193 fps=7.4 q=23.0 size=    3328kB time=00:00:07.95 bitrate=3425.8kbits/s speed=0.305x
frame=  198 fps=7.4 q=23.0 size=    3328kB time=00:00:08.16 bitrate=3338.4kbits/s speed=0.307x
frame=  203 fps=7.5 q=23.0 size=    3328kB time=00:00:08.37 bitrate=3255.3kbits/s speed=0.308x
frame=  208 fps=7.5 q=23.0 size=    3584kB time=00:00:08.58 bitrate=3420.6kbits/s speed=0.31x
frame=  213 fps=7.5 q=23.0 size=    3584kB time=00:00:08.79 bitrate=3339.6kbits/s speed=0.311x
frame=  218 fps=7.5 q=23.0 size=    3584kB time=00:00:09.00 bitrate=3262.3kbits/s speed=0.312x
frame=  223 fps=7.6 q=23.0 size=    3840kB time=00:00:09.20 bitrate=3416.2kbits/s speed=0.312x
frame=  228 fps=7.6 q=23.0 size=    3840kB time=00:00:09.41 bitrate=3340.6kbits/s speed=0.313x
frame=  234 fps=7.7 q=23.0 size=    3840kB time=00:00:09.62 bitrate=3268.3kbits/s speed=0.315x
frame=  238 fps=7.6 q=23.0 size=    4096kB time=00:00:09.83 bitrate=3412.4kbits/s speed=0.316x
frame=  243 fps=7.7 q=23.0 size=    4096kB time=00:00:10.04 bitrate=3341.6kbits/s speed=0.317x
frame=  248 fps=7.7 q=23.0 size=    4096kB time=00:00:10.25 bitrate=3273.6kbits/s speed=0.319x
frame=  253 fps=7.7 q=23.0 size=    4608kB time=00:00:10.45 bitrate=3609.5kbits/s speed=0.319x
frame=  257 fps=7.7 q=23.0 size=    4608kB time=00:00:10.62 bitrate=3552.9kbits/s speed=0.318x
frame=  261 fps=7.7 q=23.0 size=    4608kB time=00:00:10.79 bitrate=3498.0kbits/s speed=0.317x
frame=  264 fps=7.6 q=23.0 size=    4608kB time=00:00:10.91 bitrate=3457.9kbits/s speed=0.316x
frame=  268 fps=7.6 q=23.0 size=    4608kB time=00:00:11.08 bitrate=3405.9kbits/s speed=0.315x
frame=  273 fps=7.6 q=23.0 size=    4864kB time=00:00:11.29 bitrate=3528.8kbits/s speed=0.316x
frame=  279 fps=7.7 q=23.0 size=    4864kB time=00:00:11.54 bitrate=3452.4kbits/s speed=0.317x
frame=  285 fps=7.7 q=23.0 size=    4864kB time=00:00:11.79 bitrate=3379.2kbits/s speed=0.319x
frame=  291 fps=7.8 q=23.0 size=    5120kB time=00:00:12.00 bitrate=3495.3kbits/s speed=0.32x
frame=  295 fps=7.8 q=23.0 size=    5120kB time=00:00:12.20 bitrate=3435.6kbits/s speed=0.321x
frame=  301 fps=7.8 q=23.0 size=    5120kB time=00:00:12.45 bitrate=3366.7kbits/s speed=0.323x
frame=  306 fps=7.8 q=23.0 size=    5376kB time=00:00:12.66 bitrate=3476.9kbits/s speed=0.324x
frame=  312 fps=7.9 q=23.0 size=    5376kB time=00:00:12.91 bitrate=3409.6kbits/s speed=0.325x
frame=  318 fps=7.9 q=23.0 size=    5632kB time=00:00:13.16 bitrate=3504.1kbits/s speed=0.327x
frame=  325 fps=8.0 q=23.0 size=    5888kB time=00:00:13.41 bitrate=3595.1kbits/s speed=0.329x
frame=  330 fps=8.0 q=23.0 size=    5888kB time=00:00:13.66 bitrate=3529.4kbits/s speed=0.331x
frame=  336 fps=8.0 q=23.0 size=    6144kB time=00:00:13.91 bitrate=3616.7kbits/s speed=0.332x
frame=  341 fps=8.0 q=23.0 size=    6144kB time=00:00:14.12 bitrate=3563.3kbits/s speed=0.333x
frame=  347 fps=8.1 q=23.0 size=    6144kB time=00:00:14.37 bitrate=3501.4kbits/s speed=0.334x
frame=  352 fps=8.1 q=23.0 size=    6144kB time=00:00:14.58 bitrate=3451.3kbits/s speed=0.335x
frame=  358 fps=8.1 q=23.0 size=    6400kB time=00:00:14.83 bitrate=3534.6kbits/s speed=0.337x
frame=  364 fps=8.2 q=23.0 size=    6400kB time=00:00:15.08 bitrate=3476.0kbits/s speed=0.338x
frame=  369 fps=8.2 q=23.0 size=    6400kB time=00:00:15.29 bitrate=3428.6kbits/s speed=0.338x
frame=  375 fps=8.2 q=23.0 size=    6656kB time=00:00:15.50 bitrate=3517.8kbits/s speed=0.339x
frame=  379 fps=8.2 q=23.0 size=    6656kB time=00:00:15.70 bitrate=3471.2kbits/s speed=0.34x
frame=  384 fps=8.2 q=23.0 size=    6656kB time=00:00:15.91 bitrate=3425.7kbits/s speed=0.34x
frame=  389 fps=8.2 q=23.0 size=    6656kB time=00:00:16.12 bitrate=3381.5kbits/s speed=0.341x
frame=  395 fps=8.3 q=23.0 size=    6656kB time=00:00:16.37 bitrate=3329.9kbits/s speed=0.342x
frame=  401 fps=8.3 q=23.0 size=    6912kB time=00:00:16.62 bitrate=3405.9kbits/s speed=0.343x
frame=  406 fps=8.3 q=23.0 size=    6912kB time=00:00:16.83 bitrate=3363.8kbits/s speed=0.344x
frame=  411 fps=8.3 q=23.0 size=    6912kB time=00:00:17.04 bitrate=3322.6kbits/s speed=0.344x
frame=  416 fps=8.3 q=23.0 size=    7168kB time=00:00:17.25 bitrate=3404.1kbits/s speed=0.345x
frame=  421 fps=8.3 q=23.0 size=    7168kB time=00:00:17.45 bitrate=3363.5kbits/s speed=0.345x
frame=  427 fps=8.3 q=23.0 size=    7168kB time=00:00:17.66 bitrate=3323.8kbits/s speed=0.345x
frame=  430 fps=8.3 q=23.0 size=    7168kB time=00:00:17.83 bitrate=3292.7kbits/s speed=0.345x
frame=  433 fps=8.3 q=23.0 size=    7424kB time=00:00:17.95 bitrate=3386.6kbits/s speed=0.344x
frame=  437 fps=8.3 q=23.0 size=    7424kB time=00:00:18.12 bitrate=3355.5kbits/s speed=0.343x
frame=  441 fps=8.2 q=23.0 size=    7424kB time=00:00:18.29 bitrate=3324.9kbits/s speed=0.342x
frame=  445 fps=8.2 q=23.0 size=    7424kB time=00:00:18.45 bitrate=3294.9kbits/s speed=0.341x
frame=  450 fps=8.2 q=23.0 size=    7424kB time=00:00:18.62 bitrate=3265.4kbits/s speed=0.341x
frame=  455 fps=8.2 q=23.0 size=    7424kB time=00:00:18.87 bitrate=3222.1kbits/s speed=0.342x
frame=  461 fps=8.3 q=23.0 size=    7680kB time=00:00:19.12 bitrate=3289.7kbits/s speed=0.343x
frame=  467 fps=8.3 q=23.0 size=    7680kB time=00:00:19.33 bitrate=3254.2kbits/s speed=0.343x
frame=  471 fps=8.3 q=23.0 size=    7680kB time=00:00:19.54 bitrate=3219.5kbits/s speed=0.343x
frame=  476 fps=8.3 q=23.0 size=    7936kB time=00:00:19.75 bitrate=3291.8kbits/s speed=0.344x
frame=  481 fps=8.3 q=23.0 size=    7936kB time=00:00:19.95 bitrate=3257.4kbits/s speed=0.344x
frame=  486 fps=8.3 q=23.0 size=    7936kB time=00:00:20.16 bitrate=3223.7kbits/s speed=0.345x
frame=  491 fps=8.3 q=23.0 size=    8192kB time=00:00:20.37 bitrate=3293.7kbits/s speed=0.345x
frame=  497 fps=8.3 q=23.0 size=    8448kB time=00:00:20.62 bitrate=3355.5kbits/s speed=0.346x
frame=  504 fps=8.4 q=23.0 size=    8704kB time=00:00:20.87 bitrate=3415.7kbits/s speed=0.347x
frame=  508 fps=8.4 q=23.0 size=    8704kB time=00:00:21.08 bitrate=3382.0kbits/s speed=0.347x
frame=  514 fps=8.4 q=23.0 size=    8704kB time=00:00:21.29 bitrate=3348.9kbits/s speed=0.348x
frame=  518 fps=8.4 q=23.0 size=    8704kB time=00:00:21.50 bitrate=3316.4kbits/s speed=0.348x
frame=  524 fps=8.4 q=23.0 size=    8704kB time=00:00:21.70 bitrate=3284.6kbits/s speed=0.348x
frame=  528 fps=8.4 q=23.0 size=    8960kB time=00:00:21.91 bitrate=3349.1kbits/s speed=0.349x
frame=  533 fps=8.4 q=23.0 size=    8960kB time=00:00:22.12 bitrate=3317.5kbits/s speed=0.349x
frame=  538 fps=8.4 q=23.0 size=    8960kB time=00:00:22.33 bitrate=3286.6kbits/s speed=0.35x
frame=  543 fps=8.4 q=23.0 size=    9216kB time=00:00:22.54 bitrate=3349.3kbits/s speed=0.35x
frame=  548 fps=8.4 q=23.0 size=    9216kB time=00:00:22.75 bitrate=3318.6kbits/s speed=0.351x
frame=  553 fps=8.5 q=23.0 size=    9216kB time=00:00:22.95 bitrate=3288.5kbits/s speed=0.351x
frame=  558 fps=8.5 q=23.0 size=    9216kB time=00:00:23.16 bitrate=3258.9kbits/s speed=0.351x
frame=  563 fps=8.5 q=23.0 size=    9216kB time=00:00:23.37 bitrate=3229.9kbits/s speed=0.352x
frame=  568 fps=8.5 q=23.0 size=    9472kB time=00:00:23.58 bitrate=3290.2kbits/s speed=0.352x
frame=  574 fps=8.5 q=23.0 size=    9472kB time=00:00:23.83 bitrate=3255.7kbits/s speed=0.353x
frame=  581 fps=8.5 q=23.0 size=    9472kB time=00:00:24.08 bitrate=3221.9kbits/s speed=0.353x
frame=  587 fps=8.5 q=23.0 size=    9728kB time=00:00:24.33 bitrate=3275.0kbits/s speed=0.354x
frame=  593 fps=8.6 q=23.0 size=    9728kB time=00:00:24.58 bitrate=3241.7kbits/s speed=0.355x
frame=  598 fps=8.6 q=23.0 size=    9728kB time=00:00:24.83 bitrate=3209.1kbits/s speed=0.355x
frame=  603 fps=8.6 q=23.0 size=    9728kB time=00:00:25.04 bitrate=3182.4kbits/s speed=0.355x
frame=  609 fps=8.6 q=23.0 size=    9984kB time=00:00:25.29 bitrate=3233.8kbits/s speed=0.356x
frame=  614 fps=8.6 q=23.0 size=    9984kB time=00:00:25.50 bitrate=3207.4kbits/s speed=0.356x
frame=  619 fps=8.6 q=23.0 size=    9984kB time=00:00:25.70 bitrate=3181.4kbits/s speed=0.357x
frame=  623 fps=8.6 q=23.0 size=    9984kB time=00:00:25.87 bitrate=3160.9kbits/s speed=0.356x
frame=  627 fps=8.6 q=23.0 size=   10240kB time=00:00:26.04 bitrate=3221.2kbits/s speed=0.356x
frame=  631 fps=8.5 q=23.0 size=   10240kB time=00:00:26.20 bitrate=3200.8kbits/s speed=0.355x
frame=  635 fps=8.5 q=23.0 size=   10240kB time=00:00:26.37 bitrate=3180.5kbits/s speed=0.354x
frame=  639 fps=8.5 q=23.0 size=   10240kB time=00:00:26.54 bitrate=3160.6kbits/s speed=0.353x
frame=  645 fps=8.5 q=23.0 size=   10240kB time=00:00:26.79 bitrate=3131.1kbits/s speed=0.354x
frame=  650 fps=8.5 q=23.0 size=   10496kB time=00:00:27.00 bitrate=3184.6kbits/s speed=0.354x
frame=  656 fps=8.5 q=23.0 size=   10496kB time=00:00:27.20 bitrate=3160.2kbits/s speed=0.354x
frame=  660 fps=8.5 q=23.0 size=   10496kB time=00:00:27.41 bitrate=3136.2kbits/s speed=0.355x
frame=  665 fps=8.5 q=23.0 size=   10496kB time=00:00:27.62 bitrate=3112.5kbits/s speed=0.355x
frame=  670 fps=8.5 q=23.0 size=   10752kB time=00:00:27.83 bitrate=3164.6kbits/s speed=0.355x
frame=  676 fps=8.6 q=23.0 size=   10752kB time=00:00:28.08 bitrate=3136.4kbits/s speed=0.356x
frame=  682 fps=8.6 q=23.0 size=   11008kB time=00:00:28.33 bitrate=3182.8kbits/s speed=0.356x
frame=  689 fps=8.6 q=23.0 size=   11008kB time=00:00:28.58 bitrate=3154.9kbits/s speed=0.357x
frame=  694 fps=8.6 q=23.0 size=   11264kB time=00:00:28.83 bitrate=3200.3kbits/s speed=0.357x
frame=  699 fps=8.6 q=23.0 size=   11264kB time=00:00:29.04 bitrate=3177.3kbits/s speed=0.358x
frame=  704 fps=8.6 q=23.0 size=   11264kB time=00:00:29.25 bitrate=3154.7kbits/s speed=0.358x
frame=  709 fps=8.6 q=23.0 size=   11264kB time=00:00:29.45 bitrate=3132.4kbits/s speed=0.358x
frame=  714 fps=8.6 q=23.0 size=   11520kB time=00:00:29.66 bitrate=3181.1kbits/s speed=0.359x
frame=  720 fps=8.6 q=23.0 size=   11520kB time=00:00:29.91 bitrate=3154.5kbits/s speed=0.359x
frame=  725 fps=8.6 q=23.0 size=   11520kB time=00:00:30.12 bitrate=3132.7kbits/s speed=0.359x
frame=  731 fps=8.7 q=23.0 size=   11776kB time=00:00:30.37 bitrate=3175.9kbits/s speed=0.36x
frame=  737 fps=8.7 q=23.0 size=   11776kB time=00:00:30.62 bitrate=3150.0kbits/s speed=0.36x
frame=  743 fps=8.7 q=23.0 size=   11776kB time=00:00:30.87 bitrate=3124.5kbits/s speed=0.361x
frame=  749 fps=8.7 q=23.0 size=   11776kB time=00:00:31.12 bitrate=3099.4kbits/s speed=0.361x
frame=  754 fps=8.7 q=23.0 size=   12032kB time=00:00:31.33 bitrate=3145.7kbits/s speed=0.362x
frame=  759 fps=8.7 q=23.0 size=   12032kB time=00:00:31.54 bitrate=3125.0kbits/s speed=0.362x
frame=  765 fps=8.7 q=23.0 size=   12032kB time=00:00:31.79 bitrate=3100.4kbits/s speed=0.362x
frame=  771 fps=8.7 q=23.0 size=   12288kB time=00:00:32.04 bitrate=3141.6kbits/s speed=0.363x
frame=  777 fps=8.7 q=23.0 size=   12288kB time=00:00:32.29 bitrate=3117.3kbits/s speed=0.363x
frame=  783 fps=8.8 q=23.0 size=   12288kB time=00:00:32.54 bitrate=3093.4kbits/s speed=0.364x
frame=  787 fps=8.7 q=23.0 size=   12288kB time=00:00:32.70 bitrate=3077.6kbits/s speed=0.363x
frame=  791 fps=8.7 q=23.0 size=   12288kB time=00:00:32.87 bitrate=3062.0kbits/s speed=0.363x
frame=  794 fps=8.7 q=23.0 size=   12544kB time=00:00:33.00 bitrate=3114.0kbits/s speed=0.362x
frame=  798 fps=8.7 q=23.0 size=   12544kB time=00:00:33.16 bitrate=3098.3kbits/s speed=0.361x
frame=  802 fps=8.7 q=23.0 size=   12544kB time=00:00:33.33 bitrate=3082.8kbits/s speed=0.361x
frame=  808 fps=8.7 q=23.0 size=   12544kB time=00:00:33.54 bitrate=3063.7kbits/s speed=0.361x
frame=  813 fps=8.7 q=23.0 size=   12544kB time=00:00:33.75 bitrate=3044.8kbits/s speed=0.361x
frame=  818 fps=8.7 q=23.0 size=   12800kB time=00:00:34.00 bitrate=3084.1kbits/s speed=0.362x
frame=  824 fps=8.7 q=23.0 size=   12800kB time=00:00:34.25 bitrate=3061.5kbits/s speed=0.362x
frame=  830 fps=8.7 q=23.0 size=   12800kB time=00:00:34.45 bitrate=3043.0kbits/s speed=0.362x
frame=  836 fps=8.7 q=23.0 size=   12800kB time=00:00:34.70 bitrate=3021.1kbits/s speed=0.363x
frame=  841 fps=8.7 q=23.0 size=   13056kB time=00:00:34.91 bitrate=3063.2kbits/s speed=0.363x
frame=  846 fps=8.7 q=23.0 size=   13056kB time=00:00:35.12 bitrate=3045.0kbits/s speed=0.363x
frame=  851 fps=8.7 q=23.0 size=   13312kB time=00:00:35.33 bitrate=3086.4kbits/s speed=0.363x
frame=  856 fps=8.8 q=23.0 size=   13312kB time=00:00:35.54 bitrate=3068.3kbits/s speed=0.363x
frame=  860 fps=8.7 q=23.0 size=   13568kB time=00:00:35.75 bitrate=3109.1kbits/s speed=0.363x
frame=  866 fps=8.8 q=23.0 size=   13568kB time=00:00:35.95 bitrate=3091.1kbits/s speed=0.364x
frame=  870 fps=8.8 q=23.0 size=   13568kB time=00:00:36.16 bitrate=3073.3kbits/s speed=0.364x
frame=  876 fps=8.8 q=23.0 size=   13824kB time=00:00:36.37 bitrate=3113.3kbits/s speed=0.364x
frame=  880 fps=8.8 q=23.0 size=   13824kB time=00:00:36.58 bitrate=3095.6kbits/s speed=0.364x
frame=  886 fps=8.8 q=23.0 size=   13824kB time=00:00:36.83 bitrate=3074.6kbits/s speed=0.365x
frame=  891 fps=8.8 q=23.0 size=   13824kB time=00:00:37.04 bitrate=3057.3kbits/s speed=0.365x
frame=  897 fps=8.8 q=23.0 size=   14080kB time=00:00:37.29 bitrate=3093.0kbits/s speed=0.365x
frame=  903 fps=8.8 q=23.0 size=   14080kB time=00:00:37.54 bitrate=3072.4kbits/s speed=0.365x
frame=  909 fps=8.8 q=23.0 size=   14080kB time=00:00:37.79 bitrate=3052.1kbits/s speed=0.366x
frame=  915 fps=8.8 q=23.0 size=   14336kB time=00:00:38.04 bitrate=3087.2kbits/s speed=0.366x
frame=  921 fps=8.8 q=23.0 size=   14336kB time=00:00:38.29 bitrate=3067.0kbits/s speed=0.367x
frame=  927 fps=8.8 q=23.0 size=   14336kB time=00:00:38.54 bitrate=3047.1kbits/s speed=0.367x
frame=  934 fps=8.9 q=23.0 size=   14592kB time=00:00:38.79 bitrate=3081.5kbits/s speed=0.368x
frame=  939 fps=8.9 q=23.0 size=   14592kB time=00:00:39.04 bitrate=3061.8kbits/s speed=0.368x
frame=  945 fps=8.9 q=23.0 size=   14592kB time=00:00:39.29 bitrate=3042.3kbits/s speed=0.369x
frame=  951 fps=8.9 q=23.0 size=   14848kB time=00:00:39.54 bitrate=3076.1kbits/s speed=0.369x
[out#0/mp4 @ 0x64f9dd532d00] video:15675kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.079204%
frame= 1005 fps=9.3 q=-1.0 Lsize=   15687kB time=00:00:41.75 bitrate=3078.1kbits/s speed=0.385x
[libx264 @ 0x64f9dd5343c0] frame I:5     Avg QP:12.45  size:199983
[libx264 @ 0x64f9dd5343c0] frame P:347   Avg QP:14.80  size: 33671
[libx264 @ 0x64f9dd5343c0] frame B:653   Avg QP:17.37  size:  5155
[libx264 @ 0x64f9dd5343c0] consecutive B-frames:  9.3%  8.0% 13.1% 69.7%
[libx264 @ 0x64f9dd5343c0] mb I  I16..4: 10.0% 67.1% 23.0%
[libx264 @ 0x64f9dd5343c0] mb P  I16..4:  1.6%  2.5%  1.6%  P16..4: 40.8% 14.5%  9.1%  0.0%  0.0%    skip:29.9%
[libx264 @ 0x64f9dd5343c0] mb B  I16..4:  0.2%  0.1%  0.0%  B16..8: 35.2%  1.2%  0.1%  direct: 1.6%  skip:61.7%  L0:47.6% L1:47.3% BI: 5.1%
[libx264 @ 0x64f9dd5343c0] 8x8 transform intra:47.4% inter:84.2%
[libx264 @ 0x64f9dd5343c0] coded y,uvDC,uvAC intra: 52.0% 46.8% 25.2% inter: 12.5% 8.0% 1.6%
[libx264 @ 0x64f9dd5343c0] i16 v,h,dc,p: 29% 49%  5% 17%
[libx264 @ 0x64f9dd5343c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 26% 30%  3%  4%  3%  4%  3%  4%
[libx264 @ 0x64f9dd5343c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 35% 30% 16%  3%  4%  3%  4%  2%  2%
[libx264 @ 0x64f9dd5343c0] i8c dc,h,v,p: 51% 29% 17%  3%
[libx264 @ 0x64f9dd5343c0] Weighted P-Frames: Y:3.7% UV:3.5%
[libx264 @ 0x64f9dd5343c0] ref P L0: 60.9%  3.4% 20.8% 14.7%  0.1%
[libx264 @ 0x64f9dd5343c0] ref B L0: 80.9% 11.9%  7.2%
[libx264 @ 0x64f9dd5343c0] ref B L1: 94.3%  5.7%
[libx264 @ 0x64f9dd5343c0] kb/s:3066.31
ffmpeg version 6.1.1-3ubuntu5 Copyright (c) 2000-2023 the FFmpeg developers
  built with gcc 13 (Ubuntu 13.2.0-23ubuntu3)
  configuration: --prefix=/usr --extra-version=3ubuntu5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
  libavutil      58. 29.100 / 58. 29.100
  libavcodec     60. 31.102 / 60. 31.102
  libavformat    60. 16.100 / 60. 16.100
  libavdevice    60.  3.100 / 60.  3.100
  libavfilter     9. 12.100 /  9. 12.100
  libswscale      7.  5.100 /  7.  5.100
  libswresample   4. 12.100 /  4. 12.100
  libpostproc    57.  3.100 / 57.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3_silent.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Duration: 00:00:41.88, start: 0.000000, bitrate: 3068 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1920, 3066 kb/s, 24 fps, 24 tbr, 12288 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
[mp3 @ 0x5db964ddc2c0] Estimating duration from bitrate, this may be inaccurate
Input #1, mp3, from '/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/audio/voiceover_word_boundary.mp3':
  Duration: 00:00:41.35, start: 0.000000, bitrate: 48 kb/s
  Stream #1:0: Audio: mp3, 24000 Hz, mono, fltp, 48 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #1:0 -> #0:1 (mp3 (mp3float) -> aac (native))
Press [q] to stop, [?] for help
Output #0, mp4, to '/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf60.16.100
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1920, q=2-31, 3066 kb/s, 24 fps, 24 tbr, 12288 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
      encoder         : Lavc60.31.102 libx264
  Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 24000 Hz, mono, fltp, 69 kb/s
    Metadata:
      encoder         : Lavc60.31.102 aac
size=       0kB time=N/A bitrate=N/A speed=N/A
size=   14336kB time=00:00:37.50 bitrate=3131.8kbits/s speed=74.9x
[out#0/mp4 @ 0x5db964dfb040] video:15675kB audio:321kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.154325%
size=   16020kB time=00:00:41.75 bitrate=3143.4kbits/s speed=76.3x
[aac @ 0x5db964d4d900] Qavg: 17882.781
{
  "candidate_id": "calendar-invite-login-trap-30s",
  "version": "v1.4.0-b3-text-detail-ai-only",
  "status": "review_preview_only_not_posted",
  "variant": {
    "candidate_id": "calendar-invite-login-trap-30s",
    "version": "v1.4.0-b3-text-detail-ai-only",
    "variant": "b3",
    "mode": "visible_invite_cinematic_ai_only",
    "preview_mp4_path": "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3.mp4",
    "preview_sha256": "4fb33b4201e9253ff39072fb175b40415d96d40db71e8051cd741c0193a1a9b8",
    "duration_seconds": 41.852,
    "resolution": "1080x1920",
    "fps": 24,
    "audio_path": "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/audio/voiceover_word_boundary.mp3",
    "script_hash": "0e9ec7f162b69573",
    "contact_sheet_path": "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/b3_contact_sheet_v1.jpg",
    "keyframes_contact_sheet_path": "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/visible_invite_keyframes_contact_sheet_v1.jpg",
    "keyframes": [
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_01_openai_codex_gpt-image-2-high.png",
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_02_openai_codex_gpt-image-2-high.png",
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_03_openai_codex_gpt-image-2-high.png",
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_04_openai_codex_gpt-image-2-high.png",
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_05_openai_codex_gpt-image-2-high.png",
      "/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/ai_keyframes_b3_text_detail/b3_text_detail_keyframe_06_openai_codex_gpt-image-2-high.png"
    ],
    "NoOverlayPolicy": {
      "result": "pass",
      "allowed": [
        "subtitles_only"
      ]
    },
    "blocked": {
      "wan_used": false,
      "i2v_used": false,
      "t2v_used": false,
      "platform_api_used": false,
      "posting": false
    }
  },
  "assessment": "B3 removes B2 focus lines and relies on more detailed AI-generated Outlook-style invite/login/calendar screens with readable UI text.",
  "approval_commands": [
    "APPROVED_PROOF_SHORT calendar-invite-login-trap-30s v1.4.0-b3-text-detail-ai-only",
    "REVISE_PROOF_SHORT calendar-invite-login-trap-30s \"...\""
  ]
}


Question: QA B3 rendered contact sheet. It should have no focus lines/boxes/arrows except subtitles, detailed AI-generated Outlook-style invite/login/calendar screens, readable captions, no people/hands/faces/QR/watermark. Assess if it is clearer than B2 and if any generated screen text looks harmful/gibberish.

from hermes_tools import terminal
p='/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3.mp4'
print(terminal(f"ffprobe -v error -show_entries format=duration,size:stream=codec_type,width,height,r_frame_rate -of json {p!r}", timeout=30)['output'])
print(terminal(f"sha256sum {p!r}", timeout=30)['output'])


Image loaded into your context — you can see it natively now. Use your built-in vision to answer the user.

Question: QA B3 rendered contact sheet. It should have no focus lines/boxes/arrows except subtitles, detailed AI-generated Outlook-style invite/login/calendar screens, readable captions, no people/hands/faces/QR/watermark. Assess if it is clearer than B2 and if any generated screen text looks harmful/gibberish.


Output:
{
    "programs": [

    ],
    "streams": [
        {
            "codec_type": "video",
            "width": 1080,
            "height": 1920,
            "r_frame_rate": "24/1"
        },
        {
            "codec_type": "audio",
            "r_frame_rate": "0/0"
        }
    ],
    "format": {
        "duration": "41.875000",
        "size": "16404399"
    }
}
4fb33b4201e9253ff39072fb175b40415d96d40db71e8051cd741c0193a1a9b8  /tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3.mp4


Verstanden — du hattest recht. Die Linien in B2 bringen kaum Mehrwert und beschädigen eher den Premium-Look.

Ich habe deshalb **B3** gebaut:

## B3 — Detailed AI Invite Cut

- Keine Linien
- Keine Pfeile
- Keine Boxen
- Keine Fokus-Markierungen
- Nur KI-Bilder + Voiceover + aktive Wort-Subtitles
- Dafür deutlich detailliertere, sichtbare Outlook-artige Einladung:
  - `Quarterly Review Meeting`
  - `Join meeting`
  - `Sign in to continue`
  - Login-Panel
  - Kalender-App als sichere Alternative
  - Meeting verified / Open meeting from calendar

MEDIA:/tmp/autoshorts_proof_short_sprint31/calendar-invite-login-trap-30s/visible_invite_cinematic_ab_v1/b3/calendar-invite-login-trap-30s_b3.mp4

## QA

- Länge: 41.875 s
- Format: 1080×1920, 24 fps
- Audio: enthalten
- Caption-Sync: aktive Wort-Hervorhebung bleibt erhalten
- NoOverlayPolicy: pass — nur Subtitles
- Keine Menschen/Hände/Gesichter/QR/Watermark sichtbar
- Die Bild-Story ist jetzt klarer als B1/B2, weil der Scam visuell wirklich im Screen stattfindet — nicht mehr nur durch Voiceover erklärt wird.

## Hash

`4fb33b4201e9253ff39072fb175b40415d96d40db71e8051cd741c0193a1a9b8`

Meine Einschätzung: **B3 ist klar die bessere Richtung.**
Das wirkt mehr wie ein echter Social-Short über einen konkreten Scam und weniger wie ein hübsches Moodboard mit Sicherheits-Predigt.


[M G] Sehr gut. Das ist nun unser neuer standard! Nur eine korrektur: das videoformat stimmt nicht. Es ist quadratisch wenn ich es  abspiele (in der höhe zusammengestaucht). Bitte noch korrigieren und dann weiterbauen.


Explanation:
**Addressing memory and format updates**

I need to respond and possibly save a memory or skill update since there's a new standard for durability. I also have to fix the format and inspect the video for any display issues, possibly due to SAR on Telegram. I think I should use ffprobe for that. The skill is already loaded, but I need to scan it. It might be relevant for social media shorts automation, so I need to check the files too.

todo

B3 MP4-Format/Metadata prüfen: Pixelgröße, SAR/DAR, Rotation, Stream-Tags

B3 als echtes 9:16 Telegram-kompatibles MP4 neu muxen/encoden

Korrigierte Datei mit ffprobe + Screenshot/Frame-QA verifizieren

Neuen visuellen Standard als Skill/Memory verankern

Nach Formatfix nächsten Build-Schritt vorbereiten/ausführen


social-media-shorts-automation

# Clean AI Cut vs Hybrid Mechanism — session learning

Use this when comparing a pure premium AI-image sequence against a proof short with deterministic mechanism/UI overlays.

## Session-derived pattern

For a scam/cybersecurity proof short, a clean image sequence can look significantly more premium and native to TikTok/Reels, but it often weakens immediate mechanism clarity.

Observed comparison:

```text
Clean AI Cut = premium mood, calmer, less explainer-board
Hybrid = clearer mechanism, more immediately useful
Best likely final direction = mostly clean images + one minimal deterministic mechanism moment
```

Recommended framing:

```text
90% Clean AI Images
10% precise renderer-owned mechanism
```

Examples of acceptable minimal mechanism moments:

- one brief `suspicious link/domain` reveal
- one brief `close invite -> open trusted app/bookmark` action moment
- one simple before/after state, not a full checklist board

Avoid returning to:

- checklist-heavy UI cards
- boxed explainer overlays
- arrows/circles/diagram markers
- repeated labels and decision-target graphics

## Viewer explanation rule

When the viewer is not technical, do not use shorthand such as `open the service yourself` without explanation. Spell out the exact action:

```text
Close the invite.
Open your calendar or work app from the normal icon/bookmark.
If the meeting is real, it will still be there.
Trust the path you chose, not the button that chose you.
```

This converts a security maxim into a concrete next action.

## Caption synchronization rule

For final-near shorts where the user complains that subtitles do not match voiceover exactly, use actual word-boundary/forced-alignment timing rather than distributing words evenly across sentence SRT blocks. For EdgeTTS previews, request `boundary='WordBoundary'`, store word cues, then render static phrase segments where only the active spoken word highlights.

Keep the established caption policy:

- static phrase segment, usually 3–7 words
- active spoken word highlighted in yellow
- inactive words white
- no subtitle box/bar
- bottom mobile-safe position

## A/B decision criteria

After rendering both versions, explicitly answer:

1. Which version looks more premium?
2. Which version explains the mechanism faster without audio?
3. Does the clean cut rely too much on VO/subtitles?
4. Would one minimal deterministic mechanism moment recover clarity without killing the premium look?
5. Is Wan/I2V worth testing, or is image-sequence motion enough for this stage?

Default recommendation: do not jump to full Wan/I2V after this test. If clean images work visually, test exactly one short motion micro-proof only after approval.

## Visible-problem keyframe A/B pattern

When the user asks whether pure KI images can carry a Proof Short, do not generate generic premium atmosphere. The first image batch must make the real viewer problem literally visible without text:

- show the concrete object/situation (e.g. a calendar invite card on laptop/phone, a join/login button shape, attendee dots, blank time rows);
- keep all generated UI text-free: no letters, pseudo-letters, numbers, logos, QR/barcodes, watermarks, people, hands, or faces;
- use contact-sheet QA before rendering and discard frames that only look like generic laptop/desk B-roll;
- expect later safe/resolution frames to be less semantically explicit, but the first half must visually anchor the trap.

For the calendar-invite login-trap proof, the session result was:

```text
B1 = clean visible-invite AI images only + voiceover + active-word subtitles
B2 = same images + very subtle focus outlines, no labels/arrows/checklists
Outcome = B2 recommended: slightly less pure, but the scam mechanism is understood faster while still avoiding PowerPoint/explainer-board look.
```

Use this as the default next-step bias: if clean images are beautiful but semantically weak, add exactly one or two subtle focus moments around the suspicious invite/button/app path rather than returning to labels, arrows, boxes, or checklist UI cards.