# סיכום סשן — 0015
תאריך: 2026-05-20 06:53
אפליקציה: VitStudio
נושא: M2 שלב 1 — DwgLinkScanner + תשתית דאטה + סקירת סקיוריטי

## מה נבנה/הושלם
- **DwgLinkScanner — פיצול נקי**, build נקי אפס אזהרות:
  - Core (`netstandard2.0`, ללא RevitAPI): `Dwg\DwgLink.cs` (DTO), `Dwg\IDwgLinkProvider.cs` (interface), `Dwg\DwgLinkScanner.cs` (resolve+סיווג DWG/DXF לפי header).
  - Revit2024 (net48): `Dwg\RevitDwgLinkProvider.cs` (`FilteredElementCollector` על `ImportInstance` + `CADLinkType.GetExternalFileReference()` לחילוץ נתיב).
- **Telemetry seam** ב-Core: `Telemetry\ITelemetry.cs` + `Telemetry\NoOpTelemetry.cs`. אפס תלות, אפס שליחה — ברירת מחדל בטוחה עד שיהיו consent + impl.
- **IxMilia.Dxf 0.8.4** נוסף כ-PackageReference ל-`VitStudio.Core.csproj`.
- **PLAN.md עודכן** (+ עותק `inherited-nibbling-steele.md` מסונכרן):
  - עץ הארכיטקטורה כעת מציג Dwg\ מפוצל + תיקיית Telemetry\ + RevitDwgLinkProvider.cs בשכבת Revit2024.
  - שורת M2 בטבלת ה-Milestones מתארת את הפיצול + ה-seam.
  - "החלטות שאושרו" — שתי החלטות חדשות (פיצול נקי 2026-05-19, תשתית דאטה מ-M2).
  - **סעיף חדש "תשתית דאטה"**: Stack (Aptabase HTTP דק, fallback PostHog), seam, פרטיות, Event Taxonomy מלא ל-M2, North Star + KPIs, חיבור שתי הלולאות.
  - **סעיף חדש "אבטחה ופרטיות"** (סוכן סקיוריטי 2026-05-19): 3 ממצאים (F1 Guard מבני · F2 install-id אקראי · F3 force-off), 5 פעולות M2 מדורגות, 3 פריטים נדחים עם trigger.
  - שורה נוספת בטבלת סיכונים: דליפת PII דרך טלמטריה — לא-backfillable.
- **4 תרשימים חדשים** בתיקיית VitStudio (Vitruvius Design Language, RTL):
  - **VIT-005** `VitStudio-Architecture-diagram.html` — 4 zones: Revit Host → Revit2024 (adapter) → Core (Revit-agnostic) → Disk/Cloud
  - **VIT-006** `VitStudio-Roadmap-diagram.html` — 11 Milestones ב-3 שלבים (בסיס/מוצר/השקה)
  - **VIT-007** `VitStudio-Security-diagram.html` — משטח/Guard/בלוקים/נדחה
  - **VIT-008** `VitStudio-Data-Security-diagram.html` — Events → שכבת הגנה → לולאת מוצר + לולאת מוניטיזציה
- **מחקר עומק** ע"י general-purpose subagent על דאטה-אנליסט/טלמטריה לפלאגין .NET שולחני — מסקנותיו מוטמעות ב-PLAN.

## החלטות שהתקבלו
1. **DwgLinkScanner = פיצול נקי (אופציה 1).** Core נשאר Revit-agnostic. הסיבה: ארכיטקטורה רב-גרסתית 2024/2025/2026 — הוספת RevitAPI ל-Core תשבור אותה. ה-Adapter (Revit2024) מחזיק את כל הגעת ה-Revit API.
2. **תשתית דאטה מוטמעת מ-M2** ולא נדחית. Stack: **לקוח HTTP דק בפרוטוקול Aptabase** (`POST /api/v0/events`) — לא ה-SDK הרשמי (MAUI-only, לא ייטען ב-Revit/.NET 4.8). URL מוזרק מ-config → swap עתידי ל-self-host או Firebase Function בשורה אחת. Fallback ל-PostHog EU אם הדשבורדים יהיו צרים.
3. **North Star = תיקוני DWG עברי מוצלחים למשרד פעיל לחודש.** מחבר את שתי הלולאות (מוצר↔מוניטיזציה) דרך `mapping_overridden` → `FontRecommender` גדל → acceptance rate ↑ → N★ ↑ → retention/conversion.
4. **פרטיות:** opt-out אנונימי, `install.id` GUID אקראי טהור (לא נגזר מ-PII מכונה), enterprise force-off דרך `Telemetry=Off` ב-config/registry. שמות פונטי SHX מותרים בטלמטריה כי גנריים+חיוניים; נתיבים/שמות פרויקטים/תוכן — לעולם לא.
5. **F1 (Guard מבני) ייסגר בשלב הבא ב-M2** — לאכוף מבנית שגם מפתח עתידי לא יוכל להעביר `link.SourcePath` ל-`Track()`. הסיבה: לא-backfillable (הנתונים שיישלחו לספק חיצוני לא ניתנים לתיקון רטרואקטיבי). הסיכון הזה נכנס לטבלת הסיכונים ב-PLAN.

## בעיות שנפתרו
- **`ExternalFileReference.IsValidExternalFileReference()`** — חתימה ב-Revit 2024 API היא `static IsValidExternalFileReference(ExternalFileReference)`, לא instance method. הסרנו את הקריאה ונשענים על null-check + `try/catch` סביב `GetExternalFileReference()` (שזורק `InvalidOperationException` עבור imports לא-מקושרים). בנייה עברה נקי.
- **Nullable warnings ב-Revit2024 (Nullable לא enabled בפרויקט):** הוספנו `#nullable enable` בראש `RevitDwgLinkProvider.cs` כדי לבודד את ה-annotation לקובץ הזה בלבד — לא לזהם את שאר הפרויקט.
- **CS0618 (`ElementId.IntegerValue` deprecated ב-Revit 2024):** עברנו ל-`Id.Value` (long) — `.Value` נוסף ב-Revit 2024.0, זמין ב-2024.3 של המשתמש.

## מה לא עבד / צריך להיזהר
- **אל תפנה ל-`IsValidExternalFileReference()` כ-instance method** — זה לא קומפיל. תמיד `null`-check + `try/catch` סביב `GetExternalFileReference()`.
- **אל תוסיף RevitAPI reference ל-VitStudio.Core** — שובר את החזון הרב-גרסתי. נכון להוסיף DTO+interface ב-Core ולממש בשכבת ה-Adapter (כפי שעשינו ל-`IDwgLinkProvider`).
- **אל תשלח `DwgLink.SourcePath` או `DwgLink.Name` ב-`Track()` ישירות** — אלה נתיב קובץ + שם פרויקט (PII). הוסף Guard לפני שמופיע call-site ראשון.
- **`CopyLocalLockFileAssemblies=false` ב-Revit2024.csproj** — אומר ש-NuGet dependencies של Core (כולל `IxMilia.Dxf.dll`) **לא** מועתקים אוטומטית ל-`bin\Debug` של Revit2024. לפני deploy עתידי של פקודת סריקה אמיתית — לוודא ש-`IxMilia.Dxf.dll` נפרס ידנית ל-`Addins\2024\VitStudio\`.
- **תרשימים — בנמוך:** אל תפעיל `--no-edit` ל-vit-diagram ואל תפיל את ה-seam של הטלמטריה לתוך הסקנר — שתיהן יחידות נפרדות מתועדות ב-PLAN.
- **המספור הבא של תרשימים = VIT-009** (VIT-001..008 קיימים).

## קבצים שנוצרו/שונו
**קוד שנוצר:**
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\Dwg\DwgLink.cs` — DTO + `DwgLinkKind` enum
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\Dwg\IDwgLinkProvider.cs` — interface
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\Dwg\DwgLinkScanner.cs` — scanner + `DwgScanResult` + `DwgFileFormat` + header sniff
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\Telemetry\ITelemetry.cs` — seam interface
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\Telemetry\NoOpTelemetry.cs` — singleton default
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Revit2024\Dwg\RevitDwgLinkProvider.cs` — Revit-side provider

**קוד שעודכן:**
- `D:\Vitruvius Ecosystem\VitStudio\src\VitStudio.Core\VitStudio.Core.csproj` — `<PackageReference Include="IxMilia.Dxf" Version="0.8.4" />`

**תכנון:**
- `D:\Vitruvius Ecosystem\VitStudio\PLAN.md` — עץ ארכיטקטורה · שורת M2 · החלטות חדשות · סעיף "תשתית דאטה" · סעיף "אבטחה ופרטיות" · שורת סיכון חדשה
- `C:\Users\elyas\.claude\plans\inherited-nibbling-steele.md` — עותק מסונכרן

**תרשימים:**
- `D:\Vitruvius Ecosystem\VitStudio\VitStudio-Architecture-diagram.html` (VIT-005)
- `D:\Vitruvius Ecosystem\VitStudio\VitStudio-Roadmap-diagram.html` (VIT-006)
- `D:\Vitruvius Ecosystem\VitStudio\VitStudio-Security-diagram.html` (VIT-007)
- `D:\Vitruvius Ecosystem\VitStudio\VitStudio-Data-Security-diagram.html` (VIT-008)

**זיכרון:**
- `C:\Users\elyas\.claude\projects\D--Vitruvius-Ecosystem-VitStudio\memory\MEMORY.md` — אינדקס
- `C:\Users\elyas\.claude\projects\D--Vitruvius-Ecosystem-VitStudio\memory\feedback_research-before-build.md` — דפוס עבודה של המשתמש: מחקר עומק (לרוב subagent) על דאגות חוצות-שכבה לפני התחלת מילסטון

## הצעד הבא
**M2 שלב 2 — TextStyleDetector + Guard F1 + פקודת אימות:**
1. **Guard F1** (ראשון — סוגר את הוקטור לפני שנפתח): מימוש `Track()` עם allowlist keys (ה-Event Taxonomy ב-PLAN), value enum/num/bool/short-token בלבד, regex חוסם נתיבים `[A-Za-z]:\\|/` → drop + `Debug.Assert`. הופך את "לעולם לא נתיבים" מהערה לחוק נאכף.
2. **TextStyleDetector**: `src\VitStudio.Core\Dwg\TextStyleDetector.cs` — מקבל `DwgScanResult`, משתמש ב-`IxMilia.Dxf` (כש-Format=Dxf) לחילוץ Text Style table + שמות פונטי SHX. DWG בינארי = stub שמחזיר null (Phase 2 אם יוכח שצריך).
3. **`ScanFontsCommand`** ב-Revit2024 (`Commands\ScanFontsCommand.cs`) — מרכיב `RevitDwgLinkProvider` + `DwgLinkScanner` + `TextStyleDetector` ומציג ב-TaskDialog רשימת SHX זוהים. כפתור על panel "RTL Fix". אימות מול `A_Mivne roi.rvt`.
4. לפני deploy — לארכב DLL ישן ל-`C:\ProgramData\Autodesk\Revit\Addins\2024\VitStudio\OLD\` עם timestamp + לוודא ש-`IxMilia.Dxf.dll` מועתק לתת-תיקייה.
