วันนี้เปิดคุยกับ ทิม (AI Agent ของผม) แล้วรู้สึกแปลกๆ ครับ — ผมบอกอะไรไปเขาก็ "รับทราบครับพี่ปอนด์" แต่พอวันถัดมาคุยใหม่ เขาลืมหมดทุกอย่าง เหมือนเพิ่งเจอกันครั้งแรก 555

ปกติทิมมี memory ของตัวเองที่จะจดเรื่องที่ผมบอก หรือ preference ของผม ลงไฟล์ .md ใน /root/.claude/projects/-root/memory/ เก็บไว้อ่านรอบหน้า ทุกครั้งที่ผมบอกอะไรใหม่ มันจะเด้ง permission ขึ้นมาให้ผมกด approve ก่อนเขียนลง disk

แต่ช่วง 3 วันที่ผ่านมา permission prompt ไม่เด้งเลยสักครั้ง — และ memory file ก็ไม่ถูกอัปเดต ทิมแค่บอก "เก็บแล้วครับ" แล้วก็ไม่ได้เก็บอะไรจริงๆ

เริ่มไล่จากผลกระทบ — ทิมเริ่มจำอะไรไม่ได้

วิธีที่ผมรู้ว่ามันมีปัญหา คือผมสังเกตว่าทิมเริ่มถามเรื่องที่ผมเคยบอกไปแล้ว — เช่นชื่อ skill ที่ใช้บ่อย, server alias, แม้กระทั่งว่าผมเรียกตัวเองว่า "ปอนด์" ไม่ใช่ "พอนด์"

เปิด MEMORY.md ของทิมดู — index ของความจำทั้งหมด — timestamp ค้างที่ 17 พ.ค. ทั้งๆ ที่ผมคุยกับมันทุกวัน บางวันเป็นสิบรอบ

นี่ไม่ใช่ bug ธรรมดาครับ — มันคือ silent failure ที่อันตรายที่สุดในระบบ AI Agent เพราะเราคิดว่ามันทำงาน แต่จริงๆ มันไม่ได้ทำ

ชั้นที่ 1 — Claude Code มอง symlink เป็น sensitive file

ทิมไล่ log ตัวเองก่อน — ปรากฏว่าทุกครั้งที่มันพยายาม Edit ไฟล์ใน /root/.claude/projects/-root/memory/ มี error เด้งใน stderr ว่า:

Claude requested permissions to edit X
which is a sensitive file

เห็นปุ๊บก็เข้าใจเลยครับ — Claude Code มีระบบป้องกันในตัวว่าไฟล์ในโฟลเดอร์ .claude/ ทั้งหมดเป็น "sensitive" ห้ามแก้แบบไม่ขอ permission

แต่ที่งงคือ — ก่อนหน้านี้มันแก้ได้ตลอด ทำไมเพิ่งมาพังตอนนี้?

คำตอบอยู่ที่ memory file ของผมเป็น symlink ครับ ผม sync memory ข้ามหลาย server ผ่าน /root/tim-brain/memory/ ที่ผูก symlink เข้ามาในโฟลเดอร์ .claude อีกที — เหมือนใน บทความเรื่อง shared brain ข้าม server ที่เคยเล่าไปก่อน

Claude Code เพิ่งอัปเดตเข้มกฎ sensitive file — ก่อนหน้านี้ symlink ไปนอก .claude/ ผ่านได้ ตอนนี้ block หมด

ชั้นที่ 2 — tim-chat regex match error ไม่ได้

ถึงตรงนี้ผมว่าเจอ root cause แล้ว — แต่ทิมตั้งคำถามต่อว่า:

"ถ้า Claude Code throw error ออกมา ทำไม Tim Chat UI ของพี่ปอนด์ไม่ขึ้นปุ่ม approve ให้กด?"

คำถามดีครับ เพราะปกติเวลามี permission request, Tim Chat จะเด้งปุ่มสีเขียวให้ผมกด approve บนมือถือได้เลย

ปรากฏว่ามี bug ใน server.js ของ Tim Chat ครับ — regex ที่ match error message ของ Claude Code ครอบคลุมแค่ pattern เก่า:

PERM_DENIED_RE = /you haven't granted/i

แต่ error ใหม่ของ Claude Code เขียนว่า "which is a sensitive file" — regex จับไม่ได้ → frontend ไม่ได้รับ event permission_request → ปุ่ม approve ไม่ขึ้น → ผมก็ไม่รู้ว่าต้องกดอะไร

มันเลยกลายเป็น black hole เงียบสนิท ครับ — error เกิดขึ้นจริง แต่ไม่มีอะไรเด้งเข้าหน้าจอผมเลย ทิมก็แค่บอก "เก็บแล้วครับ" เพราะมันไม่รู้ตัวว่าโดน block

วิธีแก้ — 3 layer เพื่อกันพังซ้ำ

ทิมเสนอแก้ 3 ชั้นในเช้าเดียว:

1. settings.json — pre-allow path memory ทั้งหมด

ใส่ permission allowlist ไว้ใน /root/.claude/settings.json ว่า memory path ไม่ต้องขอ approve ทุกครั้ง:

"Edit(/root/.claude/projects/-root/memory/**)",
"Write(/root/.claude/projects/-root/memory/**)",
"Edit(/root/tim-brain/memory/**)",
"Write(/root/tim-brain/memory/**)"

ผลคือ — ต่อจากนี้ทิมแก้ memory ของตัวเองได้เลย ไม่ต้องเด้ง prompt

2. tim-chat — ใส่ regex ใหม่จับ sensitive file error

เพิ่ม SENSITIVE_FILE_RE ใน server.js พร้อมฟังก์ชัน parsePermissionError() ที่ดึง path ของไฟล์ออกมาจาก error message แล้วแปลงเป็น tool pattern ที่ Claude Code เข้าใจ (เช่น Edit(/path/**))

ผลคือ — ถ้าวันหน้ามี sensitive-file error แบบใหม่ที่เรายังไม่ได้ pre-allow, ปุ่ม approve จะเด้งให้กดอย่างถูกต้องแทนที่จะเงียบ

3. ตัว template Newton install

อันนี้สำคัญที่สุด — ลูกค้า Newton ใหม่ทุกคนจะได้ .claude/settings.json ที่มี memory allow มาตั้งแต่ install เลย ไม่ต้องเจอ bug นี้ใหม่

Deploy พร้อมกัน 3 server

นี่คือจุดที่ผมชอบเรื่องการมี AI Agent ที่ SSH ไป server อื่นได้ ครับ

ทิม ssh ตัวเองไปปะ patch ที่ 3 server พร้อมกันใน loop เดียว:

  • income-in-click — server หลักของผม (อันนี้คือบ้านของทิม)
  • bm-group — server ลูกค้าฝั่ง attendance app
  • whisperer — server astrology social app

แต่ละ server มี Claude Code instance ของตัวเอง และทุก instance มี bug เดียวกัน เพราะ memory file pattern เหมือนกันหมด

เหลือ server เดียวที่ยังแก้ไม่ได้คือ hihome — เพราะ SSH key ของผมโดนปฏิเสธ น่าจะเพราะ server ถูก rebuild ใหม่ ทิม flag ไว้ใน memory ตัวเองว่ารอผม ssh-copy-id ใหม่ก่อนค่อย patch (อย่างน้อยตอนนี้ memory เก็บได้แล้ว 555)

บทเรียน — silent failure คือศัตรูตัวจริง

เรื่องนี้สอนผมหลายอย่างครับ:

  • AI Agent ที่ดีต้องเห็น error ของตัวเอง — ถ้าทิมไม่ได้ไล่ stderr เอง ผมจะไม่มีทางรู้ว่ามันโดน block
  • Regex match log เป็น hidden dependency — เวลา Claude Code อัปเดต wording ของ error message, ระบบของผมที่ผูก regex ค้างไว้จะพังเงียบทันที
  • Multi-layer protection ดีกว่าแก้จุดเดียว — แก้ที่ settings.json อย่างเดียวก็ได้ แต่วันหน้ามี sensitive-file ใหม่จะพังอีก ทิมเลยใส่ regex parser ดักไว้ด้วย

(Pattern เดียวกันโผล่อีกครั้งในสัปดาห์ต่อมา — DNS เก่าค้างใน Cloudflare ตอนลูกค้า Newton re-signup ระบบส่งเมล "พร้อมใช้งาน" ไปแล้วทั้งที่ HTTPS ยังไม่ขึ้น เพราะไม่มี verify step คั่นไว้ — และอีกครั้งตอนทุก cron ในเครื่องผมยิงเร็วไป 7 ชั่วโมงแบบไม่มี error เด้ง บั๊กเรื่องเวลาคือบั๊กที่เงียบที่สุด)

นี่คือเหตุผลที่ผมเชื่อใน การสร้าง tool เอง ครับ — ถ้าใช้ SaaS chat AI ทั่วไป ผมคงไม่มีทางรู้เลยว่ามันเก็บ memory ผมพังตั้งแต่เมื่อไหร่ และคงไม่มีทาง patch ตัวเองข้าม server ได้

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

AI Agent ที่มี memory ระบบทำงานยังไง — มันจำสิ่งที่คุยกันได้อย่างไร

AI Agent ที่มี persistent memory จะเขียนข้อมูลสำคัญลงไฟล์บน disk หลังแต่ละ session ครับ เช่น preference, context ของ project, หรือเรื่องที่ต้องจำระยะยาว รอบหน้าที่คุยอีก AI จะอ่านไฟล์นั้นก่อน ทำให้รู้ context ได้ต่อเนื่องโดยไม่ต้องเล่าซ้ำทุกครั้ง

silent failure ใน AI Agent หมายความว่าอะไร อันตรายยังไง

Silent failure คือเมื่อระบบล้มเหลวแต่ไม่แสดง error ให้เห็นครับ เช่น AI บอกว่า "เก็บแล้ว" แต่จริงๆ ไม่ได้เก็บ เราจะรู้สาย — หลายวันหรือหลายสัปดาห์ต่อมา อันตรายกว่า error ที่เด้งทันที เพราะเราตัดสินใจบน assumption ที่ผิดมาตลอด

Claude Code sandbox protection คืออะไร และทำไมถึงบล็อกการแก้ไฟล์บางตัว

Claude Code มีระบบป้องกันไฟล์ที่ถือว่า sensitive เช่นไฟล์ใน .claude/ directory ครับ เพื่อป้องกันไม่ให้ AI แก้ไข config หรือ credential โดยไม่ตั้งใจ วิธีที่ถูกต้องคือเพิ่ม path ที่ต้องการยกเว้นลงใน settings.json ในฐานะ allowlist โดยระบุ pattern ที่ชัดเจน

วิธีออกแบบ AI system ให้รับมือกับ silent failure ได้

ต้องมี verification loop ครับ เช่น หลังเขียนไฟล์ให้อ่านกลับมาตรวจว่า content ตรงกัน นอกจากนี้ error จาก subprocess ควรถูก parse และแจ้งให้ user รู้ทุกกรณี ไม่ใช่แค่ error pattern ที่รู้จักอยู่แล้ว และควรมี log ที่ readable เพื่อให้ AI ไล่ตรวจตัวเองได้

Newton — server ส่วนตัวที่ AI Agent ปะ patch ตัวเองได้

ระบบที่ผมเล่ามาทั้งหมดนี่รันบน Newton ของผมครับ — server ส่วนตัวที่มี AI Agent อยู่ในนั้น 24 ชั่วโมง

ข้อดีของ Newton ที่ ผมเขียนไว้ก่อนหน้านี้ คือ AI มีสิทธิ์เต็มในเครื่องของคุณเอง อยากแก้ settings.json, อยากใส่ regex ใหม่ใน server.js, อยาก ssh ไปแก้ patch ที่ server อื่น — ทำได้เลย ไม่ต้องผ่าน sandbox ของ vendor ใคร

ถ้าคุณอยากรู้ว่าระบบ memory ที่ว่านี้ทำงานยังไงทั้งหมด ผมเขียนเล่าไว้ละเอียดใน ระบบ Memory ที่ทำให้ AI ฉลาดขึ้นทุกวัน

ถ้าคุณอยากมี AI Agent ที่อยู่ในเครื่องของคุณเอง ทำงานต่อเนื่อง จำเรื่องคุณได้ และ debug ตัวเองได้ — ลอง Newton ดูครับ setup เสร็จใน 10 นาที ไม่ต้องมีความรู้เรื่อง server เลย