Analyze PDF/DOCX attachments, create notes, and return lightweight proposals. Reads content via para_read, analyzes, creates note with para_create, and persists proposal. Worker skill for triage orchestrator.
From para-obsidiannpx claudepluginhub nathanvale/side-quest-marketplace-old --plugin para-obsidianThis skill uses the workspace's default tool permissions.
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Implements structured self-debugging workflow for AI agent failures: capture errors, diagnose patterns like loops or context overflow, apply contained recoveries, and generate introspection reports.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Analyze PDF or DOCX attachments, create the note, and return a lightweight proposal.
Key design: Like analyze-web and analyze-voice, this skill creates the note AND returns a proposal. The full content stays in subagent context — only the proposal flows back to the coordinator.
You receive:
file: Path to attachment inbox note (e.g., 00 Inbox/📎 document.md — the inbox note referencing the attachment)areas: Available areas in vaultprojects: Available projects in vaultReturn a JSON proposal per @plugins/para-obsidian/skills/triage/references/proposal-schema.md.
Key: Use area (single wikilink), project (single wikilink or null), resourceType (camelCase). Include file, type: "attachment", created, layer1_injected, and document_type alongside the standard proposal fields.
For attachments, always set source_format: "document". Include document_type (invoice, contract, cv, letter, medical, report, manual) as an attachment-specific field.
para_read({ file: "[input file]", response_format: "json" })
Extract frontmatter fields (source, type, pre-filled areas/projects) and body content from the inbox note. The inbox note typically contains extracted text from the attachment (placed there by the CLI scan step or Web Clipper).
Do NOT call para_fm_get separately — para_read returns the full file including frontmatter.
Based on the extracted content in the inbox note, determine:
resource, invoices → invoice, bookings → bookingBefore calling para_create, verify your args object includes critical fields:
If resource:
summary — one-sentence descriptionareas — wikilink(s)source_format — "document"resource_type — based on document typeIf invoice/booking:
Use para_create with the content parameter to create the note AND inject key content:
para_create({
template: proposed_template,
title: proposed_title,
args: { ...fields from validArgs },
content: {
"<content-target-heading>": formattedContent
},
response_format: "json"
})
Content formatting for attachments: Extract key passages with page references. Target 2-3k tokens. Use #### headings for structure.
If para_create fails: Set created: null, layer1_injected: null, continue with proposal.
During triage: Skip this step entirely. Set verification_status: "pending_coordinator" and verification_issues: []. The coordinator handles verification in Phase 2.5.
Standalone callers: Call para_fm_get and verify critical fields. Repair mismatches via para_fm_set.
Return the lightweight JSON proposal. The note is already created.
The CLI uses heuristic classifiers for common document types:
| Type | Filename Patterns | Content Patterns |
|---|---|---|
invoice | *invoice*, *receipt*, *bill* | "total", "amount due", "payment" |
contract | *contract*, *agreement* | "parties", "terms", "signature" |
cv | *cv*, *resume* | "experience", "education", "skills" |
letter | *letter* | "dear", "sincerely", formal address |
medical | *medical*, *health* | "diagnosis", "prescription", "patient" |
report | *report* | "findings", "analysis", "recommendations" |
# Full inbox scan (recommended)
para scan
# Execute approved suggestions
para execute
# Process specific file
para process-inbox --file "path/to/file.pdf"
# Preview without changes
para process-inbox --dry-run
# Auto-approve (no prompts)
para process-inbox --auto
# Registry management
para registry list # Show processed items
para registry remove # Remove from registry
para registry clear # Clear all
Unlike clippings and transcriptions, attachments are NOT deleted or moved:
00 Inbox/Attachments/doc.pdf)source linking to attachment[[00 Inbox/Attachments/doc.pdf]]This preserves the original document while creating a searchable, connected note.
{
"file": "00 Inbox/Attachments/Telstra-Invoice-Jan-2024.pdf",
"type": "attachment",
"proposed_title": "Telstra Invoice January 2024",
"proposed_template": "invoice",
"summary": "Monthly Telstra bill for January 2024. Total amount $89.95 for mobile plan. Due date February 15, 2024.",
"categorization_hints": [
"Monthly mobile plan charge: $89.95",
"Due date: February 15, 2024",
"Account number: 1234567890"
],
"area": "[[🌱 Finance]]",
"project": null,
"document_type": "invoice",
"source_format": "document",
"confidence": "high",
"notes": null
}
For ambiguous documents (multiple valid interpretations):
{
"options": [
{
"label": "A",
"interpretation": "Employment Contract",
"proposed_template": "resource",
"document_type": "contract",
"rationale": "Contains employment terms, salary, start date"
},
{
"label": "B",
"interpretation": "Offer Letter",
"proposed_template": "resource",
"document_type": "letter",
"rationale": "Formal letter format, conditional language"
},
{
"label": "C",
"interpretation": "HR Document",
"proposed_template": "resource",
"document_type": "document",
"rationale": "General HR documentation, reference material"
}
]
}
Beyond processing attachments, this skill serves as living documentation for the para CLI:
The CLI does the heavy lifting (extraction, classification). This skill documents when and how to use it.