carloscape/octorato/inbox-triage-classifier
Claude Code and agent skill by carloscape/octorato
- community
Checking that the SKILL.md file is still in the repository.
Triage for inboxes (email, Slack, Teams, JIRA, PRs): classifies what needs action and returns a per-item verdict with urgency. Read-only, never marks as read and never replies. Use it on 'que tengo pendiente?', 'do I owe anyone a reply?'.
Install
npx vskill@latest install carloscape/octorato/inbox-triage-classifierSKILL.md
Inbox-Triage Classifier
What
A general-purpose classification pipeline that scans a stream of items (emails, chat messages, tickets, mentions) and tells the operator which ones require their attention — with structured reasons and suggested actions, sorted by urgency.
This is the discovery layer for "what do I owe anyone today?" workflows. It is intentionally read-only and does not write back to the source (no marking read, no draft replies, no status changes).
Why
phi-aware-rag-ingestion solves the problem of building a searchable corpus from regulated content. That's the wrong tool for "tell me what to act on today" because:
- Retrieval-via-query assumes you know what you're looking for. Triage assumes you don't.
- RAG outputs document chunks. Triage outputs verdicts (
needs_followup: bool+ urgency + suggested action). - RAG runs as a background sync. Triage is a synchronous read on the current state of the inbox.
- RAG accumulates state (vector store, cursor). Triage is stateless.
The plumbing (auth, PHI screen, dual-route LLM) is shared. The downstream goal is not.
When to Use
Trigger when the operator asks:
- "What do I need to follow up on in my inbox / Slack / Teams?"
- "Do I owe anyone a reply?"
- "What's the most urgent thing in my queue right now?"
- "Triage my JIRA / GitHub / Notion mentions"
- "Read my mail and tell me what's actionable"
Do NOT use for:
- Drafting replies (separate skill / step)
- Building a searchable archive (use
phi-aware-rag-ingestion) - Bulk export / backup (use a dedicated scraper)
- Anything that writes back to the source
Pipeline
Classifier Contract (Mandatory Schema)
The LLM must return a single JSON object with this exact shape. No prose, no markdown, no code fence.
Urgency calibration (consistent across all sources):
| Level | Trigger | |
|---|---|---|
high | Explicit deadline today/tomorrow OR explicit blocker on a third party | |
med | Soft deadline this week OR external party waiting OR named stakeholder asks directly | |
low | No deadline, internal nudge, "when you get a chance", informational reply expected |
Conservative bias: when uncertain, the classifier should default to needs_followup=false rather than invent urgency. False positives waste operator attention; false negatives are recoverable on the next run.
Sandwich System Prompt (Critical)
Smaller models (7B-13B local) lose attention on rules placed only at the top. Use the sandwich pattern:
The # REMEMBER block at the bottom is non-negotiable for local models. Without it, ollama llama3.1:8b drifts to markdown 1-in-5 runs.
Per-Item User Message Template
3500 chars is the sweet spot for Groq llama-3.3-70b and ollama llama3.1:8b. Going higher buys marginal classifier quality at large latency / cost.
Dual-Route LLM (Reuse phi-aware-rag-ingestion)
PHI policy is non-negotiable: if phiRisk && !ollamaAvailable, the item is not classified — it is reported as blocked with exit code 3 (see phi-aware-rag-ingestion §Fail-Closed Exit Codes).
CLI Flags (Convention Across Implementations)
| Flag | Default | Effect | |
|---|---|---|---|
--days N | 7 | Time window in days | |
--limit N | 50 | Max items to process | |
--unread-only | false | Filter to unread items (where source supports it) | |
--dry-run | false | List item subjects only, skip LLM classification | |
--save | false | Write PHI-redacted markdown digest to users/<slug>/digests/<source>-<date>.md | |
--json | false | Output machine-readable JSON for piping into other tools | |
--no-color | auto | Disable ANSI colors (auto-detected from isTTY) |
--dry-run is critical — it lets the operator verify auth + fetch + filter logic without spending LLM tokens on bad input.
Output Format (Human Mode)
Per-item progress glyphs during classification:
●(yellow) — followup needed·(gray) — no action needed!(red) — classifier error or PHI-blocked
Sort Order
- Urgency descending:
high→med→low - Within same urgency: most recent first
Operators triage top-down. Putting high first means they can stop reading as soon as they've handled what matters.
PHI-Redacted Digest
When --save is passed, write a digest at users/<sha256(email)[:12]>/digests/<source>-<date>.md:
- Sender names/emails on PHI items go through
phi.redact()before serialization - Body content is NEVER copied into the digest — only the LLM's
reason+suggested_action webLink(deep link back to source) is preserved so the operator can open the raw item in the native app- The digest is committable IF the arm's
.gitignorehasusers/<slug>/digests/excluded (recommended — digests still carry metadata)
Anti-patterns
| Anti-pattern | Why it fails | |
|---|---|---|
| Marking items as read after classification | Side effect that breaks the operator's mental model. Read-only is the contract. | |
| Auto-drafting replies | Drafting is a separate step; conflating them creates accidental sends | |
| Copying item bodies into the digest | Body may contain PHI even if redacted; digest exists to summarize, not archive | |
| Falling back to cloud when ollama is down | PHI policy violation. Halt with exit 3, do not degrade. | |
| Sending JSON-mode prompts to local models without sandwich pattern | 7B-13B models drift to markdown ~20% of runs without # REMEMBER block | |
| Classifying items with empty/preview-only body | Bias toward needs_followup=false; mark llm: 'skipped' and report separately | |
| Caching classifier results across runs | Item state changes (replied to elsewhere, no longer relevant). Run fresh every time. | |
| Hardcoding the recipient's name in the system prompt | Per-arm config; resolve from auth token's upn / email claim |
Source-Specific Plumbing
The classifier core is source-agnostic. Per-source adapters provide:
| Source | Fetch endpoint | Item shape | Adapter notes | |
|---|---|---|---|---|
| Outlook Mail | Graph /me/mailFolders/inbox/messages | { subject, from, body, receivedDateTime, isRead, flag, webLink } | Requires Mail.Read; see browser-bearer-graph-auth for token | |
| Teams chats | Graph /me/chats?$expand=lastMessagePreview | { topic, members, lastMessage, lastUpdatedDateTime } | Requires Chat.Read; only Outlook-driven token has it | |
| Slack DMs | conversations.list + conversations.history | { channel, user, text, ts } | Requires mpim:read + im:history scopes | |
| JIRA assigned | REST /search?jql=assignee=currentUser() AND updated > -7d | { key, summary, status, updated, reporter } | API token auth, no browser | |
| GitHub PR reviews | GraphQL viewer.pullRequests(states: OPEN) filtered by reviewRequests | { title, author, repo, updatedAt, url } | GH token with repo scope | |
| Notion mentions | Database query filtered by mention property | { page, mentionedBy, lastEdited } | Workspace integration |
Each adapter outputs the common shape:
This shape was designed against Outlook first. Slack/JIRA adapters normalize to it via small translation functions — do not invent a new shape per source.
Composability
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/inbox-triage-classifier/SKILL.md
Popularity
- Repository stars
- 17
- Repository forks
- 7
- 7-day trend score
- 14
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/carloscape/octorato/inbox-triage-classifier)