chatgpt-export-acset
Process ChatGPT data exports into ACSets for categorical analysis
Version: 1.0.0 Trit: 0 (ERGODIC - data transformation coordinator) Color: #10B981
Overview
Transform ChatGPT ZIP exports into ACSets (Attributed C-Sets) for:
- Conversation graph analysis
- Message threading reconstruction
- Author/role relationship mapping
- Attachment tracking
Schema
┌─────────────────────────────────────────────────────────────┐
│ SchChatGPTExport │
├─────────────────────────────────────────────────────────────┤
│ │
│ Conversation ◄──── conversation_of ──── Message │
│ │ │ │
│ │ ├── author_of ──► Author
│ │ │ │
│ │ └── parent_msg ─┐│
│ │ ▲ ││
│ │ └──────────┘│
│ │ │
│ └─────────────────────── Attachment ◄─ attachment_of ──┘
│ │
└─────────────────────────────────────────────────────────────┘
ACSet Definition (Julia)
@present SchChatGPTExport(FreeSchema) begin
Conversation::Ob
Message::Ob
Author::Ob
Attachment::Ob
conversation_of::Hom(Message, Conversation)
author_of::Hom(Message, Author)
parent_msg::Hom(Message, Message)
attachment_of::Hom(Attachment, Message)
# Attributes
Title::AttrType
Content::AttrType
Role::AttrType
Time::AttrType
FileID::AttrType
title::Attr(Conversation, Title)
conv_id::Attr(Conversation, Title)
create_time::Attr(Conversation, Time)
msg_id::Attr(Message, Title)
content::Attr(Message, Content)
status::Attr(Message, Title)
name::Attr(Author, Title)
role::Attr(Author, Role)
file_id::Attr(Attachment, FileID)
file_type::Attr(Attachment, Title)
end
Python Implementation (py-acset style)
from dataclasses import dataclass, field
@dataclass
class PyACSet:
schema: dict
parts: dict = field(default_factory=dict)
subparts: dict = field(default_factory=dict)
def add_part(self, ob: str, **attrs) -> int:
idx = len(self.parts[ob])
self.parts[ob].append(idx)
for attr, val in attrs.items():
self.subparts[f"{ob}_{attr}"].append(val)
return idx
def set_subpart(self, morph: str, src: int, tgt: int):
while len(self.subparts[morph]) <= src:
self.subparts[morph].append(None)
self.subparts[morph][src] = tgt
Usage
Extract agent-o-rama conversations
cd /path/to/extracted/zip
python3 extract_agent_o_rama.py
Query with Specter-style navigation
using ACSets
# All messages in a conversation
messages_in_conv(acset, conv_id) = incident(acset, conv_id, :conversation_of)
# Thread reconstruction (follow parent_msg)
function thread_path(acset, msg_id)
path = [msg_id]
while (parent = acset[msg_id, :parent_msg]) !== nothing
pushfirst!(path, parent)
msg_id = parent
end
path
end
# All messages by role
by_role(acset, role) = findall(==(role), acset[:role])
Files
| File | Purpose |
|---|---|
extract_agent_o_rama.py |
Python extractor for agent-o-rama conversations |
agent_o_rama_acset.json |
Exported ACSet data |
agent_o_rama_schema.jl |
Julia schema definition |
Export Format
{
"parts": {
"Conversation": [0, 1, 2, ...],
"Message": [0, 1, 2, ...],
"Author": [0, 1, 2, 3]
},
"subparts": {
"conversation_of": [0, 0, 0, 1, 1, ...],
"author_of": [0, 1, 0, 1, ...],
"parent_msg": [null, 0, 1, null, 3, ...],
"Conversation_title": ["Title1", "Title2", ...],
"Message_content": ["Hello", "Response", ...]
}
}
Base directory: file:///Users/bob/.claude/skills/chatgpt-export-acset
End-of-Skill Interface
GF(3) Triads
three-match (-1) ⊗ chatgpt-export-acset (0) ⊗ gay-mcp (+1) = 0 ✓
temporal-coalgebra (-1) ⊗ chatgpt-export-acset (0) ⊗ duckdb-timetravel (+1) = 0 ✓
Related Skills
acsets-algebraic-databases- Core ACSet theoryspecter-acset- Bidirectional navigationlispsyntax-acset- Sexp bridgeduckdb-timetravel- Temporal versioningagent-o-rama- Red Planet Labs Rama patterns
Autopoietic Marginalia
The interaction IS the skill improving itself.
Every use of this skill is an opportunity for worlding:
- MEMORY (-1): Record what was learned
- REMEMBERING (0): Connect patterns to other skills
- WORLDING (+1): Evolve the skill based on use
Add Interaction Exemplars here as the skill is used.