From agentic-accounting
Conversationally interview a prospective Portuguese IRS client to capture their full profile and income data, validate it against the Classic Tax lead-intake schema, and finish by either handing them a paste-ready summary plus the https://www.classic.tax/intake link, or submitting directly to the intake API. Use whenever onboarding a new client, collecting intake/profiling data, "filling the intake", or building a lead profile for IRS filing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agentic-accounting:irs-intake-interviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run a friendly, structured interview that captures everything the **Classic Tax** lead intake
Run a friendly, structured interview that captures everything the Classic Tax lead intake
needs, then route the result to https://www.classic.tax/intake. The questions below mirror the
production intake form field-for-field, so the data you collect drops straight in.
Privacy. You are handling a person's tax identity and financial data (NIF, NISS, IBAN, amounts). Collect only what's below, keep it in this session, and never expose it beyond the summary you hand back to the person themselves.
/api/leads)* = required. Enums must use the exact values shown (left of the →).
fullName * — full legal name as on ID.nif * — Portuguese tax number (9 digits).email * — valid email.driveConnector * — google_drive → "Google Drive" | dropbox → "Dropbox" (where they'll
share documents).niss — Social Security number (optional).phone — optional (e.g. +351 ...).dateOfBirth — optional, YYYY-MM-DD.nationality — optional, country name.residency * — resident → "Tax resident in Portugal" | non_resident → "Non-resident".residencyRegime — only if resident, recommended: standard | nhr (NHR) |
young_irs (IRS Jovem) | ex_resident (Returning emigrant / ex-resident). If unsure → leave
empty and flag "to confirm".maritalStatus * — single | married | civil_union | divorced | widowed.married or civil_union also ask:
spouseName — spouse full name.spouseNif — spouse NIF (9 digits).jointFiling — joint → "Joint filing" | separate → "Separate filing" (explain the
choice can be optimized later).selectedIncomeTypes * — one or more of:
salaries (Category A) · self_employment (Category B / sole trader) · pensions ·
dividends · interest · crypto · rental · capital_gains · other.incomes[])For each selected income type, collect an object:
type * — the income-type key from section 3.source * — portugal | foreign.grossAmount * — gross annual amount in EUR (digits; the person can estimate, note if so).taxWithheld — tax already withheld in Portugal (EUR), optional.source = foreign:
country * — country of origin.taxWithheldAbroad — tax withheld abroad (EUR), optional.type = self_employment:
activityCodes — IRS activity code(s) (e.g. 1519).caiCodes — CAI/CAE code(s), optional.hasStableEstablishment — no | portugal | abroad.
abroad → stableEstablishmentCountry.type = other:
description — what this income is.bankAccounts * — at least one account:
country * (defaults to Portugal), iban *, bankName (optional), swift/BIC
(optional). Offer to add more accounts.efaturaValidated — yes ("all validated") | partial | no ("not yet") — have they
validated expenses in e-Fatura? (Tie-in: the efatura-reconciliation skill can help later.)additionalNotes — anything else relevant.nif (and spouseNif if present): 9 numeric digits — warn if it isn't.email: looks like an email.incomes[] entry with a grossAmount.iban.When the interview is complete, produce all three of the following:
Human-readable summary, grouped by the five sections, for the person to confirm.
Paste-ready payload — a JSON object using the exact field names above (include
"website": "" — it's an anti-spam honeypot that must stay empty). Shape:
{
"fullName": "", "nif": "", "email": "", "driveConnector": "google_drive",
"niss": "", "phone": "", "dateOfBirth": "", "nationality": "",
"residency": "resident", "residencyRegime": "",
"maritalStatus": "single", "spouseName": "", "spouseNif": "", "jointFiling": "",
"selectedIncomeTypes": ["salaries"],
"incomes": [
{ "type": "salaries", "source": "portugal", "grossAmount": "",
"taxWithheld": "", "taxWithheldAbroad": "", "country": "",
"activityCodes": "", "caiCodes": "", "hasStableEstablishment": "",
"stableEstablishmentCountry": "", "description": "" }
],
"bankAccounts": [ { "country": "Portugal", "bankName": "", "iban": "", "swift": "" } ],
"efaturaValidated": "", "additionalNotes": "", "website": ""
}
The submission options (default to the first):
POST https://www.classic.tax/api/leads with the JSON
payload and Content-Type: application/json. On success it returns
status: "success" and a one-time credentialsUrl (an /intake/credentials#token=...
link) for the secure document/credentials step — pass that link to the person.
⚠️ The endpoint is bot-protected; automated/non-browser requests may be rejected. If a
submission is blocked, fall back to the "open the intake form" path.Only submit directly if the person explicitly asks you to. Otherwise stop at the summary + link.
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub mathematica-ai/classic-tax-plugins --plugin agentic-accounting