---
read_when:
    - คุณกำลังนำ clawdbot-d63.2 / clawdbot-04b ไปใช้งาน
    - คุณกำลังแก้ไขการเก็บรักษาเซสชัน SQLite การรีเซ็ต การลบ หรือการเก็บถาวรเมื่อมีการลบเอเจนต์
    - คุณต้องแยกแยะตระกูลอาร์ติแฟกต์ในยุค SQLite ออกจากไฟล์เสริม JSONL แบบเดิม
summary: แผนเส้นทางที่ 3 สำหรับการเก็บถาวรอาร์ติแฟกต์ทรานสคริปต์ SQLite ทั้งหมดที่เป็นของเซสชันหนึ่ง
title: พาธ 3 ตระกูลอาร์ติแฟกต์เซสชัน SQLite
x-i18n:
    generated_at: "2026-07-16T19:24:31Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: adb2c31293ab63cb80449d037600d78fbb228e91f380d1ccaf15fb00728a9057
    source_path: plan/path3-sqlite-session-artifact-family.md
    workflow: 16
---

# กลุ่มอาร์ติแฟกต์เซสชัน SQLite ของเส้นทางที่ 3

บันทึกนี้กำหนดขอบเขตของ `clawdbot-d63.2` ขณะที่ `clawdbot-d63.1` รับผิดชอบตัวช่วยเก็บถาวรสำหรับ
การรีเซ็ต/ลบที่ทับซ้อนกันใน `src/config/sessions/session-accessor.sqlite.ts`
ไฟล์การนำไปใช้มีการเปลี่ยนแปลงที่ยังไม่บันทึกระหว่างการดำเนินการรอบนี้ ดังนั้นอาร์ติแฟกต์นี้จึงบันทึก
สัญญาที่แน่นอนและจุดแก้ไขโดยไม่แข่งขันกับผู้ปฏิบัติงานที่ทำงานส่วนข้างเคียง

## กลุ่มที่เป็นแหล่งข้อมูลหลัก

หลังจากเปลี่ยนไปใช้ SQLite ทรานสคริปต์ของเซสชันที่ใช้งานอยู่จะเป็นแถวใน SQLite กลุ่ม
การเก็บถาวรของเซสชันประกอบด้วย:

- แถว `transcript_events`, `transcript_event_identities` และ `sessions`
  สำหรับ `sessionId` ปัจจุบันของรายการ
- ชุดแถวทรานสคริปต์ SQLite เดียวกันสำหรับทุก `sessionId` ที่อ้างอิงโดย
  `entry.compactionCheckpoints[*].preCompaction.sessionId`
- ชุดแถวทรานสคริปต์ SQLite เดียวกันสำหรับทุก `sessionId` ที่อ้างอิงโดย
  `entry.compactionCheckpoints[*].postCompaction.sessionId`
- ชุดแถวทรานสคริปต์ SQLite เดียวกันสำหรับทุก `sessionId` ใน
  `entry.usageFamilySessionIds`

เก็บถาวรเฉพาะแถวที่ไม่มีแถว `session_entries` ที่เหลืออยู่หรือข้อมูลเมตาของ
Compaction หรือกลุ่มการใช้งานของรายการที่เหลืออยู่อ้างอิงอีกต่อไป การทำเช่นนี้จะรักษาสถานะ
การแตกแขนง/กู้คืนจากจุดตรวจและการสรุปรวมการใช้งานไว้จนกว่าการอ้างอิงที่ยังใช้งานอยู่รายการสุดท้าย
จะหมดไป

## อาร์ติแฟกต์นอกกลุ่มหลังจากเปลี่ยนระบบ

ไฟล์ทรานสคริปต์หัวข้อรูปแบบย่อยที่สร้างขึ้นและไฟล์เสริมวิถีไม่ใช่สถานะรันไทม์
SQLite ที่ใช้งานอยู่ แต่เป็นอาร์ติแฟกต์ไฟล์แบบเดิม:

- รูปแบบย่อยของหัวข้อ เช่น `<sessionId>-topic-<thread>.jsonl` มีอยู่เฉพาะใน
  รูปแบบทรานสคริปต์ที่ใช้ไฟล์เป็นแบ็กเอนด์ SQLite ใช้รหัสเซสชันมาตรฐานร่วมกับ
  ข้อมูลเมตาการส่งมอบ `session_routes`/รายการ แทนไฟล์ JSONL แยกตามหัวข้อ
- ไฟล์เสริมวิถี เช่น `.trajectory.jsonl` และ `.trajectory-path.json`
  ตั้งชื่อตามพาธ `sessionFile` ของ JSONL จริง ค่า `sessionFile` ของ SQLite
  เป็นเครื่องหมาย `sqlite:<agentId>:<sessionId>:<storePath>` และไม่ได้ระบุชื่อไฟล์
  เสริม
- ตัวอ่านระดับการเก็บถาวรต้องอ่านไฟล์ JSONL แบบเดิมที่เก็บถาวรไว้ต่อไป แต่
  การเก็บรักษาของรันไทม์ต้องไม่สแกนไดเรกทอรีเซสชันที่ใช้งานอยู่หรือเปิดไฟล์ทรานสคริปต์
  JSONL อีกครั้งสำหรับเซสชัน SQLite

การนำเข้าของ Doctor ยังคงเป็นเจ้าของการย้ายข้อมูลสำหรับไฟล์ JSONL หลักแบบเดิมและ
ไฟล์เสริมวิถีที่อยู่ติดกัน การเก็บรักษา SQLite ของรันไทม์ไม่ควรเพิ่ม
ตัวนำเข้าตัวที่สองหรือการย้อนกลับไปใช้ไฟล์

## จุดแก้ไข

ขยายตัวช่วยเก็บถาวร SQLite ที่ `clawdbot-d63.1` เพิ่มเข้ามา แทนการ
เพิ่มเส้นทางคู่ขนาน

1. เพิ่มตัวรวบรวมภายในใกล้กับ `deleteSqliteSessionStateIfUnreferenced`:
   - `collectSqliteSessionArtifactFamily(entry: SessionEntry): Set<string>`
   - รวม `entry.sessionId` รหัสเซสชันก่อน/หลังจุดตรวจ และ
     `usageFamilySessionIds`
   - กรองสตริงว่างและขจัดรายการซ้ำแบบกำหนดผลลัพธ์แน่นอน

2. เพิ่มตัวรวบรวมการอ้างอิงสำหรับสโตร์หลังการนำออก:
   - `readReferencedSqliteSessionArtifactFamilyIds(database): Set<string>`
   - วนซ้ำ `session_entries` ปัจจุบัน แยกวิเคราะห์แต่ละ `entry_json` และรวบรวม
     รหัสกลุ่มเดียวกันจากทุกรายการที่ยังคงอยู่

3. เปลี่ยนตัวเรียกสำหรับการรีเซ็ต/ลบ/บำรุงรักษาที่ปัจจุบันเก็บถาวร
   `sessionId` ที่นำออกเพียงรายการเดียว ให้ส่งกลุ่มทั้งหมดของรายการที่นำออก

4. สำหรับรหัสแต่ละรายการในกลุ่ม ให้เก็บถาวรแถวทรานสคริปต์ SQLite ด้วยเหตุผลของ
   ตัวเรียก (`reset` หรือ `deleted`) จากนั้นลบแถว `sessions` เฉพาะเมื่อ
   ไม่มีรหัสกลุ่มอยู่ในชุดการอ้างอิงหลังการนำออก

5. รวมศูนย์การลบเหตุการณ์ทรานสคริปต์ผ่านเส้นทางล้างแถวเซสชัน
   SQLite ที่มีอยู่ ห้ามเพิ่มการอ่าน JSONL ที่ใช้งานอยู่

## การทดสอบเฉพาะจุด

เพิ่มการทดสอบเฉพาะ SQLite ไปยัง `src/config/sessions/session-accessor.conformance.test.ts`
หรือการทดสอบวงจรชีวิตส่วนข้างเคียงหลังจาก `clawdbot-d63.1` คอมมิตแล้ว:

- การลบรายการที่มีทรานสคริปต์ก่อน Compaction จะเก็บถาวรทั้งเซสชันปัจจุบัน
  และเซสชันก่อน Compaction จากนั้นนำชุดแถว SQLite ทั้งสองชุดออก
- การลบหนึ่งในสองรายการที่ใช้เซสชันก่อน Compaction ร่วมกันจะไม่เก็บถาวร
  เซสชันก่อนหน้าที่ใช้ร่วมกัน จนกว่าจะนำรายการสุดท้ายที่อ้างอิงเซสชันนั้นออก
- การลบรายการที่มี `usageFamilySessionIds` จะเก็บถาวรแถวทรานสคริปต์ SQLite
  ของเซสชันก่อนหน้า เมื่อไม่มีรายการอื่นอ้างอิงกลุ่มการใช้งานนั้น
- คีย์เซสชันที่มีรูปแบบเป็นหัวข้อและมีเครื่องหมาย SQLite จะไม่ทำให้เกิดการอ่าน
  JSONL ของหัวข้อที่สร้างขึ้นหรือการค้นหาไฟล์เสริมใด ๆ

การพิสูจน์เฉพาะจุดควรใช้:

```bash
node scripts/run-vitest.mjs src/config/sessions/session-accessor.conformance.test.ts
```

หากการทดสอบสุดท้ายอยู่ใน `store.session-lifecycle-mutation.test.ts` ให้เรียกใช้
ไฟล์นั้นอย่างชัดเจนด้วยตัวครอบเดียวกัน เกต `pnpm` แบบกว้างควรทำงานบน
Crabbox/Testbox สำหรับเวิร์กทรี Codex นี้
