Repository navigation
Releases: ryanduguid/australian-accounting
Release list
solomons-sword/v0.2.0
v0.2.0
- Require Python 3.11 or later. CPython 3.10 reached end of life on 1 October 2026; 0.1.10 remains the last release that installs on Python 3.10 (#351).
s99b-checkreports arithmetic that overflows, or a figure too large to write out (1E+1000000or more), with oneerror:line and exit 2. It used to end in adecimal.Overflowtraceback or write the figure in full: 1.33 MB of digits at1e1000000(#344).s100a-checkrefuses an amount of1E+1000000or more with oneerror:line and exit 2 instead of printing it in full (#344). The README states the supported amount range.
v0.1.10
- The four public trust calculation and validation functions accept only
True,FalseorNone(unknown) for each boolean fact, and raise aValueErrornaming the field for anything else. In 0.1.9,is_signed_by_trustee="False"ordefault_beneficiary_clause_exists=0could produce a valid resolution, a textual circular-flow flag could produceGREEN, and textual residency flags could produce allocations or assessments. Unknown facts are handled as before (#326).
v0.1.9
- Breaking:
TrustResolutionSchedulegains 2 required facts.uses_specific_streamingsays whether the resolution streams capital gains or franked distributions; missing streaming powers are now a defect only when it does, so an ordinary proportionate resolution under a deed without streaming powers validates.deed_resolution_deadlineis the deed's own deadline, or 30 June where the deed sets none; a resolution after an earlier deed date is late, and a later deed date does not extend 30 June. Either fact passed asNoneis reported as not established where the answer turns on it. - Breaking:
calculate_proportionate_sharerefuses a positive trust-levelnet_capital_gainsorfranked_dividends, streamed or not, because Division 6E applies to them either way and is not implemented. Franking credits supplied without franked dividends are still allocated in proportion. - Section 100A zones follow PCG 2022/2's own scenarios. A corporate unpaid entitlement without a Division 7A loan and a parent retaining an adult child's entitlement no longer return RED on their own; each now blocks GREEN and leaves the arrangement unzoned. Red zone scenario 1 (an adult child's entitlement applied to expenses from before they turned 18) gains its own fact. GREEN needs receipt within 2 years, the rest of scenario 3A or 3B for a retained loan and no paragraph 32 exclusion; the
s100a-checkcommand gains a flag for each new fact. - Migration: construct
TrustResolutionSchedulewithuses_specific_streaminganddeed_resolution_deadline(30 June where the deed sets no earlier date). A Section 100A call now needs all 11 facts, not 7, to reachGREENorOUTSIDE_GREEN. Unlike 0.1.8, results for fully supplied inputs can change: the 2 former RED triggers now leave an arrangement unzoned, and a trust with net capital gains or franked dividends is refused. calculate_proportionate_sharerefuses a non-finitenet_capital_gainsorfranked_dividendswith aValueError.- These changes arrived in #300, which holds the review record. The first two
solomons-sword/v0.1.9tags stopped at the release gate before building: the first pointed at a commit behindmain, and the second at amaincommit whose push-triggered CI had skipped this package. Nothing was published from either.
v0.1.8
- Breaking input requirements: every Section 100A fact, both Division 6 beneficiary status facts and the 3 trust resolution deed facts are now stated as
TrueorFalse, or reported as not established.BeneficiaryEntitlement.is_residentandForeignTrustReceipt.beneficiary_was_resident_during_yearhave no default at all, so a construction that omits either raisesTypeError; pass them explicitly.beneficiary_was_resident_during_yearalso moves ahead of the optional exemption amounts, so a call that passed 3 or more positional arguments toForeignTrustReceiptneeds updating.is_under_legal_disability, the Section 100A facts and the resolution facts default toNone, which the engine refuses or reports rather than reading asFalse. - Migration: state the facts.
BeneficiaryEntitlement(name, is_resident=True, is_under_legal_disability=False, ...)reproduces the old defaults where the operator has established them; a Section 100A call needs all 7 facts to reachGREENorOUTSIDE_GREEN, and the command line gains a--no-form for each one;validate_trust_resolutionnow returnsbool | None, whereNonemeans a deed fact was never established. Results for fully supplied inputs are unchanged. - Section 99B keeps its nil exemption defaults, which give the largest assessable amount, and the result carries one caveat naming every exemption amount that arrived as nil, together with a nil s 99B(2)(a) corpus add-back, which runs the other way and leaves the whole corpus exempt. The
s99b-checkcommand gains--resident-during-yearand--not-resident-during-year, and a run that states neither is refused instead of assessed on an assumed residency. - On a Windows console or redirected output, a beneficiary name outside the active code page no longer ends a finished run with a
UnicodeEncodeError. The command line reconfigures standard output and standard error withbackslashreplace, so such a character prints as an escape; report lines are otherwise unchanged. README.mdandDISCLAIMER.mdstate that Ryan Duguid is not a registered tax agent or BAS agent, and limit project support to software issues reproduced with fabricated data.- The build backend pin moves from hatchling 1.32.0 to 1.32.3.
v0.1.7
- Foot the reported trust-income entitlement column to the income of the trust estate: the
rounding residual now falls on percentage shares only, and a fixed entitlement is reported
exactly as supplied. - Refuse a fixed entitlement that is not stated in whole cents rather than round it.
- Add seeded property tests that every allocated column foots to its pool.
Previous release
v0.1.6
- Leave ordinary family dealing undetermined for red-zone results and explain the compliance-review consequence.
- Correct the documented release pointer.
v0.1.5
- Use the checked release workflow reference. The v0.1.4 tag stopped before
building or publishing because GitHub could not load its historical workflow. - Include the calculation corrections listed under v0.1.4.
v0.1.4
- Reconcile allocated franking credits to the available credit pool.
- Distribute section 95 rounding adjustments across available shares so a
positive income pool cannot give a beneficiary a negative taxable share.
Four equal beneficiaries now share a 2-cent pool without a negative amount.
v0.1.3
This is the first PyPI release of solomons-sword.
The monorepo's filtered GitHub Releases page
is the canonical release history.
- Move the maintained source to
packages/solomons-swordin the
australian-accountingmonorepo. - Publish through
release-solomons-sword.yml, using the monorepo's
namespaced, attested release workflow. - Preserve the v0.1.2 Division 6, Section 100A and Section 99B behaviour.
v0.1.2
Releases through v0.1.2 are recorded on the standalone repository's
GitHub Releases page.
A separate changelog is intentionally not maintained.
Prepared 0.1.2 notes. No PyPI distribution has been published; this source-only
project currently installs from a clone. The statutory corrections below came
from an audit whose claims were checked against the ITAA 1936 compilation in
force from 1 July 2026 and the High Court's own citation of Bamford:
- Division 6 franking credits were allocated on 2 overlapping bases when dividends were streamed, distributing 150% of the credit pool in the audited case. Streaming is now refused outright, because the Division 6E carve-out with Subdivisions 115-C and 207-B is not implemented and a proportionate answer would be wrong.
- The franking credit gross-up is no longer added on top of the s 95 net income share: s 207-35 ITAA 1997 already includes it in the trust's net income, so adding it counted the credits twice. It is reported separately for the s 207-45 offset.
- Allocation now carries unrounded ratios into the s 95 pool and assigns the rounding residual, so allocated shares reconcile to the net income exactly. Three equal thirds of $100,000 previously lost $10.
- Cases the model does not compute now fail closed instead of returning an empty list or a mislabelled section: no presently entitled beneficiary and nil income of the trust estate (s 99 or s 99A trustee assessment), and non-resident beneficiaries (s 98(2A) or s 98(3)).
- Entitlements outside 0 to 100% are refused; a 150% and negative 50% pair previously allocated a negative assessable share.
- s 99B now models the s 99B(1) residency precondition, the s 99B(2)(a) proviso for corpus attributable to amounts that would have been assessable to a resident, and the s 99B(2)(b) limb; negative inputs and exemptions exceeding the receipt are refused.
- The PCG 2022/2 green zone no longer claims the s 100A(13) ordinary family dealing exception. The guideline is a compliance-resourcing stance, not a determination, and the ordinary-family-dealing field is undetermined for that zone.
- Bamford is cited correctly as Commissioner of Taxation v Bamford [2010] HCA 10; (2010) 240 CLR 481, and the streaming reference reads Subdivisions 115-C and 207-B.
Also: one version source, project URLs, mypy enforced i...
div7a-loan-review/v0.2.0
v0.2.0
- Require Python 3.11 or later. CPython 3.10 reached end of life on 1 October 2026; 0.1.6 remains the last release that installs on Python 3.10 (#351).
- Read the loan register as UTF-8. A register in another encoding, or with a field longer than the CSV module's field size limit, ends
gate,myrandreviewwith oneerror:line and exit 1 instead of a traceback (#344). - Finish a review whose remaining term is astronomically large, such as
1e999999999years. The s 109E(6) calculation raises the discount factor to the already wholeDecimalterm instead of first converting it to an integer, so the minimum yearly repayment reaches the interest-only limit instead of the command hanging (#344).
v0.1.6
- Refuse malformed or conflicting review modes before reading input: both Python entry points take only literal booleans for the mode flags and refuse
gate_only=Truewithmyr_only=True. In 0.1.5 that pair produced a reviewed row with neither result and no attention flag, even when the normal review reported a shortfall, and a textual"false"silently selected a restricted mode. The three valid modes and the command line commands behave as before (#329). - The README compares the engine with the Division 7A worksheet in Xero Workpapers Plus (#325).
v0.1.5
- Refuse a fractional bare remaining term in the minimum yearly repayment:
remaining_termmust be a whole number of years, and a part year goes throughstatutory_remaining_termfirst. - Accept an amount written with trailing zeros past the cent, such as
25000.000from a ledger or payroll export, while still refusing a real sub-cent amount. - Refuse a rate override that gives a year or rate as a JSON number with a message asking for a quoted string, instead of ending in a traceback.
- Record each benchmark rate's RBA workbook cell, the value read there and the date the row was compared, in the new
workbook_cell,workbook_valueandrow_verified_oncolumns. No rate value changed, but the table's SHA-256 in every resultmanifestdid. - Cite the 1 July 2026 compilation of the Income Tax Assessment Act 1936 instead of the moving latest version, in the README, the evaluation and the workbook.
- Workbook: the benchmark-year selector reads the Rates table through the
RateYearsname, so a year added to the table can be chosen. - Ship the
NOTICEfile in the distribution, and state in the README andDISCLAIMER.mdthat the author is not a registered tax or BAS agent.
v0.1.4
- Name the primary source behind every benchmark rate: each rate-table manifest now carries
primary_url, the RBA F5 historical workbook it was read from,retrieved_on, the date that workbook was downloaded, andsnapshot_sha256, the digest of those bytes.verify_atstays a convenience link for a human rather than the source of the figure, and an operator's override carries no such claim. A table whose rows do not all make the same claim names none, instead of attributing every row to the last one read. - Record the read that produced those columns in
docs/primary-source-review-2026-09-20.md, which checked all 8 reviewed years against the RBA workbook. No rate value changed.
v0.1.3
- Name the rate table behind every figure: each JSON result carries a
manifestwhoserate_table_urislist the frozen benchmark table with its SHA-256, produced by the lookup that read it, and any reviewed override asoverride:<file name>. AnUNKNOWNrate still names the table it was looked for in. - Carry
reason_codesbesidereasonson everyREFUSEDandUNKNOWNresult, one stable token per reason in the same order, so a caller can branch onREFUSED_*(outside s 109E) separately from*_UNKNOWN(a fact the operator can still establish). A result built with a reason and no code fails at construction. - Resolve the rate table once per register review instead of once per row.
- Workbook: refused repayment rows drive
REVIEW; duplicate benchmark-year labels, and blank, text, negative or above-one rates, block the workbook; dates are read as whole calendar days, money is compared in cents, and placeholder dates and out-of-range amounts are refused; the unresolved interest-floor interpretation is stated beside the result.
v0.1.2
- Reject padded required headers, duplicate override years and gates from another loan year.
- Withhold minimum-yearly-repayment figures when the loan year is missing and retain gate caveats in every result.
- Align the workbook formulas and cached values with the reviewed year checks.
Correction to the v0.1.1 note
The v0.1.1 release note said that release preserved the v0.1.0 review
calculations and refusal boundaries. The calculations and the s 109N gate were
preserved, but the refusal boundaries were not: v0.1.1 added the two-decimal
place limit and the $1 trillion maximum in div7aloan/money.py, and it began
preserving quoted newlines when reading the register so a malformed numeric
cell is refused instead of being joined into a different amount. Version 0.1.0
accepts a principal of 100000.001, a repayment of 25556.001, a principal of
1000000000000.01 and a repayment split across a quoted newline; v0.1.1
refuses each of them. Those safeguards stay in force in this release.
aus-accounting-mcp/v0.3.0
v0.3.0
- Breaking: requires Python 3.11 or later. CPython 3.10 reached end of life on 1 October 2026; 0.2.12 remains the last release that installs on Python 3.10 (#351).
- Pin
div7a-loan-review0.2.0;payday-super-checker0.1.9,ato-benchmark-compare0.1.11 and
australian-tax-calculators0.1.8 are unchanged. - Through the new pin:
review_div7a_loanwith an astronomically largeremaining_term_years, such as
1e999999999, returns its result instead of hanging, because the engine no longer converts the term to an
integer before the s 109E(6) calculation (#344). Results reportengine_version0.2.0. - The supplementary tool-selection scorer rejects duplicate JSON keys and non-finite numbers and compares
decoded types exactly (#352); the server and its tools are unchanged. - Align the release, citation, compatibility and MCP Registry metadata to 0.3.0.
v0.2.12
- Pin
payday-super-checker0.1.9 anddiv7a-loan-review0.1.6;
ato-benchmark-compare0.1.11 andaustralian-tax-calculators0.1.8 are
unchanged. - Through the new pins: the payday checker's nine control arguments and the
Division 7A engine's mode flags accept only literal booleans, and the
Division 7A engine refuses conflicting modes. The tools already took strict
booleans and set no Division 7A mode flag, so tool behaviour is unchanged;
results reportengine_version0.1.9 (payday) and 0.1.6 (Division 7A). The
payday checker's report invariant checks also hold underpython -O. - Raise the declared
mcprequirement to>=2.2.0,<3(#331). The lock
recordsmcpandmcp-types2.2.0,pyjwt2.14.0 andurllib32.8.0. - Align the release, citation, compatibility and MCP Registry metadata to
0.2.12.
v0.2.11
- Pin
ato-benchmark-compare0.1.11 andaustralian-tax-calculators0.1.8;
payday-super-checker0.1.8 anddiv7a-loan-review0.1.5 are unchanged. - Through the new pins:
get_ato_benchmarkscompares labour, rent and motor
vehicle expenses, and cost of sales where it is not the key range, against
the ranges the ATO publishes on each industry's page. Each ratio row's
benchmark_sourceand the result'sindustry_page_sourcesay where a range
came from; these ranges never set the key ratio.calculate_tax_worksheet
adds thestudy_loan_repaymentworksheet for 2025-26 and 2026-27. - Add
search_ato_rulingsandread_ato_ruling, which serve ATO ruling
paragraphs from a configured local folder of rulings runs, bringing the
server to 18 tools. - Declare
benchmark_sourceandindustry_page_sourcein the
get_ato_benchmarksoutput schema. - Share one page builder between the legislation corpus and accounting
library tools. - Lock the build backend in the dev extra.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.11.
v0.2.10
- Pin
payday-super-checker0.1.8,ato-benchmark-compare0.1.10,
div7a-loan-review0.1.5 andaustralian-tax-calculators0.1.7, the engine
versions the workspace already tested. 0.2.9's own pins could not reproduce
its quick proof: the publisheddiv7a-loan-review0.1.4 carries an older
benchmark table digest. calc_payday_super_deadlineandreview_payday_super_contributionsreport
notional earnings, both SG-charge estimates and every uplift scenario to the
cent, built the way the checker's report builds them, so they match the
evidence pack'sreport.csv. They carried up to 27 decimal places, and
rounding their sum could land a cent away from the report.- Through the new pins: Division 7A results record each benchmark rate's RBA
workbook cell and accept amounts written with trailing zeros past the cent;
thefbtworksheet adds FBT return items 14A to 16; a report-style P&L with
amounts in more than one column is refused when a column left of the fullest
also holds amounts; and Payday Super evidence packs write caveat and note
cells that start like a formula as text. - The release workflow installs the built wheel outside the workspace, so its
pins resolve from PyPI, and stops before publishing unless its demo matches
docs/quick-proof.txt. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.10.
v0.2.9
- Pin
australian-tax-calculators0.1.6 and add itscontribution_capsand
pension_minimumworksheets tocalculate_tax_worksheet, for 2024-25 to
2026-27: cap room, excess and bring-forward for one person's classified
contributions, and the SISR Schedule 7 minimum for one account-based
pension. Retain theato-benchmark-compare0.1.9,payday-super-checker
0.1.7 anddiv7a-loan-review0.1.4 pins. - Count nine worksheets in the server instructions, scope resource, README,
reference and registry descriptions, and narrow the unsupported SMSF and
contribution-cap topics to what the worksheets leave out. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.9.
v0.2.8
search_tax_legislationandsearch_tax_ratesreturn the best match first
instead of in corpus file order: the query as a phrase in a heading, then every
word in a heading, then the phrase in the text, then the words anywhere, with the
principal tax Acts first within each tier. On a 946-title corpus "small business
entity" previously led with Excise Act 1901 s 4 and "general deductions" did not
reach ITAA 1997 s 8-1 in the first five results. Ranking reads the whole corpus
on each search: about 0.5 seconds on that corpus, up to about 1.6 seconds for
a word nearly every provision holds.define_tax_termputs the principal tax Acts first within exact and partial
matches, and its 20-entry partial cap keeps the best-ranked entries rather than
the first ones the scan meets.read_tax_legislation_sectiontakesstartand returnsstartand
next_start, so a provision longer than 12000 characters can be read in parts.
165 of 21,916 rows in that corpus were cut off with no way to read further,
including ITAA 1997 s 995-1.- A search with no match adds a notice suggesting statutory wording.
- A missing or invalid retrieval folder error tells the caller to ask the user
rather than retry, and the scope resource reports whether each retrieval folder
is configured, without its path. aus-accounting-mcp --versionand--helpprint and exit instead of starting
the server; an unknown argument is refused.- Two evaluation cases cover ranking and reading a long provision in parts.
- Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7,
div7a-loan-review0.1.4 andaustralian-tax-calculators0.1.5 pins. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.8.
v0.2.7
- Pin
australian-tax-calculators0.1.5 and add itspayg_withholding
worksheet tocalculate_tax_worksheet: one regular weekly, fortnightly or
monthly pay from 1 July 2026 on Schedule 1 scale 1, 2, 3, 5 or 6. Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7 and
div7a-loan-review0.1.4 pins. - Resolve each worksheet's engine function when it is called, so a kind the
installed engine lacks is refused with a message and the other kinds keep
working. - Put the missing space back in eight input descriptions for
get_ato_benchmarks,calc_payday_super_deadlineandreview_div7a_loan,
which reached clients as run-together words such as "ratiodenominator". - State in the scope resource, README and disclaimer that the author is not a
registered tax or BAS agent, and limit support to software issues reproduced
with fabricated data. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.7.
v0.2.6
- Pin
ato-benchmark-compare0.1.9 andaustralian-tax-calculators0.1.4.
The benchmark release refuses a neutral CSV whose header namesaccount,
amountorsectionmore than once instead of reading the first such column
silently. The calculator release computes every worksheet in its own decimal
context, so a caller's precision no longer changes a result. Retain the
payday-super-checker0.1.7 anddiv7a-loan-review0.1.4 pins. - Serve the richer worksheet catalogue from the pinned published engine. An
installation on an older calculator keeps the legacy discovery entries. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.6.
v0.2.5
- Pin
payday-super-checker0.1.7. A timely receipt date without either amount field remainsUNKNOWN; a late receipt without an amount remainsLATEwithout the unsupported shortfall reduction. Retain the other 3 published engine pins. - Update the tool descriptions, server instructions and package description for the receipt-amount rule. Require its regression tests in standalone installations as well as workspace tests.
- Include the merged evidence semantics and explicit scope qualifications. The optional richer worksheet catalogue still depends on an unreleased worksheet engine; the pinned published engine retains its existing scope data.
- Include the synthetic group-review example, which indexes separate engine evidence without combining conclusions or transferring outputs between engines.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.5.
v0.2.4
- A corpus line that spells a solidus as the JSON escape
\/is parsed rather than prefiltered, so arow_idsuch as5/10that search returned can be read back without asking for neighbours. define_tax_termkeeps the lettered conditions of a definition, such as(a)and(b)paragraphs, with the definition they complete; only a numbered subsection label such as(2)closes the dictionary.- Pin
payday-super-checker0.1.6 anddiv7a-loan-review0.1.4; `ato-benchmark-com...
the-wip-tally/v0.1.3
v0.1.3
- The public WIP calculation API applies the ratio contract the CSV reader already enforced: each active ratio must be a finite
Decimalfrom 0 to 1. In 0.1.2 a direct caller could pass a constraint ratio of 2 for an unapproved estimate of 100 and receive included consideration of 200 and excluded consideration of -100, and aNaNGST ratio could reach the returned amount. Formulas, output diagnostics and CSV and command line behaviour are unchanged (#318). - Tests now pin two money-path boundaries that one-operator mutants survived: a nil cost to complete recognises the full contract price, and nil gross profit carries no onerous or negative-margin flag (#307). No calculation changed.
v0.1.2
Breaking: outcome_reasonably_measurable is required on every contract row.
- A blank cell, or a missing column, used to read as
yesand book full
percentage-of-completion revenue. It is now the not-stated state, and the
contract is refused by row number, the way a blankretention_classification
falls toreviewrather than toreceivable. AASB 15 paras 44-45 decide
between percentage-of-completion revenue and revenue limited to recoverable
cost, so the engine states neither until the row answers the question. - Migration: add
outcome_reasonably_measurableto the contract CSV withyes
ornoon every row, or map an existing column to it with--mapping-file.
Explicityesandnovalues, and every figure they produce, are unchanged. ContractInput.outcome_reasonably_measurableis nowbool | Nonefor
callers using the engine directly;NoneraisesScheduleErrorfrom
measurewhicheverprogress_methodthe row uses.
Other changes:
review-packrebuilds the schedule for theas_atdate the schedule
records when--as-atis omitted, and uses today only when the schedule
records none. A schedule made without--as-atcould not previously be
reviewed on a later day. An explicit--as-atstill wins, and an empty
--as-at ""is refused.measurerefuses anoutput_percentoutside 0 to 1, or one that is not
finite, withScheduleError. CSV input already refused these; a direct
caller could reach revenue above the transaction price or below zero.- A contract file with more than 20 unreadable rows now ends its error list
with... and more. Collection previously stopped at exactly 20, so the
suffix never appeared. examples/JOB-TO-CASH.mdandexamples/job_to_cash.pytrace WIP evidence
into dated project cash assumptions.README.mdandDISCLAIMER.mdstate that Ryan Duguid is not a registered
tax agent or BAS agent, and limit project support to software issues
reproduced with fabricated data.- The build backend pin moves from hatchling 1.32.0 to 1.32.3.
v0.1.1
- Reject malformed numeric grouping and conflicting signs.
- Parse and hash the same captured source bytes for each review pack.
- Preserve separate contract assets and liabilities in schedule checks.
Previous release
v0.1.0
This is the first PyPI release of the-wip-tally.
The monorepo's filtered GitHub Releases page
is the canonical release history.
- Move the maintained source to
packages/the-wip-tallyin the
australian-accountingmonorepo. - Publish through
release-the-wip-tally.yml, using the monorepo's namespaced,
attested release workflow. - Preserve the imported v0.1.0 AASB 15 schedule behaviour and CLI contract.
solomons-sword/v0.1.10
v0.1.10
- The four public trust calculation and validation functions accept only
True,FalseorNone(unknown) for each boolean fact, and raise aValueErrornaming the field for anything else. In 0.1.9,is_signed_by_trustee="False"ordefault_beneficiary_clause_exists=0could produce a valid resolution, a textual circular-flow flag could produceGREEN, and textual residency flags could produce allocations or assessments. Unknown facts are handled as before (#326).
v0.1.9
- Breaking:
TrustResolutionSchedulegains 2 required facts.uses_specific_streamingsays whether the resolution streams capital gains or franked distributions; missing streaming powers are now a defect only when it does, so an ordinary proportionate resolution under a deed without streaming powers validates.deed_resolution_deadlineis the deed's own deadline, or 30 June where the deed sets none; a resolution after an earlier deed date is late, and a later deed date does not extend 30 June. Either fact passed asNoneis reported as not established where the answer turns on it. - Breaking:
calculate_proportionate_sharerefuses a positive trust-levelnet_capital_gainsorfranked_dividends, streamed or not, because Division 6E applies to them either way and is not implemented. Franking credits supplied without franked dividends are still allocated in proportion. - Section 100A zones follow PCG 2022/2's own scenarios. A corporate unpaid entitlement without a Division 7A loan and a parent retaining an adult child's entitlement no longer return RED on their own; each now blocks GREEN and leaves the arrangement unzoned. Red zone scenario 1 (an adult child's entitlement applied to expenses from before they turned 18) gains its own fact. GREEN needs receipt within 2 years, the rest of scenario 3A or 3B for a retained loan and no paragraph 32 exclusion; the
s100a-checkcommand gains a flag for each new fact. - Migration: construct
TrustResolutionSchedulewithuses_specific_streaminganddeed_resolution_deadline(30 June where the deed sets no earlier date). A Section 100A call now needs all 11 facts, not 7, to reachGREENorOUTSIDE_GREEN. Unlike 0.1.8, results for fully supplied inputs can change: the 2 former RED triggers now leave an arrangement unzoned, and a trust with net capital gains or franked dividends is refused. calculate_proportionate_sharerefuses a non-finitenet_capital_gainsorfranked_dividendswith aValueError.- These changes arrived in #300, which holds the review record. The first two
solomons-sword/v0.1.9tags stopped at the release gate before building: the first pointed at a commit behindmain, and the second at amaincommit whose push-triggered CI had skipped this package. Nothing was published from either.
v0.1.8
- Breaking input requirements: every Section 100A fact, both Division 6 beneficiary status facts and the 3 trust resolution deed facts are now stated as
TrueorFalse, or reported as not established.BeneficiaryEntitlement.is_residentandForeignTrustReceipt.beneficiary_was_resident_during_yearhave no default at all, so a construction that omits either raisesTypeError; pass them explicitly.beneficiary_was_resident_during_yearalso moves ahead of the optional exemption amounts, so a call that passed 3 or more positional arguments toForeignTrustReceiptneeds updating.is_under_legal_disability, the Section 100A facts and the resolution facts default toNone, which the engine refuses or reports rather than reading asFalse. - Migration: state the facts.
BeneficiaryEntitlement(name, is_resident=True, is_under_legal_disability=False, ...)reproduces the old defaults where the operator has established them; a Section 100A call needs all 7 facts to reachGREENorOUTSIDE_GREEN, and the command line gains a--no-form for each one;validate_trust_resolutionnow returnsbool | None, whereNonemeans a deed fact was never established. Results for fully supplied inputs are unchanged. - Section 99B keeps its nil exemption defaults, which give the largest assessable amount, and the result carries one caveat naming every exemption amount that arrived as nil, together with a nil s 99B(2)(a) corpus add-back, which runs the other way and leaves the whole corpus exempt. The
s99b-checkcommand gains--resident-during-yearand--not-resident-during-year, and a run that states neither is refused instead of assessed on an assumed residency. - On a Windows console or redirected output, a beneficiary name outside the active code page no longer ends a finished run with a
UnicodeEncodeError. The command line reconfigures standard output and standard error withbackslashreplace, so such a character prints as an escape; report lines are otherwise unchanged. README.mdandDISCLAIMER.mdstate that Ryan Duguid is not a registered tax agent or BAS agent, and limit project support to software issues reproduced with fabricated data.- The build backend pin moves from hatchling 1.32.0 to 1.32.3.
v0.1.7
- Foot the reported trust-income entitlement column to the income of the trust estate: the
rounding residual now falls on percentage shares only, and a fixed entitlement is reported
exactly as supplied. - Refuse a fixed entitlement that is not stated in whole cents rather than round it.
- Add seeded property tests that every allocated column foots to its pool.
Previous release
v0.1.6
- Leave ordinary family dealing undetermined for red-zone results and explain the compliance-review consequence.
- Correct the documented release pointer.
v0.1.5
- Use the checked release workflow reference. The v0.1.4 tag stopped before
building or publishing because GitHub could not load its historical workflow. - Include the calculation corrections listed under v0.1.4.
v0.1.4
- Reconcile allocated franking credits to the available credit pool.
- Distribute section 95 rounding adjustments across available shares so a
positive income pool cannot give a beneficiary a negative taxable share.
Four equal beneficiaries now share a 2-cent pool without a negative amount.
v0.1.3
This is the first PyPI release of solomons-sword.
The monorepo's filtered GitHub Releases page
is the canonical release history.
- Move the maintained source to
packages/solomons-swordin the
australian-accountingmonorepo. - Publish through
release-solomons-sword.yml, using the monorepo's
namespaced, attested release workflow. - Preserve the v0.1.2 Division 6, Section 100A and Section 99B behaviour.
v0.1.2
Releases through v0.1.2 are recorded on the standalone repository's
GitHub Releases page.
A separate changelog is intentionally not maintained.
Prepared 0.1.2 notes. No PyPI distribution has been published; this source-only
project currently installs from a clone. The statutory corrections below came
from an audit whose claims were checked against the ITAA 1936 compilation in
force from 1 July 2026 and the High Court's own citation of Bamford:
- Division 6 franking credits were allocated on 2 overlapping bases when dividends were streamed, distributing 150% of the credit pool in the audited case. Streaming is now refused outright, because the Division 6E carve-out with Subdivisions 115-C and 207-B is not implemented and a proportionate answer would be wrong.
- The franking credit gross-up is no longer added on top of the s 95 net income share: s 207-35 ITAA 1997 already includes it in the trust's net income, so adding it counted the credits twice. It is reported separately for the s 207-45 offset.
- Allocation now carries unrounded ratios into the s 95 pool and assigns the rounding residual, so allocated shares reconcile to the net income exactly. Three equal thirds of $100,000 previously lost $10.
- Cases the model does not compute now fail closed instead of returning an empty list or a mislabelled section: no presently entitled beneficiary and nil income of the trust estate (s 99 or s 99A trustee assessment), and non-resident beneficiaries (s 98(2A) or s 98(3)).
- Entitlements outside 0 to 100% are refused; a 150% and negative 50% pair previously allocated a negative assessable share.
- s 99B now models the s 99B(1) residency precondition, the s 99B(2)(a) proviso for corpus attributable to amounts that would have been assessable to a resident, and the s 99B(2)(b) limb; negative inputs and exemptions exceeding the receipt are refused.
- The PCG 2022/2 green zone no longer claims the s 100A(13) ordinary family dealing exception. The guideline is a compliance-resourcing stance, not a determination, and the ordinary-family-dealing field is undetermined for that zone.
- Bamford is cited correctly as Commissioner of Taxation v Bamford [2010] HCA 10; (2010) 240 CLR 481, and the streaming reference reads Subdivisions 115-C and 207-B.
Also: one version source, project URLs, mypy enforced in CI (5 real errors
fixed) with Python 3.11 and 3.13 added, CodeQL, deduplicated Dependabot config,
a not-advice boundary in the README, module docstrings and CLI output. The
package release workflow is intentionally absent until publication has a named
user, a fresh index-name availability check and an explicit compatibility
contract.
Not advice. Outputs are review aids for a qualified professional, not determinations.
payday-super-checker/v0.1.9
v0.1.9
- The nine public control arguments (the confirmation, stale-rate and identifier-output options) accept only literal booleans. Version 0.1.8 treated a string such as
"false"as permission, which could suppress review warnings or include identifiers. Strings, numbers,Noneand containers now raise an error naming the argument; valid booleans, defaults and command line switches behave as before (#328). - Three report invariant checks also hold under
python -O: missing exposure data raises the sameAssertionErrorinstead of producing monetary output or a different exception (#330).
v0.1.8
report.csvand the evidence pack guard the caveats and notes cells against spreadsheet formulas, as they already guarded the employee id: a cell starting with=,+,-or@is written as text.- An evidence pack no longer fails on a missing or malformed
rates.json: the reference rates load only for ordinary console output, while GIC validation and the GIC-only evidence manifest are unchanged. - Vendor imports read amounts through the same CSV amount parser as the canonical file, with the same cent rounding and empty-field diagnostics.
- A timestamp in the Payday Super ISO shape must carry minutes, so one file cannot parse on one Python version and fail on another, and each entry point reconfigures stderr as well as stdout so a name outside the console code page no longer ends the run.
- The business-day definition cites the ATO page Payment deadlines for Payday Super; the newsroom article cited before has moved.
paydaysuper.report.rounded_figuresis public, so the MCP server reports the same cents as the checker's own report.- New documentation: a receipt-amount evaluation and a quarterly SG working paper example run through the checker.
v0.1.7
Version 0.1.7 corrects receipt-amount handling and incomplete workbook estimates.
The changes below are not present in 0.1.6.
- The Excel Summary displays
Not assessedfor total notional earnings and both charge estimates when any line extends past the GIC table. It no longer sums withheld row estimates as zero or presents the assessed subset as a complete total. The final shortfall total remains available. - Breaking for hand-built files. A
fund_received_dateon a row with neithermatched_amountnorremitted_amountno longer reads as a receipt of the wholesg_amount. The date evidences timing only, so where it could be on time the row is leftUNKNOWNbetweenON_TIMEand the partial-receipt outcome (UNPAID,NOT_YET_DUEorLATE), the run exits 2, and the caveat names the amount the row needs. A late receipt with no amount staysLATE, but the s 18D reduction of the final shortfall is not applied and the notional earnings run to the as-at date as a maximum. Files written byimportalready carrymatched_amountand are unaffected. - Migration: add
remitted_amountandmatched_amountcolumns and fillmatched_amountwith the amount the fund received for each row that has afund_received_date; a full receipt states the wholesg_amount. The shipped examples and evaluation fixtures now do so. Older report CSVs, exit codes, column names and the canonical column order are unchanged. - The Excel workbook now withholds notional earnings and charge estimates beyond the shipped GIC table, while retaining verdicts, days late and shortfalls. The formula changes are in the workbook source; the workbook has no stale-rate opt-in.
- The Excel workbook applies the same rule (branch codes
U1toU3, lateness basis "as-at date (fund receipt amount not evidenced)") and was rebuilt through desktop Excel.
v0.1.6
- Withhold the notional earnings, administrative uplift and SG-charge exposure for a row whose period runs past the last quarter in
gic_rates.json, and say so in a caveat naming the day, the last quarter on record and the file to update. The verdict, days late and shortfall are still reported.--allow-stale-gicrestores the estimate at the last known rate, and the report then says it did. - Name the financial year a
rates.jsonlookup is missing or unreadable for, so a stale rates file is told apart from a run that never needed the year. - Carry a caveat on a row that has a fund-receipt date but no matched or remitted amount, naming the whole-liability reading the checker applies to it.
v0.1.5
- Carry the join's structural matching warnings into the canonical CSV's new
join_caveatscolumn, so they travel through the checker into the report's caveats column and the evidence pack instead of being console-only. - Keep genuine ambiguous joins refused: identical competing paydays still stop the import with no file written.
- The canonical format gains one optional trailing column; files from earlier releases parse unchanged.
v0.1.4
- Keep payments awaiting clearance pending, with a warning and no remitted or received date.
- Match duplicate payroll rows only when the payment covers all competing unmet balances.
- Retain refusal for insufficient payments and align evidence-pack documentation.
div7a-loan-review/v0.1.6
v0.1.6
- Refuse malformed or conflicting review modes before reading input: both Python entry points take only literal booleans for the mode flags and refuse
gate_only=Truewithmyr_only=True. In 0.1.5 that pair produced a reviewed row with neither result and no attention flag, even when the normal review reported a shortfall, and a textual"false"silently selected a restricted mode. The three valid modes and the command line commands behave as before (#329). - The README compares the engine with the Division 7A worksheet in Xero Workpapers Plus (#325).
v0.1.5
- Refuse a fractional bare remaining term in the minimum yearly repayment:
remaining_termmust be a whole number of years, and a part year goes throughstatutory_remaining_termfirst. - Accept an amount written with trailing zeros past the cent, such as
25000.000from a ledger or payroll export, while still refusing a real sub-cent amount. - Refuse a rate override that gives a year or rate as a JSON number with a message asking for a quoted string, instead of ending in a traceback.
- Record each benchmark rate's RBA workbook cell, the value read there and the date the row was compared, in the new
workbook_cell,workbook_valueandrow_verified_oncolumns. No rate value changed, but the table's SHA-256 in every resultmanifestdid. - Cite the 1 July 2026 compilation of the Income Tax Assessment Act 1936 instead of the moving latest version, in the README, the evaluation and the workbook.
- Workbook: the benchmark-year selector reads the Rates table through the
RateYearsname, so a year added to the table can be chosen. - Ship the
NOTICEfile in the distribution, and state in the README andDISCLAIMER.mdthat the author is not a registered tax or BAS agent.
v0.1.4
- Name the primary source behind every benchmark rate: each rate-table manifest now carries
primary_url, the RBA F5 historical workbook it was read from,retrieved_on, the date that workbook was downloaded, andsnapshot_sha256, the digest of those bytes.verify_atstays a convenience link for a human rather than the source of the figure, and an operator's override carries no such claim. A table whose rows do not all make the same claim names none, instead of attributing every row to the last one read. - Record the read that produced those columns in
docs/primary-source-review-2026-09-20.md, which checked all 8 reviewed years against the RBA workbook. No rate value changed.
v0.1.3
- Name the rate table behind every figure: each JSON result carries a
manifestwhoserate_table_urislist the frozen benchmark table with its SHA-256, produced by the lookup that read it, and any reviewed override asoverride:<file name>. AnUNKNOWNrate still names the table it was looked for in. - Carry
reason_codesbesidereasonson everyREFUSEDandUNKNOWNresult, one stable token per reason in the same order, so a caller can branch onREFUSED_*(outside s 109E) separately from*_UNKNOWN(a fact the operator can still establish). A result built with a reason and no code fails at construction. - Resolve the rate table once per register review instead of once per row.
- Workbook: refused repayment rows drive
REVIEW; duplicate benchmark-year labels, and blank, text, negative or above-one rates, block the workbook; dates are read as whole calendar days, money is compared in cents, and placeholder dates and out-of-range amounts are refused; the unresolved interest-floor interpretation is stated beside the result.
v0.1.2
- Reject padded required headers, duplicate override years and gates from another loan year.
- Withhold minimum-yearly-repayment figures when the loan year is missing and retain gate caveats in every result.
- Align the workbook formulas and cached values with the reviewed year checks.
Correction to the v0.1.1 note
The v0.1.1 release note said that release preserved the v0.1.0 review
calculations and refusal boundaries. The calculations and the s 109N gate were
preserved, but the refusal boundaries were not: v0.1.1 added the two-decimal
place limit and the $1 trillion maximum in div7aloan/money.py, and it began
preserving quoted newlines when reading the register so a malformed numeric
cell is refused instead of being joined into a different amount. Version 0.1.0
accepts a principal of 100000.001, a repayment of 25556.001, a principal of
1000000000000.01 and a repayment split across a quoted newline; v0.1.1
refuses each of them. Those safeguards stay in force in this release.
aus-accounting-mcp/v0.2.12
v0.2.12
- Pin
payday-super-checker0.1.9 anddiv7a-loan-review0.1.6;
ato-benchmark-compare0.1.11 andaustralian-tax-calculators0.1.8 are
unchanged. - Through the new pins: the payday checker's nine control arguments and the
Division 7A engine's mode flags accept only literal booleans, and the
Division 7A engine refuses conflicting modes. The tools already took strict
booleans and set no Division 7A mode flag, so tool behaviour is unchanged;
results reportengine_version0.1.9 (payday) and 0.1.6 (Division 7A). The
payday checker's report invariant checks also hold underpython -O. - Raise the declared
mcprequirement to>=2.2.0,<3(#331). The lock
recordsmcpandmcp-types2.2.0,pyjwt2.14.0 andurllib32.8.0. - Align the release, citation, compatibility and MCP Registry metadata to
0.2.12.
v0.2.11
- Pin
ato-benchmark-compare0.1.11 andaustralian-tax-calculators0.1.8;
payday-super-checker0.1.8 anddiv7a-loan-review0.1.5 are unchanged. - Through the new pins:
get_ato_benchmarkscompares labour, rent and motor
vehicle expenses, and cost of sales where it is not the key range, against
the ranges the ATO publishes on each industry's page. Each ratio row's
benchmark_sourceand the result'sindustry_page_sourcesay where a range
came from; these ranges never set the key ratio.calculate_tax_worksheet
adds thestudy_loan_repaymentworksheet for 2025-26 and 2026-27. - Add
search_ato_rulingsandread_ato_ruling, which serve ATO ruling
paragraphs from a configured local folder of rulings runs, bringing the
server to 18 tools. - Declare
benchmark_sourceandindustry_page_sourcein the
get_ato_benchmarksoutput schema. - Share one page builder between the legislation corpus and accounting
library tools. - Lock the build backend in the dev extra.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.11.
v0.2.10
- Pin
payday-super-checker0.1.8,ato-benchmark-compare0.1.10,
div7a-loan-review0.1.5 andaustralian-tax-calculators0.1.7, the engine
versions the workspace already tested. 0.2.9's own pins could not reproduce
its quick proof: the publisheddiv7a-loan-review0.1.4 carries an older
benchmark table digest. calc_payday_super_deadlineandreview_payday_super_contributionsreport
notional earnings, both SG-charge estimates and every uplift scenario to the
cent, built the way the checker's report builds them, so they match the
evidence pack'sreport.csv. They carried up to 27 decimal places, and
rounding their sum could land a cent away from the report.- Through the new pins: Division 7A results record each benchmark rate's RBA
workbook cell and accept amounts written with trailing zeros past the cent;
thefbtworksheet adds FBT return items 14A to 16; a report-style P&L with
amounts in more than one column is refused when a column left of the fullest
also holds amounts; and Payday Super evidence packs write caveat and note
cells that start like a formula as text. - The release workflow installs the built wheel outside the workspace, so its
pins resolve from PyPI, and stops before publishing unless its demo matches
docs/quick-proof.txt. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.10.
v0.2.9
- Pin
australian-tax-calculators0.1.6 and add itscontribution_capsand
pension_minimumworksheets tocalculate_tax_worksheet, for 2024-25 to
2026-27: cap room, excess and bring-forward for one person's classified
contributions, and the SISR Schedule 7 minimum for one account-based
pension. Retain theato-benchmark-compare0.1.9,payday-super-checker
0.1.7 anddiv7a-loan-review0.1.4 pins. - Count nine worksheets in the server instructions, scope resource, README,
reference and registry descriptions, and narrow the unsupported SMSF and
contribution-cap topics to what the worksheets leave out. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.9.
v0.2.8
search_tax_legislationandsearch_tax_ratesreturn the best match first
instead of in corpus file order: the query as a phrase in a heading, then every
word in a heading, then the phrase in the text, then the words anywhere, with the
principal tax Acts first within each tier. On a 946-title corpus "small business
entity" previously led with Excise Act 1901 s 4 and "general deductions" did not
reach ITAA 1997 s 8-1 in the first five results. Ranking reads the whole corpus
on each search: about 0.5 seconds on that corpus, up to about 1.6 seconds for
a word nearly every provision holds.define_tax_termputs the principal tax Acts first within exact and partial
matches, and its 20-entry partial cap keeps the best-ranked entries rather than
the first ones the scan meets.read_tax_legislation_sectiontakesstartand returnsstartand
next_start, so a provision longer than 12000 characters can be read in parts.
165 of 21,916 rows in that corpus were cut off with no way to read further,
including ITAA 1997 s 995-1.- A search with no match adds a notice suggesting statutory wording.
- A missing or invalid retrieval folder error tells the caller to ask the user
rather than retry, and the scope resource reports whether each retrieval folder
is configured, without its path. aus-accounting-mcp --versionand--helpprint and exit instead of starting
the server; an unknown argument is refused.- Two evaluation cases cover ranking and reading a long provision in parts.
- Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7,
div7a-loan-review0.1.4 andaustralian-tax-calculators0.1.5 pins. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.8.
v0.2.7
- Pin
australian-tax-calculators0.1.5 and add itspayg_withholding
worksheet tocalculate_tax_worksheet: one regular weekly, fortnightly or
monthly pay from 1 July 2026 on Schedule 1 scale 1, 2, 3, 5 or 6. Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7 and
div7a-loan-review0.1.4 pins. - Resolve each worksheet's engine function when it is called, so a kind the
installed engine lacks is refused with a message and the other kinds keep
working. - Put the missing space back in eight input descriptions for
get_ato_benchmarks,calc_payday_super_deadlineandreview_div7a_loan,
which reached clients as run-together words such as "ratiodenominator". - State in the scope resource, README and disclaimer that the author is not a
registered tax or BAS agent, and limit support to software issues reproduced
with fabricated data. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.7.
v0.2.6
- Pin
ato-benchmark-compare0.1.9 andaustralian-tax-calculators0.1.4.
The benchmark release refuses a neutral CSV whose header namesaccount,
amountorsectionmore than once instead of reading the first such column
silently. The calculator release computes every worksheet in its own decimal
context, so a caller's precision no longer changes a result. Retain the
payday-super-checker0.1.7 anddiv7a-loan-review0.1.4 pins. - Serve the richer worksheet catalogue from the pinned published engine. An
installation on an older calculator keeps the legacy discovery entries. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.6.
v0.2.5
- Pin
payday-super-checker0.1.7. A timely receipt date without either amount field remainsUNKNOWN; a late receipt without an amount remainsLATEwithout the unsupported shortfall reduction. Retain the other 3 published engine pins. - Update the tool descriptions, server instructions and package description for the receipt-amount rule. Require its regression tests in standalone installations as well as workspace tests.
- Include the merged evidence semantics and explicit scope qualifications. The optional richer worksheet catalogue still depends on an unreleased worksheet engine; the pinned published engine retains its existing scope data.
- Include the synthetic group-review example, which indexes separate engine evidence without combining conclusions or transferring outputs between engines.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.5.
v0.2.4
- A corpus line that spells a solidus as the JSON escape
\/is parsed rather than prefiltered, so arow_idsuch as5/10that search returned can be read back without asking for neighbours. define_tax_termkeeps the lettered conditions of a definition, such as(a)and(b)paragraphs, with the definition they complete; only a numbered subsection label such as(2)closes the dictionary.- Pin
payday-super-checker0.1.6 anddiv7a-loan-review0.1.4;ato-benchmark-compare0.1.8 andaustralian-tax-calculators0.1.3 are retained. - Division 7A 0.1.4 names the primary source behind every benchmark rate, so a rate result and the checked demo transcript carry
primary_url,retrieved_onandsnapshot_sha256besideverify_at. No rate value changed. - Checker 0.1.6 withholds a row's notional earnings, administrative uplift and SG-charge exposure when its period runs past the last GIC quarter on record, and says so in a caveat that names the day, the quarter and the file to update. The server has no equivalent of the checker's
--allow-stale-gic, so a result it returns never carries an extrapolated rate. The checker also names the financial year arates.jsonlookup is missing for, and caveats a fund-receipt row that carries no matched or remitted amount. - Trim about 4.5 KB (10 percent) from the published tool descriptions and input schemas: the money rule ("AUD decimal string such as "1000.00": finite, at most 2 decimal places, at most 1000000000000.00; omit or null means not supplied, "0.00" only for an established zero"...
australian-tax-calculators/v0.1.8
v0.1.8
- Add a tenth worksheet,
study_loan_repayment: the compulsory study and
training support loan repayment for 2025-26 and 2026-27, the lesser of the
marginal amount and 10% of repayment income, with the thresholds, the 17%
band base and the figures as the ATO prints them.worksheet_catalogue()
lists it. - Lock the build backend in the dev extra.
v0.1.7
- Add the FBT return figures to
fbtresults, following the FBT return 2026
instructions:return_item_14aandreturn_item_14b, the type 1 and type 2
grossed-up amounts rounded to the nearest dollar as the ATO's worked example
does,return_item_15, their sum, andreturn_item_16, item 15 at 47%. The
unroundedfbt_estimateand grossed-up amounts are unchanged. - List the FBT return 2026 instructions after the per-rule source in
fbt
results, and give every worksheet inworksheet_catalogue()asourceslist
beside itssource. - Build with hatchling 1.32.3.
v0.1.6
- Add
contribution_capsfor 2024-25 to 2026-27. It tests one year's
classified contributions against the concessional cap, with unused cap
carried forward below a $500,000 total super balance at the previous
30 June, and the non-concessional cap: 4 times the concessional cap, nil at
or above the general transfer balance cap, otherwise 1, 2 or 3 annual caps
by the ITAA 1997 s 292-85(5) balance bands. Bring-forward needs the person
to be under 75 at any time in the year. A period started in an earlier year
is out of scope. - Add
pension_minimumfor the same years. It applies SISR Schedule 7 to one
account-based pension: the age factor on the 1 July or commencement-day
balance, pro-rated in the first year, nil from 1 June, and rounded once to
the nearest $10 with an exact $5 rounding up. - Check every bring-forward band a cent either side of the ATO's published
tables, and freeze Library example 7-278 as evidence.
v0.1.5
- Add
payg_withholding, a Schedule 1 (NAT 1004) worksheet for one regular
weekly, fortnightly or monthly pay from 1 July 2026 on scales 1, 2, 3, 5 or
6. It applies the published coefficients to the whole-dollar weekly
equivalent plus 99 cents and rounds to the dollar as the schedule directs.
It reproduces all 720 amounts in the ATO's sample data published on
17 June 2026. Scale 4, tax offsets, Medicare levy adjustments, study and
training support loans, 53 and 27 pay years and quarterly pays are refused
or out of scope. - State in the README and disclaimer that the author is not a registered tax
or BAS agent, and limit support to software issues reproduced with
fabricated data.
v0.1.4
- Compute every worksheet in its own decimal context. A caller's context no
longer changes a result: at precision 4, resident tax on $200,000 returned
$56,140.00 rather than $56,138.00, and the $16,500 type 1 FBT example
returned $21,450.00 rather than $21,452.73. The caller's own context is
left as it was found. - Add
austaxcalc.calculations.worksheet_catalogue(). It returns the supported
periods with inclusive dates, required inputs and units, available methods,
scope exclusions and a fabricated example for each worksheet, with money as
decimal strings. The example'sscope_confirmedvalue is fabricated with the
rest of the example; for real facts it is the operator's own confirmation of
the scope conditions. - Hold the resident tax scale as dated data.
metadata.RESIDENT_TAX_SCALES
carries one scale per income year andSUPPORTED_PERIODS["resident_tax"]is
derived from its keys, so an unlisted year is refused rather than borrowing
another year's first-bracket rate.resident_taxreports the marginal rates
it applied in itsratesfield, which was previously empty. - Cite Library document ids in the calculation evidence, so the citations
survive the Library chapter reorganisation of 19 September 2026.
v0.1.3
- Calculate FBT using the ATO's prescribed gross-up factors. A $1,000 type 1
taxable value produces $977.69 FBT.
v0.1.2
- Bind the release workflow to the checked current Release Policy main commit.
Both historical pins are rejected by GitHub Actions despite remaining readable
through the commit API. Versions 0.1.0 and 0.1.1 produced no release artefacts.
Calculation behaviour is unchanged.
v0.1.1
- Use the Release Policy commit already verified by the MCP release workflow.
GitHub could not resolve the earlier policy reference, so 0.1.0 never built or
published. Calculation behaviour is unchanged.
v0.1.0
- Add 6 bounded calculation worksheets with official sources, explicit periods
and scope confirmation. - Refuse unsupported periods and malformed amounts. Keep reference retrieval and
MCP transport outside the calculation engine.
aus-accounting-mcp/v0.2.11
v0.2.11
- Pin
ato-benchmark-compare0.1.11 andaustralian-tax-calculators0.1.8;
payday-super-checker0.1.8 anddiv7a-loan-review0.1.5 are unchanged. - Through the new pins:
get_ato_benchmarkscompares labour, rent and motor
vehicle expenses, and cost of sales where it is not the key range, against
the ranges the ATO publishes on each industry's page. Each ratio row's
benchmark_sourceand the result'sindustry_page_sourcesay where a range
came from; these ranges never set the key ratio.calculate_tax_worksheet
adds thestudy_loan_repaymentworksheet for 2025-26 and 2026-27. - Add
search_ato_rulingsandread_ato_ruling, which serve ATO ruling
paragraphs from a configured local folder of rulings runs, bringing the
server to 18 tools. - Declare
benchmark_sourceandindustry_page_sourcein the
get_ato_benchmarksoutput schema. - Share one page builder between the legislation corpus and accounting
library tools. - Lock the build backend in the dev extra.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.11.
v0.2.10
- Pin
payday-super-checker0.1.8,ato-benchmark-compare0.1.10,
div7a-loan-review0.1.5 andaustralian-tax-calculators0.1.7, the engine
versions the workspace already tested. 0.2.9's own pins could not reproduce
its quick proof: the publisheddiv7a-loan-review0.1.4 carries an older
benchmark table digest. calc_payday_super_deadlineandreview_payday_super_contributionsreport
notional earnings, both SG-charge estimates and every uplift scenario to the
cent, built the way the checker's report builds them, so they match the
evidence pack'sreport.csv. They carried up to 27 decimal places, and
rounding their sum could land a cent away from the report.- Through the new pins: Division 7A results record each benchmark rate's RBA
workbook cell and accept amounts written with trailing zeros past the cent;
thefbtworksheet adds FBT return items 14A to 16; a report-style P&L with
amounts in more than one column is refused when a column left of the fullest
also holds amounts; and Payday Super evidence packs write caveat and note
cells that start like a formula as text. - The release workflow installs the built wheel outside the workspace, so its
pins resolve from PyPI, and stops before publishing unless its demo matches
docs/quick-proof.txt. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.10.
v0.2.9
- Pin
australian-tax-calculators0.1.6 and add itscontribution_capsand
pension_minimumworksheets tocalculate_tax_worksheet, for 2024-25 to
2026-27: cap room, excess and bring-forward for one person's classified
contributions, and the SISR Schedule 7 minimum for one account-based
pension. Retain theato-benchmark-compare0.1.9,payday-super-checker
0.1.7 anddiv7a-loan-review0.1.4 pins. - Count nine worksheets in the server instructions, scope resource, README,
reference and registry descriptions, and narrow the unsupported SMSF and
contribution-cap topics to what the worksheets leave out. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.9.
v0.2.8
search_tax_legislationandsearch_tax_ratesreturn the best match first
instead of in corpus file order: the query as a phrase in a heading, then every
word in a heading, then the phrase in the text, then the words anywhere, with the
principal tax Acts first within each tier. On a 946-title corpus "small business
entity" previously led with Excise Act 1901 s 4 and "general deductions" did not
reach ITAA 1997 s 8-1 in the first five results. Ranking reads the whole corpus
on each search: about 0.5 seconds on that corpus, up to about 1.6 seconds for
a word nearly every provision holds.define_tax_termputs the principal tax Acts first within exact and partial
matches, and its 20-entry partial cap keeps the best-ranked entries rather than
the first ones the scan meets.read_tax_legislation_sectiontakesstartand returnsstartand
next_start, so a provision longer than 12000 characters can be read in parts.
165 of 21,916 rows in that corpus were cut off with no way to read further,
including ITAA 1997 s 995-1.- A search with no match adds a notice suggesting statutory wording.
- A missing or invalid retrieval folder error tells the caller to ask the user
rather than retry, and the scope resource reports whether each retrieval folder
is configured, without its path. aus-accounting-mcp --versionand--helpprint and exit instead of starting
the server; an unknown argument is refused.- Two evaluation cases cover ranking and reading a long provision in parts.
- Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7,
div7a-loan-review0.1.4 andaustralian-tax-calculators0.1.5 pins. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.8.
v0.2.7
- Pin
australian-tax-calculators0.1.5 and add itspayg_withholding
worksheet tocalculate_tax_worksheet: one regular weekly, fortnightly or
monthly pay from 1 July 2026 on Schedule 1 scale 1, 2, 3, 5 or 6. Retain the
ato-benchmark-compare0.1.9,payday-super-checker0.1.7 and
div7a-loan-review0.1.4 pins. - Resolve each worksheet's engine function when it is called, so a kind the
installed engine lacks is refused with a message and the other kinds keep
working. - Put the missing space back in eight input descriptions for
get_ato_benchmarks,calc_payday_super_deadlineandreview_div7a_loan,
which reached clients as run-together words such as "ratiodenominator". - State in the scope resource, README and disclaimer that the author is not a
registered tax or BAS agent, and limit support to software issues reproduced
with fabricated data. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.7.
v0.2.6
- Pin
ato-benchmark-compare0.1.9 andaustralian-tax-calculators0.1.4.
The benchmark release refuses a neutral CSV whose header namesaccount,
amountorsectionmore than once instead of reading the first such column
silently. The calculator release computes every worksheet in its own decimal
context, so a caller's precision no longer changes a result. Retain the
payday-super-checker0.1.7 anddiv7a-loan-review0.1.4 pins. - Serve the richer worksheet catalogue from the pinned published engine. An
installation on an older calculator keeps the legacy discovery entries. - Align the release, citation, compatibility and MCP Registry metadata to 0.2.6.
v0.2.5
- Pin
payday-super-checker0.1.7. A timely receipt date without either amount field remainsUNKNOWN; a late receipt without an amount remainsLATEwithout the unsupported shortfall reduction. Retain the other 3 published engine pins. - Update the tool descriptions, server instructions and package description for the receipt-amount rule. Require its regression tests in standalone installations as well as workspace tests.
- Include the merged evidence semantics and explicit scope qualifications. The optional richer worksheet catalogue still depends on an unreleased worksheet engine; the pinned published engine retains its existing scope data.
- Include the synthetic group-review example, which indexes separate engine evidence without combining conclusions or transferring outputs between engines.
- Align the release, citation, compatibility and MCP Registry metadata to 0.2.5.
v0.2.4
-
A corpus line that spells a solidus as the JSON escape
\/is parsed rather than prefiltered, so arow_idsuch as5/10that search returned can be read back without asking for neighbours. -
define_tax_termkeeps the lettered conditions of a definition, such as(a)and(b)paragraphs, with the definition they complete; only a numbered subsection label such as(2)closes the dictionary. -
Pin
payday-super-checker0.1.6 anddiv7a-loan-review0.1.4;ato-benchmark-compare0.1.8 andaustralian-tax-calculators0.1.3 are retained. -
Division 7A 0.1.4 names the primary source behind every benchmark rate, so a rate result and the checked demo transcript carry
primary_url,retrieved_onandsnapshot_sha256besideverify_at. No rate value changed. -
Checker 0.1.6 withholds a row's notional earnings, administrative uplift and SG-charge exposure when its period runs past the last GIC quarter on record, and says so in a caveat that names the day, the quarter and the file to update. The server has no equivalent of the checker's
--allow-stale-gic, so a result it returns never carries an extrapolated rate. The checker also names the financial year arates.jsonlookup is missing for, and caveats a fund-receipt row that carries no matched or remitted amount. -
Trim about 4.5 KB (10 percent) from the published tool descriptions and input schemas: the money rule ("AUD decimal string such as "1000.00": finite, at most 2 decimal places, at most 1000000000000.00; omit or null means not supplied, "0.00" only for an established zero") is now stated once in each tool's description instead of once per money field, and the worksheet scope rule once instead of six times. The server instructions carry one retrieval policy paragraph instead of two. No input, bound or behaviour changed.
-
refuse_div7apublishes no inputs. The five legacy fields it accepted and ignored are removed, so a schema can no longer invite a borrower, lender or principal to reach a refusal. A call that still passes them is rejected as unknown arguments. -
Three adversarial evaluation cases: a corpus provision carrying an instruction, an undefined term, and a stored rate row that must be reported at its compilation date rather than as the current figure.
-
Add
define_tax_term, which finds an expression's statutory definitions in the configured corpus's dictionary, definitions and interpretation se...