Every property says whether it is required
A decision record · every-property-says-whether-it-is-required · cited by 1 page
The eighteen ontology classes declared 120 properties and not one said whether an instance had to carry it, so every property was optional by omission and missing-property reported 46 findings nobody had decided about. Each declaration now says: 113 required, 7 not. The rule is that an instance without a required property is incomplete, and an absence the corpus has looked for is written as a value — “Not applicable.” — rather than left out. The 15 required omissions no committed source answers are baselined, so they gate for the next node and not for these.
Context Contents
The edge contract was defended by a measurement. edge_policy: characteristic stands on a
generated census in the corpus README, written after seventeen hand-copied figures went stale
under it. The property contract had nothing: across the 18 .ont.yml files the key required
did not appear once (#507). yidam gates missing-property on required: true and only reports
it otherwise, so a corpus that never says required can omit anything and stay green.
Measured at yidam 0.16.0 before this change: 110 of the 120 properties are carried by every
instance of their class. Ten are not, 48 omissions between them — the 46 #507 counted, plus two
function_tex omissions that arrived with new components after its pin.
The fully carried properties include every one worded as conditional. metric.calculator
says “if implemented”, legislation.vetoes “where relevant”, actor.publishes “if any”. All
are carried by every instance, and the absences are written as answers: “Published, not
computed”, “None recorded.”, “Not applicable.”, “Not a standalone crate”, “No line of its own”.
draft-legislation.sponsors had already stated the practice — “None.” is an answer rather than
an empty field. So “if any” in a description has never meant “may be omitted” here; it meant
“may be empty, and say so”.
Two of #507’s rows were misread. It described education-agency.established (0 of 7) and
school.grades (0 of 3) as declarations the corpus never adopted. Six of the seven agencies and
all three schools record the missing value under unfilled:, with where it lives — the
department’s district profile, the building’s directory entry — and the seventh records its
opening date the same way under a different noun. The corpus adopted both properties and could
not answer them; missing-property does not read unfilled:, so the two states looked the same.
Neither is derivable from what is committed: the report card fixtures, and the building details
workbook in the source cache, carry no grade span.
And one description had gone stale in the way the edge census had. function_tex named its
two deliberate exceptions, charge-off-local-share and fsfp-formula-transition-supplement.
Both were converted to LaTeX on 11 September 2026. The two components without one now are
neither of them, and each has what the description says earns the notation — a piecewise rule
in one, a floored fraction in the other.
The decision Contents
Every property declaration carries required:, and the web schema refuses one that does
not. OntologyPropertySchema requires the key, with no default — upstream’s default of false
is right for a corpus that never had the chance to say, and wrong for one that has said. The
reasoning is edge_policy’s, one field over: a class that has not decided should not pass as
though it had.
required: true means an instance without the property is incomplete. 113 declarations:
the 110 every instance carries, and three that are wanted and not yet held —
metric.series, education-agency.established, school.grades. Their 15 omissions are in
.yidam/lint-baseline.yml, blessed rather than hand-written, so a new metric, agency or school
node without the property fails the gate, and filling one of the 15 fails it too until the
baseline is re-blessed. That second failure is the ratchet working: the baseline must shrink
with the debt.
metric.series is required on the argument #507 made: a metric whose values over the held
data are not written down is a measure the corpus names and has not taken. Its description is
rewritten to what the four instances that carry it hold — the figures, over which years and
agencies — rather than “the published series”, which none of them is.
required: false means an instance may be quiet, and its description says when. Seven:
formula-component.function_tex— the notation earns its place on a fraction, a piecewise rule, an exponent or an indexed family, and not on a list of products. Which components are which is no longer named in the description, since the names are what went stale.parameter.written_as— a parameter every formula writes as a symbol has no phrase to list.parameter.simulation_key— a parameter the calculator does not bind as a scalar has no key, and one pointing at nothing would read as provenance.litigation.procedural_history— a case decided once has no path to record.funding-regime.boundary_note— a regime whose years are not in dispute has nothing to note.legislation.effective_note— a constitutional provision or a single-date act has one date. On a biennial budget act, its absence is a gap the class cannot express.legislation.accountability_effect— an act that did nothing to the accountability regime has nothing to record. An absence does not say whether the act did nothing or was never read for it.
The census is generated. edfund-connect property-contract writes a block into the corpus
README beside the relationship vocabulary: declarations by what required: says, omissions
split the same way, and every property some instance omits. A test holds its required-omission
count equal to the number of missing-property entries yidam blessed, so the two readers of the
same files cannot drift apart unseen.
Consequences Contents
yidam lint passes with 15 baselined violations where it passed with none. The baseline
was empty because nothing could gate, not because nothing was missing. The 33 omissions of
optional properties are still reported under --warn; they are now reported against a
declaration that says they are allowed, which upstream cannot yet tell from one that says
nothing (goedelsoup/yidam#1078).
A new property costs one decision more. Adding a declaration without required: fails
web/tests/unit/schema.spec.ts. Adding one with required: true to a class whose instances do
not carry it fails yidam lint at once, which is the point: the declaration and the corpus
have to agree on the day the property is added.
Two gaps are left open and named. legislation.effective_note on the budget acts that omit
it, and accountability_effect on the acts never read for it, are optional because the class
cannot say “required on a budget act” — not because they are complete.
Ten string descriptions spell a closed value set in prose, and three have drifted off it
(metric.unit once, parameter.unit twice, program.mechanism six times). #507 asked only
that this pass record them. yidam 0.16.0 has since given a class values: to declare the set
(goedelsoup/yidam#1052), and adopting it is a separate change with its own schema edit.
Alternatives considered Contents
Required only what #507 flagged. Mark metric.series required and leave the rest silent.
Declined because silence is the state the issue was about: 110 properties every instance
carries would still be optional by omission, and the next node could leave out an agency’s IRN
without a finding at Error.
Drop established and grades. The issue offered it: a property no instance carries
describes an intention, not the graph. Declined because the intention is recorded — nine
unfilled: entries say where each value lives — and dropping the declaration would leave those
entries naming a fact nothing asks for.
Declare the unheld three required: false and keep the baseline empty. An empty baseline
reads well. It would also be a declaration saying an agency is complete without its charter
date when the agencies themselves say it is missing.