विश्लेषण पर वापस जाएं
फील्ड रिपोर्ट्स23 मिनट में पढ़ें

एजेंट ब्रीफ: Garmin, WHOOP, Speediance और अन्य के लिए OpenClaw फिटनेस रिपोर्ट कनेक्टर्स बनाएं

Garmin, WHOOP, Speediance, Cronometer, 8Sleep, सामान्यीकृत JSON स्नैपशॉट और सार्वजनिक GitHub रिपॉज़िटरी में OpenClaw फिटनेस रिपोर्ट कनेक्टर्स बनाने हेतु एजेंट-रेडी कार्यान्वयन ब्रीफ।

Toby 3 मई 2026

यह लेख एक AI कोडिंग एजेंट को कार्यान्वयन संक्षिप्त विवरण के रूप में सौंपने के लिए है।

लक्ष्य मेरी निजी मशीन को क्लोन करना या मेरी फाइलों को रिवर्स-इंजीनियर करना नहीं है। लक्ष्य यह है कि एक एजेंट इस पृष्ठ को पढ़े और फिटनेस सिस्टम के लिए कार्यशील कनेक्टर्स बनाए: Garmin, WHOOP, Speediance, Cronometer, 8Sleep, और वैकल्पिक Open Wearables।

मूल निर्देश सरल है: प्रत्येक विक्रेता को एक कनेक्टर मानें, सामान्यीकृत JSON स्नैपशॉट संग्रहीत करें, और रिपोर्ट जनरेटर को केवल उन स्नैपशॉट्स का उपयोग करने दें। यह अलगाव विक्रेता-विशिष्ट API की उलझन को एक एजेंट-निर्माण योग्य प्रणाली में बदल देता है।

एजेंट को मेरे सटीक स्थानीय पथों पर निर्भर न रहते हुए, उसी श्रेणी के कनेक्शन बनाने चाहिए:

  • Garmin कार्डियो, प्रशिक्षण भार, गति, हृदय गति क्षेत्र, और गतिविधि विवरण के लिए
  • WHOOP रिकवरी, HRV, RHR, नींद, तनाव, और तत्परता संदर्भ के लिए
  • Speediance शक्ति-सत्र इतिहास, मात्रा, कैलोरी, टेम्पलेट, और व्यायाम विवरण के लिए
  • Cronometer पोषण संदर्भ के लिए
  • 8Sleep उपलब्ध होने पर देर से आने वाले नींद संदर्भ के लिए
  • OpenClaw सिंक चलाने, डेटा सामान्यीकृत करने, और रिपोर्ट तैयार करने वाले ऑर्केस्ट्रेशन लेयर के रूप में

यह GitHub प्रोजेक्ट्स, सार्वजनिक APIs, डेटा अनुबंध, विफलता मोड, और स्वीकृति जांच को भी शामिल करता है जिनकी एक कार्यान्वयन एजेंट को मेरा निजी रेपो देखे बिना कार्यशील स्टैक बनाने के लिए आवश्यकता होती है।


1. एजेंट कार्य

एक स्थानीय-प्रथम OpenClaw फिटनेस रिपोर्टिंग स्टैक बनाएं जो सिस्टम से जुड़ सके, उनके डेटा को सामान्यीकृत कर सके, और रेंडरिंग के दौरान लाइव विक्रेता कॉल्स के बिना रिपोर्ट तैयार कर सके।

एजेंट को निम्नलिखित तैयार करना चाहिए:

  1. कनेक्टर स्क्रिप्ट्स
    प्रति सिस्टम एक सिंक जॉब: Garmin, WHOOP, Speediance, Cronometer, और कॉन्फ़िगर किए जाने पर 8Sleep।
  2. कच्चे स्नैपशॉट्स
    विक्रेता परिवर्तनों को डीबग करने के लिए दिनांकित कच्चे JSON या CSV-व्युत्पन्न पेलोड्स।
  3. सामान्यीकृत अनुबंध
    स्थिर JSON फाइलें जिन पर रिपोर्ट जनरेटर भरोसा कर सके, यहां तक कि जब विक्रेता पेलोड्स बदल जाएं।
  4. सुबह की रिपोर्ट
    एक रिपोर्ट जो रिकवरी, नींद, तत्परता, प्रशिक्षण भार, पोषण, और दिन की योजना को जोड़ती है।
  5. अनुकूली प्रशिक्षण स्नैपशॉट
    समान-दिन की तत्परता और हाल के भार से व्युत्पन्न एक दिनांकित Speediance/BJJ/रन योजना।
  6. रात्रि रिपोर्ट
    अनुशंसित के विरुद्ध Garmin, WHOOP, और Speediance की वास्तविकता की तुलना करने वाली योजना-बनाम-वास्तविक समीक्षा।
  7. प्रकाशन योग्य आउटपुट
    स्थिर HTML और मशीन-पठनीय JSON जिन्हें GitHub Pages या किसी अन्य स्थिर होस्ट पर तैनात किया जा सकता है।

इसे "एक स्क्रिप्ट जो छह APIs को कॉल करती है और HTML को लाइव रेंडर करती है" के रूप में बनाएं। यह नाजुक है।

2. वह आर्किटेक्चर जिसे एजेंट को लागू करना चाहिए

इसे चार परतों में बनाएं:

  1. कनेक्टर परत
    प्रति प्लेटफॉर्म एक सिंक जॉब।

सामान्यीकृत डेटा परत
प्रत्येक सिंक स्थिर JSON स्नैपशॉट लि�ता है। 3. विश्लेषण/रिपोर्ट परत
रिपोर्ट कोड केवल सामान्यीकृत JSON पढ़ता है। 4. प्रस्तुति परत
HTML, डैशबोर्ड, दैनिक ब्रीफिंग, Telegram पोस्ट, ध्वनि सारांश।

यह अलगाव ही सिस्टम को रखरखाव योग्य बनाता है।

AI कार्यान्वयन अनुबंध

एजेंट, कोई भी डैशबोर्ड UI लिखने से पहले यह अनुबंध बनाएँ:

  • इनपुट: केवल पर्यावरण चर और विक्रेता क्रेडेंशियल; स्रोत फ़ाइलों में गुप्त जानकारी कभी हार्ड-कोड न करें।
  • सिंक आउटपुट: प्रत्येक विक्रेता पुल के लिए एक कच्चा JSON स्नैपशॉट, सा� ही प्रत्येक विक्रेता के लिए एक सामान्यीकृत JSON फ़ाइल।
  • रिपोर्ट इनपुट: केवल सामान्यीकृत JSON। रिपोर्ट बिल्डर को सीधे Garmin, WHOOP, Speediance, या Cronometer को कॉल नहीं करना चाहि�।
  • विफलता मोड: यदि एक कनेक्टर विफल हो जाता है, तो कल के अंतिम-ज्ञात-अच्छे सामान्यीकृत फ़ाइल को सुरक्षित रखें और रिपोर्ट में उस स्रोत को पुराना (stale) के रूप में चिह्नित करें।
  • ऑडिट क्षमता: विक्रेता API परिवर्तनों को डीबग करने के लिए पर्याप्त कच्चे पेलोड रखें, लेकिन टोकन, कुकीज़, पासवर्ड, या निजी हेडर लॉग न करें।
  • भेजने का गेट: �मेल, ध्वनि, Telegram, और अनुकूली वर्कआउट कार्यों के लिए उसी दिन की स्कोर की गई रिकवरी डेटा आवश्यक होना चाहिए। वेब रिपोर्ट अभी भी अवनत (degraded) मोड में बनाई जा सकती है, लेकिन सिस्टम को पुरानी रिकवरी से आत्मविश्वासपूर्ण कोचिंग नहीं भेजनी चाहि�।
  • योजना स्नैपशॉट: अनुकूली वर्कआउट योजनाओं को कहीं भी भेजने से पहले दैनिक JSON स्नैपशॉट के रूप में लिखा जाना चाहिए। फिर रात्रि रिपोर्ट योजना की तुलना वास्तव में क्या हुआ उससे कर सकती है।

एजेंट-तैयार बिल्ड के लिए न्यूनतम पर्यावरण चर:

GARMIN_EMAIL=
GARMIN_PASSWORD=
WHOOP_CLIENT_ID=
WHOOP_CLIENT_SECRET=
WHOOP_ACCESS_TOKEN=
WHOOP_REFRESH_TOKEN=
SPEEDIANCE_USER_ID=
SPEEDIANCE_TOKEN=
SPEEDIANCE_REGION=Global
CRONOMETER_EXPORT_PATH=
EIGHTSLEEP_EMAIL=
EIGHTSLEEP_PASSWORD=

3. पूर्णता की परिभाषा

एक कार्यान्वयन एजेंट तभी पूरा होता है जब ये आर्टिफैक्ट मौजूद हों और पुनः उत्पन्न किए जा सकें:

  • data/garmin/summary/latest.json
  • data/whoop/normalized/latest.json
  • data/speediance/normalized/history.json
  • data/speediance/normalized/by_exercise.json
  • data/nutrition/latest.json
  • data/eightsleep/normalized/latest.json, यदि 8Sleep कॉन्�़िगर किया गया है
  • data/training_plans/YYYY-MM-DD_morning.json
  • reports/morning/latest.html
  • reports/nightly/latest.html
  • एक भेजने का गेट जो उसी दिन की स्कोर की गई WHOOP रिकवरी गायब होने पर ईमेल, ध्वनि, Telegram, और अनुकूली वर्कआउट भेजने को रोकता है
  • पुराने-स्रोत चेतावनियाँ जब एक कनेक्टर विफल हो जाता है लेकिन कल की अंतिम-ज्ञात-अच्छी सामान्यीकृत डेटा उपलब्ध होती है
  • एक बिना-गुप्त-जानकारी जाँच जो साबित करती है कि टोकन, कुकीज़, पासवर्ड, और निजी हेडर कमिट नहीं किए गए थे

यदि development के दौरान agent किसी vendor पर authenticate नहीं कर पाता, तो उसे फिर भी connector interface, .env.example, नकली fixtures, normalizer, पुराने स्रोत को संभालना, और report integration लागू करना चाहिए।


4. सार्वजनिक परियोजनाएँ और स्रोत संदर्भ

ये वे सार्वजनिक हिस्से हैं जिन्हें agent को कार्यान्वयन संदर्भ के रूप में उपयोग करना चाहिए।

GitHub/API त्वरित जाँचसूची:

  • Garmin connector: https://github.com/cyberjunky/python-garminconnect
  • Garmin legacy auth context: https://github.com/matin/garth
  • WHOOP official developer API: https://developer.whoop.com/api
  • Speediance public extraction for this build: https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager
  • Speediance working fork this was extracted from: https://github.com/ANPC86/SmartGymWorkoutManager
  • Speediance upstream/original reference: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager
  • Report generator/template reference: https://github.com/tobyglenn/scriptsJinja
  • Cronometer exports/integrations: https://cronometer.com/

OpenClaw

  • Platform/orchestrator: OpenClaw
  • भूमिका: sync jobs शेड्यूल करना, transformations चलाना, reports बनाना, outputs प्रकाशित करना

Garmin

  • Primary Python client: cyberjunky/python-garminconnect
    GitHub: https://github.com/cyberjunky/python-garminconnect
  • Legacy auth library that previously mattered: matin/garth
    GitHub: https://github.com/matin/garth
  • स्थिति नोट: garth deprecated है; python-garminconnect अब नए Garmin auth flows का उपयोग करता है और इसके इर्द-गिर्द ही निर्माण करना है।

WHOOP

  • Official developer API docs: https://developer.whoop.com/api
  • Public API surface: OAuth2 + REST endpoints for recovery, cycles, sleep, workouts, profile, body measurements
  • वैकल्पिक community wrappers मौजूद हैं, लेकिन agent-निर्मित connector को जहाँ तक संभव हो official WHOOP developer API से जोड़ना चाहिए।

Speediance

  • Practical public Speediance implementation reference: ANPC86/SmartGymWorkoutManager
    GitHub: https://github.com/ANPC86/SmartGymWorkoutManager
  • Upstream project lineage / original public reference: hbui3/UnofficialSpeedianceWorkoutManager
    GitHub: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager
  • ANPC86 SmartGymWorkoutManager fork को व्यावहारिक कनेक्शन संदर्भ के रूप में उपयोग करें क्योंकि इसमें history, exports, API debugging, timezone handling, और unit handling के आसपास उपयोगी कार्य है।
  • यह एक अनौपचारिक Speediance एकीकरण है और इसे डिफ़ॉल्ट रूप से अस्थिर माना जाना चाहिए।

पोषण

  • Cronometer product site / exports / integrations: https://cronometer.com/
  • Cronometer को एक संरचित पोषण निर्यात स्रोत के रूप में मानें, न कि जादुई सीधी रिपोर्ट निर्भरता के रूप में।

5. प्रोडक्शन अपडेट जिन्हें agent को सुरक्षित रखना चाहिए

इस स्टैक के वर्तमान संस्करण में कुछ महत्वपूर्ण व्यवहार हैं जिन्हें agent को सुरक्षित रखना चाहिए।

एकल मालिक मशीन

फिटनेस pipeline में एक आधिकारिक हमेशा चालू रहने वाली मशीन होनी चाहिए। दो अलग-अलग कंप्यूटरों को एक ही output repo के विरुद्ध reports बनाने और deploy करने न दें।

सक्रिय मशीन के पास वेंडर सिंक जॉब्स, रिपोर्ट जनरेशन, अडैप्टिव वर्कआउट जनरेशन, GitHub Pages पर डिप्लॉय, और वॉचडॉग चेक्स होते हैं।

अन्य मशीनें रिपोर्ट्स देख सकती हैं या स्थानीय डैशबोर्ड होस्ट कर सकती हैं, लेकिन उन्हें फिटनेस रिपोर्ट्स को दोबारा जनरेट नहीं करना चाहिए।

सिक्वेंशियल पाइपलाइन, बेतरतीब क्रॉन अनुमानों के बजाय

सुबह और रात की पाइपलाइनें क्रमबद्ध चरणों के रूप में चलनी चाहिए:

  1. वेंडर डेटा सिंक करें
  2. आवश्यक समान-दिन डेटा सत्यापित करें
  3. रिपोर्ट्स जनरेट करें
  4. डिप्लॉय करें
  5. नोटिफिकेशन भेजें
  6. वॉइस सारांश जनरेट करें, यदि उपयोग किया गया हो
  7. वॉचडॉग वैलिडेशन चलाएं

पुरानी गलती यह थी कि उन चरणों को निश्चित वॉल-क्लॉक ऑफसेट्स पर शेड्यूल किया जाता था और उम्मीद की जाती थी कि हर पिछला चरण पूरा हो गया होगा। बेहतर पैटर्न यह है कि एक ऑर्केस्ट्रेटर हर चरण को तभी चलाए जब पिछला चरण सफलतापूर्वक समाप्त हो गया हो।

समान-दिन WHOOP रिकवरी गेट

इस स्टैक के लिए, समान-दिन WHOOP रिकवरी कोचिंग के लिए एक कठोर गेट है। यदि आज की रिकवरी गायब है, तो सिस्टम अभी भी पुराने स्रोत की चेतावनियों के साथ एक वेब रिपोर्ट प्रकाशित कर सकता है, लेकिन उसे ईमेल, वॉइस, टेलीग्राम कोचिंग और अडैप्टिव वर्कआउट भेजने पर रोक लगानी चाहिए।

यह एक नियम सबसे खराब विफलता मोड को रोकता है: कल की रिकवरी से बनी एक संभावित सिफारिश।

8Sleep लेट-डेटा हैंडलिंग

8Sleep पहले सुबह के रन के बाद अपडेट हो सकता है। रीरन को रीजनरेट करने से पहले आज और कल को जबरन रिफ्रेश करना चाहिए, बजाय इसके कि केवल इसलिए मौजूदा स्थानीय JSON फ़ाइल पर भरोसा किया जाए कि वह मौजूद है।

केवल वास्तविक Garmin HR ज़ोन

औसत हृदय गति से हृदय-गति ज़ोन वितरण का आविष्कार न करें। यदि Garmin गतिविधि विवरण में टाइम-इन-ज़ोन ডেটा शामिल है, तो उसका उपयोग करें। यदि नहीं है, तो उस चार्ट को छिपा दें या अनुपलब्ध के रूप में चिह्नित करें।

योजना निष्पादन समीक्षा

रात्रि रिपोर्ट अब बेहतर काम करती है जब वह दिन की योजना की तुलना दिन के वास्तविक डेटा से करती है:

  • नियोजित BJJ vs WHOOP BJJ वर्कआउट
  • नियोजित Speediance सत्र vs पूर्ण हुए Speediance सत्र
  • नियोजित रन vs Garmin रन दूरी
  • नियोजित कदम vs Garmin कदम

यह रात्रि रिपोर्ट को केवल सारांश के बजाय एक फीडबैक लूप में बदल देता है।

Open Wearables शैडो मोड

Open Wearables भविष्य की एब्स्ट्रैक्शन लेयर के रूप में उपयोगी है, लेकिन मैं एक कार्यशील व्यक्तिगत रिपोर्ट प्रणाली को एक साथ स्विच नहीं करूंगा। सुरक्षित माइग्रेशन शैडো मोड है:

  1. मौजूदा फ़ाइल-आधारित पाइपलाइन को प्राधिकृत रखें
  2. Garmin/WHOOP डेटा को Open Wearables में इम्पोर्ट या मिरर करें
  3. Open Wearables डेटा को वापस शैडो JSON फ़ाइलों में एक्सपोर्ट करें
  4. शैडो फ़ाइलों की प्रोडक्शन फ़ाइलों से तुलना करें
  5. केवल काउंट, तारीखों और समान-दिन रिकॉर्ड्स के मिलान के बाद ही प्रमोट करें

पायलट के दौरान शैडो फ़ाइलें प्रोडक्शन इनपुट्स को कभी ओवरराइट नहीं करनी चाहिए।


6. Garmin: कार्डियो और गतिविधि-व

अगर WHOOP यह जवाब देता है "मैं कितना रिकवर हो चुका हूँ?", तो Garmin यह जवाब देता है "मैंने वास्तव में क्या किया?"

Garmin वह जगह है जहाँ रिपोर्ट को ये मिलते हैं:

  • दूरी
  • गति और रफ़्तार
  • अवधि
  • औसत और अधिकतम HR
  • हृदय गति क्षेत्र
  • कैडेंस
  • शक्ति
  • प्रशिक्षण प्रभाव
  • गतिविधि मेटाडेटा
  • व्यापक कार्डियो/प्रशिक्षण विवरण, जिन पर WHOOP उतनी समृद्धता से ज़ोर नहीं देता

उपयोग करने के लिए सार्वजनिक रेपो

अनुशंसित: cyberjunky/python-garminconnect

GitHub: https://github.com/cyberjunky/python-garminconnect

यह क्यों मायने रखता है:

  • यह सक्रिय रूप से उस Garmin Connect Python रैपर के रूप में स्थित है जिसका उपयोग करना चाहिए
  • यह बहुत बड़ी Garmin एंडपॉइंट सतह को उजागर करता है
  • इसमें उदाहरण और टोकन हैंडलिंग पैटर्न शामिल हैं
  • इसने उन पुरानी प्रमाणीकरण मान्यताओं को बदल दिया है जो पिछले Garmin बदलावों में टूट गई थीं

महत्वपूर्ण Garmin संगतता नोट

ऐतिहासिक रूप से, कई बिल्ड garth का उपयोग करते थे।

GitHub: https://github.com/matin/garth

लेकिन garth अब स्पष्ट रूप से अप्रचलित है। यह मायने रखता है क्योंकि किसी एजेंट को अप्रचलित प्रमाणीकरण पर नई कार्यान्वयन को केंद्रित नहीं करना चाहिए

न्यूनतम निष्पादन योग्य Garmin उदाहरण

from garminconnect import Garmin
from datetime import date
from pathlib import Path
import json
import os

email = os.environ["GARMIN_EMAIL"]
password = os.environ["GARMIN_PASSWORD"]

client = Garmin(email=email, password=password)
client.login()

today = date.today().isoformat()
stats = client.get_stats(today)
activities = client.get_activities_by_date(today, today)

payload = {
    "date": today,
    "stats": stats,
    "activities": activities,
}

out = Path("data/garmin/raw")
out.mkdir(parents=True, exist_ok=True)
(out / f"{today}.json").write_text(json.dumps(payload, indent=2))

Garmin से क्या सामान्यीकृत करें

कच्चे Garmin पेलोड को सीधे अपनी अंतिम रिपोर्ट लॉजिक में न डालें। पहले उन्हें इन जैसे फ़ील्ड्स में सामान्यीकृत करें:

  • calendarDate
  • totalSteps
  • restingHeartRate
  • sleepingSeconds
  • bodyBattery
  • activityName
  • activityType
  • durationSeconds
  • distanceMeters
  • distanceMiles
  • averageHR
  • maxHR
  • calories
  • trainingEffect
  • cadence
  • power

अनुशंसित भंडारण पैटर्न

  • data/garmin/raw/YYYY-MM-DD.json
  • data/garmin/normalized/YYYY-MM-DD.json
  • data/garmin/summary/latest.json

यह आपको रीप्लेबिलिटी और तेज़ रिपोर्ट पहुँच दोनों देता है।


7. WHOOP: रिकवरी और तत्परता परत

WHOOP वही है जो रिपोर्ट्स को सिर्फ़ एक गतिविधि लॉग के बजाय एक निर्णय इंजन के रूप में उपयोगी बनाता है।

यह योगदान देता है:

  • रिकवरी स्कोर
  • HRV
  • विश्राम हृदय गति
  • नींद प्रदर्शन
  • तनाव
  • चक्र संदर्भ
  • सुबह और रात की सिफ़ारिशों के लिए तत्परता की रूपरेखा

उपयोग करने के लिए सार्वजनिक API

आधिकारिक WHOOP डेवलपर API का उपयोग करें:

  • दस्तावेज़: https://developer.whoop.com/api

संबंधित एंडपॉइंट समूह:

  • /developer/v2/cycle
  • /developer/v2/recovery
  • /developer/v2/activity/sleep
  • /developer/v2/activity/workout
  • /developer/v2/user/profile/basic
  • /developer/v2/user/measurement/body

महत्वपूर्ण सीमा

सबसे महत्वपूर्ण कार्यान्वयन निष्कर्�ों में से एक: जर्नल डेटा WHOOP API से उपलब्ध नहीं है

यदि आप जर्नल उत्तर या आदत संबंधी एनोटेशन चाहते हैं, तो आप उसके लिए सार्वजनिक WHOOP API एंडपॉइंट पर निर्भर नहीं रह सकते। व्यावहारिक विकल्प हैं:

  • WHOOP से मैन्युअल CSV निर्यात
  • आपकी अपनी समानांतर जर्नलिंग परत
  • सिंक के बाद आपके द्वारा जोड़ी गई अलग मेटाडेटा

इस सीमा को लेख में स्पष्ट रूप से बताया जाना चाहिए क्योंकि यह किसी भी गंभीर बिल्ड को प्रभावित करती है।

न्यूनतम निष्पादन योग्य WHOOP उदाहरण

from pathlib import Path
import json
import os
import requests

BASE = "https://api.prod.whoop.com/developer/v2"
TOKEN = os.environ["WHOOP_ACCESS_TOKEN"]
headers = {"Authorization": f"Bearer {TOKEN}"}

def get(path):
    response = requests.get(f"{BASE}{path}", headers=headers, timeout=30)
    response.raise_for_status()
    return response.json()

payload = {
    "recovery": get("/recovery"),
    "sleep": get("/activity/sleep"),
    "workouts": get("/activity/workout"),
}

out = Path("data/whoop/raw")
out.mkdir(parents=True, exist_ok=True)
(out / "latest.json").write_text(json.dumps(payload, indent=2))

WHOOP से क्या सामान्यीकृत करें

इस तरह के फ़ील्ड में सामान्यीकृत करें:

  • recovery_score
  • hrv_rmssd_milli
  • resting_heart_rate
  • spo2_percentage
  • skin_temp_celsius
  • sleep_performance_percentage
  • respiratory_rate
  • strain
  • cycle_start
  • cycle_end
  • workout_sport_name

अनुशंसित संग्रहण पैटर्न

  • data/whoop/raw/recovery.json
  • data/whoop/raw/sleep.json
  • data/whoop/raw/workouts.json
  • data/whoop/normalized/latest.json

8. Speediance: शक्ति प्रशिक्षण परत

Speediance पूरे स्टैक में सबसे असामान्य कनेक्टर है।

Garmin और WHOOP के विपरीत, यह एक स्वच्छ आधिकारिक सार्वजनिक डेवलपर प्लेटफ़ॉर्म नहीं है। एजेंट को इन सार्वजनिक रेपो को कनेक्�न संदर्भ के रूप में उपयोग करना चाहिए:

सार्वजनिक निष्कर्षण/संदर्भ: https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager

ANPC86/SmartGymWorkoutManager
GitHub: https://github.com/ANPC86/SmartGymWorkoutManager

वह रेपो स्वयं मूल सार्वजनिक Speediance प्रोजेक्ट का एक व्यक्तिगत फ़ोर्क / निरंतरता है:

hbui3/UnofficialSpeedianceWorkoutManager
GitHub: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager

ये रेपो महत्वपूर्ण प्रारंभिक बिंदु हैं क्योंकि वे दि�ाते हैं कि कैसे:

  • Speediance एंडपॉइंट के विरुद्ध प्रमाणीकरण करें
  • वर्कआउट डेटा और API प्रतिक्रियाओं का निरीक्षण करें
  • प्रशिक्षण इतिहास ब्राउज़/निर्यात करें
  • डेस्कटॉप-अनुकूल तरीके से टेम्पलेट/वर्कआउट प्रबंधित करें
  • टाइमज़ोन प्रदर्शन और इंपीरियल/मेट्रिक वज़न हैंडलिंग जैसे व्यावहारिक मुद्दों को संभालें

ये रेपो क्यों मायने रखते हैं

Speediance इंटीग्रेशन पैटर्न के लिए व्यावहारिक आधार के रूप में ANPC86 SmartGymWorkoutManager फोर्क का उपयोग करें, जबकि मूल स्रोत के संदर्भ के लिए hbui3 अपस्ट्रीम रेफरेंस को बनाए रखें। मिलकर, ये आधिकारिक ऐप के बाहर Speediance डेटा के साथ काम करने के लिए सबसे स्पष्ट सार्वजनिक रेफरेंस हैं।

स्थिरता चेतावनी

मूल प्रोजेक्ट नोट्स में बताया गया है कि Speediance सुरक्षा अपग्रेड लागू कर रहा है। इसका मतलब है:

  • यह इंटीग्रेशन टूट सकता है
  • हेडर और प्रमाणीकरण व्यवहार बदल सकते हैं
  • एंडपॉइंट स्थानांतरित हो सकते हैं
  • आपको इस कनेक्टर को एक नॉर्मलाइज़ेशन चरण के पीछे अलग रखना चाहिए ताकि आपकी रिपोर्ट्स वेंडर-साइड बदलावों से बची रहें

Speediance के लिए न्यूनतम निष्पादन योग्य पैटर्न

यदि आप अपने शुरुआती बिंदु के रूप में ANPC86/SmartGymWorkoutManager का उपयोग करते हैं, जबकि मूल संदर्भ के लिए hbui3/UnofficialSpeedianceWorkoutManager अपस्ट्रीम की जाँच करते हैं, तो स्वच्छ दृष्टिकोण है:

  1. इसका ऐप या क्लाइंट लेयर स्थानीय रूप से चलाएँ
  2. अपने Speediance खाते से प्रमाणीकरण करें
  3. इसके द्वारा उजागर API मेथड्स से वर्कआउट इतिहास प्राप्त करें
  4. सामान्यीकृत JSON को अपनी स्वयं की डेटा डायरेक्टरी में निर्यात करें

उस क्लाइंट पैटर्न का उपयोग करते हुए छद्म-उदाहरण:

# इसे api_client.py के आसपास आकार दें:
# https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager
from api_client import SpeedianceClient
from datetime import date
from pathlib import Path
import json
import os

client = SpeedianceClient()
success, msg, debug = client.login(
    os.environ["SPEEDIANCE_USER_ID"],
    os.environ["SPEEDIANCE_TOKEN"],
)
if not success:
    raise RuntimeError(msg)

start_date = os.environ.get("SPEEDIANCE_START_DATE", "2026-01-01")
end_date = date.today().isoformat()
records = client.get_training_data(start_date, end_date)

out = Path("data/speediance/raw")
out.mkdir(parents=True, exist_ok=True)
(out / "history.json").write_text(json.dumps(records, indent=2))

Speediance से क्या सामान्यीकृत करें

इस तरह के फ़ील्ड्स में सामान्यीकृत करें:

  • training_id
  • date
  • title
  • duration_seconds
  • calories
  • total_volume
  • exercise_count
  • template_name
  • planned_duration
  • actual_duration
  • exercise_breakdown
  • estimated_1rm

सर्वोत्तम-अभ्यास डेटा मॉडल

एक गंभीर रिपोर्ट सिस्टम के लिए, दो इंडेक्स रखें:

  1. bySession
  • पूर्ण हुए प्रत्येक वर्कआउट के लिए एक रिकॉर्ड
  1. byExercise
  • प्रत्येक मूवमेंट नाम के लिए एक रिकॉर्ड स्ट्रीम
  • इसमें वेट, रेप्स, साइड, सेशन आईडी, टाइमस्टैम्प शामिल हैं

यह संरचना प्रोग्रेशन चार्ट्स और PR डिटेक्शन को बाद में सरल बनाती है।

अनुशंसित स्टोरेज पैटर्न

  • data/speediance/raw/monthly/YYYY-MM.json
  • data/speediance/normalized/history.json
  • data/speediance/normalized/by_exercise.json
  • data/speediance/dashboard/latest.json

अनुकूली Speediance वर्कआउट स्नैपशॉट्स

इस बिल्ड का अधिक उन्नत संस्करण केवल पूर्ण हुए Speediance वर्कआउट्स को ही पढ़ता नहीं है।

यह लाइव तत्परता डेटा से नियोजित कसरत भी बनाता है।

उपयोगी पैटर्न यह है:

  1. समान-दिन WHOOP रिकवरी, वर्तमान स्ट्रेन, BJJ स्ट्रेन, Garmin बॉडी बैटरी, विश्राम हृदय गति, हाल का दौड़ भार, मौसम और हाल का Speediance प्लान इतिहास लोड करें।
  2. दिन को build, maintain, recover, protect या post_bjj_brutal जैसी श्रेणी में वर्गीकृत करें।
  3. पूरी कसरत के लिए एक Speediance उपकरण चुनें, आमतौर पर हैंडल, बारबेल या रस्सी।
  4. मुख्य Speediance कसरत के लिए केवल ऑन-डिवाइस व्यायाम चुनें।
  5. केवल तब शून्य से दो ऑफ-Speediance सहायक व्यायाम जोड़ें जब रिकवरी सहारा दे।
  6. प्लान को data/training_plans/YYYY-MM-DD_context.json में लिखें।
  7. स्नैपशॉट का उपयोग सुबह की सिफारिश और रात की प्लान-एक्ज़ीक्यूशन समीक्षा दोनों के लिए करें।

दोहराव नियंत्रण के लिए, नए कसरत सिग्नेचर की तुलना हाल के प्लान स्नैपशॉट से करें। प्रोडक्शन संस्करण 30 दिनों तक बढ़ने वाली रोलिंग विशिष्टता विंडो का उपयोग करता है, और यह हमेशा कसरत शीर्षक पर आज की तारीख अंकित करता है ताकि कोई पुनः उभरने वाली कसरत भी ताज़ा और खोजने योग्य रहे।


9. क्रोनोमीटर: पोषण संदर्भ परत

आप जो भी सटीक पोषण ऐप इस्तेमाल करें, भूमिका वही है: रिपोर्ट को ऊर्जा सेवन का संदर्भ देना।

यह महत्वपूर्ण है क्योंकि पोषण संदर्भ के बिना प्रशिक्षण भार गलत निष्कर्षों की ओर ले जाता है।

रिपोर्ट ये सवाल पूछने में सक्षम होनी चाहिए:

  • क्या रिकवरी कम थी क्योंकि प्रशिक्षण भार अधिक था?
  • या क्योंकि नींद खराब थी और कैलोरी सेवन कम था?
  • क्या एथलीट उत्पादन के सापेक्ष कम ईंधन वाला था?

व्यावहारिक निर्माण सलाह

रेंडर समय पर लाइव पोषण API पर निर्भर न रहें। इनमें से एक का उपयोग करें:

  • CSV निर्यात
  • वेबहुक अंतर्ग्रहण
  • सामान्यीकृत JSON में निर्धारित सिंक

इन जैसे फ़ील्ड में सामान्यीकृत करें:

  • calories_consumed
  • protein_g
  • carbs_g
  • fat_g
  • fiber_g
  • target_calories
  • estimated_deficit

अनुशंसित भंडारण पैटर्न

  • data/nutrition/raw/YYYY-MM-DD.csv
  • data/nutrition/normalized/YYYY-MM-DD.json
  • data/nutrition/latest.json

10. 8Sleep: देर से आने वाली नींद संदर्भ परत

8Sleep वैकल्पिक है, लेकिन यदि इसे कॉन्फ़िगर किया गया है तो एजेंट को इसे हर अन्य कनेक्टर की तरह व्यवहार करना चाहिए: पहले सिंक, दूसरा सामान्यीकरण, अंत में फ़ाइलों से रेंडर।

महत्वपूर्ण व्यवहार देर से आने वाले डेटा को संभालना है। पहली सुबह की रन के बाद नींद डेटा बदल सकता है, इसलिए रिपोर्ट को फिर से बनाने से पहले मैनुअल रीरन या निर्धारित रीट्राय को आज और कल दोनों को बल-रिफ्रेश करना चाहिए।

इन जैसे फ़ील्ड सामान्यीकृत करें:

  • sleep_score
  • sleep_start
  • sleep_end
  • time_in_bed_seconds
  • time_asleep_seconds
  • hrv
  • resting_heart_rate
  • temperature_adjustments
  • away_mode

अनुशंसित भंडारण पैटर्न:

  • data/eightsleep/raw/YYYY-MM-DD.json
  • data/eightsleep/normalized/YYYY-MM-DD.json
  • data/eightsleep/normalized/latest.json

11.

इस स्टैक में OpenClaw वास्तव में क्या करता है

OpenClaw डेटा स्रोत नहीं है। यह ऑर्केस्ट्रेशन और रीज़निंग लेयर है।

इसका काम है:

  • शेड्यूल पर सिंक जॉब्स चलाना
  • स्थिर आउटपुट सहेजना
  • स्रोतों की तुलना करना
  • रिपोर्ट HTML बनाना
  • लिंक प्रकाशित करना
  • सामान्यीकृत डेटा से मानव-अनुकूल सारांश तैयार करना

इसका मतलब है कि रिपोर्टिंग कोड को ऐसी फ़ाइलों से पढ़ना चाहिए:

  • data/garmin/summary/latest.json
  • data/whoop/normalized/latest.json
  • data/speediance/normalized/history.json
  • data/nutrition/latest.json
  • data/eightsleep/normalized/latest.json

रिपोर्ट जनरेटर को कभी भी यह जानने की ज़रूरत नहीं होनी चाहिए कि Garmin ऑथ कैसे काम करता है या इस हफ़्ते Speediance हेडर कैसे बदले।


12. एजेंट-निर्माण योग्य डायरेक्टरी संरचना

यहाँ एक संरचना है जिसे कोई एजेंट किसी भी वास्तविक वेंडर ऑथ सफल होने से पहले बना सकता है:

project/
  data/
    garmin/
      raw/
      normalized/
      summary/
    whoop/
      raw/
      normalized/
    speediance/
      raw/
      normalized/
      dashboard/
    nutrition/
      raw/
      normalized/
    eightsleep/
      raw/
      normalized/
    training_plans/
  scripts/
    sync_garmin.py
    sync_whoop.py
    sync_speediance.py
    sync_nutrition.py
    sync_eightsleep.py
    gate_same_day_recovery.py
    build_adaptive_plan.py
    build_report.py
  reports/
    morning/
      latest.html
    nightly/
      latest.html
  frontend/
    data/

फ़ाइल संरचना इंटरफ़ेस का हिस्सा है। इसे इतना सरल बनाएँ कि कोई भविष्य का एजेंट सिस्टम का निरीक्षण कर सके, प्रत्येक कनेक्टर ढूँढ सके, एक सिंक फिर से चला सके, और कच्चे पेलोड की तुलना सामान्यीकृत आउटपुट से कर सके।


13. उदाहरण रिपोर्ट बिल्डर पैटर्न

एक बार जब प्रत्येक कनेक्टर सामान्यीकृत JSON लिख देता है, तो वास्तविक रिपोर्ट कोड सरल हो जाता है।

import json
from pathlib import Path

base = Path("data")

garmin = json.loads((base / "garmin/summary/latest.json").read_text())
whoop = json.loads((base / "whoop/normalized/latest.json").read_text())
speediance = json.loads((base / "speediance/normalized/history.json").read_text())
nutrition = json.loads((base / "nutrition/latest.json").read_text())
eightsleep_path = base / "eightsleep/normalized/latest.json"
eightsleep = json.loads(eightsleep_path.read_text()) if eightsleep_path.exists() else {}

summary = {
    "recovery": whoop.get("recovery_score"),
    "hrv": whoop.get("hrv_rmssd_milli"),
    "rhr": whoop.get("resting_heart_rate"),
    "steps": garmin.get("totalSteps"),
    "body_battery": garmin.get("bodyBattery"),
    "lifting_volume": speediance.get("today", {}).get("total_volume"),
    "calories_in": nutrition.get("calories_consumed"),
    "sleep_score": eightsleep.get("sleep_score"),
}

html
<html>
  <body>
    <h1>दैनिक फिटनेस रिपोर्ट</h1>
    <ul>
      <li>रिकवरी: {summary['recovery']}</li>
      <li>HRV: {summary['hrv']}</li>
      <li>RHR: {summary['rhr']}</li>
      <li>कदम: {summary['steps']}</li>
      <li>बॉडी बैटरी: {summary['body_battery']}</li>
      <li>लिफ्टिंग वॉल्यूम: {summary['lifting_volume']}</li>
      <li>कैलोरी इन: {summary['calories_in']}</li>
      <li>8Sleep स्कोर: {summary['sleep_score']}</li>
    </ul>
  </body>
</html>

out = Path("reports/morning") out.mkdir(parents=True, exist_ok=True) (out / "latest.html").write_text(html)


यहीं पर पूरा डिज़ाइन अपना काम दिखाता है: एक बार जब सिंक लेयर व्यवस्थित हो जाती है, तो रिपोर्ट लेयर सबसे अच्छे तरीके से सरल और अनुमानित हो जाती है।

---

## 14. प्रत्येक कनेक्टर वास्तव में किसके लिए है

यह सबसे सरल मानसिक मॉडल है:

### WHOOP
इसके लिए उपयोग करें:
- रिकवरी
- HRV
- RHR
- नींद का प्रदर्शन
- स्ट्रेन
- रेडीनेस फ्रेमिंग

### Garmin
इसके लिए उपयोग करें:
- रनिंग और कार्डियो का विस्तृत विवरण
- पेस, पावर, कैडेंस
- HR ज़ोन
- ट्रेनिंग इफेक्ट
- विस्तृत गतिविधि इतिहास

### Speediance
इसके लिए उपयोग करें:
- स्ट्रेंथ वर्कआउट इतिहास
- कुल वॉल्यूम
- एक्सरसाइज़ विवरण
- प्लान्ड बनाम एक्चुअल सेशन का निष्पादन
- मूवमेंट-लेवल प्रोग्रेशन यदि आप बाय-एक्सरसाइज़ इंडेक्सिंग बनाते हैं

### न्यूट्रिशन ऐप
इसके लिए उपयोग करें:
- कैलोरी इंटेक
- मैक्रो संदर्भ
- अंडर-फ्यूलिंग का पता लगाना

### 8Sleep
इसके लिए उपयोग करें:
- देर से आने वाला नींद विवरण
- बेड-विशिष्ट नींद अवधि और स्कोर
- WHOOP और Garmin के विरुद्ध नींद-संदर्भ क्रॉस-चेक

OpenClaw फिर इन सभी को एक रिपोर्ट और सुझाव सतह में जोड़ता है।

---

## 15. सिस्टम के अनुसार कनेक्शन डिलीवरेबल्स

यह वह चेकलिस्ट है जिसे रिपोर्ट UI को पॉलिश करने से पहले इम्प्लीमेंटेशन एजेंट को पूरा करना चाहिए।

### Garmin कनेक्शन पॉइंट्स
- लाइब्रेरी: `garminconnect` from `cyberjunky/python-garminconnect`
- ऑथ: लाइब्रेरी के टोकन/सेशन हैंडलिंग के साथ Garmin Connect ईमेल/पासवर्ड
- पुल कैडेंस: दैनिक सुबह सिंक प्लस वैकल्पिक पोस्ट-वर्कआउट सिंक
- न्यूनतम पुल:
  - कदम, रेस्टिंग HR, नींद सेकंड्स, बॉडी बैटरी, कैलोरी के लिए दैनिक स्टैट्स
  - रन्स/राइड्स/कार्डियो सेशन्स के लिए तारीख के अनुसार गतिविधियाँ
  - HR ज़ोन, पेस, कैडेंस, पावर, ट्रेनिंग इफेक्ट के लिए उपलब्ध होने पर गतिविधि विवरण
- नॉर्मलाइज़्ड आउटपुट: `data/garmin/summary/latest.json`

### WHOOP कनेक्शन पॉइंट्स
- API दस्तावेज़: `https://developer.whoop.com/api`
- प्रमाणीकरण: OAuth2 एक्सेस टोकन + रिफ्रेश टोकन फ्लो
- बेस URL: `https://api.prod.whoop.com/developer/v2`
- न्यूनतम एंडपॉइंट समूह:
  - स्ट्रेन/साइकल संदर्भ के लिए `/cycle`
  - रिकवरी स्कोर, HRV, रेस्टिंग HR के लिए `/recovery`
  - नींद की परफ़ॉर्मेंस और नींद के समय के लिए `/activity/sleep`
  - वर्कआउट और WHOOP स्ट्रेन डेटा के लिए `/activity/workout`
  - ज़रूरत पड़ने पर प्रोफ़ाइल/शरीर संदर्भ के लिए `/user/profile/basic` और `/user/measurement/body`
- सामान्यीकृत आउटपुट: `data/whoop/normalized/latest.json`

### Speediance कनेक्शन पॉइंट्स
- इस बिल्ड के लिए सार्वजनिक एक्सट्रैक्शन: `https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager`
- अपस्ट्रीम संदर्भ: `https://github.com/hbui3/UnofficialSpeedianceWorkoutManager`
- प्रमाणीकरण: SmartGym क्लाइंट लेयर द्वारा एक्सपोज़ किया गया ग़ैर-आधिकारिक टोकन/यूज़र-आईडी आधारित फ़्लो
- न्यूनतम पुल:
  - वर्कआउट इतिहास
  - व्यायाम/सत्र विवरण
  - यदि आप प्लान्ड-बनाम-एक्चुअल रिपोर्टिंग चाहते हैं तो कस्टम वर्कआउट/टेम्पलेट मेटाडेटा
  - बिना सीक्रेट्स के कच्चे API/डिबग रिस्पॉन्स कैप्चर
- सामान्यीकृत आउटपुट:
  - `data/speediance/normalized/history.json`
  - `data/speediance/normalized/by_exercise.json`

### Cronometer कनेक्शन पॉइंट्स
- सार्वजनिक स्रोत: `https://cronometer.com/` एक्सपोर्ट/इंटीग्रेशन
- अनुशंसित कार्यान्वयन दृष्टिकोण: लाइव रेंडर-टाइम API निर्भरता के बजाय CSV एक्सपोर्ट या शेड्यूल्ड फ़ाइल ड्रॉप
- न्यूनतम फ़ील्ड्स: तारीख, कैलोरी, प्रोटीन, कार्ब्स, फ़ैट, फ़ाइबर, और रिकवरी विश्लेषण में चाहे गए कोई भी माइक्रोन्यूट्रिएंट्स
- सामान्यीकृत आउटपुट: `data/nutrition/latest.json`

### 8Sleep कनेक्शन पॉइंट्स
- प्रमाणीकरण: एनवायरनमेंट-बैक्ड लॉगिन/सेशन फ़्लो, स्रोत में कोई क्रेडेंशियल नहीं
- पुल कैडेंस: सुबह का सिंक और आज व कल के लिए रिरन/रिफ़्रेश सपोर्ट
- न्यूनतम पुल:
  - नींद का स्कोर
  - नींद का समय
  - सोने का समय और बिस्तर पर बिताया समय
  - उपलब्ध होने पर HRV और रेस्टिंग HR
  - उपलब्ध होने पर तापमान और अवे-मोड संदर्भ
- सामान्यीकृत आउटपुट: `data/eightsleep/normalized/latest.json`

### रिपोर्ट-जनरेशन कनेक्शन पॉइंट
रिपोर्ट बिल्डर को केवल स्थिर सामान्यीकृत फ़ाइलें और प्लान स्नैपशॉट पढ़ने चाहिए। एक व्यावहारिक रूप यह है:

```text
data/garmin/summary/latest.json
data/whoop/normalized/latest.json
data/speediance/normalized/history.json
data/speediance/normalized/by_exercise.json
data/nutrition/latest.json
data/eightsleep/normalized/latest.json
data/training_plans/YYYY-MM-DD_morning.json
data/training_plans/YYYY-MM-DD_post_bjj.json

यही वास्तविक कनेक्शन सतह है। अपस्ट्रीम की हर चीज़ टूट सकती है और स्वतंत्र रूप से ठीक की जा सकती है।


16. वास्तविक कार्यान्वयन नियम

यदि कोई एजेंट इसे सफलतापूर्वक बनाने जा रहा है, तो ये नियम किसी भी एकल कोड स्निपेट से अधिक मायने रखते हैं:

  1. हर वेंडर को अपने स्वयं के स्कीमा में सामान्यीकृत करें
    कभी भी किसी रिपोर्ट को वेंडर पेलोड आकार पर निर्भर न होने दें।

  2. कच्चे स्नैपशॉट रखें
    जब कोई सिंक टूटता है, तो कच्चे पेलोड्स आपको बचा लेते हैं।

यदि रिपोर्ट समय-संवेदनशील है तो लाइव API से कभी रेंडर न करें
पहले सिंक करें, फिर रेंडर करें।

  1. अनौपचारिक एकीकरण को डिस्पोजेबल एडाप्टर मानें
    विशेष रूप से Speediance।

  2. Garmin और WHOOP को एक-दूसरे की पूरक बनाएं, प्रतिस्पर्धी नहीं
    WHOOP = तत्परता। Garmin = निष्पादन विवरण।

  3. सत्र और व्यायाम दोनों स्तरों पर शक्ति डेटा को मॉडल करें
    अन्यथा प्रगति रिपोर्टिंग उथली ही रहेगी।

  4. कोचिंग को कल की नहीं, आज की तत्परता पर गेट करें
    उसी दिन की रिकवरी गायब होने पर सिस्टम को केवल वेब-आधारित रिपोर्टिंग तक घटा देना चाहिए।

  5. दिन का न्याय करने से पहले प्लान सहेजें
    रात का अनुपालन स्कोर तभी काम करता है जब सुबह का या BJJ के बाद का प्लान डेटा के रूप में संग्रहीत किया गया हो।

  6. नए बैकएंड को शैडो मोड में पायलट करें
    Open Wearables या कोई भी अन्य एब्स्ट्रैक्शन लेयर यह साबित करनी चाहिए कि वह स्रोत-का-सत्य बनने से पहले मौजूदा प्रोडक्शन फाइलों से मेल खा सकती है।


अंतिम कार्यान्वयन संदर्भ सूची

ये वे सार्वजनिक संदर्भ हैं जो इस सिस्टम को लागू करते समय AI कोडिंग एजेंट को सबसे पहले दिए जाने चाहिए:

  • ऑर्केस्ट्रेशन लेयर के रूप में OpenClaw
  • Garmin कनेक्टर: https://github.com/cyberjunky/python-garminconnect
  • Garmin ऐतिहासिक प्रमाणीकरण संदर्भ: https://github.com/matin/garth (पदावनत; नए निर्माण के केंद्र के रूप में नहीं, बल्कि संदर्भ के रूप में उपयोग करें)
  • WHOOP आधिकारिक डेवलपर API: https://developer.whoop.com/api
  • इस बिल्ड के लिए Speediance सार्वजनिक निष्कर्षण: https://github.com/clawdassistant85-netizen/speediance-smartgym-workout-manager
  • Speediance अपस्ट्रीम/मूल संदर्भ: https://github.com/hbui3/UnofficialSpeedianceWorkoutManager
  • रिपोर्ट जनरेटर/टेम्पलेट संदर्भ: https://github.com/tobyglenn/scriptsJinja
  • Cronometer पोषण निर्यात: https://cronometer.com/
  • 8Sleep कनेक्टर अनुबंध: पर्यावरण-समर्थित सिंक जो data/eightsleep/normalized/latest.json लिखता है

यदि आप यह लेख Claude Code, Codex, OpenClaw, या किसी अन्य कार्यान्वयन एजेंट को सौंप रहे हैं, तो सही निर्देश है: पहले कनेक्टर बनाएं, दूसरा सामान्यीकृत JSON स्नैपशॉट लिखें, तीसरा उसी-दिन की रिकवरी गेट लागू करें, और अंत में रिपोर्ट रेंडरर बनाएं। अंतिम HTML रिपोर्ट डिज़ाइन करके शुरू न करें।

#openclaw#garmin#whoop#speediance#फिटनेस रिपोर्ट्स#एआई सिस्टम