Create resource notes from analyzed proposals. Use when triage orchestrator routes a proposal with proposed_template=resource. Handles frontmatter setup and original file cleanup via para_create.
From para-obsidiannpx claudepluginhub nathanvale/side-quest-marketplace-old --plugin para-obsidianThis skill is limited to using the following tools:
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.
Create a resource note from an analyzed proposal.
You receive a proposal object from an analyzer skill:
{
"file": "00 Inbox/✂️ Article Title.md",
"type": "clipping|transcription|attachment",
"proposed_title": "Meaningful Title",
"proposed_template": "resource",
"summary": "2-3 sentence summary",
"categorization_hints": ["hint1", "hint2", "hint3"],
"area": "[[🌱 Area Name]]",
"project": "[[🎯 Project Name]]",
"resourceType": "article|tutorial|reference|thread|video|idea",
"source_format": "article|video|thread|document|audio",
"author": "Author Name",
"source_url": "https://..."
}
Create the resource note and handle the original file.
Before creating the note, query the resource template for its current structure:
para_template_fields({ template: "resource", response_format: "json" })
Extract from response:
validArgs → which args to pass to para_createcreation_meta.dest → destination foldercreation_meta.contentTargets → section headings for content injection (e.g., ["Layer 1: Captured Notes"])creation_meta.sections → all body section headingsCRITICAL: Use frontmatter-only approach. ALL data in args, NEVER in content.
Use discovered validArgs for field names and creation_meta.dest for destination:
para_create({
template: "resource",
title: proposal.proposed_title,
dest: "<discovered-dest>",
args: {
summary: proposal.summary,
source: proposal.source_url,
resource_type: proposal.resourceType,
source_format: proposal.source_format, // Enables 📚🎬 emoji prefix (video, thread, etc.)
// Single area: pass string directly — "[[🌱 Area]]"
// Multiple areas: pass JSON array string — '["[[🌱 Area 1]]", "[[🌱 Area 2]]"]'
areas: Array.isArray(proposal.area) ? JSON.stringify(proposal.area) : proposal.area,
projects: Array.isArray(proposal.project) ? JSON.stringify(proposal.project) : proposal.project,
author: proposal.author || null,
distilled: "false"
},
response_format: "json"
})
Note: para_create parses JSON array strings automatically via tryParseJsonArray(). Single wikilink strings are backward-compatible (stored as-is in frontmatter).
Note: During triage (/para-obsidian:triage), cleanup is owned by the coordinator's Phase 5 — not this skill. The triage-worker creates notes inline and the coordinator handles deletion/archival after user approval. This step only applies when create-resource is used as a standalone skill outside triage.
Based on the original file type:
| Type | Action |
|---|---|
clipping | Delete: para_delete({ file, confirm: true }) |
transcription | Archive: para_rename({ from, to: "04 Archives/Transcriptions/..." }) |
attachment | Keep in place (referenced via source link) |
Return success with created file path:
{
"success": true,
"created": "03 Resources/Meaningful Title.md",
"original_action": "deleted|archived|kept"
}
Use validArgs from Step 0 to determine accepted fields. The resource template typically accepts these frontmatter fields, but always verify against discovered validArgs:
| Field | Required | Description |
|---|---|---|
summary | Yes | 2-3 sentence description |
source | Yes | Original URL or file link |
resource_type | Yes | article, tutorial, reference, thread, video, idea |
source_format | No | article, video, thread, document, audio |
areas | Yes | Wikilink string or JSON array of wikilinks (e.g., '["[[A1]]", "[[A2]]"]') |
projects | No | Wikilink string or JSON array of wikilinks |
author | No | Content author if known |
distilled | Yes | Always "false" for new resources |
If para_create fails:
{
"success": false,
"error": "Template validation failed: missing required field 'areas'",
"proposal": { ... }
}
This skill does NOT inject Layer 1 content. It only creates the note with frontmatter.
Layer 1 injection (populating the content target section discovered via creation_meta.contentTargets[0] in Step 0, typically "Layer 1: Captured Notes") is the calling subagent's responsibility. The triage subagent has the enriched content in its context and calls para_replace_section after para_create. See subagent-prompts.md Step 4 for details.
Extracted from triage orchestrator Phase 5 to enable: