Books / Law as Code in Practice: German Housing Benefit (Wohngeld) / Chapter 8
Part III · Chapter 8
Missing Facts, Conflicting Records and the Model’s Boundary

Contents of Law as Code in Practice: German Housing Benefit (Wohngeld)
By the end of this chapter you will be able to tell four answers apart that a calculator easily confuses: “not enough facts”, “the records disagree”, “outside the model” and “past the model’s values”.
Lawyer: which provision makes the missing fact a premise.
Analyst: which fact to request from the household.
Developer: which status or issue the answer carries in each case.
1. The question
Files are rarely complete on the first day. The Vogts’ application arrives without the address of the flat. A week later a second rental record appears with a different rent. And a neighbour who owns her flat asks the same office about Wohngeld.
Predict before you read on: for the Vogts’ file without the address, should a model return €0, an error, or something else?
2. Not enough facts: not established, not zero
The scenarios of the suite of missing and conflicting facts take the Vogts’ case and remove one fact at a time:
| Fact removed | What the model still establishes | What it does not |
|---|---|---|
| the place of residence | monthly income €1,710.00 | the rent level, so no ceiling and no amount — the answer to “€0?” is not established |
| the agreed rent | the rent level, Mietenstufe III | the rent taken into account, so no amount |
| whether Markus receives a benefit under § 7 | — | whether the household is established, so no count of members and no amount |
| the work expenses behind Katrin’s wages | that her income details are incomplete | the assessed income, so no amount |
| how a co-resident relates to the family | — | the household, so no amount |
The answer to the prediction is the first line. Without the place, the model cannot know the rent level, so it cannot know the ceiling, so it cannot compute M — and it says exactly that: the amount is not established. It does not return €0, which would state that the family is owed nothing, and it does not fail: it computes everything that can be computed, the income included.
The third line deserves a second look. A missing fact about another benefit is not the fact “receives no other benefit”. § 7 makes the absence of an excluding benefit a premise; a model that assumed it would pay Wohngeld to people the Act excludes.
Not every missing fact stops the calculation, and the difference is instructive. Remove the fact that the flat is the centre of Markus’s life, and the model does not stop: § 5 Abs. 1 makes that fact the condition of membership, so without it Markus is not counted as a member — although nobody has found that he lives elsewhere. The model computes a household of three — Katrin as a single parent with the allowance of § 17 Nr. 3 — and gives €351 instead of €485 (Chapter 2). The model does not flag the missing fact. €351 is the result of an incomplete file, not the Vogts’ answer if Markus does live there, and it must not be given to the family as their answer until the household’s composition is established. Where a fact defines who is in the household, the caseworker must establish it before reading the amount. The proof shows the count of members and the rule that produced it, so the difference is visible at the first line.
3. Records that disagree
Two different situations, and the model keeps them apart.
Two values where the model admits one. The rent agreed for one tenancy has one amount; the model declares it so. If the case holds two different agreed rents for the same tenancy — €580 and €620, say — the answer carries the issue KEY_CONFLICT. The model does not pick one; it reports that the file contradicts itself on a value that must be unique.
A fact asserted and denied. If one record says the flat is the centre of Markus’s life and another denies it, the answer to that question is BOTH — asserted and denied at once. The contradiction is kept, with both sources, for the caseworker to resolve. It is not silently settled by whichever record was read last.
4. Outside the model
The neighbour owns her flat. Owner-occupiers receive a Lastenzuschuss, governed by § 10 WoGG and Part 3 of the WoGV. This model covers tenants only. For her application it returns:
| Question | Answer |
|---|---|
| Is the case outside the model, because it is a Lastenzuschuss? | established |
| Is the monthly Wohngeld €320 (the ministry’s figure for a similar example)? | not established |
The flag ausserhalb_des_modells says why there is no number. “This model does not cover owner-occupiers” is a statement about the model. “The law gives you nothing” would be a statement about the law, and a false one. The model keeps the two apart. The same flag marks the other parts of the Act the model leaves out — among them some co-residents whose share of the rent § 11 Abs. 2 sets aside, and a residence title under § 3 Abs. 5 Satz 3.
5. Past the model’s values
Chapter 1 met the fourth answer. Ask the Vogts’ question for 1 January 2027:
| Question | Answer (recorded 12 October 2026) |
|---|---|
| Monthly Wohngeld on 1 January 2027 | no amount, with the issue MISSING_PARAMETER_VALUE |
The case is complete and inside the model; what is missing is annex values for that date in the model, and the issue names them. Whether values are in force on that date is a question about the law; the issue says only that this model holds none.
6. Four answers side by side
| Situation | Status or issue | What the office should do |
|---|---|---|
| a premise is missing | not established | ask the household for the missing fact |
| records contradict | KEY_CONFLICT or BOTH |
resolve the records |
| the case is outside the model | the flag ausserhalb_des_modells, established |
decide the case by other means |
| the date is past the last values the model holds | MISSING_PARAMETER_VALUE |
wait for, or model, the new values |
Each of these stops the office from reading a number as the answer. Each tells the office something different to do.
7. Where Catala stands on this
Catala 1.3.0 has optional values — absent or present — built in (Catala book, ch. 5.2); the caller decides what to pass for an unknown fact. When two applicable definitions are not exceptions to each other, evaluation stops with a conflict error (ch. 2.2) — a sound guard for the program’s own rules. Arxo adds statuses for the facts of a case: a missing premise yields not established, contradictory records yield BOTH kept for review, and a case outside the model’s scope yields a flag that names the reason.
8. Run it
law test <canon> --file tests/tatsachen.lawtest
law test <canon> --file tests/ausschluss-und-urteil.lawtest
law test <canon> --file tests/redaktionen.lawtest
The first suite holds the missing and conflicting facts (7 of 7 passed on 12 October 2026 with law 0.1.12); the second the owner-occupier flag; the third the dates past the values the model holds.
Exercise
- The Vogts’ file lacks the agreed rent. Which of these does the model still establish: the income, the rent level, the rent taken into account, the amount?
- Why is
BOTHbetter for the office than taking the most recent record? - A colleague reads “outside the model” on the neighbour’s file and writes to her: “You are not entitled to Wohngeld.” What is wrong with that letter?