# Memory Log — 2026-03-26

## Heartbeat — 12:36 AM UTC (quiet hours)

### System Status
- Sessions: healthy · Subagents: none · Email: clear
- Auto-compact: clean

## Cropster Pitch — Morning Session (10:15 UTC)

### Vercel Deployment Issue (carried from Mar 25)
- Vercel stopped auto-deploying after commit `1dd04eb` — CE Model copy changes (c708fdc, a85e6ce, 688fddd, 44895d7) NOT live
- `vercel` CLI token on server is expired — auth.json is `{}`
- Assaf ran `vercel login` on Mac but token stored in keychain (not `~/.vercel/auth.json`)
- `vercel redeploy [url] --prod` failed (wrong flag)
- `vercel redeploy [url]` triggered a build of OLD source code (h1k5649wi), not latest
- **Status: blocked** — Assaf needs to create a new token at `vercel.com/account/tokens` and share it
- CE Model copy IS in git (commit c708fdc) — just not deployed to production

### Pitch Direction Pivot — "Activate the Brand"
- Lukas proposed: instead of redoing Cropster's brand, propose ACTIVATING what they built in 2024
- Research: Emily Jackson (Senior Brand Designer) built the 2024 refresh — portfolio at `https://emsjackson.com/cropster/`
- Page is JS-rendered; 13 images available from CDN but couldn't fully load
- **Brand assets Cropster already has:** Signature green #80B947, cartoon illustration characters/mascots, "green line" motif, product-specific highlight colors, refreshed typography, new website
- **Gap identified in research:** Illustration direction is "under-deployed" — coherent visual language started but not consistently executed across channels
- **Kitt's proposed pitch reframe:** "Cropster built the brand. CE activates it."
  - CE Model: shift from "we build a system" → "we run the deployment engine for the brand you already created"
  - What You Get: activation-specific deliverables (Brand Activation, Four-Audience Campaigns, Content at Scale, Digital Activation, Category Intelligence)
- Lukas shared emsjackson.com link as direction signal — confirming the "activate existing brand" angle
- **Next:** Lukas to confirm direction, then rewrite both sections + deploy once Vercel token resolved

### Key Decisions
- Pitch angle: activate Cropster's 2024 brand investment, not rebuild
- CE's value proposition: production infrastructure and consistent deployment across 4 audiences
- Deliverables rename: activation-framed, not generic retainer language

## Cropster Visual Research — Morning Session (11:00 UTC)

### What Happened
- Assaf shared `cropster.zip` (15MB) on Google Drive (owned by Assaf@curiousendeavor.com)
- Downloaded via Drive API (kitt token), extracted to `work/pitches/cropster/cropster/`
- Contents: brand-research.md, cropster-visual-research.html, index.html, captures/ (14 screenshots), agency/ (13 images), case-study/ (16 images), instagram/ (12 posts), press/ (logo)
- Committed to git: `e059b965`
- Synced to staging: **https://staging.curiousendeavor.com/cropster-research/**

### Hero Image Updates
- Assaf sent a laptop stickers webp → saved as `captures/laptop-stickers-hero.webp`
- Added as CSS background to `index.html` hero section (dark overlay on top)
- Also replaced base64-encoded `<img>` src in `cropster-visual-research.html` (lines 308–310) with `captures/laptop-stickers-hero.webp`
- Both pages deployed to staging

### Key Files
- Visual research page: `work/pitches/cropster/cropster/cropster-visual-research.html`
- Brand brief index: `work/pitches/cropster/cropster/index.html`
- Staging: `https://staging.curiousendeavor.com/cropster-research/`

## Cropster Visual Research — Hero Image Fix (11:27 UTC)

### Issue
`cropster-visual-research.html` hero image was still showing base64-encoded Cropster brand photo. Python regex replacement failed silently because the `<img>` tag had extra attributes (`data-slot="0" data-aspect="16:9"`) BEFORE the `src` attribute — so `<img src="data:..."` pattern didn't match.

### Fix
Used positional string replacement (find `<img ` after `<div class="hero-image">`, find closing `>`, then re.sub only within that tag). Reduced file from 6.5MB to ~6.1MB. Deployed to staging.

### LEARNINGS
- **When replacing base64 img src**: check for extra attributes before `src`. Pattern `<img src="data:` fails if tag has other attributes first. Always match `<img ` + find end `>` positionally, then sub within that range.

### Live URL
- https://staging.curiousendeavor.com/cropster-research/cropster-visual-research.html

## Cropster Visual Research Page — Fixes (11:23–11:31 UTC)

### Changes Made
1. **CE top bar logo fix**: Removed incorrect laptop-stickers image from `.ce-bar` nav logo, replaced with plain text "Curious Endeavor"
2. **Logo section fix**: Replaced 454KB inline base64 photo (coffee roaster photo) with `captures/cropster-logo.png` (clean green icon + wordmark). Changed container from `aspect-ratio:16/9; overflow:hidden` to `display:flex; align-items:center; justify-content:center; padding:35px`. File shrank from ~6.5MB to ~5.6MB.
3. All changes deployed to staging: `https://staging.curiousendeavor.com/cropster-research/cropster-visual-research.html`

### Key Files
- `work/pitches/cropster/cropster/cropster-visual-research.html` — main visual research page (light theme)
- `work/pitches/cropster/cropster/index.html` — brand brief index (dark theme, hero = laptop stickers)
- `work/pitches/cropster/cropster/captures/cropster-logo.png` — clean Cropster logo
- `work/pitches/cropster/cropster/captures/laptop-stickers-hero.webp` — hero image

### Technique Note
- For large base64 replacements in HTML, use Python string index slicing (find div start → find div end → splice). `sed` and `Edit` tool fail on massive single-line base64 blobs.

## Cropster Pitch — Image Strategy Pivot (11:30–11:42 UTC)

### What Happened
- Subagents completed: 9 brand-native images generated (5 deliverable + 4 audience) using Cropster brand reference photos
- New copy live on staging: "CE Model" activation framing, 5 new deliverable titles
- Multiple page fixes staged: How It Works → Day 1/Week 1 timeline, Brand DNA typography corrected to Montserrat, Competition headline updated, condescending copy removed
- Lukas requested: replace Origin farmer image with phone/app — done (AI-gen origin-v2)
- Lukas chose hero headline option 2: "Cropster built the infrastructure for specialty coffee. Now build the marketing that matches it."
- All staged at: https://staging.curiousendeavor.com/cropster-pitch/

### Image Strategy — Critical Rule Change
- Assaf reviewed AI-generated deliverable images: **rejected** — "can't talk to a coffee brand and look generated"
- Context: specialty coffee (La Cabra, The Angry Roaster, Partners Coffee) has museum-level design. Cropster's buyers have the highest visual taste bar in B2B software. We cannot present AI mockups to them.
- Assaf cited: https://lacabra.com/, https://theangryroaster.com/, https://brendanmcauliffe.com/work/partners, https://design.sca.coffee/
- **Strategic insight**: The case for CE is that Cropster's customers chose specialty coffee as a lifestyle — they're not forgiving of average. The pitch itself must hold that standard.
- **Decision**: Roll back ALL AI-generated images. Return to original March 25 MacBook/café interface mockups.
- **Rule added**: For any coffee industry pitch, NEVER use AI-generated imagery. Real photography or clean CSS/typographic treatments only.
- Rolled back to: `2026-03-25-deliverable-*.png` (MacBook café shots) for all 5 deliverable cards
- Rolled back audience cards to: `2026-03-25-audience-*.jpg` originals

### Broader Design Direction Note
- Assaf: "we can't sell premium design and present this kinda stuff"
- The pitch page needs to look as good as the brands it references
- AI slop = instant credibility death with design-literate audiences
- Applies to all CE pitches going to visual-forward industries

### Status
- Staging: https://staging.curiousendeavor.com/cropster-pitch/
- Production deploy: still blocked (Vercel token needed from Assaf)
- Latest git: NOT committed yet (changes in working dir only)
- Pending: commit everything clean, then Assaf pushes to production

## Mobiko Visual Research — Full Build (11:54–12:56 UTC)

### What Happened
- Lukas requested Mobiko visual research page, same format as Cropster
- Subagent (run `39a0140c`) completed Phases 1–5: folder structure, research doc, screenshots, brand asset extraction
- Kitt built HTML page directly (subagent timed out before Phase 6)
- Page deployed to staging: https://staging.curiousendeavor.com/mobiko-research/mobiko-visual-research.html
- Files: `work/pitches/mobiko/mobiko-research/` + `public/mobiko-research/`

### Issues Fixed (iterative)
1. **Scroll jank**: IntersectionObserver called `element.scrollIntoView()` on each section entry — replaced with manual `track.scrollLeft` offset calculation
2. **404 screenshot in content**: `captures/pricing.png` was a Mobiko 404 page (their `/en/pricing` route doesn't exist). Removed from §13 audience grid.
3. **Hero image**: Initially used `captures/homepage-full.png` (8487px tall full-page screenshot) — poor for hero. Then tried `hero-bg2.png` (app marketing graphic). Lukas wanted an actual website screenshot. Final fix: took fresh Playwright screenshot of `mobiko.net` at 1440×810. NOTE: `mobiko.net/en` is a 404 — always use `mobiko.net` (German homepage).
4. **Tone**: Several lines were too harsh ("invests almost nothing in brand", "severely under-invested", "weakest brand"). Full tone pass — reframed as "product outpacing brand expression."

### §14 CE Proposal Section
Added new section with timeline grid:
- Discovery (Week 1): brand audit + intake, stakeholder interviews
- Strategy (Week 2–3): positioning workshop, messaging architecture (3 audiences), brand brief
- Identity (Month 1–2): logo evolution, type system, color system, working brand guide
- Digital (Month 2–3): new website, Mobilit├ñtsreport as content hub + launch anchor
- Ongoing (Month 3+): LinkedIn content engine, thought leadership

Key CE angle: "advisory at eye level" as creative platform. Mobilit├ñtsreport 2026 as launch event.

### Key Mobiko Facts (from research)
- Founded 2017, Munich, ~24 staff
- Spin-off from Audi Business Innovation + Mantro
- Three pillars: Deutschlandticket (Jobticket), Mobility Budget, Heimladen (home EV charging)
- Tax optimization algorithm = core moat
- 80% employee adoption rate, 100% NPS from surveyed users
- 260K+ receipts processed → annual Mobilit├ñtsreport
- ISO 27001 certified
- April 2024 growth financing → Series A or M&A horizon 2025–2026
- Competitors: Navit (stronger brand), Rydes (sustainability focus), Mobilize by Renault, FINN
- Brand gap score: 8/10 (product >> brand expression)

### Key Files
- Research doc: `work/pitches/mobiko/mobiko-research/mobiko-research.md`
- HTML page: `work/pitches/mobiko/mobiko-research/mobiko-visual-research.html`
- Public: `public/mobiko-research/`
- Captures: `captures/hero-desktop.png` (fresh 1440×810 screenshot of mobiko.net)
- Assets: `assets/website/` (logo.svg, hero-bg2.png, mock-up-header.png, kacheln-screens.png, webapp-screens.png, testimonials, logo-cloud, balkendiagramm, etc.)

### LEARNINGS from this session
- `mobiko.net/en` → 404. Always screenshot `mobiko.net` (German homepage)
- For research pages: always verify screenshot content with image tool before using as hero
- `captures/pricing.png` was saved from a 404 URL — always check screenshot content before committing
- Playwright path on this server: `/usr/local/bin/playwright` (not `/usr/bin/playwright`)
- Tone for research pages: frame brand gaps as "product outpacing brand" not "invests nothing in brand" — clients read these

## Cropster Pitch — Brand DNA → Recommendations Section (14:10–14:52 UTC)

### What Happened
- Assaf requested research synthesis in format: "Since in the research we saw that...[link] we think a way to improve..."
- Anton critiqued 4 draft recs — caught WoC 2025 date error, La Cabra motion claim wrong, Recs 1+3 social content overlap
- Multiple rounds of iteration with Assaf; key strategic shifts per round:
  1. "Tactics vs strategic" — Rec 1 (animate storyboards) rejected as too executional
  2. "Start a coffee brand" — the big idea: Cropster should operate as a COFFEE BRAND, not a SaaS vendor
  3. "Eat the dog food" — Rec 1 reframed: CE partners with Cropster to launch an actual coffee brand on their own platform
  4. Rec 2: "nuanced" not "distinct" — one brand, calibrated per audience, supply chain ubiquity
  5. Rec 3: "isn't it already the case?" on the Line — pivoted to illustration system (Emily Jackson's characters, scenarios — currently only on lanyards)
  6. Rec 4: ground in research (WoC Copenhagen illustrated booth + SCA Chicago VR experience — both high-design moments, neither built into a repeatable system)

### Final Approved Recs (built as 2×2 card grid)
- **Rec 01 — Eat the Dog Food**: CE partners with Cropster to launch a real coffee brand, documented on their own platform. The bag already exists. Copy: CE is the PARTNER, Cropster is launching.
- **Rec 02 — One Brand, Every Seat**: 2024 refresh extended with nuance per audience — ubiquitous professional standard at every supply chain level
- **Rec 03 — Unleash the Illustration System**: Emily Jackson's characters/visual world → active publishing system (social, editorial, product). Mailchimp → Freddie analogy.
- **Rec 04 — Build the Stage**: Events are Cropster's only physical brand space. WoC + SCA Expo — build repeatable system. Rec 01 coffee brand as launch vehicle.

### Key Decisions
- "Start a coffee brand" = the overarching strategic frame for the whole pitch
- CE is the partner, not the one launching independently — copy distinction matters
- Illustration system > Cropster Line for Rec 03 (Line is already doing its job as differentiator)
- Rec 04 grounded in real research: WoC Copenhagen 2024 booth (illustrated, B-Corp) + SCA Chicago 2024 (VR experience) — both high investment, neither repeatable

### Image Used
- Rec 01 card: `/root/.openclaw/media/inbound/4a7aae7d-81f3-4537-bc97-5af5aa58769b.png` (Assaf's dramatic moody photo of Cropster bag) → saved as `public/cropster-pitch/cropster-bag-hero.png`
- Rec 02: `cropster-brand-lanyard.jpg`
- Rec 03: `cropster-brand-sticker.png`
- Rec 04: `cropster-brand-storyboard.jpg`

### State
- Staged: https://staging.curiousendeavor.com/cropster-pitch/#brand-dna
- NOT pushed to production yet — pending Assaf approval

## Botika Brief + Deep Dive — Afternoon Session (14:59–16:07 UTC)

### Context
Working on Botika brand brief pages for CE pitch prep. Pages live at:
- Brief: `https://staging.curiousendeavor.com/botika/brief.html`
- Deep Dive: `https://staging.curiousendeavor.com/botika/index.html`
- Files: `public/botika/brief.html`, `public/botika/index.html`

### What Was Done
1. **Initial critique** — full visual audit of staging page. Key issues: no sticky nav, no container, 64px loose padding, eToro CE red overriding Botika green, broken Brief toggle link, no footer, weak campaign images.
2. **Hero image** — swapped to male model (AVIF sent by Assaf). Later swapped again to a second model AVIF.
3. **6 structural fixes** — scroll bar, footer, campaign images (product shots not IG screenshots), Lalaland.ai added to competitive table, "Charcoal" swatch fix, brief.html created in public folder.
4. **Robinhood comparison** — compared deep dive against `etoro-competition/robinhood/index.html` design system. Key takeaways: single max-width container, tighter padding, sticky section nav with active state, shorter nav labels.
5. **Structural rebuild** — sticky pill-nav with IntersectionObserver active tracking, max-width: 1100px container, 56px section padding, green accent strip, all-caps nav labels.
6. **brief.html** — sub-agent rebuilt from `competitor-brief-page` skill template using `brief-page.css`, canonical mosaic structure, 13 expandable cards.
7. **Deep-dive section headers** — simplified from `section-num + section-label-large` pair → single `.section-label` (red, 10px, uppercase) above serif h2. Matches Robinhood.
8. **TL;DR stats** — switched from JetBrains Mono to Larken display font.
9. **6 more fixes in progress (sub-agent running)** — prose length, alignment grid §02, horizontal timeline §04, scorecard full width, verdict as visual cards, natural image ratio §09.

### Decisions
- `competitor-brief-page` skill is the canonical format for all brief/deep-dive pages
- Botika brand vars: `--brand-primary: #00A756; --brand-dark: #0C0C0C; --bg: #f4f4f2`
- Anton should review pages before Assaf sees them — not just at end
- Deep-dive follows Robinhood nav pattern: sticky section tabs, active state = black pill

### Sub-agent Running
- `agent:main:subagent:b5311f7d-965e-4310-b0e3-e5e7c91ff1a5` — 6 deep-dive fixes (prose, alignment, horizontal timeline, scorecard width, verdict cards, image crop). Expected completion ~16:10 UTC.

## Botika Post Machine — Build Session (14:57–16:15 UTC)

### What Was Built
Full post-creation tool at `https://staging.curiousendeavor.com/botika-post-machine/`
Files: `public/botika-post-machine/index.html`, `public/api/search.js`, `public/api/generate.js`
Server routes: `work/active-projects/spoken/api/server.js` (added `/api/botika-search` + `/api/botika-image`)

### Architecture
4-panel single-page app: TOPIC → SIGNALS → IMAGE → EDIT
- Panel A: 13 pre-populated topic cards (4 categories, hardcoded JSON), click fires search
- Panel B: Live signal search via `/api/botika-search` → Gemini 2.5-flash grounding (web/IG/TikTok) + OpenAI (Reddit) + X Bearer Token
- Panel C: Gemini imagen-4.0-generate-001 with Tatiana's style prompt, corrective brief support
- Panel D: Full typography canvas (verbatim from signal.html), Botika logo locked, PNG 2x export

### Infra Details
- Search routes via nginx → port 3847 (spoken-api.service systemd)
- X_BEARER_TOKEN needed `%%3D` escape in systemd service file (% is a specifier)
- `gemini-2.0-flash` deprecated → upgraded to `gemini-2.5-flash` for grounding
- 3 parallel Gemini calls timed out → consolidated into 1 call (searchGeminiMulti)
- Vercel API routes (api/search.js, api/generate.js) written for Vercel Lambda — NOT used on staging (nginx/node server handles instead)
- `/api/generate` path collided with Spoken API → renamed to `/api/botika-image`

### Style Prompt
Tatiana validated against Botika IG references (ig-01 to ig-08). Final prompt in:
`work/pitches/botika/post-machine/botika-style-prompt.txt`
Baked into `server.js` as `const STYLE = '...'` — no env var dependency.

### What's Working
- Topic cards → search fires → 10-12 signals return via staging URL ✓
- Source badges with pulse animation during search, count on completion ✓
- CE styleguide throughout, Botika logo on canvas export ✓
- PNG 2x download with document.fonts.ready gate ✓

### Decisions
- CE styleguide governs the tool UI; Botika branding on canvas export only
- LinkedIn dropped as source (blocks indexing); replaced with Gemini web grounding
- Sequential panel UX (slide transitions) not three-panel all-visible
- API keys secured server-side (not in client HTML)
- V2 backlog: direct publish, save/share, editable topics, auth

### Pending
- Image generation not yet tested end-to-end by Assaf
- PRD: `work/pitches/botika/post-machine-prd.md` (v2.0, all Anton blockers resolved)

---

## Botika Deep Dive — Afternoon Session (16:07–16:39 UTC)

### Fixes Applied (index.html, commits d199bda → 7ce75ef → pending)

**Round 1 (d199bda → 7ce75ef — pushed):**
- §02 diversity image: `height: auto` (natural ratio, no forced crop)
- Green 3px top accent strip: removed
- Dark break border-top/bottom hacks: removed, `width: 100%; display: block`
- Typography specimen block in §03: deleted entirely
- BIP grid: removed `product-cutcosts.avif` and `product-gettomarket.avif` (website feature screenshots, not model shots)
- §06 solutions.png: reverted to `height: 480px; object-fit: cover; object-position: top` (natural ratio was showing full-page tall)
- Verdict cards: restructured from 3 flex columns → flat 12-card CSS grid (row-by-row: S/G/O alignment)

**Round 2 (in progress — fixes mid-apply, not yet committed):**
- Nav: 2-row CE bar + pill-nav → single sticky nav: `← Brief | [pills] | curious endeavor.`
- `.nav-pills a.active { background: var(--black); color: #fff }` pill state
- Dark break: full-bleed → constrained to `max-width: 1100px; margin: 0 auto`
- §02 prose: trimmed to 2 sentences
- BIP grid: added `product-perryEllis.avif` + `web-ig-03.jpg` back (8 clean shots)
- `scroll-margin-top: 60px` on `.content-section` for sticky nav offset

### Issues Still Open
- §02 prose edit: plain `<p>` tags (not `.prose-p` class) — needed different selector in Python script
- BIP nilmon grid-end match failed — needs re-check
- All above mid-apply, need to commit after finishing

### Key Pattern Decision
- dark-break: constrained to 1100px (same as content sections) — NOT full-bleed
- single-nav: unified bar, `top: 0`, z-index 200, `height: 52px`
- JS IntersectionObserver: `rootMargin: '-15% 0px -75% 0px'` for active state
- Nav selector updated: `.pill-nav a[data-section]` → `#section-nav .nav-pills a[data-section]`

### Lesson
- Sub-agents timed out twice — direct inline edits are faster for HTML work
- Always verify image content (image-manifest.md) before putting images in production sections
- `product-cutcosts.avif` and `product-gettomarket.avif` are Botika website screenshots with feature text — wrong for model grid
- Plain `<p>` vs class-namespaced `<p class="prose-p">` — always grep actual HTML before writing replacement strings

