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", }, }