From tax-filing
Prepares federal and state tax returns by extracting data from source documents, computing taxes, and filling official PDF forms.
npx claudepluginhub robbalian/claude-tax-filingThis skill uses the workspace's default tool permissions.
Prepare federal and state income tax returns: read source documents, compute taxes, fill official PDF forms.
Advises on US taxes for W-2, 1099, S-Corp filers: identifies deductions, logs expenses to JSON, assesses audit risk, optimizes brackets, plans estimated payments, handles multi-state filing and life events.
Verifies profiles, runs checklists on tax forms, flags mistakes, and guides e-Tax/mail/in-person submission for shinkoku Japanese tax returns.
Automates NZ IR3 individual income tax return filing for 2026 tax year via myIR portal browser automation. Uses pre-populated data, pauses for user login and explicit submit confirmation.
Share bugs, ideas, or general feedback.
Prepare federal and state income tax returns: read source documents, compute taxes, fill official PDF forms.
Year-agnostic — always look up current-year brackets, deductions, and credits. Never reuse prior-year values.
Organize all work into subfolders of the working directory:
working_dir/
source/ ← user's source documents (W-2, 1099s, prior return, CSVs)
work/ ← ALL intermediate files (extracted data, field maps, computations)
tax_data.txt ← extracted figures from source docs
computations.txt ← all tax math (federal, state, capital gains)
f1040_fields.json ← field discovery dumps
f8949_fields.json
f1040sd_fields.json
ca540_fields.json
expected_*.json ← verification expected values
forms/ ← blank downloaded PDF forms
f1040_blank.pdf
f8949_blank.pdf
f1040sd_blank.pdf
ca540_blank.pdf
output/ ← final filled PDFs + fill script
fill_YEAR.py ← the fill script
f1040_filled.pdf
f8949_filled.pdf
f1040sd_filled.pdf
ca540_filled.pdf
Create these folders at the start. Keep the working directory clean — no loose files.
These rules prevent context blowouts that cause compaction:
python3 -c "
import pdfplumber
with pdfplumber.open('source/document.pdf') as pdf:
for p in pdf.pages: print(p.extract_text())
"
work/tax_data.txt on first read.work/. Do NOT use --search repeatedly.work/computations.txt so they survive compaction.Ask the user what documents they have. Read files from source/ (move them there if needed). Use pdfplumber for PDFs, Read tool for CSVs.
Save all extracted figures to work/tax_data.txt immediately — one section per document with every relevant number.
You MUST ask the user every one of these questions and WAIT for answers before proceeding. Do NOT skip this step even if you think you know the answers from memory or source documents. Tax returns are legal documents.
Do NOT proceed to Step 3 until the user has answered. "Same as last year" counts as confirmation.
Research from IRS.gov and FTB.ca.gov:
Save to work/computations.txt.
Save all line values to work/computations.txt.
Rounding rule: Form 8949 and Schedule D must use exact cents matching the 1099-B / 1099-DA source documents. Only Form 1040 rounds to the nearest whole dollar (Line 7 = round of Schedule D Line 16). Do NOT round amounts on 8949 or Schedule D.
Save to forms/ directory.
IRS: Use /irs-prior/ for prior-year forms (/irs-pdf/ is always current year):
https://www.irs.gov/pub/irs-prior/f1040--YEAR.pdf
https://www.irs.gov/pub/irs-prior/f8949--YEAR.pdf
https://www.irs.gov/pub/irs-prior/f1040sd--YEAR.pdf
CA: ftb.ca.gov/forms/YEAR/ for state forms.
Verify each download has %PDF- header (not an HTML error page).
--compactpython scripts/discover_fields.py forms/f1040_blank.pdf --compact > work/f1040_fields.json
python scripts/discover_fields.py forms/f8949_blank.pdf --compact > work/f8949_fields.json
python scripts/discover_fields.py forms/f1040sd_blank.pdf --compact > work/f1040sd_fields.json
python scripts/discover_fields.py forms/ca540_blank.pdf --compact > work/ca540_fields.json
--compact outputs a minimal {field_name: description} mapping — each field name is paired with its tooltip/speak description so you can map line numbers to field names directly without manual inspection. Radio buttons include their option values (e.g. {"/2": "Single", "/1": "MFJ"}).
Do NOT use --search repeatedly or --json (which dumps raw metadata and wastes context).
HARD FAIL: If discovery returns 0 human-readable descriptions, STOP. Do not guess field names.
Write output/fill_YEAR.py using scripts/fill_forms.py:
add_suffix(d) — appends [0] to text field keys. Required for IRS forms.fill_irs_pdf(in, out, fields, checkboxes, radio_values) — IRS forms. radio_values for filing status, yes/no, checking/savings.fill_pdf(in, out, fields, checkboxes) — CA forms. Matches by /Parent chain + /AP/N keys.Output filled PDFs to output/.
python scripts/verify_filled.py output/f1040_filled.pdf work/expected_f1040.json
Fix any failures, re-run fill script.
Show a summary table, verification checklist, capital loss carryover (if any), then:
After completing the MFJ return, compute what each spouse would owe if they filed Single instead. This helps the couple understand the tax impact of their filing status choice.
For each spouse, compute a hypothetical Single return:
Present a side-by-side comparison table:
| MFJ (actual) | Both Single | Difference | |
|---|---|---|---|
| Combined tax | |||
| Combined withheld | |||
| Combined owed |
Include key takeaways — especially the Additional Medicare Tax threshold difference ($250K MFJ vs $200K Single per spouse), which is often the largest driver of the MFJ vs Single gap.
work/tax_data.txt--compact — no --json (wastes context), no repeated --search/AcroForm → /XFA array, NOT from brute-force xref scanningxml.etree for XFA — use regex (IRS XML has broken namespaces)/V and /AS to /1 or /Off[0] suffix — use add_suffix()/T directly; radio groups match by /AP/N key via radio_valuesf1_01-f1_03) are fiscal year headers, not name fields. SSN = 9 digits, no dashes. Digital assets = crypto only, not stocks.f1_115-f1_119), not after last data row. Schedule D lines 1b/8b (from 8949), not 1a/8a._RO suffix (read-only) — skip those.540-PPNN (page+sequence, NOT line numbers). Checkboxes end with " CB", radio buttons use named AP keys.irs.gov/pub/irs-prior/, current = irs.gov/pub/irs-pdf/