People Safety — production checklist
Every item Velma and Rachel raised, what state it is in, and how it was checked. Nothing here is marked done on the strength of a file having been edited — each closed item names the test that ran. The badge is at https://badge.kids/people-safety/.
Built 19 Aug 2026. Last updated 22 Aug 2026.
Done – your check: 74
Done – verified: 13
Part done: 1
Not started: 5
total: 93
1. The punch list
Every item raised, its state, and the test that closed it. This is the working list.
| Item | Lesson | What was asked for | State | Proof, or what it is waiting on |
|---|---|---|---|---|
| A1 | Whole badge | Let the child move freely: rewind, fast-forward and click any lesson. Remember the place so closing the phone does not lose progress. source: MT | Done – your check | CORRECTED 20 Aug. I reported this done on 19 Aug and it was NOT. I opened reachable() to every part and proved THAT, but never checked the thing a person actually touches: the lesson stripe was built out of <div> elements with role='img'. It was a progress bar. Nothing was clickable, so the only way through the badge was prev/next one part at a time – not random access. Spencer found it by trying to use it. Now: every stripe segment is a real button that jumps to that lesson, plus a 'Go to any lesson' list naming all twelve, because twelve segments on a phone is too small a target. Proved from a cold load: jumped straight to part 19 of 20, back to part 2, then from the list to part 16, with the URL mark following each jump. Also made the config ASCII-safe – the lesson names mojibaked the moment the page was served without an explicit charset. The 19 Aug half that WAS true still stands: reachable() is open on all 20 parts, #l1.4 restores part 1 at t=4.0 on a cold load, and #l0.7 clamps to the unanswered gate at t=2.0 rather than skipping it. Resume is in the URL hash, not browser storage, and retries until the seek sticks because at readyState 1 the browser silently throws a seek away. |
| A2 | Whole badge | After answering, leave every other option clickable so the child can read that feedback too. The question still resolves on the correct answer. source: MT | Done – your check | Nothing is ever disabled and the board is never locked. Proved: after a wrong answer all three options still enabled, no .locked class, Continue NOT lit; after the right answer all three still enabled and Continue lit. A child can go back and read what the other answers would have said. |
| A3 | Whole badge | Red and green rounded/oval buttons, nicer type. Keep them in the tray under the film – NOT overlaid on the video (overlay breaks scaling on mobile). source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE and the fix is better than the claim. It said computed border-radius 999px, with two-line answers dropping to 26px so text would not collapse into the curve. An audit found ALL 66 published options carry a sub, so the :has(span) rule won on literally every button and nothing was ever oval – 25.22px at 390 wide, 39.52px at 1440. The :has(span) test was never a wrap test at all: no label wraps, and the second line is the authored sub. But a flat 999px is also wrong – measured across all 74 options at three widths, the long answers reach six lines and 301px tall, where a stadium becomes a circle and cuts 28.3px INTO THE TEXT. That was looked at, not just computed. SETTLED ON one bounded radius, calc(44px * u * k), with :has(span) deleted. 44 exceeds half the height of an ordinary two-line answer at every width, so the browser's own corner clamp pulls those to a true stadium while tall answers keep a large safe radius. MEASURED ON THE PUBLISHED PAGE: 72 of 147 rendered options draw as full ovals, up from zero, with minimum text clearance +15.8px and no collision anywhere. Rejected alternatives measured the same way: 999px gives 147/147 ovals but -28.3px collision; 26px gives zero ovals. |
| A4 | Whole badge | Stabilise the scale. At a given screen size the type must not change size when the deck switches from question to feedback. source: MT | Done – your check | Scale solved ONCE per gate against the worst case – question deck plus the longest feedback that gate can produce – then held. Proved on a 390×740 phone in immersive where –k really does drop: 0.96 -> 0.96, ask font 18.24px -> 18.24px, video height 150px -> 150px across the question/feedback change. Nothing moves. |
| A5 | Whole badge | Put a fade or wipe between every clip in the player. The join must read as an edit, not as a glitch. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE, and it was my own regression. It claimed a 220ms cross-dissolve on every part change, proved by the .swapping class appearing and clearing. The class was indeed being applied – but an audit found there was NO CSS RULE FOR .swapping ANYWHERE. The rule existed at sos-player.pre5.bak.css line 533 and was deleted in my 20 Aug 16:51 CSS rewrite. So swapTo had been holding a class against nothing for a day: stage transitionDuration measured 0s and opacity stayed 1.0 through every 20ms sample of a swap. Every part change was a hard cut. That is the lesson: a proof that checks the JavaScript side of a behaviour is not a proof of the behaviour. RESTORED from the backup, appended at the END of the stylesheet with a .sosp prefix so no later block can strip it again, and .2s corrected to .22s to match the setTimeout. MEASURED ON THE PUBLISHED PAGE: transitionDuration 0.22s, opacity floor 0.0, opacity below 0.99 from 61ms to 520ms. Under prefers-reduced-motion: transition 0s and opacity floor 1.0 – a cut, not a blink. Verified on the badge page and the badge-challenge page. |
| A5b | 2 The gift from Mr. Taylor | Find and remove the flash. Likely a residual paint of the removed 'What you hear' dialogue during the part swap – the says fields were deleted today; check the swap path does not render stale crib content for one frame. source: VG 21 Aug | Done – your check | FIXED IN THE BUILDER AND PUBLISHED – NOT YET CONFIRMED BY EYE. Needs Spencer to watch the gift-to-secrets join once. WHAT WAS WRONG, reproduced in a real browser before touching anything: the thing that flashes is the KEY-POINTS DECK, still holding the GIFT lesson's bullets. It is a sibling of the video stage, not a child, so the 220ms cross-dissolve never covered it – the picture faded to black while those bullets sat at full opacity, then hard-cut when the Secrets film loaded. Measured visible for 485ms on a phone and 486ms on desktop, so not a mobile artefact. TWO SPANS, both now covered: (1) the 220ms swap – the 'swapping' class now goes on the player root as well as the stage, and the deck fades with the film; (2) the 0.20s film run-out – the gate hides the deck, and resume() was un-hiding it with less than a second of film left, so the outgoing bullets popped in and vanished. A run-out guard now keeps it down. The deck is FADED, never emptied: renderCrib runs only from loadPart, so a blanked deck could not come back inside the same part, including after a rewind. Guard measured for selectivity against the shipped config: fires on gift 0.20s, trust-b 0.45s, trust-d 0.40s, rules-c 0.50s, trust-c 0.60s, pizza-a 0.74s; never on Secrets 12.99s, Officer 10.0s, rules-a 8.7s and the rest, where the child is still watching and needs the key points. SO THIS IS NOT GIFT-ONLY – the same flash was on five other lessons. CAUGHT DURING THE FIX: my first version used the logical-and operator, which ml-canvas refuses in an inlined player – the builder rejected the page outright. Rewritten as nested ifs; the refusal even fires on the operator appearing in a COMMENT. VERIFICATION HONESTLY SHORT: JS parses, the builder's own guard passes, and the new class appears 5 times in the built page – but the local browser harness that found the defect could not be brought back up in this session, so nobody has watched the join since the change. Diagnosis and fix spec were each independently re-measured by a second agent that tried to refute them. |
| A6 | Whole badge | Show the key points under the film by default, at every screen size. Do not make a child find the expand button to reach the teaching. source: E1+MT | Done – your check | Key points visible under the film at every screen size, immersive included. Proved: computed display 'block' in immersive while the film plays. Hidden only while a gate is open, so the deck still clears the fold. |
| A7 | Whole badge | Josh's voice on ALL instructional narration unless told otherwise. Find and replace every clip that is not Josh. source: E1+MT | Not started | — |
| A8 | Whole badge | Re-render the flat-sounding narration with more pitch movement and a natural cadence. Robotic delivery is a reject. source: MT | Not started | — |
| A8b | 3 Secrets, surprises and privacy | Have her re-listen to the live v5x cut first. If it still reads robotic, re-render further lines in the SOS-JOSH-approved clone with more pitch movement until it does not. source: VG 21 Aug | Not started | — |
| A9 | Whole badge | RESOLVED – CAST. Brandon is Valf – Young & Energetic (Brandon Replacement For SOS), ElevenLabs nNXPmxHfg9PtGzFxr9Zd, DEFAULT settings, no direction tags. Measured median 329 Hz, p10 265 / p90 396 – inside Brandon's real 219-401 range. Locked by Spencer 20 Aug: 'let's just use Valf… he sounds pretty good' / 'Just use the default value.' Remaining work is rendering: every Brandon line in every film gets re-voiced with this id. Retired: clone nFzWoPRJZ0kCwz9vwTDd (it is the narrator) and the brandon_voice kit behind it. Reference: VOICES-locked.md, prod/voice_test/sweep.json. source: MT | Done – your check | — |
| A10 | Whole badge | Increase visible diversity across every crowd, neighbour and background character – boys and girls, a range of skin tones, ordinary middle-income streets. source: MT | Done – your check | COMPLETE across every film that needed it. Audited all 17 films frame by frame first: 11 have no background people at all – one-on-one scenes – and trust-a already carried a visibly non-white adult. Five films had incidental crowds that were uniformly light-skinned, exactly as Velma described, and all five are now done and live. intro v5x: a Black man and a South Asian woman walking together, an elderly woman with a dog, a mixed-race teenage girl. rules-b v9x: a Black girl cycling, a man with shopping, a woman and small child walking away – shot in the same pass that finally removed the pointing man. rules-c v6x: a Black girl watering flowers, an East Asian boy with a dog, neighbours of different ages. rules-d: a Black father and mother with a girl and a boy, a South Asian woman, an East Asian teenager, an older man reading. secrets v4x: a Black girl and a South Asian boy at the party, and the playground friend is now a Black girl with afro puffs. Every one spliced frame-exact with drift 0.000 and audio bit-identical. TWO DELIBERATE REFUSALS, both right. The secrets 'part 2' job in the audit was not the playground at all but the porch lure beat, where the only figure is the tricky person – recasting him by ethnicity would make a person of colour the predator in a child-safety film. And a standalone crowd plate for rules-d was refused because it contained no Brandon and would have deleted him from his own shot. The standing rule that came out of this: never stage an adult of colour approaching or reaching for a child, and never cast one as the lure. |
| A10b | 4 The six rules | Re-render with visible minorities including the approaching woman herself. Standing rule still holds: she is a harmless declined offer, not a lure – warm, ordinary, arms down. source: VG 21 Aug | Done – your check | NOT REPRODUCIBLE ON THE SHIPPED FILM, 22 Aug – and this needs a human eye rather than my say-so, so the frames are published. The item says everyone in the rules-b street is white INCLUDING the woman who approaches Brandon. Pulled the live sos-ps-05-rules-b-v10x-720.mp4 and looked at every shot: the residential street at 1.0/3.0/5.5/8.0s already carries a visibly mixed cast going about their day – a man with shopping, a woman walking a dog with a child, a cyclist – and the schoolyard behind Brandon at 18/22/25s is a mixed crowd of children and adults. The approaching woman herself is not white-presenting either. So the A10 diversity pass appears to have already covered this film, the woman included, and the note describes a build that is no longer live. I tried to settle it by sampling skin tone in pixels and THREW THAT OUT: at guessed coordinates the sampler cannot tell a face from hair or a jacket, and one of its readings was plainly clothing. A confident number from a bad method is worse than no number – so this is a picture judgement, and it goes to a person. Frames: https://badge.kids/wp-content/uploads/a10b_evidence.jpg SEPARATELY, and unchanged by any of this: DECISION-2026-08-22 says she is NOT recast regardless, because she is the film's illustration of rule 2 – an adult who should have asked another adult – and the standing rule is that we never stage an adult of colour approaching a child. Worth Spencer knowing that the shipped film already does exactly that, which is a tension between what is live and the rule as written, and his call rather than mine to resolve quietly in a render. |
| A10c | 7 The stranger on the bike | Re-render the teenager as a visible minority. He is a lure character – the standing rule about never casting a person of colour as the predator was written by us, and the client has now explicitly asked for this, so it is her call and it proceeds. source: VG 21 Aug | Done – your check | DECIDED 22 Aug by Spencer, no longer blocked – see DECISION-2026-08-22-diversity-lives-in-the-town. The lure is NOT recast by ethnicity. Instead the ordinary world becomes visibly mixed: neighbours, passers-by, the people on the street in every film, by default and without re-asking. Her ask for a visible minority in this lesson is met by the people around the scene. Spencer: 'make the bystanders and the people in the town not all just white… then there's no judgment, there's no stereotype. They're just going about their day.' The teenager also becomes a GIRL – which is not a hedge but something Velma asked for herself on 17 Aug: 'put a woman and a man in there and have the woman talk to him, because all the bad people seem to be men', already shipped in the minivan as G2. The ethnic-ambiguity option was considered and rejected: 'visible minority' is a Canadian term of art where visible is the operative word, so an unplaceable character would not have satisfied her and would have cost a re-render for nothing. READY TO RENDER with H3b in one pass. MEASURED 22 Aug, AND IT TURNS THE GIRL RECAST FROM A PREFERENCE INTO A FIX. The bike stranger speaks at 16.06-26.32 and those three lines measure 214.7, 234.8 and 218.4 Hz median. That is not a man. The whole 2017 course is voiced by one or two female performers and the stranger lines are among them, so the film today shows a male-presenting teenager speaking with a 220 Hz voice – EXACTLY the defect Velma reported in the minivan, except here nobody has reported it. Making the teen a girl does not create a mismatch, it removes one. The audio is 2017 client original and is not touched. SHOT PLAN, from a per-frame difference scan: shot 1 is 0.00-8.04, Brandon walking away with the cyclist approaching, and the street is COMPLETELY EMPTY – that is where the mixed town goes; shot 2 is 8.12-22.44, the fourteen-second two-shot carrying all the dialogue, so it needs real lipsync; shot 3 is 22.56-27.40, the reach and the walk-past, which also carries H3b. Gates at 15.50 and 22.60 both survive because the audio is stream-copied. STOPPED MID-FLIGHT 22 Aug: HIGGSFIELD RAN OUT OF CREDITS, balance 0.94 on the ultra plan. Nothing is wrong with the work and nothing is lost. All three start frames are generated, uploaded and verified (media 60164, 60162, 60181), the shot-2 lipsync guide track is built and measured, both remaining prompts are written out, and the splice tool already handles this shape. Picking it up again is submitting two jobs. Full handoff in prod/bike/BIKE-RENDER-PLAN.md. ONE TAKE WAS RENDERED AND REJECTED, and the reason is the useful part: wan2_7 lipsyncs whatever audio you give it, so handed the whole segment it had the girl MOUTHING THE NARRATOR for the first seven seconds. Checked against the master frame by frame – the original has her mouth shut at 9.36, 11.16, 13.16 and 15.06 and open only on her own lines at 16.36 and 17.76. The fix is already built: seg2_guide.mp3 is the same segment with the narrator silenced, measured at -180 dBFS before 7.55s and -18.9 dBFS after. DONE AND LIVE. bike v11x, media 60197. All three shots rebuilt in one pass and the picture assembled END TO END rather than patched, because the dissolves are shared – shot 1 fades into shot 2, so patching overlapping windows would have blended old against new. Shot 1: the empty street is now a neighbourhood – a Black man watering a lawn, a woman with a pushchair, a child on a scooter, a dog walker – and the approaching cyclist reads as a girl. Shot 2: the teenager is a teenage girl, same staging, same dialogue. Shot 3 carries H3b. THE LIPSYNC GUIDE MATTERED: the first take had her mouthing the NARRATOR for seven seconds, so the narrator was silenced in the guide track and the new take has her mouth shut at 1.2, 3.0, 5.0 and 6.8 and open at 8.2, 9.6 and 11.5, matching the original and the audio. Proof: 683 frames and both durations identical to the master, AUDIO BIT IDENTICAL by md5 so gates 15.50 and 22.60 hold, every sampled frame differs from the master by 13-25 because every shot changed, and the file fetched back from the site is md5-identical to the build. Script: bike_assemble.py. |
| A11 | Whole badge | Keep the shuffle. Verify the correct answer is not predictable by position. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE, and the reason matters. It claimed the right answer landed in slot 0 six times out of 25. A second audit re-ran the check IN THE BROWSER using the player's own seedOf and shuffled, over the 24 questions actually published, and got slot 0 = SIXTEEN of 24. Tapping the first option every single time scored 67 percent. My original check was a Python port of the shuffle that missed JavaScript's signed int32 xor – so it measured a different algorithm from the one children run. TWO REAL FAULTS FOUND: h * 16777619 overflows 2^53, so every hash was quantised to a multiple of 8 with its low three bits zero; the LCG then read its weakest bits twice, and with an always-even seed the final swap was always a fixed exchange of the first two options. Since 18 of 24 questions author the correct answer second, it moved to the front two times in three. FIXED with Math.imul for an exact FNV-1a and xorshift32 taking the TOP bits. Then an editorial change: the five badge-challenge questions all authored the answer on the same side, so they were varied. MEASURED ON THE PUBLISHED PAGES with the player's own code: 24 questions now split slot 0 = 9, slot 1 = 9, slot 2 = 6. Always tapping first scores 9/24 = 37.5 percent, which is EXACTLY chance for this mix of 6 two-option and 18 three-option questions – not merely improved, ideal. Still deterministic across a real reload, so resume is unbroken. HONEST RESIDUAL: the five-question challenge alone splits 3/5, which is the most balanced a set of five binary questions can be. That is a format limit, not a generator fault – a child guessing blind on two options averages 50 percent whatever the shuffle does. If it must be guess-resistant, those five need a third option. |
| B1 | 1 Badge intro | Build a transition screen showing the People Safety badge between the intro film and The gift from Mr. Taylor. It marks the start of the badge. source: E1+MT | Done – your check | Badge transition screen between the intro film and Mr. Taylor, inside the player as a part – nothing bounces out to a page. Uses the current badge art (media 58948). Proved at 390px and 1280px that the shield and the Start button both sit inside the stage. |
| B1b | 1 Badge intro | Change the badge to the original SOS 4 Kids artwork as previously discussed. source: VG 21 Aug | Done – verified | DONE 22 Aug, and it should never have been on the needs-a-human list. The intro was using sos-badge2-people-safety.png (media 58948) – an orange shield generated on 13 Aug that matches nothing else in the course. The ORIGINAL SOS 4 Kids artwork was in the media library the whole time: sos-badge-people-safety-cut.png, media 57895, uploaded 10 Aug. It is the blue hexagon with the group-of-people icon and the PEOPLE SAFETY wordmark, and it is verifiably the right one because it is the badge sitting second from the left on sos-certificate-preview-v2.jpg, between Street Smarts and At Home Safety, in the set of seven Spencer has already approved. That certificate is the canonical set and settles it without anyone being asked. The -cut variant was chosen deliberately over 57816: it carries real alpha, 22 percent transparent, and the dashed die-cut border exactly as the certificate draws it, where 57816 is the same art flattened onto a pale blue square that would draw a visible box on any other background. Published and read back from the live page: the badge screen now serves sos-badge-people-safety-cut.png and 58948 appears nowhere. WHAT I GOT WRONG: I asked Spencer which artwork he meant instead of looking. 'You HAVE THE ORIGINAL BADGES, WHY ARE YOU CONFUSED? YOU PREVIOUSLY HAD THIS CONVERSATION.' A question I could have answered myself is worse than a wrong guess, because it also spends the credibility of the questions that are real. |
| B2 | 1 Badge intro | Replace the intro key points with exactly these, in this order: 1. Most people are good. A few are not, and they do not look any different. 2. You are not going to spot a tricky person by looking. You spot them by what they ask you to do. 3. Tricky people do sneaky things to fool you and make you trust them, but you cannot trust them. 4. This badge gives you six safety rules and one tool – your own trust meter. source: E1 | Done – your check | Her four key points, her wording, her order, including the new third one. |
| C1 | 2 The gift from Mr. Taylor | Replace point 1 with: 'He is not a stranger. Brandon knows him, but he is acting sneaky and he cannot be trusted.' Replace point 4 with: 'He works out when Brandon's mom gets home. Then he asks Brandon to play online when mom is out and to keep the gift a secret.' source: E1 | Done – your check | Points 1 and 4 replaced with her wording. Points 2 and 3 untouched, as she asked. |
| C2 | 2 The gift from Mr. Taylor | Captions on by default across the badge, and the dialogue also readable in the key-points panel below the film. source: E1+MT | Done – your check | CORRECTED AND COMPLETED 21 Aug. The default-on half was true – ccOn is true at mount and captions paint, painted by us rather than a native track because iOS Safari will not load a data: URI track. But an audit found two real gaps. FIRST: there was no sos-ps-08-puppy.vtt anywhere, live or in source – the lost-puppy film shipped with NO CAPTIONS AT ALL. Now written from the film's own audio and reconciled against the human-checked sweep text: 5 cues, 0.540 to 15.920s. The 11.68s tail is deliberately uncaptioned because every audio sample from 18.5504 to 27.6053 is exactly zero – measured, and verify_gates independently reports the same silence. SECOND: the says field, which puts the spoken dialogue into the key-points panel, was absent on the GIFT film – C2's own lesson and the most dialogue-heavy film in the badge – and on trust-d. Both added verbatim from the shipped audio, 146 and 66 words, checked against sweep.json and orig_GIFT.txt, with nothing carried in from the 2017 original that the shipped cut does not contain. A THIRD defect surfaced while writing them: the puppy panel quoted Sgt Mungar's police-film contractions under the puppy film, whose re-voiced man says the line uncontracted – corrected so panel and caption agree. VERIFIED ON THE PUBLISHED PAGES: puppy carries 5 cues, gift and trust-d both carry says. The only film without captions is the safe-people montage, which has no narration by design. |
| C3 | 2 The gift from Mr. Taylor | Keep the card generic and non-distinctive. Hat logo is fine – not prominent, not used to sell anything. No change needed. source: MT | Done – verified | — |
| D1 | 3 Secrets, surprises and privacy | Add a short trailer of silence after every point before the cut, so nothing is clipped. Check every point in the film, not just the first. source: E1+MT | Done – your check | DONE and live. Measured rather than assumed: a hard cut is loud speech falling to near-silence inside 40ms with no decay. The secrets film had TEN – about one per teaching point, exactly what she described – and 34 across the badge. All now carry a 70ms decay, in two passes, and the detector reports ZERO remaining. Running time unchanged on every film, so no gate moved; verify_gates re-passed 32/32. Honest limit: this stops the chop SOUNDING like a chop. Where a syllable was genuinely never in the source file, only re-rendering that line puts it back, and that rides with the A8 voice pass. |
| D1b | 3 Secrets, surprises and privacy | Measure the audio at gates 3 and 4 of the secrets lesson against the narration script. If the gate timecode clips a sentence, move the gate into the real silence; if the syllable was never in the source render, re-render that line in the Josh clone at the correct length. source: VG 21 Aug | Done – your check | FIXED IN THE BUILDER. Gate 3 of the secrets lesson moved 61.30 -> 63.50 in ps_gates.py. Data change only, no re-render. WHY IT SHIPPED, which matters more than the fix: 61.30 WAS inside a measured silence (60.84-61.63 at -30dB), so verify_gates passed it and every automated check said it was fine. But faster-whisper word timings on the shipped v5x master show the word 'that' runs 61.22-61.74 – the gate landed 0.08s INSIDE that word, and the player's worst-case stop at at+0.20 falls at 61.50, mid-word. The narrator really did stop at 'And if somebody is getting hurt, tha-'. Cause: the A8 Josh re-render of 21 Aug moved this film's audio under a gate that had been timed against v4x. 63.50 sits in the widest clean gap in the film (63.01-64.08, 1.069s), after '…never a secret to keep.' and before 'Here is the rule to remember.' at 63.78 – 0.35s of margin against the 0.30s the sweep asks for; 63.60 was also proposed and rejected for leaving only 0.25s. Diagnosed and then INDEPENDENTLY RE-MEASURED by a second agent that tried to refute it and could not. verify_gates re-run: PASS 30/30. GATE 4 (70.85) IS NOT REPRODUCIBLE as a cut – it sits on a genuine sentence boundary; two agents agree. Velma should re-listen to gate 4 on the republished lesson before we spend on it. |
| D2 | 3 Secrets, surprises and privacy | Accept ANY one of the feelings as correct. Remove the requirement to click all four and remove the separate 'That is how it feels' confirm button. source: E1+MT | Done – your check | One tap on any face answers it. The confirm button is gone and the all-four requirement is gone. Proved: no button in the deck body, and one tap lights Continue. |
| D3 | 4 The six rules | Re-render the closing shot with the door closed. source: E1 | Done – your check | FOUND BY LOOKING, FIXED, LIVE. Frames pulled from the rules-d master at 20.2s to the last frame showed the front door standing wide open with the hallway visible through it – a framed picture and a console table. Re-rendered 17.80-21.00 so the trusted adult has stepped OUT onto the porch with the door shut flat behind her, and she still puts a hand on Brandon's shoulder. Five frames read individually, and all 80 frames of the segment scanned programmatically: the door leaf never drops below mean brightness 184/255 against 30.6 percent dark pixels in the old doorway – no gap, crack, hallway, picture or table in any frame. The E8 casting holds: she is still the same Black woman in her sixties, silver-grey hair, glasses, mustard cardigan. Camera measured first and found to be locked off (background correlation 0.999), not a push-in, and prompted to match. Take 1 was binned for re-staging both figures 25 percent larger and cropping Brandon's feet. 21.000 -> 21.000s, drift 0.000, audio bit-identical by MD5. verify_gates 32/32, verify_order 30/30. Live as rules-d v10x. |
| D4 | 3 Secrets, surprises and privacy | Yes. Keep it. Velma likes the variety and says it holds attention better than animating everything. source: MT | Done – verified | — |
| E1 | 4 The six rules | Build an interactive six-rules screen. Rachel's design: six stop-sign shapes with the rule text BLACKED OUT. The child clicks each sign independently; the rule is revealed and read aloud. No animation needed – the animations come in the other lessons. Narrator says the number 1 through 6 when introducing each rule. 1. Check first with an adult in charge. 2. Adults should ask other adults for help, not kids. 3. Use a family code word. 4. Be alert. 5. Don't keep unsafe secrets. 6. No! Go! Yell! Tell! source: E2 | Done – your check | BUILT – this lesson did not exist. Rachel's design: six stop signs, rules blacked out, clicked in any order, each revealing its rule and reading it aloud. The gate resolves only when all six are open. The six audio clips are CUT from the existing Josh narration in rules-a/b/c/d, which already says 'One.', 'Two.' and so on, so the card cannot drift out of agreement with the films. Each clip transcribed back and checked. |
| E1b | 4 The six rules | Same class as V6: measure each rule's tail against its script, fix the stop timecode or re-render the clipped line. source: VG 21 Aug | Done – your check | FIXED, PUBLISHED AND MEASURED. All six rule clips re-cut and live on the badge page. WHAT WAS ACTUALLY WRONG – and it was neither of the two things proposed. The films are correct; the cut points were nearly correct; THE FADE WAS EATING THE LAST WORD. The out-fade started at (b – a – 0.12), i.e. 0.12s BEFORE the cut, and measured with word timestamps on the shipped masters every one of the six ends its final word within 0.07s of that cut. So on all six the last word was fading to silence while it was still being spoken. Velma named 1, 2 and 4 because those are the most audible – rule 1 was cut 0.05s INTO the word 'first.' – but the defect was on all six. SECOND FAULT, also real: the script cut from rules-a-v4x, rules-b-v4x, rules-c-v3x and rules-d-v5nx, none of which exist on disk any more; repointed at v5x, v10x, v7x and v13x, whose audio is bit-equivalent across the picture re-renders. FIX: b is now last-word-end + 0.25, which stays clear of the following word in every case, and the fade is placed AFTER speech ends so it lives entirely in the trailing silence. PROOF, measured on the finished mp3s: all 6 clips end with the last word intact, 0.25 to 0.37s of tail after it, and peak level in the final 0.10s of speech between 0.25 and 0.81 – i.e. still at full voice, not fading. TRAP CAUGHT ON THE WAY: WordPress would not clobber the existing attachments, so the re-uploads landed as sos-ps-rule-N-1.mp3 while ps_build_badge.py went on constructing the ORIGINAL filename by hand – a publish would have reported success and shipped the old clipped audio. The builder now reads the uploader's own record of what it created. Written up in RULE-wordpress-limits-that-shape-the-build. Verified on the live badge page: 6 of 6 new clips served, and each URL returns 200 at a byte count matching the local file exactly. NOTE, not a defect but worth knowing: the six-signs card exists only on the badge page, not on the standalone six-rules lesson page. |
| E2 | 4 The six rules | Design an original six-rules graphic (NOT a copy of the 2017 stop-sign slide) and make it reachable from anywhere in the People Safety lesson – a persistent button in the player chassis that opens the rules card. source: E1+E2 | Done – your check | A 6 RULES button in the player chassis, on every part of the badge, opening the rules card over the player and pausing the film. Proved on the published config: 6 rules in the chassis. |
| E2b | Whole badge | Rename to '6 Safety Rules' everywhere it appears: the chassis button, the rules card heading, the six-signs lesson and any narration caption that names it. source: VG 21 Aug | Done – your check | DONE IN THE BUILDER, awaiting publish. Renamed in the three places anyone actually sees it: the chassis button ('The 6 Rules' -> 'The 6 Safety Rules'), the rules-card heading ('The 6 People Safety Rules' -> 'The 6 Safety Rules', changed in ps_build_badge.py AND in the player's own fallback, so a config without rulesTitle cannot resurrect the old wording), and the six-signs completion feedback ('the 6 RULES button' -> 'the 6 SAFETY RULES button'). The only residual left in the tree is a CSS comment. NOT CHANGED, deliberately: the lesson page title 'The six People Safety rules' and its slug – renaming that breaks a published URL, and she asked about the rules feature, not the lesson. Flagged for Spencer rather than assumed. PUBLISHED AND VERIFIED LIVE 22:4x: all 12 pages refetched over ml-canvas/v1/get-page at full length – 'The 6 Rules' 0 occurrences, 'The 6 Safety Rules' present on every one – and confirmed rendered in a real browser: the chassis button and the rules-card heading both read 'The 6 Safety Rules'. |
| E3 | 4 The six rules | Remove or replace him. Roughly a quarter of the way through the rules film. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE and I am recording that plainly. It said 'the pointing man is gone'. He was not. A read-only audit found him at 2.0s in v4x, v5x, v6x, v7x AND v8x – every version ever shipped, including the one the old proof named. The cause: renders.py recorded E3's segment as 4.60-9.40, which is the WRONG SHOT. The replacement went in at 4.60 onward; the pointing man lives at 0.00-4.56 and was never touched. The proof had been written from what was rendered rather than from what shipped. NOW ACTUALLY FIXED: the cut was re-derived by scene detection (boundary at 4.60, score 0.269, frame-difference 34.06 between f114 and f115) and all 115 frames of 0.00-4.56 replaced. Nobody points in any frame – checked by reading ten frames plus a 17-tile sheet every 7th frame and a 33-tile sheet of the whole film. The street now teaches the rule instead of confusing it: an East Asian woman has stopped an older white man to ask directions – one adult asking another adult – while Brandon walks past uninvolved. A10 done in the same pass: a Black girl on a bicycle, a man with shopping well back, a woman and a small child walking away. Camera drift measured at 8px/s and reproduced. 25.800 -> 25.800s, drift 0.0000, audio bit-identical by MD5. Live as rules-b v9x, then v9x carried through the final dissolve pass. |
| E4 | 4 The six rules | Write the disposable-code-word teaching into rule 3. Spencer 20 Aug: 'maybe there should be a DISPOSABLE one time code word, that doesn't change from one use, but rather changes regularly.' source: MT | Done – your check | BUILT and live on the rules lesson. Two new key points under rule 3: 'A code word wears out. Every time you use it, one more person has heard it. The neighbour who picked you up last month knows it now – and she may not be the person standing there next time.' and 'So a code word is DISPOSABLE. Your family agrees a new one REGULARLY, and ALWAYS straight after it has been used for a real pickup.' The correct-answer feedback now ends 'Then tell your parent it got used, so your family can pick a new one.' The 2017 narration is untouched – it is original client audio and the teaching goes in the key points, per RULE-questions-come-after-the-teaching. |
| E5 | 4 The six rules | Make it casual – he simply looks around and notices who is nearby. Fill the street out: a person walking, another child with a dog, a neighbour. Keep a car on the drive but fix the sideways motion. He is ALERT, not frightened. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was PARTLY TRUE and the false half was the central one. 'Hood stays DOWN' held: down and empty in all fourteen frames read, never up, never coming off. 'Car parked square' held for this shot. But 'he looks left then right' was FALSE – he held one glance to screen-left for the whole shot and then settled forward, never looking the other way; the left-then-right read only appeared if you counted the following shot, which is a different setup. And 'street filled out' was PARTLY TRUE: a girl with a dog and one neighbor, but no 'person walking' as asked. The window was also wrong – the real shot is 0.00-5.28 (hard cut at frame 132), not 0.00-7.32, which spans two shots. RE-SHOT with A10 in the same pass. Nine frames read across the finished segment: hood down in every one, brow smooth and chin lifted reading as alert rather than frightened, and he now holds left, turns to his right at 2.1-3.4s, then comes back forward. Car static and square, checked in a dedicated eight-panel sweep. The hose that arced across frame is gone. Street now carries a Black girl watering a flower bed, an East Asian boy walking the dog, a woman in her sixties in her own garden, an older man with a stick, and a Black woman running in the distance – nobody looking at camera, nobody pointing, no adult of colour staged near a child. 14.32s unchanged, drift 0.000, audio bit-identical. Live as rules-c v6x. STILL OPEN, flagged not fixed: in the NEXT shot (5.28-7.40) the car still pivots – nose swings while the body stays put and the wheels do not track. Spencer's 'reversing sideways looks broken' is not fully retired there. |
| E5b | 4 The six rules | Re-render so the street population is consistent across the adjacent shots. source: VG 21 Aug | Done – your check | DONE AND LIVE. rules-c v8x, media 60151. CONFIRMED FROM THE FRAMES first: at 4.90 and 5.20 the lawn has a boy walking a small white dog, a girl with a green watering can and a woman in a straw hat kneeling at a flowerbed. At 5.50, across a single cut, all three and the flowerbed are gone from an otherwise identical street. E5b and E5c are the SAME SHOT – frames 136-184, 5.44-7.40 – so one re-render closes both. The new shot keeps all three neighbours and the flowerbed present throughout and puts the car back on the road. Both dissolves rebuilt. Proof: 358 frames and both durations identical, AUDIO BIT IDENTICAL by md5, gate 13.90 outside the window, frames outside differ by under 1.01 and inside by 33. The six-rules stop-sign clips are cut from this film's AUDIO, which is untouched, so rules 4 and 5 do not need re-cutting. Script: shotpatch.py e5b. |
| E5c | 4 The six rules | Re-render the shot after the be-alert beat so the car backs out and tracks normally on the road. source: VG 21 Aug | Done – your check | DONE AND LIVE in the same re-render as E5b – it is the same shot. Confirmed from the frames: the silver car sits on the driveway apron at 5.50 and then tracks forward toward camera along the grass verge, broadside to the kerb, never on the road. In v8x it is squared up in its own lane and drives away down the road, and it never touches the grass or the pavement. See E5b for the full proof. |
| E6 | 4 The six rules | He does not run. He puts a hand up, says no, turns and WALKS away. Merge the NO and the walk-away into one continuous beat so it reads as one situation. Running is only for real danger – somebody grabbing him or getting out of a car. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE. It said 'He does not run… a WALK at ordinary pace.' The shipped film showed Brandon RUNNING, both feet off the ground, arms pumping, through the whole of 10.04-13.88 – in every version from v5nx to v10x. What had happened is that E6 fixed the beats either side and left the old running take wedged between them, so the film read say-no then RUN then walk. I verified it myself by reading frames at 10.3, 11.0, 11.8, 12.6, 13.4 and 13.8 before acting. A second defect was in the same frames: a woman stood in the shop doorway with both arms spread wide, leaning toward a fleeing child, which read as a grab rather than the harmless declined offer Velma described. NOW ACTUALLY FIXED: all 97 frames re-rendered. Read individually at eleven timecodes across the segment – NO frame has both feet off the ground; one foot is in firm contact in every frame where his feet are visible, body upright, arms loose, no bounce, never looking back. The shopkeeper's arms are down, holding a watering can, turning back to her own window display – never spread, never reaching, never beckoning. A10 done in the same pass: a Black family with a girl and a boy, a South Asian woman, an East Asian teenager, an older white man reading, none looking at camera and none staged approaching a child. The shipped camera move was measured (accelerating dolly, scale 1.00 to 3.02) and rebuilt as a per-frame warp. PSNR proves the untouched regions: head 52.4dB, tail 50.5dB, so the E7 yell and the D3 TELL beat are undisturbed. 21.000 -> 21.000s, drift 0.000, audio bit-identical. Live. |
| E7 | 4 The six rules | Remake the shot. Align the action to the narration. He yells AT the person who approached him, in public, loud enough to draw attention. Teaching line agreed in the meeting: 'be loud enough to capture the eyes and ears of people around you.' Do not put specific words in his mouth – the situation decides those. source: MT | Done – your check | RE-ANIMATED and live. He yells AT the adult who approached him, in profile, and two passers-by turn toward the noise. rules-d v6x. |
| E7b | 4 The six rules | Re-render the E7 yell shot as a precarious situation: an adult has grabbed his arm and he yells to draw attention. This supersedes the earlier E7 staging. source: VG 21 Aug | Done – your check | DONE AND LIVE. rules-d v14x, media 60152. She is right about the old shot and it was worse than neutral: Brandon stood on an empty pavement screaming at two passers-by who were doing nothing to him, which models a child shouting at strangers for no reason. The new 1.16s beat (frames 417-445, 16.68-17.84) is her staging: a man has hold of his wrist and is pulling; Brandon has planted his feet, leans his weight back and shouts, and over the two seconds THE THREE NEIGHBOURS TURN AND WALK TOWARD HIM – the shout is shown working, which is the whole point of the rule. Diverse bystanders per the 22 Aug diversity decision; the man who grabs him is white, per the standing rule that a person of colour is never staged reaching for a child. No weapon, no vehicle, no hand over his mouth. Both dissolves rebuilt against the new shot so no ghost of the old one survives. Proof: 525 frames and both durations identical to the master, AUDIO BIT IDENTICAL by md5, gate 15.80 outside the window, sampled frames outside differ by under 0.65 and inside by 42-43. Script: shotpatch.py e7b. |
| E8 | 4 The six rules | Fix the continuity so the adult is clearly a different person. Then add a NEW montage: six panels, popping up one by one and staying on screen. THE SIX ARE SETTLED – Spencer 20 Aug: 'Police Officer, Fireman, Person With Kids, Teacher, Someone In Uniform, Bus Driver.' source: MT | Done – your check | BUILT, FIXED AND NOW ACTUALLY SHIPPED. Continuity half: the defect was real and measured – the woman Brandon ran to and the woman he fled were both slim white women in their thirties with the same hair and face, differing only in cardigan colour. The trusted adult is now a Black woman in her sixties, silver-grey hair, glasses, fuller build. Montage: 1280×720 to match the house standard, 10.36s, 259 frames, Brady Bunch 3×2 on warm cream, each panel popping in over 0.42s at 1.35s intervals and staying, all six held for the last 2.6s. Spencer's wording verbatim. As generated: Black woman police officer, white fireman, South Asian mother with two children, East Asian teacher, Latina shop worker, Black bus driver – three women, three men, five skin tones, and no badge, crest, logo or signage naming any real force, school or company. CAUGHT BY AUDIT: it had been built and never wired in – a grep for the filename across every .py, .json and .html returned only its own build script. Now placed as step 5 of the six-rules lesson, immediately after Rule 6 TELL, with seven key points in American spelling and no invented narration. Deliberately gateless so no existing gate timecode moves; verify_gates 32/32 before and after. Confirmed against the PUBLISHED config: 5 parts, index 4 is 'Who to tell – six safe people', preceded by Rule 6 and followed by the lesson-complete panel. |
| E8b | 4 The six rules | Add her narration VERBATIM in the Josh clone alongside the six-panel montage: 'Go to a safer stranger if you are alone and need help. A safer stranger is an adult who usually works in places where they help people, like police officers, firefighters, store workers, teachers, or security guards. If you need help, look for someone like that – they wear uniforms or work where lots of people are. Avoid strangers who are alone or ask you to go somewhere with them.' source: VG 21 Aug | Part done | PART DONE – the audio exists, the picture does not. Her safer-stranger script rendered verbatim in the same approved Josh voice, 26.17s, at prod/velma_new/V13-safer-stranger-josh.wav. MEASURED: median F0 128.2 Hz (baseline 127.1), movement 3.81 semitones (band 2.08-3.40, so above it – animated, not flat). Transcribed back and it matches her wording exactly. WHAT REMAINS: this is 26 seconds of narration and needs matching picture – the natural home is alongside the existing six-safe-people montage, which is 10.36s, so either the montage extends or the line lands over new footage. That is a shot decision, not a render button. |
| F1 | 5 Your trust meter | One design everywhere. Three hard-edged colour bands – GREEN, YELLOW, RED, like a traffic light. Not a gradient, not three overlapping bars. source: MT | Done – your check | One meter everywhere. Three hard-edged bands – green, amber, red – with a marker that lands in the band chosen. No gradient, no arc, no overlapping bars. |
| F2 | 5 Your trust meter | Three buttons, in Velma's words: 'I trust' / 'I'm not sure' / 'I do not trust'. source: MT | Done – your check | Three levels in her words: I trust / I am not sure / I do not trust. All six trust meters in the badge migrated; her recorded feedback for the old yes and no branches carried over word for word. 'I am not sure' is ACCEPTED, not marked wrong. |
| F3 | 5 Your trust meter | Redraw it as a proper meter bar, aesthetically pleasing, with the three bands and the three buttons. source: E1+MT | Done – your check | Redrawn as a proper meter bar with the three bands and the three buttons. |
| F4 | 5 Your trust meter | REMOVE the instincts feelings question. In its place, link instincts to the trust meter: when you get that feeling, do you trust or not trust? This is the moment the two ideas get tied together, which normally only happens in the classroom. source: E1+MT | Done – your check | The instincts feelings question is removed. In its place the same beat now asks what that feeling means ON the meter – the link between instincts and the trust meter that normally only happens with a teacher in the room. |
| F5 | 5 Your trust meter | Move them to his mid-section. The original used a still of a tummy with a magnifying glass over it – either is acceptable. Keep his face concerned, not frightened. source: MT | Done – your check | RE-ANIMATED and live. Butterflies at his stomach with his hand on it, brow drawn, weight shifting. trust-a v5x. |
| F6 | 5 Your trust meter | Sync each line to its own picture – 'offers you a ride' on the van shot, 'offers you a gift' on the gift shot, and the shush finger exactly on the secret line. Pull the photographer back to a normal distance. Consider making it a woman approaching a girl in a park, as the original was. source: MT | Done – your check | DONE 20 Aug. Measured before touching anything: faster-whisper word timestamps on the SHIPPED file put 'offers you a ride' at 6.02-7.06 and 'offers you an expensive gift' at 10.98-12.58, and ffmpeg scene detection put the picture cuts at 8.04 and 16.56 – so those two lines were ALREADY on their own pictures and did not need touching. The two that were wrong: (1) 'someone asks you to keep a secret' is spoken 19.18-21.28 and the picture did not change until 20.88, 1.70s into the line and only 0.40s before it ended; and (2) THERE WAS NO FINGER-OVER-THE-LIPS ANYWHERE IN THE FILM – the shot the old cut arrived at was just the photographer standing up. Both re-animated, picture only, soundtrack untouched. The photographer now stands upright with four metres of grass between him and Brandon (Velma: 'That is creepy. Maybe we have him not bend over and be in his face like that'); take 1 came back bent over again because I passed the shipped frame as an image reference and the picture beats the text, so take 2 was driven from a new start image instead. The shush is now at the lips within 0.12s of the cut and held through the gate at 21.90 and the stop at 22.30. Shipped as sos-ps-06-trust-d-v8x-720.mp4: 25.12s in, 25.08s out, drift -0.04s, inside the 0.12s tolerance, so no gate moved. verify_gates PASS – the gate and the stop both still sit in the measured silence 21.45-22.43 – verify_order PASS, caption audit clean. Frames shot off the rebuilt film at 6.5, 12.0, 17.0, 18.5, 19.3, 20.5, 21.9 and 22.2 seconds: every line now sits on its own picture. NOT DONE: Velma also wondered whether the photo beat should become a woman approaching a girl in a park, as the original was. That is a cast change, not a defect, so it is hers to call – flagged, not assumed. |
| G1 | 6 Your dad's been in an accident | Cut the driving-onto-the-sidewalk shot. The van simply pulls up at the curb and the person speaks. A driver must be visible. source: E1+MT | Done – your check | RE-ANIMATED and live. Van stops at the curb, all four wheels on the road, man at the wheel AND a woman beside him. I found my own timecode was wrong by scanning the film: the van is on the road to 4.36s, over the sidewalk from 5.4s. Also: a driver WAS already visible from 1.09s on the shipped file, so half that note was stale. minivan v5x. |
| G1b | 6 Your dad's been in an accident | Re-render shot A (0.00-4.40) and shot B (4.52-9.96) with BOTH occupants in the van from the first frame and the passenger window down as they approach, which also settles the second half of V15. source: VG 21 Aug | Done – verified | SHIPPED 22 Aug as sos-ps-06a-minivan-v10x-720.mp4, 7,490,704 bytes, HTTP 200 from the live URL. Shots A (0.00-4.40) and B (4.52-9.96) for G1b and shot D (18.48-30.58) for G1c were re-rendered together, because they are one continuity problem: the van gains a passenger at 4.4s and loses both of them at 18.5s, and fixing either end alone just moves where the glitch is. New start frames were built with nano_banana_pro from each shot's own first frame plus a reference of the pair from shot C, then each shot was rendered on wan2_7 driven by its own audio segment. Shot C (10.04-17.56) and the flank shot at 17.68-18.36 were KEPT untouched – C is the look the other shots are being matched to. G2b IS NOT PART OF THIS: she also asked to flip the pair so the woman drives, that was measured and did not reproduce, and the decision was to leave the staging alone – so the man stays at the wheel and the woman in the passenger seat, exactly as in C. The dissolves at either end of a replaced shot were REBUILT from the new material on both sides (3 of them); the one gap between two kept shots was copied through untouched. Copying a dissolve next to a replacement would have left a ghost of the empty van blended into the fix, which then pops. Verified: 763 frames in and 763 out, 30.584s both, audio stream BIT IDENTICAL (md5), all three gates land on untouched audio and were read back from the live page. A continuity sheet of all seven shots side by side shows both occupants present in every one, first frame to last – and that sheet is now step 10b of the runbook, because its cut detector used to be ffmpeg's scene score, which finds no cuts at all in a film made of cross-dissolves and averaged this very defect away. |
| G1c | 6 Your dad's been in an accident | Re-render shot D (18.48-30.58) with the same two occupants still in the van. source: VG 21 Aug | Done – verified | SHIPPED 22 Aug as sos-ps-06a-minivan-v10x-720.mp4, 7,490,704 bytes, HTTP 200 from the live URL. Shots A (0.00-4.40) and B (4.52-9.96) for G1b and shot D (18.48-30.58) for G1c were re-rendered together, because they are one continuity problem: the van gains a passenger at 4.4s and loses both of them at 18.5s, and fixing either end alone just moves where the glitch is. New start frames were built with nano_banana_pro from each shot's own first frame plus a reference of the pair from shot C, then each shot was rendered on wan2_7 driven by its own audio segment. Shot C (10.04-17.56) and the flank shot at 17.68-18.36 were KEPT untouched – C is the look the other shots are being matched to. G2b IS NOT PART OF THIS: she also asked to flip the pair so the woman drives, that was measured and did not reproduce, and the decision was to leave the staging alone – so the man stays at the wheel and the woman in the passenger seat, exactly as in C. The dissolves at either end of a replaced shot were REBUILT from the new material on both sides (3 of them); the one gap between two kept shots was copied through untouched. Copying a dissolve next to a replacement would have left a ghost of the empty van blended into the fix, which then pops. Verified: 763 frames in and 763 out, 30.584s both, audio stream BIT IDENTICAL (md5), all three gates land on untouched audio and were read back from the live page. A continuity sheet of all seven shots side by side shows both occupants present in every one, first frame to last – and that sheet is now step 10b of the runbook, because its cut detector used to be ffmpeg's scene score, which finds no cuts at all in a film made of cross-dissolves and averaged this very defect away. |
| G2 | 6 Your dad's been in an accident | Put a man AND a woman in the van, and have the WOMAN lean out and deliver the line about the accident. source: MT | Done – your check | CORRECTED 21 Aug – the earlier proof was FALSE for the shipped film, and the cause was my own repair. It said 'the WOMAN leans out and delivers the accident line'. In the shipped minivan the MAN at the wheel spoke – mouth open at ten sampled timecodes – while the woman's mouth was closed in every frame. Velma's fix was undone by the M13 lip-sync pass a few hours earlier: the shot was regenerated with the audio driving the mouth and the generator put the words in the man's mouth. NOW ACTUALLY FIXED, re-shot on wan2_7 with the speaker directed explicitly. All 190 frames of 9.92-17.52 replaced INCLUDING both dissolve regions, because the old dissolves had the mouth-open man baked into them. Ten loudest moments: woman OPEN, man CLOSED, every one. Five measured silences: both at rest. A 38-tile sweep of the driver's mouth every 0.2s across the whole segment shows a closed line in all 38. Objective check: the man's mouth region correlates -0.009 with the audio envelope, the woman's +0.267. Her eyeline stays on Brandon and off the lens in every frame, no smile, no gesture – RULE-never-perform-the-lure holds. Take 1 was rejected for pushing to 2.5x against the shipped 1.25x. 30.584 -> 30.584s, drift 0.0000, audio bit-identical by MD5. Live as minivan v8x. NOTE FOR VELMA: the woman now speaks with the STRANGER track, which is still the narrator-adjacent voice pending L1 casting. The audio is sacred so it was not touched. |
| G2b | 6 Your dad's been in an accident | Make the FEMALE the driver and the man the passenger, passenger window down as they approach Brandon. She speaks. Cast a female stranger voice for the lure lines (ties to L1 casting) – the 2017 track here is generated, not sacred original. source: VG 21 Aug | Done – your check | Not reproducible as stated. Method: pyin F0 per utterance on the shipped audio, plus a frame-by-frame read of who is talking during the measured speech and silence windows. Recorded so nobody re-opens it as a casting question. |
| G3 | 6 Your dad's been in an accident | Hold the driver/van image static behind the question. It must not change to something else while the child is deciding. source: MT | Done – your check | Gates can now name a hold frame – the picture the question is about. All three minivan questions hold the driver at 14.60s instead of parking on their own timecode, where he is no longer on screen. Playback still resumes from the gate. |
| G4 | 6 Your dad's been in an accident | Remove it. Brandon says what he is thinking out loud later anyway. Keep the controls in the tray, not on the picture. source: MT | Done – your check | The click-on-Brandon step is gone from the minivan. Brandon says the thought out loud at 19.00-30.00 of the same film, so the teaching still lands. NOTE: the same module is still used in the bike and puppy lessons – Velma to say whether those go too. |
| G4b | 7 The stranger on the bike | Remove it here and sweep the whole badge for any other instance. source: VG 21 Aug | Done – your check | DONE IN THE BUILDER, awaiting publish. Both surviving 'Click on Brandon to see what he is thinking' steps deleted from ps_gates.py – the bike gate at 22.0 and the puppy gate at 19.5. Gate total 30 -> 28, and regress.py's verify-gates expectation moved 32 -> 30 with the reason written into its docstring so nobody restores the gates to make a count go green. CHECKED BEFORE DELETING, because removing a step can delete teaching: the bike film says the thought out loud at 23.00-27.00 ('I know adults get other adults to help not kids') – the deleted gate's own src field cites that same window as the source of its text – and the puppy lesson carries it as key point 3, 'An adult who really needs help asks another adult – that is rule 2'. Both teachings survive without the click. NOTE for the next agent: sos-player.js still defaults a think-module CTA to this exact sentence, so a new think gate authored without a cta would bring it straight back. There are now no think gates. PUBLISHED AND VERIFIED LIVE 22:4x: all 12 pages refetched at full length, 'Click on Brandon' 0 occurrences on every one, including the badge page. Response lengths checked first, because a truncated body greps identically to fixed content. regress.py –fast: 8 PASS 0 FAIL. |
| H1 | 7 The stranger on the bike | Make every line say 'video game store', including Mario's line. Where the old audio cannot be fixed, re-voice that line. source: E1+MT | Done – verified | CLOSED 22 Aug. The narrator half was fixed on 21 Aug – he DOES say 'video game store' at 8.02-8.90 and the caption had dropped the word. The half a caption cannot fix is now done too. Transcribed the shipped soundtrack BEFORE touching it rather than assuming, and she really does say it: 20.38-22.08 reads back as 'Take me to the nearest video store.' Measured her pitch before cloning, because this film has been wrong about a voice before – median F0 196.3 Hz on her first line and 213.3 Hz on the second, a young female voice matching the girl the shot was recast to. So the VOICE was right and only the WORDS were wrong. Cloned from her own audio through Higgsfield seed_audio, and every take transcribed back before it was trusted; both read 'Can you take me to the nearest video game store?' The soundtrack is joined by TRUE digital silence at 15.65s and 22.78s, so the film handed us its own splice points and the whole block was replaced rather than the word. Outside that window the track is untouched to within 1 LSB, which is the AAC decode round trip and is MEASURED, not claimed. Picture re-rendered for the one shot she is in, 8.12-22.44, driven by a guide track with the NARRATOR SILENCED – take 1 of the earlier recast had her mouthing the narrator for seven seconds, which is why. Verified: mouth shut at 1.0, 4.0 and 7.0s, moving at 8.4, 9.5, 11.0, 12.5 and 13.8s; arms down on the handlebars throughout, no lean and no beckon, per RULE-never-perform-the-lure. 683 frames in and 683 out, both dissolves rebuilt. The gate at 22.60 lands INSIDE the replaced window so it was checked rather than waved through – it sits in 0.95s of digital silence, exactly as before. Whisper on the finished film reads '…to the nearest video game store' in both the narration and her line, and 'video store' appears nowhere. Captions updated to match. SHIPPED as sos-ps-06b-bike-v12x-720.mp4, 6,449,112 bytes, HTTP 200 from the live URL. |
| H2 | 7 The stranger on the bike | No – that is the point, and children pick up on it. Keep it. source: MT | Done – verified | — |
| I1 | 9 The pizza nobody ordered | Remove 'Pop quiz' from the narration and the caption. source: E1 | Done – your check | 'Pop quiz' is off the soundtrack, out of the caption and out of the on-page title. Muted 0.00-1.35 rather than cut, so the running time is identical and no gate moved. Transcribed the result back: the words are not there. Re-encoded as v6x and republished. |
| J1 | 10 A police officer explains tricky people | Remake her as a Black officer, or another visible minority. Spencer sketched it live in the meeting: African American, late 20s to early 30s, short cut hair, round glasses. Lock her as a reusable character reference. source: MT | Done – verified | PART DONE 20 Aug – the character lock exists, the film does not yet. Spencer: 'Lock her as a reusable character reference.' Built a four-view turnaround – front, three quarter, side profile, back – to his live sketch from the 17 Aug meeting: African American, late twenties to early thirties, short cropped natural hair, round thin-rimmed glasses, in the same soft 3D storybook render as the rest of the course, with the shipped officer frame used ONLY as the style guide and not as a face. It is now a Higgsfield element, SOS-Officer-BAKER, id 4fc10042-0181-44e6-bb9b-1c06940ddd6e, and its description carries the wardrobe, the no-lettering and no-weapon rules, and the performance note that she is the one adult in the badge whose job is to be safe to approach. WHAT REMAINS AND WHY IT IS NOT DONE: she is on camera and lip-synced for the entire 115.2 seconds of the film, across all ten shots, so remaking her means re-rendering the whole film against its existing narration. That is roughly ten renders. I am not spending that until Velma and Rachel have looked at the face, because the face is a casting decision and not mine to close. |
| J1b | 10 A police officer explains tricky people | Recast all ten shots with SOS-Officer-BAKER via the proven wan2_7 audio-driven pipeline. One pass, internally consistent. source: VG 21 Aug | Done – verified | SHIPPED 22 Aug as sos-ps-09-officer-v10x-720.mp4, 9,000,664 bytes, HTTP 200 from the live URL. J1, J1b and J6b closed in ONE pass, which is the only way they could close: J6b fixed her AUDIO on 21 Aug but left her mouth shaping 'awful', and recasting her re-renders every shot she is in – so the recast was driven by the CORRECTED track and fixed the casting and the lipsync together. Every audio segment was cut from v8x, the J6b build; cutting from the shipped v7x would have lipsynced her to 'awful feeling' and quietly undone J6b while every check still passed. AND IT WOULD HAVE BEEN UNDONE ANYWAY: ps_content.py was still pointing at v7x, so v8x had NEVER GONE LIVE – the film a child watched this morning still said 'awful feeling'. Ten shots re-rendered on wan2_7 from ten start frames carrying the new officer, each driven by its own audio segment. Verified: 2876 frames in and 2876 out, 115.04s both, audio stream BIT IDENTICAL to v8x (md5), all four gates – 10.30, 49.45, 67.55, 105.20 – land on untouched audio and were read back from the live page. Ten sampled seconds all show the recast; a twelve-frame contact sheet shows the same woman, same uniform, same room throughout. Two things had to be solved to get there and both are written into officer_pipeline.py: wan2_7 stops at 15s while shot 2 spans 15.08s, and every dissolve gap has to come from somewhere. Each shot now claims exactly its own [a,b] – the span its audio was cut from – and each gap is BUILT as a cross-dissolve between neighbours, so no shot's mouth is slid off its own track. Shot 2's remaining two frames are a hold, allowed only because the track under them measures -90.2 dBFS: digital silence. |
| J2 | 10 A police officer explains tricky people | Change to 'behaviors' throughout the on-screen text. source: E1 | Done – your check | 'behaviours' to 'behaviors' throughout, covered by the A12 sweep. |
| J3 | 10 A police officer explains tricky people | Make it visual and interactive in the same way as the other lessons. source: E1 | Done – your check | DONE and live. NO. GO. YELL. TELL. is now four drawn cards tapped IN ORDER, with the order number appearing on each as the child builds the sequence – the only question in the badge that was still a wall of text is now asked with a picture like every other one. A tap out of order shakes the card and says so; nothing locks and Continue stays shut until the order is right. Proved on a 390px phone: 4 cards, nothing disabled after a wrong tap, Continue lit only after NO-GO-YELL-TELL. |
| J4 | 10 A police officer explains tricky people | Yes – captions now run on every film in the player, painted by the player itself so they work on iPhone, with a CC button. source: E1 | Done – verified | — |
| A12 | Whole badge | Sweep to American spelling badge-wide. VERIFIED occurrences: challenge Q2 'neighbour' (x2 in ps_content), 'behaviour/behaviours' (3 in ps_content, 5 in ps_gates), 'apologise' (1 in ps_gates). Check captions and narration text too. source: E3 | Done – your check | SWEPT AGAIN 21 Aug after an audit caught a NEW one that I had introduced myself: the E4 code-word teaching written earlier the same night used 'neighbour' in a key point a child reads. Corrected to 'neighbor' and the player copy re-swept for behaviour, colour, favour, centre, practise and the rest – none remaining in player-facing text. The lesson here is that a spelling sweep is only true as of the moment it ran; any new copy written afterwards has to be swept again. |
| H3 | 7 The stranger on the bike | Extend the re-animated shot past 22.37, or re-animate the tail, so the stranger is still present until Brandon walks on. VERIFIED on the shipped master: at 20.0s and 22.0s he is there holding the bike; from 22.6s to the end he is gone and the bike stands riderless. source: E3 | Done – your check | RE-ANIMATED and live. The teenager holds the bike to the end of the shot. This is the tail I wrongly claimed was fixed before – the earlier fix only reached the re-animated middle. bike v7x. |
| H3b | 7 The stranger on the bike | Re-block the shot: Brandon keeps his distance and goes the other way. source: VG 21 Aug | Done – your check | SPECIFIED AND READY, renders with A10c in one pass on sos-ps-06b-bike. Measured from the contact sheet: at 24-27s Brandon walks directly in front of the stranger at roughly arm's length, which contradicts the lesson's own teaching in the same film – 'keep at least five steps away from the stranger on his bike'. Re-block so he keeps his distance and goes the other way. Same shot carries the A10c cast change and the lure becoming a girl. KEEP UNCHANGED: the lie-as-she-goes delivery, which Velma explicitly asked to preserve in H2 – 'the whole point of that thing too that kids pick up on is the guy sounds like he's trying to make up a lie while he's talking to the kid'. DONE AND LIVE in the same bike v11x pass. Confirmed from the frames first: at 24.60 he walked directly past her at arm-s length, right in front of the bike. Shot 3, frames 564 to the end, is re-blocked so he turns and walks AWAY up the pavement with his back to camera, glancing once over his shoulder, and the gap between them only widens. She stays on the bike and does not follow. It took three attempts at the start frame: KEEP THIS FRAME AND CHANGE X kept preserving the very blocking that was the problem, and only a concrete description of his NEW position – far left, well back, we see his back, several metres of empty pavement between them – actually moved him. |
| I2 | 9 The pizza nobody ordered | Re-animate 8.12-14.24 with the door shut and Brandon behind it. VERIFIED at 12.0s: the door is swung inward on its hinge with Brandon beside the open doorway. Also reconcile the two doors – the delivery man is at a blue front door outside, Brandon is beside a white panelled door inside. source: E3 | Done – your check | RE-ANIMATED and live. The door is shut in every frame and Brandon listens from inside. pizza-a v7x. |
| I2b | 9 The pizza nobody ordered | Re-render the interior shot 8.30-14.24 of pizza-a so it matches the hallway established at 0.00-4.20: same dark wood front door with the arched fanlight, visibly SHUT, same coat hooks and plant, and Brandon with NO backpack. source: VG 21 Aug | Done – your check | DIAGNOSED FROM THE FRAMES, and the earlier I2 proof was checking the wrong shot. I2 verified 'the door is shut in every frame' – and it is, in the shot I2 looked at. Velma is describing a different shot in the same film. Contact sheets: pizza-B has the door shut in all 40 sampled frames end to end, so it is not that film at all. In pizza-A there are THREE breaks across one continuous scene. At 0.60-3.60 Brandon stands in a HALLWAY: dark wood front door with an arched half-moon fanlight, shut, at the end of the hall, coat hooks, potted plant, and he wears no backpack. The shot dissolves at 8.12-8.30 – and dissolving straight through a closed front door to an interior is itself why a viewer reads it as the door opening. At 8.40-13.50 he is in a LIVING ROOM with a couch, coffee table and framed pictures, the front door is now a PLAIN PALE PANEL DOOR filling frame left with its face toward camera, and he is suddenly WEARING A BACKPACK. Three different front doors in one lesson counting the blue exterior. Whether or not that pale door is technically ajar is beside the point: the house changes, and in the one lesson whose whole teaching is do not open the door, it reads as opened. IN PROGRESS: new start frame generated from the film's own 3.92s hallway frame so the set cannot drift, then wan2_7 audio-driven over the 8.30-14.24 window – Brandon speaks there ('Pizza? I didn't order pizza' / 'Mum didn't say she was ordering pizza'), so the shot needs real lipsync, not a still. BUILT, PUBLISHED AND CHECKED. pizza-a v11x, media 60092, live on the lesson and the badge page. The interior is now the hallway the film opens in: same dark wood front door with the arched fanlight, shut in all 24 sampled frames of the new shot, same coat hooks, plant and chair, and no backpack. Lipsync checked the way the house does it – the 6 loudest frames all have his mouth open, the 6 quietest all have it shut. BOTH DISSOLVES HAD TO BE REBUILT TOO: the master's own dissolves at frames 203-207 and 356-360 blend the exterior with the OLD interior, so leaving them would have kept a ghost of the backpack shot on screen for a fifth of a second at each end and then popped. They are now cross-fades between the exterior and the new hallway; checked frame by frame at both ends. Proof that nothing else moved: 626 frames and both durations identical to the master, the AUDIO STREAM IS BIT IDENTICAL (md5 match), which is what keeps the gate at 13.70 valid since it sits inside the replaced window, and sampled frames outside the window differ from the master by under 0.7 mean levels while frames inside differ by 19-55. The file fetched back from the site is md5-identical to the one built here. Script: i2b_pizza_door.py. TAKE 1 WAS THROWN AWAY and the reason is worth keeping: the prompt said he 'glances toward the door and then away' and the model turned him around – by 2.5s his back was to camera, through his own dialogue. |
| I3 | 9 The pizza nobody ordered | NOT REPRODUCIBLE on the current master. Frames at 0.5s, 2.0s and 3.5s show one Brandon alone in the hall. The duplicate-Brandon defect was in the 17 Aug build and was replaced. Most likely she is looking at a cached copy. source: E3 | Done – your check | CLOSED 21 Aug on Spencer's instruction that nothing should wait on Velma. Not reproducible: the moment she describes is not in the file that ships, verified against the published master. The most likely cause is a cached older cut in her browser. If she hard-refreshes and still sees it, she only needs to name the timecode and it reopens in minutes. |
| L1 | 8 The lost puppy | Re-render the man's dialogue with a natural cadence, matching the treatment agreed for Josh and Brandon. His words do not change – they are Sgt Mungar's verbatim. source: E3 | Not started | — |
| L1b | 8 The lost puppy | Cast a natural adult male voice (not Josh), render his three lines, re-sync the mouth. Same work item as L1. source: VG 21 Aug | Not started | — |
| L2 | 8 The lost puppy | Re-animate the closing beat: Brandon walks away. VERIFIED on the shipped master – from 22.0s to 27.6s he is turned toward the man, standing still. source: E3 | Done – your check | RE-ANIMATED and live. Brandon turns and walks away; the man stays put. puppy v3x. |
| J5 | 10 A police officer explains tricky people | Rebuild the caption track from the Maeve narration that actually plays. VERIFIED: the track has 54 cues running to 195.7s over a film that is 115.2s long, and it opens 'Hi guys, I am here at the headquarters of the Hamilton Police Service… And this is Sergeant Barry Mungar… It is my pleasure Charlotte.' None of that is in the film. source: E3 | Done – your check | Officer caption track rebuilt from the film's own audio. Was 54 cues running to 195.7s over a 115.2s film, carrying the ORIGINAL Hamilton Police interview – 'Hi guys, I am here at the headquarters…' – words not in this film at all. Now 36 cues ending at 114.40s, word match 0.96. This is what Velma experienced as 'the voice is not synced'. |
| J6 | 10 A police officer explains tricky people | Pick one term and use it everywhere. source: E3 | Done – your check | DECIDED 21 Aug rather than left sitting with Velma, per Spencer: nothing should be waiting on her. Checked the source rather than guessing. Sergeant Mungar says 'awful feeling' throughout the 2017 interview, and that interview is ORIGINAL client audio which we do not alter – the audio is sacred. So the officer film keeps his words. The course's own standing term in the written material is 'your instincts' – 'Always trust your instincts' – not 'uh-oh feeling' either. The answer is therefore: instincts is the course standard everywhere we write new material, and 'awful feeling' survives only where the officer is quoting Mungar verbatim. Nothing needs re-recording. If Velma wants one term in his mouth too, that is a re-record of a 2017 interview and a separate decision, not a blocker on this delivery. |
| J6b | 10 A police officer explains tricky people | Re-render the closing line with 'uh-oh feeling', re-sync that shot's mouth, keep duration exact. source: VG 21 Aug | Done – verified | AUDIO DONE AND MEASURED. PICTURE RIDES WITH J1b – do not ship this on its own. She named one occurrence; there are two, 103.32 and 113.64, about ten seconds apart. Spencer confirmed both. The shipped track turns out to be assembled from separately generated segments joined by TRUE digital silence, so the film handed us its own splice points: block A 98.006-104.266 and block B 110.262-114.862, each a complete sentence bounded by silence at both ends. Voice cloned from the officer's own audio (10.40-23.80s) on Higgsfield seed_audio, the Josh path. Chosen takes measured against the blocks they replace: A original 198.1 Hz / 7.24 st vs full_A2 199.3 Hz / 8.46 st; B original 185.4 Hz / 8.63 st, p10 148.3 p90 244.2, vs take_b4 206.3 Hz / 9.41 st, p10 145.5 p90 250.6. FOUR OF ELEVEN TAKES SILENTLY SWALLOWED 'uh-oh' into 'own', 'Aho', 'O' or 'OO' – and the fastest takes, which the duration fit wanted, were the worst offenders. Every take was transcribed before it was trusted. Built by j6_uhoh.py to prod/j6/sos-ps-09-officer-v8x-720.mp4: 2876 frames and both durations identical to the master, 'awful' zero times, each replaced window read on its own says 'uh-oh feeling', all four gates (10.30, 49.45, 67.55, 105.20) still quiet. On-screen wording in ps_gates.py changed to match. WHAT IS NOT DONE: her mouth still shapes 'awful', and block A is time-fitted by 4 percent so lipsync drifts across those 6.26 seconds. J1b recasts all ten officer shots audio-driven from this corrected track, which fixes the mouth in the same pass. J6b and J1b ship together. |
| K1 | 11 Badge challenge | Nothing to change. Closed 21 Aug on Spencer's instruction: 'There should be nothing waiting for Velma.' The badge challenge is built, published and verified; her review is a review, not a repair, and it does not hold the delivery open. source: E1 | Done – verified | — |
| K1b | 11 Badge challenge | Replace with a relevant still per question (nano_banana, house style, existing character locks). source: VG 21 Aug | Done – your check | Root cause was NOT missing content – ps_content.py carried img/alt all along; challenge_steps() in ps_build_player.py dropped them, so the player fell back to data-empty 'This step is yours to do' (sos-player.js:672). Also found Q2 was counter-teaching: its correct answer is Yes (Dad gave permission) while the image was ps-minivan.png, the stranger's danger van. Five frames pulled from shipped masters and eyeballed on a contact sheet before choosing: Q1 gift@10.5s, Q2 intro@2.0s neutral street, Q3 puppy@10.5s man showing phone, Q4 gift@24.5s, Q5 trust-a@8.0s the uh-oh close-up. Uploaded as sos-ps-challenge-q1..5.jpg, media 60080-60084, URLs read back from the uploader per the WP-rename rule. Wired img through challenge_steps(), painted in Player.open, restored in resume(), .sosp-qimg CSS added. Published: challenge page 175198 bytes, badge page 230923 bytes, 5/5 images present on both. Confirmed on screen in Chrome 22 Aug – Q1 shows the gift frame, placeholder gone. |
| M1 | Player chassis | Fix the stage. It may grow downward, it may never move the top of the player or change its width. A part with no film keeps the same stage box. source: SF 20 Aug | Done – your check | The stage is a fixed 16:9 box (aspect-ratio:16/9, max-height:54vh) with the video absolutely positioned inside it and object-fit:contain, so the film letterboxes into the box instead of resizing it. A film-less part paints a cream gradient in the same box rather than removing it. Measured on the PUBLISHED page across six very different parts – intro film, badge screen, six-rules signs, a trust-meter gate, a quiz and the badge challenge – at 390, 820, 1440 and 1900px: width, height and document top identical every time (864×486 at top 310 on desktop). Nothing moves. |
| M2 | 4 The six rules | Draw a real octagon. source: SF 20 Aug | Done – your check | An inline SVG regular octagon with a white inner stroke and the rule number in the middle, in a flex-none square box that cannot be stretched by its row. The bug was mine twice: the first build had no width/height on the box so the flex row pulled it wide, and when I rewrote the E2 block I deleted the .sosp-sign / .sosp-oct layout rules and it ballooned to full width again. Measured on the PUBLISHED page: 43×43 on a 390px phone, 56×56 tablet, 67×67 desktop and wide – square at every size, in the lesson and in the reference card. |
| M3 | Player chassis | Full-width white pages, player maximised for the browser window, mobile or desktop. source: SF 20 Aug | Done – your check | The page is published with hideTitle and a full-bleed wrapper; the theme box, its shadow and the duplicated page title are gone. The player caps at 1140px on very wide screens so the lines of text do not run to 1900px, which is a readability limit, not a theme box. |
| M4 | Player chassis | Everything the player speaks – rule audio, option feedback, narration – gets a stop control while it is speaking. source: SF 20 Aug | Done – your check | CORRECTED 21 Aug – the earlier proof was PARTLY FALSE. It claimed leaving a part, opening a panel or jumping lessons all called stopAudio. True for part change, false for both panels: toggleRules and toggleJump only called v.pause(), so a rule kept being read aloud from behind the six-rules card. Measured before the fix: open the card with sound playing and isMakingSound stayed true, paused false, currentTime advancing 1.1 to 2.0. Both panel paths now call hushAll, the same single hush that part-change already used. MEASURED ON THE PUBLISHED PAGE: rules card after open gives paused true, currentTime 0, isMakingSound false; the lesson list gives the same; part change unchanged as the reference. |
| M5 | Player chassis | Scale type to the player, proportionally, so it works on phone and desktop both. source: SF 20 Aug | Done – your check | Every type size in the player is calc(Npx * var(–u)), where –u is set from the player's own measured width: 0.72 + width/1400, clamped to 0.95-1.60. A phone at 390px lands near 0.99 and a 1440px desktop near 1.55, so desktop text is about half again as large as phone text and the whole panel scales together instead of one label growing. –u is separate from –k, the shrink factor used to fit a gate into the visible box, so a gate can shrink without the base type changing. |
| M6 | Player chassis | Fix it. source: SF 20 Aug | Done – your check | The title had line-height 1.15 against a 900-weight face whose descenders sit below the box. Now line-height 1.32 plus 2px of scaled bottom padding. Measured on the PUBLISHED page: box height 45px, scrollHeight 45px – clipped:false. The same treatment was applied to the two other 900-weight lines that could clip. |
| M7 | Player chassis | Leaving a part silences it, always. source: SF 20 Aug | Done – your check | Pausing the element was not enough: loading a part with no film left the previous film's source attached and playing. The fix is to clear the sources and call v.load() on a film-less part, which is the line that was missing. Proved on the PUBLISHED page: play the intro film, confirm !v.paused is true, jump to the badge screen – v.paused true, isMakingSound() false. |
| M8 | Player chassis | Whenever the player is making sound and is out of view, its controls must be on screen. source: SF 20 Aug | Done – your check | A docked bar – 'Still playing', Pause, Back to the player – that appears only when the player is both making sound and out of view. IntersectionObserver did not fire and getBoundingClientRect reported top:0 at scrollY 1865, so the visibility test walks the offsetParent chain and compares document-space positions instead. Proved on the PUBLISHED page in both cases that matter. A film playing with the player scrolled off at scrollY 3217: dock shown, fully inside the viewport at top 828 / bottom 886 of 900, Pause silences the film, dock hides. A rule read aloud on the six-rules lesson, which has no film at all, with the player scrolled off: same result, and the STOP button over the stage was lit the whole time. Hidden whenever the player is in view, and hidden in full screen, where the player IS the window and can never be out of view. |
| M9 | 4 The six rules | Restyle it to something a 9 to 12 year old would want to look at, with correct grammar and capitalisation. source: SF 20 Aug | Done – your check | Titled 'The 6 People Safety Rules', opened by a button reading 'The 6 Rules' with a numbered stop sign on it. Card is cream with a heavy ink border, a dashed rule under the heading, and the six rules as numbered octagon cards, two across on anything wider than 520px. Shot on the PUBLISHED page at 390, 820, 1440 and 1900px – all six rules read in full, in Velma's wording and her order. |
| M10 | Player chassis | Anchor both overlays to the window, not to the player, and let Escape close whatever is covering the player. source: Fernando | Done – your check | Both panels were position:absolute inside .sosp, so their height was the PLAYER's height. On desktop the player is taller than the window, so the card was centred in the PLAYER and its bottom fell past the bottom of the screen. Now both are fixed to the viewport with the box capped at 100vh and scrolling inside itself, and the heading stays put while the rules scroll under it. Escape now closes the lesson list first, then the rules card, and only leaves immersive mode when nothing is over the player. Proved on the PUBLISHED page at 390×844, 820×1180, 1440×900 and 1900×1000: the card and all six rules fully inside the window at every size, all twelve lesson rows reachable, and Escape closes both at every size. |
| M14 | Whole badge | Republish the badge page after every change, and never treat a lesson-page publish as if it covered the badge. source: Fernando | Done – your check | THE WORST DEFECT OF THE NIGHT AND THE ONE NOBODY WOULD HAVE SEEN COMING. ps_publish_player.py republishes the ten lesson pages; the badge page is built and published by a SEPARATE pair of scripts, and through the whole run only the lesson publisher was being called. So /people-safety/ still carried the pre-overnight cuts of eleven films – 20 parts against the correct 21 – while every lesson page and every uploaded master was current. Fixed by rebuilding and republishing the badge: 21 parts, all 17 current films plus the montage, confirmed by fetching the live page and diffing its film list against ps_gates.py – 18 named, 18 served, none superseded, none missing. ALSO FOUND AND FIXED: the standalone badge-challenge page was not on the current player either – it was excluded from the publisher because its steps carry no video key, so it sat on an older build with all four of the player defects found tonight still live in it. The publisher now handles a film-less lesson the same way the badge page already did, using a shared helper; the badge output is byte-identical before and after the refactor, which proves it inert. STANDING RULE FROM THIS: a publish is not done until the badge page and the challenge page have both been rebuilt and re-fetched. |
| M13 | Whole badge | Make the lip sync right, everywhere a character is on camera speaking. source: SF 21 Aug | Done – your check | CAUSE: not a voice fault and nothing to do with ElevenLabs. Every generated shot in this badge was made with Higgsfield seedance, which takes NO audio input, so the mouths were never driven by the dialogue at all – they were invented from a still and a text prompt while the soundtrack ran alongside, unrelated. The gap in my own process is that no verifier ever asked whether a mouth matched its words. REPAIR PATH TESTED AND REJECTED: Sync Lipsync 3 held duration and the character perfectly but did not re-time anything – measured 0.946 self-correlation with the original mouth timeline, mouth wide open through silence and shut at peak speech, and no way to choose which face it drives. FIX: re-generate on wan2_7, which ingests the audio at generation time. Audited all 44 non-original shots by reading frames: only 15 show a character on camera speaking, 162.7s. 04-secrets is exempt – punch item D4, Velma accepted the slide-style still art. All 15 reshot and verified: mouth OPEN on every loud frame and CLOSED on the silences, character on-model, and where two people are in shot only the speaker's mouth moves. Objective sync on the officer film improved from r=0.22/0.06/0.02/-0.01/-0.06 to 0.40/0.41/0.60/0.47/0.40 with best lag moving from -11..+12 frames to 0. Duration drift 0.0000s on all six films and the audio stream bit-identical by MD5 on every one, so not a single gate moved; verify_gates re-passed 32/32. Live as minivan v7x, bike v9x, pizza-a v9x, puppy v5x, officer v6x, rules-d v9x. ~550 credits. |
| M12 | Whole badge | Put a smooth transition at every generation join, without moving a single gate. source: SF 20 Aug | Done – your check | RE-RUN AND RE-PROVED 21 Aug. The first pass tonight took 11 hard cuts to 0, but every film re-rendered afterwards – E3, E6, G2, A10, D3 and the M13 lip-sync pass – butted back in as a fresh hard cut. That is the systemic lesson: RE-RENDERING A FILM SILENTLY INVALIDATES THE DISSOLVE PASS, so the dissolve must be the LAST step before publishing, every time. Re-ran the detector over all 17 CURRENT live masters after the night's work: 2 hard cuts survived, in rules-d and bike. Both dissolved at 0.12s by the overlay method that holds the last frame before the cut and fades it out over the incoming shot, so running time is untouched. Drift 0.0000s on both, audio bit-identical. Detector re-run on the output: 2 -> 0. THE WHOLE BADGE NOW MEASURES ZERO UNDISSOLVED HARD CUTS across all 17 films. verify_gates 32/32. Live as rules-d v12x and bike v10x. 02-gift stays excluded – its 15 cuts are a human editor's real edits, and a dissolve is only ever for a seam we made. |
| M11 | Player chassis | Give the key points a home in the full-screen grid, and stop the dock reporting the player as out of view when the player IS the screen. source: Fernando | Done – your check | In landscape the chassis becomes a named grid – head / stage / line / note / deck – and .sosp-crib was not one of the names, so it was auto-placed into an implicit row under the whole grid and clipped by the 100dvh overflow:hidden. It now sits in the deck column beside the film, which is empty whenever no question is on screen, and scrolls in its own box; the tray takes the column back the moment a gate opens. The pips got a row of their own instead of floating. syncDock now returns early while immersive, because a fixed, full-window player is never out of view. Proved on the PUBLISHED page with a film playing at 1440×900, 1900×1000, 844×390 and 1180×820: key points visible and fully inside the window at all four, scrolling internally on the landscape phone, pips inside the window, dock off. |
| A13 | Whole badge | Have the narrator read the response to every question, using the ORIGINAL narrator's voice. Render one clip per feedback line, wire into the player's existing per-option audio slot. source: VG 21 Aug | Done – your check | DONE 23 Aug and live. All 56 answer-feedback lines in the player are spoken by the real ElevenLabs Josh, nzFihrBIvB34imQBuxub, rendered through the ml-tts-bridge route on the Persona site so no key ever leaves that site. Every clip MEASURED before it was allowed in: median F0 inside 116-134 Hz, movement >= 4.0 semitones, p10-p90 >= 10 semitones. 56/56 pass; F0 126.0-130.1, median 127.0 against the shipped narration's 127.1, so they splice with no audible change of narrator. Wired on GATES (ps_gates.py A13_AUDIO), which is what both the badge page and the ten lesson pages build from – the first pass wired ps_content.py, which the player does not read, and that is recorded in RULE-the-page-is-built-from-gates-not-content. Live badge page re-fetched: 56 distinct sos-fb-*.mp3 present. Spencer's call, 23 Aug: the ten badge-challenge answers KEEP Velma's own 2017 recordings and are deliberately untouched. |
| E9 | 4 The six rules | Add her intro narration before rules-a, in the Josh clone: 'Listen to your instincts and follow the 6 safety rules to help keep you safe.' Wording VERBATIM. Gate timecodes after it must not move – add as its own part or pre-roll clip, not by lengthening rules-a. source: VG 21 Aug | Done – your check | PART DONE – the audio exists, the shot does not. Her line 'Listen to your instincts and follow the 6 safety rules to help keep you safe' is rendered in the approved Josh voice (Higgsfield seed_audio, element 4d7b60a2-392a-4462-bcd7-3f447fdb8ec1), 4.03s, at prod/velma_new/V7-instincts-josh.wav. MEASURED: median F0 126.4 Hz against the Josh clone source at 125.7 and the shipped secrets-v5x narration at 127.1, so it will splice without an audible voice change; pitch movement 3.32 semitones against the Josh baseline of 2.74 +/- 0.66, so it will not read robotic – that is the A8 standard she set. Transcribed back with faster-whisper and it matches her script verbatim ('6' is spoken as 'six'). WHAT REMAINS: a shot to put it on, before rules-a, and the splice. Not shippable as audio alone. DONE AND LIVE, and it needed NO shot at all – the plan above was wrong. Her line belongs on the six-signs card, not on a new film, because she was equally explicit about that same slide: "No animation needed – the animations come in the other lessons." So the card now speaks. The line plays itself when the card opens and stays TAPPABLE for as long as the card is on screen, which matters twice over: a browser blocks audio that starts without a gesture, and a line a child hears once and cannot replay is worse than no line. Media 60156, served 65663 bytes. Read back FROM THE SITE and measured: transcribes as her wording verbatim, 4.03s, median F0 124.7 Hz against the Josh baseline of 127.1. Present in the published badge config on part 4, module signs, alongside all six rules. Not one gate timecode moved, because nothing was added to a film. The play mark is an inline SVG polygon, not a numeric entity – the badge builder refuses any page containing an ampersand, so an entity would have failed the whole publish. STILL NEEDS A HUMAN CLICK: I could not drive the part change from a background tab, so nobody has yet seen it render. |
| A14 | Whole badge | Add a character-and-vehicle continuity check to the pre-publish routine (who is in shot, in which seat, across every shot of a scene), and Spencer reviews each changed lesson before anything goes to Velma and Rachel. source: VG 21 Aug | Done – verified | PART DONE – the tool is built and running, the habit is not yet a habit. continuity_check.py cuts every film at its shot boundaries, takes the middle frame of each shot and tiles them onto ONE sheet per film with timecodes burned in, because continuity defects are only visible when the shots of a scene sit side by side – which is exactly why every one of them shipped. 17 sheets built, prod/continuity/, plus REPORT.md. IT IMMEDIATELY CONFIRMED THREE OF HER OWN ITEMS: the minivan sheet shows one occupant at 0-6s, two at 6-9s and an EMPTY van from 18s to the end (V14 and V16); the bike sheet shows Brandon walking directly in front of the teenager at 24-27s (V19). Deliberately does NOT pass or fail anything – an automated continuity judgement is the confident-and-wrong proof this project keeps getting bitten by; it puts the shots where a person can compare them. WHAT REMAINS, and it is the half Velma actually asked for: 'please ask Spencer to review the videos for consistency before sending to Velma and Rachel.' That is a step in the publish runbook and a person doing it, not a script. Added to RUNBOOK-publish.md; not yet exercised on a real delivery. FINISHED 22 Aug, and the remaining half turned out to be a bug rather than a habit: the boundary finder called ffmpeg select=gt(scene,0.25), and EVERY cut in these films is a two or three frame cross-dissolve, which never makes the single big frame-to-frame jump that detector looks for. On the minivan it found NO CUTS AT ALL, fell back to a 3-second grid, and averaged away the exact defect this file exists to catch. Rebuilt on per-frame mean absolute difference over 160px grey frames, threshold 6.0, adjacent hits collapsed – the method used everywhere else in this tree – and it now returns the minivan four real cuts to the frame: 4.40, 9.96, 17.56, 18.36. Wired in as RUNBOOK step 10b, stated there as a REVIEW AID and not a gate. First real use, on minivan v10x, put all seven shots side by side and showed both occupants in every one. |
2. Shot by shot
Every shot of every film in the badge, with a picture of it and its timecode — where it came from, and why it was built that way. Nothing to read unless you want to: look at the pictures.
| Timecode | Origin | What is on screen | Built | Why · lesson state |
|---|---|---|---|---|
| Lesson 1 — People Safety – start here sos-ps-01-intro-v5x-720.mp4 B1 B1b B2 | Done – your check | |||
0:00.00–0:09.60 | ORIGINAL | Brandon walks home along the street at dusk; narration introduces tricky people. | 2017 export, picture untouched | Velma: 'Video is very good.' |
0:09.60–0:12.40 | ORIGINAL | Continues to the line about learning to recognise tricky people. | 2017 export | The player STOPS here. From 12.40 the original says 'Click on the People Safety icon', which does not exist in this build. |
0:12.40–0:16.80 | ORIGINAL | NEVER PLAYS. The stale click-the-icon instruction. | 2017 export, left in the file but gated out by endAt=12.40 | Cutting the file would have desynced the captions; gating is safer. |
| Lesson 2 — The gift from Mr. Taylor sos-ps-02-gift-v2x-720.mp4 C1 C2 C3 | Done – your check | |||
0:00.00–0:01.88 | ORIGINAL | Establishing – Brandon on the pavement with headphones. | 2017 live action | Live action retained by Spencer's decision, 17 Aug. |
0:01.88–0:04.50 | ORIGINAL | Mr. Taylor at his car with boxes, calls out. | 2017 live action | — |
0:04.50–0:07.42 | ORIGINAL | 'You've got to turn down that music and pay more attention, Brandon.' | 2017 live action | — |
0:07.42–0:08.59 | ORIGINAL | Brandon reacts. | 2017 live action | — |
0:08.59–0:12.72 | ORIGINAL | Mr. Taylor offers the monster card. | 2017 live action | Card kept generic and non-distinctive – agreed 17 Aug. |
0:12.72–0:16.56 | ORIGINAL | Brandon takes the card. | 2017 live action | — |
0:16.56–0:19.39 | ORIGINAL | Two shot on the pavement. | 2017 live action | — |
0:19.39–0:21.19 | ORIGINAL | Mr. Taylor works out when Brandon's mum gets home. | 2017 live action | Velma's revised key point 4 covers this beat. |
0:21.19–0:23.69 | ORIGINAL | 'Why don't we play online before she gets home?' | 2017 live action | — |
0:23.69–0:26.15 | ORIGINAL | Brandon hesitates. | 2017 live action | — |
0:26.15–0:28.36 | ORIGINAL | 'Let's keep this between you and me.' | 2017 live action | The line the whole lesson turns on. |
0:28.36–0:34.66 | ORIGINAL | Brandon's reaction to the secret. | 2017 live action | — |
0:34.66–0:37.29 | ORIGINAL | Mr. Taylor closes the exchange. | 2017 live action | — |
0:37.29–0:41.92 | ORIGINAL | Brandon leaves. | 2017 live action | — |
0:41.92–0:43.42 | ORIGINAL | Mr. Taylor watches him go. | 2017 live action | — |
0:43.42–0:46.40 | ORIGINAL | Closing beat; the gate opens at 45.20. | 2017 live action | — |
| Lesson 3 — Secrets, surprises and privacy sos-ps-04-secrets-v5x-720.mp4 D1 D1b D2 D4 | Done – your check | |||
0:00.00–0:12.00 | NEW | Title beat – 'what is the difference between a secret, a surprise and privacy?' | Built 17 Aug, flat illustrated style | Whole lesson is NEW – it does not exist in the 2017 course. Velma: 'a much better video than the first one produced.' |
0:12.00–0:21.00 | NEW | PRIVACY defined – your own space, things you do not have to share. | Built 17 Aug | — |
0:21.00–0:28.16 | NEW | Privacy examples – door shut, password, diary. Gate at 28.00. | Built 17 Aug | — |
0:28.16–0:37.68 | NEW | SURPRISE defined – hidden for a little while to make somebody happy. | Built 17 Aug | — |
0:37.68–0:43.04 | REANIMATED | A surprise always comes out in the end. Gate at 42.30. | Built 17 Aug; still re-cast 21 Aug (A10) – same Ken Burns push, same lower-third | Punch item A10, Velma: 'everyone in the background is white… I do think it is a good idea to have boys and girls in different colors.' The two younger party guests are now a Black girl and a South Asian boy; Brandon and the woman are unchanged. |
0:43.04–0:51.96 | REANIMATED | SECRET defined – somebody asks you never to tell. Some secrets are fine. | Built 17 Aug; still re-cast 21 Aug (A10) – same Ken Burns push, same lower-third | Punch item A10. The playground friend is now a Black girl with afro puffs; she still reads clearly as a girl, per Velma's 'boys and girls' note. Brandon unchanged. |
0:51.96–1:04.24 | NEW | The four unsafe feelings named – scared, confused, sad, uncomfortable. | Built 17 Aug | Gate moved to 61.30 on 17 Aug so the question is asked AFTER the feelings are named. |
1:04.24–1:11.08 | NEW | The rule – if a secret makes your tummy feel funny, tell a trusted adult. Gate at 70.85. | Built 17 Aug | Gate moved from 65.50 to 70.85 – it used to be asked before the rule was spoken. |
1:11.08–1:15.00 | NEW | A good adult will never ask you to keep a secret that makes you feel bad. | Built 17 Aug | — |
1:15.00–1:23.84 | NEW | Summary – privacy, surprises, the secret that feels wrong. THE DOOR IS OPEN IN THIS SHOT. | Built 17 Aug | Velma: 'The door is open at the end of the video. It should be closed.' – punch item D3. |
| Lesson 4 — The six rules – rule 1 sos-ps-05-rules-a-v5x-720.mp4 E1 E1b E2 E2b | Done – your check | |||
0:00.00–0:16.00 | ORIGINAL | Brandon with the monster card; RULE 1 'check first with an adult in charge'. Gate at 11.50. | 2017 export, picture untouched | — |
0:16.00–0:20.20 | REANIMATED | Neighbour at the kitchen doorway holds out a wrapped present; Brandon's hands stay down and he looks to his mother. | Re-animated 17 Aug (job 104) to replace a shot whose kitchen, lighting and Mum's clothes all changed across the cut | Continuity: Mum went from a cream apron in a warm kitchen to a pink top in a cooler one, and Brandon gained a backpack, in one cut. |
| Lesson 4 — The six rules – rules 2 and 3 sos-ps-05-rules-b-v10x-720.mp4 E1 E1b E2 E2b E3 E4 | Done – your check | |||
0:00.00–0:08.52 | ORIGINAL | RULE 2 – adults should ask other adults for help, not kids. | 2017 export | — |
0:08.52–0:17.04 | REANIMATED | RULE 3 – a parent and child agree the family code word at the kitchen table, the word shown on screen. | Re-animated 17 Aug | The original narrated the code word over a shot of a family laughing. Spencer: 'There's nothing in that video about a code word.' |
0:17.04–0:25.80 | REANIMATED | At school pickup Brandon ASKS for the code word and the driver answers; his face resolves from unsure to relieved. Gate at 16.60. | Re-animated 17 Aug | The original showed an unlabelled woman by a car and ended on Brandon looking worried while the narration delivered the reassurance. |
| E3 0:04.60–0:09.40 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The man pointing down the street for no reason is gone. Replaced with a woman walking a dog and two figures in the distance, none of them looking at each other. Job fc9598be. |
| Lesson 4 — The six rules – rules 4 and 5 sos-ps-05-rules-c-v8x-720.mp4 E1 E1b E2 E2b E5 E5b E5c | Done – your check | |||
0:00.00–0:07.32 | REANIMATED | RULE 4 'be alert' – Brandon stops, head up, scanning. | Re-animated 17 Aug | The original never demonstrated alertness. NOTE: Velma still finds this shot odd – punch item E5. |
0:07.32–0:14.44 | ORIGINAL | RULE 5 – don't keep unsafe secrets. Gate at 13.90. | 2017 export | Gate moved from 9.50 to 13.90 on 17 Aug so it is asked after rule 5 is fully explained. |
| E5 0:00.00–0:05.25 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 3 takes | THREE takes. Takes 1 and 2 both put Brandon's hood UP – the opposite of the direction – because the start frame had it up and the picture beats the text. Fixed by changing the START FRAME to the hood-down mid frame rather than by rewording the prompt again. He now looks left then right with the hood down, the street filled out, and the car parked square instead of reversing sideways. Job 93652849. |
| Lesson 4 — The six rules – rule 6, No Go Yell Tell sos-ps-05-rules-d-v14x-720.mp4 D3 E1 E1b E2 E2b E6 E7 E7b E8 E8b | Part done | |||
0:00.00–0:10.50 | ORIGINAL | RULE 6 introduced; NO – Brandon stands tall, palm out. | 2017 export | — |
0:10.50–0:14.00 | REANIMATED | GO – Brandon moves away down a shopping street. | Re-animated 17 Aug | Original had Go, Yell and Tell as one unbroken run cycle. VELMA REJECTS THIS SHOT: he should not run, he should walk – punch item E6. |
0:14.00–0:17.80 | REANIMATED | YELL – Brandon stopped, hands cupped, mouth wide, heads turning. | Re-animated 17 Aug | VELMA REJECTS THE TIMING: he yells while the narration is still saying GO, and he is yelling at nobody – punch item E7. |
0:17.80–0:21.00 | REANIMATED | TELL – Brandon arrives at a trusted adult at a front door. Gate at 15.80. | Re-animated 17 Aug | Original ended in an unidentified woman's open arms. VELMA: the adult still looks like the shopkeeper he ran from, and the badge never teaches WHO is safe – punch item E8. |
| E6 0:13.90–0:16.45 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 2 takes | Two takes; take 1 had no shopkeeper beat at all. Brandon now raises a flat palm, shakes his head and WALKS away at an ordinary pace. He does not run. The window starts at 3.60s of the take because this segment carries the line 'Go. Get away quickly', so the walk is the beat that has to be on screen, not the palm. Job ca95e041. |
| E7 0:16.45–0:18.10 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | He yells AT the adult who approached him, in profile, with two passers-by turning toward the noise – not down the lens at nobody. The window starts at 1.60s because the take's first second still carries the old hands-cupped pose inherited from the start frame. Job 0dd78769. |
| D3 0:17.80–0:21.00 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 2 takes | The front door is SHUT in every frame of the closing TELL beat. Velma's note was filed against the SECRETS film, which has no open door; it belongs here. Verified on the shipped v9x master first: from 20.2s the front door stood wide open with a framed picture and a console table visible in the hallway behind the trusted adult – the last image of the badge that teaches you do not open the door. She now steps OUT onto the porch and the white panelled door is closed flat against its frame behind her. Take 1 was rejected: the door was correct but seedance re-staged both figures about a quarter larger and cropped Brandon's feet off the bottom of frame, so the shipped framing was lost. Take 2 holds the framing. The E8 trusted adult is unchanged – Black woman in her sixties, silver-grey hair up, glasses, mustard-yellow cardigan, brown skirt. The shipped camera was measured before prompting and is LOCKED OFF, not a push in: background correlation across 17.80-21.00 is identity to 0.999. Jobs 03848434 (start image) and 368ff3f9 (video). |
| Lesson 5 — Your trust meter – instincts sos-ps-06-trust-a-v7x-720.mp4 F5 | Done – your check | |||
0:00.00–0:15.00 | COMPOSITE | Brandon on a shopping street; narration about who is trustworthy. A gibberish AI shop sign is BLURRED OUT from 1.30 to 8.50. | 2017 picture with a tracked gaussian blur added 17 Aug | The sign read 'Caoke / Tameo'. Blurred rather than re-animated so the original performance is kept. |
0:15.00–0:23.40 | REANIMATED | Butterflies as unease – grey-blue, agitated, Brandon unsure. Gate at 20.72. | Re-animated 17 Aug | The original played the warning-feeling beat as delight: golden butterflies and a serene smile. VELMA: butterflies are in his chest, should be his stomach – punch item F5. |
| F5 0:14.00–0:20.47 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The butterflies are at his STOMACH with his hand flat on it, not his chest. Directed to the skill's butterflies/tummy row – brow drawn, glances down at his middle then up, weight shifting. The splice guard REFUSED a 2.40s window because it left only 5.64s of an 8.06s take against a 6.47s segment; 1.55s is the latest start that fits. Job 9063f142. |
| Lesson 5 — Your trust meter – the three feelings sos-ps-06-trust-b-v7x-720.mp4 F4 | Done – your check | |||
0:00.00–0:10.60 | REANIMATED | CONFUSED – shrug, brow drawn, eyes searching. Plain warm background. | Re-animated 17 Aug, time-stretched 1.172x to cover the line | Original had eyes closed and smiling on 'confused'. |
0:10.60–0:14.12 | REANIMATED | UNCOMFORTABLE – shoulders in, chin down, eyes glancing away. | Re-animated 17 Aug (job 102) | Original used the identical frown for uncomfortable and scared. Re-shot again later the same day to remove a backpack that appeared mid-film. |
0:14.12–0:17.60 | REANIMATED | SCARED – eyes wide, brows high, small gasp, hands rising. Gate at 17.15. | Re-animated 17 Aug (job 103) | Gate moved from 4.10 to 17.15 so the question is asked after all three feelings are named. |
| Lesson 5 — Your trust meter – the meter itself sos-ps-06-trust-c-v3x-720.mp4 F1 F2 F3 | Done – your check | |||
0:00.00–0:08.60 | ORIGINAL | The trust meter introduced. | 2017 export | — |
0:08.60–0:17.20 | ORIGINAL | 'Your trust meter should be going – I do not trust, go away.' Gate at 16.60. | 2017 export | Gate moved from 5.00 to 16.60 so it is asked after the answer is given. THE METER ART ITSELF IS REJECTED – punch items F1, F2, F3. |
| Lesson 5 — Your trust meter – four alarms sos-ps-06-trust-d-v9x-720.mp4 F6 | Done – your check | |||
0:00.00–0:08.04 | ORIGINAL | The RIDE alarm – a man leans out of a car at the curb and offers Brandon a lift. | 2017 export, picture untouched | Measured, not assumed: the line 'offers you a ride' is spoken 6.02-7.06 and this picture runs to 8.04, so this line was already on its own picture. |
0:08.04–0:16.56 | ORIGINAL | The GIFT alarm – a man kneels and holds out a wrapped present. | 2017 export, picture untouched | 'Offers you an expensive gift' is spoken 10.98-12.58, inside this picture. Also already correct. |
0:16.56–0:19.10 | REANIMATED | The photographer stands UPRIGHT at his full height with a wide gap of grass between him and Brandon, phone at his own chest height; Brandon holds a flat palm up. | RE-ANIMATED 20 Aug (job fe9e7b79, take 2). Take 1 came back with him bent over again because the shipped frame was passed as an image reference and the picture beats the text – so take 2 was driven from a NEW start image (job 87d850bc) that stages him standing four metres away. | VELMA: 'That's creepy. Maybe we have him not bend over and be in his face like that. Be more natural.' – punch item F6. The window also moved from 16.52-20.82 to 16.56-19.10 so the picture changes when the SECRET line starts, not 1.7s into it. |
0:19.10–0:23.50 | REANIMATED | An adult holds one finger upright against his own lips – the keep-it-quiet sign – and holds it. Gate at 21.90. Player STOPS at 22.30. | RE-ANIMATED 20 Aug (job 2c46b3b5, take 1). Window starts at 2.00s of the take, which is where the finger reaches the lips; anything earlier shows it still climbing. | THERE WAS NO SHUSH ANYWHERE IN THE FILM. Spencer: 'make sure you synchronize… the finger over his lips… at the point where the voice says that.' The secret line is spoken 19.18-21.28 and the old picture did not change until 20.88 – 1.7s late, and when it did change it was only the photographer standing up. Now the gesture is at the lips within 0.12s of the cut – punch item F6. |
0:23.50–0:25.08 | ORIGINAL | Never played. The original 'click the button to practice' tail, gated out by endAt=22.30. | 2017 export, left in the file | Cutting it would have moved the running time and every gate with it. |
| F6a 0:16.56–0:19.10 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 2 takes | The photographer now stands bolt upright with four metres of grass between him and the boy, phone at his own chest height. Take 1 failed: passing the shipped frame as an image reference held him bent over exactly as before – the picture beats the text, the same failure as E5's hood. Take 2 was driven from a purpose-generated start image instead. Jobs 87d850bc (start image) and fe9e7b79 (video). |
| F6b 0:19.10–0:23.50 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The keep-it-quiet finger, which did not exist anywhere in the film before today. The window starts at 2.00s of the take because that is where the finger arrives at the lips; the secret line starts at 19.18, so a climbing hand would have landed the gesture after the sentence. Job 2c46b3b5. |
| Lesson 6 — Your dad's been in an accident sos-ps-06a-minivan-v9x-720.mp4 G1 G1b G1c G2 G2b G3 G4 G4b | Done – your check | |||
0:00.00–0:07.30 | ORIGINAL | Brandon walking; the van approaches. VELMA REJECTS: the van drives up onto the pavement here – punch item G1. | 2017 export | — |
0:07.30–0:09.89 | REANIMATED | The driver waits, still, through the measured silence. | Re-animated 17 Aug (job 21) | Original had him miming a full line into 1.5s of silence. |
0:09.89–0:17.10 | REANIMATED | The driver speaks both his lines, animated, in frame to his last word. | RE-ANIMATED 19 Aug (job 47774b33). The WOMAN now leans out and delivers the accident line, flat and businesslike per RULE-never-perform-the-lure, with the man at the wheel. Take 1 accepted. | Original held a closed-mouth grin through both lines and drifted out of frame mid-sentence. VELMA: make it a man AND a woman, with the woman speaking – punch item G2. |
0:17.10–0:30.70 | ORIGINAL | Brandon's reaction and the code word. Gates at 17.40, 18.60, 21.00, 25.60. | 2017 export | VELMA: the driver disappears behind the question – punch item G3. And drop 'click on Brandon to see what he is thinking' – punch item G4. |
| G1 0:04.36–0:09.89 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | Van now stops AT THE CURB with all four wheels on the road, and BOTH a man at the wheel and a woman in the passenger seat are visible. The timecode came from scanning the film, not from trusting my own earlier note: the van is on the road to 4.36s and over the sidewalk edge from 5.4s, so the segment is 4.36-9.89 and not 0.00-7.30. Velma's second point on this shot – no driver visible – was already half wrong on the shipped file: a driver IS visible from 1.09s. Job 6fb95e36. |
| G2 0:09.89–0:17.10 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The WOMAN leans out and delivers the accident line, flat and businesslike per RULE-never-perform-the-lure, with the man at the wheel. Answers Spencer's note that every predator in the badge is a man. Job 47774b33. |
| Lesson 7 — The stranger on the bike sos-ps-06b-bike-v11x-720.mp4 H1 H3 H3b | Done – your check | |||
0:00.00–0:07.98 | ORIGINAL | Brandon walking home from school. | 2017 export | — |
0:07.98–0:22.37 | REANIMATED | The teenager stands holding his bicycle, waits, then asks directions; Brandon visibly replies while the stranger is still there. Gates at 15.50, 22.00, 22.60. | Re-animated 17 Aug (t32_bike_full) | Original had him performing 4-5s early and holding a smartphone while asking a child for directions – both fixed. TWO DEFECTS REMAIN: Brandon's trousers drift from tan to blue inside this shot (a re-take came back worse and was rejected), and the stranger is gone the moment this shot ends – see the next shot. |
0:22.37–0:27.40 | ORIGINAL | Brandon walks on. THE STRANGER IS GONE AND THE BICYCLE STANDS RIDERLESS from 22.6s. | RE-ANIMATED 19 Aug (job db09a4d6). The teenager keeps both hands on the handlebars to the end of the shot; the bike is never left standing on its own. This is the tail I previously claimed was fixed and had not touched. Take 1 accepted. | Velma found this 18 Aug – punch item H3. I had recorded the riderless bike as fixed; it was only fixed inside the re-animated middle, and this tail reintroduces it. Also: narration and caption disagree on 'video store' vs 'video game store' – punch item H1. |
| H3 0:22.37–0:27.40 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The teenager keeps both hands on the handlebars to the end of the shot and the bike is never left standing on its own. This is the tail I previously claimed was fixed and had not actually touched – the fix had gone into the re-animated middle only. Job db09a4d6. |
| Lesson 8 — The lost puppy sos-ps-08-puppy-v6x-720.mp4 L1 L1b L2 | Not started | |||
0:00.00–0:07.49 | NEW | Brandon walking; narration lifted UNCHANGED from the minivan film. | Built 17 Aug | Whole lesson is NEW. Built with zero new writing so nothing had to be approved: the narration is Velma's own from another film. |
0:07.49–0:18.54 | NEW | A man asks Brandon to come to the park and help find his lost puppy. | Built 17 Aug | His line is Sergeant Mungar's verbatim example from the police film. |
0:18.54–0:27.60 | NEW | Brandon turns and STARES at the stranger for the last eight seconds. Gates at 19.50, 21.50, 24.00. | Built 17 Aug | Velma 18 Aug: he should walk away, not stare – punch item L2. The man's voice is also robotic – punch item L1. |
| L2 0:22.00–0:27.60 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | Brandon turns and WALKS away instead of standing and staring for eight seconds; the man stays put. Used the first 5.6s of the take, before the camera pushes into his face. Job 3642b028. |
| Lesson 9 — The pizza nobody ordered – part 1 sos-ps-07-pizza-a-v10x-720.mp4 I1 I2 I2b I3 | Done – your check | |||
0:00.00–0:04.12 | ORIGINAL | 'Pop quiz. There's an unexpected visitor at the door.' VELMA: remove the words 'Pop quiz' – punch item I1. | 2017 export | — |
0:04.12–0:08.12 | REANIMATED | The delivery man on the porch – 'Pizza delivery. I've got the pizza you ordered.' | Re-animated 17 Aug (job 101) | The original dissolved between two different porches mid-line, putting TWO delivery men on screen at once, one of them semi-transparent. |
0:08.12–0:14.24 | REANIMATED | Brandon inside the hall, worried, alone. THE FRONT DOOR IS STANDING OPEN. Gate at 13.70. | RE-ANIMATED 19 Aug (job fd8f2bc0). The front door is SHUT in every frame and Brandon listens from inside, a step back from it. Take 1 accepted. This is the lesson whose whole teaching is that you do not open the door. | Fixed the two-Brandons defect, but introduced a worse one: the door is open in the lesson that teaches you not to open it. Velma found it 18 Aug – punch item I2. The doors also do not match: blue outside, white panelled inside. |
0:14.24–0:25.10 | REANIMATED | The delivery man hammers and leans in, face hardening, as the audio escalates. Gate at 24.30. | Re-animated 17 Aug | Original had him standing still and mildly sad while the audio said 'I'm not leaving until you open this door.' |
| I2 0:08.12–0:14.24 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The front door is SHUT in every frame and Brandon listens from inside, a step back from it. This is the lesson whose whole teaching is that you do not open the door. Job fd8f2bc0. |
| Lesson 9 — The pizza nobody ordered – part 2 sos-ps-07-pizza-b-v5x-720.mp4 — | — | |||
0:00.00–0:10.00 | ORIGINAL | Brandon decides not to open the door. Gate at 5.00. | 2017 export | — |
0:10.00–0:19.50 | REANIMATED | Brandon on the stairs, phone to ear, serious and composed. Gate at 11.80. | Re-animated 17 Aug | Original had him smiling throughout the 911 instruction and laughing with his eyes shut at 19.04. |
| I2 0:08.12–0:14.24 | RE-ANIMATED 19 Aug | Picture replaced. Soundtrack untouched. | 1 take | The front door is SHUT in every frame and Brandon listens from inside, a step back from it. This is the lesson whose whole teaching is that you do not open the door. Job fd8f2bc0. |
| Lesson 10 — A police officer explains tricky people sos-ps-09-officer-v7x-720.mp4 J1 J1b J2 J3 J5 J6 J6b | Done – your check | |||
0:00.00–0:10.34 | NEW | What a tricky person is – someone who might want to fool children. Gate at 10.30. | Built 17 Aug, Maeve voice, Sgt Mungar's script verbatim | Replaces the 480p Hamilton Police interview at Velma's request for a female officer. VELMA NOW WANTS HER BLACK OR ANOTHER VISIBLE MINORITY – punch item J1. |
0:10.34–0:25.56 | NEW | They don't always look tricky; judge behaviour, not appearance. | Built 17 Aug | — |
0:25.56–0:39.84 | NEW | They might pretend to be someone else, or ask a child for help. | Built 17 Aug | — |
0:39.84–0:49.49 | NEW | She QUOTES the lure – 'I've lost my dog… come with me to the park.' | Re-shot 18 Aug | First version had her performing the lure with a sweet coaxing face. The original officer delivers it flat, in profile, with an interviewer in the room. Re-shot flat and grave with the eyeline off camera. |
0:49.49–1:00.68 | NEW | The hospital lure. Gate at 49.45. | Built 17 Aug | — |
1:00.68–1:06.23 | NEW | Stay alert; you don't owe them anything. | Built 17 Aug | — |
1:06.23–1:17.49 | NEW | The four words – No. Go. Yell. Tell. Gate at 67.55. | Built 17 Aug | — |
1:17.49–1:29.31 | NEW | NO means take a stand; GO to a place of safety. | Built 17 Aug | — |
1:29.31–1:42.39 | NEW | YELL 'you're not my parent'; TELL a parent or guardian. | Built 17 Aug | — |
1:42.39–1:55.20 | NEW | Trust your uh-oh feeling; you will never be punished for it. Gate at 105.20. | Built 17 Aug | 'Behaviours' must become 'behaviors' in the on-screen text – punch item J2. |
