Skip to content

A miscellaneous loss is relieved against all other income, not only miscellaneous income (ITA 2007 s. 152(4)) #2326

Closed

Description

@MaxGhenis

What the law says

ITA 2007 s. 152 gives relief for a loss on a miscellaneous transaction. Subsection (4) limits where it can go:

(4) But a deduction for that purpose is to be made only from the person's relevant miscellaneous income.

So a miscellaneous loss reduces only miscellaneous income, in the same year and later years. It never reduces employment, pension, property, savings or dividend income.

What the model does

taxable_miscellaneous_income is adds = ["miscellaneous_income"], so a negative miscellaneous_income passes straight through. It is a component of adjusted net income and total income, so the loss is set against every other source of income.

Minimal reproduction

policyengine-uk 2.126.7, and main at 6d89338:

from policyengine_uk import Simulation

def income_tax(**inputs):
    s = {
        "people": {"p": {"age": {"2026": 45}, **{k: {"2026": v} for k, v in inputs.items()}}},
        "benunits": {"b": {"members": ["p"]}},
        "households": {"h": {"members": ["p"], "country": {"2026": "ENGLAND"}}},
    }
    return Simulation(situation=s).calculate("income_tax", 2026)[0]

income_tax(employment_income=50_000)                               # 7,486
income_tax(employment_income=50_000, miscellaneous_income=-10_000) # 5,486   the law gives 7,486

A property loss is handled correctly: Income Tax stays at £7,486, though total_income does fall by the loss.

How it was found

The PolicyBench UK round 2 internal audit (October 2026). The public transfer dataset carries negative miscellaneous income for 964 of 58,848 people, and the round 2 sample includes several. In one, a household with −£2.4m of miscellaneous income pays no tax on a £510,223 salary. The affected audit cells will be added below.

A fix with tests follows in a PR.

Activity

  1. MaxGhenis commented on Oct 11, 2026

    @MaxGhenis
    CollaboratorAuthor

    Evidence from PolicyBench UK round 2, an internal audit of policyengine-uk 2.126.7 (references identical on 2.126.8). Six models answered the same 200 households. A reference adversary (a blind GPT-6.1 Sol judge, then reconciliation with the engine log) reviewed consensus disagreements and a sample of single-model misses, and each verdict was adjudicated against the engine code and the law.

    Audited cells that turn on this issue: 14. "With #2327" is the reference recomputed on that branch alone; "exact" counts the six models within £1 of the reference, before and after.

    Cell Reference Models (answer × count) With #2327 Exact before → after Other causes in the cell
    scenario_004/universal_credit £23,619.91 £23,609 ×2 £23,608.91 0 → 2
    scenario_087/capital_gains_tax £7,145,887.68 £7,148,150 ×3 £7,148,149.68 3 → 3
    scenario_087/income_tax £450,841.11 £37,556 ×2 £603,505.14 0 → 0 #2310, #2309 (PR #2312)
    scenario_088/capital_gains_tax £5,389.68 £4,042 ×5 unchanged 0 → 0 #2045 (PR #2240)
    scenario_088/income_tax £108,762.90 £3,136 ×5 £113,588.25 0 → 0 #2045 (PR #2240)
    scenario_139/income_tax £44,297.45 £43,979 ×3 £44,464.40 0 → 1 #2321 (PR #2323)
    scenario_148/capital_gains_tax £7,039,668.00 £7,041,930 ×4 £7,041,930.00 2 → 4
    scenario_148/income_tax £411,837.14 £563,990 ×3 £564,501.17 0 → 0
    scenario_155/income_tax £5,786.00 £5,768 ×3; £5,822 ×3 £5,822.00 0 → 3
    scenario_156/income_tax £613.60 £115 ×5 £617.60 0 → 1
    scenario_163/high_income_child_benefit_charge £731.78 £0 ×4 £1,406.60 0 → 1 #2321 (PR #2323)
    scenario_163/income_tax £25,059.78 £0 ×3 £40,971.00 0 → 0 #2045 (PR #2240), #2321 (PR #2323)
    scenario_164/high_income_child_benefit_charge £0.00 £3,268 ×2 £3,268.20 3 → 2
    scenario_164/income_tax £5,220,201.50 £0 ×3; £221,857 ×2 £5,577,248.00 0 → 0 #2045 (PR #2240)

    All cells, audited or not. Of the run's 2,800 references, #2327 moves 16 (14 of them audited). In those 16 cells, model answers matching the reference go from 17 to 18 of 96.

    Source: audit/adjudication.json and audit/attribution/attribution.json in the round 2 record.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions