From 7db4e684491229d75afef388d81cb1bf78a887f0 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:44:08 -0400 Subject: [PATCH] Correct the SCF bond description in scf_wealth's docstring The docstring said SCF `bond` holds "savings bonds plus other bonds". The Fed's summary-extract macro (bulletin.macro.txt) defines BOND = NOTXBND + MORTBND + GOVTBND + OBND, "not including bond funds or savings bonds"; savings bonds are SAVBND = X3902, a separate term in FIN, and bond funds are in NMMF. On the local rscfp2022.dta, bond equals the four parts and fin needs savbnd as its own term, both with zero residual. This stage maps bond_assets to bond alone (line 206), so the code was right and only the description was wrong. scf_wealth.py is on both legacy-v1 seed-kernel module lists, whose raw source bytes the seed protocol attests, so the docstring edit moves: - EXPECTED_HASHES seed_protocol be39eb6b -> b4afa376 and seed_map 085d8d39 -> 0fa116d9 (inventory_coverage.py); - the US spec_sha256 e0b757ce -> d1df6b31 (test_us_multispine_pool_tool.py); - the loader golden fee5893a -> 6273f82f (test_spec_engine_loader.py); - docs/evidence/spec-engine/us-f0-coverage.json, regenerated with tools/spec_engine_coverage.py (8 hash fields, nothing else). The protocol hash is attestation only: nothing outside spec_engine reads it, and F0 executes no draws. Co-Authored-By: Claude Opus 5.5 --- changelog.d/scf-bond-docstring.fixed.md | 1 + docs/evidence/spec-engine/us-f0-coverage.json | 16 ++++++++-------- .../build/spec_engine/inventory_coverage.py | 4 ++-- .../src/microcosm/build/us_runtime/scf_wealth.py | 5 ++++- .../shared/test_spec_engine_loader.py | 2 +- .../us/test_us_multispine_pool_tool.py | 2 +- 6 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 changelog.d/scf-bond-docstring.fixed.md diff --git a/changelog.d/scf-bond-docstring.fixed.md b/changelog.d/scf-bond-docstring.fixed.md new file mode 100644 index 0000000000..81090c1cbe --- /dev/null +++ b/changelog.d/scf-bond-docstring.fixed.md @@ -0,0 +1 @@ +Correct the `scf_wealth` docstring: SCF `bond` is directly held tax-exempt, mortgage-backed, U.S. government and agency, and corporate and foreign bonds. It excludes U.S. savings bonds, which the SCF reports separately as `savbnd` and this stage does not read, and bond funds, which are in `nmmf`. The docstring had said `bond` included savings bonds. Because the spec engine hashes `scf_wealth.py`'s bytes into the legacy-v1 seed-protocol attestation, the seed-protocol and seed-map digests, the US `spec_sha256`, the loader golden vector and `docs/evidence/spec-engine/us-f0-coverage.json` are re-pinned. No behaviour or data changes. diff --git a/docs/evidence/spec-engine/us-f0-coverage.json b/docs/evidence/spec-engine/us-f0-coverage.json index fec570e20b..f99b29cdf6 100644 --- a/docs/evidence/spec-engine/us-f0-coverage.json +++ b/docs/evidence/spec-engine/us-f0-coverage.json @@ -1656,13 +1656,13 @@ "compiler_ir.node_slices" ], "expected": { - "map_sha256": "085d8d39ddde7827926a6e33fbba1c7f6e85e193fcd6ae5b4d1c91efeb73a176", - "protocol_sha256": "be39eb6b08b4fbee55f2911a3e8ddef753b24c51dd2a25655e49879e12f622cb" + "map_sha256": "0fa116d9f5dae4ba0378f190d6c822b92f3dcf1e3fe80c9880bcaf87431c283c", + "protocol_sha256": "b4afa376b62fbc073fd10d74e40921f5ab60c1efe366e2c8504872091ea69d08" }, "failures": [], "observed": { - "map_sha256": "085d8d39ddde7827926a6e33fbba1c7f6e85e193fcd6ae5b4d1c91efeb73a176", - "protocol_sha256": "be39eb6b08b4fbee55f2911a3e8ddef753b24c51dd2a25655e49879e12f622cb" + "map_sha256": "0fa116d9f5dae4ba0378f190d6c822b92f3dcf1e3fe80c9880bcaf87431c283c", + "protocol_sha256": "b4afa376b62fbc073fd10d74e40921f5ab60c1efe366e2c8504872091ea69d08" }, "status": "covered" }, @@ -1677,7 +1677,7 @@ "compiler_ir.seed_stream_map" ], "expected": { - "implementation_sha256": "be39eb6b08b4fbee55f2911a3e8ddef753b24c51dd2a25655e49879e12f622cb", + "implementation_sha256": "b4afa376b62fbc073fd10d74e40921f5ab60c1efe366e2c8504872091ea69d08", "protocol": "legacy-v1", "streams": [ "build_model", @@ -1698,7 +1698,7 @@ }, "failures": [], "observed": { - "implementation_sha256": "be39eb6b08b4fbee55f2911a3e8ddef753b24c51dd2a25655e49879e12f622cb", + "implementation_sha256": "b4afa376b62fbc073fd10d74e40921f5ab60c1efe366e2c8504872091ea69d08", "protocol": "legacy-v1", "streams": [ "build_model", @@ -2599,7 +2599,7 @@ "country": "us", "schema_id": "country_spec", "schema_version": 1, - "spec_sha256": "e0b757cee1b860b304e099282ad0f9684c10f5e04fddbce128e6bd88b3480fe8" + "spec_sha256": "d1df6b316e4937e809f5f020ea2d3a7bd38bccc1845f3ae6e104f7eed6a73323" } }, "report_schema_version": 3, @@ -2609,7 +2609,7 @@ "country": "us", "schema_id": "country_spec", "schema_version": 1, - "spec_sha256": "e0b757cee1b860b304e099282ad0f9684c10f5e04fddbce128e6bd88b3480fe8" + "spec_sha256": "d1df6b316e4937e809f5f020ea2d3a7bd38bccc1845f3ae6e104f7eed6a73323" }, "status": "pass" } diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py b/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py index 1374df1617..3fddff951a 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py @@ -359,8 +359,8 @@ "late_schedule": "e59c019d3d454eac99ac0ac209b6c5b6faaf9bdfcaeee18c36a25be19bf7da2f", "ownership": "5f64f0aac49e2313177564f71876bffc8c81b3ded4df701e70930e60e9c98356", "primary_tuples": "fdf23da429f8c501e198a2f5b719763d523a41565c2153fdf17b0344f21bcd7c", - "seed_map": "085d8d39ddde7827926a6e33fbba1c7f6e85e193fcd6ae5b4d1c91efeb73a176", - "seed_protocol": "be39eb6b08b4fbee55f2911a3e8ddef753b24c51dd2a25655e49879e12f622cb", + "seed_map": "0fa116d9f5dae4ba0378f190d6c822b92f3dcf1e3fe80c9880bcaf87431c283c", + "seed_protocol": "b4afa376b62fbc073fd10d74e40921f5ab60c1efe366e2c8504872091ea69d08", "source_manifest": "f4f8bfeb79268a4043a843b47cec1d1c0e58e9f5dd6bc23417ada95446dd7b8e", "take_up": "9522ce40f7dea569312dd7a7beb474e5a5afadd2f1e10cb5876534c3ef623d35", "tail": "ac92829c88a1a4fb6460d61190918d5d99c6c377fc8dd8f62f02b332d09bf59c", diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/scf_wealth.py b/packages/microcosm-build/src/microcosm/build/us_runtime/scf_wealth.py index 4b368f5303..e77540daae 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/scf_wealth.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/scf_wealth.py @@ -27,7 +27,10 @@ - ``stock_assets`` ← SCF ``stocks`` + ``nmmf`` (directly-held stock plus stock/non-money-market mutual funds — the one code-level summation the canonical pipeline applies). -- ``bond_assets`` ← SCF ``bond`` (savings bonds plus other bonds). +- ``bond_assets`` ← SCF ``bond`` (directly held tax-exempt, mortgage-backed, + U.S. government and agency, and corporate and foreign bonds). Bond funds + are in ``nmmf``, so they land in ``stock_assets``; U.S. savings bonds are + the SCF's separate ``savbnd``, which this stage does not read. The SCF QRF's eight predictors are age, sex, race, marriage, own children, employment income, interest/dividend income, and Social Security/pension diff --git a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py index 846e867072..718f4ff565 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py @@ -12,7 +12,7 @@ def test_semantic_hash_has_golden_vector_and_surface_separation(tmp_path) -> Non # Pin the domain separator, normalization rules, schema-set receipt, and # exact normative projection as one reviewable golden vector. assert first.spec_sha256 == ( - "fee5893a3de168f4318026d94ab70090296544674f6c388d16ac53296d99640c" + "6273f82f0e4899e97d1bede4db0662829b3df6f420dba32c0e67018d010c2c91" ) second_root = _rich_minimal(tmp_path / "xy", note="second", store="local:b") diff --git a/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py b/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py index c801c0316e..ca014679be 100644 --- a/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py +++ b/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py @@ -338,7 +338,7 @@ def capture_equality(expected: object, actual: object) -> None: "country": "us", "schema_id": "country_spec", "schema_version": 1, - "spec_sha256": "e0b757cee1b860b304e099282ad0f9684c10f5e04fddbce128e6bd88b3480fe8", + "spec_sha256": "d1df6b316e4937e809f5f020ea2d3a7bd38bccc1845f3ae6e104f7eed6a73323", }, }