<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: miao cunhui</title>
    <description>The latest articles on DEV Community by miao cunhui (@miao_cunhui_587ccddb6acc1).</description>
    <link>https://dev.to/miao_cunhui_587ccddb6acc1</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3994098%2Fa1c74938-1afb-4c72-80a6-50aa692074fc.png</url>
      <title>DEV Community: miao cunhui</title>
      <link>https://dev.to/miao_cunhui_587ccddb6acc1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miao_cunhui_587ccddb6acc1"/>
    <language>en</language>
    <item>
      <title>How I Track AI Video Prompt Experiments in Markdown and JSON</title>
      <dc:creator>miao cunhui</dc:creator>
      <pubDate>Sat, 20 Jun 2026 12:42:34 +0000</pubDate>
      <link>https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349</link>
      <guid>https://dev.to/miao_cunhui_587ccddb6acc1/building-an-ai-video-job-queue-in-typescript-1349</guid>
      <description>&lt;p&gt;AI video testing gets messy fast. A creator starts with one product image, tries three prompts, switches models, changes the camera instruction, and then forgets which version produced the best clip.&lt;/p&gt;

&lt;p&gt;This is a simple workflow for tracking AI video prompt experiments with Markdown and JSON. It is technical enough for people who like structured files, but the purpose is still creative: make better clips with fewer blind retries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most AI video failures are hard to learn from because the test notes are incomplete.&lt;/p&gt;

&lt;p&gt;Common gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the source image is not recorded&lt;/li&gt;
&lt;li&gt;the prompt version changes without a note&lt;/li&gt;
&lt;li&gt;the model changes halfway through the test&lt;/li&gt;
&lt;li&gt;failures are described as "bad" instead of labeled&lt;/li&gt;
&lt;li&gt;the accepted clip is saved without the reason it won&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want repeatable results, each test needs a small amount of structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ai-video-tests/
  product-bottle/
    source-notes.md
    prompts.md
    runs.json
    review.md
  ugc-hook/
    source-notes.md
    prompts.md
    runs.json
    review.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps one creative job in one folder. A "job" can be a product ad opener, UGC hook, same-prompt model comparison, explainer background, or product detail close-up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source Notes
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;source-notes.md&lt;/code&gt; to describe the input before writing prompts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Source Notes&lt;/span&gt;

Clip job: 5-second vertical product ad
Source image: front-facing product bottle on white background
Target platform: TikTok / Reels
Must preserve: bottle shape, cap, label, color
Caption space: top third
Known risk: small label text may distort
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This stops the prompt from carrying all the context. The image and the job are part of the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt Versions
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;prompts.md&lt;/code&gt; to keep each prompt version intentional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## v1 Baseline&lt;/span&gt;

Make this product image into a clean product video.

&lt;span class="gu"&gt;## v2 Motion-first&lt;/span&gt;

Slow push-in toward the product. Soft light moves across the surface.
Keep the product centered and stable.

&lt;span class="gu"&gt;## v3 Production prompt&lt;/span&gt;

Create a 5-second vertical product ad from the provided image.
Slow push-in toward the product while soft studio light moves across the surface.
Keep the product shape, cap, label, color, and position unchanged.
Leave clean space near the top for a short caption.
No extra objects, no label distortion, no melted edges, no background replacement.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not that &lt;code&gt;v3&lt;/code&gt; is longer. It is better because it separates the clip job, motion, preservation rules, framing, and negative constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Log
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;runs.json&lt;/code&gt; when you want sortable records.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product-bottle-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"clipJob"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vertical product ad opener"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sourceImage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product-bottle-front.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"promptVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Model A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9:16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"failureLabels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"product-drift"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"motion-too-static"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"retry"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nextPromptChange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add preservation constraints and immediate motion"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"runId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product-bottle-002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"clipJob"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vertical product ad opener"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"sourceImage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"product-bottle-front.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"promptVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Model A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aspectRatio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9:16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"failureLabels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"minor-label-softness"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keep"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nextPromptChange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add label text in editing instead of regenerating"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use a spreadsheet instead. JSON is just convenient if you want to reuse the records later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring Rubric
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;What to Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Subject fidelity&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;Product, character, or object stays recognizable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motion usefulness&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Motion starts early and supports the clip job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt adherence&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Camera, framing, and constraints are followed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Editability&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Clip can be cropped, captioned, or placed in a sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retry cost&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;Number of generations needed for a usable result&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not score style alone. A clip can look impressive and still fail the job if the product label changes or the framing leaves no room for captions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure Labels
&lt;/h2&gt;

&lt;p&gt;Use repeatable labels instead of vague notes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;product-drift
character-drift
background-takeover
text-distortion
motion-too-static
camera-too-fast
prompt-ignored
hard-to-edit
over-stylized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These labels make it easier to see patterns. If &lt;code&gt;product-drift&lt;/code&gt; appears in every run, changing models may help more than adding another style phrase. If &lt;code&gt;motion-too-static&lt;/code&gt; appears often, the motion instruction may need to start earlier and be more specific.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review Notes
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;review.md&lt;/code&gt; to summarize the decision.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Review&lt;/span&gt;

Best run: product-bottle-002
Why it won: product stayed stable, motion started early, caption space remained usable.
Manual edit needed: add real label-safe text in post-production.
Rejected runs: v1 was too static; v2 improved motion but changed the label.
Next test: compare the same v3 prompt across two other models.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The review is the part your future self will actually read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related LumiYing Resource
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Image-to-video workflow: &lt;a href="https://lumiying.com/tools/image-to-video" rel="noopener noreferrer"&gt;https://lumiying.com/tools/image-to-video&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A small prompt log is enough to turn AI video generation from guessing into a repeatable creative workflow. Save the source notes, version the prompt, label the failure, score the output, and write down why a clip was kept or rejected.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
