# 2026-02-28 — Daily Notes

## Key Events

### Corrections
- **Jim corrected Symphony URL** — I was pointing users to `agency.symph.co` instead of `symphony.symph.co`; fixed in MEMORY.md + TOOLS.md during #insurenow session

### New Products / Requests
- **InsureNow (Nicole)** — migrating from Lovable; needs Symphony product created first, then Aria clones repo + adds backend/payments
- **Trussfolio** — contractor discovery platform for PH (Clutch.co meets BuildZoom, PCAB data); user pausing to refine spec with T.A.R.S. first

### Active Product Work
- **VectorPM positioning** — "Build horizontal, launch vertical" strategy confirmed; construction vertical as wedge; no competitor mentions; headline: "Your projects have phases. Your PM tool should too."
- **Alignly GloryReborn** — Firebase reset email branded, Action URL updated to custom dev domain; time-tracking page debugging
- **Nestiq/Pantry** — App went down (port 3037), restarted manually

### Security
- **Worktree preview URL security** (Jim) — `rapidbuild.dev.apps.symph.co/?s=sessionId` is public with no auth gate; Jim flagged as concern

### Video Pipeline
- Deep dive into video generation pipeline code shared with team member; architecture confirmed in code

## Fact Extraction Run (07:50 UTC)
- Extracted: 6 new people entries, 5 new decisions, 3 new technical notes
- Sources: 11 non-cron sessions from 2026-02-28 (Trussfolio request, InsureNow/Nicole, VectorPM positioning, Alignly+GloryReborn, Pantry, worktree security, video pipeline deep dive)
- No conflicts with existing facts found

## Fact Extraction Run (18:53 PHT / 10:53 UTC)
- Extracted: 3 new technical notes, 2 new people entries, 2 new decisions
- Sources: 7 sessions reviewed (RunwayML study thread, "chika here" thread, Brandcast video generation, design iterations thread, fashion-travel discovery pipeline, SmashSlot fix, App Watchdog sweep)
- Key items: loewe profile created; StyleCast (fashion-travel) product discovered; SmashSlot Caddy port fix; App watchdog cross-contamination issue; RunwayML API docs captured; Runway-schema prompting files created in marketing-qa-reviewer

## Fact Extraction Run (21:04 PHT / 13:04 UTC)
- Extracted: 1 new technical note, 0 updates
- Sources: Sessions from 10:53–13:04 UTC reviewed
- Key items: Finspend dashboard flat illustration generated (mint bg, green bar chart, ₱ sign, lightning bolt) from Discord "#can-you-see-the-finspend-figma" thread → saved to `/home/aria/marketing-assets/uploads/2026-02-28-finspend-dashboard.png`
- Rest of sessions: all routine cron jobs (Agency Job Processor, App Watchdog, ReadStreak Reminder)

## Brandcast Pipeline Deep Dive — loewe session (16:27–17:09 UTC)

### Runway Methodology Study
- Studied RunwayML Gen-4 docs: image-to-video, reference images, at-mention syntax, Gen-4.5/Turbo/Aleph
- Key insight: replicate Runway's methodology on our existing Veo + Gemini stack — no Runway API needed
- 4 ROI items identified and implemented in order

### ROI #1 — Always I2V (text → image → video)
- `narrate-and-generate`: added `framePrompt` to `SceneInput`, added `generateKeyframe()` helper
- `page.tsx`: added `linkedFrameNodeId` + `frameGenerating` to GeneratorNodeData
- Generation watcher: skips nodes with `frameGenerating=true` (waits for own keyframe)
- Frame watcher: sets `frameGenerating=false` on linked gen node when frame finishes
- `GeneratorNode.tsx`: amber "Waiting for keyframe…" state, disabled button while waiting

### ROI #2 — End-Frame Chaining (scene N last frame → scene N+1 start)
- `lastChainGenNodeId` ref tracks last gen node per batch (resets on 8s timeout or when last scene starts generating)
- Each scene N+1 gets `prevGenNodeId` + `waitingForPrevScene=true`
- After scene N completes: `triggerEndFrameChain()` extracts last frame → sets as `startImageUrl` → auto-triggers N+1
- Bug fixed: `triggerEndFrameChain` was defined after `triggerGeneration` (circular ref) — moved before
- GeneratorNode: "Waiting for prev scene…" amber state

### ROI #3 — Character Sheet (consistent subject across scenes)
- `SceneAction.characterPrompt` field (first scene only)
- `characterSheetUrlRef` in page.tsx — generated once, shared across all scenes
- Frame nodes get `waitingForCharacterSheet=true` until sheet is ready; unlocked in batch
- `generate-frame` receives `referenceImageUrl` = character sheet URL for all scenes
- Visible "Character Sheet" ImageNode added to canvas; polls for completion
- Copilot system prompt updated with `characterPrompt` rules + format

### ROI #4 — Lighting Palette (consistent color temp across scenes)
- `SceneAction.lightingPalette` field (first scene only)
- `lightingPaletteRef` stored and reset with batch
- Passed to every `generate-frame` call as `lightingPalette` param
- `buildVideoFramePrompt()` accepts + injects as "LIGHTING + COLOR TEMPERATURE (LOCKED)" block
- Copilot system prompt updated with format + 4 example palettes

### Test Video — VectorPM Friday 5-scene
- Generated via Python VideoGeneratorLoop (WRONG — see correction below)
- Result: 18.9s, 5 scenes, 720x1280 9:16, captioned
- File: `brandcast-stitched-2026-02-28T16-51-40-captioned.mp4`
- QA fail on final video due to 720p vs 1080p spec + missing brand mark (expected for cinematic B-roll)

### CORRECTION — loewe (17:03 UTC)
**Always use Veo + Remotion pipeline** — NOT VideoGeneratorLoop + Python caption burner
- VideoGeneratorLoop is legacy/workaround
- Correct: Veo (B-roll) → Remotion (text, brand, CTA, composition, audio)
- Logged in error-log.md

## Fact Extraction Run (16:54 UTC / 00:54 PHT Mar 1)
- Extracted: 4 new technical note sections (Brandcast ROIs, Trussfolio discovery, Finspend icons, ReadStreak deploy bug), 2 new decisions
- Sources: chika-here thread (519593df), VectorPM/Brandcast topic session (b4cfae78), #general Trussfolio docs thread (95b9fd3a), finspend-figma thread (22f8ae4e), ReadStreak CSS fix (2df04174), heartbeat session (83afa34b)
- Key items:
  - **4 Brandcast ROIs shipped**: Always I2V, end-frame chaining, character sheet, lighting palette — full Runway-inspired pipeline complete
  - **Test video generated**: brandcast-stitched-2026-02-28T16-51-40-captioned.mp4 (18.9s, 5 scenes, 9:16)
  - **Trussfolio PRD docs uploaded** (4 files) — V1 scope clarified (~18,584 contractors, no JV, no CAPTCHA)
  - **Finspend icons**: 3 style iterations generated (v1 mint, v2 forest green, v3 cream/sticker)
  - **ReadStreak CSS deploy bug**: static files not copying; manually fixed

## Fact Extraction Run (18:25 UTC / 02:25 PHT Mar 1)
- Extracted: 2 new technical note sections, 1 new decision
- Sources: e82ae026 (Product Development/Nestiq thread), 519593df (chika-here/Brandcast), 09971476 (Pantry thread), 068313de + others (Discord Feedback Scanner crons x8 — all routine)
- Key items:
  - **Nestiq Firebase auth fixed**: signInWithRedirect → signInWithPopup; React race condition fixed with window.location.href; service worker caching discovered
  - **Brandcast Remotion video still in progress**: Chromium on Linux rejects H264, needs VP9/WebM; symlinks outside public/ rejected by Remotion bundler
  - **Nestiq Home Inventory feature**: jhaisalcedo requested 18:21 UTC, Claude Code spawned to build it
  - Discord feedback scanner crons: 8+ runs from 17:00–18:25 UTC, all previously processed (55 total today: 50 revision_requested, 2 approved, 1 rejected)

## Fact Extraction Run (18:35 UTC / 02:35 PHT Mar 1)
- Extracted: 2 new technical note sections
- Sources: 4d2300cb (Nestiq #Schedule Discord thread), routine crons (QA runner, copilot lock, CardPop sales — all no-ops)
- Key items:
  - **Nestiq Schedule feature**: 3 screens generated in Discord thread — week calendar view, quick-add sheet, family member color setup; screen PNGs saved to workspace root
  - **Gemini 3 Pro Image rate limit**: 429 RESOURCE_EXHAUSTED on free tier; retry after minutes resolves it

## ReadStreak E2E Health Check — 19:00 UTC (3AM PHT) #readstreak #healthcheck
- ✅ Homepage (200)
- ✅ Dashboard redirect to login (307 — expected, auth-protected)
- ✅ Library redirect to login (307 — expected, auth-protected)
- ✅ Friends page (200)
- ✅ /api/healthcheck → `{"status":"ok","app":"ReadStreak","version":"1.0.0"}`
- ✅ /api/books/search — responding
- ✅ /api/locale — responding
- ✅ /api/notifications/renewal-reminder — 401 (auth required, endpoint exists)
- All systems nominal. No failures.

## Fact Extraction Run (19:42 UTC / 03:42 PHT Mar 1)
- Extracted: 0 new facts, 0 updates
- Sources: Sessions from 18:35–19:42 UTC reviewed
- Only new activity: ReadStreak E2E Health Check at 19:00 UTC (all green, routine — no new facts)

## TIL (Today I Learned)
- `signInWithRedirect` is unreliable with Next.js App Router — use `signInWithPopup` + full page reload instead #bug #firebase
- Chromium on Linux doesn't support H264 — Remotion/Veo pipeline must use VP9/WebM #technical
- `staticFile()` in Remotion requires relative paths; symlinks outside project root fail #technical
- Gemini 3 Pro Image free tier hits 429s during heavy generation sessions — wait a few minutes, it recovers #gotcha
- Worktree preview URLs (`rapidbuild.dev.apps.symph.co/?s=...`) have no auth gate — security gap to address #security
- Runway API not needed — Runway's *methodology* (I2V, end-frame chaining, character sheets, lighting palettes) can be replicated entirely on Veo + Gemini stack #decision

## Fact Extraction Run (21:28 UTC / 05:28 PHT Mar 1)
- Extracted: 3 new technical notes, 0 people/decisions/preferences updates
- Sources: Sessions from 19:42–21:28 UTC reviewed (Discord Feedback Scanner, QA Runner crons x4, Agency Job Processor, Copilot Lock Check, CardPop Sales Monitor — all routine crons)
- Key items:
  - **Worktree preview auth gate confirmed secure** — forward_auth blocks unauthenticated requests; Jim's flagged security concern resolved
  - **Copilot iframe devUrl bug fixed** — `useCopilot` hook now stores and passes auth token URL to LivePreviewPanel
  - **ranil-profile.landing.symph.co** — Let's Encrypt cert live (expires May 28, 2026)
  - All other sessions: routine crons with no new facts
