Asi chatgpt-export-acset

chatgpt-export-acset

install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/chatgpt-export-acset" ~/.claude/skills/plurigrid-asi-chatgpt-export-acset && rm -rf "$T"
manifest: skills/chatgpt-export-acset/SKILL.md
source content

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

FilePurpose
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 theory
  • specter-acset
    - Bidirectional navigation
  • lispsyntax-acset
    - Sexp bridge
  • duckdb-timetravel
    - Temporal versioning
  • agent-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.