Rules-as-code · Plain-English guide
How the digitised conditions of Victoria's Wildlife Regulations 2024 decide what each kind of wildlife licence lets its holder do — and what records and notifications the holder must keep up. No code, no jargon left unexplained.
How to read this guide
This ruleset is about licence holders, not applications. It assumes someone already holds (or is modelling) a wildlife licence, and works out two things: which handling activities that licence permits, and which record-keeping and notification duties it obliges. Sections 3–4 cover permissions; sections 5–6 cover duties. The colour code is constant throughout: Permitted, Forbidden, Obligated / Required, Rules work out.
The Wildlife Regulations 2024 create twelve kinds of wildlife licence — basic, advanced, specimen, dingo, controller, dealer, demonstrator, displayer, game bird farmer, processor, farmer and taxidermist. Each kind lets its holder do some things with wildlife (buy it, keep it, sell it, breed it, and so on) but not others, and attaches ongoing paperwork duties.
This ruleset takes the details of a licence — its type, the wildlife it covers, the purpose, the source of the animals — and works out, automatically:
Everything below is worked out by the same rules, evaluated top-to-bottom: when two rules touch the same activity, the later one wins. That single idea explains the whole permission system.
Idea 1
The rules begin by forbidding every wildlife activity. Each licence type then re-opens only the activities it is meant to allow. So a permission is really the answer to “does my licence unlock this?”.
Idea 2
The rules don't output a single verdict. They attach a status to each activity — may do (Permitted), must not (Forbidden), must do (Obligated) — so one licence produces a whole map of dos and don'ts.
Idea 3
Which licence covers which animal turns on the Schedules — official lists of taxa (Schedule 2, 3A, 3B, 4A, 4B, 5A, 5B, 6, 7). A licence unlocks its activities only when the animal is on the right Schedule for that licence.
You provide a fact that is entered about the licence. Rules work out a conclusion the rules calculate. The ruleset draws on a large shared data model; the entities that actually drive these rules are below.
The licence itself — the central thing these rules reason about.
The holder's log of what they've done under the licence. Each entry can trigger required fields and a timeliness check.
Staff a commercial holder employs to act under the licence, and any later change to a name, address or telephone number that must be notified.
Before any licence-specific rule runs, an initialisation step sets every wildlife handling activity to Forbidden — buying, selling, acquiring, receiving, disposing, keeping, possessing, breeding, displaying, destroying, importing, exporting, and the rest. Nothing is allowed yet.
The same step switches on a handful of Obligated duties that apply to every holder regardless of licence type — chiefly the duties to notify a change of name, address or telephone number (for the holder, an employee, or an authorised person), to notify employee details, and to notify police of a wildlife theft.
Later still wins
Because the last rule to touch an activity wins, a licence rule can also switch something back to Forbidden after unlocking it — the taxidermist rules do exactly this to a “sell” permission (see below).
Each licence type has its own rule. It first checks that the chosen licence type matches, then checks a gate — the right Schedule for the species, the right purpose, sometimes the right source — and only then flips its activities to Permitted. The general shape is the same for all twelve:
The matrix shows which activities each licence can unlock. A ✓ means the licence permits that activity once its gate is met; the gate is spelled out in the notes beneath. Some licences (processor, taxidermist) unlock different activities on different branches — the ✓ marks any activity the licence can reach.
| Licence type | Buy | Sell | Acquire | Receive | Dispose | Keep | Possess | Breed | Display | Process | Destroy |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Basic | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Advanced | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Specimen | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Dingo | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||||
| Controller | ✓ | ✓ | |||||||||
| Dealer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| Demonstrator | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| Displayer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| Game bird farmer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ||
| Processor | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||
| Farmer | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Taxidermist | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
The gate for each licence — the extra conditions beyond selecting the type:
Three licences also unlock a special “request approval to acquire wildlife from a specified source” permission (processor, taxidermist, and the farmer's egg branch).
Holding a licence isn't only about what you may do — it's about proving you did it properly. Four rule groups turn activities into record-keeping duties and then check the timing.
If the holder buys, acquires, disposes of or receives wildlife, they are Obligated to record transaction details in the log book. For each transaction, the species, quantity and transaction type become Required; a free-text description is required when the type is “other”. The rules then compute whether the entry was recorded on time:
When a holder becomes aware of a wildlife loss, recording it is Required. For each loss, type, species and quantity are required; if the animal is a dog (Canis familiaris) each microchip number is required too. A theft triggers extra duties, and the loss must be recorded within two days:
A displayer licence unlocks opening a wildlife display; once a display is open the holder may close it. Each opening and closing must be recorded, and recorded within two days of the event. A demonstrator licence unlocks conducting a demonstration and obliges recording each one's date and venue.
| Duty | Applies to | Deadline the rules check |
|---|---|---|
| Record a transaction | Any holder who buys / acquires / disposes / receives | Close of business, same day 48 h for game bird farmer |
| Record a loss | Any holder aware of a loss | Close of business, 2 days later |
| Notify police | Losses that are thefts | Obligated (no computed deadline) |
| Record display opened / closed | Displayer | Within 2 days of opening / closing |
| Record demonstration | Demonstrator | Obligated (date & venue required) |
When the holder flags a change — to a name, address or telephone number, for the holder, an employee or an authorised person — the rules record who the change is for and which detail changed, then make the relevant new detail Required. The change must be reported within 10 business days (modelled as 12 calendar days); the rules compute the elapsed time and mark the “report within 10 business days” duty Obligated.
If the purpose is commercial and the holder employs a person with delegated authority, notifying the employee's details is Obligated. For each employee, name, date of birth, telephone, full address, capacity and start date are Required. The rules check the start date was reported within the 10-business-day window; while the employee has no end date, terminating them is Permitted; once an end date is entered, that too must be reported in time.
“10 business days” = 12 days
Throughout, the “10 business day” deadline is modelled as a flat 12 calendar days. It's a deliberate approximation, not a bug — but reviewers should confirm 12 is the intended figure, since 10 business days can span 14 calendar days across weekends and public holidays.
Coverage at a glance
0 test suites, 0 scenarios, 0 expectations. This ruleset currently ships with no automated test coverage at all.
With 124 rules, twelve licence types and a web of record-keeping and timeliness logic, the absence of any test scenario is the most significant gap in the encoding: nothing pins the behaviour down, so a future edit could silently change which activities a licence permits and no check would notice. A useful first suite would assert, at minimum:
Points a reviewer or the rule author may want to check; these describe the encoding as published and are not legal advice. Encouragingly, three issues noted against an earlier version have since been fixed: the demonstrator gate now joins its Schedules with “or” (so it can open), the demonstrator and taxidermist blocks now carry their section headings, and a change of address now asks for the new address rather than a new name. What remains is below.
1 · Two address-change branches still require a name-change flag
In reg 36 the generic “affected detail = Address” rule now correctly requires the new address fields. But two address branches only fire when a name-change flag is also set: the employee-address branch tests “notify employee address change and notify employee name change”, and the authorised-person branch tests “notify authorised-person name change and notify authorised-person address change”. So an employee or authorised person whose address alone changes may not be registered unless a name change is flagged too — a residual copy-paste slip.
2 · The employee end-date deadline is attached to the wrong field
In reg 37, after computing whether an employee's end date was reported in time (daysElapsedBetweenEndAndReporting), the rule marks the start-date-timeliness property Obligated again, instead of the end-date one. The end-date timeliness result is calculated but never surfaced as an obligation.
3 · Some activities are forbidden and never unlocked
Four activities are set Forbidden in the default block and never turned Permitted anywhere: import wildlife, export wildlife, transact under licence and conduct a wildlife display. Import/export is expected — the permit logic for it (regs 115–116) isn't encoded yet — but transact under licence and conduct a wildlife display look like dead permissions that no path can ever grant.
4 · Most of the regulation is still a stub
Only 19 of the 124 rule groups contain logic. The remaining 105 — “Return forms” and every numbered condition from reg 38 to reg 142 — are present as headings with no rules inside. That covers transaction counterparties, the six-month sale hold, dingo safety/age/marking, codes of practice, the section 28A authorisation, import/export permits and all the exemptions. The encoding to date captures the activity-permission matrix and the core record-keeping and notification duties, and little of the licence-specific ongoing conditions.
5 · Minor: redundant defaults and an unused value
The default block sets possess wildlife and dispose of infertile eggs to Forbidden twice each (harmless but redundant). The computed value isProtectedSpecies is declared in the data model but no rule in this ruleset ever sets it.