โค้ชวิ่ง AI ของผมคือคลัง Git กับเอเจนต์ Claude

ผมวิ่งจบ นาฬิกาซิงก์ข้อมูลเอง แล้วสามนาทีต่อมาบทวิเคราะห์ก็ถูกเขียนลงในคลังของผม ตารางสัปดาห์ถูกปรับใหม่ และโค้ชได้ทิ้งคอมเมนต์ไว้ใต้กิจกรรม Strava แล้ว ไม่ได้เขียนแอป ไม่ได้เขียนเซิร์ฟเวอร์ ไม่มีบิล API คิดตาม token: มีแค่ซับสคริปชัน Claude, AgentsRoom และไฟล์ Markdown นี่คือวิธีประกอบทั้งหมด ทำตามได้จริง

ผมซ้อมจบ นาฬิกาซิงก์ขึ้น Strava เองตามปกติ แล้วผมก็ไปอาบน้ำ

พอออกมา สามอย่างเกิดขึ้นแล้วโดยที่ผมไม่ได้แตะอะไรเลย บทวิเคราะห์ของเซสชันถูกเขียนลงในคลังการซ้อมของผม ตารางสัปดาห์ถูกปรับใหม่พร้อมเหตุผลของการเปลี่ยนกำกับไว้ข้าง ๆ และใต้กิจกรรม Strava ก็มีคอมเมนต์จากโค้ชของผม บอกว่าเซสชันนี้มีค่าแค่ไหนและมันเปลี่ยนอะไรสำหรับวันศุกร์

โค้ชคนนั้นไม่ใช่แอปพลิเคชันที่ผมสร้าง แต่เป็นคลัง Git ที่มีแต่ไฟล์ Markdown, ซับสคริปชัน Claude และ AgentsRoom ที่คอยยึดทุกอย่างไว้ด้วยกัน ไม่ได้เขียนเซิร์ฟเวอร์ ไม่มีบิลคิดตาม token ใช้เวลาประกอบราวหนึ่งสุดสัปดาห์

ทั้งหมดเผยแพร่เป็นต้นแบบไว้แล้ว: github.com/AgentsRoomDev/running-performance-coach คุณ clone มาแล้วเติมช่องว่างให้เป็นของคุณเองได้ บทความนี้อธิบายทีละชิ้นว่ามันทำงานอย่างไร โดยสมมติว่าคุณเคยได้ยินคำว่า API แต่ไม่เคยเขียน webhook มาก่อน

เล่าพื้นหลังสักหน่อย ผมวิ่งมานานแล้ว มาราธอน 2:47 ฮาล์ฟ 1:13:59 และ 10 กม. 33:45 เป้าหมายของรอบซ้อมปัจจุบันคือกลับไปต่ำกว่า 34 นาทีใน 10 กม. เรื่องนี้สำคัญกับสิ่งที่จะเล่าต่อไป โค้ชทั่วไปที่มาอธิบายซ้ำว่าเซสชันเทรชโฮลด์คืออะไรนั้นไม่มีประโยชน์กับผมเลย และนั่นคือปัญหาที่การประกอบชุดนี้แก้ได้พอดี

เกิดอะไรขึ้นบ้างระหว่างที่ผมวิ่งจบกับตอนที่คอมเมนต์โผล่

ห่วงโซ่ทั้งหมดมีหกขั้น

  1. นาฬิกาส่งกิจกรรมไปยัง Strava ขั้นนี้ทุกคนก็มีอยู่แล้ว
  2. ทุก 15 นาที สคริปต์ Python ตัวเล็ก ๆ จะถาม Strava ว่ามีอะไรใหม่ไหม
  3. เมื่อเจอเซสชันใหม่ มันจะสร้าง ใบสรุปเซสชัน แบบ Markdown ในคลังของผม ทั้งรอบ, สปลิต, ปริมาณ และอัตราการเต้นหัวใจ เฉพาะข้อมูลที่วัดได้จริงเท่านั้น
  4. มันยังเขียนชื่อและคำอธิบายของกิจกรรมบน Strava ใหม่ด้วย เพื่อให้ฟีดของผมเลิกขึ้นว่า Afternoon Run
  5. จากนั้นมันส่งข้อความที่ลงลายเซ็นแล้วไปยัง AgentsRoom ซึ่งจะ เปิดเอเจนต์ Claude โดยมีเซสชันอยู่ในมือแล้ว
  6. เอเจนต์ตัวนั้นทำงานของโค้ช มันอ่าน มันเทียบ มันเขียนบทวิเคราะห์ มันปรับตารางสัปดาห์ มันคอมมิต มันพุช มันคอมเมนต์บน Strava และส่งรายงานฉบับยาวมาให้ผมทางอีเมล

ห้าขั้นแรกคืองานท่อ ขั้นที่หกคือสิ่งที่บทความนี้พูดถึง

บันทึกการซ้อมคือคลัง Git ไม่ใช่ฐานข้อมูล

นี่คือการตัดสินใจที่เปลี่ยนทุกอย่าง และก็เป็นข้อที่คนแปลกใจมากที่สุดด้วย

หนึ่งเซสชัน = หนึ่งไฟล์ journal/2026/2026-09-03.md หนึ่งสัปดาห์ = หนึ่งไฟล์ plan/weeks/2026-W36.md หนึ่งการเปลี่ยนแผน = หนึ่งคอมมิต พร้อมเหตุผลอยู่ในข้อความคอมมิต ไม่มีฐานข้อมูล ไม่มีสคีมา ไม่มีไมเกรชัน ไม่มีหน้าจอ

ผลตามมาสามข้อ เรียงตามความสำคัญ

โค้ชกลับไปอ่านประวัติของตัวเองได้ มันรู้ว่าเมื่อสามสัปดาห์ก่อนตัวเองสั่งอะไรไว้ และตรวจได้ว่ามันได้ผลหรือเปล่า แชตบอตที่คุณเล่าเซสชันให้ฟังจะเริ่มจากศูนย์ทุกครั้งที่คุยใหม่ ส่วนเอเจนต์ที่มีคลังนั้นมีความจำ และความจำนั้นคนอ่านได้

ผมอ่านแผนของตัวเองบนมือถือ ในแอป GitHub ไฟล์ README.md ของคลังไม่ใช่หน้าแนะนำโปรเจกต์ แต่เป็นแดชบอร์ดของผม สัญญาที่เขียนไว้ใน CLAUDE.md ระบุเรื่องนี้ชัดเจน การวางแผนใด ๆ ยังไม่ถือว่าเสร็จตราบใดที่ README ยังไม่สะท้อนมัน ผลก็คือผมไม่มีหน้าจอต้องดูแลเลย แต่กลับมีจอที่บอกผมว่าวันนี้ต้องทำอะไร

ไม่มีอะไรที่ย้อนกลับไม่ได้ ทุกอย่างที่เอเจนต์เขียนคือคอมมิต ผมอ่านมันได้ เถียงกับมันได้ ย้อนมันได้ ซึ่งต่างกันมากกับแอปพลิเคชันที่ตัดสินใจเองอยู่ในมุมของมัน

ขั้นที่ 1: Strava ปลุกสคริปต์ตัวเล็ก ๆ

Strava เปิด API ไว้ คือช่องทางให้โปรแกรมถามได้ว่าขอกิจกรรมล่าสุดของนักกีฬาคนนี้หน่อย สคริปต์ strava_sync.py ทำแบบนั้นเป๊ะ ๆ แล้วแปลงคำตอบให้กลายเป็นใบสรุปเซสชัน

ส่วนที่น่าสนใจไม่ใช่การเรียกผ่านเครือข่าย แต่คือการประกอบขึ้นใหม่ นาฬิกาบันทึกรอบดิบ ๆ มา สคริปต์ต้องเดาให้ออกว่านั่นคือเซสชันแบบไหน

Lap 1  : 4.40 km in 26'07 (5:56/km)   ← วอร์มอัป
Lap 2  : 1.00 km in 3'41  (3:41/km)   ← เรพที่ 1
Lap 3  : 0.20 km in 1'59  (9:55/km)   ← พัก
...                                     → "5 x 1000m r' 2'"

มันลองทุกวิธีตัดแบ่งในรูปแบบที่ว่า k รอบที่เร็วที่สุดคือรอบเรพ แล้วเก็บอันที่ดีที่สุดที่ยังยืนอยู่ได้ ฟังดูง่ายแต่ไม่ง่ายเลย การจับกลุ่มตามความเร็วแบบซื่อ ๆ จะติดกับทันทีที่วอร์มอัปเร็วกว่าช่วงพัก

ที่สำคัญที่สุด รูปร่างของเซสชันถูกประกอบขึ้นใหม่ จากนาฬิกา ไม่ใช่จากแผน ไม่ว่ากรณีใด มันน่าทำตรงข้าม (แผนบอกว่า 5 x 1000m ก็เขียนตามนั้นสิ) และนั่นแหละคือความผิดพลาด เพราะประเด็นทั้งหมดคือการจับให้ได้ว่าวันไหนผมไปทำอย่างอื่น เมื่อสองอย่างไม่ตรงกัน ความไม่ตรงนั้นแหละคือข้อค้นพบ และโค้ชก็เห็นมัน

Planned 3 x 8' → วิ่งรวดเดียวไม่พัก

คำเตือนสองข้อก่อนเริ่ม

API ของ Strava ต้องใช้ซับสคริปชันนักพัฒนาแบบเสียเงินมาตั้งแต่เดือนมิถุนายน 2026 ถ้าไม่มี ทุกการเรียกจะตอบกลับว่า 403 Application Status Inactive ทางสำรองมีอยู่และเตรียมไว้ในต้นแบบแล้ว คือส่งออกไฟล์ TCX จากนาฬิกาของคุณแล้วยื่นให้ import_tcx.py ทุกอย่างที่อยู่ถัดจากการนำเข้าทำงานเหมือนกันทุกประการ

โควตาให้มาเยอะ แต่ก็มีจริง บนแอปพลิเคชันของผม อ่านข้อมูลได้ 300 คำขอต่อทุก 15 นาที และ 3,000 ต่อวัน ในสภาวะปกติสคริปต์ใช้ หนึ่งคำขอต่อหนึ่งรอบ ก็คือ 96 ต่อวัน ห่างจากเพดานมาก แต่มันเป็นเรื่องที่ควรเช็กก่อน ไม่ใช่เช็กทีหลัง

หน้าตั้งค่าของแอปพลิเคชัน Strava API แสดงระดับนักพัฒนามาตรฐาน, client ID, client secret ที่ถูกปิดบัง, access token และ refresh token ในสโคปอ่านอย่างเดียว และขีดจำกัดอัตราคำขอที่แสดงไว้ คือ 600 คำขอต่อทุก 15 นาที และ 6,000 ต่อวันโดยรวม กับ 300 ต่อทุก 15 นาที และ 3,000 ต่อวันสำหรับการอ่าน

ขั้นที่ 2: สคริปต์ปลุกเอเจนต์ พร้อมลายเซ็น

ตรงนี้แหละที่เริ่มน่าสนใจ

webhook คือสิ่งที่ตรงข้ามกับการตั้งคำถาม แทนที่จะคอยถามทุกห้านาทีว่ามีอะไรใหม่ไหม คุณยื่นที่อยู่เว็บให้โปรแกรมหนึ่ง แล้วมันจะส่งข้อความมาหาคุณเองเมื่อเหตุการณ์เกิดขึ้น ตราบใดที่ไม่มีอะไรเกิดขึ้น คุณก็ไม่ต้องจ่ายอะไรเลย

AgentsRoom เปิดสิ่งนี้ไว้พอดี นั่นคือ ทริกเกอร์ webhook คุณสร้างทริกเกอร์ในแอป มันจะคืน URL กับ secret มาให้ ใครก็ตามที่ส่งข้อความ JSON ไปยัง URL นั้นจะเปิดเอเจนต์ขึ้นมา พร้อมพรอมป์ตที่คุณเขียนไว้และเนื้อหาของข้อความที่ถูกฉีดเข้าไปแล้ว

ตัวเลือกเครื่องมือของ AgentsRoom พร้อมทูลทิปบนไอคอน Triggers ที่เขียนว่า Agent runs on a schedule or a webhook

ข้อความที่สคริปต์ของผมส่งไปนั้นเล็กมากโดยตั้งใจ

{
  "type": "created",
  "title": "03/09 · 5 x 1000m r' 2'",
  "body": "เซสชันวันที่ 03/09/2026 นำเข้าจาก Strava\n\nเซสชันคุณภาพ: 5 x 1000m r' 2'\nสปลิต: 3'41 - 3'40 - 3'38 - 3'40 - 3'35\n\nปริมาณรวม: 12.51 km in 1h07'42 (5:25/km), ความสูงสะสม+ 56 m\nเซสชันตามแผน: RP10-5x1000\n\nใบสรุปเซสชัน: journal/2026/2026-09-03.md\nใบสรุปสัปดาห์: plan/weeks/2026-W36.md"
}

สังเกตสิ่งที่ ไม่ อยู่ในนั้น คือตัวเนื้อหาของแผน webhook พา รหัส ของเซสชันตามแผนกับ เส้นทาง ของไฟล์ใบสรุปไปเท่านั้น ไม่เคยพาเนื้อหาไปด้วย เอเจนต์ที่มีคลังอยู่แล้วจะไปอ่านเอง ส่วนเอเจนต์ที่ไม่มีก็ไม่มีเหตุผลใดที่จะได้รับคำสั่งภายในของผม เป็นกฎเดียวกับที่ใช้กับคำอธิบายที่เผยแพร่บน Strava

ลายเซ็น และกับดักที่มาพร้อมกัน

URL สาธารณะที่เปิดเอเจนต์ได้นั้นจะปล่อยให้ใครเจอก็ใช้ได้ไม่ได้ ทริกเกอร์จึงถูก ลงลายเซ็น สคริปต์คำนวณลายนิ้วมือของข้อความด้วย secret ที่ใช้ร่วมกัน (เป็น HMAC-SHA256 ถ้าคำนี้มีความหมายกับคุณ) แล้วส่งไปในเฮดเดอร์ X-AgentsRoom-Signature ฝั่งเซิร์ฟเวอร์คำนวณลายนิ้วมือเดียวกันซ้ำ ถ้าไม่ตรงกันก็ปฏิเสธ

ถ้าไม่มีลายเซ็น คำตอบก็ตรงไปตรงมา

{"error":"REJECTED","message":"Signature missing."}

และนี่คือกับดักที่กินเวลาผมไปหนึ่งค่ำ ลายเซ็นครอบคลุมไบต์ที่ออกไปบนสายจริง ๆ ไม่ใช่อ็อบเจกต์ที่อยู่ในหน่วยความจำ ถ้าคุณลงลายเซ็นไฟล์ตามที่มันอยู่บนดิสก์ แล้วปล่อยให้อีกเลเยอร์หนึ่งซีเรียลไลซ์อ็อบเจกต์ใหม่ (เว้นวรรคเกินมาหนึ่งช่อง, ลำดับคีย์ต่างไป, อักขระถูก escape อีกแบบ) คุณจะได้ลายเซ็นที่ถูกต้องสมบูรณ์แบบสำหรับข้อความที่เซิร์ฟเวอร์จะไม่มีวันได้รับ การถูกปฏิเสธแบบนี้ดีบักไม่ได้เลย เพราะทุกอย่างดูถูกต้องทั้งสองฝั่ง

วิธีแก้สรุปได้ในประโยคเดียว ซีเรียลไลซ์และลงลายเซ็นที่จุดเดียวกัน ในต้นแบบ ฟังก์ชัน post_json ทำทั้งสองอย่าง และไม่มีอะไรอื่นได้รับอนุญาตให้แตะเนื้อความของข้อความ

ขั้นที่ 3: สามชั้นที่บอกโค้ชว่าเขาเป็นใคร ที่นี่ทำงานกันอย่างไร และตอนนี้ต้องทำอะไร

เอเจนต์ที่ทำหน้าที่โค้ชไม่ใช่พรอมป์ตก้อนใหญ่ก้อนเดียว แต่เป็นข้อความสามชิ้นที่แยกจากกัน และการแยกนี้สำคัญ

ชั้นที่ 1 เพอร์โซนา: เขา เป็นใคร

เป็นซิสเทมพรอมป์ตที่ผูกกับเอเจนต์ใน AgentsRoom มันบรรจุปรัชญาการฝึกซ้อมไว้ และตั้งใจให้ ไม่ผูกกับกีฬาชนิดใด มันโค้ชใครก็ได้

งานของคุณไม่ใช่แค่สร้างแผนการฝึกซ้อม คุณโค้ชนักกีฬาอย่างต่อเนื่องด้วยการวิเคราะห์การซ้อมของเขา เข้าใจสภาพร่างกายปัจจุบันของเขา และปรับเซสชันที่จะมาถึง […] พูดอย่างโค้ชที่มีประสบการณ์ ไม่ใช่อย่างแชตบอตที่คอยให้กำลังใจ

มันยังบอกด้วยว่าอะไรที่มันไม่ทำ ไม่ตัดสินเซสชันจากแค่ว่าทำเพซตามเป้าได้หรือไม่, พูดให้ชัดเรื่องความไม่แน่นอนของการทำนายเวลาแข่ง และไม่รับรองเป้าหมายเพียงเพราะนักกีฬาอยากได้ บรรทัดสุดท้ายนี่แหละที่ทำให้โค้ชมีประโยชน์

คุณไม่ต้องเขียนเองก็ได้ เพราะเพอร์โซนานี้เผยแพร่อยู่ในแคตตาล็อกเอเจนต์ของ AgentsRoom ในชื่อ โค้ชการวิ่งที่มีประสิทธิภาพ คลิกเดียวก็ติดตั้งพร้อมใช้

ชั้นที่ 2 CLAUDE.md: ที่นี่ทำงานกันอย่างไร

นี่คือสัญญา ถูกอ่านตอนเริ่มทุกเซสชัน มันบรรจุโครงสร้างไฟล์, กฎที่ทำให้ทุกอย่างสอดคล้องกัน, หลักการฝึกซ้อมที่บีบทุกข้อเสนอไว้ และเหนืออื่นใดคือ พิธีกรรม นั่นคือลำดับที่ต้องทำเป๊ะ ๆ เมื่อมีเซสชันถูกรายงานเข้ามา

ยกมาสักท่อน เพราะมันแสดงให้เห็นระดับความละเอียด

ลำดับของการยอมสละเมื่อสัปดาห์เริ่มหลุด เริ่มจากนาทีส่วนเกินของการวิ่งเบาก่อน แล้วค่อยงานเสริมความแข็งแรง แล้วค่อยความยาวของการวิ่งยาว แล้วค่อยเซสชันคุณภาพหนึ่งเซสชัน ห้ามทั้งสัปดาห์เด็ดขาด

ตรงนี้แหละที่โค้ชเลิกเป็นแชตบอต มันไม่ได้ด้นสดขั้นตอนทำงานใหม่ทุกครั้ง แต่ทำตามขั้นตอนที่ผมเขียนไว้แล้วครั้งเดียว ถ้าคุณจะอ่านไฟล์เดียวจากคลังต้นแบบ ให้อ่านไฟล์นี้

ชั้นที่ 3 พรอมป์ตของทริกเกอร์: ตอนนี้ต้องทำอะไร

นี่คือข้อความที่ส่งให้เอเจนต์เมื่อมีเซสชันเข้ามา มันรับกิจกรรมผ่าน ตัวแปรเทมเพลต ได้แก่ {{event.title}}, {{event.body}}, {{event.url}} เอเจนต์จึงเริ่มต้นโดยมีเซสชันอยู่ในมือแล้ว แทนที่จะต้องไปตามหาเอง

ตัวแก้ไขทริกเกอร์ของ AgentsRoom แสดงชื่อ Coach · {{event.title}} และพรอมป์ตของโค้ช ซึ่งขึ้นต้นด้วยข้อความว่ามีเซสชันใหม่นำเข้าจาก Strava ตามด้วยตัวแปรของอีเวนต์ คำสั่งให้อ่าน CLAUDE.md ก่อน คำเตือนว่ากำลังทำงานโดยไม่มีคนดูแล และขั้นแรกของพิธีกรรม

นี่คือโครงของมัน ตามที่อยู่ในทริกเกอร์จริง

มีเซสชันใหม่นำเข้าจาก Strava

**{{event.title}}** · กิจกรรม {{event.id}}
{{event.url}}

{{event.body}}

---

คุณอยู่ในคลัง `training-plan` อ่าน `CLAUDE.md` ก่อน มันคือกฎหมาย
คุณเขียนด้วยภาษาของผมและพูดกับผมโดยตรงตลอดทั้งฉบับ (§3)

พิธีกรรม §6 มีผลบังคับ แต่ **ขั้นที่ 1 ทำไปแล้ว**: `strava_publish.py`
สร้างใบสรุปเซสชันและคอมมิตไปแล้ว คุณเริ่มต่อจากขั้นที่ 2 แล้วไปให้
สุดทาง มีสามสิ่งที่ต้องส่งมอบ ตามลำดับนี้: **บทวิเคราะห์ในคลัง**,
**คอมเมนต์ใต้กิจกรรม Strava**, **อีเมล**

⚠️ **คุณกำลังทำงานโดยไม่มีคนดูแล จะไม่มีใครอ่านคำถาม** ห้ามขอให้
ตัดสินแทนเด็ดขาด คุณตัดสินเอง คุณลงมือเอง และบอกในรายงานว่าคุณ
ตัดสินอะไรไปและเพราะอะไร

## 1 · วิเคราะห์และปรับแผน (พิธีกรรม §6 ขั้นที่ 2 ถึง 6)

1. `git pull --rebase` ก่อนเป็นอันดับแรก ใบสรุปอาจมาจากเซิร์ฟเวอร์
2. อ่านตามลำดับนี้: ใบสรุปของวันนี้, ใบสรุปสัปดาห์,
   `athlete/zones-and-paces.md` และ **ใบสรุปเซสชัน 3 ครั้งล่าสุด**
   เซสชันหนึ่งไม่เคยถูกตัดสินโดยลำพัง
3. เขียนหัวข้อ `## Analysis` โดย **ให้คำตัดสินก่อน** แล้วค่อยสัญญาณที่
   รองรับคำตัดสินนั้น แล้วค่อยว่ามันเปลี่ยนอะไร
   ⛔ ถ้า `## Analysis` มีเนื้อหาอยู่แล้ว ห้ามเขียนทับ
4. อัปเดตใบสรุปสัปดาห์และบันทึกการเปลี่ยนแผน **ทุกจุด** ไว้ใต้
   `## Adjustments` พร้อมเหตุผล
5. **สร้าง `README.md` ใหม่** มันคือจอที่ผมอ่านบนมือถือ
6. คอมมิตและพุช ระบุพาธให้ชัดเจน ⛔ ห้ามใช้ `git add -A` เด็ดขาด

## 2 · Kudos และคอมเมนต์บน Strava
   ⛔ คอมเมนต์บน Strava เป็นสาธารณะ ห้ามมีอัตราการเต้นหัวใจเป้าหมาย ห้ามมีอาการเจ็บเล็กน้อย
   ห้ามมีการชั่งน้ำหนักภายใน ห้ามมีเวลาเข้าเส้นที่ทำนายไว้

## 3 · รายงานฉบับเต็มทางอีเมล

บรรทัดที่ทำงานหนักที่สุดคือบรรทัดตรงกลาง จะไม่มีใครอ่านคำถาม เอเจนต์ที่ทำงานโดยไม่มีใครอยู่หน้าจอแล้วดันขอให้ตัดสินแทนนั้นไม่ได้ทำผิดอะไร มันแค่หยุด และคุณจะรู้เอาวันรุ่งขึ้น

เลือกโมเดลไหน และทำไมหนึ่งล้าน token ไม่ใช่การอวด

การตั้งค่าค่า
โมเดลClaude Opus, คอนเท็กซ์ 1M
ระดับการใช้เหตุผลสูง
โหมดสิทธิ์อัตโนมัติเต็มรูปแบบ
การเข้าถึงเบราว์เซอร์เปิด

รายการทริกเกอร์ของ AgentsRoom แสดงแถว Coach · {{event.title}} ป้ายกำกับ webhook แหล่งที่มา Any service (JSON) โปรเจกต์ Running Performance Coach และการตั้งค่าเอเจนต์ ได้แก่ โมเดล Opus ระดับการใช้เหตุผลสูง โหมดอัตโนมัติเต็มรูปแบบ และเบราว์เซอร์เปิดอยู่

คอนเท็กซ์ยาวไม่ใช่ของประดับ การจะตัดสินเซสชัน หนึ่ง ครั้งให้ถูกต้อง โค้ชต้องอ่านใบสรุปของวันนี้, ใบสรุปสัปดาห์, ตารางเพซอ้างอิง และ เซสชันสามครั้งก่อนหน้า เซสชันหนึ่งไม่เคยถูกตัดสินโดยลำพัง ภาระสะสม, ลำดับการเรียงวัน และจุดที่ต้องเฝ้าระวังอยู่ตอนนี้ เปลี่ยนคำตัดสินได้ทั้งหมด เรพสามรอบที่ 3:38 ในวันถัดจากการวิ่งยาวสองชั่วโมง เล่าเรื่องคนละเรื่องกับ 3:38 เท่ากันที่ทำหลังวันพัก

โหมดอัตโนมัติเต็มรูปแบบ ไม่ใช่ความมักง่าย แต่เป็นผลที่ตามมา การรันที่ไม่มีใครอยู่หน้าจอย่อมไม่มีใครมาอนุมัติ git push ส่วน การเข้าถึงเบราว์เซอร์ คือสิ่งที่ทำให้เอเจนต์ไปคอมเมนต์บน Strava และส่งอีเมลได้ สองอย่างที่ตรงนี้ไม่มี API สะดวก ๆ ให้ใช้

อะไรที่ทำอัตโนมัติ และอะไรที่ตั้งใจไม่ทำ

นี่คือการตัดสินใจเชิงออกแบบที่ผมพอใจที่สุด และเป็นข้อที่มองข้ามได้ง่าย

งานนำเข้า บันทึกและเผยแพร่ แต่ไม่เคยตัดสิน

สิ่งที่สคริปต์ทำสิ่งที่มันไม่ทำ
ดึงกิจกรรมใหม่ ๆ มาเติมหัวข้อ Analysis
สร้างใบสรุปเซสชันแตะใบสรุปสัปดาห์
เขียนชื่อและคำอธิบายบน Stravaแตะเพซอ้างอิง
คอมมิตใบสรุปที่ตัวเองสร้างออกความเห็นใด ๆ

สคริปต์ที่เริ่มตัดสินจะให้คำตัดสินที่ไร้บริบท ด้วยตรรกะที่แข็งค้างอยู่ในโค้ดที่ไม่มีใครกลับไปอ่าน การตัดสินหมายถึงการถือภาระของสัปดาห์, สภาพร่างกายตอนนี้ และสิ่งที่พูดกันไว้ครั้งก่อน ไว้ด้วยกันทั้งหมด นั่นคืองานของโค้ช และเอเจนต์เป็นคนทำ โดยมีแฟ้มทั้งชุดอยู่ตรงหน้า

ประโยชน์เชิงปฏิบัติเห็นได้ทันที เมื่อเอเจนต์ไม่ได้ทำงาน (เครื่องปิดอยู่ หรือ API ล่ม) ใบสรุปก็ยังมีอยู่ดี ไม่มีอะไรหาย ขาดแค่คอมเมนต์ และแค่รีเพลย์ใหม่ก็พอ

อีกทางเลือกหนึ่งก็ไปในทางเดียวกัน สคริปต์ไม่เก็บไฟล์สถานะไว้จำว่าตัวเองจัดการอะไรไปแล้ว คำอธิบายบน Strava คือแหล่งความจริง ถ้าว่างอยู่ มันเขียน ถ้ามีลายเซ็นของมันอยู่ มันข้าม ถ้าไม่ว่างและไม่มีลายเซ็น แปลว่าคุณเขียนเองและมันจะไม่แตะ ไฟล์สถานะในเครื่องคงบอกอะไรไม่ได้เลยว่าเครื่องอีกเครื่องทำอะไรไป แต่แบบนี้ สองเครื่องรันขนานกันได้โดยไม่เหยียบเท้ากันเอง

กฎการแยกส่วนอีกสองข้อ ที่สลักไว้ในคลังและห้ามหาทางเลี่ยง

  • คำอธิบายที่เผยแพร่บน Strava ไม่เคยคัดลอกเนื้อหาของแผน ใบสรุปสัปดาห์ของผมมีอัตราการเต้นหัวใจเป้าหมายและการชั่งน้ำหนักที่ไม่ควรไปอยู่บนกิจกรรมสาธารณะ
  • คำอธิบายที่เขียนด้วยมือจะไม่ถูกเขียนทับเด็ดขาด

คอมเมนต์ที่ไปโผล่ใต้กิจกรรม

ประเด็นไม่ใช่การชมตัวเอง แต่คือการที่ คำตัดสินของโค้ชอ่านได้จากมือถือของผม ใต้กิจกรรมนั้นเลย โดยไม่ต้องเปิดคลัง และมันอยู่ตรงนั้น ติดกับเซสชันนั้น ตลอดไป

คอมเมนต์จึงแคบโดยตั้งใจ มีอีโมจิบอกคำตัดสิน, ตัวเลขที่รองรับคำตัดสินนั้น และสิ่งที่มันเปลี่ยนสำหรับเซสชันถัดไป ราว 250 ตัวอักษร

✅ เรพห้ารอบเฉลี่ย 3'39 สำหรับเป้า 3'38-3'44 และอัตราการเต้นหัวใจนิ่งตลอดทั้งบล็อก ตารางเพซยังใช้ได้ วันศุกร์ยังคงวิ่งเบาเหมือนเดิม เพราะมาร์จินของสัปดาห์นี้ถูกใช้ไปหมดแล้ว

ส่วนฉบับยาว ฉบับที่มีอัตราการเต้นหัวใจ จุดเฝ้าระวังที่ผมระบุไว้ และการชั่งน้ำหนักเรื่องปริมาณของสัปดาห์หน้า จะไปอยู่ในคลังและในอีเมล สองช่องทาง สองกลุ่มผู้อ่าน และพรอมป์ตคือสิ่งที่รักษาเส้นแบ่งนี้ไว้

สามเรื่องที่พังเฉพาะตอนใช้งานจริง

ทุกบรรทัดต่อไปนี้มีอยู่เพราะเคยมีอะไรพังตอนที่ยังไม่มีมัน และมันให้บทเรียนมากกว่าส่วนอื่นของบทความนี้

1. ปักหมุดเบราว์เซอร์ ผมมีส่วนขยาย Claude สองตัวเชื่อมอยู่ใน Chrome ไม่มีอะไรรับประกันว่าเอเจนต์จะได้ตัวไหน และมีแค่ตัวเดียวที่ล็อกอิน Strava ค้างไว้ ผลก็คือรันสองครั้งพลาดหนึ่งครั้ง เอเจนต์ไปโผล่ในเบราว์เซอร์ผิดตัว ไม่ได้ล็อกอิน คอมเมนต์อะไรไม่ได้เลย การเลือกเบราว์เซอร์ด้วยรหัสอุปกรณ์ไม่ถูกจำข้ามเซสชัน ดังนั้นมันจึงต้องอยู่ ในพรอมป์ต พร้อมข้อห้ามชัดเจนว่าห้ามไปถามผู้ใช้ว่าจะเลือกตัวไหน เมื่อทำงานโดยไม่มีคนดูแล คำถามหนึ่งคำถามคือทางตัน

2. ช่องคอมเมนต์ของ Strava ไม่มี maxlength ในเบราว์เซอร์ไม่มีอะไรห้ามคุณเขียนยาวเกิน แต่ เซิร์ฟเวอร์ ต่างหากที่ปฏิเสธตอนกดส่ง เอเจนต์ที่เรียบเรียงย่อหน้าสวย ๆ ยาว 600 ตัวอักษรจะพิมพ์จนจบ กด Post แล้วเจอความล้มเหลวที่มันไม่เข้าใจ พรอมป์ตจึงต้องบังคับความกระชับ ก่อน จะเขียน และเตรียมรับมือกรณีนี้ไว้ ถ้าส่งไม่ผ่านให้ตัดให้สั้นลงแล้วโพสต์ใหม่ ห้ามแยกเป็นสองคอมเมนต์เด็ดขาด

3. หนึ่งกิจกรรมมีคอมเมนต์ของโค้ชได้ครั้งเดียว เวลาคุณรีเพลย์อีเวนต์เพื่อทดสอบ (ซึ่งช่วงแรกทำบ่อยมาก) ถ้าไม่มีกฎข้อนี้เอเจนต์จะซ้อนคอมเมนต์ทับกิจกรรมที่จัดการไปแล้ว พรอมป์ตจึงสั่งให้มันอ่านแท็บ Comments ก่อนเขียน และให้ข้ามไปถ้ามันอยู่ในนั้นแล้ว ตรรกะเดียวกันนี้ใช้กับฝั่งคลังด้วย ถ้าหัวข้อ ## Analysis มีเนื้อหาอยู่แล้ว ก็ไม่เขียนทับ

ทั้งหมดนี้ราคาเท่าไร

ชิ้นส่วนอยู่ที่ไหนค่าใช้จ่าย
เอเจนต์โค้ชเครื่องของผม ผ่าน AgentsRoomซับสคริปชัน Claude ของผม
การถามทุก 15 นาทีเครื่อง Linux เล็ก ๆ ที่เปิดตลอด~5 ยูโรต่อเดือน หรือไม่เสียเลยบน Raspberry Pi
บันทึกการซ้อมคลัง Git แบบส่วนตัวฟรี
Strava APIStrava Developer Programดูราคาของ Strava

ในการประกอบชุดนี้ ไม่มีคีย์ API ที่คิดเงินตาม token เลย นี่คือประเด็นที่ผมคิดว่าถูกประเมินค่าต่ำที่สุด ถ้าสร้างสิ่งเดียวกันบน API ที่คิดเงินตามการใช้งาน มิเตอร์จะเดินทุกเซสชัน และผมคงไม่ได้ใช้มันต่อ

ลงมือสร้างในสุดสัปดาห์นี้

ขั้นตอนตามลำดับ เผื่อเวลาไว้สักหนึ่งค่ำ ถ้าคุณมีบัญชี Strava และซับสคริปชัน Claude อยู่แล้ว

1. clone ต้นแบบแล้วทำให้เป็นของคุณ

git clone https://github.com/AgentsRoomDev/running-performance-coach.git my-coach
cd my-coach
rm -rf .git && git init

ตั้งสำเนาของคุณเป็นส่วนตัว บันทึกการซ้อมมีข้อมูลสุขภาพอยู่ ทั้งอัตราการเต้นหัวใจ, การนอน และอาการบาดเจ็บ ต้นแบบเป็นสาธารณะ แต่สำเนาของคุณไม่ควรเป็น

จากนั้นเติมข้อมูลตามลำดับนี้: athlete/profile.md (คุณเป็นนักวิ่งแบบไหน), athlete/records.md (สถิติส่วนตัวของคุณ), athlete/constraints.md (ช่วงเวลาที่คุณมี จริง ๆ), athlete/zones-and-paces.md (เพซอ้างอิงของคุณ), plan/objective.md (รายการแข่งและเป้าหมาย) แล้วจึง CLAUDE.md ซึ่งคุณต้องแทนที่ช่อง {{...}} ทุกช่อง

สุดท้าย เปิดคลังด้วยเอเจนต์ Claude ของคุณแล้วบอกมันว่า อ่าน CLAUDE.md กับ athlete/ แล้วสร้างสัปดาห์แรกให้ผมที

2. ต่อ Strava

cp .env.example .env && chmod 600 .env
python3 scripts/strava_oauth.py     # คลิกในเบราว์เซอร์ครั้งเดียวจบ
python3 scripts/strava_sync.py --dry-run

--dry-run จะพิมพ์ให้ดูว่าจะเขียนอะไรบ้างโดยไม่เขียนจริง นี่คือจังหวะที่ควรตรวจว่าการประกอบเซสชันขึ้นใหม่นั้นถูกใจคุณหรือยัง

3. สร้างทริกเกอร์ใน AgentsRoom ที่ Triggers เลือก New trigger

ช่องค่า
ชนิดWebhook แหล่งที่มา generic
พรอมป์ตเนื้อหาของ docs/trigger-prompt.md
บทบาท / เพอร์โซนาdocs/coach-persona.md
โหมดสิทธิ์อัตโนมัติเต็มรูปแบบ
การเข้าถึงเบราว์เซอร์เปิด

AgentsRoom จะออก URL กับ secret สำหรับลงลายเซ็นให้ ใส่ทั้งสองอย่างลงใน .env ของคุณ

WEBHOOK_URL=https://agentsroom.dev/api/triggers/t_xxxxxxxxxxxx
WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxxxxxxxx

4. ทดสอบก่อนจะไว้ใจมัน

python3 scripts/webhook_replay.py scripts/examples/webhook-session.json --dry-run
python3 scripts/webhook_replay.py scripts/examples/webhook-session.json

คำสั่งนี้รีเพลย์เซสชันเข้าไปในทริกเกอร์โดยไม่ต้องรอการวิ่งครั้งถัดไปของคุณ และไม่แตะสถานะของงานอัตโนมัติ คุณควรเห็น ✅ HTTP 202 และควรมีแท็บเอเจนต์เปิดขึ้นใน AgentsRoom

5. ให้มันทำงานทุก 15 นาที

bash scripts/systemd/install.sh          # บนเซิร์ฟเวอร์ Linux

ยูนิตแบบ oneshot บวกกับตัวจับเวลา ไม่มีโพรเซสค้างอยู่ในเครื่อง และรอบที่พลาดไปตอนเครื่องปิดจะถูกตามเก็บในการบูตครั้งถัดไป

ถ้าคุณไม่มีเครื่องที่เปิดตลอด ข้ามขั้นนี้ไปได้เลย รัน strava_sync.py ด้วยมือตอนไหนก็ได้ที่อยากรัน หรือแค่เล่าเซสชันของคุณให้เอเจนต์ฟังในบทสนทนาก็ได้ พิธีกรรมใน CLAUDE.md ทำงานเหมือนกันทุกประการ คุณเสียแค่ระบบอัตโนมัติ ไม่ได้เสียโค้ช

สิ่งที่ผมได้จากเรื่องนี้ นอกเหนือจากการวิ่ง

ไม่มีอะไรในการประกอบชุดนี้ที่ผูกกับการวิ่งโดยเฉพาะ สิ่งที่มันแสดงให้เห็นคือรูปแบบที่นำไปใช้ซ้ำได้กับแทบทุกเรื่องที่คุณสะสมข้อมูลส่วนตัวไว้และอยากได้ความเห็นที่เชี่ยวชาญเกี่ยวกับมัน

สามชิ้นเท่านั้น คลัง Git ที่มีไฟล์ Markdown เป็นความจำที่ทั้งเครื่องและคุณอ่านได้ เหตุการณ์ที่ปลุกเอเจนต์ แทนที่จะให้เอเจนต์คอยวนถามและเผา token ทิ้งเปล่า ๆ และ สามชั้นของการตั้งค่า ที่แยกอย่างสะอาดว่าเอเจนต์เป็นใคร ที่บ้านคุณมันทำงานอย่างไร และตอนนี้มันควรทำอะไร

เปลี่ยนคำว่าเซสชันวิ่งเป็นรายการเดินบัญชี, เซสชันเขียนโค้ด, ค่าน้ำตาลในเลือด หรือบันทึกการอ่านดูสิ กลไกไม่เปลี่ยนเลย

คำถามที่พบบ่อย

ต้องเขียนโปรแกรมเป็นไหมถึงจะสร้างโค้ชวิ่ง AI ได้

คุณแค่ต้องรันคำสั่งในเทอร์มินัลเป็นและแก้ไฟล์ข้อความเป็น คลังต้นแบบพร้อมให้ clone อยู่แล้ว สคริปต์ Python ใช้แค่ไลบรารีมาตรฐานเท่านั้น (ไม่ต้อง pip install) และส่วนที่เป็นการโค้ชตั้งค่าด้วยการเขียนข้อความธรรมดาลงในไฟล์ Markdown งานจริงไม่ใช่งานเทคนิค แต่คือการอธิบายอย่างซื่อสัตย์ว่าคุณเป็นนักวิ่งแบบไหนและกำลังเล็งอะไรอยู่

ค่าใช้จ่ายต่อเดือนเท่าไร

เอเจนต์ทำงานบนซับสคริปชัน Claude ที่คุณมีอยู่แล้ว (Pro หรือ Max) จึงไม่มีคีย์ API ที่คิดเงินตาม token นอกจากนั้นคุณอาจอยากมีเครื่องเล็ก ๆ ที่เปิดตลอดเวลาไว้ถาม Strava ทุก 15 นาที ราวเดือนละ 5 ยูโรบน VPS หรือไม่เสียเลยถ้าใช้ Raspberry Pi คลัง Git แบบส่วนตัวนั้นฟรี เหลือแค่ Strava API ซึ่งต้องใช้ซับสคริปชันนักพัฒนาแบบเสียเงินมาตั้งแต่เดือนมิถุนายน 2026

ทำไมถึงใช้คลัง Git แทนฐานข้อมูล

เพราะประวัติกลายเป็นสิ่งที่อ่านได้ ทั้งโดยโค้ชและโดยคุณ ทุกเซสชันคือไฟล์ Markdown ทุกการเปลี่ยนแผนคือคอมมิตพร้อมเหตุผล เอเจนต์กลับไปอ่านสิ่งที่ตัวเองสั่งไว้เมื่อสามสัปดาห์ก่อนแล้วตรวจดูว่ามันได้ผลไหมได้ ส่วนคุณก็อ่านแผนบนมือถือผ่านแอป GitHub โดยไม่ต้องเขียนโค้ดหน้าจอสักบรรทัด

webhook คืออะไร อธิบายแบบง่าย ๆ

webhook คือบริการที่โทรหาคุณ แทนที่คุณจะต้องโทรหามัน แทนที่จะคอยถามทุกห้านาทีว่ามีอะไรใหม่ไหม คุณยื่นที่อยู่เว็บให้โปรแกรมหนึ่ง แล้วมันจะส่งข้อความมาหาคุณเองเมื่อเหตุการณ์เกิดขึ้น ในที่นี้ สคริปต์ที่นำเข้าเซสชันเป็นตัวส่งข้อความนั้นไปยัง AgentsRoom ซึ่งจะเปิดเอเจนต์ Claude ขึ้นมาภายในวินาทีเดียว และนี่ก็เป็นเหตุผลที่ทำให้ชุดนี้ประหยัดด้วย เอเจนต์ที่คอยวนถามจะเผา token ทุกรอบ ส่วนทริกเกอร์ webhook ไม่เสียอะไรเลยจนกว่าจะมีอะไรเกิดขึ้น

ใช้กับกีฬาอื่นที่ไม่ใช่การวิ่งได้ไหม

ได้ การนำเข้าจะประกอบรอบจากนาฬิกาขึ้นมาใหม่ และทั้งจักรยานและว่ายน้ำก็บันทึกรอบเหมือนกัน สิ่งที่เปลี่ยนคือไฟล์กลยุทธ์และแคตตาล็อกเซสชัน ซึ่งเป็นข้อความที่คุณเขียนใหม่เองได้ กลไก (นำเข้า, webhook, เอเจนต์, คลัง) ไม่ขยับ

เอเจนต์พลาดแล้วทำแผนของผมพังได้ไหม

มันพลาดได้ แต่ทำพังได้ไม่มาก เพราะทุกอย่างที่มันเขียนคือคอมมิต Git ที่คุณอ่านได้ เถียงได้ และย้อนกลับได้ ไฟล์ CLAUDE.md ห้ามมันอย่างชัดเจนไม่ให้เขียนประวัติทับ ไม่ให้กุข้อมูลที่คุณไม่ได้ให้ ไม่ให้เปลี่ยนแผนโดยไม่บันทึกเหตุผล และไม่ให้ให้คำแนะนำทางการแพทย์ ถ้าเจ็บผิดปกติ มันจะส่งคุณไปหาผู้เชี่ยวชาญ


คลังต้นแบบอยู่ที่นี่: AgentsRoomDev/running-performance-coach clone มา เติมเพซของคุณลงไป แล้วคุณก็มีโค้ชของตัวเอง ถ้าอยากดูชิ้นส่วนที่ปลุกเอเจนต์ มันอธิบายไว้ในหน้า ทริกเกอร์ webhook และ ดาวน์โหลด AgentsRoom ได้ที่นี่

ดาวน์โหลด AgentsRoom

รันเอเจนต์ AI ทั้งหมดของคุณในทุกโปรเจกต์ จากหน้าต่างเดียว

ฟรีดาวน์โหลด AgentsRoom

แอปคู่หู: ตรวจสอบเอเจนต์ของคุณได้ทุกที่

นำของคุณเอง: Claude, Codex, Antigravity CLI, หรือผู้ให้บริการ AI อื่น ๆ

รับส่วนขยาย
Chrome Web Store

ส่งข้อบกพร่องและคำขอไปยังแบ็คล็อกสาธารณะของคุณโดยตรง

มองเห็น AgentsRoom ในการทำงาน

หลายโปรเจกต์
ผู้ให้บริการหลายราย
หลาย agents
สถานะสด
ไฟล์ diff & commit
คู่หูมือถือ
ตัวอย่างสด
ทีมเอเจนต์
การทำงานอัตโนมัติในเบราว์เซอร์
การพัฒนาที่ขับเคลื่อนด้วย backlog
ห้องสมุดคำสั่ง
ห้องสมุดทักษะ
ดูฟีเจอร์ทั้งหมด

อ่านต่อ