ស្ថាបត្យកម្ម Cosmic Story v2 — ការស្វែងយល់ស៊ីជម្រៅ។

សម្រាប់វិស្វករ PM អ្នកសារព័ត៌មាន និងអ្នកស្វែងរកភាពជាដៃគូ។ pipeline ពេញលេញ MongoDB collection ទាំងបួន ព្រឹត្តិការណ៍ EDA ភាពម៉ឺងម៉ាត់នៃ V-Model គោលដៅសមត្ថភាព សុវត្ថិភាព និងភាពងាយស្រួលប្រើ — ទាំងអស់នៅលើទំព័រតែមួយ។

  • Soulwise-story គឺជាម៉ូឌុល NestJS ថ្មីមួយ នៅជាប់នឹងម៉ូឌុល cosmic-story ដែលមានស្រាប់។ គ្មានការ import ដោយផ្ទាល់រវាងម៉ូឌុលលក្ខណៈពិសេសនោះទេ។
  • MongoDB collections ចំនួនបួន៖ soulwise_persons, soulwise_chapters, soulwise_journal_entries, soulwise_resonances។ ខ្លឹមសារត្រូវបានអ៊ីនគ្រីបបែប AES-256 និងបង្កើត index សម្រាប់ query ដែលនីមួយៗបម្រើ។
  • ការបង្កើតបែប Async តាមរយៈ queue របស់ BullMQ ដែលមាន timeout 28 វិនាទី។ Events ត្រូវបានបញ្ចេញតាមរយៈ EventEmitter2 តែបន្ទាប់ពី database បាន commit ប៉ុណ្ណោះ — គ្មានធាតុ inbox ខ្មោចឡើយ។
  • ការកំណត់បែប V-Model៖ តម្រូវការ 119 ដោយគ្មានចន្លោះខ្វះ។ គោលដៅ coverage របស់ Backend គឺ 85% លើ statement នៃ services; ឯ frontend គឺ 90% លើ Pinia stores។

ដំណើរការ pipeline ម្តងទៀត ជាមួយលម្អិតផ្នែកវិស្វកម្ម

ជំហាននីមួយៗមាន service មួយ contract មួយ និង event មួយ។

  1. កត្តាជំរុញ

    សកម្មភាពរបស់អ្នកប្រើ — 'បង្កើតជំពូកថ្ងៃនេះសម្រាប់បងស្រី' — ឬ cron ដែលបានកំណត់ពេល ដូចជាការសង្ខេបនៅម៉ោង 9 ព្រឹកថ្ងៃអាទិត្យ ឬការ refresh អាកាសធាតុរៀងរាល់ 6 ម៉ោងម្តង។

  2. Queue

    ការងារនេះធ្លាក់ចូលក្នុង queue BullMQ ដែលមានឈ្មោះ soulwise-chapter-generation ដោយមាន timeout រឹងត្រឹម 28 វិនាទី។ ការងារដែលដំណើរការយូរនឹងត្រូវបញ្ឈប់ ហើយរាយការណ៍ទៅអ្នកប្រើថា 'សូមព្យាយាមម្តងទៀត'។

  3. តែង

    ChapterGenerationService ប្រមូលផ្តុំ prompt ដែលមានកត្តាបួន — បរិបទមនុស្ស ហោរាសាស្ត្រ សញ្ញា និងចង្វាក់ — ទៅជា input តែមួយ។ គ្មានទិន្នន័យ PII ដើមរបស់អ្នកប្រើចូលក្នុង prompt ដោយផ្ទាល់ឡើយ គ្រប់យ៉ាងត្រូវបានសម្អាតជាមុនសិន។

  4. បង្កើត

    ក្រុមហ៊ុនផ្តល់ AI ត្រូវបានហៅតាមរយៈ symbol token AI_GENERATION_ADAPTER — ក្រុមហ៊ុនផ្តល់នេះអាចប្តូរបាន។ ការឆ្លើយតបត្រូវបានពិនិត្យមើលលើប្រវែង រូបរាង និងសុវត្ថិភាព មុនពេលបន្ត។

  5. ដំណើរការក្រោយ

    មានរឿងបួនកើតឡើង៖ ឧបករណ៍ចាត់ថ្នាក់វិបត្តិពិនិត្យរកភាសានៃវិបត្តិ; ឧបករណ៍ស្រង់ aspect-chip ទាញ chip ហោរាសាស្ត្រមួយទៅបី; តម្រងប្រឆាំងការអះអាងលុបការសរសេរដែលហាមឃាត់; តួអត្ថបទត្រូវបានអ៊ិនគ្រីបជា AES-256 ដោយប្រើសោដែលគ្រប់គ្រងដោយ platform។

  6. រក្សាទុក

    artifact ត្រូវបានសរសេរទៅ collection MongoDB ដែលសមរម្យ — chapters, journal entries, resonances — ជាមួយ index userId និង personId សម្រាប់ការស្វែងរកលឿន។ លុបទន់ជាមុនសិន; លុបរឹងនៃ PII នៅ 30 ថ្ងៃ។

  7. ជូនដំណឹង

    ព្រឹត្តិការណ៍ EventEmitter2 — CHAPTER_COMPLETED, JOURNAL_CREATED — បាញ់ចេញបន្ទាប់ពីការ commit ទិន្នន័យ។ module ជូនដំណឹងទទួលយកវា បង្កើតធាតុ inbox មួយ និងអាចជ្រើសរើសផ្ញើ push (កំណត់ត្រឹមមួយដងក្នុងមួយថ្ងៃ ហើយគោរពម៉ោងស្ងាត់)។

  8. បង្ហាញ

    ផ្នែកខាងមុខ (frontend) ទាញ artifact តាមរយៈការហៅ API ដែលបានផ្ទៀងផ្ទាត់។ Hub បង្ហាញឡើងវិញជាមួយខ្លឹមសារថ្មី។ បើអ្នកប្រើនៅ offline, cache បម្រើទិដ្ឋភាពនៃម្សិលមិញ ហើយ artifact ថ្មីលេចឡើងពេលភ្ជាប់ឡើងវិញ។

ប្រាំពីរជំហានចាប់ពីការ trigger រហូតដល់ការបង្ហាញ ដែលនីមួយៗដាក់ឈ្មោះតាមអ្វីដែលវាធ្វើពិតប្រាកដ។

Collections ទាំងបួន

បង្កើត index សម្រាប់ query ដែលនីមួយៗឆ្លើយតប។

soulwise_persons

ធាតុ Album។ Index លើ userId, status, deletedAt។ Soft-delete មុនគេ; ការ hard-delete PII នៅ 30 ថ្ងៃ។

soulwise_chapters

ជំពូកដែលសរសេរដោយ AI ខ្លឹមសារត្រូវបានអ៊ីនគ្រីប។ Index លើ personId, userId, generatedAt។ Aspect chips ត្រូវបានរក្សាទុកជា array ដាច់ដោយឡែក សម្រាប់ការ filter លឿន។

soulwise_journal_entries

ការឆ្លុះបញ្ចាំងដែលសរសេរដោយអ្នកប្រើ ខ្លឹមសារត្រូវបានអ៊ីនគ្រីប។ Index លើ userId, personId, createdAt។ ខ្លឹមសារដែលមាន text-index សម្រាប់ការស្វែងរក។ មាន flag 'private — do not feed to Luminara' សម្រាប់ធាតុនីមួយៗ។

soulwise_resonances

ពិន្ទុបួនវិមាត្រសម្រាប់ទំនាក់ទំនងនីមួយៗ។ Unique index លើ personId។ គណនាឡើងវិញតាមរយៈការហៅ service បន្ទាប់ពីការសរសេរជំពូក ឬ journal។

Events បែប EDA

ច្បាប់តឹងរ៉ឹង៖ ព្រឹត្តិការណ៍នឹងបញ្ចេញតែបន្ទាប់ពីការ commit ទៅមូលដ្ឋានទិន្នន័យប៉ុណ្ណោះ។ ភាពអាស្រ័យឆ្លងម៉ូឌុលត្រូវធ្វើតាមរយៈ Symbol injection tokens មិនមែនតាមរយៈ forwardRef ឡើយ។ មិនត្រូវ import សេវាដោយផ្ទាល់ពីសេវាមួយទៅសេវាមួយរវាង feature modules ឡើយ។

  • 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 និងម៉ោងស្ងាត់។

ភាពតឹងរ៉ឹងនៃ spec តាមគំរូ V-Model

តម្រូវការដែលអាចតាមដានបាន 119 ដោយគ្មានចន្លោះខ្វះ។ តម្រូវការនីមួយៗត្រូវភ្ជាប់ទៅមុខទៅករណីសាកល្បង (UTP, ITP, STP, E2E) និងភ្ជាប់ថយក្រោយទៅ user story។ 20 user stories។ តម្រូវការមុខងារ 15។ ប្រភេទមិនមែនមុខងារ 12។ ច្រកទទួលយកសកល 8។

កិច្ចសន្យាសមត្ថភាព

ការបង្កើតជំពូក 30 វិនាទី ឬលឿនជាងនេះ សម្រាប់ 95% នៃសំណើ វាស់ធៀបនឹងការបែងចែករយៈពេលការងារ BullMQ។ ភាពយឺត API p99 GET 500 ms ឬល្អជាងនេះ ក្នុងពេលមានអ្នកប្រើ 1,000 នាក់ដំណាលគ្នា វាស់តាមរយៈការសាកល្បងបន្ទុក k6។ Frontend TTI 3 វិនាទី ឬល្អជាងនេះ លើ 4G ក្លែងធ្វើ វាស់តាមរយៈ Lighthouse CI។

កិច្ចសន្យាសុវត្ថិភាព

ការអ៊ិនគ្រីប AES-256 ពេលផ្ទុក ដោយប្រើកូនសោដែលគ្រប់គ្រងដោយ platform សម្រាប់ខ្លឹមសារកំណត់ហេតុ និងជំពូក។ TLS 1.2+ ពេលបញ្ជូន; បញ្ជូនបន្ត HTTP→HTTPS។ JWT access tokens មានអាយុកាល 1 ម៉ោង, refresh tokens មានអាយុកាល 30 ថ្ងៃ, បង្វិលនៅពេល refresh។ Soft-delete ដោយមានចន្លោះ 30 ថ្ងៃ មុនពេល hard-delete ទិន្នន័យ PII។

កិច្ចសន្យាភាពងាយស្រួលប្រើ

prefers-reduced-motion ត្រូវបានគោរពនៅទូទាំងប្រព័ន្ធ — ចលនា GSAP ក្លាយជាការលេចបន្ថែម-ថយតែ opacity ប៉ុណ្ណោះ។ ស្លាក VoiceOver និង TalkBack មាននៅលើគ្រប់ធាតុអន្តរកម្មទាំងអស់។ បានផ្ទៀងផ្ទាត់ដោយដៃនៅលើ iOS និង Android មុនពេលចេញផ្សាយនីមួយៗ។

ហេតុអ្វីបានជាមាន module soulwise-story ដាច់ដោយឡែក ជំនួសឱ្យការពង្រីក cosmic-story?

ព្រោះថា spec ខាងលើ (upstream) កសាងមុខងារនេះឡើងវិញ ហើយការកសាងឡើងវិញនៅខាងក្នុង module ដែលមានស្រាប់ នឹងបំផ្លាញបទពិសោធន៍ v1 ឬត្រូវ fork រួចបញ្ចូលគ្នាវិញនៅពេលក្រោយ។ Module ថ្មីមួយរក្សា v1 ឱ្យនៅដដែល អនុញ្ញាតឱ្យ v2 បង្ហាញលទ្ធផល ហើយផ្លាស់ប្ដូរបានស្អាតស្អំនៅពេលត្រៀមរួច។

ហេតុអ្វីបានជា MongoDB មិនមែន Postgres?

Backend របស់ My Zodiac AI ដែលមានស្រាប់ ដំណើរការលើ MongoDB; ការប្ដូរនឹងមានន័យថាជាការសម្រេចចិត្តផ្នែកហេដ្ឋារចនាសម្ព័ន្ធ ដែលគ្មានទាក់ទងនឹងមុខងារនេះ។ ម៉ូដែលឯកសារ (document model) ក៏សមនឹងជំពូកនិងធាតុកំណត់ហេតុ (journal entries) បានល្អដែរ — ដាក់ត្រួតគ្នា ប្រវែងខុសៗគ្នា និងអ៊ិនគ្រីបជា blob។

ហេតុអ្វីបានជា BullMQ ជាជម្រើស queue?

BullMQ ដំណើរការលើ Redis ដែលមាននៅក្នុង stack រួចស្រាប់សម្រាប់ session និង rate-limit។ គ្មានហេដ្ឋារចនាសម្ព័ន្ធថ្មីទេ។ មុខងារ retry, timeout និង observability ដែលមានស្រាប់ បំពេញតម្រូវការនៃការបង្កើតជំពូក ដោយមិនចាំបាច់រៀបចំបន្ថែមផ្ទាល់ខ្លួនឡើយ។

តើ spec ខាងលើ (upstream) ត្រូវបានសរសេរទុកនៅឯណាជាក់ស្ដែង?

Repo ខាងក្នុង។ ចំនួននិងកិច្ចសន្យានៅលើទំព័រនេះ បកស្រាយឡើងវិញនូវ V-Model artifacts ខាងលើ។ ការប្រកាសប្លុកវិស្វកម្មសម្រាប់សាធារណជននៅលើ blog cluster របស់ My Zodiac AI (ដាក់ស្លាក 'cosmic-story-v2') ស៊ីជម្រៅទៅលើផ្នែកជាក់លាក់នៃការកសាង។

សាកល្បង My Zodiac AI ថ្ងៃនេះ

ខណៈ Soulwise កំពុងបើករលកថ្មីៗ កម្មវិធីហោរាសាស្ត្រឆ្នើមរបស់យើងបាននៅក្នុងដៃអ្នករួចហើយ។

ខ្លឹមសារហោរាសាស្ត្រគឺសម្រាប់ការពិចារណានិងការកម្សាន្ត។ មុខងារ Cosmic Story v2 ដែលបានរៀបរាប់នៅទីនេះកំពុងស្ថិតក្នុងការអភិវឌ្ឍ។ ភាពអាចប្រើបានអាចផ្លាស់ប្តូរដោយគ្មានការជូនដំណឹងជាមុន។