Install
$ agentstack add skill-okhp3-skillz-okhp3-chatgpt-project-migration ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
okhp3-chatgpt-project-migration
OverKill Hill P³ · overkillhill.com · github.com/OKHP3
Capture a ChatGPT project as evidence before transforming it. This skill keeps the source corpus intact, proves which threads and turns were captured, and only then routes reviewed material into durable repository artifacts.
Scope
| In scope | Out of scope | |---|---| | Exporting and indexing accessible ChatGPT project threads | Recovering deleted or permission-restricted content | | Preserving every exported message node and content part | Treating an LLM summary as source preservation | | Reconciling source material with repository artifacts | Publishing raw chats, credentials, or third-party private data | | Optional Notion status register | Making Notion the authoritative raw archive |
Operating principle
Use a two-lane process:
- Source lane: immutable export, project inventory, normalized transcripts,
hashes, and exception records. Keep it local and out of Git.
- Artifact lane: reviewed, classified, public-safe Markdown and structured
artifacts committed to their proper repository locations.
Do not substitute artifact-lane summaries for source-lane records. A source record may be distilled many times without changing the original evidence.
Required inputs and first decision
Record the project URL, capture date, account/workspace type, intended archive location, and publication sensitivity. Treat repository visibility as unknown unless the owner has resolved it.
Use ChatGPT data export as the primary source when available. It is faster and more complete than manually copying UI text. Use Browser to enumerate the target project and verify it against the export. Use Computer only for UI actions that Browser cannot complete, such as a download dialog or desktop-only control.
If the account cannot export data, proceed with Browser-based recovery but mark the batch ui_capture_only and list its reduced-fidelity limitations.
Capture procedure
1. Preserve the original
Store the downloaded export ZIP in an owner-controlled local archive outside the repository. Do not rename, edit, or unpack the only copy. Calculate and record raw_sha256 before working with it.
Create a disposable working copy under custom-gpts/ingestion/. That location is Git-ignored, but it is a staging area, not the permanent archive.
2. Inventory the project UI
Enumerate every accessible thread in the target project. For each thread record the stable conversation ID from its URL, displayed title, project URL, observed last activity, attachments or images, and UI-capture status. Do not use title matching as the primary key.
Write project_capture_manifest.json following references/source-manifest-schema.md. Assign each row one of: inventoried, captured, normalized, reconciled, routed, exception.
3. Normalize without flattening
Parse every conversation record into a normalized transcript and retain the raw JSON record. Preserve all nodes in the conversation mapping, including regenerated alternatives and non-current branches. Do not serialize only the current_node path.
For every message node retain: node ID, parent ID, child IDs, role, create and update time, author metadata, content parts in order, attachments, tool or citation metadata when present, and a source locator. Represent unavailable fields as null; do not invent values.
4. Reconcile and recover exceptions
Match project inventory rows to normalized export records by conversation ID. Record a one-to-one match, one-to-many ambiguity, or no match. Do not silently drop unmatched rows.
For every no_match or missing asset, use Browser-based capture as the recovery path. Preserve the URL, capture time, and reason for the exception. Keep the exception open until it has a source record or the owner accepts the loss.
Completion gates
Do not call a migration complete until all are true:
- Every inventoried thread has a
conversation_idand a disposition. - Every captured source has a
raw_sha256and a normalized-record hash. - The parser counted all conversation
mappingnodes, not only visible turns. - Every unmatched thread, branch, message, or asset appears in
exceptions. - Raw source material remains outside tracked repository paths.
- Every committed artifact links to a source reference, a review decision, or an
explicit statement that it is an original new artifact.
Report coverage as counts: threads inventoried/captured/reconciled, mapping nodes retained, assets retained, and open exceptions. Do not claim 100% unless the exception count is zero and the owner accepts the inventory boundary.
Integration and routing
Classify each candidate before writing to the repository:
| Class | Destination | Handling | |---|---|---| | Raw evidence | Local archive and ignored staging | Preserve verbatim; never commit by default | | Historical reference | custom-gpts/proto/ or a clearly marked archive | Retain provenance and version context | | Durable method | custom-gpts/consolidated/, docs/, or a skill | Distill, deduplicate, and cite source IDs | | Operational artifact | Relevant schema, example, skill, or child-repo material | Add acceptance checks and ownership | | Private or unsafe material | Local quarantine record | Redact, omit, or obtain explicit owner approval |
Use Notion only as an optional private Corpus Register for batch status, hashes, source locations, routing decisions, and review notes. Do not copy the entire source corpus into Notion merely to make it searchable.
When processing already captured Custom GPT material, use the existing corpus ledger and evidence-register conventions. Preserve disagreement and historical versions rather than making repetition appear authoritative.
Required handoff report
Return a concise report with:
Batch:
Source: export | ui_capture_only
Threads: inventoried / captured / reconciled
Nodes: retained
Assets: retained / unavailable
Exceptions:
Artifact routing:
Owner decisions needed:
References
references/source-manifest-schema.md-- capture manifest, normalized
transcript, and reconciliation record contracts.
custom-gpts/ingestion/README.md-- local staging boundary for source files.custom-gpts/consolidated/CORPUS-LEDGER.md-- existing evidence-ledger model.custom-gpts/consolidated/EVIDENCE-REGISTER.md-- claim classification and
source discipline.
About
Built by Jamie Hill · OverKill Hill P³ Published at github.com/OKHP3 Part of the OKHP3/skillz Agent Skill library. MIT License -- free to use, fork, and adapt. A nod to the source is appreciated.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: OKHP3
- Source: OKHP3/skillz
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.