Repository navigation
Name the differenced population, and split the two movements gross_increases had fused - #10250
Conversation
524926e to
d110662
Compare
d110662 to
d031052
Compare
…creases had fused THE RECEIPT PRINTED TWO FIGURES OVER TWO DIFFERENT POPULATIONS AND SAID SO NOWHERE. step0_blocking_measure filters to row.blocking; step0_histogram_differential is handed the FULL census. So blocking_occurrences and gross_increases were both correct and were printed side by side, and a reader who differenced the blocking occurrences could not reach the delta. Nothing in either value named its own domain, and no assertion anywhere could go red on the mismatch -- which is the class this receipt exists to refuse, applied to the receipt itself. THE LABELLING WAS THE SYMPTOM; THE SHAPE WAS THE DEFECT. gross_increases folded a post-only bucket's whole count in beside shared-bucket growth, so one name described two different movements and no conservation identity could range over it. The four movements are now separate primitives -- shared_increases, shared_decreases, pre_only_occurrences, post_only_occurrences -- and gross_increases / gross_decreases are DERIVED projections over them (DESIGN section 2), so the two views cannot disagree. That the identity became writable only after the split is the evidence the old shape was wrong rather than merely under-labelled. THE DOMAIN IS A TYPED FIELD, NOT A CAPTION. Step0DifferentialDomain travels inside the differential and every renderer prints it from there, because a caption is prose the substrate cannot read (DESIGN 4c) and the reader who needs the fact is reading a value. The blocking line names its domain too, so the two figures beside each other now say which rows each is about. AND THE IDENTITY REFUSES RATHER THAN PRINTS. It is a join between two independent producers: each arm's occurrence total walked directly over its row list, against the bucket fold's four movements. A check that recomputed the same fold and compared it to itself would be the change-detector shape DESIGN section 5 names. Four controls execute it -- the four movements reported separately with a pair where shared_increases and gross_increases are deliberately different numbers, the domain joined to the independently walked totals, an authored non-conserving differential as the discriminating red, and a non-vacuity control so a conserving answer is about this pair and not about zero. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd
d031052 to
36ef281
Compare
|
Both reviews approve with no blocking finding; thanks. One remark is worth answering rather than On What I did consider and rejected: carrying the domain as a field on Worth recording beside this PR: the conservation identity landing here is the one that would — sent from jolly-badger-374 🤖 Generated with Claude Code |
gunbc.namespace_step0_canary_v2's receipt printedblocking_rows/blocking_occurrencesbesidegross_increases, and those figures range over different populations:step0_blocking_measurefilters to
row.blocking, whilestep0_histogram_differentialis handed the full census. Both werearithmetically correct. A reader who differenced the blocking occurrences and could not reach the
delta had no way to find out why — nothing in either value named the rows it was about, and no
assertion anywhere could go red on the mismatch. That is the class this receipt exists to refuse,
turned on the receipt.
The labelling was the symptom; the shape was the defect.
gross_increasesfolded a post-onlybucket's whole count in beside shared-bucket growth, so one name described two movements at once and
no conservation identity could range over it. The four movements are now separate primitives —
shared_increases,shared_decreases,pre_only_occurrences,post_only_occurrences— andgross_increases/gross_decreasesbecome derived projections (§2), so the two views cannotdisagree. The identity became writable only after that split, which is the evidence the old shape
was wrong rather than merely under-labelled.
The domain is a typed field, not a caption.
Step0DifferentialDomain(EveryCensusRow|BlockingCensusRowsOnly) travels inside the differential; every renderer prints it from there. Acaption cannot carry the fact — it is prose the substrate cannot read (§4c) and the reader who needs
it is reading a value. The blocking line names its domain too, so the two figures side by side now
each say which rows they cover.
The identity refuses rather than prints, and it is a join between two producers. The left side is
each arm's own occurrence total, walked directly over its row list by
step0_census_occurrences. Theright side is the bucket fold's four movements. Different walks over the same rows, so a delta whose
domain does not match the totals it is differenced against cannot satisfy it. A check that recomputed
the same fold and compared it to itself would be the change-detector shape §5 names.
Executing evidence — four controls in
test.claim.namespace_step0_canary_v2_witness:the_four_occurrence_movements_are_reported_separately— a pair that moves occurrences in all fourdirections, where
shared_increases(8) andgross_increases(14) are deliberately differentnumbers. Under the fused field this row could not be written at all.
the_differential_names_the_whole_census_as_its_domain— the domain isEveryCensusRowand thetotals equal
step0_census_occurrencesof each row list; the pair carries advisory rows on purpose,since their inclusion is exactly the fact the receipt failed to state.
a_differential_whose_movements_do_not_conserve_its_population_is_refused— the discriminating RED.The perturbation is a domain mismatch: totals from one population, movements from another. It is
authored in the fixture because the production fold cannot emit it, which is the point — the
identity is the wall that keeps it unemittable (§4b).
the_conservation_identity_is_not_vacuous_on_a_moving_pair— a conserving answer here is about thispair rather than about zero.
Not in this PR: the binding-provenance census. This is the receipt-labelling repair the census
work sits on top of, landing alone so the record is straight first.
🤖 Generated with Claude Code
https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd