A Claude Code skill that turns a filer's raw exports (broker, CAMS/KFintech, bank certificates, Form 16, prior ITR, AIS, US-broker RSU statements) into a verified Indian ITR data-collection workbook + a plain-English filing brief, for FY 2025-26 (AY 2026-27).
Decision-support organizer, not filing software. Not tax advice.
A return with capital gains scattered across brokers, mutual-fund RTAs, and banks turns filing into hours of collation: aggregating hundreds of individual lots, splitting each into the right §234C advance-tax quarter, classifying every fund, and footing each interest certificate by hand.
That grind hides the cases that cost money. Capital gains fall into four tax buckets, and the fourth (gold/international/FoF units under §112, and post-2023 debt funds under §50AA) is the one generic tools quietly misfile at the wrong rate. Loss set-off has to run highest-taxed-gain first, and residents below the basic-exemption threshold can absorb special-rate gains against the shortfall. Miss these and you overpay.
So the skill does the collation for you. Claude reads the messy, drifting export formats while deterministic scripts foot and verify the result, and every rupee of output traces back to source, checked to the paisa across six hand-verified fixtures. It reconciles against AIS/26AS too, flagging the phantom entries the government's pre-filled data sometimes carries rather than swallowing them.
Invoke the skill inside Claude Code, attach your exports, and describe anything that isn't in a file in plain English. It runs the rest: inventory the files, ask about any gaps, parse and classify, build the workbook, verify every figure, and hand back the workbook plus a filing brief.
Here the filer attaches their 26AS, AIS, capital-gains report, and one bank's interest statement, then mentions a second savings account by hand, giving its interest as four quarterly figures so nothing gets missed.
Redacting PII. To limit what you hand to the model, you can black out names, PANs, and account numbers in the source PDFs before attaching them. The skill works from the figures; where it genuinely needs an identifier it asks. On macOS, open the PDF in Preview and use Tools > Redact for a permanent redaction.
- It doesn't file for you. You still file on incometax.gov.in or through a CA/ERI. The output is a workbook of figures plus a brief, not a submitted return.
- It isn't tax advice. Check every material figure against the portal's own computation, or a professional, before filing.
- Only some income heads. It covers salary, capital gains, income from other sources (interest and dividends), and foreign assets, which is ITR-2 territory. It does not model house property (rent, home-loan interest), business or professional income including intraday, F&O, and presumptive 44AD/44ADA (those need ITR-3 or ITR-4), or virtual digital assets (crypto).
- New regime only. No old regime, and no old-vs-new comparison. If you have heavy 80C or home-loan deductions, compare old regime yourself on the portal.
- One filer per run. Family members mean re-running once each. PAN-level totals, clubbing, and the tax computation only hold for a single person.
- Vetted years only. FY 2025-26 today. A year without an authored, fixture-checked config hard-errors rather than reusing another year's rules.
- Reads text, not images. Password-protected or scanned PDFs are flagged as blockers to re-supply unlocked or as text. No OCR, no decryption.
- Asks, never fetches. FX rates, PANs, and fund classifications that need judgment are asked of you. Nothing is pulled online or silently defaulted.
- Some computations are deliberately out of scope (and flagged in the brief): surcharge marginal relief, 234A/B/C interest, old-regime Chapter VI-A, and brought-forward loss set-off against foreign STCG.
SKILL.md # the skill: entry point + the 7-phase pipeline procedure
itr-skill-spec.md # design spec + decision log (23 decisions, two grilling rounds)
scripts/
itr_builder.py # builds the 8-sheet workbook (blank template or --fill)
aggregate.py # collapses raw lots -> aggregated rows (round-trip validated)
recalc.py # headless LibreOffice recalc (optional; graceful if absent)
verify.py # two-tier conservation/footing + tax-value assertions
reconcile.py # AIS/26AS delta triage (report-only)
brief.py # generate filing-brief.md from the recalc'd workbook
run.sh # driver: chains aggregate->build->recalc->verify->reconcile->brief
year_config.py # vetted-years-only loader (refuses unknown years)
references/
domain-notes.md # tax rules + data-shape quirks (authoritative)
source-formats.md # per-source parsing cheat-sheet
ais-delta-rules.md # AIS reconciliation triage rules
year-config/FY2025-26.json # vetted rates/thresholds/quarter-dates
fixtures/ # 6 worked examples, each with a hand-computed expected.json
examples/ # blank template reference
tests/
regression.sh # build -> recalc -> verify every fixture; runs aggregate unit tests
test_aggregate.py
- Python 3 +
openpyxl+pypdf(pip install -r requirements.txt). - LibreOffice optional but recommended (
brew install --cask libreoffice). Only needed to evaluate the workbook's own formulas (recalc + tax verification); the conservation/footing checks run without it.
bash tests/regression.sh
Builds, recalcs (if LibreOffice present), and verifies all six fixtures; each tax result is asserted to the rupee against a hand computation.
- Phase 1 ✅ engine: structure, year-config, builder refactor, verify/recalc.
- Phase 2 ✅ tax-branch coverage: RSU reconcile, b/f loss set-off, 6 fixtures.
- Phase 3 ✅ ingestion: SKILL.md pipeline, source-format cheat-sheet, aggregate.py. End-to-end validated on a real filer's exports (broker tradewise, consolidated MF capital-gains statement, two bank interest certificates): parse → classify → aggregate → build reproduced the known-good workbook to the paisa across all four tax buckets.
- Phase 4 ✅ AIS/26AS reconciliation:
reconcile.pytriages deltas (EXPECTED / INVESTIGATE / LIKELY-AIS-ERROR), report-only. Validated on a real 26AS: correctly flagged a small §193 bond-interest entry (with its TDS) as missing income, while the dividend rows reconciled exactly and were collapsed. - Phase 5 ✅ deliverables: brief.py generates filing-brief.md (bottom line, schedule mapping, classification record, embedded AIS reconciliation, open items). Validated on the dry-run filer: Schedule CG table reproduces the workbook to the rupee.
