Claude Code Harness Foundations
Sessions and transcripts
อธิบายว่า session ถูกบันทึกเป็น transcript ไฟล์ JSONL บนดิสก์ของคุณอย่างไร จึงกลับมาอ่านได้ และทำไมสิ่งที่คุณแปะใน session จึงต้องตัดสินใจก่อนแปะ
1) จุดสับสน: ปิด terminal แล้วบทสนทนายังกลับมา — และสิ่งที่คุณแปะไว้ก็ยังอยู่
เย็นวันศุกร์คุณเปิด session ในโฟลเดอร์ shop-api คุยกับ Claude เรื่องการแก้ validation ของ `POST /orders` ไปได้ครึ่งทาง แล้วปิด terminal กลับบ้าน เช้าวันจันทร์คุณเปิด terminal ที่โฟลเดอร์เดิมและเริ่ม Claude Code อีกครั้ง บทสนทนาเดิมกลับมาพร้อมบริบทที่คุยค้างไว้ ทั้งที่คุณไม่ได้บันทึกอะไรไว้เอง และเครื่องก็ไม่ได้เปิดค้างตลอด weekend คำถามคือบทสนทนานั้นถูกเก็บไว้ที่ใด และทำไมมันกลับมาได้ ถ้า harness อ่านมันกลับมาได้ มันก็ต้องมีที่เก็บที่อ่านซ้ำได้ — ไม่ใช่ความจำในตัวโมเดล เพราะบทที่แล้วเพิ่งอธิบายว่าทุก session เริ่มจาก context ที่ประกอบใหม่ และไม่มีอะไรถูกเก็บไว้ในตัวโมเดลข้าม session อีกด้านของคำถามเดียวกัน: ระหว่าง debug คุณแปะ connection string ที่มีรหัสผ่านของ staging ลงใน session แล้วบอกตัวเองว่า "เดี๋ยวพอแก้เสร็จก็หายไปเอง" — แต่ถ้าบทสนทนาถูกเก็บไว้จริง ข้อความนั้นก็ยังอยู่ที่ใดที่หนึ่งหลังการแก้เสร็จ ทั้งสองอาการชี้ไปที่กลไกเดียวกัน: session ถูกบันทึกเป็น transcript และ transcript คือไฟล์บนเครื่องของคุณ บทนี้จะอธิบายกลไกนั้นก่อน แล้วจึงไปดูว่ามันถูกเรียกอะไรและอยู่ที่ใด
2) Mental model: session คือบทสนทนาที่ผูกกับโปรเจกต์ และ transcript คือไฟล์ที่ harness เขียน
เริ่มจากแยกสองคำที่มักถูกใช้ปนกัน **session** คือบทสนทนาหนึ่งบทที่ผูกกับ project directory หนึ่งโฟลเดอร์ มันคือหน่วยที่คุณกลับเข้าไปได้ ตั้งชื่อได้ แยกสาขาได้ และเป็นหน่วยที่ harness เก็บสถานะอื่น ๆ ของการทำงานไว้ด้วย **transcript** คือไฟล์ที่ harness เขียนบทสนทนานั้นลงไประหว่างที่คุณทำงาน เก็บเป็นข้อความรูปแบบ JSONL — หนึ่งบรรทัดต่อหนึ่งเหตุการณ์: คำสั่งของคุณ คำตอบของ Claude การเรียกเครื่องมือ ผลลัพธ์ของเครื่องมือ และข้อมูลประกอบของแต่ละเหตุการณ์ ทำไมต้องเป็นไฟล์บนดิสก์ของคุณ เพราะ persistence เป็นงานของ harness ไม่ใช่ของโมเดล โมเดลผลิตข้อความเท่านั้น ถ้าอยากให้บทสนทนากลับมาอ่านได้อีก harness ก็ต้องเขียนมันลงที่ที่อ่านซ้ำได้ และการเขียนลงดิสก์คือกลไกที่ตรงไปตรงมาที่สุด: ปิดโปรแกรมไม่ลบไฟล์ เปิดใหม่แล้วอ่านต่อได้ ผลที่ตามมาสำคัญกว่าชื่อเรียก: เพราะ transcript เป็นไฟล์ มันจึงตรวจสอบได้ ย้ายได้ ลบได้ และมีอายุจำกัด และเพราะทุกอย่างที่คุณพิมพ์กลายเป็นบรรทัดในไฟล์นั้น คำถามว่า "แปะอะไรลงใน session ได้" จึงเป็นคำถามเรื่องข้อมูลที่ตกค้างบนเครื่อง ไม่ใช่คำถามเรื่องความจำของโมเดล
แยกสามคำก่อนใช้
Session
บทสนทนาหนึ่งบทที่ผูกกับ project directory — หน่วยที่คุณกลับเข้าไป ตั้งชื่อ และแยกสาขาได้
Transcript
ไฟล์ JSONL ที่ harness เขียนเหตุการณ์ของ session ต่อท้ายไปเรื่อย ๆ บนดิสก์ของคุณ — หนึ่งบรรทัดต่อหนึ่งเหตุการณ์
กลไกที่อ่าน transcript กลับ
การกลับเข้า session เดิม การย้อนสถานะ และการแยกสาขาบทสนทนา ต่างอ่านจากไฟล์เดียวกัน จึงใช้ได้เฉพาะเมื่อไฟล์นั้นยังอยู่ ไม่ใช่เพราะโมเดลจำได้
3) กลไก: harness เขียนอะไรลง transcript และอะไรอ่านมันกลับ
ในหนึ่ง session สิ่งที่ถูกเขียนลง transcript ไม่ได้มีแค่คำพูด ตัวอย่างจาก shop-api: คุณสั่งให้ Claude แก้ validation ของ `POST /orders` แล้วรัน `pnpm test` ลำดับเหตุการณ์ที่ถูกบันทึกจะหน้าตาคล้ายนี้ prompt ของคุณ → การอ่านไฟล์ของ Claude → การแก้ `src/routes/orders.ts` → คำสั่ง Bash ที่รัน → ผลลัพธ์ของเทสต์ → คำตอบสรุปของ Claude แต่ละบรรทัดเป็น JSON object ที่สมบูรณ์ในตัวเอง สิ่งที่ต้องรู้คือรูปแบบภายในของไฟล์เป็นเรื่องของ Claude Code เองและเปลี่ยนได้ระหว่างรุ่น เอกสารจึงแนะนำให้อ่าน transcript ผ่านช่องทางที่ออกแบบมา เช่นการ export เป็นข้อความที่มนุษย์อ่านได้ แทนการเขียนสคริปต์แกะไฟล์ดิบ แล้วอะไรอ่าน transcript กลับ สามกลไกที่คุณจะเจอบ่อยคือการกลับเข้า session เดิม การย้อนสถานะของ session และการแยกสาขาบทสนทนา ทั้งสามอย่างอ่านจากไฟล์เดียวกัน นี่คือเหตุผลว่าทำไมปิด terminal แล้วกลับมาได้ และทำไมลบไฟล์ทิ้งแล้วประวัติหาย สองค่าที่ควบคุมไฟล์นี้คือที่เก็บ ซึ่งย้ายได้ผ่าน environment variable และอายุ ซึ่ง harness จัดการตามรอบ retention ทั้งคู่เป็นค่าที่ตั้งได้และเปลี่ยนได้ จึงรวมไว้ในตารางด้านล่างพร้อมวันที่ตรวจสอบ
| ข้อเท็จจริงที่เปลี่ยนได้ | สิ่งที่ตรวจสอบล่าสุด | เอกสารเจ้าของ |
|---|---|---|
| ที่เก็บ transcript | `~/.claude/projects/<project>/<session-id>.jsonl` โดย `<project>` มาจาก path ของ working directory ที่แทนอักขระที่ไม่ใช่ตัวอักษรหรือตัวเลขด้วย `-` | https://code.claude.com/docs/en/sessions |
| รูปแบบไฟล์ | JSONL — หนึ่ง JSON object ต่อบรรทัด (ข้อความ, การเรียกเครื่องมือ, ผลลัพธ์, metadata); รูปแบบภายในเปลี่ยนได้ระหว่างรุ่น เอกสารแนะนำให้ใช้ `/export` แทนการแกะไฟล์เอง | https://code.claude.com/docs/en/sessions |
| กลับเข้า session เดิม | `claude --continue` (session ล่าสุดในโฟลเดอร์ปัจจุบัน), `claude --resume` (เปิด session picker), `claude --resume <session-id>` หรือ `/resume` จากใน session | https://code.claude.com/docs/en/sessions |
| ส่งออกบทสนทนา | `/export` เปิดเมนูคัดลอกหรือบันทึกเป็นไฟล์ข้อความที่อ่านได้ | https://code.claude.com/docs/en/sessions |
| อายุของ transcript | ถูกลบในรอบ retention ค่าเริ่มต้นประมาณ 30 วันหลัง session บันทึกล่าสุด ปรับได้ด้วย `cleanupPeriodDays` ใน `settings.json` | https://code.claude.com/docs/en/sessions |
| ย้ายที่เก็บ | ตั้ง `CLAUDE_CONFIG_DIR` (environment variable) เพื่อย้ายที่เก็บ transcript ออกจาก `~/.claude` | https://code.claude.com/docs/en/sessions |
| หยุดเขียน transcript | ตั้ง `CLAUDE_CODE_SKIP_PROMPT_HISTORY` (environment variable) หรือใช้ `--no-session-persistence` กับ `claude -p` หนึ่งรัน | https://code.claude.com/docs/en/sessions |
| ตรวจสอบล่าสุด: 2026-09-23 · https://code.claude.com/docs/en/sessions |
สรุปเชิงกลไก: transcript คือหลักฐานถาวรของ session บนเครื่องนี้ ข้อเท็จจริงนี้บอกว่าไฟล์อยู่ที่ใดและเก็บสิ่งที่พิมพ์ไว้อย่างไร แต่ไม่ได้ยืนยันเรื่องการเข้ารหัสหรือการส่งข้อมูลไปที่อื่น ซึ่งเป็นคนละคำถามและต้องดูเอกสารเจ้าของเรื่องนั้นโดยตรง สิ่งที่คุณใช้ตัดสินใจได้ทันทีคือ: ทุกอย่างที่คุณพิมพ์กลายเป็นบรรทัดในไฟล์ที่อ่านได้ด้วยเครื่องมือทั่วไป และไฟล์นั้นมีอายุตามค่าที่ตั้งไว้
4) Contrast: session แบบ 'บริการที่จำได้' กับ session แบบไฟล์บนดิสก์ของคุณ
สองแบบจำลองด้านล่างอธิบาย session ว่า "จำได้" เหมือนกัน แต่พึ่งข้อเท็จจริงคนละอย่าง และนำไปสู่การตัดสินใจคนละชุด
สองแบบของคำว่า session
แบบซ้ายพึ่งความเชื่อว่า session อยู่ในความจำของบริการ แบบขวาพึ่งข้อเท็จจริงว่า session ถูกเขียนเป็นไฟล์บนเครื่อง แล้วตัดสินใจจากข้อเท็จจริงนั้น
ถ้าไม่รู้ว่า transcript อยู่ที่ใดและใครอ่านมัน ก็คาดเดาผลของการแปะข้อมูลหรือการลบไฟล์ผิดทั้งหมด
แบบจำลองที่ตรงกับกลไกทำให้คาดเดาได้ว่าอะไรจะอยู่ต่อ อะไรจะหาย และต้องตัดสินใจอะไรก่อนแปะข้อมูล
5) ตรวจความเข้าใจและก้าวต่อไป
ทดสอบความเข้าใจ: session และ transcript
ตอบคำถามต่อไปนี้เพื่อยืนยันว่าคุณแยก session ออกจาก transcript และตัดสินใจเรื่องข้อมูลใน session จากกลไกได้
อะไรทำให้ปิด terminal แล้วกลับเข้า session เดิมได้ในวันถัดมา
ตามกลไกของ transcript ข้อใดคือการตัดสินใจที่ถูกต้องก่อนแปะข้อมูลลับลงใน session
ข้อใดเป็นผลจากข้อเท็จจริงที่ว่า transcript เป็นไฟล์บนดิสก์ของคุณ (เลือกได้มากกว่าหนึ่งข้อ)
transcript ของแต่ละ session ถูกเก็บเป็นไฟล์ข้อความรูปแบบ ______ ที่มีหนึ่ง JSON object ต่อบรรทัด
ตอบเป็นตัวย่อภาษาอังกฤษ
- session คือบทสนทนาที่ผูกกับ project directory; transcript คือไฟล์ JSONL ที่ harness เขียนต่อท้ายบนดิสก์ของคุณ
- ปิด terminal ไม่ลบ transcript — การกลับเข้า session เดิม การย้อนสถานะ และการแยกสาขา อ่านกลับจากไฟล์นี้
- ทุกอย่างที่คุณพิมพ์กลายเป็นบรรทัดในไฟล์: ตัดสินใจก่อนแปะ และรู้ว่าไฟล์มีอายุตามค่าที่ตั้งไว้
- ก้าวต่อไป: บทถัดไปคือ Checkpoints and rewind ซึ่งจะพาไปรู้ว่า harness snapshot การแก้ไฟล์แยกจาก git อย่างไร และย้อนกลับได้แค่ไหน