Skip to main content
AIDiveForge AIDiveForge
🧵

Email Thread Reducer

Data Extraction & Parsing · by AIDiveForge · Apr 20, 2026 · Intermediate

Reduce an email thread to a chronological decision and action record.

Get a deduplicated timeline, current commitments and unresolved questions.

Free · 2 KB · SKILL.md, instructions and example files. Provide the thread with dates, participants and quoted-message boundaries.

A worked example

A small example to try before using your own data.

Input

Oct 14 09:00 Ana: Let us meet Tuesday.
Oct 14 10:00 Ben: Tuesday is unavailable; Wednesday?
Oct 14 11:00 Ana: Wednesday works. I will send the invite.
[quoted copy of 09:00 message]

Expected result

Decision: meet Wednesday (11:00). Superseded proposal: Tuesday (09:00). Action: Ana sends the invite; no deadline stated. The quoted 09:00 message appears once.

What to check: Do not report Tuesday as the current meeting day or invent a due date for the invitation.

Limits: Relative dates need the thread’s calendar context; missing attachments and off-thread decisions remain outside scope.

Worked example included. Model-specific performance and vendor compatibility have not been benchmarked.

Installation options and other formats

Install this skill

An agent skill starts with SKILL.md. The ZIP also includes its examples and any helper scripts. Drop the file into your tool of choice — or pick a different format if you use Cursor, Windsurf, Copilot, or something else.

Download SKILL.md
python3 - <<'ADF_SKILL_INSTALL'
import hashlib, io, os, stat, tempfile, urllib.request, zipfile
from pathlib import Path, PurePosixPath
folder = "email-thread-reducer"
root = Path(os.environ.get('ADF_SKILL_ROOT', str(Path.home() / '.claude' / 'skills'))).expanduser()
destination = root / folder
if destination.exists() or destination.is_symlink():
    raise SystemExit('An installation already exists. Back it up and merge the ZIP deliberately.')
root.mkdir(parents=True, exist_ok=True)
request = urllib.request.Request("https://aidiveforge.com/skill/email-thread-reducer.zip", headers={'User-Agent': 'AIDiveForge-Resource-Installer/1.0 (+https://aidiveforge.com/skills/)'})
with urllib.request.urlopen(request, timeout=30) as response:
    data = response.read(8 * 1024 * 1024 + 1)
if len(data) > 8 * 1024 * 1024 or hashlib.sha256(data).hexdigest() != "dd3d679a0887204cc2f6aa0d96c5ff9f8dde5961b1fb16b614571f79568c73aa":
    raise SystemExit('The download did not match this reviewed bundle. No files were installed.')
with zipfile.ZipFile(io.BytesIO(data)) as archive, tempfile.TemporaryDirectory(prefix='.adf-skill-', dir=root) as temporary:
    members = archive.infolist()
    if len(members) > 100 or sum(m.file_size for m in members) > 16 * 1024 * 1024:
        raise SystemExit('Unexpected archive size')
    for member in members:
        name = PurePosixPath(member.filename)
        if name.is_absolute() or '..' in name.parts or not name.parts or name.parts[0] != folder or '\\' in member.filename or stat.S_ISLNK(member.external_attr >> 16):
            raise SystemExit('Unsafe archive entry; nothing was installed')
        target = Path(temporary).joinpath(*name.parts)
        if member.is_dir():
            target.mkdir(parents=True, exist_ok=True)
        else:
            target.parent.mkdir(parents=True, exist_ok=True)
            with target.open('xb') as stream:
                stream.write(archive.read(member))
    staged = Path(temporary) / folder
    if not (staged / 'SKILL.md').is_file() or destination.exists() or destination.is_symlink():
        raise SystemExit('The skill could not be installed without replacing existing data')
    os.rename(staged, destination)
print('Installed the complete skill folder:', destination)
ADF_SKILL_INSTALL

Claude Code: ~/.claude/skills/email-thread-reducer/SKILL.md. Codex: ~/.codex/skills/email-thread-reducer/SKILL.md. Keep the complete ZIP folder when helper scripts are included.

🧠 Why it works

Do not report Tuesday as the current meeting day or invent a due date for the invitation.

⚙️ How it works

  1. Separate original messages from quoted copies and sort by timestamp with timezone where known.
  1. Deduplicate repeated quoted content without dropping distinct replies.
  1. Track when a proposal is accepted, changed or superseded; preserve the latest supported decision.
  1. Extract actions with named owners and stated deadlines, keeping ambiguous commitments unresolved.
  1. Return a short timeline and current-state recap with message locators.

Description

Get a deduplicated timeline, current commitments and unresolved questions.

Provide the thread with dates, participants and quoted-message boundaries.

Limits: Relative dates need the thread’s calendar context; missing attachments and off-thread decisions remain outside scope.

Recommended Use

Tools and workflow packs this skill pairs well with. Forge picks are auto-generated from category + capability signals; Community picks are added by people who've used the pairing.