Skip to content

Synchronize programming language field name across project - #17

Merged
amirbiron merged 1 commit into
mainfrom
cursor/synchronize-programming-language-field-name-across-project-9acb
Aug 6, 2025
Merged

amirbiron merged 1 commit into
mainfrom
cursor/synchronize-programming-language-field-name-across-project-9acb

Conversation

@amirbiron

Copy link
Copy Markdown
Owner

Rename language field to programming_language across the project to resolve a MongoDB reserved keyword conflict.


Open in Cursor Open in Web

… files

Co-authored-by: amirbiron <amirbiron@gmail.com>
@cursor

cursor Bot commented Aug 6, 2025

Copy link
Copy Markdown
Contributor

Cursor Agent can help with this pull request. Just @cursor in comments and I'll start working on changes in this branch.
Learn more about Cursor Agents

@amirbiron
amirbiron marked this pull request as ready for review August 6, 2025 06:35
@amirbiron
amirbiron merged commit edf4e49 into main Aug 6, 2025
@amirbiron
amirbiron deleted the cursor/synchronize-programming-language-field-name-across-project-9acb branch August 6, 2025 06:36
amirbiron pushed a commit that referenced this pull request Sep 8, 2026
השלמת החצי החסר של סגירת הלולאה. הדפוסים תועדו ב-amir-bug-patterns
(PR #17 שם) וקיבלו שורות טריגר ב-INTEGRATION.md, אבל לא כאן — וזה
בדיוק המקום שנקרא בזמן המימוש. ה-README של אותו ריפו אומר את זה
מפורשות: דפוס בלי טריגר הוא דפוס שלא ייקרא, ושני הצעדים הם צעד אחד.

הנוסח זהה מילה במילה לזה שב-INTEGRATION.md, כפי שנדרש שם — עדכון לאחד
מחייב עדכון לשני.

שני הדפוסים עלו מהעבודה על #3357 ועל ה-PR הזה עצמו:
- K15, שומר שמתפרסם לפני הערך שהוא שומר עליו: webapp/app.py:get_db
  בדק client והחזיר db. תקלת רשת חולפת אחת שיתקה את התהליך עד ריסטארט.
- silent-fallback-to-worse-path: נפילה-לאחור על חריגה שהייתה מחזירה
  את באג 191 השניות בשקט. נתפסה בריוויו לפני שנכתבה.

הערת סדר מיזוג: השורות מפנות לשני קבצים שקיימים כרגע רק ב-PR #17
של amir-bug-patterns. ההפניה תתיישב ברגע שהוא ימוזג.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgnHZBJaH4VhdFFgwYZKLr
amirbiron added a commit that referenced this pull request Sep 8, 2026
…3361)

* perf(search): שליפה מקובצת של הקבצים המתאימים במקום קובץ-קובץ

חיפוש "טקסט" של שם קובץ מלא לקח 191.74 שניות. _text_search
ו-_function_search החזיקו בלוק זהה מילה במילה ששלף כל קובץ מתאים
בשאילתה נפרדת, וכל שליפה כזו היא שלוש קפיצות רשת: GET ל-Redis
(@cached עם TTL של 180 שניות), find_one בלי היטלה — כלומר כל ה-code —
ואז SETEX. נמדד: 745 קבצים פעילים, 19.6MB. 191.7 חלקי 742 ≈ 258ms
לקובץ. ו-limit מוחל רק בסוף, אחרי הסינון והמיון, ולכן הוובאפ ביקש
עשר תוצאות והמערכת משכה 745 מסמכים.

Repository.get_latest_versions_by_names מחליף את זה בשליפה אחת למנה,
בדיוק בצורת האגרגציה של get_user_files פלוס $in.

נמדד מול הקלאסטר (executionStats), על הצינור כפי שהקוד באמת בונה אותו:

  3 שמות              DISTINCT_SCAN, 6 מפתחות, 3 מסמכים, 0ms
  כל הקורפוס + code   DISTINCT_SCAN, 745 מפתחות, 745 מסמכים, 14ms
  100 / 250 שמות      אותה תוכנית, maxScansToExplodeReached: false

מונגו מקפלת את $sort + $group $first ל-$groupByDistinctScan על
idx_snippets_latest_version הקיים — בלי מיון חוסם, ובדיוק מסמך אחד
לכל שם. אין צורך באינדקס חדש.

chunk_size=250 הוא בקרת סיבובי רשת ולא בקרת תוכנית: התוכנית נשארת
DISTINCT_SCAN גם ב-250, ו-745 שמות הם ~37KB מול תקרת BSON של 16MB.
מכיוון שהעלות הדומיננטית היא הסיבוב עצמו, מנה גדולה עדיפה. הכותרת
היא "3 סיבובים במקום 742", לא "14 מילישניות" — את ה-RTT מפרודקשן
אי אפשר למדוד מכאן.

נפילה-לאחור רק על היעדר המתודה, לעולם לא על חריגה. חמישה קובצי בדיקה
מריצים את המסלולים האלה עם דמויות שחושפות get_latest_version בלבד, וזה
מצב סטטי וידוע. חריגה אינה: נפילה-לאחור עליה הייתה הופכת כל תקלת מונגו
חולפת ל-745 שליפות סדרתיות — מחזירה את הבאג ומחזיקה worker תפוס שלוש
דקות. search העוטפת כבר רושמת, פולטת search_error ומחזירה רשימה ריקה,
ובוובאפ _safe_search נופל משם ל-$text של מונגו.

ההיטלה היא בדיוק שמונת השדות ש-_create_search_result קורא. code נכלל
במכוון בניגוד לכלל ה-Smart Projection: _apply_filters נשען על
result.content לשלושה מסננים ו-_sort_results על אורכו, ובלעדיו הם היו
מסננים על מחרוזת ריקה. snippetEmbedding (~3KB למסמך) כן יורד.

שינוי התנהגות שכדאי לזכור: המסלול המקובץ אינו מקושש, ולכן תוצאה שהייתה
חוזרת מקאש בן שלוש דקות תגיע מעכשיו טרייה. שיפור בנכונות, לא רגרסיה.

16 בדיקות חדשות, כולן הורצו על העץ הלא-מתוקן קודם: 7 נפלו ואחת עברה
(זו של תאימות לדמויות הישנות, שהיא נעילת היקף). ארבע מוטציות מוכיחות
שהן מסוגלות ליפול — היפוך סדר $sort/$group, שינוי גודל המנה, נפילה-לאחור
על חריגה, והסרת code מההיטלה. בנוסף אומתה נכונות מול מונגו 8.0.4 אמיתי:
הגרסה האחרונה חוזרת, קובץ בסל ומשתמש אחר אינם, ו-snippetEmbedding אינו
נמשך.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgnHZBJaH4VhdFFgwYZKLr

* fix(db): חוזה ההיטלה של השליפה המקובצת — שלושת ממצאי הריוויו

שלושת הממצאים הם פנים אחד: חוזה ההיטלה של get_latest_versions_by_names
נכתב רופף יותר מזה של get_user_files, שלוש פונקציות משם באותו קובץ.
אף אחד מהם אינו באג בפרודקשן היום — יש קורא ייצור יחיד, והוא מעביר
היטלה שכוללת file_name.

1. file_name לא נכפה על היטלת include. המתודה בונה את התשובה לפי
   doc.get("file_name"), ולכן קורא שיבקש {"_id":1,"code":1} היה מקבל
   מיפוי ריק — בלי חריגה ובלי לוג. חיפוש שנשבר נראה בדיוק כמו חיפוש
   בלי תוצאות.

2. בלי היטלה כלל לא נוסף שלב $project, ולכן ברירת המחדל הייתה מסמכים
   מלאים כולל code ו-snippetEmbedding. זו מתודה ציבורית שנועדה לשלוף
   מאות מסמכים, וזו בדיוק ההפך מכלל ה-Smart Projection.

3. אין טסט שמאמת שהמנוע מעביר את SEARCH_RESULT_PROJECTION בפועל. הדמה
   הקליטה רק שמות קבצים. מחיקת הארגומנט הייתה משאירה את כל הקובץ ירוק
   ומחזירה שליפת מסמכים מלאים בפרודקשן — כלומר מבטלת בשקט חלק מרכזי
   מהתיקון הקודם. זה החמור מבין השלושה, כי הוא חור בשכבה שאמורה להגן.

התיקון אינו עותק שלישי של אותו בלוק: ההיגיון חולץ מ-get_user_files
ל-_latest_version_projection_stage, ושתי המתודות משתמשות בו. היום הוא
כתוב פעם אחת ומשמש את שתיהן.

get_user_files יוצאת מזה בלי שינוי התנהגות — הושוו חמשת מצבי ההיטלה
לפני ואחרי, וצורת ה-$project זהה. יש לכך גם טסט קבוע, כי היא במסלול
החם של כל מסכי הרשימות וריפקטור שם צריך רשת.

הדוקסטרינג אומר עכשיו מה נמדד: explain עם 250 שמות (לא 200), התוכנית
נשארה DISTINCT_SCAN ו-maxScansToExplodeReached נשאר false. הסף שמגביל
פיצוק $in אינו הכובל כאן כי DISTINCT_SCAN מטפלת בגבולות ישירות.

תשע בדיקות חדשות. שלוש נפלו על העץ שלפני התיקון. ארבע מוטציות נתפסו:
הסרת כפיית file_name, הסרת מיזוג השדות הכבדים, ברירת מחדל שחוזרת
למסמך מלא, ומחיקת הארגומנט projection מקריאת המנוע. אומת מול הקלאסטר
שהצינור לא זז: DISTINCT_SCAN, 6 מפתחות, 3 מסמכים, 0ms — כמו קודם.
סריקה של 150 קובצי בדיקה: אפס נפילות.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgnHZBJaH4VhdFFgwYZKLr

* docs(claude): שורות טריגר לשני הדפוסים החדשים

השלמת החצי החסר של סגירת הלולאה. הדפוסים תועדו ב-amir-bug-patterns
(PR #17 שם) וקיבלו שורות טריגר ב-INTEGRATION.md, אבל לא כאן — וזה
בדיוק המקום שנקרא בזמן המימוש. ה-README של אותו ריפו אומר את זה
מפורשות: דפוס בלי טריגר הוא דפוס שלא ייקרא, ושני הצעדים הם צעד אחד.

הנוסח זהה מילה במילה לזה שב-INTEGRATION.md, כפי שנדרש שם — עדכון לאחד
מחייב עדכון לשני.

שני הדפוסים עלו מהעבודה על #3357 ועל ה-PR הזה עצמו:
- K15, שומר שמתפרסם לפני הערך שהוא שומר עליו: webapp/app.py:get_db
  בדק client והחזיר db. תקלת רשת חולפת אחת שיתקה את התהליך עד ריסטארט.
- silent-fallback-to-worse-path: נפילה-לאחור על חריגה שהייתה מחזירה
  את באג 191 השניות בשקט. נתפסה בריוויו לפני שנכתבה.

הערת סדר מיזוג: השורות מפנות לשני קבצים שקיימים כרגע רק ב-PR #17
של amir-bug-patterns. ההפניה תתיישב ברגע שהוא ימוזג.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgnHZBJaH4VhdFFgwYZKLr

* docs(claude): הידוק שורת הטריגר של silent-fallback

ממצא ריוויו: הניסוח החריג ערכי ברירת מחדל אך לא זיהוי יכולת סטטי —
שהכלל עצמו מכריז עליו כלגיטימי. נוסף "בגלל כשל" ו"לא זיהוי יכולת
סטטי".

הרוחב של טריגר הוא תכונה ולא באג — תפקידו לומר "לך תקרא", וטריגר צר
מדי פירושו שהכלל לא ייקרא כלל. לכן ההידוק מדייק את רגע התפיסה בלי
לצמצם אותו.

הנוסח זהה מילה במילה ל-INTEGRATION.md שב-amir-bug-patterns, שעודכן
באותו סבב. נבדק ב-diff ולא בעין.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgnHZBJaH4VhdFFgwYZKLr

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants