Cosmic Story v2 ארכיטקטורה — צלילה עמוקה.

למהנדסים, מנהלי מוצר, עיתונאים וסוכני שותפויות. הצינור המלא, ארבעה אוספי MongoDB, אירועי EDA, קפדנות מודל‑V, יעדי ביצועים, אבטחה ונגישות — הכל בעמוד אחד.

  • Soulwise-story הוא מודול NestJS חדש לצד מודול cosmic-story הקיים. אין ייבוא ישיר בין מודולי הפיצ'ר.
  • ארבעה אוספי MongoDB: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances. גופים מוצפנים ב‑AES-256, ממופים לשאילתות שכל אחד משרת.
  • יצירה אסינכרונית דרך תור BullMQ עם טיימאוט של 28 שניות. אירועים נשלחים דרך EventEmitter2 רק לאחר commit של מסד הנתונים — ללא פריטים פנטומיים בתיבת הדואר.
  • מפרט V‑Model: דרישות 119, ללא פערים. יעד כיסוי בגיבוי 85% על שירותים; בחזית 90% על מאגרי Pinia.

הצינור, שוב, עם פרטי הנדסה

לכל שלב יש שירות, חוזה, ואירוע.

  1. טריגר

    פעולת משתמש — 'צור את פרק היום עבור אחות' — או משימת cron מתוזמנת, כמו סיכום יום ראשון 9 בבוקר, או רענון מזג האוויר כל 6 שעות.

  2. תור

    העבודה נכנסת לתור BullMQ בשם soulwise-chapter-generation, עם מגבלת זמן של 28 שניות. עבודות ארוכות נקטעות ומדווחות כ'נסה שוב' למשתמש.

  3. הרכבה

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

  4. צור

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

  5. עיבוד לאחרי

    ארבעה דברים קורים: מסווג משבר בודק שפה של משבר; מחלץ שבב‑אספקטים מוציא שבב אסטרולוגי אחד עד שלושה; מסנן טענות מסיר ניסוחים אסורים; הגוף מוצפן ב‑AES-256 עם מפתח מנוהל על ידי הפלטפורמה.

  6. שמור

    הפריט נכתב לאוסף MongoDB המתאים — פרקים, רשומות יומן, תהודות — עם אינדקסים של userId ו‑personId לחיפוש מהיר. תחילה מחיקה רכה; מחיקה קבועה של PII לאחר 30 ימים.

  7. הודע

    אירוע EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — מתרחש לאחר הקומיט בבסיס הנתונים. מודול ההודעות קולט אותו, יוצר פריט בתיבת הדואר, ובחירה לשלוח פוש (מוגבל לאחד ליום, שעות שקט מכובדות).

  8. הצג

    החזית מושכת את הפריט דרך קריאת API מאומתת. ה‑Hub מציג מחדש עם התוכן החדש. אם המשתמש היה לא מקוון, המטמון מציג את תצוגת אתמול והפריט החדש מופיע עם החיבור מחדש.

שבעה שלבים מהטריגר עד למשטח, כל אחד נקרא על פי הפעולה שהוא מבצע.

ארבעת האוספים

מאונדקס לשאילתות שכל אחד מהם משיב עליהן.

soulwise_persons

רשומות אלבום. אינדקסים על userId, status, deletedAt. תחילה מחיקה רכה; מחיקה קשה של מידע אישי לאחר 30 ימים.

soulwise_chapters

פרקים שנכתבו על‑ידי AI, גוף מוצפן. אינדקסים על personId, userId, generatedAt. שבבי היבט נשמרים במערך נפרד לסינון מהיר.

soulwise_journal_entries

הרהורים שנכתבו על‑ידי משתמש, גוף מוצפן. אינדקסים על userId, personId, createdAt. גוף מאונדקס בטקסט לחיפוש. לכל רשומה דגל 'פרטי — אל תזין ל‑Luminara'.

soulwise_resonances

ציון בארבעה ממדים לכל קשר. אינדקס ייחודי על personId. מחושב מחדש באמצעות קריאת שירות לאחר כתיבת פרק או יומן.

אירועי EDA

כלל קפדני: אירועים מתרחשים רק לאחר commit של מסד הנתונים. תלותים בין מודולים נעשים דרך אסימוני הזרקת Symbol, לעולם לא דרך forwardRef. אין ייבוא ישיר של שירות לשירות בין מודולי תכונה.

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — מתרחש לאחר שהפרק מוצפן ונשמר. Notifications-v2 מקשיב; יוצר פריט בתיבת הדואר; במידת הצורך שולח push.
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — מתרחש לאחר שהערך ביומן מוצפן ונשמר. שירות Resonance מקשיב; מפעיל חישוב מחדש.
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — מתרחש לאחר שינוי נתוני הלידה של אדם. מטמון סינאstry מתבטל.
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — לפי החוזה של notifications-v2; מכבד את תקציב ה‑push ושעות השקט.

קפדנות במפרט מודל V

119 דרישות ניתנות למעקב, ללא פערים. כל דרישה ממופה קדימה למקרה מבחן (UTP, ITP, STP, E2E) ואחורה לסיפור משתמש. 20 סיפורי משתמש. 15 דרישות פונקציונליות. 12 קטגוריות לא‑פונקציונליות. 8 שערי קבלה גלובליים.

חוזה ביצועים

יצירת פרק 30 שניות או פחות עבור 95% מהבקשות, נמדד מול התפלגות משך משימות BullMQ. השהיית GET של API p99 500 ms או פחות ב1,000 משתמשים מקבילים, נמדד באמצעות מבחן עומס k6. זמן TTI של החזית 3 שניות או פחות בתרחיש מדומה של 4G, נמדד דרך Lighthouse CI.

חוזה אבטחה

הצפנה AES-256 במנוחה עם מפתחות מנוהלים על ידי הפלטפורמה עבור גופי היומן והפרק. TLS 1.2+ במעבר; הפנייה מ‑HTTP ל‑HTTPS. אסימוני JWT עם זמן חיים של 1 שעות, אסימוני רענון עם זמן חיים של 30 ימים, סיבוב בעת רענון. מחיקה רכה עם חלון של 30 ימים לפני מחיקה קבועה של מידע אישי.

חוזה נגישות

העדפה של reduced‑motion מכובדת גלובלית — אנימציות GSAP הופכות לדהיות של שקיפות בלבד. תוויות VoiceOver ו‑TalkBack על כל אלמנט אינטראקטיבי. נבדק ידנית ב‑iOS וב‑Android לפני כל שחרור.

למה מודול נפרד של soulwise‑story במקום להרחיב את cosmic‑story?

כי המפרט העליון בונה מחדש את הפונקציה, ובנייה בתוך מודול קיים הייתה שוברת את חוויית v1 או יוצרת פיצול‑לאחר‑מיזוג. מודול חדש משאיר את v1 ללא שינוי, מאפשר ל‑v2 להתבצע, ומעביר בצורה נקייה כשמוכן.

למה MongoDB ולא Postgres?

ה‑backend הקיים של My Zodiac AI רץ על MongoDB; שינוי היה משמעות החלטת תשתית שאינה קשורה לתכונה זו. מודל המסמכים מתאים גם לפרקים וגם לרשומות יומן — מקונן, באורך משתנה, מוצפן כ‑blob.

למה נבחר BullMQ לתור?

BullMQ פועל על Redis, שכבר נמצא בערימה עבור ניהול סשנים והגבלת קצב. אין צורך בתשתית חדשה. ניסיון חוזר מובנה, timeout ותצפית מכסים את צרכי יצירת הפרקים ללא צורך בצינור מותאם.

היכן המפרט העליון מתועד בפועל?

במאגר הפנימי. המספרים והחוזים בעמוד זה מפרשים את artefacts של מודל‑V העליון. פוסטים בבלוג ההנדסה הציבורי של My Zodiac AI (מתוייגים ב‑'cosmic‑story‑v2') מתעמקים בחלקים ספציפיים של הבנייה.

נסה את My Zodiac AI היום

בזמן ש‑Soulwise פותחת את הגלים שלה, אפליקציית המזלות הדגלית שלנו כבר ב‑ידיך.

תוכן אסטרולוגיה הוא לשיקוף ובידור. Cosmic Story v2 תכונות המתוארות כאן נמצאות בפיתוח; זמינותן עשויה להשתנות ללא הודעה מראש.