# סיכום סשן — 0053
תאריך: 2026-06-09 11:55
אפליקציה: VitruAgent (+ VitTeamAgents, VitClip, VitPMIS)
נושא: מפתח קולי + הקשחת אבטחה (VitruAgent freeze)

## הקשר
המשך מסשן 0052 — ישיבת מועצת 9 סוכנים (`_council-meeting-2026-06-08.html`) עם 12 פעולות מיידיות. השופט קבע **VitruAgent freeze** עד 3 תיקונים. הסשן ביצע אותם end-to-end + 2 פעולות קלות נוספות, ונתקע בחוסם תפעולי (מינט הטוקן).

## מה נבנה/הושלם
### VitruAgent freeze — 3 תיקוני המועצה
- **(א) בידוד מפתח שדלף:** המפתח ב-`VitruAgent\מפתח גמיני.txt` (פורמט `AQ.`, 4 אחרונים `x2zA`, 53 תווים) הועבר ל-`D:\Vitruvius Ecosystem\_SECRETS-PENDING-REVOKE\vitruagent-gemini-key-REVOKE-2026-06-08.txt` + README הסבר. **המשתמש עדיין לא אישר שביטל אותו ב-AI Studio.**
- **(ב) firestore.rules:** נכתב מחדש מ-`allow read,write: if auth != null` (פתוח לכל מחובר) ל-**רשימת-היתר מייל**: `isAllowedOwner()` בודק `email_verified==true` + email ב-[elyash7, vitruviusecosystem] · deny-by-default catch-all · allow מפורש per-collection ל-domains/projects/tasks. מראה זהה ב-`VitPMIS\firestore.rules` (אותו פרויקט vitpmis משותף). **לא** דפוס org-scoped של VitSiteReport — אין סכמת org/ownerUid ב-vitpmis.
- **(ג) mintRealtimeToken Cloud Function — פרוס וחי:** מאמת caller (auth + email_verified + allowlist) ואז מנפיק ephemeral token מ-Gemini. europe-west1, Node 22, vitpmis/Blaze, secret `GEMINI_API_KEY` v1 מחובר, SA עם secretAccessor.

### לקוח (Flutter)
- `lib/services/realtime_token_service.dart` (חדש) — עוטף את ה-callable, מתרגם שגיאות `FirebaseFunctionsException` לעברית, מחזיר `RealtimeTokenResult{token, expireAt, model}`.
- `lib/services/gemini_live_client.dart` — שני constructors: `withEphemeralToken` (host **v1alpha** + `?access_token=`) ו-`withApiKey` (host v1beta + `?key=`, legacy/dev בלבד).
- `lib/screens/agent/agent_screen.dart` — flow: mint → `withEphemeralToken`; ב-catch, אם `_kDevOnlyApiKey` ריק → rethrow (אין fallback בייצור), אחרת `withApiKey`. שגיאה במסך = `הפעלה נכשלה: <e>`. label `v1.0.5 (8)`.
- `pubspec.yaml` — גרסה **1.0.5+8**, `cloud_functions: ^6.0.0`. APK v8 נבנה.
- `firebase.json` — נוסף בלוק `functions` (source backend/functions, nodejs22).

### 2 פעולות קלות
- **4 הפרות Brand Voice ב-VitTeamAgents** תוקנו (תרגום בסוגריים): dashboard/index.html ("Event Bus"→"אוטובוס אירועים (Event Bus)", "Quality Gates"→"שערי איכות"), core/reports/ecosystem_report.py, brand/ICP-PROFILE.md ("audit log"→"יומן ביקורת (audit log)"), agents-peer-review-message.html, סונכרן `_brand-brains-data.json`. **44/44 בדיקות ירוקות.**
- **gitignore:** `.shared_secret` + דפוסי סוד (`*api*key*`, `מפתח*.txt`, `.env`, `serviceAccount*.json`) ל-`VitClip\.gitignore` + `VitruAgent\.gitignore`.

## החלטות שהתקבלו
- **דפוס rules = רשימת-היתר מייל, לא org-scoped.** הסיבה: vitpmis משותף בין VitPMIS ל-VitruAgent, 3 קולקשנים שורשיים (domains/projects/tasks), אין שדה ownerUid/org בסכמה. דפוס VitSiteReport דורש סכמה שלא קיימת.
- **המפתח עובר דרך Gemini Developer API (מפתח AI Studio), לא Vertex.** מודל `gemini-3.1-flash-live-preview` חשוף רק דרך Developer API. Firebase/vitpmis משמש רק ל-secret + tools.
- **לא ליצור מפתח חדש** — 3 מפתחות קיימים (F4eg/x2zA/kdkA) כולם על vitpmis/Tier1. מומלץ למחזר F4eg או kdkA במקום x2zA שדלף.

## בעיות שנפתרו
- **Cloud Functions API לא מופעל (403 SERVICE_DISABLED)** גם ב-Blaze → `gcloud services enable cloudfunctions/run/cloudbuild/artifactregistry/eventarc`. ל-gcloud לא היו creds ל-vitruviusecosystem (רק elyash7 פעיל) — ה-creds של elyash7 הספיקו להרשאה.
- **Windows build file-lock** (`AccessDeniedException`): `Get-Process java | Stop-Process -Force; Remove-Item build -Recurse -Force; attrib -R . /D /S`. חוזר בכל build.
- **מינט v7 — 404:** URL שגוי (`auth-tokens` מקף), שדה שגוי (`bidiGenerateContentSetup`), client WS path v1beta. תוקן ל-`auth_tokens`/`liveConnectConstraints`/v1alpha.
- **מינט v8 — 400 שנחשף:** לוג גילה `Invalid JSON payload received. Unknown name 'liveConnectConstraints' at 'auth_token': Cannot find field.` → הוכיח שה-URL `/v1alpha/auth_tokens` **נכון**, אבל השדה `liveConnectConstraints` נדחה ע"י ה-REST surface. הוסר → גוף מינימלי `{uses, expireTime, newSessionExpireTime}`.

## מה לא עבד / צריך להיזהר
- **classifier חוסם קריאת `GEMINI_API_KEY` ל-shell** ("credential exploration"). לא ניתן לבצע curl-test ישיר עם המפתח. עקיפה: לוגינג בתוך ה-Function (המפתח נשאר ב-env מוגן).
- **אזהרות AppCheck בלוג = רעש** — enforcement כבוי, `auth VALID`, הבקשות עוברות ("Allowing request with invalid AppCheck token because enforcement is disabled").
- **לעולם לא** `--dart-define=GEMINI_API_KEY=` ב-release (מקור הדליפה המקורי מסשן 0053-קונטקסט).
- **הסכנה הצפויה (מסשן 0046):** גם אם המינט מצליח, ה-WebSocket עלול לסגור `1011 "prepayment credits depleted"` אם לפרויקט של המפתח אין קרדיטים. זו בעיית billing בקונסולה, לא קוד.

## חוסם פתוח (לא נסגר)
**מינט הטוקן עדיין לא אומת end-to-end.** אחרי הסרת `liveConnectConstraints` המשתמש דיווח "עדיין אותו חרא". קראתי לוגים → **אין שגיאת upstream מהקוד שלנו**, רק AppCheck (auth VALID). מסקנה: המינט **כנראה מצליח** והכשל ירד ל-WebSocket בצד הלקוח. הוספתי לוג `minted OK` (tokenPrefix בלבד — ephemeral, בטוח) ופרסתי מחדש. **ממתין שהמשתמש ילחץ "נסה שוב" ויקריא את `הפעלה נכשלה: <error>`** — זה יקבע איזה חצי שבור.

## קבצים שנוצרו/שונו
**נוצרו:**
- `VitruAgent\lib\services\realtime_token_service.dart`
- `VitruAgent\backend\functions\{index.js, mintRealtimeToken\index.js, package.json}`
- `VitruAgent\DEPLOY-mintRealtimeToken.md`
- `_SECRETS-PENDING-REVOKE\{vitruagent-gemini-key-REVOKE-2026-06-08.txt, README.md}`

**שונו:**
- `VitruAgent\firestore.rules`, `VitPMIS\firestore.rules`
- `VitruAgent\lib\services\gemini_live_client.dart`, `VitruAgent\lib\screens\agent\agent_screen.dart`
- `VitruAgent\pubspec.yaml` (1.0.5+8 + cloud_functions), `VitruAgent\firebase.json`
- `VitruAgent\.gitignore`, `VitClip\.gitignore`
- VitTeamAgents: `dashboard/index.html`, `core/reports/ecosystem_report.py`, `brand/ICP-PROFILE.md`, `agents-peer-review-message.html`, `_brand-brains-data.json`
- `mintRealtimeToken\index.js` — לוג `minted OK` נוסף בסוף הסשן

## הצעד הבא
1. משתמש לוחץ "נסה שוב" ב-APK v8 → מקריא `הפעלה נכשלה: <error>`.
2. קרא לוג מינט → חפש `minted OK` (tokenPrefix).
3. אם מינט OK + WS `code=1011` → **תיקון billing** בפרויקט של המפתח (כמו 0046). שקול מעבר ל-מפתח F4eg/kdkA או הוספת קרדיטים.
4. אם מינט נכשל → קרא status/bodyPreview חדש בלוג; ייתכן שצריך snake_case (`expire_time`/`new_session_expire_time`) או wrapper `auth_token`.
5. אחרי שהקול עובד — המשתמש מבטל ידנית את מפתח x2zA ב-AI Studio + מוחק את קובץ ההסגר.
