skill-finance
Financial analysis and verification for founders
Best use case
skill-finance is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Financial analysis and verification for founders
Teams using skill-finance should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/skill-finance/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How skill-finance Compares
| Feature / Agent | skill-finance | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Financial analysis and verification for founders
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Finance Skill
Thin wrapper that routes financial analysis requests to the `finance-agent`.
**IMPORTANT**: This skill implements the skill-internal postflight pattern. After the subagent returns,
this skill handles all postflight operations (status update, artifact linking, git commit) before returning.
## Context Pointers
Reference (do not load eagerly):
- Path: `.claude/context/formats/subagent-return.md`
- Purpose: Return validation
- Load at: Subagent execution only
Note: This skill is a thin wrapper. Context is loaded by the delegated agent, not this skill.
## Trigger Conditions
This skill activates when:
### Direct Invocation
- User explicitly runs `/finance` command with task number
- User runs `/research` on a founder task with `task_type: "finance"`
### Implicit Invocation (during task implementation)
When an implementing agent encounters any of these patterns:
**Plan step language patterns**:
- "Analyze financials"
- "Verify revenue numbers"
- "Financial model"
- "Cash flow analysis"
**Target mentions**:
- "financial verification"
- "revenue model"
- "burn rate", "runway"
- "unit economics", "CAC/LTV"
### When NOT to trigger
Do not invoke for:
- Market sizing (use skill-market)
- Competitive analysis (use skill-analyze)
- GTM strategy (use skill-strategy)
- Contract review (use skill-legal)
- Cost breakdown from scratch (use skill-spreadsheet)
- General business research (use skill-researcher)
---
## Execution Flow
### Stage 1: Input Validation
Validate required inputs:
- `task_number` - Must be provided and exist in state.json
- `mode` - Optional, one of: AUDIT, MODEL, FORECAST, VALIDATE
```bash
# Lookup task
task_data=$(jq -r --argjson num "$task_number" \
'.active_projects[] | select(.project_number == $num)' \
specs/state.json)
# Validate exists
if [ -z "$task_data" ]; then
return error "Task $task_number not found"
fi
# Extract fields
language=$(echo "$task_data" | jq -r '.language // "founder"')
status=$(echo "$task_data" | jq -r '.status')
project_name=$(echo "$task_data" | jq -r '.project_name')
description=$(echo "$task_data" | jq -r '.description // ""')
task_type=$(echo "$task_data" | jq -r '.task_type // "finance"')
# Extract pre-gathered forcing_data (if present)
forcing_data=$(echo "$task_data" | jq -r '.forcing_data // null')
pre_gathered_mode=$(echo "$forcing_data" | jq -r '.mode // null' 2>/dev/null)
# Validate mode if provided
if [ -n "$mode" ]; then
case "$mode" in
AUDIT|MODEL|FORECAST|VALIDATE) ;;
*) return error "Invalid mode: $mode. Must be AUDIT, MODEL, FORECAST, or VALIDATE" ;;
esac
fi
```
---
### Stage 2: Preflight Status Update
Update task status to "researching" BEFORE invoking subagent.
**Update state.json**:
```bash
jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--arg status "researching" \
--arg sid "$session_id" \
'(.active_projects[] | select(.project_number == '$task_number')) |= . + {
status: $status,
last_updated: $ts,
session_id: $sid
}' specs/state.json > specs/tmp/state.json && mv specs/tmp/state.json specs/state.json
```
**Update TODO.md**: Use Edit tool to change status marker to `[RESEARCHING]`.
---
### Stage 3: Create Postflight Marker
```bash
padded_num=$(printf "%03d" "$task_number")
mkdir -p "specs/${padded_num}_${project_name}"
cat > "specs/${padded_num}_${project_name}/.postflight-pending" << EOF
{
"session_id": "${session_id}",
"skill": "skill-finance",
"task_number": ${task_number},
"operation": "research",
"reason": "Postflight pending: status update, artifact linking, git commit",
"created": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
}
EOF
```
---
### Stage 4: Prepare Delegation Context
Include pre-gathered forcing_data when available:
```json
{
"task_context": {
"task_number": N,
"project_name": "{project_name}",
"description": "{description}",
"language": "founder",
"task_type": "finance"
},
"forcing_data": {
"mode": "{pre_gathered_mode}",
"financial_document": "{pre_gathered_document}",
"primary_objective": "{pre_gathered_objective}",
"time_horizon": "{pre_gathered_horizon}",
"key_assumptions": "{pre_gathered_assumptions}",
"decision_context": "{pre_gathered_context}",
"gathered_at": "{timestamp}"
},
"mode": "AUDIT|MODEL|FORECAST|VALIDATE or use forcing_data.mode",
"metadata_file_path": "specs/{NNN}_{SLUG}/.return-meta.json",
"metadata": {
"session_id": "sess_{timestamp}_{random}",
"delegation_depth": 1,
"delegation_path": ["orchestrator", "finance", "skill-finance"]
}
}
```
**Note**: If `forcing_data` is present from STAGE 0 of /finance command, pass it to the agent.
The agent will use pre-gathered data and only ask follow-up questions for missing details.
---
### Stage 5: Invoke Agent
**CRITICAL**: You MUST use the **Task** tool to spawn the agent.
**Required Tool Invocation**:
```
Tool: Task (NOT Skill)
Parameters:
- subagent_type: "finance-agent"
- prompt: [Include task_context, forcing_data, mode, metadata_file_path, metadata]
- description: "Financial analysis and verification"
```
The agent will:
- Use pre-gathered forcing_data if available (skip already-answered questions)
- Present mode selection only if not pre-selected
- Read financial documents if file path provided
- Extract and validate numbers from source documents
- Create verification spreadsheet (.xlsx with formulas)
- Export JSON metrics for Typst integration
- Create research report at specs/{NNN}_{SLUG}/reports/
- Write metadata file
- Return brief text summary
---
### Stage 6: Parse Subagent Return
```bash
padded_num=$(printf "%03d" "$task_number")
metadata_file="specs/${padded_num}_${project_name}/.return-meta.json"
if [ -f "$metadata_file" ] && jq empty "$metadata_file" 2>/dev/null; then
status=$(jq -r '.status' "$metadata_file")
artifact_path=$(jq -r '.artifacts[0].path // ""' "$metadata_file")
artifact_type=$(jq -r '.artifacts[0].type // ""' "$metadata_file")
artifact_summary=$(jq -r '.artifacts[0].summary // ""' "$metadata_file")
else
status="failed"
fi
```
---
### Stage 7: Update Task Status (Postflight)
If status is "researched", update state.json and TODO.md.
**Update state.json**:
```bash
jq --arg ts "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--arg status "researched" \
'(.active_projects[] | select(.project_number == '$task_number')) |= . + {
status: $status,
last_updated: $ts
}' specs/state.json > specs/tmp/state.json && mv specs/tmp/state.json specs/state.json
```
**Update TODO.md**: Use Edit tool to change status marker to `[RESEARCHED]`.
---
### Stage 8: Link Artifacts
Add artifact to state.json with summary.
**IMPORTANT**: Use two-step jq pattern to avoid escaping issues.
```bash
if [ -n "$artifact_path" ]; then
# Step 1: Filter out existing research artifacts (use "| not" pattern)
jq '(.active_projects[] | select(.project_number == '$task_number')).artifacts =
[(.active_projects[] | select(.project_number == '$task_number')).artifacts // [] | .[] | select(.type == "research" | not)]' \
specs/state.json > specs/tmp/state.json && mv specs/tmp/state.json specs/state.json
# Step 2: Add new research artifact
jq --arg path "$artifact_path" \
--arg type "$artifact_type" \
--arg summary "$artifact_summary" \
'(.active_projects[] | select(.project_number == '$task_number')).artifacts += [{"path": $path, "type": $type, "summary": $summary}]' \
specs/state.json > specs/tmp/state.json && mv specs/tmp/state.json specs/state.json
fi
```
**Update TODO.md**: Add research artifact link using count-aware format.
**Strip specs/ prefix for TODO.md** (TODO.md is inside specs/): `todo_link_path="${artifact_path#specs/}"`
Use count-aware artifact linking format per `.claude/rules/state-management.md` "Artifact Linking Format".
---
### Stage 9: Git Commit
```bash
git add -A
git commit -m "task ${task_number}: complete research
Session: ${session_id}
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>"
```
---
### Stage 10: Cleanup
```bash
rm -f "specs/${padded_num}_${project_name}/.postflight-pending"
rm -f "specs/${padded_num}_${project_name}/.postflight-loop-guard"
rm -f "specs/${padded_num}_${project_name}/.return-meta.json"
```
---
### Stage 11: Return Brief Summary
```
Financial analysis research completed for task {N}:
- Mode: {mode}, {questions_asked} forcing questions completed
- Document: {financial_document}
- Objective: {primary_objective}
- Pre-gathered data used: {yes/no}
- Verification spreadsheet: specs/{NNN}_{SLUG}/financial-verification.xlsx
- Research report: specs/{NNN}_{SLUG}/reports/01_{short-slug}.md
- Status updated to [RESEARCHED]
- Changes committed
- Next: Run /plan {N} to create implementation plan
```
---
## Return Format
Brief text summary (NOT JSON).
Expected successful return:
```
Financial analysis research completed for task 330:
- Mode: AUDIT, 7 forcing questions completed
- Document: Q1 2026 P&L statement
- Objective: Verify revenue projections for Series A deck
- Pre-gathered data used: yes (5 questions from STAGE 0)
- Verification spreadsheet: specs/330_financial_analysis_q1/financial-verification.xlsx
- Research report: specs/330_financial_analysis_q1/reports/01_financial-analysis.md
- Status updated to [RESEARCHED]
- Changes committed with session sess_1736700000_abc123
- Next: Run /plan 330 to create implementation plan
```
---
## Error Handling
### Input Validation Errors
Return immediately if task not found.
### Metadata File Missing
Keep status as "researching" for resume.
### User Abandonment
Return partial status with progress made.
### Git Commit Failure
Non-blocking: Log failure but continue.Related Skills
skill-learn
Scan codebase for FIX:/NOTE:/TODO:/QUESTION: tags and create structured tasks with interactive selection. Invoke for /learn command.
skill-deck
Generate YC-style investor pitch decks in Typst
skill-todo
Archive completed and abandoned tasks with CHANGE_LOG.md updates and memory harvest suggestions
skill-team-research
Orchestrate multi-agent research with wave-based parallel execution. Spawns 2-4 teammates for diverse investigation angles and synthesizes findings.
skill-team-plan
Orchestrate multi-agent planning with parallel plan generation. Spawns 2-3 teammates for diverse planning approaches and synthesizes into final plan with trade-off analysis.
skill-team-implement
Orchestrate multi-agent implementation with parallel phase execution. Spawns teammates for independent phases and coordinates dependent phases. Includes debugger teammate for error recovery.
skill-status-sync
Atomically update task status across TODO.md and state.json. For standalone use only.
skill-spawn
Research blockers and spawn new tasks to overcome them, updating parent task dependencies
skill-researcher
Conduct general research using web search, documentation, and codebase exploration. Invoke for general research tasks.
skill-refresh
Manage Claude Code resources - terminate orphaned processes and clean up ~/.claude/ directory
skill-planner
Create phased implementation plans from research findings. Invoke when a task needs an implementation plan.
skill-orchestrator
Route commands to appropriate workflows based on task language and status. Invoke when executing /task, /research, /plan, /implement commands.