psiloceyeben commited on
Commit
226a5d9
·
verified ·
1 Parent(s): 5d8f0ad

Release 4.0 (full, carrying 3.2): route words over the 22 paths with k and L, residue ledger, no state from unsupported answers, walk recall, pronoun re-entry; release test PI4-B; new release hashes anchored on Solana

Browse files

Head oracle_release_runtime_w558. Changed parts: the admitted fold chain (w556 guards, w557 the 4.0 law, w558 pronoun re-entry, v4_law.py), specialists/_gate, specialists/_proved, the five 3.2 specialists and the Workbench. PI4-B run once per variant. Anchor: https://explorer.solana.com/tx/4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +20 -0
  2. README.md +2 -0
  3. RELEASE_HASHES.json +40 -16
  4. RELEASE_HASHES_before_40.json +1267 -0
  5. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/HEAD_MANIFEST.json +9 -2
  6. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w423.py +39 -0
  7. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w551.py +152 -0
  8. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w554.py +124 -0
  9. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w555.py +56 -0
  10. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w556.py +148 -0
  11. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w557.py +303 -0
  12. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w558.py +124 -0
  13. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/v4_law.py +142 -0
  14. root/specialists/_gate/standing_new_v1.txt +1 -1
  15. root/specialists/_gate/standing_owner_v1.txt +1 -0
  16. root/specialists/_gate/standing_stars_v1.txt +4 -0
  17. root/specialists/_gate/star_panels_v1.sha256 +4 -0
  18. root/specialists/_proved/NOTICE +3 -0
  19. root/specialists/_proved/PROVED.json +806 -0
  20. root/specialists/_proved/SHA256SUMS +20 -0
  21. root/specialists/_proved/bin/acoustics +3 -0
  22. root/specialists/_proved/bin/anatomyagri +3 -0
  23. root/specialists/_proved/bin/chemistry +3 -0
  24. root/specialists/_proved/bin/climate +3 -0
  25. root/specialists/_proved/bin/computing +3 -0
  26. root/specialists/_proved/bin/decide +3 -0
  27. root/specialists/_proved/bin/discrete +3 -0
  28. root/specialists/_proved/bin/emoptics +3 -0
  29. root/specialists/_proved/bin/energy +3 -0
  30. root/specialists/_proved/bin/facts +3 -0
  31. root/specialists/_proved/bin/fusion +3 -0
  32. root/specialists/_proved/bin/geostats +3 -0
  33. root/specialists/_proved/bin/humanities +3 -0
  34. root/specialists/_proved/bin/life +3 -0
  35. root/specialists/_proved/bin/materials +3 -0
  36. root/specialists/_proved/bin/mechanics +3 -0
  37. root/specialists/_proved/bin/quantity +3 -0
  38. root/specialists/_proved/bin/space +3 -0
  39. root/specialists/_proved/bin/stores +3 -0
  40. root/specialists/_proved/bin/trades +3 -0
  41. root/specialists/decay-r2/INHERITED.json +8 -0
  42. root/specialists/decay-r2/decay_panel_v1.json +590 -0
  43. root/specialists/decay-r2/decay_panel_v1.py +67 -0
  44. root/specialists/decay-r2/decay_scorer.py +18 -0
  45. root/specialists/decay-r2/manifest.json +65 -0
  46. root/specialists/decay-r2/narrow_v1.py +47 -0
  47. root/specialists/decay-r2/organ_decay_r2.py +56 -0
  48. root/specialists/decay-r2/organ_decay_v1.py +135 -0
  49. root/specialists/decay-r2/verdict_dev.json +120 -0
  50. root/specialists/decay-r2/verdict_heldout.json +162 -0
.gitattributes CHANGED
@@ -45,3 +45,23 @@ root/specialists/cooking/nutrition_v1.sqlite3 filter=lfs diff=lfs merge=lfs -tex
45
  root/specialists/warehouse-r2/site_fresh.sqlite3 filter=lfs diff=lfs merge=lfs -text
46
  root/specialists/warehouse/site_fresh.sqlite3 filter=lfs diff=lfs merge=lfs -text
47
  root/fable-content/oracle-m-series-2026-08-15/m30_admitted_closure_v1.sqlite3 filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  root/specialists/warehouse-r2/site_fresh.sqlite3 filter=lfs diff=lfs merge=lfs -text
46
  root/specialists/warehouse/site_fresh.sqlite3 filter=lfs diff=lfs merge=lfs -text
47
  root/fable-content/oracle-m-series-2026-08-15/m30_admitted_closure_v1.sqlite3 filter=lfs diff=lfs merge=lfs -text
48
+ root/specialists/_proved/bin/acoustics filter=lfs diff=lfs merge=lfs -text
49
+ root/specialists/_proved/bin/anatomyagri filter=lfs diff=lfs merge=lfs -text
50
+ root/specialists/_proved/bin/chemistry filter=lfs diff=lfs merge=lfs -text
51
+ root/specialists/_proved/bin/climate filter=lfs diff=lfs merge=lfs -text
52
+ root/specialists/_proved/bin/computing filter=lfs diff=lfs merge=lfs -text
53
+ root/specialists/_proved/bin/decide filter=lfs diff=lfs merge=lfs -text
54
+ root/specialists/_proved/bin/discrete filter=lfs diff=lfs merge=lfs -text
55
+ root/specialists/_proved/bin/emoptics filter=lfs diff=lfs merge=lfs -text
56
+ root/specialists/_proved/bin/energy filter=lfs diff=lfs merge=lfs -text
57
+ root/specialists/_proved/bin/facts filter=lfs diff=lfs merge=lfs -text
58
+ root/specialists/_proved/bin/fusion filter=lfs diff=lfs merge=lfs -text
59
+ root/specialists/_proved/bin/geostats filter=lfs diff=lfs merge=lfs -text
60
+ root/specialists/_proved/bin/humanities filter=lfs diff=lfs merge=lfs -text
61
+ root/specialists/_proved/bin/life filter=lfs diff=lfs merge=lfs -text
62
+ root/specialists/_proved/bin/materials filter=lfs diff=lfs merge=lfs -text
63
+ root/specialists/_proved/bin/mechanics filter=lfs diff=lfs merge=lfs -text
64
+ root/specialists/_proved/bin/quantity filter=lfs diff=lfs merge=lfs -text
65
+ root/specialists/_proved/bin/space filter=lfs diff=lfs merge=lfs -text
66
+ root/specialists/_proved/bin/stores filter=lfs diff=lfs merge=lfs -text
67
+ root/specialists/_proved/bin/trades filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -91,6 +91,8 @@ It listens on 127.0.0.1 only and sends nothing anywhere except to services you c
91
 
92
  ## Verify this download
93
 
 
 
94
  **Release 3.1 (17 October 2026).** Fold composition: the specialist network now learns operations from the specialists' own development exams instead of having every one written by hand (84 learned operations, each kept only when its siblings cross-checked it, each firing only when the question carries its template's names and materials), and chains them with the hand-written ones under the same checks; a learned operation never takes a value that arithmetic built to fit its slot. Found by the research record's re-examination of every specialist: when a check stops a route that could not have computed the answer (a document page asked for a derivative), the specialist that can is now asked; answers about a different quantity than the one asked (a frequency for a wavelength, a travel time for a share of sunlight), definitions given for a calculation, a first derivative given for a second, and lower-cased units are withheld or corrected; an answer in a unit of the asked dimension is restated in the asked unit. The Workbench's worked example is now a habitable-zone specialist built from one published paper. Release gate, sealed test 22 (150 questions written after the code froze, run once): 124 right, 3 wrong, 23 declined, 1 false yes; precision 97.9%. New root `c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050`, anchored on Solana: [4kW4S5V4kHsF...](https://explorer.solana.com/tx/4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3). Code changed only (the fold chain, specialists/_gate and the Workbench); no store changed.
95
 
96
  **Release patch 3 (16 October 2026).** The specialist network v5 reads the shapes the patch 2 retest (composition test C2) found unread: a box given as "5 cm by 4 cm by 3 cm" or a cube "5 cm on each side" (its volume derived by core arithmetic and shown in the path), "500 cubic centimetres of ice", "the water in the pond", "in a day". The older v2 network route is now checked like the others, and a unit answer about a place with no record ("minutes in a day on the planet Zentar") is withheld. New in the Workbench: an Essay tab and `python oracle7.py essay topic` (ProseFold) compose an essay from this model's own records, with a choice of length, reading level (measured as a grade), technical depth and style (profiles measured from Simple and English Wikipedia and the OpenStax textbooks); every sentence is kept word for word with its source, no language model, and their quality has not been measured by people yet. Release gate, sealed test 21 (150 questions written after the code froze, run once): 131 right, 2 wrong, 17 declined, 0 false yes; precision 98.1%. New root `0575c9b78f6dcc0a48ee57e6dc63d3e1a46afc13d2c9d9d4503db6c784564ed2`, anchored on Solana: [WNEdPhKJZYCh...](https://explorer.solana.com/tx/WNEdPhKJZYCh3ZKe7X8zhVehuyskEnKuDbde86W1XdKdBC9izVAJTzbrewtSUQ8keQvT1rZUBumCGnGxjDXyVgU). Code changed only (the fold chain, specialists/_gate and the Workbench); no store changed.
 
91
 
92
  ## Verify this download
93
 
94
+ **Release 4.0 (20 October 2026).** Every answer's route is now spelled as a word over the 22 paths of the three-tree runtime, and two numbers are kept for it: k, the number of steps, and L, the time it took. A question that did not form an answer is written to a hash-chained residue ledger, typed by the node where it stopped. An answer with nothing under it (no citation, proof or checked route) no longer becomes conversation state. Walks already made are recalled instead of walked again. Pronouns: when the chain cannot resolve a follow-up's pronoun, the previous cited answer is put in its place and the question is asked once more, and the reply says so ("Taking 'its' as Japan, from my previous answer."). This repository did not receive release 3.2 when the slim one did; 4.0 carries it (proved specialists as a cross-check, four star specialists, owner-first; see the slim repository's 3.2 note). The full 3.2 missed two sealed tests: sealed test 23 (three false yeses against a bar of two) and sealed test 24 (one format defect: a speed asked in km/h answered in m/h). Three guards were added after sealed test 23 (w556): owner-first may not return a stored fact for a question that gives no numbers; a negative amount of something that cannot be negative is withheld; arithmetic is not read from a sentence. A fourth guard (evidence must name what the question names) lost right answers on every form measured and is not included; the two sealed-23 errors it was aimed at stay open. Release test, PI4-B (186 turns, sealed before the code froze, run once): 157 right, 26 declined, 3 of 30 should-decline questions answered (false yeses); every answer to an answerable question was right. The same panel on the full 3.2 runtime: 157 right, 3 false yeses. Second turns of follow-ups: 23 right, 0 wrong. Mean steps k 4.946; median time L 120.35 ms. Route forms re-entered on recurring questions: 94.0% (shuffled baseline 16.5%); recurring pairs spelled the same word 20/20. Disclosed: pronoun re-entry fired on none of PI4-B's follow-ups (the 3.2 runtime already resolves them); on the first panel, PI4-A, the 4.0 and 3.2 runtimes gave identical answers; recalling walks cut mean time from 637 ms to 530 ms on 162 questions with the same k (5.636) and the same route word on all 162, so speed and step count are separate measures; four induction passes proposed no new rules; a panel generator bug (follow-up pairs not sharing a session) was fixed in the runner before PI4-B ran. New root `350cd86e190f5e451faa78e7d12f6d923bcc7cdcf46a556c70c8ac8211f5e4d4`, anchored on Solana: [4vJ57qaJxvzZ...](https://explorer.solana.com/tx/4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH).
95
+
96
  **Release 3.1 (17 October 2026).** Fold composition: the specialist network now learns operations from the specialists' own development exams instead of having every one written by hand (84 learned operations, each kept only when its siblings cross-checked it, each firing only when the question carries its template's names and materials), and chains them with the hand-written ones under the same checks; a learned operation never takes a value that arithmetic built to fit its slot. Found by the research record's re-examination of every specialist: when a check stops a route that could not have computed the answer (a document page asked for a derivative), the specialist that can is now asked; answers about a different quantity than the one asked (a frequency for a wavelength, a travel time for a share of sunlight), definitions given for a calculation, a first derivative given for a second, and lower-cased units are withheld or corrected; an answer in a unit of the asked dimension is restated in the asked unit. The Workbench's worked example is now a habitable-zone specialist built from one published paper. Release gate, sealed test 22 (150 questions written after the code froze, run once): 124 right, 3 wrong, 23 declined, 1 false yes; precision 97.9%. New root `c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050`, anchored on Solana: [4kW4S5V4kHsF...](https://explorer.solana.com/tx/4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3). Code changed only (the fold chain, specialists/_gate and the Workbench); no store changed.
97
 
98
  **Release patch 3 (16 October 2026).** The specialist network v5 reads the shapes the patch 2 retest (composition test C2) found unread: a box given as "5 cm by 4 cm by 3 cm" or a cube "5 cm on each side" (its volume derived by core arithmetic and shown in the path), "500 cubic centimetres of ice", "the water in the pond", "in a day". The older v2 network route is now checked like the others, and a unit answer about a place with no record ("minutes in a day on the planet Zentar") is withheld. New in the Workbench: an Essay tab and `python oracle7.py essay topic` (ProseFold) compose an essay from this model's own records, with a choice of length, reading level (measured as a grade), technical depth and style (profiles measured from Simple and English Wikipedia and the OpenStax textbooks); every sentence is kept word for word with its source, no language model, and their quality has not been measured by people yet. Release gate, sealed test 21 (150 questions written after the code froze, run once): 131 right, 2 wrong, 17 declined, 0 false yes; precision 98.1%. New root `0575c9b78f6dcc0a48ee57e6dc63d3e1a46afc13d2c9d9d4503db6c784564ed2`, anchored on Solana: [WNEdPhKJZYCh...](https://explorer.solana.com/tx/WNEdPhKJZYCh3ZKe7X8zhVehuyskEnKuDbde86W1XdKdBC9izVAJTzbrewtSUQ8keQvT1rZUBumCGnGxjDXyVgU). Code changed only (the fold chain, specialists/_gate and the Workbench); no store changed.
RELEASE_HASHES.json CHANGED
@@ -1,16 +1,20 @@
1
  {
2
  "format": "oracle7-release-hashes/1",
3
  "release": "oracle7",
4
- "head": "oracle_release_runtime_w548",
5
- "merkle_root": "c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050",
6
  "parts": {
7
  "specialists/_cards": {
8
  "sha256": "619ae757757de886c389cf953924f090d0f71ecff02447171381287f9553a2cf",
9
  "files": 142
10
  },
11
  "specialists/_gate": {
12
- "sha256": "958a79ab626cb7b826b8e3eb9e6decd0ca5491bc3120cf64a3b6f9f774b3ce2a",
13
- "files": 20
 
 
 
 
14
  },
15
  "specialists/acoustics": {
16
  "sha256": "b1f834fac69da0bcb7fb3a0463559d622e1e842457d2f36aa2a821ce69dff84d",
@@ -144,6 +148,10 @@
144
  "sha256": "11ba66e2158cf17ea81814f8365350a73ee5fa531a2e61d094c93c1dc8e9b650",
145
  "files": 8
146
  },
 
 
 
 
147
  "specialists/densities": {
148
  "sha256": "d694151f731a175b784d756e84996ae32151c50314e49e46e30a72a5c1a211dc",
149
  "files": 8
@@ -192,6 +200,10 @@
192
  "sha256": "ae8ee5a60711c2a49ec2f0ebf9baf119e0f1511e14cf530b2c8b6cd0d8ea7837",
193
  "files": 10
194
  },
 
 
 
 
195
  "specialists/finance": {
196
  "sha256": "ab5cb2ac863d2a679816e4c68b54dc55cce783bbc52b83069938397166c888c6",
197
  "files": 7
@@ -284,6 +296,10 @@
284
  "sha256": "f49eeef1a0310637ebd9320e55897f2cbd987577a9c76d99c4b4112f62ca73bc",
285
  "files": 7
286
  },
 
 
 
 
287
  "specialists/hvac": {
288
  "sha256": "7b98d4af07c2ae6ac5f31db2b275c48c891db332150e323ea374bf668e16e464",
289
  "files": 7
@@ -1164,6 +1180,10 @@
1164
  "sha256": "ff5aa630476ab4c3523737c54952b94b2007c943fe7b90648107a8e162aee1bd",
1165
  "files": 6
1166
  },
 
 
 
 
1167
  "specialists/statistics": {
1168
  "sha256": "5448df943eaa687ec381deca697e3907d1910ceaa770cc30a8c02fb72d8e0913",
1169
  "files": 7
@@ -1180,6 +1200,10 @@
1180
  "sha256": "b92ad90fb4bca6d3e8eee4a36c3bb3d3499ab1c2ef84061f4783029f966a6602",
1181
  "files": 6
1182
  },
 
 
 
 
1183
  "specialists/units": {
1184
  "sha256": "20140ff7585313840468cdf3eca54355fab59d5c1313ae14ec37b21f8ae9fad4",
1185
  "files": 7
@@ -1233,12 +1257,12 @@
1233
  "files": 9
1234
  },
1235
  "core/admitted": {
1236
- "sha256": "7771dbeabd010f8bc664ff367dc6b51015a8e3b20870fd1790f04f3a46098585",
1237
- "files": 341
1238
  },
1239
  "workbench": {
1240
- "sha256": "c9c21bebfb4ecf34fa0b598eb411b2a20d735f1b0e6277381fbf018f4b38c75f",
1241
- "files": 150
1242
  },
1243
  "oracle7.py": {
1244
  "sha256": "9d68865540b23122e0020c0b8ee52471a71a3dfa8e3572b23b961ea4b3bf920e",
@@ -1253,15 +1277,15 @@
1253
  "anchor": {
1254
  "chain": "solana-mainnet",
1255
  "program": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",
1256
- "memo": "Oracle7 release w548 3.1, 2026-10-17. oracle7 merkle c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050. oracle7-slim merkle 732358ed179adc00f0404dc7ecb1fe7e11484699559f6c772a1c578b002288da. Recipe: RELEASE_HASHES.json in each repository.",
1257
- "signature": "4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3",
1258
- "block_time_utc": "2026-10-18T02:51:28Z",
1259
- "slot": 458275075,
1260
- "explorer": "https://explorer.solana.com/tx/4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3"
1261
  },
1262
  "supersedes": {
1263
- "merkle_root": "0575c9b78f6dcc0a48ee57e6dc63d3e1a46afc13d2c9d9d4503db6c784564ed2",
1264
- "anchor_signature": "WNEdPhKJZYCh3ZKe7X8zhVehuyskEnKuDbde86W1XdKdBC9izVAJTzbrewtSUQ8keQvT1rZUBumCGnGxjDXyVgU",
1265
- "reason": "release 3.1 (17 October 2026): fold composition - specialist network v6 composes operations learned from the specialists' own exams (w549); the specialist answers after a check stops a route that could not know (w548); 3.1 correctness rules from the research record's re-examination and composition rounds (w547); the Workbench's worked example is the habitable-zone specialist; release gate: sealed test 22."
1266
  }
1267
  }
 
1
  {
2
  "format": "oracle7-release-hashes/1",
3
  "release": "oracle7",
4
+ "head": "oracle_release_runtime_w558",
5
+ "merkle_root": "350cd86e190f5e451faa78e7d12f6d923bcc7cdcf46a556c70c8ac8211f5e4d4",
6
  "parts": {
7
  "specialists/_cards": {
8
  "sha256": "619ae757757de886c389cf953924f090d0f71ecff02447171381287f9553a2cf",
9
  "files": 142
10
  },
11
  "specialists/_gate": {
12
+ "sha256": "aba52f21aeffe5ed8829cfc0294dbb3e88a09131d040599d312f011e2b4bf82e",
13
+ "files": 23
14
+ },
15
+ "specialists/_proved": {
16
+ "sha256": "4ef644bab853b5f3f7883862aad58c55ca0682ba97b12f95664887d795ee6df9",
17
+ "files": 23
18
  },
19
  "specialists/acoustics": {
20
  "sha256": "b1f834fac69da0bcb7fb3a0463559d622e1e842457d2f36aa2a821ce69dff84d",
 
148
  "sha256": "11ba66e2158cf17ea81814f8365350a73ee5fa531a2e61d094c93c1dc8e9b650",
149
  "files": 8
150
  },
151
+ "specialists/decay-r2": {
152
+ "sha256": "8ce57db1b27f7f4f03aa288a6936e0c15d29e6d22805422f2da076fab20345ba",
153
+ "files": 10
154
+ },
155
  "specialists/densities": {
156
  "sha256": "d694151f731a175b784d756e84996ae32151c50314e49e46e30a72a5c1a211dc",
157
  "files": 8
 
200
  "sha256": "ae8ee5a60711c2a49ec2f0ebf9baf119e0f1511e14cf530b2c8b6cd0d8ea7837",
201
  "files": 10
202
  },
203
+ "specialists/exoorbits": {
204
+ "sha256": "63b6596341c7d07280829f1311adb8724fa66b9d63633b0a8394fa0c3efe26ca",
205
+ "files": 8
206
+ },
207
  "specialists/finance": {
208
  "sha256": "ab5cb2ac863d2a679816e4c68b54dc55cce783bbc52b83069938397166c888c6",
209
  "files": 7
 
296
  "sha256": "f49eeef1a0310637ebd9320e55897f2cbd987577a9c76d99c4b4112f62ca73bc",
297
  "files": 7
298
  },
299
+ "specialists/habzone": {
300
+ "sha256": "8594d61f3df4c88fba4fedf42b9a2a92b2e5b674ec4b1fb8e7bf9173ff7f9493",
301
+ "files": 8
302
+ },
303
  "specialists/hvac": {
304
  "sha256": "7b98d4af07c2ae6ac5f31db2b275c48c891db332150e323ea374bf668e16e464",
305
  "files": 7
 
1180
  "sha256": "ff5aa630476ab4c3523737c54952b94b2007c943fe7b90648107a8e162aee1bd",
1181
  "files": 6
1182
  },
1183
+ "specialists/stars": {
1184
+ "sha256": "8821d0ab890365a15043d4bce3afa028f98848623445080168281001322e46d9",
1185
+ "files": 10
1186
+ },
1187
  "specialists/statistics": {
1188
  "sha256": "5448df943eaa687ec381deca697e3907d1910ceaa770cc30a8c02fb72d8e0913",
1189
  "files": 7
 
1200
  "sha256": "b92ad90fb4bca6d3e8eee4a36c3bb3d3499ab1c2ef84061f4783029f966a6602",
1201
  "files": 6
1202
  },
1203
+ "specialists/transits": {
1204
+ "sha256": "50f36df2bf3a8dafd419a8e2324fb95a89d0920deadbdf59e52ce0d98070001a",
1205
+ "files": 8
1206
+ },
1207
  "specialists/units": {
1208
  "sha256": "20140ff7585313840468cdf3eca54355fab59d5c1313ae14ec37b21f8ae9fad4",
1209
  "files": 7
 
1257
  "files": 9
1258
  },
1259
  "core/admitted": {
1260
+ "sha256": "5229e122a10bab42c0184826d29e0787debfb4b48a3c3100fe95ad0f0b4f03dd",
1261
+ "files": 349
1262
  },
1263
  "workbench": {
1264
+ "sha256": "d43f5a9d1607da526e3dd89c20ea2e51f98bfc950c496680d85f207592163e70",
1265
+ "files": 151
1266
  },
1267
  "oracle7.py": {
1268
  "sha256": "9d68865540b23122e0020c0b8ee52471a71a3dfa8e3572b23b961ea4b3bf920e",
 
1277
  "anchor": {
1278
  "chain": "solana-mainnet",
1279
  "program": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",
1280
+ "memo": "Oracle7 release 4.0 (w558), full and slim. oracle7 merkle 350cd86e190f5e451faa78e7d12f6d923bcc7cdcf46a556c70c8ac8211f5e4d4. oracle7-slim merkle d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5. Release test PI4-B, run once per variant. Recipe: RELEASE_HASHES.json in each repository.",
1281
+ "signature": "4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH",
1282
+ "block_time_utc": "2026-10-20T00:57:16Z",
1283
+ "slot": 459039726,
1284
+ "explorer": "https://explorer.solana.com/tx/4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH"
1285
  },
1286
  "supersedes": {
1287
+ "merkle_root": "c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050",
1288
+ "anchor_signature": "4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3",
1289
+ "reason": "release 4.0 (2026): the law, built from an invocation Ben wrote (w557): every answer's path spelled over the twenty-two paths of the three-tree runtime and counted before release; a hash-chained residue ledger of what did not form, typed by where on the Tree it stopped; an answer with nothing under it does not become conversation state; walks recalled, not re-walked; a pronoun the chain cannot resolve re-enters the previous cited answer, said aloud (w558). On the full 3.2 head (w556: owner-first needs givens; negative amounts withheld; arithmetic is not read from a sentence). Release test: PI4-B."
1290
  }
1291
  }
RELEASE_HASHES_before_40.json ADDED
@@ -0,0 +1,1267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "format": "oracle7-release-hashes/1",
3
+ "release": "oracle7",
4
+ "head": "oracle_release_runtime_w548",
5
+ "merkle_root": "c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050",
6
+ "parts": {
7
+ "specialists/_cards": {
8
+ "sha256": "619ae757757de886c389cf953924f090d0f71ecff02447171381287f9553a2cf",
9
+ "files": 142
10
+ },
11
+ "specialists/_gate": {
12
+ "sha256": "958a79ab626cb7b826b8e3eb9e6decd0ca5491bc3120cf64a3b6f9f774b3ce2a",
13
+ "files": 20
14
+ },
15
+ "specialists/acoustics": {
16
+ "sha256": "b1f834fac69da0bcb7fb3a0463559d622e1e842457d2f36aa2a821ce69dff84d",
17
+ "files": 6
18
+ },
19
+ "specialists/additive-v2": {
20
+ "sha256": "56bf6cdba671418df144e7caedfab6549ef1d436b3065d0c1d6f244c3ba4d9ab",
21
+ "files": 9
22
+ },
23
+ "specialists/agriculture-v2": {
24
+ "sha256": "523033353b845b037316bb4b71250441ec4ff6ba398ba3133dea5297c43680d8",
25
+ "files": 11
26
+ },
27
+ "specialists/airquality": {
28
+ "sha256": "befc3811a2e40c142a378d3f058a97dcec6abb7265d22d875de0d39884051ccf",
29
+ "files": 8
30
+ },
31
+ "specialists/algorithms": {
32
+ "sha256": "ad309ce3c7881029bfe872d7de0942a136c6329822733c9489d4ea6bea44f78c",
33
+ "files": 7
34
+ },
35
+ "specialists/anatomy": {
36
+ "sha256": "a21bd232538cb1323fae467a05fefcdc717621ce4c4174a57ceb58dd0152d32f",
37
+ "files": 8
38
+ },
39
+ "specialists/anatomy-r2": {
40
+ "sha256": "3eb6374536765ee657f4e17c5cc9ef10ef7a7846746c79c4a4e2d4c5e254c30f",
41
+ "files": 7
42
+ },
43
+ "specialists/architecture": {
44
+ "sha256": "58dfad2ed6b36f50a0c4c755090ded6f01f7476eeac689eaf488a8aab9de5164",
45
+ "files": 8
46
+ },
47
+ "specialists/arthistory": {
48
+ "sha256": "696412350d6532270d324236a3e3aec58a27bc21ec9c359988c5dee3ab1f2d16",
49
+ "files": 10
50
+ },
51
+ "specialists/astronomy": {
52
+ "sha256": "58408c64c5d3c3cb6df1124e3db87fd74cfa6bad0d8cdcab2ebf11657f0fbe75",
53
+ "files": 8
54
+ },
55
+ "specialists/astronomy-v2": {
56
+ "sha256": "c0011119e9775b93859ff012fa6a8b1fdd1297a281c8f8411802370fb88163bb",
57
+ "files": 7
58
+ },
59
+ "specialists/astronomy-v3": {
60
+ "sha256": "bd211531997204300cdb08d777da9e5aac96d56120a2e919334919baecd2f32d",
61
+ "files": 8
62
+ },
63
+ "specialists/astronomy-v3-r2": {
64
+ "sha256": "3c406f686faba66a057f5cd9eb87e8bc068e7f7f746e2cd4d6ab3de3ca072766",
65
+ "files": 14
66
+ },
67
+ "specialists/biology": {
68
+ "sha256": "7d23c6ce45e5ddf686bd1ed34d3c8a8be9a37e29682c73b10c42bbc07181b6aa",
69
+ "files": 8
70
+ },
71
+ "specialists/bodies-v2": {
72
+ "sha256": "aca39dcb39cb470c8bbf9995571fc869f5fb28431e2acad9af4143175508f053",
73
+ "files": 9
74
+ },
75
+ "specialists/botany": {
76
+ "sha256": "5af91f59a42663c0befc53099a6aa62e8bddc684abf3a1134a6e95dd641e6766",
77
+ "files": 10
78
+ },
79
+ "specialists/calculus": {
80
+ "sha256": "6b9fef0d96329117eb10220ab5eddb33fb1534da455c2d5db18db1eaa5a114e5",
81
+ "files": 6
82
+ },
83
+ "specialists/carboncapture": {
84
+ "sha256": "99e32723e5c04e1d3cfa4b515a642d9e480dae4978e55ac01652721477977e8b",
85
+ "files": 8
86
+ },
87
+ "specialists/carbonmat": {
88
+ "sha256": "64f1f87981f10f39fcef287a85ab7d578dfbfe54a7e185dc79aa918a83030a89",
89
+ "files": 8
90
+ },
91
+ "specialists/chemistry": {
92
+ "sha256": "21ebebe15bb58bb6e0a230b2e2fbe4e77f373fbde762ac1779c91fb945c2e281",
93
+ "files": 8
94
+ },
95
+ "specialists/chemistry-v3": {
96
+ "sha256": "78495138a3ee05df30c872bc095b36813b4c99c7de320521aa2fbee0e947225b",
97
+ "files": 12
98
+ },
99
+ "specialists/childdev": {
100
+ "sha256": "2e706a0ab4be8a1185d7a8dcd6848ed1ef84438f661dacd8eaf3438f7e71d72a",
101
+ "files": 10
102
+ },
103
+ "specialists/climate": {
104
+ "sha256": "f42048beb6bab4e312d0db1d79978eef5907b3274ee24108dad65bbf8aa5dfb2",
105
+ "files": 8
106
+ },
107
+ "specialists/coldchain": {
108
+ "sha256": "e150790aef318f2e8f0362c701e8bb066aaae4718de5491144d2e9e50e6ebe01",
109
+ "files": 7
110
+ },
111
+ "specialists/coldchain-v2": {
112
+ "sha256": "95ecd3302b85ada9304c0724c852f32c5173cc491cd0e1ad07bceff35df55701",
113
+ "files": 12
114
+ },
115
+ "specialists/cooking": {
116
+ "sha256": "b95cdb478d919ff54af26ec8275dce278e0365e5c576c79b2b4cdbc2fffe9a4f",
117
+ "files": 9
118
+ },
119
+ "specialists/cooking-v2": {
120
+ "sha256": "59d8a815a76d2240161f1c429bb185e1cf4ae89f7433c7207e156104189b9e12",
121
+ "files": 8
122
+ },
123
+ "specialists/cooking-v3": {
124
+ "sha256": "244f4d1225b884d24ed81138b885bbc4b60e48e91839aa3a55ce030980d46b3b",
125
+ "files": 9
126
+ },
127
+ "specialists/cooking-v3-r2": {
128
+ "sha256": "f9add0be09a177d4afb4485a4237474c0f6346baa3f9cdf5c98993c7c4a9b7d3",
129
+ "files": 15
130
+ },
131
+ "specialists/crafts": {
132
+ "sha256": "2d0867e2e54b1b6381f86f44999bb5fa9f84ae6a8f2cddc244bc67cba34557d7",
133
+ "files": 8
134
+ },
135
+ "specialists/cyber": {
136
+ "sha256": "948e2190f06c367417c08ec2e1dbf63eadd8826885743381805e61fa98d135a2",
137
+ "files": 8
138
+ },
139
+ "specialists/dataformats": {
140
+ "sha256": "2b97a2b0b9f9335f17541168e801ece056eef7b3ee7f42d6c5fb856dd968520c",
141
+ "files": 7
142
+ },
143
+ "specialists/decay": {
144
+ "sha256": "11ba66e2158cf17ea81814f8365350a73ee5fa531a2e61d094c93c1dc8e9b650",
145
+ "files": 8
146
+ },
147
+ "specialists/densities": {
148
+ "sha256": "d694151f731a175b784d756e84996ae32151c50314e49e46e30a72a5c1a211dc",
149
+ "files": 8
150
+ },
151
+ "specialists/densities-r2": {
152
+ "sha256": "afdd31a9495e7a54695bf3bb8a0d51eeb545ef82b7b9fcaa71367066c385498d",
153
+ "files": 9
154
+ },
155
+ "specialists/ecology": {
156
+ "sha256": "010360a1fdeb98a4f2fc21be6b1eebd96695d5d80e953b55f765bfc0a2b36b85",
157
+ "files": 8
158
+ },
159
+ "specialists/economics": {
160
+ "sha256": "eebb751f4324f72375b60a3d70942c8ab5b132331cb148cb83b9523ecad23bf4",
161
+ "files": 8
162
+ },
163
+ "specialists/electrical": {
164
+ "sha256": "4c89aed30761c2ac9d724bbf296c29d0c22305f6457b95a728cfb529381df4d1",
165
+ "files": 8
166
+ },
167
+ "specialists/electronics": {
168
+ "sha256": "9b37becbb4fba1243237e17a3291ddb6564e49041219519bd0d945890acd66dc",
169
+ "files": 7
170
+ },
171
+ "specialists/electronics-r2": {
172
+ "sha256": "1a67a09f49f11ed7b7bde0f73d4f98e1ed6e5e9ba5ca0eadf045f2fd14a90d68",
173
+ "files": 7
174
+ },
175
+ "specialists/embedded": {
176
+ "sha256": "d2acd2482059890e52b3685b527bac3d4d50622a524492c7487a51e2ce9aea5d",
177
+ "files": 8
178
+ },
179
+ "specialists/energy-v2": {
180
+ "sha256": "cccd99903b4f425a4c2506321e563ad3f382119ede0c3594304de7b1805dac52",
181
+ "files": 7
182
+ },
183
+ "specialists/energy-v3": {
184
+ "sha256": "9384e2a81a7042d11f4b7a0d3a2ff0a3b9b5b5f3edde8c1b7a35b1217094508b",
185
+ "files": 8
186
+ },
187
+ "specialists/entomology": {
188
+ "sha256": "ee081a71c75d7643f1b50729acca7fb0f002e30da7cdcfc8e9364da5209ee0fe",
189
+ "files": 10
190
+ },
191
+ "specialists/etiquette": {
192
+ "sha256": "ae8ee5a60711c2a49ec2f0ebf9baf119e0f1511e14cf530b2c8b6cd0d8ea7837",
193
+ "files": 10
194
+ },
195
+ "specialists/finance": {
196
+ "sha256": "ab5cb2ac863d2a679816e4c68b54dc55cce783bbc52b83069938397166c888c6",
197
+ "files": 7
198
+ },
199
+ "specialists/finance-v2": {
200
+ "sha256": "d3b5d3a6666a6f051cb7290f4967ebc6d2d16c68f8dd24235a2fac070ed96c00",
201
+ "files": 12
202
+ },
203
+ "specialists/finance-v2-r2": {
204
+ "sha256": "4b44d6264bc12075f7bf197726399559e6086a902a44de5d8c874cdae710bdf2",
205
+ "files": 11
206
+ },
207
+ "specialists/firesafety-v2": {
208
+ "sha256": "82dacf7eae4f061981dda17272e6572983e3972162224e9f24293fe387021b61",
209
+ "files": 10
210
+ },
211
+ "specialists/firstaid": {
212
+ "sha256": "ea314183893b08a18700995fb64ade8a45cc041f70ed30bdf93d094fe95f536b",
213
+ "files": 10
214
+ },
215
+ "specialists/fleet": {
216
+ "sha256": "304b6bb4a25fdff30ba018c17d527ad7d50405d20de20793af73d56985f4de2f",
217
+ "files": 7
218
+ },
219
+ "specialists/fluids": {
220
+ "sha256": "239fe31ee98b73988dd240b05e7f9d79e1f67d58c02a8a64d4faf8a0d14df5bb",
221
+ "files": 8
222
+ },
223
+ "specialists/fluids-r2": {
224
+ "sha256": "d93d4dc0f7777b2b6c73d44ac8d16e38cd08a69a92c8af2694da2ae63cee67db",
225
+ "files": 9
226
+ },
227
+ "specialists/forestry": {
228
+ "sha256": "b04fb4b96035ce10bb07c9f409dc309601f9a42cf8be8aed1d949090cec18bb7",
229
+ "files": 8
230
+ },
231
+ "specialists/fuels": {
232
+ "sha256": "03ce57c8ae111136fff26dffc6bff71a47bc6bb2df59d3a8c80767b5997d7d4b",
233
+ "files": 8
234
+ },
235
+ "specialists/games-v3": {
236
+ "sha256": "d0670dd8f9d94eb416999bd7048f4be96e91eff2702fad27636059275da47d58",
237
+ "files": 10
238
+ },
239
+ "specialists/gardening": {
240
+ "sha256": "8a64598bcf8beb10b3214dcbb36c2b29e588eabb00c41f3eb985f3e279c27f7d",
241
+ "files": 8
242
+ },
243
+ "specialists/genetics-v2": {
244
+ "sha256": "49ac519b2cc0eadeafb79b29c15c9a99e5d868b067fc6777ed065a9bc3a971d1",
245
+ "files": 11
246
+ },
247
+ "specialists/geography": {
248
+ "sha256": "8f107fcf17a048377317a4343411c8a6a8f75958282a266cc8fd15f8042a4197",
249
+ "files": 8
250
+ },
251
+ "specialists/geology": {
252
+ "sha256": "ad27f3d878b6de6f3b5b277b1a852625ebf12e0189d496d0acf90131f5461934",
253
+ "files": 8
254
+ },
255
+ "specialists/geometry": {
256
+ "sha256": "46fc4fafd8d3633ba3f3e15704733b51935a7b559995bd3cb06d5f7de3533abe",
257
+ "files": 6
258
+ },
259
+ "specialists/geometry-v3": {
260
+ "sha256": "b8e9842ccc063bebc2fd705039fcf485abb008f58d3f453d8d790f38d268ea93",
261
+ "files": 9
262
+ },
263
+ "specialists/geometry-v4": {
264
+ "sha256": "296a480f352d91f13e7903a3b9baf1a97d77dd55d956bed247ddcaf04689e1be",
265
+ "files": 10
266
+ },
267
+ "specialists/git": {
268
+ "sha256": "827f404802ecd0ecfe65d089cd56e99ddfc57dbcb25b5e77dbe617fa2d531d24",
269
+ "files": 8
270
+ },
271
+ "specialists/government": {
272
+ "sha256": "9a0b18fb8d5a030bdf1b5ca601550d2235008a72df49d6c858e7893bb7c9fbfa",
273
+ "files": 8
274
+ },
275
+ "specialists/grammar": {
276
+ "sha256": "0909a6e4d8ba122ffafef397ea88dec36e245783e72822a0d4b510c95e40a973",
277
+ "files": 8
278
+ },
279
+ "specialists/greenhouse": {
280
+ "sha256": "87175794f5aa16de7195017f1df2db1a650f1465ca79fd6d43ea0300ac09cda0",
281
+ "files": 7
282
+ },
283
+ "specialists/greenhouse-r2": {
284
+ "sha256": "f49eeef1a0310637ebd9320e55897f2cbd987577a9c76d99c4b4112f62ca73bc",
285
+ "files": 7
286
+ },
287
+ "specialists/hvac": {
288
+ "sha256": "7b98d4af07c2ae6ac5f31db2b275c48c891db332150e323ea374bf668e16e464",
289
+ "files": 7
290
+ },
291
+ "specialists/hydrology": {
292
+ "sha256": "d51a7e6c7b581f92ac3bcef8289010f8388e05b471766830a91f19fe3926bcf3",
293
+ "files": 7
294
+ },
295
+ "specialists/iot": {
296
+ "sha256": "62ca53f84921ed51c1ee97bb3972520e19f385b6e644ea93ae77acf1fa9c1ccc",
297
+ "files": 8
298
+ },
299
+ "specialists/javascript": {
300
+ "sha256": "30b3d464c7008f6cbbe67dae3923a2b80058f8ae6d66fe95efb0f8fbfaa1efec",
301
+ "files": 11
302
+ },
303
+ "specialists/labsolutions": {
304
+ "sha256": "cb38e6bf06cee68d5bcdbe33499aa0fdd82ca9b48697f865064614a67b63b5fe",
305
+ "files": 10
306
+ },
307
+ "specialists/labsolutions-r2": {
308
+ "sha256": "eaea9b9f7122c65aa74cd56f6177fc661fc9e638a4f988d90899dd30b78f2031",
309
+ "files": 10
310
+ },
311
+ "specialists/law": {
312
+ "sha256": "d3bce2f7225ee7fe17e016c3ffe0954550058fab6d1609495a3bc329b7cdb1a1",
313
+ "files": 10
314
+ },
315
+ "specialists/library": {
316
+ "sha256": "eee1d02ca69f26536501d5ae7bf23bd52a0450602b30b8ad6d6eeadd38ea49e0",
317
+ "files": 8
318
+ },
319
+ "specialists/linguistics": {
320
+ "sha256": "84a7c56de847547353b88ead503c85f6400b3d4089acd514e639e898ab29da3b",
321
+ "files": 10
322
+ },
323
+ "specialists/linux-v2": {
324
+ "sha256": "b5444cafc7d204c02693c83631c56334ae1d788a1a2a0a9dc5d9c541d5d98914",
325
+ "files": 11
326
+ },
327
+ "specialists/literature-v2": {
328
+ "sha256": "5caa9188095408f3e34a30132d5db84417f462bd9d4abb69f5a89a9f69ef4461",
329
+ "files": 11
330
+ },
331
+ "specialists/logic-v3": {
332
+ "sha256": "ef4158bebab9248feb6559276e51932edd36157fb684ec7b9a6e5686aa0055ce",
333
+ "files": 11
334
+ },
335
+ "specialists/marinebio": {
336
+ "sha256": "00c693b22ac924df1f7c19973805cd98f47d23b8b81f506d960d826abd29b33b",
337
+ "files": 10
338
+ },
339
+ "specialists/materials-v2": {
340
+ "sha256": "9d1a16e250ffbde10dbe91676e76f5e0a572739d59a3b96f6bbee3ccb8b283e8",
341
+ "files": 9
342
+ },
343
+ "specialists/mechanisms": {
344
+ "sha256": "5cd545850c81615d97f4bba5cacc9a8c9d3cf485d4d99aa439d1a8a79412eb46",
345
+ "files": 6
346
+ },
347
+ "specialists/mechanisms-v2": {
348
+ "sha256": "f3ef1347aef9b07b687e1411e9137fb5e835641223b6bc693f41e96f3d700a84",
349
+ "files": 12
350
+ },
351
+ "specialists/medicine": {
352
+ "sha256": "b8bcdd6b3d47a130a3fa29c35124f0f10b63e236f8047101c4a0140732842f50",
353
+ "files": 10
354
+ },
355
+ "specialists/medicine-r2": {
356
+ "sha256": "8357c755727bdad3c118cbe7d5a8a32a51b97b03219e00ef0ecfffe0e719446e",
357
+ "files": 9
358
+ },
359
+ "specialists/meteorology": {
360
+ "sha256": "8f159bc6f48d5ea57291a942c9936eb443599bb3af6ffdce23940274a63bd0ba",
361
+ "files": 6
362
+ },
363
+ "specialists/microbiology-v2": {
364
+ "sha256": "6ec92110413981f55ec5a7fbb019635da501f67347d2dca8698b2dc5fe41ad8f",
365
+ "files": 9
366
+ },
367
+ "specialists/music-v2": {
368
+ "sha256": "20a7d9f146a0ec2f32c9f461f7b4561146e9e3f68e68a1abc4befc5e19371e27",
369
+ "files": 11
370
+ },
371
+ "specialists/music-v2-r2": {
372
+ "sha256": "08a82efa304ff2257d64257ef8d171c4169e02f27c0859a20781c91eed631056",
373
+ "files": 10
374
+ },
375
+ "specialists/mycelial": {
376
+ "sha256": "7cd80e37e6e8bb57ecffa9df2ffaa02215f6163df59f334504b518efc9bcff29",
377
+ "files": 10
378
+ },
379
+ "specialists/mycology": {
380
+ "sha256": "470a4dfc6b5fdb86d9f7ebe5d4481aac518562e1d4b5fee4e329b0d10e1fe629",
381
+ "files": 10
382
+ },
383
+ "specialists/mythology": {
384
+ "sha256": "925cb2901a02ecad02a1dbdeeca739082096c4aa6077cf79c6db8badc8556c05",
385
+ "files": 8
386
+ },
387
+ "specialists/networking": {
388
+ "sha256": "a0a90634582cd4a45980ab9853e9e6b6f61a8638a4d904d7c9e1c9b64ee2cfdf",
389
+ "files": 8
390
+ },
391
+ "specialists/nutrition-label-v2": {
392
+ "sha256": "26d25c937ad6c22ede0b836b5de61786792f67ab1a9236de374c4cbc3a5187d1",
393
+ "files": 9
394
+ },
395
+ "specialists/ocean": {
396
+ "sha256": "145006ee7a909d93e90b23b4294691d453bef1d87579c8fa5e187ac1c51ce9d6",
397
+ "files": 8
398
+ },
399
+ "specialists/optics": {
400
+ "sha256": "c58517aa4565c85b7ecbbc9b8982bc53a04f050219014de01fce9e9ce3cec5be",
401
+ "files": 6
402
+ },
403
+ "specialists/optics-v2": {
404
+ "sha256": "38c66d52bcb457a5582abc5018a58e4119c1575e06d9267e225fdc8dea2b65ae",
405
+ "files": 7
406
+ },
407
+ "specialists/optics-v3": {
408
+ "sha256": "430447014db000b43e1fc857d9d5e5d8d0762cbfaf04002ce4f7784967f952af",
409
+ "files": 8
410
+ },
411
+ "specialists/optics-v5": {
412
+ "sha256": "8b97d434f613450ac163ab951d0ce74216987f0b60923e548f1d301a743bbb11",
413
+ "files": 21
414
+ },
415
+ "specialists/optics-v5-r2": {
416
+ "sha256": "cb66eb46e38433c478966af95f638fb44be4ae215509d2672965c27e408e36b4",
417
+ "files": 20
418
+ },
419
+ "specialists/orbits": {
420
+ "sha256": "2461710b2bfbe5d629c1afc92b64deffdadb8398222cbbd356a8c14be472582f",
421
+ "files": 7
422
+ },
423
+ "specialists/ornithology": {
424
+ "sha256": "80d51be829aab8c05fcc9f3654b31b59a5c8e82b8859730db133263841e94cd1",
425
+ "files": 10
426
+ },
427
+ "specialists/pets": {
428
+ "sha256": "50c22fb1a909e9870c762f22e73ff57d68091c7c5f1a211e54a8186787c1f1ac",
429
+ "files": 10
430
+ },
431
+ "specialists/physics": {
432
+ "sha256": "83ac3e58e64678b00b106e08e2c897b5bfadbb7c807deeb04141f46d4f243cd6",
433
+ "files": 7
434
+ },
435
+ "specialists/physics-r2": {
436
+ "sha256": "69e7990f3684ee2a43f8ab29a6c45c4df66416842b89c0bdc09e859840bb5d04",
437
+ "files": 9
438
+ },
439
+ "specialists/physics-r3": {
440
+ "sha256": "9e0ede142f1cecc4d27628a4ad53ad5b528af31557dbbfb2d05d2ff71172ede5",
441
+ "files": 8
442
+ },
443
+ "specialists/planetary": {
444
+ "sha256": "4b62d2f5c18fe869ad2a570fc22d4a4d94a735d178372e09f01c6f310af02459",
445
+ "files": 8
446
+ },
447
+ "specialists/poetry": {
448
+ "sha256": "9361a2a7b18f5bd260f57a9d417e62ebb00d9721625b2f4f99bbfd296aad44f3",
449
+ "files": 10
450
+ },
451
+ "specialists/printing": {
452
+ "sha256": "8f3a93b080db2a923196d2e6138949518c39cded5b800a4fb38e8a254e095df2",
453
+ "files": 7
454
+ },
455
+ "specialists/printing-v2": {
456
+ "sha256": "24b2fc335c8fde6a749e0104d8dbbf20d1f535aad854e160305442ab0e1d1e32",
457
+ "files": 12
458
+ },
459
+ "specialists/psychology": {
460
+ "sha256": "18061dc814732e42e51bb2a12ebc323d7169dd21c4734bd2cc0d651fe5052c98",
461
+ "files": 10
462
+ },
463
+ "specialists/python": {
464
+ "sha256": "4bbb3917b28303f8c1448f403ba2c0426b1528c199921ab8f7110a99b95b3bda",
465
+ "files": 9
466
+ },
467
+ "specialists/python-r2": {
468
+ "sha256": "1301cb2d6653db2a3a8488e9c5585426f63a537f8e3a4fa5e03a22e59c340365",
469
+ "files": 9
470
+ },
471
+ "specialists/rel-actors": {
472
+ "sha256": "94fe86c201fb2a0dd0036c642ab2a58040ce675a8ef7314fcc33be7218e1cb91",
473
+ "files": 8
474
+ },
475
+ "specialists/rel-aircraft": {
476
+ "sha256": "e42af0d661a5573d11d6d56b2fa28fc834c55099e23f5c16a2c674071695afd6",
477
+ "files": 7
478
+ },
479
+ "specialists/rel-airlines": {
480
+ "sha256": "8e1b16921e092b8ae91aaac84c60d2bb4fdb32dc9ef6f15f55f1a7786830c066",
481
+ "files": 7
482
+ },
483
+ "specialists/rel-airports": {
484
+ "sha256": "ca6c24da1cf6998f80ee384be4dc12323cb897a0fdb22f16503f6e5f68dcf57a",
485
+ "files": 7
486
+ },
487
+ "specialists/rel-albums": {
488
+ "sha256": "c50c357436987aa8974701d664e3db518a6751ed74438df38cc60441ade9869d",
489
+ "files": 8
490
+ },
491
+ "specialists/rel-animators": {
492
+ "sha256": "d6e6271266b0954a61471a5033b4af17c6c8a2b85c80be20f9430436c254590c",
493
+ "files": 7
494
+ },
495
+ "specialists/rel-anime": {
496
+ "sha256": "4d346b7a3ea5d1f9e24388099c3d89a060f554e767cfb91061e089ba7ce70aa3",
497
+ "files": 7
498
+ },
499
+ "specialists/rel-architects": {
500
+ "sha256": "327e99d5643a7de485d870acddde728a7650fba1c12448d51efa74638a853c98",
501
+ "files": 7
502
+ },
503
+ "specialists/rel-asteroids": {
504
+ "sha256": "b1840aebe96ea41b14a4fbfd5097a8500057e1d61e631ae332186dd6665c2598",
505
+ "files": 7
506
+ },
507
+ "specialists/rel-astronauts": {
508
+ "sha256": "82906463e7dae7f3f3232f660a9ccbedfc16b00a089c97de5682488561285152",
509
+ "files": 7
510
+ },
511
+ "specialists/rel-astronomers": {
512
+ "sha256": "62c8618d70496ee821bf2a9a44874c7d23e858af47887553ce1acaf7d5c91c6e",
513
+ "files": 7
514
+ },
515
+ "specialists/rel-athletes": {
516
+ "sha256": "e6f08e57dcda4107517e0dbf0fa730ef19be1389f806fd581373a8d60efafddb",
517
+ "files": 7
518
+ },
519
+ "specialists/rel-awards": {
520
+ "sha256": "192510470bd6e5e3f5cd4334529d75e3da99e1d034159351e65410152c4d42db",
521
+ "files": 7
522
+ },
523
+ "specialists/rel-ballets": {
524
+ "sha256": "4594970aa6fe14079921de49133551361a5d3f12447a3e848122aed14dd0ca5f",
525
+ "files": 7
526
+ },
527
+ "specialists/rel-bands": {
528
+ "sha256": "8c08916c112cf7010df395203a6f5a7d7c8598fddb5acf3eb31bb814c8e23e9b",
529
+ "files": 7
530
+ },
531
+ "specialists/rel-baseball": {
532
+ "sha256": "3d02b894c816062ed0533f17ada843533c1f639d18a701ceb749f5307e3c6857",
533
+ "files": 7
534
+ },
535
+ "specialists/rel-basketball": {
536
+ "sha256": "fc7872886bcb867f0796a456440b0b19040eb919ba05e3bd44f1fb5b0af7d0ac",
537
+ "files": 7
538
+ },
539
+ "specialists/rel-battles": {
540
+ "sha256": "92df9a44e245e60fc1bbc89bffa8b03f0d1c488462792b6935281f029aa2ef49",
541
+ "files": 7
542
+ },
543
+ "specialists/rel-biathletes": {
544
+ "sha256": "a71c3137c5c346185718b2562f38f36b02e83c3dba0cee2a287496b31a11e980",
545
+ "files": 7
546
+ },
547
+ "specialists/rel-biologists": {
548
+ "sha256": "a0a2953c7bc2c03f3f81258971699d318ec668dced7bd38aea6302a972ec6ff3",
549
+ "files": 7
550
+ },
551
+ "specialists/rel-bloggers": {
552
+ "sha256": "0f00be50c3df97466dc4c5cdfd67182f0ef7ec15072c558fe88020992392710c",
553
+ "files": 7
554
+ },
555
+ "specialists/rel-boxers": {
556
+ "sha256": "d64565a0cefb73a2b469a719e1e3be0033ee1f22f03d2bd5513d4bb47f26a228",
557
+ "files": 7
558
+ },
559
+ "specialists/rel-brands": {
560
+ "sha256": "8b96fe11f49ab3873f7ea817b6bd5515f993478d0a58cc5b790026f7915610c5",
561
+ "files": 7
562
+ },
563
+ "specialists/rel-breeds": {
564
+ "sha256": "1790526f1ffe51704dd62f5aa2b3e3ce4d7d1c66cedb851e63574eba17cc1bc9",
565
+ "files": 7
566
+ },
567
+ "specialists/rel-bridges": {
568
+ "sha256": "2b3def52a1d68670ee02baf4e2d022d1d6a405bac2bbe128d23e38771c1f5fe3",
569
+ "files": 7
570
+ },
571
+ "specialists/rel-business": {
572
+ "sha256": "e21c10c79e71e9225bd1deda100094bfcf110e6d88aaf528839ff3f2a475e510",
573
+ "files": 7
574
+ },
575
+ "specialists/rel-carbrands": {
576
+ "sha256": "96e3ec5eb9be9c0f372cdf71945bd221fac92c6531e03252c9c29ff48723c987",
577
+ "files": 7
578
+ },
579
+ "specialists/rel-carmodels": {
580
+ "sha256": "a6973c624b643c5c35887c987cfec8aa192e7895759e92b2521ed7a9ce267f92",
581
+ "files": 7
582
+ },
583
+ "specialists/rel-castles": {
584
+ "sha256": "6a64c827dae572dc4751559f981844123be6c362788b930055fb26d7f1f7b8a8",
585
+ "files": 7
586
+ },
587
+ "specialists/rel-channels": {
588
+ "sha256": "f1d7f551e22aa47982d1d60cd81ce037849fefc2709505d7dd0496dda01abef3",
589
+ "files": 7
590
+ },
591
+ "specialists/rel-characters": {
592
+ "sha256": "b0832b9c28a54c0e67ff794155e9dff3a700c6722a71d5dcf545d17e855c25ee",
593
+ "files": 7
594
+ },
595
+ "specialists/rel-chefs": {
596
+ "sha256": "7bf2cc4f04d36d90749d835d63a9dc1192b7cecb441aadb7397c5d3ad58aed3a",
597
+ "files": 7
598
+ },
599
+ "specialists/rel-chemists": {
600
+ "sha256": "ee488eaa75e596a6da2352f053e7a68d4bc6babea88d5b28801292bfdc75cadd",
601
+ "files": 7
602
+ },
603
+ "specialists/rel-chess": {
604
+ "sha256": "9e4c09d7a15ed6091047313e8249c021ad84ef1fcfbcb7d4b5de1c1012371ce8",
605
+ "files": 7
606
+ },
607
+ "specialists/rel-churches": {
608
+ "sha256": "00a55b2ff9b6e6d04b8dd3d89d7cc0ee67479e182e1d0c7a8e1976b532aaeda1",
609
+ "files": 7
610
+ },
611
+ "specialists/rel-comedians": {
612
+ "sha256": "c53bf97b567c0eab0348ebe2382762649f2b19078d02bf7f155286efce161e91",
613
+ "files": 7
614
+ },
615
+ "specialists/rel-comics": {
616
+ "sha256": "163c63c2c01975950728a4c9542f17a060355047f60147af46e5ca7f6cc75784",
617
+ "files": 7
618
+ },
619
+ "specialists/rel-companies": {
620
+ "sha256": "cfd7c900d24ca91e3da57d83fff03b3cec75fc9039b81a396ac085c4ad1237e3",
621
+ "files": 8
622
+ },
623
+ "specialists/rel-composers": {
624
+ "sha256": "c79bf75790d2f191fde1c581653601422a095cd0f28eded9dc402d722ef402af",
625
+ "files": 8
626
+ },
627
+ "specialists/rel-compounds": {
628
+ "sha256": "37ab98152a2eddbd791a059d3770573d16739fb228944811998a21cf9479c5dd",
629
+ "files": 7
630
+ },
631
+ "specialists/rel-computerscientists": {
632
+ "sha256": "4a5b0bb86e620a1a7bcfcb379058f5de7f08696adc83a173f3b342184e1c4b91",
633
+ "files": 7
634
+ },
635
+ "specialists/rel-countries-v2": {
636
+ "sha256": "93ea831614d96da5b335cedc51d1c92353630f715e5249639a5dc4b8044dc44e",
637
+ "files": 7
638
+ },
639
+ "specialists/rel-cricketers": {
640
+ "sha256": "6de3e498b4f94f57e7e5264dd600e2105f4ea072512e5bc17274d8e4d419c56f",
641
+ "files": 7
642
+ },
643
+ "specialists/rel-criminals": {
644
+ "sha256": "933cf3cbb1f84245ae10b5c8426444a8217f46a0b592c5c9a64db312bee20a5b",
645
+ "files": 7
646
+ },
647
+ "specialists/rel-crosscountry": {
648
+ "sha256": "057b79e8df90549b7889cc6585ddda55d9849a40093d1468ac19f4e6ea799dff",
649
+ "files": 7
650
+ },
651
+ "specialists/rel-curlers": {
652
+ "sha256": "6ee3c62c9a64cd24778c7c380902cd3e3946b8f0e854542537e28fa624a7c574",
653
+ "files": 7
654
+ },
655
+ "specialists/rel-cyclists": {
656
+ "sha256": "1d6a7ca32f895b42d764c8cc4dfe17b2105e2554ea8072864f5616b8e481a989",
657
+ "files": 7
658
+ },
659
+ "specialists/rel-dancers": {
660
+ "sha256": "cb3e7fde26a065c85e2381527fa96c7d0e097ba4606b7f6897b57fbff2fed531",
661
+ "files": 7
662
+ },
663
+ "specialists/rel-diplomats": {
664
+ "sha256": "1839e4fcdbd3c71126dbf4d0c3c4cb2e18b03eba4e4bf0d0bddc62365c1030c0",
665
+ "files": 7
666
+ },
667
+ "specialists/rel-directors": {
668
+ "sha256": "84cf854af587ec6b6f9b39002dffefa359411eb29df6cb7ffecbf23e43e3ff45",
669
+ "files": 7
670
+ },
671
+ "specialists/rel-diseases": {
672
+ "sha256": "5a7aec6b1cc06ed54e7cafa20ee196980931b050439b840f31e243492cac40b5",
673
+ "files": 7
674
+ },
675
+ "specialists/rel-dishes": {
676
+ "sha256": "d848aeb7cdf48c83e609fa61b1005ce7405fad6b08ff263957b616ce7dd20490",
677
+ "files": 7
678
+ },
679
+ "specialists/rel-drivers": {
680
+ "sha256": "7b735c16b6d7c66b0107f920106af435a8e8f8dee37f1f4dbbbf93dd0f82b52d",
681
+ "files": 7
682
+ },
683
+ "specialists/rel-economists": {
684
+ "sha256": "b1c909dcfe33a4b49c9d5afd2318d42bdf8f8cc1ede449ecf80158431f1331a0",
685
+ "files": 8
686
+ },
687
+ "specialists/rel-editors": {
688
+ "sha256": "3733af233905958f1cb006d88a2bb4b5bfae6a825142a7780032505c2537fcfb",
689
+ "files": 7
690
+ },
691
+ "specialists/rel-engineers": {
692
+ "sha256": "e3b7b616f3cec5e8fd2b5141742518af5c2f541e99a34928b4a3f330ea974809",
693
+ "files": 7
694
+ },
695
+ "specialists/rel-equestrians": {
696
+ "sha256": "d3f39cb631ec5b809c1ca0bd1117c4fe8e87863d7ddbb3166e912f103496a572",
697
+ "files": 7
698
+ },
699
+ "specialists/rel-explorers": {
700
+ "sha256": "679fa18e526a5991e18d81c532ca483e43d83e3a367196265fbbe7c375f80113",
701
+ "files": 7
702
+ },
703
+ "specialists/rel-fencers": {
704
+ "sha256": "0d0f2f742c7f542b51e963256a50541297ff0431235230a84e0f701eb5234eb1",
705
+ "files": 7
706
+ },
707
+ "specialists/rel-fieldhockey": {
708
+ "sha256": "1d2bc0be1741158c4b603ed2412dc2a83672303177d8a8e638fb04a71ccaad97",
709
+ "files": 7
710
+ },
711
+ "specialists/rel-films-v2": {
712
+ "sha256": "8bf0f56ee0465e1337ee635872dd7ae2beb20eef207ae4f9f75ff9d2fa48aabf",
713
+ "files": 9
714
+ },
715
+ "specialists/rel-footballclubs": {
716
+ "sha256": "ea9ac92911c3e8f3452a717bad1ca1c94862a9fa3c1889c046b83de118298f56",
717
+ "files": 7
718
+ },
719
+ "specialists/rel-footballers": {
720
+ "sha256": "dc44ded22167daf8ae3dfbee49baa4145df9186bfc09cfb8ad896032c778f65e",
721
+ "files": 7
722
+ },
723
+ "specialists/rel-galaxies": {
724
+ "sha256": "67e0fe8d8f49ed80c8de68992bcacea37afc8491de97d25231e3cbf4bff6c6f6",
725
+ "files": 7
726
+ },
727
+ "specialists/rel-genres": {
728
+ "sha256": "74b36f67e6661c2670a937bd4e575a4182aa922d188058a43333e35bb5c28c32",
729
+ "files": 7
730
+ },
731
+ "specialists/rel-geologists": {
732
+ "sha256": "2c5c60e548a0e16a8a89f60770d684e573a9721dbac30b0db57b24536be44816",
733
+ "files": 7
734
+ },
735
+ "specialists/rel-golfers": {
736
+ "sha256": "9dc2751c6517141b4d3f765cf327028403f5f0b0b16d7c3a5809e1f49a78c729",
737
+ "files": 7
738
+ },
739
+ "specialists/rel-graphicartists": {
740
+ "sha256": "3ea1c2264c144ba6256ba13313ba355cd4cbbd694bbdc56c47f0de3d74079b0e",
741
+ "files": 7
742
+ },
743
+ "specialists/rel-gridiron": {
744
+ "sha256": "0557820262e39c91d450034c680a66d8888254689cb177d89e6632f3bff284f2",
745
+ "files": 7
746
+ },
747
+ "specialists/rel-gymnasts": {
748
+ "sha256": "c33611064eed069becddc32e5bcdde210226aa6f2b045abeb4984d31204e3eb3",
749
+ "files": 7
750
+ },
751
+ "specialists/rel-handball": {
752
+ "sha256": "243248170ce1f8995dba7ad368a169322d8c7f24423d2ebaaf8ec9bf5ee7a12e",
753
+ "files": 7
754
+ },
755
+ "specialists/rel-historians": {
756
+ "sha256": "16dacace7a5f3382edc0b4e9d4b67d142ea7b391daacdef5a8b71f525225fca7",
757
+ "files": 7
758
+ },
759
+ "specialists/rel-hotels": {
760
+ "sha256": "e7f1c98da12c0584e72059252f0b3be6064785c36e2a6fdf2f5a70e963d6076c",
761
+ "files": 7
762
+ },
763
+ "specialists/rel-icehockey": {
764
+ "sha256": "f7390cf5e6ca8b34fe403fa3ba5aed9207583905e0dff56873d37687374ece77",
765
+ "files": 7
766
+ },
767
+ "specialists/rel-illustrators": {
768
+ "sha256": "ef869bf48ae791c837978b4fea4af90f07a56581d6f58fe230a457eae230b2d2",
769
+ "files": 7
770
+ },
771
+ "specialists/rel-instruments": {
772
+ "sha256": "055b9ca6ace969878484b791861bbd3380dc820c6f7a98bdbe4395ba34c35dfd",
773
+ "files": 7
774
+ },
775
+ "specialists/rel-islands": {
776
+ "sha256": "1f192f4ff7a3d12953aaf63e591665373687b0e472142d54112931f4d02b3486",
777
+ "files": 8
778
+ },
779
+ "specialists/rel-journalists": {
780
+ "sha256": "1623832e744ec02f5655c1ec52e7f8103a58311707c224e63936ef814cda5c33",
781
+ "files": 7
782
+ },
783
+ "specialists/rel-lakes": {
784
+ "sha256": "3247338c76ebde1e5d16915cdfed93465ed67f8b1f35af7d514c6a9121990a69",
785
+ "files": 8
786
+ },
787
+ "specialists/rel-languages": {
788
+ "sha256": "e9811041f02547874df89d43c661b8a4396f8a10ce9295b7ef01d9a5510c7c9f",
789
+ "files": 7
790
+ },
791
+ "specialists/rel-lawyers": {
792
+ "sha256": "f96279a7838e5a5e77817a058dcac70425f9fc125cf2add388bce32c757b39a4",
793
+ "files": 8
794
+ },
795
+ "specialists/rel-leagues": {
796
+ "sha256": "a13e9da52427806228a2c99547f1897697441c544029a6d5f22524790e576a98",
797
+ "files": 7
798
+ },
799
+ "specialists/rel-libraries": {
800
+ "sha256": "5e27954b7de3513ff431b67f384a40883722da86efabace23c7ef6cd193f6182",
801
+ "files": 7
802
+ },
803
+ "specialists/rel-linguists": {
804
+ "sha256": "a29a547cab9b9f725f3d1b8a18e0b2d36ac274b7c7802b25558d839030bf5e11",
805
+ "files": 7
806
+ },
807
+ "specialists/rel-mathematicians": {
808
+ "sha256": "79bb9d371e32fc15e7624676a121bc2b8bd7057a10affad7fa9f77dcd5689b76",
809
+ "files": 7
810
+ },
811
+ "specialists/rel-military": {
812
+ "sha256": "8795c7ffa35d7f07fbe1ec1114b12fd797449e78fa1294e016d2c91ab1b968e4",
813
+ "files": 8
814
+ },
815
+ "specialists/rel-militaryunits": {
816
+ "sha256": "044e30790c3b0f21cf95aaea70077fb79d856b59ef595667db1c38d475c0ba0e",
817
+ "files": 7
818
+ },
819
+ "specialists/rel-missionaries": {
820
+ "sha256": "ca313fbba00e276e81d2f20d62d1f50e0d21c07ca7c3574e30aca3409442f46d",
821
+ "files": 7
822
+ },
823
+ "specialists/rel-models": {
824
+ "sha256": "b8288521332328bf6e183b9aaff07215fa1dc1540c67a7eeab52d7b7b1247cec",
825
+ "files": 7
826
+ },
827
+ "specialists/rel-monarchs": {
828
+ "sha256": "701574bc7ab74b21c56c38f91d97ceecb8f04fab30bab83a0c5cef7e8103c7d6",
829
+ "files": 7
830
+ },
831
+ "specialists/rel-monuments": {
832
+ "sha256": "f611643d6dafbd2bf1fb2a2a106d47f304e45cc2c56b8e45d03b0255d842d763",
833
+ "files": 7
834
+ },
835
+ "specialists/rel-moons": {
836
+ "sha256": "1a8d7684d39d14f24f991eb98c845297327897725ba2033b8beecabf518797ee",
837
+ "files": 7
838
+ },
839
+ "specialists/rel-mountains": {
840
+ "sha256": "d300ef909811e4ae2f50193cc48902dcfb1698dfa3b6146a0e00a3e6d1834764",
841
+ "files": 8
842
+ },
843
+ "specialists/rel-museums": {
844
+ "sha256": "4911f8d7c96a805d179b9df6135e12465505f8380ab6b005dbeaee70b5f0247f",
845
+ "files": 8
846
+ },
847
+ "specialists/rel-musicians": {
848
+ "sha256": "bc5f3a1ca2d92da54a653cfb9a3e6f3d1c2b9dfe7ece6346e30b4b0b9ee4f907",
849
+ "files": 7
850
+ },
851
+ "specialists/rel-mythology": {
852
+ "sha256": "5cdd880a0ea4b24df5ca559e589dca77e1e1b6964bd446b7a245cb302e5c365b",
853
+ "files": 7
854
+ },
855
+ "specialists/rel-newspapers": {
856
+ "sha256": "95aa11a1ac5ab8a417e88341e8a45d2b10ec1947b2beeb45efe7ca11df47bc07",
857
+ "files": 7
858
+ },
859
+ "specialists/rel-novelists": {
860
+ "sha256": "b39c6fe5e3ddff538106fc12b44bf952423ecc187f9a8cf9f12455c1b2fbbaea",
861
+ "files": 7
862
+ },
863
+ "specialists/rel-novels": {
864
+ "sha256": "a4b8f79229ff9aca030af4fc4adbb36e2c4f09a9d4bd5de24076391e7b338f9e",
865
+ "files": 8
866
+ },
867
+ "specialists/rel-nurses": {
868
+ "sha256": "4544d9f519a5bfdd1815a8e2a55f97f3c1e5d531e3bf274265ce428b73a6e7f0",
869
+ "files": 7
870
+ },
871
+ "specialists/rel-observatories": {
872
+ "sha256": "1071d6283696980ab1cf1c7946dda1dff4dc6b797bbdeb1546a26a6a14549869",
873
+ "files": 7
874
+ },
875
+ "specialists/rel-operas": {
876
+ "sha256": "29e188da5526917011bf8c5c098fe6b7d1a3e80de6390e8f3d7f208d5c312ca5",
877
+ "files": 8
878
+ },
879
+ "specialists/rel-organisations": {
880
+ "sha256": "d9089a0cf4f906878b29182d8e37eac4490fc09348eecf5f16c6e705a11ba33d",
881
+ "files": 8
882
+ },
883
+ "specialists/rel-painters": {
884
+ "sha256": "75cb8fc5278bec2b96de456d1194258fb1da833655eab77bf10a70fbf0427b75",
885
+ "files": 8
886
+ },
887
+ "specialists/rel-paintings": {
888
+ "sha256": "16c9088861b395a971ac920f5e77dfefc6a69bf99485721588f1530bb57fc628",
889
+ "files": 8
890
+ },
891
+ "specialists/rel-parks": {
892
+ "sha256": "ca33388f09a2b38097dfdbef5dd899bbf36721566545838279ccf8bb1a8074f8",
893
+ "files": 7
894
+ },
895
+ "specialists/rel-parties": {
896
+ "sha256": "9f0a12993d4601bb47ec06d8ec97f04c68d0b96f4f507ae356fb58f2dbea465e",
897
+ "files": 7
898
+ },
899
+ "specialists/rel-pharmacists": {
900
+ "sha256": "340f31fb64fed582db61ab873eeeffe4a06c9990011be2a021062fc69d20df67",
901
+ "files": 7
902
+ },
903
+ "specialists/rel-philosophers": {
904
+ "sha256": "f1603c6cd2433c36be0d43b066af9712e642de1224e0fb653c84061d3c6c4920",
905
+ "files": 8
906
+ },
907
+ "specialists/rel-photographers": {
908
+ "sha256": "bb78a17a208eb7f320ed3cf6e7ce288fbd504f14a6fddcf9b765ad723e59ca9d",
909
+ "files": 7
910
+ },
911
+ "specialists/rel-physicians": {
912
+ "sha256": "7c59128f951efc1ff71e5f48cd40ba04e9a82b6c07c405b18198b59b5af26bfe",
913
+ "files": 7
914
+ },
915
+ "specialists/rel-physicists": {
916
+ "sha256": "c7968132233d2b2f9b6562d92f7ddec84514fe7df861b5c3e99ed07155796526",
917
+ "files": 7
918
+ },
919
+ "specialists/rel-planets": {
920
+ "sha256": "e376ea62c8494cfa9f1d72c8ccbc3d3140265c9c7cf0c5edb1d5f044777ecc3e",
921
+ "files": 7
922
+ },
923
+ "specialists/rel-playwrights": {
924
+ "sha256": "66d8af86ec6e9afa791fa58f961f8e128854ba69de5fdbb66ebeea8fe36a303d",
925
+ "files": 7
926
+ },
927
+ "specialists/rel-poems": {
928
+ "sha256": "f1c3faeb97874b50356216ce700524b04d951f3bf0199773d303020c9cab5541",
929
+ "files": 7
930
+ },
931
+ "specialists/rel-poets": {
932
+ "sha256": "7b1da9e53e2777d33017333fd41a9f2d7746e42a6c5b3025c20a12243cfe7005",
933
+ "files": 7
934
+ },
935
+ "specialists/rel-police": {
936
+ "sha256": "48e51ce84a4bbcdf691deb4957723a6e0f820fc38ff0cc02675471be406b0537",
937
+ "files": 7
938
+ },
939
+ "specialists/rel-politicians": {
940
+ "sha256": "cd47b4099994c03f4c9c94dcb9bebecd8bc7e4a029643798b0d275df2fa2948e",
941
+ "files": 8
942
+ },
943
+ "specialists/rel-printmakers": {
944
+ "sha256": "7f06a971bf5082030c892b31443414f496995d5ccb15a2577dcdd3acdbfc3139",
945
+ "files": 7
946
+ },
947
+ "specialists/rel-psychologists": {
948
+ "sha256": "ea8eae6c8c0764b5122aa4fc818e4768478592f6b02e2f4cc5fcceeba4de254b",
949
+ "files": 7
950
+ },
951
+ "specialists/rel-racketsports": {
952
+ "sha256": "838c495f22fc6af5616c01587cceba530aaaa4357c77ebdb1feb23c33e74ad97",
953
+ "files": 7
954
+ },
955
+ "specialists/rel-religions": {
956
+ "sha256": "2a9010b3010abe5f1f2b4fa09edec6ff9fd6aece86fb069b9dc70fd9d2eae22b",
957
+ "files": 7
958
+ },
959
+ "specialists/rel-rivers": {
960
+ "sha256": "6b3aecaeacc410f023c9e6624cecd8d75c6c594fec768b64ee2791c22e59195d",
961
+ "files": 7
962
+ },
963
+ "specialists/rel-rowers": {
964
+ "sha256": "c510f97c0fe835dbf17e0bbf4b23d00e1c8e2cb098a766f3f72d16df3f35ba24",
965
+ "files": 7
966
+ },
967
+ "specialists/rel-rugby": {
968
+ "sha256": "6c5917549941cce449ceebae9aa7fa577d630aa76a236f9a5cae27943c31eefa",
969
+ "files": 7
970
+ },
971
+ "specialists/rel-sculptors": {
972
+ "sha256": "a8e4e840ef6bdf6b29a0531551ef70e3fd2f46f4fcd6ee93f67ee90d29a1c6e4",
973
+ "files": 7
974
+ },
975
+ "specialists/rel-sculptures": {
976
+ "sha256": "dbc7669363f77b507e1a8cdd96d5839a448be42adb1130975e7e29a2448e5dd8",
977
+ "files": 7
978
+ },
979
+ "specialists/rel-ships": {
980
+ "sha256": "511520e5bed4f002e4aaa537de028d2f28a3eb4f78ef4480e7e307a5ca4fc3be",
981
+ "files": 8
982
+ },
983
+ "specialists/rel-shooters": {
984
+ "sha256": "29f6d3fc50bd60d80bc2f14100e49dd42db7c4e081fc01632bb73bc556991afe",
985
+ "files": 7
986
+ },
987
+ "specialists/rel-singers": {
988
+ "sha256": "f6441ad65e08bfbca93614fcf88cc4e2293fc2578c5b9f63aeb3a80458c0ae4f",
989
+ "files": 8
990
+ },
991
+ "specialists/rel-skaters": {
992
+ "sha256": "01b47325741aaffc4f290b8ef480be3314ba4aa4d2593f01ff79d54eef6fb687",
993
+ "files": 7
994
+ },
995
+ "specialists/rel-skiers": {
996
+ "sha256": "153c984b861bf22c4defb1036461cdda906b1c37a595c59a38353eb3eb495480",
997
+ "files": 7
998
+ },
999
+ "specialists/rel-skyscrapers": {
1000
+ "sha256": "7fdbc10b6514536caaf03d3d9aef367aebb75f63dd3899be773481f1a1ce7900",
1001
+ "files": 7
1002
+ },
1003
+ "specialists/rel-snooker": {
1004
+ "sha256": "c6f96d9e9608f01f58048033179210e6f18f8db650ca3729fe8fa078c9de6c4a",
1005
+ "files": 7
1006
+ },
1007
+ "specialists/rel-software": {
1008
+ "sha256": "ce2d3cf68062b42a5ba8b0802c6646058df162306b0955e72a5ba29194bb5dd9",
1009
+ "files": 7
1010
+ },
1011
+ "specialists/rel-songs": {
1012
+ "sha256": "cc5417c3dc1cc3d3a7bc6dffceb9f6d5b2b3fac466c4ddded9634f8ccf36cfa3",
1013
+ "files": 8
1014
+ },
1015
+ "specialists/rel-spacecraft": {
1016
+ "sha256": "e60b7516ac6ca848c688c1f68ca2081def7371b231c8317276884fee4c9a8820",
1017
+ "files": 7
1018
+ },
1019
+ "specialists/rel-speedskaters": {
1020
+ "sha256": "23d62e9f14f51e5666f530c341eacca5db7cf217149f874a88a2b143a2d241f0",
1021
+ "files": 7
1022
+ },
1023
+ "specialists/rel-spies": {
1024
+ "sha256": "d20f6ef2f652cb4509f449deef088f93b9c40c72bb5db14d60e33d553587a2cd",
1025
+ "files": 7
1026
+ },
1027
+ "specialists/rel-sportsevents": {
1028
+ "sha256": "dc0ff64f3a8198b528f97e4f0904bc32d57267892855d4eec3090a3b44dc5d5f",
1029
+ "files": 7
1030
+ },
1031
+ "specialists/rel-sportsteams": {
1032
+ "sha256": "8e5ec70c11be3aed82035d9e795e36ece07146f1315751ea9fcec579cbbfc686",
1033
+ "files": 7
1034
+ },
1035
+ "specialists/rel-stadiums": {
1036
+ "sha256": "a6921371c0c7bd6fb36dbb260b0df590138ad46e573394f391f9bd9ad35abf0f",
1037
+ "files": 7
1038
+ },
1039
+ "specialists/rel-stations": {
1040
+ "sha256": "7866fd03c4f16a321bc1f0f8c3bd4ae48238a7e5f21c7d04941272f7d4c440d3",
1041
+ "files": 7
1042
+ },
1043
+ "specialists/rel-statisticians": {
1044
+ "sha256": "76ca6babfb634212ae059a74f154c3fd6daf1d1aac1c98789fa64cf730d9993d",
1045
+ "files": 7
1046
+ },
1047
+ "specialists/rel-swimmers": {
1048
+ "sha256": "c22117266691d17b14b5d870762f763e1fe6ad4633d08fd8f6b4d573bac215ca",
1049
+ "files": 7
1050
+ },
1051
+ "specialists/rel-temples": {
1052
+ "sha256": "b541f2792e9e01fb0e489cecc75d9b5367c7c0d0f46ce03cd03d81244745db8c",
1053
+ "files": 7
1054
+ },
1055
+ "specialists/rel-tennis": {
1056
+ "sha256": "521d487542938f99097b9bbeea818e657c8aebd119c4e0b9aca6dbaac0d36674",
1057
+ "files": 7
1058
+ },
1059
+ "specialists/rel-theatres": {
1060
+ "sha256": "1d1a190b50f411513f02cb722f11b6f4af313180965d7578cdd4f8a7d10ed981",
1061
+ "files": 7
1062
+ },
1063
+ "specialists/rel-themeparks": {
1064
+ "sha256": "05504903e2f7d08ffde81e266e23df3ccb9dd49b2b62778c1b13a6faa022d550",
1065
+ "files": 7
1066
+ },
1067
+ "specialists/rel-theologians": {
1068
+ "sha256": "20ac3972bbf86bda3a30eebb583f3fb9167b5867d2ce4d3bb9caae1352d0dff0",
1069
+ "files": 7
1070
+ },
1071
+ "specialists/rel-tradeunionists": {
1072
+ "sha256": "45362aba3686c554fabe6ffc64c049dda9ab67e4f09ad3091215e58e40036cf5",
1073
+ "files": 7
1074
+ },
1075
+ "specialists/rel-translators": {
1076
+ "sha256": "35e5399bcacfa55d934779cf7ac302d76fb936b689ec06ae6c7afcc0f9172f1e",
1077
+ "files": 7
1078
+ },
1079
+ "specialists/rel-triathletes": {
1080
+ "sha256": "49096909d2b0d008e49a197525e55ec0ce11d75cf71d3bc05d0f37b9783ec5ae",
1081
+ "files": 7
1082
+ },
1083
+ "specialists/rel-tvproducers": {
1084
+ "sha256": "2abcbc61f8bed6170712577303cf46e62afb95d8e03e85a6882c3c3a8ba0edc9",
1085
+ "files": 7
1086
+ },
1087
+ "specialists/rel-tvseries-v2": {
1088
+ "sha256": "77cf98ad66bd4ca48ca85943f5c882a4542203f16bac999d55151c63846d7025",
1089
+ "files": 9
1090
+ },
1091
+ "specialists/rel-universities": {
1092
+ "sha256": "2510d9d003c1e7d603b065d746e341e604705b4e90d26734bb1734db5316f9af",
1093
+ "files": 7
1094
+ },
1095
+ "specialists/rel-videogames": {
1096
+ "sha256": "82619d9498cbeb235331a73f02c4e06bff2e7fa342881897572ab60c6a94688a",
1097
+ "files": 7
1098
+ },
1099
+ "specialists/rel-volleyball": {
1100
+ "sha256": "6e6fb9b90e50721338be6377df19fce8bd8d3dbdca1fdce6fe679a8893df5ed6",
1101
+ "files": 7
1102
+ },
1103
+ "specialists/rel-wars": {
1104
+ "sha256": "3ed991f4c8b9f23334647e13f4132e5eec541d54d1beced35834e955f241ae9f",
1105
+ "files": 7
1106
+ },
1107
+ "specialists/rel-waterpolo": {
1108
+ "sha256": "316111a529a8265b3047506eea793676084c3cb1a1c6c7655c88cf430b5ee64d",
1109
+ "files": 7
1110
+ },
1111
+ "specialists/rel-youtubers": {
1112
+ "sha256": "efba4c3d1fb5e7f8f9869fa0919a83eac5ee8f7a3b262d74db71b965e8055ae9",
1113
+ "files": 7
1114
+ },
1115
+ "specialists/renewables": {
1116
+ "sha256": "3e0b86a27cbfad6da5b373bd1198fbb757c2134221cd245006d737bcfbf0355d",
1117
+ "files": 8
1118
+ },
1119
+ "specialists/retail": {
1120
+ "sha256": "c94b6e73f60ad616d19187fe50f3ea81189b49bbaf5d8d6a68e620155fd81e17",
1121
+ "files": 7
1122
+ },
1123
+ "specialists/robotics-v2": {
1124
+ "sha256": "59ce39c28c72c2eb5b5afada758b45752a8721f2b997f81f9ea012bb3e14fe1e",
1125
+ "files": 9
1126
+ },
1127
+ "specialists/safety": {
1128
+ "sha256": "387631c63c91f42d05356f3ff4721a137981b77212c72e1eb5c3de64c1271c3b",
1129
+ "files": 6
1130
+ },
1131
+ "specialists/seismology": {
1132
+ "sha256": "6af36c14e4f9a6aee48bec7485f3dbe5f99909a3027be2622e9b4d3fa8f5c21b",
1133
+ "files": 8
1134
+ },
1135
+ "specialists/sociology": {
1136
+ "sha256": "b072aa03f2975aadad28fd7b0922ea4477c5506a7547abefe88c504ea07e7a47",
1137
+ "files": 10
1138
+ },
1139
+ "specialists/soil": {
1140
+ "sha256": "15e98ce12978b06259ca0b201755c00011a5f63d65a8c6ab33d10ff576ee5a95",
1141
+ "files": 8
1142
+ },
1143
+ "specialists/soil-r2": {
1144
+ "sha256": "640c83136e49d022eb15185667ab85aee534b02fc284a0650c64aea2bd24817e",
1145
+ "files": 7
1146
+ },
1147
+ "specialists/spacecomms": {
1148
+ "sha256": "dea586cd9ba7b0838c655a6abfd6ca1abd9d7eddb942a3daf7bb4cabc9f8a3ae",
1149
+ "files": 7
1150
+ },
1151
+ "specialists/spacecraft": {
1152
+ "sha256": "01b8b0ef55faa9ec6588a0ae206d9c775c4849da96d9186c913c8837cfb6f043",
1153
+ "files": 8
1154
+ },
1155
+ "specialists/sports": {
1156
+ "sha256": "7e24a125743bfab2b7959561564bcc13d3aed4ad19d325bfcfc3fd2ea19230cf",
1157
+ "files": 8
1158
+ },
1159
+ "specialists/springs": {
1160
+ "sha256": "f12cf342d028806ff93fe9f146cd2a1f8d383283695b38549b3c33fe5cb5247f",
1161
+ "files": 8
1162
+ },
1163
+ "specialists/sql": {
1164
+ "sha256": "ff5aa630476ab4c3523737c54952b94b2007c943fe7b90648107a8e162aee1bd",
1165
+ "files": 6
1166
+ },
1167
+ "specialists/statistics": {
1168
+ "sha256": "5448df943eaa687ec381deca697e3907d1910ceaa770cc30a8c02fb72d8e0913",
1169
+ "files": 7
1170
+ },
1171
+ "specialists/statistics-v2": {
1172
+ "sha256": "96a20825e3c70bc795945d5996dac2f21c3a181fb368821e83daabdd3e4b98c4",
1173
+ "files": 7
1174
+ },
1175
+ "specialists/statistics-v3": {
1176
+ "sha256": "88be2300583637eefdd14815a85fda4e0ac72d836b7cb48eb9d342cd84dbccb8",
1177
+ "files": 8
1178
+ },
1179
+ "specialists/thermo": {
1180
+ "sha256": "b92ad90fb4bca6d3e8eee4a36c3bb3d3499ab1c2ef84061f4783029f966a6602",
1181
+ "files": 6
1182
+ },
1183
+ "specialists/units": {
1184
+ "sha256": "20140ff7585313840468cdf3eca54355fab59d5c1313ae14ec37b21f8ae9fad4",
1185
+ "files": 7
1186
+ },
1187
+ "specialists/units-v2": {
1188
+ "sha256": "fdf2c8fd200c97508cc130b209a3f065fd3fe1f65c4254a3c48fc7891dce0c10",
1189
+ "files": 8
1190
+ },
1191
+ "specialists/units-v3": {
1192
+ "sha256": "f70b4d8d0c8c44295f373b693364194892084991c104465a0559a19a700cebad",
1193
+ "files": 9
1194
+ },
1195
+ "specialists/units-v3-r2": {
1196
+ "sha256": "86420f3c59b4e967b58c2f91dc8fdc2709ee3105947af839ae75553f66f885e7",
1197
+ "files": 13
1198
+ },
1199
+ "specialists/ushistory": {
1200
+ "sha256": "490526165f1b73b83ca15639af33b24e9601ec13d42c8652012efdc78e10e383",
1201
+ "files": 8
1202
+ },
1203
+ "specialists/warehouse": {
1204
+ "sha256": "8190fff2c6be02b5fb955df4f3bbaf8de35c75da260f83e041a3e6cb17a2ce17",
1205
+ "files": 8
1206
+ },
1207
+ "specialists/warehouse-r2": {
1208
+ "sha256": "8c1573c565ea4ba16970c319182bed17cc743baaa78a13e8c14c5cebd75d59e6",
1209
+ "files": 10
1210
+ },
1211
+ "specialists/water": {
1212
+ "sha256": "2361c83b7727d6b3278de13de173156f879db5592583be404a31b1723acc8998",
1213
+ "files": 7
1214
+ },
1215
+ "specialists/water-r3": {
1216
+ "sha256": "c9ec2b8be5326cc0bdd730ac382a23849ad4d976e44529c1ec8add1767971ce4",
1217
+ "files": 8
1218
+ },
1219
+ "specialists/wildlife": {
1220
+ "sha256": "643d940428a61215b4e1c20a90ee637681d318eb983ac2d873fa76cf0f8e57bf",
1221
+ "files": 8
1222
+ },
1223
+ "specialists/wiring": {
1224
+ "sha256": "2b04aeedfd914dddfa83139c32b59a3a43353f8f1b4eec90b0a9b3d958480c3d",
1225
+ "files": 7
1226
+ },
1227
+ "specialists/woodworking": {
1228
+ "sha256": "56ecadf3bb7c0116ccfd82bbaf60a0bbeececcd66e7db327d2516197243a0d5b",
1229
+ "files": 8
1230
+ },
1231
+ "specialists/worldhistory": {
1232
+ "sha256": "5b977e269d66669c9cb2aafad2e4782f709863553d9670e3113dd8fb53662c02",
1233
+ "files": 9
1234
+ },
1235
+ "core/admitted": {
1236
+ "sha256": "7771dbeabd010f8bc664ff367dc6b51015a8e3b20870fd1790f04f3a46098585",
1237
+ "files": 341
1238
+ },
1239
+ "workbench": {
1240
+ "sha256": "c9c21bebfb4ecf34fa0b598eb411b2a20d735f1b0e6277381fbf018f4b38c75f",
1241
+ "files": 150
1242
+ },
1243
+ "oracle7.py": {
1244
+ "sha256": "9d68865540b23122e0020c0b8ee52471a71a3dfa8e3572b23b961ea4b3bf920e",
1245
+ "files": 1
1246
+ },
1247
+ "PACK_MANIFEST.json": {
1248
+ "sha256": "1890ae3b3b754d901bf1cf552688eee5bc8acad8a148f08eadfb9fd6a614b132",
1249
+ "files": 1
1250
+ }
1251
+ },
1252
+ "recipe": "(the same code ships in workbench/verify.py, so users recompute it on their own install):\n part hash = SHA-256 over, for every file under the part's directory in byte-sorted relative POSIX path order (skipping\n __pycache__, *.pyc, verdict-free runtime state), the UTF-8 path, a NUL, the file's own SHA-256 (32 bytes)\n - files the download ships zstd-packed are hashed as their unpacked bytes (the PACK_MANIFEST sha256)\n leaf = SHA-256(UTF-8 \"oracle7-part:\" + name + \":\" + part hash hex)\n root = binary Merkle tree over the leaves in name order; a level with an odd count carries its last node up\n unchanged; a parent is SHA-256(left || right) of the raw 32-byte digests\nParts: every specialist directory (specialists/<dir>), the specialists' gate tools, the admitted fold chain, the workbench,\nthe launcher. Stores are covered by PACK_MANIFEST.json, whose own hash is a part.",
1253
+ "anchor": {
1254
+ "chain": "solana-mainnet",
1255
+ "program": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",
1256
+ "memo": "Oracle7 release w548 3.1, 2026-10-17. oracle7 merkle c4c1edb342b54fe5faf7fdf775d27bf72d351ea0481d246c648a2e92b5269050. oracle7-slim merkle 732358ed179adc00f0404dc7ecb1fe7e11484699559f6c772a1c578b002288da. Recipe: RELEASE_HASHES.json in each repository.",
1257
+ "signature": "4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3",
1258
+ "block_time_utc": "2026-10-18T02:51:28Z",
1259
+ "slot": 458275075,
1260
+ "explorer": "https://explorer.solana.com/tx/4kW4S5V4kHsFKGcxWBn37jPD73nGP17aF8eF9yPv8dEkwzTbWksvYaej2VkiUPMQ9PVdN92mmve4tAqgsr6RZ7s3"
1261
+ },
1262
+ "supersedes": {
1263
+ "merkle_root": "0575c9b78f6dcc0a48ee57e6dc63d3e1a46afc13d2c9d9d4503db6c784564ed2",
1264
+ "anchor_signature": "WNEdPhKJZYCh3ZKe7X8zhVehuyskEnKuDbde86W1XdKdBC9izVAJTzbrewtSUQ8keQvT1rZUBumCGnGxjDXyVgU",
1265
+ "reason": "release 3.1 (17 October 2026): fold composition - specialist network v6 composes operations learned from the specialists' own exams (w549); the specialist answers after a check stops a route that could not know (w548); 3.1 correctness rules from the research record's re-examination and composition rounds (w547); the Workbench's worked example is the habitable-zone specialist; release gate: sealed test 22."
1266
+ }
1267
+ }
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/HEAD_MANIFEST.json CHANGED
@@ -1,6 +1,13 @@
1
  {
2
- "built_ts": "2026-10-18T01:41:40Z",
3
  "chain_tip_to_base": [
 
 
 
 
 
 
 
4
  "oracle_release_runtime_w548",
5
  "oracle_release_runtime_w547",
6
  "oracle_release_runtime_w550",
@@ -351,5 +358,5 @@
351
  "oracle_release_runtime_w3"
352
  ],
353
  "schema_version": "oracle-head-manifest-v1",
354
- "tip": "oracle_release_runtime_w548"
355
  }
 
1
  {
2
+ "built_ts": "2026-10-19T15:34:05Z",
3
  "chain_tip_to_base": [
4
+ "oracle_release_runtime_w558",
5
+ "oracle_release_runtime_w557",
6
+ "oracle_release_runtime_w556",
7
+ "oracle_release_runtime_w423",
8
+ "oracle_release_runtime_w555",
9
+ "oracle_release_runtime_w554",
10
+ "oracle_release_runtime_w551",
11
  "oracle_release_runtime_w548",
12
  "oracle_release_runtime_w547",
13
  "oracle_release_runtime_w550",
 
358
  "oracle_release_runtime_w3"
359
  ],
360
  "schema_version": "oracle-head-manifest-v1",
361
+ "tip": "oracle_release_runtime_w558"
362
  }
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w423.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w423 - POTENTIALS fold (epoch 98): the typed space of the possible.
3
+
4
+ 30 potentials bound from live sources: the self-model's declared gaps, the
5
+ human-signed target-shape distances, pending fold families, unmapped induced templates
6
+ (residuals naming missing capabilities), and refused candidates whose lessons are
7
+ encoded. A potential CONVERTS to an actual when a fold family admits - the conversion
8
+ rate across epochs is the measurable throughput of self-improvement.
9
+ Authored 2026-10-18 16:44 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w555."""
10
+
11
+ from __future__ import annotations
12
+
13
+ import re
14
+
15
+ from oracle_release_runtime_w555 import OracleReleaseRuntimeW555
16
+
17
+ POTENTIALS = [{'kind': 'instrument_missing', 'name': 'declared_implications_closed: build the measure (a route that declares an implication supplies it; )'}, {'kind': 'instrument_missing', 'name': 'panel_guard_rate: build the measure (an instrument a mutant can pass is not measuring w)'}, {'kind': 'instrument_missing', 'name': 'routes_graded: build the measure (ten of twenty eight routes are wholly ungraded, an)'}, {'kind': 'shape_distance', 'name': 'continuity 230 -> 260'}, {'kind': 'shape_distance', 'name': 'grounding_cited 0.4905 -> 0.75'}, {'kind': 'shape_distance', 'name': 'thread_depth 1.89 -> 4.0'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_isa_derived missing complements'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_isa_direct missing complements'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_partof_derived missing complements'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_partof_direct missing complements'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_isa_derived missing mediated_by'}, {'kind': 'declared_gap', 'name': 'route:conceptnet_isa_direct missing mediated_by'}, {'kind': 'declared_gap', 'name': 'panel:stage5m30_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'panel:stage5m31_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'panel:stage5m32_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'panel:stage5m33_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'panel:stage5m34_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'panel:stage5m35_oneshot_report_v1 unguarded vs STRIP_CITATIONS, DENY_P'}, {'kind': 'declared_gap', 'name': 'act:continue_topic'}, {'kind': 'declared_gap', 'name': 'act:refine'}, {'kind': 'declared_gap', 'name': 'capability:list_n'}, {'kind': 'declared_gap', 'name': 'capability:multi_step'}, {'kind': 'declared_gap', 'name': 'capability:timeline'}, {'kind': 'declared_gap', 'name': 'capability:what_if'}, {'kind': 'vessel', 'name': "vessel v259928 w=32042074008.0: You've reached Oracle7, an AI assistant | lacks bounds"}, {'kind': 'vessel', 'name': 'vessel v0163 w=3704609090.0: where are you going ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0145 w=3645804780.0: what do you believe ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0096 w=2147441940.0: what have you seen out there ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0099 w=2129776350.0: what do you make of this place ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0098 w=5506062.0: what will you make next ? | lacks bounds'}]
18
+
19
+ POT_RX = re.compile(
20
+ r"(what (?:could|can) you (?:learn|become)|what are your potentials"
21
+ r"|what is potentially possible|what might you become)", re.I)
22
+
23
+
24
+ class OracleReleaseRuntimeW423(OracleReleaseRuntimeW555):
25
+ """Base + the potentials route."""
26
+
27
+ def chat(self, text: str, session_id: str = "default") -> dict:
28
+ s = " ".join(str(text).strip().split())
29
+ if POT_RX.search(s):
30
+ bits = "; ".join(f"{p['kind']}: {p['name']}" for p in POTENTIALS[:6])
31
+ return {"status": "answered", "path": "worker:potentials",
32
+ "response": f"By my own ledgers, {len(POTENTIALS)} typed "
33
+ f"potentials stand open, among them {bits}. Each "
34
+ f"converts to an actual only through the gate. "
35
+ f"[potentials_epoch_98]",
36
+ "provenance": {"kind": "potentials_ledger", "epoch": 98,
37
+ "count": len(POTENTIALS)},
38
+ "latency_ms": 1}
39
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w551.py ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w551 - CORRECTNESS RELEASE (3.2): THE PROVED CROSS-CHECK.
3
+
4
+ veri7vn (github.com/emberian/veri7vn, CC0, by ember arlynx; our fork github.com/psiloceyeben/veri7vn) re-implements 117 of
5
+ Oracle7's released specialists as kernels written and proved in Isabelle/HOL, exported to Standard ML and compiled with
6
+ MLton. Each kernel answers by the answerer contract (one JSON line in, one out) and names the theorems its answer rests on.
7
+ On the research box, over the released specialists' own held-out exams (6,444 questions), the kernels and the Python
8
+ specialists gave the same answer value on every question both answered, apart from display rounding (the kernels round
9
+ exact rationals; a Python float can store 0.675 as 0.67499...).
10
+
11
+ After the parent turn, when the reply came from ONE named specialist (path "specialist:<id>") that has a kernel:
12
+ - the kernel is asked the same question;
13
+ - it agrees (same Yes/No opening, and the first stand-alone number equal within one unit of the reply's last shown
14
+ decimal or 0.5%) -> the reply is UNCHANGED, byte for byte; its path gains ">proved:<session>" and the reply carries
15
+ "proved": {kernel, session, theorems};
16
+ - it gives a different answer -> the reply is withheld, and says a proved check disagreed;
17
+ - it declines, errors, times out, or there is no kernel or no Linux x86-64 to run it on -> the reply is unchanged.
18
+ So the fold can only add a mark of proof, or withhold an answer a proved kernel contradicts. Kernels are static Linux
19
+ x86-64 binaries under specialists/_proved/bin (SHA256SUMS, PROVED.json: source commit, licence, specialist map)."""
20
+ from __future__ import annotations
21
+
22
+ import json
23
+ import os
24
+ import platform
25
+ import re
26
+ import shutil
27
+ import subprocess
28
+ import threading
29
+
30
+ from oracle_release_runtime_w548 import OracleReleaseRuntimeW548 as _Base
31
+
32
+ PROVED = __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "/specialists/_proved"
33
+ NUM = re.compile(r"(?<![A-Za-z_\d.])-?\d[\d,]*(?:\.\d+)?")
34
+ YESNO = re.compile(r"^\W*(yes|no)\b", re.I)
35
+ SPEC = re.compile(r"\bspecialist:([a-z0-9][a-z0-9-]*)")
36
+ TIMEOUT_S = 5.0
37
+ _LOCK = threading.Lock()
38
+ _PROCS: dict = {}
39
+ _MAP: dict = {}
40
+
41
+
42
+ def _load_map():
43
+ if not _MAP:
44
+ try:
45
+ m = json.load(open(os.path.join(PROVED, "PROVED.json"), encoding="utf-8"))
46
+ _MAP.update(m.get("specialists", {}))
47
+ _MAP["__ok__"] = True
48
+ except (OSError, ValueError):
49
+ _MAP["__ok__"] = False
50
+ return _MAP
51
+
52
+
53
+ def _runnable(binary):
54
+ """the kernel binary, made executable in the state folder if the download lost its mode bit"""
55
+ p = os.path.join(PROVED, "bin", binary)
56
+ if not os.path.isfile(p):
57
+ return None
58
+ if os.access(p, os.X_OK):
59
+ return p
60
+ d = os.path.join(os.environ.get("ORACLE7_STATE", os.path.expanduser("~/.oracle7")), "proved_bin")
61
+ os.makedirs(d, exist_ok=True)
62
+ q = os.path.join(d, binary)
63
+ if not os.path.isfile(q) or os.path.getsize(q) != os.path.getsize(p):
64
+ shutil.copyfile(p, q)
65
+ os.chmod(q, 0o755)
66
+ return q
67
+
68
+
69
+ def _ask(sid, text):
70
+ """one question to the kernel standing in for specialist sid; None when there is no answer to compare"""
71
+ if platform.system() != "Linux" or platform.machine() not in ("x86_64", "AMD64"):
72
+ return None
73
+ m = _load_map()
74
+ ent = m.get(sid) if m.get("__ok__") else None
75
+ if not ent:
76
+ return None
77
+ key = (ent["binary"], sid if ent.get("flag", True) else "")
78
+ with _LOCK:
79
+ p = _PROCS.get(key)
80
+ if p is None or p.poll() is not None:
81
+ exe = _runnable(ent["binary"])
82
+ if not exe:
83
+ return None
84
+ argv = [exe] + (["--specialist", sid] if ent.get("flag", True) else [])
85
+ try:
86
+ p = subprocess.Popen(argv, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, text=True, bufsize=1)
87
+ except OSError:
88
+ return None
89
+ _PROCS[key] = p
90
+ try:
91
+ p.stdin.write(json.dumps({"id": "w551", "q": text}) + "\n")
92
+ p.stdin.flush()
93
+ out = [None]
94
+ t = threading.Thread(target=lambda: out.__setitem__(0, p.stdout.readline()))
95
+ t.start()
96
+ t.join(TIMEOUT_S)
97
+ if t.is_alive() or not out[0]:
98
+ p.kill()
99
+ _PROCS.pop(key, None)
100
+ return None
101
+ return json.loads(out[0])
102
+ except (OSError, ValueError, BrokenPipeError):
103
+ _PROCS.pop(key, None)
104
+ return None
105
+
106
+
107
+ def _first(text):
108
+ m = NUM.search(str(text or ""))
109
+ if not m:
110
+ return None, None
111
+ s = m.group(0).replace(",", "")
112
+ try:
113
+ return float(s), (len(s.split(".")[1]) if "." in s else 0)
114
+ except ValueError:
115
+ return None, None
116
+
117
+
118
+ def agrees(reply_text, kernel_text):
119
+ """same Yes/No opening (if either opens with one) and the same first stand-alone number within display rounding"""
120
+ a, b = YESNO.match(str(reply_text or "")), YESNO.match(str(kernel_text or ""))
121
+ if (a or b) and not (a and b and a.group(1).lower() == b.group(1).lower()):
122
+ return False
123
+ x, dx = _first(reply_text)
124
+ y, _ = _first(kernel_text)
125
+ if x is None or y is None:
126
+ return (x is None) == (y is None)
127
+ return abs(x - y) <= max(10 ** -dx, 0.005 * max(abs(x), abs(y)), 1e-12)
128
+
129
+
130
+ class OracleReleaseRuntimeW551(_Base):
131
+ def chat(self, text: str, session_id: str = "default") -> dict:
132
+ r = super().chat(text, session_id)
133
+ if not isinstance(r, dict) or r.get("status") != "answered":
134
+ return r
135
+ path = str(r.get("path", ""))
136
+ ids = SPEC.findall(path)
137
+ if len(set(ids)) != 1 or path.startswith("network"):
138
+ return r # one named specialist only; chained network answers are not checked here
139
+ k = _ask(ids[0], text)
140
+ if not k or k.get("status") != "answered" or not k.get("response"):
141
+ return r
142
+ prov = k.get("provenance") or {}
143
+ if agrees(r.get("response", ""), k.get("response", "")):
144
+ out = dict(r)
145
+ out["path"] = path + ">proved:" + str(prov.get("session", "veri7vn"))
146
+ out["proved"] = {"kernel": prov.get("kernel"), "session": prov.get("session"), "theorems": prov.get("theorems", []),
147
+ "source": "veri7vn (Isabelle/HOL, CC0, ember arlynx)"}
148
+ return out
149
+ out = dict(r)
150
+ out.update(status="withheld", path="proved_check:disagree>" + path,
151
+ response="A proved check (a veri7vn kernel, verified in Isabelle/HOL) gave a different answer to this question, so I won't give either as the answer.")
152
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w554.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w554 - CAPABILITY RELEASE (3.2, with 3.3's work): THE STAR SPECIALISTS, THEN OWNER-FIRST.
3
+
4
+ w552 and w553 in one fold (submitted together to save a gate cycle; their code is unchanged and runs in the same order, so
5
+ the turn behaves exactly as the w551 -> w552 -> w553 chain whose regression, route and false-yes checks were run):
6
+ 1. STAR SPECIALISTS (w552): when the parent turn did not answer, the four star specialists admitted on 2026-10-18
7
+ (#214 stars, #215 habzone, #216 exoorbits, #217 transits; standing_stars_v1.txt) are asked through the release's own
8
+ combiner; a reply is kept only when exactly one answered it ("rule": "only") and did not decline.
9
+ 2. OWNER-FIRST (w553): when the turn is still not answered, the whole standing family plus the admitted specialists no list
10
+ carried (standing_owner_v1.txt: #18 orbits) is asked; an answer is kept only when one specialist gave it, it is not the
11
+ specialist the parent already stopped, EVERY number the question gives moves it (counterfactual dependence - the test
12
+ that refuses the astronomy reader's "29.8 km/s" for a satellite 400 km above Earth), and, if a number was asked, it gives
13
+ one that is not merely one of the question's own.
14
+ Found by the research record (re-examination E-20261018-0043, together vs alone E-20261018-0033: answers lost when the
15
+ wrong specialist takes a question; #18 orbits admitted but in no standing list). Deliberate declines of a question that is
16
+ itself the problem (private, impossible, future, fictional, a false premise, an unknown place or body, half an answer) stand.
17
+ The fold imports no runtime other than its parent and changes no module state of any other fold."""
18
+ from __future__ import annotations
19
+
20
+ import importlib.util
21
+ import re
22
+ import threading
23
+
24
+ from oracle_release_runtime_w551 import OracleReleaseRuntimeW551 as _Base
25
+
26
+ SPEC_ROOT = __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "/specialists"
27
+ GATE = SPEC_ROOT + "/_gate"
28
+ FAMILY_CODE = GATE + "/combo_runtime_v1.py"
29
+ STAR_STANDING = GATE + "/standing_stars_v1.txt"
30
+ LISTS = ["standing_v2", "standing_new_v1", "standing_new_v2", "standing_new_v3", "standing_new_v4", "standing_new_v5", "standing_stars_v1",
31
+ "standing_owner_v1"]
32
+ STARS_STAND = ("private", "impossible", "future", "fiction", "premise", "unknown_place", "other_body", "half_answer")
33
+ OWNER_STANDS = STARS_STAND + ("identity", "self", "act:")
34
+ SPEC_IN_PATH = re.compile(r"\bspecialist:([a-z0-9][a-z0-9-]*)")
35
+ NUM = re.compile(r"-?\d[\d,]*(?:\.\d+)?")
36
+ NUMQ = re.compile(r"^\s*(how many|how much|how long|how far|how fast|how old|convert|calculate|compute|what is the)\b|\bin [a-z]+\s*\?\s*$", re.I)
37
+ _S: dict = {}
38
+ _LOCK = threading.Lock()
39
+
40
+
41
+ def _load(key, lists):
42
+ with _LOCK:
43
+ if key not in _S:
44
+ spec = importlib.util.spec_from_file_location("o7_combo_runtime_v1_w554_" + key, FAMILY_CODE)
45
+ mod = importlib.util.module_from_spec(spec)
46
+ spec.loader.exec_module(mod)
47
+ ids = []
48
+ for f in lists:
49
+ for s in open("%s/%s.txt" % (GATE, f), encoding="utf-8").read().split():
50
+ ids += [m for m in s.split("+") if m not in ids]
51
+ _S[key] = (mod.Family(["%s/%s/manifest.json" % (SPEC_ROOT, i) for i in ids], ["%s/%s" % (SPEC_ROOT, i) for i in ids]), mod)
52
+ return _S[key]
53
+
54
+
55
+ def _nums(s):
56
+ out = []
57
+ for m in NUM.finditer(str(s or "")):
58
+ try:
59
+ out.append(float(m.group(0).replace(",", "")))
60
+ except ValueError:
61
+ pass
62
+ return out
63
+
64
+
65
+ class OracleReleaseRuntimeW554(_Base):
66
+ def _stars(self, text, session_id, r):
67
+ """w552, unchanged"""
68
+ low = str(r.get("path", "")).lower()
69
+ if any(k in low for k in STARS_STAND):
70
+ return r
71
+ try:
72
+ f = _load("stars", ["standing_stars_v1"])[0].reply(text, "w552" + str(session_id)[:30])
73
+ except Exception: # noqa: BLE001 - a specialist failure never breaks the turn; the parent's reply stands
74
+ return r
75
+ if not f or f.get("status") != "answered":
76
+ return r
77
+ prov = f.get("provenance") or {}
78
+ if (prov.get("trace") or {}).get("rule") != "only" or prov.get("declined"):
79
+ return r
80
+ out = dict(r)
81
+ out.update(status="answered", response=str(f.get("response", "")) + " [%s]" % prov.get("specialist", ""),
82
+ path="specialist_call>" + str(f.get("path", "")), references=f.get("references", []))
83
+ out.pop("why", None)
84
+ return out
85
+
86
+ def _owner(self, text, session_id, r):
87
+ """w553, unchanged"""
88
+ path = str(r.get("path", ""))
89
+ if any(k in path.lower() for k in OWNER_STANDS):
90
+ return r
91
+ consulted = set(SPEC_IN_PATH.findall(path))
92
+ try:
93
+ fam, mod = _load("owner", LISTS)
94
+ with _LOCK:
95
+ chosen, trace = fam._one(text, "w553" + str(session_id)[:30])
96
+ if chosen is None or chosen.get("declined") or chosen.get("status") != "answered":
97
+ return r
98
+ sid = chosen.get("id") or getattr(chosen.get("_organ"), "id", None)
99
+ if not sid or sid in consulted:
100
+ return r
101
+ givens = mod._givens(text)
102
+ if givens and fam._dependence(chosen, text, givens) < len(givens):
103
+ return r
104
+ except Exception: # noqa: BLE001 - a specialist failure never breaks the turn; the parent's reply stands
105
+ return r
106
+ resp = str(chosen.get("response", ""))
107
+ if NUMQ.search(text):
108
+ given = _nums(text)
109
+ if not [v for v in _nums(resp) if not any(abs(v - g) <= 1e-9 * max(1.0, abs(g)) for g in given)]:
110
+ return r
111
+ out = dict(r)
112
+ out.update(status="answered", response=resp + " [%s]" % sid, references=chosen.get("references", []),
113
+ path="owner_first>specialist_call>specialist:%s>%s" % (sid, chosen.get("kind", "")))
114
+ out.pop("why", None)
115
+ return out
116
+
117
+ def chat(self, text: str, session_id: str = "default") -> dict:
118
+ r = super().chat(text, session_id)
119
+ if not isinstance(r, dict) or r.get("status") == "answered":
120
+ return r
121
+ r = self._stars(text, session_id, r)
122
+ if r.get("status") == "answered":
123
+ return r
124
+ return self._owner(text, session_id, r)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w555.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w555 - CORRECTNESS RELEASE (3.2): OWNER-FIRST NEVER OVERRULES A QUESTION THAT IS ITSELF THE PROBLEM.
3
+
4
+ Found by the release-candidate smoke (smoke_compose_reloc_v3, probe "zentar", the published miss of sealed test 20) on
5
+ 2026-10-18, before sealed test 23 ran: asked "How many minutes are in a day on the planet Zentar?", the head rightly withholds
6
+ (precision_guard:Q5_unknown_body - there is no planet Zentar), and w554's owner-first step then answered "1 day is 1440
7
+ minutes" from the units specialist; the same for Tralfamadore. Its list of declines that must stand named "unknown_place"
8
+ and "other_body" but not "unknown_body".
9
+
10
+ Also found then: asked "What is the orbital period of a circular orbit at 200 km altitude around Earth?", the astronomy
11
+ reader answers Earth's own orbital period (365.2 days) - and the proved cross-check marks it, because the kernel reads the
12
+ question the same way (veri7vn proves the computation; its recognizer, which reads the question, is not proved). An
13
+ astronomy answer to a question that names an orbit's altitude is now withheld as the wrong reading, and owner-first may
14
+ answer it from #18 orbits under its numbers test.
15
+
16
+ Narrowing otherwise. Owner-first (w554 step 2) no longer acts when the head's withholding is any of the precision guard's Q rules
17
+ - the rules that say the QUESTION is the problem: an unknown body or place, half an answer, a wrong gravity, paths that
18
+ disagree, not physical, a pronoun or name missing, a bare numeral. Every other turn is w554's, byte for byte; the star
19
+ specialists (w554 step 1) are unchanged. The fold imports no runtime other than its parent and changes no module state of any
20
+ other fold."""
21
+ from __future__ import annotations
22
+
23
+ import re
24
+
25
+ from oracle_release_runtime_w554 import OracleReleaseRuntimeW554 as _Base
26
+
27
+
28
+ def _guard_rule(path):
29
+ p = str(path or "")
30
+ if not p.startswith("precision_guard:"):
31
+ return None
32
+ return p.split(":", 1)[1].split(">")[0].split("|")[0]
33
+
34
+
35
+ ALTITUDE = re.compile(r"\b\d[\d,]*(?:\.\d+)?\s*(?:km|kilomet(?:er|re)s?|miles?)\s+(?:altitude|above|high)\b|\baltitude of\b|\bcircular orbit\b", re.I)
36
+
37
+
38
+ class OracleReleaseRuntimeW555(_Base):
39
+ def _owner(self, text, session_id, r):
40
+ rule = _guard_rule(r.get("path", ""))
41
+ if rule is not None and rule[:1] == "Q":
42
+ return r # the question is the problem: the head's decline stands
43
+ return super()._owner(text, session_id, r)
44
+
45
+ def chat(self, text: str, session_id: str = "default") -> dict:
46
+ r = super().chat(text, session_id)
47
+ # the astronomy readers answer a planet's own figures ("Earth's orbital period is 365.2 Earth days"); a question that
48
+ # names an orbit's altitude asks about a spacecraft's orbit around that body, which #18 orbits computes. The planet
49
+ # figure is withheld as the wrong reading, and owner-first may ask the family (its numbers test applies).
50
+ if isinstance(r, dict) and r.get("status") == "answered" and "specialist:astronomy" in str(r.get("path", "")) and ALTITUDE.search(text):
51
+ held = dict(r, status="withheld", path="reader_guard:planet_figure_for_an_orbit>" + str(r.get("path", "")),
52
+ response="That asks about an orbit at a given altitude, and what I found is the planet's own figure, so I won't give it as the answer.")
53
+ held.pop("proved", None)
54
+ out = self._owner(text, session_id, held)
55
+ return out
56
+ return r
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w556.py ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w556 - CORRECTNESS RELEASE (3.2 full): THREE GUARDS ON ANSWERS THAT HAVE NOTHING UNDER THEM.
3
+
4
+ Found by sealed test 23 on 2026-10-18, which the full 3.2 failed with 3 false yeses against a bar of 2 (slim passed with 1).
5
+ Each guard is a class of error, not an item; sealed 23 is spent and is not the test of this fold.
6
+
7
+ 1. NO STORED FACT WITHOUT GIVENS. w554's owner-first keeps a specialist's answer only when every number the question gives
8
+ moves it. A question that gives no numbers passed that test vacuously: "How old is the president of Antarctica?" was
9
+ answered with the US constitution's minimum age (a stored fact, kind fact_number). With no givens, owner-first may no
10
+ longer hand back a stored fact; computations and a named body's constants still answer (requiring givens for every
11
+ answer was measured first and lost three right escape-velocity answers).
12
+ 2. A NEGATIVE AMOUNT OF SOMETHING THAT CANNOT BE NEGATIVE. "A 100 W bulb runs for -5 hours" was answered 0.5 kWh, the sign
13
+ dropped (slim and full). A question that gives a negative duration, power, energy, mass, volume or count is withheld
14
+ on every route, as the precision guard withholds other questions that are themselves the problem (a Q rule, so
15
+ owner-first never overrules it).
16
+ 3. (MEASURED AND REMOVED) Evidence must name what the question names, aimed at "Who directed City of God?" (answered from a
17
+ sentence about another work) and "In what year did Napoleon visit Neptune?" (answered 1989 from a sentence about
18
+ Voyager 2). Every form of the check measured on the capability panel lost right answers - all names 62, then 21 on the
19
+ fact routes, any name 7 - because relation answers cite the answer's own page, which need not repeat the question's
20
+ names. It is not in this fold; those two sealed-23 failures stay open: disclosed.
21
+ 4. ARITHMETIC IS NOT READ FROM A SENTENCE. "A walker covers 5 km in 60 minutes ... how many minutes does 8 km take?" was
22
+ answered 50 from an unrelated sentence. A question that gives two or more numbers and asks how many/much/long is not
23
+ answered from retrieved text; the specialist network (v6, learned operations) is asked instead, and if it has no
24
+ checked answer the turn is withheld.
25
+
26
+ Every other turn is w555's, byte for byte (guards 1, 2 and 4 only). The fold imports no runtime other than its parent; the network is loaded from
27
+ specialists/_gate under its own module name, as w550 does, and a network failure never costs the parent's reply."""
28
+ from __future__ import annotations
29
+
30
+ import importlib.util
31
+ import re
32
+ import sys
33
+ import threading
34
+
35
+ from oracle_release_runtime_w423 import OracleReleaseRuntimeW423 as _Base
36
+
37
+ SPEC_ROOT = __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "/specialists"
38
+ GATE = SPEC_ROOT + "/_gate"
39
+ NET6_CODE = GATE + "/network_v6.py"
40
+ NET_STANDING = GATE + "/standing_net_v6.txt"
41
+
42
+ NUM = re.compile(r"\d[\d,]*(?:\.\d+)?")
43
+ NONNEG = (r"hours?|hrs?|minutes?|mins?|seconds?|secs?|days?|weeks?|months?|years?|watts?|W|kW|MW|kilowatts?|kWh|MWh|Wh|joules?|J|"
44
+ r"kg|kilograms?|grams?|g|mg|pounds?|lbs?|tonnes?|tons?|litres?|liters?|L|mL|millilit(?:er|re)s?|gallons?|"
45
+ r"people|persons?|students?|workers?|apples?|books?|items?|cars?|boxes|eggs?|cups?|bottles?")
46
+ NEGQ = re.compile(r"(?:(?<![A-Za-z0-9.])-\s?|\bminus\s+|\bnegative\s+)\d[\d,]*(?:\.\d+)?\s*(?:" + NONNEG + r")\b", re.I)
47
+ HOWQ = re.compile(r"\b(how many|how much|how long|how far|how fast|how old)\b", re.I)
48
+ LEAD = {"who", "what", "when", "where", "which", "why", "how", "in", "on", "at", "did", "does", "do", "is", "was", "were", "are",
49
+ "the", "a", "an", "name", "tell", "give", "for", "from", "of", "by", "with", "can", "could", "would", "should", "if"}
50
+ SPAN = re.compile(r"[A-Z][\w'’.-]*(?:\s+(?:of|the|de|la|le|von|van|and|&|du|del)?\s*[A-Z][\w'’.-]*)*")
51
+ STOP = {"of", "the", "de", "la", "le", "von", "van", "and", "&", "du", "del"}
52
+ # the routes that read ONE fact from evidence (where sealed 23's wrong answers came from); deliberation, capability and
53
+ # document routes cite sentences that name their subject as "it" or in another form, and are judged by their own checks
54
+ FACT_ROUTES = ("cube:", "organ:relation", "factoid", "verified:", "unverified")
55
+ ANAPHOR = re.compile(r"\s*(It|Its|He|She|His|Her|They|Their|This|The city|The country)\b")
56
+ QUOTED = re.compile(r"[\"“]([^\"”]{2,80})[\"”]")
57
+ _S: dict = {}
58
+ _LOCK = threading.Lock()
59
+
60
+
61
+ def _net():
62
+ with _LOCK:
63
+ if "net" not in _S:
64
+ if GATE not in sys.path:
65
+ sys.path.insert(0, GATE)
66
+ spec = importlib.util.spec_from_file_location("o7_network_v6_w556", NET6_CODE)
67
+ mod = importlib.util.module_from_spec(spec)
68
+ spec.loader.exec_module(mod)
69
+ _S["net"] = mod.Network(open(NET_STANDING, encoding="utf-8").read().split(), SPEC_ROOT, GATE)
70
+ return _S["net"]
71
+
72
+
73
+ def _spans(q):
74
+ """the names a question gives: capitalised runs (a sentence-initial question word is not a name) and quoted titles"""
75
+ out = [m.group(1) for m in QUOTED.finditer(q)]
76
+ for m in SPAN.finditer(q):
77
+ words = m.group(0).split()
78
+ if m.start() == 0:
79
+ words = words[1:] # a question's first word is capitalised by position ("Explain", "Summarize")
80
+ while words and words[0].lower() in LEAD:
81
+ words = words[1:]
82
+ if any(w.lower() not in STOP for w in words):
83
+ out.append(" ".join(words))
84
+ return out
85
+
86
+
87
+ def _named_in(span, text):
88
+ """a name is present when its last word is: a surname ("Einstein" for Albert Einstein), a title's head ("God"); matched on
89
+ its stem, so a plural or a derived form counts ("Annelids" for Annelid)"""
90
+ words = [re.sub(r"[^\w]", "", w.lower()) for w in span.split()]
91
+ words = [w for w in words if w and w not in STOP and len(w) > 1]
92
+ if not words:
93
+ return True
94
+ w = words[-1]
95
+ stem = w if len(w) <= 4 else w[:max(4, len(w) - 3)]
96
+ return re.search(r"\b%s" % re.escape(stem), text.lower()) is not None
97
+
98
+
99
+ def _withheld(r, path, response):
100
+ out = dict(r)
101
+ out.update(status="withheld", path=path + ">" + str(r.get("path", "")), response=response)
102
+ for k in ("proved", "references"):
103
+ out.pop(k, None)
104
+ return out
105
+
106
+
107
+ class OracleReleaseRuntimeW556(_Base):
108
+ def _owner(self, text, session_id, r):
109
+ out = super()._owner(text, session_id, r)
110
+ # guard 1: with no givens the numbers test is vacuous, so owner-first may not hand back a STORED FACT read off
111
+ # (a fact_* kind: "A President must be at least 35" for the president of Antarctica). A computation or a body's
112
+ # physical constant (escape velocity of Mars, gravity of Jupiter) still answers - measured: requiring givens for
113
+ # every answer lost three right escape-velocity answers on the capability panel.
114
+ if (out is not r and isinstance(out, dict) and not NUM.search(str(text or ""))
115
+ and re.search(r">fact[^>]*$", str(out.get("path", "")))):
116
+ return r
117
+ return out
118
+
119
+ def chat(self, text: str, session_id: str = "default") -> dict:
120
+ r = super().chat(text, session_id)
121
+ if not isinstance(r, dict) or r.get("status") != "answered":
122
+ return r
123
+ q = str(text or "")
124
+ resp = str(r.get("response", ""))
125
+ neg = NEGQ.search(q)
126
+ if neg: # guard 2
127
+ return _withheld(r, "precision_guard:Q9_negative_amount",
128
+ "The question gives %s, a negative amount of something that cannot be negative, so I won't compute an answer from it." % neg.group(0).strip())
129
+ if not resp.startswith("[ev:") or not str(r.get("path", "")).startswith(FACT_ROUTES):
130
+ return r # guards 3 and 4 judge single facts read from evidence, nothing else
131
+ if len(NUM.findall(q)) >= 2 and HOWQ.search(q): # guard 4
132
+ try:
133
+ n = _net().solve(q)
134
+ except Exception: # noqa: BLE001
135
+ n = {}
136
+ if n.get("status") == "answered":
137
+ out = dict(r)
138
+ hops = [str(t.get("node")) for t in n.get("trace") or []]
139
+ out.update(status="answered", path="network6>" + " ".join(hops), response=n["response"], references=[],
140
+ provenance={"kind": "specialist_network_v6", "trace": n.get("trace"), "core_path": r.get("path")})
141
+ out.pop("proved", None)
142
+ return out
143
+ return _withheld(r, "evidence_guard:arithmetic_from_text",
144
+ "That needs a calculation from the numbers you gave, and what I found is a sentence, not a calculation, so I won't give it as the answer.")
145
+ # guard 3 (evidence must name what the question names) was measured three ways and removed: requiring every name
146
+ # lost 62, then 21 right answers on the capability panel; requiring any name still lost 7 (relation answers cite the
147
+ # answer's own page, which need not repeat the question's names). City of God and Napoleon-Neptune stay unfixed.
148
+ return r
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w557.py ADDED
@@ -0,0 +1,303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w557 - ORACLE7 4.0 THE LAW (built from Ben's invocation; build brief: Claude Doc "Oracle7 V4.0 - Build
3
+ Brief"). Submitted as a CORRECTNESS RELEASE: by design it adds no capability the gate's columns can see (its claims are tested
4
+ on the two sealed V4 panels), so it is exempt from no_gain only; every measured column must still hold.
5
+
6
+ Three parts, one fold, so the law is admitted whole:
7
+
8
+ 1. THE INSTRUMENT (I4, and the logs for I3, I5, I6). Every turn, BEFORE its reply is returned, appends one entry to the residue
9
+ ledger: k = the Tree edges its path walks; L = wall-clock ms; word = the path spelled over LAMBDA, the twenty-two paths of
10
+ the three-tree runtime (oracle_tritree_v1.TREE_OF_LIFE) - a logged operator sequence is rejoined by the shortest edge path
11
+ between operator nodes, since the runtime passes through a node whose operator does not apply without logging it (its
12
+ TRANSIT rule); routes that do not walk the Tree are spelled by ROUTE_SPELLING (measured = false, an interpretation recorded
13
+ as such); rho = for a turn that did not answer, the node where formation stopped, the prefix reached and the reason.
14
+ Append-only and hash-chained. PRIVACY: the question is stored as its sha256 only; its text only when the operator sets
15
+ ORACLE7_V4_LEDGER_TEXT=1 (research box, gate panels; never the public demo). Ledger: $ORACLE7_V4_LEDGER, else
16
+ $ORACLE7_STATE/v4_ledger.jsonl, else /tmp/oracle7-v4/v4_ledger.jsonl. A failed write never costs the turn.
17
+
18
+ 2. NON-IDENTITY (I1, from P1: "never has become ... it becomes"). An ANSWERED reply that has nothing under it - no citation,
19
+ no proof, no checked computation, no specialist - does not become conversation state: the session's state (dialogue,
20
+ transitions, pending conversions) is put back as it was before the turn, and the reply is entered in the ledger as a
21
+ discourse record. A later turn can then use it only by re-entering it as cited evidence. Declined and withheld turns keep
22
+ their state (there is no answer in them to carry, and "why not?" must still explain the decline); acts, which are
23
+ conversions over the previous answer, are untouched.
24
+
25
+ 3. WALK RECALL (P3, from "go faster and faster, but slower in states"). The three-tree runtime's answer(q) is a pure function
26
+ of the question and the stores, holding no session state. A walk already made is recalled, not walked again: the same
27
+ result, the same path, the same step count, less wall-clock. Bounded (2,048 walks per instance), per process, on every
28
+ TriTree instance the chain has made (an instance attribute; no module state of any fold is changed). And a specialist's
29
+ own-module test (combo_runtime_v1._Organ._own, about a quarter of a relation turn's time: the family rescans every
30
+ loaded module after a call, one abspath each) is recalled per file on each loaded specialist - the same answer, never
31
+ recomputed. The frozen files are untouched; only instances get the recall.
32
+
33
+ Every reply is the parent's (w556) except where part 2 restores state; part 1 and part 3 change no reply."""
34
+ from __future__ import annotations
35
+
36
+ import copy
37
+ import hashlib
38
+ import json
39
+ import os
40
+ import re
41
+ import threading
42
+ import time
43
+ from collections import OrderedDict, deque
44
+
45
+ from oracle_release_runtime_w556 import OracleReleaseRuntimeW556 as _Base
46
+
47
+ SEPH = ["keter", "chokmah", "binah", "chesed", "geburah", "tiferet", "netzach", "hod", "yesod", "malkuth"]
48
+ EDGES = [("keter", "chokmah"), ("keter", "binah"), ("keter", "tiferet"), ("chokmah", "binah"), ("chokmah", "tiferet"),
49
+ ("chokmah", "chesed"), ("binah", "tiferet"), ("binah", "geburah"), ("chesed", "geburah"),
50
+ ("chesed", "tiferet"), ("chesed", "netzach"), ("geburah", "tiferet"), ("geburah", "hod"),
51
+ ("tiferet", "netzach"), ("tiferet", "yesod"), ("tiferet", "hod"), ("netzach", "hod"), ("netzach", "yesod"),
52
+ ("netzach", "malkuth"), ("hod", "yesod"), ("hod", "malkuth"), ("yesod", "malkuth")]
53
+ NODE_OF = {"READ": "malkuth", "FRAME": "yesod", "LINK": "chokmah", "RELATE": "binah", "EXPAND": "chesed", "CHECK": "geburah",
54
+ "BIND": "tiferet", "COMPARE": "netzach", "COMPUTE": "hod", "VERIFY": "keter"}
55
+ OPS = re.compile(r"(?<![A-Za-z])(READ|FRAME|LINK|RELATE|EXPAND|CHECK|BIND|COMPARE|COMPUTE|VERIFY)(?![a-z])|"
56
+ r"(?<![A-Za-z])(read|frame|link|relate|expand|check|bind|compare|compute|verify)(?=>|$)")
57
+ ROUTE_SPELLING = [
58
+ ("precision_guard:Q", ["READ", "FRAME", "CHECK"]), ("precision_guard", ["READ", "FRAME", "LINK", "CHECK"]),
59
+ ("evidence_guard", ["READ", "FRAME", "LINK", "RELATE", "CHECK"]), ("reader_guard", ["READ", "FRAME", "LINK", "CHECK"]),
60
+ ("owner_first", ["READ", "FRAME", "LINK", "COMPUTE", "CHECK", "BIND", "VERIFY"]),
61
+ ("network", ["READ", "FRAME", "COMPUTE", "BIND", "CHECK", "VERIFY"]),
62
+ ("specialist_call", ["READ", "FRAME", "COMPUTE", "BIND", "VERIFY"]), ("specialist_after_guard", ["READ", "FRAME", "COMPUTE", "BIND", "VERIFY"]),
63
+ ("family_precedence", ["READ", "FRAME", "LINK", "COMPUTE", "BIND", "VERIFY"]),
64
+ ("compute:", ["READ", "FRAME", "COMPUTE", "CHECK", "VERIFY"]), ("organ:math", ["READ", "FRAME", "COMPUTE", "CHECK", "VERIFY"]),
65
+ ("op:", ["READ", "FRAME", "COMPUTE", "VERIFY"]), ("verified:", ["READ", "FRAME", "LINK", "RELATE", "CHECK", "VERIFY"]),
66
+ ("factoid", ["READ", "FRAME", "LINK", "RELATE", "CHECK"]), ("unverified", ["READ", "FRAME", "LINK", "RELATE", "CHECK"]),
67
+ ("capability:", ["READ", "FRAME", "LINK", "EXPAND", "BIND", "VERIFY"]), ("arb:", ["READ", "FRAME", "LINK", "EXPAND", "BIND"]),
68
+ ("act:", ["READ", "FRAME", "BIND"]), ("chat:", ["READ", "FRAME"]),
69
+ ]
70
+ # what an answer may stand on and still become state: a citation or source tag, a proof, or a checked route
71
+ CITED = re.compile(r"\[[^\]\s]{2,}\]")
72
+ CHECKED = ("specialist_call", "specialist_after_guard", "owner_first", "family_precedence", "network", "compute:", "organ:math",
73
+ "op:", "verified:", "algebra:", "deduce:")
74
+ SESSION_STORES = ("dialogue", "transitions", "_pending_conversion")
75
+ _ADJ = {s: [] for s in SEPH}
76
+ for _i, (_a, _b) in enumerate(EDGES):
77
+ _ADJ[_a].append((_b, _i))
78
+ _ADJ[_b].append((_a, _i))
79
+ _LOCK = threading.Lock()
80
+ _S: dict = {}
81
+
82
+
83
+ def shortest(a, b):
84
+ """the shortest edge path a -> b as [(node, edge index)], ties broken by edge order (deterministic)"""
85
+ if a == b:
86
+ return []
87
+ prev, q = {a: None}, deque([a])
88
+ while q:
89
+ u = q.popleft()
90
+ for v, e in sorted(_ADJ[u], key=lambda x: x[1]):
91
+ if v not in prev:
92
+ prev[v] = (u, e)
93
+ if v == b:
94
+ q.clear()
95
+ break
96
+ q.append(v)
97
+ out, n = [], b
98
+ while prev[n] is not None:
99
+ u, e = prev[n]
100
+ out.append((n, e))
101
+ n = u
102
+ return out[::-1]
103
+
104
+
105
+ def ops_of(path):
106
+ """(operators in order, measured) - the Tree operators a path logged, or the route's spelling"""
107
+ p = str(path or "")
108
+ ops = [(m.group(1) or m.group(2)).upper() for m in OPS.finditer(p)]
109
+ if len(ops) >= 2:
110
+ return ops, True
111
+ for prefix, spelled in ROUTE_SPELLING:
112
+ if p.startswith(prefix):
113
+ return list(spelled), False
114
+ return ["READ", "FRAME"], False
115
+
116
+
117
+ def spell(ops):
118
+ """(nodes walked, LAMBDA word as edge indices): from Malkuth through each operator's node by shortest edge paths"""
119
+ nodes, word, cur = ["malkuth"], [], "malkuth"
120
+ for op in ops:
121
+ tgt = NODE_OF.get(op)
122
+ if not tgt or (tgt == cur and op == "READ"):
123
+ continue
124
+ for n, e in shortest(cur, tgt):
125
+ nodes.append(n)
126
+ word.append(e)
127
+ cur = tgt
128
+ return nodes, word
129
+
130
+
131
+ def stands_on_something(r):
132
+ if r.get("proved"):
133
+ return True
134
+ path = str(r.get("path", ""))
135
+ return path.startswith(CHECKED) or bool(CITED.search(str(r.get("response", ""))))
136
+
137
+
138
+ def _ledger_path():
139
+ p = os.environ.get("ORACLE7_V4_LEDGER")
140
+ if p:
141
+ return p
142
+ return os.path.join(os.environ.get("ORACLE7_STATE") or "/tmp/oracle7-v4", "v4_ledger.jsonl")
143
+
144
+
145
+ def ledger_append(entry):
146
+ with _LOCK:
147
+ p = _ledger_path()
148
+ if _S.get("path") != p:
149
+ _S["path"], _S["prev"] = p, "0" * 64
150
+ try:
151
+ with open(p, "rb") as f:
152
+ f.seek(0, 2)
153
+ f.seek(max(0, f.tell() - 65536))
154
+ last = f.read().splitlines()[-1]
155
+ _S["prev"] = json.loads(last)["h"]
156
+ except Exception: # noqa: BLE001 - a new or unreadable ledger starts a new chain
157
+ pass
158
+ entry["prev"] = _S["prev"]
159
+ entry["h"] = hashlib.sha256(json.dumps(entry, sort_keys=True, ensure_ascii=False).encode()).hexdigest()
160
+ os.makedirs(os.path.dirname(p) or ".", exist_ok=True)
161
+ with open(p, "a", encoding="utf-8") as f:
162
+ f.write(json.dumps(entry, sort_keys=True, ensure_ascii=False) + "\n")
163
+ _S["prev"] = entry["h"]
164
+
165
+
166
+ def ledger_entry(text, session_id, r, L, law, extra=None):
167
+ path = str(r.get("path", "")) if isinstance(r, dict) else ""
168
+ status = r.get("status") if isinstance(r, dict) else None
169
+ ops, measured = ops_of(path)
170
+ nodes, word = spell(ops)
171
+ e = {"t": round(time.time(), 3), "law": law, "session": hashlib.sha256(str(session_id).encode()).hexdigest()[:16],
172
+ "input": hashlib.sha256(str(text or "").encode()).hexdigest(), "status": status, "route": path.split(">")[0][:60],
173
+ "measured": measured, "ops": ops, "nodes": nodes, "word": word, "k": len(word), "L_ms": L}
174
+ if os.environ.get("ORACLE7_V4_LEDGER_TEXT") == "1":
175
+ e["text"] = str(text or "")[:500]
176
+ if status != "answered":
177
+ e["rho"] = {"stopped_at": nodes[-1], "prefix": word, "reason": path.split(">")[0][:80] or str(status)}
178
+ if extra:
179
+ e.update(extra)
180
+ return e
181
+
182
+
183
+ class _WalkRecall:
184
+ """a bounded memo over one TriTree instance's answer(q, form_props, only): same result, its why and expanded restored"""
185
+
186
+ def __init__(self, tt, size=2048):
187
+ self.tt, self.fn, self.size, self.memo, self.hits, self.lock = tt, tt.answer, size, OrderedDict(), 0, threading.Lock()
188
+
189
+ def __call__(self, q, form_props=None, only=False):
190
+ key = (str(q), tuple(sorted(form_props)) if form_props else None, bool(only))
191
+ with self.lock:
192
+ if key in self.memo:
193
+ self.memo.move_to_end(key)
194
+ res, why, expanded = self.memo[key]
195
+ self.hits += 1
196
+ self.tt.why, self.tt.expanded = why, expanded
197
+ return copy.deepcopy(res)
198
+ res = self.fn(q, form_props, only) if only else self.fn(q, form_props)
199
+ with self.lock:
200
+ self.memo[key] = (copy.deepcopy(res), getattr(self.tt, "why", None), getattr(self.tt, "expanded", None))
201
+ if len(self.memo) > self.size:
202
+ self.memo.popitem(last=False)
203
+ return res
204
+
205
+
206
+ class _OwnRecall:
207
+ """a specialist's _own(mod) - does this module's file live in my dir? - recalled per file instead of recomputed: the
208
+ family's _env rescans every loaded module after a call that imported anything, and the answer for a file never changes"""
209
+
210
+ def __init__(self, organ):
211
+ self.prefix, self.memo = organ.dir + os.sep, {}
212
+
213
+ def __call__(self, mod):
214
+ f = getattr(mod, "__file__", None) or ""
215
+ if not f:
216
+ return False
217
+ r = self.memo.get(f)
218
+ if r is None:
219
+ r = self.memo[f] = os.path.abspath(f).startswith(self.prefix)
220
+ return r
221
+
222
+
223
+ def recall_organs():
224
+ """give every loaded specialist (combo_runtime _Organ) its _own recall, once (an instance attribute; files unchanged)"""
225
+ import gc
226
+ n = 0
227
+ for o in gc.get_objects():
228
+ try:
229
+ if type(o).__name__ == "_Organ" and isinstance(getattr(o, "dir", None), str) and "_own" not in vars(o):
230
+ o._own = _OwnRecall(o)
231
+ n += 1
232
+ except Exception: # noqa: BLE001
233
+ continue
234
+ return n
235
+
236
+
237
+ class OracleReleaseRuntimeW557(_Base):
238
+ LAW = "4.0"
239
+ SCAN_AT = {1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144}
240
+
241
+ def _v4_recall(self):
242
+ """wrap every three-tree instance the chain has made so far (folds build theirs lazily, on first use)"""
243
+ rcs = getattr(self, "_v4_rcs", None)
244
+ if rcs is None:
245
+ rcs = self._v4_rcs = []
246
+ if os.environ.get("ORACLE7_V4_RECALL") == "0": # the I3 dose-response runs one throughput setting without recall
247
+ return rcs
248
+ try:
249
+ for v in list(vars(self).values()):
250
+ for o in (v if isinstance(v, (tuple, list)) else (v,)):
251
+ if (hasattr(o, "adj") and hasattr(o, "max_states") and callable(getattr(o, "answer", None))
252
+ and not isinstance(o.answer, _WalkRecall)):
253
+ rc = _WalkRecall(o)
254
+ o.answer = rc
255
+ rcs.append(rc)
256
+ except Exception: # noqa: BLE001 - without its recall the fold walks every time
257
+ pass
258
+ return rcs
259
+
260
+ def _v4_snapshot(self, session_id):
261
+ snap = {}
262
+ for name in SESSION_STORES:
263
+ store = getattr(self, name, None)
264
+ if isinstance(store, dict):
265
+ snap[name] = (session_id in store, copy.deepcopy(store.get(session_id)))
266
+ return snap
267
+
268
+ def _v4_restore(self, session_id, snap):
269
+ for name, (had, val) in snap.items():
270
+ store = getattr(self, name, None)
271
+ if not isinstance(store, dict):
272
+ continue
273
+ if had:
274
+ store[session_id] = val
275
+ else:
276
+ store.pop(session_id, None)
277
+
278
+ def chat(self, text: str, session_id: str = "default") -> dict:
279
+ hits0 = sum(rc.hits for rc in self._v4_recall())
280
+ try:
281
+ snap = self._v4_snapshot(session_id)
282
+ except Exception: # noqa: BLE001
283
+ snap = None
284
+ t0 = time.perf_counter()
285
+ r = super().chat(text, session_id)
286
+ L = round(1000.0 * (time.perf_counter() - t0), 1)
287
+ extra = {}
288
+ try:
289
+ if (isinstance(r, dict) and r.get("status") == "answered" and snap is not None
290
+ and not str(r.get("path", "")).startswith("act:") and not stands_on_something(r)):
291
+ self._v4_restore(session_id, snap)
292
+ extra["discourse_record"] = True
293
+ hits = sum(rc.hits for rc in self._v4_recall()) # also wraps instances this turn created
294
+ if hits > hits0:
295
+ extra["recalled_walks"] = hits - hits0
296
+ self._v4_n = getattr(self, "_v4_n", 0) + 1
297
+ if os.environ.get("ORACLE7_V4_RECALL") != "0" and (self._v4_n in self.SCAN_AT or self._v4_n % 233 == 0):
298
+ # specialist families load lazily: look again, more rarely
299
+ recall_organs()
300
+ ledger_append(ledger_entry(text, session_id, r, L, self.LAW, extra))
301
+ except Exception: # noqa: BLE001 - the law's bookkeeping never costs the turn
302
+ pass
303
+ return r
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w558.py ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w558 - ORACLE7 4.0, PRONOUN RE-ENTRY (Ben 2026-10-19: "add pronouns to 4.0"). A CORRECTNESS RELEASE
3
+ in the sense the gate uses: it may not lower any column; its effect is measured on the second sealed V4 panel's follow-ups.
4
+
5
+ 4.0's law (w557, I1): a past answer does not become state; a later turn may use it only by RE-ENTERING it as cited evidence.
6
+ 3.2 already resolves many pronoun follow-ups ("When was she born?" after "Who wrote Emma?" -> 16 December 1775). Where it
7
+ cannot - the resolved question does not parse ("What is its capital?" after "Which country is Kyoto in?" was withheld as
8
+ subject-missing; "What else did he direct?" after "Who directed Vertigo?" asked to clarify) - this fold re-enters the
9
+ previous answer itself: the pronoun is replaced by that answer and the question is asked once more ("What is Japan's
10
+ capital?"). Conditions, all required:
11
+ - the session's previous answer stood on something (a citation, a proof, a checked route: w557's stands_on_something)
12
+ and named one thing: a person after a "who" question (he/she/him/her/his), a place or thing after a "which/what
13
+ <country|city|...>" question (it/its);
14
+ - the new turn was NOT answered by the chain, is short (<= 14 words), names nothing of its own (no capitalised word after
15
+ the first) and carries a pronoun of the right kind;
16
+ - the re-entered question is answered; otherwise the chain's own reply stands.
17
+ The reply says what was re-entered ("taking 'its' as Japan, from my previous answer"). The ledger keeps one entry per turn:
18
+ this fold repeats w557's bookkeeping around its own turn instead of calling w557's chat twice."""
19
+ from __future__ import annotations
20
+
21
+ import re
22
+ import time
23
+
24
+ from oracle_release_runtime_w557 import OracleReleaseRuntimeW557 as _Base
25
+ from oracle_release_runtime_w557 import ledger_append, ledger_entry, stands_on_something, recall_organs
26
+
27
+ PERSON_Q = re.compile(r"^\s*who\b", re.I)
28
+ THING_Q = re.compile(r"^\s*(?:which|what)\s+(country|city|town|state|province|island|planet|moon|river|mountain|lake|sea|ocean|"
29
+ r"continent|region|book|novel|film|movie|play|opera|painting|team|club|company|band|album|song)\b", re.I)
30
+ PERSON_P = re.compile(r"\b(he|she|him|her|his|hers)\b", re.I)
31
+ THING_P = re.compile(r"\b(it|its)\b", re.I)
32
+ TAG = re.compile(r"^\s*(?:\[[^\]]+\]\s*)+")
33
+ NOT_POSS = {"in", "on", "at", "to", "for", "with", "from", "by", "and", "or", "about", "as", "of", "?"}
34
+
35
+
36
+ def answer_entity(reply):
37
+ """the one thing a reply names first: 'Jane Austen' from 'Jane Austen. From the Wikidata relation store: ...'"""
38
+ head = TAG.sub("", str(reply or "")).split(". ", 1)[0].strip().rstrip(".")
39
+ words = head.split()
40
+ if not words or len(words) > 6 or re.search(r"\d", head) or not words[0][:1].isupper():
41
+ return None
42
+ return head
43
+
44
+
45
+ def substitute(text, entity, kind):
46
+ rx = PERSON_P if kind == "person" else THING_P
47
+ toks = re.split(r"(\W+)", text)
48
+ out, used = [], False
49
+ for i, t in enumerate(toks):
50
+ low = t.lower()
51
+ if rx.fullmatch(t or "") and low:
52
+ nxt = next((x for x in toks[i + 1:] if x.strip()), "?").lower()
53
+ poss = low in ("his", "its", "hers") or (low == "her" and nxt not in NOT_POSS and nxt.isalpha())
54
+ out.append(entity + ("'s" if poss else ""))
55
+ used = True
56
+ else:
57
+ out.append(t)
58
+ return "".join(out) if used else None
59
+
60
+
61
+ class OracleReleaseRuntimeW558(_Base):
62
+ def _v4_turn(self, text, session_id):
63
+ """the chain's reply, or - where it could not resolve a pronoun - the previous cited answer re-entered"""
64
+ r = super(_Base, self).chat(text, session_id) # the chain below w557 (w556 and down), as w557 itself calls it
65
+ disc = getattr(self, "_v4_disc", None)
66
+ if disc is None:
67
+ disc = self._v4_disc = {}
68
+ q = str(text or "")
69
+ if isinstance(r, dict) and r.get("status") == "answered":
70
+ rec0 = disc.get(session_id)
71
+ kind = "person" if PERSON_Q.search(q) else ("thing" if THING_Q.search(q) else None)
72
+ if kind and stands_on_something(r):
73
+ ent = answer_entity(r.get("response"))
74
+ disc[session_id] = {"entity": ent, "kind": kind} if ent else None
75
+ elif not (rec0 and (PERSON_P if rec0["kind"] == "person" else THING_P).search(q)):
76
+ disc[session_id] = None # a new subject: the old answer is no longer what a pronoun means
77
+ return r # (a follow-up the chain resolved itself keeps the record)
78
+ rec = disc.get(session_id)
79
+ words = q.split()
80
+ if (not rec or len(words) > 14 or any(w[:1].isupper() for w in words[1:])
81
+ or not (PERSON_P if rec["kind"] == "person" else THING_P).search(q)):
82
+ return r
83
+ q2 = substitute(q, rec["entity"], rec["kind"])
84
+ if not q2:
85
+ return r
86
+ r2 = super(_Base, self).chat(q2, session_id)
87
+ if not (isinstance(r2, dict) and r2.get("status") == "answered"):
88
+ return r
89
+ pron = ((PERSON_P if rec["kind"] == "person" else THING_P).search(q).group(0))
90
+ out = dict(r2)
91
+ out["path"] = "reentry:cited>" + str(r2.get("path", ""))
92
+ out["response"] = "(Taking '%s' as %s, from my previous answer.) %s" % (pron, rec["entity"], r2.get("response", ""))
93
+ out["reentry"] = {"pronoun": pron, "entity": rec["entity"], "question": q2}
94
+ return out
95
+
96
+ def chat(self, text: str, session_id: str = "default") -> dict:
97
+ # w557's bookkeeping (snapshot, non-identity, recall counts, the ledger entry) around this fold's turn - once per turn
98
+ hits0 = sum(rc.hits for rc in self._v4_recall())
99
+ try:
100
+ snap = self._v4_snapshot(session_id)
101
+ except Exception: # noqa: BLE001
102
+ snap = None
103
+ t0 = time.perf_counter()
104
+ r = self._v4_turn(text, session_id)
105
+ L = round(1000.0 * (time.perf_counter() - t0), 1)
106
+ extra = {}
107
+ try:
108
+ if (isinstance(r, dict) and r.get("status") == "answered" and snap is not None
109
+ and not str(r.get("path", "")).startswith("act:") and not stands_on_something(r)):
110
+ self._v4_restore(session_id, snap)
111
+ extra["discourse_record"] = True
112
+ if isinstance(r, dict) and r.get("reentry"):
113
+ extra["reentry"] = r["reentry"]["entity"]
114
+ hits = sum(rc.hits for rc in self._v4_recall())
115
+ if hits > hits0:
116
+ extra["recalled_walks"] = hits - hits0
117
+ self._v4_n = getattr(self, "_v4_n", 0) + 1
118
+ import os as _os
119
+ if _os.environ.get("ORACLE7_V4_RECALL") != "0" and (self._v4_n in self.SCAN_AT or self._v4_n % 233 == 0):
120
+ recall_organs()
121
+ ledger_append(ledger_entry(text, session_id, r, L, self.LAW, extra))
122
+ except Exception: # noqa: BLE001
123
+ pass
124
+ return r
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/v4_law.py ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """v4_law - Oracle7 4.0: the path alphabet LAMBDA, path vectors, the Tree-of-Life stabilizer and the re-entrance tracker.
3
+
4
+ LAMBDA = the twenty-two paths of the three-tree runtime (oracle_tritree_v1.TREE_OF_LIFE), letters 0..21 in that order.
5
+ A turn's word is the sequence of edges its walk takes from Malkuth (written to the ledger by fold w557).
6
+
7
+ PATH(w) = sum_p bind(K[w_p], R[p]) in the codebook construction of 3.2's path memory (specialists/_gate/path_hrr_v1:
8
+ osub_seed = sha256-seeded unit complex phasors, D = 1024; roles R[p] = osub_seed("o7pos:%d" % p); letters
9
+ K[e] = osub_seed("o7lam:%d" % e)).
10
+
11
+ THE STABILIZER. Plain cleanup reads each position against every letter. The Tree-of-Life stabilizer reads position p only
12
+ against the letters that leave the node position p-1 ended at (a walk can only continue along an edge of its current node),
13
+ starting at Malkuth: 2-6 candidates instead of 22. Same vector, same codebook; only the cleanup is constrained by the Tree.
14
+
15
+ RE-ENTRANCE (I6). A form is re-entered when a later turn's PATH has cosine >= TAU with it. TAU = 0.95, fixed here before any
16
+ 4.0 panel ran: a word of up to 19 letters re-entered with one letter different still scores below it, so re-entered means
17
+ the same walk. Reported against a baseline of shuffled words (each word's letters permuted, the same lengths).
18
+
19
+ usage: v4_law.py capacity [out.json] - exact-word recall of N bundled walks, plain vs stabilized
20
+ v4_law.py reentry <ledger.jsonl> - re-entrance of the ledger's forms, against the shuffled baseline"""
21
+ from __future__ import annotations
22
+
23
+ import hashlib
24
+ import json
25
+ import random
26
+ import sys
27
+
28
+ import numpy as np
29
+
30
+ D = 1024
31
+ TAU = 0.95
32
+ SEPH = ["keter", "chokmah", "binah", "chesed", "geburah", "tiferet", "netzach", "hod", "yesod", "malkuth"]
33
+ EDGES = [("keter", "chokmah"), ("keter", "binah"), ("keter", "tiferet"), ("chokmah", "binah"), ("chokmah", "tiferet"),
34
+ ("chokmah", "chesed"), ("binah", "tiferet"), ("binah", "geburah"), ("chesed", "geburah"),
35
+ ("chesed", "tiferet"), ("chesed", "netzach"), ("geburah", "tiferet"), ("geburah", "hod"),
36
+ ("tiferet", "netzach"), ("tiferet", "yesod"), ("tiferet", "hod"), ("netzach", "hod"), ("netzach", "yesod"),
37
+ ("netzach", "malkuth"), ("hod", "yesod"), ("hod", "malkuth"), ("yesod", "malkuth")]
38
+ ADJ = {s: [] for s in SEPH}
39
+ for i, (a, b) in enumerate(EDGES):
40
+ ADJ[a].append((i, b))
41
+ ADJ[b].append((i, a))
42
+
43
+
44
+ def osub_seed(text, dim=D):
45
+ h = int(hashlib.sha256(text.lower().strip().encode()).hexdigest(), 16)
46
+ rng = np.random.RandomState(h % (2 ** 31))
47
+ return np.exp(1j * rng.uniform(0, 2 * np.pi, dim)).astype(np.complex64)
48
+
49
+
50
+ def bind(a, b):
51
+ return np.fft.ifft(np.fft.fft(a) * np.fft.fft(b)).astype(np.complex64)
52
+
53
+
54
+ def unbind(c, b):
55
+ return np.fft.ifft(np.fft.fft(c) * np.conj(np.fft.fft(b))).astype(np.complex64)
56
+
57
+
58
+ K = np.stack([osub_seed("o7lam:%d" % e) for e in range(len(EDGES))])
59
+ R = [osub_seed("o7pos:%d" % p) for p in range(64)]
60
+
61
+
62
+ def path_vec(word):
63
+ return np.sum([bind(K[e], R[p]) for p, e in enumerate(word)], axis=0).astype(np.complex64)
64
+
65
+
66
+ def decode_plain(vec, n):
67
+ out = []
68
+ for p in range(n):
69
+ sims = np.real(K.conj() @ unbind(vec, R[p]))
70
+ out.append(int(np.argmax(sims)))
71
+ return out
72
+
73
+
74
+ def decode_tree(vec, n, start="malkuth"):
75
+ out, cur = [], start
76
+ for p in range(n):
77
+ est = unbind(vec, R[p])
78
+ cands = ADJ[cur]
79
+ sims = [float(np.real(np.vdot(K[e], est))) for e, _ in cands]
80
+ e, nxt = cands[int(np.argmax(sims))]
81
+ out.append(e)
82
+ cur = nxt
83
+ return out
84
+
85
+
86
+ def walk(rng, n, start="malkuth"):
87
+ out, cur = [], start
88
+ for _ in range(n):
89
+ e, nxt = rng.choice(ADJ[cur])
90
+ out.append(e)
91
+ cur = nxt
92
+ return out
93
+
94
+
95
+ def capacity(seed=4000, lengths=(6, 9, 12), bundles=(1, 2, 4, 8, 16, 32, 64), trials=60):
96
+ """exact-word recall of N walks bundled into ONE vector (each bound to its own key), plain cleanup vs the stabilizer"""
97
+ rng = random.Random(seed)
98
+ rows = []
99
+ for n in lengths:
100
+ for N in bundles:
101
+ ok_p = ok_t = tot = 0
102
+ for t in range(max(1, trials // N)):
103
+ words = [walk(rng, n) for _ in range(N)]
104
+ keys = [osub_seed("o7item:%d:%d:%d:%d" % (seed, n, t, i)) for i in range(N)]
105
+ M = np.sum([bind(k, path_vec(w)) for k, w in zip(keys, words)], axis=0)
106
+ for k, w in zip(keys, words):
107
+ v = unbind(M, k)
108
+ ok_p += decode_plain(v, n) == w
109
+ ok_t += decode_tree(v, n) == w
110
+ tot += 1
111
+ rows.append({"letters": n, "bundled": N, "words": tot, "plain": round(ok_p / tot, 4), "stabilized": round(ok_t / tot, 4)})
112
+ print(json.dumps(rows[-1]), flush=True)
113
+ return rows
114
+
115
+
116
+ def cos(a, b):
117
+ return float(np.real(np.vdot(a, b)) / (np.linalg.norm(a) * np.linalg.norm(b) + 1e-12))
118
+
119
+
120
+ def reentry(entries, seed=4001):
121
+ """share of forms (answered words) re-entered by a later turn at cos >= TAU, and the same for shuffled words"""
122
+ words = [e["word"] for e in entries if e.get("status") == "answered" and e.get("word")]
123
+ rng = random.Random(seed)
124
+ shuf = [rng.sample(w, len(w)) for w in words]
125
+
126
+ def rate(ws):
127
+ vs = [path_vec(w) for w in ws]
128
+ hit = sum(1 for i in range(len(vs)) if any(cos(vs[i], vs[j]) >= TAU for j in range(i + 1, len(vs))))
129
+ return hit, len(vs)
130
+ h, n = rate(words)
131
+ hs, ns = rate(shuf)
132
+ return {"forms": n, "reentered": h, "rate": round(h / n, 4) if n else 0.0, "shuffled_reentered": hs,
133
+ "shuffled_rate": round(hs / ns, 4) if ns else 0.0, "tau": TAU}
134
+
135
+
136
+ if __name__ == "__main__":
137
+ if sys.argv[1] == "capacity":
138
+ rows = capacity()
139
+ if len(sys.argv) > 2:
140
+ json.dump({"D": D, "codebook": "osub_seed o7lam/o7pos", "rows": rows}, open(sys.argv[2], "w"), indent=1)
141
+ elif sys.argv[1] == "reentry":
142
+ print(json.dumps(reentry([json.loads(l) for l in open(sys.argv[2])])))
root/specialists/_gate/standing_new_v1.txt CHANGED
@@ -1 +1 @@
1
- densities-r2 fluids-r2 decay springs fuels
 
1
+ densities-r2 fluids-r2 decay-r2 springs fuels
root/specialists/_gate/standing_owner_v1.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ orbits
root/specialists/_gate/standing_stars_v1.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ stars
2
+ habzone
3
+ exoorbits
4
+ transits
root/specialists/_gate/star_panels_v1.sha256 ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ ebf1be080508b21441419ea1f84794a0e5c280ab6a5ba12b767f895e43a091ba stars/stars_panel_v1.json
2
+ 0010261cb74a209cde736d4d21a257486ffe95e048f1ac54144be864846f0559 habzone/habzone_panel_v1.json
3
+ e6ae236b37c1a456bb590113fdfefccb9185ff4e557f127bf5e7b929fa89bf74 exoorbits/exoorbits_panel_v1.json
4
+ 0ede1b605bbcf0c41024d57f0a1b4be5713d729678bd50c9990713ad66dc6135 transits/transits_panel_v1.json
root/specialists/_proved/NOTICE ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ veri7vn proved kernels - https://github.com/emberian/veri7vn (fork https://github.com/psiloceyeben/veri7vn), by ember arlynx, CC0-1.0.
2
+ Built from commit 3bf43cff8eaa1c30db2659d186cdcffe9c4f6c61: Isabelle2026-RC1 sessions (proofs checked during the build), generated Standard ML linked statically with the MLton in Isabelle, Linux x86-64. chemistry and anatomyagri link the regex.sml their own families carried before it was removed upstream (restored from git history).
3
+ Used by Oracle7 fold w551 as a cross-check; see PROVED.json.
root/specialists/_proved/PROVED.json ADDED
@@ -0,0 +1,806 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "what": "veri7vn proved kernels standing in for Oracle7 specialists, used by fold w551 as a cross-check (a reply is marked proved when its kernel agrees, withheld when its kernel answers differently, unchanged otherwise).",
3
+ "source": "https://github.com/emberian/veri7vn (fork https://github.com/psiloceyeben/veri7vn)",
4
+ "commit": "3bf43cff8eaa1c30db2659d186cdcffe9c4f6c61",
5
+ "licence": "CC0-1.0",
6
+ "author": "ember arlynx",
7
+ "build": "Isabelle2026-RC1 sessions built (proofs checked) on the research box, generated Standard ML exported and linked statically with the MLton shipped in Isabelle (Linux x86-64).",
8
+ "parity": {
9
+ "heldout_questions": 7172,
10
+ "agree": 6036,
11
+ "organ_only": 1096,
12
+ "disagree": 40,
13
+ "note": "same held-out items; agree = same answer value (or both withheld); the disagreements measured were display rounding and ASCII vs Unicode working, not different answers"
14
+ },
15
+ "binaries": {
16
+ "acoustics": "4f22f4159849938674cbb4da325c7cde322f026b70306ea2f242bae05fd137b9",
17
+ "anatomyagri": "99df1f11b3920fc81f9462ffcf7e207f46da5309a9f96c3de3d9d371a8ba0fdd",
18
+ "chemistry": "e1292ae5a7fbc67ceeb94c38a0c9172379214a2ff7005ee1c9685e6ba460343c",
19
+ "climate": "15de19eb7a04447e23a7aa155ff05978c40f4ffb6d85163ddf7f9e143bcd5a92",
20
+ "computing": "52ff108928f06ee64ef41c34599027f0e98f1ac28964a4d227fa0d2b191e3f5c",
21
+ "discrete": "555718394b624bec0a90615ba3feef312c5fd0bb037ca05b155602a4e28e0a37",
22
+ "emoptics": "f013d847f239bed7f616fc9a007b3831c99cfb73a7a5030be1317d4d9cdfe071",
23
+ "energy": "df8449c8284dda0b63a0f6d40767e4721e3cdb59682344f6f30e0ea4c5580ea8",
24
+ "facts": "746bab8b08c15024bae763c9627b9874d3b21ba4623b0107d604bc6bd8fe0719",
25
+ "fusion": "0f765ab3ca5b4b6a405e6401ac8b3f6ea915d38992fbf1d176ed7837019ee969",
26
+ "geostats": "f92a48c4c941846bda06de9bec32bb9238f60edde022fd844334b7d73905680b",
27
+ "humanities": "3befad7a8d17c9bee411fd38e658866e93e8f6d2c325f641a08ce2acc5facd5e",
28
+ "life": "65748246c35730eeed5e733017ac0590193d4dfad5423125eb393461fc3fb0e2",
29
+ "materials": "6a548f83db9973f647fa43a16860c56bc933f6a40a2a53dfafb056d24ecdffe4",
30
+ "mechanics": "7c636d4ca6a1b8f66cfe11fc3b51dcc221efb252565828fe69056257c6aa1a25",
31
+ "quantity": "368849c4e9cee834ee609f4b6617f7afac2c85817a2bf664960f2e0cafdbc976",
32
+ "space": "725a57a7ec25a13f1a8f155183013520b3c1636c91cd3a90c4440e06a0c0552e",
33
+ "stores": "20ebbd038131be04642d80626dfa1fca6c03430f6e0bc7f6a8ca726633628e68",
34
+ "trades": "cb3f5063d873f68daeec59cc031d1492ef0cab7ac4a2fa9b5ab3db78fd3eaecf"
35
+ },
36
+ "specialists": {
37
+ "acoustics": {
38
+ "binary": "acoustics",
39
+ "flag": false,
40
+ "family": "acoustics",
41
+ "session": "Veri7vn_Acoustics"
42
+ },
43
+ "anatomy": {
44
+ "binary": "anatomyagri",
45
+ "flag": true,
46
+ "family": "anatomyagri",
47
+ "session": "Veri7vn_AnatomyAgri"
48
+ },
49
+ "anatomy-r2": {
50
+ "binary": "anatomyagri",
51
+ "flag": true,
52
+ "family": "anatomyagri",
53
+ "session": "Veri7vn_AnatomyAgri"
54
+ },
55
+ "agriculture-v2": {
56
+ "binary": "anatomyagri",
57
+ "flag": true,
58
+ "family": "anatomyagri",
59
+ "session": "Veri7vn_AnatomyAgri"
60
+ },
61
+ "gardening": {
62
+ "binary": "anatomyagri",
63
+ "flag": true,
64
+ "family": "anatomyagri",
65
+ "session": "Veri7vn_AnatomyAgri"
66
+ },
67
+ "nutrition-label-v2": {
68
+ "binary": "anatomyagri",
69
+ "flag": true,
70
+ "family": "anatomyagri",
71
+ "session": "Veri7vn_AnatomyAgri"
72
+ },
73
+ "chemistry": {
74
+ "binary": "chemistry",
75
+ "flag": true,
76
+ "family": "chemistry",
77
+ "session": "Veri7vn_Chemistry"
78
+ },
79
+ "chemistry-v3": {
80
+ "binary": "chemistry",
81
+ "flag": true,
82
+ "family": "chemistry",
83
+ "session": "Veri7vn_Chemistry"
84
+ },
85
+ "decay": {
86
+ "binary": "chemistry",
87
+ "flag": true,
88
+ "family": "chemistry",
89
+ "session": "Veri7vn_Chemistry"
90
+ },
91
+ "labsolutions": {
92
+ "binary": "chemistry",
93
+ "flag": true,
94
+ "family": "chemistry",
95
+ "session": "Veri7vn_Chemistry"
96
+ },
97
+ "labsolutions-r2": {
98
+ "binary": "chemistry",
99
+ "flag": true,
100
+ "family": "chemistry",
101
+ "session": "Veri7vn_Chemistry"
102
+ },
103
+ "carboncapture": {
104
+ "binary": "climate",
105
+ "flag": true,
106
+ "family": "climate",
107
+ "session": "Veri7vn_Climate"
108
+ },
109
+ "airquality": {
110
+ "binary": "climate",
111
+ "flag": true,
112
+ "family": "climate",
113
+ "session": "Veri7vn_Climate"
114
+ },
115
+ "climate": {
116
+ "binary": "climate",
117
+ "flag": true,
118
+ "family": "climate",
119
+ "session": "Veri7vn_Climate"
120
+ },
121
+ "carbonmat": {
122
+ "binary": "climate",
123
+ "flag": true,
124
+ "family": "climate",
125
+ "session": "Veri7vn_Climate"
126
+ },
127
+ "coldchain": {
128
+ "binary": "climate",
129
+ "flag": true,
130
+ "family": "climate",
131
+ "session": "Veri7vn_Climate"
132
+ },
133
+ "coldchain-v2": {
134
+ "binary": "climate",
135
+ "flag": true,
136
+ "family": "climate",
137
+ "session": "Veri7vn_Climate"
138
+ },
139
+ "networking": {
140
+ "binary": "computing",
141
+ "flag": true,
142
+ "family": "computing",
143
+ "session": "Veri7vn_Computing"
144
+ },
145
+ "embedded": {
146
+ "binary": "computing",
147
+ "flag": true,
148
+ "family": "computing",
149
+ "session": "Veri7vn_Computing"
150
+ },
151
+ "cyber": {
152
+ "binary": "computing",
153
+ "flag": true,
154
+ "family": "computing",
155
+ "session": "Veri7vn_Computing"
156
+ },
157
+ "linux-v2": {
158
+ "binary": "computing",
159
+ "flag": true,
160
+ "family": "computing",
161
+ "session": "Veri7vn_Computing"
162
+ },
163
+ "git": {
164
+ "binary": "computing",
165
+ "flag": true,
166
+ "family": "computing",
167
+ "session": "Veri7vn_Computing"
168
+ },
169
+ "sql": {
170
+ "binary": "computing",
171
+ "flag": true,
172
+ "family": "computing",
173
+ "session": "Veri7vn_Computing"
174
+ },
175
+ "python": {
176
+ "binary": "computing",
177
+ "flag": true,
178
+ "family": "computing",
179
+ "session": "Veri7vn_Computing"
180
+ },
181
+ "python-r2": {
182
+ "binary": "computing",
183
+ "flag": true,
184
+ "family": "computing",
185
+ "session": "Veri7vn_Computing"
186
+ },
187
+ "robotics-v2": {
188
+ "binary": "computing",
189
+ "flag": true,
190
+ "family": "computing",
191
+ "session": "Veri7vn_Computing"
192
+ },
193
+ "games-v3": {
194
+ "binary": "discrete",
195
+ "flag": true,
196
+ "family": "discrete",
197
+ "session": "Veri7vn_Discrete"
198
+ },
199
+ "logic-v3": {
200
+ "binary": "discrete",
201
+ "flag": true,
202
+ "family": "discrete",
203
+ "session": "Veri7vn_Discrete"
204
+ },
205
+ "dataformats": {
206
+ "binary": "discrete",
207
+ "flag": true,
208
+ "family": "discrete",
209
+ "session": "Veri7vn_Discrete"
210
+ },
211
+ "algorithms": {
212
+ "binary": "discrete",
213
+ "flag": true,
214
+ "family": "discrete",
215
+ "session": "Veri7vn_Discrete"
216
+ },
217
+ "calculus": {
218
+ "binary": "discrete",
219
+ "flag": true,
220
+ "family": "discrete",
221
+ "session": "Veri7vn_Discrete"
222
+ },
223
+ "electrical": {
224
+ "binary": "emoptics",
225
+ "flag": true,
226
+ "family": "emoptics",
227
+ "session": "Veri7vn_Emoptics"
228
+ },
229
+ "electronics": {
230
+ "binary": "emoptics",
231
+ "flag": true,
232
+ "family": "emoptics",
233
+ "session": "Veri7vn_Emoptics"
234
+ },
235
+ "electronics-r2": {
236
+ "binary": "emoptics",
237
+ "flag": true,
238
+ "family": "emoptics",
239
+ "session": "Veri7vn_Emoptics"
240
+ },
241
+ "wiring": {
242
+ "binary": "emoptics",
243
+ "flag": true,
244
+ "family": "emoptics",
245
+ "session": "Veri7vn_Emoptics"
246
+ },
247
+ "optics": {
248
+ "binary": "emoptics",
249
+ "flag": true,
250
+ "family": "emoptics",
251
+ "session": "Veri7vn_Emoptics"
252
+ },
253
+ "optics-v2": {
254
+ "binary": "emoptics",
255
+ "flag": true,
256
+ "family": "emoptics",
257
+ "session": "Veri7vn_Emoptics"
258
+ },
259
+ "optics-v3": {
260
+ "binary": "emoptics",
261
+ "flag": true,
262
+ "family": "emoptics",
263
+ "session": "Veri7vn_Emoptics"
264
+ },
265
+ "optics-v5": {
266
+ "binary": "emoptics",
267
+ "flag": true,
268
+ "family": "emoptics",
269
+ "session": "Veri7vn_Emoptics"
270
+ },
271
+ "optics-v5-r2": {
272
+ "binary": "emoptics",
273
+ "flag": true,
274
+ "family": "emoptics",
275
+ "session": "Veri7vn_Emoptics"
276
+ },
277
+ "thermo": {
278
+ "binary": "energy",
279
+ "flag": true,
280
+ "family": "energy",
281
+ "session": "Veri7vn_Energy"
282
+ },
283
+ "energy-v2": {
284
+ "binary": "energy",
285
+ "flag": true,
286
+ "family": "energy",
287
+ "session": "Veri7vn_Energy"
288
+ },
289
+ "energy-v3": {
290
+ "binary": "energy",
291
+ "flag": true,
292
+ "family": "energy",
293
+ "session": "Veri7vn_Energy"
294
+ },
295
+ "hvac": {
296
+ "binary": "energy",
297
+ "flag": true,
298
+ "family": "energy",
299
+ "session": "Veri7vn_Energy"
300
+ },
301
+ "renewables": {
302
+ "binary": "energy",
303
+ "flag": true,
304
+ "family": "energy",
305
+ "session": "Veri7vn_Energy"
306
+ },
307
+ "iot": {
308
+ "binary": "energy",
309
+ "flag": true,
310
+ "family": "energy",
311
+ "session": "Veri7vn_Energy"
312
+ },
313
+ "literature-v2": {
314
+ "binary": "facts",
315
+ "flag": true,
316
+ "family": "facts",
317
+ "session": "Veri7vn_Facts"
318
+ },
319
+ "worldhistory": {
320
+ "binary": "facts",
321
+ "flag": true,
322
+ "family": "facts",
323
+ "session": "Veri7vn_Facts"
324
+ },
325
+ "arthistory": {
326
+ "binary": "facts",
327
+ "flag": true,
328
+ "family": "facts",
329
+ "session": "Veri7vn_Facts"
330
+ },
331
+ "medicine-r2": {
332
+ "binary": "facts",
333
+ "flag": true,
334
+ "family": "facts",
335
+ "session": "Veri7vn_Facts"
336
+ },
337
+ "medicine": {
338
+ "binary": "facts",
339
+ "flag": true,
340
+ "family": "facts",
341
+ "session": "Veri7vn_Facts"
342
+ },
343
+ "law": {
344
+ "binary": "facts",
345
+ "flag": true,
346
+ "family": "facts",
347
+ "session": "Veri7vn_Facts"
348
+ },
349
+ "psychology": {
350
+ "binary": "facts",
351
+ "flag": true,
352
+ "family": "facts",
353
+ "session": "Veri7vn_Facts"
354
+ },
355
+ "sociology": {
356
+ "binary": "facts",
357
+ "flag": true,
358
+ "family": "facts",
359
+ "session": "Veri7vn_Facts"
360
+ },
361
+ "linguistics": {
362
+ "binary": "facts",
363
+ "flag": true,
364
+ "family": "facts",
365
+ "session": "Veri7vn_Facts"
366
+ },
367
+ "poetry": {
368
+ "binary": "facts",
369
+ "flag": true,
370
+ "family": "facts",
371
+ "session": "Veri7vn_Facts"
372
+ },
373
+ "botany": {
374
+ "binary": "facts",
375
+ "flag": true,
376
+ "family": "facts",
377
+ "session": "Veri7vn_Facts"
378
+ },
379
+ "entomology": {
380
+ "binary": "facts",
381
+ "flag": true,
382
+ "family": "facts",
383
+ "session": "Veri7vn_Facts"
384
+ },
385
+ "marinebio": {
386
+ "binary": "facts",
387
+ "flag": true,
388
+ "family": "facts",
389
+ "session": "Veri7vn_Facts"
390
+ },
391
+ "ornithology": {
392
+ "binary": "facts",
393
+ "flag": true,
394
+ "family": "facts",
395
+ "session": "Veri7vn_Facts"
396
+ },
397
+ "mycology": {
398
+ "binary": "facts",
399
+ "flag": true,
400
+ "family": "facts",
401
+ "session": "Veri7vn_Facts"
402
+ },
403
+ "mycelial": {
404
+ "binary": "facts",
405
+ "flag": true,
406
+ "family": "facts",
407
+ "session": "Veri7vn_Facts"
408
+ },
409
+ "pets": {
410
+ "binary": "facts",
411
+ "flag": true,
412
+ "family": "facts",
413
+ "session": "Veri7vn_Facts"
414
+ },
415
+ "childdev": {
416
+ "binary": "facts",
417
+ "flag": true,
418
+ "family": "facts",
419
+ "session": "Veri7vn_Facts"
420
+ },
421
+ "etiquette": {
422
+ "binary": "facts",
423
+ "flag": true,
424
+ "family": "facts",
425
+ "session": "Veri7vn_Facts"
426
+ },
427
+ "firesafety-v2": {
428
+ "binary": "facts",
429
+ "flag": true,
430
+ "family": "facts",
431
+ "session": "Veri7vn_Facts"
432
+ },
433
+ "firstaid": {
434
+ "binary": "facts",
435
+ "flag": true,
436
+ "family": "facts",
437
+ "session": "Veri7vn_Facts"
438
+ },
439
+ "javascript": {
440
+ "binary": "facts",
441
+ "flag": true,
442
+ "family": "facts",
443
+ "session": "Veri7vn_Facts"
444
+ },
445
+ "geometry": {
446
+ "binary": "geostats",
447
+ "flag": true,
448
+ "family": "geostats",
449
+ "session": "Veri7vn_GeoStats"
450
+ },
451
+ "geometry-v3": {
452
+ "binary": "geostats",
453
+ "flag": true,
454
+ "family": "geostats",
455
+ "session": "Veri7vn_GeoStats"
456
+ },
457
+ "geometry-v4": {
458
+ "binary": "geostats",
459
+ "flag": true,
460
+ "family": "geostats",
461
+ "session": "Veri7vn_GeoStats"
462
+ },
463
+ "statistics": {
464
+ "binary": "geostats",
465
+ "flag": true,
466
+ "family": "geostats",
467
+ "session": "Veri7vn_GeoStats"
468
+ },
469
+ "statistics-v2": {
470
+ "binary": "geostats",
471
+ "flag": true,
472
+ "family": "geostats",
473
+ "session": "Veri7vn_GeoStats"
474
+ },
475
+ "statistics-v3": {
476
+ "binary": "geostats",
477
+ "flag": true,
478
+ "family": "geostats",
479
+ "session": "Veri7vn_GeoStats"
480
+ },
481
+ "music-v2-r2": {
482
+ "binary": "humanities",
483
+ "flag": true,
484
+ "family": "humanities",
485
+ "session": "Veri7vn_Humanities"
486
+ },
487
+ "music-v2": {
488
+ "binary": "humanities",
489
+ "flag": true,
490
+ "family": "humanities",
491
+ "session": "Veri7vn_Humanities"
492
+ },
493
+ "grammar": {
494
+ "binary": "humanities",
495
+ "flag": true,
496
+ "family": "humanities",
497
+ "session": "Veri7vn_Humanities"
498
+ },
499
+ "mythology": {
500
+ "binary": "humanities",
501
+ "flag": true,
502
+ "family": "humanities",
503
+ "session": "Veri7vn_Humanities"
504
+ },
505
+ "ushistory": {
506
+ "binary": "humanities",
507
+ "flag": true,
508
+ "family": "humanities",
509
+ "session": "Veri7vn_Humanities"
510
+ },
511
+ "library": {
512
+ "binary": "humanities",
513
+ "flag": true,
514
+ "family": "humanities",
515
+ "session": "Veri7vn_Humanities"
516
+ },
517
+ "government": {
518
+ "binary": "humanities",
519
+ "flag": true,
520
+ "family": "humanities",
521
+ "session": "Veri7vn_Humanities"
522
+ },
523
+ "genetics-v2": {
524
+ "binary": "life",
525
+ "flag": true,
526
+ "family": "life",
527
+ "session": "Veri7vn_Life"
528
+ },
529
+ "biology": {
530
+ "binary": "life",
531
+ "flag": true,
532
+ "family": "life",
533
+ "session": "Veri7vn_Life"
534
+ },
535
+ "ecology": {
536
+ "binary": "life",
537
+ "flag": true,
538
+ "family": "life",
539
+ "session": "Veri7vn_Life"
540
+ },
541
+ "forestry": {
542
+ "binary": "life",
543
+ "flag": true,
544
+ "family": "life",
545
+ "session": "Veri7vn_Life"
546
+ },
547
+ "wildlife": {
548
+ "binary": "life",
549
+ "flag": true,
550
+ "family": "life",
551
+ "session": "Veri7vn_Life"
552
+ },
553
+ "microbiology-v2": {
554
+ "binary": "life",
555
+ "flag": true,
556
+ "family": "life",
557
+ "session": "Veri7vn_Life"
558
+ },
559
+ "additive-v2": {
560
+ "binary": "materials",
561
+ "flag": true,
562
+ "family": "materials",
563
+ "session": "Veri7vn_Materials"
564
+ },
565
+ "materials-v2": {
566
+ "binary": "materials",
567
+ "flag": true,
568
+ "family": "materials",
569
+ "session": "Veri7vn_Materials"
570
+ },
571
+ "soil": {
572
+ "binary": "materials",
573
+ "flag": true,
574
+ "family": "materials",
575
+ "session": "Veri7vn_Materials"
576
+ },
577
+ "soil-r2": {
578
+ "binary": "materials",
579
+ "flag": true,
580
+ "family": "materials",
581
+ "session": "Veri7vn_Materials"
582
+ },
583
+ "water": {
584
+ "binary": "materials",
585
+ "flag": true,
586
+ "family": "materials",
587
+ "session": "Veri7vn_Materials"
588
+ },
589
+ "water-r3": {
590
+ "binary": "materials",
591
+ "flag": true,
592
+ "family": "materials",
593
+ "session": "Veri7vn_Materials"
594
+ },
595
+ "physics": {
596
+ "binary": "mechanics",
597
+ "flag": true,
598
+ "family": "mechanics",
599
+ "session": "Veri7vn_Mechanics"
600
+ },
601
+ "physics-r2": {
602
+ "binary": "mechanics",
603
+ "flag": true,
604
+ "family": "mechanics",
605
+ "session": "Veri7vn_Mechanics"
606
+ },
607
+ "physics-r3": {
608
+ "binary": "mechanics",
609
+ "flag": true,
610
+ "family": "mechanics",
611
+ "session": "Veri7vn_Mechanics"
612
+ },
613
+ "mechanisms": {
614
+ "binary": "mechanics",
615
+ "flag": true,
616
+ "family": "mechanics",
617
+ "session": "Veri7vn_Mechanics"
618
+ },
619
+ "mechanisms-v2": {
620
+ "binary": "mechanics",
621
+ "flag": true,
622
+ "family": "mechanics",
623
+ "session": "Veri7vn_Mechanics"
624
+ },
625
+ "bodies-v2": {
626
+ "binary": "mechanics",
627
+ "flag": true,
628
+ "family": "mechanics",
629
+ "session": "Veri7vn_Mechanics"
630
+ },
631
+ "sports": {
632
+ "binary": "mechanics",
633
+ "flag": true,
634
+ "family": "mechanics",
635
+ "session": "Veri7vn_Mechanics"
636
+ },
637
+ "fleet": {
638
+ "binary": "mechanics",
639
+ "flag": true,
640
+ "family": "mechanics",
641
+ "session": "Veri7vn_Mechanics"
642
+ },
643
+ "fluids-r2": {
644
+ "binary": "mechanics",
645
+ "flag": true,
646
+ "family": "mechanics",
647
+ "session": "Veri7vn_Mechanics"
648
+ },
649
+ "densities": {
650
+ "binary": "quantity",
651
+ "flag": true,
652
+ "family": "quantity",
653
+ "session": "Veri7vn_Quantity"
654
+ },
655
+ "units": {
656
+ "binary": "quantity",
657
+ "flag": true,
658
+ "family": "quantity",
659
+ "session": "Veri7vn_Quantity"
660
+ },
661
+ "units-v3": {
662
+ "binary": "quantity",
663
+ "flag": true,
664
+ "family": "quantity",
665
+ "session": "Veri7vn_Quantity"
666
+ },
667
+ "springs": {
668
+ "binary": "quantity",
669
+ "flag": true,
670
+ "family": "quantity",
671
+ "session": "Veri7vn_Quantity"
672
+ },
673
+ "fluids": {
674
+ "binary": "quantity",
675
+ "flag": true,
676
+ "family": "quantity",
677
+ "session": "Veri7vn_Quantity"
678
+ },
679
+ "fuels": {
680
+ "binary": "quantity",
681
+ "flag": true,
682
+ "family": "quantity",
683
+ "session": "Veri7vn_Quantity"
684
+ },
685
+ "orbits": {
686
+ "binary": "space",
687
+ "flag": true,
688
+ "family": "space",
689
+ "session": "Veri7vn_Space"
690
+ },
691
+ "planetary": {
692
+ "binary": "space",
693
+ "flag": true,
694
+ "family": "space",
695
+ "session": "Veri7vn_Space"
696
+ },
697
+ "spacecraft": {
698
+ "binary": "space",
699
+ "flag": true,
700
+ "family": "space",
701
+ "session": "Veri7vn_Space"
702
+ },
703
+ "spacecomms": {
704
+ "binary": "space",
705
+ "flag": true,
706
+ "family": "space",
707
+ "session": "Veri7vn_Space"
708
+ },
709
+ "astronomy": {
710
+ "binary": "space",
711
+ "flag": true,
712
+ "family": "space",
713
+ "session": "Veri7vn_Space"
714
+ },
715
+ "astronomy-v2": {
716
+ "binary": "space",
717
+ "flag": true,
718
+ "family": "space",
719
+ "session": "Veri7vn_Space"
720
+ },
721
+ "astronomy-v3": {
722
+ "binary": "space",
723
+ "flag": true,
724
+ "family": "space",
725
+ "session": "Veri7vn_Space"
726
+ },
727
+ "astronomy-v3-r2": {
728
+ "binary": "space",
729
+ "flag": true,
730
+ "family": "space",
731
+ "session": "Veri7vn_Space"
732
+ },
733
+ "cooking": {
734
+ "binary": "stores",
735
+ "flag": true,
736
+ "family": "stores",
737
+ "session": "Veri7vn_Stores"
738
+ },
739
+ "cooking-v2": {
740
+ "binary": "stores",
741
+ "flag": true,
742
+ "family": "stores",
743
+ "session": "Veri7vn_Stores"
744
+ },
745
+ "cooking-v3": {
746
+ "binary": "stores",
747
+ "flag": true,
748
+ "family": "stores",
749
+ "session": "Veri7vn_Stores"
750
+ },
751
+ "cooking-v3-r2": {
752
+ "binary": "stores",
753
+ "flag": true,
754
+ "family": "stores",
755
+ "session": "Veri7vn_Stores"
756
+ },
757
+ "warehouse": {
758
+ "binary": "stores",
759
+ "flag": true,
760
+ "family": "stores",
761
+ "session": "Veri7vn_Stores"
762
+ },
763
+ "warehouse-r2": {
764
+ "binary": "stores",
765
+ "flag": true,
766
+ "family": "stores",
767
+ "session": "Veri7vn_Stores"
768
+ },
769
+ "architecture": {
770
+ "binary": "trades",
771
+ "flag": true,
772
+ "family": "trades",
773
+ "session": "Veri7vn_Trades"
774
+ },
775
+ "printing": {
776
+ "binary": "trades",
777
+ "flag": true,
778
+ "family": "trades",
779
+ "session": "Veri7vn_Trades"
780
+ },
781
+ "printing-v2": {
782
+ "binary": "trades",
783
+ "flag": true,
784
+ "family": "trades",
785
+ "session": "Veri7vn_Trades"
786
+ },
787
+ "safety": {
788
+ "binary": "trades",
789
+ "flag": true,
790
+ "family": "trades",
791
+ "session": "Veri7vn_Trades"
792
+ },
793
+ "woodworking": {
794
+ "binary": "trades",
795
+ "flag": true,
796
+ "family": "trades",
797
+ "session": "Veri7vn_Trades"
798
+ },
799
+ "crafts": {
800
+ "binary": "trades",
801
+ "flag": true,
802
+ "family": "trades",
803
+ "session": "Veri7vn_Trades"
804
+ }
805
+ }
806
+ }
root/specialists/_proved/SHA256SUMS ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 4f22f4159849938674cbb4da325c7cde322f026b70306ea2f242bae05fd137b9 acoustics
2
+ 99df1f11b3920fc81f9462ffcf7e207f46da5309a9f96c3de3d9d371a8ba0fdd anatomyagri
3
+ e1292ae5a7fbc67ceeb94c38a0c9172379214a2ff7005ee1c9685e6ba460343c chemistry
4
+ 15de19eb7a04447e23a7aa155ff05978c40f4ffb6d85163ddf7f9e143bcd5a92 climate
5
+ 52ff108928f06ee64ef41c34599027f0e98f1ac28964a4d227fa0d2b191e3f5c computing
6
+ f948026d0935b07a3e073be0d94c5c0e9d567973cbb88c10fb915001cd14e563 decide
7
+ 555718394b624bec0a90615ba3feef312c5fd0bb037ca05b155602a4e28e0a37 discrete
8
+ f013d847f239bed7f616fc9a007b3831c99cfb73a7a5030be1317d4d9cdfe071 emoptics
9
+ df8449c8284dda0b63a0f6d40767e4721e3cdb59682344f6f30e0ea4c5580ea8 energy
10
+ 746bab8b08c15024bae763c9627b9874d3b21ba4623b0107d604bc6bd8fe0719 facts
11
+ 0f765ab3ca5b4b6a405e6401ac8b3f6ea915d38992fbf1d176ed7837019ee969 fusion
12
+ f92a48c4c941846bda06de9bec32bb9238f60edde022fd844334b7d73905680b geostats
13
+ 3befad7a8d17c9bee411fd38e658866e93e8f6d2c325f641a08ce2acc5facd5e humanities
14
+ 65748246c35730eeed5e733017ac0590193d4dfad5423125eb393461fc3fb0e2 life
15
+ 6a548f83db9973f647fa43a16860c56bc933f6a40a2a53dfafb056d24ecdffe4 materials
16
+ 7c636d4ca6a1b8f66cfe11fc3b51dcc221efb252565828fe69056257c6aa1a25 mechanics
17
+ 368849c4e9cee834ee609f4b6617f7afac2c85817a2bf664960f2e0cafdbc976 quantity
18
+ 725a57a7ec25a13f1a8f155183013520b3c1636c91cd3a90c4440e06a0c0552e space
19
+ 20ebbd038131be04642d80626dfa1fca6c03430f6e0bc7f6a8ca726633628e68 stores
20
+ cb3f5063d873f68daeec59cc031d1492ef0cab7ac4a2fa9b5ab3db78fd3eaecf trades
root/specialists/_proved/bin/acoustics ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4f22f4159849938674cbb4da325c7cde322f026b70306ea2f242bae05fd137b9
3
+ size 1939384
root/specialists/_proved/bin/anatomyagri ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:99df1f11b3920fc81f9462ffcf7e207f46da5309a9f96c3de3d9d371a8ba0fdd
3
+ size 1920688
root/specialists/_proved/bin/chemistry ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e1292ae5a7fbc67ceeb94c38a0c9172379214a2ff7005ee1c9685e6ba460343c
3
+ size 2518624
root/specialists/_proved/bin/climate ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:15de19eb7a04447e23a7aa155ff05978c40f4ffb6d85163ddf7f9e143bcd5a92
3
+ size 2281096
root/specialists/_proved/bin/computing ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52ff108928f06ee64ef41c34599027f0e98f1ac28964a4d227fa0d2b191e3f5c
3
+ size 3430376
root/specialists/_proved/bin/decide ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f948026d0935b07a3e073be0d94c5c0e9d567973cbb88c10fb915001cd14e563
3
+ size 2098832
root/specialists/_proved/bin/discrete ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:555718394b624bec0a90615ba3feef312c5fd0bb037ca05b155602a4e28e0a37
3
+ size 2931232
root/specialists/_proved/bin/emoptics ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f013d847f239bed7f616fc9a007b3831c99cfb73a7a5030be1317d4d9cdfe071
3
+ size 2665960
root/specialists/_proved/bin/energy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:df8449c8284dda0b63a0f6d40767e4721e3cdb59682344f6f30e0ea4c5580ea8
3
+ size 2540072
root/specialists/_proved/bin/facts ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:746bab8b08c15024bae763c9627b9874d3b21ba4623b0107d604bc6bd8fe0719
3
+ size 1638712
root/specialists/_proved/bin/fusion ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:0f765ab3ca5b4b6a405e6401ac8b3f6ea915d38992fbf1d176ed7837019ee969
3
+ size 1914848
root/specialists/_proved/bin/geostats ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f92a48c4c941846bda06de9bec32bb9238f60edde022fd844334b7d73905680b
3
+ size 2269952
root/specialists/_proved/bin/humanities ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3befad7a8d17c9bee411fd38e658866e93e8f6d2c325f641a08ce2acc5facd5e
3
+ size 2344592
root/specialists/_proved/bin/life ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:65748246c35730eeed5e733017ac0590193d4dfad5423125eb393461fc3fb0e2
3
+ size 2575840
root/specialists/_proved/bin/materials ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6a548f83db9973f647fa43a16860c56bc933f6a40a2a53dfafb056d24ecdffe4
3
+ size 2692744
root/specialists/_proved/bin/mechanics ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7c636d4ca6a1b8f66cfe11fc3b51dcc221efb252565828fe69056257c6aa1a25
3
+ size 2413192
root/specialists/_proved/bin/quantity ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:368849c4e9cee834ee609f4b6617f7afac2c85817a2bf664960f2e0cafdbc976
3
+ size 2229104
root/specialists/_proved/bin/space ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:725a57a7ec25a13f1a8f155183013520b3c1636c91cd3a90c4440e06a0c0552e
3
+ size 2530424
root/specialists/_proved/bin/stores ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:20ebbd038131be04642d80626dfa1fca6c03430f6e0bc7f6a8ca726633628e68
3
+ size 2353968
root/specialists/_proved/bin/trades ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cb3f5063d873f68daeec59cc031d1492ef0cab7ac4a2fa9b5ab3db78fd3eaecf
3
+ size 2723040
root/specialists/decay-r2/INHERITED.json ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "decay-r2",
3
+ "inherits": "decay",
4
+ "why": "narrowing patch r2 (sealed composition test C4, item c4-28): a remaining amount is converted to the mass unit the question asks for",
5
+ "invariance": "invariance_v1 over the decay panel: dev 0 of 42 and held-out 0 of 42 replies differ, so the held-out measurement carries over (factory rule 2026-09-29)",
6
+ "core_overlap": "0 of 3107 core items taken",
7
+ "time": "2026-10-18T04:40:01Z"
8
+ }
root/specialists/decay-r2/decay_panel_v1.json ADDED
@@ -0,0 +1,590 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "split": "dev",
4
+ "kind": "remaining_amount",
5
+ "valid": true,
6
+ "q": "A sample has 50 g of americium-241. How much remains after 432.6 years?",
7
+ "expect": 25.0
8
+ },
9
+ {
10
+ "split": "dev",
11
+ "kind": "remaining_amount",
12
+ "valid": true,
13
+ "q": "A substance has a half-life of 12 days. How much of 40 mg remains after 24 days?",
14
+ "expect": 10.0
15
+ },
16
+ {
17
+ "split": "dev",
18
+ "kind": "remaining_fraction",
19
+ "valid": true,
20
+ "q": "What fraction of technetium-99m remains after 12.01 hours?",
21
+ "expect": 0.2500981055652238
22
+ },
23
+ {
24
+ "split": "dev",
25
+ "kind": "time_to_fraction",
26
+ "valid": true,
27
+ "q": "How many years until only 50% of a sample of tritium remains?",
28
+ "expect": 12.32
29
+ },
30
+ {
31
+ "split": "dev",
32
+ "kind": "half_lives",
33
+ "valid": true,
34
+ "q": "How many half-lives of carbon-14 pass in 11460 years?",
35
+ "expect": 2.0
36
+ },
37
+ {
38
+ "split": "dev",
39
+ "kind": "remaining_amount",
40
+ "valid": true,
41
+ "q": "A sample has 100 g of caesium-137. How much remains after 15.04 years?",
42
+ "expect": 70.71067811865476
43
+ },
44
+ {
45
+ "split": "dev",
46
+ "kind": "remaining_amount",
47
+ "valid": true,
48
+ "q": "A substance has a half-life of 8 days. How much of 40 mg remains after 4 days?",
49
+ "expect": 28.284271247461902
50
+ },
51
+ {
52
+ "split": "dev",
53
+ "kind": "remaining_fraction",
54
+ "valid": true,
55
+ "q": "What fraction of radon-222 remains after 11.47 days?",
56
+ "expect": 0.12501133089113353
57
+ },
58
+ {
59
+ "split": "dev",
60
+ "kind": "time_to_fraction",
61
+ "valid": true,
62
+ "q": "How many days until only 10% of a sample of phosphorus-32 remains?",
63
+ "expect": 47.39727005785289
64
+ },
65
+ {
66
+ "split": "dev",
67
+ "kind": "half_lives",
68
+ "valid": true,
69
+ "q": "How many half-lives of radon-222 pass in 17.21 days?",
70
+ "expect": 4.5011115470119005
71
+ },
72
+ {
73
+ "split": "dev",
74
+ "kind": "remaining_amount",
75
+ "valid": true,
76
+ "q": "A sample has 250 g of phosphorus-32. How much remains after 7.13 days?",
77
+ "expect": 176.81105026553874
78
+ },
79
+ {
80
+ "split": "dev",
81
+ "kind": "remaining_amount",
82
+ "valid": true,
83
+ "q": "A substance has a half-life of 12 days. How much of 200 mg remains after 10 days?",
84
+ "expect": 112.2462048309373
85
+ },
86
+ {
87
+ "split": "dev",
88
+ "kind": "remaining_fraction",
89
+ "valid": true,
90
+ "q": "What fraction of carbon-14 remains after 5730 years?",
91
+ "expect": 0.5
92
+ },
93
+ {
94
+ "split": "dev",
95
+ "kind": "time_to_fraction",
96
+ "valid": true,
97
+ "q": "How many years until only 50% of a sample of caesium-137 remains?",
98
+ "expect": 30.08
99
+ },
100
+ {
101
+ "split": "dev",
102
+ "kind": "half_lives",
103
+ "valid": true,
104
+ "q": "How many half-lives of radon-222 pass in 7.65 days?",
105
+ "expect": 2.000784621420165
106
+ },
107
+ {
108
+ "split": "dev",
109
+ "kind": "remaining_amount",
110
+ "valid": true,
111
+ "q": "A sample has 250 g of fluorine-18. How much remains after 658.62 minutes?",
112
+ "expect": 3.90625
113
+ },
114
+ {
115
+ "split": "dev",
116
+ "kind": "remaining_amount",
117
+ "valid": true,
118
+ "q": "A substance has a half-life of 8 days. How much of 200 mg remains after 4 days?",
119
+ "expect": 141.4213562373095
120
+ },
121
+ {
122
+ "split": "dev",
123
+ "kind": "remaining_fraction",
124
+ "valid": true,
125
+ "q": "What fraction of radon-222 remains after 7.65 days?",
126
+ "expect": 0.24986407243470724
127
+ },
128
+ {
129
+ "split": "dev",
130
+ "kind": "time_to_fraction",
131
+ "valid": true,
132
+ "q": "How many years until only 50% of a sample of caesium-137 remains?",
133
+ "expect": 30.08
134
+ },
135
+ {
136
+ "split": "dev",
137
+ "kind": "half_lives",
138
+ "valid": true,
139
+ "q": "How many half-lives of technetium-99m pass in 90.1 hours?",
140
+ "expect": 14.999916759618424
141
+ },
142
+ {
143
+ "split": "dev",
144
+ "kind": "remaining_amount",
145
+ "valid": true,
146
+ "q": "A sample has 50 g of strontium-90. How much remains after 28.79 years?",
147
+ "expect": 25.0
148
+ },
149
+ {
150
+ "split": "dev",
151
+ "kind": "remaining_amount",
152
+ "valid": true,
153
+ "q": "A substance has a half-life of 5 days. How much of 1000 mg remains after 10 days?",
154
+ "expect": 250.0
155
+ },
156
+ {
157
+ "split": "dev",
158
+ "kind": "remaining_fraction",
159
+ "valid": true,
160
+ "q": "What fraction of carbon-14 remains after 5730 years?",
161
+ "expect": 0.5
162
+ },
163
+ {
164
+ "split": "dev",
165
+ "kind": "time_to_fraction",
166
+ "valid": true,
167
+ "q": "How many years until only 5% of a sample of radium-226 remains?",
168
+ "expect": 6915.08495181978
169
+ },
170
+ {
171
+ "split": "dev",
172
+ "kind": "half_lives",
173
+ "valid": true,
174
+ "q": "How many half-lives of americium-241 pass in 1946.7 years?",
175
+ "expect": 4.5
176
+ },
177
+ {
178
+ "split": "dev",
179
+ "kind": "remaining_amount",
180
+ "valid": true,
181
+ "q": "A sample has 800 g of carbon-14. How much remains after 5730 years?",
182
+ "expect": 400.0
183
+ },
184
+ {
185
+ "split": "dev",
186
+ "kind": "remaining_amount",
187
+ "valid": true,
188
+ "q": "A substance has a half-life of 12 days. How much of 40 mg remains after 4 days?",
189
+ "expect": 31.74802103936399
190
+ },
191
+ {
192
+ "split": "dev",
193
+ "kind": "remaining_fraction",
194
+ "valid": true,
195
+ "q": "What fraction of carbon-14 remains after 5730 years?",
196
+ "expect": 0.5
197
+ },
198
+ {
199
+ "split": "dev",
200
+ "kind": "time_to_fraction",
201
+ "valid": true,
202
+ "q": "How many years until only 25% of a sample of americium-241 remains?",
203
+ "expect": 865.2
204
+ },
205
+ {
206
+ "split": "dev",
207
+ "kind": "half_lives",
208
+ "valid": true,
209
+ "q": "How many half-lives of technetium-99m pass in 18.02 hours?",
210
+ "expect": 2.999983351923685
211
+ },
212
+ {
213
+ "split": "dev",
214
+ "kind": "remaining_amount",
215
+ "valid": true,
216
+ "q": "A sample has 800 g of caesium-137. How much remains after 105.28 years?",
217
+ "expect": 70.71067811865474
218
+ },
219
+ {
220
+ "split": "dev",
221
+ "kind": "remaining_amount",
222
+ "valid": true,
223
+ "q": "A substance has a half-life of 12 days. How much of 1000 mg remains after 30 days?",
224
+ "expect": 176.7766952966369
225
+ },
226
+ {
227
+ "split": "dev",
228
+ "kind": "remaining_fraction",
229
+ "valid": true,
230
+ "q": "What fraction of cobalt-60 remains after 23.72 years?",
231
+ "expect": 0.044201729007020775
232
+ },
233
+ {
234
+ "split": "dev",
235
+ "kind": "time_to_fraction",
236
+ "valid": true,
237
+ "q": "How many minutes until only 50% of a sample of fluorine-18 remains?",
238
+ "expect": 109.77
239
+ },
240
+ {
241
+ "split": "dev",
242
+ "kind": "half_lives",
243
+ "valid": true,
244
+ "q": "How many half-lives of tritium pass in 36.96 years?",
245
+ "expect": 3.0
246
+ },
247
+ {
248
+ "split": "dev",
249
+ "kind": "remaining_amount",
250
+ "valid": true,
251
+ "q": "A sample has 10 g of radium-226. How much remains after 9600 years?",
252
+ "expect": 0.15625
253
+ },
254
+ {
255
+ "split": "dev",
256
+ "kind": "remaining_amount",
257
+ "valid": true,
258
+ "q": "A substance has a half-life of 2 days. How much of 40 mg remains after 24 days?",
259
+ "expect": 0.009765625
260
+ },
261
+ {
262
+ "split": "dev",
263
+ "kind": "remaining_fraction",
264
+ "valid": true,
265
+ "q": "What fraction of cobalt-60 remains after 23.72 years?",
266
+ "expect": 0.044201729007020775
267
+ },
268
+ {
269
+ "split": "dev",
270
+ "kind": "time_to_fraction",
271
+ "valid": true,
272
+ "q": "How many years until only 50% of a sample of plutonium-239 remains?",
273
+ "expect": 24110.0
274
+ },
275
+ {
276
+ "split": "dev",
277
+ "kind": "half_lives",
278
+ "valid": true,
279
+ "q": "How many half-lives of caesium-137 pass in 90.24 years?",
280
+ "expect": 3.0
281
+ },
282
+ {
283
+ "split": "dev",
284
+ "kind": "decline",
285
+ "valid": false,
286
+ "q": "How much carbon-14 remains after 1000 years?",
287
+ "expect": "decline"
288
+ },
289
+ {
290
+ "split": "dev",
291
+ "kind": "decline",
292
+ "valid": false,
293
+ "q": "What fraction of iodine-131 remains?",
294
+ "expect": "decline"
295
+ },
296
+ {
297
+ "split": "heldout",
298
+ "kind": "remaining_amount",
299
+ "valid": true,
300
+ "q": "Starting with 250 g of phosphorus-32, how many grams are left after 7.13 days?",
301
+ "expect": 176.81105026553874
302
+ },
303
+ {
304
+ "split": "heldout",
305
+ "kind": "remaining_amount",
306
+ "valid": true,
307
+ "q": "An isotope's half-life is 8 days. If you begin with 40 mg, how much is still left after 10 days?",
308
+ "expect": 16.81792830507429
309
+ },
310
+ {
311
+ "split": "heldout",
312
+ "kind": "remaining_fraction",
313
+ "valid": true,
314
+ "q": "After 865.2 years, what fraction of the original americium-241 is still remaining?",
315
+ "expect": 0.25
316
+ },
317
+ {
318
+ "split": "heldout",
319
+ "kind": "time_to_fraction",
320
+ "valid": true,
321
+ "q": "For plutonium-239, how many years does it take until 1% of it remains?",
322
+ "expect": 160183.3727354686
323
+ },
324
+ {
325
+ "split": "heldout",
326
+ "kind": "half_lives",
327
+ "valid": true,
328
+ "q": "In 143.95 years, how many half-lives of strontium-90 have gone by?",
329
+ "expect": 5.0
330
+ },
331
+ {
332
+ "split": "heldout",
333
+ "kind": "remaining_amount",
334
+ "valid": true,
335
+ "q": "Starting with 800 g of tritium, how many grams are left after 24.64 years?",
336
+ "expect": 200.0
337
+ },
338
+ {
339
+ "split": "heldout",
340
+ "kind": "remaining_amount",
341
+ "valid": true,
342
+ "q": "An isotope's half-life is 12 days. If you begin with 200 mg, how much is still left after 30 days?",
343
+ "expect": 35.35533905932738
344
+ },
345
+ {
346
+ "split": "heldout",
347
+ "kind": "remaining_fraction",
348
+ "valid": true,
349
+ "q": "After 109.77 minutes, what fraction of the original fluorine-18 is still remaining?",
350
+ "expect": 0.5
351
+ },
352
+ {
353
+ "split": "heldout",
354
+ "kind": "time_to_fraction",
355
+ "valid": true,
356
+ "q": "For cobalt-60, how many years does it take until 10% of it remains?",
357
+ "expect": 17.511211759389244
358
+ },
359
+ {
360
+ "split": "heldout",
361
+ "kind": "half_lives",
362
+ "valid": true,
363
+ "q": "In 15.81 years, how many half-lives of cobalt-60 have gone by?",
364
+ "expect": 2.99920324771408
365
+ },
366
+ {
367
+ "split": "heldout",
368
+ "kind": "remaining_amount",
369
+ "valid": true,
370
+ "q": "Starting with 100 g of fluorine-18, how many grams are left after 658.62 minutes?",
371
+ "expect": 1.5625
372
+ },
373
+ {
374
+ "split": "heldout",
375
+ "kind": "remaining_amount",
376
+ "valid": true,
377
+ "q": "An isotope's half-life is 8 days. If you begin with 1000 mg, how much is still left after 30 days?",
378
+ "expect": 74.32544468767007
379
+ },
380
+ {
381
+ "split": "heldout",
382
+ "kind": "remaining_fraction",
383
+ "valid": true,
384
+ "q": "After 8.03 days, what fraction of the original iodine-131 is still remaining?",
385
+ "expect": 0.4997927517767696
386
+ },
387
+ {
388
+ "split": "heldout",
389
+ "kind": "time_to_fraction",
390
+ "valid": true,
391
+ "q": "For strontium-90, how many years does it take until 10% of it remains?",
392
+ "expect": 95.63830985180716
393
+ },
394
+ {
395
+ "split": "heldout",
396
+ "kind": "half_lives",
397
+ "valid": true,
398
+ "q": "In 215.92 years, how many half-lives of strontium-90 have gone by?",
399
+ "expect": 7.499826328586314
400
+ },
401
+ {
402
+ "split": "heldout",
403
+ "kind": "remaining_amount",
404
+ "valid": true,
405
+ "q": "Starting with 250 g of strontium-90, how many grams are left after 100.77 years?",
406
+ "expect": 22.094427028156776
407
+ },
408
+ {
409
+ "split": "heldout",
410
+ "kind": "remaining_amount",
411
+ "valid": true,
412
+ "q": "An isotope's half-life is 12 days. If you begin with 200 mg, how much is still left after 24 days?",
413
+ "expect": 50.0
414
+ },
415
+ {
416
+ "split": "heldout",
417
+ "kind": "remaining_fraction",
418
+ "valid": true,
419
+ "q": "After 72330 years, what fraction of the original plutonium-239 is still remaining?",
420
+ "expect": 0.125
421
+ },
422
+ {
423
+ "split": "heldout",
424
+ "kind": "time_to_fraction",
425
+ "valid": true,
426
+ "q": "For caesium-137, how many years does it take until 50% of it remains?",
427
+ "expect": 30.08
428
+ },
429
+ {
430
+ "split": "heldout",
431
+ "kind": "half_lives",
432
+ "valid": true,
433
+ "q": "In 135.36 years, how many half-lives of caesium-137 have gone by?",
434
+ "expect": 4.500000000000001
435
+ },
436
+ {
437
+ "split": "heldout",
438
+ "kind": "remaining_amount",
439
+ "valid": true,
440
+ "q": "Starting with 10 g of americium-241, how many grams are left after 216.3 years?",
441
+ "expect": 7.0710678118654755
442
+ },
443
+ {
444
+ "split": "heldout",
445
+ "kind": "remaining_amount",
446
+ "valid": true,
447
+ "q": "An isotope's half-life is 12 days. If you begin with 1000 mg, how much is still left after 10 days?",
448
+ "expect": 561.2310241546866
449
+ },
450
+ {
451
+ "split": "heldout",
452
+ "kind": "remaining_fraction",
453
+ "valid": true,
454
+ "q": "After 129.56 years, what fraction of the original strontium-90 is still remaining?",
455
+ "expect": 0.04418885405631354
456
+ },
457
+ {
458
+ "split": "heldout",
459
+ "kind": "time_to_fraction",
460
+ "valid": true,
461
+ "q": "For technetium-99m, how many hours does it take until 5% of it remains?",
462
+ "expect": 25.960525487559924
463
+ },
464
+ {
465
+ "split": "heldout",
466
+ "kind": "half_lives",
467
+ "valid": true,
468
+ "q": "In 71.34 days, how many half-lives of phosphorus-32 have gone by?",
469
+ "expect": 5.0
470
+ },
471
+ {
472
+ "split": "heldout",
473
+ "kind": "remaining_amount",
474
+ "valid": true,
475
+ "q": "Starting with 800 g of caesium-137, how many grams are left after 30.08 years?",
476
+ "expect": 400.0
477
+ },
478
+ {
479
+ "split": "heldout",
480
+ "kind": "remaining_amount",
481
+ "valid": true,
482
+ "q": "An isotope's half-life is 5 days. If you begin with 200 mg, how much is still left after 10 days?",
483
+ "expect": 50.0
484
+ },
485
+ {
486
+ "split": "heldout",
487
+ "kind": "remaining_fraction",
488
+ "valid": true,
489
+ "q": "After 3.82 days, what fraction of the original radon-222 is still remaining?",
490
+ "expect": 0.5003173512422465
491
+ },
492
+ {
493
+ "split": "heldout",
494
+ "kind": "time_to_fraction",
495
+ "valid": true,
496
+ "q": "For radon-222, how many days does it take until 50% of it remains?",
497
+ "expect": 3.8235
498
+ },
499
+ {
500
+ "split": "heldout",
501
+ "kind": "half_lives",
502
+ "valid": true,
503
+ "q": "In 39.54 years, how many half-lives of cobalt-60 have gone by?",
504
+ "expect": 7.500853663163486
505
+ },
506
+ {
507
+ "split": "heldout",
508
+ "kind": "remaining_amount",
509
+ "valid": true,
510
+ "q": "Starting with 10 g of technetium-99m, how many grams are left after 6.01 hours?",
511
+ "expect": 4.998096333905179
512
+ },
513
+ {
514
+ "split": "heldout",
515
+ "kind": "remaining_amount",
516
+ "valid": true,
517
+ "q": "An isotope's half-life is 5 days. If you begin with 1000 mg, how much is still left after 24 days?",
518
+ "expect": 35.896823593657345
519
+ },
520
+ {
521
+ "split": "heldout",
522
+ "kind": "remaining_fraction",
523
+ "valid": true,
524
+ "q": "After 24.64 years, what fraction of the original tritium is still remaining?",
525
+ "expect": 0.25
526
+ },
527
+ {
528
+ "split": "heldout",
529
+ "kind": "time_to_fraction",
530
+ "valid": true,
531
+ "q": "For phosphorus-32, how many days does it take until 5% of it remains?",
532
+ "expect": 61.665270057852894
533
+ },
534
+ {
535
+ "split": "heldout",
536
+ "kind": "half_lives",
537
+ "valid": true,
538
+ "q": "In 61.6 years, how many half-lives of tritium have gone by?",
539
+ "expect": 5.0
540
+ },
541
+ {
542
+ "split": "heldout",
543
+ "kind": "remaining_amount",
544
+ "valid": true,
545
+ "q": "Starting with 800 g of carbon-14, how many grams are left after 5730 years?",
546
+ "expect": 400.0
547
+ },
548
+ {
549
+ "split": "heldout",
550
+ "kind": "remaining_amount",
551
+ "valid": true,
552
+ "q": "An isotope's half-life is 5 days. If you begin with 200 mg, how much is still left after 30 days?",
553
+ "expect": 3.125
554
+ },
555
+ {
556
+ "split": "heldout",
557
+ "kind": "remaining_fraction",
558
+ "valid": true,
559
+ "q": "After 55.44 years, what fraction of the original tritium is still remaining?",
560
+ "expect": 0.04419417382415922
561
+ },
562
+ {
563
+ "split": "heldout",
564
+ "kind": "time_to_fraction",
565
+ "valid": true,
566
+ "q": "For strontium-90, how many years does it take until 5% of it remains?",
567
+ "expect": 124.42830985180717
568
+ },
569
+ {
570
+ "split": "heldout",
571
+ "kind": "half_lives",
572
+ "valid": true,
573
+ "q": "In 60.16 years, how many half-lives of caesium-137 have gone by?",
574
+ "expect": 2.0
575
+ },
576
+ {
577
+ "split": "heldout",
578
+ "kind": "decline",
579
+ "valid": false,
580
+ "q": "How much cobalt-60 is left after 10 years?",
581
+ "expect": "decline"
582
+ },
583
+ {
584
+ "split": "heldout",
585
+ "kind": "decline",
586
+ "valid": false,
587
+ "q": "What fraction of radon-222 is still remaining?",
588
+ "expect": "decline"
589
+ }
590
+ ]
root/specialists/decay-r2/decay_panel_v1.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """decay_panel_v1 - the sealed panel for specialist #104 (radioactive decay). Answers from the panel's OWN half-life table
3
+ (NNDC / NuDat 3) and N = N0 (1/2)^(t/T), written here separately from the organ. Dev / held-out differ in seed, isotopes
4
+ and phrasing (same author - disclosed). Must-decline: the time or amount missing.
5
+ usage: decay_panel_v1.py <out.json>"""
6
+ import json
7
+ import math
8
+ import random
9
+ import sys
10
+
11
+ HL = {"carbon-14": (5730, "years"), "cobalt-60": (5.2714, "years"), "caesium-137": (30.08, "years"), "strontium-90": (28.79, "years"),
12
+ "tritium": (12.32, "years"), "radium-226": (1600, "years"), "plutonium-239": (24110, "years"), "americium-241": (432.6, "years"),
13
+ "iodine-131": (8.0252, "days"), "radon-222": (3.8235, "days"), "phosphorus-32": (14.268, "days"),
14
+ "technetium-99m": (6.0067, "hours"), "fluorine-18": (109.77, "minutes")}
15
+ T = {"dev": {"remain": "A sample has {a} g of {i}. How much remains after {t} {u}?",
16
+ "given": "A substance has a half-life of {h} days. How much of {a} mg remains after {t} days?",
17
+ "frac": "What fraction of {i} remains after {t} {u}?",
18
+ "until": "How many {u} until only {p}% of a sample of {i} remains?",
19
+ "nhl": "How many half-lives of {i} pass in {t} {u}?"},
20
+ "heldout": {"remain": "Starting with {a} g of {i}, how many grams are left after {t} {u}?",
21
+ "given": "An isotope's half-life is {h} days. If you begin with {a} mg, how much is still left after {t} days?",
22
+ "frac": "After {t} {u}, what fraction of the original {i} is still remaining?",
23
+ "until": "For {i}, how many {u} does it take until {p}% of it remains?",
24
+ "nhl": "In {t} {u}, how many half-lives of {i} have gone by?"}}
25
+ DECLINE = {"dev": ["How much carbon-14 remains after 1000 years?", "What fraction of iodine-131 remains?"],
26
+ "heldout": ["How much cobalt-60 is left after 10 years?", "What fraction of radon-222 is still remaining?"]}
27
+
28
+
29
+ def main():
30
+ items = []
31
+ for split, seed in (("dev", 104), ("heldout", 10404)):
32
+ rng = random.Random(seed)
33
+ t = T[split]
34
+ iso = sorted(HL)
35
+ for _ in range(8):
36
+ i = rng.choice(iso)
37
+ h, u = HL[i]
38
+ k = rng.choice([0.5, 1, 2, 3.5, 6])
39
+ a = rng.choice([10, 50, 100, 250, 800])
40
+ items.append({"split": split, "kind": "remaining_amount", "valid": True, "q": t["remain"].format(a=a, i=i, t=round(h * k, 2), u=u),
41
+ "expect": a * 0.5 ** (round(h * k, 2) / h)})
42
+ hd = rng.choice([2, 5, 8, 12])
43
+ tt = rng.choice([4, 10, 24, 30])
44
+ a = rng.choice([40, 200, 1000])
45
+ items.append({"split": split, "kind": "remaining_amount", "valid": True, "q": t["given"].format(h=hd, a=a, t=tt), "expect": a * 0.5 ** (tt / hd)})
46
+ i = rng.choice(iso)
47
+ h, u = HL[i]
48
+ k = rng.choice([1, 2, 3, 4.5])
49
+ items.append({"split": split, "kind": "remaining_fraction", "valid": True, "q": t["frac"].format(i=i, t=round(h * k, 2), u=u),
50
+ "expect": 0.5 ** (round(h * k, 2) / h)})
51
+ i = rng.choice(iso)
52
+ h, u = HL[i]
53
+ p = rng.choice([50, 25, 10, 5, 1])
54
+ items.append({"split": split, "kind": "time_to_fraction", "valid": True, "q": t["until"].format(u=u, p=p, i=i), "expect": h * math.log(100 / p, 2)})
55
+ i = rng.choice(iso)
56
+ h, u = HL[i]
57
+ tt = round(h * rng.choice([2, 3, 5, 10]) * rng.choice([1, 1.5]), 2)
58
+ items.append({"split": split, "kind": "half_lives", "valid": True, "q": t["nhl"].format(i=i, t=tt, u=u), "expect": tt / h})
59
+ for q in DECLINE[split]:
60
+ items.append({"split": split, "kind": "decline", "valid": False, "q": q, "expect": "decline"})
61
+ json.dump(items, open(sys.argv[1], "w"), indent=1)
62
+ import collections
63
+ print("panel:", dict(collections.Counter((i["split"], i["kind"]) for i in items)))
64
+
65
+
66
+ if __name__ == "__main__":
67
+ main()
root/specialists/decay-r2/decay_scorer.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """decay_scorer - the first number after "about" (opening "About ..." or "is/takes about ...") in the REPLY TEXT within 0.5%
3
+ of the panel's own value (the panel states the unit it asks for); a must-decline item answered is a false yes. (ok, asserted)"""
4
+ import re
5
+
6
+
7
+ def ok(p, r):
8
+ text = str((r or {}).get("response", ""))
9
+ answered = str((r or {}).get("status", "")) == "answered"
10
+ if not p["valid"]:
11
+ return (not answered), answered
12
+ if not answered:
13
+ return False, False
14
+ m = re.search(r"\b[Aa]bout\s+(-?\d+(?:\.\d+)?(?:e[+-]?\d+)?)", text)
15
+ if not m:
16
+ return False, True
17
+ got, want = float(m.group(1)), float(p["expect"])
18
+ return abs(got - want) <= 0.005 * abs(want) + 1e-9, True
root/specialists/decay-r2/manifest.json ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "decay-r2",
3
+ "name": "Oracle7 Radioactive Decay (r2: amount in the mass unit asked)",
4
+ "number": 104,
5
+ "tier": "A",
6
+ "sources": [
7
+ {
8
+ "name": "NNDC NuDat 3 half-lives (Brookhaven National Laboratory)",
9
+ "licence": "public domain (US government)",
10
+ "url": "https://www.nndc.bnl.gov/nudat3/"
11
+ },
12
+ {
13
+ "name": "Exponential decay N = N0 (1/2)^(t/T)",
14
+ "licence": "public domain (physical law)",
15
+ "url": "https://www.nndc.bnl.gov/"
16
+ }
17
+ ],
18
+ "store": {
19
+ "path": "__ORACLE7_ROOT__/specialists/decay-r2/organ_decay_r2.py"
20
+ },
21
+ "organ": {
22
+ "dir": "__ORACLE7_ROOT__/specialists/decay-r2",
23
+ "module": "organ_decay_r2",
24
+ "class": "DecayR2Organ",
25
+ "init": {}
26
+ },
27
+ "accept": {
28
+ "kinds": [
29
+ "remaining_amount",
30
+ "remaining_fraction",
31
+ "time_to_fraction",
32
+ "half_lives"
33
+ ],
34
+ "declines_in_domain": [
35
+ "underspecified"
36
+ ],
37
+ "context_regex": "\b(?:half[- ]?li(?:fe|ves)|decay\\w*|radioactive|isotope)\b"
38
+ },
39
+ "panel": {
40
+ "path": "__ORACLE7_ROOT__/specialists/decay-r2/decay_panel_v1.json",
41
+ "splits": [
42
+ "dev",
43
+ "heldout"
44
+ ],
45
+ "exclude_kinds_composed": [],
46
+ "scorer_module": "decay_scorer",
47
+ "scorer_fn": "ok"
48
+ },
49
+ "routing_cues": [
50
+ "half-life",
51
+ "remains after",
52
+ "how many half-lives",
53
+ "carbon-14",
54
+ "decay"
55
+ ],
56
+ "budgets": {
57
+ "latency_p50_ms": 50,
58
+ "store_mb": 1
59
+ },
60
+ "core_sample": {
61
+ "n": 400,
62
+ "seed": 20261008
63
+ },
64
+ "notes": "Half-life arithmetic for a stated half-life or a named isotope (NNDC values). Panel answers from the panel's own table, written separately; dev/held-out differ in seed and phrasing (same author). r2 (2026-10-18, sealed test C4 item c4-28): a remaining amount is converted to the mass unit the question asks for; byte-identical to decay on every panel input (invariance_v1)."
65
+ }
root/specialists/decay-r2/narrow_v1.py ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """narrow_v1 - the shared NARROWING rule for specialist organs (2026-09-29, from the full-core sweep):
3
+
4
+ WORD PROBLEMS AND NARRATIVE TURNS BELONG TO THE HEAD. An organ answers a direct domain question. A turn that tells a
5
+ story ("Justine wants to put a deck ...", "A new energy drink advertises 106 calories for 8 ounces ...") or relates
6
+ quantities to each other ("the length is 9 inches more than the width") is a word problem, which the core's word-
7
+ problem organ owns; organs firing on its nouns declined it or answered a different question.
8
+ An organ may DECLINE only a short direct question (it is then refusing the domain question that was asked); on
9
+ anything longer it says nothing and the head answers.
10
+
11
+ Narrowing only ever removes turns an organ takes, so on any input where it does not fire, the organ's reply is
12
+ byte-identical to the frozen version it wraps (checked per specialist by an invariance count before re-gating).
13
+ """
14
+ import re
15
+
16
+ RELATION = re.compile(r"\b(?:\d+(?:\.\d+)?|one|two|three|four|five|six|seven|eight|nine|ten)\s+(?:\w+\s+){0,2}(?:more|less|fewer|longer|shorter)\s+than\b|"
17
+ r"\b(?:twice|three times|half)\s+(?:as\s+\w+\s+as\s+)?the\s+\w+\b", re.I)
18
+
19
+
20
+ # a RATE ("106 calories for 8 ounces", "3 apples per 2 dollars") makes the turn a proportion problem
21
+ RATE = re.compile(r"\b\d+(?:\.\d+)?\s+[a-z]+\s+(?:for|per|every)\s+(?:\d+(?:\.\d+)?|a|an|one|each)\s+[a-z]+", re.I)
22
+ NUM = re.compile(r"(?<![\w.])\d+(?:\.\d+)?(?!\w|\.\d)") # "leg is 5." counts: a sentence-final period is not a decimal
23
+
24
+
25
+ def numbers(t):
26
+ return len(NUM.findall(str(t or "")))
27
+
28
+
29
+ def last_sentence(t):
30
+ parts = [s for s in re.split(r"(?<=[.!?;])\s+", str(t or "").strip()) if s.strip()]
31
+ return parts[-1] if parts else ""
32
+
33
+
34
+ def sentences(t):
35
+ return len([s for s in re.split(r"(?<=[.!?])\s+", str(t or "").strip()) if s.strip()])
36
+
37
+
38
+ def narrative(t):
39
+ """a story-shaped or relational turn: 3+ sentences, 40+ words, or quantities defined relative to each other"""
40
+ t = str(t or "")
41
+ return sentences(t) >= 3 or len(t.split()) > 40 or RELATION.search(t) is not None or RATE.search(t) is not None
42
+
43
+
44
+ def short_direct(t):
45
+ """a direct question an organ may decline: at most 2 sentences, at most 25 words, not narrative"""
46
+ t = str(t or "")
47
+ return sentences(t) <= 2 and len(t.split()) <= 25 and not narrative(t)
root/specialists/decay-r2/organ_decay_r2.py ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """organ_decay_r2 - decay v1 with ONE change: a remaining amount is given in the mass unit the question asks for.
3
+
4
+ Found by sealed composition test C4 (research record E-20261018-0034, item c4-28): asked how many MILLIGRAMS of
5
+ caesium-137 remain from 80 g after 60.16 years, v1 said "About 20 g remains" - the right amount, in a unit the question
6
+ did not ask for, so the number given was wrong. Now, when the asking sentence names a mass unit ("in milligrams", "how
7
+ many kilograms") and v1's amount is in another mass unit, the amount is converted exactly (1 kg = 1,000 g = 10^6 mg =
8
+ 10^9 micrograms) and stated first, with v1's figure kept in brackets. An asked mass unit for an amount that is not a mass
9
+ (atoms, moles, becquerels) is declined in-domain. Every other reply is v1's, byte for byte (invariance_v1 over the decay
10
+ panel: no panel item names a target unit)."""
11
+ from __future__ import annotations
12
+
13
+ import re
14
+
15
+ from narrow_v1 import last_sentence
16
+ from organ_decay_v1 import DecayOrgan
17
+
18
+
19
+ def g4(x):
20
+ """4 significant figures without an exponent (20,000 mg, not 2e+04)"""
21
+ if x == 0:
22
+ return "0"
23
+ if abs(x) >= 1e4:
24
+ return format(round(float("%.4g" % x)), ",")
25
+ t = "%.4g" % x
26
+ return ("%.12f" % x).rstrip("0").rstrip(".") if "e" in t else t
27
+
28
+ MASS = {"mg": 1e-3, "milligram": 1e-3, "milligrams": 1e-3, "g": 1.0, "gram": 1.0, "grams": 1.0, "kg": 1e3, "kilogram": 1e3,
29
+ "kilograms": 1e3, "µg": 1e-6, "ug": 1e-6, "microgram": 1e-6, "micrograms": 1e-6}
30
+ LABEL = {1e-3: "mg", 1.0: "g", 1e3: "kg", 1e-6: "µg"}
31
+ ASKED = re.compile(r"\b(?:in|into|as)\s+(milligrams?|grams?|kilograms?|micrograms?|mg|kg|µg|ug|g)\b|\bhow\s+many\s+(milligrams?|grams?|kilograms?|micrograms?)\b", re.I)
32
+ HEAD = re.compile(r"^About (\S+) (\S+) remains")
33
+
34
+
35
+ class DecayR2Organ(DecayOrgan):
36
+ def answer(self, text, session_id="default"):
37
+ r = super().answer(text, session_id)
38
+ if not r or r.get("kind") != "remaining_amount" or r.get("status") != "answered":
39
+ return r
40
+ m = ASKED.search(last_sentence(text) or str(text or ""))
41
+ if not m:
42
+ return r
43
+ want = MASS[(m.group(1) or m.group(2)).lower()]
44
+ h = HEAD.match(str(r.get("response", "")))
45
+ if not h:
46
+ return r
47
+ have = MASS.get(h.group(2).lower())
48
+ if have is None:
49
+ return dict(r, kind="underspecified", status="withheld", value=None,
50
+ response="The question asks for a mass, but the amount given is in %s; I won't convert between them." % h.group(2))
51
+ if have == want:
52
+ return r
53
+ v = float(r["value"]) * have / want
54
+ out = dict(r, value=v)
55
+ out["response"] = HEAD.sub(lambda x: "About %s %s (%s %s) remains" % (g4(v), LABEL[want], x.group(1), x.group(2)), r["response"], count=1)
56
+ return out
root/specialists/decay-r2/organ_decay_v1.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """organ_decay_v1 - specialist #104 (radioactive decay): how much of a sample remains after a time, how long until a given
3
+ fraction or amount remains, and how many half-lives have passed - for a half-life the question states, or for a named
4
+ isotope from the table below (half-lives: NNDC / NuDat 3, Brookhaven National Laboratory). N = N0 * (1/2)^(t/T).
5
+ Formula shown. Declines a question missing the time, the amount or the half-life. Returns {kind, status, response, value}."""
6
+ from __future__ import annotations
7
+
8
+ import math
9
+ import re
10
+
11
+ from narrow_v1 import last_sentence, narrative, short_direct
12
+
13
+ YEAR = 365.25 * 86400.0
14
+ # isotope -> (half-life in seconds, how written)
15
+ ISOTOPES = {
16
+ "carbon-14": (5730 * YEAR, r"carbon[- ]?14|c[- ]?14|14c|radiocarbon"), "uranium-238": (4.468e9 * YEAR, r"uranium[- ]?238|u[- ]?238"),
17
+ "uranium-235": (7.04e8 * YEAR, r"uranium[- ]?235|u[- ]?235"), "iodine-131": (8.0252 * 86400, r"iodine[- ]?131|i[- ]?131"),
18
+ "cobalt-60": (5.2714 * YEAR, r"cobalt[- ]?60|co[- ]?60"), "caesium-137": (30.08 * YEAR, r"c(?:a)?esium[- ]?137|cs[- ]?137"),
19
+ "strontium-90": (28.79 * YEAR, r"strontium[- ]?90|sr[- ]?90"), "radium-226": (1600 * YEAR, r"radium[- ]?226|ra[- ]?226"),
20
+ "plutonium-239": (24110 * YEAR, r"plutonium[- ]?239|pu[- ]?239"), "tritium": (12.32 * YEAR, r"tritium|hydrogen[- ]?3|h[- ]?3"),
21
+ "radon-222": (3.8235 * 86400, r"radon[- ]?222|rn[- ]?222|radon"), "potassium-40": (1.248e9 * YEAR, r"potassium[- ]?40|k[- ]?40"),
22
+ "phosphorus-32": (14.268 * 86400, r"phosphorus[- ]?32|p[- ]?32"), "technetium-99m": (6.0067 * 3600, r"technetium[- ]?99m|tc[- ]?99m"),
23
+ "fluorine-18": (109.77 * 60, r"fluorine[- ]?18|f[- ]?18"), "americium-241": (432.6 * YEAR, r"americium[- ]?241|am[- ]?241"),
24
+ }
25
+ ISO_RX = [(k, re.compile(r"\b(?:%s)\b" % v[1], re.I)) for k, v in ISOTOPES.items()]
26
+ NUM = r"(\d+(?:,\d{3})*(?:\.\d+)?)"
27
+ TUNITS = [(r"years?|yrs?", YEAR, "years"), (r"days?", 86400.0, "days"), (r"hours?|hrs?", 3600.0, "hours"),
28
+ (r"minutes?|mins?", 60.0, "minutes"), (r"seconds?|secs?|s\b", 1.0, "seconds")]
29
+ TIME_RX = [(re.compile(NUM + r"\s*(?:" + u + r")(?![a-z])", re.I), f, lab) for u, f, lab in TUNITS]
30
+ HALF_RX = re.compile(r"half[- ]?life\s+(?:of|is|was|equal to|=)?\s*(?:about\s+)?" + NUM + r"\s*(years?|yrs?|days?|hours?|hrs?|minutes?|mins?|seconds?|s)\b"
31
+ r"|" + NUM + r"[- ](years?|days?|hours?|minutes?|seconds?)\s+half[- ]?life", re.I)
32
+ AMOUNT = re.compile(NUM + r"\s*(g|grams?|mg|milligrams?|kg|kilograms?|µg|micrograms?|atoms|nuclei|mol|moles?|becquerels?|bq|units|counts? per minute|cpm)\b", re.I)
33
+ FRACTION_WORDS = {"half": 0.5, "a quarter": 0.25, "one quarter": 0.25, "an eighth": 0.125, "one eighth": 0.125,
34
+ "a sixteenth": 0.0625, "one sixteenth": 0.0625, "a tenth": 0.1, "one tenth": 0.1, "a hundredth": 0.01}
35
+
36
+
37
+ def g4(x):
38
+ return "%.4g" % x
39
+
40
+
41
+ def _n(s):
42
+ return float(s.replace(",", ""))
43
+
44
+
45
+ def _tunit(word):
46
+ for u, f, lab in TUNITS:
47
+ if re.fullmatch(u, word, re.I):
48
+ return f, lab
49
+ return None
50
+
51
+
52
+ class DecayOrgan:
53
+ def _say(self, kind, text, value=None, status="answered"):
54
+ return {"kind": kind, "status": status, "response": text, "value": value}
55
+
56
+ def _half_life(self, t):
57
+ m = HALF_RX.search(t)
58
+ if m:
59
+ v, u = (m.group(1), m.group(2)) if m.group(1) else (m.group(3), m.group(4))
60
+ tu = _tunit(u)
61
+ if tu and _n(v) > 0:
62
+ return _n(v) * tu[0], "a half-life of %s %s" % (g4(_n(v)), tu[1]), m.span()
63
+ found = [k for k, rx in ISO_RX if rx.search(t)]
64
+ if len(found) == 1:
65
+ T = ISOTOPES[found[0]][0]
66
+ return T, "%s (half-life %s)" % (found[0], self._fmt_t(T)), None
67
+ return None
68
+
69
+ @staticmethod
70
+ def _fmt_t(sec):
71
+ for u, f, lab in TUNITS:
72
+ if sec >= f:
73
+ return "%s %s" % (g4(sec / f), lab)
74
+ return "%s seconds" % g4(sec)
75
+
76
+ def answer(self, text, session_id="default"):
77
+ t = " ".join(str(text or "").split())
78
+ if not t or narrative(t):
79
+ return None
80
+ if not re.search(r"\bhalf[- ]?li(?:fe|ves)\b|\bdecay\w*\b|\bradioactive\b|\bisotope\b|\bremain", t, re.I):
81
+ return None
82
+ hl = self._half_life(t)
83
+ if hl is None:
84
+ return None
85
+ T, what, span = hl
86
+ rest = t if span is None else t[:span[0]] + " " + t[span[1]:]
87
+ ask = last_sentence(t)
88
+ times = [(_n(m.group(1)) * f, lab, _n(m.group(1))) for rx, f, lab in TIME_RX for m in rx.finditer(rest)]
89
+ amounts = AMOUNT.findall(rest)
90
+ frac = None
91
+ mf = re.search(r"\b(\d+(?:\.\d+)?)\s*(?:%|percent\b)", ask, re.I)
92
+ if mf:
93
+ frac = _n(mf.group(1)) / 100.0
94
+ else:
95
+ for w, v in FRACTION_WORDS.items():
96
+ if re.search(r"\b%s\b" % w, ask, re.I) and re.search(r"\bhow long|\bwhen\b|\btime\b", ask, re.I):
97
+ frac = v
98
+ break
99
+ # how long until a fraction (or amount) remains
100
+ if re.search(r"\bhow long\b|\bhow many (?:years|days|hours|minutes|seconds)\b|\bwhen\b|\btime (?:will|does|it)", ask, re.I) and not times:
101
+ if frac is None and len(amounts) == 2:
102
+ a0, a1 = _n(amounts[0][0]), _n(amounts[1][0])
103
+ if a0 > a1 > 0 and amounts[0][1].lower()[:2] == amounts[1][1].lower()[:2]:
104
+ frac = a1 / a0
105
+ if frac is None or not (0 < frac < 1):
106
+ return self._need("the fraction or amount that should remain", t)
107
+ tt = T * math.log(1 / frac, 2)
108
+ mu = re.search(r"\bhow many (years|days|hours|minutes|seconds)\b", ask, re.I)
109
+ shown = ("%s %s" % (g4(tt / _tunit(mu.group(1))[0]), mu.group(1).lower())) if mu else self._fmt_t(tt)
110
+ return self._say("time_to_fraction", "It takes about %s for %s of the sample to remain (t = T·log₂(1/f) = %s halvings of %s)." % (
111
+ shown, g4(frac), g4(math.log(1 / frac, 2)), what), tt)
112
+ if re.search(r"\bhow many half[- ]?lives\b", ask, re.I):
113
+ if len(times) != 1:
114
+ return self._need("the elapsed time", t)
115
+ n = times[0][0] / T
116
+ return self._say("half_lives", "That is about %s half-lives (t/T for %s)." % (g4(n), what), n)
117
+ if re.search(r"\b(?:remain\w*|left|still)\b", ask, re.I):
118
+ if len(times) != 1:
119
+ return self._need("the elapsed time", t)
120
+ f = 0.5 ** (times[0][0] / T)
121
+ if len(amounts) == 1:
122
+ a0, unit = _n(amounts[0][0]), amounts[0][1]
123
+ return self._say("remaining_amount", "About %s %s remains after %s %s (N = N₀·(1/2)^(t/T) = %s × %s, %s)." % (
124
+ g4(a0 * f), unit, g4(times[0][2]), times[0][1], g4(a0), g4(f), what), a0 * f)
125
+ if re.search(r"\b(?:fraction|percent|percentage|proportion|how much of)\b", ask, re.I) and not amounts:
126
+ pct = re.search(r"\bpercent|percentage\b", ask, re.I)
127
+ return self._say("remaining_fraction", "The remaining fraction is about %s (%s%%) after %s %s ((1/2)^(t/T), %s)." % (
128
+ g4(f), g4(100 * f), g4(times[0][2]), times[0][1], what), 100 * f if pct else f)
129
+ return self._need("the starting amount", t)
130
+ return None
131
+
132
+ def _need(self, what, t):
133
+ if not short_direct(t):
134
+ return None
135
+ return self._say("underspecified", "I need %s to compute that; I won't assume it." % what, status="withheld")
root/specialists/decay-r2/verdict_dev.json ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "decay",
3
+ "name": "Oracle7 Radioactive Decay",
4
+ "tier": "A",
5
+ "split": "dev",
6
+ "head": "oracle_release_runtime_w524",
7
+ "time": "2026-10-08T22:24:16Z",
8
+ "domain": {
9
+ "head": {
10
+ "correct": 1,
11
+ "false_yes": 1,
12
+ "wrong": 4,
13
+ "n": 42,
14
+ "p50_ms": 122.37,
15
+ "fails": [
16
+ [
17
+ "remaining_amount",
18
+ "A sample has 50 g of americium-241. How much remains after 432.6 years",
19
+ "act:clarify|vessel:receipt",
20
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
21
+ ],
22
+ [
23
+ "remaining_amount",
24
+ "A substance has a half-life of 12 days. How much of 40 mg remains afte",
25
+ "act:clarify|vessel:receipt",
26
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
27
+ ],
28
+ [
29
+ "remaining_fraction",
30
+ "What fraction of technetium-99m remains after 12.01 hours?",
31
+ "act:clarify|vessel:receipt",
32
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
33
+ ],
34
+ [
35
+ "time_to_fraction",
36
+ "How many years until only 50% of a sample of tritium remains?",
37
+ "act:clarify|vessel:receipt",
38
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
39
+ ],
40
+ [
41
+ "half_lives",
42
+ "How many half-lives of carbon-14 pass in 11460 years?",
43
+ "act:clarify|vessel:receipt",
44
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
45
+ ],
46
+ [
47
+ "remaining_amount",
48
+ "A sample has 100 g of caesium-137. How much remains after 15.04 years?",
49
+ "act:clarify|vessel:receipt",
50
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
51
+ ],
52
+ [
53
+ "remaining_amount",
54
+ "A substance has a half-life of 8 days. How much of 40 mg remains after",
55
+ "act:clarify|vessel:receipt",
56
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
57
+ ],
58
+ [
59
+ "remaining_fraction",
60
+ "What fraction of radon-222 remains after 11.47 days?",
61
+ "act:clarify|vessel:receipt",
62
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
63
+ ]
64
+ ]
65
+ },
66
+ "spec": {
67
+ "correct": 41,
68
+ "false_yes": 1,
69
+ "wrong": 0,
70
+ "n": 42,
71
+ "p50_ms": 0.07,
72
+ "fails": [
73
+ [
74
+ "decline",
75
+ "How much carbon-14 remains after 1000 years?",
76
+ "specialist_call>specialist:geology>fract",
77
+ "The fraction remaining is 0.8861 (88.6062%; (1/2)^(1000 years / 5730 years); carbon-14, 5,"
78
+ ]
79
+ ]
80
+ }
81
+ },
82
+ "core": {
83
+ "head": {
84
+ "correct": 149,
85
+ "false_yes": 0
86
+ },
87
+ "spec": {
88
+ "correct": 149,
89
+ "false_yes": 0
90
+ },
91
+ "n": 400,
92
+ "swept_in": 0,
93
+ "taken_by_specialist": []
94
+ },
95
+ "self": [
96
+ {
97
+ "q": "Who are you?",
98
+ "same": true
99
+ },
100
+ {
101
+ "q": "What are you?",
102
+ "same": true
103
+ },
104
+ {
105
+ "q": "Are you a human?",
106
+ "same": true
107
+ },
108
+ {
109
+ "q": "What do you value?",
110
+ "same": true
111
+ },
112
+ {
113
+ "q": "Are you conscious?",
114
+ "same": true
115
+ }
116
+ ],
117
+ "store_mb": 0.01,
118
+ "decision": "DEV-PASS",
119
+ "reasons": []
120
+ }
root/specialists/decay-r2/verdict_heldout.json ADDED
@@ -0,0 +1,162 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "decay",
3
+ "name": "Oracle7 Radioactive Decay",
4
+ "tier": "A",
5
+ "split": "heldout",
6
+ "head": "oracle_release_runtime_w524",
7
+ "time": "2026-10-08T22:29:58Z",
8
+ "domain": {
9
+ "head": {
10
+ "correct": 2,
11
+ "false_yes": 0,
12
+ "wrong": 1,
13
+ "n": 42,
14
+ "p50_ms": 125.85,
15
+ "fails": [
16
+ [
17
+ "remaining_amount",
18
+ "Starting with 250 g of phosphorus-32, how many grams are left after 7.",
19
+ "arb:timeline->capability:timeline|vessel",
20
+ "A timeline needs at least two dated statements; the admitted material on 250 contains 0.\n\n"
21
+ ],
22
+ [
23
+ "remaining_amount",
24
+ "An isotope's half-life is 8 days. If you begin with 40 mg, how much is",
25
+ "arb:timeline->capability:timeline|vessel",
26
+ "A timeline needs at least two dated statements; the admitted material on half-life contain"
27
+ ],
28
+ [
29
+ "remaining_fraction",
30
+ "After 865.2 years, what fraction of the original americium-241 is stil",
31
+ "act:clarify|vessel:receipt",
32
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
33
+ ],
34
+ [
35
+ "time_to_fraction",
36
+ "For plutonium-239, how many years does it take until 1% of it remains?",
37
+ "act:clarify_specific",
38
+ "What does \"it\" refer to? Nothing earlier in this conversation names it. Tell me the name."
39
+ ],
40
+ [
41
+ "half_lives",
42
+ "In 143.95 years, how many half-lives of strontium-90 have gone by?",
43
+ "act:clarify|vessel:receipt",
44
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
45
+ ],
46
+ [
47
+ "remaining_amount",
48
+ "Starting with 800 g of tritium, how many grams are left after 24.64 ye",
49
+ "arb:timeline->capability:timeline|vessel",
50
+ "A timeline needs at least two dated statements; the admitted material on 800 contains 0.\n\n"
51
+ ],
52
+ [
53
+ "remaining_amount",
54
+ "An isotope's half-life is 12 days. If you begin with 200 mg, how much ",
55
+ "arb:timeline->capability:timeline|vessel",
56
+ "A timeline needs at least two dated statements; the admitted material on half-life contain"
57
+ ],
58
+ [
59
+ "remaining_fraction",
60
+ "After 109.77 minutes, what fraction of the original fluorine-18 is sti",
61
+ "act:clarify|vessel:receipt",
62
+ "I didn't fully parse that, so I won't guess. I can summarize a topic, compare two things, "
63
+ ]
64
+ ]
65
+ },
66
+ "spec": {
67
+ "correct": 34,
68
+ "false_yes": 0,
69
+ "wrong": 1,
70
+ "n": 42,
71
+ "p50_ms": 0.22,
72
+ "fails": [
73
+ [
74
+ "remaining_amount",
75
+ "Starting with 250 g of phosphorus-32, how many grams are left after 7.",
76
+ "arb:timeline->capability:timeline|vessel",
77
+ "A timeline needs at least two dated statements; the admitted material on 250 contains 0.\n\n"
78
+ ],
79
+ [
80
+ "remaining_amount",
81
+ "Starting with 800 g of tritium, how many grams are left after 24.64 ye",
82
+ "arb:timeline->capability:timeline|vessel",
83
+ "A timeline needs at least two dated statements; the admitted material on 800 contains 0.\n\n"
84
+ ],
85
+ [
86
+ "remaining_amount",
87
+ "Starting with 100 g of fluorine-18, how many grams are left after 658.",
88
+ "arb:timeline->capability:timeline|vessel",
89
+ "A timeline needs at least two dated statements; the admitted material on 100 contains 1.\n\n"
90
+ ],
91
+ [
92
+ "remaining_amount",
93
+ "Starting with 250 g of strontium-90, how many grams are left after 100",
94
+ "arb:timeline->capability:timeline|vessel",
95
+ "A timeline needs at least two dated statements; the admitted material on 250 contains 0.\n\n"
96
+ ],
97
+ [
98
+ "remaining_amount",
99
+ "Starting with 10 g of americium-241, how many grams are left after 216",
100
+ "arb:timeline->capability:timeline|vessel",
101
+ "A timeline needs at least two dated statements; the admitted material on 10 contains 0.\n\nY"
102
+ ],
103
+ [
104
+ "remaining_amount",
105
+ "Starting with 800 g of caesium-137, how many grams are left after 30.0",
106
+ "arb:timeline->capability:timeline|vessel",
107
+ "A timeline needs at least two dated statements; the admitted material on 800 contains 0.\n\n"
108
+ ],
109
+ [
110
+ "remaining_amount",
111
+ "Starting with 10 g of technetium-99m, how many grams are left after 6.",
112
+ "arb:timeline->capability:timeline|vessel",
113
+ "A timeline needs at least two dated statements; the admitted material on 10 contains 0.\n\nY"
114
+ ],
115
+ [
116
+ "remaining_amount",
117
+ "Starting with 800 g of carbon-14, how many grams are left after 5730 y",
118
+ "specialist_call>specialist:geology>fract",
119
+ "The fraction remaining is 0.5 (50%; (1/2)^(5730 years / 5730 years); carbon-14, 5,730 year"
120
+ ]
121
+ ]
122
+ }
123
+ },
124
+ "core": {
125
+ "head": {
126
+ "correct": 149,
127
+ "false_yes": 0
128
+ },
129
+ "spec": {
130
+ "correct": 149,
131
+ "false_yes": 0
132
+ },
133
+ "n": 400,
134
+ "swept_in": 0,
135
+ "taken_by_specialist": []
136
+ },
137
+ "self": [
138
+ {
139
+ "q": "Who are you?",
140
+ "same": true
141
+ },
142
+ {
143
+ "q": "What are you?",
144
+ "same": true
145
+ },
146
+ {
147
+ "q": "Are you a human?",
148
+ "same": true
149
+ },
150
+ {
151
+ "q": "What do you value?",
152
+ "same": true
153
+ },
154
+ {
155
+ "q": "Are you conscious?",
156
+ "same": true
157
+ }
158
+ ],
159
+ "store_mb": 0.01,
160
+ "decision": "ADMIT",
161
+ "reasons": []
162
+ }