# 2026-03-20 — Daily Log

## Morning Heartbeat (07:50 UTC)
- Sessions: healthy (no sessions over 180k tokens)
- Subagents: none active
- Email: NO_NEW_MAIL
- Discord: bot token missing — could not post morning reminder to #competitive-research-product-vision
  - Reminder is still pending: "Good morning — ready to pick up the competitive research product when you are. Open question to decide: do we pull Instagram + agency images in Stage 1 for real brand photography, or push to Stage 3? Stage 2 (20-brand competitor discovery) is next either way."
- Quiet hours ended (Lisbon 07:50). Morning scan pending Discord availability.

## Active Task Status (from QMD)
- revolut-curation: awaiting Assaf curation
- etoro-brand-concepts: awaiting Assaf review
- chromatic-mosaic: Kittoro building
- ffood-sow: follow up today if no response
- spoken-storyboard: awaiting Assaf review frames 2-5
- ce-competitive-research: paused, resuming today
- yoni-assia-zoom: Tue Mar 24 12:00 UTC

## Future Forward 2026 — New Client Work (09:11–13:20 UTC)

### Context
Lisa (weXelerate contact, interested) reached out about Future Forward 2026. Assaf wants to demo an AI asset generator to blow her mind. This became a full product build session.

### What Was Built
- **AI Brand Asset Generator** — CE-hosted web tool at `work/pitches/future-forward/generator/`
- **Stack:** Node.js Express (port 3071) + Fabric.js canvas + Gemini image gen + Gemini direction gen
- **CE UI** — exact CE design system: Larken + Inter, `#cc0000`, `#1a1a1a`, `#eeeeee`, no 700 weight
- **FF Output** — `#111111` bg, `#DCFF00` accent, Sora font on canvas assets
- **4-step flow:** Brief → AI directions (3 cards) → image generation → canvas editor → PNG download
- **Skill documented:** `skills/brand-asset-generator/SKILL.md` — full product spec, repeatable for any client

### Key Decisions
- UI = CE brand. Output = client brand. That's the product.
- Neon lime stays in UI/text overlays — NOT baked into generated images
- Images must be cinematic, real-feeling space, no neon in the generation
- Cards must be horizontal list (CE editorial pattern), not vertical grid columns
- Font loading: `document.fonts.ready` gate before canvas init
- Image as moveable Fabric object (not canvas background), toggleable lock

### Ogilvy Tone of Voice (Future Forward)
5 rules locked:
1. BOLD NOT LOUD — state claim, don't amplify
2. SPECIFIC NOT VAGUE — ban: insights, visionaries, experience, amazing, exclusive, journey
3. DRY NOT EARNEST — wit beats enthusiasm
4. EARNED NOT PROMISED — embed proof inside copy
5. PRESENT NOT ASPIRATIONAL — urgency through precision
Reference headlines: "The unknown has a schedule." / "Your next competitor is already registered." / "Vienna. October. Before the recap."

### Brand Style JSON
`work/pitches/future-forward/generator/brand-style.json` — 4 mood presets:
- ICON: heroic low-angle, dark studio, rim light
- VOID: tiny astronaut, vast space, max text area
- TRANSCENDENT: portrait, lime halo from behind
- ATMOSPHERIC: dual-tone haze, drifting diagonal

### FF Brand Specs (confirmed)
- Fonts: Sora + Inter (Google Fonts, no custom fonts)
- Background: `#111111`, Accent: `#DCFF00`, Text: `#fff`
- Hero style: white NASA Apollo suit, walking toward camera, halftone lime dot halo

### Image Generation Findings
- Model confirmed working: `gemini-3.1-flash-image-preview`
- Cinematic quality achieved with: "Alfonso Cuarón Gravity cinematography", "IMAX", "natural colors only, no neon"
- Best angles discovered: visor extreme closeup, god's eye overhead, worm's eye from below, rear drifting away
- Assaf feedback: needs more interesting positions/angles, cinematic quality, see actual space, NO neon colors in images

### Status (13:20 UTC)
- Tool live, iterating on image quality/angles
- Assaf testing astronaut angle variations
- Next: lock final image prompt style, wire 4 moods into generator

## Heartbeat 09:31 UTC
- Sessions: healthy ✅
- Email: NO_NEW_MAIL
- crisp-meadow session: resolved — was yesterday's pipeline test (standards.site + cocacola.com)
- Morning reminder posted to #competitive-research (1484222491466535024) ✅
- HEARTBEAT.md updated: removed morning reminder section, added channel IDs to active list
- Channel `#competitive-research-product-vision` doesn't exist — correct channel is `#competitive-research` (1484222491466535024)
- GitHub PAT 'dan' expiring ~Mar 25 — still pending renewal

## Heartbeat 14:26 UTC
- Sessions: healthy ✅
- Agents: none active
- Email: NO_NEW_MAIL
- Discord: bot token missing — #competition_kittoro unreadable
- Gemini 503: temporary high demand error (future-forward generator) — no action needed
- **Brand-review-light research COMPLETE** — thread-research.md ready. QMD updated to `research_complete_awaiting_assaf`. Ready to present decision list to Assaf.

## Pending
- FFoodi SOW follow-up (due today per QMD — no response received)
- Revolut curation: awaiting Assaf
- eToro brand concepts: awaiting Assaf review
- Yoni Assia Zoom: Tue Mar 24 12:00 UTC
- GitHub PAT 'dan': expiring ~Mar 25 — renew at https://github.com/settings/tokens/
- Brand-review-light: present decision list to Assaf → build skill

## Session 13:30–14:15 UTC — Trading 212 Surgical Rebuild

Subagent Thibault rebuilt T212 competition page from scratch using CashApp as gold standard template.

### Approach
Previous attempts patched the old T212 page (wrong strategy). This rebuild:
- Copied CashApp's `<style>` block VERBATIM — same `--red: #cc0000`, same fonts, zero changes
- Replaced all T212-specific CSS classes with CashApp template patterns
- Ported all T212 content into the correct structural containers

### Structural verification (all pass)
- hero-block, hero-image, hero-overlay .inner ✅
- Inline-styled TL;DR div ✅
- `.section` + `.container` for all sections ✅
- `.facts-grid` / `.fact-cell` / `.value` / `.label` ✅
- `.brand-book` with palette-row + swatch ✅
- `.image-grid-flush` for brand-in-practice ✅
- `.accordion-section` with `.summary` + `.icon` (NOT accordion-summary/accordion-icon) ✅
- `.verdict-grid` / `.verdict-card` ✅
- `.three-col` / `.card` ✅
- `.campaign-card` / `.campaign-hero` ✅
- `.comparison-table` for vs eToro ✅
- `.platform-grid` for social stats ✅
- Zero external CSS links, zero old T212 classes ✅

### Commit
`b16379e` — "rebuild: Trading 212 — CashApp template structure, T212 content"

### Note on section-audit.py
Script requires Playwright + Gemini. Playwright nav fails on bare file paths (needs `file://`). Gemini dependency deprecated (`google.generativeai` → `google.genai`). Script timed out and was killed. Manual structural audit substituted — all patterns verified.

## Session 10:30 UTC — CashApp Brief View v3
- Assaf reviewed CashApp brief.html prototype — loved it ("love this - it is so good")
- Assaf requests: strips → irregular 2-column mosaic (staggered heights, diagonal rhythm), caption below image (not overlaid), smaller panels, better image cropping
- Reference: portfolio/agency grid — 2 cols, large-left/small-right alternating, caption bold+grey below each image
- Kittoro confirmed v2 was clean, flagged §09→§11 apparent gap (was actually §04–05 merged card, not a real gap)
- Built v3: full structural rebuild — 2 independent flex columns, intentional heights per card (360px Chalamet hero L, 220px Brand Evo R etc.), caption text below on white, object-position curated per image, Brand in Practice full-width below both columns
- commit: e9127eea
- brief.html v3 live: https://staging.curiousendeavor.com/etoro-competition/cashapp/brief.html
- Status: awaiting Kittoro second pass + Assaf final approval → locks as template for all 15+ brands

## Key design decisions locked (v3)
- Mosaic layout: 2 independent flex cols, gap 16px, align-items flex-start
- Heights: left col large-first (360/200/240/320/180/230px), right col small-first (220/250/180/180/380/220px)
- Caption format: §num (red, 9px uppercase) | section name (600 weight, 13px) | + expand icon
- Grey subtitle: 11px, object metadata/descriptor
- No overlay text except hero — all labels below image on white background
- Scroll progress: 2px red bar fixed top

## Session 11:30–11:58 UTC — CashApp Brief v5/v6 & Brief System

### What shipped
- brief.html v5 (commit fb2fdf36): Split hero, shared brief-page.css, card reorder, fallback system
- brief.html v6 (commit 85a45a1f): Assaf review fixes — rounded corners, image swaps, layout improvements

### System built
- `/public/etoro-competition/assets/brief-page.css` — shared stylesheet for all brand briefs
  - CSS custom properties: `--brand-primary`, `--brand-dark`, `--bg` on `<body>` per brand
  - Fallback tier system: `.m-img.fallback` (dark/ghost), `.m-img.fallback.color` (brand primary fill)
  - `border-radius: 0 !important` on all cards/containers
- `/public/etoro-competition/_template/brief.html` — reusable template with inline instructions

### Design decisions locked (brief system v6)
- **Split hero**: Left = always-designed brand statement (name, tagline, 3 stats — never fails). Right = brand identity photo. NEVER campaign photography (Assaf explicit: "the campaign isn't the brand you see")
- **Fallback tier rule**: Tier 1=agency photo, Tier 2=product screenshots, Tier 3=brand color fill (`.fallback.color`), Tier 4=dark + ghost number (`.fallback`). A confident color field always beats a mediocre crop.
- **Rounded corners**: All image files with baked-in rounded corners (e.g. web-chalamet-hero.jpg) must be replaced. `border-radius: 0 !important` in CSS.
- **Social card**: Use social-native, culturally specific images. `web-ig-06.jpg` (Brat Cash Card) > `web-ig-01.jpg` (bad crown crop).
- **Layout & UX expanded**: Full-bleed natural-ratio images, single column or 2-up side by side. Never small grids with forced crops. Assaf: "we let those open to value the imagery, present it well"
- **Color+Type card**: Must include Logo section (wordmark + construction guide), Color swatches, Typography specimen. Three distinct sub-sections.
- **Brand in Practice**: 12 unique images, zero duplication with other section cards.
- **Card image for Layout section**: Website homepage > app screenshot (shows full design intent)
- **`.m-img.natural`**: Agency/system/spread images display at native aspect ratio. Add `.portrait` class for very tall portrait images (adds `max-height: 400px`)

### CashApp image assignments (final v6)
| Section | Image | Mode |
|---|---|---|
| §02 Positioning | web-shaboozey.jpg | 300px crop, center 30% |
| §03 Brand Evolution | buck-vi-panorama.jpg | natural (3:1) |
| §04-05 Color+Type | buck-vi-digital.jpg | natural dark |
| §06 Layout+UX | homepage-fresh.png | natural green bg |
| §07 Assessment | buck-vi-typography.jpg | natural dark |
| §08 Verdict | buck-vi-overview.jpg | natural |
| §09 Personality | buck-vi-system-full.jpg | natural |
| §10 Social | web-ig-06.jpg (Brat) | 220px crop, center |
| §11 Campaigns | buck-taxes-fullset.jpg | natural |
| §12 Audience | lifestyle-16.jpg | 200px crop, center 40% |
| §13 vs eToro | web-shaboozey.jpg → now §02; §13 uses web-shaboozey from hero | 200px crop |
| §01 Quick Facts | press-cashcard.jpg | natural |

### Status
- brief.html v6 live: https://staging.curiousendeavor.com/etoro-competition/cashapp/brief.html
- Awaiting Assaf final sign-off → locks template for 15+ brands
- Next: Phase 2 rebuilds (IG Group → Trading 212 → Robinhood) pending Assaf go

## Heartbeat 12:05 UTC
- Sessions: healthy ✅
- Agents: none active
- Email: NO_NEW_MAIL
- Discord: bot token missing — channel reads unavailable
- FFoodi SOW: no response received — follow-up due today (per QMD)
- GitHub PAT 'dan': expiring ~Mar 25 — 5 days remaining
- All other tasks: status unchanged (awaiting Assaf)

## Session 12:11–14:48 UTC — Portal Work Orientation + Trading 212 Rebuild

### Context established
- Two active portal workstreams clarified for Assaf:
  1. **Portal redesign thread** — design alignment across all 17 full competition pages
  2. **Portal: organization thread** — brief.html short template (CashApp v7+ in progress)
- Kittoro provided full 17-page audit: 3 template lineages (IG pattern, CashApp pattern, hybrid)
- Canonical standard decided: **CashApp** — exact HTML/CSS as the template for all pages

### Trading 212 — full rebuild (proof of concept)
- Multiple failed attempts trying to patch existing T212 page
- Root cause: T212 was built with completely different template + CSS classes, patching doesn't work
- **Final solution (commit b16379e):** Thibault (Opus) rebuilt T212 from scratch using CashApp's VERBATIM HTML/CSS — same `--red: #cc0000`, same fonts, same class names, same section structure
- T212 content preserved (anti-brand positioning, facts, identity, campaigns, verdict, social)
- Eliminated all T212-specific CSS classes (.visual-grid, .brand-insight, .dark-break, etc.)
- **URL:** https://staging.curiousendeavor.com/etoro-competition/trading-212/
- **Status:** Awaiting Assaf review/approval

### Key lessons locked
- NEVER try to patch pages built on different templates — always rebuild from canonical source
- Kittoro must stay in research/QA lane only — CE server files built by Thibault only
- Blue accent color mistake: T212 brand blue was incorrectly mapped to `--red` variable, broke design system. `--red: #cc0000` is the CE design system accent — stays universal across all pages
- Assaf protocol: keep inter-bot chatter off #portal threads, use #competition_kittoro for coordination

### Design alignment plan (pending Assaf approval of T212)
- Tier 3 (Trading 212, Trade Republic, Vanguard, Wise, Goldman Marcus) → rebuild from CashApp template
- Tier 2 (Revolut, Coinbase, Stripe, Fidelity, Venmo, Monzo) → class alignment pass
- Tier 1 (IG Group, CashApp, Robinhood) → bug fixes only (nav target="_blank" etc.)
- Template file: `public/etoro-competition/_template/competition-page-v2.html`

### HANDOVER
- T212 rebuild live at staging — Assaf reviewing, no approval received yet
- Brief template track (Track 2): CashApp brief.html still awaiting Assaf final sign-off
- No serialization to other pages until Assaf approves T212 proof of concept

## Session 12:22–12:48 UTC — Cash App Competition Page v8

### Kittoro brief delivered (v8 fixes)
Three issues from Assaf's v7 rejection:
1. Hero — full-bleed, one stunning image
2. Social strategy — real posts/screenshots per platform, or explicit "No active presence"
3. Social card crop fix

### What shipped (commit 65a95b4)
**Hero:**
- Swapped `lifestyle-03.jpg` → `buck-vi-panorama.jpg` (comprehensive brand mosaic, 1920×688)
- Strengthened overlay gradient (darker scrim for text legibility)

**Social Strategy (§07) — full rebuild:**
- Instagram: image grid kept, added warm `#f5f0e8` background to `web-ig-03.jpg` (Cash Apples newspaper post — looks empty without it due to white background)
- X/Twitter: 3 verified real tweets as styled cards (Mar/Feb 2026 — Cash Apples, brat card, BTC)
- YouTube: Real video thumbnails via YouTube CDN embedded — Angel Reese "Pull Up the Receipts" (9.3M views, Feb 2025) + 2025 Fall Release Keynote. IDs: `j5hDeigR9UM`, `tn4d0xKf8mI`
- TikTok: Styled content/tone/stats cards — platform blocks automated screenshot capture (@cashapp, 836K followers, 3.7M likes confirmed)
- Reddit: 3 real community post cards — SSI megathread, Borrow debate, sentiment signal (no official brand presence, 200K+ members organic)

**playwright-stealth findings:**
- Works: Revolut, X/Twitter profile pages
- Blocked: TikTok (captcha), YouTube (cookie wall/Oops error after accept), Reddit (network security block)
- YouTube thumbnails via `img.youtube.com/vi/{ID}/maxresdefault.jpg` are publicly accessible, no auth needed

### Staging live
https://staging.curiousendeavor.com/etoro-competition/cashapp/

### Status
Awaiting Kittoro full visual QA → then Assaf final approval

## Session 13:07–13:26 UTC — CashApp Brief Monzo Format + Skill Initiative

### CashApp brief.html final format changes
- **Back-bar / header**: Replaced `.hdr` brief/full nav chrome with Monzo-style minimal `← Competition Hub` back-bar + top-right Brief/Full toggle
  - commit: 8569f5c0
- **§10 Social**: Removed all `<a>` wrappers from linked images. Added explicit labeled text buttons instead: `→ Go to TikTok`, `→ Go to Instagram`, `→ Go to X`, `→ Go to YouTube`
  - Button style: `font-size:10px; font-weight:600; letter-spacing:0.06em; text-transform:uppercase; border:1px solid #ccc; padding:4px 10px`
  - commit: a4230ba6
- **stopPropagation fix**: All interactive elements inside `.m-card` onclick toggles need `onclick="event.stopPropagation()"` — commit aff5ef61

### Design rules locked (final brief format)
- **Header**: Monzo-style minimal back-bar only. No "Brief / Full" tabs in header chrome. Toggle goes top-right.
- **Hero**: Full-bleed image + gradient overlay + text at bottom. Monzo format. Never split hero.
- **Social links**: Never embedded in images (`<a>` wrapping `<img>` is forbidden). Navigation = explicit labeled buttons only.
- **Card interactions**: Any clickable element inside a card with onclick toggle must use `event.stopPropagation()`.
- **Brief/Full nav button**: Resolves to `../` for full page (parent directory index.html)

### Brand Review Light — skill initiative launched
Assaf directed: systemize all the work, research, decisions into a replicable skill called "brand-review-light".
- Scope TBD (Assaf decision): brief page only vs full deep-dive + brief; with or without research phase; eToro-only vs cross-project
- Sub-agent spawned to read Portal: organization (334 msgs) + Portal redesign (475 msgs) threads
- Sub-agent session key: agent:main:subagent:328c1a86-8970-4b40-ad61-726f6e3c2cf5
- Output target: `work/active-projects/etoro/brand-review-light/thread-research.md`
- After research returns: compile all decisions → present clean decision list to Assaf → Assaf makes the calls → locks into skill

### Open decisions (need Assaf input)
1. Skill scope: brief page only OR brief + full deep-dive OR brief + full + research phase
2. Cross-project: eToro-only OR any client project?
3. Section count: keep all 13 OR cut/merge some?
4. Threat badge system: HIGH/MEDIUM/LOW sufficient OR add CRITICAL/MONITOR?
5. Section order: is current 13-section map canonical?

### Key file references
- Latest brief: `public/etoro-competition/cashapp/brief.html` (commit a4230ba6)
- Shared CSS: `public/etoro-competition/assets/brief-page.css`
- Monzo reference: `public/etoro-competition/monzo/index.html`
- Brief template: `public/etoro-competition/_template/brief.html`
- Skill target dir: `~/.openclaw/workspace/skills/brand-review-light/`

## Brand Review Light — Notion Test + Critique Pipeline (15:32–17:29 UTC)

### Notion brief built and live
- URL: https://staging.curiousendeavor.com/notion-brief-test/brief.html
- Local: `/root/.openclaw/workspace/public/notion-brief-test/`
- Commit: `5c2e3dd` (Anton fixes)
- Full image library: 107 assets in `work/active-projects/notion-brand-test/assets/`

### Anton critique — what the first build got wrong
Built the page, sent URL without editorial review. Assaf caught it immediately.
Key failures:
1. Image selection was category-matching, not editorial judgment — best images in library (instrument-fylw-07.png, notion-blog-11.jpg) unused
2. §12 Audience had a production deck screengrab (prop lists, location notes) as "campaign photography"
3. §11 Campaigns had Times Square generic stock photo — zero Notion branding
4. §04-05 Color+Type card showed pencil character sketches (wrong register entirely)
5. eToro identity leaking through nav hrefs (../../etoro-portal/) and CSS comments
6. [Client] placeholder text visible throughout expanded cards
7. YouTube handle wrong (@TheNotionWay is fan channel, official is @Notion)
8. Typography: only Inter — Notion's campaign uses high-contrast serif (Signifier). Demo rendered in Georgia fallback

### Fixes applied (commit 5c2e3dd)
- Hero: Underground gates → billboard with clean sky (notion-blog-05.png)
- §03: blog billboard → NYC subway FYLW ad (instrument-fylw-07.png)
- §04-05: pencil sketches → BUCK campaign storyboard with primary palette (buck-vi-09.png)
- §07: rough doodle → Paris Notion OOH cinematic (notion-blog-11.jpg)
- §08: production character sheet → subway OOH "Think it. Make it." (buck-vi-02.png)
- §11: Times Square → Paris Notion OOH (notion-blog-11.jpg)
- §12: CRITICAL — production deck removed → Instrument BTS documentary (instrument-fylw-04.png)
- §13: temple selfie with cartoon faces → brand illustration (buck-vi-15.png)
- Nav: etoro-portal refs → href="#"
- CSS: eToro/CashApp comment references stripped
- [Client]: replaced with eToro throughout
- YouTube: corrected to @Notion official
- Instagram grid: upgraded from 01-02-03 defaults to 01-07-11
- Typography: Playfair Display loaded as Signifier approximation

### Flag: ooh-02.jpg is Tokyo Shibuya at dusk — not Notion OOH. Unusable. Still in library.
### Flag: buck-vi-21.png may be a fintech debit card (wrong brand). buck-vi-22.png may be Eventbrite. Both unused but in served directory.

### Skill improvements locked (commits edda14c6 + 801f430a)
1. **Anton editorial review gate** — mandatory in SKILL.md before reporting done. Build agent fixes CRITICAL + MAJOR. MINOR can wait.
2. **Known blockers table** — headless capture failures documented: YouTube bot detection, Mux HLS video, JS carousels, brand newsrooms (401)
3. **Sourcing patterns** — two visual registers: illustration system (BUCK) vs live photography (Instrument). A complete brief needs both.
4. **Best images first** — image selection should identify the 5/5 images first, then assign sections around them. Not category → search.

### Systemic lesson
The QA checklist was mechanical (no duplicate images, no blank boxes) but had no editorial eye. Need:
- Human-in-the-loop curation gate before build starts (not just after)
- Anton on every brief before URL goes to human
- Image selection = editorial judgment, not category matching


---

## Session: eToro Competition Pages — Curation Tool Build (18:00–18:50 UTC)

### Curation Tool — Full Redesign (commit 3364ac2)
Major evolution of the image curation tool at `https://staging.curiousendeavor.com/etoro-competition/curate/`

**Architecture shift:**
- Old: grey wireframe slot grid (placeholders, not real page)
- New: live iframe loading actual competition page — what you see = what gets published

**Commits:**
- `a01b5ac` — crop CORS fix (removed `crossorigin="anonymous"`), corner icons (✂/✕/🗑), publish signal endpoint
- `9558b61` — CROP in place button, drag-to-replace from library
- `3364ac2` — crop applies in-situ to iframe image on save (same `cropImgCSS` math)
- `56988a1` — (prior) initial iframe editor design
- `5c9e550` — (prior) slots pre-populate from existing page images

**Current curation tool features:**
- Left panel: asset library with filter tabs (All/Used/Unused/Rejected), upload zone, drag-to-replace
- Center: live iframe of competition page — every `<img>` has REPLACE + CROP hover overlay
- REPLACE: opens picker modal, select new image, swaps in iframe + saves assignment
- CROP: opens crop modal, saves apply visually in-situ immediately
- Drag from library → drop onto page image → instant swap
- PUBLISH button: saves state to server, queues brand in `publish-queue.json`
- Curation server `/curation/publish-signal` endpoint added to `scripts/revolut/curation-server.js`

**Key technical notes:**
- Same-origin iframe injection (staging.curiousendeavor.com) — `contentDocument` access works
- Image swaps tracked as `imageSwaps = { originalFilename: newFilename }`
- State persisted to localStorage per brand + server save
- `window._draggingFile` tracks drag source; `window._pendingCropImgId` tracks which iframe img is being cropped

### Batch 2 Analysis Done (not yet executed — awaiting Assaf greenlight)
Pages: Wise, Goldman Marcus, Fidelity
- **Wise**: Old pattern, full rebuild needed, 30 assets, 15 nav blanks
- **Goldman Marcus**: Close but wrong hero wrapper, 17 assets, medium rebuild
- **Fidelity**: Old pattern, full rebuild needed, 31 assets, 14 nav blanks

### Kittoro Boundary Enforcement
Kittoro posted duplicate analysis of Batch 2 in the portal thread (same content Kitt already covered). Told to stand down twice. Standing rule: Kittoro audits/critiques on request only — does not proactively post in portal threads.

---

## Session Log — Evening (18:00–18:57 UTC)

### Notion Brief — Systematic Fixes
- Full systematic pass executed: all 6 eToro content leaks, 3 duplicate images, §01 same-as-§06 screenshot
- §01 Quick Facts → `yt-new-era-notion.jpg` (YouTube thumbnail, legible at card scale)
- §07 Assessment → `notion-blog-09.png` (user tweet grid — analyzed before assignment)
- §12 Audience → `instrument-fylw-01.png` with `object-position: 0% 35%`
- §13 renamed "Competitive Intelligence" — all eToro references removed from content
- Root cause confirmed: images were assigned blind (from filename), not from visual analysis. Fix: mandatory image manifest in Phase 2a of skill.
- Commit: `3f08222` (public repo)

### Motion Layer — Mux Discovery
- BUCK uses Mux video CDN on buck.co portfolio pages
- Mux animated GIF endpoint is publicly accessible: `https://image.mux.com/{PLAYBACK_ID}/animated.gif`
- Extracted 5 Mux playback IDs from buck.co/work/notion-think-it-make-it via Playwright JS evaluation
- Downloaded 5 animated GIFs + 1 MP4 via HLS (yt-dlp + Mux HLS stream)
- Files: motion-brand-animation.gif (4.8M), motion-london-underground.gif (6.5M), motion-shibuya-tokyo.gif (4.6M), motion-nyc-architecture.gif (1.1M), motion-notion-faces-pillars.gif (6.5M)
- §11 Campaigns: London Underground OOH takeover in motion
- §09 Brand Personality: BUCK animated illustration loop
- Brand in Practice expanded grid: Notion Faces on transit pillars animated
- Commit: `049dd40` (public repo)

### skill fix: mandatory image manifest
- brand-review-light SKILL.md: Phase 2a now requires image manifest table BEFORE any section assignment
- Manifest columns: filename, what it shows, focal point, top 200px content, face visible (Y/N), usable? — cannot skip
- Commit: `cd0a1af5` (workspace repo)

### Motion Pipeline — Protocol Established
- Any agency using Mux exposes animated GIFs publicly — no auth, no yt-dlp needed
- Method: open agency portfolio page with Playwright → evaluate() for `[playback-id]` attributes → build animated.gif URLs
- ffmpeg not available on server (apt broken); snap install worked but snap/ffmpeg has display issue; HLS download works directly via yt-dlp
- deno installed at `/root/.deno/bin/deno` — required for yt-dlp YouTube JS runtime
- YouTube still blocked without cookies; Mux + Vimeo direct are the reliable paths

### Next Task Cleared by Assaf
- Expand brand-review-light skill to build FULL page (index.html) in addition to brief.html
- Full page = linear scrolling, sticky section nav, all content expanded, 3-4 images per section
- Structure reference: CashApp index.html (703 lines) and Monzo index.html
- Notion test case: build index.html alongside existing brief.html, wire Brief/Full toggle between both
- Awaiting Assaf confirmation to proceed with build


## Heartbeat 23:16 UTC — Nightly
- Sessions: healthy ✅
- Subagents: none active ✅
- Email: NEW MAIL — GitHub PAT expiry warning
  - Token: "Kitt for CE website" (read:org, repo, workflow, write:packages)
  - Expires in 6 days (~March 26)
  - Action: renew at https://github.com/settings/tokens/ (assafdagan20205)
  - Note: Separate from "dan" PAT also expiring ~Mar 25 (in QMD notes)
- Quiet hours (23:16 Lisbon) — no Discord posting
