Cosmic Story v2 আর্কিটেকচার — একটি গভীর বিশ্লেষণ।

ইঞ্জিনিয়ার, PM, সাংবাদিক এবং পার্টনারশিপ স্কাউটদের জন্য। সম্পূর্ণ পাইপলাইন, চারটি MongoDB কালেকশন, EDA ইভেন্ট, V-Model কঠোরতা, পারফরম্যান্স লক্ষ্য, নিরাপত্তা এবং অ্যাক্সেসিবিলিটি — সবই এক পৃষ্ঠায়।

  • Soulwise-story হলো বিদ্যমান cosmic-story মডিউলের পাশাপাশি একটি নতুন NestJS মডিউল। ফিচার মডিউলগুলোর মধ্যে কোনো সরাসরি ইম্পোর্ট নেই।
  • চারটি MongoDB কালেকশন: soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances। AES-256 এনক্রিপ্ট করা বডি, প্রতিটি যে কোয়েরির জন্য কাজ করে সেভাবে ইনডেক্স করা।
  • BullMQ কিউয়ের মাধ্যমে অ্যাসিনক জেনারেশন, 28 সেকেন্ড টাইমআউট সহ। ডেটাবেস কমিট হওয়ার পরই কেবল EventEmitter2-এর মাধ্যমে ইভেন্ট নির্গত হয় — কোনো ফ্যান্টম ইনবক্স আইটেম নেই।
  • V-Model স্পেসিফিকেশন: 119টি রিকোয়ারমেন্ট, কোনো ফাঁক নেই। ব্যাকএন্ড কভারেজ লক্ষ্য সার্ভিসে 85% স্টেটমেন্ট; ফ্রন্টএন্ড Pinia স্টোরে 90%।

পাইপলাইন, আবারও, ইঞ্জিনিয়ারিং বিশদ সহ

প্রতিটি ধাপের একটি সার্ভিস, একটি কন্ট্রাক্ট, এবং একটি ইভেন্ট আছে।

  1. ট্রিগার

    একটি ব্যবহারকারীর ক্রিয়া — 'বোনের জন্য আজকের অধ্যায় তৈরি করো' — কিংবা একটি নির্ধারিত ক্রন, যেমন রবিবার 9 a.m.-এর সারসংক্ষেপ, অথবা প্রতি-6-ঘণ্টার আবহাওয়া রিফ্রেশ।

  2. সারি

    কাজটি soulwise-chapter-generation নামের একটি BullMQ সারিতে এসে পড়ে, যার কঠোর 28-সেকেন্ডের টাইমআউট রয়েছে। দীর্ঘ সময় চলা কাজগুলো বন্ধ করে দেওয়া হয় এবং ব্যবহারকারীকে 'আবার চেষ্টা করুন' হিসেবে জানানো হয়।

  3. রচনা

    ChapterGenerationService চারটি উপাদানের প্রম্পট — ব্যক্তির প্রসঙ্গ, জ্যোতিষ, সংকেত, ছন্দ — একত্র করে একটিমাত্র ইনপুটে রূপ দেয়। কোনো কাঁচা ব্যবহারকারী PII হুবহু প্রম্পটে যায় না; সবকিছু আগে পরিষ্কার করে নেওয়া হয়।

  4. জেনারেট করুন

    AI_GENERATION_ADAPTER সিম্বল টোকেনের মাধ্যমে একটি AI প্রোভাইডারকে কল করা হয় — প্রোভাইডারটি বদলানো যায়। এগিয়ে যাওয়ার আগে রেসপন্সের দৈর্ঘ্য, গঠন ও নিরাপত্তা যাচাই করা হয়।

  5. পোস্ট-প্রসেস করুন

    চারটি জিনিস ঘটে: একটি ক্রাইসিস ক্লাসিফায়ার সংকটমূলক ভাষা খুঁজে দেখে; একটি অ্যাসপেক্ট-চিপ এক্সট্র্যাক্টর এক থেকে তিনটি জ্যোতিষ চিপ বের করে আনে; একটি অ্যান্টি-ক্লেম ফিল্টার নিষিদ্ধ বাক্যাংশগুলো সরিয়ে দেয়; এবং প্ল্যাটফর্ম-পরিচালিত কী দিয়ে বডিটি AES-256 এনক্রিপ্ট করা হয়।

  6. সংরক্ষণ করুন

    আর্টিফ্যাক্টটি যথাযথ MongoDB কালেকশনে লেখা হয় — চ্যাপ্টার, জার্নাল এন্ট্রি, রেজোন্যান্স — দ্রুত খুঁজে পাওয়ার জন্য userId ও personId ইনডেক্স সহ। প্রথমে সফট-ডিলিট; PII-এর হার্ড-ডিলিট 30 দিনে।

  7. জানান

    একটি EventEmitter2 ইভেন্ট — CHAPTER_COMPLETED, JOURNAL_CREATED — ডেটাবেস কমিটের পরে ট্রিগার হয়। নোটিফিকেশন মডিউলটি সেটি গ্রহণ করে, একটি ইনবক্স আইটেম তৈরি করে এবং প্রয়োজনে একটি পুশ পাঠায় (দিনে একটিতে সীমিত, কোয়ায়েট আওয়ার্স মেনে)।

  8. প্রদর্শন করুন

    ফ্রন্টএন্ড একটি অথেনটিকেটেড API কলের মাধ্যমে আর্টিফ্যাক্টটি টেনে আনে। নতুন কন্টেন্ট সহ Hub আবার রেন্ডার হয়। ব্যবহারকারী অফলাইনে থাকলে ক্যাশ গতকালের ভিউ দেখায়, আর পুনরায় সংযোগ হলে নতুন আর্টিফ্যাক্ট দেখা যায়।

ট্রিগার থেকে পর্দায় আসা পর্যন্ত সাতটি ধাপ, প্রতিটিই আসলে যা করে তার নামেই নামকরণ করা।

চারটি কালেকশন

প্রতিটি যে কোয়েরির উত্তর দেয় সেভাবে ইনডেক্স করা।

soulwise_persons

অ্যালবাম এন্ট্রি। userId, status, deletedAt-এর উপর ইনডেক্স। প্রথমে সফট-ডিলিট; 30 দিনে PII-এর হার্ড-ডিলিট।

soulwise_chapters

AI-লিখিত চ্যাপ্টার, এনক্রিপ্ট করা বডি। personId, userId, generatedAt-এর উপর ইনডেক্স। দ্রুত ফিল্টারিংয়ের জন্য অ্যাসপেক্ট চিপগুলো আলাদা অ্যারে হিসেবে সংরক্ষিত।

soulwise_journal_entries

ব্যবহারকারীর লেখা রিফ্লেকশন, এনক্রিপ্ট করা বডি। userId, personId, createdAt-এর উপর ইনডেক্স। সার্চের জন্য টেক্সট-ইনডেক্সড বডি। প্রতি এন্ট্রিতে 'প্রাইভেট — Luminara-কে দেওয়া হবে না' ফ্ল্যাগ।

soulwise_resonances

প্রতি বন্ধনের জন্য চার-মাত্রিক স্কোর। personId-এর উপর ইউনিক ইনডেক্স। চ্যাপ্টার বা জার্নাল লেখার পর সার্ভিস কলের মাধ্যমে পুনরায় গণনা করা হয়।

EDA ইভেন্ট

কঠোর নিয়ম: ডেটাবেস কমিট হওয়ার পরেই কেবল ইভেন্ট ফায়ার হবে। মডিউলের মধ্যে পারস্পরিক নির্ভরতা Symbol injection টোকেনের মাধ্যমে, কখনো forwardRef-এর মাধ্যমে নয়। ফিচার মডিউলগুলোর মধ্যে সরাসরি সার্ভিস-টু-সার্ভিস ইমপোর্ট নয়।

  • SoulwiseEvents.CHAPTER_COMPLETED — SoulwiseEvents.CHAPTER_COMPLETED — একটি অধ্যায় এনক্রিপ্ট ও সংরক্ষিত হওয়ার পরে ফায়ার হয়। Notifications-v2 শোনে; ইনবক্স আইটেম তৈরি করে; প্রয়োজনে পুশ পাঠায়।
  • SoulwiseEvents.JOURNAL_CREATED — SoulwiseEvents.JOURNAL_CREATED — একটি জার্নাল এন্ট্রি এনক্রিপ্ট ও সংরক্ষিত হওয়ার পরে ফায়ার হয়। Resonance সার্ভিস শোনে; পুনঃগণনা ট্রিগার করে।
  • SoulwiseEvents.PERSON_BIRTH_UPDATED — SoulwiseEvents.PERSON_BIRTH_UPDATED — কোনো ব্যক্তির জন্ম-তথ্য বদলানোর পরে ফায়ার হয়। নক্ষত্র মিলন ক্যাশ অকার্যকর হয়।
  • SoulwiseEvents.PUSH_REQUESTED — SoulwiseEvents.PUSH_REQUESTED — notifications-v2 চুক্তি অনুযায়ী; পুশ বাজেট ও শান্ত ঘণ্টা মেনে চলে।

V-Model স্পেসিফিকেশনের কঠোরতা

119টি ট্রেসযোগ্য প্রয়োজনীয়তা, কোনো ফাঁক নেই। প্রতিটি প্রয়োজনীয়তা সামনের দিকে একটি টেস্ট কেসের (UTP, ITP, STP, E2E) সাথে এবং পেছনের দিকে একটি ইউজার স্টোরির সাথে মেলে। 20টি ইউজার স্টোরি। 15টি কার্যকরী প্রয়োজনীয়তা। 12টি অ-কার্যকরী বিভাগ। 8টি গ্লোবাল গ্রহণযোগ্যতা গেট।

পারফরম্যান্স চুক্তি

95% অনুরোধের জন্য অধ্যায় তৈরি 30 সেকেন্ড বা তার চেয়ে দ্রুত, BullMQ জব সময়কাল বিতরণের বিপরীতে পরিমাপ করা হয়। 1,000 জন একসাথে ব্যবহারকারীতে API p99 GET লেটেন্সি 500 ms বা তার চেয়ে ভালো, k6 লোড টেস্টের মাধ্যমে পরিমাপ করা হয়। সিমুলেটেড 4G-তে ফ্রন্টএন্ড TTI 3 সেকেন্ড বা তার চেয়ে ভালো, Lighthouse CI-এর মাধ্যমে পরিমাপ করা হয়।

নিরাপত্তা চুক্তি

জার্নাল ও অধ্যায়ের বিষয়বস্তুর জন্য প্ল্যাটফর্ম-পরিচালিত কী সহ বিশ্রামাবস্থায় AES-256 এনক্রিপশন। চলাচলের সময় TLS 1.2+; HTTP→HTTPS রিডাইরেক্ট। 1-ঘণ্টা আয়ুসহ JWT অ্যাক্সেস টোকেন, 30-দিন আয়ুসহ রিফ্রেশ টোকেন, রিফ্রেশের সময় রোটেশন। PII হার্ড-ডিলিটের আগে 30-দিনের উইন্ডোসহ সফট-ডিলিট।

অ্যাক্সেসিবিলিটি চুক্তি

prefers-reduced-motion সর্বত্র সম্মান করা হয় — GSAP অ্যানিমেশনগুলো শুধু opacity-নির্ভর ফেইডে পরিণত হয়। প্রতিটি ইন্টারঅ্যাক্টিভ উপাদানে VoiceOver ও TalkBack লেবেল থাকে। প্রতিটি রিলিজের আগে iOS ও Android-এ হাতে-কলমে যাচাই করা হয়।

cosmic-story সম্প্রসারণ না করে আলাদা একটি soulwise-story মডিউল কেন?

কারণ আপস্ট্রিম স্পেক ফিচারটিকে নতুন করে তৈরি করে, আর একটি বিদ্যমান মডিউলের ভেতরে নতুন করে গড়লে হয় v1 অভিজ্ঞতা ভেঙে যেত, নয়তো পরে ফর্ক-তারপর-মার্জ করতে হতো। একটি নতুন মডিউল v1-কে অক্ষত রাখে, v2-কে নিজেকে প্রমাণ করতে দেয়, এবং প্রস্তুত হলে পরিচ্ছন্নভাবে মাইগ্রেট হয়।

Postgres নয়, MongoDB কেন?

বর্তমান My Zodiac AI ব্যাকএন্ড MongoDB-তে চলে; বদলালে সেটা এই ফিচারের সঙ্গে সম্পর্কহীন একটি অবকাঠামোগত সিদ্ধান্ত হয়ে দাঁড়াত। ডকুমেন্ট মডেলটি অধ্যায় ও জার্নাল এন্ট্রির সঙ্গেও ভালো খাপ খায় — নেস্টেড, বিভিন্ন দৈর্ঘ্যের, ব্লব হিসেবে এনক্রিপ্ট করা।

কিউ হিসেবে BullMQ কেন বেছে নেওয়া হলো?

BullMQ চলে Redis-এর উপর, যা সেশন ও রেট-লিমিটের জন্য আগে থেকেই স্ট্যাকে আছে। কোনো নতুন অবকাঠামো নেই। বিল্ট-ইন রিট্রাই, টাইমআউট ও অবজার্ভেবিলিটি কোনো কাস্টম ব্যবস্থা ছাড়াই অধ্যায়-জেনারেশনের চাহিদা মেটায়।

আপস্ট্রিম স্পেকটি আসলে কোথায় লেখা আছে?

অভ্যন্তরীণ রিপো। এই পৃষ্ঠার সংখ্যা ও চুক্তিগুলো আপস্ট্রিম V-Model আর্টিফ্যাক্টগুলোর সারমর্ম। My Zodiac AI-এর ব্লগ ক্লাস্টারে প্রকাশিত ইঞ্জিনিয়ারিং ব্লগ পোস্টগুলো ('cosmic-story-v2' ট্যাগ করা) বিল্ডের নির্দিষ্ট অংশ নিয়ে আরও গভীরে যায়।

আজই My Zodiac AI ব্যবহার করে দেখুন

Soulwise যখন তার ঢেউ মেলে ধরছে, আমাদের প্রধান অ্যাস্ট্রোলজি অ্যাপ এখনই আপনার হাতের মুঠোয়।

জ্যোতিষ-সম্পর্কিত বিষয়বস্তু চিন্তাভাবনা ও বিনোদনের জন্য। এখানে বর্ণিত Cosmic Story v2 ফিচারগুলো এখনও ডেভেলপমেন্ট পর্যায়ে আছে; কোনো পূর্বঘোষণা ছাড়াই এর প্রাপ্যতা পরিবর্তিত হতে পারে।