স্মার্ট ফিটনেস অ্যাপ: ডেটা স্ট্রাকচার, ডেটাবেস স্কিমা ও সার্ভার ডিজাইন স্পেসিফিকেশন
আর্টিফ্যাক্টএটি হল পর্ব ২-এ ব্যবহৃত আর্টিফ্যাক্ট: আপনার অ্যাপের সিস্টেম স্পেক (কোনও কোড নেই) প্ল্যান করুন। আপনি এই স্পেসিফিকেশনটি Cloud Firestore কালেকশন, সার্ভার এন্ডপয়েন্ট এবং ৩-টিয়ার এজেন্ট মেমরি স্ট্রাকচার করার জন্য রেফারেন্স হিসেবে ব্যবহার করতে পারেন।
এই আর্টিফ্যাক্ট অ্যাক্সেস করতে সাইন-ইন করুন
Build It! সিরিজে ব্যবহৃত সম্পূর্ণ আর্টিফ্যাক্ট দেখতে ও কপি করতে আপনার Google Developer প্রোফাইল দিয়ে সাইন-ইন করুন।
ডেভেলপার প্রোফাইল প্রয়োজন
আপনি ডেভেলপার প্রোফাইল তৈরি করার জন্য উপযুক্ত নন। এই ফিচার চালু করতে আপনার Workspace অ্যাডমিনিস্ট্রেটরকে বিজ্ঞপ্তি পাঠান।
Developer প্রোফাইল তৈরি করুন
সব Build It! প্রম্পট ও আর্টিফ্যাক্ট আনলক করতে ফ্রিতে Google Developer প্রোফাইল তৈরি করুন।
আনলক করতে Builder Central-এ যোগ দিন
এক ক্লিকে আপনার ফ্রি বিল্ডার মেম্বার ব্যাজ দাবি করুন এবং সব Build It! প্রম্পট ও আর্টিফ্যাক্ট আনলক করুন।
স্ট্যাটাস: প্রসেস চলছে (Planning Companion-এর সাথে ড্রাফ্ট করা হচ্ছে)
টার্গেট ডেটাবেস: Google Cloud Firestore
আর্কিটেকচার সংক্রান্ত লক্ষ্য: AI Studio স্মার্ট ফিটনেস প্রোটোটাইপের ক্লিন, রক্ষণাবেক্ষণযোগ্য, প্রোডাকশন-রেডি রিবিল্ড।
0. কোর টেকনিক্যাল স্ট্যাক ও সিস্টেম আর্কিটেকচার সংক্রান্ত সিদ্ধান্ত
প্রোডাকশনের স্থায়িত্ব, পারফর্ম্যান্স ও স্পষ্ট সীমানা নিশ্চিত করতে, সব ইমপ্লিমেন্টেশনের জন্য নিম্নলিখিত আর্কিটেকচারাল বেসলাইন লক করা আছে:
- ফ্রন্টএন্ড ফ্রেমওয়ার্ক: প্রোগ্রেসিভ ওয়েব অ্যাপ (PWA) অফলাইন অ্যাসেট ক্যাশিং (Serwist /
@ducanh2912/next-pwaব্যবহার করে) সহ Next.js (App Router, React 19)। - স্টাইলিং ও UI কম্পোনেন্ট: Tailwind CSS v4 + Tailwind Variants (ভেরিয়েন্ট ম্যানেজমেন্টের জন্য) + Lucide React (আইকন)।
- ক্লায়েন্ট স্টেট আর্কিটেকচার:
- Zustand (
persistমিডলওয়্যার সহ): লোকাল, ট্যাকটাইল ও ক্ষণস্থায়ী ক্লায়েন্ট স্টেট (স্টপওয়াচ টাইমার, অ্যাক্টিভ সেট বাফার, স্টেপ গ্রাফ ও সেভ না করা জিম-ফ্লোর ইনপুট) ম্যানেজ করে। - TanStack Query (React Query): সমস্ত অ্যাসিঙ্ক্রোনাস সার্ভার স্টেট, Firestore ডকুমেন্ট ক্যাশিং, ব্যাকগ্রাউন্ড রিভ্যালিডেশন, রিকোয়েস্ট ডিডুপ্লিকেশন এবং অপ্টিমিস্টিক মিউটেশন ম্যানেজ করে।
- Zustand (
- ব্যাকএন্ড রানটাইম ও API হোস্টিং: Next.js রুট হ্যান্ডলার (
app/api/...) Google Cloud Run-এ হোস্ট করা হয়, যা Firestore এবং Gemini কনটেক্সট ক্যাশিংয়ের মতো একই অঞ্চলে অবস্থিত, যাতে ১৫ মিলিসেকেন্ডের কম ইন্টার্নাল লেটেন্সি পাওয়া যায়। - যাচাইকরণ: Firebase Authentication (Google Sign-In, ইমেল/পাসওয়ার্ড এবং পরিচয় গোপন রেখে অনবোর্ডিং লিঙ্ক করা)। ক্লায়েন্ট সব API অনুরোধে
Authorization: Bearer <Firebase_ID_Token>অ্যাটাচ করে; সার্ভারfirebase-admin.auth().verifyIdToken(token)ব্যবহার করে পরিচয় যাচাই করে। - প্রাইমারি ডেটাবেস: Google Cloud Firestore।
১. সিস্টেম ওভারভিউ ও কোর ইউজার জার্নি
১.১ স্কোপ ও আর্কিটেকচার সংক্রান্ত নীতি
এই স্পেসিফিকেশন ডেটা মডেল, Cloud Firestore স্কিমা, সার্ভার এন্ডপয়েন্ট কন্ট্র্যাক্ট এবং Smart Fitness অ্যাপ্লিকেশনের জন্য AI এজেন্ট মেমরি স্ট্রাকচারকে সংজ্ঞায়িত করে। এটি সমস্ত ওয়ার্কআউট প্ল্যানিং, ঐতিহাসিক সেশন লগিং এবং স্বায়ত্তশাসিত টায়ার্ড কোচিং মেমরির জন্য single source of truth প্রতিষ্ঠা করে, ফ্রন্টএন্ড প্রেজেন্টেশন ফ্রেমওয়ার্ক থেকে সম্পূর্ণভাবে ডিকাপল করা (যা একটি ডেডিকেটেড UI/UX ডিজাইন স্পেসিফিকেশনে উল্লেখ করা হয়েছে)।
১.২ ডেটা সংক্রান্ত মূল নীতি
- সেপারেশন অফ কনসার্ন: ডেটা কন্ট্র্যাক্ট (ব্যাকএন্ড/ডেটাবেস) এবং ক্লায়েন্ট UI ডিজাইনের মধ্যে কঠোর সীমানা।
- হাইব্রিড লাইব্রেরি আর্কিটেকচার: স্ট্যাটিক, অপরিবর্তনীয় ব্যায়াম এনসাইক্লোপিডিয়া (
exercises) সাপ্তাহিক শিডিউলের (weekly_plans) ডাইনামিক AI কম্পোজিশনের সাথে যুক্ত। - হিউম্যান-ইন-দ্য-লুপ স্টেজড মিউটেশন: AI-জেনারেটেড ওয়ার্ক-আউট পরিবর্তন স্টেজড প্রস্তাব হিসেবে ফেরত পাঠানো হয়; ব্যবহারকারী স্পষ্টভাবে সম্মতি জানালে তবেই ডেটাবেসে লেখা হয়।
- কন্টিনিউয়াস ৩-টিয়ার লিভিং মেমরি: AI স্বয়ংক্রিয়ভাবে স্থায়ী স্ট্যাপল, মেয়াদ শেষ হয়ে যাওয়া শারীরিক অবস্থা (স্পষ্ট TTL সহ) এবং ক্ষণস্থায়ী পরিস্থিতিগত প্রসঙ্গ জুড়ে ব্যবহারকারীর তথ্য ক্যাপচার, আপডেট এবং মুছে দেয়।
- গ্র্যানুলার সিঙ্গেল-ডকুমেন্ট রিড: ডেটা অপ্টিমাইজ করা ডকুমেন্টে (যেমন, সাপ্তাহিক প্ল্যান স্পাইরাল নোটবুক এবং সাপ্তাহিক চ্যাট বাকেট) স্ট্রাকচার করা হয় যাতে রিড লেটেন্সি কমানো এবং অপ্রয়োজনীয় কোয়েরি বাদ দেওয়া যায়।
২. সার্ভার এন্ডপয়েন্ট ও API কন্ট্র্যাক্ট
প্রতিটি এন্ডপয়েন্টকে অবশ্যই উত্তরের সোর্স (
AGENT,DATABASE, বাHYBRID) উল্লেখ করতে হবে যাতে এজেন্ট-ব্যাকড এন্ডপয়েন্টগুলি প্রয়োগের সময় যথাযথভাবে কনফিগার করা যায়।
POST /api/coach/chat
- উদ্দেশ্য: AI ব্যক্তিগত প্রশিক্ষকের সাথে কথোপকথনমূলক ইন্টার্যাকশন, কোচিং সংক্রান্ত প্রশ্ন, অনুপ্রেরণামূলক সহায়তা এবং প্রস্তাবিত ওয়ার্কআউট পরিবর্তন (দৈনিক অ্যাডজাস্টমেন্ট এবং সাপ্তাহিক ওভারহল উভয়ই) তৈরি করা।
- ট্রিগার: ব্যবহারকারী কোচ ট্যাবে মেসেজ জমা দেন অথবা ইনলাইন প্রাসঙ্গিক সাজেস্ট করা এডিট চিপে ট্যাপ করেন (যেমন, "DB শোল্ডার প্রেসের সাথে আর্নল্ড প্রেস রিপ্লেস করুন")।
- উত্তরের সোর্স:
AGENT— স্ট্রাকচার্ড টুল/ফাংশন কলিং ও স্ট্রিমিং ক্ষমতা সহ Gemini-কে কাজে লাগায়। ডেটাবেস সরাসরি পরিবর্তন করে না; হিউম্যান-ইন-দ্য-লুপ পর্যালোচনার জন্য একটি স্টেজড প্রস্তাব ফেরত দেয়। - হেডার:
Authorization: Bearer <Firebase_ID_Token>,Content-Type: application/json
অনুরোধের পেলোড:
{
"message": "string (user input or selected prompt chip text)",
"context": {
"active_tab": "string (enum: today | week | coach)",
"week_start_date": "string (ISO date YYYY-MM-DD)",
"selected_day": "string (e.g. monday, optional)"
}
}রেসপন্স পেলোড:
{
"message": "string (conversational coaching response displayed in chat bubble)",
"proposal": {
"id": "string (unique proposal ID, nullable)",
"type": "string (enum: NONE | UPDATE_DAY | UPDATE_WEEK)",
"target_day": "string (e.g. monday, nullable)",
"summary_diff": "string (concise summary of changes, e.g. 'Swapped Arnold Press ➔ DB Shoulder Press', nullable)",
"data": "map (full proposed workout day object or weekly plan object, nullable)"
},
"memory_mutations": [
{
"operation": "string (enum: CREATE | UPDATE | DELETE)",
"target_tier": "string (enum: tier_1_staples | tier_2_physiological | tier_3_situational)",
"memory_id": "string (required for UPDATE and DELETE)",
"entry": "map (memory payload with fact, category, expires_at, etc., required for CREATE and UPDATE)",
"reason": "string (concise rationale for why memory was mutated)"
}
]
}weekly_chats-এ ডুয়াল-রাইট: প্রতিটি টার্নে, সার্ভারFieldValue.arrayUnion()ব্যবহার করে/users/{userId}/weekly_chats/{week_start_date}-এ ইনকামিং ব্যবহারকারীর মেসেজ (text) এবং কোচের উত্তর (text) সেভ করে রাখে।- স্টেজেড মিউটেশন প্যাটার্ন: ব্যবহারকারী [প্ল্যান গ্রহণ করুন] বিকল্পে ট্যাপ না করা পর্যন্ত
/weekly_plansপরিবর্তন না করেই প্রস্তাবের পেলোড ফিরিয়ে দেয়। - কন্টিনিউয়াস অটোনমাস মেমোরি ম্যানেজমেন্ট: ব্যবহারকারীর ৩-টিয়ার প্রোফাইল থেকে আইটেম তৈরি, আপডেট বা মুছে ফেলার জন্য
memory_mutationsএমিট করে।
POST /api/workouts/log
- উদ্দেশ্য: ব্যবহারকারীর স্থায়ী ট্রেনিং আর্কাইভে সম্পূর্ণ হওয়া ওয়ার্কআউট সেশন সেভ করে, চূড়ান্ত ভলিউম/রেপস এগ্রিগেট গণনা করে, ব্যক্তিগত রেকর্ড (PR) চেক করে এবং শিডিউল করা দিনকে সম্পূর্ণ হিসেবে চিহ্নিত করে।
- ট্রিগার: ব্যবহারকারী ওয়ার্কআউট ট্র্যাকিং স্ক্রিনে "ওয়ার্কআউট শেষ করুন" বিকল্পে ট্যাপ করেন।
- উত্তরের সোর্স:
DATABASE— সরাসরি ডেটাবেস ট্রানজ্যাকশন/Cloud Firestore-এ লেখা।
অনুরোধের পেলোড:
{
"plan_reference": {
"week_start_date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. monday)"
},
"title": "string (e.g. Upper Body Hypertrophy)",
"started_at": "string (ISO timestamp)",
"completed_at": "string (ISO timestamp)",
"duration_seconds": "number (e.g. 3120)",
"exercises_logged": [
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"exercise_name": "string (e.g. Incline DB Bench Press)",
"sets": [
{
"set_number": "number (e.g. 1)",
"weight_lbs": "number (e.g. 60)",
"reps_completed": "number (e.g. 12)",
"completed": "boolean"
}
]
}
],
"user_notes": "string (optional subjective feedback)",
"perceived_exertion": "number (optional 1-10 RPE rating)"
}রেসপন্স পেলোড:
{
"success": "boolean",
"log_id": "string (newly created workout log document ID)",
"summary": {
"total_volume_lbs": "number",
"total_sets_completed": "number",
"total_reps_completed": "number"
},
"new_prs": [
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"metric": "string (e.g. '10 Rep Max' or 'Estimated 1RM')",
"value": "string (e.g. '65 lbs' or '105 lbs')"
}
]
}৩. Cloud Firestore ডেটাবেস আর্কিটেকচার
কালেকশন: exercises
হায়ারার্কি: রুট কালেকশন (/exercises/{exercise_id}) • উদ্দেশ্য: মাল্টিমিডিয়া, ফর্ম কিউ, প্রয়োজনীয় সরঞ্জাম ও নির্দেশাবলী সহ স্ট্যাটিক এক্সারসাইজ এনসাইক্লোপিডিয়া।
{
"id": "string (canonical slug matching document ID, e.g. incline-db-bench-press)",
"name": "string (e.g. Incline DB Bench Press)",
"category": "string (e.g. Strength, Hypertrophy, Cardio, Mobility)",
"target_muscles": {
"primary": ["string (e.g. Upper Chest)"],
"secondary": ["string (e.g. Front Deltoids, Triceps)"]
},
"media": {
"video_url": "string (URL to demonstration video)",
"poster_url": "string (URL to video poster / thumbnail image)"
},
"instructions": ["string (step-by-step execution guidance)"],
"form_tips": ["string (critical cues and common pitfalls)"],
"equipment_required": ["string (e.g. Dumbbells, Incline Bench)"]
}কালেকশন: weekly_plans
হায়ারার্কি: /users/{userId}/weekly_plans/{week_start_date} • উদ্দেশ্য: "স্পাইরাল নোটবুক" যাতে সম্পূর্ণ সাপ্তাহিক ট্রেনিং শিডিউল, সারাংশ মেট্রিক এবং প্রতিটি দিনের ওয়ার্কআউট রয়েছে।
{
"week_start_date": "string (ISO date YYYY-MM-DD, e.g. 2026-09-07)",
"theme": "string (e.g. Hypertrophy Focus & Upper Body Overload)",
"summary": {
"total_time_minutes": "number (raw minutes, e.g. 180)",
"total_volume_lbs": "number (raw tonnage in lbs, e.g. 38400)",
"frequency": "number (active workout days, e.g. 4)"
},
"suggested_edits": ["string (pre-generated AI prompt suggestion)"],
"days": {
"monday": {
"date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. Monday)",
"is_rest_day": "boolean",
"status": "string (enum: scheduled | completed | skipped)",
"completed_log_id": "string (nullable)",
"completed_at": "string (ISO timestamp, nullable)",
"title": "string (e.g. Upper Body Hypertrophy)",
"focus_tag": "string (e.g. Push & Chest Dominant)",
"duration_minutes": "number",
"estimated_volume_lbs": "number",
"coach_note": "string",
"muscle_focus": [{ "muscle": "string", "intensity": "number (0-100)" }],
"suggested_edits": ["string"],
"blocks": [
{
"label": "string (e.g. Main Compound Block)",
"exercises": [
{
"exercise_id": "string",
"name": "string",
"target_sets": "number",
"target_reps": "string or number",
"rest_seconds": "number"
}
]
}
]
}
}
}কালেকশন: weekly_chats
হায়ারার্কি: /users/{userId}/weekly_chats/{week_start_date} • উদ্দেশ্য: "সাপ্তাহিক চ্যাট বাকেট" যাতে একটি নির্দিষ্ট ট্রেনিং সপ্তাহের সম্পূর্ণ কথোপকথনের ইতিহাস একটি ডকুমেন্ট রিডে থাকে।
{
"week_start_date": "string (ISO date YYYY-MM-DD, e.g. 2026-09-07)",
"messages": [
{
"id": "string (unique message ID)",
"sender": "string (enum: user | coach)",
"text": "string (conversational message body)",
"created_at": "timestamp (server timestamp)",
"proposal": {
"id": "string (proposal UID, nullable)",
"type": "string (enum: UPDATE_DAY | UPDATE_WEEK, nullable)",
"target_day": "string (e.g. monday, nullable)",
"summary_diff": "string (nullable)",
"status": "string (enum: pending | accepted | dismissed)",
"data": "map (workout or week snapshot payload, nullable)"
}
}
]
}কালেকশন: workout_logs
হায়ারার্কি: /users/{userId}/workout_logs/{log_id} • উদ্দেশ্য: সম্পূর্ণ করা ওয়ার্কআউট সেশনের স্থায়ী, অপরিবর্তনীয় ঐতিহাসিক আর্কাইভ।
{
"id": "string (document ID)",
"plan_reference": {
"week_start_date": "string (ISO date YYYY-MM-DD)",
"day_of_week": "string (e.g. monday)"
},
"title": "string (e.g. Upper Body Hypertrophy)",
"started_at": "timestamp",
"completed_at": "timestamp",
"duration_seconds": "number",
"summary": {
"total_volume_lbs": "number",
"total_sets_completed": "number",
"total_reps_completed": "number"
},
"exercises_logged": [
{
"exercise_id": "string",
"exercise_name": "string",
"sets": [
{
"set_number": "number",
"weight_lbs": "number",
"reps_completed": "number",
"completed": "boolean"
}
]
}
],
"user_notes": "string (nullable)",
"perceived_exertion": "number (1-10 RPE, nullable)"
}কালেকশন: user_profiles
হায়ারার্কি: /users/{userId}/profile/main • উদ্দেশ্য: "লিভিং ক্লায়েন্ট চার্ট" ব্যবহারকারীর ৩-টিয়ার মেমরি প্রোফাইল স্টোর করে।
{
"user_id": "string (document owner UID)",
"display_name": "string (e.g. Alex)",
"email": "string (e.g. alex@example.com)",
"preferences": {
"units": "string (enum: lbs | kg)",
"haptics": "boolean",
"sound": "boolean"
},
"equipment_ids": ["string (e.g. 'dumbbells', 'bench_adjustable', 'pull_up_bar')"],
"onboarding_status": "string (enum: not_started | in_progress | completed)",
"created_at": "timestamp",
"tier_1_staples": [
{
"id": "string (e.g. mem_01)",
"category": "string (enum: equipment | preference | goal | chronic_condition)",
"fact": "string (e.g. Home gym with dumbbells up to 50 lbs and adjustable bench)",
"source": "string (e.g. conversational_onboarding | manual_entry)"
}
],
"tier_2_physiological": [
{
"id": "string (e.g. mem_02)",
"body_part": "string (e.g. hamstrings, shoulder)",
"condition": "string (e.g. soreness, acute_fatigue, minor_strain)",
"fact": "string (e.g. Hamstrings are moderately sore from hill sprints)",
"effective_date": "string (ISO date YYYY-MM-DD)",
"expires_at": "timestamp"
}
],
"tier_3_situational": [
{
"id": "string (e.g. mem_03)",
"event": "string (e.g. golf_competition, travel)",
"fact": "string (e.g. Major golf tournament on Saturday; avoid excessive arm/lat fatigue on Friday)",
"week_start_date": "string (ISO date YYYY-MM-DD)",
"expires_at": "timestamp"
}
]
}কালেকশন: prs
হায়ারার্কি: /users/{userId}/prs/{exercise_slug} • উদ্দেশ্য: সব সময়ের ব্যক্তিগত রেকর্ড, আনুমানিক ১-রিপিটেশন ম্যাক্স বেঞ্চমার্ক এবং রিপিটেশন-নির্দিষ্ট রেকর্ড স্টোর করে।
{
"exercise_id": "string (canonical slug, e.g. incline-db-bench-press)",
"exercise_name": "string (e.g. Incline DB Bench Press)",
"estimated_1rm": "number (calculated using Brzycki formula, e.g. 105)",
"max_weight_set": {
"weight_lbs": "number (e.g. 80)",
"reps": "number (e.g. 10)",
"achieved_at": "timestamp"
},
"rep_records": {
"10": 80,
"8": 85,
"5": 95
},
"last_updated": "timestamp"
}৪. ডেটা লাইফসাইকেল ও এজেন্ট পাইপলাইন
৪.১ পাইপলাইন ১: কোচিং, ওয়ার্কআউট জেনারেশন ও স্টেজড মডিফিকেশন
- ব্যবহারকারীর অ্যাকশন: ফ্রিফর্ম ইনপুট জমা দেয় বা আগে থেকে তৈরি প্রাসঙ্গিক এডিট চিপে ট্যাপ করে।
- কনটেক্সট অ্যাসেম্বলি: সার্ভার অ্যাক্টিভ ৩-টিয়ার মেমরি প্রোফাইল ও বর্তমান সপ্তাহের প্ল্যান ফিরিয়ে আনে, মেয়াদ শেষ হয়ে যাওয়া মেমরি আইটেম বাদ দেয়।
- এজেন্ট ইনফারেন্স: Gemini স্ট্রাকচার্ড টুল/ফাংশন কলিং ব্যবহার করে প্রম্পট ও প্রসঙ্গ প্রসেস করে।
- অটোনোমাস মেমরি মিউটেশন: এক্সট্র্যাক্ট করা ব্যবহারকারীর তথ্য
/user_profiles/{userId}-এ প্রয়োগ করা হয় এবংequipment_ids-এর সাথে সিঙ্ক করা হয়। - স্টেজেড প্রপোজাল স্টেজিং: ওয়ার্কআউট সংক্রান্ত প্রস্তাবিত পরিবর্তন
/weekly_chats/{week_start_date}-এর মধ্যেproposal.status = "pending"-এর সাথে ফেরত পাঠানো হয়। - ব্যবহারকারীর রেজোলিউশন ও পারসিস্টেন্স: [প্ল্যান গ্রহণ করুন] বিকল্পে ট্যাপ করলে, প্রস্তাবিত ডেটা
/weekly_plans-এ সেভ হয়ে যায় এবং প্রস্তাবটি"accepted"হিসেবে চিহ্নিত হয়।
৪.২ পাইপলাইন ২: ওয়ার্কআউট এক্সিকিউশন ও আর্কাইভ করা (বাস্তবিক সত্য)
- লাইভ সেশন রেকর্ডিং: ক্লায়েন্ট, স্থানীয় UI স্ট্যাটাসে, আসলে কতটা ওজন তোলা হয়েছে, কতবার রিপিট করা হয়েছে এবং সম্পূর্ণ হওয়ার ফ্ল্যাগ ট্র্যাক করে।
- সেশন জমা দেওয়া: "ওয়ার্কআউট শেষ করুন" বিকল্পে ক্লায়েন্ট
POST /api/workouts/logকল করে। - মোট গণনা ও যাচাইকরণ: সার্ভার সেশনের মোট ভলিউম গণনা করে এবং Brzycki ফর্মুলা ব্যবহার করে PR চেক করে।
- ইমিউটেবল পারসিস্টেন্স:
/workout_logs-এ ইমিউটেবল রেকর্ড লেখে,/weekly_plans-এ"completed"দিনটি চিহ্নিত করে এবং/prs-এ নতুন PR আপসার্ট করে।
৪.৩ পাইপলাইন ৩: অটোনমাস মেমরি ইনজেশন ও ইনভ্যালিডেশন
- ইনজেশন: সমস্ত কথোপকথনমূলক ইন্টার্যাকশন থেকে ক্রমাগত তথ্য এক্সট্র্যাক্ট করা হয়।
- শ্রেণীবিভাগ: টিয়ার ১ (স্টেপেল, কোনও মেয়াদ শেষ হওয়ার তারিখ নেই), টিয়ার ২ (শারীরবৃত্তীয় অবস্থা, ৩–৪ দিনের TTL), টিয়ার ৩ (পরিস্থিতিগত প্রসঙ্গ, ইভেন্ট-ভিত্তিক TTL)।
- প্রুনিং ও ইনভ্যালিডেশন: মেয়াদ শেষ হয়ে যাওয়া আইটেম (
current_timestamp > expires_at) প্রম্পট কনটেক্সট থেকে ফিল্টার করে সরিয়ে দেওয়া হয় এবং লেজি পার্জ করা হয়।
৫. Firestore নিরাপত্তা সংক্রান্ত নিয়ম ও কম্পোজিট ইন্ডেক্স স্পেসিফিকেশন
৫.১ নিরাপত্তা সংক্রান্ত নিয়ম (firestore.rules)
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
match /profile/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /weekly_plans/{planId} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /weekly_chats/{chatId} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /prs/{exerciseSlug} { allow read, write: if request.auth != null && request.auth.uid == userId; }
match /workout_logs/{logId} {
allow read, create: if request.auth != null && request.auth.uid == userId;
allow update, delete: if false;
}
}
match /exercises/{exerciseId} {
allow read: if request.auth != null;
allow write: if false;
}
}
}৫.২ কম্পোজিট কোয়েরি ইনডেক্স (firestore.indexes.json)
{
"indexes": [
{
"collectionGroup": "workout_logs",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "completed_at", "order": "DESCENDING" }]
},
{
"collectionGroup": "weekly_plans",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "week_start_date", "order": "DESCENDING" }]
},
{
"collectionGroup": "prs",
"queryScope": "COLLECTION",
"fields": [{ "fieldPath": "last_updated", "order": "DESCENDING" }]
}
]
}৬. পরিবর্তনের লগ ও লক করা সিদ্ধান্ত
| তারিখ | কম্পোনেন্ট / সিদ্ধান্ত | ধরন | লক করেছেন |
|---|---|---|---|
| প্রাথমিক সেট-আপ | খালি স্পেসিফিকেশন স্ক্যাফোল্ড শুরু করা হয়েছে | সিস্টেম সেট-আপ | টিম |
| 2026-09-04 | Firestore কালেকশন যোগ করা হয়েছে: exercises এবং weekly_plans | স্কিমা | টিম |
| 2026-09-04 | POST /api/coach/chat এন্ডপয়েন্ট এবং chat_messages কালেকশন যোগ করা হয়েছে | এন্ডপয়েন্ট ও স্কিমা | টিম |
| 2026-09-04 | চ্যাট স্টোরেজ রিফ্যাক্টর করে weekly_chats বাকেট স্কিমা করা হয়েছে | স্কিমা | টিম |
| 2026-09-04 | POST /api/workouts/log এন্ডপয়েন্ট এবং workout_logs কালেকশন যোগ করা হয়েছে | এন্ডপয়েন্ট ও স্কিমা | টিম |
| 2026-09-04 | user_profiles ৩-টিয়ার মেমরি স্কিমা যোগ করা হয়েছে এবং memory_mutations সহ POST /api/coach/chat আপডেট করা হয়েছে | এন্ডপয়েন্ট ও স্কিমা | টিম |
| 2026-09-04 | বিভাগ ১ (সিস্টেম স্কোপ ও নীতি) এবং বিভাগ ৪ (ডেটা লাইফসাইকেল ও পাইপলাইন) সম্পূর্ণ করা হয়েছে | সম্পূর্ণ স্পেসিফিকেশন সম্পূর্ণ করা | টিম |
| 2026-09-22 | হারমোনাইজড স্পেক: Next.js + Tailwind + Zustand স্ট্যাক, Bearer auth, PR সাবকালেকশন, Firestore নিয়ম এবং ক্যানোনিকাল এক্সারসাইজ স্লাগ | সম্পূর্ণ স্পেসিফিকেশন হারমোনাইজেশন | আর্কিটেকচার রিভিউ |