# סיכום סשן — 0019
תאריך: 2026-05-20 21:45
אפליקציה: Vitruvius
נושא: post-rename cleanup + M2 polish + תמחור final

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

### 1. אימות חי post-rename (צעד 1 בתוכנית)
- אומת ב-Revit 2024.3 שה-rename מסשן 0018 לא יצר רגרסיה:
  - לשונית **Vitruvius** במקום VitStudio ✓
  - Security dialog: Name=Vitruvius, path=`Addins\2024\Vitruvius\Vitruvius.Revit2024.dll` ✓
  - Scan Fonts על `A_Mivne roi_elyashivFBDTH.rvt` החזיר תוצאות (3 links, 1 DXF, 2 SHX: ltypeshp+txt) — מתאים ל-baseline של 0018 ב-100%.
- **הערה:** המשתמש פתח קודם מודל שונה (`A_Mivne roi_elyashivFBDTH.rvt` — לוקאלי, לינקים שבורים, 0 DXF parsed), אבל אחרי שטענו מודל עם DXF תקין — תוצאות זהות לסשן 0016.

### 2. Outer folder rename + ניקוי refs (צעדים 2-3)
- המשתמש ביצע ידנית את ה-rename ב-File Explorer: `D:\Vitruvius Ecosystem\VitStudio\` → `Vitruvius\`. אומת.
- **5 href ב-`Sessions/sessions-index.html`** עודכנו: `../VitStudio/` → `../Vitruvius/` (שורות 100, 144, 167-170). שאר המופעים (tag-app, descriptions היסטוריים, שמות קבצי 0011/0013/0015/0016/0018-*) נשארו כי הם רישום עובדתי של המצב באותו זמן.
- **CLAUDE.md** שורות 89 + 92 עודכנו (workspace path + project path).
- **PLAN.md** ב-2 מיקומים — `Vitruvius/PLAN.md` ו-`plans/inherited-nibbling-steele.md` — 26 מופעים כל אחד → 0 (לפי החלטת המשתמש: "החלף הכל"). שורה 1: `# Vitruvius — תכנית פיתוח MVP`. PowerShell replace, UTF-8 -NoNewline.

### 3. M2 Polish Bundle (3-in-1 — צעד 4a+b+c בתוכנית)
שלוש שינויים נארזו לבחירה rebuild+deploy יחידה:

**(a) סינון `ltypeshp.shx` ב-TextStyleDetector**
- ב-`TextStyleDetector.cs` נוסף `NonFontShxBlocklist` (HashSet OrdinalIgnoreCase) המכיל `"ltypeshp.shx"`. הסינון ב-`AddIfShx`: אם הפונט בבלוקליסט → לא נכנס ל-`ShxFontNames`.
- **הסיבה:** `ltypeshp.shx` הוא AutoCAD Linetype shape (צורות גרפיות ללינטייפים), לא פונט טקסט. הוא לא יוצר ג'יבריש עברי. הופעתו בפלט גרמה לרעש למשתמש ולחיפושים חסרי ערך ב-FontRecommender.
- ה-`Styles` collection ממשיך להחזיק entry של style שמצביע אליו (ל-debug). רק `ShxFontNames` מסונן.
- אימות חי: 2 SHX → 1 SHX (`txt.shx` בלבד) ✓.

**(b) filename-only ב-ExpandedContent**
- ב-`ScanFontsCommand.cs`: הוחלף `string srcPath = r.Link.SourcePath ?? "(none)"` ב-`Path.GetFileName(...)` עם null/empty handling. נוסף `using System.IO`.
- אימות: התצוגה הפכה מ-`[D:\...\test naterials\1325-01001 - Standard\1325-01001.dwg]` ל-`[1325-01001.dwg]`.

**(c) Microcopy עברי + סדר ribbon**
- `VitruviusApp.cs`:
  - Panel title: `"RTL Fix"` → `"תיקון RTL"`.
  - Scan button: text=`"סריקת\nפונטים"` (2 שורות), tooltip עברי.
  - About button: text=`"אודות"`, tooltip = `$"{VitruviusInfo.Module} v{VitruviusInfo.Version}"` (נשאר אנגלית בכוונה — VitruviusInfo.Module = "Vitruvius RTL Fix" = brand).
  - **סדר ribbon:** scanButton.AddItem הוזז לפני aboutButton.AddItem. עיקרון: action ראשי קודם.
- `ScanFontsCommand.cs`: כל ה-UI strings בעברית (title="Vitruvius — סריקת פונטים", "קישורים שנסרקו", "DXF נקרא", "DWG בינארי (דחוי)", "לא נמצאו על הדיסק", "פונטי SHX שנמצאו", "(אין)", "אין מסמך פעיל").
- `AboutCommand.cs`: MainContent בעברית ("גרסה", "יצרן", "קשר", "תיקון חכם של עברית / RTL בקישורי DWG ב-Revit.").
- **שמירה בכוונה באנגלית:** `VitruviusInfo.Product` ("Vitruvius") + `Module` ("Vitruvius RTL Fix") — brand identifiers, לא לוקליזציה.
- **החלטה ארכיטקטונית:** Inline strings לעכשיו. extraction ל-`.resx` resources ידחה ל-M-late (כשתוסף ערבית/אנגלית).

**Build + Deploy:**
- ארכוב: `Move-Item` של 4 DLLs/PDBs מ-`Addins\2024\Vitruvius\` ל-`Addins\2024\Vitruvius\OLD\` עם stamp `2026-05-20_HH-mm` (לפי הכלל הגלובלי).
- Build: `MSBuild Vitruvius.slnx -t:Build -p:Configuration=Debug` → ✓ נקי, אפס warnings.
- Copy: 4 קבצים (Core+Revit2024 dll+pdb) הועתקו ל-deploy folder. שאר 3 הטרנזיטיביים (IxMilia.Dxf, CodePages, Unsafe) נשארו (לא שונו).
- אימות חי שלישי במהלך הסשן: ribbon order ✓, "סריקת פונטים" + "אודות" ✓, panel "תיקון RTL" ✓, TaskDialog עברי מלא ✓, 1 SHX (txt.shx) ✓, filename only ✓, About עברי ✓.

### 4. תמחור Final נסגר ב-PLAN (צעד 5 — action f בתוכנית)
סעיף חדש בסוף `Vitruvius/PLAN.md` ו-`plans/inherited-nibbling-steele.md` (גרסה מקוצרת בשני):
- **₪29 Standard / ₪39 Pro** per-seat / חודש per-machine. annual = -20% (₪278/₪374 לשנה).
- **Trial:** 14 יום ללא CC. Activation = `fontmap_applied` ראשון.
- **Licensing:** per-seat per-machine, אין floating ב-V1 (overhead תפעולי).
- **TAM:** ישראלי ~200-280 משרדים (lifestyle, ARR שנה ראשונה ~₪400-600K). MENA (ערבית) דחוי ל-V2 (startup territory).
- **Billing דואלי חובה** (סיבה משפטית ישראלית):
  - Lemon Squeezy = MoR בינלאומי + לקוחות חוץ (VAT אוטומטי, **לא מנפיק חשבונית מס ישראלית**).
  - iCount או Tranzila = ישראלי + חשבונית מס (חובה חוקית B2B — משרד אדריכלות = עוסק מורשה).
  - Routing: geo-detect → ישראלי/אחר. ספק ישראלי ספציפי דחוי ל-M7/M8.
- **Trigger לכניסת תשלום אמיתי** (החלפת stub→true ב-M8): (1) PMF — 3+ משרדים בבטא מבקשים לשלם, (2) חתימה דיגיטלית פעילה, (3) iCount/Tranzila פעיל + Lemon Squeezy store פתוח.

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

### M2 Polish — Inline microcopy ולא resx
- **למה:** extraction ל-resx זה overhead לא מוצדק לפלאגין שעדיין רק עברית. M-late כשתוסף ערבית.
- **סיכון:** אם נוסיף ערבית מהר, נשלם שוב בעבודת migration. נסבל — TAM ערבי דחוי ל-V2 ממילא.

### EV Code Signing — נדחה לחלוטין (החלטת משתמש מפורשת)
- **ההקשר:** ניסיתי להריץ את action e (EV signing kickoff) עם השוואת CAs + שאלות על חברה/type/CA. המשתמש עצר חזק: *"זה בכלל לא לשלב המוקדם שלנו, בא נראה בכלל האם הפלאגין שלנו באמת עובד... אתה קופץ מהר מידי, בכללי זה בסדר לקפוץ ככה אבל לא כשזה מגיע עם השלכות של אלפי שקלים. שכחת שאני מובטל?"*
- **למה זה צודק:**
  - עלות שנה ראשונה אמיתית: ~₪7,800 (חברה בע"מ + agra + רו"ח + cert). למובטל זה השקעה משמעותית.
  - השקעה לפני validation = anti-pattern. אין שום הוכחה שהמוצר מתקן את הג'יבריש בפועל (Scan לא מספיק).
  - PMF קודם, ואז משקיעים. בטא יכולה לרוץ unsigned.
- **Trigger לחזרה לדיון:** PMF ראשוני + 3 משרדים בבטא מבקשים לשלם.
- **תיקון בתוכנית:** M3/M4 (העלאת priority) שנכלל בסשן 0018 — נשאר על הנייר אבל לא ייושם עד שתנאי ה-trigger מתקיימים.

### actions g, d — גם נדחים בעקבות אותה ההיגיון
- **g (domain + landing):** לא משקיעים בזמן שיווק לפני שיש מוצר עובד. נדחה עד M11.
- **d (F2+F3 — install.id אקראי + force-off registry):** F1 Guard כבר סגור (סשן 0015). F2/F3 לא דחוף עד שיש לקוחות אמיתיים שעבורם הטלמטריה רצה בפועל.

### הצעד הבא = M3 (לא יותר polish)
החלטה משותפת: לעבור מ-"מציג" ל-"מתקן". בלי M3 אין מוצר לבדוק. ראיון משרד אחד = blocker אמיתי על M3.

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

### PowerShell variable interpolation דרך Bash
- ניסיתי `bash -c "powershell -Command '...$dst...'"` — bash אכל את ה-`$` והשם של המשתנה ירד ל-נקודה ריקה (`foreach( in ){ =Join-Path... }`).
- **פתרון:** שימוש ב-`PowerShell` tool ישירות במקום `Bash` כשיש PowerShell + שמות משתנים.

### Edit כשל ב-plans/inherited (file modified since read)
- אחרי שכתבתי לקובץ הראשון, ה-hook שינה state גם של השני. Re-read של 15 שורות אחרונות + Edit שוב = עבד.

### ה-USB ל-fixture שונה
- המשתמש פתח קודם `A_Mivne roi_elyashivFBDTH.rvt` (גרסה מקומית שלו, לינקים שבורים ב-`D:\Vitruvius Ecosystem\VitStudio\test naterials\` שכבר לא קיים). הסריקה הראתה 0 DXF / 0 SHX — לא רגרסיה, רק fixture שונה. אחרי טעינה של מודל אמיתי — תוצאות תקינות. **Learning:** באימות באתר לקוח חי לעולם לא להניח שה-fixture זהה ל-baseline; לבדוק תחילה שהמודל באמת מכיל DWG links עם DXF parseable.

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

### CLAUDE.md חורג מ-150 שורות
- כרגע 316 שורות. הסיבה: 4 פרויקטים חיים (Vitruvius + VitSiteTrack + VitVital + VitPMIS). זה לא אנומליה של סשן 0019 — זה מצב מבני של רב-פרויקט. **לא מנסים לקצץ בלחץ זמן.** בסשן עתידי שמתמקד בפרויקט אחד — כדאי לחתוך ידע ישן שלא משמש (למשל VitPMIS Sprint 1-2 learnings).

### חתימה לא-שמורה בין builds
- Revit מתייחס לכל DLL חדש (hash שונה) כ-addin חדש לחלוטין, גם אם ה-`<AddIn>` GUID זהה. "Always Load" חל רק על אותו hash מדויק. **השלכה:** כל deploy בפיתוח דורש לחיצה נוספת על Always Load. זה anti-friction רק כשייכנס EV signing (נדחה).

### שינוי microcopy עברי = שינוי שם כפתור = מפר "Always Load" קודם?
- לא בדקתי באופן רשמי, אבל כי DLL חדש = hash חדש ממילא, זה נטמע באותה דיאלוג חדש. אין באג.

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

### חדש
- `D:\Vitruvius Ecosystem\Vitruvius\Vitruvius-EV-Signing-Explainer.html` — explainer בעברית RTL על EV signing (יוצר עם סקיל RTL). **לא נחוץ עכשיו** (action נדחה), אבל נשמר כ-reference כשנחזור לדיון EV.

### שונה
- `D:\Vitruvius Ecosystem\Vitruvius\src\Vitruvius.Core\Dwg\TextStyleDetector.cs` — `NonFontShxBlocklist` + סינון ב-`AddIfShx`.
- `D:\Vitruvius Ecosystem\Vitruvius\src\Vitruvius.Revit2024\Commands\ScanFontsCommand.cs` — using System.IO, `Path.GetFileName`, microcopy עברי.
- `D:\Vitruvius Ecosystem\Vitruvius\src\Vitruvius.Revit2024\Commands\AboutCommand.cs` — MainContent עברי.
- `D:\Vitruvius Ecosystem\Vitruvius\src\Vitruvius.Revit2024\VitruviusApp.cs` — panel "תיקון RTL", סדר scanButton→aboutButton, microcopy עברי.
- `D:\Vitruvius Ecosystem\Vitruvius\PLAN.md` — סעיף "תמחור (Final — סשן 0019)" בסוף.
- `C:\Users\elyas\.claude\plans\inherited-nibbling-steele.md` — אותו סעיף תמחור (גרסה מקוצרת) + replace רחב של VitStudio→Vitruvius.
- `D:\Vitruvius Ecosystem\CLAUDE.md` — שורות 89, 92 (paths), 99-101 (status: M2 polish ✓, תמחור ✓, EV נדחה).
- `D:\Vitruvius Ecosystem\Sessions\sessions-index.html` — 5 href של `../VitStudio/` → `../Vitruvius/`.

### Deploy artifacts (live)
- `C:\ProgramData\Autodesk\Revit\Addins\2024\Vitruvius\Vitruvius.Core.dll` — 16KB, 2026-05-20 21:10
- `C:\ProgramData\Autodesk\Revit\Addins\2024\Vitruvius\Vitruvius.Revit2024.dll` — 11KB, 2026-05-20 21:10
- `Vitruvius.Core.pdb`, `Vitruvius.Revit2024.pdb` — sources
- `C:\ProgramData\Autodesk\Revit\Addins\2024\Vitruvius\OLD\*-2026-05-20_HH-mm.{dll,pdb}` — 4 קבצים ישנים (גרסה ראשונה של 0018).

## הצעד הבא — מפורט

### M3 — FontRecommender + ה-fix האמיתי

**מטרה:** הפיכת הפלאגין מ-"מציג" ל-"מתקן". בלי M3 אין מוצר.

**1. `src\Vitruvius.Core\Fonts\FontRecommender.cs`** (Core, netstandard2.0)
   - API:
     ```csharp
     public sealed class FontRecommendation {
         public string ShxFont { get; }
         public string RecommendedTtf { get; }
         public double Confidence { get; }  // 0..1
         public string? Reason { get; }
     }
     public FontRecommendation? Recommend(string shxFontName, RecommendationContext ctx);
     ```
   - **Built-in mapping table** (V1, hard-coded — בעברית טיפוסית):
     - `txt.shx` → `David CLM.ttf` (או `Arial Hebrew Regular`). confidence=0.85.
     - `simplex.shx` → `Arial Hebrew Regular`. confidence=0.80.
     - `romans.shx` → `Times New Roman`. confidence=0.75.
     - `complex.shx` → `David CLM Bold`. confidence=0.70.
     - `italic.shx` → `Arial Hebrew Italic`. confidence=0.65.
   - V2: enrichment מ-acceptance rate (acceptance/applied per mapping) — דורש טלמטריה אמיתית, נדחה.

**2. `src\Vitruvius.Core\Fonts\ShxFontMapWriter.cs`**
   - קורא+כותב `%APPDATA%\Autodesk\Revit\<ver>\shxfontmap.txt`. פורמט: `txt.shx;Arial Hebrew\n` (key-value, semicolon).
   - **API:**
     ```csharp
     public IReadOnlyList<FontMapEntry> Read(string version);
     public void Backup(string version);  // copies to shxfontmap.txt.vitruvius-bak.YYYY-MM-DD_HH-mm
     public void Apply(string version, IEnumerable<FontMapEntry> mergedEntries);
     ```
   - **חייב לעשות backup** לפני כל write. אסור לדרוס entries שלא יצרנו אנחנו.
   - **Telemetry:** event `fontmap_applied` (count עברית, count נכתב, נקודות-לא-נתיב לפי F1 Guard).

**3. `src\Vitruvius.Revit2024\Commands\ApplyFontMapCommand.cs`**
   - כפתור חדש: "החל תיקון". סדר ribbon: Scan → **Apply** → About.
   - Flow:
     1. scan (same as ScanFontsCommand).
     2. Recommender.Recommend על כל SHX.
     3. **Preview TaskDialog** עם טבלה: SHX → TTF (recommended) → checkbox per row. allow override.
     4. confirm → ShxFontMapWriter.Apply.
     5. TaskDialog: "החל ✓. סגור את ה-DWG link ופתח מחדש כדי לראות את התיקון בפועל (Revit לא מרענן fontmap בזמן אמת)."
   - אופציה עתידית: `ReloadDwgLinksCommand` אוטומטי.

**4. אימות חי על `A_Mivne roi.rvt`** (cloud) או fixture עברי כלשהו:
   - Pre: ראייה ויזואלית של ג'יבריש (`crzk eubxyruemhv`).
   - Apply.
   - Reload DWG link דרך Revit (Manage Links → Reload).
   - Post: ראייה ויזואלית של עברית קריאה ("מבנה דייטש אדריכלים" וכו').
   - **אם לא עובד:** ל-debug:
     - האם `shxfontmap.txt` באמת נכתב? (פתח ידנית).
     - האם `txt.shx` הוא הפונט שבאמת בשימוש בלינק הזה? (ייתכן שזה `simplex.shx` או אחר שלא ראינו).
     - האם הפונט הנבחר (David CLM / Arial Hebrew) מותקן? (אם לא — נדרש fallback).
     - האם Revit באמת קורא את fontmap.txt בעת reload? (Microsoft Process Monitor יכול לאשר).

**5. בנייה הבאה: ארכוב 4 DLLs ב-`Addins\2024\Vitruvius\OLD\` עם timestamp לפני deploy.**

### בלוקרים פוטנציאליים ל-M3
- **fixture חי לאימות:** אם `A_Mivne roi.rvt` לא זמין מהענן, ניצור fixture סינטטי: AutoCAD → DXF עם Hebrew text + Style ש-PrimaryFont = txt.shx → Insert ל-Revit project ריק.
- **בחירת TTF מקומית:** ה-recommender צריך לבדוק אם הפונט המומלץ מותקן ב-`C:\Windows\Fonts\`. אם לא — fallback ל-David / Arial.
- **גרסת Revit:** כרגע hard-coded ל-2024 (`%APPDATA%\Autodesk\Revit\Autodesk Revit 2024\`). multi-version = M-late.
