From tax-bunyip
Maintains a Division 7A candidate-loan register for the trading company — tracks the benchmark interest rate and the s109E minimum yearly repayment (MYR), flags shortfalls before 30 June and before lodgement, and is first-year-aware so no false FY2026 MYR shortfall is raised. Models the company reimbursement loop as a CANDIDATE loan account with an [accountant to confirm] flag — never an assertion that it IS a Division 7A loan. Renders provisionally on the still-pending benchmark rate (never blocks). Routes through the tax-bunyip hub. Asserts no Division 7A position and no final tax number.
How this skill is triggered — by the user, by Claude, or both
Slash command
/tax-bunyip:div7a-registerThe 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 maintains a Division 7A
candidate-loan register (scripts/spokes/div7a.py). It collates and flags — it
asserts no Division 7A position and no final tax number. A registered tax
agent owns the loan characterisation and every figure; every computed figure is
marked [accountant to confirm].
This is a register, not an ATO-label-mapped schedule, so it does not route
through the ATO-label assembly substrate and adds nothing to
config/ato_labels.sample.yaml. Its output is a structured register of candidate
loan accounts, each with its MYR figure and its shortfall / candidate / provisional
flags, rendered as a standalone Markdown + JSON working paper under the gitignored
working-papers/ tree (0600).
The minimum yearly repayment is the s109E annuity (ITAA 1936):
MYR = (opening_balance * rate) / (1 - (1 + rate) ** -remaining_term)
rate — the Division 7A benchmark interest rate, read from
config/rates.yaml via the div7a_benchmark_interest_rate key. It is never
duplicated in the spoke; config/div7a.sample.yaml only names the key
(benchmark_rate_key).remaining_term — the maximum loan term (7 years unsecured / 25 years
secured, from config/div7a.sample.yaml loan_terms:) minus the number of full
income years elapsed since the loan was made.The formula lives in scripts/spokes/div7a.py; every literal it consumes
comes from config (no rate/term literal in code).
A complying loan's first MYR is due in the income year after the year the
loan was made (s109E). So a candidate loan made in the company's first income
year has no MYR obligation for that first year, and the spoke suppresses what
would be a false FY2026 shortfall flag — delegating the decision to
scripts.first_year (div7a_myr_required, div7a_first_year_shortfall_suppressed)
so the suppression has one source of truth. A second-year loan below its MYR raises
a real pre-30-June shortfall flag.
The company reimbursement loop (business expenses run on personal cards then
reimbursed) is modelled as a candidate loan account. It appears in the register
with a reimbursement-loop-candidate flag and the standing
candidate-loan-not-asserted flag, both [accountant to confirm], stating the
suite does not assert it is a Division 7A loan. Whether Division 7A applies is
the accountant's determination.
The benchmark rate is pending in config/rates.yaml, so a computed MYR renders
provisionally (a provisional-benchmark-rate flag fires) and is listed for the
accountant — it never blocks. The benchmark resets each July and must be
re-confirmed.
Each loan's lender must be allowed to produce a div7a_register — a Division 7A
loan is made by a private company. A lender whose role's produces allow-list lacks
div7a_register (an individual, the trust, the corporate trustee) is un-producible,
not silently skipped: produce_register raises.
scripts/spokes/div7a.py)Canonical invocation: ${CLAUDE_PLUGIN_ROOT}/scripts/run.sh scripts/spokes/div7a.py
produce_register(assessment_fy, entity_config=..., loans=..., actuals=...) → Div7aRegisterassess_loan(account, assessment_fy, model=..., actual_repayment=...) → register rowminimum_yearly_repayment(opening_balance, rate_value, rem_term) → float (the s109E annuity)remaining_term(loan_made_value, assessment_fy, secured) → intbenchmark_rate() → Rate (from config/rates.yaml, provisional)render_markdown(register) / write_register(register, base_dir=...) → atomic Markdown + JSON (0600)Div7aRegister.candidate_only / .shortfall_rows / .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.