# סיכום סשן — 0027
תאריך: 2026-05-25 00:30
אפליקציה: **VitClip** (חדשה — נכנסה לאקוסיסטם)
נושא: MVP end-to-end · Cloud Run + Vertex AI · 3 גרסאות הופצו

## מה נבנה והושלם

### 1. הקמת מוצר חדש "VitClip" (פרויקט חדש לחלוטין)
- מוצר: אפליקציית Android שמקבלת share של URL מ-Instagram/Facebook/TikTok/YouTube, מורידה את הוידאו דרך yt-dlp בשרת מתווך, מסכמת ב-Gemini multimodal, מחזירה JSON עברי.
- מוטיבציה: שימוש אישי של המשתמש (לא מסחרי) — לסכם reels שמשתפים אליו.
- שם נבחר: **VitClip** (תואם naming של האקוסיסטם).
- צבע אפליקציה: pink/magenta `#EC4899` (236,72,153) — תואם ל-accent בtheme.dart.

### 2. Flutter Android app (`D:\Vitruvius Ecosystem\VitClip\`)
- Flutter 3.41.9 / Dart 3.11.5 · Material 3 dark · pure setState (no Riverpod) · share_handler 0.0.25 · http 1.6 · shared_preferences · url_launcher
- 6 קבצי lib: main.dart, theme.dart, models/summary.dart, services/{config,api_client,share_receiver,history_store}.dart, screens/{home,summary}_screen.dart
- AndroidManifest: SEND intent filter עם text/plain + text/uri-list + text/*, VIEW filters ל-15 hosts (instagram/facebook/tiktok/youtube variants), Sharing Shortcuts XML, MaterialApp עם locale עברי
- 3 גרסאות הופצו דרך **Firebase App Distribution** (אישי elyash7@gmail.com)

### 3. Backend Cloud Run (`vitclip-backend`)
- Node 20 + Express + yt-dlp (latest binary) + ffmpeg + Gemini SDK
- Dockerfile עם apt install + curl yt-dlp from GitHub
- Deployed: europe-west1, 1Gi memory, 1 CPU, max 3 instances, **concurrency=1**, timeout 600s, allow-unauthenticated
- URL: `https://vitclip-backend-668736573394.europe-west1.run.app`
- Auth: `x-api-key` header עם 48-char shared secret + `timingSafeEqual`

### 4. אוטומציה ולוגיסטיקה
- Firebase project `vitclip` יצרנו דרך MCP, App ID Android `1:668736573394:android:bc8a2b9b29692da26fc20b`
- Billing נקשר ל-"Firebase Payment" account (אותו של vitvital)
- Firebase App Distribution הוגדר ושלח 3 מיילים אוטומטית למשתמש (v0.1, v0.2, v0.3)
- gcloud CLI הותקן ידנית דרך winget (Cloud SDK 569) במהלך הסשן
- gcloud OAuth (אחרי 3 ניסיונות wrapper כושלים) נסגר בסוף עם localhost callback מהמחשב

### 5. סקירה רב-תחומית (5 סוכנים מקבילים) + 14 תיקוני P0/P1
המשתמש ביקש "תריץ כל סוכן שקשור איכשהו לפרויקט". הופעלו 5 סוכנים במקביל:
- **Backend security/reliability** — 12 ממצאים (SSRF redirect, default secret, max-filesize, Gemini timeout, etc.)
- **Flutter code quality** — 15 ממצאים (cold-start race, HistoryStore wipe, copyWith bug, etc.)
- **Mobile/Android UX** — 15 ממצאים (sharing-shortcuts spec, locale, BiDi flip, etc.)
- **Privacy/data flow** — 10 ממצאים (key leak, log sanitization, plaintext prefs)
- **End-to-end edge cases** — 20 ממצאים (live streams, geo-blocked, cold start, etc.)

תוקנו כל ה-P0 + רוב ה-P1. נדחו מודעות לאחר launch: stable release signing keystore, runtime Sharing Shortcuts push (Kotlin).

## החלטות שהתקבלו

| החלטה | סיבה |
|---|---|
| **yt-dlp scraping ולא Meta Graph API** | המשתמש בחר "אפור". Graph API מוגבל ותוכן של המשתמש בלבד. |
| **Android בלבד MVP** | המשתמש על Samsung. iOS share extension דורש עבודה נפרדת. |
| **Gemini multimodal ולא Whisper+LLM** | המשתמש אמר "כבר יש 3.5 flash" (התכוון לחדש), בסוף יושב על gemini-2.5-flash דרך Vertex. |
| **Vertex AI ולא AI Studio API** | AI Studio דורש prepayment credits (נגמרו לחשבון של המשתמש). Vertex AI = פר-token דרך GCP billing רגיל. |
| **Cloud Run concurrency=1** | וידאו ב-Gemini = 150-300MB RSS per request. 80 concurrent = OOM cascade. |
| **Firebase App Distribution להפצה** | החלפת 0x0.st (חוסם classifier) ו-Drive (גדול מדי ל-tool). חוקי, נקי, אוטומטי. |
| **Hebrew locale ב-MaterialApp** | תיקון DatePicker/Cupertino/system dialogs שנשארו LTR English. |
| **URLs עטופים ב-Directionality.ltr** | בתוך RTL screens URLs מתהפכים ויזואלית. |
| **שמירת ה-Gemini key שדלף** | המשתמש בחר "ישלח, אבטל אחר כך" אבל בפועל עברנו ל-Vertex AI שלא משתמש ב-key — אז ה-leak לא רלוונטי. |
| **release סוגר ב-debug key** | "Unknown Developer" warning מקובל לשימוש אישי. signing keystore עתידי. |

## בעיות שנפתרו

### 1. ה-Gemini 2.5 Flash דרך AI Studio החזיר 429 "prepayment credits depleted"
- ניסיתי gemini-2.0-flash → גם 429
- ניסיתי ליצור API key בפרויקט vitclip (יש לו Blaze) → גם 429 (כי זה account-level prepayment)
- ניסיתי ליצור project חדש ללא billing → CREATE נכשל (quota?)
- **הפתרון:** עברנו ל-**Vertex AI** דרך `@google-cloud/vertexai`. בילינג ישיר ל-vitclip billing account, בלי prepayment. **עבד.**

### 2. ה-Gemini ב-europe-west1 נתן 404 "Publisher Model not found"
- ניסיתי `gemini-2.0-flash` ב-europe-west1 → 404
- ניסיתי `gemini-2.0-flash-001` ב-us-central1 → 404
- **הפתרון:** `gemini-2.5-flash` ב-us-central1 → **עבד**

### 3. flutter_localizations דרש intl 0.20+
- הוספת flutter_localizations שברה את intl 0.19 constraint
- **הפתרון:** bump ל-`intl: ^0.20.2`

### 4. TextDirection conflict
- intl 0.19+ מייצא TextDirection משלו שמתנגש עם flutter/material
- **הפתרון:** `import 'package:intl/intl.dart' hide TextDirection;` בכל קובץ שמשתמש בשניהם

### 5. gcloud OAuth login לא הצליח 3 פעמים
- ניסיתי `--no-launch-browser` עם stdin pipe → "Malformed auth code" — ה-stdin redirection ב-PowerShell דרך .NET StreamWriter כתב CRLF שמבלבל את gcloud
- ניסיתי wrapper עם stderr capture של URL → גם נכשל בדומה
- **הפתרון בסוף:** רץ gcloud auth login רגיל (localhost callback mode), הוצא URL, המשתמש פתח ב-Chrome **של ה-PC** (לא של הטלפון), browser החזיר ל-localhost:8085, gcloud קיבל קלט, נכנס. הבעיה הקודמת — המשתמש פתח את ה-URL בטלפון, ה-redirect ל-localhost:8085 הגיע ל-localhost של הטלפון (לא של המחשב).

### 6. yt-dlp נכשל על YouTube
- "Sign in to confirm you're not a bot" — YouTube חוסם datacenter IPs
- **הפתרון:** TikTok/Instagram/Facebook עדיין עוברים. YouTube דורש cookies (לא מימשנו).

## מה לא עבד / להיזהר

- **PowerShell stdin → child process** — `WriteLine` מכניס `\r\n` ש-gcloud (Python) מפרש שגוי. Better: `Write($code + "\n")` עם `Encoding.UTF8` ב-`StreamWriter`.
- **AI Studio Gemini API ל-video input** = דורש prepayment. Vertex AI עוקף.
- **`gemini-2.0-flash` ב-Vertex europe-west1** לא קיים. רק `gemini-2.5-flash` ב-`us-central1`.
- **localhost OAuth callback** עובד רק אם הדפדפן והשרת על אותה מכונה (טלפון != PC).
- **YouTube via yt-dlp מ-Cloud Run IPs** נחסם. רק IG/FB/TikTok עובדים בלי cookies.
- **AI Studio API key creation flow** דורש navigation דרך browser; אי אפשר אוטומטית. עברנו ל-`gcloud services api-keys create` (GA) שעובד אוטומטית.

## קבצים שנוצרו

### Flutter (lib/)
- `lib/main.dart` (101 שורות — App + Hebrew locale + share dispatcher + post-frame buffer)
- `lib/theme.dart` (88 שורות — Material 3 dark, pink accent, WCAG-AA muted color)
- `lib/models/summary.dart` (170 שורות — Sentinel-based copyWith + defensive fromJson)
- `lib/services/config.dart` (24 שורות — dart-define-based config + stubMode)
- `lib/services/api_client.dart` (130 שורות — http.Client lifecycle + UTF-8 decode + status→Hebrew)
- `lib/services/share_receiver.dart` (70 שורות — share_handler subscription + URL extraction with trailing-punct strip)
- `lib/services/history_store.dart` (105 שורות — serialized writes + corruption backup + stuck-processing sweep)
- `lib/screens/home_screen.dart` (380 שורות — list + paste validation + delete with undo + LTR URL display)
- `lib/screens/summary_screen.dart` (380 שורות — staged loading + error retry + LTR URL section + smart transcript hiding)

### Android config
- `android/app/src/main/AndroidManifest.xml` (rewritten — 15 hosts + 3 mime types + shortcuts meta)
- `android/app/src/main/res/xml/shortcuts.xml` (share-target + launcher shortcut)
- `android/app/src/main/res/values/strings.xml` (shortcut labels)
- `android/app/build.gradle.kts` (minSdk=24)
- `pubspec.yaml` (8 dependencies, intl bumped to 0.20)

### Backend
- `backend/package.json` (`@google-cloud/vertexai` v1.9)
- `backend/index.js` (370 שורות — Vertex AI + URL allowlist + secret refusal + max-filesize + SIGTERM cleanup + URL hash cache + yt-dlp error translation + timingSafe auth + log redaction + live-stream rejection)
- `backend/Dockerfile` (Node 20-slim + Python + ffmpeg + yt-dlp from GitHub latest)
- `backend/.env.yaml` (gitignored — SHARED_SECRET + GEMINI_MODEL=gemini-2.5-flash + GEMINI_LOCATION=us-central1 + GCP_PROJECT=vitclip + MAX_DURATION_SEC=900)
- `backend/.gitignore`, `backend/.dockerignore`, `backend/README.md`

### Root
- `VitClip/.shared_secret` (gitignored, 48 chars random)
- `VitClip/README.md` (full architecture + deploy + roadmap)
- `VitClip/_gcloud_auth_wrapper.ps1` (failed wrapper — left for reference)

### Firebase
- Project `vitclip` (number 668736573394) under elyash7@gmail.com
- Android app `1:668736573394:android:bc8a2b9b29692da26fc20b`
- App Distribution: 3 releases (0.1, 0.2, 0.3), tester elyash7@gmail.com

### Cloud Run / GCP
- Service `vitclip-backend` in europe-west1, current revision `00008-twx`
- APIs enabled: `run`, `cloudbuild`, `artifactregistry`, `generativelanguage`, `aiplatform`
- Billing: linked to "Firebase Payment" (`015AE0-7D0D1D-A16CCD`)

## הצעד הבא

המשתמש כרגע ממתין שאתקין את v0.3 דרך Firebase App Tester (קישור הופץ אוטומטית). הצעד הבא תלוי בתוצאה:

**אם v0.3 מסכמת בהצלחה Reel אמיתי מ-IG/FB:**
- MVP נסגר. ניתן לנוע ל-V0.4: history sync ב-Firestore (cross-device), iOS Share Extension, push notification כשסיכום ארוך מוכן ברקע, או על-ההזמנה של המשתמש.

**אם נכשל:**
- בדיקת logs מצד backend: `gcloud run services logs read vitclip-backend --region=europe-west1 --project=vitclip --limit=20`
- אם yt-dlp נכשל על host מסוים → להוסיף לרשימת השגיאות המתורגמות
- אם Vertex AI נכשל → לבדוק model availability ב-region

**Audit follow-up (לא דחוף):**
- stable upload keystore (when app opens to other testers)
- runtime `pushDynamicShortcut` ב-MainActivity.kt (קצת Kotlin, אם רוצים שהאפליקציה תקפוץ בתפריט שיתוף יותר מהר)

**Memory entries מוצעות (לסשן הבא או עכשיו):**
- vitclip-vertex-ai-only (לא AI Studio, account-level prepayment)
- vitclip-gemini-region-model (gemini-2.5-flash ב-us-central1 בלבד, לא europe-west1)
- ytdlp-youtube-blocked-from-cloud (IG/FB/TikTok עובדים, YouTube דורש cookies)
- powershell-stdin-crlf-gotcha (WriteLine פוגע ב-CLI tools שצופים LF)
