อาทิตย์ 15 พ.ย. 2569 · Phone Booth Cider & Co. นางเลิ้ง
model (Claude, GPT) รับ text แล้วตอบ text เท่านั้น ส่วน harness (Claude Code, Codex CLI) คือโปรแกรมที่วน loop รอบ model:
tool_use→
harness รัน tool จริง→
ส่งผลกลับtool_result↺
stop_reason: "end_turn"# Claude Code ~/.claude/ ├── projects/ │ └── -Users-me-Code-myrepo/ ← cwd แปลง / เป็น - │ ├── <session-uuid>.jsonl ← 1 session │ ├── <session-uuid>/ │ │ ├── subagents/agent-*.jsonl │ │ └── tool-results/ ← ผลที่ยาวเกิน ├── history.jsonl ← ทุก prompt ที่พิมพ์ ├── file-history/ ← สำเนาไฟล์ก่อนแก้ └── settings.json · CLAUDE.md # Codex CLI ~/.codex/sessions/YYYY/MM/DD/ └── rollout-<time>-<uuid>.jsonl
วัดจริงบน Mac เครื่องหนึ่ง (m5) เช้าวันนี้
JSONL คือ JSON หนึ่งก้อนต่อหนึ่งบรรทัด ทุกบรรทัดมี type นับจาก session ที่ทำสไลด์นี้:
| type | จำนวน | คืออะไร |
|---|---|---|
attachment | 81 | ของที่ harness แนบเข้า context |
assistant | 49 | model ตอบ / คิด / ขอ tool |
user | 30 | คนพิมพ์ หรือ ผล tool |
api-request* | 58 | รูปร่าง request ที่ส่งไป API |
system | 4 | hook, compact, error |
ai-title · mode · … | 90 | metadata ของ session |
file-history-* | 4 | snapshot ไฟล์ก่อนแก้ |
user + assistantลองเองได้:
jq -r .type ~/.claude/projects/*/<uuid>.jsonl \ | sort | uniq -c | sort -rn
{
"type": "assistant",
"uuid": "a7c7d357-…", ← id ของบรรทัดนี้
"parentUuid": "0b2f28f3-…", ← บรรทัดก่อนหน้า (ต่อเป็นสาย)
"sessionId": "8b40978b-…", ← = ชื่อไฟล์
"timestamp": "2026-11-15T03:41:02Z",
"cwd": "~/…/laris-team", "gitBranch": "worktree/lucky-cloud",
"isSidechain": false, ← true = subagent
"message": {
"role": "assistant", "model": "claude-opus-5-5",
"content": [ … blocks … ],
"stop_reason": "tool_use",
"usage": { "input_tokens": 2, "cache_read_input_tokens": 17027,
"cache_creation_input_tokens": 36287, "output_tokens": 155 }
}
}
ตัวเลขใน usage เป็นของจริงจากบรรทัดหนึ่งเช้านี้: input จริงแค่ 2 token ที่เหลืออ่านมาจาก cache
content คือ list ของ block| block | อยู่ใน | มีอะไร |
|---|---|---|
text | user / assistant | ข้อความที่อ่านได้ |
thinking | assistant | ความคิดก่อนตอบ |
tool_use | assistant | id, name, input |
tool_result | user | tool_use_id, content |
// assistant ขอ {"type":"tool_use", "id":"toolu_01EGLt…", "name":"mcp__relic5__relic_search", "input":{"query":"workshop 15 พฤศจิกายน"}} // harness ตอบกลับในบรรทัด type:"user" {"type":"tool_result", "tool_use_id":"toolu_01EGLt…", "content":[{"type":"text","text":"{\"hits\":…"}]}
tool_use.id = tool_result.tool_use_id · และผล tool ถูกบันทึกเป็น role userparentUuid ต่อกันเป็นต้นไม้ ไม่ใช่ listtype uuid parent blocks user 2f987a6e 002f9eeb [string] assistant 0b2f28f3 14af2a65 [thinking] assistant a7c7d357 0b2f28f3 [tool_use] user 691180a1 a7c7d357 [tool_result] assistant 258ebb38 e6568f42 [tool_use] user 143bd43f 258ebb38 [tool_result]
parentUuid ย้อนกลับ = ได้บทสนทนาที่ model เห็นจริงsubagents/ โดยมี isSidechain: true# ~/.codex/sessions/2026/09/23/rollout-….jsonl {"type":"session_meta", "payload":{id, cwd, cli_version, model_provider, base_instructions…}} {"type":"turn_context", …} {"type":"response_item", "payload":{"type":"message"…}} {"type":"event_msg", …}
| Claude Code | Codex | |
|---|---|---|
| จัดไฟล์ตาม | folder (cwd) | วันที่ |
| ข้อมูล session | ซ้ำทุกบรรทัด | session_meta บรรทัดแรก |
| ข้อความ | message.content[] | response_item.payload |
| ลำดับ | ต้นไม้ parentUuid | เรียงตามบรรทัด |
สองแบบ คนละ schema แต่ข้อมูลเป็นเรื่องเดียวกัน: prompt, คำตอบ, tool, ผล tool
relic-scanrelic-extractrelic5-pushตัวเลขจาก relic5 status เช้านี้ · แหล่งข้อมูล: m5, mba, white + import เก่า
ต่อไป → ภาค 2: ลงมือค้นของตัวเอง