Harness คือระบบที่ห่อ Model
เวลาใช้ AI Model เดิมทีเราจะโฟกัสที่ Model ตัวไหนเก่งกว่ากัน แต่จริง ๆ แล้วมันมีส่วนอื่นที่ไม่ใช่ Model ด้วยเช่นกัน ที่ทำให้ AI เก่งขึ้น
Model ทำหน้าที่ประมวลผล Context แล้วสร้างคำตอบหรือตัดสินใจว่าจะทำอะไรต่อ ส่วน Harness คือระบบรอบ ๆ ที่กำหนดว่า Model จะเห็นอะไร หยิบเครื่องมืออะไรได้ จำอะไรไว้ และถูกห้ามไม่ให้ทำอะไร — ทั้ง Instruction, Tool, Memory และขอบเขตของ Agent
ของที่เราเติมเข้าไปใน Harness ได้เองมีหลายแบบ เช่น
- Rule — Instruction ที่ Harness ใส่เข้า Context ให้ Agent ทำตาม จะใส่ทุก Chat หรือเฉพาะงานที่เกี่ยวข้องก็ได้ ใช้กำหนด Coding Style หรือข้อห้าม ตอนนี้ Cursor, Claude Code และ Codex อ่าน
AGENTS.mdได้เหมือนกัน นอกจากนั้นแต่ละเจ้ายังมีที่เก็บของตัวเอง เช่น.cursor/rules/ของ Cursor หรือCLAUDE.mdของ Claude Code - Hook — Script ที่ Harness รันเองตาม Event เช่น ก่อนหรือหลัง Agent ใช้เครื่องมือ หรือตอนจบ Turn ทำงานทุกครั้งเอง โดยไม่พึ่ง Model
- Skill — เพิ่ม “ความรู้” ให้ Agent เป็น File Markdown ที่บอกว่างานแบบนี้ต้องทำขั้นตอนไหน ระวังอะไร ตอนเริ่ม Harness ใส่แค่ชื่อกับคำอธิบายสั้น ๆ ไว้ใน Context แล้ว Agent ค่อยเปิดอ่านเต็มเมื่องานตรงกับ Skill นั้น หรือเราเรียกใช้ Skill เองได้ โดยใช้
/แล้วตามด้วยชื่อสกิลใน Agent Chat - MCP (Model Context Protocol) — เพิ่ม “มือ” ให้ Agent คือเครื่องมือเสริมที่ติดตั้งเพิ่มได้ ทำให้ Agent ทำงานนอก Chat ได้ เช่น ค้น Docs, ต่อ Database หรือสั่ง Browser
บทความนี้จะเล่า Harness ที่ผมใช้จริงบน Cursor
Harness ของผม
ภาพด้านล่างนี้คือรูปหน้าที่ อ่านจากบนลงล่างได้ แต่ไม่ใช่ท่อที่ Prompt ทุกข้อความต้องเดินผ่านตามลำดับ กล่องซ้ายคือหน้าที่ ชื่อสีเขียวด้านขวาคือเครื่องมือที่ผมเลือกให้รับหน้าที่นั้น

Skills กับ MCP ไม่ได้เป็นกล่องในนี้ เพราะ Agent เรียกสองอันนี้ได้ตลอดทาง
เริ่มที่ Your prompt — ข้อความที่เราพิมพ์ ชั้นด้านล่างคือหน้าที่ที่ Harness รับต่อจากข้อความนั้น ไม่ได้ทำงานครบทุกชั้นทุกครั้ง
Indexing Codebase
ปัญหาแรกที่เจอทันทีที่เปิด Repo ขนาดกลางขึ้นไป คือ Agent อ่านทุก File ไม่ไหว Context Window มีขนาดจำกัด ถ้าโยนทั้ง Repo เข้าไป Token เต็มก่อนได้ทำงานจริง และถ้าไม่โยนอะไรเลย Agent ก็ต้องเดาว่า Code ที่เกี่ยวอยู่ตรงไหน
ชั้นนี้ของผมคือ Cursor index — Cursor ทำสารบัญของ Repo ไว้ให้ในเครื่อง พอเราถามอะไร Agent ก็ค้นจากสารบัญนี้แล้วเปิดอ่านเฉพาะ File ที่เกี่ยว ผมไม่ต้องลาก File มาวางใน Chat เอง ส่วน File ที่ไม่อยากให้ Agent เห็น ก็กันไว้ได้ด้วย .cursorignore
ลองนึกภาพไม่มีชั้นค้นหา เราถามว่า “หน้า Checkout คำนวณส่วนลดอยู่ตรงไหน” Agent อาจต้องไล่โครงสร้างโฟลเดอร์ เดาชื่อ File แล้วเปิดอ่านไปเรื่อย ๆ พอมี Index และเครื่องมือค้นหา มันมีโอกาสเจอ File ที่เกี่ยวข้องเร็วขึ้น แล้วค่อยเปิดอ่านเฉพาะตัวนั้น
ชั้นนี้มักถูกมองข้าม เพราะมันมากับ Editor ไม่ต้องลงเพิ่ม Cursor สร้างและอัปเดต Index อยู่เบื้องหลัง แล้ว Agent ใช้ Index ร่วมกับเครื่องมือค้นหาตอนทำงาน แทนที่จะเดาว่า Code อยู่ File ไหนอย่างเดียว
Orient in the Codebase
Index และ Search ช่วยหา Code ที่เกี่ยวกับคำถาม รวมถึงค้น Reference แบบข้อความได้ แต่ไม่ได้รับประกัน Dependency หรือ Impact Analysis ที่ครบว่า “ถ้าแก้ Function นี้ อะไรจะพังบ้าง” ความสัมพันธ์ข้าม File — ใครเรียกใคร Module ไหนผูกกับ Module ไหน — ยังต้องถูกค้นและประกอบเป็นภาพอีกที
ผลคือ Agent เปิดอ่าน File ทีละตัว Grep ไล่ชื่อ แล้วค่อยต่อภาพเอง ซึ่งเปลือง Token และพลาดง่าย โดยเฉพาะตอน Refactor ที่ต้องรู้ว่ามีใครเรียกของที่กำลังแก้อยู่บ้าง
ชั้นนี้ผมใช้ graphify มันสร้าง Knowledge Graph ของ Codebase ไว้ใน Repo — Node คือ File, Function, Class หรือแนวคิดจาก Docs, มีเส้นความสัมพันธ์ ทั้งที่อ่านได้จาก Code และที่อนุมานเพิ่ม สำหรับ Cursor คำสั่ง graphify cursor install เขียน Rule แบบ alwaysApply ให้ถาม Graph ก่อน Read หรือ Grep Rule จึงถูกใส่เข้า Context ทุกครั้ง แต่ยังเป็น Instruction ที่ Model อาจไม่ทำตาม
ชั้นเดียวกันนี้มีตัวเลือกชื่อ codebase-memory-mcp เป็น Knowledge Graph อีกตัว ผมไม่ได้ใช้ เพราะผมใช้ graphify อยู่แล้ว
ผลลัพธ์เล็กกว่าการไล่อ่าน File ดิบมาก และได้ภาพความสัมพันธ์ที่ Grep หาให้ไม่ได้ พอแก้ Code เสร็จ graphify update อ่าน Code ใหม่แล้วอัปเดต Graph ให้เอง
Manage Context
พอ Agent เริ่มทำงานจริง ปัญหาถัดไปคือผลลัพธ์ของเครื่องมือมักยาวกว่าคำตอบที่ต้องการ Log ยาวหลายพันบรรทัด, JSON จาก API, หน้าเว็บทั้งหน้า — Tool Result ที่เข้าบทสนทนาใช้ Context Window ด้วย Harness ส่วนใหญ่ ทั้ง Cursor, Claude Code และ Codex มีวิธีรับมือคล้ายกัน เช่น ตัด Output ให้สั้นลง แยกงานบางอย่างไป Subagent หรือย่อบทสนทนาเก่าเป็น Summary แต่รายละเอียดก็ยังหายระหว่างทางได้
ชั้นนี้คือ context-mode หลักคิดของมันคือของดิบอยู่ข้างนอก Model เห็นแค่สิ่งที่ต้องใช้ ตัวหลักเป็น MCP ที่ Agent เรียกใช้ ไม่ใช่ด่านที่ผลของทุกเครื่องมือถูกกรองให้อัตโนมัติ แต่มันมี Rule กับ Hook ช่วยดันให้ Agent เลือกใช้ ก่อนใช้เครื่องมืออย่าง Shell, Read, Grep และการดึงหน้าเว็บ Hook อาจชี้ให้เปลี่ยนไปใช้เครื่องมือของ context-mode หรือบล็อกเส้นทางที่มักคืนของก้อนใหญ่
ตัวอย่างคือถามว่า “มี Test ไหน Fail บ้าง” ถ้า Agent รัน Test ผ่าน Shell ตามปกติ Output ทั้งก้อนยังเข้า Context ถ้าเรียก context-mode ผลทั้งก้อนอยู่ข้างนอก แล้วค้นกลับมาแค่ชื่อ Test ที่ Fail กับ Error ไม่กี่บรรทัด
Shell Compression
ในบรรดา Output ทั้งหมด Shell พ่นของออกมาเยอะที่สุด git log, pnpm install, Test Runner, Build Logs — คำสั่งพวกนี้พิมพ์ของออกมาเยอะ แต่ส่วนที่มีความหมายจริง ๆ มักเป็นไม่กี่บรรทัด
ชั้นนี้คือ RTK มันต่อเข้ากับ Cursor เป็น Hook ที่ทำงานก่อน Agent รัน Shell ทุกครั้ง Hook เขียนคำสั่งที่มันรู้จักใหม่ ให้วิ่งผ่าน RTK ก่อน เช่น git status กลายเป็น rtk git status ผลที่กลับเข้า Context จึงสั้นลงตั้งแต่ต้นทาง คำสั่งที่ RTK ไม่รู้จักผ่านไปตรง ๆ ไม่ถูกบีบ
ความดีของการเป็น Hook คือ Agent ไม่ต้องจำว่าต้องใช้ มันไม่ได้ขึ้นกับว่า Model จะทำตาม Instruction หรือเปล่า Shell Tool Call ของ Agent ผ่าน Hook นี้ก่อนรัน ต่างจาก Rule ที่เป็นแค่คำขอ Model อาจลืมหรือเลือกไม่ทำตามก็ได้
RTK กับ context-mode เสริมกัน แต่คนละกลไก RTK เขียนคำสั่งที่มันรู้จักใหม่ก่อนรัน ให้ Output ที่กลับมาสั้นลงโดย Agent ไม่ต้องทำอะไร ส่วน context-mode เก็บของดิบไว้นอก Context เมื่อ Agent เรียกเครื่องมือของมัน
Constrain the Diff
ชั้นก่อนหน้านี้ดูแลสิ่งที่ Agent เห็น ชั้นนี้ดูแลสิ่งที่ Agent ทำ
Agent ชอบเขียน Code เกินกว่าที่งานต้องการ ขอแก้ Bug หนึ่งจุด ได้ Abstraction ใหม่, Helper ใหม่, Config ใหม่ และ Test Framework อีกชุด ทุกบรรทัดที่เกินคือบรรทัดที่เราต้อง Review และดูแลต่อ
ชั้นนี้คือ ponytail มันให้ Agent คิดแบบ Senior ขี้เกียจ — ขี้เกียจแบบมีประสิทธิภาพ ไม่ใช่มักง่าย ก่อนเขียนอะไรให้ไล่บันไดทีละขั้น
- Does this need to be built at all? (YAGNI)
- Does it already exist in this codebase? Reuse the helper, util, or pattern that’s already here, don’t re-write it.
- Does the standard library already do this? Use it.
- Does a native platform feature cover it? Use it.
- Does an already-installed dependency solve it? Use it.
- Can this be one line? Make it one line.
- Only then: write the minimum code that works.
แต่มันไม่ได้ขี้เกียจทุกเรื่อง Input Validation, Security, Accessibility และการเข้าใจปัญหาให้จบก่อนลงมือยังต้องทำเต็มที่ ส่วนทางลัดที่ตั้งใจตัดจริง ๆ ให้ทิ้ง Comment ponytail: ไว้ บอกว่าเพดานอยู่ตรงไหนและจะขยายยังไง
ในงานของผม ผลคือ Diff สั้นลงและ Review ง่ายขึ้น นี่เป็นสิ่งที่ผมเห็นจากการใช้ชุดนี้ ไม่ใช่ตัวเลข Benchmark ของ Tool
Output Style
ชั้นสุดท้ายในรูปคือคำตอบที่ Agent พิมพ์กลับมา คำตอบยาวขึ้นเองได้เสมอ — คำเกริ่น คำขอโทษ การสรุปซ้ำสิ่งที่เราเพิ่งพูด ทุกคำใช้ Token และใช้เวลาอ่าน
ชั้นนี้คือ caveman มันบีบวิธีพูดของ Agent ให้เหลือแต่สาระ ตัดคำฟุ่มเฟือยออก เก็บศัพท์เทคนิคไว้ครบ Code ไม่ถูกแตะ มีหลายระดับให้เลือกตั้งแต่เบาไปจนถึงสั้นสุด
ที่ผมชอบคือมันรู้จังหวะ ถ้าเป็นคำเตือนเรื่อง Security หรือการกระทำที่ย้อนกลับไม่ได้ มันจะกลับมาพูดเต็มประโยคให้ชัดก่อน แล้วค่อยกลับไปสั้นเหมือนเดิม
Skills
Skills คือชุดคำแนะนำที่ Agent หยิบมาอ่านเมื่องานตรงกับ Skill นั้น เป็น File Markdown ที่บอกขั้นตอน ข้อควรระวัง และบางตัวมี Script แนบมาด้วย จุดสำคัญคือมันไม่ใช่ขั้นที่ Prompt ผ่านครั้งเดียว Agent เรียกได้ตลอดทาง — ตอนเริ่มงาน ตอนติดปัญหา หรือตอนจะส่งงาน
Agent รู้ได้ยังไงว่าควรหยิบ Skill ไหน — ทุก Skill มีคำอธิบายสั้น ๆ บอกว่าใช้เมื่อไหร่ Harness ใส่แค่คำอธิบายพวกนี้ไว้ใน Context ตัวเนื้อหาเต็มถูกอ่านเมื่องานตรงเท่านั้น
ถ้าไม่อยากรอให้ Agent เลือกเอง เราก็เลือก Skill ได้เอง โดยพิมพ์ / แล้วเลือกชื่อ Skill ใน Agent Chat เช่น /ponytail Cursor จะแนบ Skill นั้นเข้า Turn และ Agent จะอ่าน SKILL.md เต็ม
ตัวอย่างที่อยู่ในรูปแล้วคือ graphify, ponytail และ caveman ทั้งสามตัวเป็น Skill และในเครื่องผมมี Rule คู่กันให้ติดเข้า Context ทุกครั้งด้วย Rule ยังเป็นคำขอ Model อาจไม่ทำตาม
Skill ทั้งหมดที่ติดตั้งไว้ในเครื่องตอนนี้:
- ponytail — ชุด Skill ลดการเขียน Code เกินจำเป็น
- caveman — ให้ Agent ตอบสั้น
- graphify — Knowledge Graph ของ Codebase
- Impeccable — แนวทาง Design ไม่ให้ UI ออกมาแบบ Generic
- emilkowalski/skills — Design Engineering และ Animation
- mattpocock/skills — Engineering ทั่วไป เช่น TDD, Code Review, Debug
- cloudflare/skills — Cloudflare Workers, Wrangler และ Web Performance
- vercel-labs/agent-skills — React Best Practices
- wshobson/agents — TypeScript Advanced Types
- ccheney/robust-skills — DDD และ Clean Architecture
- watch — ให้ Agent ดู Video จาก URL หรือ File ในเครื่อง
- power-design — ทำ Slide ด้วยหลัก Design
- Superpowers — Workflow ตั้งแต่ Brainstorm, เขียน Plan จนถึง Execute และ Review
- Tavily — Search, Extract และ Research จากเว็บ
- Context7 — ดึง Docs ของ Library ล่าสุด
- MongoDB — Schema Design, Query และ Connection
- Firebase — Auth, Firestore, Hosting และบริการอื่นของ Firebase
MCP
MCP (Model Context Protocol) คือชั้นที่ให้ Agent ใช้เครื่องมือนอก Chat ได้ — ค้น Docs, ต่อ Database หรือสั่ง Browser
ข้อดีของการมี Protocol กลางคือ Server ตัวเดียวมีโอกาสใช้กับ Agent ได้หลายเจ้า Cursor, Claude Code และ Codex รองรับ MCP เหมือนกัน
MCP ทั้งหมดที่ติดตั้งไว้ในเครื่องตอนนี้:
- context-mode — เก็บ Output ยาว ๆ ไว้นอก Context แล้วค้นกลับมาได้
- Astro Docs MCP — ค้น Docs ของ Astro
- After Effects MCP — สั่งงาน After Effects
- Blender MCP — สั่งงาน Blender
- Cloudflare MCP — ค้น Docs และจัดการ Account ของ Cloudflare
- Datadog MCP — ค้น Log, Trace และ Metric
- MongoDB MCP — Query และดู Schema ของ Database
- Notion MCP — อ่านและเขียนหน้า Notion
- Next DevTools MCP — Docs และเครื่องมือ Debug ของ Next.js
- Unity MCP — สั่งงาน Unity Editor
- Firebase MCP — จัดการ Project และ Database ของ Firebase
- Wallaby MCP — ดูผล Test และ Coverage แบบ Realtime
สรุป
- Model ให้เหตุผล และ Harness คือทุกอย่างที่ห่อ Model
- Cursor, Claude Code และ Codex มี Harness ทั้งชุด งานคล้ายกัน และใช้ MCP ร่วมกันได้ แต่ไม่ใช่ระบบเดียวกันที่เปลี่ยนแค่ชื่อ
- ชุดของผมมี Cursor index, graphify, context-mode, RTK, ponytail และ caveman ส่วน Skills กับ MCP เรียกได้ตลอดทาง ไม่ได้เรียงเป็นท่อที่ทุก Prompt ต้องเดินครบ
- แต่ละชั้นมีไว้แก้ปัญหาเดียว ถ้ายังไม่เจอปัญหานั้น ก็ยังไม่ต้องใส่