Cosmic Story v2 ճարտարապետություն — խորը վերլուծություն:

Ինժեներների, արտադրանքի մենեջերների, լրագրողների և գործընկերության հետազոտողների համար: Ամբողջ ընթացքը, չորս MongoDB հավաքածուներ, EDA իրադարձություններ, V-Model խստություն, արդյունավետության թիրախներ, անվտանգություն և մատչելիություն — ամբողջը մեկ էջում:

  • Soulwise-story-ը նոր NestJS մոդուլ է գոյություն ունեցող cosmic-story մոդուլի կողքին: Ֆունկցիոնալ մոդուլների միջև զրո ուղղակի ներմուծում:
  • MongoDB-ի չորս հավաքածու՝ soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances: AES-256 ծածկագրված մարմիններ՝ ինդեքսավորված յուրաքանչյուրի սպասարկած հարցումների համար:
  • Ասինխրոն գեներացիա BullMQ հերթի միջոցով՝ 28 վրկ ժամանակի սահմանով: Իրադարձությունները թողարկվում են EventEmitter2-ի միջոցով միայն տվյալների բազայի commit-ից հետո — ոչ մի կեղծ inbox տարր:
  • V-Model սպեցիֆիկացիա՝ 119 պահանջ, զրո բացթողում: Backend-ի ծածկույթի թիրախ՝ 85% statement ծառայությունների վրա; frontend՝ 90% Pinia store-երի վրա:

Pipeline-ը՝ կրկին, ինժեներական մանրամասներով

Յուրաքանչյուր քայլ ունի ծառայություն, պայմանագիր և իրադարձություն:

  1. Սկսում

    Օգտատիրոջ գործողություն՝ «ստեղծիր այսօրվա գլուխը Քրոջ համար» — կամ պլանավորված cron, ինչպես կիրակի օրվա 9 a.m. ամփոփումը, կամ ամեն 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 — գործարկվում է տվյալների բազայի կոմիտից հետո: Ծանուցումների մոդուլը վերցնում է այն, ստեղծում մուտքերի տուփի տարր և ըստ ցանկության ուղարկում push-ծանուցում (օրական առավելագույնը մեկ անգամ, լուռ ժամերը հարգվում են):

  8. Ցուցադրել

    Ֆրոնտենդը վերցնում է արտեֆակտը նույնականացված API կանչի միջոցով: Hub-ը նորից վերարտադրվում է նոր բովանդակությամբ: Եթե օգտատերը անցանց է եղել, քեշը ցույց է տալիս երեկվա տեսքը, իսկ նոր արտեֆակտը հայտնվում է վերակապակցման ժամանակ:

Յոթ քայլ՝ սկսելուց մինչև ցուցադրում, որոնցից յուրաքանչյուրն անվանված է ըստ իր իրական գործառույթի:

Չորս հավաքածուները

Ինդեքսավորված՝ յուրաքանչյուրի պատասխանած հարցումների համար:

soulwise_persons

Ալբոմի գրառումներ: Ինդեքսներ՝ userId, status, deletedAt դաշտերի վրա: Նախ՝ փափուկ ջնջում; PII-ի կոշտ ջնջումը՝ 30 օրում:

soulwise_chapters

AI-ի գրած գլուխներ՝ ծածկագրված մարմնով: Ինդեքսներ՝ personId, userId, generatedAt դաշտերի վրա: Aspect chip-երը պահվում են որպես առանձին զանգված՝ արագ ֆիլտրման համար:

soulwise_journal_entries

Օգտատիրոջ գրած խորհրդածություններ՝ ծածկագրված մարմնով: Ինդեքսներ՝ userId, personId, createdAt դաշտերի վրա: Տեքստով ինդեքսավորված մարմին՝ որոնման համար: Յուրաքանչյուր գրառման համար «մասնավոր — չփոխանցել Luminara-ին» դրոշակ:

soulwise_resonances

Չորս չափման միավորներ յուրաքանչյուր կապի համար: Եզակի ինդեքս՝ personId-ի վրա: Վերահաշվարկվում է ծառայության կանչով՝ գլխի կամ օրագրի գրառումից հետո:

EDA իրադարձություններ

Խիստ կանոն. իրադարձությունները գործարկվում են միայն տվյալների բազայի commit-ից հետո: Մոդուլների միջև կախվածությունները՝ Symbol ներարկման token-ների միջոցով, երբեք՝ forwardRef-ով: Ֆունկցիոնալ մոդուլների միջև ծառայությունից ծառայություն ուղիղ import-ներ չկան:

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — գործարկվում է գլխի գաղտնագրումից և պահպանումից հետո: Notifications-v2-ը լսում է, ստեղծում inbox-ի տարր, ընտրովի՝ ուղարկում push:
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — գործարկվում է օրագրի գրառման գաղտնագրումից և պահպանումից հետո: Resonance ծառայությունը լսում է և գործարկում վերահաշվարկ:
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — գործարկվում է անձի ծննդյան տվյալների փոփոխությունից հետո: Սինաստրիա-ի cache-ն անվավեր է դառնում:
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — notifications-v2 պայմանագրի համաձայն. հաշվի է առնում push-ի բյուջեն և լուռ ժամերը:

V-Model-ի սպեցիֆիկացիայի խստություն

119 հետագծելի պահանջ, զրո բացթողում: Յուրաքանչյուր պահանջ առաջ է կապվում թեստային դեպքի հետ (UTP, ITP, STP, E2E) և հետ՝ օգտատիրոջ պատմության հետ: 20 օգտատիրոջ պատմություն: 15 ֆունկցիոնալ պահանջ: 12 ոչ ֆունկցիոնալ կատեգորիա: 8 գլոբալ ընդունման դարպաս:

Արտադրողականության պայմանագիր

Գլխի գեներացիա՝ 30 վայրկյան կամ ավելի լավ՝ հարցումների 95%-ի համար, չափված BullMQ առաջադրանքի տևողության բաշխման համեմատ: API p99 GET հապաղում՝ 500 մվ կամ ավելի լավ՝ 1,000 միաժամանակյա օգտատիրոջ դեպքում, չափված k6 բեռնման թեստով: Frontend TTI՝ 3 վայրկյան կամ ավելի լավ՝ սիմուլացված 4G-ի վրա, չափված Lighthouse CI-ով:

Անվտանգության պայմանագիր

AES-256 գաղտնագրում հանգստի վիճակում՝ հարթակի կողմից կառավարվող բանալիներով օրագրի և գլխի բովանդակության համար: TLS 1.2+ փոխանցման ընթացքում, HTTP→HTTPS վերահղում: JWT մուտքի token-ներ 1-ժամյա կյանքի տևողությամբ, թարմացման token-ներ 30-օրյա կյանքի տևողությամբ, պտույտ թարմացման ժամանակ: Փափուկ ջնջում՝ 30-օրյա պատուհանով՝ PII-ի վերջնական ջնջումից առաջ:

Հասանելիության պայմանագիր

prefers-reduced-motion-ը հարգվում է գլոբալ կերպով — GSAP անիմացիաները դառնում են միայն թափանցիկության փոփոխությամբ անցումներ։ VoiceOver-ի և TalkBack-ի պիտակները՝ յուրաքանչյուր ինտերակտիվ տարրի վրա։ Ձեռքով ստուգված iOS-ի և Android-ի վրա՝ յուրաքանչյուր թողարկումից առաջ։

Ինչո՞ւ առանձին soulwise-story մոդուլ, այլ ոչ թե cosmic-story-ի ընդլայնում։

Քանի որ վերին մակարդակի սպեցիֆիկացիան վերակառուցում է ֆունկցիան, իսկ առկա մոդուլի ներսում վերակառուցումը կամ կկոտրեր v1 փորձառությունը, կամ կպահանջեր սկզբում ճյուղավորում, ապա միաձուլում։ Նոր մոդուլը պահում է v1-ը անձեռնմխելի, թույլ է տալիս v2-ին ապացուցել իրեն և մաքուր կերպով միգրացիա անել, երբ պատրաստ լինի։

Ինչո՞ւ MongoDB, այլ ոչ Postgres։

My Zodiac AI-ի առկա backend-ը աշխատում է MongoDB-ի վրա. անցումը կնշանակեր ենթակառուցվածքային որոշում, որը կապ չունի այս ֆունկցիայի հետ։ Փաստաթղթի մոդելը նաև լավ է համապատասխանում գլուխներին և օրագրային գրառումներին՝ ներդրված, փոփոխական երկարությամբ, որպես blob կոդավորված։

Ինչո՞ւ է BullMQ-ն ընտրված որպես հերթ։

BullMQ-ն աշխատում է Redis-ի վրա, որն արդեն stack-ում է՝ սեսիայի և rate-limit-ի համար։ Ոչ մի նոր ենթակառուցվածք։ Ներկառուցված retry-ը, timeout-ը և observability-ն ծածկում են գլուխների գեներացման կարիքները՝ առանց հատուկ կարկատման։

Որտե՞ղ է իրականում գրված վերին մակարդակի սպեցիֆիկացիան։

Ներքին repo-ում։ Այս էջի թվերն ու պայմանագրերը վերաշարադրում են վերին մակարդակի V-Model արտեֆակտները։ My Zodiac AI-ի բլոգի կլաստերի՝ հանրությանն ուղղված ինժեներական բլոգային գրառումները (պիտակավորված 'cosmic-story-v2') ավելի խորն են անդրադառնում կառուցման որոշակի մասերին։

Փորձեք My Zodiac AI-ն այսօր

Մինչ Soulwise-ը բացում է իր ալիքները, մեր գլխավոր աստղագիտական հավելվածն արդեն ձեր ձեռքում է:

Աստղագիտական բովանդակությունը նախատեսված է մտորումների ու զվարճանքի համար: Այստեղ նկարագրված Cosmic Story v2-ի հնարավորությունները մշակման փուլում են. դրանց առկայությունը կարող է փոխվել առանց նախազգուշացման: