Repository navigation
Model Universal Credit reg 77 for owner-managers of a company - #1965
Conversation
…r one person business Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Until 27 November 2018 any Chapter 8 or 9 ITEPA employed earnings from the company excluded the owner; from 28 November 2018 Chapters 8-10 exclude only when derived from main-employment activities. Replace the single boolean with the ITEPA chapter and a main-employment flag, and parameterise the change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Company losses count as nil self-employed earnings (reg 57(2)). - Company earnings count towards the benefit cap earnings exemption (reg 82). - In multi-benunit households, disregarded holdings leave the household capital pool before it is shared; a reporting benunit's holdings come off its own reported capital. Both floored at zero. - Main employment in the company's trade counts as engagement in it for the 77(3)(a) trade-asset disregard. - Replace bitwise NOT on a Python bool in the 77(5) exclusion. - Document dating, trade assets net of secured liabilities, NI references, and the dividend double count until dividends leave UC unearned income. - Strengthen the Hypothesis strategies, add a conservation property, and make the Axiom test an explicit golden-case mirror asserting modelled earnings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve uc_assessable_capital onto main's claimant-based allocation: reg 77 holdings leave the household pool before it is shared among unreported claimants; company capital and reported-path holdings count only for the claimant and partner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi
left a comment
There was a problem hiding this comment.
Thanks Max. Reviewed at head 19323628.
What I checked:
- The law. Your reg 77 quote matches legislation.gov.uk word for word, including 77(3)(a) "wholly and exclusively". That wording is stricter than the Sch 10 para 7 business-assets disregard ("wholly or mainly"), so following the regulation over ADM H1880 is right. The dating of 77(5) (Chapters 8/9 until 27.11.2018, then 8/9/10 with the main-employment condition) is right too.
- Tests at the head. Properties plus Axiom parity: 9 passed. UC YAML directory: 245 passed. CI is green.
- A probe at the head. A trading-company owner whose main employment is the company, with £6,000 of pay and a £20,000 income share, gets
uc_company_self_employed_earnings£20,000,uc_mif_appliestrue anduc_earned_income£26,000. That is 77(3)(b) and (4) working as intended. - Mergeability. It does not merge into current main (
b5b09231; the branch is 249 commits behind). There are conflicts inis_benefit_cap_exempt_earnings.py,uc_mif_applies.pyanduc_mif_capped_earned_income.py. It merges cleanly with #1969, #1974 and #2131.
Findings:
-
Blocking.
variables/gov/dwp/universal_credit/income/income_floor/uc_mif_capped_earned_income.py:20. Main has deleted this file. #1949 replaced it withuc_individual_earned_income_before_mifanduc_individual_earned_income, which use a net floor, the reg 62(3) couple threshold and a per-person tax/NI slice. If you resolve the conflict by keeping main's side, the company earnings are orphaned: nothing reads them, and reg 77(3)(b) silently does nothing. The body's line that "#1949'suc_individual_earned_incomereads this variable" is no longer true. Fix:- add
uc_company_self_employed_earningsnext toself_employedinuc_individual_earned_income_before_mif; - check it doesn't pick up personal income tax in
uc_income_tax_on_earnings, since reg 57 step 3 deducts only tax the person pays; - re-derive invariants 4 and 5 against the net floor and the couple rule.
- add
-
Blocking.
uc_mif_applies.py:25-30andis_benefit_cap_exempt_earnings.py:32. Main now gates both onis_uc_assessed_claimant(reg 62(1), and reg 82(1)(a)'s "claimant's earned income"). When you rebase, ANDuc_company_gainful_self_employmentwithclaimant, and multiply the company term in the benefit-cap sum byclaimant. Otherwise a dependant owner-manager gets the floor or lifts the cap. -
Blocking (interaction with #1969, which merges cleanly so nothing forces the fix).
uc_assessable_capital.py:60-77andhousehold_uc_unreported_company_holdings.py:22-23. #1969 counts the holding at 90% insidecorporate_wealth(ordirectly_held_sharesafter #2131), but this PR subtracts it at 100%.- On #1969 merged with this branch: savings £5,000,
corporate_wealth£10,000, all of it the owner's holding, givesuc_assessable_capital£4,000. It should be £5,000. - #1969 will almost certainly land first, so this PR owns the fix, together with finding 4 (one change; see there).
- Add a YAML case pinning the £5,000.
- On #1969 merged with this branch: savings £5,000,
-
Should fix. Same lines. A holding that isn't in any capital source eats other capital. At the head: savings £10,000, no
corporate_wealth, holding £10,000 gives £0. The body says "a holding cannot reduce other capital", but the only floor is at zero on the total. Fix for 3 and 4 together: in both places, subtractmin(holding, share-like capital) × (1 − sale_expenses.rate). Share-like capital iscorporate_wealthbefore #2131 anddirectly_held_shares + unitemised_corporate_wealthafter it. Add the £10,000-savings case as a test. -
Should fix (body). Several statements are stale against current main and should be refreshed after the rebase:
- "Bit-identical to main" was measured at
00fb451d. - "Not modelled: … the couple threshold rule (62(3)) and net thresholds (62(4))" no longer holds: main has both. Only 62(1)(b) remains.
- The impact table needs re-running on the rebased head.
- "Bit-identical to main" was measured at
-
Nit (body, disclosure). There are no record ids or weights in the body, but the "What this means for #1948" section gives dividend totals for a cohort it describes as coming from fewer than ten FRS households. An aggregate that small is close to record-level. I'd keep the conclusion (they aren't owner-managers; it's an imputation artefact) and drop the small-cell totals and row counts.
-
Nit.
uc_company_capital.py:36-38. Treating "main employment is the trade" as "engaged in the trade" for 77(3)(a) is sensible, but it's an inference, not the text. A one-line comment saying so would help the next reader.
Main deleted uc_mif_capped_earned_income (#1949) and now applies the minimum income floor to net earnings, by the couple rule, only to the all work-related requirements group (#1973, #2081), with claimant-only earned income and benefit cap earnings (#1978). The resolution rewires reg 77 onto that structure instead of orphaning it: - uc_individual_earned_income_before_mif adds the company's profit or loss to the person's own self-employment profit or loss before the nil rule (reg 57(2) step 2; reg 77(1) makes the company's trade one more trade). uc_company_self_employed_earnings is now that signed step 1 amount. - The 77(3)(c) route goes into uc_is_in_gainful_self_employment, so main's uc_mif_applies (group, start-up) applies to it unchanged. - is_benefit_cap_exempt_earnings adds company earnings inside main's claimant-masked sum, so a dependant owner neither lifts the cap nor reduces the award. - Disregarded holdings of unreported benunits come out of the household pool only up to its corporate_wealth, so a holding cannot remove savings. Tests move to uc_individual_earned_income(_before_mif). New YAML cases: dependant owner, cap threshold crossing, company loss against own trade, holding without corporate_wealth. Properties: earnings identity net of own deductions, exact floor trigger, per-unit allocation in shared households, income monotonicity only where the cap exemption is unchanged, dependants. Addresses Vahid's review at 1932362 (findings 1, 2, 4, 7) and the GPT-6.1 Sol round-2 review (findings 1-3, 6). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…dants' holdings Addresses the GPT-6.1 Sol round-3 review at e6ebb9c. - Reg 57(2) step 3 deducts income tax and NI paid in respect of any trade from the combined trading result before the nil rule. Earned income took all tax and NI on earnings off the total after flooring the trade, so a company loss that cancelled a taxed trade left that trade's tax coming off pay (12,000 pay, 20,000 own-trade profit, -20,000 company income gave 7,668.20 instead of 12,000). New uc_income_tax_on_trade (tax on earnings less the tax on the other earnings alone, which take the lower slice as PAYE codes give the allowance to an employment) and uc_national_insurance_on_trade (Class 2 and 4), each capped at the earnings figure in use, which can be an input. uc_income_tax_on_earnings is unchanged; its computation moved to utils/uc_income_tax.py so both take slices of one computation. - is_benefit_cap_exempt_earnings is main's again. A company term there carried signed losses and dividend tax into the test; #1820 rebases the test on uc_individual_earned_income_before_mif, which includes company earnings, and on the 16-hour National Living Wage threshold. The two cap YAML cases (one of which blessed main's out-of-date 10,152) go. - household_uc_unreported_company_holdings becomes household_uc_pool_company_holdings: every holding except a reporting unit's claimant's or partner's leaves the household pool, so a dependant's holding in a reporting family no longer counts for an unrelated unreported claimant. - Tests: the review's deduction-order case and its control, the reporting-family dependant holding case; properties now check the reg 57(2) order, an independent no-tax identity at low incomes, LCWRA owners get no floor, and disregarded holdings count for no unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The derandomised examples had drifted away from three reg 77 branches, so three reinstated defects passed. Pinned examples now make every run reach the 77(3)(c) floor, a company loss against the owner's own trade, the tax on a trade a company loss cancels, an LCWRA owner, and a disregarded holding in a shared household. All eight mutants in the evidence script now fail the properties. The module docstring states invariant 4 in reg 57(2) order and lists all nine invariants (round-4 review, non-blocking). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks @vahid-ahmadi. Main is merged in (now
🤖 Generated with Claude Code |
|
Hand-off to the UK hub (owner session 251896c0, 2026-10-13).
🤖 Generated with Claude Code |
|
Merged by the UK hub (audit). Merged with a merge commit at the tested head
|
Resolve conflicts with #2399, #2076 and #1965: - is_benefit_cap_exempt_earnings: keep main's per-claimant uc_individual_earned_income_before_mif test and documentation; keep this PR's dated threshold parameter in place of 10_152 and its reg 57 and FA 2004 s.188 references. - is_benefit_cap_exempt_health_disability: take main's version (#2076) and add the UC route for AFIP: on a Universal Credit award only a claimant's counts; otherwise Housing Benefit's young person counts too. - is_benefit_cap_exempt: take main's label. - test_uc_single_claim_properties: keep main's AFCS assertions and this PR's partner-only AFIP example. Pin main's young-person AFIP YAML case to the Housing Benefit route, and give the specified-benefits property oracle the family's scheme. Rewrite the changelog fragment to what the PR still changes relative to main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #1964. Part of #1948.
Summary
This PR models Universal Credit regulation 77, "Company analogous to a partnership or one person business" (UC Regs 2013; UC Regs (NI) 2016, same number). It applies to a person who stands in a position analogous to a sole owner or partner of a company carrying on a trade or a property business. For that person:
Every new input defaults to "no such company", so no dataset changes; the Enhanced FRS comparison with main is below.
#1948 asked whether its six-figure-dividend UC units are owner-managers under reg 77. Their dividends are not ones the survey recorded: they are an imputation artefact, fixed in PolicyEngine/policyengine-uk-data#498. The survey cannot settle whether any of these people is an owner-manager; see "What this means for #1948".
The law
UC Regs 2013 reg 77, verbatim from legislation.gov.uk (revised text valid 2026-07-16, no outstanding effects):
Until 27 November 2018, 77(5) read "...Chapter 8 ... or Chapter 9 ... of Part 2 of ITEPA", with no Chapter 10 and no main-employment condition (point-in-time texts 2013-04-29 and 2014-11-26; SI 2018/1129 reg 3(5)). The model dates this with two parameters.
The regulation is mandatory. DWP guidance treats "analogous" as a question of fact:
A shareholder in a widely held company is an investor (ADM H4362-H4364, H1877-H1879, citing R(IS) 8/92 and 13/93 as reported in CA v Hastings BC [2022] UKUT 57 (AAC)). The only Upper Tribunal decision found applying UC reg 77, SSWP v Faghy (UA-2026-000266-USTA, 27 August 2026), accepted the Secretary of State's ground that a property business gets no 77(3)(a) disregard. It was an unopposed paper decision, so this is not the tribunal's own reasoned construction. This model does the same.
Where DWP guidance and the regulation differ, the model follows the regulation.
uc_individual_earned_incomealready does.owned_company_capitalis documented.Company income is before corporation tax. Reg 57(2) step 3 deducts only income tax and NICs paid by the person. Neither the regulations nor ADM H1/H3/H4/H5 provide for deducting corporation tax, so
owned_company_income_shareis documented as the reg-57 amount before it.What changes
Inputs, all under
variables/input/owned_company/, per person, each defaulting to no company:stands_as_sole_owner_or_partner_of_companyowned_company_carries_on_tradeowned_company_carries_on_property_businessowned_company_intermediary_earnings_chapter(enum: none, or ITEPA Part 2 Chapter 8/9/10)owned_company_intermediary_earnings_from_main_employmentowned_company_income_shareowned_company_is_main_employmentis_engaged_in_owned_company_tradeowned_company_capitalowned_company_trade_assetsowned_company_holding_valueUC variables (
gov/dwp/universal_credit/company/):uc_company_intermediary_exclusion_applies(77(5), dated)uc_company_owner_treatment_applies(77(1), (5))uc_company_self_employed_earnings(77(3)(b); the reg 57(2) step 1 profit or loss, so negative for a loss)uc_company_gainful_self_employment(77(3)(c))uc_company_capital(77(2), (3)(a), clamped at zero)uc_company_holding_disregard(77(2))Parameters:
gov.dwp.universal_credit.company_owner.intermediary_exclusion.{chapters, requires_main_employment}.Wiring:
uc_individual_earned_income_before_miffollows reg 57(2) for self-employed earnings: it adds the company's profit or loss to the person's own self-employment profit or loss (step 2), takes off the income tax and NI paid in respect of any trade (step 3), and only then makes a negative result nil. Pay is net of the tax and NI paid in respect of the employment (reg 55(5)). Before, all of a person's tax and NI on earnings came off the combined total after the trade was floored, which was the same thing until a company loss could cancel a taxed trade.uc_income_tax_on_trade: the person's tax on earnings less the tax on their other earnings alone, which take the lower slice as PAYE codes give the personal allowance to an employment. Newuc_national_insurance_on_trade: Class 2 and Class 4.uc_income_tax_on_earningsis unchanged; its computation moved toutils/uc_income_tax.pyso both variables take slices of the same computation.uc_earned_incomesums assessed claimants only.uc_is_in_gainful_self_employmentadds the 77(3)(c) route.uc_mif_appliesreads it, so the floor still needs the all work-related requirements group (reg 62(1)(b), Apply the UC minimum income floor only to claimants subject to all work-related requirements #2081) and is off in a start-up period (reg 62(5)).is_benefit_cap_exempt_earningssums pay and self-employment profit less all income tax and NI, so adding a company term there would carry a signed loss and dividend tax into the test. Fix benefit cap exemption defects (#1818) #1820 rebases the test onuc_individual_earned_income_before_miffor assessed claimants (reg 82(1)(a), (4)) and on the 16-hour National Living Wage threshold, so it will count company earnings correctly whichever PR merges first. Until then, a company owner's company earnings do not count towards the exemption, as on main today.uc_assessable_capitaladds the company capital of the claimant and partner (is_uc_claimant, following main's rule that a dependant's capital is not the claimant's) and removes disregarded holdings.household_uc_pool_company_holdings): those of everyone in unreported units, and of dependants in reporting ones, whose capital is nobody's to count. So no unit counts any part of a disregarded holding. A holding is shares, held in the household'scorporate_wealth, so no more than that comes out: a holding entered without matchingcorporate_wealthcannot remove savings or property.uc_reported_capital, floored at zero. The reported figure has no share breakdown to cap them against.uc_assessable_capitalfor households with a UC award. This is intended: those schemes take UC's capital figure.Dividends are left alone. A shareholder's dividends are not UC unearned income under reg 66(1) at any capital level; #1950 takes them out of
uc_unearned_income. Before it merged, main still counted dividends as unearned income when tariff income did not apply. So a household calculation that sets these inputs and also enters that person's dividends would count the company's income twice;owned_company_income_share's documentation says so. #1950 has now merged (main is merged into this branch), so on current main the double count cannot arise.Invariants (stated and tested)
test_uc_company_owner_properties.pychecks these with Hypothesis on generated benefit units: singles and couples, 0-2 children, pay around the floor, self-employment profit, small savings andcorporate_wealth, start-up status, and company facts including losses.universal_credit,uc_assessable_capital,uc_earned_income,is_benefit_cap_exempt_earnings,uc_individual_earned_incomeoruc_mif_applies.uc_assessable_capital= capital without the rule − min(Σ owners' holdings,corporate_wealth) + Σ owners' max(0, company capital − trade assets if trade and engaged or main employment). Property 3 covers shared households and property 9 reporting units.corporate_wealth, leaves the household pool; the rest is shared in proportion to each unit's claimants, and each unit adds its own claimants' company capital: unit capital = (household capital − min(Σ holdings,corporate_wealth)) × claimants in unit ÷ claimants in household + its company capital. The units' capital therefore sums to that pool plus Σ company capital.uc_mif_appliesholds exactly for a person in the all work-related requirements group, outside a start-up period, who has self-employment profit or loss or owns a trading company that is their main employment; never for one with limited capability for work and work-related activity. The floor never lowers earned income, and a single claimant it applies to has earned income of max(earned income, floor).corporate_wealthas a disregarded holding of a dependant in a family (whether or not the family reports its capital) and of an adult in another, unreported unit changes no unit's assessable capital.How hard the properties are exercised. Each property runs 10 derandomised examples. Pinned examples make every run reach:
A 77(3)(c) owner in a start-up period, and a holding above
corporate_wealth(also pinned by YAML), are reached by the generated examples. A replay of the four properties built on the shared generator covers 362 adults:corporate_wealthNo generated pair in the monotonicity property crossed the cap threshold, so its exemption filter was never needed.
Mutation check. I reinstated eight defects one at a time, and each makes a property or YAML case fail:
corporate_wealthcap on holdings removed.Without mutants all seven properties pass. The script and its outputs are kept with the evidence (
tests-evidence/mutation_check.py,mutation.json,property_coverage.py,coverage.json).test_uc_company_owner_axiom_parity.pyis a golden-case mirror of the independent Axiom encoding, TheAxiomFoundation/rulespec-ukuk/regulations/uksi/2013/376/77.yaml. It copies the four cases of its77.test.yaml(commit 0644db8) and maps Axiom's inputs one to one (table below). It checks:It does not run Axiom, so it will not catch drift in that encoding; rulespec-uk#394 covers that side.
Tests
YAML (26 cases, hand-computed from the regulation).
tests/policy/.../universal_credit/company/uc_company_analogous_business.yaml:uc_income_reduction.corporate_wealthdoes not remove savings.Hypothesis properties: 7 tests (the 9 invariants above), about 90 seconds with
-n 4.Axiom golden cases: 4 tests.
At
93dd669cc, locally:CI runs the full suite.
Enhanced FRS impact
Data and runs. The dataset is a private copy of
enhanced_frs_2024_25.h5(sha256e433e532…). Every number below is from a real microsimulation run with stored weights, 2025-2030: maine3c27c7aband this branch at2a52fa09f(main merged in). The head,93dd669cc, changes only the property tests since then. The branch runs were on a clean tree. Main's run had one local change, the editable package's own version line inuv.lock(2.126.8 → 2.127.0), which no code reads.Main vs this branch. Not bit-identical, but equal to within float32 rounding. Of the 22 arrays compared (benefit-unit and household), 16 are identical in every year 2025-2030. The other 6 differ only in the last bits:
uc_individual_earned_income(before and after the floor) anduc_earned_income: by at most £0.07 per benefit unit;uc_income_reductionanduniversal_credit: by at most £0.004;household_net_income: by at most £0.04.Total UC differs by between £3 and £65 a year (against £83.3bn in 2026).
The cause is that
uc_individual_earned_income_before_mifnow sums its float32 terms in a different order (employment net of its tax and NI, plus the trading total net of its tax and NI). Recomputing main's formula inside a branch run at93dd669ccgives no difference above £0.50 for any person in 2026, so the logic is unchanged without company income. The per-array maxima and UC-total differences, and that check, are kept with the evidence (impact/branch_v5_vs_main_v5_magnitudes.json,diag/earnings_order_diff_2026.txt). The dataset has no owner-manager inputs, so reg 77 itself is inert.Preview with the FRS's own director fields (indicative only; not a proposed release). This illustrates what a data build that fills the inputs would do. The FRS 2024-25 job table asks directors of limited companies what share they own (
DIRPERC) and what dividends they took (DIVIDEND). For this run only:stands_as_sole_owner_or_partner_of_companyandowned_company_carries_on_tradeare true for directors owning 50% or more. The 50% line is an assumption drawn from the ADM examples, not the law. Both dataset copies of each FRS household get the inputs: the original and its capital-gains clone.DIVIDENDis a weekly net amount. It equals the adult table'sDIVIDNETwhere both exist, despite the question asking about the last 12 months.Capital inputs stay zero, since the FRS has no company balance sheet. Result, against the branch without inputs:
In every year 2025-2030, UC falls for fewer than ten survey records and rises for none; the change is under £0.1bn a year. Company earnings total £9.5bn in 2026. An earlier preview, at
19323628, was measured before main's net-floor, claimant-only and earned-income changes, and before this PR stopped adding company earnings to the benefit cap test, so the two are not comparable.Filling the inputs is follow-up data work in policyengine-uk-data. Director shares and dividends are in the FRS job table. Its
DIVIDENDis stored as a weekly net amount, and whether director dividends also appear in other FRS income fields has to be checked first.What this means for #1948
#1948's cohort is the UC benefit units with more than £50,000 of dividends on the Enhanced FRS. Most of them are FRS-half records; the rest are SPI donors. I linked the FRS-half records to the raw FRS 2024-25. The cohort is too small to publish its totals, so these are the conclusions only:
dividend_incomefor them.DIRECTORandDIVIDEND), and few of those households include a director at all.So the cohort's dividends are not owner-manager income the survey recorded. That does not show that no one in the cohort is an owner-manager under reg 77: the comparison is at household level, and the FRS records neither a company's trading status nor its profits, so a director who takes no dividends would still be within reg 77. What the linkage does show is that the model's dividends are not the survey's. They come from policyengine-uk-data, which has two defects:
impute_incomereplaces every FRS respondent's dividends with a draw from the SPI income model, which predicts from age, gender and region (and, since policyengine-uk-data#529, within earnings groups), not from anything about investments or benefits;frs.pykeys the survey's own dividends on row position, so almost none survive.PolicyEngine/policyengine-uk-data#498 fixes both.
#1948 also asked how #1837 changes the picture. Real runs of the same dataset on main as it was then (
44240bd8, before #1950 merged), for 2026:corporate_wealth, tariff income stops applying and their dividends then count as unearned income. Reg 66 does not allow that.So nothing in the rules stops these units, whether or not #1837 lands. The fix is in the data.
Not modelled here (tracked separately)
is_benefit_cap_exempt_earningsas main has it. Fix benefit cap exemption defects (#1818) #1820 rebases it onuc_individual_earned_income_before_miffor assessed claimants, which includes company earnings from this PR. Whichever of Fix benefit cap exemption defects (#1818) #1820 and Model Universal Credit reg 77 for owner-managers of a company #1965 lands second: check that the cap readsuc_individual_earned_income_before_mifand adds no separate company term.sale_expenses.rate) × min(holding,corporate_wealth) inhousehold_uc_pool_company_holdings, and the same factor on the reported-path subtraction. Whichever merges second makes that change; both PR bodies say so.Axiom
axiom: uk:regulations/uksi/2013/376/77 encoded-correct for the law in force from 28.11.2018 (rulespec-uk
77.test.yaml, 4 cases, mirrored bytest_uc_company_owner_axiom_parity.py) | TheAxiomFoundation/rulespec-uk#394 queuedThe queued issue covers the module's two gaps:
Axiom to policyengine-uk mapping (for rulespec-uk#394 and axiom-oracles)
uk:regulations/uksi/2013/376/77person_stands_in_position_analogous_to_sole_owner_or_partner_in_relation_to_companystands_as_sole_owner_or_partner_of_companycompany_carries_on_tradeowned_company_carries_on_tradecompany_carries_on_property_business_within_meaning_of_corporation_tax_act_2009_section_204owned_company_carries_on_property_businessperson_derives_company_income_that_is_employed_earnings_by_itepa_part_2_chapter_8/_9/_10owned_company_intermediary_earnings_chapter(enum)intermediary_employed_earnings_derived_from_person_main_employment_activitiesowned_company_intermediary_earnings_from_main_employmentcompany_capital_value_or_person_share_valueowned_company_capitalcompany_trade_asset_value_or_person_share_used_wholly_and_exclusively_for_tradeowned_company_trade_assetsperson_engaged_in_activities_in_course_of_company_tradeis_engaged_in_owned_company_tradeperson_holding_value_in_companyowned_company_holding_valuecompany_income_or_person_share_calculated_as_self_employed_earnings_under_regulation_57(monthly)owned_company_income_share(annual)person_employed_earnings_as_director_or_employee_of_company(monthly)employment_income(annual)person_activities_in_course_of_company_trade_are_main_employmentowned_company_is_main_employmentcompany_intermediary_employed_earnings_main_employment_exclusion_appliesuc_company_intermediary_exclusion_applies(dated as in rulespec-uk#394)company_analogous_owner_or_partner_treatment_appliesuc_company_owner_treatment_appliesperson_capital_treated_as_possessed_from_companyuc_company_capitalperson_company_holding_disregarded_from_capitaluc_company_holding_disregardcompany_income_treated_as_person_self_employed_earningsuc_company_self_employed_earningsperson_treated_as_gainfully_self_employed_for_company_tradeuc_company_gainful_self_employmentminimum_income_floor_applies_due_to_company_tradeuc_mif_applies(which also applies reg 62(5))Provenance
Law texts, ADM extracts, case-law notes, the Axiom audit and all impact scripts and outputs are in
~/reviews/uc-dividends-1948-2026-09-30/:law/,axiom/,impact/anddiag/. They are local and private. The*.jsonrun summaries anddiag/*.jsonhold aggregates only. Theimpact/*.npzarrays andefrs_copy.h5are record-level survey data (per-benefit-unit amounts and weights) and never leave this machine; nothing in this PR is drawn from them except the aggregates shown.🤖 Generated with Claude Code