Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ jobs:
tests/test_download_cps.py
tests/test_hierarchical_pipeline.py
tests/test_supabase_client.py
tests/test_policyengine_ledger.py
scripts/check_thesis_facts_append.py
scripts/canonical_json.py

- name: Test Arch surface
run: >
Expand All @@ -86,6 +89,7 @@ jobs:
tests/test_download_cps.py
tests/test_hierarchical_pipeline.py
tests/test_supabase_client.py
tests/test_policyengine_ledger.py
-q

- name: Build target input database
Expand Down
58 changes: 58 additions & 0 deletions .github/workflows/thesis-facts-append.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Thesis facts append gate

# Deterministic review for every change to the observation ledger. Resolver
# appends arrive as pull requests targeting codex/thesis-ledger-facts; this
# gate enforces the immutable frozen prefix, an append-only diff against the
# PR base, per-row schema and binding requirements, and explicit supersede
# semantics for corrections. Direct pushes get the same full-file checks.

on:
pull_request:
branches:
- codex/thesis-ledger-facts
paths:
- "ledger/**"
- "scripts/check_thesis_facts_append.py"
- "scripts/canonical_json.py"
- ".github/workflows/thesis-facts-append.yml"
push:
branches:
- codex/thesis-ledger-facts
paths:
- "ledger/**"

jobs:
append-gate:
name: Append gate
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Enforce append-only ledger invariants
run: |
set -euo pipefail
if [ -n "${{ github.base_ref }}" ]; then
git fetch origin "${{ github.base_ref }}" --depth=1
python3 scripts/check_thesis_facts_append.py \
--base-ref "origin/${{ github.base_ref }}"
else
python3 scripts/check_thesis_facts_append.py
fi

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.14"

- name: Install dependencies
run: uv sync --locked --all-extras

- name: Ledger observation invariants
run: uv run pytest tests/test_policyengine_ledger.py -q
17 changes: 16 additions & 1 deletion arch/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,16 @@

Scalar = str | int | float | bool | None

ALLOWED_PERIOD_TYPES = {"calendar_year", "tax_year", "fiscal_year", "month"}
ALLOWED_PERIOD_TYPES = {
"calendar_year",
"tax_year",
"fiscal_year",
"month",
# Sub-monthly and quarterly publisher prints recorded by the Thesis
# resolver (e.g. DOL UI weekly claims, BEA quarterly GDP).
"quarter",
"week_ending",
}
ALLOWED_GEOGRAPHY_LEVELS = {
"country",
"region",
Expand All @@ -43,6 +52,9 @@
"government",
"dwelling",
"institutional_sector",
# Macro publisher prints (GDP growth, industrial production, price
# indexes) describe the whole economy, not a person-level population.
"economy",
}
ALLOWED_AGGREGATIONS = {
"count",
Expand All @@ -52,6 +64,9 @@
"rate",
"ratio",
"share",
# A published series value taken as printed (policy rates, index
# levels, claims counts) — the publisher's own aggregate, not ours.
"level",
}
ALLOWED_CONSTRAINT_OPERATORS = {"==", "!=", ">", ">=", "<", "<=", "in"}
ALLOWED_CONCEPT_RELATIONS = {
Expand Down
204 changes: 204 additions & 0 deletions ledger/immutable_prefix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
{
"schemaVersion": "thesis_facts_immutable_prefix_v1",
"note": "Frozen at contract-enforcement start (ledger architecture review, 2026-07-10). The first prefixLineCount lines of ledger/official_observations.jsonl are immutable: CI fails if any byte changes. Corrections append a new row whose assertionVersion.supersedes names the replaced version; the prefix is never edited. Extending the manifest to cover newly accepted rows is an explicit migration, reviewed like any other change.",
"frozenAtHead": "324382b862b3cdfa3fef073c98fd70bf6f71b57e",
"prefixLineCount": 128,
"prefixSha256": "581f681aa3467d7f58b3ede4f13a17ea80c187d0328e88ae743756cc2b67a48b",
"lineSha256s": [
"e2a8133842e64bf975354a3da02105cf542961a826440db5dfcdb8c1eba3df66",
"89332f17aae6d742b45ff342ab6b535d524423900c622c0b406a50786b6f7e62",
"d79ae9c0cb993809d667fe7f9973270304e7f81e762e4f665b798a7a3cde6b13",
"be4da94287ab57ab9822e9b590c5ce11b71d504aa4d1c62f8c7b0dfc7f2bb1f2",
"7137623b15da972e19cbce0c4ff341449c0c59bec91ee42c783ef061d22faa78",
"c1220deef59d28f6b8e5ffb988005d034a280aefb832c4754a856e9971e52982",
"7383e2bd476525231ab1ab13b720b19fca44ea47dce0ef0e24f478d2f57483a4",
"deeef6d4cf44900b07f793fa2e07d64c4cc57baa548c77acf6cc67128c1a6c61",
"e67af588eaac44c254cfc20f7e747c2fe046a4f1d3313b5aca49429bc26d099f",
"02f4cf4ab33bee956831f7cbc5dbcf8a2a6b0b09980a49b4d5873e792dccb93f",
"ae0bea19e3bc146853ca9d3443f9991edc9fce515c33535fb3c1fae781e7bbd9",
"1474345208a131ad065a138b3b8f77428bd7247ddeffb34d8e24ca3a61f5c764",
"e0af919c10f7d1c45b9b2daaaa8aa062dd8d986435179f910af2f622bf77ec27",
"4a48bedf5a2e5ffaed56dd68e98ae622661068072bf5de02179827fcd3196701",
"7197b7a8c911407902035c02aa9bb73826074042f85d4ed8dff5466680715519",
"d0ae460cdeee286b98af966fba3cc1834fa5ffec2312098c21f0168c2e37b57a",
"f3866a032b569f37b2d17738141adb9c474f27a4138f7a152341e01eaf23a9da",
"5d91209a457703679fed8c4d0aa493216f6781183b7a8283d17a451e4c91d4b2",
"8356aeeef7f71ef27d8aefc32dcfb13fdc33a01dcbeb9a28aae869a4ffbd4beb",
"c22cb1009fdaf950c0d25214713c6ffc9bd7742823626eac63af65848336c915",
"87f5a18c7a82c976caa2654b1acf83633522931cf063e3e9297c41dff22deb07",
"ed555e1728dd8adfd39069807f08aa816f18890a3abcbf5a4b4c380a5647bc3f",
"3195de3ff6e0345a8bb95e496ab009f48f74529bf59a6accb49d8c4b8529d4a8",
"208cf0510eadc79f51bb0fd43ade604b1147e0797be4f9d82200e4cc34b342f3",
"254d282792a59b47863d48783d6ccf5ccba4b53aba28541c5b5233eda00deaa7",
"d92446cf44b86c4645971e7111626e5afa43742db7e2392a502a71ee5f817161",
"8b4a8d2ce4f97e36218de9abab9e557e59bbd11fee2e8bad17fcbb6990775db9",
"4db67a541b456843893f3d26a5ba66899cb100b43139be6d551aee8af3afd34b",
"f8810d830f384a8b245feaa7227f2fa654eb12e42ccc27be3c526dfd466b9acd",
"dd658d16ffbe64ae0dc6d527e6863ebb5cb2f283d185f95f6f0cdbc946c47d3c",
"d238afd394cad210dfb11d3163a10defd0ad0013f8ba16af53d76e20fc79c47b",
"c641b65b0e477d32db38381b26636e127e4ee87b8838abe69bca99f0119f5ada",
"53f14df26aeb3770fe2dcf77b15a67ea9147cd4be36e1fd28f74bf72fe494538",
"4c0d51a9fe3de4665d0571ea27218b2676adcfdde0b928d08e9aa090ac0182da",
"a7a504c4b2104a2beeb1ffc5a1cd29aaec5354d3bfe5481497ece4a7c84d8545",
"2708189c1c7f08fac6182c15cd9c1deb6db2045f1c5e8bd2cef7181c5ea582b1",
"7ca974b56bee900993cabd4e5598bd6aeb6362db096de08af60916342e777393",
"1da9308a0aff1040dc07df4950d82ffa8aad24cabbf41021f36135f785d4075f",
"5b716a4cbbc00ee6ec2053593bf7da35fa3b75103eabb7be14a295045285cc60",
"2a2a3a6a646563714e9cd9fc5eb804a1077d823788a83e83dc06090b590b8e78",
"558bbeb5f09a045e0cf2450b17339b26137e37530102f564acdb944097dd93f3",
"511790ed1f50569353c083db9cab6ece7d7995110d4ad960f0a21a9e8635e127",
"49eb60c1aa838003c3a4c0d5325959daf5c86dc065afdf52a949e48f23b90d4d",
"caa86ea0c24054963dc8c4bc71e7bfb50f7187e74c8b10b6a60b288dbc095039",
"b0dfa45b0a25ea58ba114974c197a994134502180095f58f0af0b2c302135668",
"9d152b82fc524453e5d7449afad8568f4d2a10e7cab9433b3c10c2aa30e795bf",
"616eb5fb6dfc21bf307eb980b37cf3df26b2dcb5af6c8d6b25b183acb23d41e1",
"055b61657aa9288e57b6df1e7be7c12fbb9d609a4a48d9ab5c0e1b18ddcfde94",
"13ef76a4002d12a5fa9d39a4bac78dd34d7656e6a3ccbd33c19172b01149edbb",
"d1013d09a28d1e68c6854cfb78ce00f6e30b295f05faea455c634995c9b9a223",
"e6779a867db2a900b2f05c0732c23fcacb7ac049a8affd2719f561dbc044bd75",
"ecf5c9edce6c806f9fafbf777cbe0730517ecb7f29766f06e930cbba738cbf6b",
"ae608386c7f373ac45bd543134d38c047c1e91b78ef12808939a0d2479f13f4a",
"d596985494554885e96290fec82a8f76767a81b0fdc91794e7e0770bfb698d4e",
"99818e5aa6c24da871d39cc67f1c76d5983a4bc24a0bb5cc84318d56569d4b12",
"b3017d39e2e615d9285e1ade62f55a95cf34011050385dfa89238877294e3f95",
"0d6421a3f37768ee1651a47fea3e682ec486a4fcd37e991a8c90298f0bdb2a01",
"202931e20f273633d412500609a8ab0560f5f70a7d5de2f3fe1902102066e42e",
"20dec413965efdf45af6977f5d6d09292bc8b47860b02309b4f4cd39bbdb166f",
"3c9f167638c8d25767d86718d36fe102f46e94bfd61b23744ee292cdd82d83a5",
"dc8b4c2a8c8f2999d41958a1537a3419553cc2d0a27c4d711a73b39a2b985224",
"d809f477a6f33826e5b88329a30f94f0993181e7dd04510bc3bd95699b44abbe",
"770db4bf3d8d8095b5c9ef101af5fa4d855aa1639aca1cf6012786ddb5af34bd",
"e9aa47eba15104c4f5ca47cf25642b1f0f5e200717f13ae560239f65c86d3235",
"2ea42440d3aefa1bc2cec0a6bb17afec153b8691e996b65586ad08ac5dae127d",
"1ab4c13e9ffc5fe76385ae81de75ca5210d1c7039dc330423fc0c6aa081585be",
"39c40cc7d7a70dd5790ee03385445c58e4f8560b0386340bd942cfa3c499b891",
"21af52b137d9d4bfc41e42c98ac85363c6f15400425a032073c04f288d27ceab",
"7359125c65ff29197675dece98311f4776e79cca7fa43d37912461cf29632507",
"92f43264210f5ce485de8165f6d4d5d1406ab46dd9c29e473d13484e722403c3",
"5fd4dbb664bb4d6e53a0c354dfffec9d6a9ce6dca4d5a752d8512f5a36b3af0b",
"a59827a6c5e914e19aa91d2a9f21a6375eae1ff9965fdda2ef3121a0e6e9854a",
"8720af39d24df290fa29daff967eb99310f723973328647eee77c7d8d26b9c05",
"874a4394ca7349c4217d7db328d159953573b463b515c5f32bcd676ffb78100b",
"d26d2bcb680e94a9666875a10bae57870d067d2fef1a705001828ed266d5b7b5",
"4e6efe75ac68f22f3826f783f3fbd3522115a4d71e6e8dffed0b4edea8a3bfab",
"44d33ddd1ab529d057ce2a43e3744696012ef2a8b64e7e4c46303b480900cc7f",
"89fd9e9581d0711b22b708b5413a3a9e8783569638673a3ef1f71d199b4a7d01",
"491b8e256686fbb0781dff826d50c60a8c256482b5f636aed344d9417302cb57",
"601fe14970c210ba215aad000d85313d8530e25143ca42dac53215c9d93bd9c1",
"3b2398a8d35a8969f148b1309b41a148e929a1381272f295800d63976d11a7bd",
"8df2aabfb952b5d2bcc0d83ac465416d80a66ff74442c66a4018b83d1a065764",
"f1b6a97887d3c46b35b2cb87d246aa69ff7f4a3dda115e8f677cc610b26e9b66",
"f9e1fc6c1d69f3dce44ed08f5e1224688b0c2669730eb9eff470a9f8b69bb17f",
"2d22a5b82491d055b8b1ddb863daf6cd635f144df51caadb3a19e6566b00b1a0",
"065ed276106f8e695c1292ea390c676eab49fa87d9a6a8858793d3900419189e",
"23b6056070626a95ed1e12526def837f4502bb629ac8e9026eab5663260affea",
"693b01b98eb90159f4a24bb24269e0e9bcdd25200f80c1fdf6289f309d183d73",
"7a08de264eaaf2648e8d9a9a5988bb9b0955d6289db7deb255f66aa7881fe3c2",
"f9863b9c713d346eeffa0b75303823019e1dde7e75e04c525b57e052ffb8a35d",
"57cce88eee41ab037f7026ef35dc9568572c32c0a8e8ceb1b6a804a9be1bd602",
"4691460e1044aec091554541e2043980a7756fcd73debac9d22bf702bb66dd58",
"e0542d505897b1f4000eb29d793c7d3589ae4c620a2425c063fbc7bdc07673c2",
"34044c976aa121247c8f4507f90d41d35b06a510b4b83486b11c105cad1ef357",
"1e6e435497f7a9aa3c289534310023b6332b903e99f21d63263385659c2c52ec",
"55053ca30efbf2d225b0ab1b5dd1ee4f7312de3d0c5eadfe623e87f185e845a2",
"6852e1458f4b174f6a965cf92d5a133c65ec73600245601a70a382968e7518af",
"2e2abd23faa65dd73c8ba5ce3ff7141b230e24f1e74f78e8359dbe809729dd2b",
"a7e626b232f10a118015a32cf4b7702cdf1c1c7bee0855ab8dc62770e6849bfb",
"77234a7b5cdc1660dba0802f91beefaa4db8a6b4a5c314e48e15334fdd947224",
"8b9bd91ec044e36d363a90f1ea2fd2ecc38fa5990dae0c21027df006e77e3995",
"d303d01c36eb51b1db45b306fa092f9c8fc1f2d506d600abb9759106aec8f7cd",
"a591e88848138b4d37de7c8b8e25502b8126de7a2bb43f9b5df8d9a72d1423a9",
"0c225c75d688a103022e6255908c0462b8c08c17734af41fe354473a249b32b5",
"3c1c71a7ab428cb21ba9d5ddf41c6f66aecf77c8748ceacbf8e5eed6e20b9b16",
"656367d0d5e186e6d3be064bdfa3e11d4c9913f73b2ec67db639f3fef47cb2e5",
"8bc27e4b6473edfa003a73453936e9c97ff0ca86d6980259b3b029201dc88d88",
"bcf8c6150262b388f6ff04635bab309a7e59142875f34edb5b1505b349e998f5",
"db4cd63aada9c790a36b7171e220b8ed5b71e8e048b2f82540fec6029ff2c971",
"29cc2cf12b0a77e55e8077c532b84a340a672fa68c3d78eba994642bb3edfa2e",
"433b9d966940b90d1ba8395d055618f410141e142a71536eb90359bc9b93be28",
"1bae0e820264f23e1fde5ada356b221dee69fab02cd22345ddec21a52c69429b",
"07341d6bf64234c320a53c80f3d77e9884b6e8cd48c3a67849b281c2416ab056",
"07d4f32877754b9fa1ba33a2a327586b4c1a13b9ed70cf4d4be4d2ef98a71b05",
"4172d67c6ebcde89b0dbb243ad8de9e4286db297a04e0442cc89c84384ee9a50",
"ab713d202baaa40659786805d785b0e811119e061faf9d8c48269cc39e8c879c",
"fe493074a7a4f5891dc9d4860e8a093e04d9900e7db86d7a3bf13e2fbaef1162",
"aa485c364455af5f9883d1756e766284cf3bc5d9a38865ba0467e4e1651d578e",
"796b7756d683df21b41cb9179787417bbd3470295ec258156ce17717e7fa0310",
"5fe58d7d6cf789accc366c7cef8ce6567ab9c5f3892fb2517c1553c46c94633c",
"12f062118d475e68989ede947700c703ed61af565a9f76dd6804cdb9abf7ae4b",
"9f7e2cc8a5ce9f79ac7d8f4110fa1d03a8df8d16c572703125db2d41127952a9",
"fb4235d5327e3358c0cda0528308068650ca5d0a1cc828abf4b2af048c48da69",
"40576bb94b8bb1ac7c2ff4b8f7d03bb3063527846856184f1a7e92a69ff090a6",
"5b3da07b8bd356ed5dfc93669dd980205e89e94eaa21f8aa19feb67f95056ac4",
"8922880ebeee41ec9664e665470a6f8972ae25d83a2b2de17e5c7a42cd814f45",
"8d07bf462ebe371c812348a11a29dc1685d21df18875f1fe2d00f1e789cbad30",
"3c6a99159ee9e6283e966ec7347de5d673dc6dea78d03f2510339920a9e20b78"
],
"knownInPlaceRewrites": [
{
"line": 1,
"sourceRecordId": "bls.ces.total_nonfarm_payroll_change.may_2026.first_print",
"rewriteCommit": "816e9a3ec51d71a5d2677e673fff033336214dbf"
},
{
"line": 2,
"sourceRecordId": "bls.cps.unemployment_rate.may_2026.first_print",
"rewriteCommit": "816e9a3ec51d71a5d2677e673fff033336214dbf"
},
{
"line": 3,
"sourceRecordId": "bls.ces.average_hourly_earnings_private.may_2026.first_print",
"rewriteCommit": "816e9a3ec51d71a5d2677e673fff033336214dbf"
},
{
"line": 4,
"sourceRecordId": "statcan.lfs.unemployment_rate.canada.may_2026.first_print",
"rewriteCommit": "816e9a3ec51d71a5d2677e673fff033336214dbf"
},
{
"line": 5,
"sourceRecordId": "statcan.lfs.employment_change.canada.may_2026.first_print",
"rewriteCommit": "816e9a3ec51d71a5d2677e673fff033336214dbf"
},
{
"line": 14,
"sourceRecordId": "bls.cpi.u.headline_mom.may_2026.first_print",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 15,
"sourceRecordId": "bls.cpi.u.core_mom.may_2026.first_print",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 16,
"sourceRecordId": "bank_of_canada.overnight_rate.after_june_2026",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 18,
"sourceRecordId": "dol.eta.initial_claims.sa.week_ending_2026_06_06",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 19,
"sourceRecordId": "ecb.deposit_facility_rate.after_june_2026",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 20,
"sourceRecordId": "bls.ppi.final_demand_monthly_change.may_2026.first_print",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 21,
"sourceRecordId": "statcan.building_permits.total_value_mom.canada.april_2026.first_print",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
},
{
"line": 22,
"sourceRecordId": "ons.gdp.monthly_growth.april_2026.first_print",
"rewriteCommit": "6c9209434048317c15355f42e019339efbd0d6ea"
}
]
}
Loading
Loading