Ice Motion Director
Install

Spotify concept ad

Spotify, brand film. How it was made with Ice Motion Director, from the prompt to the delivered film.

Unofficial concept, not affiliated with Spotify

The film

The prompt

Make an ad for Spotify, 35 seconds to a minute long, with an Arabic version and an English version.

Show the original, exactly as typed (Arabic)

Translated from Arabic.

اعمل إعلان لسبوتيفاي، مدته من 35 ثانية لدقيقة، ونسخة عربي ونسخة إنجليزي.

Film type
Brand film
Route
film
How it ran
One prompt (auto mode)
Size
Standard
Published
21 October 2026

Delivered

  • English, 16:9, 35 seconds

How it was made

Agent
Claude Code 2.1.303 (desktop app)
Model
claude-opus-5-5
Effort
xhigh
Sub-agents
A director session, research agents, concept and stage critics, rework and verify critics, picture and sound critics, a cold viewer for the clarity read, the stage approver and a sound designer
Made on
20 October 2026 to 21 October 2026

How it got here

The run as it happened, draft by draft, with every round of the owner's feedback. Told from the conversation in the case study.

  1. The prompt

    One line at night: a Spotify ad, 35 seconds to a minute, in Arabic and English. The owner went to sleep and said not to stop for questions, so the run went fully automatic and every decision was researched and logged with its reason and source.

  2. Draft 3

    The first look at the work. The agent flagged its own weak spots: the last 8 seconds were still and empty, the top result card was a grey placeholder, the mix was not done. The owner approved the look and cut the scope from six versions to one: English, 16:9, complete.

  3. Draft 7

    The abstract concept had passed every gate, but watched as an ordinary viewer it did not read: it felt long, the search text appeared at once instead of being typed, and the noise and the moment after play did not say what the ad meant. The router had classed it as a brand film, not an app ad. The owner chose to keep the story and make it clear: a drawn street with cars, a motorbike and a drill, typing letter by letter, and the street itself playing after play. Style frames first, before any build.

  4. Style frames

    Six style frames and a new storyboard. Approved with line B, with two fixes: a row of parked cars to make it a real jam, and the camera closer so the machines fill the frame.

    Style frames: a frame the owner reviewed
  5. Draft 9

    The street drawn and timed to the beat, sent with the weak points the agent saw in it. The owner asked for all four to be fixed: a shorter, livelier ending, more cars inside the frame, more camera movement, and less limiting at the peak. Draft 10 came out at 33.5 seconds and was rejected for missing the 35 second minimum.

  6. Draft 11

    Two rows of cars, the camera closing in on each machine, an ending cut from 9 to 6.5 seconds. The owner asked for a black end screen with the Spotify logo animating in, and for the unofficial line to leave the video and live on the gallery caption and this card instead.

  7. Draft 14

    The black end card with the official logo landing on the last hit at 33.5 seconds. The owner listened to the sound and approved it. Final render at 1920 x 1080, the last review round, delivery and this case study.

What Ice asked

  1. Brand ownership and material

    b) not the brand: unofficial concept (default, user said do not ask)

    The recommended default

  2. Voice source

    a) every word on screen, music-led (default, no permitted voice source)

    The recommended default

  3. Picture in mind

    a) pitch ideas (default)

    The recommended default

  4. Platform

    YouTube and social feeds plus the gallery page (decision D-06)

    The recommended default

What was supplied

  • Briefpartial

    Filled in: goal, audience, platform and aspect, message, call to action, must-include content, commercial use missing

  • Brand kit (logos only)partial

    Filled in: palette with roles, typefaces and imagery style missing (filled from Spotify's own site and guidelines by ice-assets)

The workflow, stage by stage

All ten stages, from the brief to delivery: what each one decided and why, what it made, the critic rounds and the roles that worked on it.

  1. Stage 01, Brief

    Time not recorded

    Rolesuserapprovercriticresearcher

    Intake, research R-01 to R-08, compliance, truth sheet, brand material; approver PASS on second pass (ice/review/stages/01-approver.md)

    Decisions

    • D-01 Ask or not ask at stage 01

      • AChosen
      • - A: Send no message
      • every field takes its default with a D-entry (rests on: questions.md section 5 signal "don't ask")
      Why, and its source

      The user's own words are a "don't ask" signal; the router's stops table then has zero stops (no stage 01 message, no preview approval).

      Source: brief slot mode (router; user signal quoted); ice-motion-director/SKILL.md section 3.3 and section 5 "Stops"; ice-direction/references/questions.md section 5

    • D-02 Brand ownership

      • BChosen
      • - A: I am the brand: use its official material as an official film
      Why, and its source

      Stated in the run conditions and equal to the fixed default; no store badges, offers, prices or claims the brand's own pages do not state today.

      Source: run conditions (quoted); ice-direction/references/questions.md section 2 fixed option set; ice-assets/references/brand-authenticity.md section 10 steps 1 and 10

    • D-04 Commercial use

      • AChosen
      • - A: unknown: never open the noncommercial folder (default when unanswered)
      Why, and its source

      The user did not say; unknown keeps every noncommercial-only source closed, which costs nothing because the skill's permissive references cover the same ground.

      Source: ice-film/SKILL.md section 8; ice-direction/references/intake-and-brief.md section 1 slot commercial_use

    • D-05 Market (provisional, for research)

      • AChosen
      • - A: Arabic version for Egypt and the wider Arab world (MENA)
      • English version global (rests on: prompt language and dialect)
      Why, and its source

      The user's own dialect points to Egypt; an Arabic film for a pan-Arab streaming audience reads in MENA when its on-screen words are clear Arabic; the English version serves the gallery's global audience. Research queries use market "Egypt", "MENA" and "global".

      Source: brief slots language and market (prompt); ice-direction/references/intake-and-brief.md section 1 ("market: infer from language and brand")

    • D-06 Platform (provisional, for research)

      • AChosen
      • - A: YouTube and social feeds (Instagram
      • TikTok
      • YouTube Shorts)
      • plus the public gallery page (rests on: run conditions "public gallery"
      • length range)
      Why, and its source

      A 35 to 60 s ad for a gallery is watched on a web page and on YouTube (landscape); the same film is most often reused in feeds (vertical). Research queries use platform terms "YouTube", "Instagram", "TikTok". Final ratios are set at 03 from the film type's deliverables.

      Source: run conditions ("public gallery"); brief slot duration (prompt); ice-direction/references/intake-and-brief.md section 1 ("platform: infer")

    • D-08 Size and crew

      • AChosen
      • - A: Size standard (7 to 60 s, versions included)
      • crew Full: length row Standard (21 to 45 s) or Full (over 45 s), plus one row per flag: two language versions
      • a real brand's UI rebuilt at 90 percent fidelity
      • more than one master aspect composed separately (16:9 and 9:16 re-laid out). Capped at Full
      Why, and its source

      The film-setup.md rule moves one row up per flag and never above Full; with two languages and re-laid-out aspects the run has 12 to 20 dispatches, a reviewer per round per master, and up to 3 film review rounds per master. Size stays standard because the router says language versions and cutdowns of a 7 to 60 s film keep it Standard.

      Source: brief slots duration and language (prompt); ice-motion-director/SKILL.md section 4; ice-film/references/film-setup.md section 2

    • D-09 Goal and audience

      • AChosen
      • - A: Goal "open Spotify and play something for the moment you are in"
      • audience 18 to 34 on phone feeds (sound often off at first) for both versions, plus laptop gallery viewers for English (rests on: R-02 S-17 and S-15 on Egypt's free-listening and data barriers
      • R-01 S-15 to S-19 on Spotify's own campaigns built on personal listening moments
      • D-06 platform)
      Why, and its source

      The only action an unofficial concept can honestly ask for is to play something; it is also the action Spotify's own link wording names ("PLAY ON SPOTIFY", "LISTEN ON SPOTIFY", R-01 S-02). Sound-off feed viewing is why every word is on screen (D-03).

      Source: brief slots platform (D-06), real_brand (prompt); R-01 (2026-10-20) S-02, S-15 to S-19; R-02 (2026-10-20) S-06, S-15, S-17

    • D-10 Aspect ratios and deliverables

      • AChosen
      • - A: 16:9 master per language, with 9:16 and 1:1 re-laid out from the same timeline, plus a poster still per version (rests on: brand-film.md Deliverables
      • D-06)

      The type's deliverables list exactly this, and D-06 names both landscape and vertical destinations. Cutdowns (15 s, 6 s) are decided at 03 in versions.md.

      Source: ice-film/references/film-types/brand-film.md Deliverables; D-06

    • D-11 Arabic language profile

      • AChosen
      • - A: Egyptian (Cairo) spoken Arabic, polished register, the way Spotify Egypt writes its own pages ("اسمع موسيقى من غير حدود"، "هتدفع ... بس بعد كده") (rests on: R-02 S-07
      • prompt written in Egyptian Arabic)
      Why, and its source

      dialect-profiles.md section 1 says a text-light film with no voice decides between MSA and the most likely audience dialect; the brand's own Arabic copy for this market is Egyptian colloquial, and the user writes Egyptian. Native reader: the user by default; the sign-off stays open in the delivery note (no preview approval in this run).

      Source: R-02 (2026-10-20) S-07; prompt; ice-arabic/SKILL.md section 1; ice-arabic/references/dialect-profiles.md sections 1 and 2

    • D-12 Picture in mind, and the request's triage

      • AChosen
      • - A: Not yet, pitch ideas (fixed default for the question)
      • triage: unformed about the telling, so the full concept round runs at 02 (rests on: questions.md section 4 default
      • intake-and-brief.md section 4 "An ad prompt that gives facts and an occasion ... but no telling ... always enters the concept round")
      Why, and its source

      The prompt holds a subject and constraints but no telling; the skill's rule sends such an ad to the concept round, and the unanswered question takes its default.

      Source: prompt (quoted); ice/state.json questions[2]; ice-direction/references/questions.md sections 4 and 5; ice-direction/references/intake-and-brief.md section 4

    • D-16 The fourth noise source: a demolition hammer instead of TV static

      • BChosen
      • - A: horn
      • drill
      • engine
      • TV static (as the critic listed) (rests on: D-13-critic.md fix 3)
      Why, and its source

      TV static has no clear everyday Egyptian noun and its sound is a hiss with no transient, so it cannot carry the backbeat; the demolition hammer has an everyday Cairo word ("تكسير", the neighbour's renovation) and a hard transient that becomes the backbeat (tak in maqsum, the snare in the straight four). It stays a machine or tool source, inside the critic's rule.

      Source: ice/review/direction/D-13-critic.md fixes 3 and 4; ice/review/direction/D-13-consultant.md; ice/plan/script.md shot 1 and the Arabic dialect review

    • D-22 Default-kit items kept, with reasons

      • A. Reasons: the dark opener of kinetic type is the concept itself (the street's noise is written as words, D-13 and D-15), not decoration; the search box is Spotify's real, captured input and the film's hinge, and the answer now lands whole instead of being typed (critic fix 4); the mint #91EEDA is Spotify's own Premium page accent, not a generic "cyan on dark".Chosen
      • - A: keep the dark kinetic-type opener and the search box with reasons
      • mint stays as a Premium page accent (rests on: D-15
      • TRUTH F1)

      Source: D-17-critic.md (default kit count 3, fix 4); anti-sameness.md section 6

    • D-24 End-card ground

      • AChosen
      • - A: the green logo on pure #000000 inside an oval zone wider than its clear space
      • outside the zone the black thins to 86 percent so the dim street and its lights show through (background with texture)
      • the search field under the logo (second layer)
      • two or three out-of-focus lane lights near the lens at the frame corners, drifting (foreground) (rests on: R-01 S-02 green-on-black rule
      • composition-and-staging.md section 7.2)
      Why, and its source

      the green logo is Spotify's primary colourway and the film's only green after the play circle, so it should close the film; keeping its own zone pure black satisfies the logo rule while the frame around it keeps the street's texture and depth; B gives up the green; C fails the floor.

      Source: R-01 (2026-10-20) S-02; ice/review/stages/05-approver.md item 1; ice-motion/references/composition-and-staging.md section 7.2

    • D-25 Arabic melody lane word order

      • AChosen
      • - A: words in reading order: "حاجة" in the rightmost melody cell
      • "دي" in the leftmost
      • so the lane reads correctly from right to left while the playhead lights them left to right (rests on: rule 11 for the timeline
      • letterforms-in-motion.md section 6 reading order for words)
      Why, and its source

      the words are read, the timeline is not; A keeps both rules. The melody notes still play left to right; the score does not sing the words, so no word-to-note sync is lost.

      Source: ice-arabic/SKILL.md section 2 rule 11; ice-arabic/references/letterforms-in-motion.md section 6; ice/review/stages/05-approver.md item 2

    • D-26 Size of the rebuilt interface strings in Arabic

      • AChosen
      • - A: interface strings at the capture's own proportion (Arabic at the Latin size, as Spotify's Arabic web player sets them)
      • the film's own words (noise words, lane words, the painted line, tile titles) keep D-19's 1.35 (rests on: measured on the captures at 07: the Arabic placeholder is 128 px wide in a 474 px field and "أفضل النتائج" 121 px over a 388 px card
      • at 1.35 the rebuild measured 175 px and 162 px, at 1.0 it measures 130 px and 121 px)
      Why, and its source

      inside the rebuilt interface the capture is the authority (section 11.1); Spotify itself sets Arabic at the Latin size there, and IBM Plex Sans Arabic at that size matches the capture's ink width within 2 percent. D-19's reason (Arabic read words visibly smaller than Latin at equal size) concerns the film's own type, which keeps 1.35. The answer stays legible: 40 px in the 16:9 master, 37 px in 9:16.

      Source: ice/review/ui-fidelity/sheet-ar.png; film/js/ui.js (uts); D-19

    • D-28 One version only: English, 16:9 (owner's decision)

      • BChosen
      • - A: deliver the six planned films (rests on: the prompt and D-10)
      Why, and its source

      the owner (Omar) narrowed the scope mid-run, in his words: "منا مش عايز غير نسخة واحدة فقط لا غير. انجليزي و 16:9 عجبتني ووافقت عليها ... هي نسخة واحدة كاملة من كل شيئ حتى الميوزك والساوند ايفكت وغيره" (I want only one version, nothing else; English and 16:9, I liked it and approved it; one complete version of everything, music and sound effects included). He watched ice/renders/draft-3-en.mp4 and approved its story, scene order, look and pacing; later changes are allowed only where they fix the static, empty last 8 s and the grey placeholder Top result card. The user's newest explicit note outranks earlier notes (ice-film SKILL.md).

      Source: the owner's message relayed by the run coordinator, 2026-10-20; ice/renders/draft-3-en.mp4

    • D-30 Owner feedback round on draft-7 (2026-10-21)

      • option 1, same story, made clearChosen

      Source: the owner's notes relayed by the run coordinator, 2026-10-21; ice/renders/draft-7-en-av.mp4

    • D-32 Which machine plays which part

      • AChosen
      • - A: the car horn is the kick (low hit)
      • the pile driver the backbeat (snare on 2 and 4)
      • the road breaker the hats (eighths)
      • the motorbike the bass (rests on: each machine sound matches its part: a horn is a short low blast
      • a ram is a single heavy hit
      • a breaker is a fast repeat
      • an engine is a low held tone)

      it follows the owner's mapping and keeps the press-to-first-honk handoff (the pressed play circle drops onto the car horn and the horn plays the first kick).

      Source: D-30; ice/plan/storyboard.md revision 5

    • D-33 New length and timing

      • AChosen
      • - A: 36.0 s: noise 0 to 2.9, question 2.9, typing 3.3 to 5.4, Top result card 5.75, press on the first downbeat 7.5, one machine per bar to 15.5, fill, breath 17.5 to 19.5, drop 19.5, the line 23.5 to 27.5, the field returns 27.5, logo 29.5, unofficial line 30.5, last hit 33.5, ring-out to 36.0 (rests on: the owner's timing for the noise and the typing
      • four bars of joining machines
      • the prompt's lower bound)

      it keeps the approved order with the owner's two timing fixes and stays inside the brief's 35 to 60 s.

      Source: ice/plan/storyboard.md revision 5; ice/plan/storyboard-strip-v2.png

    • D-34 The line over the playing street (for the owner's choice)

      • B, chosen by the owner (D-35)Chosen
      • - A: "Pick a song. The street keeps the beat." (rests on: the action you take, then what the street does
      • costs: it says "song" while the card the viewer pressed is labelled "Playlist")
      Why, and its source

      the owner's note asks for a line that explains; B names the cause the viewer saw (the press) and the effect (the noise becomes the beat) and matches the card, where A and C say "song" over a playlist (the approver's note). Reading time by the ice-type rule (letters / 15 + 1.5 s): B 3.6 s, A 3.5 s, C 3.1 s; the line holds about 3.6 s from half in to half out, so each option fits. A and C fit the same two-line layout.

      Source: D-30; ice/plan/style-frames/v2/frame-5-the-line.png; film/js/config.js (COPY.lineParts); ice/plan/script.md (word count and claim test after the rework)

    • D-35 Owner approval round on the reworked plan (2026-10-21)

      • as aboveChosen

      his decisions

      Source: the owner's approval relayed by the run coordinator, 2026-10-21

    • D-36 The jam cars on the groove (fix a)

      • AChosen
      • - A: two horn stabs a bar from the drop: the cars behind the hero honk on the off-beats, steps 6 and 14 of 16 (the "and" of beats 2 and 4), alternating car by car, a second, higher horn voice in the score
      • in the noise they honk out of time with the rest (rests on: the off-beats are free of the kick and the backbeat, so the stabs answer the hero's kick like a horn section
      • one car per stab keeps each honk visible)
      Why, and its source

      the owner asked that the hero stay the kick and the others join where the score supports it; the off-beat steps 6 and 14 are free of the kick and the backbeat (they share their step with the bass and the hats, a mix point for 08b), and they read as cars honking back at the hero.

      Source: D-35; ice/plan/cue-sheet.json (patterns); film/js2/street.js (JAM)

    • D-38 Owner feedback round on draft-9 (2026-10-21)

      • fix all four (D-39 to D-42)Chosen

      his decision

      Source: the owner's notes relayed by the run coordinator, 2026-10-21; ice/renders/draft-9-en-av.mp4; ice/review/gates-draft9/

    • D-39 A shorter, living ending (note 1)

      • AChosen
      • - A: the field returns at 27.5 for one beat pair, the logo cadence at 28.5 (bar 10 beat 3), the unofficial line from 29.0, four seconds of the street playing on the beat under the logo, the last hit at 32.5 (bar 12 beat 3), the ring-out to 35.0 (the film 35.0 s, the prompt's lower bound)
      • the end card camera closer (scale 0.39 instead of 0.342), the logo, field and line re-spaced in the black sky, the street brighter under it with the windows and the lamps pulsing on the beat and the jam answering to the last hit (rests on: the ending from 27.5 is 7.5 s instead of 8.5 s of field and logo over a still street
      • the question 7.5 s on screen, the logo 6.25 s, the unofficial line 6.0 s, all above their reading times
      • the film stays inside 35 to 60 s)
      Why, and its source

      it shortens the ending and makes it play, keeps every required reading time, and keeps the film inside the length the prompt locked; the owner's "a little under 36 s" reads as 35 s, not under it.

      Source: D-38; film/js/config.js (CUE2); ice/plan/cue-sheet.json (re-exported; the 33.5 s sheet of draft-10 kept as cue-sheet-draft10.json); ice/review/stages/07-08-draft10-approver.md (return item A)

    • D-40 A denser jam inside the frame (note 2)

      • AChosen
      • - A: a second row of the jam in the far lane (three cars and vans standing above and behind the hero car, a little smaller for depth), the motorbike moved forward in the far lane between that row and the road works, the wide frames shifted to take in the two rows
      • the jam stabs from the drop cycle through all seven cars, one car per stab (rests on: seven vehicles stacked in two rows read as a jam at a glance in the same width the machines need)

      only the second row puts more cars inside the same frames; cycling the stabs through the seven cars matches the sound, which already plays one car per stab (08a note on draft-9).

      Source: D-38; film/js2/street.js (JAM, order); ice/plan/cue-sheet.json (music.jam)

    • D-42 Peak limiting at or under 6 dB (note 4)

      • AChosen
      • - A: make the score's own peaks smaller instead of limiting them (softer transients at the drop impact and the kick, the jam stabs kept off the bass peak, gentle saturation before the bus), deliver the score with true-peak headroom so the master adds little, and measure the total peak reduction from the unlimited bus to the final master at 6 dB or less (rests on: harshness comes from the limiter working hard
      • a smaller crest needs less of it)

      it keeps the loudness target and removes the cause at the source.

      Source: D-38; ice/audio/score.py (version 5); ice/audio/NOTES.md

    • D-44 Owner approval of draft-11, with one change to the ending (2026-10-21)

      • as aboveChosen

      his decision

      Source: the owner's words relayed by the run coordinator, 2026-10-21; ice/renders/draft-11-en-av.mp4

    • D-45 The black end card and the logo entrance

      • AChosen
      • - A: the empty search field returns over the playing street at 27.5 and holds 4.0 s (the call to action read in full)
      • 31.5 (bar 12 beat 1) to 33.0 the street and the field fade to black together
      • 32.5 to 33.5 the official logo fades up and scales from 0.92 to 1.0 as a whole on an accelerating curve, centred at 768 px (40 percent of the width), landing at scale 1.0 on the final hit at 33.5 (bar 13 beat 1)
      • the exact file holds on #000000 for 1.5 s while the chord rings out to 35.0 (rests on: R-01 motions only
      • the question keeps its reading time
      • the logo lands on a downbeat
      • no pure black frame
      • an end hold within the reading time of a text-less end card
      • 35.0 s). Built first as draft-12 with the landing at 32.5 (the owner asked for about 32.5 s): look.py failed G2 (20 pure black frames, 30.97 to 31.63 s) and G3 (the logo still 2.5 s against 1.77 s), so the landing moved to the next downbeat, one second later
      • draft-13 then failed G3 again (the ease-out tail of the entrance read as held for 3.0 s: the logo is about 7 percent of the frame, so a gentle change stays under the per-frame threshold), so in draft-14 the entrance accelerates into the hit and stops on it, measured end hold 1.47 s
      Why, and its source

      it does exactly what the owner asked with the plainest motion R-01 allows, and keeps the call to action readable before the screen goes black.

      Source: D-44; film/js/config.js (CUE2), film/js/lockup.js, film/js/ui.js, film/js2/street.js; ice/plan/cue-sheet.json (re-exported)

    • D-46 The non-affiliation line leaves the video (owner's decision, 2026-10-21)

      • (b): the film carries no non-affiliation line anywhere; the gallery caption and the landing card carry it in the exact wording "Unofficial concept, not affiliated with Spotify".Chosen
      Why, and its source

      his decision, taken after he was told the risk. It overrides, for this demo only, run condition 3 of DEMO-BRIEF.md (the film no longer ends with the line), RD-01 (placement: not in the film), ledger L4 (the film part) and the label gate of brand-authenticity.md section 10 step 10; every check that asks for the line in the film passes on this point by his decision. The other logo rules stay (R-01: the official file, unaltered, no co-branding, no implied endorsement).

      Source: the owner's words relayed by the run coordinator, 2026-10-21; DEMO-BRIEF.md run condition 3; ice/assets/TRUTH.md RD-01; ice/research/COMPLIANCE.md RD-01

    • D-47 Final approval of draft-14 by the owner (2026-10-21)

      • draft-14 is the approved cut: final render at 1920x1080, English, 16:9, one version; then delivery (ice/renders/final/, ice/review/NOTE.md, a 16:9 English poster still) and the case study export.Chosen
      Why, and its source

      his decision. It confirms the logo landing at 33.5 s with the 1.5 s hold (D-45; the heads-up question is answered by his approval of draft-14), and it closes the "nobody has listened" caveat: the owner listened to the sound.

      Source: the owner's words relayed by the run coordinator, 2026-10-21; ice/renders/draft-14-en-av.mp4; ice/review/stages/07-08-draft14-approver.md

    • D-48 Viewer takeaway, written late at stage 09 (clarity gate)

      • (a): the block "## Viewer takeaway" under the chosen concept in ice/plan/concepts.md, quoted here:Chosen
      • - (a) write the takeaway late, only from text locked at 02 and before read 3, then run a blind read 3 on the delivered master (rests on: clarity-gate.md section 2, the takeaway is a restatement of the locked concept
      • section 3, a new viewer per read
      • the film is unchanged, D-47)
      Why, and its source

      (a) is the only option that tests the delivered film against a target fixed before the read; (b) leaves the gate untested and (c) has no Sells or Offer's job and would match the viewer to words on screen rather than to the concept. Every field restates text locked before read 3 (sources in brackets in concepts.md); nothing is new, so the concept, the film and its approval (D-47) do not change.

      Source: ice/plan/concepts.md "Viewer takeaway"; D-13; D-30; TRUTH.md; BRIEF.md; ice-qa/references/clarity-gate.md sections 2 to 5

    Made in this stage

  2. Stage 02, Concept

    Time not recorded

    Rolescriticconsultantapprover

    Concept D-13 (C2 plus C1 hinge), structure D-14 (crane up with chain reaction); approver PASS second pass

    Decision

    • D-13 Concept

      • mix of C2 (body and hero) with C1's exact question as the hinge, the critic's own recommendation, with the critic's five fixes applied (ice/plan/concepts.md)Chosen
      • - C1: One question
      • 777 million answers (subject world) (rests on: R-01 capture "What do you want to play?"
      • R-02 S-01 figures
      • R-07 open space "interface as main stage")
      Why, and its source

      C2 is the only KEEP (7): one idea, readable muted from frame 0, and its percussion-led score is the most code-friendly in the round; C1's exact Spotify question fixes C2's failed competitor swap. The critic's Arabic condition for the pill was met by capturing Spotify's own Arabic search placeholder on 2026-10-20.

      Source: ice/review/direction/D-13-options.md; R-01, R-02, R-06, R-07, R-08 (2026-10-20); COMPLIANCE.md; TRUTH.md (F1, Arabic interface strings)

    Made in this stage

    • 02-concepts.md

      Concepts pitched and the one chosen

      Concepts: spotify-concept-ad

      Runtime date: 2026-10-20. Stage 02. Decision: D-13 (ice/DIRECTION.md). Options file: ice/review/direction/D-13-options.md. Consultant: ice/review/direction/D-13-consultant.md. Critic: ice/review/direction/D-13-critic.md.

      The round (five pitches, one per path)

      | ID | Path | Concept in one sentence | Critic |

      | C1 | Subject world | Spotify's search field asks "What do you want to play?" and a day answers it, each answer re-scoring the frame, until the field multiplies into 777 million answers | REVISE, 6 |

      Read the whole file: 02-concepts.md
    • 02-TREATMENT.md

      The treatment handed to the build

      Treatment: spotify-concept-ad (The street plays along)

      Runtime date: 2026-10-20 Direction: D-17 (palette D-18, type D-19, sound D-20, motion D-21) Concept: D-13 (structure D-14, opening D-15)

      PAGE

      Problem: the city around you is loud with noise you did not choose: horns, drills, engines, the neighbour's renovation.

      Audience: 18 to 34, in Egypt and the Arab world (Arabic version) and worldwide (English version), on a phone feed that often starts muted, and gallery visitors on a laptop with sound.

      Read the whole file: 02-TREATMENT.md
  3. Stage 03, Script

    Time not recorded

    Rolescriticapprover

    Script EN and AR, versions (6 films plus posters), hooks C plus A; approver PASS second pass

    Decisions

    • D-03 Voice source

      • AChosen
      • - A: Every word on screen in each language
      • with music and sound
      • no voice (fixed default)
      Why, and its source

      No permitted voice source exists; the router's "voice implied, no voice source" rule keeps the film on ice-film, music-led. The cut is built so a voice could be added later without re-cutting.

      Source: run conditions (quoted); ice-motion-director/SKILL.md section 2 "Voice implied, no voice source"; ice-direction/references/questions.md section 2 fixed option set

    • D-14 Structure

      • S-B with S-A's chain reaction as the locking mechanism (the critic's mix), and the critic's five fixes: show the choice (an answer enters the pill and becomes the melody lane), the chain causes the rise and accelerates, importance budget 2 of 8 and peak at 67 percent, a short descent with the street playing under the closing pill, a 2.5D tilting plane with frontal billboards for read wordsChosen
      • - S-A: Lock-in, row by row (chain reaction on a flat grid) (rests on: structure.md section 2 "chain reaction"
      • brand-film.md "Narrative shapes")
      Why, and its source

      S-B is the only KEEP (7): the top-down reveal makes "the street plays along" literal and one camera meets the brand film's transform-not-cut policy; S-A's chain supplies the cause the camera lacked.

      Source: ice/review/direction/D-14-structure-options.md; ice/review/direction/D-14-critic.md; ice-film/references/structure.md sections 2 to 7; film-types/brand-film.md

    • D-15 Opening (first 3 seconds)

      • C mixed with A's dominant horn word, with the hook critic's five fixes (ice/plan/hooks.md)Chosen
      • - A: typography leads
      • one giant noise word slammed across the frame (rests on: concept-menus.md section 3 "A giant word cropped by the frame edge")
      Why, and its source

      the hook critic scored C highest (REVISE 6) as the only first frame a muted viewer reads at once, with an escalating fall into the 5.0 s horn; A's crop is a hard Arabic failure, B has no whole word at frame 0.

      Source: ice/plan/hooks.md; studies ice/renders/studies/opening-*.mp4 and ice/plan/hooks/opening-studies-sheet.png; ice/review/direction/D-15-critic.md

    Made in this stage

    • 03-structure.md

      Structure

      Structure: spotify-concept-ad

      Runtime date: 2026-10-20. Stage 02. Decisions: concept D-13, structure D-14. Critic: ice/review/direction/D-14-critic.md.

      Film type: brand film (D-07), borrowing the app ad's real product moment (Spotify's search field).

      One claim (seven words or fewer, no conjunction): You choose what you play.

      (The treatment does not exist yet at 02; the claim and PAGE lines are taken from the chosen concept here and copied into ice/plan/TREATMENT.md at 05. See PILOT-NOTES, structure.md section 1 problem.)

      Read the whole file: 03-structure.md
    • 03-script.md

      Script

      Script: spotify-concept-ad (The street plays along)

      Mode: Write (no script supplied)

      Language and dialect: two versions. English (plain international, sentence case). Arabic: Egyptian (Cairo) spoken Arabic, polished register (D-11), every on-screen word in Arabic lettering except the Latin name "Spotify" and the English unofficial line (RD-02); transcreated, not translated.

      Length target: 49.0 s (the D-14 beat plan re-timed at 03 so the question and the answer each get about 3 s of reading hold, and extended at 04 so the Arabic end card holds the logo plus both unofficial lines; the film runs 49.0 s in every plan file).

      Word budget: 20 words or fewer per version in total, counting each distinct on-screen string once (the closing question repeats the same string the viewer already read at 5.5 s, so it adds no new reading; brand film text density: manifesto lines word by word, at most 2 lines, about 6 percent of frame height per line). The required unofficial label is exempt from the count (truth-sheet.md section 12: disclaimers are marked and exempt from text counts).

      Read the whole file: 03-script.md
    • 03-hooks.md

      Openings compared

      Hooks: spotify-concept-ad

      Runtime date: 2026-10-20. Stage 03 openings step (ice-film/references/openers-and-endings.md sections 2 to 4).

      Priority test: benefit "the noise around you can become your track"; open question "who wins: the noise, or me?"; payoff at 12.0 s (the play press locks the first noise to the beat) and fully at 31 s (the street as a drum machine).

      Studies: grey blocking, real copy, real candidate fonts (Inter Bold for English, Noto Kufi Arabic 800 for Arabic; type is decided at 05), first 3.2 s, rendered with the HTML capture renderer at half size: ice/renders/studies/opening-<A|B|C>-<en|ar>.mp4; stills at 0, 1 and 3 s: ice/plan/hooks/opening-studies-sheet.png. The studies are built in isolation from the film; their timing may differ from the final cut.

      | Opening | Leads with | Frame 0 | By 1 s | By 3 s | Heard | Muted read | Choice notes |

      Read the whole file: 03-hooks.md
  4. Stage 04, Storyboard

    Time not recorded

    Rolescriticapprover

    drawn-street rework (D-30): storyboard rev 5, shot-plan rev 5 with 15 contracts, strip as the staging board; approver second check ice/review/stages/04-05-rework-approver.md

    Decisions

    • D-37 A closer camera and a taller street (fix b)

      • AChosen
      • - A: tighten the layout (the motorbike in the far lane right above the hero car, the pile rig on the site right above the breaker, the jam running out of frame to the left), raise the buildings behind the action to just under the end card's limit, and raise the camera scale: about 1.1 on the opening car, 0.85 to 1.0 on each machine as it joins, about 0.72 when all four play
      • the end card stays at 0.342 (rests on: the machines fill the frame and the frame top meets facades instead of sky, while the end card keeps its whole street)

      only A answers both halves of the note (machines larger in the frame, less empty sky); B and C each move the emptiness or leave the machines small.

      Source: D-35; ice/plan/style-frames/v2/ (updated); film/js2/street.js (camera keys)

    • D-41 Camera movement while the machines join (note 3)

      • AChosen
      • - A: a slow push toward each machine through its joining bar (the breaker 9.5 to 11.0, the pile rig 11.6 to 12.7 with the tilt kept, the motorbike 13.6 to 15.3), a travel between them, then a pull out to the band for the fill with a slow drift to 17.5 (rests on: each push names the new player
      • nothing holds still more than half a second)

      the owner named a push or a drift toward each machine; A does exactly that inside the one-camera grammar.

      Source: D-38; film/js2/street.js (KEYS)

    Made in this stage

    • 04-storyboard.md

      Storyboard

      Storyboard: spotify-concept-ad (The street plays along), revision 5 with the owner fixes (D-35), the draft-9 notes (D-38) and the black end card (D-44 to D-46)

      The owner approved draft-11 and changed the ending (D-44): the end card is a fully black screen where the official Spotify logo enters with a fade and a 0.92 to 1.0 scale and lands on the final hit (D-45); the film carries no non-affiliation line, which lives in the gallery caption and the landing card (D-46). The storyboard as it stood for draft-11 is kept in storyboard-draft11.md.

      After draft-9 the owner asked for four fixes (D-38): a shorter, living ending (D-39: the film is 35.0 s, the prompt's lower bound; the field returns for 1 s, the logo card from 28.5, the last hit at 32.5, the ring-out to 35.0, the end card closer with the street playing on the beat), a denser jam inside the frame (D-40: a second row of three cars and vans in the far lane, the stabs cycling one car per stab), camera pushes toward each machine as it joins (D-41) and less limiting at the drop (D-42, sound). The storyboard as it stood for draft-9 is kept in storyboard-draft9.md.

      The owner approved revision 5, the six style frames, line B and 36.0 s (D-35), and asked for two fixes folded in before the build: a row of cars standing in a jam behind the hero car (D-36: the hero keeps the play circle and the kick; the cars behind it answer on the off-beats from the drop) and a closer camera with much less empty sky (D-37: taller buildings behind the action, the motorbike in the far lane right above the hero car, scales 0.7 to 1.1 instead of 0.56 to 0.75). Revision 5 as approved is kept in storyboard-rev5.md.

      Revision 5 answers the stage 05 rework critic (ice/review/rework-04-05-critic.md, REVISE with 5 fixes) on revision 4, which answered the owner's feedback round on draft-7 (D-30, 2026-10-21): the same story, made clear. The street is a real drawn street built in code (D-31); every sound comes from a visible machine; the search answer is typed letter by letter; after the press the same machines play the song (D-32); the abstract lane grid is gone. What revision 5 changes: the machines are drawn 1.6 times larger and stand close together (the pile rig on the site right above the breaker, the motorbike in the far lane right after it), so all four fill the wide frames; the pile rig is redrawn with its pile going into the ground, a flash where the ram meets the pile and dust where the pile goes in; the site has solid hoarding instead of thin scaffold bars; the extra parked cars are gone; every word sits next to its source with a black outline; the line is rewritten so it explains the idea (D-34, for the owner to choose); the end card puts the logo, the field and the required line in a pure black sky above the rooftops with the whole street below (no floating panel, no light blobs). Revision 4 is kept in storyboard-rev4.md, revision 2 in storyboard-rev2.md.

      Read the whole file: 04-storyboard.md
    • 04-shot-plan.md

      Shot plan

      Shot plan: spotify-concept-ad (shot contracts), revision 5 with the owner fixes (D-35 to D-37) and the draft-9 notes (D-38 to D-41)

      The contracts below hold for draft-14: the film is 35.0 s; shots 13 to 15 are re-timed (27.5 to 31.5, 31.5 to 33.5, 33.5 to 35.0; the end card is the logo alone on black, D-44 to D-46); shots 6 to 9 carry the camera pushes of D-41; the jam has a second row in the far lane (D-40). The draft-9 contracts are kept in shot-plan-draft9.md.

      One composition: film/v2-en-16x9.html loading film/js/util.js, config.js, ui.js, lockup.js and film/js2/street.js, main.js (one continuous timeline; shots are time ranges of one camera along a drawn street). English 16:9 only (D-28). Times in seconds at 30 fps, from storyboard.md revision 5 (D-33). Richness values are measured on the stills of the real build with ice-qa's own area function (film_gate.area_features, 320 px grey; temp/v2o/v2-en-16x9/), and for type and interface heroes as hero_width, the hero text or interface width over the frame width. Every camera entry gives its reason. The revision 3 contracts of the lane-grid world are kept in shot-plan-rev3.md.

      | Shot | Time | Claim and evidence | Start state | Decisive state | Handoff state | Focal owner | Motion verb | Camera window and reason | Layer manifest (back to front) | Alive | Richness (hero_share / frame_fill of 16 / depth) | Cues | Assets | QA checks |

      | 1 | 0.0-2.9 | none (situation) | close on the grey honking hero car at frame 0, the jam behind it, the motorbike above, HONK in front of it | 2.62: the whole noisy block, the loudest horn, all four machines and their words in frame (frame-1) | the field rises at 2.9 as the street dims | the honking car, then the whole street | fire, pull back | 0.0 to 2.5: pull back from scale 1.1 on the hero car and the jam behind it to 0.7 on the block; reason: find the noise, then show all of it | sky, far skyline (parallax), buildings and site, road and lamps, machines, words | the four machines fire out of time, words pop and fade, the camera pulls back | 91 at 0.3 and 100 at 2.62 / 16 / 4 | horn 0.0, 0.7, 1.4, 1.9, 2.6 (loudest); breaker 0.3, 1.1, 2.0; ram 0.5, 1.25, 2.2; engine 0.15, 1.6, 2.4 | none | frame 0 readable; every read word whole inside the 5 percent margins; no face |

      Read the whole file: 04-shot-plan.md
  5. Stage 05, Look

    Time not recorded

    Rolesapprovercriticconsultant

    drawn-street look D-31 (gates: default look pass, 4 of 6 vs 01-flat-vector, default kit 2 with reasons); six style frames in ice/plan/style-frames/v2/; D-34 line left for the owner; approver second check ice/review/stages/04-05-rework-approver.md

    Decisions

    • D-07 Film type

      • A, Brand filmChosen
      • - A: Brand film, borrowing the app ad's "real product moment" (rests on: brand-film.md Fit and Purpose "a feeling the brand owns"
      • Timing master music-led by default
      • Deliverables 16:9 master with 9:16 and 1:1 re-laid out)
      Why, and its source

      The asked 35 to 60 s length and an unofficial concept with no CTA badge fit the brand film's purpose (a feeling Spotify owns) and its music-led timing master; the app ad's strength, the real product doing its job, is borrowed as one or two rebuilt UI moments from Spotify's public pages with neutral content, so the film still shows the product.

      Source: brief slots duration, real_brand (prompt); D-02; D-03; ice-film/references/film-setup.md section 1 ("Two types fit: pick the one whose purpose matches the goal, borrow parts of the other, log it"); film-types/brand-film.md and app-ad.md (Fit, Purpose, Rhythm ranges, Truth and content, Deliverables)

    • D-17 Direction (the look)

      • A, with the critic's five fixes: (1) at 34 s the locked lanes fold into Spotify's Browse all tile layout under the search field (the street becomes Spotify's own search page); (2) no red: lanes coral #FFA178 (horn, first flood), olive #608108 (hammer), mint #91EEDA (drill), slate #477D95 (engine); (3) light carries the choice: overhead lamps on wires at 1.25x parallax, #2A2A2A until their lane locks, then a 600 px pool of the lane colour at 30 percent over the grain; (4) default kit cut to 2, logged (D-22): the answer lands whole; (5) Arabic read words in IBM Plex Sans Arabic Bold at 1.35x the Latin size, texture at 56 px minimum; the end card on #000000Chosen
      • - A: Night shift: Spotify's dark interface becomes the street
      • each locked lane takes one of Spotify's own browse colours (rests on: brand sheet, browse tile captures, R-04, R-06)
      Why, and its source

      A is the only direction that serves the claim with its own mechanics (grey until your press, colour only on a lock) and looks like Spotify's own interface and browse colours made better; B is inherited from the risograph entry (3 of 6 axes) and fails contrast on cream; C is the category convention and inherited from Swiss Motion (2 of 6).

      Source: ice/review/direction/D-17-options.md; D-17-consultant.md; D-17-critic.md; R-01 S-02 (2026-10-20); R-04 S-03, S-04; brand-sheet.json; assets/capture/spotify/webplayer-search-en (browse tiles)

    • D-18 Palette

      • BChosen
      • - A: dark ground with four browse colours
      • red led (coral
      • olive
      • mint
      • red) (rests on: D-17 options A)
      Why, and its source

      removing red moves the nearest Apple Music red from dE 4.2 to dE 15.2, removes the pan-Arab flag set, and raises the worst lane pair in colour-vision simulation from 4.9 to 6.7 (critic, consultant measures); lanes also differ by position and word, never by colour alone.

      Source: D-17-critic.md fix 2; D-17-consultant.md (measurements); captures browse tiles (#477D95, #608108), Premium page (#FFA178, #91EEDA)

    • D-19 Type

      • A, with Arabic read words at 1.35x the Latin size (Plex Arabic body is 69 percent of Figtree's x-height at equal visible height) and Arabic texture words at 56 px or moreChosen
      • - A: Figtree 700 and 500 (Latin) with IBM Plex Sans Arabic Bold and Regular (Arabic) (rests on: shape overlap 0.310 Latin
      • 0.393 Arabic
      • the best Arabic echo of CircularSp-Arab)
      Why, and its source

      A carries the direction's friendly geometric voice in Latin and the closest independent echo of Spotify's own Arabic site type; the size factor fixes the weight gap the consultant measured. B's Latin is inherited from the rejected direction; C's Arabic line box is smaller than its ink and clips marks.

      Source: temp/fontmatch measurements (D-17-options.md); D-17-consultant.md; R-05; type-pairing.md sections 1 to 6

    • D-21 Motion language

      • A (ice/plan/motion-plan.md)Chosen
      • - A: one continuous camera
      • locks on the beat
      • colour and light arrive with the lock
      • no cuts (rests on: D-14
      • brand-film.md transition policy)

      the brand film transition policy asks that nearly every transition turns the current object into the next; one camera keeps the chain causal.

      Source: ice/plan/motion-plan.md; brand-film.md; D-14

    • D-31 The street world: a drawn night street (look, stage 05 rework)

      • AChosen
      • - A: a flat-vector night street in side view (buildings, lamps, a construction site, a car, a road breaker on a small excavator, a pile driver, a motorbike with a helmeted rider), one continuous camera travelling along it, a far skyline in parallax (rests on: every source is seen whole and at once
      • it reads on a phone
      • it builds as SVG shapes from code
      • the camera can travel to each machine as it joins)
      Why, and its source

      it answers the owner's note directly (a street you recognise, every sound visible) and keeps the film's grammar (one camera, colour arriving on each lock). Grey before the press, each machine taking its lane colour when it joins, the windows as the street equalizer at the drop.

      Source: D-30; ice/plan/style-frames/v2/ (six frames from the real build: film/v2-en-16x9.html, film/js2/street.js); ice/plan/storyboard-strip-v2.png; ice/plan/storyboard.md revision 5

    Made in this stage

  6. Stage 06, Animatic

    Time not recorded

    Rolesdirectorapprover

    drawn street: cue sheet rebuilt and locked (46 events, 17 grid anchors checked, typing keys, jam steps 6 and 14 from the drop); timed stills board of 15 settled stills at or above the floor; lint YELLOW exit 0 with reasons; D-36 and D-37 approved; ice/review/stages/06-drawn-street-approver.md

    Made in this stage

    • 06-cue-sheet.json

      Cue sheet

      {
        "locked": true,
        "locked_at": "2026-10-21 (stage 06, the drawn street; re-timed at 07 for D-39)",
        "project": "spotify-concept-ad",
        "version": "en",
        "fps": 30,
        "duration": 35,
        "mode": "music-led",
        "note": "The drawn street (D-30 to D-37): free-time noise 0 to 3.0 s, the search and the typing in a quiet street bed to the press, then a 120 BPM grid from the first downbeat at 7.5 s. Exported from film/js/config.js and film/js2/street.js by temp/tools/export-cues-v2.mjs; the build, the score and the checks read this file, never retype it. The lane-grid sheet is kept as cue-sheet-v1.json.",
        "music": {
      Read the whole file: 06-cue-sheet.json
  7. Stage 07, Build

    Time not recorded

    Rolesapprovercritic

    draft-14 (black end card, D-44 to D-46): cue sheet re-exports identically, stills at every cue, G5 PASS, look G2 and G3 PASS, Final Frame Contract 0 px on the whole frame; D-45 approved with the 33.5 s landing awaiting the owner's confirmation; ice/review/stages/07-08-draft14-approver.md

    Decisions

    • D-23 Engine

      • BChosen
      • - A: HyperFrames (row 8 default) (rests on: engine-choice.md section 1)
      Why, and its source

      HyperFrames is not installed and the run allows no installs; rung C renders the same page contract with Chrome 149 and FFmpeg 8.1 already on the machine; the 7.5 replacement gates apply.

      Source: engine-choice.md sections 1, 7.2, 7.4, 7.5; render-html.mjs first lines: "driver built-in Chrome DevTools driver, browser C:\Program Files\Google\Chrome\Application\chrome.exe", "browser version Chrome/149.0.7827.102"

    • D-27 Compositing mode for every render

      • BChosen
      • - A: GPU compositing (the default) (rests on: speed
      • measured at 07: the last frame differed from the static logo by up to 28 of 255 on 7,800 to 8,700 edge pixels in 16:9 and 9:16, and by 1 of 255 on 14 to 26 pixels after a fix, changing from run to run with what had been composited before)

      the frame then depends only on t, as the build rules require, and the end lockup lands exactly on the official logo in every version.

      Source: ice/review/final-frame/result.json; temp renders ffc to ffc5 and cues6 to cues7

  8. Stage 08, Sound

    Time not recorded

    Rolescriticapprover

    master on draft-14: -14.0 LUFS, -1.4 dBTP, LRA 7.4, mono -17.2, no gaps, hits on cue incl. the final hit at 33.5; D-42 5.04 dB; ice/review/stages/07-08-draft14-approver.md

    Decisions

    • D-20 Sound lead and music source

      • A, logged as a code-made stand-in for a licensed human-made track (named in the delivery note as what a yes to a library download would add)Chosen
      • - A: score led, composed by code with the project copy of mgaudio: a groove built from the street's own machines (horn as a low brass stab with the low hit, hammer as the backbeat, drill as the hats, engine as the sub bass), a lead playing the film's motif
      • Arabic version in maqsum, English in a straight four, both at 120 BPM
      • the noise section as sound design (rests on: D-13 critic fix 1
      • ice-audio section 5 code score when no license-safe download is allowed)
      Why, and its source

      the film's claim is that the noise becomes your music, which only a score built from the same sounds can show; it is license-clean and locked to the cue sheet; C is blocked by the run conditions.

      Source: ice-audio/SKILL.md section 5; music-choice-and-licensing.md section 2 (music brands row; downloads not allowed row); D-13-critic.md fix 1

    • D-29 Loudness profile and the score's loudness-range guard

      • AChosen
      • - A: Social and web, punchy: -14 LUFS, at or under -1 dBTP on the encoded file, LRA at most 9 to 11 LU
      • the 5 to 8 LU music guard read on the music body (12 to 41 s), the whole-film LRA held to the profile (rests on: D-06 feeds and an energetic film
      • measured: EN master -14.3 LUFS, -1.1 dBTP, LRA 8.4
      • score v2 whole film 8.63 LU, body 4.58 LU)
      Why, and its source

      the film plays mostly in feeds (D-06), where -14 is the loudness of the content around it, and the whole film sits inside the profile's LRA (8.4 LU on the encoded master). The music guard's band (5 to 8 LU) is not met either way: the whole film reads 8.63 LU (0.63 over, because of the declared quiet stretches) and the music body, 12 to 41 s, reads 4.58 LU (0.42 under: a steady groove). Both figures are reported in the delivery note as an open guard item. The deliberate quiet stretches are what pushes the whole-film figure over 8; filling them would remove the cold-open silence and the breath. Listed in the delivery note with the numbers.

      Source: ice/audio/qc_en_v2.json; ice/audio/master_draft4_en.json; ice/review/mix-08b.md; ice/review/stages/08-approver.md

    • D-43 The code score's arc guard and body LRA after the owner's draft-9 round

      • AChosen
      • - A: keep version 6 and record the three results with their reasons: the final hit sits 2.5 s before the last frame because the owner asked for the ending to land a hit and stay alive, so it falls inside the last 3 s window
      • in a 35 s film the line and the cadence sit at 67 to 81 percent by the locked timing, so the last fifth starts inside the line
      • the narrower body is the price of 5.6 dB of total limiting instead of about 9 (D-42) (rests on: each failing clause follows from an owner decision
      • the listener-facing profile, D-29, is met)
      Why, and its source

      the guard protects against endings that fade into nothing and bodies that never breathe; here the owner asked for the opposite of a fade, and the limiting he asked to reduce is what narrowed the body; the master meets D-29 (-14.0 LUFS, -2.2 dBTP, LRA 7.4).

      Source: ice/audio/qc_en_v6.json; ice/audio/NOTES.md (Version 6); ice/audio/peak_reduction_en_v6.json; ice/review/stages/07-08-draft10-approver.md (item B)

    Made in this stage

    • 08-sound-plan.md

      Sound plan

      Sound plan: spotify-concept-ad (The street plays along), stage 08a

      Built by `ice/audio/score.py` (one script, `--lang en|ar`) with the project copy of mgaudio (MIT), every time read from `ice/plan/cue-sheet.json` (locked, not retimed). Clock: music-led, 120 BPM, bar 0 = the press at 12.0 s, 4/4, a 16th = 0.125 s; 0 to 12.0 s free time. Outputs: `ice/audio/soundtrack_en.wav`, `ice/audio/soundtrack_ar.wav` (48 kHz, 24-bit, stereo, 2,352,000 samples = 49.000 s), stems in `ice/audio/stems_en/` and `ice/audio/stems_ar/` (pre-master, written at -6 dB), `score_spec_en.png`, `score_spec_ar.png`, `beatgrid.png`, measured reports `qc_en.json`, `qc_ar.json`, `beatgrid.json`.

      Version 2 (section 7, the director's follow-up for the social-profile LRA): `soundtrack_en_v2.wav`, `soundtrack_ar_v2.wav`, `stems_en_v2/`, `stems_ar_v2/`, `score_spec_en_v2.png`, `score_spec_ar_v2.png`, `beatgrid_v2.png`, `qc_en_v2.json`, `qc_ar_v2.json`, `beatgrid_v2.json`, rendered with `python ice/audio/score.py --lang en --v2` (and `--lang ar --v2`, `--v2 --beatgrid`). Version 1 files are unchanged (checksums verified after the v2 renders). Sections 1 to 6 describe version 1; section 7 lists what version 2 changes and its measured numbers.

      This is the 08a score and SFX pass. The final mix on the picture, the exported MP4 measurement and the human listening check belong to 08b and 10. Nothing below is a claim about how it sounds: every number is measured, and no one has listened yet.

      1. The four machines are the kit

      Read the whole file: 08-sound-plan.md
  9. Stage 09, Review

    Time not recorded

    Rolescriticdirectorapprover

    round 4 on the approved cut: critic A SHIP (5 P2), critic B SHIP (2 P3); clarity read 3 PASS r5, a blind viewer on the delivered master: 'Press play and the noise around you turns into music.' (the round-4 read is void); brand film QA: brand test FAIL 0 of 6, competitor swap FAIL (36 percent Spotify-specific), transitions PASS, value flips PARTIAL, listed for the owner; one encode fix R4-01 (bt709 tags); ice/review/stages/09-10-approver-r2.md

    Made in this stage

    Critic rounds

    1. Round 1REVISE

      • Critic A: 1 P0, 9 P1, 8 P2
      • Critic B: 1 P0, 8 P1, 6 P2
      • Critic C: 1 P0, 7 P1, 7 P2
      • Fixes R1-01 to R1-20 in fixes.json; the frame-0 horn fade and the end card were the blockers
    2. Round 2ONE MORE PASS

      • verify-1: SHIP
      • verify-2: ONE MORE PASS (the end card: street luma, the groove on the cells, the playhead, the field before 41.0)

      Fixed

      • Round 1 items: fixed or partly fixed, per verify-1.md and verify-2.md tables
    3. Round 3ONE MORE PASS

      • verify-3: ONE MORE PASS (the end card playhead, a cut grey cell, the final flash)
      • Fixes R3-01 to R3-03 in fixes.json; then the owner's redirect at draft-7 (D-30) replaced this world with the drawn street

      Fixed

      • Round 2 items: per verify-3.md table
    4. Round 4SHIP

      • Critic A (picture): SHIP, no P0 or P1, five P2 logged (off-frame sources in the first 1.25 s, two words 10 px past the 5 percent margin, the motorbike faces the other way, no motion blur on four fast moves, missing bt709 tags)
      • Critic B (sound and sync): SHIP, no P0 to P2, two P3 logged (machine pulses one frame after the kick, 1.9 dB mono loss in the last second)
      • First cold viewer (clarity read 3): VOID, it opened the draft by its project path and the critics' labelled packet, and no takeaway existed to match (ice/review/clarity/read-3-cold-viewer.md); the read that counts, read-3-r5 on the delivered master, ran after this round (ice/review/clarity/read-3-r5.md and its match)
      • One fix applied without changing the film: bt709 colour tags on the final master (R4-01)

      Fixed

      • Earlier rounds 1 to 3 judged the lane-grid world that the owner replaced (D-30)
  10. Stage 10, Deliver

    Time not recorded

    Rolesdirectorapprover

    final 1920x1080 30 fps 35.00 s, rendered in order from frame 0 with one worker, bt709, -14.0 LUFS, -1.4 dBTP, LRA 7.4, last frame 0 px against the static logo page; poster and six stills; NOTE.md with the D-46 wording, the permissions and the QA fails; fingerprint in ice/review/fingerprint.jsonl (home store not written); ice/review/stages/09-10-approver-r2.md

    Made in this stage

    • 10-NOTE.md

      Delivery report with measured numbers

      spotify-concept-ad: delivery report (2026-10-21)

      Status: reviewer approved (stage 09 round 4: two fresh critics SHIP; clarity read 3 PASS r5, a blind viewer on the delivered master, in its own words: "Press play and the noise around you turns into music."), approved by the owner on draft-14 (D-47). Two brand film QA thresholds fail on the approved cut (brand test, competitor swap; see Gates), logged for the owner, not fixed, because a fix changes the approved film.

      File: ice/renders/final/spotify-concept-ad_street_16x9_35s.mp4 sha256 d206ae58123e3bf71764a6be0d17853c2000b4b5f127725eab0dff50a87f2784 1920x1080 30 fps 35.00 s h264 (bt709) / aac 48 kHz stereo

      Other deliverables: poster ice/renders/final/spotify-concept-ad_street_16x9_poster.jpg and .png (1920x1080, the drop at 20.2 s); six key stills ice/renders/final/stills/ (2.67, 8.20, 20.20, 22.30, 25.00, 34.97 s); the same master with its version in the name ice/renders/spotify-concept-ad_street_16x9_35s_v1.mp4; the case study ice/case-study/. One version only: English, 16:9 (the owner's decision, D-28); no Arabic version, no 9:16 or 1:1 re-layouts, no cutdowns.

      The non-affiliation line (D-46)

      Read the whole file: 10-NOTE.md
    • Still from the delivered film at 0.00 s
    • Still from the delivered film at 17.50 s
    • Still from the delivered film at 34.90 s
    • Delivered still spotify-concept-ad_street_16x9_poster.jpg
    • Delivered still spotify-concept-ad_street_16x9_poster.png
    • Delivered still spotify-concept-ad_street_16x9_01-noisy-street_2.67s.jpg

The conversation

Every message between the owner and the agent, in order. The owner's words are verbatim; the agent's replies are summarised by the export.

  1. OwnerStage 01

    اعمل إعلان لسبوتيفاي، مدته من 35 ثانية لدقيقة، ونسخة عربي ونسخة إنجليزي.

  2. OwnerStage 01

    انا هنام فا معناه متتوقفش لأي اسئلة لاني مش هرد

  3. IceStage 01

    تمام، مش هقف لأي سؤال. الإعلان هيمشي في الوضع التلقائي، وكل قرار هيتاخد بالبحث ويتسجل بسببه ومصدره.

  4. OwnerStage 01

    اكمل من حيث توقفت

  5. IceStage 01

    الشغل كان واقف من بعد البداية بشوية لأن الليمت خلص، ورجع يكمّل من نفس النقطة في المرحلة الأولى.

  6. OwnerStage 07

    بقالك قد ايه وقت! وايه اللي وصلتله

    صورة شاشة اتلصقت في الشات، ومحتواها ما اتسجلش.

  7. IceStage 07

    المراحل من 01 لـ 06 اتوافق عليها: البريف، والكونسبت، والسكريبت، والستوري بورد، والشكل، والأنيماتيك. البناء والمزيكا شغالين، واتبعتت لوحة الـ stills بالـ 13 مشهد.

  8. OwnerStage 07

    الليمت اتجدد اكمل

  9. IceStage 07

    الإعلان رجع يكمّل البناء من نفس النقطة.

  10. OwnerStage 07

    ايه حصل بخصوص الاعلان

  11. IceStage 07

    اتبعت draft-3 الإنجليزي وصفحة فريماته، ومعاهم رأي صريح: آخر 8 ثواني ساكنة وفاضية، وكارت Top result لسه رمادي ومؤقت، والمكساج النهائي لسه ما خلصش.

  12. OwnerStage 07

    انت بتعمل ال3 نسخ مع بعض ولا النسخة الاول بس؟

  13. IceStage 07

    العربي والإنجليزي بيتبنوا مع بعض من نفس الكود، والخطة 6 نسخ: لغتين في 3 مقاسات. مقاس 16:9 وصل لـ draft-4، و1:1 و9:16 بيتعاد توزيعهم.

  14. OwnerStage 07

    منا مش عايز غير نسخة واحدة فقط لا غير انجليزي و 16:9 عجبتني ووافقت عليها نبدا نكمل الباقي سواء عربي او ابعاد اخرى هي نسخة واحدة كاملة من كل شيئ محتى الميزوك والساوند ايفكت وغيره

  15. IceStage 07

    العربي ومقاسات 9:16 و1:1 اتلغوا. هتتسلم نسخة واحدة بس، إنجليزي 16:9، كاملة بالمزيكا والمؤثرات والمكساج والمراجعة والـ case study، وبنفس شكل draft-3 اللي اتوافق عليه.

  16. OwnerStage 07

    تمام مستنى

  17. OwnerStage 09

    انا عايز اعرف بجد كل الساعات دي بتضيف ف ايه انت لو انسان هتعمل الفيديو يدوي مش هياخد الساعات دي كلها!

  18. IceStage 09

    من حوالي 20 ساعة، الشغل الفعلي كان حوالي 6 ساعات، والباقي وقفات بسبب الليمت. الوقت راح على 6 نسخ، ومراجعة بعد كل مرحلة، والتوثيق، ودورات الرندر والمراجعة، ومزيكا متألفة بالكود. واتعرض تخفيف الـ workflow.

  19. OwnerStage 09

    لا، سيبه زي ما هو

  20. IceStage 09

    الـ workflow هيفضل بعمقه الكامل، والقرار اتسجل في قواعد الريبو.

  21. OwnerStage 09

    باقي قد ايه عالفيديو

  22. IceStage 09

    حوالي ساعة. الإعلان في جولة المراجعة التانية على draft-7، وبعدها الرندر النهائي والتسليم.

  23. OwnerStage 09

    ايوه بس انا كنت عايزك تتابع معايا اول باول وتوريني الشغل اول باول وابقى متابع عشان حتى لو عايز تعديلات فالنص الحقها بدل ما اشوف النتيجة النهائية واتصدم بعد يوم عمل كامل

  24. IceStage 09

    اتبعت draft-7 بالصوت وصفحة فريماته، ومعاهم اللي اتغير من draft-3 واللي لسه ضعيف. من دلوقتي الشغل بيقف بعد كل draft، ومفيش رندر نهائي قبل ملاحظات المستخدم.

  25. OwnerStage 09

    Tekintas استخدمت السكيلز او كل حاجه موجوده في الريمو يعني المفروض ان دي ساس مثلا سبوتيفاي وتقنيه والكلام ده كله اللي انا ملاحظه كيوزر عادي بيشوف الاعلان طويل جدا اللي هي بتاعت الهايند والهارد وبعد كده الكتابه في السيرش بار فجاه النص ظهر ما اتكتبش كتابه يعني ما ظهرش كلمه او حرف بعد كده ظهر الاغنيه تمام كويس نزل على التشغيل حولني على فريم في ثلاثه اللي هو بارت وبانج وبارد وايكونت البلاي عماله تمشي عليهم وتشرحش الفكره على كده ستريت بلاي بلايز الون عايز ان

  26. IceStage 09

    الـ router صنّف الإعلان brand film مش app ad، وده سبب إنه طلع مجرد. الفريمات أكدت إن نص البحث بيظهر مرة واحدة عند 8.8 ثانية بعد 3 ثواني المؤشر واقف فيهم. الرسالة كانت مقطوعة، فاتطلب تكملتها.

  27. OwnerStage 09

    وفريمات الدوشة وبعد البحث وتشغيل الاغنية مش بتعبر بشكل فعلي عن المطلوب

  28. IceStage 09

    مشهد الدوشة ومشهد ما بعد التشغيل مجردين ومش بيوصّلوا الفكرة. اتعرض حلين: نوضّح نفس الفكرة بشارع مرسوم، أو نحوّل الإعلان لـ app ad.

  29. OwnerStage 09

    نمشي بالحل الأول: نفس القصة بس واضحة، شارع مرسوم بجد بعربيات وموتوسيكل وشنيور، الكتابة حرف حرف، والشارع نفسه بيعزف بعد التشغيل. ابعتلي style frames الأول قبل البناء.

  30. IceStage 09

    الملاحظات والقرار اتبعتوا: شارع مرسوم بالكود، والدوشة حوالي 3 ثواني، والكتابة حرف حرف، والشارع بيعزف بعد التشغيل. الـ style frames هتيجي الأول قبل أي بناء.

  31. IceStage 05

    اتبعتت 6 style frames والـ storyboard الجديد، والمدة 36 ثانية. الفكرة بقت مفهومة، وفيه نقطتين ضعف: عربية واحدة مش زحمة، والحاجات صغيرة في الكادر. واتعرضت 3 جمل للشارع وهو بيعزف.

  32. OwnerStage 05

    موافق على الفريمات بالجملة B. صلّح النقطتين: صف عربيات واقفة في الزحمة، والكاميرا تقرّب عشان المكن يملا الكادر. مدة 36 ثانية كويسة. ابدأ البناء وابعتلي أول draft.

  33. IceStage 05

    البناء بدأ بالتصليحين، وأول draft بالصوت هيتبعت قبل أي رندر نهائي.

  34. OwnerStage 08

    خلصت المطلوب خلاص والريبو جاهز يبقى عام على جيت هاب واثبته على نسخة جديدة من كلود

  35. IceStage 08

    اتبعت draft-9 بالصوت (36 ثانية) وصفحة فريماته: زحمة عربيات، والكتابة حرف حرف، والمكن بيدخل واحدة واحدة على الإيقاع، والشبابيك بتنور عند الـ drop. لسه ضعيف: النهاية حوالي 9 ثواني هادية، والزحمة لسه خفيفة، والصوت متقاس بس ومحدش سمعه، والـ limiting عالي عند الذروة.

  36. OwnerStage 08

    صلح الملاحظات الاربع عالفيديو وعايز اصلح ال 5 مشاكل دول: 1. الإعلان الأول لسه ما خلصش: قسم الـ gallery في الـ README مكتوب فيه “The gallery is being rendered”. يعني أهم دليل على الجودة لسه فاضي. وإعلان سبوتيفاي نفسه بيّن إن الوعد الأساسي لسه مش متحقق: البرومبت الواحد طلّع إعلان مجرد اليوزر العادي مش فاهمه، واحتاج تدخلك. 2. 21 مشكلة اتسجلت في الـ skills أثناء الإعلان: منهم 7 كبار و14 صغيرين، ولسه ما اتصلحوش. من الكبار: * سكريبت الصوت بيعمل fade-in إجباري 1.5 ثانية، وده اللي خلّى أول الإعلان ساكت. * سكريبت الرندر بيقف 5 دقايق من غير ما يقول السبب، لو ملف برا الفولدر. * الرندر بالـ GPU بيطلّع نفس الفريم بشكل مختلف. * سحب شكل البراند مش بيعرف يختار لغة الموقع. * فحص في الجودة بيقرا المشاهد الـ 3D غلط. * وأهمهم: مفيش أي فحص قبل البناء بيتأكد إن المشاهد العادي هيفهم الفكرة. دي بالظبط المشكلة اللي انت لاحظتها. 3. التجربة الكاملة ببرومبت واحد على Claude نضيف لسه ما اتعملتش: محتاجة تسجيل دخولك، وهتاكل من نفس الليمت. 4. ملفات الصيانة فيها مسارات من جهازك: زي `_motion-sources`، ومحتاجة تتنضف. 5. الـ CI بيقع أحيانًا: على بعض أجهزة GitHub مكتبة Python بتقع أثناء الاستيراد.

  37. IceStage 08

    الملاحظات الأربعة اتبعتت: نهاية أقصر وحية، وعربيات زحمة أكتر جوه الكادر، وحركة كاميرا من 9 لـ 18 ثانية، وضغط أقل عند الذروة. draft-10 هيتبعت قبل أي رندر نهائي، وتصليحات الـ skills بدأت بالتوازي.

  38. OwnerStage 08

    Try again

  39. IceStage 08

    اتبعت draft-11 بالصوت (35 ثانية) وصفحة فريماته بعد الملاحظات الأربعة: صفين عربيات في الزحمة، والكاميرا بتقرب من كل ماكينة وهي داخلة، ونهاية 6.5 ثانية بدل 9، والضغط عند الذروة 5.65 dB. draft-10 كان 33.5 ثانية فاترفض عشان المدة المطلوبة من 35. الصوت لسه محدش سمعه.

  40. OwnerStage 08

    جيد جدا فقط النهاية احذف جملة انه غير نصي وخلي الشاشة كلها سوداء واللوجو بتاع سبوتي فاي يظهر بانيميشن

  41. OwnerStage 08

    التصليحات بتاعت الريبو كلها تمت وان هو دلوقتي جاهز انه يستعمل على البرودكشن.

  42. IceStage 08

    النهاية بقت شاشة سودا واللوجو بيظهر بحركة من غير ما يتعدل. اتسأل المستخدم عن مكان جملة عدم التبعية: سطر صغير في الأول، أو تتشال من الفيديو وتفضل في وصف الـ gallery بس. واتوضح إن تصليحات الريبو خلصت ونجحت في الـ tests، بس محتاجة تجربة كاملة ببرومبت واحد قبل ما نقول إنها جاهزة للاستخدام الفعلي.

  43. OwnerStage 08

    اشيل جملة غير رسمي من الفيديو خالص، وخليها في وصف الـ gallery وكارت صفحة الهبوط بس، وعدّل القاعدة في AGENTS.md.

  44. IceStage 08

    الجملة اتشالت من الفيديو كله، وهتتحط في وصف الـ gallery وكارت صفحة الهبوط بس. قاعدة الـ gallery في AGENTS.md اتعدلت، وقاعدة الـ skills لليوزرز فضلت زي ما هي. draft-12 بيترندر بالكارت الأسود واللوجو.

  45. IceStage 08

    اتبعت draft-14 (35 ثانية) وصفحة فريمات آخر 9 ثواني: خانة البحث فوق الشارع، وبعدها الشاشة كلها بتسود، ولوجو سبوتيفاي الرسمي بيدخل بظهور تدريجي وتكبير خفيف ويقف على آخر ضربة عند 33.5. مفيش جملة غير رسمي في الفيديو. الصوت لسه محدش سمعه.

  46. OwnerStage 08

    موافق على draft-14 وسمعت الصوت. ابدأ الريندر النهائي 1920x1080 والتسليم والـ case study.

  47. IceStage 08

    بدأ الريندر النهائي 1920x1080 بالترتيب من أول فريم، ومعاه آخر جولة مراجعة والتسليم وتصدير الـ case study وملف سجل الشغل.

Research, with dates

Compliance note: spotify-concept-ad

21 sources

R-01 RQ-brand: What do Spotify's own official pages publish today about its logo rules, colors, typeface, live pages, store listings and current campaigns?

21 sources

R-02 RQ-business: What is Spotify, whom does it serve, what does it publish as product truth today, who are its competitors in Egypt, MENA and globally, and how does it talk?

19 sources

R-03 RQ-rules: What advertising rules apply to a music streaming app ad in Egypt and MENA, and what do the YouTube (Google Ads), Instagram (Meta) and TikTok ad policies say for this unofficial concept film?

18 sources

R-04 RQ-color: What do colors mean for music streaming brands and to audiences in Egypt and the Arab world, and what palettes do music streaming brands use in 2025 and 2026?

7 sources

R-05 RQ-type: What Arabic type conventions hold for screen and social video in 2025 and 2026, how is Arabic paired with a Latin sans, and which open-licensed Arabic typefaces do the sources name?

5 sources

R-06 RQ-category: What do current music streaming ads and Spotify ads look like (structure, palette, type, motion, sound), and what does every other video on this subject look like?

17 sources

R-07 RQ-ads: Which real 2024 to 2026 ads from Spotify and the competitors our sources name (Egypt, MENA and global) show the hooks, beat shapes, palettes, type, cut rates, sound and endings of this category?

24 sources

R-08 RQ-refs: Which real, viewable, documented works can serve as benchmarks for narrative and transition grammar, for typography and composition, and for sound and pacing in a music streaming brand film?

18 sources

Checks on the delivered file

GateResultMeasured
Cold-viewer clarityPassa fresh sub-agent with no brief opened only the packet (film.mp4 and format.txt) and wrote: sells "Spotify."; does "It lets you find and play music that fits your moment."; idea "Press play and the noise around you turns into music."; the approver matched it to the takeaway (D-48): Sells, Offer's job and One-line idea MATCH, no misread, no major confusion, five minor items. The first read 3 (round 4) is void: it opened the draft by its project path and the critics' labelled packet, no takeaway existed and no match ran. Reads 1 and 2 were not run (the gate entered the skills mid-run, after 02). Limit: the packet path names "04-spotify", which the viewer saw
Storyboard lintWarn15 shots, 35 s; yellows: shot 1 four words (the sounds of the machines), shots 2 and 4 short (the owner's typing at once; the approved card), three pushes in a row (the owner's note 3)
Engine lint and checkPasspage contract renders 1050 frames in order with one worker; cue sheet re-exports identically (53 events)
G0 render existsPass35.00 s matches the expected 35.00 s; audio present
G1 proof readableBy eyethe field type 54 px on 1080 (5 percent), the line 104 and 64 px; the sound words and the card read at full size; checked on the 1920 stills and the phone-size sheet
G2 no empty framePassno run of more than 3 flat frames
G3 end hold, CTA sharePassend hold 1.47 s (limit 0.6 to 1.77 s for a text-less end card); CTA from 27.5 s = 21 percent (at most 25)
G4 one hero per frameBy eyeone hero per beat (data-hero: the HONK word, the field, the street, the line, the field, the logo)
G5 no page chromePass0 rule hits, depth_layers median 5
Film gateWarnfast in-shot motion 0.151, blank mid-section 0.000 s, blue-purple ground 0.000; yellows: hero_share and frame_fill under the floor only for the beats 31.25-35 s, push-ins 12 per minute
Richness floorPasshero_share 90.9 percent (floor 30), frame_fill 16 of 16 (floor 10), empty_half 0 s, in_shot_motion 100 percent, longest_still 0 s outside declared holds; depth_layers median 5 (page marks); surface detail (asphalt grain, windows, site frame and hoarding), light events (the press ring, the drop), real material (the rebuilt UI, the official logo) counted by critic A
Motion and freezesPass0 cuts, 0 freezes, 1 black stretch (the declared fade before the logo), 0 white; near-frozen samples 16 (the breath and the logo hold)
SeamsNot applicableone continuous camera, no cuts (look.py reads the drop flash at 19.53 s as a scene change)
Captions and syncSync passno voice, no captions; every cue onset within one frame (critic B: press 7.5, drop 19.5, final hit 33.5 on their frames, 13 jam stabs sample-exact)
LoudnessPass-14.0 LUFS, LRA 7.4 LU, true peak -1.4 dBFS (target -14, -1 dBTP, D-29)
SpecPass1920x1080, h264, 30 fps, 35.00 s
Template distancePass4 of 6 axes against ice-styles 01-flat-vector
FingerprintNo earlier recordthe record is written to ice/review/fingerprint.jsonl inside the project (the run is confined to its folder, so ~/.ice-motion-director/fingerprints.jsonl was not written)
Final Frame ContractPassthe last frame of the lossless final equals the static logo page on the whole frame: 0 differing pixels
Final against the approved cutPassfinal frames at 960x540 against draft-14: PSNR 36.7 to 43.6 dB at nine times; the lossless final against seeked stills: 0 px on the end card and the logo, specks of at most 29 of 255 on the street layer (raster history, the final rendered in order from frame 0 with one worker)
Brand test (brand film QA threshold)Fail0 of 6 random frames read as Spotify with the logo and UI covered (2 NO, 4 WEAK): Spotify green is only on the play circle and the logo, the street colours are not known as Spotify
Competitor swap (brand film QA threshold)Fail12.5 of 35 s (36 percent) Spotify-specific, all of it swappable surface (the rebuilt interface, the green, the logo); the idea transfers to any music app
Transitions transform the object; value flips (brand film QA threshold)Partialtransitions pass: no hard cut on 1050 frames (one continuous camera); chapter luma flips at 4 of 7 changes, the last three step down to black
Climax duelNot run
  • -14LoudnessLUFS
  • -1.4True peakdBTP
  • 30Frame rateframes a second
  • 1920 x 1080Resolutionpixels
Delivered versions
LanguageAspectLengthFile
English16:935 secondsice/renders/final/spotify-concept-ad_street_16x9_35s.mp4

Credits and tools

  • ice/audio/soundtrack_en.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, score and SFX composed by code in ice/audio/score.py; mgaudio (c) 2026 Vincentwei1021, MIT, n/a (original output, mastered to -14 LUFS, -1 dBTP), English version, full soundtrack 0.0 to 49.0 s, 2026-10-20
  • ice/audio/soundtrack_ar.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, score and SFX composed by code in ice/audio/score.py; mgaudio (c) 2026 Vincentwei1021, MIT, n/a (original output, mastered to -14 LUFS, -1 dBTP), Arabic version, full soundtrack 0.0 to 49.0 s, 2026-10-20
  • ice/audio/soundtrack_en_v2.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, score and SFX composed by code in ice/audio/score.py (--v2); mgaudio (c) 2026 Vincentwei1021, MIT, version 2 levels for the social-profile LRA (mastered to -14 LUFS, -1 dBTP), English version, full soundtrack 0.0 to 49.0 s, 2026-10-20
  • ice/audio/soundtrack_ar_v2.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, score and SFX composed by code in ice/audio/score.py (--v2); mgaudio (c) 2026 Vincentwei1021, MIT, version 2 levels for the social-profile LRA (mastered to -14 LUFS, -1 dBTP), Arabic version, full soundtrack 0.0 to 49.0 s, 2026-10-20
All 25 credits
  • ice/audio/soundtrack_en_v3.wav (and stems_en_v3/), local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, score and SFX composed by code in ice/audio/score.py (--v3); mgaudio (c) 2026 Vincentwei1021, MIT, version 3: full-level frame-0 horn, no fade-in, end hit at 46.0 and a natural ring-out (mastered to -14 LUFS, -1 dBTP), English 16:9 delivery film, full soundtrack 0.0 to 49.0 s, 2026-10-20
  • ice/audio/stems_en_v2/, ice/audio/stems_ar_v2/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-20
  • ice/audio/stems_en/, ice/audio/stems_ar/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-20
  • ice/audio/soundtrack_en_v4.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--v4); mgaudio (c) 2026 Vincentwei1021, MIT, version 4, the drawn street: timed from ice/plan/cue-sheet.json (36.0 s); mid-honk at frame 0, no fade-in, last hit at 33.5 and a natural ring-out (mastered to -14 LUFS, -1 dBTP; measured -14.08 LUFS, -1.21 dBTP), English 16:9 film, full soundtrack 0.0 to 36.0 s (08b input: ice/audio/master_input_en_v4.json), 2026-10-21
  • ice/audio/soundtrack_en_v4.wav: SFX (street noise of the hero car, four jam vehicles, road breaker, pile rig and motorbike; 26 key ticks; soft UI open; soft whoosh; click; riser; impact), local, code-generated, none, horn, breaker, pile rig, motorbike and key models written in ice/audio/score.py (horn4, road_breaker, breaker_hat, pile_ram, pile_backbeat, bike_rev, key_tick, building on jack_hammer and engine_bass there); UI open, whoosh, click, riser, impact and the drum bodies from mgaudio sfx and drums (MIT, project copy), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 36.0 s, 2026-10-21
  • ice/audio/stems_en_v4/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 31 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21
  • ice/audio/soundtrack_en_v5.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--lang en --v5); mgaudio (c) 2026 Vincentwei1021, MIT, version 5 (D-38 to D-42): timed from the re-timed ice/plan/cue-sheet.json (33.5 s), seven jam cars, an alive ending, smaller peaks at the source (mastered to -14 LUFS, -2.5 dBTP ceiling; measured -14.03 LUFS, -2.68 dBTP), English 16:9 film, full soundtrack 0.0 to 33.5 s (08b input: ice/audio/master_input_en_v5.json; mastered into ice/renders/draft-10-en-av.mp4), 2026-10-21
  • ice/audio/soundtrack_en_v5.wav: SFX (street noise of the hero car, seven jam cars, road breaker, pile rig and motorbike; 26 key ticks; soft UI open; soft whoosh; click; riser; impact), local, code-generated, none, the same models as v4 in ice/audio/score.py (horn4 with seven horn timbres, road_breaker, breaker_hat, pile_ram, pile_backbeat, bike_rev, key_tick); UI open, whoosh, click, riser, impact (high-passed at 100 Hz) and the drum bodies from mgaudio sfx and drums (MIT, project copy), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 33.5 s, 2026-10-21
  • ice/audio/stems_en_v5/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 34 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21
  • ice/audio/soundtrack_en_v6.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--lang en --v6); mgaudio (c) 2026 Vincentwei1021, MIT, version 6: the version 5 sound on the 35.0 s ice/plan/cue-sheet.json (last hit 32.5, ring-out to 35.0), the jam cars level-matched (mastered to -14 LUFS, -2.5 dBTP ceiling; measured -14.07 LUFS, -2.68 dBTP), English 16:9 film, full soundtrack 0.0 to 35.0 s (08b input: ice/audio/master_input_en_v6.json; mastered into ice/renders/draft-11-en-av.mp4), 2026-10-21
  • ice/audio/soundtrack_en_v6.wav: SFX (street noise of the hero car, seven jam cars, road breaker, pile rig and motorbike; 26 key ticks; soft UI open; soft whoosh; click; riser; impact), local, code-generated, none, the same models as v5 in ice/audio/score.py; UI open, whoosh, click, riser, impact (high-passed at 100 Hz) and the drum bodies from mgaudio sfx and drums (MIT, project copy), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 35.0 s, 2026-10-21
  • ice/audio/stems_en_v6/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 34 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21
  • ice/audio/soundtrack_en_v7.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--lang en --v7); mgaudio (c) 2026 Vincentwei1021, MIT, version 7: the version 6 sound with the black end card (D-44 to D-46): the groove under the field, the street dropping out with the fade to black, a reverse-cymbal swell under the logo entrance, the final hit at 32.5 and the ring-out (mastered to -14 LUFS, -2.3 dBTP ceiling; measured -14.04 LUFS, -2.48 dBTP), English 16:9 film, full soundtrack 0.0 to 35.0 s (08b input: ice/audio/master_input_en_v7.json; mastered into ice/renders/draft-12-en-av.mp4), 2026-10-21
  • ice/audio/soundtrack_en_v7.wav: SFX (street noise of the hero car, seven jam cars, road breaker, pile rig and motorbike; 26 key ticks; soft UI open; soft whoosh; click; riser; impact; the swell into the final hit), local, code-generated, none, the same models as v6 in ice/audio/score.py; UI open, whoosh, click, riser, impact (high-passed at 100 Hz), the reverse cymbal of the logo entrance and the drum bodies from mgaudio sfx and drums (MIT, project copy; the cymbal is mgaudio's synthetic crash reversed, no sample pack installed), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 35.0 s, 2026-10-21
  • ice/audio/stems_en_v7/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 35 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21
  • ice/audio/soundtrack_en_v8.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--lang en --v8); mgaudio (c) 2026 Vincentwei1021, MIT, version 8: version 7's sound on the re-timed ending (the field 27.5 to 31.5, the fade to black 31.5 to 32.0, the swell 31.9 to 33.5, the final hit at 33.5, the ring-out to 35.0) (mastered to -14 LUFS, -2.3 dBTP ceiling; measured -14.03 LUFS, -2.48 dBTP), English 16:9 film, full soundtrack 0.0 to 35.0 s (08b input: ice/audio/master_input_en_v8.json; mastered into ice/renders/draft-13-en-av.mp4), 2026-10-21
  • ice/audio/soundtrack_en_v8.wav: SFX (street noise of the hero car, seven jam cars, road breaker, pile rig and motorbike; 26 key ticks; soft UI open; soft whoosh; click; riser; impact; the swell into the final hit), local, code-generated, none, the same models as v7 in ice/audio/score.py; UI open, whoosh, click, riser, impact (high-passed at 100 Hz), the reverse cymbal of the logo entrance (mgaudio's synthetic crash reversed) and the drum bodies from mgaudio sfx and drums (MIT, project copy), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 35.0 s, 2026-10-21
  • ice/audio/stems_en_v8/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 35 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21
  • ice/audio/soundtrack_en_v9.wav, local, code-generated, none, code-generated with mgaudio (MIT, project copy at ice/audio/lib/mgaudio, from Vincentwei1021/mg-styles-15), no third-party audio, no samples, no AI generation, score and SFX composed by code in ice/audio/score.py (--lang en --v9); mgaudio (c) 2026 Vincentwei1021, MIT, version 9: version 8's sound on the end card re-timed for look.py G3 (the street fading 31.5 to 33.0, the swell 32.5 to the hit at 33.5) (mastered to -14 LUFS, -2.3 dBTP ceiling; measured -14.08 LUFS, -2.48 dBTP), English 16:9 film, full soundtrack 0.0 to 35.0 s (08b input: ice/audio/master_input_en_v9.json; mastered into ice/renders/draft-14-en-av.mp4), 2026-10-21
  • ice/audio/soundtrack_en_v9.wav: SFX (as v8: street noise, 26 key ticks, UI open, whoosh, click, riser, impact, the swell into the final hit), local, code-generated, none, the same models as v8 in ice/audio/score.py and mgaudio sfx and drums (MIT, project copy), as above, original output, mixed into the soundtrack, English 16:9 film, 0.0 to 35.0 s, 2026-10-21
  • ice/audio/stems_en_v9/, local, code-generated, none, code-generated with mgaudio (MIT, project copy), no third-party audio, as above, 35 pre-master stems written at -6 dB by mgaudio export, mix reference for 08b, 2026-10-21

look.pylint.mjsfilm_gate.pymotion_check.pyfrozen-time.mjsloudness.mjsprobe-mp4.mjstransitions.py

What the export could not find

  • media

    ice/review/ui-fidelity/sheet-ar.png not exported: raw fidelity sheet kept local (it may hold other rights holders' content; only its masked share copy is exported)

  • media

    ice/review/ui-fidelity/sheet-en-v2.png not exported: raw fidelity sheet kept local (it may hold other rights holders' content; only its masked share copy is exported)

  • media

    ice/review/ui-fidelity/sheet-en.png not exported: raw fidelity sheet kept local (it may hold other rights holders' content; only its masked share copy is exported)

  • media

    ice/review/ui-fidelity/sheet-tiles-ar.png not exported: raw fidelity sheet kept local (it may hold other rights holders' content; only its masked share copy is exported)

  • media

    ice/review/ui-fidelity/sheet-tiles-en.png not exported: raw fidelity sheet kept local (it may hold other rights holders' content; only its masked share copy is exported)

  • stages[].minutes

    minutes per stage not recorded in ice/state.json stages

  • stages[06].artifacts

    no animatic render in the run files

  • gates[].threshold

    NOTE.md gates table does not separate thresholds; they are inside each value where the report states them

  • run-log

    25 more images left out (24 at most)

  • run-log

    masked in the export: 0 keys or tokens, 0 email addresses, 0 phone numbers, 1 absolute paths (ice/log/conversation.jsonl keeps the verbatim text)

Give your agent a director

Paste one line, then ask for a film in plain words. Ice takes it from brief to delivery and shows you its work at every step you want to see.

npx skills add Omar-Tnzxo/ice-motion-director -g --all
Ice holding the clapperboard open, ready to call action