Memory Lake · ARRA × Relic5 · ภาค 1

AI จำได้ยังไง
ทุกอย่างเริ่มจากไฟล์ JSONL ที่ harness เขียน

อาทิตย์ 15 พ.ย. 2569 · Phone Booth Cider & Co. นางเลิ้ง

ปัญหาที่ทุกคนเจอ

model ไม่มีความจำ ความจำอยู่ในไฟล์ที่ harness เขียนไว้

Harness คืออะไร

model (Claude, GPT) รับ text แล้วตอบ text เท่านั้น ส่วน harness (Claude Code, Codex CLI) คือโปรแกรมที่วน loop รอบ model:

คนพิมพ์ prompt→ model คิด→ ขอใช้ tool
tool_use
→ harness รัน tool จริง→ ส่งผลกลับ
tool_result
↺

ไฟล์อยู่ที่ไหน

# 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) เช้าวันนี้

107,599
ไฟล์ .jsonl ใน ~/.claude/projects
60 GB
ใน 2,270 project folders
5,338
ไฟล์ Codex rollout

1 บรรทัด = 1 event

JSONL คือ JSON หนึ่งก้อนต่อหนึ่งบรรทัด ทุกบรรทัดมี type นับจาก session ที่ทำสไลด์นี้:

typeจำนวนคืออะไร
attachment81ของที่ harness แนบเข้า context
assistant49model ตอบ / คิด / ขอ tool
user30คนพิมพ์ หรือ ผล tool
api-request*58รูปร่าง request ที่ส่งไป API
system4hook, compact, error
ai-title · mode · …90metadata ของ session
file-history-*4snapshot ไฟล์ก่อนแก้
ข้อความที่คุยกันจริงเป็นแค่ user + assistant
ที่เหลือคือบันทึกการทำงานของ harness

ลองเองได้:

jq -r .type ~/.claude/projects/*/<uuid>.jsonl \
  | sort | uniq -c | sort -rn

กายวิภาคของ 1 บรรทัด

{
  "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อยู่ในมีอะไร
textuser / assistantข้อความที่อ่านได้
thinkingassistantความคิดก่อนตอบ
tool_useassistantid, name, input
tool_resultusertool_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\":…"}]}
จับคู่ด้วย id: tool_use.id = tool_result.tool_use_id · และผล tool ถูกบันทึกเป็น role user

parentUuid ต่อกันเป็นต้นไม้ ไม่ใช่ list

type       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]

Codex เก็บอีกแบบ

# ~/.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 CodeCodex
จัดไฟล์ตามfolder (cwd)วันที่
ข้อมูล sessionซ้ำทุกบรรทัดsession_meta บรรทัดแรก
ข้อความmessage.content[]response_item.payload
ลำดับต้นไม้ parentUuidเรียงตามบรรทัด

สองแบบ คนละ schema แต่ข้อมูลเป็นเรื่องเดียวกัน: prompt, คำตอบ, tool, ผล tool

relic5: ทำให้ JSONL ทุกเครื่องค้นได้ที่เดียว

~/.claude
~/.codex
→ relic-scan
หาไฟล์ใหม่
→ relic-extract
แยกเป็น text · thinking · tools · meta
→ relic5-push
ทุก 10–30 นาที
→ hub
BM25 (ตัดคำไทย ICU)
+ vector embeddinggemma-300m
→ CLI สำหรับคน
MCP สำหรับ AI
73,130
sessions ใน hub
1.23 M
แถวข้อความ (text)
2.61 M
แถว tool call

ตัวเลขจาก relic5 status เช้านี้ · แหล่งข้อมูล: m5, mba, white + import เก่า

สิ่งที่ต้องจำจากภาคนี้

ความจำของ AI คือไฟล์ที่เราเป็นเจ้าของ ไม่ได้อยู่ใน model

ระวังก่อนแชร์

ต่อไป → ภาค 2: ลงมือค้นของตัวเอง