Ice Motion Director
Install

Spotify concept ad

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, 0:35

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
Start to delivery
31 h 36 min
Active work
15 h 43 min
Tokens
1.3B in total, 3.6M of them output
API cost
$565.98

Made on a Claude Code subscription, so no token was billed. The API cost is what the same tokens would cost at Anthropic's list API prices on 31 October 2026 (the Claude API pricing page), with the same prompt caching. Start to delivery runs from the first prompt to the delivered film; active work leaves out waiting for answers and usage-limit pauses. Work after delivery, such as the case study export and the site translations, is not counted.

How it got here

The run as it happened, step by step, from the prompt to delivery, on the run's own clock.

  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 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).

    • 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-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

      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.

    • 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

    Decision

    • 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)

    Made in this stage

    • 04-storyboard.md

      Storyboard

      Film type: brand film. Length 35.0 s (D-39; was 36.0 s, D-33; 33.5 s in draft-10). Master 16:9 1920x1080, English only (D-28). 30 fps. Clock: music-led, 120 BPM, bar 0 on the play press at 7.5 s; the noise (0 to 3.0 s) runs in free time.

      Style: Drawn night street (D-31): a flat-vector night street in side view built by code (buildings with windows, street lamps, a construction site behind solid hoarding, a jam of cars and vans led by the hero car, a road breaker on a small excavator at the head of the jam, a pile rig, a motorbike with a helmeted rider), the machines drawn 1.6 times the building scale so they read on a phone, grey before the press, each machine taking its Spotify lane colour as it joins the song; Spotify interface rebuilt from captures; one style for the whole film

      Palette: ground #121212, sky #0D0D0D to #1D1D1D, street greys #1A1A1A to #6A6A6A, field #1F1F1F, card #181818, ink #FFFFFF, ink muted #A7A7A7, accent #1ED760 (play circle and press ring only), lanes #FFA178 (horn), #608108 (hammer), #91EEDA (drill), #477D95 (engine), word outline #000000, end card sky and logo ground #000000 (D-18, D-24)

      Characters: one motorbike rider in a full-face helmet with a dark visor (no face shown); no other people (a system pointer operates the rebuilt interface)

      Video direction block

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

      Shot plan

      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

      2 · 2.9-3.3 · F1 search · the noisy block dimming · 3.2: the field risen with the question, caret showing · the first key at 3.3 · the search field · rise · held, slow drift; reason: the question rises over the dim street · street, dim layer, field · the field rises, the street drifts · hero_width 83 (the field) / 16 / 3 · pillIn 2.9 · webplayer-search-en · exact placeholder; field fidelity at least 90 percent

      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

    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

    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)

      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)
  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

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 lintWarn
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:90:35ice/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