From tax-bunyip
Produces the trading company's quarterly BAS working paper — GST (G1/1A, G11/1B), PAYG withholding (W1/W2), and PAYG instalments (T7) — collated for a registered tax agent or the lodging individual. Produces an asserted figure for a BAS obligation ONLY when that obligation's GST/PAYG registration is confirmed in config; an unconfirmed registration emits an [accountant to confirm] flag and asserts no figures. Renders provisionally on still-pending rates (never blocks). GST-creditable vs non-creditable on tag-less ledger lines is surfaced as an accountant open question, never assumed. Routes through the tax-bunyip hub. Asserts no final tax position.
How this skill is triggered — by the user, by Claude, or both
Slash command
/tax-bunyip:company-basThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Routes through the **tax-bunyip** foundation hub — read its standing instructions
Routes through the tax-bunyip foundation hub — read its standing instructions
first (skills/tax-bunyip/SKILL.md). This spoke produces the trading company's
quarterly Business Activity Statement working paper (scripts/spokes/bas_gst.py).
It is the suite's first output exercised end-to-end — it runs the attribution
core, the company-pre-attributed ledger path, and the assembly substrate against a
real company ledger. It collates and flags — it asserts no final tax number. The
registered tax agent — or the lodging individual — finalises every figure;
every computed line is marked [accountant to confirm].
| Section | ATO label | Source | Rate |
|---|---|---|---|
| GST on sales | GST_G1_1A (G1 / 1A) | positive ledger lines | gst_rate (provisional) |
| GST on purchases | GST_G11_1B (G11 / 1B) | negative purchase/expense lines | gst_rate (provisional) |
| PAYG withholding W1 | PAYG_W1 | gross wages paid | — (cash figure) |
| PAYG withholding W2 | PAYG_W2 | amounts withheld | — (cash figure) |
| PAYG instalment T7 | PAYG_T7 | instalment income | payg_instalment_rate (provisional) |
A BAS obligation's figure is produced only when that obligation's registration is confirmed in the entity config:
entities:
trading_company:
registrations:
gst: { confirmed: true, registered: true, accounting_basis: accrual }
payg_withholding: { confirmed: true, registered: true }
payg_instalments: { confirmed: true, registered: true }
Registration is never assumed. A missing registrations block, a missing
obligation, or confirmed: false reads as unconfirmed — the spoke asserts
no figure for that obligation and emits an [accountant to confirm]
registration flag (a finalization-block disposition: the draft still
renders, the gap is named, no number is asserted). registration_status is the
single accessor.
The company ledger is pre-attributed to the company (ingest.attribute_ledger_rows
/ is_pre_attributed) — it never runs through the attribution state machine.
Pre-attribution to the company is a confirmed assignment, so the assembly lines
this spoke builds carry confirmed-single (the gate-satisfying state assembly
admits) with the pre_attributed_company provenance preserved on each line.
A tag-less ledger line cannot carry the GST-creditable vs non-creditable
distinction. This spoke does not decide it and does not pull the HITL loop
forward for it — every purchase/expense line is surfaced as an accountant
open question (gst-creditability-undetermined). The GST-on-purchases figure
renders provisionally with the question attached; the accountant confirms.
Every rate-derived figure pulls its rate from config/rates.yaml via the assembly
substrate's rate_key mechanism (gst_rate, payg_instalment_rate). No rate
literal appears in the spoke. All seeded rates are pending, so a fresh repo
renders the BAS provisionally end-to-end (the first dry-run), every
rate-derived figure flagged and listed in the pending-rate appendix — it never
blocks. The PAYG-instalment rate is Commissioner-issued per entity (not a fixed
statutory percentage); the accountant replaces the placeholder with the notified
rate before any T-figure is treated as real.
This unit is the project's success signal: the registered tax agent — or the lodging individual — confirming this BAS is usable (or usable with named gaps). Its critical path is the full attribution core — "first output" means nothing renders before it. The first dry-run also reports a refusal-volume estimate and a company coverage probe (own-account total vs company-attributed feed lines); if refusals dominate or coverage is materially incomplete, that is a finding to act on, not a silent pass.
scripts/spokes/bas_gst.py)Canonical invocation: ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh scripts/spokes/bas_gst.py
produce_bas(ledger_df, entity=..., fy=..., entity_config=..., source_doc=...) → BasResultregistration_status(entity_config, entity, obligation) → {obligation, confirmed, basis}build_bas_lines(ledger_df, entity=..., registrations=...) → (lines, creditability_questions)write_bas(result, base_dir=...) → atomic Markdown + Excel (delegates to the assembly substrate)BasResult.asserts_no_gst_figure / BasResult.summary()npx claudepluginhub reebz/tax-bunyip --plugin tax-bunyipProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.