Repository navigation
G8-r2c A: summed-band money rows and the measurement proof - #1456
Merged
Merged
Conversation
scale_money_and_intervals now accepts a summed money row: an identity
row with no aggregate_fact_key, a selector that pins a dimension to a
list of members, and an expected_member_count equal to the cells those
lists span. The resolver emits one operand {dimension_values,
expected_member_count, weight}; the ledger's multi-member
linear_combination path sums it. The count companion keeps value
operation sum over the same members, because the ledger's identity
path resolves one fact. The resolver refuses a wrong member count, a
non-identity money row, count and money member sets that differ, and
members two rows share. The receipt records each factor's binary64
weight and its exact relative rounding (R2C-10).
compose.measurement_proofs satisfies measurement:<id> only when, for
every calibration node, exactly one upstream node declares
measurement_id: <id> and writes the scaled table's income and universe
columns on its entity (R2C-1). Upstream follows the graph compiler's
predecessor rule over the declared rows. reference_profile_view passes
the proofs to the resolver; a proven row becomes active, any other row
stays parked, and its activation gap names the measurement and the
reason.
Invariants: a compiled summed amount equals the factor times the sum
of its members, and the count equals the sum of its members; a row is
active exactly when its measurement is proven. The tests in
test_reference_summed_bands.py and test_transport_measurement_proof.py
cover them, but this commit is pushed before the environment finished
installing, so they have not run yet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N2tyHP1LrUqzw1Kaau8bvP
Merge nzhub/g8w4d-nz-wiring at fcdb473 (the w4 fix round's hand-off) into G8-r2c hunk A. Git merged without conflict: the fix round's edits to T/compose.py and T/gate_bindings.py sit apart from A's hunks. git diff fcdb473 HEAD shows A's five files and nothing else, and the removed and added lines in compose.py match A's own diff against d81280b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HQomkwKHCkdAgY9cy
…raph The measurement proof (R2C-1) now reads the id a producer declares in its params, under measurement_id, as a literal string: measure.combine@1 takes it as context.params["measurement_id"]. The node-level measurement_id field is gone from the transport node schema, and a non-string value proves nothing. Upstream of calibration now means ancestry under the S5 guard's declared rule (population or base, artifact producers and the writers of each read), factored out of _validate_precalibration_ancestry and shared. Composition then rechecks every proof against the compiled skeleton's exact predecessors and refuses a proof the compiled graph contradicts. The summed-band fixture now carries the dimension and target labels the ledger requires for a multi-fact target, so the compile tests run the real ledger. Invariant: a measurement is proven exactly when each calibration node has one declaring ancestor that writes the table's columns on its entity. Checked by test_transport_measurement_proof.py (16 passed) and test_reference_summed_bands.py (18 passed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HQomkwKHCkdAgY9cy
Hunk A's resolution validator refuses a factor companion that is active without its measurement's proof. Two fixtures forged activation after resolution: factor_transport_fixture(activate=True) and the CLI replay test's measured view. Both now hand the resolver a synthetic proof, so the real resolver activates the rows and binds the proof into the selection identity. The proof reads the raw transport_graph resource, as the rest of the reference-profile view does, so a spec whose graph composition would refuse for another reason still resolves its references. Invariant: a factor row is active exactly when its receipt carries the measurement's proof. Checked by test_transport_target_kernels.py, test_nz_money_normalization.py, test_transport_run_entry_factors.py and the CLI replay test (200 passed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HQomkwKHCkdAgY9cy
A mutant that removed the comparison between a summed money row's members and its count companion's members left every test green. The comparison cannot fire: the companion key includes the canonical member lists, so a count row pairs with a money row only over the same member set, and a mismatch already refuses as a missing companion. The refusal now says so. Invariant: summed money and count rows pair only over one member set. Checked by test_summed_rows_refuse_each_inconsistency[mismatched_members] (18 passed in test_reference_summed_bands.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HQomkwKHCkdAgY9cy
Ruling R2C-15: a measurement holds only when its declaring producer is the only ancestor of each calibration node that writes each of the interval table's income and universe columns on the table's entity. The review's item 2c built a graph where an undeclared later-version rewrite of the income column passed both checks while the receipt named the declarer. Before this change measurement_proofs proved it, the compiled check accepted it, and compose_transport_graph composed the composed toy with the rewrite grafted on. measurement_proofs now collects every node in the calibration node's declared closure whose outputs hold each required column, and parks the rows unless that list is exactly the producer. _check_measurement_proofs applies the same rule over the compiled ancestors and the composed nodes' outputs and raises. Both share _second_writer_refusal, which names the measurement, the calibration node, the column and every writer. The rule has no ordering logic: a writer before or after the producer refuses, with or without rewrite. Checked with new pins in test_transport_measurement_proof.py: item 2c, a writer before the producer, a universe-only rewrite, a rewrite-free second writer, the composed toy, a compiled-only case, two controls that still prove, and a Hypothesis property over declared chains. Dropping the declared check turns 7 tests red; dropping the compiled check turns test_the_compiled_check_alone_refuses_a_second_writer red. measurement_proofs and validate_transport_activation give identical outcomes on every packaged spec (am, be, nz, uk, us) before and after. The same commit adds test_a_calibration_endpoint_without_a_calibrate_kernel_is_a_root for the review's OA2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6JfFhwRFMYkokanqow
The review's OA1 and OA3 mutants left every test green. Two new pins in test_reference_summed_bands.py now kill them. OA1: test_a_tampered_rounding_record_refuses changes one field of the receipt's factor_weight_rounding record (weight, exact numerator or relative rounding), recomputes the receipt hash so that only the rounding recomputation can see it, and expects validate_reference_resolution to refuse. Deleting that recomputation turns all three cases red. OA3: test_summed_rows_refuse_each_inconsistency gains a mapping member and a list member inside a summed row's member list. Dropping the scalar check in _summed_members turns both cases red. OA2's pin landed with A1 (05bb18c): dropping the endpoint clause of _calibration_roots turns test_a_calibration_endpoint_without_a_calibrate_kernel_is_a_root red. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6JfFhwRFMYkokanqow
R2C-15 makes the producer the only ancestor of a calibration node that writes each measured column. Both checks collected writers from node outputs, so an EXPAND whose `params.expand_cells` names the income passed `measurement_proofs`, `_check_measurement_proofs` and `compose_transport_graph`, while the S5 reader in the same file counts those cells as writes. The declared check now asks `_declared_writer`. It also counts an EXPAND's literal cells, and it treats an EXPAND whose cells come from a resource as writing every column, as `_precalibration_declared_reads` does. The compiled check reads the cells through `_precalibration_expansions`. No packaged spec declares an EXPAND, so no packaged outcome changes. The invariant: a measurement proves only when no ancestor other than its producer may write a measured column, by output or by EXPAND cell. `test_transport_measurement_proof.py` gives 33 passed. Dropping the resource clause fails `[expand_resource_cells]` alone, and `test_packaged_spec_refuses_with_every_activation_gap_named` still passes. The patch comes from Belgium's hub, patch-id a48429b46f51315760a66b27bdf60daf2c342bba. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review 200 measured the property reaching R2C-15's branch in 16 of 20 seeded runs, about three examples a run, and the proof about once a run. Three explicit examples now cover one declarer alone and a second writer after it and before it. With _second_writer_refusal never refusing, both second-writer examples fail. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Merged by the NZ hub (session local_e407a527) at bf418af with --merge. Gates: |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
G8-r2c shared hunk A (tracking #1183): money rows that sum several published bands, and composition's proof of a measurement's producer (ruling R2C-1). Stacked on the fixed w4d head
fcdb4739. Hunk D (#1457) stacks on this branch, and the two share one re-key window.B/ispackages/microcosm-build/src/microcosm/build/,T/isB/transport/, and tests are inpackages/microcosm-build/tests/engine_free/shared/. Lines are at30ae4599, after the fix round.d916ea8dthen adds the EXPAND writer fix described under "Fix round", which movesT/compose.pylines after:591down by up to 17.bf418af1then adds three@examplelines, a comment and one import name totests/test_transport_measurement_proof.py, and changes no other file.The change
Summed money rows.
scale_money_and_intervalsaccepts a multi-memberidentitymoney row: noaggregate_fact_key, a selector that pins a dimension to a list of members, andexpected_member_count. The resolver turns it into one operand{dimension_values, expected_member_count, weight}(B/reference_profiles.py:333_money_operand). The ledger already sums such an operand, so nothing outside the resolver changes. The count companion keepsvalue_operation: sumover the same members, because the ledger'sidentitypath resolves one fact. The resolver refuses, by name:expected_member_count(_summed_members,:217);identity("Money scaling requires an untransformed source reference");sumits members (_validate_summed_rows,:283);The weight stays the factor the resolver writes today,
numerator / denominatorin binary64. The receipt'sfactor_weight_rounding(:828) states each factor's float, its exact rational and the exact relative rounding as a reduced fraction (R2C-10). Validation recomputes the record and refuses a mismatch (:1073).The measurement proof (R2C-1, R2C-15) is
measurement_proofsinT/compose.py:593. It satisfiesmeasurement:<id>only when, for every calibration node:rewrite: true. An EXPAND's cells count as writes, and an EXPAND whose cells come from a resource counts as writing every column. A writer outside the calibration node's ancestors, or a same-named column on another entity, doesn't count.Otherwise the rows stay parked and the activation gap names the measurement and the reason (
T/compose.py:944-984), so compilation refuses. The writer refusal (_second_writer_refusal,:571) names the measurement, the calibration node, the column and every writer.T/compose.py:516,params.get(MEASUREMENT_PARAM), withMEASUREMENT_PARAM = "measurement_id"(:506). A node declares the id as a literal string in its params, which is wheremeasure.combine@1reads it (context.params["measurement_id"]). A non-string value proves nothing and the refusal names the node. An earlier commit on this branch added a node-levelmeasurement_idfield and read it there; a later commit on the branch took the field out again. Againstfcdb4739, no schema file changes._declared_calibration_predecessors,:519, now shared with_validate_precalibration_ancestryat:3343): a node follows its population or base, every artifact producer it names, and every writer_precalibration_declared_readsresolves for its reads. Where a version is unknown that rule counts every writer, so it can only find more producers, which refuses. The roots are everycalibrate.*node plus the calibration endpoint (_calibration_roots,:546)._check_measurement_proofs,:699, called at:4349right aftercompile_graph): each calibration node's compiled ancestors must hold exactly one node declaring the id, it must be the proof's producer, and it must be the only compiled ancestor whoseoutputs, or EXPAND cells sinced916ea8d, hold each of the proof's columns (:735-756). Otherwise composition refuses.reference_profile_viewpasses the proofs toresolve_reference_profiles(T/compose.py:787). A proven binding satisfiesmeasurement:<id>in_satisfy_factor_prerequisite(B/reference_profiles.py:638), the rows becomeactive, and the proofs used enter the selection identity. Validation refuses a factor row that is active without its proof in the receipt, or parked with one (:1155-1162).Invariants
test_compiled_coarse_rows_equal_factor_times_member_sums: random partitions of up to 30 synthetic facts, factors p/10^6, through the real ledgertest_summed_path_equals_the_sum_of_singleton_rows_aged_today, three factorstest_summed_money_operand_resolves_amount_facts_onlycovers the one-record-set fixture's case;test_summed_rows_refuse_each_inconsistencycovers the member checkstest_an_active_row_without_its_proof_in_the_receipt_refuses;test_without_a_proof_rows_stay_parked_and_compilation_refusestest_each_proof_mutant_leaves_rows_parked_and_names_the_measurement(no producer, after calibration, two producers, wrong column, income without universe, wrong entity, wrong entity ontax_unit, a later-version rewrite, a writer before the producer, a universe-only rewrite);test_a_chain_proves_exactly_when_one_declarer_is_the_only_writer(Hypothesis);test_a_third_entity_table_passes_the_proof;test_composition_refuses_a_proof_the_compiled_graph_contradicts;test_the_compiled_check_alone_refuses_a_second_writer;test_composition_refuses_a_later_version_rewrite_of_a_measured_columnMutants
I ran each mutant with a script that edits one line, runs the new test files and restores the file.
_money_operand)test_summed_path_equals_the_sum_of_singleton_rows_aged_today[110]test_summed_rows_refuse_each_inconsistency[money_member_count],[count_member_count]test_summed_rows_refuse_each_inconsistency[overlapping_members]test_without_a_proof_rows_stay_parked_and_compilation_refusesand every proof mutantwrong_column,income_without_universe,wrong_entityandwrong_entity_tax_unitcases[two_producers][after_calibration],test_every_calibration_node_needs_its_own_upstream_producertest_composition_refuses_a_proof_the_compiled_graph_contradictscasesmeasurement_idinstead of the paramlater_version_rewrite,writer_before_the_produceranduniverse_rewritecases,test_a_later_version_rewrite_names_the_measurement_node_column_and_writers,test_a_second_writer_refuses_without_rewrite,test_a_chain_proves_exactly_when_one_declarer_is_the_only_writer,test_composition_refuses_a_later_version_rewrite_of_a_measured_columntest_the_compiled_check_alone_refuses_a_second_writertest_a_tampered_rounding_record_refuses_calibration_rootstest_a_calibration_endpoint_without_a_calibrate_kernel_is_a_roottest_summed_rows_refuse_each_inconsistency[mapping_member],[list_member]At
30ae4599I reran two of the mutants above: two producers accepted ([two_producers]red) and the member count unchecked ([money_member_count],[count_member_count]red).One mutant survived the pushed tests: removing the member-set comparison between a money row and its count companion. The comparison couldn't fire (see the change above), so I removed it and documented why (
4d2f3b2b).Merge-up
923b4de1merges the fixed w4d headfcdb47395293955347ec2697feef1a736a76cc23into A with--no-ff. Git merged without conflict.git diff fcdb4739 923b4de1shows A's five files and nothing else, and the lines A adds to and removes fromT/compose.pymatch A's own diff againstd81280bbline for line. Every function the fix round owns (quantile_support,inside_quantile_support, the support and closure kernels,_support_roster,support_roster_slices,_check_structural_columns,_requests,_check_unreached_requests,_check_closure_relation_slices,_check_structural_rows_written,_support) keeps the fix round's text.nzhub/g8w4d-nz-wiringis still atfcdb4739.Shared hunks
Against
fcdb4739, at30ae4599:B/reference_profiles.py: 72-73, 77-109, 181-194, 204-206, 217-371, 396, 434-442, 638-648, 675-678, 680-683, 694, 705-708, 766-776, 828-833, 897-899, a deletion after 906, 908, 1073-1078, 1155-1162, 1165-1171T/compose.py: 463-758, 787, 944, 947, 967-984, 1431, 1531, 1542, 3343, 4349tests/test_reference_summed_bands.py: 1-353tests/test_transport_composed_graph.py: a deletion after 58, 116, 3210-3211, 3214-3224tests/test_transport_measurement_proof.py: 1-732test_support/microcosm_build/reference_factor_transport.py: a deletion after 11, 18-26, 157-160, 162-166, a deletion after 167test_support/microcosm_build/reference_intervals.py: 94-97, 193-379The fix round changed
T/compose.pyonly insidemeasurement_proofs,_check_measurement_proofsand the new helper_second_writer_refusalbeside them (571-592, 602-604, 672-686, 707-708, 722, 735-756). It leftB/reference_profiles.pybyte for byte as it was at4d2f3b2b.test_support/microcosm_build/reference_factor_transport.pyand the CLI replay test intest_transport_composed_graph.pyused to mark factor rows active by hand. They now hand the resolver a synthetic proof, so the real resolver activates them. Both are test code, not sharedsrc.Implementation hashes
I computed
implementation_hash()for 43 transport kernels (every kernel the composed toy registry installs plus every module-level transport kernel), 89 UK runtime kernels (the UK spine registry and every UK kernel object or no-argument kernel class) and 6 US runtime kernels (the post-transfer registry on a stub engine and the module-level kernels), each in its own head's tree. While each hash ran, a trace recorded every source file it read. No UK or US kernel readsreference_profiles.py,reference_intervals.pyorcountry_spec.py, and none moves. That includes the UK target kernels (uk.full.target_compilation@1,uk.full.national_targets@1and the rest), which leavecountry_specout on purpose (uk_runtime/target_compile_modules.py:59,EXCLUDED_DIRECT_IMPORTS). EditingT/compose.pymoves nosource_hash: no kernel reads it. EditingT/gate_bindings.pymovesgates.battery@1, whoseimplementation_hashfolds in its bindings' sources (T/gate_kernels.py:747-775). A leaves that file alone.fcdb4739calibration.prepare@1reference_profilesdiagnostics.calibration@1reference_profilesgates.battery@1reference_profilesgeography.support_from_facts@1reference_profilestakeup.assign@1reference_profilestakeup.compare@1reference_profilestakeup.gap@1reference_profilestargets.compile@1reference_profilestargets.problem@1reference_profilestransport.create@1reference_profilestransport.create@2reference_profilestransport.quantile_map@1reference_profilesThe fix round moves no hash. I recomputed
implementation_hash()at4d2f3b2band at30ae4599, each in its own worktree: 43 transport kernels (the composed toy registry plus module-level transport kernels), 37 UK and 3 US runtime kernels that construct without an engine. All 83 hashes match.uk.full.rotated-holdout@1andus.post_transfer.derive@1need an engine to hash, so this run skipped them. No kernel hashesT/compose.py, and the round changed no othersrcfile.The design's list missed two kernels:
takeup.compare@1(R2C-12 named it) anddiagnostics.calibration@1, which hashesreference_profiles(T/terminal_kernels.py:206). The battery's binding identity doesn't move at A. Every other kernel keeps itsfcdb4739hash.Tests
The closed list at
30ae4599(one pytest run,-n 4, no--maxfail): 2524 passed, 84 skipped, 0 failed. Per file: country_spec 143, nz_as_area_crosswalk 67 (3 skipped), nz_as_bridge 34, nz_axiom_input_closure 19 (2 skipped), nz_benefit_gross_up 16, nz_family_reconciliation 7 (9 skipped), nz_joint_geography 21 (12 skipped), nz_money_normalization 56, nz_msd_benefit_rates 6, nz_msd_pre_activation_reconciliation 4 (1 skipped), nz_reference_aging 6 (16 skipped), nz_reference_intervals 13 (1 skipped), nz_spec_package 1203, nz_target_references 16 (38 skipped), nz_transport_declarations 29 (2 skipped), nz_transport_toy_graph 23, reference_intervals 107, reference_profiles 129, reference_summed_bands 23, spec_engine_country_bundles 22, spec_only_country_packages 37, transport_composed_graph 469, transport_graph 15, transport_measurement_proof 27, transport_population_kernels 32. The repo has notest_be_*.pyfile.Every skip needs data or an engine this environment doesn't have:
nz_axiom_input_closure2 (needsaxiom_rules_enginewith its dense extension and a rulespec-nz checkout);nz_transport_declarations2 (pinned feed not staged);nz_as_area_crosswalk3 (needsNZ_AS_AREA_SOURCES);nz_joint_geography11 (needsNZ_AS_AREA_SOURCESandNZ_JOINT_GEOGRAPHY_SOURCES);nz_target_references38,nz_reference_aging16,nz_family_reconciliation9,nz_joint_geography1,nz_reference_intervals1 andnz_msd_pre_activation_reconciliation1 (needNZ_CHRONICLE_ARTIFACT).Packaged specs.
measurement_proofsandvalidate_transport_activationgive byte-identical results on every packaged spec thatload_transport_specloads (am, be, nz, uk, us) at4d2f3b2band at30ae4599. NZ'sird_taxable_income_ty2027_v1stays parked with "0 nodes declaring", because no NZ node declares it yet.C's producer still proves. In a scratch merge of
origin/nzhub/g8r2c-c-measureinto30ae4599(never pushed), a toy whosemeasure.combine@1node carries C's real params (measure,measure_sha256,measurement_id) and C's three outputs proves, with that node as the only writer of both measured columns, and_check_measurement_proofsaccepts the compiled graph. In that tree,test_transport_measurement_proof.pyplus C'stest_the_measurement_id_is_carried_not_usedgive 28 passed.Checks:
python3 tools/ci_test_plan.py verifyprintsverification=okat30ae4599, anduv run ruff check packages/microcosm-buildpasses. I didn't rerun the hash pins outside the closed list or the NZ builders'--check. The round changed no file they read, and the earlier run at4d2f3b2bstands for them.Fix round
After the round: EXPAND cells count as writers (
d916ea8d). Belgium's hub and the delta review (#1183 comment 6592283997) each found that R2C-15's two checks read only node outputs, so an EXPAND naming the income inparams.expand_cellspassedmeasurement_proofs,_check_measurement_proofsandcompose_transport_graph, while the S5 reader in the same file counts those cells as writes. No packaged spec declares an EXPAND, so nothing reached this._declared_writerinT/compose.pyalso counts an EXPAND's literal cells, and treats an EXPAND whose cells come from a resource as writing every column, as_precalibration_declared_readsdoes. The compiled check reads the cells through_precalibration_expansions.test_transport_measurement_proof.pygains six tests.d916ea8d: the proof test file gives 33 passed,test_packaged_spec_refuses_with_every_activation_gap_namedpasses, and dropping the resource clause fails[expand_resource_cells]alone. ruffcheckandformat --checkpass on both files.measurement_proofsandvalidate_transport_activationgive byte-identical results on am, be, nz, uk and us.af038d04: its EXPAND probes refuse, and three mutants of the patch each turn a test red.compile_graphaccepts that graph and both checks refuse it, though the review reads the executor as taking the column from the producer alone. R2C-15 refuses any other writer among the ancestors, before or after the producer, so the refusal stands. A spec with that shape must leave the column out ofexpand_cells.The delta review's nit (
bf418af1). The review measured the chain property reaching R2C-15's branch in 16 of 20 seeded runs, about three examples a run. Three explicit examples now cover one declarer alone, and a second writer after it and before it. With_second_writer_refusalnever refusing, both second-writer examples fail. The proof file still gives 33 passed, and ruff passes.The independent review (#1183, comment 6589309875) and rulings R2C-15 and R2C-16 (comment 6590041678) drove this round. Lines are at
30ae4599.05bb18caT/compose.py:571-592_second_writer_refusal; declared check:672-686inmeasurement_proofs; compiled check:735-756in_check_measurement_proofstest_the_compiled_check_alone_refuses_a_second_writerT/compose.py(lines listed),tests/test_transport_measurement_proof.py30ae4599tests/test_reference_summed_bands.py:229-248, againstB/reference_profiles.py:1073test_a_tampered_rounding_record_refuses(3 cases)calibrate.*calibration endpoint05bb18catests/test_transport_measurement_proof.py,test_a_calibration_endpoint_without_a_calibrate_kernel_is_a_root, againstT/compose.py:54630ae4599tests/test_reference_summed_bands.py:187-191,:208-209, againstB/reference_profiles.py:247-255[mapping_member],[list_member]Item 2c's graph, before and after.
toy.measuredeclares the id and writes both columns, thefilterversiontoy.filterfollows, then the undeclaredtoy.overwritewithrewrite: trueonperson.toy_income_cents, then preparation and calibration ontoy.filter.4d2f3b2b30ae4599measurement_proofstoy.measurecompile_graphtoy.filterandtoy.overwrite_check_measurement_proofstest_the_compiled_check_alone_refuses_a_second_writer, it raises the same writer refusalcompose_transport_graphNot done
measure.combine@1(C, G8-r2c C: measure.combine@1 sums declared signed cent components #1461).engine/uk,engine_contract/us,engine_workflow/us) need a country engine this session doesn't have, so I didn't run them. The engine-free UK pins ran.https://claude.ai/code/session_01LwQq6JfFhwRFMYkokanqow
Generated by Claude Code