Skip to main content

AU Tax Change Impact Monitor

tests License: MIT Python 3.10+

A provenance-first change-review queue, not a tax-answering system or an automatic skill updater.

The first version compares fabricated source-index metadata with a fabricated Register-observation contract. It keeps important states distinct (SUPERSEDED, CURRENT_NO_PUBLISHED_COMPILATION, NO_LONGER_IN_FORCE, and LOOKUP_FAILED), then maps only exact register ID + collection pairs to a potential workflow-review question.

Synthetic source index + synthetic Register observation + exact source-to-skill map
                                      |
                                      v
                          Change classification and scope gate
                                      |
                                      v
                         Potential-impact technical-review queue
                                      |
                                      v
                         Human technical-tax decision, outside this tool

Demo

python -m pip install -e ".[dev]"

au-tax-change-impact-monitor compare \
  --baseline au_tax_change_impact_monitor/samples/baseline/sample-sources.json \
  --observation au_tax_change_impact_monitor/samples/observations/sample-register-observation.json \
  --map au_tax_change_impact_monitor/samples/mappings/sample-source-skill-map.json \
  --out build/demo

The sample fixtures ship inside the package, so a plain pip install can run the same demo from any directory; python -c "from au_tax_change_impact_monitor.util import sample_path; print(sample_path())" prints their installed location. Every input option accepts any readable path, and --out is created relative to the current directory.

The example creates one SUPERSEDED source item mapped to a BAS-review question. It deliberately does not infer the legal effect of the change, update a skill, or send a notification.

The output directory contains deterministic impact-queue.json and impact-queue.md files. Both are staged before publication; if committing the second file fails, the writer restores the complete previous pair rather than leaving two runs mixed together. Input digests and identifiers come from the same immutable byte snapshots that are parsed. An item is OPEN when it needs human technical review, carrying change_kind SUPERSEDED or NO_LONGER_IN_FORCE. An item is BLOCKED for any of five reasons, each named by its own change_kind:

change_kind Cause
INCOMPLETE_SCOPE The observation is marked incomplete, so no “unchanged” result can be relied on.
MISSING_OBSERVATION A baseline title was not observed at all.
LOOKUP_FAILED The observation records a failed lookup for that title.
CURRENT_NO_PUBLISHED_COMPILATION The title is current but has no published compilation to compare.
BASELINE_NOT_CURRENT The baseline row is itself marked version_is_current: false, so it is a stale index entry and cannot support a currency conclusion.

compare exits 0 for REVIEW_REQUIRED and NO_CHANGE_DETECTED, and 2 when the run status is BLOCKED. Rejected input also exits 2, in one of two shapes: a malformed command line is rejected by argparse, which prints its own usage block, and everything the monitor itself rejects prints a single au-tax-change-impact-monitor: blocked: ... line on stderr.

If stdout cannot encode a character in the --out path (a redirected stream on Windows uses the ANSI code page, not UTF-8), that one line is printed backslash-escaped and a au-tax-change-impact-monitor: note: ... line on stderr says so. The exit status still reflects the run, and the files on disk carry the real path.

If stdout cannot be written at all (a reader that closed the pipe, or a redirect to a handle this process cannot write to), the summary is dropped, a au-tax-change-impact-monitor: note: ... line on stderr says so, and the exit status is still the one the run decided. A redirected stdout is buffered, so that failure otherwise surfaces only when the interpreter flushes on the way out, where it is reported as Exception ignored ... and exits 120 on a run whose queue files are complete. The CLI closes stdout instead, which is what keeps the exit status the run's own.

au-tax-change-impact-monitor validate-review \
  --queue build/demo/impact-queue.json \
  --decision path/to/a-human-technical-review.json

Only AWAIT_PRIMARY_TEXT, NO_WORKFLOW_CHANGE, UPDATE_CANDIDATE, and ESCALATE_TECHNICAL_REVIEW are accepted. Validation reports PARTIAL_DECISION_RECORDED while any open item remains undecided; it checks structure and matching queue only and does not certify the review, edit a skill, or establish a legal conclusion. Observation and review timestamps require an explicit UTC offset (or Z) so audit ordering is unambiguous.

The accepted timestamp grammar is exactly YYYY-MM-DDThh:mm:ss[.ffffff][Z|+hh:mm|-hh:mm], with t or a single space allowed in place of T. It is pinned by a pattern rather than handed to datetime.fromisoformat, whose grammar differs between Python 3.10 and 3.11+, so the same stored artefact validates the same way on every supported interpreter. The ISO basic form (20260808T000000Z), week and ordinal dates, a bare-hour offset (+00), a lowercase z, a date with no clock, and any other date/time separator are all refused. Dates in the baseline and observation are YYYY-MM-DD on the same basis.

Strict scope

  • Inputs are metadata only. No legislation EPUB, HTML, PDF, section JSONL, rate, or source text is read or stored.
  • The synthetic demo never performs network I/O or Register scraping.
  • A source is mapped by exact (register_id, collection) only. An unmapped change remains visible as UNMAPPED_SOURCE; it is never silently dismissed.
  • UNCHANGED is valid only inside a complete observation scope. A partial/failed observation cannot produce a “no change” conclusion.
  • Every artefact carries mode: synthetic to prevent the demo being misrepresented as a live legislative monitor.

Relationship to existing work

The intended future source is a reviewed, deliberately versioned observation output from au-tax-legislation-corpus. That corpus’s distinction between a superseded compilation, a current version with no published compilation, a title no longer in force, and a failed lookup is preserved here. This project is not a replacement corpus builder and must not treat derived corpus material as authorised legal text.

Development

pytest
python -m build

Built with AI assistance (Claude); design, review, and testing by the author.

MIT licensed.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

au_tax_change_impact_monitor-0.1.1.tar.gz (35.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

au_tax_change_impact_monitor-0.1.1-py3-none-any.whl (21.6 kB view details)

Uploaded Python 3

File details

Details for the file au_tax_change_impact_monitor-0.1.1.tar.gz.

File metadata

File hashes

Hashes for au_tax_change_impact_monitor-0.1.1.tar.gz
Algorithm Hash digest
SHA256 ffe2320a297e78a9c4695244e3da5d0ac2e8f7add851d2564cf09b70869db99f
MD5 c2927df920f6ad229603e8e2d99d8b33
BLAKE2b-256 a8333b4e6b53d754d9bf411e74f406cf38b0904638f6ab75134a4cd6a4995a16

See more details on using hashes here.

Provenance

The following attestation bundles were made for au_tax_change_impact_monitor-0.1.1.tar.gz:

Publisher: release.yml on ryanduguid/tax-radar-au

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file au_tax_change_impact_monitor-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for au_tax_change_impact_monitor-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 63b0ced748dbc519dfbc4fea7d51dfd1d3a8fc787809df0ccd38e0f8a4a0f77b
MD5 f8947a4802a22632a74955b60fda7017
BLAKE2b-256 b6b3f97e239314c82b7b3113dbb58f80242c39cc650fd23a5a454949923ad898

See more details on using hashes here.

Provenance

The following attestation bundles were made for au_tax_change_impact_monitor-0.1.1-py3-none-any.whl:

Publisher: release.yml on ryanduguid/tax-radar-au

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.1.3

2 files

This release

0.1.1 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page