Skip to main content

CODITECT Standard: Universal Session Format (CUSF)

Standard ID: CODITECT-STD-010 Version: 1.0.0 Effective Date: January 28, 2026 ADR Reference: ADR-134 JSON Schema: schemas/cusf-v1.0.0.json


1. Purpose

This standard defines the CODITECT Universal Session Format (CUSF) - a canonical JSONL format for LLM session exports that enables:

  • Multi-LLM Support: Unified format for Claude, Codex, Gemini, KIMI, and other LLMs
  • Reconstruction Capability: Full database rebuild from export files
  • Provenance Tracking: Complete metadata for source attribution and analytics
  • Streaming Processing: Line-by-line JSONL for memory-efficient handling

2. Scope

This standard applies to:

  • All session exports from CODITECT-managed LLMs
  • The /sx command output format
  • Session import/reconstruction operations
  • Context extraction pipeline inputs
  • Cross-LLM session analytics

3. Format Specification

3.1 File Structure

CUSF files use JSONL (JSON Lines) format with one JSON object per line:

{meta_entry}
{session_start}
{message}
{tool_use}
{tool_result}
{message}
...
{session_end}

File Naming Convention:

{timestamp}-session-{llm_source}-{session_id}--{export_type}.jsonl

Example: 2026-01-28T13-06-48Z-session-claude-abc123--context-export.jsonl

3.2 Entry Types

3.2.1 Meta Entry (REQUIRED - First Line)

{
"_meta": {
"format": "cusf",
"version": "1.0.0",
"exported_at": "2026-01-28T12:00:00Z",
"exporter": "coditect-sx/1.0.0"
}
}
FieldTypeRequiredDescription
_meta.formatstringMust be "cusf"
_meta.versionstringSemantic version (e.g., "1.0.0")
_meta.exported_atISO 8601Export timestamp in UTC
_meta.exporterstringTool identifier (e.g., "coditect-sx/1.0.0")

3.2.2 Session Start

{
"type": "session_start",
"session_id": "abc123-def456-ghi789",
"llm_source": "claude",
"llm_model": "claude-opus-4-5-20251101",
"started_at": "2026-01-28T10:00:00Z",
"project_path": "/Users/user/project",
"git_branch": "main",
"cwd": "/Users/user/project",
"machine_id": "machine-uuid",
"tenant_id": "tenant-001",
"user_id": "user-001"
}
FieldTypeRequiredDescription
typestringMust be "session_start"
session_idUUIDUnique session identifier
llm_sourceenum"claude", "codex", "gemini", "kimi", "gpt", "other"
llm_modelstringSpecific model ID
started_atISO 8601Session start timestamp
project_pathstringProject directory
git_branchstringGit branch at start
cwdstringWorking directory
machine_idstringCODITECT machine UUID
tenant_idstringMulti-tenant org ID
user_idstringUser identifier

3.2.3 Message

{
"type": "message",
"role": "user",
"content": "Help me fix the bug in auth.py",
"timestamp": "2026-01-28T10:01:00Z",
"parent_id": null,
"message_id": "msg-001",
"model": "claude-opus-4-5-20251101",
"usage": {
"input": 1000,
"output": 500,
"cache_read": 200,
"cache_write": 100
},
"thinking": "Extended thinking content here...",
"stop_reason": "end_turn"
}
FieldTypeRequiredDescription
typestringMust be "message"
roleenum"user", "assistant", "system"
contentstringMessage text content
timestampISO 8601Message timestamp
message_idstringUnique message identifier
parent_idstring/nullParent message for threading
modelstringModel that generated (assistant only)
usageobjectToken usage statistics
usage.inputintegerInput tokens
usage.outputintegerOutput tokens
usage.cache_readintegerCached input tokens
usage.cache_writeintegerTokens written to cache
thinkingstringExtended thinking content
stop_reasonenum"end_turn", "max_tokens", "tool_use", "error"

3.2.4 Tool Use

{
"type": "tool_use",
"tool_name": "Read",
"tool_input": {
"file_path": "/path/to/file.py"
},
"tool_id": "tool-001",
"timestamp": "2026-01-28T10:02:00Z",
"parent_id": "msg-002"
}
FieldTypeRequiredDescription
typestringMust be "tool_use"
tool_namestringTool name (Read, Write, Bash, etc.)
tool_inputobjectTool input parameters
tool_idstringUnique tool invocation ID
timestampISO 8601Invocation timestamp
parent_idstringParent assistant message ID

3.2.5 Tool Result

{
"type": "tool_result",
"tool_id": "tool-001",
"result": "File content here...",
"is_error": false,
"error_message": null,
"timestamp": "2026-01-28T10:02:01Z",
"truncated": false
}
FieldTypeRequiredDescription
typestringMust be "tool_result"
tool_idstringMatching tool_use ID
resultstringTool output (may be truncated)
is_errorbooleanDefault: false
error_messagestringError details if is_error=true
timestampISO 8601Result timestamp
truncatedbooleanWhether result was truncated

3.2.6 Session End

{
"type": "session_end",
"session_id": "abc123-def456-ghi789",
"ended_at": "2026-01-28T12:00:00Z",
"total_messages": 42,
"total_tokens": {
"input": 50000,
"output": 25000
},
"end_reason": "export"
}
FieldTypeRequiredDescription
typestringMust be "session_end"
session_idUUIDMatching session_start ID
ended_atISO 8601Session end timestamp
total_messagesintegerMessage count
total_tokens.inputintegerTotal input tokens
total_tokens.outputintegerTotal output tokens
end_reasonenum"user_exit", "export", "context_limit", "error", "timeout"

4. LLM-Specific Normalization

4.1 Claude

Native FieldCUSF FieldTransformation
role: "human"role: "user"Map role name
content[].textcontentExtract text from content blocks
content[].type: "tool_use"tool_use entrySeparate entry
content[].type: "tool_result"tool_result entrySeparate entry
stop_reasonstop_reasonDirect mapping

4.2 Codex

Native FieldCUSF FieldTransformation
role: "developer"role: "system"Map role name
created_at (Unix epoch)timestampConvert to ISO 8601
No tool trackingSkip tool entriesCodex CLI format differs

4.3 Gemini

Native FieldCUSF FieldTransformation
role: "model"role: "assistant"Map role name
parts[].textcontentJoin text parts
parts[].functionCalltool_use entryExtract to separate entry
parts[].functionResponsetool_result entryExtract to separate entry

4.4 KIMI

Native FieldCUSF FieldTransformation
From context.jsonlDirect mappingMost fields align
From wire.jsonlFull fidelityLossless format
model_idllm_modelRename field

5. Validation

5.1 Schema Validation

Validate CUSF files against the JSON Schema:

# Using Python jsonschema
python3 -c "
import json
from jsonschema import validate, Draft202012Validator

schema = json.load(open('schemas/cusf-v1.0.0.json'))
validator = Draft202012Validator(schema)

with open('export.jsonl') as f:
for line_num, line in enumerate(f, 1):
entry = json.loads(line)
try:
validator.validate(entry)
except Exception as e:
print(f'Line {line_num}: {e.message}')
"

5.2 Structural Validation

RuleDescription
First lineMust be _meta entry
session_startMust appear before any messages
tool_resultMust have matching tool_use by tool_id
session_end.session_idMust match session_start.session_id
TimestampsMust be chronologically ordered

5.3 Reconstruction Validation

Roundtrip test: Export → Import → Re-export should produce identical content (excluding _meta.exported_at).

6. Implementation Reference

6.1 Key Files

ComponentPathPurpose
JSON Schemaschemas/cusf-v1.0.0.jsonFormal schema definition
Formatterscripts/core/cusf_formatter.pyNormalize all LLM formats
Claude Extractorscripts/extractors/claude_extractor.pyClaude → CUSF
Codex Extractorscripts/extractors/codex_extractor.pyCodex → CUSF
Gemini Extractorscripts/extractors/gemini_extractor.pyGemini → CUSF
KIMI Extractorscripts/extractors/kimi_extractor.pyKIMI → CUSF
Export Scriptscripts/session-export.pyUnified /sx command
Import Scriptscripts/session-import.pyReconstruction importer

6.2 Python Usage

from scripts.core.cusf_formatter import CUSFFormatter

formatter = CUSFFormatter()

# Normalize any LLM format to CUSF
entries = formatter.normalize(
raw_messages=messages,
llm_source="claude",
session_id="abc123"
)

# Write CUSF file
with open("export.jsonl", "w") as f:
for entry in entries:
f.write(json.dumps(entry) + "\n")

6.3 Command Line Usage

# Export current session
/sx

# Export specific LLM
/sx --llm claude
/sx --llm codex
/sx --llm gemini
/sx --llm kimi

# Export with reconstruction metadata
/sx --reconstruct

# Validate CUSF file
python3 scripts/validate-cusf.py export.jsonl

7. Versioning

7.1 Semantic Versioning

CUSF uses semantic versioning (MAJOR.MINOR.PATCH):

Change TypeVersion BumpExample
Breaking schema changeMAJORNew required field
New optional fieldMINORAdd thinking field
Bug fix, clarificationPATCHFix regex pattern

7.2 Backward Compatibility

  • Readers MUST accept unknown fields gracefully
  • Writers SHOULD NOT add fields not in the schema
  • MAJOR version changes MAY break readers
StandardRelationship
ADR-134Unified watcher that triggers exports
ADR-080Context extraction that processes CUSF
ADR-118Database schema for imported sessions

9. Compliance

9.1 Quality Grading

GradeCriteria
A (90-100%)Full schema compliance, all optional fields populated
B (80-89%)Required fields present, key optionals (usage, timestamps)
C (70-79%)Required fields only, passes validation
D (60-69%)Minor validation errors
F (<60%)Missing required fields, invalid structure

9.2 Validation Command

# Validate CUSF export
python3 scripts/validate-cusf.py --grade export.jsonl

# Expected output:
# ✅ Schema validation: PASS
# ✅ Structural validation: PASS
# ✅ Reconstruction test: PASS
# Grade: A (95%)

Last Updated: January 28, 2026 Standard Owner: CODITECT Core Team Approval: ADR-134 Implementation