---
read_when:
    - आप clawdbot-d63.2 / clawdbot-04b को कार्यान्वित कर रहे हैं
    - आप SQLite सत्र प्रतिधारण, रीसेट, हटाने या एजेंट-हटाने संबंधी अभिलेखीकरण में बदलाव कर रहे हैं
    - आपको SQLite-युग की आर्टिफ़ैक्ट फ़ैमिली को पुराने JSONL साइडकार से अलग पहचानना होगा
summary: किसी सत्र से संबंधित सभी SQLite ट्रांसक्रिप्ट आर्टिफ़ैक्ट संग्रहीत करने की पथ 3 योजना
title: पथ 3 SQLite सत्र आर्टिफ़ैक्ट परिवार
x-i18n:
    generated_at: "2026-07-19T08:49:13Z"
    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
---

# पथ 3 SQLite सत्र आर्टिफ़ैक्ट परिवार

यह नोट `clawdbot-d63.2` का दायरा निर्धारित करता है, जबकि `clawdbot-d63.1`, `src/config/sessions/session-accessor.sqlite.ts` में ओवरलैप होने वाले
रीसेट/डिलीट आर्काइव सहायक का स्वामी है।
इस चरण के दौरान कार्यान्वयन फ़ाइल में असहेजे बदलाव थे, इसलिए यह आर्टिफ़ैक्ट
सहवर्ती वर्कर के साथ टकराव किए बिना सटीक अनुबंध और पैच बिंदुओं को दर्ज करता है।

## प्रामाणिक परिवार

SQLite पर स्विच करने के बाद, सक्रिय सत्र ट्रांसक्रिप्ट SQLite पंक्तियाँ हैं। किसी सत्र का
आर्काइव परिवार है:

- प्रविष्टि के वर्तमान `sessionId` के लिए `transcript_events`, `transcript_event_identities`, और `sessions` पंक्तियाँ।
- `entry.compactionCheckpoints[*].preCompaction.sessionId` द्वारा संदर्भित प्रत्येक `sessionId` के लिए
  वही SQLite ट्रांसक्रिप्ट पंक्ति सेट।
- `entry.compactionCheckpoints[*].postCompaction.sessionId` द्वारा संदर्भित प्रत्येक `sessionId` के लिए
  वही SQLite ट्रांसक्रिप्ट पंक्ति सेट।
- `entry.usageFamilySessionIds` में प्रत्येक `sessionId` के लिए
  वही SQLite ट्रांसक्रिप्ट पंक्ति सेट।

केवल उन पंक्तियों को आर्काइव करें जिन्हें किसी शेष
`session_entries` पंक्ति या किसी शेष प्रविष्टि के Compaction अथवा उपयोग-परिवार
मेटाडेटा द्वारा अब संदर्भित नहीं किया जाता। इससे अंतिम सक्रिय संदर्भ हटने तक
चेकपॉइंट शाखा/पुनर्स्थापना और उपयोग रोलअप स्थिति सुरक्षित रहती है।

## स्विच के बाद गैर-पारिवारिक आर्टिफ़ैक्ट

जनरेट किए गए विषय ट्रांसक्रिप्ट फ़ाइल प्रकार और ट्रैजेक्टरी साइडकार सक्रिय
SQLite रनटाइम स्थिति नहीं हैं। वे विरासती फ़ाइल आर्टिफ़ैक्ट हैं:

- `<sessionId>-topic-<thread>.jsonl` जैसे विषय प्रकार केवल
  फ़ाइल-समर्थित ट्रांसक्रिप्ट प्रारूप के लिए मौजूद हैं। SQLite प्रति-विषय JSONL फ़ाइलों के बजाय
  कैनोनिकल सत्र आईडी और `session_routes`/प्रविष्टि डिलीवरी मेटाडेटा का उपयोग करता है।
- `.trajectory.jsonl` और `.trajectory-path.json` जैसे ट्रैजेक्टरी साइडकार
  वास्तविक JSONL `sessionFile` पथों से नामित होते हैं। SQLite `sessionFile` मान
  `sqlite:<agentId>:<sessionId>:<storePath>` मार्कर हैं और साइडकार
  फ़ाइलों को नामित नहीं करते।
- आर्काइव-स्तरीय रीडर को विरासती आर्काइव की गई JSONL फ़ाइलें पढ़ना जारी रखना चाहिए, लेकिन
  रनटाइम प्रतिधारण को सक्रिय सत्र निर्देशिकाएँ स्कैन नहीं करनी चाहिए या SQLite सत्रों के लिए JSONL
  ट्रांसक्रिप्ट फ़ाइलें दोबारा नहीं खोलनी चाहिए।

विरासती प्राथमिक JSONL फ़ाइलों और उनके निकटवर्ती ट्रैजेक्टरी साइडकार के लिए
Doctor आयात ही माइग्रेशन स्वामी बना रहता है। रनटाइम SQLite प्रतिधारण को दूसरा
आयातक या फ़ाइल फ़ॉलबैक नहीं जोड़ना चाहिए।

## पैच बिंदु

समानांतर पथ जोड़ने के बजाय `clawdbot-d63.1` द्वारा प्रस्तुत SQLite आर्काइव सहायक
का विस्तार करें।

1. `deleteSqliteSessionStateIfUnreferenced` के निकट एक स्थानीय संग्राहक जोड़ें:
   - `collectSqliteSessionArtifactFamily(entry: SessionEntry): Set<string>`
   - `entry.sessionId`, चेकपॉइंट के पूर्व/पश्चात सत्र आईडी, और
     `usageFamilySessionIds` शामिल करें।
   - रिक्त स्ट्रिंग फ़िल्टर करें और निर्धारक रूप से डुप्लिकेट हटाएँ।

2. हटाने के बाद वाले स्टोर के लिए एक संदर्भ संग्राहक जोड़ें:
   - `readReferencedSqliteSessionArtifactFamilyIds(database): Set<string>`
   - वर्तमान `session_entries` पर पुनरावृत्ति करें, प्रत्येक `entry_json` को पार्स करें, और
     प्रत्येक शेष प्रविष्टि से समान परिवार आईडी एकत्र करें।

3. वर्तमान में हटाए गए एक `sessionId` को आर्काइव करने वाले
   रीसेट/डिलीट/रखरखाव कॉलर को हटाई गई प्रविष्टि का पूरा परिवार पास करने के लिए बदलें।

4. प्रत्येक परिवार आईडी के लिए, कॉलर के कारण
   (`reset` या `deleted`) के साथ SQLite ट्रांसक्रिप्ट पंक्तियाँ आर्काइव करें, फिर `sessions` पंक्ति को केवल तब हटाएँ जब
   परिवार आईडी हटाने के बाद वाले संदर्भ सेट में अनुपस्थित हो।

5. ट्रांसक्रिप्ट इवेंट हटाने को मौजूदा SQLite
   सत्र-पंक्ति सफ़ाई पथ के माध्यम से केंद्रीकृत रखें। सक्रिय JSONL रीड न जोड़ें।

## केंद्रित परीक्षण

`src/config/sessions/session-accessor.conformance.test.ts` में SQLite-मात्र परीक्षण जोड़ें
या `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` में हों, तो उसी रैपर से उस
फ़ाइल को स्पष्ट रूप से चलाएँ। इस Codex वर्कट्री के लिए व्यापक `pnpm` गेट
Crabbox/Testbox पर ही रहने चाहिए।
