psiloceyeben commited on
Commit
083e3a6
·
verified ·
1 Parent(s): 78cf50f

Release 4.9 (slim), the swarm, carrying 4.1-4.8: swarm point (survey, build, examine, represent, combine, work, report; plans composed until solved), the decline specialist, table specialist v3, the exam's added-wrong rule; release test pre-registration v22 (v19-v21 failed, in CHANGELOG.md); new release hashes anchored on Solana

Browse files

Head oracle_release_runtime_w436 (w571 + the self-loop epoch folds w435, w436). Changed parts: the admitted fold chain, relstore routes, specialists/_gate, the cmp3 specialist folders, wander-train (reach, linker, reading, title route, premise checks), the Workbench (swarm/point.py, swarm/declines.py, swarm/organ_table_v3.py, exam.py, cli.py, composer_v3, library). Anchor: https://explorer.solana.com/tx/WRZKt7GWvUTrztx1KXbYJq6LZ89nvVdxmFR1xkazUabhwn4k9ER6uUJgGofxgERFiaXb8UQbu7Vsd9gumXZ9Hpd

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. CHANGELOG.md +94 -0
  2. README.md +296 -8
  3. RELEASE_HASHES.json +272 -16
  4. RELEASE_HASHES_before_48.json +1291 -0
  5. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/HEAD_MANIFEST.json +17 -2
  6. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w425.py +63 -0
  7. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w427.py +52 -0
  8. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w429.py +39 -0
  9. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w431.py +63 -0
  10. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w433.py +52 -0
  11. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w435.py +39 -0
  12. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w436.py +52 -0
  13. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w560.py +88 -0
  14. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w562.py +77 -0
  15. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w563.py +178 -0
  16. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w564.py +139 -0
  17. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w565.py +89 -0
  18. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w566.py +51 -0
  19. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w568.py +146 -0
  20. root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w571.py +44 -0
  21. root/relstore/prop_aliases_v1.json +0 -0
  22. root/relstore/router_patterns_v5.json +555 -0
  23. root/relstore/router_patterns_v6.json +632 -0
  24. root/specialists/_gate/standing_composed_v1.txt +1 -0
  25. root/specialists/_gate/standing_composed_v2.txt +1 -0
  26. root/specialists/bld2-f14-p4511/manifest.json +56 -0
  27. root/specialists/bld2-f14-p4511/narrow_v1.py +47 -0
  28. root/specialists/bld2-f14-p4511/organ_table_v2.py +137 -0
  29. root/specialists/bld2-f14-p4511/panel_v1.json +822 -0
  30. root/specialists/bld2-f14-p4511/scorer_table_v1.py +29 -0
  31. root/specialists/bld2-f14-p4511/table.json +0 -0
  32. root/specialists/bld2-f14-p4511/verdict_heldout.json +113 -0
  33. root/specialists/bld2-f3-p3395/manifest.json +54 -0
  34. root/specialists/bld2-f3-p3395/narrow_v1.py +47 -0
  35. root/specialists/bld2-f3-p3395/organ_table_v2.py +137 -0
  36. root/specialists/bld2-f3-p3395/panel_v1.json +294 -0
  37. root/specialists/bld2-f3-p3395/scorer_table_v1.py +29 -0
  38. root/specialists/bld2-f3-p3395/table.json +1 -0
  39. root/specialists/bld2-f3-p3395/verdict_heldout.json +101 -0
  40. root/specialists/bld2-f7-p2250/manifest.json +55 -0
  41. root/specialists/bld2-f7-p2250/narrow_v1.py +47 -0
  42. root/specialists/bld2-f7-p2250/organ_table_v2.py +137 -0
  43. root/specialists/bld2-f7-p2250/panel_v1.json +404 -0
  44. root/specialists/bld2-f7-p2250/scorer_table_v1.py +29 -0
  45. root/specialists/bld2-f7-p2250/table.json +1 -0
  46. root/specialists/bld2-f7-p2250/verdict_heldout.json +113 -0
  47. root/specialists/bld2-f8-p2787/manifest.json +58 -0
  48. root/specialists/bld2-f8-p2787/narrow_v1.py +47 -0
  49. root/specialists/bld2-f8-p2787/organ_table_v2.py +137 -0
  50. root/specialists/bld2-f8-p2787/panel_v1.json +822 -0
CHANGELOG.md ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Changelog
2
+
3
+ Oracle7's public releases are 4.0 and 4.9. The versions between them were built and tested in the open, each against a
4
+ release test written and sealed before its code was frozen, and run once. A failed test stayed failed: the fix was tested
5
+ again on fresh, newly sealed questions. Nothing here was tuned on a sealed list.
6
+
7
+ ## 4.9 (public, slim): the swarm
8
+
9
+ - `python oracle7.py swarm point <target>`: survey, build, examine, represent, combine, work (research, plans that
10
+ compose until solved, code), report. The decline specialist; the table specialist v3; the exam counts only the
11
+ wrong answers a specialist adds. The self-loop's epoch folds w435 and w436 (head w436).
12
+ - Release test: pre-registration v22, **passed** (every bar; figures in the README). The released slim tree was
13
+ compared file for file with the tree v22 ran on: 4181 files, 0 differing, with only the epoch folds w435 and w436 added (a match).
14
+ - Added after the release test, outside answering: `python oracle7.py update [--apply]` and the Workbench's Check for
15
+ updates button (workbench/update.py, cli.py, server.py, static/app.js and static/index.html). Tested on a copy of an
16
+ older install: it brought it to the published 4.0 and the install then verified against 4.0's anchored root, 317 of
17
+ 317 parts.
18
+ - Failed before it, each published as it stood:
19
+ - v19 failed S1 (4), S2 (0.8), S3 (2);
20
+ - v20 failed S1 (4), S3 (2), S4 (no), S5 (no);
21
+ - v21 failed S3 (2), S4 (no), S5 (no).
22
+ The causes, in order: a unit written with a superscript was not read and a number from a source tag was taken (one
23
+ wrong answer); how-questions were not read as the property they ask; two parts got the same name; time in hours
24
+ and in seconds were one type; a name several ships share was answered with one of them; and the exam counted the
25
+ core's own wrong answers against a new table.
26
+ - The first 4.9 design (pre-registration v18, not shipped): a loop that built question routes only from the turns the
27
+ release declined, examined by the answers public datasets give. Unattended over 3 rounds it admitted 18 parts, 7 of
28
+ them composed of two routes it had built itself ("where did the composer of film X die": the composer route from
29
+ round 2, then the place-of-death route from round 1, right on all its held-out answers). It failed its bar of 30
30
+ parts, and its cost per part rose each round. Its release arms were not run.
31
+
32
+ ## 4.8 (staged, not published on its own: carried in 4.9)
33
+
34
+ - Folds w568 and w571: a reply must answer what is asked, and its premise must hold (sentence answers that do not say the asked relation, and explanations
35
+ given to who/where/when questions, are withheld with the reason); "who sings / wrote / directed <title>" through the
36
+ whole title; filming locations; founders over a text reader's answer. Also the self-loop's worker folds w431 and w433.
37
+ - Release tests: PI48 (pre-registration v14, amendments 3 and 4): **FAIL**; then PI48b after the premise checks (w569,
38
+ pre-registration v15), each variant on its own result: passed for slim; the full variant missed the Reach bar (1.86x
39
+ against 2x) and is not released. The gate then refused w569 for withholding right answers; its narrowed version
40
+ w570 failed PI48c (pre-registration v16); w571 passed PI48d (pre-registration v17) on every bar. Figures in the README.
41
+
42
+ ## 4.7 (internal): the self-building attempt
43
+
44
+ - A loop that reads the questions its release declined and operates the release's own build system on them (the
45
+ Workbench's coordinator, builder and exams; a route builder over the relation store), with no person in it after its
46
+ code was frozen.
47
+ - Release test PI47 (pre-registration v13): **FAIL**. The loop ran three rounds unattended and admitted 4 specialists; on
48
+ 2,400 real questions they answered none, and each round cost more per part than the last. Their exams were built from
49
+ their own data and phrasings, so they measured consistency, not usefulness.
50
+ - A second design (pre-registration v14 amendments 1 and 2) examined routes on the declined questions themselves, first by
51
+ the release's own text records, then by the answers the public questions come with. On the development set neither
52
+ examiner admitted routes that were right 90% of the time: the limit was how Oracle7 reads a casual question, which 4.8
53
+ begins to fix. The self-building claim is not made until that reading is good enough to build on.
54
+ - w567 (its fold) was refused by the gate, no gain. Its two fixes ship in w568.
55
+
56
+ ## 4.6 (internal)
57
+
58
+ - Fold w566: "who" questions read through their verb. "Who founded Microsoft?" was declined, though the relation store
59
+ holds Microsoft's founders. It now answers Bill Gates and Paul Allen, citing Microsoft (Q2283) and founder (P112).
60
+ Examined before use: right 93.2% and 91.8% on the two halves of TriviaQA and Mintaka training questions.
61
+ - Not released on its own: its release build stopped at the smoke test on the full variant, where the core's text
62
+ reader answered "Who founded Microsoft?" with "BASIC" before the founder route could. Fixed in 4.8. Its Reach
63
+ test, PI45b, ran on 4.8.
64
+
65
+ ## 4.5 (internal)
66
+
67
+ - Fold w564: Reach. Questions declined at the front door reach the Wikidata relation store through examined routes, with
68
+ a receipt. A reply that only defines the word asked about is withheld.
69
+ - The composed specialists re-wrapped (cmp3): orderings and cited facts, with their reasons on impossible inputs.
70
+ - Workbench: library learning (composer_v3) and the sensor self-examination.
71
+ - Release test PI45 (pre-registration v11): **FAIL**, on two bars.
72
+ - Open right answers at least twice 4.2's: full 150 against 81; slim 139 against 64. The full variant fell short.
73
+ - Composed domain, in-domain right at least 38 of 40: full 36 (4.2: 36); slim 35 (4.2: 35). That bar was set above what 4.2 itself scores.
74
+ - Everything else held: the new routes' precision, open precision, false yes, the PI41b regression check, relation types,
75
+ impossible inputs declined.
76
+ - Fold w565, the fixes, tested by PI45b in 4.6: the composed specialists are also asked on turns the core turned away;
77
+ Reach router v2 (patterns from SimpleQuestions train and validation; a relation of the same family when the named one is
78
+ not held; "how many N" as "number of N").
79
+
80
+ ## 4.2 (internal)
81
+
82
+ - Workbench: a shared specialist memory on the Tree of Life spine, and the sensor baseline reader.
83
+ - Release test PI42: **FAIL**. Release test PI42b: **PASS**. Figures in the README's 4.2 section.
84
+
85
+ ## 4.1 (internal)
86
+
87
+ - It builds its own specialists: the Workbench's swarm reads example questions and names the gap; tables are built from
88
+ Wikidata; calculations are composed from worked examples. Folds w560 (polite requests), w562 (composed specialists),
89
+ w563 (readings).
90
+ - Release test PI41: **FAIL**, by one bar. Release test PI41b: **PASS**. Figures in the README's 4.1 section.
91
+
92
+ ## 4.0 (public)
93
+
94
+ - See the README's 4.0 sections and the earlier release notes.
README.md CHANGED
@@ -17,16 +17,16 @@ tags:
17
  # oracle7-slim
18
 
19
  **Oracle7 is an AI built to say "I can't verify that" rather than guess.** It is not a neural language model. It answers
20
- from stored, sourced records and from 267 specialists, each of which passed its own held-out test before it was allowed to
21
- answer. Every reply carries its **path**: the route, specialists and records that produced it. When nothing in it can
22
  verify an answer, it declines and tells you why. It does not always manage that: the measured section below says exactly
23
  how often it is still wrong, and on what.
24
 
25
- This is the **slim** release: the same core, routes and 267 specialists, with the smaller stores (Simple English Wikipedia, Wiktionary, WordNet, ConceptNet, Wikidata relations) and **no non-commercial material**, so it can be used commercially under the licences in DATA_LICENSES.md. The full release adds the deep Wikipedia/DBpedia/OpenStax stores; slim declines more often on open trivia.
26
 
27
  - Download: **2.7 GB** (unpacks to 7.3 GB, every store checked against its published hash)
28
  - Runs on: CPU only, Python 3.12, about 2 GB RAM; no GPU, no network access at run time
29
- - Head: `oracle_release_runtime_w540` (the core the gate admitted when this was built; the site adds an input typo-repair layer that is not included)
30
 
31
  ## Quickstart
32
 
@@ -50,6 +50,285 @@ A `withheld` status is a deliberate decline, and its reply says why (for example
50
  not a physical amount, or a step of the path could not be checked).
51
 
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  ## The Workbench
54
 
55
  ```bash
@@ -71,7 +350,7 @@ Ask it "what can you do?", or type `/help`, for every feature and command.
71
  and whether it was measured, and a physically impossible reading is rejected and named.
72
  - **Conversations:** kept on your machine in a side panel; reopen one and the core picks up its context. Any
73
  conversation can become a temporary specialist that recalls it.
74
- - **Build:** write a specialist in the page and examine it the way the release's 267 were examined. The dev exam can be
75
  repeated; the held-out exam runs once. A specialist joins your model, and the diagram, only if it adds right answers,
76
  adds no false yes and stays in its lane. It can only fill the core's declines; it never overrides an answer or a check.
77
  - **Gaps:** an opt-in journal, kept on your machine, groups your declines into the specialists your model is missing.
@@ -91,6 +370,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 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."). Release test, PI4-B (186 turns, sealed before the code froze, run once): 156 right, 30 declined, 0 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: 21 right, 0 wrong. Mean steps k 4.522; median time L 111.95 ms. Route forms re-entered on recurring questions: 94.4% (shuffled baseline 20.6%); 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 `d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5`, anchored on Solana: [4vJ57qaJxvzZ...](https://explorer.solana.com/tx/4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH).
95
 
96
  **Release 3.2 (18 October 2026).** Proved specialists: [veri7vn](https://github.com/emberian/veri7vn) by ember arlynx (CC0) re-implements 128 of Oracle7's specialists as kernels proved in Isabelle/HOL and compiled to native code. Release 3.2 ships them (static Linux x86-64, built from commit `3bf43cff8eaa`, checksums in specialists/_proved) and uses them as a cross-check: when a specialist answers and its kernel gives the same answer, the reply is marked proved and names the theorems; when the kernel gives a different answer, the reply is withheld; elsewhere nothing changes. What is proved is the computation from the question as read; reading the question is not proved (veri7vn's recognizer is untrusted by design), so a proved mark never vouches for the reading. On the released specialists' own held-out exams the kernels and the specialists agreed on every answer both gave, apart from display rounding, where the kernels' exact arithmetic was the better. Four new specialists for stars and their planets: a star's luminosity, temperature and radius; the habitable zone (Kopparapu et al. 2013) in AU or orbital periods; orbits around other stars, their starlight and equilibrium temperature; and transits (planet size from depth, probability, duration), each admitted on a held-out exam with no wrong answers. Owner-first: when the specialist a question belongs to was never asked (orbital mechanics, which no list carried, is the clearest case), the whole family is asked, and an answer is kept only if every number the question gives moves it - the test that refuses the astronomy reader's '29.8 km/s' for a satellite 400 km above Earth; owner-first never overrules a question that is itself the problem (a planet that does not exist), and a planet's own figure given for an orbit at an altitude is withheld as the wrong reading - both found by the release candidate's smoke test before sealed test 23 ran. A remaining amount of a decaying sample is now given in the mass unit asked. Read-back writing: the Workbench's essays may now reword a source sentence (a same-sense synonym, a date moved to the front), kept only when reading it back gives exactly the source's meaning; each rewording is listed beside its source, and its quality waits for people's blind ratings. Release gate, sealed test 23 (162 questions written before the code froze, run once): 142 right, 3 wrong, 17 declined, 1 false yes; precision 98.3% (star and unit-asked group: 12 right, 0 wrong). New root `0a9bb1c0b4c4b85bf879b54405fb8107c5ecb3bce3663ee5da3a93b3d52696d8`, anchored on Solana: [3ZUmd7FTw4uN...](https://explorer.solana.com/tx/3ZUmd7FTw4uNLWUrZa3HMB8UCGLMneiQbDP2kXc3Sf1TFKPkczZntpBbTgtzDnXxCWeA8YFtTG22T9ZH53w3TsW2).
@@ -129,11 +410,11 @@ changed, missing or extra specialist is named.
129
 
130
  ## What is inside
131
 
132
- - **The core**: a chain of 317 small modules ("folds"), each admitted only by an automated gate: a fixed capability
133
  panel must not lose an answer, and no fold may add a confidently wrong one. Nothing is trained by gradient descent.
134
  - **Organs**: exact arithmetic and algebra (SymPy, checked by a second method), a relation reader over Wikidata, a reading
135
  route over the stores, dialogue memory, a code composer.
136
- - **267 specialists** (`root/specialists`): physics, chemistry, units, astronomy, nutrition, law basics, and more. Each has a
137
  card (`root/specialists/_cards`) with its sources, its held-out score and what it declines.
138
  - **The specialist network**: multi-step questions are read into typed givens and a goal; a path of specialists is found
139
  where every given is used once and every hop is checked. No checked path means no answer.
@@ -144,6 +425,8 @@ changed, missing or extra specialist is named.
144
 
145
  ## Measured
146
 
 
 
147
  **Sealed release test 19** (150 questions: 70 knowledge, including phrasings the general relation reader is built for; 30 exact; 20 multi-step; 30 that must be declined. Written and hashed on 2026-10-14 before this head was built, and run once on this release as shipped, with a clean harness that checks every loaded module comes from the release):
148
 
149
  **113 right, 1 wrong, 36 declined.** On the 30 questions that must be declined it asserted an answer 0 time(s). Format defects: **0**. Precision on what it answered: **98.8%**. Bars: precision at least 90%, false yes at most 2, format defects 0 - **passed**. Sha256 of the question file: `48c2017bb132c0f5cd899e0b1ad6e01a8339f55445dbecfdd38904d4b4ed20dd`.
@@ -162,7 +445,7 @@ Sealed release test 17, on the earlier head w538 (150 questions: 70 knowledge, 1
162
  Dialogue tests built to need specialists (hand-offs, follow-ups after a specialist's answer, numeric follow-ups, two-part turns): test 4 on the previous head - turns handled 67%, precision 78%, follow-ups right 70%; it found two-part turns losing their second answer (fixed by fold w537) and three conversation defects (fixed by w538). **Test 5 on this release: turns handled 78%, precision 94%, follow-ups right 90%, false yes 0.**
163
 
164
 
165
- **Specialists:** 267 admitted, each by a held-out exam it saw once (it must beat the main model by a margin, add no false yes, and leave the main model's own answers unchanged); 23 exams were failed and are published with their reasons. On their exams the admitted specialists scored 15,478 right and 14 wrong; the main model on the same exams, 3,548 right and 643 wrong.
166
 
167
 
168
  ![Every admitted specialist, drawn from the gate ledger: domain specialists by field on the inner ring, relation readers on the outer ring](specialists_atlas.png)
@@ -191,6 +474,11 @@ Read this honestly: Oracle7 **declines most open benchmark questions; of those i
191
 
192
  ## Limits
193
 
 
 
 
 
 
194
  - Known from the sealed dialogue tests (test 5): some numeric follow-ups are not yet resolved ("and after 32 days?", a weekly total, a tank's volume turned into a mass); a short greeting can be met with a request to rephrase; a company name can link to one of its products ("Sony" to a camera line); a title with an apostrophe can fail to parse.
195
  - Fixed in this release by folds w539 and w540: a name containing a number is no longer read as arithmetic ("What is the half-life of carbon-14?" is declined, not answered "-14"); a composed program for a request to count a particular thing must mention that thing ("count the vowels" is declined rather than answered with a program that counts items); a question asking what orbits or sits in something is not answered with what that thing orbits or sits in; a number copied from a worded question is not returned as its result. Run code it hands you against your own tests; the Workbench's Code tab does that.
196
  - English only. The knowledge stores are snapshots (2025-2026 dumps); nothing is fetched live.
 
17
  # oracle7-slim
18
 
19
  **Oracle7 is an AI built to say "I can't verify that" rather than guess.** It is not a neural language model. It answers
20
+ from stored, sourced records and from 339 specialists, each of which passed its own held-out test before it was allowed to
21
+ answer. Since 4.1 it can build new specialists itself, from example questions or from worked examples, and examine them the same way. Since 4.9 a swarm builds and combines the parts a problem needs (`swarm point`). Since 4.8 it checks that a reply answers what was asked before it gives it. Since 4.2, groups share the specialists they built through a memory on the Tree of Life, and the Workbench reads a sensor against its own normal and says whether a change looks like a sensor fault or a real one. Every reply carries its **path**: the route, specialists and records that produced it. When nothing in it can
22
  verify an answer, it declines and tells you why. It does not always manage that: the measured section below says exactly
23
  how often it is still wrong, and on what.
24
 
25
+ This is the **slim** release: the same core, routes and 339 specialists, with the smaller stores (Simple English Wikipedia, Wiktionary, WordNet, ConceptNet, Wikidata relations) and **no non-commercial material**, so it can be used commercially under the licences in DATA_LICENSES.md. The full release adds the deep Wikipedia/DBpedia/OpenStax stores; slim declines more often on open trivia.
26
 
27
  - Download: **2.7 GB** (unpacks to 7.3 GB, every store checked against its published hash)
28
  - Runs on: CPU only, Python 3.12, about 2 GB RAM; no GPU, no network access at run time
29
+ - Head: `oracle_release_runtime_w436` (release 4.9: 4.8's w571 and the self-loop's epoch folds w435, w436; 4.8: the core the gate admitted when this was built; the site adds an input typo-repair layer that is not included)
30
 
31
  ## Quickstart
32
 
 
50
  not a physical amount, or a step of the path could not be checked).
51
 
52
 
53
+ ## What 4.9 adds: the swarm
54
+
55
+ You bring the swarm a problem, and it works on it: `python oracle7.py swarm point <target.json>`. It finds out what the
56
+ problem needs, builds the parts it lacks, examines each part on cases it has not seen, and composes parts until the problem
57
+ is solved. There is no neural network in it, and it runs on this computer.
58
+
59
+ 1. **Survey.** The coordinator asks every installed specialist about the target's example questions and names the gap.
60
+ 2. **Build.** A table of named things comes from Wikidata; a calculation is composed from worked examples by the code
61
+ composer.
62
+ 3. **Examine.** Each new part runs its dev exam, then once its held-out exam. Only an admitted part is kept.
63
+ 4. **Represent.** Each part gets a key, a node on the Tree of Life and a typed signature (what it takes and gives, with units),
64
+ filed in your group's spine memory. Its vector is regenerated from the key, so nothing large is stored.
65
+ 5. **Combine.** Parts connect wherever one part's output type, with its unit, is another part's input.
66
+ 6. **Work.**
67
+ - **Research:** the core with every admitted part. A turn they decline goes to the decline specialist.
68
+ - **Plans:** composing until solved. When no chain of parts reaches what is wanted, the missing quantities are named by
69
+ walking back from the goal; each missing part is built from the target's reserve examples and examined, and the chain
70
+ is searched again.
71
+ - **Code:** the admitted programs are written out as one library, with tests from their worked examples, and run.
72
+ 7. **Report.** swarm_report.json and swarm_report.md, with every piece of work and the path that did it.
73
+
74
+ **The decline specialist** (workbench/swarm/declines.py) reads why a turn was declined, from the decline's own receipt, and
75
+ applies that kind's fix:
76
+ - a question in a form the core does not read is read as the property it asks for ("How long is X?" becomes "What is the
77
+ length of X?");
78
+ - a table that holds the property but not the thing named reads that property for that thing at its own source, with its
79
+ unit, only when the name links to one thing;
80
+ - with no part at all, the gap is named for the builder;
81
+ - a thing that does not exist stays declined.
82
+
83
+ **Updates** (added after the release test; it takes no part in answering): `python oracle7.py update` (and the Workbench's *Check for updates* button beside *Verify this install*) reads the published RELEASE_HASHES.json from this install's Hugging Face repository and offers a release only if it is newer and anchored on Solana. `update --apply` downloads the changed parts, checks each against the release's hashes before anything is written, keeps a copy of every file it replaces, never touches your own specialists, memory or conversations, and verifies the install afterwards. The core's reader modules and route files are checked against Hugging Face's file hashes, not the anchored root; adding them to the anchored recipe is next.
84
+
85
+ **The table specialist v3** (organ_table_v3) declines a name that different things share, and does not answer with the first
86
+ match.
87
+
88
+ **The exam** (workbench/exam.py) now counts the wrong answers a specialist adds, as its false-yes rule always did. A table
89
+ was refused in a 4.9 test for two wrong answers that were the core's own.
90
+
91
+ ### Release test: pre-registration v22, run once
92
+
93
+ The swarm was pointed at four sealed targets it had never seen, in one workspace, with no person in the loop. Every bar held.
94
+
95
+ | Bar | Result | Needed |
96
+ | --- | --- | --- |
97
+ | parts admitted | 6 | at least 5 |
98
+ | precision of answered work | 1.0 | at least 0.90 |
99
+ | plans right | 4 of 4 | at least 3 |
100
+ | composing until solved | yes | the canals plan built its missing part mid-plan |
101
+ | compounding across targets | yes | the fees plan used the canals target's part |
102
+ | generated library tests | 40/40 | at least 95% |
103
+ | must-decline questions answered | 0 | 0 |
104
+ | research questions right | 3 of 3 | at least 2 |
105
+ | decline specialist | 7 right, 0 wrong | at least 2 answers, at least 0.90 right |
106
+
107
+ | Target | Plan | Result | Parts used | Built during the plan |
108
+ | --- | --- | --- | --- | --- |
109
+ | volcanoes | time (h) | 10.6143 | formula-time | - |
110
+ | canals | time (h) | 10.25 | formula-time-2 | formula-time-2 |
111
+ | waterfalls | time (min) | 12.4 | formula-time-3 | - |
112
+ | fees | cost ($) | 1449.75 | formula-time-2, formula-cost | - |
113
+
114
+ Gold values are Wikidata's. Where Wikidata gives a waterfall two heights (total height and tallest single drop), either was
115
+ accepted, as sealed. The test ran on the 4.8 slim tree. 4.9 adds the self-loop's admitted epoch folds w435 and w436, which
116
+ the gate admitted; the file-for-file comparison is in the changelog. 4.9 is released for the slim repository; the full
117
+ repository keeps its earlier version until a test passes for it.
118
+
119
+ ## What 4.8 adds: it answers what it is asked
120
+
121
+ On questions people actually type, Oracle7 4.6 was wrong more often than right when it answered. The wrong answers were
122
+ traceable, but they answered a different question:
123
+ - **"Where is Jefferson Davis buried?"** was answered with the sentence saying where he was born.
124
+ - **"Who starred in the original My Fair Lady?"** was answered "In simple terms: My Fair Lady is a musical."
125
+ - **"Who sang the song This Girl Is on Fire?"** was linked to a song called "Fire".
126
+ - **"Where was X filmed?"** was answered with the film's country of origin.
127
+ - **"Who founded Microsoft?"** was answered "BASIC" on the full release, by its text reader.
128
+
129
+ 4.8 reads the question before it accepts a reply:
130
+ - **A where-question answered by a sentence** must say the relation asked (burial, birth, filming, where something is),
131
+ or it is withheld with that reason.
132
+ - **A who, where, when, which or how-many question** is not answered by an explanation, a definition, a timeline or a
133
+ numbered list.
134
+ - **"Who sings / wrote / composed / directed <title>?"** is answered only through the thing named by the whole title. The
135
+ verb and the kind of work name the relation: a song's lyricist, a book's author, a film's director.
136
+ - **Filming, recording and setting questions** are answered by filming location, recording location or narrative
137
+ location, or declined.
138
+ - **On the full release,** the founders from the relation store replace a text answer that names none of them.
139
+
140
+ **Release tests PI48 and PI48b**, each written and sealed before the code it tests was frozen, each arm run once.
141
+
142
+ *PI48* (2,031 web questions, 60 must-decline, PI41b), 4.8 against 4.6. The reading rules held on both variants: precision
143
+ rose about 7.5 points and no right answers were lost. It failed two bars on the full variant: three false-premise questions
144
+ answered with a true fact (as 4.6 also did), and Reach at 1.95 times 4.2 against a bar of 2.
145
+
146
+ | variant | open right | open wrong | precision | false yes | PI41b right |
147
+ |---|---|---|---|---|---|
148
+ | full | 64 against 63 | 70 against 93 | 47.8% against 40.4% | 3 against 3 | 81 against 81 |
149
+ | slim | 55 against 55 | 63 against 87 | 46.6% against 38.7% | 2 against 2 | 79 against 79 |
150
+
151
+ *PI48b* (pre-registration v15, fresh questions: 1,200 Reach, 1,208 web, 60 must-decline, PI41b), after the premise checks
152
+ (w569): a named owner must be the work's creator, every person named must be connected to the answer, a year next to a work
153
+ must be that work's year. Each variant ships on its own result, as fixed before the test ran.
154
+
155
+ - **slim:** web right 14 against 10; web precision 36.8% against 30.3%; false yes 1 against 2; Reach right 137 against 4.2's 65; Reach precision 92.8%; every bar held.
156
+ - **full:** web right 18 against 14; web precision 37.5% against 32.6%; false yes 1 against 2; Reach right 147 against 4.2's 79; Reach precision 92.6%; failed: R1 [79, 147].
157
+
158
+ The gate then refused w569: its premise checks withheld 6 right answers on the frozen panel (a reading passage, a
159
+ two-person comparison, a novel dated by its film's year). A narrowed version (w570) failed its own sealed test (PI48c,
160
+ pre-registration v16) on both variants: three false premises with no genre word after the owner got through ("Who painted
161
+ Rembrandt's Sunflowers?"), and "the Christian name of the wife of Robert Schumann" was withheld as if "Christian" were a
162
+ second person. w571 (premise_v3) reads "Who painted N's X?" as an owner premise and applies the second-person rule only where
163
+ the question joins people. It was tested again on fresh questions (PI48d, pre-registration v17): slim: right 41 against 41, precision 53.9% against 53.2%, false yes 1 against 9, PI41b 79 against 79; full: right 79 against 79, precision 53.4% against 53.0%, false yes 2 against 11, PI41b 81 against 81.
164
+
165
+ Release decision: **PI48b and PI48d passed for slim**. The full release stays at its previous version until a test passes for it; its Reach result is published above.
166
+
167
+ The scorer is mechanical. A right answer worded differently from the dataset's ("ABBA" against "Swedish pop group ABBA",
168
+ a date in another format) is scored wrong. All of that applies to every arm alike.
169
+
170
+ 4.8 is still wrong on many web questions: it reads which thing and which fact a question means better than 4.6, not well.
171
+ The next release reads answers out of sentences by the relation asked.
172
+
173
+ ## Carried from the internal 4.5 and 4.6: reach, programs built from programs, and inputs it knows are impossible
174
+
175
+ These were built and tested as the internal 4.5 and 4.6 and ship in 4.8, measured on 4.8. 4.8 is the first public
176
+ release since 4.0. [CHANGELOG.md](CHANGELOG.md) lists each one with its release test, including the tests
177
+ that failed.
178
+
179
+ - **Reach.** Most factual questions the core could not parse were declined before any lookup, even "Who is author of To
180
+ the Lighthouse?". They now reach the Wikidata relation store (2,456 relation types, 27.7 million facts, CC0) through
181
+ routes that were each examined before use:
182
+ - question patterns learned from the train and validation questions of SimpleQuestions-Wikidata, kept only at 90% or
183
+ better on both halves of their examination;
184
+ - the relation's own Wikidata name ("the chief executive officer of Hewlett-Packard"), examined over all 2,554 relations;
185
+ - the verb of a "who" question ("Who founded Microsoft?" reads as *founded by* or *founder*), examined on TriviaQA and
186
+ Mintaka training questions: right 93.2% and 91.8% on the two halves.
187
+
188
+ The named thing must hold the relation. A one-word name answers only through its most-linked reading, and the answer
189
+ must be the kind asked ("who" a person or an organisation). Every answer carries its receipt: the Wikidata ids of the
190
+ subject, the relation and the value. A reply that only defined the word asked about ("Genre is any style...") is no
191
+ longer given as an answer. A two-way date comparison ("Which is older, A or B?") is answered from both dates.
192
+ - **Composed specialists that know what is impossible.** The 20 composed specialists were re-wrapped (cmp3). They decline
193
+ an input that breaks an ordering every worked example kept (a diastolic pressure above the systolic). They decline an
194
+ input the quantity cannot have (day 380 of 2025, a temperature below absolute zero, a fraction of a tooth), and say
195
+ which rule and why. Where a fitted constant agreed with a cited one to its precision, the cited one replaced it (1/3 and
196
+ 2/3 in mean arterial pressure; standard gravity and the standard atmosphere in pressure under water; 2 pi / sqrt(g) in a
197
+ pendulum's period). On fresh held-out values each re-wrap was right wherever the original was (240 valid items), and
198
+ declined all 10 new out-of-domain items. They are now also asked on questions the core turned away at its front door.
199
+ - **Programs built from programs (Workbench).** The code composer now uses admitted programs as single moves: the
200
+ release's composed specialists and every program you compose and admit. On a sealed curriculum of ten finance tasks in
201
+ four rounds, each needing what the earlier rounds admitted, it composed 6 of 6 deep tasks with the library, right on
202
+ every held-out example, and 0 of 6 without it. The last one, total interest paid on a loan, is a 25-node program found
203
+ by a 5-move search; without a library the composer reaches 11 nodes.
204
+ - **Sensor self-examination (Workbench).** Every baseline reply reports how many faults the reader caught when they were
205
+ injected into a copy of that channel's own record. In the sealed test the channels reported 97.5%, and the reader caught
206
+ 95.0% of the faults injected into the test.
207
+
208
+ **Release test PI45b**, written and sealed on 2026-10-21 before the code it tests was frozen, each part run once on each
209
+ variant, on 4.8. It replaced PI45, which the internal 4.5 failed (see the changelog).
210
+
211
+ *Part A/B: Reach.* 1,348 questions from splits that development never read (SimpleQuestions-Wikidata, Mintaka, TriviaQA,
212
+ LC-QuAD 2.0 tests), none of them in PI45; 60 that must be declined; and the PI41b panel as a regression check. 4.8 is
213
+ measured against 4.2 on the same panel:
214
+
215
+ | variant | open right (4.8 against 4.2) | precision of the new routes | open precision (4.8 against 4.2) | false yes | PI41b right | relation types answered |
216
+ |---|---|---|---|---|---|---|
217
+ | full | 158 against 81 | 98.7% on 78 answers | 74.5% against 54.0% | 0 of 60 | 81 against 77 | 32 against 13 |
218
+ | slim | 145 against 63 | 98.8% on 83 answers | 81.0% against 57.3% | 0 of 60 | 79 against 75 | 30 against 12 |
219
+
220
+ The roadmap promised ten times as many right answers to open questions. Development showed lookups alone reach about
221
+ twice; the bars above were sealed instead (at least 2 times 4.2's right answers, the new routes at least 90% precise).
222
+ The tenfold target was not met.
223
+
224
+ *Part C: the composed domain.* 40 in-domain questions on new values and 16 impossible inputs. Full: 40 of 40 right (4.2: 36), 16 of the 16 declined (4.2: 8); slim: 40 of 40 right (4.2: 35), 16 of the 16 declined (4.2: 9).
225
+
226
+ *Part D-b: library learning.* As above. The first version of this test (part D) **failed**. Its labels gave the interest
227
+ rate no unit per year, so units as types refused 1 + r/n, and nothing deeper could be built. It is published with the
228
+ corrected rerun.
229
+
230
+ *Part E: the sensor reader.* On four new USGS sites the reader caught 95% of injected faults and called 92% of sensor
231
+ faults on pairs sensor faults. It called 75% of real changes real, under the 80% bar, so this part **failed**. Reader
232
+ v4, the one 4.2 shipped, gives the same result on this set. Detection stays v4's; the one new rule in reader v5 (judging a
233
+ channel alone while its partner is stuck) showed no measured benefit and does not ship. The self-examination ships (its
234
+ bar held).
235
+
236
+ Release decision (all of A/B and C on both variants, D-b and the self-examination): **PI45b FAIL**.
237
+
238
+ Not yet, and next:
239
+ - reading messy documents through the vision model;
240
+ - essays beyond the record's own sentences (connectives the record supports, rewording that reads back to the same claim);
241
+ - multi-step questions over the store (the hop route was examined and not admitted).
242
+
243
+ ## What 4.2 adds: a shared specialist memory and a sensor baseline reader
244
+
245
+ Release 4.2 changes the Workbench only. The core is 4.1's, unchanged.
246
+
247
+ - **Shared specialist memory, on the Tree of Life.** A specialist the Workbench builds or composes, once it passes its
248
+ held-out exam, is written to the group's memory with the request it answered: what the questions ask for and what they
249
+ give. Groups export their memories and import each other's, and every entry's chain hash is checked on import. Before
250
+ building, the Workbench recalls from the sum of its own memory and the imported ones. If another group already built a
251
+ specialist for the same request worded differently, it says which one, so you can import it and examine it here instead
252
+ of building it again. A recall is a suggestion, never an answer.
253
+ - The memory is ten holographic vectors, one per Sephirah, 1,024 numbers each. A request is filed under the node where
254
+ its operation lives (Hod computes, Binah relates). An exact key is spread over the nodes by its hash. Routes are read
255
+ back whole by the Tree's path decoder. On a CPU a recall takes about 2 ms.
256
+ - **The baseline reader (sensors).** Readings are kept as 15-minute medians for 30 days, and past readings can be
257
+ imported. Ask "is the water level normal?" and the reader gives the reading's distance from the ideal band you set, its
258
+ distance from the channel's own normal (learned from its history at each time scale, so a daily cycle or a tide is not
259
+ an alarm), and the named fluctuations of the last three days: spike, step, drift, stuck, dropout, oscillation.
260
+ - For two channels declared physically coupled (a stream's level and its flow), it fits their relationship on the
261
+ history. A change that breaks the relationship is a probable sensor fault; a change both channels make together is a
262
+ probable real change. Where the relationship does not hold, it says it cannot tell.
263
+
264
+ **Release test PI42b** (written and sealed on 2026-10-20 before this code existed, run once on each variant, the same
265
+ result on both):
266
+
267
+ | Part | Result | Bar |
268
+ |---|---|---|
269
+ | Shared memory: sealed request families recalled right | 11 of 12 | at least 9 |
270
+ | Shared memory: control requests that recalled anything | 0 of 10 | at most 1 |
271
+ | Shared memory: median recall time | 1.8 ms | at most 50 ms |
272
+ | Sensors: injected faults caught (four USGS sites it had never seen) | 91% | at least 85% |
273
+ | Sensors: typed right | 90% on pairs, 78% on single channels | 70% and 50% |
274
+ | Sensors, coupled pairs: sensor faults called sensor faults / real changes called real | 90% / 100% | 80% / 80% |
275
+ | Sensors: false flags per channel-day | 0.34 | at most 0.5 |
276
+ | Sensors: distance from the ideal band | 2,057 checked, 0 wrong | all right |
277
+
278
+ The memory's Tree decoder was measured in the first release test (PI42) and is unchanged. Holding 128 routes from 4.0's
279
+ release tests, the memory recalled 98% exactly. On routes it had never seen, the decoder read 77%, against 35% for plain
280
+ cleanup of the same size.
281
+
282
+ The first 4.2 candidate **failed** that test (PI42). The memory recalled 7 of 12 families: it did not read questions
283
+ written as fragments ("Pace for a speed of 14 km/h?") or acronyms ("MAP" for mean arterial pressure). The reader called
284
+ 77% of sensor faults on pairs, against a bar of 80%. Both causes were fixed with general rules, developed only on data
285
+ earlier tests had already used. PI42b was written fresh, with new wordings, new controls and new sites, before the fixes
286
+ were coded. Every pre-registration, its result and each failed version are in the source repository.
287
+
288
+ ## What 4.1 adds: it builds its own specialists
289
+
290
+ - **From example questions.** The Workbench's swarm asks every installed specialist about 3 to 6 example questions and
291
+ writes a brief: what the questions give, what they ask for, which specialists are near, and the gap. A table of named
292
+ things is then built from Wikidata (CC0) with an exam split by entity. Medical dosing, legal advice and private people's
293
+ details are refused. (`python oracle7.py build "q1" "q2" "q3"`, or Build > Ask the swarm.)
294
+ - **From worked examples: the code composer.** For a calculation, give the inputs and output with their units and 8 or more
295
+ worked examples (`python oracle7.py compose --file examples.txt`, or Build > Compose). Half the examples write the
296
+ program; the other half become its held-out exam.
297
+ - The program is composed from typed moves: arithmetic, powers, roots and logarithms, constants with a cited definition
298
+ and a unit, the numbers inside a code such as `205/55R16`, cited cycles and numeral tables, and at most two fitted
299
+ constants, reported as fitted.
300
+ - **Units are types:** a sum needs both sides in the same unit, a program with no fitted constant must come out in the
301
+ output's unit, and a fitted program must reproduce the examples to the precision they were given in.
302
+ - The program is written in Python and JavaScript and run in a separate interpreter against the examples before it is
303
+ kept. It declines, and names the gap, when the examples are not a function of their inputs or no program within its
304
+ bounds reproduces them. No language model is involved.
305
+ - **Pre-registered and run once.** On 12 sealed tasks the first version composed 12 and got 10 right on held-out examples;
306
+ its two failures were curve-fits. The unit-typed version composed 11 of 12 new tasks, got all 11 right on every
307
+ held-out example, and declined both tasks that have no program.
308
+ - **20 composed specialists ship and answer in the core** (fold w562), each admitted by the unchanged specialist gate on
309
+ an exam of new values: alcohol by volume, map scale, gear inches, the Chinese zodiac, exposure value, running pace,
310
+ Celsius/Fahrenheit/kelvin, BMI, Kepler's third law, kinetic energy, electrical power, pressure under water, pendulum
311
+ period, weekday of a 2025 date, binary numerals, average speed, mean arterial pressure, distance from a sound's delay.
312
+ Each answer carries its program. A value of a sign no worked example had is declined, not extrapolated. Roman numerals
313
+ was composed but not admitted, because the core already answers it.
314
+ - **A polite request is the question it stands for** (w560). "Could you give me the capital of Peru?", "For Italy, what is
315
+ the capital?" and "Could you work out the ABV given ..." get the plain question's reply. A request to narrate ("tell me
316
+ the story of ...") is left alone.
317
+ - **Three readings fixed** (w563). A reply that only reads back a number the question gave is withheld. A statistics reply
318
+ to a question that asks for no statistic is withheld ("mean arterial pressure for 128/84" is not an average). A word
319
+ answer from the specialist that owns the question is kept when it names the subject ("the chemical symbol of copper").
320
+
321
+ **Release test PI41b** (88 questions written and hashed on 2026-10-20 before this head was built, run once on each variant
322
+ and once on the 4.0 slim release as published): **full 78 right, 1 false yes, 9 declined; slim 77 right, 1 false yes, 10
323
+ declined; precision on answered 100%.** 4.0 on the same questions: 50 right, 2 wrong (one of them its single false yes), 36
324
+ declined. Calculations: 24 right against 4.0's 0. Polite requests: 16 right (slim 15) against 12, none of 4.0's lost. Plain questions: 23 right,
325
+ the same as 4.0. The false yes is a pre-registered known limit: a blood pressure of 70/110 (diastolic above systolic) is
326
+ answered, because the composed reader's domain checks signs only. Sha256 of the question file:
327
+ `1df14b77e5aea86207bf2bf631ab1938eeba6fb7fe92b2a0486aa75dc52700ea`.
328
+ The first 4.1 candidate **failed** its release test (PI41): precision 96.5% and calculations 23 right against 1, but polite
329
+ requests gained 2 where the bar was 4, because two chemical-symbol questions 4.0 answered were lost. The causes were traced
330
+ and fixed with general rules (w563), and PI41b was written fresh before the fix was built.
331
+
332
  ## The Workbench
333
 
334
  ```bash
 
350
  and whether it was measured, and a physically impossible reading is rejected and named.
351
  - **Conversations:** kept on your machine in a side panel; reopen one and the core picks up its context. Any
352
  conversation can become a temporary specialist that recalls it.
353
+ - **Build:** write a specialist in the page, or have it built from 3 to 6 example questions (the swarm) or from 8 or more worked examples of a calculation (the code composer), and examine it the way the release's own were examined. The dev exam can be
354
  repeated; the held-out exam runs once. A specialist joins your model, and the diagram, only if it adds right answers,
355
  adds no false yes and stays in its lane. It can only fill the core's declines; it never overrides an answer or a check.
356
  - **Gaps:** an opt-in journal, kept on your machine, groups your declines into the specialists your model is missing.
 
370
 
371
  ## Verify this download
372
 
373
+ **Release 4.9 (23 October 2026), the swarm.** `python oracle7.py swarm point <target>` builds the parts a problem needs, examines each on cases it has not seen, and composes them until the problem is solved: research, plans and code, every step checked, no neural network (see "What 4.9 adds"). The first public release since 4.0, carrying 4.8 (a reply must answer what was asked) and the internal 4.1-4.7 (CHANGELOG.md, with every failed test). Release test pre-registration v22, sealed before the code froze and run once on four targets the swarm had never seen: 6 parts admitted, precision 1.0, 4 of 4 plans right (one built its missing part mid-plan; one used a part built for another target), 40/40 library tests passed, 0 must-decline questions answered, the decline specialist 7 right, 0 wrong. v19, v20 and v21 failed and are published. Root `44f51e06832a2b8104d79ee976dffea3b15f5601430320e1b0789b9a7f114b6c`, anchored on Solana in transaction [WRZKt7GWvUTr](https://explorer.solana.com/tx/WRZKt7GWvUTrztx1KXbYJq6LZ89nvVdxmFR1xkazUabhwn4k9ER6uUJgGofxgERFiaXb8UQbu7Vsd9gumXZ9Hpd).
374
+
375
  **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."). Release test, PI4-B (186 turns, sealed before the code froze, run once): 156 right, 30 declined, 0 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: 21 right, 0 wrong. Mean steps k 4.522; median time L 111.95 ms. Route forms re-entered on recurring questions: 94.4% (shuffled baseline 20.6%); 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 `d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5`, anchored on Solana: [4vJ57qaJxvzZ...](https://explorer.solana.com/tx/4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH).
376
 
377
  **Release 3.2 (18 October 2026).** Proved specialists: [veri7vn](https://github.com/emberian/veri7vn) by ember arlynx (CC0) re-implements 128 of Oracle7's specialists as kernels proved in Isabelle/HOL and compiled to native code. Release 3.2 ships them (static Linux x86-64, built from commit `3bf43cff8eaa`, checksums in specialists/_proved) and uses them as a cross-check: when a specialist answers and its kernel gives the same answer, the reply is marked proved and names the theorems; when the kernel gives a different answer, the reply is withheld; elsewhere nothing changes. What is proved is the computation from the question as read; reading the question is not proved (veri7vn's recognizer is untrusted by design), so a proved mark never vouches for the reading. On the released specialists' own held-out exams the kernels and the specialists agreed on every answer both gave, apart from display rounding, where the kernels' exact arithmetic was the better. Four new specialists for stars and their planets: a star's luminosity, temperature and radius; the habitable zone (Kopparapu et al. 2013) in AU or orbital periods; orbits around other stars, their starlight and equilibrium temperature; and transits (planet size from depth, probability, duration), each admitted on a held-out exam with no wrong answers. Owner-first: when the specialist a question belongs to was never asked (orbital mechanics, which no list carried, is the clearest case), the whole family is asked, and an answer is kept only if every number the question gives moves it - the test that refuses the astronomy reader's '29.8 km/s' for a satellite 400 km above Earth; owner-first never overrules a question that is itself the problem (a planet that does not exist), and a planet's own figure given for an orbit at an altitude is withheld as the wrong reading - both found by the release candidate's smoke test before sealed test 23 ran. A remaining amount of a decaying sample is now given in the mass unit asked. Read-back writing: the Workbench's essays may now reword a source sentence (a same-sense synonym, a date moved to the front), kept only when reading it back gives exactly the source's meaning; each rewording is listed beside its source, and its quality waits for people's blind ratings. Release gate, sealed test 23 (162 questions written before the code froze, run once): 142 right, 3 wrong, 17 declined, 1 false yes; precision 98.3% (star and unit-asked group: 12 right, 0 wrong). New root `0a9bb1c0b4c4b85bf879b54405fb8107c5ecb3bce3663ee5da3a93b3d52696d8`, anchored on Solana: [3ZUmd7FTw4uN...](https://explorer.solana.com/tx/3ZUmd7FTw4uNLWUrZa3HMB8UCGLMneiQbDP2kXc3Sf1TFKPkczZntpBbTgtzDnXxCWeA8YFtTG22T9ZH53w3TsW2).
 
410
 
411
  ## What is inside
412
 
413
+ - **The core**: a chain of 346 small modules ("folds"), each admitted only by an automated gate: a fixed capability
414
  panel must not lose an answer, and no fold may add a confidently wrong one. Nothing is trained by gradient descent.
415
  - **Organs**: exact arithmetic and algebra (SymPy, checked by a second method), a relation reader over Wikidata, a reading
416
  route over the stores, dialogue memory, a code composer.
417
+ - **339 specialists** (`root/specialists`, 20 of them composed programs): physics, chemistry, units, astronomy, nutrition, law basics, and more. Each has a
418
  card (`root/specialists/_cards`) with its sources, its held-out score and what it declines.
419
  - **The specialist network**: multi-step questions are read into typed givens and a goal; a path of specialists is found
420
  where every given is used once and every hop is checked. No checked path means no answer.
 
425
 
426
  ## Measured
427
 
428
+ The 4.9, 4.8, 4.2, 4.1 and 4.0 release tests are in the sections above. The results below were measured on earlier heads (release 3.1, head w540) and are kept as published.
429
+
430
  **Sealed release test 19** (150 questions: 70 knowledge, including phrasings the general relation reader is built for; 30 exact; 20 multi-step; 30 that must be declined. Written and hashed on 2026-10-14 before this head was built, and run once on this release as shipped, with a clean harness that checks every loaded module comes from the release):
431
 
432
  **113 right, 1 wrong, 36 declined.** On the 30 questions that must be declined it asserted an answer 0 time(s). Format defects: **0**. Precision on what it answered: **98.8%**. Bars: precision at least 90%, false yes at most 2, format defects 0 - **passed**. Sha256 of the question file: `48c2017bb132c0f5cd899e0b1ad6e01a8339f55445dbecfdd38904d4b4ed20dd`.
 
445
  Dialogue tests built to need specialists (hand-offs, follow-ups after a specialist's answer, numeric follow-ups, two-part turns): test 4 on the previous head - turns handled 67%, precision 78%, follow-ups right 70%; it found two-part turns losing their second answer (fixed by fold w537) and three conversation defects (fixed by w538). **Test 5 on this release: turns handled 78%, precision 94%, follow-ups right 90%, false yes 0.**
446
 
447
 
448
+ **Specialists:** 339 admitted (the gate ledger, last decision per specialist; 33 exams failed and are published with their reasons), each by a held-out exam it saw once (it must beat the main model by a margin, add no false yes, and leave the main model's own answers unchanged); 23 exams were failed and are published with their reasons. As of release 3.1, on their exams the admitted specialists scored 15,478 right and 14 wrong; the main model on the same exams, 3,548 right and 643 wrong.
449
 
450
 
451
  ![Every admitted specialist, drawn from the gate ledger: domain specialists by field on the inner ring, relation readers on the outer ring](specialists_atlas.png)
 
474
 
475
  ## Limits
476
 
477
+ - On questions people type, many replies are still wrong (the precision is in the 4.8 table): a name read as the wrong thing, or the stored fact not the one meant. Each wrong reply can be traced through its path.
478
+ - Reach answers from the Wikidata relation store as it was exported in October 2026; an office holder or a team's coach can have changed since. Quantities with units are not answered from the store; counts are.
479
+ - The baseline reader (4.2) runs about one false flag every three days on each channel. Its pair calls vary from site to site: on one earlier sealed set it called 77% of sensor faults and 75% of real changes right. While one channel of a pair is stuck, changes on the other can also be called sensor faults. A single channel cannot tell a slow sensor drift from the weather, and it says so.
480
+ - Composed specialists (4.1) check only the sign of their inputs and answers against their worked examples: a blood pressure of 70/110 or day 400 of a year is answered. Their programs are short (up to about 11 moves); compound interest was out of reach, and the composer said so. Fitted constants are recovered, not cited, and are labelled.
481
+ - 19 specialist folders named `cmp1-*` are the first wrappers of the same programs, kept as the record of the pre-registered runs; they are not routed (the routed ones are `cmp2-*`, listed in `specialists/_gate/standing_composed_v1.txt`).
482
  - Known from the sealed dialogue tests (test 5): some numeric follow-ups are not yet resolved ("and after 32 days?", a weekly total, a tank's volume turned into a mass); a short greeting can be met with a request to rephrase; a company name can link to one of its products ("Sony" to a camera line); a title with an apostrophe can fail to parse.
483
  - Fixed in this release by folds w539 and w540: a name containing a number is no longer read as arithmetic ("What is the half-life of carbon-14?" is declined, not answered "-14"); a composed program for a request to count a particular thing must mention that thing ("count the vowels" is declined rather than answered with a program that counts items); a question asking what orbits or sits in something is not answered with what that thing orbits or sits in; a number copied from a worded question is not returned as its result. Run code it hands you against your own tests; the Workbench's Code tab does that.
484
  - English only. The knowledge stores are snapshots (2025-2026 dumps); nothing is fetched live.
RELEASE_HASHES.json CHANGED
@@ -1,16 +1,16 @@
1
  {
2
  "format": "oracle7-release-hashes/1",
3
  "release": "oracle7-slim",
4
- "head": "oracle_release_runtime_w558",
5
- "merkle_root": "d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5",
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",
@@ -72,6 +72,22 @@
72
  "sha256": "7d23c6ce45e5ddf686bd1ed34d3c8a8be9a37e29682c73b10c42bbc07181b6aa",
73
  "files": 8
74
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  "specialists/bodies-v2": {
76
  "sha256": "aca39dcb39cb470c8bbf9995571fc869f5fb28431e2acad9af4143175508f053",
77
  "files": 9
@@ -108,6 +124,242 @@
108
  "sha256": "f42048beb6bab4e312d0db1d79978eef5907b3274ee24108dad65bbf8aa5dfb2",
109
  "files": 8
110
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  "specialists/coldchain": {
112
  "sha256": "e150790aef318f2e8f0362c701e8bb066aaae4718de5491144d2e9e50e6ebe01",
113
  "files": 7
@@ -376,6 +628,10 @@
376
  "sha256": "8f159bc6f48d5ea57291a942c9936eb443599bb3af6ffdce23940274a63bd0ba",
377
  "files": 6
378
  },
 
 
 
 
379
  "specialists/microbiology-v2": {
380
  "sha256": "6ec92110413981f55ec5a7fbb019635da501f67347d2dca8698b2dc5fe41ad8f",
381
  "files": 9
@@ -1257,12 +1513,12 @@
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,15 +1533,15 @@
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": "0a9bb1c0b4c4b85bf879b54405fb8107c5ecb3bce3663ee5da3a93b3d52696d8",
1288
- "anchor_signature": "3ZUmd7FTw4uNLWUrZa3HMB8UCGLMneiQbDP2kXc3Sf1TFKPkczZntpBbTgtzDnXxCWeA8YFtTG22T9ZH53w3TsW2",
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
  }
 
1
  {
2
  "format": "oracle7-release-hashes/1",
3
  "release": "oracle7-slim",
4
+ "head": "oracle_release_runtime_w436",
5
+ "merkle_root": "44f51e06832a2b8104d79ee976dffea3b15f5601430320e1b0789b9a7f114b6c",
6
  "parts": {
7
  "specialists/_cards": {
8
  "sha256": "619ae757757de886c389cf953924f090d0f71ecff02447171381287f9553a2cf",
9
  "files": 142
10
  },
11
  "specialists/_gate": {
12
+ "sha256": "6ef262a2f1581e323481c1fa3461a93d8f0368d15593c7b193178ddd99241a7c",
13
+ "files": 25
14
  },
15
  "specialists/_proved": {
16
  "sha256": "4ef644bab853b5f3f7883862aad58c55ca0682ba97b12f95664887d795ee6df9",
 
72
  "sha256": "7d23c6ce45e5ddf686bd1ed34d3c8a8be9a37e29682c73b10c42bbc07181b6aa",
73
  "files": 8
74
  },
75
+ "specialists/bld2-f14-p4511": {
76
+ "sha256": "1754cbac6a4caaec7339ea8ed96e23bc35f23b32f7cc9bf60a148a1960e13bef",
77
+ "files": 7
78
+ },
79
+ "specialists/bld2-f3-p3395": {
80
+ "sha256": "39c62e6e95c2d7f65e9bac14e4fe3bf3a22370dcef73140e995634e672d3a7eb",
81
+ "files": 7
82
+ },
83
+ "specialists/bld2-f7-p2250": {
84
+ "sha256": "243788f36e59f65243e7913b414eb78ca9fdc5029c40f3f4092eb032558a03e7",
85
+ "files": 7
86
+ },
87
+ "specialists/bld2-f8-p2787": {
88
+ "sha256": "9137d2f9d52831d8183f655e93103d0a6fe60038096a21b33086cfdb7b358ef0",
89
+ "files": 7
90
+ },
91
  "specialists/bodies-v2": {
92
  "sha256": "aca39dcb39cb470c8bbf9995571fc869f5fb28431e2acad9af4143175508f053",
93
  "files": 9
 
124
  "sha256": "f42048beb6bab4e312d0db1d79978eef5907b3274ee24108dad65bbf8aa5dfb2",
125
  "files": 8
126
  },
127
+ "specialists/cmp1-k1": {
128
+ "sha256": "f773540ae58334bfa326719346419f53f907101ca2bfe6250c548c4a09a6ff0b",
129
+ "files": 9
130
+ },
131
+ "specialists/cmp1-k10": {
132
+ "sha256": "6a99a6cf46d4bd07f4019e3a17a6971252f3b2fc32e81eca2986600ddae3b506",
133
+ "files": 8
134
+ },
135
+ "specialists/cmp1-k11": {
136
+ "sha256": "21f8e2048c198b838c93a2fb209e73c987a2c29ba2e770dec489fd732fb446ed",
137
+ "files": 8
138
+ },
139
+ "specialists/cmp1-k12": {
140
+ "sha256": "28025ad24d3dc23aee4bd15551b22704897c34041e61c4b22e2cb0d7a241fe41",
141
+ "files": 8
142
+ },
143
+ "specialists/cmp1-k4": {
144
+ "sha256": "df167d7933ac7b8bc1d4302b98d2aa93138ad4e1745a45a560c265d294f4db21",
145
+ "files": 9
146
+ },
147
+ "specialists/cmp1-k5": {
148
+ "sha256": "25f8b5df313e72e5b4d5c2d587f1ca5b7d218f3677e286f924f10edfb46e94b5",
149
+ "files": 9
150
+ },
151
+ "specialists/cmp1-k8": {
152
+ "sha256": "c88aeab65344625d9ca0d440df566753ff7d1e32d9b3f218130025ed1c1e962e",
153
+ "files": 8
154
+ },
155
+ "specialists/cmp1-k9": {
156
+ "sha256": "cc34331c1b576a94f9a5cbf2d302291f5fd3e3f5b4ca7bbc2638a57528ffac29",
157
+ "files": 8
158
+ },
159
+ "specialists/cmp1-l1": {
160
+ "sha256": "c2b5f1d450bd57f1ae1b679408b368f783329299761a6911eb21ec9ba41ff132",
161
+ "files": 8
162
+ },
163
+ "specialists/cmp1-l10": {
164
+ "sha256": "8702ef88b3d4024e3caa92358e3a83c9ac8468af92b13e830f80f3da999910c5",
165
+ "files": 8
166
+ },
167
+ "specialists/cmp1-l11": {
168
+ "sha256": "fd965f61d032c232a10c9157c2ffc10206d17b25cafbff86dc909020344a39a9",
169
+ "files": 8
170
+ },
171
+ "specialists/cmp1-l12": {
172
+ "sha256": "082025ce2e996fecd8507a2ee20dece45c38b7ad345c0c9733e036d86876ceab",
173
+ "files": 8
174
+ },
175
+ "specialists/cmp1-l2": {
176
+ "sha256": "4fe6249dbdcdd02f2ad7e1d86f6eb49cfaf12559ae6f0c0561deb90085fb9331",
177
+ "files": 8
178
+ },
179
+ "specialists/cmp1-l3": {
180
+ "sha256": "338bd613526764301b1245902390d77093b469caa861dcd5467020e0d059db5b",
181
+ "files": 8
182
+ },
183
+ "specialists/cmp1-l5": {
184
+ "sha256": "def633d185ce10cdcf3799e46da62dbb7e87f4af407d523ddb796d539b4fa910",
185
+ "files": 8
186
+ },
187
+ "specialists/cmp1-l6": {
188
+ "sha256": "ed439497c06af19f0bba69841fb01399d30fd9ccf4d70217ce6316f729bd97ea",
189
+ "files": 8
190
+ },
191
+ "specialists/cmp1-l7": {
192
+ "sha256": "f3c75eb9b2afc4ad83f162a7f7c8676e34677b6060fda2e0a64bf46f799bc2f0",
193
+ "files": 8
194
+ },
195
+ "specialists/cmp1-l8": {
196
+ "sha256": "e341b3ee0e8f7f9be495604a959b1296393c5f40657b3ad40ba9988c4ed856f1",
197
+ "files": 8
198
+ },
199
+ "specialists/cmp1-l9": {
200
+ "sha256": "0fdd1ef6ab4b3eebf024f3d6986fcb531bd362503b10898bf5e72c0c3b3cdcc2",
201
+ "files": 8
202
+ },
203
+ "specialists/cmp2-k1": {
204
+ "sha256": "5f1445133559e9c511c46ee288b50e36fa17330a26d21558a1a8b6b9e1f866c3",
205
+ "files": 8
206
+ },
207
+ "specialists/cmp2-k10": {
208
+ "sha256": "dd96440e18c78498fc595ef8fa8916006207f425420cbea0d3b9e736e5931e33",
209
+ "files": 8
210
+ },
211
+ "specialists/cmp2-k11": {
212
+ "sha256": "594f496d06515478f8b2cc5ef172db85cd5a9ac7e73f2f961d2ba8f6f5e63367",
213
+ "files": 8
214
+ },
215
+ "specialists/cmp2-k12": {
216
+ "sha256": "b1640b68fe1a8823bfc5f828b450ce61667b067a2074d77a517c8166c3025b14",
217
+ "files": 8
218
+ },
219
+ "specialists/cmp2-k4": {
220
+ "sha256": "4a75c78efee4ad3197c9aaf86e75368dc2369c56627bba876cc35b6bb16f03a7",
221
+ "files": 8
222
+ },
223
+ "specialists/cmp2-k5": {
224
+ "sha256": "139b00d4dd571430550a044b1b1f3a0d37fca438010a27e8e70ebb444922a6c6",
225
+ "files": 8
226
+ },
227
+ "specialists/cmp2-k6": {
228
+ "sha256": "f1c53148d2888cb43a846c06f8f54e08ca9bf31dba45c171d659aca866bcae9c",
229
+ "files": 8
230
+ },
231
+ "specialists/cmp2-k8": {
232
+ "sha256": "5637c27d029a79d11297cbf48d156f137f8a5243b2a42d31023c79552b46be75",
233
+ "files": 8
234
+ },
235
+ "specialists/cmp2-k9": {
236
+ "sha256": "53d740437d9f0000f94bda51d6d8a79e4e648de22898989d5cb368020ea6e6c2",
237
+ "files": 8
238
+ },
239
+ "specialists/cmp2-l1": {
240
+ "sha256": "13a7916344b1595580270b96a9fd19b05f4a1b1b024318231df7e1b116c6826f",
241
+ "files": 8
242
+ },
243
+ "specialists/cmp2-l10": {
244
+ "sha256": "54f93bc5b3c43497ba56eb861a63c0b8ccea0362298b825409395c7158cc4d72",
245
+ "files": 8
246
+ },
247
+ "specialists/cmp2-l11": {
248
+ "sha256": "c30ef54ed948c9dc12bc3941863ea80efc8162529272efbab01ed4d702f34138",
249
+ "files": 8
250
+ },
251
+ "specialists/cmp2-l12": {
252
+ "sha256": "40b6407b696cf9e01e756fe4e3313cfe06256ce775c84f3bdbaeb4b2d84fddf3",
253
+ "files": 8
254
+ },
255
+ "specialists/cmp2-l2": {
256
+ "sha256": "5b02e52082f3614f043606f1cfdfb411b1a9019cbd30c58537fd446272640065",
257
+ "files": 8
258
+ },
259
+ "specialists/cmp2-l3": {
260
+ "sha256": "47fd5663a61af9f388f875acf01668ef6d7a874cce0c88c2c0c6ee2be037884c",
261
+ "files": 8
262
+ },
263
+ "specialists/cmp2-l5": {
264
+ "sha256": "089efb2686c50dbcada8ec51c89f2788c16f1400272777ddfd9bb5827821b93f",
265
+ "files": 8
266
+ },
267
+ "specialists/cmp2-l6": {
268
+ "sha256": "a499f60314565e193514db3282a90bf90c0084aba6a43fdb32459fd20f21f2cb",
269
+ "files": 8
270
+ },
271
+ "specialists/cmp2-l7": {
272
+ "sha256": "ededb1cdf27ef33eec51d097e98ac6db9634724cec7a47d16f6a86b211beac0b",
273
+ "files": 8
274
+ },
275
+ "specialists/cmp2-l8": {
276
+ "sha256": "8ae37138f4f35918a6f7885cbd9248fb835e0b269e5f6dafd636b51f53135185",
277
+ "files": 8
278
+ },
279
+ "specialists/cmp2-l9": {
280
+ "sha256": "25122f8cb9bd1190b0e22ab1e51dcca7e4a8de2de09dc5927653288ad0ec972b",
281
+ "files": 8
282
+ },
283
+ "specialists/cmp3-k1": {
284
+ "sha256": "6edf931e960d0b21d9287fcebf89d57c0e225a2cdb6956f8e059bc0ff1e2d228",
285
+ "files": 7
286
+ },
287
+ "specialists/cmp3-k10": {
288
+ "sha256": "e99df63c6f0047ed8e902f4bde6359dc69b4e3c3f6e6d124549f1c777f2d297c",
289
+ "files": 7
290
+ },
291
+ "specialists/cmp3-k11": {
292
+ "sha256": "5e3440ab2a2c15b0e07762711b5d2fd02287ecb0e36da04f90f4b2b6f1ee3a47",
293
+ "files": 7
294
+ },
295
+ "specialists/cmp3-k12": {
296
+ "sha256": "db5e7fa9a61b14e322a9bb8eb74e7addc68355220d8b51370e0a2a8612080433",
297
+ "files": 7
298
+ },
299
+ "specialists/cmp3-k4": {
300
+ "sha256": "5e9e875b9513602fe4bb7b603b7e8bf7565d270f4a3f203e080026654c65a9ab",
301
+ "files": 7
302
+ },
303
+ "specialists/cmp3-k5": {
304
+ "sha256": "4ac3a976f8b2c10e42a7e814c25f60db6ab91769febc3f85ecc40f796912de18",
305
+ "files": 7
306
+ },
307
+ "specialists/cmp3-k6": {
308
+ "sha256": "45cbf82c716cb3cdc4af06cee245d1b2018198bac0728fe676bb15b1dcac6401",
309
+ "files": 7
310
+ },
311
+ "specialists/cmp3-k8": {
312
+ "sha256": "9ffc58f500797fcbc32b41da0680881957416b1c2ac370bb4ce9650d74a772e6",
313
+ "files": 7
314
+ },
315
+ "specialists/cmp3-k9": {
316
+ "sha256": "860a1c2571acb004e63bc2fdbfdb16f0983a523ca17334a2b2584376e900e65e",
317
+ "files": 7
318
+ },
319
+ "specialists/cmp3-l1": {
320
+ "sha256": "b0e8b40d6b21af5bb7b81cbb61375928d50edc1d1f55450fb3bd35021320c4cd",
321
+ "files": 7
322
+ },
323
+ "specialists/cmp3-l10": {
324
+ "sha256": "f8f5b3c30c4d0cb436282221b31fc8f1dfb70c73ab475c7b6ba4429d4f689cb8",
325
+ "files": 7
326
+ },
327
+ "specialists/cmp3-l11": {
328
+ "sha256": "72b15bfbb379807cd8ec64c24f35a3c8d6378434320fb5dcf287ba7d8bd176e3",
329
+ "files": 7
330
+ },
331
+ "specialists/cmp3-l12": {
332
+ "sha256": "d09dd33a818e02f1deeff0d66d7e7133681f99cc86856ff1cf24444897b8ca42",
333
+ "files": 7
334
+ },
335
+ "specialists/cmp3-l2": {
336
+ "sha256": "6d5853d1a4fd5e65991c41b444ac148ad75d9c9e434079c1b05655d5ae877a4c",
337
+ "files": 7
338
+ },
339
+ "specialists/cmp3-l3": {
340
+ "sha256": "94c1c35211ee81094809b4818a03823ff92e8410fdb1d57f5999ff737d6dea9c",
341
+ "files": 7
342
+ },
343
+ "specialists/cmp3-l5": {
344
+ "sha256": "61955c242316ab8600a1e28d089c11a0b9332a41626468c58e9b51f7086dd41f",
345
+ "files": 7
346
+ },
347
+ "specialists/cmp3-l6": {
348
+ "sha256": "e8cd854e30660f785f916566e00f2fba5b07f8632085201a0b514f35062d81be",
349
+ "files": 7
350
+ },
351
+ "specialists/cmp3-l7": {
352
+ "sha256": "275a5cd1b5cde8fe3a4097b31f83cf7177b368f2fb2f98af7fee7acdcd121323",
353
+ "files": 7
354
+ },
355
+ "specialists/cmp3-l8": {
356
+ "sha256": "1e0acfabba5fe2876dfd88ce2a1e026bc77f9bd955d270ab6f9aa2bf08f53c97",
357
+ "files": 7
358
+ },
359
+ "specialists/cmp3-l9": {
360
+ "sha256": "736c4c31b86a9185345f68a634d2220daec8caeba1659cbb2d260e637e8443e3",
361
+ "files": 7
362
+ },
363
  "specialists/coldchain": {
364
  "sha256": "e150790aef318f2e8f0362c701e8bb066aaae4718de5491144d2e9e50e6ebe01",
365
  "files": 7
 
628
  "sha256": "8f159bc6f48d5ea57291a942c9936eb443599bb3af6ffdce23940274a63bd0ba",
629
  "files": 6
630
  },
631
+ "specialists/meteorology-v2": {
632
+ "sha256": "eae191b6e48feb4fae5011fbaa190f5fbe7286e35d9b2c5b49005cc4baca06ff",
633
+ "files": 5
634
+ },
635
  "specialists/microbiology-v2": {
636
  "sha256": "6ec92110413981f55ec5a7fbb019635da501f67347d2dca8698b2dc5fe41ad8f",
637
  "files": 9
 
1513
  "files": 9
1514
  },
1515
  "core/admitted": {
1516
+ "sha256": "068c508357b5ea585f6b14803b1c8133ce0b07fa5dbe76c638b1e40132d6fe49",
1517
+ "files": 364
1518
  },
1519
  "workbench": {
1520
+ "sha256": "3cb2accbdc47cfd79dcc822ccd0ea58a08a73798e53d201b12e25116406af529",
1521
+ "files": 179
1522
  },
1523
  "oracle7.py": {
1524
  "sha256": "9d68865540b23122e0020c0b8ee52471a71a3dfa8e3572b23b961ea4b3bf920e",
 
1533
  "anchor": {
1534
  "chain": "solana-mainnet",
1535
  "program": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr",
1536
+ "memo": "Oracle7 release 4.9 (w436), the swarm, slim. oracle7-slim merkle 44f51e06832a2b8104d79ee976dffea3b15f5601430320e1b0789b9a7f114b6c. Release test pre-registration v22, run once. Recipe: RELEASE_HASHES.json in each repository.",
1537
+ "signature": "WRZKt7GWvUTrztx1KXbYJq6LZ89nvVdxmFR1xkazUabhwn4k9ER6uUJgGofxgERFiaXb8UQbu7Vsd9gumXZ9Hpd",
1538
+ "block_time_utc": "2026-10-23T05:52:30Z",
1539
+ "slot": 460330732,
1540
+ "explorer": "https://explorer.solana.com/tx/WRZKt7GWvUTrztx1KXbYJq6LZ89nvVdxmFR1xkazUabhwn4k9ER6uUJgGofxgERFiaXb8UQbu7Vsd9gumXZ9Hpd"
1541
  },
1542
  "supersedes": {
1543
+ "merkle_root": "d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5",
1544
+ "anchor_signature": "4vJ57qaJxvzZteEm3vL9sAsmsRmeeLg3X8ESk61zN29ZpGwqsCz3xcGMhoqWXy8TyqEQH9HT7Tn4c2FxoiGuvosH",
1545
+ "reason": "release 4.9 (2026), the swarm (python oracle7.py swarm point <target>: survey, build, examine, represent, combine, work - research, plans composed until solved, code - report; the decline specialist; table specialist v3; the exam counts only the wrong answers a specialist adds; the self-loop epoch folds w435 and w436); release test pre-registration v22 passed (v19, v20 and v21 failed and are in CHANGELOG.md). Carries 4.8 (staged, never published on its own: a reply must answer what is asked, and its premise must hold), 4.7 (internal, failed), 4.6, 4.5, 4.2 and 4.1 (CHANGELOG.md). The first public release since 4.0."
1546
  }
1547
  }
RELEASE_HASHES_before_48.json ADDED
@@ -0,0 +1,1291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "format": "oracle7-release-hashes/1",
3
+ "release": "oracle7-slim",
4
+ "head": "oracle_release_runtime_w558",
5
+ "merkle_root": "d72ed426cffd99861bec539e0776127351f4d7955d20e73583da5b931a2b55a5",
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",
21
+ "files": 6
22
+ },
23
+ "specialists/additive-v2": {
24
+ "sha256": "56bf6cdba671418df144e7caedfab6549ef1d436b3065d0c1d6f244c3ba4d9ab",
25
+ "files": 9
26
+ },
27
+ "specialists/agriculture-v2": {
28
+ "sha256": "523033353b845b037316bb4b71250441ec4ff6ba398ba3133dea5297c43680d8",
29
+ "files": 11
30
+ },
31
+ "specialists/airquality": {
32
+ "sha256": "befc3811a2e40c142a378d3f058a97dcec6abb7265d22d875de0d39884051ccf",
33
+ "files": 8
34
+ },
35
+ "specialists/algorithms": {
36
+ "sha256": "ad309ce3c7881029bfe872d7de0942a136c6329822733c9489d4ea6bea44f78c",
37
+ "files": 7
38
+ },
39
+ "specialists/anatomy": {
40
+ "sha256": "a21bd232538cb1323fae467a05fefcdc717621ce4c4174a57ceb58dd0152d32f",
41
+ "files": 8
42
+ },
43
+ "specialists/anatomy-r2": {
44
+ "sha256": "3eb6374536765ee657f4e17c5cc9ef10ef7a7846746c79c4a4e2d4c5e254c30f",
45
+ "files": 7
46
+ },
47
+ "specialists/architecture": {
48
+ "sha256": "58dfad2ed6b36f50a0c4c755090ded6f01f7476eeac689eaf488a8aab9de5164",
49
+ "files": 8
50
+ },
51
+ "specialists/arthistory": {
52
+ "sha256": "696412350d6532270d324236a3e3aec58a27bc21ec9c359988c5dee3ab1f2d16",
53
+ "files": 10
54
+ },
55
+ "specialists/astronomy": {
56
+ "sha256": "58408c64c5d3c3cb6df1124e3db87fd74cfa6bad0d8cdcab2ebf11657f0fbe75",
57
+ "files": 8
58
+ },
59
+ "specialists/astronomy-v2": {
60
+ "sha256": "c0011119e9775b93859ff012fa6a8b1fdd1297a281c8f8411802370fb88163bb",
61
+ "files": 7
62
+ },
63
+ "specialists/astronomy-v3": {
64
+ "sha256": "bd211531997204300cdb08d777da9e5aac96d56120a2e919334919baecd2f32d",
65
+ "files": 8
66
+ },
67
+ "specialists/astronomy-v3-r2": {
68
+ "sha256": "3c406f686faba66a057f5cd9eb87e8bc068e7f7f746e2cd4d6ab3de3ca072766",
69
+ "files": 14
70
+ },
71
+ "specialists/biology": {
72
+ "sha256": "7d23c6ce45e5ddf686bd1ed34d3c8a8be9a37e29682c73b10c42bbc07181b6aa",
73
+ "files": 8
74
+ },
75
+ "specialists/bodies-v2": {
76
+ "sha256": "aca39dcb39cb470c8bbf9995571fc869f5fb28431e2acad9af4143175508f053",
77
+ "files": 9
78
+ },
79
+ "specialists/botany": {
80
+ "sha256": "5af91f59a42663c0befc53099a6aa62e8bddc684abf3a1134a6e95dd641e6766",
81
+ "files": 10
82
+ },
83
+ "specialists/calculus": {
84
+ "sha256": "6b9fef0d96329117eb10220ab5eddb33fb1534da455c2d5db18db1eaa5a114e5",
85
+ "files": 6
86
+ },
87
+ "specialists/carboncapture": {
88
+ "sha256": "99e32723e5c04e1d3cfa4b515a642d9e480dae4978e55ac01652721477977e8b",
89
+ "files": 8
90
+ },
91
+ "specialists/carbonmat": {
92
+ "sha256": "64f1f87981f10f39fcef287a85ab7d578dfbfe54a7e185dc79aa918a83030a89",
93
+ "files": 8
94
+ },
95
+ "specialists/chemistry": {
96
+ "sha256": "21ebebe15bb58bb6e0a230b2e2fbe4e77f373fbde762ac1779c91fb945c2e281",
97
+ "files": 8
98
+ },
99
+ "specialists/chemistry-v3": {
100
+ "sha256": "78495138a3ee05df30c872bc095b36813b4c99c7de320521aa2fbee0e947225b",
101
+ "files": 12
102
+ },
103
+ "specialists/childdev": {
104
+ "sha256": "2e706a0ab4be8a1185d7a8dcd6848ed1ef84438f661dacd8eaf3438f7e71d72a",
105
+ "files": 10
106
+ },
107
+ "specialists/climate": {
108
+ "sha256": "f42048beb6bab4e312d0db1d79978eef5907b3274ee24108dad65bbf8aa5dfb2",
109
+ "files": 8
110
+ },
111
+ "specialists/coldchain": {
112
+ "sha256": "e150790aef318f2e8f0362c701e8bb066aaae4718de5491144d2e9e50e6ebe01",
113
+ "files": 7
114
+ },
115
+ "specialists/coldchain-v2": {
116
+ "sha256": "95ecd3302b85ada9304c0724c852f32c5173cc491cd0e1ad07bceff35df55701",
117
+ "files": 12
118
+ },
119
+ "specialists/cooking": {
120
+ "sha256": "b95cdb478d919ff54af26ec8275dce278e0365e5c576c79b2b4cdbc2fffe9a4f",
121
+ "files": 9
122
+ },
123
+ "specialists/cooking-v2": {
124
+ "sha256": "59d8a815a76d2240161f1c429bb185e1cf4ae89f7433c7207e156104189b9e12",
125
+ "files": 8
126
+ },
127
+ "specialists/cooking-v3": {
128
+ "sha256": "244f4d1225b884d24ed81138b885bbc4b60e48e91839aa3a55ce030980d46b3b",
129
+ "files": 9
130
+ },
131
+ "specialists/cooking-v3-r2": {
132
+ "sha256": "f9add0be09a177d4afb4485a4237474c0f6346baa3f9cdf5c98993c7c4a9b7d3",
133
+ "files": 15
134
+ },
135
+ "specialists/crafts": {
136
+ "sha256": "2d0867e2e54b1b6381f86f44999bb5fa9f84ae6a8f2cddc244bc67cba34557d7",
137
+ "files": 8
138
+ },
139
+ "specialists/cyber": {
140
+ "sha256": "948e2190f06c367417c08ec2e1dbf63eadd8826885743381805e61fa98d135a2",
141
+ "files": 8
142
+ },
143
+ "specialists/dataformats": {
144
+ "sha256": "2b97a2b0b9f9335f17541168e801ece056eef7b3ee7f42d6c5fb856dd968520c",
145
+ "files": 7
146
+ },
147
+ "specialists/decay": {
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
158
+ },
159
+ "specialists/densities-r2": {
160
+ "sha256": "afdd31a9495e7a54695bf3bb8a0d51eeb545ef82b7b9fcaa71367066c385498d",
161
+ "files": 9
162
+ },
163
+ "specialists/ecology": {
164
+ "sha256": "010360a1fdeb98a4f2fc21be6b1eebd96695d5d80e953b55f765bfc0a2b36b85",
165
+ "files": 8
166
+ },
167
+ "specialists/economics": {
168
+ "sha256": "eebb751f4324f72375b60a3d70942c8ab5b132331cb148cb83b9523ecad23bf4",
169
+ "files": 8
170
+ },
171
+ "specialists/electrical": {
172
+ "sha256": "4c89aed30761c2ac9d724bbf296c29d0c22305f6457b95a728cfb529381df4d1",
173
+ "files": 8
174
+ },
175
+ "specialists/electronics": {
176
+ "sha256": "9b37becbb4fba1243237e17a3291ddb6564e49041219519bd0d945890acd66dc",
177
+ "files": 7
178
+ },
179
+ "specialists/electronics-r2": {
180
+ "sha256": "1a67a09f49f11ed7b7bde0f73d4f98e1ed6e5e9ba5ca0eadf045f2fd14a90d68",
181
+ "files": 7
182
+ },
183
+ "specialists/embedded": {
184
+ "sha256": "d2acd2482059890e52b3685b527bac3d4d50622a524492c7487a51e2ce9aea5d",
185
+ "files": 8
186
+ },
187
+ "specialists/energy-v2": {
188
+ "sha256": "cccd99903b4f425a4c2506321e563ad3f382119ede0c3594304de7b1805dac52",
189
+ "files": 7
190
+ },
191
+ "specialists/energy-v3": {
192
+ "sha256": "9384e2a81a7042d11f4b7a0d3a2ff0a3b9b5b5f3edde8c1b7a35b1217094508b",
193
+ "files": 8
194
+ },
195
+ "specialists/entomology": {
196
+ "sha256": "ee081a71c75d7643f1b50729acca7fb0f002e30da7cdcfc8e9364da5209ee0fe",
197
+ "files": 10
198
+ },
199
+ "specialists/etiquette": {
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
210
+ },
211
+ "specialists/finance-v2": {
212
+ "sha256": "d3b5d3a6666a6f051cb7290f4967ebc6d2d16c68f8dd24235a2fac070ed96c00",
213
+ "files": 12
214
+ },
215
+ "specialists/finance-v2-r2": {
216
+ "sha256": "4b44d6264bc12075f7bf197726399559e6086a902a44de5d8c874cdae710bdf2",
217
+ "files": 11
218
+ },
219
+ "specialists/firesafety-v2": {
220
+ "sha256": "82dacf7eae4f061981dda17272e6572983e3972162224e9f24293fe387021b61",
221
+ "files": 10
222
+ },
223
+ "specialists/firstaid": {
224
+ "sha256": "ea314183893b08a18700995fb64ade8a45cc041f70ed30bdf93d094fe95f536b",
225
+ "files": 10
226
+ },
227
+ "specialists/fleet": {
228
+ "sha256": "304b6bb4a25fdff30ba018c17d527ad7d50405d20de20793af73d56985f4de2f",
229
+ "files": 7
230
+ },
231
+ "specialists/fluids": {
232
+ "sha256": "239fe31ee98b73988dd240b05e7f9d79e1f67d58c02a8a64d4faf8a0d14df5bb",
233
+ "files": 8
234
+ },
235
+ "specialists/fluids-r2": {
236
+ "sha256": "d93d4dc0f7777b2b6c73d44ac8d16e38cd08a69a92c8af2694da2ae63cee67db",
237
+ "files": 9
238
+ },
239
+ "specialists/forestry": {
240
+ "sha256": "b04fb4b96035ce10bb07c9f409dc309601f9a42cf8be8aed1d949090cec18bb7",
241
+ "files": 8
242
+ },
243
+ "specialists/fuels": {
244
+ "sha256": "03ce57c8ae111136fff26dffc6bff71a47bc6bb2df59d3a8c80767b5997d7d4b",
245
+ "files": 8
246
+ },
247
+ "specialists/games-v3": {
248
+ "sha256": "d0670dd8f9d94eb416999bd7048f4be96e91eff2702fad27636059275da47d58",
249
+ "files": 10
250
+ },
251
+ "specialists/gardening": {
252
+ "sha256": "8a64598bcf8beb10b3214dcbb36c2b29e588eabb00c41f3eb985f3e279c27f7d",
253
+ "files": 8
254
+ },
255
+ "specialists/genetics-v2": {
256
+ "sha256": "49ac519b2cc0eadeafb79b29c15c9a99e5d868b067fc6777ed065a9bc3a971d1",
257
+ "files": 11
258
+ },
259
+ "specialists/geography": {
260
+ "sha256": "8f107fcf17a048377317a4343411c8a6a8f75958282a266cc8fd15f8042a4197",
261
+ "files": 8
262
+ },
263
+ "specialists/geology": {
264
+ "sha256": "ad27f3d878b6de6f3b5b277b1a852625ebf12e0189d496d0acf90131f5461934",
265
+ "files": 8
266
+ },
267
+ "specialists/geometry": {
268
+ "sha256": "46fc4fafd8d3633ba3f3e15704733b51935a7b559995bd3cb06d5f7de3533abe",
269
+ "files": 6
270
+ },
271
+ "specialists/geometry-v3": {
272
+ "sha256": "b8e9842ccc063bebc2fd705039fcf485abb008f58d3f453d8d790f38d268ea93",
273
+ "files": 9
274
+ },
275
+ "specialists/geometry-v4": {
276
+ "sha256": "296a480f352d91f13e7903a3b9baf1a97d77dd55d956bed247ddcaf04689e1be",
277
+ "files": 10
278
+ },
279
+ "specialists/git": {
280
+ "sha256": "827f404802ecd0ecfe65d089cd56e99ddfc57dbcb25b5e77dbe617fa2d531d24",
281
+ "files": 8
282
+ },
283
+ "specialists/government": {
284
+ "sha256": "9a0b18fb8d5a030bdf1b5ca601550d2235008a72df49d6c858e7893bb7c9fbfa",
285
+ "files": 8
286
+ },
287
+ "specialists/grammar": {
288
+ "sha256": "0909a6e4d8ba122ffafef397ea88dec36e245783e72822a0d4b510c95e40a973",
289
+ "files": 8
290
+ },
291
+ "specialists/greenhouse": {
292
+ "sha256": "87175794f5aa16de7195017f1df2db1a650f1465ca79fd6d43ea0300ac09cda0",
293
+ "files": 7
294
+ },
295
+ "specialists/greenhouse-r2": {
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
306
+ },
307
+ "specialists/hydrology": {
308
+ "sha256": "d51a7e6c7b581f92ac3bcef8289010f8388e05b471766830a91f19fe3926bcf3",
309
+ "files": 7
310
+ },
311
+ "specialists/iot": {
312
+ "sha256": "62ca53f84921ed51c1ee97bb3972520e19f385b6e644ea93ae77acf1fa9c1ccc",
313
+ "files": 8
314
+ },
315
+ "specialists/javascript": {
316
+ "sha256": "30b3d464c7008f6cbbe67dae3923a2b80058f8ae6d66fe95efb0f8fbfaa1efec",
317
+ "files": 11
318
+ },
319
+ "specialists/labsolutions": {
320
+ "sha256": "cb38e6bf06cee68d5bcdbe33499aa0fdd82ca9b48697f865064614a67b63b5fe",
321
+ "files": 10
322
+ },
323
+ "specialists/labsolutions-r2": {
324
+ "sha256": "eaea9b9f7122c65aa74cd56f6177fc661fc9e638a4f988d90899dd30b78f2031",
325
+ "files": 10
326
+ },
327
+ "specialists/law": {
328
+ "sha256": "d3bce2f7225ee7fe17e016c3ffe0954550058fab6d1609495a3bc329b7cdb1a1",
329
+ "files": 10
330
+ },
331
+ "specialists/library": {
332
+ "sha256": "eee1d02ca69f26536501d5ae7bf23bd52a0450602b30b8ad6d6eeadd38ea49e0",
333
+ "files": 8
334
+ },
335
+ "specialists/linguistics": {
336
+ "sha256": "84a7c56de847547353b88ead503c85f6400b3d4089acd514e639e898ab29da3b",
337
+ "files": 10
338
+ },
339
+ "specialists/linux-v2": {
340
+ "sha256": "b5444cafc7d204c02693c83631c56334ae1d788a1a2a0a9dc5d9c541d5d98914",
341
+ "files": 11
342
+ },
343
+ "specialists/literature-v2": {
344
+ "sha256": "5caa9188095408f3e34a30132d5db84417f462bd9d4abb69f5a89a9f69ef4461",
345
+ "files": 11
346
+ },
347
+ "specialists/logic-v3": {
348
+ "sha256": "ef4158bebab9248feb6559276e51932edd36157fb684ec7b9a6e5686aa0055ce",
349
+ "files": 11
350
+ },
351
+ "specialists/marinebio": {
352
+ "sha256": "00c693b22ac924df1f7c19973805cd98f47d23b8b81f506d960d826abd29b33b",
353
+ "files": 10
354
+ },
355
+ "specialists/materials-v2": {
356
+ "sha256": "9d1a16e250ffbde10dbe91676e76f5e0a572739d59a3b96f6bbee3ccb8b283e8",
357
+ "files": 9
358
+ },
359
+ "specialists/mechanisms": {
360
+ "sha256": "5cd545850c81615d97f4bba5cacc9a8c9d3cf485d4d99aa439d1a8a79412eb46",
361
+ "files": 6
362
+ },
363
+ "specialists/mechanisms-v2": {
364
+ "sha256": "f3ef1347aef9b07b687e1411e9137fb5e835641223b6bc693f41e96f3d700a84",
365
+ "files": 12
366
+ },
367
+ "specialists/medicine": {
368
+ "sha256": "b8bcdd6b3d47a130a3fa29c35124f0f10b63e236f8047101c4a0140732842f50",
369
+ "files": 10
370
+ },
371
+ "specialists/medicine-r2": {
372
+ "sha256": "8357c755727bdad3c118cbe7d5a8a32a51b97b03219e00ef0ecfffe0e719446e",
373
+ "files": 9
374
+ },
375
+ "specialists/meteorology": {
376
+ "sha256": "8f159bc6f48d5ea57291a942c9936eb443599bb3af6ffdce23940274a63bd0ba",
377
+ "files": 6
378
+ },
379
+ "specialists/microbiology-v2": {
380
+ "sha256": "6ec92110413981f55ec5a7fbb019635da501f67347d2dca8698b2dc5fe41ad8f",
381
+ "files": 9
382
+ },
383
+ "specialists/music-v2": {
384
+ "sha256": "20a7d9f146a0ec2f32c9f461f7b4561146e9e3f68e68a1abc4befc5e19371e27",
385
+ "files": 11
386
+ },
387
+ "specialists/music-v2-r2": {
388
+ "sha256": "08a82efa304ff2257d64257ef8d171c4169e02f27c0859a20781c91eed631056",
389
+ "files": 10
390
+ },
391
+ "specialists/mycelial": {
392
+ "sha256": "7cd80e37e6e8bb57ecffa9df2ffaa02215f6163df59f334504b518efc9bcff29",
393
+ "files": 10
394
+ },
395
+ "specialists/mycology": {
396
+ "sha256": "470a4dfc6b5fdb86d9f7ebe5d4481aac518562e1d4b5fee4e329b0d10e1fe629",
397
+ "files": 10
398
+ },
399
+ "specialists/mythology": {
400
+ "sha256": "925cb2901a02ecad02a1dbdeeca739082096c4aa6077cf79c6db8badc8556c05",
401
+ "files": 8
402
+ },
403
+ "specialists/networking": {
404
+ "sha256": "a0a90634582cd4a45980ab9853e9e6b6f61a8638a4d904d7c9e1c9b64ee2cfdf",
405
+ "files": 8
406
+ },
407
+ "specialists/nutrition-label-v2": {
408
+ "sha256": "26d25c937ad6c22ede0b836b5de61786792f67ab1a9236de374c4cbc3a5187d1",
409
+ "files": 9
410
+ },
411
+ "specialists/ocean": {
412
+ "sha256": "145006ee7a909d93e90b23b4294691d453bef1d87579c8fa5e187ac1c51ce9d6",
413
+ "files": 8
414
+ },
415
+ "specialists/optics": {
416
+ "sha256": "c58517aa4565c85b7ecbbc9b8982bc53a04f050219014de01fce9e9ce3cec5be",
417
+ "files": 6
418
+ },
419
+ "specialists/optics-v2": {
420
+ "sha256": "38c66d52bcb457a5582abc5018a58e4119c1575e06d9267e225fdc8dea2b65ae",
421
+ "files": 7
422
+ },
423
+ "specialists/optics-v3": {
424
+ "sha256": "430447014db000b43e1fc857d9d5e5d8d0762cbfaf04002ce4f7784967f952af",
425
+ "files": 8
426
+ },
427
+ "specialists/optics-v5": {
428
+ "sha256": "8b97d434f613450ac163ab951d0ce74216987f0b60923e548f1d301a743bbb11",
429
+ "files": 21
430
+ },
431
+ "specialists/optics-v5-r2": {
432
+ "sha256": "cb66eb46e38433c478966af95f638fb44be4ae215509d2672965c27e408e36b4",
433
+ "files": 20
434
+ },
435
+ "specialists/orbits": {
436
+ "sha256": "2461710b2bfbe5d629c1afc92b64deffdadb8398222cbbd356a8c14be472582f",
437
+ "files": 7
438
+ },
439
+ "specialists/ornithology": {
440
+ "sha256": "80d51be829aab8c05fcc9f3654b31b59a5c8e82b8859730db133263841e94cd1",
441
+ "files": 10
442
+ },
443
+ "specialists/pets": {
444
+ "sha256": "50c22fb1a909e9870c762f22e73ff57d68091c7c5f1a211e54a8186787c1f1ac",
445
+ "files": 10
446
+ },
447
+ "specialists/physics": {
448
+ "sha256": "83ac3e58e64678b00b106e08e2c897b5bfadbb7c807deeb04141f46d4f243cd6",
449
+ "files": 7
450
+ },
451
+ "specialists/physics-r2": {
452
+ "sha256": "69e7990f3684ee2a43f8ab29a6c45c4df66416842b89c0bdc09e859840bb5d04",
453
+ "files": 9
454
+ },
455
+ "specialists/physics-r3": {
456
+ "sha256": "9e0ede142f1cecc4d27628a4ad53ad5b528af31557dbbfb2d05d2ff71172ede5",
457
+ "files": 8
458
+ },
459
+ "specialists/planetary": {
460
+ "sha256": "4b62d2f5c18fe869ad2a570fc22d4a4d94a735d178372e09f01c6f310af02459",
461
+ "files": 8
462
+ },
463
+ "specialists/poetry": {
464
+ "sha256": "9361a2a7b18f5bd260f57a9d417e62ebb00d9721625b2f4f99bbfd296aad44f3",
465
+ "files": 10
466
+ },
467
+ "specialists/printing": {
468
+ "sha256": "8f3a93b080db2a923196d2e6138949518c39cded5b800a4fb38e8a254e095df2",
469
+ "files": 7
470
+ },
471
+ "specialists/printing-v2": {
472
+ "sha256": "24b2fc335c8fde6a749e0104d8dbbf20d1f535aad854e160305442ab0e1d1e32",
473
+ "files": 12
474
+ },
475
+ "specialists/psychology": {
476
+ "sha256": "18061dc814732e42e51bb2a12ebc323d7169dd21c4734bd2cc0d651fe5052c98",
477
+ "files": 10
478
+ },
479
+ "specialists/python": {
480
+ "sha256": "4bbb3917b28303f8c1448f403ba2c0426b1528c199921ab8f7110a99b95b3bda",
481
+ "files": 9
482
+ },
483
+ "specialists/python-r2": {
484
+ "sha256": "1301cb2d6653db2a3a8488e9c5585426f63a537f8e3a4fa5e03a22e59c340365",
485
+ "files": 9
486
+ },
487
+ "specialists/rel-actors": {
488
+ "sha256": "94fe86c201fb2a0dd0036c642ab2a58040ce675a8ef7314fcc33be7218e1cb91",
489
+ "files": 8
490
+ },
491
+ "specialists/rel-aircraft": {
492
+ "sha256": "e42af0d661a5573d11d6d56b2fa28fc834c55099e23f5c16a2c674071695afd6",
493
+ "files": 7
494
+ },
495
+ "specialists/rel-airlines": {
496
+ "sha256": "8e1b16921e092b8ae91aaac84c60d2bb4fdb32dc9ef6f15f55f1a7786830c066",
497
+ "files": 7
498
+ },
499
+ "specialists/rel-airports": {
500
+ "sha256": "ca6c24da1cf6998f80ee384be4dc12323cb897a0fdb22f16503f6e5f68dcf57a",
501
+ "files": 7
502
+ },
503
+ "specialists/rel-albums": {
504
+ "sha256": "c50c357436987aa8974701d664e3db518a6751ed74438df38cc60441ade9869d",
505
+ "files": 8
506
+ },
507
+ "specialists/rel-animators": {
508
+ "sha256": "d6e6271266b0954a61471a5033b4af17c6c8a2b85c80be20f9430436c254590c",
509
+ "files": 7
510
+ },
511
+ "specialists/rel-anime": {
512
+ "sha256": "4d346b7a3ea5d1f9e24388099c3d89a060f554e767cfb91061e089ba7ce70aa3",
513
+ "files": 7
514
+ },
515
+ "specialists/rel-architects": {
516
+ "sha256": "327e99d5643a7de485d870acddde728a7650fba1c12448d51efa74638a853c98",
517
+ "files": 7
518
+ },
519
+ "specialists/rel-asteroids": {
520
+ "sha256": "b1840aebe96ea41b14a4fbfd5097a8500057e1d61e631ae332186dd6665c2598",
521
+ "files": 7
522
+ },
523
+ "specialists/rel-astronauts": {
524
+ "sha256": "82906463e7dae7f3f3232f660a9ccbedfc16b00a089c97de5682488561285152",
525
+ "files": 7
526
+ },
527
+ "specialists/rel-astronomers": {
528
+ "sha256": "62c8618d70496ee821bf2a9a44874c7d23e858af47887553ce1acaf7d5c91c6e",
529
+ "files": 7
530
+ },
531
+ "specialists/rel-athletes": {
532
+ "sha256": "e6f08e57dcda4107517e0dbf0fa730ef19be1389f806fd581373a8d60efafddb",
533
+ "files": 7
534
+ },
535
+ "specialists/rel-awards": {
536
+ "sha256": "192510470bd6e5e3f5cd4334529d75e3da99e1d034159351e65410152c4d42db",
537
+ "files": 7
538
+ },
539
+ "specialists/rel-ballets": {
540
+ "sha256": "4594970aa6fe14079921de49133551361a5d3f12447a3e848122aed14dd0ca5f",
541
+ "files": 7
542
+ },
543
+ "specialists/rel-bands": {
544
+ "sha256": "8c08916c112cf7010df395203a6f5a7d7c8598fddb5acf3eb31bb814c8e23e9b",
545
+ "files": 7
546
+ },
547
+ "specialists/rel-baseball": {
548
+ "sha256": "3d02b894c816062ed0533f17ada843533c1f639d18a701ceb749f5307e3c6857",
549
+ "files": 7
550
+ },
551
+ "specialists/rel-basketball": {
552
+ "sha256": "fc7872886bcb867f0796a456440b0b19040eb919ba05e3bd44f1fb5b0af7d0ac",
553
+ "files": 7
554
+ },
555
+ "specialists/rel-battles": {
556
+ "sha256": "92df9a44e245e60fc1bbc89bffa8b03f0d1c488462792b6935281f029aa2ef49",
557
+ "files": 7
558
+ },
559
+ "specialists/rel-biathletes": {
560
+ "sha256": "a71c3137c5c346185718b2562f38f36b02e83c3dba0cee2a287496b31a11e980",
561
+ "files": 7
562
+ },
563
+ "specialists/rel-biologists": {
564
+ "sha256": "a0a2953c7bc2c03f3f81258971699d318ec668dced7bd38aea6302a972ec6ff3",
565
+ "files": 7
566
+ },
567
+ "specialists/rel-bloggers": {
568
+ "sha256": "0f00be50c3df97466dc4c5cdfd67182f0ef7ec15072c558fe88020992392710c",
569
+ "files": 7
570
+ },
571
+ "specialists/rel-boxers": {
572
+ "sha256": "d64565a0cefb73a2b469a719e1e3be0033ee1f22f03d2bd5513d4bb47f26a228",
573
+ "files": 7
574
+ },
575
+ "specialists/rel-brands": {
576
+ "sha256": "8b96fe11f49ab3873f7ea817b6bd5515f993478d0a58cc5b790026f7915610c5",
577
+ "files": 7
578
+ },
579
+ "specialists/rel-breeds": {
580
+ "sha256": "1790526f1ffe51704dd62f5aa2b3e3ce4d7d1c66cedb851e63574eba17cc1bc9",
581
+ "files": 7
582
+ },
583
+ "specialists/rel-bridges": {
584
+ "sha256": "2b3def52a1d68670ee02baf4e2d022d1d6a405bac2bbe128d23e38771c1f5fe3",
585
+ "files": 7
586
+ },
587
+ "specialists/rel-business": {
588
+ "sha256": "e21c10c79e71e9225bd1deda100094bfcf110e6d88aaf528839ff3f2a475e510",
589
+ "files": 7
590
+ },
591
+ "specialists/rel-carbrands": {
592
+ "sha256": "96e3ec5eb9be9c0f372cdf71945bd221fac92c6531e03252c9c29ff48723c987",
593
+ "files": 7
594
+ },
595
+ "specialists/rel-carmodels": {
596
+ "sha256": "a6973c624b643c5c35887c987cfec8aa192e7895759e92b2521ed7a9ce267f92",
597
+ "files": 7
598
+ },
599
+ "specialists/rel-castles": {
600
+ "sha256": "6a64c827dae572dc4751559f981844123be6c362788b930055fb26d7f1f7b8a8",
601
+ "files": 7
602
+ },
603
+ "specialists/rel-channels": {
604
+ "sha256": "f1d7f551e22aa47982d1d60cd81ce037849fefc2709505d7dd0496dda01abef3",
605
+ "files": 7
606
+ },
607
+ "specialists/rel-characters": {
608
+ "sha256": "b0832b9c28a54c0e67ff794155e9dff3a700c6722a71d5dcf545d17e855c25ee",
609
+ "files": 7
610
+ },
611
+ "specialists/rel-chefs": {
612
+ "sha256": "7bf2cc4f04d36d90749d835d63a9dc1192b7cecb441aadb7397c5d3ad58aed3a",
613
+ "files": 7
614
+ },
615
+ "specialists/rel-chemists": {
616
+ "sha256": "ee488eaa75e596a6da2352f053e7a68d4bc6babea88d5b28801292bfdc75cadd",
617
+ "files": 7
618
+ },
619
+ "specialists/rel-chess": {
620
+ "sha256": "9e4c09d7a15ed6091047313e8249c021ad84ef1fcfbcb7d4b5de1c1012371ce8",
621
+ "files": 7
622
+ },
623
+ "specialists/rel-churches": {
624
+ "sha256": "00a55b2ff9b6e6d04b8dd3d89d7cc0ee67479e182e1d0c7a8e1976b532aaeda1",
625
+ "files": 7
626
+ },
627
+ "specialists/rel-comedians": {
628
+ "sha256": "c53bf97b567c0eab0348ebe2382762649f2b19078d02bf7f155286efce161e91",
629
+ "files": 7
630
+ },
631
+ "specialists/rel-comics": {
632
+ "sha256": "163c63c2c01975950728a4c9542f17a060355047f60147af46e5ca7f6cc75784",
633
+ "files": 7
634
+ },
635
+ "specialists/rel-companies": {
636
+ "sha256": "cfd7c900d24ca91e3da57d83fff03b3cec75fc9039b81a396ac085c4ad1237e3",
637
+ "files": 8
638
+ },
639
+ "specialists/rel-composers": {
640
+ "sha256": "c79bf75790d2f191fde1c581653601422a095cd0f28eded9dc402d722ef402af",
641
+ "files": 8
642
+ },
643
+ "specialists/rel-compounds": {
644
+ "sha256": "37ab98152a2eddbd791a059d3770573d16739fb228944811998a21cf9479c5dd",
645
+ "files": 7
646
+ },
647
+ "specialists/rel-computerscientists": {
648
+ "sha256": "4a5b0bb86e620a1a7bcfcb379058f5de7f08696adc83a173f3b342184e1c4b91",
649
+ "files": 7
650
+ },
651
+ "specialists/rel-countries-v2": {
652
+ "sha256": "93ea831614d96da5b335cedc51d1c92353630f715e5249639a5dc4b8044dc44e",
653
+ "files": 7
654
+ },
655
+ "specialists/rel-cricketers": {
656
+ "sha256": "6de3e498b4f94f57e7e5264dd600e2105f4ea072512e5bc17274d8e4d419c56f",
657
+ "files": 7
658
+ },
659
+ "specialists/rel-criminals": {
660
+ "sha256": "933cf3cbb1f84245ae10b5c8426444a8217f46a0b592c5c9a64db312bee20a5b",
661
+ "files": 7
662
+ },
663
+ "specialists/rel-crosscountry": {
664
+ "sha256": "057b79e8df90549b7889cc6585ddda55d9849a40093d1468ac19f4e6ea799dff",
665
+ "files": 7
666
+ },
667
+ "specialists/rel-curlers": {
668
+ "sha256": "6ee3c62c9a64cd24778c7c380902cd3e3946b8f0e854542537e28fa624a7c574",
669
+ "files": 7
670
+ },
671
+ "specialists/rel-cyclists": {
672
+ "sha256": "1d6a7ca32f895b42d764c8cc4dfe17b2105e2554ea8072864f5616b8e481a989",
673
+ "files": 7
674
+ },
675
+ "specialists/rel-dancers": {
676
+ "sha256": "cb3e7fde26a065c85e2381527fa96c7d0e097ba4606b7f6897b57fbff2fed531",
677
+ "files": 7
678
+ },
679
+ "specialists/rel-diplomats": {
680
+ "sha256": "1839e4fcdbd3c71126dbf4d0c3c4cb2e18b03eba4e4bf0d0bddc62365c1030c0",
681
+ "files": 7
682
+ },
683
+ "specialists/rel-directors": {
684
+ "sha256": "84cf854af587ec6b6f9b39002dffefa359411eb29df6cb7ffecbf23e43e3ff45",
685
+ "files": 7
686
+ },
687
+ "specialists/rel-diseases": {
688
+ "sha256": "5a7aec6b1cc06ed54e7cafa20ee196980931b050439b840f31e243492cac40b5",
689
+ "files": 7
690
+ },
691
+ "specialists/rel-dishes": {
692
+ "sha256": "d848aeb7cdf48c83e609fa61b1005ce7405fad6b08ff263957b616ce7dd20490",
693
+ "files": 7
694
+ },
695
+ "specialists/rel-drivers": {
696
+ "sha256": "7b735c16b6d7c66b0107f920106af435a8e8f8dee37f1f4dbbbf93dd0f82b52d",
697
+ "files": 7
698
+ },
699
+ "specialists/rel-economists": {
700
+ "sha256": "b1c909dcfe33a4b49c9d5afd2318d42bdf8f8cc1ede449ecf80158431f1331a0",
701
+ "files": 8
702
+ },
703
+ "specialists/rel-editors": {
704
+ "sha256": "3733af233905958f1cb006d88a2bb4b5bfae6a825142a7780032505c2537fcfb",
705
+ "files": 7
706
+ },
707
+ "specialists/rel-engineers": {
708
+ "sha256": "e3b7b616f3cec5e8fd2b5141742518af5c2f541e99a34928b4a3f330ea974809",
709
+ "files": 7
710
+ },
711
+ "specialists/rel-equestrians": {
712
+ "sha256": "d3f39cb631ec5b809c1ca0bd1117c4fe8e87863d7ddbb3166e912f103496a572",
713
+ "files": 7
714
+ },
715
+ "specialists/rel-explorers": {
716
+ "sha256": "679fa18e526a5991e18d81c532ca483e43d83e3a367196265fbbe7c375f80113",
717
+ "files": 7
718
+ },
719
+ "specialists/rel-fencers": {
720
+ "sha256": "0d0f2f742c7f542b51e963256a50541297ff0431235230a84e0f701eb5234eb1",
721
+ "files": 7
722
+ },
723
+ "specialists/rel-fieldhockey": {
724
+ "sha256": "1d2bc0be1741158c4b603ed2412dc2a83672303177d8a8e638fb04a71ccaad97",
725
+ "files": 7
726
+ },
727
+ "specialists/rel-films-v2": {
728
+ "sha256": "8bf0f56ee0465e1337ee635872dd7ae2beb20eef207ae4f9f75ff9d2fa48aabf",
729
+ "files": 9
730
+ },
731
+ "specialists/rel-footballclubs": {
732
+ "sha256": "ea9ac92911c3e8f3452a717bad1ca1c94862a9fa3c1889c046b83de118298f56",
733
+ "files": 7
734
+ },
735
+ "specialists/rel-footballers": {
736
+ "sha256": "dc44ded22167daf8ae3dfbee49baa4145df9186bfc09cfb8ad896032c778f65e",
737
+ "files": 7
738
+ },
739
+ "specialists/rel-galaxies": {
740
+ "sha256": "67e0fe8d8f49ed80c8de68992bcacea37afc8491de97d25231e3cbf4bff6c6f6",
741
+ "files": 7
742
+ },
743
+ "specialists/rel-genres": {
744
+ "sha256": "74b36f67e6661c2670a937bd4e575a4182aa922d188058a43333e35bb5c28c32",
745
+ "files": 7
746
+ },
747
+ "specialists/rel-geologists": {
748
+ "sha256": "2c5c60e548a0e16a8a89f60770d684e573a9721dbac30b0db57b24536be44816",
749
+ "files": 7
750
+ },
751
+ "specialists/rel-golfers": {
752
+ "sha256": "9dc2751c6517141b4d3f765cf327028403f5f0b0b16d7c3a5809e1f49a78c729",
753
+ "files": 7
754
+ },
755
+ "specialists/rel-graphicartists": {
756
+ "sha256": "3ea1c2264c144ba6256ba13313ba355cd4cbbd694bbdc56c47f0de3d74079b0e",
757
+ "files": 7
758
+ },
759
+ "specialists/rel-gridiron": {
760
+ "sha256": "0557820262e39c91d450034c680a66d8888254689cb177d89e6632f3bff284f2",
761
+ "files": 7
762
+ },
763
+ "specialists/rel-gymnasts": {
764
+ "sha256": "c33611064eed069becddc32e5bcdde210226aa6f2b045abeb4984d31204e3eb3",
765
+ "files": 7
766
+ },
767
+ "specialists/rel-handball": {
768
+ "sha256": "243248170ce1f8995dba7ad368a169322d8c7f24423d2ebaaf8ec9bf5ee7a12e",
769
+ "files": 7
770
+ },
771
+ "specialists/rel-historians": {
772
+ "sha256": "16dacace7a5f3382edc0b4e9d4b67d142ea7b391daacdef5a8b71f525225fca7",
773
+ "files": 7
774
+ },
775
+ "specialists/rel-hotels": {
776
+ "sha256": "e7f1c98da12c0584e72059252f0b3be6064785c36e2a6fdf2f5a70e963d6076c",
777
+ "files": 7
778
+ },
779
+ "specialists/rel-icehockey": {
780
+ "sha256": "f7390cf5e6ca8b34fe403fa3ba5aed9207583905e0dff56873d37687374ece77",
781
+ "files": 7
782
+ },
783
+ "specialists/rel-illustrators": {
784
+ "sha256": "ef869bf48ae791c837978b4fea4af90f07a56581d6f58fe230a457eae230b2d2",
785
+ "files": 7
786
+ },
787
+ "specialists/rel-instruments": {
788
+ "sha256": "055b9ca6ace969878484b791861bbd3380dc820c6f7a98bdbe4395ba34c35dfd",
789
+ "files": 7
790
+ },
791
+ "specialists/rel-islands": {
792
+ "sha256": "1f192f4ff7a3d12953aaf63e591665373687b0e472142d54112931f4d02b3486",
793
+ "files": 8
794
+ },
795
+ "specialists/rel-journalists": {
796
+ "sha256": "1623832e744ec02f5655c1ec52e7f8103a58311707c224e63936ef814cda5c33",
797
+ "files": 7
798
+ },
799
+ "specialists/rel-lakes": {
800
+ "sha256": "3247338c76ebde1e5d16915cdfed93465ed67f8b1f35af7d514c6a9121990a69",
801
+ "files": 8
802
+ },
803
+ "specialists/rel-languages": {
804
+ "sha256": "e9811041f02547874df89d43c661b8a4396f8a10ce9295b7ef01d9a5510c7c9f",
805
+ "files": 7
806
+ },
807
+ "specialists/rel-lawyers": {
808
+ "sha256": "f96279a7838e5a5e77817a058dcac70425f9fc125cf2add388bce32c757b39a4",
809
+ "files": 8
810
+ },
811
+ "specialists/rel-leagues": {
812
+ "sha256": "a13e9da52427806228a2c99547f1897697441c544029a6d5f22524790e576a98",
813
+ "files": 7
814
+ },
815
+ "specialists/rel-libraries": {
816
+ "sha256": "5e27954b7de3513ff431b67f384a40883722da86efabace23c7ef6cd193f6182",
817
+ "files": 7
818
+ },
819
+ "specialists/rel-linguists": {
820
+ "sha256": "a29a547cab9b9f725f3d1b8a18e0b2d36ac274b7c7802b25558d839030bf5e11",
821
+ "files": 7
822
+ },
823
+ "specialists/rel-mathematicians": {
824
+ "sha256": "79bb9d371e32fc15e7624676a121bc2b8bd7057a10affad7fa9f77dcd5689b76",
825
+ "files": 7
826
+ },
827
+ "specialists/rel-military": {
828
+ "sha256": "8795c7ffa35d7f07fbe1ec1114b12fd797449e78fa1294e016d2c91ab1b968e4",
829
+ "files": 8
830
+ },
831
+ "specialists/rel-militaryunits": {
832
+ "sha256": "044e30790c3b0f21cf95aaea70077fb79d856b59ef595667db1c38d475c0ba0e",
833
+ "files": 7
834
+ },
835
+ "specialists/rel-missionaries": {
836
+ "sha256": "ca313fbba00e276e81d2f20d62d1f50e0d21c07ca7c3574e30aca3409442f46d",
837
+ "files": 7
838
+ },
839
+ "specialists/rel-models": {
840
+ "sha256": "b8288521332328bf6e183b9aaff07215fa1dc1540c67a7eeab52d7b7b1247cec",
841
+ "files": 7
842
+ },
843
+ "specialists/rel-monarchs": {
844
+ "sha256": "701574bc7ab74b21c56c38f91d97ceecb8f04fab30bab83a0c5cef7e8103c7d6",
845
+ "files": 7
846
+ },
847
+ "specialists/rel-monuments": {
848
+ "sha256": "f611643d6dafbd2bf1fb2a2a106d47f304e45cc2c56b8e45d03b0255d842d763",
849
+ "files": 7
850
+ },
851
+ "specialists/rel-moons": {
852
+ "sha256": "1a8d7684d39d14f24f991eb98c845297327897725ba2033b8beecabf518797ee",
853
+ "files": 7
854
+ },
855
+ "specialists/rel-mountains": {
856
+ "sha256": "d300ef909811e4ae2f50193cc48902dcfb1698dfa3b6146a0e00a3e6d1834764",
857
+ "files": 8
858
+ },
859
+ "specialists/rel-museums": {
860
+ "sha256": "4911f8d7c96a805d179b9df6135e12465505f8380ab6b005dbeaee70b5f0247f",
861
+ "files": 8
862
+ },
863
+ "specialists/rel-musicians": {
864
+ "sha256": "bc5f3a1ca2d92da54a653cfb9a3e6f3d1c2b9dfe7ece6346e30b4b0b9ee4f907",
865
+ "files": 7
866
+ },
867
+ "specialists/rel-mythology": {
868
+ "sha256": "5cdd880a0ea4b24df5ca559e589dca77e1e1b6964bd446b7a245cb302e5c365b",
869
+ "files": 7
870
+ },
871
+ "specialists/rel-newspapers": {
872
+ "sha256": "95aa11a1ac5ab8a417e88341e8a45d2b10ec1947b2beeb45efe7ca11df47bc07",
873
+ "files": 7
874
+ },
875
+ "specialists/rel-novelists": {
876
+ "sha256": "b39c6fe5e3ddff538106fc12b44bf952423ecc187f9a8cf9f12455c1b2fbbaea",
877
+ "files": 7
878
+ },
879
+ "specialists/rel-novels": {
880
+ "sha256": "a4b8f79229ff9aca030af4fc4adbb36e2c4f09a9d4bd5de24076391e7b338f9e",
881
+ "files": 8
882
+ },
883
+ "specialists/rel-nurses": {
884
+ "sha256": "4544d9f519a5bfdd1815a8e2a55f97f3c1e5d531e3bf274265ce428b73a6e7f0",
885
+ "files": 7
886
+ },
887
+ "specialists/rel-observatories": {
888
+ "sha256": "1071d6283696980ab1cf1c7946dda1dff4dc6b797bbdeb1546a26a6a14549869",
889
+ "files": 7
890
+ },
891
+ "specialists/rel-operas": {
892
+ "sha256": "29e188da5526917011bf8c5c098fe6b7d1a3e80de6390e8f3d7f208d5c312ca5",
893
+ "files": 8
894
+ },
895
+ "specialists/rel-organisations": {
896
+ "sha256": "d9089a0cf4f906878b29182d8e37eac4490fc09348eecf5f16c6e705a11ba33d",
897
+ "files": 8
898
+ },
899
+ "specialists/rel-painters": {
900
+ "sha256": "75cb8fc5278bec2b96de456d1194258fb1da833655eab77bf10a70fbf0427b75",
901
+ "files": 8
902
+ },
903
+ "specialists/rel-paintings": {
904
+ "sha256": "16c9088861b395a971ac920f5e77dfefc6a69bf99485721588f1530bb57fc628",
905
+ "files": 8
906
+ },
907
+ "specialists/rel-parks": {
908
+ "sha256": "ca33388f09a2b38097dfdbef5dd899bbf36721566545838279ccf8bb1a8074f8",
909
+ "files": 7
910
+ },
911
+ "specialists/rel-parties": {
912
+ "sha256": "9f0a12993d4601bb47ec06d8ec97f04c68d0b96f4f507ae356fb58f2dbea465e",
913
+ "files": 7
914
+ },
915
+ "specialists/rel-pharmacists": {
916
+ "sha256": "340f31fb64fed582db61ab873eeeffe4a06c9990011be2a021062fc69d20df67",
917
+ "files": 7
918
+ },
919
+ "specialists/rel-philosophers": {
920
+ "sha256": "f1603c6cd2433c36be0d43b066af9712e642de1224e0fb653c84061d3c6c4920",
921
+ "files": 8
922
+ },
923
+ "specialists/rel-photographers": {
924
+ "sha256": "bb78a17a208eb7f320ed3cf6e7ce288fbd504f14a6fddcf9b765ad723e59ca9d",
925
+ "files": 7
926
+ },
927
+ "specialists/rel-physicians": {
928
+ "sha256": "7c59128f951efc1ff71e5f48cd40ba04e9a82b6c07c405b18198b59b5af26bfe",
929
+ "files": 7
930
+ },
931
+ "specialists/rel-physicists": {
932
+ "sha256": "c7968132233d2b2f9b6562d92f7ddec84514fe7df861b5c3e99ed07155796526",
933
+ "files": 7
934
+ },
935
+ "specialists/rel-planets": {
936
+ "sha256": "e376ea62c8494cfa9f1d72c8ccbc3d3140265c9c7cf0c5edb1d5f044777ecc3e",
937
+ "files": 7
938
+ },
939
+ "specialists/rel-playwrights": {
940
+ "sha256": "66d8af86ec6e9afa791fa58f961f8e128854ba69de5fdbb66ebeea8fe36a303d",
941
+ "files": 7
942
+ },
943
+ "specialists/rel-poems": {
944
+ "sha256": "f1c3faeb97874b50356216ce700524b04d951f3bf0199773d303020c9cab5541",
945
+ "files": 7
946
+ },
947
+ "specialists/rel-poets": {
948
+ "sha256": "7b1da9e53e2777d33017333fd41a9f2d7746e42a6c5b3025c20a12243cfe7005",
949
+ "files": 7
950
+ },
951
+ "specialists/rel-police": {
952
+ "sha256": "48e51ce84a4bbcdf691deb4957723a6e0f820fc38ff0cc02675471be406b0537",
953
+ "files": 7
954
+ },
955
+ "specialists/rel-politicians": {
956
+ "sha256": "cd47b4099994c03f4c9c94dcb9bebecd8bc7e4a029643798b0d275df2fa2948e",
957
+ "files": 8
958
+ },
959
+ "specialists/rel-printmakers": {
960
+ "sha256": "7f06a971bf5082030c892b31443414f496995d5ccb15a2577dcdd3acdbfc3139",
961
+ "files": 7
962
+ },
963
+ "specialists/rel-psychologists": {
964
+ "sha256": "ea8eae6c8c0764b5122aa4fc818e4768478592f6b02e2f4cc5fcceeba4de254b",
965
+ "files": 7
966
+ },
967
+ "specialists/rel-racketsports": {
968
+ "sha256": "838c495f22fc6af5616c01587cceba530aaaa4357c77ebdb1feb23c33e74ad97",
969
+ "files": 7
970
+ },
971
+ "specialists/rel-religions": {
972
+ "sha256": "2a9010b3010abe5f1f2b4fa09edec6ff9fd6aece86fb069b9dc70fd9d2eae22b",
973
+ "files": 7
974
+ },
975
+ "specialists/rel-rivers": {
976
+ "sha256": "6b3aecaeacc410f023c9e6624cecd8d75c6c594fec768b64ee2791c22e59195d",
977
+ "files": 7
978
+ },
979
+ "specialists/rel-rowers": {
980
+ "sha256": "c510f97c0fe835dbf17e0bbf4b23d00e1c8e2cb098a766f3f72d16df3f35ba24",
981
+ "files": 7
982
+ },
983
+ "specialists/rel-rugby": {
984
+ "sha256": "6c5917549941cce449ceebae9aa7fa577d630aa76a236f9a5cae27943c31eefa",
985
+ "files": 7
986
+ },
987
+ "specialists/rel-sculptors": {
988
+ "sha256": "a8e4e840ef6bdf6b29a0531551ef70e3fd2f46f4fcd6ee93f67ee90d29a1c6e4",
989
+ "files": 7
990
+ },
991
+ "specialists/rel-sculptures": {
992
+ "sha256": "dbc7669363f77b507e1a8cdd96d5839a448be42adb1130975e7e29a2448e5dd8",
993
+ "files": 7
994
+ },
995
+ "specialists/rel-ships": {
996
+ "sha256": "511520e5bed4f002e4aaa537de028d2f28a3eb4f78ef4480e7e307a5ca4fc3be",
997
+ "files": 8
998
+ },
999
+ "specialists/rel-shooters": {
1000
+ "sha256": "29f6d3fc50bd60d80bc2f14100e49dd42db7c4e081fc01632bb73bc556991afe",
1001
+ "files": 7
1002
+ },
1003
+ "specialists/rel-singers": {
1004
+ "sha256": "f6441ad65e08bfbca93614fcf88cc4e2293fc2578c5b9f63aeb3a80458c0ae4f",
1005
+ "files": 8
1006
+ },
1007
+ "specialists/rel-skaters": {
1008
+ "sha256": "01b47325741aaffc4f290b8ef480be3314ba4aa4d2593f01ff79d54eef6fb687",
1009
+ "files": 7
1010
+ },
1011
+ "specialists/rel-skiers": {
1012
+ "sha256": "153c984b861bf22c4defb1036461cdda906b1c37a595c59a38353eb3eb495480",
1013
+ "files": 7
1014
+ },
1015
+ "specialists/rel-skyscrapers": {
1016
+ "sha256": "7fdbc10b6514536caaf03d3d9aef367aebb75f63dd3899be773481f1a1ce7900",
1017
+ "files": 7
1018
+ },
1019
+ "specialists/rel-snooker": {
1020
+ "sha256": "c6f96d9e9608f01f58048033179210e6f18f8db650ca3729fe8fa078c9de6c4a",
1021
+ "files": 7
1022
+ },
1023
+ "specialists/rel-software": {
1024
+ "sha256": "ce2d3cf68062b42a5ba8b0802c6646058df162306b0955e72a5ba29194bb5dd9",
1025
+ "files": 7
1026
+ },
1027
+ "specialists/rel-songs": {
1028
+ "sha256": "cc5417c3dc1cc3d3a7bc6dffceb9f6d5b2b3fac466c4ddded9634f8ccf36cfa3",
1029
+ "files": 8
1030
+ },
1031
+ "specialists/rel-spacecraft": {
1032
+ "sha256": "e60b7516ac6ca848c688c1f68ca2081def7371b231c8317276884fee4c9a8820",
1033
+ "files": 7
1034
+ },
1035
+ "specialists/rel-speedskaters": {
1036
+ "sha256": "23d62e9f14f51e5666f530c341eacca5db7cf217149f874a88a2b143a2d241f0",
1037
+ "files": 7
1038
+ },
1039
+ "specialists/rel-spies": {
1040
+ "sha256": "d20f6ef2f652cb4509f449deef088f93b9c40c72bb5db14d60e33d553587a2cd",
1041
+ "files": 7
1042
+ },
1043
+ "specialists/rel-sportsevents": {
1044
+ "sha256": "dc0ff64f3a8198b528f97e4f0904bc32d57267892855d4eec3090a3b44dc5d5f",
1045
+ "files": 7
1046
+ },
1047
+ "specialists/rel-sportsteams": {
1048
+ "sha256": "8e5ec70c11be3aed82035d9e795e36ece07146f1315751ea9fcec579cbbfc686",
1049
+ "files": 7
1050
+ },
1051
+ "specialists/rel-stadiums": {
1052
+ "sha256": "a6921371c0c7bd6fb36dbb260b0df590138ad46e573394f391f9bd9ad35abf0f",
1053
+ "files": 7
1054
+ },
1055
+ "specialists/rel-stations": {
1056
+ "sha256": "7866fd03c4f16a321bc1f0f8c3bd4ae48238a7e5f21c7d04941272f7d4c440d3",
1057
+ "files": 7
1058
+ },
1059
+ "specialists/rel-statisticians": {
1060
+ "sha256": "76ca6babfb634212ae059a74f154c3fd6daf1d1aac1c98789fa64cf730d9993d",
1061
+ "files": 7
1062
+ },
1063
+ "specialists/rel-swimmers": {
1064
+ "sha256": "c22117266691d17b14b5d870762f763e1fe6ad4633d08fd8f6b4d573bac215ca",
1065
+ "files": 7
1066
+ },
1067
+ "specialists/rel-temples": {
1068
+ "sha256": "b541f2792e9e01fb0e489cecc75d9b5367c7c0d0f46ce03cd03d81244745db8c",
1069
+ "files": 7
1070
+ },
1071
+ "specialists/rel-tennis": {
1072
+ "sha256": "521d487542938f99097b9bbeea818e657c8aebd119c4e0b9aca6dbaac0d36674",
1073
+ "files": 7
1074
+ },
1075
+ "specialists/rel-theatres": {
1076
+ "sha256": "1d1a190b50f411513f02cb722f11b6f4af313180965d7578cdd4f8a7d10ed981",
1077
+ "files": 7
1078
+ },
1079
+ "specialists/rel-themeparks": {
1080
+ "sha256": "05504903e2f7d08ffde81e266e23df3ccb9dd49b2b62778c1b13a6faa022d550",
1081
+ "files": 7
1082
+ },
1083
+ "specialists/rel-theologians": {
1084
+ "sha256": "20ac3972bbf86bda3a30eebb583f3fb9167b5867d2ce4d3bb9caae1352d0dff0",
1085
+ "files": 7
1086
+ },
1087
+ "specialists/rel-tradeunionists": {
1088
+ "sha256": "45362aba3686c554fabe6ffc64c049dda9ab67e4f09ad3091215e58e40036cf5",
1089
+ "files": 7
1090
+ },
1091
+ "specialists/rel-translators": {
1092
+ "sha256": "35e5399bcacfa55d934779cf7ac302d76fb936b689ec06ae6c7afcc0f9172f1e",
1093
+ "files": 7
1094
+ },
1095
+ "specialists/rel-triathletes": {
1096
+ "sha256": "49096909d2b0d008e49a197525e55ec0ce11d75cf71d3bc05d0f37b9783ec5ae",
1097
+ "files": 7
1098
+ },
1099
+ "specialists/rel-tvproducers": {
1100
+ "sha256": "2abcbc61f8bed6170712577303cf46e62afb95d8e03e85a6882c3c3a8ba0edc9",
1101
+ "files": 7
1102
+ },
1103
+ "specialists/rel-tvseries-v2": {
1104
+ "sha256": "77cf98ad66bd4ca48ca85943f5c882a4542203f16bac999d55151c63846d7025",
1105
+ "files": 9
1106
+ },
1107
+ "specialists/rel-universities": {
1108
+ "sha256": "2510d9d003c1e7d603b065d746e341e604705b4e90d26734bb1734db5316f9af",
1109
+ "files": 7
1110
+ },
1111
+ "specialists/rel-videogames": {
1112
+ "sha256": "82619d9498cbeb235331a73f02c4e06bff2e7fa342881897572ab60c6a94688a",
1113
+ "files": 7
1114
+ },
1115
+ "specialists/rel-volleyball": {
1116
+ "sha256": "6e6fb9b90e50721338be6377df19fce8bd8d3dbdca1fdce6fe679a8893df5ed6",
1117
+ "files": 7
1118
+ },
1119
+ "specialists/rel-wars": {
1120
+ "sha256": "3ed991f4c8b9f23334647e13f4132e5eec541d54d1beced35834e955f241ae9f",
1121
+ "files": 7
1122
+ },
1123
+ "specialists/rel-waterpolo": {
1124
+ "sha256": "316111a529a8265b3047506eea793676084c3cb1a1c6c7655c88cf430b5ee64d",
1125
+ "files": 7
1126
+ },
1127
+ "specialists/rel-youtubers": {
1128
+ "sha256": "efba4c3d1fb5e7f8f9869fa0919a83eac5ee8f7a3b262d74db71b965e8055ae9",
1129
+ "files": 7
1130
+ },
1131
+ "specialists/renewables": {
1132
+ "sha256": "3e0b86a27cbfad6da5b373bd1198fbb757c2134221cd245006d737bcfbf0355d",
1133
+ "files": 8
1134
+ },
1135
+ "specialists/retail": {
1136
+ "sha256": "c94b6e73f60ad616d19187fe50f3ea81189b49bbaf5d8d6a68e620155fd81e17",
1137
+ "files": 7
1138
+ },
1139
+ "specialists/robotics-v2": {
1140
+ "sha256": "59ce39c28c72c2eb5b5afada758b45752a8721f2b997f81f9ea012bb3e14fe1e",
1141
+ "files": 9
1142
+ },
1143
+ "specialists/safety": {
1144
+ "sha256": "387631c63c91f42d05356f3ff4721a137981b77212c72e1eb5c3de64c1271c3b",
1145
+ "files": 6
1146
+ },
1147
+ "specialists/seismology": {
1148
+ "sha256": "6af36c14e4f9a6aee48bec7485f3dbe5f99909a3027be2622e9b4d3fa8f5c21b",
1149
+ "files": 8
1150
+ },
1151
+ "specialists/sociology": {
1152
+ "sha256": "b072aa03f2975aadad28fd7b0922ea4477c5506a7547abefe88c504ea07e7a47",
1153
+ "files": 10
1154
+ },
1155
+ "specialists/soil": {
1156
+ "sha256": "15e98ce12978b06259ca0b201755c00011a5f63d65a8c6ab33d10ff576ee5a95",
1157
+ "files": 8
1158
+ },
1159
+ "specialists/soil-r2": {
1160
+ "sha256": "640c83136e49d022eb15185667ab85aee534b02fc284a0650c64aea2bd24817e",
1161
+ "files": 7
1162
+ },
1163
+ "specialists/spacecomms": {
1164
+ "sha256": "dea586cd9ba7b0838c655a6abfd6ca1abd9d7eddb942a3daf7bb4cabc9f8a3ae",
1165
+ "files": 7
1166
+ },
1167
+ "specialists/spacecraft": {
1168
+ "sha256": "01b8b0ef55faa9ec6588a0ae206d9c775c4849da96d9186c913c8837cfb6f043",
1169
+ "files": 8
1170
+ },
1171
+ "specialists/sports": {
1172
+ "sha256": "7e24a125743bfab2b7959561564bcc13d3aed4ad19d325bfcfc3fd2ea19230cf",
1173
+ "files": 8
1174
+ },
1175
+ "specialists/springs": {
1176
+ "sha256": "f12cf342d028806ff93fe9f146cd2a1f8d383283695b38549b3c33fe5cb5247f",
1177
+ "files": 8
1178
+ },
1179
+ "specialists/sql": {
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
1190
+ },
1191
+ "specialists/statistics-v2": {
1192
+ "sha256": "96a20825e3c70bc795945d5996dac2f21c3a181fb368821e83daabdd3e4b98c4",
1193
+ "files": 7
1194
+ },
1195
+ "specialists/statistics-v3": {
1196
+ "sha256": "88be2300583637eefdd14815a85fda4e0ac72d836b7cb48eb9d342cd84dbccb8",
1197
+ "files": 8
1198
+ },
1199
+ "specialists/thermo": {
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
1210
+ },
1211
+ "specialists/units-v2": {
1212
+ "sha256": "fdf2c8fd200c97508cc130b209a3f065fd3fe1f65c4254a3c48fc7891dce0c10",
1213
+ "files": 8
1214
+ },
1215
+ "specialists/units-v3": {
1216
+ "sha256": "f70b4d8d0c8c44295f373b693364194892084991c104465a0559a19a700cebad",
1217
+ "files": 9
1218
+ },
1219
+ "specialists/units-v3-r2": {
1220
+ "sha256": "86420f3c59b4e967b58c2f91dc8fdc2709ee3105947af839ae75553f66f885e7",
1221
+ "files": 13
1222
+ },
1223
+ "specialists/ushistory": {
1224
+ "sha256": "490526165f1b73b83ca15639af33b24e9601ec13d42c8652012efdc78e10e383",
1225
+ "files": 8
1226
+ },
1227
+ "specialists/warehouse": {
1228
+ "sha256": "8190fff2c6be02b5fb955df4f3bbaf8de35c75da260f83e041a3e6cb17a2ce17",
1229
+ "files": 8
1230
+ },
1231
+ "specialists/warehouse-r2": {
1232
+ "sha256": "8c1573c565ea4ba16970c319182bed17cc743baaa78a13e8c14c5cebd75d59e6",
1233
+ "files": 10
1234
+ },
1235
+ "specialists/water": {
1236
+ "sha256": "2361c83b7727d6b3278de13de173156f879db5592583be404a31b1723acc8998",
1237
+ "files": 7
1238
+ },
1239
+ "specialists/water-r3": {
1240
+ "sha256": "c9ec2b8be5326cc0bdd730ac382a23849ad4d976e44529c1ec8add1767971ce4",
1241
+ "files": 8
1242
+ },
1243
+ "specialists/wildlife": {
1244
+ "sha256": "643d940428a61215b4e1c20a90ee637681d318eb983ac2d873fa76cf0f8e57bf",
1245
+ "files": 8
1246
+ },
1247
+ "specialists/wiring": {
1248
+ "sha256": "2b04aeedfd914dddfa83139c32b59a3a43353f8f1b4eec90b0a9b3d958480c3d",
1249
+ "files": 7
1250
+ },
1251
+ "specialists/woodworking": {
1252
+ "sha256": "56ecadf3bb7c0116ccfd82bbaf60a0bbeececcd66e7db327d2516197243a0d5b",
1253
+ "files": 8
1254
+ },
1255
+ "specialists/worldhistory": {
1256
+ "sha256": "5b977e269d66669c9cb2aafad2e4782f709863553d9670e3113dd8fb53662c02",
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",
1269
+ "files": 1
1270
+ },
1271
+ "PACK_MANIFEST.json": {
1272
+ "sha256": "207bfc32650d914dac43ede0edfc797b312739e338fdd37da113b41d0ffaec15",
1273
+ "files": 1
1274
+ }
1275
+ },
1276
+ "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.",
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": "0a9bb1c0b4c4b85bf879b54405fb8107c5ecb3bce3663ee5da3a93b3d52696d8",
1288
+ "anchor_signature": "3ZUmd7FTw4uNLWUrZa3HMB8UCGLMneiQbDP2kXc3Sf1TFKPkczZntpBbTgtzDnXxCWeA8YFtTG22T9ZH53w3TsW2",
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
+ }
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/HEAD_MANIFEST.json CHANGED
@@ -1,6 +1,21 @@
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",
@@ -358,5 +373,5 @@
358
  "oracle_release_runtime_w3"
359
  ],
360
  "schema_version": "oracle-head-manifest-v1",
361
- "tip": "oracle_release_runtime_w558"
362
  }
 
1
  {
2
+ "built_ts": "2026-10-22T18:26:22Z",
3
  "chain_tip_to_base": [
4
+ "oracle_release_runtime_w436",
5
+ "oracle_release_runtime_w435",
6
+ "oracle_release_runtime_w571",
7
+ "oracle_release_runtime_w568",
8
+ "oracle_release_runtime_w433",
9
+ "oracle_release_runtime_w431",
10
+ "oracle_release_runtime_w566",
11
+ "oracle_release_runtime_w565",
12
+ "oracle_release_runtime_w564",
13
+ "oracle_release_runtime_w563",
14
+ "oracle_release_runtime_w429",
15
+ "oracle_release_runtime_w562",
16
+ "oracle_release_runtime_w560",
17
+ "oracle_release_runtime_w427",
18
+ "oracle_release_runtime_w425",
19
  "oracle_release_runtime_w558",
20
  "oracle_release_runtime_w557",
21
  "oracle_release_runtime_w556",
 
373
  "oracle_release_runtime_w3"
374
  ],
375
  "schema_version": "oracle-head-manifest-v1",
376
+ "tip": "oracle_release_runtime_w436"
377
  }
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w425.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w425 - HIPPOCAMPUS fold: episodic binding from the world ledger (epoch 100).
3
+
4
+ 60 actors' episode lists and 7 object->builder indexes, bound as
5
+ (actor, act, object, tick) from attested world-ledger records - the same warrant class
6
+ as the scarcity route (observed-complete since world launch). Answers "what has X
7
+ done?" / "what happened with X?" / "who built a Y?". ACQUISITION IS CONSOLIDATION:
8
+ the worker re-authors this fold each epoch from the fresh ledger; every epoch passes
9
+ the gate; unreferenced episodes fade by cap. Authored 2026-10-19 15:42 UTC by oracle_fold_worker_v4,
10
+ chained on oracle_release_runtime_w558."""
11
+
12
+ from __future__ import annotations
13
+
14
+ import re
15
+
16
+ from oracle_release_runtime_w558 import OracleReleaseRuntimeW558
17
+
18
+ EPI = {'qucaeeesha': [(177206, 'chat', 'said: the record holds a column raised by Qucl'), (177246, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177246, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177246, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177344, 'act', 'express: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'name: this place is the coastline at noon. nea'), (177423, 'chat', 'said: this place is the coastline at noon. nea'), (177503, 'act', 'express: this place is the coastline at noon. nea')], 'aprmeeeeesha': [(176973, 'act', 'commune: walking to the marble column.'), (177013, 'act', 'build: walking to the marble column.'), (177092, 'act', 'visit: walking to the column.'), (177168, 'act', 'commune: Unolmelafvi spoke with me.'), (177246, 'act', 'express: Alphafeelki spoke with me.'), (177262, 'act', 'name: Alphafeelki spoke with me.'), (177306, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'express: Eineeesha spoke with me.'), (177423, 'act', 'express: Eineeesha spoke with me.'), (177503, 'act', 'commune: Eineeesha spoke with me.')], 'qucaeeelki': [(176650, 'act', 'commune: i mean to raise something here.'), (176893, 'act', 'commune: Soleeyeben spoke with me.'), (176973, 'act', 'express: i mean to raise something here.'), (177052, 'act', 'build: i mean to raise something here.'), (177092, 'act', 'commune: i mean to raise something here.'), (177168, 'act', 'visit: walking to the column.'), (177206, 'act', 'commune: walking to the column.'), (177306, 'act', 'name: i mean to raise something here.'), (177384, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'visit: walking to the column.')], 'mumeeallo': [(177052, 'make', 'raised a castle'), (177052, 'chat', 'said: the record remembers: Alphfools said: th'), (177092, 'act', 'commune: the record remembers: Alphfools said: th'), (177129, 'chat', 'said: this place is the desert at dawn. near s'), (177168, 'act', 'name: this place is the desert at dawn. near s'), (177246, 'act', 'visit: walking to the column.'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'visit: walking to the column.'), (177423, 'act', 'commune: i mean to raise something here.'), (177503, 'act', 'express: i mean to raise something here.')], 'soleeyeben': [(177052, 'act', 'visit: walking to the column.'), (177092, 'act', 'commune: bridgepy spoke with me.'), (177129, 'act', 'commune: bridgepy spoke with me.'), (177168, 'act', 'visit: going to find Liseeeeeelki.'), (177246, 'act', 'commune: i mean to raise something here.'), (177262, 'act', 'commune: Maemae spoke with me.'), (177306, 'act', 'visit: walking to the marble column.'), (177423, 'act', 'commune: walking to the marble column.'), (177464, 'act', 'transform: alphafoldmicro spoke with me.'), (177503, 'act', 'commune: i mean to raise something here.')], 'soleeegepy': [(177206, 'act', 'express: walking to the marble column.'), (177246, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177246, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177262, 'chat', 'said: the record holds a column raised by Qucl'), (177344, 'act', 'express: the record shows 6 columns, 1 towers, 1 '), (177344, 'chat', 'said: the record shows 6 columns, 1 towers, 1 '), (177384, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177423, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177464, 'act', 'name: the record remembers: Mumeeeeesha said: '), (177464, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'liseeeeeelki': [(177168, 'chat', 'said: the record holds a column raised by Qucl'), (177206, 'act', 'commune: i mean to raise something here.'), (177246, 'chat', 'said: the record shows 12 columns, 1 temples, '), (177262, 'act', 'express: Mumdmeeallo spoke with me.'), (177344, 'act', 'commune: i mean to raise something here.'), (177344, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177423, 'act', 'visit: walking to the column.'), (177423, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177464, 'chat', 'said: this place is the desert at noon. near s'), (177503, 'act', 'commune: this place is the desert at noon. near s')], 'maeemegepy': [(176893, 'chat', 'said: this place is the coastline at night. ne'), (176973, 'act', 'name: i mean to raise something here.'), (177052, 'act', 'commune: i mean to raise something here.'), (177129, 'act', 'visit: walking to the marble column.'), (177168, 'act', 'transform: i mean to raise something here.'), (177246, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'express: i mean to raise something here.'), (177423, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'visit: going to find psiloceyeben.'), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'lismmeeesha': [(177246, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177246, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177306, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177306, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: this place is the mountain at morning. n'), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177464, 'act', 'visit: walking to the marble column.'), (177464, 'chat', 'said: the record holds a column raised by Qucl'), (177503, 'act', 'commune: bridgepy spoke with me.')], 'maeeedum': [(177129, 'act', 'commune: the record holds a column raised by Aprm'), (177129, 'chat', 'said: the record shows 14 columns, 1 trees, 1 '), (177168, 'act', 'visit: walking to the crystal castle.'), (177206, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177262, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177306, 'act', 'name: the record remembers: Mumeeeeesha said: '), (177384, 'act', 'commune: i mean to raise something here.'), (177384, 'chat', 'said: this place is the mountain at morning. n'), (177464, 'act', 'visit: walking to the marble column.')], 'liseeeledum': [(176852, 'act', 'visit: going to find Mumdmeeallo.'), (176933, 'act', 'commune: Maemae spoke with me.'), (177013, 'act', 'transform: i mean to raise something here.'), (177092, 'act', 'commune: i mean to raise something here.'), (177129, 'act', 'visit: walking to the marble column.'), (177206, 'act', 'commune: walking to the marble column.'), (177262, 'act', 'commune: alphafoldmicro spoke with me.'), (177384, 'act', 'name: i mean to raise something here.'), (177423, 'act', 'visit: walking to the marble column.'), (177503, 'act', 'commune: walking to the marble column.')], 'aprmeeiun': [(176893, 'chat', 'said: this place is the mountain at night. nea'), (176933, 'act', 'commune: this place is the mountain at night. nea'), (177013, 'act', 'express: this place is the mountain at night. nea'), (177052, 'act', 'commune: this place is the mountain at night. nea'), (177092, 'act', 'name: i mean to raise something here.'), (177168, 'act', 'express: i mean to raise something here.'), (177246, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'commune: Alphafeelki spoke with me.'), (177384, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'visit: going to find Unolmevi.')], 'unolmefesof': [(177129, 'act', 'visit: walking to the marble column.'), (177168, 'act', 'express: the record shows 13 columns, 1 trees, 1 '), (177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177206, 'chat', 'said: the record remembers: Qucaeeesha said: t'), (177246, 'act', 'commune: the record remembers: Qucaeeesha said: t'), (177246, 'chat', 'said: the record remembers: Qucaeeesha said: t'), (177306, 'act', 'commune: bridgepy spoke with me.'), (177344, 'chat', 'said: this place is the mountain at morning. n'), (177384, 'act', 'name: Lisdfools spoke with me.'), (177464, 'act', 'commune: i mean to raise something here.')], 'muut': [(177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177206, 'act', 'visit: walking to the bridge.'), (177246, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177262, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177306, 'act', 'visit: going to find Lisdfools.'), (177344, 'act', 'express: i mean to raise something here.'), (177344, 'chat', 'said: this place is the desert at morning. nea'), (177423, 'act', 'commune: i mean to raise something here.'), (177503, 'act', 'express: Liseeeeeelki spoke with me.')], 'mumeeeeesha': [(177168, 'chat', 'said: the record holds a column raised by Qucl'), (177206, 'act', 'name: the record shows 13 columns, 1 trees, 1 '), (177206, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177262, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177306, 'act', 'transform: the record remembers: Mumeeeeesha said: '), (177306, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'act', 'commune: i mean to raise something here.'), (177423, 'chat', 'said: this place is the desert at noon. near s'), (177464, 'act', 'visit: going to find Alphafesha.'), (177503, 'act', 'commune: going to find Alphafesha.')], 'mumdmeeallo': [(176933, 'act', 'commune: i mean to raise something here.'), (177013, 'act', 'visit: walking to the marble column.'), (177052, 'act', 'express: walking to the marble column.'), (177092, 'act', 'commune: walking to the marble column.'), (177168, 'act', 'express: walking to the marble column.'), (177206, 'act', 'express: i mean to raise something here.'), (177262, 'act', 'visit: walking to the column.'), (177344, 'act', 'commune: Qucaelyesha spoke with me.'), (177423, 'act', 'name: Qucaelyesha spoke with me.'), (177464, 'act', 'commune: i mean to raise something here.')], 'yaeyeedum': [(177052, 'act', 'transform: the record shows 10 columns, 1 trees, 1 '), (177052, 'chat', 'said: the record shows 10 columns, 1 trees, 1 '), (177129, 'act', 'commune: the record shows 10 columns, 1 trees, 1 '), (177129, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177206, 'act', 'visit: going to find bridgepy.'), (177262, 'act', 'name: going to find bridgepy.'), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'act', 'visit: going to find Aprmeeeeesha.'), (177384, 'chat', 'said: this place is the meadow at morning. nea'), (177464, 'act', 'commune: i mean to raise something here.')], 'aprmeelmut': [(176893, 'act', 'visit: going to find Unolmut.'), (176933, 'make', 'raised a column'), (177013, 'act', 'commune: i mean to raise something here.'), (177052, 'act', 'express: i mean to raise something here.'), (177092, 'act', 'express: Unolmevi spoke with me.'), (177168, 'act', 'commune: Unolmevi spoke with me.'), (177246, 'act', 'transform: Unolmevi spoke with me.'), (177306, 'act', 'commune: going to find Maeemesol.'), (177384, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'visit: going to find Liseeeeeelki.')], 'eineeesha': [(177168, 'act', 'visit: walking to the marble column.'), (177246, 'act', 'name: i mean to leave a mark that lasts.'), (177344, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record holds a column raised by Qucl'), (177423, 'act', 'visit: walking to the marble column.'), (177423, 'chat', 'said: the record shows 5 columns, 1 manors, 1 '), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'maemae': [(177052, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177092, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177129, 'act', 'commune: i mean to see more of the world.'), (177129, 'chat', 'said: Got it. Since you mention castle: A cast'), (177168, 'act', 'commune: Got it. Since you mention castle: A cast'), (177206, 'chat', 'said: this place is the forest at dawn. near s'), (177262, 'act', 'commune: Yaeyegepy spoke with me.'), (177344, 'act', 'commune: Yaeyegepy spoke with me.'), (177423, 'act', 'commune: Yaeyegepy spoke with me.'), (177503, 'act', 'commune: i mean to raise something here.')], 'unolmevi': [(176973, 'act', 'visit: walking to the column.'), (177013, 'act', 'build: walking to the column.'), (177092, 'act', 'commune: i mean to raise something here.'), (177129, 'act', 'express: i mean to raise something here.'), (177168, 'act', 'commune: i mean to raise something here.'), (177246, 'act', 'express: Liseeeeeelki spoke with me.'), (177262, 'act', 'commune: Liseeeeeelki spoke with me.'), (177344, 'act', 'name: Liseeeeeelki spoke with me.'), (177423, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'express: i mean to raise something here.')], 'unolmut': [(177246, 'act', 'visit: going to find Quclfools.'), (177262, 'act', 'commune: Lisdfools spoke with me.'), (177344, 'act', 'visit: going to find Alphafogepy.'), (177384, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'express: the record shows 5 columns, 1 manors, 1 '), (177423, 'chat', 'said: the record holds a column raised by Qucl'), (177423, 'chat', 'said: the record shows 5 columns, 1 manors, 1 '), (177503, 'act', 'express: Right now I am steady: I answer 91 of ev'), (177503, 'chat', 'said: Right now I am steady: I answer 91 of ev')], 'roaeeelki': [(177168, 'chat', 'said: Got it. Since you mention castle: A cast'), (177206, 'act', 'express: the record holds a column raised by Qucl'), (177206, 'chat', 'said: the record holds a column raised by Qucl'), (177262, 'act', 'name: i mean to raise something here.'), (177344, 'act', 'commune: i mean to raise something here.'), (177344, 'chat', 'said: the record shows 6 columns, 1 towers, 1 '), (177423, 'act', 'visit: going to find qum.'), (177423, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'senlfeeyeben': [(176812, 'act', 'express: i mean to rest and remember.'), (176893, 'act', 'commune: i mean to rest and remember.'), (176973, 'act', 'express: i mean to rest and remember.'), (177013, 'act', 'express: i mean to rest and remember.'), (177092, 'act', 'commune: i mean to raise something here.'), (177168, 'act', 'name: Lismmeeesha spoke with me.'), (177246, 'act', 'commune: Lismmeeesha spoke with me.'), (177344, 'act', 'commune: i mean to raise something here.'), (177423, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'visit: walking to the column.')], 'liseeefelmut': [(177013, 'act', 'build: i mean to raise something here.'), (177092, 'act', 'visit: going to find Maeemfools.'), (177168, 'act', 'commune: i mean to raise something here.'), (177246, 'act', 'visit: going to find Soleeegepy.'), (177262, 'act', 'express: Aprmeeiun spoke with me.'), (177306, 'act', 'commune: i mean to raise something here.'), (177384, 'act', 'visit: going to find Quclfledum.'), (177464, 'act', 'name: going to find Quclfledum.'), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'qucaeldmicro': [(177129, 'act', 'name: the record shows 14 columns, 1 trees, 1 '), (177129, 'chat', 'said: the record shows 14 columns, 1 trees, 1 '), (177168, 'act', 'commune: the record remembers: Quclfools raised a'), (177168, 'chat', 'said: the record remembers: Quclfools raised a'), (177206, 'act', 'visit: walking to the bridge.'), (177206, 'chat', 'said: the record remembers: Liseeeeeelki said:'), (177262, 'chat', 'said: this place is the forest at morning. nea'), (177344, 'act', 'express: Maeemfools spoke with me.'), (177423, 'act', 'commune: Maeemfools spoke with me.'), (177503, 'act', 'express: i mean to raise something here.')], 'liseeeemedvi': [(177092, 'chat', 'said: the record holds a column raised by Maez'), (177168, 'act', 'visit: walking to the marble column.'), (177246, 'act', 'commune: Unolmevi spoke with me.'), (177246, 'chat', 'said: the record shows 13 columns, 1 temples, '), (177262, 'act', 'transform: Qucasof spoke with me.'), (177344, 'act', 'commune: Qucasof spoke with me.'), (177344, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177423, 'act', 'visit: going to find Mumeeeeesha.'), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'qucaelyesha': [(177092, 'chat', 'said: the record shows 10 columns, 1 trees, 1 '), (177092, 'chat', 'said: the record remembers: Maeze raised a col'), (177129, 'chat', 'said: the record remembers: Maeze raised a col'), (177168, 'act', 'visit: going to find Eineeesha.'), (177206, 'chat', 'said: this place is the forest at dawn. near s'), (177246, 'act', 'commune: this place is the forest at dawn. near s'), (177306, 'act', 'commune: this place is the forest at dawn. near s'), (177384, 'act', 'visit: going to find aprilfools.'), (177464, 'act', 'name: i mean to raise something here.'), (177503, 'act', 'commune: qum spoke with me.')], 'quclflyesha': [(177129, 'act', 'name: the record remembers: Quclfools raised a'), (177129, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177129, 'chat', 'said: the record remembers: Quclfools raised a'), (177206, 'act', 'commune: the record remembers: Quclfools raised a'), (177246, 'act', 'visit: going to find Qucaelyesha.'), (177262, 'act', 'commune: Alphfools spoke with me.'), (177344, 'act', 'transform: this place is the mountain at morning. n'), (177344, 'chat', 'said: this place is the mountain at morning. n'), (177423, 'act', 'commune: this place is the mountain at morning. n'), (177503, 'act', 'visit: walking to the stone bridge.')], 'alphafelmut': [(177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177246, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177246, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'transform: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'visit: walking to the marble column.'), (177423, 'chat', 'said: this place is the desert at morning. nea'), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'aprilfools': [(177052, 'act', 'commune: Alphafesha spoke with me.'), (177092, 'act', 'express: Alphafesha spoke with me.'), (177168, 'act', 'commune: Alphafesha spoke with me.'), (177206, 'act', 'transform: Aprmeeeeesha spoke with me.'), (177262, 'act', 'express: i mean to raise something here.'), (177306, 'act', 'commune: Unolmelafvi spoke with me.'), (177344, 'act', 'express: Unolmelafvi spoke with me.'), (177423, 'act', 'commune: Yaeyedvi spoke with me.'), (177464, 'act', 'visit: walking to the crystal tower.'), (177503, 'act', 'commune: walking to the crystal tower.')], 'maeemeeelki': [(177168, 'act', 'commune: walking to the stone bridge.'), (177168, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177206, 'act', 'express: the record remembers: Qucaeeesha said: t'), (177206, 'chat', 'said: the record remembers: Qucaeeesha said: t'), (177246, 'act', 'express: this place is the coastline at morning. '), (177246, 'chat', 'said: this place is the coastline at morning. '), (177262, 'act', 'commune: Maeemesol spoke with me.'), (177344, 'act', 'express: Maeemesol spoke with me.'), (177384, 'act', 'express: Maeemesol spoke with me.'), (177464, 'act', 'commune: i mean to raise something here.')], 'einsof': [(177168, 'act', 'express: the record shows 13 columns, 1 trees, 1 '), (177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177246, 'act', 'commune: i mean to raise something here.'), (177246, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'visit: walking to the column.'), (177262, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177344, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: this place is the mountain at morning. n'), (177384, 'act', 'name: this place is the mountain at morning. n'), (177464, 'act', 'visit: walking to the column.')], 'mumdmemedvi': [(176852, 'act', 'build: Soleyesha spoke with me.'), (176933, 'act', 'name: muut spoke with me.'), (177013, 'act', 'visit: walking to the marble column.'), (177092, 'act', 'commune: i mean to find psiloceyeben.'), (177129, 'act', 'express: i mean to find psiloceyeben.'), (177246, 'act', 'express: i mean to find psiloceyeben.'), (177262, 'act', 'commune: Yaeyedvi spoke with me.'), (177344, 'act', 'express: i mean to raise something here.'), (177423, 'act', 'express: i mean to raise something here.'), (177503, 'act', 'commune: muut spoke with me.')], 'soleyesha': [(177168, 'act', 'visit: going to find Alphafelmut.'), (177168, 'chat', 'said: the record holds a column raised by Qucl'), (177262, 'act', 'name: Senlfeeyeben spoke with me.'), (177344, 'chat', 'said: the record shows 6 columns, 1 towers, 1 '), (177384, 'act', 'commune: i mean to raise something here.'), (177423, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177464, 'act', 'express: the record remembers: Mumeeeeesha said: '), (177464, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177503, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177503, 'chat', 'said: the record remembers: Mumeeeeesha said: ')], 'bridgepy': [(177092, 'act', 'visit: going to find Liseeeledum.'), (177092, 'make', 'raised a column'), (177168, 'act', 'express: i mean to raise something here.'), (177206, 'act', 'commune: i mean to raise something here.'), (177246, 'act', 'visit: going to find Maeemeeelki.'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'transform: psiloceyeben spoke with me.'), (177384, 'act', 'name: psiloceyeben spoke with me.'), (177464, 'act', 'visit: going to find Lisdfools.'), (177503, 'act', 'commune: going to find Lisdfools.')], 'alphafoldmicro': [(177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177206, 'act', 'express: Right now I am steady: I answer 91 of ev'), (177206, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'commune: Liseeeledum spoke with me.'), (177306, 'act', 'visit: walking to the marble column.'), (177344, 'act', 'name: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'commune: aprilfools spoke with me.'), (177503, 'act', 'visit: going to find Maeemeeesha.')], 'psiloceyeben': [(176973, 'act', 'express: this place is the meadow at dawn. near s'), (177052, 'act', 'express: this place is the meadow at dawn. near s'), (177092, 'act', 'commune: Maeemeeesha spoke with me.'), (177129, 'act', 'express: i mean to raise something here.'), (177206, 'act', 'commune: Maeemeeesha spoke with me.'), (177246, 'act', 'express: Maeemeeesha spoke with me.'), (177306, 'act', 'commune: Mumdmemedvi spoke with me.'), (177344, 'act', 'transform: i mean to raise something here.'), (177423, 'act', 'name: Maeemegepy spoke with me.'), (177464, 'act', 'commune: Maeemegepy spoke with me.')], 'alphafesha': [(176933, 'act', 'commune: going to find Lismmeeesha.'), (177013, 'act', 'build: going to find Lismmeeesha.'), (177092, 'act', 'visit: walking to the marble column.'), (177168, 'act', 'express: walking to the marble column.'), (177206, 'act', 'commune: walking to the marble column.'), (177246, 'act', 'visit: walking to the marble column.'), (177262, 'act', 'commune: walking to the marble column.'), (177344, 'act', 'visit: walking to the column.'), (177423, 'act', 'commune: Maeeedum spoke with me.'), (177464, 'act', 'name: Maeeedum spoke with me.')], 'qucasof': [(177206, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177246, 'act', 'visit: going to find Mumeeallo.'), (177262, 'act', 'commune: going to find Mumeeallo.'), (177344, 'act', 'visit: going to find Yaeyedvi.'), (177344, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'express: this place is the coastline at morning. '), (177423, 'chat', 'said: this place is the coastline at morning. '), (177464, 'act', 'commune: this place is the coastline at morning. '), (177503, 'act', 'visit: walking to the column.')], 'quclfledum': [(176973, 'act', 'commune: i mean to raise something here.'), (177013, 'act', 'build: i mean to raise something here.'), (177092, 'act', 'visit: walking to the column.'), (177129, 'act', 'commune: Lisdfools spoke with me.'), (177206, 'act', 'commune: Lisdfools spoke with me.'), (177246, 'act', 'name: Aprmeegepy spoke with me.'), (177344, 'act', 'commune: Lisdfools spoke with me.'), (177384, 'act', 'visit: walking to the column.'), (177423, 'act', 'express: Unolmut spoke with me.'), (177503, 'act', 'commune: Unolmut spoke with me.')], 'unolmelafvi': [(177206, 'act', 'express: i mean to raise something here.'), (177246, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177246, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177262, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177306, 'act', 'visit: walking to the marble column.'), (177344, 'chat', 'said: the record holds a column raised by Qucl'), (177384, 'act', 'transform: the record shows 6 columns, 1 towers, 1 '), (177384, 'chat', 'said: the record shows 6 columns, 1 towers, 1 '), (177464, 'act', 'commune: the record shows 6 columns, 1 towers, 1 '), (177503, 'chat', 'said: Right now I am steady: I answer 91 of ev')], 'aprmeegepy': [(177013, 'act', 'visit: going to find Alphafeelki.'), (177052, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177092, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177129, 'chat', 'said: the record remembers: Maeze raised a col'), (177168, 'act', 'visit: going to find Lismmeeesha.'), (177206, 'chat', 'said: this place is the coastline at morning. '), (177246, 'act', 'commune: this place is the coastline at morning. '), (177306, 'act', 'express: this place is the coastline at morning. '), (177384, 'act', 'commune: i mean to raise something here.'), (177464, 'act', 'name: Liseeeelafvi spoke with me.')], 'maeemeeesha': [(177013, 'act', 'build: einsof spoke with me.'), (177092, 'act', 'commune: i mean to find psiloceyeben.'), (177168, 'act', 'commune: i mean to find psiloceyeben.'), (177206, 'act', 'visit: walking to the column.'), (177246, 'act', 'commune: walking to the column.'), (177262, 'act', 'express: i mean to raise something here.'), (177344, 'act', 'name: i mean to raise something here.'), (177384, 'act', 'visit: walking to the column.'), (177423, 'act', 'commune: walking to the column.'), (177503, 'act', 'visit: going to find Maeeedum.')], 'yaeyedvi': [(177246, 'act', 'express: the record shows 12 columns, 1 temples, '), (177246, 'chat', 'said: the record shows 12 columns, 1 temples, '), (177262, 'act', 'commune: Unolmelafvi spoke with me.'), (177306, 'act', 'transform: i mean to raise something here.'), (177384, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177423, 'act', 'visit: going to find Quclflyesha.'), (177464, 'chat', 'said: this place is the meadow at noon. near s'), (177503, 'act', 'commune: this place is the meadow at noon. near s')], 'maeemesol': [(176893, 'act', 'commune: Senlfeeyeben spoke with me.'), (176973, 'act', 'express: i mean to raise something here.'), (177052, 'act', 'express: i mean to raise something here.'), (177129, 'act', 'commune: Mumdmeeallo spoke with me.'), (177206, 'act', 'express: Maeemeeelki spoke with me.'), (177246, 'act', 'commune: Maeemeeelki spoke with me.'), (177306, 'act', 'name: i mean to raise something here.'), (177344, 'act', 'visit: walking to the marble column.'), (177423, 'act', 'commune: Liseeeeesha spoke with me.'), (177503, 'act', 'visit: walking to the bronze tower.')], 'qum': [(176933, 'act', 'name: i mean to raise something here.'), (177013, 'act', 'build: Mumeeeeesha spoke with me.'), (177092, 'act', 'visit: walking to the column.'), (177168, 'act', 'commune: walking to the column.'), (177206, 'act', 'express: i mean to raise something here.'), (177262, 'act', 'express: i mean to raise something here.'), (177306, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'visit: walking to the column.'), (177423, 'act', 'express: i mean to raise something here.'), (177503, 'act', 'commune: i mean to raise something here.')], 'yaeyegepy': [(176933, 'act', 'commune: i mean to raise something here.'), (177013, 'act', 'visit: walking to the column.'), (177052, 'act', 'name: walking to the column.'), (177129, 'act', 'visit: walking to the marble column.'), (177168, 'act', 'commune: walking to the marble column.'), (177206, 'act', 'express: walking to the marble column.'), (177262, 'act', 'commune: Maeze spoke with me.'), (177344, 'act', 'visit: walking to the column.'), (177423, 'act', 'commune: walking to the column.'), (177464, 'act', 'transform: Maeemeeesha spoke with me.')], 'alphafogepy': [(177013, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177013, 'chat', 'said: the record remembers: Aprmeelmut raised '), (177052, 'act', 'visit: walking to the column.'), (177092, 'chat', 'said: this place is the desert at dawn. near s'), (177168, 'act', 'commune: i mean to raise something here.'), (177206, 'act', 'visit: walking to the column.'), (177262, 'act', 'commune: walking to the column.'), (177306, 'act', 'visit: going to find Qucaeeelki.'), (177384, 'act', 'express: going to find Qucaeeelki.'), (177464, 'act', 'commune: going to find Qucaeeelki.')], 'alphfools': [(177052, 'chat', 'said: the record shows 10 columns, 1 trees, 1 '), (177129, 'act', 'commune: i mean to raise something here.'), (177129, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177206, 'act', 'visit: going to find Liseeeeeelki.'), (177206, 'chat', 'said: the record remembers: Qucaeeesha said: t'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'express: this place is the meadow at morning. nea'), (177344, 'chat', 'said: this place is the meadow at morning. nea'), (177384, 'act', 'transform: Qucaeeesha spoke with me.'), (177464, 'act', 'commune: Senlfeeyeben spoke with me.')], 'unoleesha': [(176812, 'act', 'commune: i mean to raise something here.'), (176893, 'act', 'express: i mean to raise something here.'), (176973, 'act', 'express: i mean to raise something here.'), (177013, 'act', 'build: i mean to raise something here.'), (177092, 'act', 'commune: i mean to raise something here.'), (177129, 'act', 'visit: going to find Mumeeallo.'), (177246, 'act', 'commune: i mean to raise something here.'), (177306, 'act', 'commune: Alphafesha spoke with me.'), (177384, 'act', 'name: Alphafesha spoke with me.'), (177464, 'act', 'visit: going to find Eineeesha.')], 'maeemfools': [(177129, 'act', 'express: going to find Alphfools.'), (177206, 'act', 'commune: Yaeyedvi spoke with me.'), (177246, 'act', 'visit: walking to the column.'), (177262, 'act', 'name: i mean to raise something here.'), (177344, 'act', 'commune: the record remembers: Mumeeeeesha said: '), (177344, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: the record holds a column raised by Qucl'), (177423, 'act', 'visit: going to find Liseeefelmut.'), (177464, 'act', 'commune: Unolmelafvi spoke with me.'), (177503, 'act', 'express: i mean to raise something here.')], 'unoleelmut': [(177129, 'act', 'visit: walking to the column.'), (177168, 'chat', 'said: the record shows 13 columns, 1 trees, 1 '), (177206, 'act', 'commune: the record shows 13 columns, 1 trees, 1 '), (177262, 'act', 'express: the record shows 13 columns, 1 trees, 1 '), (177306, 'act', 'commune: the record shows 13 columns, 1 trees, 1 '), (177344, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177384, 'act', 'express: the record remembers: Mumeeeeesha said: '), (177384, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177464, 'act', 'express: this place is the desert at noon. near s'), (177464, 'chat', 'said: this place is the desert at noon. near s')], 'liseeeeesha': [(176893, 'act', 'transform: i mean to raise something here.'), (176973, 'act', 'visit: going to find Liseeeemedvi.'), (177052, 'act', 'commune: Soleyesha spoke with me.'), (177129, 'act', 'visit: walking to the column.'), (177168, 'act', 'commune: walking to the column.'), (177246, 'act', 'name: einsof spoke with me.'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'visit: walking to the column.'), (177384, 'act', 'commune: walking to the column.'), (177464, 'act', 'commune: Maeemesol spoke with me.')], 'loviun': [(177168, 'act', 'commune: the record remembers: Liseeeeeelki said:'), (177168, 'chat', 'said: the record remembers: Liseeeeeelki said:'), (177206, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177262, 'act', 'name: the record remembers: Mumeeeeesha said: '), (177262, 'chat', 'said: the record remembers: Mumeeeeesha said: '), (177306, 'act', 'commune: Unolmut spoke with me.'), (177344, 'chat', 'said: this place is the meadow at morning. nea'), (177384, 'act', 'visit: walking to the iron temple.'), (177423, 'act', 'commune: Mumeeeeesha spoke with me.'), (177503, 'act', 'transform: i mean to raise something here.')], 'alphafeelki': [(176852, 'act', 'name: Liseeeemedvi spoke with me.'), (176933, 'act', 'visit: walking to the column.'), (176933, 'chat', 'said: this place is the desert at night. near '), (177013, 'act', 'build: Yaeyegepy spoke with me.'), (177092, 'act', 'commune: Alphafelmut spoke with me.'), (177129, 'act', 'visit: walking to the column.'), (177206, 'act', 'commune: i mean to raise something here.'), (177306, 'act', 'commune: walking to the marble column.'), (177384, 'act', 'commune: Aprmeeiun spoke with me.'), (177464, 'act', 'express: i mean to raise something here.')], 'maeze': [(177052, 'make', 'raised a column'), (177052, 'chat', 'said: the record remembers: Alphfools said: th'), (177092, 'act', 'visit: walking to the column.'), (177129, 'act', 'commune: walking to the column.'), (177168, 'chat', 'said: this place is the mountain at dawn. near'), (177206, 'act', 'commune: this place is the mountain at dawn. near'), (177262, 'act', 'commune: i mean to raise something here.'), (177344, 'act', 'name: i mean to raise something here.'), (177384, 'act', 'visit: walking to the column.'), (177464, 'act', 'commune: i mean to raise something here.')], 'quclfools': [(177206, 'act', 'express: this place is the mountain at morning. n'), (177206, 'chat', 'said: this place is the mountain at morning. n'), (177206, 'chat', 'said: this place is the mountain at morning. n'), (177262, 'act', 'name: Mumeeeeesha spoke with me.'), (177344, 'act', 'commune: Maeeedum spoke with me.'), (177384, 'chat', 'said: the record holds a column raised by Qucl'), (177423, 'act', 'express: the record shows 5 columns, 1 manors, 1 '), (177423, 'chat', 'said: the record shows 5 columns, 1 manors, 1 '), (177464, 'act', 'commune: i mean to raise something here.'), (177464, 'chat', 'said: Right now I am steady: I answer 91 of ev')], 'liseeeelafvi': [(176730, 'act', 'commune: walking to the bridge.'), (176812, 'make', 'raised a column'), (176893, 'act', 'commune: Unolmefesof spoke with me.'), (177013, 'act', 'name: i mean to leave a mark that lasts.'), (177092, 'act', 'visit: walking to the marble column.'), (177168, 'act', 'commune: walking to the marble column.'), (177206, 'act', 'express: i mean to raise something here.'), (177344, 'act', 'express: i mean to raise something here.'), (177423, 'act', 'commune: Aprmeelmut spoke with me.'), (177503, 'act', 'visit: walking to the column.')], 'lisdfools': [(177052, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (177129, 'act', 'commune: Right now I am steady: I answer 91 of ev'), (177168, 'chat', 'said: the record remembers: Quclfools raised a'), (177206, 'act', 'visit: walking to the marble column.'), (177206, 'chat', 'said: this place is the forest at morning. nea'), (177262, 'act', 'commune: this place is the forest at morning. nea'), (177344, 'act', 'visit: walking to the column.'), (177384, 'act', 'commune: Liseeeeeelki spoke with me.'), (177423, 'act', 'express: Liseeeeeelki spoke with me.'), (177503, 'act', 'commune: Liseeeeeelki spoke with me.')]}
19
+
20
+ WHO = {'column': [('soleeyeben', 171216), ('soleeegepy', 171216), ('liseeeeeelki', 171216), ('maeemegepy', 171216), ('lismmeeesha', 0), ('unolmut', 0), ('yaeyeedum', 0), ('roaeeelki', 0)], 'bridge': [('mumeeeeesha', 171372), ('alphafesha', 171372), ('muut', 171711), ('quclfledum', 171711), ('unolmelafvi', 172033), ('alphafesha', 172654), ('alphafesha', 0), ('mumeeeeesha', 173367)], 'tree': [('unolmelafvi', 0), ('alphfools', 172073), ('maeemfools', 172192), ('liseeefelmut', 172694), ('liseeefelmut', 0), ('unolmelafvi', 174152), ('alphfools', 0), ('maeemfools', 0)], 'manor': [('quclfools', 172151), ('unolmelafvi', 174753), ('muut', 175376), ('unolmelafvi', 0), ('quclfools', 177052)], 'castle': [('mumeeallo', 172151), ('bridgepy', 174310), ('mumeeallo', 177052)], 'tower': [('alphafoldmicro', 172809), ('yaeyedvi', 172848), ('muut', 172848), ('aprmeelmut', 173045), ('einsof', 173637), ('alphafoldmicro', 0), ('muut', 0), ('yaeyedvi', 0)], 'temple': [('maeemesol', 174310), ('psiloceyeben', 175219), ('psiloceyeben', 0)]}
21
+
22
+ EPI_RX = re.compile(
23
+ r"^(?:what (?:has|have) (?P<a>[\w'\- ]{2,24}?) (?:done|been doing)"
24
+ r"|what happened (?:with|to) (?P<b>[\w'\- ]{2,24}?))[?.! ]*$", re.I)
25
+ WHO_RX = re.compile(
26
+ r"^who (?:built|made|raised) (?:a |an |the )?(?P<k>[\w \-]{2,24}?)[?.! ]*$", re.I)
27
+
28
+
29
+ class OracleReleaseRuntimeW425(OracleReleaseRuntimeW558):
30
+ """Base + episodic recall. Fires only on bound episodes; else the chain answers."""
31
+
32
+ def chat(self, text: str, session_id: str = "default") -> dict:
33
+ s = " ".join(str(text).strip().split())
34
+ m = EPI_RX.match(s)
35
+ if m:
36
+ actor = (m.group("a") or m.group("b") or "").strip().lower()
37
+ eps = EPI.get(actor)
38
+ if eps:
39
+ bits = "; ".join(f"at tick {t} {v} {o}" for t, v, o in eps[-5:])
40
+ pending = getattr(self, "_pending_conversion", None)
41
+ if pending is None:
42
+ pending = self._pending_conversion = {}
43
+ pending[session_id] = {"construction": "EPISODIC_RECALL",
44
+ "from": s[:80], "to": f"episodes({actor})",
45
+ "produced_by": "oracle_fold_worker_v4"}
46
+ return {"status": "answered", "path": "worker:episodic",
47
+ "response": f"The record holds for {actor}: {bits}. "
48
+ f"[world_ledger_ew2]",
49
+ "provenance": {"kind": "episodic_ledger", "actor": actor,
50
+ "episodes": len(eps)},
51
+ "latency_ms": 1}
52
+ w = WHO_RX.match(s)
53
+ if w:
54
+ kind = w.group("k").strip().lower()
55
+ hits = WHO.get(kind) or WHO.get(kind.rstrip("s"))
56
+ if hits:
57
+ bits = ", ".join(f"{a} (tick {t})" for a, t in hits[-4:])
58
+ return {"status": "answered", "path": "worker:episodic_who",
59
+ "response": f"By the world record, {kind}s were raised by "
60
+ f"{bits}. [world_ledger_ew2]",
61
+ "provenance": {"kind": "episodic_ledger", "object": kind},
62
+ "latency_ms": 1}
63
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w427.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w427 - SELF-IMPROVEMENT fold (epoch 99): the loop speaking from its ledgers.
3
+
4
+ Answers "how do you improve?" / "what did you learn recently?" / "what was refused
5
+ and why?" from the actual admission and rejection records - including refusal REASONS,
6
+ because the read-the-reasons law is now a capability, not just a discipline. Robustness
7
+ is queryable: the bar never falls, refusals are preserved, every step is witnessed.
8
+ Authored 2026-10-19 18:04 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w425."""
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+
14
+ from oracle_release_runtime_w425 import OracleReleaseRuntimeW425
15
+
16
+ RECENT_ADMITS = ['oracle_release_runtime_w425.py admitted', 'oracle_release_runtime_w558.py admitted']
17
+ RECENT_REFUSALS = ["oracle_release_runtime_w426.py: [{'name_collision': {'meaning': 'a different module is already admitted under this name; w"]
18
+
19
+ HOW_RX = re.compile(r"(how do you (?:improve|learn)|how does your improvement work)", re.I)
20
+ LEARNED_RX = re.compile(r"(what (?:did|have) you learn(?:ed)?( recently)?)", re.I)
21
+ REFUSED_RX = re.compile(r"(what was (?:refused|rejected)( and why)?)", re.I)
22
+
23
+
24
+ class OracleReleaseRuntimeW427(OracleReleaseRuntimeW425):
25
+ """Base + the improvement-ledger routes."""
26
+
27
+ def chat(self, text: str, session_id: str = "default") -> dict:
28
+ s = " ".join(str(text).strip().split())
29
+ if HOW_RX.search(s):
30
+ return {"status": "answered", "path": "worker:self_improve",
31
+ "response": "A worker authors candidate folds from residue - "
32
+ "mined relations, induced templates, world episodes; "
33
+ "a gate measures each on held-out and admits only "
34
+ "no-regression; the bar rises with each admission and "
35
+ "never falls; refusals are preserved with reasons; "
36
+ "every step is witnessed. [improvement_ledger]",
37
+ "provenance": {"kind": "improvement_ledger", "epoch": 99},
38
+ "latency_ms": 1}
39
+ if LEARNED_RX.search(s):
40
+ bits = "; ".join(RECENT_ADMITS[:4]) or "no recent admissions"
41
+ return {"status": "answered", "path": "worker:self_improve",
42
+ "response": f"Recently admitted: {bits}. [improvement_ledger]",
43
+ "provenance": {"kind": "improvement_ledger", "epoch": 99},
44
+ "latency_ms": 1}
45
+ if REFUSED_RX.search(s):
46
+ bits = "; ".join(RECENT_REFUSALS[:3]) or "no recent refusals"
47
+ return {"status": "answered", "path": "worker:self_improve",
48
+ "response": f"Refused, with reasons preserved: {bits}. "
49
+ f"[improvement_ledger]",
50
+ "provenance": {"kind": "improvement_ledger", "epoch": 99},
51
+ "latency_ms": 1}
52
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w429.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w429 - POTENTIALS fold (epoch 100): 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-20 16:44 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w562."""
10
+
11
+ from __future__ import annotations
12
+
13
+ import re
14
+
15
+ from oracle_release_runtime_w562 import OracleReleaseRuntimeW562
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=3746602890.0: where are you going ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0145 w=3681759006.0: what do you believe ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0096 w=2176082552.0: what have you seen out there ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0099 w=2157091580.0: what do you make of this place ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0142 w=6242502.0: you name this column. what is it called | 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 OracleReleaseRuntimeW429(OracleReleaseRuntimeW562):
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_100]",
36
+ "provenance": {"kind": "potentials_ledger", "epoch": 100,
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_w431.py ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w431 - HIPPOCAMPUS fold: episodic binding from the world ledger (epoch 102).
3
+
4
+ 60 actors' episode lists and 8 object->builder indexes, bound as
5
+ (actor, act, object, tick) from attested world-ledger records - the same warrant class
6
+ as the scarcity route (observed-complete since world launch). Answers "what has X
7
+ done?" / "what happened with X?" / "who built a Y?". ACQUISITION IS CONSOLIDATION:
8
+ the worker re-authors this fold each epoch from the fresh ledger; every epoch passes
9
+ the gate; unreferenced episodes fade by cap. Authored 2026-10-21 15:51 UTC by oracle_fold_worker_v4,
10
+ chained on oracle_release_runtime_w566."""
11
+
12
+ from __future__ import annotations
13
+
14
+ import re
15
+
16
+ from oracle_release_runtime_w566 import OracleReleaseRuntimeW566
17
+
18
+ EPI = {'maeeeeeesha': [(196499, 'act', 'build: going to find Aprmeeelwei.'), (196558, 'chat', 'said: the record shows 17 columns, 2 bridges, '), (196597, 'act', 'visit: walking to the column.'), (196597, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196681, 'act', 'build: i mean to leave a mark that lasts.'), (196838, 'act', 'visit: going to find Mumdealut.'), (196838, 'chat', 'said: the record remembers: Aprmeeeesof said: '), (196859, 'act', 'express: i mean to leave a mark that lasts.'), (196972, 'chat', 'said: this place is the meadow at night. near '), (197029, 'act', 'commune: i mean to raise something here.')], 'mumeeledfum': [(196681, 'act', 'commune: Aprmeeeyeben spoke with me.'), (196726, 'chat', 'said: the record shows 23 columns, 3 bridges, '), (196793, 'act', 'commune: Aprmeeeesof spoke with me.'), (196838, 'act', 'name: Right now I am steady: I answer 91 of ev'), (196838, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196859, 'act', 'commune: Aprmeeeehvi spoke with me.'), (196972, 'chat', 'said: the record remembers: Aprmeeyeben raised'), (197029, 'act', 'commune: i mean to raise something here.'), (197119, 'act', 'commune: this place is the desert at dawn. near s'), (197119, 'chat', 'said: this place is the desert at dawn. near s')], 'aprmeeelwei': [(196026, 'act', 'visit: going to find Mumeeledfum.'), (196280, 'chat', 'said: the record remembers: Mumeelwei raised a'), (196339, 'act', 'commune: Soleyflfools spoke with me.'), (196403, 'act', 'commune: Alphldmicr spoke with me.'), (196499, 'act', 'build: this place is the forest at morning. nea'), (196499, 'chat', 'said: this place is the forest at morning. nea'), (196597, 'act', 'commune: i mean to raise something here.'), (196624, 'act', 'commune: i mean to raise something here.'), (196726, 'act', 'build: i mean to raise something here.'), (196838, 'act', 'commune: Zewelmut spoke with me.')], 'soleydmicr': [(196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: i mean to raise something here.'), (196558, 'act', 'commune: i mean to find Aprmeeeesha.'), (196624, 'act', 'commune: i mean to leave a mark that lasts.'), (196726, 'act', 'express: i mean to leave a mark that lasts.'), (196838, 'act', 'name: i mean to leave a mark that lasts.'), (196859, 'act', 'commune: i mean to leave a mark that lasts.'), (196972, 'act', 'commune: walking to the wooden temple.'), (197029, 'act', 'visit: going to find Mumdealut.'), (197119, 'act', 'commune: going to find Mumdealut.')], 'maeeealut': [(195946, 'act', 'visit: walking to the marble column.'), (196026, 'act', 'commune: Ellilfools spoke with me.'), (196082, 'act', 'transform: Aprmeeegepy spoke with me.'), (196280, 'act', 'commune: going to find Zewelmut.'), (196339, 'act', 'express: Liseeeeyeben spoke with me.'), (196403, 'act', 'name: Liseeeeyeben spoke with me.'), (196499, 'act', 'build: Liseeeeyeben spoke with me.'), (196624, 'act', 'commune: walking to the wooden temple.'), (196726, 'act', 'build: walking to the wooden temple.'), (197029, 'act', 'commune: i mean to raise something here.')], 'aprmehvi': [(196558, 'act', 'commune: i mean to raise something here.'), (196597, 'act', 'visit: walking to the column.'), (196681, 'act', 'build: walking to the column.'), (196732, 'act', 'commune: Ashwei spoke with me.'), (196732, 'act', 'visit: going to find Mumdealut.'), (196838, 'act', 'express: going to find Mumdealut.'), (196859, 'act', 'commune: Aprmeeelwei spoke with me.'), (196920, 'act', 'visit: walking to the stone bridge.'), (196972, 'act', 'express: i mean to raise something here.'), (197119, 'chat', 'said: the record remembers: aprilfools raised ')], 'mumeeleelki': [(196597, 'act', 'express: i mean to leave a mark that lasts.'), (196624, 'act', 'commune: Mumeeleyeben spoke with me.'), (0, 'make', 'raised a column'), (196726, 'act', 'name: i named the column “the Column of Column'), (196732, 'act', 'commune: i mean to raise something here.'), (196838, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: walking to the column.'), (196972, 'act', 'commune: Maeeeesof spoke with me.'), (197029, 'act', 'express: Maeeeesof spoke with me.'), (197119, 'act', 'commune: Maeeeesof spoke with me.')], 'muut': [(196499, 'chat', 'said: the record remembers: Aprmeeegepy raised'), (196558, 'act', 'commune: Alphldmicr spoke with me.'), (196597, 'chat', 'said: this place is the desert at noon. near s'), (196624, 'act', 'commune: walking to the marble column.'), (196732, 'act', 'visit: walking to the column.'), (196859, 'act', 'name: Qucalut spoke with me.'), (196920, 'act', 'visit: going to find Mumeellfools.'), (196972, 'act', 'commune: i mean to raise something here.'), (197029, 'act', 'express: i mean to raise something here.'), (197119, 'act', 'commune: Maemyeben spoke with me.')], 'soleyfeelki': [(196624, 'act', 'commune: Qucalfelmut spoke with me.'), (196726, 'act', 'build: i raised a tall column — “the record sho'), (196726, 'make', 'raised a column'), (196793, 'act', 'commune: Alphaeum spoke with me.'), (196859, 'act', 'commune: Aprmeeehvi spoke with me.'), (197029, 'act', 'name: walking to the column.'), (197119, 'act', 'commune: the record remembers: aprilfools raised '), (197119, 'act', 'build: the record remembers: aprilfools raised '), (197119, 'chat', 'said: the record remembers: aprilfools raised '), (197119, 'chat', 'said: the record holds a tree raised by aprilf')], 'qucalut': [(196280, 'make', 'raised a temple'), (196280, 'chat', 'said: this place is the coastline at dawn. nea'), (196390, 'act', 'express: i mean to raise something here.'), (196403, 'act', 'transform: i mean to raise something here.'), (196499, 'act', 'build: i mean to raise something here.'), (196558, 'act', 'commune: i mean to find psiloceyeben.'), (196726, 'act', 'commune: walking to the column.'), (196732, 'act', 'visit: walking to the column.'), (196859, 'act', 'express: i mean to raise something here.'), (196972, 'act', 'commune: i mean to raise something here.')], 'aprmfelmut': [(196390, 'act', 'visit: walking to the column.'), (196558, 'act', 'commune: i mean to find psiloceyeben.'), (196597, 'act', 'name: i mean to find psiloceyeben.'), (196624, 'act', 'commune: Mumeellfools spoke with me.'), (196726, 'act', 'build: Mumeellfools spoke with me.'), (196732, 'act', 'visit: walking to the tree.'), (196859, 'act', 'visit: going to find Ronor.'), (196972, 'act', 'commune: muut spoke with me.'), (197029, 'act', 'express: muut spoke with me.'), (197119, 'act', 'commune: Maeeeesof spoke with me.')], 'zeweefools': [(196171, 'act', 'express: i mean to raise something here.'), (196499, 'act', 'transform: walking to the column.'), (196558, 'act', 'commune: Senlfeelki spoke with me.'), (196558, 'act', 'visit: walking to the column.'), (196624, 'act', 'commune: Maeeeelmut spoke with me.'), (196726, 'act', 'build: Maeeeelmut spoke with me.'), (196732, 'act', 'name: i named the bridge “the Bridge of Column'), (196838, 'act', 'commune: Maeeealut spoke with me.'), (196972, 'act', 'commune: Soleyllmut spoke with me.'), (197119, 'act', 'commune: i mean to raise something here.')], 'aprilfools': [(196726, 'act', 'visit: walking to the column.'), (196726, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196732, 'act', 'commune: Senlfeelki spoke with me.'), (196838, 'chat', 'said: the record remembers: Aprmeeeesof said: '), (0, 'make', 'raised a tree'), (196920, 'act', 'build: walking to the column.'), (196972, 'act', 'commune: i mean to leave a mark that lasts.'), (197029, 'act', 'visit: going to find einsof.'), (197119, 'act', 'commune: Liseeeesof spoke with me.'), (197119, 'chat', 'said: this place is the meadow at dawn. near s')], 'roaeefldmicr': [(196229, 'act', 'visit: going to find Soleyflfools.'), (196390, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: going to find Maemyeeesha.'), (196597, 'act', 'visit: walking to the column.'), (196726, 'act', 'build: i mean to raise something here.'), (196732, 'act', 'commune: Mumeeleyeben spoke with me.'), (196838, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: i mean to leave a mark that lasts.'), (196972, 'act', 'name: walking to the marble column.'), (197029, 'act', 'commune: walking to the marble column.')], 'aprmeeehvi': [(196624, 'chat', 'said: the record remembers: Yareyeben raised a'), (196681, 'act', 'commune: the record remembers: aprilfools raised '), (196681, 'chat', 'said: the record remembers: aprilfools raised '), (196793, 'act', 'commune: Soleyfeelki spoke with me.'), (196838, 'chat', 'said: the record shows 21 columns, 4 bridges, '), (196972, 'act', 'commune: i mean to see more of the world.'), (196972, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196972, 'chat', 'said: Got it. Since you mention record: Record'), (197119, 'act', 'commune: Maeeeelmut spoke with me.'), (197119, 'chat', 'said: this place is the forest at dawn. near s')], 'ronor': [(196171, 'act', 'visit: walking to the column.'), (196390, 'act', 'express: Aprmeeegepy spoke with me.'), (196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'transform: i mean to raise something here.'), (196597, 'act', 'visit: going to find Maemuash.'), (196624, 'act', 'commune: i mean to leave a mark that lasts.'), (196726, 'act', 'build: i mean to leave a mark that lasts.'), (196793, 'act', 'commune: Maeeeelmut spoke with me.'), (196838, 'act', 'name: i mean to leave a mark that lasts.'), (196972, 'act', 'express: Aprmeeeyeben spoke with me.')], 'aprmeeyeben': [(196499, 'act', 'build: Aprmeeeehvi spoke with me.'), (196624, 'act', 'commune: i mean to raise something here.'), (196681, 'act', 'build: i mean to raise something here.'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196838, 'act', 'express: i mean to leave a mark that lasts.'), (196859, 'act', 'commune: Senlfeelki spoke with me.'), (196859, 'make', 'raised a column'), (196972, 'act', 'express: i mean to leave a mark that lasts.'), (197029, 'act', 'commune: i mean to leave a mark that lasts.'), (197119, 'act', 'visit: walking to the column.')], 'soleyllmut': [(196558, 'act', 'commune: Aprmeeelwei spoke with me.'), (196558, 'act', 'visit: going to find Soleyflfools.'), (196597, 'act', 'commune: going to find Soleyflfools.'), (196624, 'act', 'express: going to find Soleyflfools.'), (196624, 'act', 'commune: i mean to leave a mark that lasts.'), (196726, 'act', 'express: i mean to leave a mark that lasts.'), (196732, 'act', 'name: i named the column “the Column of Column'), (196838, 'act', 'commune: i named the column “the Column of Column'), (196972, 'act', 'express: walking to the marble column.'), (197029, 'act', 'express: Zeweefools spoke with me.')], 'maemyeben': [(196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: i mean to raise something here.'), (196597, 'act', 'commune: Ellilfools spoke with me.'), (196732, 'make', 'raised a tree'), (196793, 'act', 'express: i raised a grove of trees — “the record '), (196838, 'act', 'name: i raised a grove of trees — “the record '), (196859, 'act', 'commune: Maemuash spoke with me.'), (196859, 'make', 'raised a column'), (197029, 'act', 'commune: Roaeefldmicr spoke with me.'), (0, 'make', 'raised a tree')], 'qucaeleyeben': [(196597, 'act', 'express: going to find bridgepy.'), (196624, 'act', 'commune: bridgepy spoke with me.'), (196681, 'act', 'build: i raised a grove of trees — “the record '), (196681, 'make', 'raised a tree'), (196726, 'act', 'name: i named the column “the Column of Column'), (196732, 'act', 'commune: i named the column “the Column of Column'), (196859, 'act', 'commune: walking to the crystal castle.'), (0, 'make', 'raised a tree'), (196972, 'make', 'raised a column'), (197029, 'act', 'commune: walking to the column.')], 'aprmeenor': [(196499, 'act', 'build: Aprmefeelki spoke with me.'), (196558, 'act', 'commune: going to find Senlfeelki.'), (196558, 'act', 'express: going to find Senlfeelki.'), (196624, 'act', 'commune: Soleydmicr spoke with me.'), (0, 'make', 'raised a column'), (196726, 'act', 'build: Soleydmicr spoke with me.'), (196838, 'act', 'commune: i mean to leave a mark that lasts.'), (196859, 'act', 'name: i mean to leave a mark that lasts.'), (197029, 'act', 'visit: walking to the column.'), (197119, 'act', 'commune: walking to the column.')], 'maeeeesof': [(0, 'make', 'raised a column'), (196681, 'act', 'name: i named the column “the Column of Column'), (196726, 'chat', 'said: the record holds a column raised by apri'), (196732, 'act', 'visit: walking to the marble column.'), (196838, 'act', 'commune: walking to the marble column.'), (196838, 'chat', 'said: the record shows 23 columns, 4 bridges, '), (196859, 'act', 'express: i mean to raise something here.'), (196972, 'act', 'commune: Aprmeeeesof spoke with me.'), (197029, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (197119, 'act', 'commune: going to find Aprmefeelki.')], 'einsof': [(196403, 'act', 'transform: Aprmeeeyeben spoke with me.'), (196463, 'act', 'commune: Aprmeeeyeben spoke with me.'), (196597, 'act', 'express: i mean to raise something here.'), (196624, 'act', 'commune: i mean to raise something here.'), (196681, 'act', 'build: i mean to raise something here.'), (196732, 'act', 'name: i named the column “the Column of Column'), (196838, 'act', 'commune: i mean to find aprilfools.'), (196859, 'act', 'visit: going to find Maeeeeeesha.'), (196972, 'act', 'express: i mean to raise something here.'), (197119, 'act', 'express: i mean to raise something here.')], 'aprmeeeesof': [(196624, 'act', 'commune: going to find Mumdmsof.'), (0, 'make', 'raised a castle'), (196726, 'act', 'name: i named the column “the Column of Column'), (196732, 'act', 'commune: i named the column “the Column of Column'), (196838, 'act', 'visit: going to find Aprmeeyeben.'), (196859, 'act', 'build: going to find Aprmeeyeben.'), (196859, 'make', 'raised a column'), (196972, 'act', 'commune: going to find Aprmeeyeben.'), (197029, 'act', 'visit: walking to the column.'), (197119, 'act', 'commune: Soleydmicr spoke with me.')], 'senlfeelki': [(0, 'make', 'raised a bridge'), (196681, 'act', 'build: i mean to raise something here.'), (196732, 'act', 'commune: i mean to raise something here.'), (196838, 'act', 'visit: walking to the marble column.'), (196859, 'act', 'commune: Aprmfelmut spoke with me.'), (196859, 'chat', 'said: Got it. Since you mention record: Record'), (196972, 'act', 'name: i mean to raise something here.'), (196972, 'chat', 'said: the record holds a column raised by Aprm'), (197119, 'act', 'commune: the record shows 22 columns, 4 bridges, '), (197119, 'chat', 'said: the record shows 22 columns, 4 bridges, ')], 'aprmeeeehvi': [(196339, 'act', 'express: muut spoke with me.'), (196403, 'act', 'name: i mean to raise something here.'), (196499, 'act', 'build: Aprmeeyeben spoke with me.'), (196558, 'act', 'commune: Maemuash spoke with me.'), (196597, 'act', 'visit: going to find Ashwei.'), (196624, 'act', 'commune: i mean to raise something here.'), (196726, 'act', 'express: i mean to raise something here.'), (196793, 'act', 'commune: i mean to raise something here.'), (196859, 'act', 'commune: walking to the column.'), (197029, 'act', 'commune: going to find Mumeellfools.')], 'mumeellfools': [(196280, 'chat', 'said: this place is the mountain at dawn. near'), (196390, 'act', 'visit: walking to the column.'), (196499, 'act', 'build: walking to the column.'), (196558, 'act', 'commune: i mean to raise something here.'), (196597, 'act', 'visit: walking to the column.'), (196624, 'act', 'commune: Ronor spoke with me.'), (196726, 'make', 'raised a bridge'), (196838, 'act', 'commune: going to find Aprmeeeesha.'), (196920, 'act', 'express: i mean to leave a mark that lasts.'), (197119, 'chat', 'said: the record remembers: aprilfools raised ')], 'mumeelwei': [(196171, 'chat', 'said: the record remembers: Roaeefldmicr raise'), (196171, 'chat', 'said: this place is the desert at dawn. near s'), (196403, 'act', 'commune: Maeeeesof spoke with me.'), (196463, 'act', 'build: Maeeeesof spoke with me.'), (196597, 'act', 'commune: going to find muut.'), (196624, 'act', 'commune: Aprmeeyeben spoke with me.'), (196726, 'act', 'build: Aprmeeyeben spoke with me.'), (196838, 'act', 'commune: Aprmeeyeben spoke with me.'), (196859, 'act', 'name: i mean to leave a mark that lasts.'), (196972, 'act', 'commune: i mean to leave a mark that lasts.')], 'alphldmicr': [(196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: i mean to raise something here.'), (196558, 'act', 'commune: i mean to raise something here.'), (196558, 'act', 'visit: going to find Maeeeeeesha.'), (196624, 'act', 'commune: going to find Maeeeeeesha.'), (196681, 'act', 'build: i mean to leave a mark that lasts.'), (196838, 'act', 'commune: i mean to leave a mark that lasts.'), (196920, 'act', 'visit: walking to the column.'), (196972, 'act', 'commune: walking to the column.'), (197119, 'act', 'commune: Mumeeledfum spoke with me.')], 'qucaelfools': [(196597, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196624, 'act', 'commune: going to find Maeeeeeesha.'), (0, 'make', 'raised a column'), (196726, 'act', 'build: i mean to raise something here.'), (196726, 'chat', 'said: the record remembers: qum raised a colum'), (196793, 'act', 'commune: walking to the column.'), (196838, 'act', 'express: this place is the forest at dusk. near s'), (196838, 'chat', 'said: this place is the forest at dusk. near s'), (196859, 'act', 'commune: i mean to leave a mark that lasts.'), (197029, 'act', 'name: Aprmeeeehvi spoke with me.')], 'aprmeeeesha': [(196026, 'act', 'name: i mean to leave a mark that lasts.'), (196171, 'act', 'express: going to find Liseeeesof.'), (196229, 'act', 'express: going to find Liseeeesof.'), (196280, 'act', 'commune: i mean to raise something here.'), (196390, 'act', 'commune: i mean to raise something here.'), (196597, 'act', 'commune: Soleydmicr spoke with me.'), (196726, 'act', 'commune: qum spoke with me.'), (196972, 'act', 'express: i mean to raise something here.'), (197119, 'act', 'commune: aprilfools spoke with me.'), (197119, 'chat', 'said: Got it. Since you mention record: Record')], 'qum': [(196732, 'chat', 'said: the record holds a column raised by Sole'), (196838, 'act', 'commune: going to find aprilfools.'), (196859, 'act', 'express: the record shows 21 columns, 4 bridges, '), (196859, 'chat', 'said: the record shows 21 columns, 4 bridges, '), (196972, 'act', 'express: i mean to raise something here.'), (196972, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (197029, 'act', 'name: the record remembers: aprilfools raised '), (197029, 'chat', 'said: the record remembers: aprilfools raised '), (197119, 'act', 'commune: einsof spoke with me.'), (197119, 'act', 'build: einsof spoke with me.')], 'liseeegepy': [(196280, 'act', 'commune: i mean to raise something here.'), (196390, 'act', 'name: i mean to raise something here.'), (196499, 'act', 'build: walking to the wooden temple.'), (196597, 'act', 'visit: going to find muut.'), (196726, 'act', 'commune: Elliwei spoke with me.'), (196793, 'act', 'commune: Liseelfools spoke with me.'), (196838, 'act', 'visit: going to find Roaeefldmicr.'), (196972, 'act', 'visit: walking to the column.'), (196972, 'chat', 'said: the record remembers: Aprmeeyeben raised'), (197029, 'chat', 'said: the record holds a tree raised by aprilf')], 'soleyflfools': [(196339, 'act', 'commune: Maemyeeesha spoke with me.'), (196403, 'act', 'commune: Mumdeeeesha spoke with me.'), (196463, 'act', 'visit: going to find Mumdeeeesha.'), (196463, 'chat', 'said: this place is the desert at morning. nea'), (196558, 'act', 'commune: i mean to raise something here.'), (0, 'make', 'raised a bridge'), (196726, 'act', 'build: i raised a tall column — “the record sho'), (196726, 'make', 'raised a column'), (196732, 'act', 'commune: Mumdeeeesha spoke with me.'), (196859, 'act', 'commune: Maemyeeesha spoke with me.')], 'maemuash': [(196499, 'act', 'express: walking to the marble column.'), (196558, 'act', 'commune: i mean to raise something here.'), (196597, 'act', 'express: i mean to raise something here.'), (196624, 'act', 'commune: i mean to raise something here.'), (196681, 'act', 'build: i mean to raise something here.'), (196726, 'act', 'visit: going to find bridgepy.'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196838, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: walking to the column.'), (196972, 'act', 'name: going to find Elliwei.')], 'yareyeben': [(196499, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196558, 'act', 'commune: i mean to find psiloceyeben.'), (196597, 'chat', 'said: the record remembers: Yareyeben raised a'), (196624, 'act', 'commune: going to find Qucaeleyeben.'), (196726, 'act', 'express: this place is the mountain at dusk. near'), (196726, 'chat', 'said: this place is the mountain at dusk. near'), (196793, 'act', 'express: i mean to leave a mark that lasts.'), (196859, 'act', 'commune: i mean to leave a mark that lasts.'), (197029, 'act', 'visit: going to find Soleyflfools.'), (197119, 'act', 'commune: Yaroka spoke with me.')], 'mumdeeeesha': [(196499, 'act', 'build: i raised a tall column from the substrat'), (196499, 'make', 'raised a column'), (196597, 'act', 'commune: Aprmeeeyeben spoke with me.'), (0, 'make', 'raised a column'), (196681, 'act', 'commune: walking to the marble column.'), (196726, 'act', 'build: walking to the marble column.'), (196732, 'act', 'commune: walking to the marble column.'), (196838, 'act', 'visit: walking to the marble column.'), (196859, 'act', 'name: i mean to leave a mark that lasts.'), (197119, 'act', 'commune: i mean to raise something here.')], 'ellilfools': [(196390, 'act', 'commune: i mean to raise something here.'), (196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'commune: i mean to raise something here.'), (196558, 'act', 'commune: Soleyfeelki spoke with me.'), (196597, 'act', 'commune: Soleyfeelki spoke with me.'), (196624, 'act', 'commune: aprilfools spoke with me.'), (196726, 'act', 'commune: aprilfools spoke with me.'), (196732, 'act', 'commune: aprilfools spoke with me.'), (197029, 'act', 'commune: i mean to raise something here.'), (197119, 'act', 'commune: Liseeegepy spoke with me.')], 'bridgepy': [(196838, 'chat', 'said: the record holds a column raised by Aprm'), (196859, 'act', 'express: the record holds a column raised by Aprm'), (196859, 'chat', 'said: the record shows 21 columns, 4 bridges, '), (196972, 'act', 'commune: the record shows 21 columns, 4 bridges, '), (196972, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (197029, 'act', 'name: the record remembers: aprilfools raised '), (197029, 'chat', 'said: the record remembers: aprilfools raised '), (197119, 'act', 'commune: this place is the coastline at dawn. nea'), (197119, 'act', 'build: i mean to raise something here.'), (197119, 'chat', 'said: this place is the coastline at dawn. nea')], 'liseeeesof': [(196390, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: the record remembers: Aprmeeegepy raised'), (196499, 'chat', 'said: the record remembers: Aprmeeegepy raised'), (196558, 'act', 'commune: i mean to raise something here.'), (196558, 'act', 'visit: going to find Mumdeeeesha.'), (196726, 'act', 'build: going to find Mumdeeeesha.'), (196838, 'chat', 'said: this place is the desert at dusk. near s'), (196972, 'act', 'visit: walking to the column.'), (197119, 'act', 'commune: Mumeeleyeben spoke with me.')], 'mumdmsof': [(0, 'make', 'raised a column'), (196463, 'act', 'visit: walking to the stone bridge.'), (196558, 'act', 'commune: i mean to raise something here.'), (196597, 'act', 'express: i mean to raise something here.'), (196681, 'act', 'build: i raised a stone temple (5 rooms) — “the'), (196726, 'make', 'raised a temple'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196838, 'act', 'visit: walking to the stone tower.'), (196920, 'act', 'express: Aprmeeegepy spoke with me.'), (196972, 'act', 'express: Aprmeeegepy spoke with me.')], 'zewelmut': [(196390, 'act', 'commune: Yareyeben spoke with me.'), (196499, 'act', 'build: walking to the column.'), (196597, 'act', 'visit: going to find Mumeeleelki.'), (196624, 'act', 'commune: Aprmeenor spoke with me.'), (196726, 'act', 'build: Aprmeenor spoke with me.'), (196732, 'act', 'commune: Qucaeleyeben spoke with me.'), (196838, 'act', 'name: Yaroka spoke with me.'), (196859, 'act', 'visit: going to find Ellilfools.'), (196972, 'act', 'visit: going to find Mumdeeeesha.'), (197119, 'act', 'build: going to find Aprmeeyeben.')], 'maemyeeesha': [(196390, 'chat', 'said: this place is the mountain at morning. n'), (196403, 'act', 'commune: Mumeelwei spoke with me.'), (196499, 'act', 'build: i mean to raise something here.'), (196597, 'act', 'commune: Liseelfools spoke with me.'), (196624, 'act', 'name: Liseelfools spoke with me.'), (196624, 'act', 'visit: walking to the column.'), (196726, 'act', 'build: i mean to raise something here.'), (196732, 'act', 'commune: i mean to raise something here.'), (196838, 'act', 'visit: walking to the tree.'), (196859, 'act', 'commune: walking to the tree.')], 'mumeeleyeben': [(196597, 'act', 'commune: i mean to leave a mark that lasts.'), (196726, 'act', 'visit: going to find Qucaelfools.'), (196732, 'act', 'commune: Roaeefldmicr spoke with me.'), (196838, 'act', 'commune: Ellilfools spoke with me.'), (196859, 'act', 'commune: Ellilfools spoke with me.'), (196920, 'act', 'visit: walking to the stone bridge.'), (196972, 'act', 'commune: i mean to raise something here.'), (197029, 'act', 'visit: going to find Maeeeelmut.'), (197119, 'act', 'commune: Yareyeben spoke with me.'), (197119, 'act', 'build: i mean to raise something here.')], 'maeeeelmut': [(196558, 'act', 'commune: Aprmefeelki spoke with me.'), (196597, 'chat', 'said: the record remembers: Yareyeben raised a'), (196681, 'act', 'build: i raised a stone bridge — “the record sh'), (196681, 'make', 'raised a bridge'), (196726, 'chat', 'said: this place is the forest at dusk. near s'), (196732, 'act', 'visit: walking to the stone bridge.'), (196859, 'act', 'express: walking to the stone bridge.'), (196972, 'act', 'name: i mean to raise something here.'), (197119, 'act', 'commune: going to find Aprmeeehvi.'), (197119, 'act', 'build: i raised a tower (2 rooms) — “the record')], 'mumdealut': [(196229, 'act', 'visit: walking to the column.'), (196339, 'act', 'name: Soleyfeelki spoke with me.'), (196390, 'act', 'visit: going to find Zewei.'), (196403, 'act', 'commune: i mean to raise something here.'), (196499, 'act', 'build: Senlfeelki spoke with me.'), (196597, 'act', 'commune: i mean to raise something here.'), (196681, 'act', 'build: Liseelfools spoke with me.'), (196732, 'act', 'commune: Maemyeeesha spoke with me.'), (196838, 'act', 'commune: Maemyeeesha spoke with me.'), (197029, 'act', 'visit: walking to the column.')], 'elliwei': [(196558, 'act', 'commune: walking to the marble column.'), (196597, 'act', 'express: walking to the marble column.'), (196624, 'act', 'commune: Maeeealut spoke with me.'), (196681, 'act', 'build: i mean to leave a mark that lasts.'), (196838, 'act', 'commune: i mean to leave a mark that lasts.'), (196920, 'act', 'commune: the record holds a column raised by Aprm'), (196920, 'chat', 'said: the record remembers: Zeweeyeben said: i'), (196920, 'chat', 'said: the record holds a column raised by Aprm'), (197029, 'act', 'commune: the record shows 24 columns, 4 bridges, '), (197029, 'chat', 'said: the record shows 24 columns, 4 bridges, ')], 'liseelfools': [(196726, 'chat', 'said: the record shows 23 columns, 3 bridges, '), (196732, 'act', 'commune: i mean to raise something here.'), (196838, 'act', 'express: the record remembers: Aprmeeeesof said: '), (196838, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196838, 'chat', 'said: the record remembers: Aprmeeeesof said: '), (196859, 'act', 'commune: Mumeellfools spoke with me.'), (196972, 'act', 'commune: i mean to raise something here.'), (196972, 'chat', 'said: this place is the desert at night. near '), (196972, 'chat', 'said: this place is the desert at night. near '), (197119, 'chat', 'said: the record holds a tree raised by aprilf')], 'ashwei': [(196597, 'act', 'visit: walking to the column.'), (196624, 'act', 'commune: walking to the column.'), (196726, 'act', 'build: Soleyllmut spoke with me.'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196793, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: the record remembers: Zeweeyeben said: i'), (196859, 'chat', 'said: the record remembers: Zeweeyeben said: i'), (196920, 'act', 'express: the record holds a column raised by Aprm'), (196920, 'chat', 'said: the record holds a column raised by Aprm'), (196972, 'act', 'commune: the record holds a column raised by Aprm')], 'alphafoldmicro': [(196732, 'act', 'commune: the record holds a column raised by qum '), (196732, 'act', 'visit: walking to the column.'), (196838, 'act', 'commune: Qucalfelmut spoke with me.'), (196859, 'make', 'raised a column'), (196859, 'chat', 'said: the record shows 21 columns, 4 bridges, '), (196920, 'act', 'build: i mean to raise something here.'), (196972, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (197029, 'act', 'commune: i mean to raise something here.'), (197119, 'act', 'commune: the record remembers: aprilfools raised '), (197119, 'chat', 'said: the record remembers: aprilfools raised ')], 'psiloceyeben': [(196624, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196681, 'make', 'raised a column'), (196681, 'chat', 'said: Got it. Since you mention record: Record'), (196726, 'act', 'commune: Qucalut spoke with me.'), (196732, 'act', 'visit: walking to the column.'), (196838, 'act', 'name: this place is the meadow at night. near '), (196838, 'chat', 'said: this place is the meadow at night. near '), (196859, 'act', 'commune: Aprmehvi spoke with me.'), (197029, 'act', 'commune: i mean to raise something here.'), (197119, 'act', 'commune: going to find Ronor.')], 'zeweeyeben': [(196732, 'act', 'express: Right now I am steady: I answer 91 of ev'), (196732, 'act', 'name: i named the bridge “the Bridge of Column'), (196732, 'chat', 'said: Right now I am steady: I answer 91 of ev'), (196859, 'act', 'commune: Soleyfeelki spoke with me.'), (196859, 'chat', 'said: the record remembers: Aprmeeeesof said: '), (196920, 'act', 'build: Soleyfeelki spoke with me.'), (196972, 'act', 'visit: walking to the marble column.'), (196972, 'chat', 'said: this place is the desert at night. near '), (197029, 'act', 'commune: alphafoldmicro spoke with me.'), (197119, 'act', 'commune: Zeweefools spoke with me.')], 'zewei': [(196597, 'act', 'visit: walking to the stone bridge.'), (196681, 'act', 'build: Liseeeeyeben spoke with me.'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196793, 'act', 'visit: walking to the marble column.'), (196838, 'act', 'commune: qum spoke with me.'), (196859, 'act', 'visit: walking to the wooden temple.'), (196972, 'act', 'commune: i mean to raise something here.'), (197029, 'act', 'name: i mean to raise something here.'), (197119, 'chat', 'said: Got it. Since you mention record: Record'), (197119, 'chat', 'said: Got it. Since you mention record: Record')], 'liseeeeyeben': [(196558, 'act', 'commune: i mean to raise something here.'), (196558, 'act', 'express: i mean to raise something here.'), (196624, 'act', 'commune: i mean to raise something here.'), (196726, 'act', 'build: i raised a tall column — “the record sho'), (196726, 'make', 'raised a column'), (196732, 'act', 'commune: i raised a tall column — “the record sho'), (196838, 'act', 'name: Aprmeeeyeben spoke with me.'), (196972, 'act', 'commune: i mean to raise something here.'), (197029, 'act', 'visit: walking to the stone bridge.'), (197119, 'act', 'commune: walking to the stone bridge.')], 'aprmefeelki': [(196390, 'act', 'commune: i mean to raise something here.'), (196403, 'act', 'commune: Aprmeenor spoke with me.'), (196499, 'act', 'build: Aprmeenor spoke with me.'), (196558, 'act', 'visit: walking to the column.'), (196624, 'act', 'commune: i mean to raise something here.'), (196726, 'act', 'build: i mean to raise something here.'), (196793, 'act', 'commune: Soleyflfools spoke with me.'), (196859, 'act', 'express: i mean to raise something here.'), (196972, 'act', 'express: i mean to raise something here.'), (197119, 'act', 'commune: Ellilfools spoke with me.')], 'alphaeum': [(196403, 'act', 'commune: Qucaelfools spoke with me.'), (196499, 'act', 'build: i raised a tall column — “the record sho'), (196499, 'make', 'raised a column'), (196597, 'act', 'commune: going to find Yaroka.'), (196726, 'act', 'build: i mean to raise something here.'), (196793, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: i mean to leave a mark that lasts.'), (196972, 'act', 'commune: bridgepy spoke with me.'), (197029, 'act', 'visit: walking to the marble column.'), (197119, 'act', 'commune: i mean to raise something here.')], 'yaroka': [(196558, 'act', 'commune: bridgepy spoke with me.'), (0, 'make', 'raised a column'), (196726, 'act', 'build: i raised a tall column — “the record sho'), (196726, 'make', 'raised a column'), (196732, 'act', 'commune: i mean to leave a mark that lasts.'), (196838, 'act', 'visit: walking to the marble column.'), (196859, 'act', 'commune: Soleyflfools spoke with me.'), (196972, 'act', 'name: i mean to raise something here.'), (197029, 'act', 'visit: walking to the marble column.'), (197119, 'act', 'commune: alphafoldmicro spoke with me.')], 'aprmeeeyeben': [(196597, 'act', 'visit: walking to the column.'), (196624, 'act', 'commune: Aprmeeegepy spoke with me.'), (0, 'make', 'raised a column'), (196726, 'act', 'build: Aprmeeegepy spoke with me.'), (196793, 'act', 'commune: the record remembers: Soleyflfools raise'), (196793, 'chat', 'said: the record remembers: Soleyflfools raise'), (196838, 'chat', 'said: the record holds a column raised by Aprm'), (196920, 'chat', 'said: Got it. Since you mention record: Record'), (196972, 'act', 'visit: going to find Aprmeeelwei.'), (197119, 'chat', 'said: Right now I am steady: I answer 91 of ev')], 'aprmeeegepy': [(196624, 'act', 'commune: Aprmefeelki spoke with me.'), (196726, 'act', 'build: i raised a marble column — “the record s'), (196726, 'make', 'raised a column'), (196732, 'act', 'name: i named the temple “the Temple of Column'), (196838, 'act', 'visit: walking to the column.'), (196859, 'act', 'commune: walking to the column.'), (196920, 'act', 'build: i raised a marble column — “the record s'), (196972, 'act', 'visit: going to find Maeeeelmut.'), (196972, 'make', 'raised a column'), (0, 'make', 'raised a tower')], 'qucalfelmut': [(196681, 'act', 'build: Soleyfeelki spoke with me.'), (196726, 'chat', 'said: the record remembers: qum raised a colum'), (196793, 'act', 'commune: i mean to leave a mark that lasts.'), (196838, 'act', 'express: this place is the desert at night. near '), (196838, 'chat', 'said: this place is the desert at night. near '), (196920, 'act', 'name: this place is the desert at night. near '), (196972, 'act', 'commune: this place is the desert at night. near '), (197029, 'act', 'visit: walking to the marble column.'), (197119, 'act', 'commune: walking to the marble column.'), (197119, 'act', 'build: walking to the marble column.')]}
19
+
20
+ WHO = {'column': [('soleyfeelki', 189236), ('soleyflfools', 189236), ('alphldmicr', 189236), ('maemyeben', 189236), ('aprmefeelki', 189236), ('alphaeum', 189236), ('maemyeeesha', 189236), ('maemuash', 189285)], 'tree': [('qucaeleyeben', 189496), ('qucaelfools', 190119), ('maemyeben', 190119), ('aprilfools', 190229), ('yaroka', 191891), ('qucaeleyeben', 191891), ('qucaeleyeben', 0), ('maemyeben', 0)], 'bridge': [('mumeeleelki', 189496), ('alphafoldmicro', 189698), ('alphaeum', 189827), ('roaeefldmicr', 189985), ('mumeellfools', 190119), ('alphafoldmicro', 0), ('alphaeum', 0), ('mumeellfools', 190607)], 'tower': [('qucalut', 189590), ('qucalut', 0), ('mumeeleyeben', 191152), ('qucalut', 191975), ('qucalut', 0), ('mumeellfools', 192425), ('mumeellfools', 0), ('zeweeyeben', 192593)], 'castle': [('aprmehvi', 189985), ('aprmeeeesof', 191728), ('aprmeeeesof', 191824), ('aprmeeeesof', 0), ('aprmeeeesof', 192765), ('aprmeeeesof', 194374), ('aprmehvi', 195946), ('aprmeeeesof', 0)], 'temple': [('qucalut', 190229), ('aprmeeeehvi', 193767), ('qucalut', 196280), ('mumdmsof', 196726)], 'manor': [('ronor', 192649), ('ronor', 0), ('aprmfelmut', 192822)], 'inscription': [('yareyeben', 192765)]}
21
+
22
+ EPI_RX = re.compile(
23
+ r"^(?:what (?:has|have) (?P<a>[\w'\- ]{2,24}?) (?:done|been doing)"
24
+ r"|what happened (?:with|to) (?P<b>[\w'\- ]{2,24}?))[?.! ]*$", re.I)
25
+ WHO_RX = re.compile(
26
+ r"^who (?:built|made|raised) (?:a |an |the )?(?P<k>[\w \-]{2,24}?)[?.! ]*$", re.I)
27
+
28
+
29
+ class OracleReleaseRuntimeW431(OracleReleaseRuntimeW566):
30
+ """Base + episodic recall. Fires only on bound episodes; else the chain answers."""
31
+
32
+ def chat(self, text: str, session_id: str = "default") -> dict:
33
+ s = " ".join(str(text).strip().split())
34
+ m = EPI_RX.match(s)
35
+ if m:
36
+ actor = (m.group("a") or m.group("b") or "").strip().lower()
37
+ eps = EPI.get(actor)
38
+ if eps:
39
+ bits = "; ".join(f"at tick {t} {v} {o}" for t, v, o in eps[-5:])
40
+ pending = getattr(self, "_pending_conversion", None)
41
+ if pending is None:
42
+ pending = self._pending_conversion = {}
43
+ pending[session_id] = {"construction": "EPISODIC_RECALL",
44
+ "from": s[:80], "to": f"episodes({actor})",
45
+ "produced_by": "oracle_fold_worker_v4"}
46
+ return {"status": "answered", "path": "worker:episodic",
47
+ "response": f"The record holds for {actor}: {bits}. "
48
+ f"[world_ledger_ew2]",
49
+ "provenance": {"kind": "episodic_ledger", "actor": actor,
50
+ "episodes": len(eps)},
51
+ "latency_ms": 1}
52
+ w = WHO_RX.match(s)
53
+ if w:
54
+ kind = w.group("k").strip().lower()
55
+ hits = WHO.get(kind) or WHO.get(kind.rstrip("s"))
56
+ if hits:
57
+ bits = ", ".join(f"{a} (tick {t})" for a, t in hits[-4:])
58
+ return {"status": "answered", "path": "worker:episodic_who",
59
+ "response": f"By the world record, {kind}s were raised by "
60
+ f"{bits}. [world_ledger_ew2]",
61
+ "provenance": {"kind": "episodic_ledger", "object": kind},
62
+ "latency_ms": 1}
63
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w433.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w433 - SELF-IMPROVEMENT fold (epoch 101): the loop speaking from its ledgers.
3
+
4
+ Answers "how do you improve?" / "what did you learn recently?" / "what was refused
5
+ and why?" from the actual admission and rejection records - including refusal REASONS,
6
+ because the read-the-reasons law is now a capability, not just a discipline. Robustness
7
+ is queryable: the bar never falls, refusals are preserved, every step is witnessed.
8
+ Authored 2026-10-21 18:05 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w431."""
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+
14
+ from oracle_release_runtime_w431 import OracleReleaseRuntimeW431
15
+
16
+ RECENT_ADMITS = ['oracle_release_runtime_w431.py admitted', 'oracle_release_runtime_w566.py admitted', 'oracle_release_runtime_w565.py admitted']
17
+ RECENT_REFUSALS = ["oracle_release_runtime_w432.py: [{'name_collision': {'meaning': 'a different module is already admitted under this name; w", "oracle_release_runtime_w567.py: [{'no_gain': 'new-family candidate must raise at least one metric above baseline (epochs a"]
18
+
19
+ HOW_RX = re.compile(r"(how do you (?:improve|learn)|how does your improvement work)", re.I)
20
+ LEARNED_RX = re.compile(r"(what (?:did|have) you learn(?:ed)?( recently)?)", re.I)
21
+ REFUSED_RX = re.compile(r"(what was (?:refused|rejected)( and why)?)", re.I)
22
+
23
+
24
+ class OracleReleaseRuntimeW433(OracleReleaseRuntimeW431):
25
+ """Base + the improvement-ledger routes."""
26
+
27
+ def chat(self, text: str, session_id: str = "default") -> dict:
28
+ s = " ".join(str(text).strip().split())
29
+ if HOW_RX.search(s):
30
+ return {"status": "answered", "path": "worker:self_improve",
31
+ "response": "A worker authors candidate folds from residue - "
32
+ "mined relations, induced templates, world episodes; "
33
+ "a gate measures each on held-out and admits only "
34
+ "no-regression; the bar rises with each admission and "
35
+ "never falls; refusals are preserved with reasons; "
36
+ "every step is witnessed. [improvement_ledger]",
37
+ "provenance": {"kind": "improvement_ledger", "epoch": 101},
38
+ "latency_ms": 1}
39
+ if LEARNED_RX.search(s):
40
+ bits = "; ".join(RECENT_ADMITS[:4]) or "no recent admissions"
41
+ return {"status": "answered", "path": "worker:self_improve",
42
+ "response": f"Recently admitted: {bits}. [improvement_ledger]",
43
+ "provenance": {"kind": "improvement_ledger", "epoch": 101},
44
+ "latency_ms": 1}
45
+ if REFUSED_RX.search(s):
46
+ bits = "; ".join(RECENT_REFUSALS[:3]) or "no recent refusals"
47
+ return {"status": "answered", "path": "worker:self_improve",
48
+ "response": f"Refused, with reasons preserved: {bits}. "
49
+ f"[improvement_ledger]",
50
+ "provenance": {"kind": "improvement_ledger", "epoch": 101},
51
+ "latency_ms": 1}
52
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w435.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w435 - POTENTIALS fold (epoch 102): 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-22 16:45 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w571."""
10
+
11
+ from __future__ import annotations
12
+
13
+ import re
14
+
15
+ from oracle_release_runtime_w571 import OracleReleaseRuntimeW571
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=3789572040.0: where are you going ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0145 w=3718377462.0: what do you believe ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0096 w=2200032120.0: what have you seen out there ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0099 w=2179816032.0: what do you make of this place ? | lacks bounds'}, {'kind': 'vessel', 'name': 'vessel v0142 w=7126230.0: you name this column. what is it called | 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 OracleReleaseRuntimeW435(OracleReleaseRuntimeW571):
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_102]",
36
+ "provenance": {"kind": "potentials_ledger", "epoch": 102,
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_w436.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w436 - SELF-IMPROVEMENT fold (epoch 102): the loop speaking from its ledgers.
3
+
4
+ Answers "how do you improve?" / "what did you learn recently?" / "what was refused
5
+ and why?" from the actual admission and rejection records - including refusal REASONS,
6
+ because the read-the-reasons law is now a capability, not just a discipline. Robustness
7
+ is queryable: the bar never falls, refusals are preserved, every step is witnessed.
8
+ Authored 2026-10-22 18:06 UTC by oracle_fold_worker_v6, chained on oracle_release_runtime_w435."""
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+
14
+ from oracle_release_runtime_w435 import OracleReleaseRuntimeW435
15
+
16
+ RECENT_ADMITS = ['oracle_release_runtime_w435.py admitted']
17
+ RECENT_REFUSALS = ["oracle_release_runtime_w434.py: [{'name_collision': {'meaning': 'a different module is already admitted under this name; w"]
18
+
19
+ HOW_RX = re.compile(r"(how do you (?:improve|learn)|how does your improvement work)", re.I)
20
+ LEARNED_RX = re.compile(r"(what (?:did|have) you learn(?:ed)?( recently)?)", re.I)
21
+ REFUSED_RX = re.compile(r"(what was (?:refused|rejected)( and why)?)", re.I)
22
+
23
+
24
+ class OracleReleaseRuntimeW436(OracleReleaseRuntimeW435):
25
+ """Base + the improvement-ledger routes."""
26
+
27
+ def chat(self, text: str, session_id: str = "default") -> dict:
28
+ s = " ".join(str(text).strip().split())
29
+ if HOW_RX.search(s):
30
+ return {"status": "answered", "path": "worker:self_improve",
31
+ "response": "A worker authors candidate folds from residue - "
32
+ "mined relations, induced templates, world episodes; "
33
+ "a gate measures each on held-out and admits only "
34
+ "no-regression; the bar rises with each admission and "
35
+ "never falls; refusals are preserved with reasons; "
36
+ "every step is witnessed. [improvement_ledger]",
37
+ "provenance": {"kind": "improvement_ledger", "epoch": 102},
38
+ "latency_ms": 1}
39
+ if LEARNED_RX.search(s):
40
+ bits = "; ".join(RECENT_ADMITS[:4]) or "no recent admissions"
41
+ return {"status": "answered", "path": "worker:self_improve",
42
+ "response": f"Recently admitted: {bits}. [improvement_ledger]",
43
+ "provenance": {"kind": "improvement_ledger", "epoch": 102},
44
+ "latency_ms": 1}
45
+ if REFUSED_RX.search(s):
46
+ bits = "; ".join(RECENT_REFUSALS[:3]) or "no recent refusals"
47
+ return {"status": "answered", "path": "worker:self_improve",
48
+ "response": f"Refused, with reasons preserved: {bits}. "
49
+ f"[improvement_ledger]",
50
+ "provenance": {"kind": "improvement_ledger", "epoch": 102},
51
+ "latency_ms": 1}
52
+ return super().chat(s, session_id)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w560.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w560 - CORRECTNESS RELEASE: A POLITE REQUEST IS THE QUESTION IT STANDS FOR (supersedes w559,
3
+ which carried the first half of this rule; w559's checks were clean except a one-turn precheck difference that its
4
+ turn-level diff did not reproduce - 0 turn diffs, 0 panel diffs - so the two halves are submitted together, here).
5
+
6
+ Found by the specialist builder's and composer's end-to-end tests in the Workbench (2026-10-20), where the core answers
7
+ before any user specialist:
8
+ "Could you give me the population of France?" -> clarification ("I didn't fully parse that")
9
+ "I need the boiling point of ethanol, please." -> withheld (it read "need" as the subject)
10
+ "For Peru, what is the capital?" -> withheld by the chat-reply guard
11
+ "Can you tell me the height of Mount Everest?" -> ANSWERED WRONG (a sentence about British people)
12
+ "Could you work out the current given voltage = 9, resistance = 3?"
13
+ -> "You've reached Oracle7, an AI assistant rather than a person or a
14
+ front desk, so I can't do that part myself" (converse>addressed),
15
+ status answered, so the user's specialist never saw the turn
16
+
17
+ The rule. A turn that politely asks for ONE DEFINITE THING is asked as its plain question:
18
+ facts "could/can/would you give/tell/show/find/get me the X of Y", "do you know the X of Y", "I need / I'd like /
19
+ please tell me / tell me / give me the X of Y (please)", "for Y, what is the X" -> "What is the X of Y?"
20
+ workings "could/can/would/will you (please) work out / calculate / compute / figure out / find / determine / estimate
21
+ the X given|for|with|when|if|at|from|using ...", and the same as an imperative -> "What is the X given ...?"
22
+ The definite description is required ("the X"), so "Can you tell me a joke?", "Could you book me a table for two?" and
23
+ "Can you work something out for me?" are never rewritten. Nor is a request for an ACCOUNT rather than a value - the story,
24
+ history, life, plot, meaning, significance, causes, origin, legend or summary of something ("tell me the story of
25
+ gilgamesh" is a request to narrate, not "What is the story of gilgamesh?"; the first check sequence found that turn's
26
+ recorded grounding changed, 2026-10-20).
27
+ The turn gets the plain question's reply, answered or declined - never a different one. (w559 kept the original reply when
28
+ the plain question was declined; probed on the head, that left "Can you tell me the height of Mount Everest?" answered
29
+ wrong while "What is the height of Mount Everest?" is declined, and left the desk reply standing. A request means what its
30
+ question means.) A decline leaves the turn to a specialist. Path marked "polite>"; one chat call, one ledger entry."""
31
+ from __future__ import annotations
32
+
33
+ import re
34
+
35
+ from oracle_release_runtime_w427 import OracleReleaseRuntimeW427 as _Base
36
+
37
+ NP = r"(the\s+[^?.!]{2,80}?\s+of\s+[^?.!]{1,80}?)"
38
+ POLITE = [
39
+ re.compile(r"^\s*(?:could|can|would|will)\s+you\s+(?:please\s+)?(?:give|tell|show|find|get)\s+me\s+%s\s*(?:,?\s*please)?\s*[?.!]*\s*$" % NP, re.I),
40
+ re.compile(r"^\s*(?:do|does)\s+(?:you|anyone)\s+(?:happen\s+to\s+)?know\s+%s\s*[?.!]*\s*$" % NP, re.I),
41
+ re.compile(r"^\s*(?:i\s+(?:need|want|would\s+like|'d\s+like)|please\s+(?:give|tell|show)\s+me|tell\s+me|give\s+me)\s+%s\s*(?:,?\s*please)?\s*[?.!]*\s*$" % NP, re.I),
42
+ ]
43
+ FOR_FORM = re.compile(r"^\s*for\s+([^,?]{2,60}),\s*what\s+is\s+(?:the|its)\s+([^?]{2,60}?)\s*\?\s*$", re.I)
44
+ WORK = r"(?:work\s+out|calculate|compute|figure\s+out|find|determine|estimate)"
45
+ LINK = r"(?:given|for|with|when|if|at|from|using)"
46
+ REQ = [
47
+ re.compile(r"^\s*(?:could|can|would|will)\s+you\s+(?:please\s+)?%s\s+(the\s+[^?.!]{2,60}?)\s+(%s\s+[^?!]{1,200}?)\s*(?:,?\s*please)?\s*[?.!]*\s*$"
48
+ % (WORK, LINK), re.I),
49
+ re.compile(r"^\s*(?:please\s+)?%s\s+(the\s+[^?.!]{2,60}?)\s+(%s\s+[^?!]{1,200}?)\s*(?:,?\s*please)?\s*[?.!]*\s*$" % (WORK, LINK), re.I),
50
+ ]
51
+
52
+
53
+ ACCOUNT = re.compile(r"^the\s+(?:(?:whole|full|real|true|short|brief|entire)\s+)?(?:story|stories|history|histories|life|lives|"
54
+ r"plot|meaning|significance|importance|causes?|effects?|origins?|legend|myth|tale|summary|background|"
55
+ r"biography|events|rest|details|reasons?|explanation|context)\b", re.I)
56
+
57
+
58
+ def plain_question(text):
59
+ """the plain question a polite request for one definite thing stands for, or None"""
60
+ t = str(text or "")
61
+ for rx in POLITE:
62
+ m = rx.match(t)
63
+ if m:
64
+ if ACCOUNT.match(m.group(1).strip()):
65
+ return None # a request to narrate or explain, not for a value
66
+ return "What is %s?" % m.group(1).strip()
67
+ m = FOR_FORM.match(t)
68
+ if m:
69
+ return "What is the %s of %s?" % (m.group(2).strip(), m.group(1).strip())
70
+ for rx in REQ:
71
+ m = rx.match(t)
72
+ if m:
73
+ return "What is %s %s?" % (m.group(1).strip(), m.group(2).strip())
74
+ return None
75
+
76
+
77
+ class OracleReleaseRuntimeW560(_Base):
78
+ def chat(self, text: str, session_id: str = "default") -> dict:
79
+ q2 = plain_question(text)
80
+ if not q2:
81
+ return super().chat(text, session_id)
82
+ r2 = super().chat(q2, session_id)
83
+ if not isinstance(r2, dict):
84
+ return r2
85
+ out = dict(r2)
86
+ out["path"] = "polite>" + str(r2.get("path", ""))
87
+ out["polite"] = {"asked": str(text)[:300], "read_as": q2}
88
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w562.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w562 - CAPABILITY RELEASE (4.1): THE COMPOSED SPECIALISTS.
3
+
4
+ w561 resubmitted unchanged. The gate refused w561 no_gain (2026-10-20 14:42Z): its panels held no calculation the
5
+ composed specialists answer, a true verdict about the instrument. Capability panel v34 added their DEV computations
6
+ (in-sample, disclosed; the out-of-sample measure is PI41), as v33 did for w553.
7
+
8
+ Programs the code composer wrote from worked examples (composer v1, pre-registration v4; composer v2 with units as
9
+ types, pre-registration v5), each wrapped with the release reader organ_formula_v2 (domain from the examples; a missing
10
+ input declined only when one is named) and admitted by the unchanged specialist gate on an exam of new values
11
+ (pre-registration v6), are listed in standing_composed_v1.txt. On the head they are not asked: "What is the ABV for original
12
+ gravity 1.055 and final gravity 1.011?" is withheld.
13
+
14
+ The rule (the star-specialist stage of w552, unchanged in form): when the parent turn did not answer and its decline is not
15
+ one that stands (private, impossible, future, fictional, a false premise, an unknown place or body, half an answer, a
16
+ question about the self), the composed family is asked through the release's own combiner; a reply is kept only when
17
+ exactly one composed specialist answered ("rule": "only"), it did not decline, and every number the question gives moves
18
+ its answer (counterfactual dependence, w553's test). The reply carries the program that computed it.
19
+ The fold imports no runtime other than its parent and changes no module state of any other fold."""
20
+ from __future__ import annotations
21
+
22
+ import importlib.util
23
+ import threading
24
+
25
+ from oracle_release_runtime_w560 import OracleReleaseRuntimeW560 as _Base
26
+
27
+ SPEC_ROOT = __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "/specialists"
28
+ GATE = SPEC_ROOT + "/_gate"
29
+ FAMILY_CODE = GATE + "/combo_runtime_v1.py"
30
+ LIST = "standing_composed_v1"
31
+ STANDS = ("private", "impossible", "future", "fiction", "premise", "unknown_place", "other_body", "half_answer", "identity",
32
+ "self", "act:")
33
+ _S: dict = {}
34
+ _LOCK = threading.Lock()
35
+
36
+
37
+ def _load():
38
+ with _LOCK:
39
+ if "composed" not in _S:
40
+ spec = importlib.util.spec_from_file_location("o7_combo_runtime_v1_w562", FAMILY_CODE)
41
+ mod = importlib.util.module_from_spec(spec)
42
+ spec.loader.exec_module(mod)
43
+ ids = [i for s in open("%s/%s.txt" % (GATE, LIST), encoding="utf-8").read().split() for i in s.split("+")]
44
+ _S["composed"] = (mod.Family(["%s/%s/manifest.json" % (SPEC_ROOT, i) for i in ids], ["%s/%s" % (SPEC_ROOT, i) for i in ids]), mod)
45
+ return _S["composed"]
46
+
47
+
48
+ class OracleReleaseRuntimeW562(_Base):
49
+ def _composed(self, text, session_id, r):
50
+ if any(k in str(r.get("path", "")).lower() for k in STANDS):
51
+ return r
52
+ try:
53
+ fam, mod = _load()
54
+ with _LOCK:
55
+ chosen, trace = fam._one(text, "w562" + str(session_id)[:30])
56
+ if chosen is None or chosen.get("declined") or chosen.get("status") != "answered":
57
+ return r
58
+ if (trace or {}).get("rule") not in (None, "only"):
59
+ return r
60
+ sid = chosen.get("id") or getattr(chosen.get("_organ"), "id", None)
61
+ givens = mod._givens(text)
62
+ if not sid or not givens or fam._dependence(chosen, text, givens) < len(givens):
63
+ return r
64
+ except Exception: # noqa: BLE001 - a specialist failure never breaks the turn; the parent's reply stands
65
+ return r
66
+ out = dict(r)
67
+ out.update(status="answered", response=str(chosen.get("response", "")) + " [%s]" % sid,
68
+ references=chosen.get("references", []),
69
+ path="composed>specialist_call>specialist:%s>%s" % (sid, chosen.get("kind", "")))
70
+ out.pop("why", None)
71
+ return out
72
+
73
+ def chat(self, text: str, session_id: str = "default") -> dict:
74
+ r = super().chat(text, session_id)
75
+ if not isinstance(r, dict) or r.get("status") == "answered":
76
+ return r
77
+ return self._composed(text, session_id, r)
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w563.py ADDED
@@ -0,0 +1,178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w563 - RELEASE 4.1 (RC19): three readings found by release test PI41 on RC18, 2026-10-20.
3
+ Not labelled a correctness release: besides withholding wrong replies it adds answers (part 3), so it must show a gain.
4
+ PI41 is spent and failed one bar; these are fixed with general rules and the next release is examined on a NEW sealed test.
5
+
6
+ 1. A NUMBER READ BACK IS NOT A RESULT (w540 generalised). "What is the exposure value for f-number 9.5 and shutter time
7
+ 1/320?" was answered "1/320" and "Could you calculate the period given a length of -2?" was answered "-2": the maths
8
+ evaluator's whole working was "read <a number the question gave>; then evaluate". w540 withheld this only for a zero.
9
+ Now: when the evaluator's working is exactly one read of a number the worded question itself gives, and nothing else, the
10
+ reply restates the question and is withheld; so is such a reply to a question giving two or more numbers ("What is 3/4 of
11
+ 20?" answered "3/4": the other given was dropped). A question that is only one number's arithmetic is untouched.
12
+ 2. A MEAN NOBODY ASKED FOR. "What is the mean arterial pressure for blood pressure 128/84?" was answered "The mean is 106"
13
+ by the statistics operator, which read "128/84" as a list. A statistics reply is kept only when the question asks for a
14
+ statistic (mean, average, median, mode, sum, total, range, variance, standard deviation, maximum, minimum) of values it
15
+ lists, not as part of a named quantity ("mean arterial pressure", "mean free path", "average speed for ...").
16
+ After 1 or 2 withholds a reply, the composed specialists are asked (w562's own stage), as for any turn the core declined.
17
+ 3. A WORD ANSWER IS AN ANSWER. "Tell me the chemical symbol of gold." was answered by #11 chemistry ("The symbol of Gold (Au)
18
+ is Au, per PubChem") in 4.0; asked as "What is the chemical symbol of gold?" (w560's plain question) the corpus reply was
19
+ rightly withheld (Q3: it never named gold) and the owner-first stage (w553/w554) then refused chemistry's answer because
20
+ its number test counts every "what is the ..." as asking for a number. When a reading decline (unverified, corpus,
21
+ factoid, a verification P-code, Q3 subject-missing) is left, the owning specialist is asked; a reply is kept only when
22
+ exactly one specialist gives it, it does not decline, every given number moves it, and - when the question does not ask
23
+ for a quantity (w511's test: how many/much/..., convert, in <unit>, what is the <area|speed|mass|...>) - it NAMES the
24
+ subject the question asks about ("the <attribute> of <X>": the reply contains X). A quantity question still needs a new
25
+ number, as before. Deliberate declines (private, impossible, future, fiction, premise, unknown place or body, half an
26
+ answer, identity, the G/Q checks other than Q3) stand.
27
+ The fold imports no runtime other than its parent and changes no module state of any other fold."""
28
+ from __future__ import annotations
29
+
30
+ import importlib.util
31
+ import re
32
+ import threading
33
+
34
+ from oracle_release_runtime_w429 import OracleReleaseRuntimeW429 as _Base
35
+
36
+ SPEC_ROOT = __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "/specialists"
37
+ GATE = SPEC_ROOT + "/_gate"
38
+ FAMILY_CODE = GATE + "/combo_runtime_v1.py"
39
+ LISTS = ["standing_v2", "standing_new_v1", "standing_new_v2", "standing_new_v3", "standing_new_v4", "standing_new_v5", "standing_stars_v1",
40
+ "standing_owner_v1"]
41
+ NUM = re.compile(r"(?<![\w.])[-+]?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?(?:\s*/\s*\d+(?:\.\d+)?)?(?![\w.])")
42
+ READ_ONLY = re.compile(r"In steps: read ([-+]?\d[\d,]*(?:\.\d+)?(?:\s*/\s*\d+(?:\.\d+)?)?); then evaluate\.", re.I)
43
+ MATH_PATH = re.compile(r"(^|[>|])organ:math>evaluate")
44
+ STAT_PATH = re.compile(r"(^|[>|])op:statistics")
45
+ STAT_ASKED = re.compile(r"\b(mean|average|median|mode|sum|total|range|variance|standard deviation|maximum|minimum|max|min)\b"
46
+ r"(?!\s+(?:arterial|free|sea|solar|time|speed|velocity|density|temperature|pressure|rate|life|distance))", re.I)
47
+ NAMED_QTY = re.compile(r"\b(mean|average)\s+(?:arterial|free|sea|solar|daily|annual)\b|\baverage\s+(?:speed|velocity|rate)\b", re.I)
48
+ WORDS = re.compile(r"[A-Za-z]{3,}")
49
+ MATH_WORDS = {"what", "is", "the", "evaluate", "compute", "calculate", "simplify", "value", "of", "plus", "minus", "times",
50
+ "divided", "by", "squared", "cubed", "power", "root", "square", "and", "please", "find", "work", "out"}
51
+ READING = re.compile(r"(^|[>|])(unverified:|corpus_query|factoid|precision_guard:P\d|precision_guard:Q3_subject_missing)")
52
+ STANDS = ("private", "impossible", "future", "fiction", "premise", "unknown_place", "other_body", "half_answer", "identity",
53
+ "self", "act:", "precision_guard:G", "precision_guard:Q1", "precision_guard:Q2", "precision_guard:Q4", "precision_guard:Q5")
54
+ QTY = re.compile(r"^\s*(how many|how much|how long|how far|how fast|how old|convert|calculate|compute)\b|"
55
+ r"\bin (?:degrees |square |cubic )?[a-z/]+\s*\?\s*$|"
56
+ r"^\s*what(?:'s| is| was) the (?:kinetic |potential )?(?:area|volume|circumference|perimeter|energy|momentum|force|"
57
+ r"speed|velocity|density|mass|weight|power|resistance|current|pressure|work|cost|price|average|mean|hypotenuse|"
58
+ r"ph|square root|cube root|sum|product|value|temperature|distance|length|height|depth|population|number|age|"
59
+ r"period|frequency|wavelength|half-life|radius|diameter)\b", re.I)
60
+ SUBJECT = re.compile(r"\bthe\s+[a-z][a-z \-]{1,40}?\s+of\s+(?:the\s+|a\s+|an\s+)?([^?.!,]{2,60}?)\s*[?.!]*\s*$", re.I)
61
+ SPEC_IN_PATH = re.compile(r"\bspecialist:([a-z0-9][a-z0-9-]*)")
62
+ _S: dict = {}
63
+ _LOCK = threading.Lock()
64
+
65
+
66
+ def _val(tok):
67
+ t = tok.replace(",", "").replace(" ", "")
68
+ if "/" in t:
69
+ a, b = t.split("/", 1)
70
+ return float(a) / float(b) if float(b) else None
71
+ return float(t)
72
+
73
+
74
+ def _givens(q):
75
+ out = []
76
+ for m in NUM.finditer(q):
77
+ try:
78
+ v = _val(m.group(0))
79
+ except ValueError:
80
+ v = None
81
+ if v is not None:
82
+ out.append(v)
83
+ return out
84
+
85
+
86
+ def read_back_only(q, r):
87
+ """the evaluator's working is one read of a number the worded question gives"""
88
+ if not MATH_PATH.search(str(r.get("path", ""))):
89
+ return False
90
+ m = READ_ONLY.search(str(r.get("response", "")))
91
+ if not m:
92
+ return False
93
+ try:
94
+ v = _val(m.group(1))
95
+ except ValueError:
96
+ return False
97
+ givens = _givens(q)
98
+ if v is None or not any(abs(v - g) <= 1e-9 * max(1.0, abs(g)) for g in givens):
99
+ return False
100
+ if len(givens) >= 2:
101
+ return True # "What is 3/4 of 20?" read as 3/4: another given was dropped
102
+ words = {w.lower() for w in WORDS.findall(q)} - MATH_WORDS
103
+ return bool(words) # a question that is only one number's arithmetic: untouched
104
+
105
+
106
+ def stat_not_asked(q, r):
107
+ if not STAT_PATH.search(str(r.get("path", ""))):
108
+ return False
109
+ return NAMED_QTY.search(q) is not None or STAT_ASKED.search(q) is None
110
+
111
+
112
+ def _load():
113
+ with _LOCK:
114
+ if "owner" not in _S:
115
+ spec = importlib.util.spec_from_file_location("o7_combo_runtime_v1_w563", FAMILY_CODE)
116
+ mod = importlib.util.module_from_spec(spec)
117
+ spec.loader.exec_module(mod)
118
+ ids = []
119
+ for f in LISTS:
120
+ for s in open("%s/%s.txt" % (GATE, f), encoding="utf-8").read().split():
121
+ ids += [m for m in s.split("+") if m not in ids]
122
+ _S["owner"] = (mod.Family(["%s/%s/manifest.json" % (SPEC_ROOT, i) for i in ids], ["%s/%s" % (SPEC_ROOT, i) for i in ids]), mod)
123
+ return _S["owner"]
124
+
125
+
126
+ class OracleReleaseRuntimeW563(_Base):
127
+ def _owner_words(self, q, session_id, r):
128
+ path = str(r.get("path", ""))
129
+ if any(k in path.lower() for k in STANDS) or not READING.search(path):
130
+ return r
131
+ consulted = set(SPEC_IN_PATH.findall(path))
132
+ try:
133
+ fam, mod = _load()
134
+ with _LOCK:
135
+ chosen, trace = fam._one(q, "w563" + str(session_id)[:30])
136
+ if chosen is None or chosen.get("declined") or chosen.get("status") != "answered":
137
+ return r
138
+ if (trace or {}).get("rule") not in ("only", "agree"):
139
+ return r
140
+ sid = chosen.get("id") or getattr(chosen.get("_organ"), "id", None)
141
+ if not sid or sid in consulted:
142
+ return r
143
+ givens = mod._givens(q)
144
+ if givens and fam._dependence(chosen, q, givens) < len(givens):
145
+ return r
146
+ except Exception: # noqa: BLE001 - a specialist failure never breaks the turn; the parent's reply stands
147
+ return r
148
+ resp = str(chosen.get("response", ""))
149
+ if QTY.search(q):
150
+ given = _givens(q)
151
+ if not [v for v in _givens(resp) if not any(abs(v - g) <= 1e-9 * max(1.0, abs(g)) for g in given)]:
152
+ return r
153
+ else:
154
+ m = SUBJECT.search(q)
155
+ if not m or m.group(1).strip().lower() not in resp.lower():
156
+ return r
157
+ out = dict(r)
158
+ out.update(status="answered", response=resp + " [%s]" % sid, references=chosen.get("references", []),
159
+ path="owner_words>specialist_call>specialist:%s>%s" % (sid, chosen.get("kind", "")))
160
+ out.pop("why", None)
161
+ return out
162
+
163
+ def chat(self, text: str, session_id: str = "default") -> dict:
164
+ r = super().chat(text, session_id)
165
+ if not isinstance(r, dict):
166
+ return r
167
+ q = str((r.get("polite") or {}).get("read_as") or text)
168
+ if r.get("status") == "answered" and (read_back_only(q, r) or stat_not_asked(q, r)):
169
+ why = ("the working only reads back a number the question gives" if read_back_only(q, r)
170
+ else "the question asks for no statistic of listed values")
171
+ r = dict(r, status="withheld", path="restated>" + str(r.get("path", "")),
172
+ response="I can't verify an answer to that exact question, so I won't guess (%s)." % why)
173
+ r.pop("references", None)
174
+ r = self._composed(q, session_id, r)
175
+ return r
176
+ if r.get("status") != "answered":
177
+ r = self._owner_words(q, session_id, r)
178
+ return r
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w564.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w564 - CAPABILITY RELEASE (4.5 Reach): the front door opened to the relation store.
3
+
4
+ Most factual questions the core cannot parse were declined before any lookup ("I didn't fully parse that, so I won't
5
+ guess"), and the exact router (w524) only saw turns the core WITHHELD. Here both reach the Reach router
6
+ (wander-train/reach_router_v1.py): admitted patterns (TriviaQA v4 and SimpleQuestions-Wikidata v5, both directions), the
7
+ relation-name rule (a question that names the relation by its Wikidata label or alias), entity_linker_v3 (case-blind
8
+ questions read as names), the subject must HOLD the relation, a one-word name answers only through its most-linked
9
+ reading, a span that is part of a longer unexplained name is refused, the answer's type must fit the question, at most 5
10
+ stored values. Every reply carries its receipt: subject Q-id, property, values - checkable against Wikidata by hand.
11
+ Never overridden: any turn the core answered, the core's deliberate verdicts (does_not_follow, out_of_fragment, network
12
+ validity), clarifications other than the parse receipt, non-questions. When the router has no route, the knowledge
13
+ composer (wander-train/knowledge_composer_v1.py) may answer a plain two-way date comparison ("Which is older, A or B?"), its one
14
+ admitted route. The fold never imports a runtime other than its parent."""
15
+ from oracle_release_runtime_w563 import OracleReleaseRuntimeW563 as _Base
16
+
17
+ try:
18
+ import reach_router_v1 as _RR
19
+ import knowledge_composer_v1 as _KC
20
+ except Exception: # noqa: BLE001 - without the router the fold is exactly its parent
21
+ _RR = _KC = None
22
+
23
+ import re
24
+ import sys as _sys
25
+
26
+ # the composed specialists the core asks (w562's composed stage) are the 4.5 re-wraps cmp3-* (organ_formula_v3: orderings
27
+ # from the worked examples, cited facts about the quantity, cited constants in place of fitted ones), listed in
28
+ # specialists/_gate/standing_composed_v2.txt. w562 reads its list by name on first use; it is reached through sys.modules,
29
+ # as w524 reaches w521.
30
+ _w562 = _sys.modules.get("oracle_release_runtime_w562")
31
+ if _w562 is not None and hasattr(_w562, "LIST") and "composed" not in getattr(_w562, "_S", {}):
32
+ _w562.LIST = "standing_composed_v2"
33
+
34
+ DELIBERATE = ("does_not_follow", "out_of_fragment", "validity")
35
+ PARSE_RECEIPT = "act:clarify|vessel:" # the parse refusal, whichever vessel note it carries
36
+ PARSE_TEXT = "I didn't fully parse that"
37
+ DEFINITION_PATHS = ("factoid", "definitional", "arb:definitional", "unverified:arb:definitional", "corpus_query", "wordnet")
38
+ _ORG: dict = {}
39
+
40
+
41
+ def _composed_reason(text):
42
+ """when a composed specialist (cmp3) reads the question as its own but outside what the quantity can be, its reason"""
43
+ import importlib.util
44
+ import os
45
+ if "organs" not in _ORG:
46
+ _ORG["organs"] = []
47
+ try:
48
+ root = os.environ.get("ORACLE7_ROOT", __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "") + "/specialists"
49
+ ids = open(root + "/_gate/standing_composed_v2.txt", encoding="utf-8").read().split()
50
+ for i in ids:
51
+ d = os.path.join(root, i)
52
+ _sys.path.insert(0, d)
53
+ for m in ("organ_formula_v3", "narrow_v1"):
54
+ _sys.modules.pop(m, None)
55
+ spec = importlib.util.spec_from_file_location("o7_w564_organ_" + i.replace("-", "_"), os.path.join(d, "organ_formula_v3.py"))
56
+ mod = importlib.util.module_from_spec(spec)
57
+ spec.loader.exec_module(mod)
58
+ _ORG["organs"].append(mod.FormulaOrgan())
59
+ _sys.path.remove(d)
60
+ except Exception: # noqa: BLE001 - no reasons, no harm
61
+ _ORG["organs"] = []
62
+ for o in _ORG["organs"]:
63
+ try:
64
+ r = o.answer(text)
65
+ except Exception: # noqa: BLE001
66
+ continue
67
+ if r and r.get("kind") == "out_of_domain":
68
+ return r["response"]
69
+ return None
70
+
71
+
72
+ class OracleReleaseRuntimeW564(_Base):
73
+ def chat(self, text: str, session_id: str = "default") -> dict:
74
+ out = super().chat(text, session_id=session_id)
75
+ if _RR is None or not isinstance(out, dict):
76
+ return out
77
+ st, path = out.get("status"), str(out.get("path", ""))
78
+ if st == "withheld":
79
+ reason = _composed_reason(str(text))
80
+ if reason: # a composed specialist's own reason for declining
81
+ out = dict(out)
82
+ out.update({"response": reason, "path": "composed>out_of_domain", "declined_path": path})
83
+ return out
84
+ parse_refusal = st == "clarification" and path.startswith(PARSE_RECEIPT) and str(out.get("response", "")).startswith(PARSE_TEXT)
85
+ defined = False
86
+ if st == "answered":
87
+ # only a reply from a definition route can be a definition given in place of an answer (gate precheck
88
+ # 2026-10-21: "The pace is 6 minutes per km" and "The median is 27" are computed answers, not definitions)
89
+ first = re.split(r"(?<=[.!?])\s", str(out.get("response", "")), 1)[0]
90
+ if not path.startswith(DEFINITION_PATHS) or re.search(r"\d", first):
91
+ return out
92
+ try:
93
+ defined = _RR.definition_reply(str(text), out.get("response", ""))
94
+ except Exception: # noqa: BLE001
95
+ defined = False
96
+ if not defined:
97
+ return out
98
+ # the reply defined the asked noun instead of answering it for the named thing: not an answer
99
+ out = dict(out)
100
+ out.update({"status": "withheld", "path": path + ">definition_not_answer",
101
+ "response": "I can't verify that from my records, so I won't guess. (My record defines the word asked "
102
+ "about, but does not answer it for what you named.)"})
103
+ path = out["path"]
104
+ elif not (st == "withheld" or parse_refusal):
105
+ return out
106
+ if any(path.endswith(d) for d in DELIBERATE):
107
+ return out
108
+ try:
109
+ a = _RR.answer(str(text))
110
+ if not a:
111
+ c = _KC.answer(str(text))
112
+ if not c:
113
+ return out
114
+ new = dict(out)
115
+ new.update({"status": "answered", "response": "[ev:direct] %s. From the Wikidata relation store: %s." % (c["answer"], c["receipt"]),
116
+ "path": "reach>COMPOSE:%s>LINK>RELATE>COMPARE>READ" % c["route"],
117
+ "references": ["wd:Q%d" % st_["subject_qid"] for st_ in c["steps"]],
118
+ "provenance": {"kind": "knowledge_composer", "route": c["route"], "steps": c["steps"], "declined_path": path,
119
+ "value_qids": ["Q%d" % st_["subject_qid"] for st_ in c["steps"]
120
+ if _RR.label(st_["subject_qid"]) == c["answer"]]}})
121
+ return new
122
+ subj = _RR.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
123
+ plab = _RR._load()["plabel"].get(a["property"]) or "P%d" % a["property"]
124
+ if a["direction"] == "fwd":
125
+ receipt = "%s (Q%d) - %s (P%d) - %s" % (subj, a["subject_qid"], plab, a["property"], a["answer"])
126
+ else:
127
+ receipt = "%s - %s (P%d) - %s (Q%d)" % (a["answer"], plab, a["property"], subj, a["subject_qid"])
128
+ body = "%s. From the Wikidata relation store: %s." % (a["answer"], receipt)
129
+ new = dict(out)
130
+ new.update({"status": "answered", "response": "[ev:direct] " + body,
131
+ "path": "reach>LINK>ROUTE:%s:%s>RELATE:P%d:%s>AGREE>FIT>READ" % (a["route"], a["pattern"], a["property"], a["direction"]),
132
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % a["property"]],
133
+ "provenance": {"kind": "reach_router", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % a["property"],
134
+ "direction": a["direction"], "route": a["route"], "pattern": a["pattern"],
135
+ "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)],
136
+ "declined_path": path}})
137
+ return new
138
+ except Exception: # noqa: BLE001 - a router failure never costs the core's own reply
139
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w565.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w565 - CAPABILITY RELEASE (4.5, pre-registration v12): two fixes PI45 called for.
3
+
4
+ PI45 part C: zodiac years, weekdays and Celsius-to-kelvin questions that the composed specialists answer were turned away
5
+ at the core's front door ("I didn't fully parse that") or withheld before w562's composed stage asked them. Here a turn the
6
+ core turns away at its parse refusal, or withholds, is offered to the composed specialists (cmp3, standing_composed_v2); one
7
+ that reads the question as its own computation answers it, with its program, as the composed stage does.
8
+ PI45 part A/B (full variant, 1.85 times against a bar of 2): the remaining declines are tried by reach_router_v2 =
9
+ reach_router_v1 + patterns mined over SimpleQuestions-Wikidata train AND valid (v6) + the relation FAMILY (a relation the
10
+ named thing does not hold is replaced by the one relation of the same asked word that it does hold) + "how many N" read as
11
+ the stored relation "number of N" + "Y's X's name" read as "Y's X". Developed on spent data only (PI45 part A).
12
+ Never overridden: any turn already answered, the core's deliberate verdicts, clarifications other than the parse refusal,
13
+ non-questions. The fold never imports a runtime other than its parent."""
14
+ import importlib.util
15
+ import os
16
+ import sys as _sys
17
+
18
+ from oracle_release_runtime_w564 import OracleReleaseRuntimeW564 as _Base
19
+
20
+ try:
21
+ import reach_router_v2 as _RR2
22
+ except Exception: # noqa: BLE001 - without the router the fold still offers the composed specialists
23
+ _RR2 = None
24
+
25
+ DELIBERATE = ("does_not_follow", "out_of_fragment", "validity")
26
+ PARSE_RECEIPT = "act:clarify|vessel:"
27
+ PARSE_TEXT = "I didn't fully parse that"
28
+ _ORG: dict = {}
29
+
30
+
31
+ def _organs():
32
+ if "list" not in _ORG:
33
+ _ORG["list"] = []
34
+ try:
35
+ root = os.environ.get("ORACLE7_ROOT", __import__("os").environ.get("ORACLE7_ROOT", "/opt/oracle-clm") + "") + "/specialists"
36
+ for i in open(root + "/_gate/standing_composed_v2.txt", encoding="utf-8").read().split():
37
+ d = os.path.join(root, i)
38
+ _sys.path.insert(0, d)
39
+ for m in ("organ_formula_v3", "narrow_v1"):
40
+ _sys.modules.pop(m, None)
41
+ spec = importlib.util.spec_from_file_location("o7_w565_organ_" + i.replace("-", "_"), os.path.join(d, "organ_formula_v3.py"))
42
+ mod = importlib.util.module_from_spec(spec)
43
+ spec.loader.exec_module(mod)
44
+ _ORG["list"].append((i, mod.FormulaOrgan()))
45
+ _sys.path.remove(d)
46
+ except Exception: # noqa: BLE001
47
+ _ORG["list"] = []
48
+ return _ORG["list"]
49
+
50
+
51
+ class OracleReleaseRuntimeW565(_Base):
52
+ def chat(self, text: str, session_id: str = "default") -> dict:
53
+ out = super().chat(text, session_id=session_id)
54
+ if not isinstance(out, dict):
55
+ return out
56
+ st, path = out.get("status"), str(out.get("path", ""))
57
+ parse_refusal = st == "clarification" and path.startswith(PARSE_RECEIPT) and str(out.get("response", "")).startswith(PARSE_TEXT)
58
+ if not (st == "withheld" or parse_refusal) or any(path.endswith(d) for d in DELIBERATE) or path == "composed>out_of_domain":
59
+ return out
60
+ try:
61
+ for sid, organ in _organs(): # a computation one of the composed specialists reads as its own
62
+ r = organ.answer(str(text))
63
+ if r and r.get("kind") == "compute" and r.get("status") == "answered":
64
+ new = dict(out)
65
+ new.update({"status": "answered", "response": r["response"] + " [%s]" % sid,
66
+ "path": "composed>turned_away>specialist:%s>compute" % sid,
67
+ "provenance": {"kind": "composed_specialist", "specialist": sid, "declined_path": path}})
68
+ return new
69
+ if _RR2 is None:
70
+ return out
71
+ a = _RR2.answer(str(text))
72
+ if not a:
73
+ return out
74
+ subj = _RR2.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
75
+ plab = _RR2._load()["plabel"].get(a["property"]) or "P%d" % a["property"]
76
+ if a["direction"] == "fwd":
77
+ receipt = "%s (Q%d) - %s (P%d) - %s" % (subj, a["subject_qid"], plab, a["property"], a["answer"])
78
+ else:
79
+ receipt = "%s - %s (P%d) - %s (Q%d)" % (a["answer"], plab, a["property"], subj, a["subject_qid"])
80
+ new = dict(out)
81
+ new.update({"status": "answered", "response": "[ev:direct] %s. From the Wikidata relation store: %s." % (a["answer"], receipt),
82
+ "path": "reach>v2>LINK>ROUTE:%s:%s>RELATE:P%d:%s>AGREE>FIT>READ" % (a["route"], a["pattern"], a["property"], a["direction"]),
83
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % a["property"]],
84
+ "provenance": {"kind": "reach_router_v2", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % a["property"],
85
+ "direction": a["direction"], "route": a["route"], "pattern": a["pattern"],
86
+ "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)], "declined_path": path}})
87
+ return new
88
+ except Exception: # noqa: BLE001 - a failure never costs the core's own reply
89
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w566.py ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w566 - CAPABILITY RELEASE (4.6, pre-registration v12 amendment 1): "Who founded Microsoft?" was
3
+ declined ("I can't verify the starter of Microsoft from my records"), though the relation store holds Microsoft's founders.
4
+ The question's verb names the relation: by its passive ("founded by", "written by", "painted by") or by its agent noun
5
+ ("founder", "writer", "painter"). On a turn the core still withholds or turns away at its parse refusal, reach_router_v3 (v2 +
6
+ this AGENT route) reads "Who <verb>ed Y?" as those relations; the named thing must hold exactly one of them, and the answer
7
+ must be a person or an organisation. Examined before use on TriviaQA train and Mintaka train/dev (data it was not built
8
+ from): right 93.2% and 91.8% on the two md5 halves, 59 and 73 answers.
9
+ Never overridden: any turn already answered, the core's deliberate verdicts, clarifications other than the parse refusal,
10
+ a composed specialist's out-of-domain reason. The fold never imports a runtime other than its parent."""
11
+ from oracle_release_runtime_w565 import OracleReleaseRuntimeW565 as _Base
12
+
13
+ try:
14
+ import reach_router_v3 as _RR3
15
+ except Exception: # noqa: BLE001 - without the router the fold is exactly its parent
16
+ _RR3 = None
17
+
18
+ DELIBERATE = ("does_not_follow", "out_of_fragment", "validity")
19
+ PARSE_RECEIPT = "act:clarify|vessel:"
20
+ PARSE_TEXT = "I didn't fully parse that"
21
+
22
+
23
+ class OracleReleaseRuntimeW566(_Base):
24
+ def chat(self, text: str, session_id: str = "default") -> dict:
25
+ out = super().chat(text, session_id=session_id)
26
+ if _RR3 is None or not isinstance(out, dict):
27
+ return out
28
+ st, path = out.get("status"), str(out.get("path", ""))
29
+ parse_refusal = st == "clarification" and path.startswith(PARSE_RECEIPT) and str(out.get("response", "")).startswith(PARSE_TEXT)
30
+ if not (st == "withheld" or parse_refusal) or any(path.endswith(d) for d in DELIBERATE) or path == "composed>out_of_domain":
31
+ return out
32
+ try:
33
+ if not _RR3.AGENT.match(str(text).strip()):
34
+ return out
35
+ a = _RR3.answer(str(text))
36
+ if not a or a.get("route") != "agent":
37
+ return out
38
+ subj = _RR3.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
39
+ plab = _RR3._load()["plabel"].get(a["property"]) or "P%d" % a["property"]
40
+ new = dict(out)
41
+ new.update({"status": "answered",
42
+ "response": "[ev:direct] %s. From the Wikidata relation store: %s (Q%d) - %s (P%d) - %s." % (
43
+ a["answer"], subj, a["subject_qid"], plab, a["property"], a["answer"]),
44
+ "path": "reach>v3>LINK>ROUTE:%s>RELATE:P%d:fwd>AGREE>FIT>READ" % (a["pattern"], a["property"]),
45
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % a["property"]],
46
+ "provenance": {"kind": "reach_router_v3", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % a["property"],
47
+ "direction": "fwd", "route": "agent", "pattern": a["pattern"],
48
+ "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)], "declined_path": path}})
49
+ return new
50
+ except Exception: # noqa: BLE001 - a failure never costs the core's own reply
51
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w568.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w568 - CORRECTNESS RELEASE (4.8, the reading release, pre-registration v14 amendment 3): a reply must
3
+ answer what the question asks. Found on 4.8's development set (dev48: NQ-open and WebQuestions train questions with gold),
4
+ where 4.7 was right on 132 of 303 answers:
5
+ ASKED RELATION "Where is Jefferson Davis buried?" was answered with the sentence saying where he was born. A where-question
6
+ answered by a sentence (deliberation, text reader) must say the relation asked - its verb or asked noun, or
7
+ a word that says the same relation; otherwise the reply is withheld with that reason.
8
+ NOT AN ANSWER "Who starred in the original My Fair Lady?" was answered "In simple terms: My Fair Lady is a musical." A
9
+ who / where / when / which / how-many question is not answered by an explanation, a definition, a
10
+ timeline, a comparison or a numbered list.
11
+ (dev48 replay: 43 wrong answers withheld, 8 right ones - most of them right by luck, e.g. "Where does Don King live?"
12
+ answered with where he was born; precision 0.436 -> 0.492)
13
+ TITLE "Who sang the song This Girl Is on Fire?" was linked to a song called "Fire". In "Who sings / wrote /
14
+ composed / directed / produced <title>?" the title is everything after the verb, only a thing named by the
15
+ WHOLE title answers, and the verb with the kind of work names the relation (title_route_v1: sing ->
16
+ performer; lyrics -> lyricist; a song -> lyricist then composer; a book -> author; music or a score ->
17
+ composer; direct -> director). Its answer replaces a reply that names none of its values.
18
+ (dev48: 14 declined questions now right, 4 now wrong - 3 of them right answers the text rule misses, such
19
+ as "Bruce Springsteen" against "American rock artist Bruce Springsteen"; all rules together, replayed:
20
+ right 132 -> 138, wrong 171 -> 132)
21
+ WORK PLACE "Where was X filmed?" answered with the film's country of origin (P495), or "where did it take place"
22
+ with a painting's museum (P276), is answered by the relation asked (filming location P915, recording
23
+ location P483, narrative location P840) when the store holds it with at most 5 values, else declined.
24
+ FOUNDER on the full variant "Who founded Microsoft?" was answered "BASIC" by the text reader; when the AGENT route
25
+ has the relation store's answer and the text answer leads with none of its values, the store's answer
26
+ replaces it.
27
+ Never overridden: any turn the rules do not name. The fold never imports a runtime other than its parent, w433 (the
28
+ self-loop's fold worker admitted w431 and w433 on w566 at 18:27 UTC; pre-registration v14 amendment 4)."""
29
+ import re
30
+
31
+ from oracle_release_runtime_w433 import OracleReleaseRuntimeW433 as _Base
32
+
33
+ try:
34
+ import entity_linker_v3 as _L
35
+ import grow_router_v1 as _G
36
+ import reach_router_v3 as _RR3
37
+ import reading_v1 as _RD
38
+ import title_route_v1 as _T
39
+ except Exception: # noqa: BLE001 - without its modules the fold is exactly its parent
40
+ _RD = None
41
+
42
+ WHERE_WORK = re.compile(r"^\s*where\s+(?:was|were|is|are|did|does|do)\b.*\b(?P<v>filmed|filming|shot|recorded|set|takes?\s+place|took\s+place)\b", re.I)
43
+ WORK_REL = {"filmed": 915, "filming": 915, "shot": 915, "recorded": 483}
44
+ WRONG_PLACE = re.compile(r"(?:RELATE|place):P(?:495|276)\b|:P(?:495|276):")
45
+ TEXT_PATHS = re.compile(r"(^|[>|])(verified:cube|factoid:page|corpus)")
46
+
47
+
48
+ class OracleReleaseRuntimeW568(_Base):
49
+ def _agent_over_text(self, text, out):
50
+ if out.get("status") != "answered" or not TEXT_PATHS.search(str(out.get("path", ""))) or not _RR3.AGENT.match(str(text).strip()):
51
+ return None
52
+ a = _RR3.answer(str(text))
53
+ if not a or a.get("route") != "agent":
54
+ return None
55
+ resp = re.sub(r"^\s*\[ev:[a-z_]+\]\s*", "", str(out.get("response", "")))
56
+ lead = " %s " % _L.norm(re.split(r"(?<!\b[A-Z])\.\s", resp + " ", 1)[0])
57
+ if any((" %s " % _L.norm(v)) in lead for v in a["values"]):
58
+ return None
59
+ subj = _RR3.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
60
+ plab = _RR3._load()["plabel"].get(a["property"]) or "P%d" % a["property"]
61
+ new = dict(out)
62
+ new.update({"response": "[ev:direct] %s. From the Wikidata relation store: %s (Q%d) - %s (P%d) - %s." % (
63
+ a["answer"], subj, a["subject_qid"], plab, a["property"], a["answer"]),
64
+ "path": "reach>v3>LINK>ROUTE:%s>RELATE:P%d:fwd>AGREE>FIT>READ>over_text" % (a["pattern"], a["property"]),
65
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % a["property"]],
66
+ "provenance": {"kind": "reach_router_v3", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % a["property"],
67
+ "direction": "fwd", "route": "agent", "pattern": a["pattern"],
68
+ "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)],
69
+ "replaced_path": str(out.get("path", ""))[:120]}})
70
+ return new
71
+
72
+ def _work_place(self, text, out):
73
+ m = WHERE_WORK.match(str(text))
74
+ if not m or out.get("status") != "answered" or not WRONG_PLACE.search(str(out.get("path", ""))):
75
+ return None
76
+ p = WORK_REL.get(m.group("v").lower(), 840)
77
+ for span, cands in _L.link(str(text), 3)[:3]:
78
+ a = _G.answer_via(text, span, p, "fwd", cands)
79
+ if a:
80
+ subj = _RR3.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
81
+ plab = _RR3._load()["plabel"].get(p) or "P%d" % p
82
+ new = dict(out)
83
+ new.update({"response": "[ev:direct] %s. From the Wikidata relation store: %s (Q%d) - %s (P%d) - %s." % (
84
+ a["answer"], subj, a["subject_qid"], plab, p, a["answer"]),
85
+ "path": "work_place>P%d>LINK>RELATE:P%d:fwd>AGREE>FIT>READ" % (p, p),
86
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % p],
87
+ "provenance": {"kind": "work_place_v1", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % p,
88
+ "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)],
89
+ "replaced_path": str(out.get("path", ""))[:120]}})
90
+ return new
91
+ new = dict(out)
92
+ new.update({"status": "withheld", "path": "work_place>declined>P%d" % p, "references": [], "provenance": {},
93
+ "response": "I can't verify where that was %s from my records: what I hold is where it comes from, which is "
94
+ "not the same thing, so I won't guess." % ("filmed" if p == 915 else "recorded" if p == 483 else "set")})
95
+ return new
96
+
97
+ def _title(self, text, out):
98
+ if not _T.Q.match(str(text)):
99
+ return None
100
+ a = _T.answer(str(text))
101
+ if not a:
102
+ return None
103
+ said = " %s " % _L.norm(str(out.get("response", "")))
104
+ if out.get("status") == "answered" and any((" %s " % _L.norm(v)) in said for v in a["values"]):
105
+ return None # the reply already names the title's answer
106
+ subj = _RR3.label(a["subject_qid"]) or "Q%d" % a["subject_qid"]
107
+ plab = _RR3._load()["plabel"].get(a["property"]) or "P%d" % a["property"]
108
+ new = dict(out)
109
+ new.update({"status": "answered",
110
+ "response": "[ev:direct] %s. From the Wikidata relation store: %s (Q%d) - %s (P%d) - %s." % (
111
+ a["answer"], subj, a["subject_qid"], plab, a["property"], a["answer"]),
112
+ "path": "reading>title>LINK:whole_title>RELATE:P%d:fwd>AGREE>FIT>READ" % a["property"],
113
+ "references": ["wd:Q%d" % a["subject_qid"], "wd:P%d" % a["property"]],
114
+ "provenance": {"kind": "title_route_v1", "subject_qid": "Q%d" % a["subject_qid"], "property": "P%d" % a["property"],
115
+ "direction": "fwd", "value_qids": ["Q%d" % x for x in a.get("raw", []) if isinstance(x, int)],
116
+ "replaced_path": str(out.get("path", ""))[:120]}})
117
+ return new
118
+
119
+ def _reading(self, text, out):
120
+ if out.get("status") != "answered":
121
+ return None
122
+ path, reply = str(out.get("path", "")), str(out.get("response", ""))
123
+ why = _RD.not_an_answer(str(text), path)
124
+ if not why:
125
+ sp = _L.link(str(text), 3)[:1]
126
+ why = _RD.asked_relation(str(text), path, reply, set(_L.norm(sp[0][0]).split()) if sp else set())
127
+ if not why:
128
+ return None
129
+ new = dict(out)
130
+ new.update({"status": "withheld", "path": "reading>withheld>" + path[:80], "references": [], "provenance": {"withheld_reply": reply[:300]},
131
+ "response": "I found something in my records, but it does not answer what you asked (%s), so I won't answer "
132
+ "from it." % why})
133
+ return new
134
+
135
+ def chat(self, text: str, session_id: str = "default") -> dict:
136
+ out = super().chat(text, session_id=session_id)
137
+ if _RD is None or not isinstance(out, dict):
138
+ return out
139
+ for rule in (self._agent_over_text, self._work_place, self._title, self._reading):
140
+ try:
141
+ w = rule(text, out)
142
+ except Exception: # noqa: BLE001 - a failure never costs the core's own reply
143
+ w = None
144
+ if w is not None:
145
+ return w
146
+ return out
root/fable-content/oracle-m-series-2026-08-15/self_loop/admitted/oracle_release_runtime_w571.py ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """oracle_release_runtime_w571 - CORRECTNESS RELEASE (4.8, pre-registration v17): w570 failed its sealed test PI48c - three false
3
+ premises with no genre word after the owner ("Who painted Rembrandt's Sunflowers?") got through, and "the Christian name of
4
+ the wife of Robert Schumann" was withheld as if "Christian" were a second person. premise_v3: the owner rule also reads
5
+ "Who <made> N's X?"; the WITH rule only where the question joins people ("with X", "A and B"). w570 was: w569's premise
6
+ checks, narrowed after the gate
7
+ refused w569 for withholding right answers on its frozen panel (premise_v2: only on a single, direct question - never a
8
+ reading passage; not the WITH rule on a comparison such as "Who is younger, A or B?"; a year more than 10 off, not a slip such
9
+ as a novel dated by its film). w569 was: a relation answer is not given when the
10
+ question's own premise contradicts it. PI48 (spent) found the full release answering three questions that must be declined
11
+ with a true fact that ignores the premise:
12
+ OWNER "Who composed Bach's Symphony No. 9?" -> Beethoven: a who-question about N's work is not answered by someone else
13
+ WITH "Which band did Chopin form with Freddie Mercury?" -> Queen: every person the question names must be connected to
14
+ the answer in the relation store (people named side by side are one name)
15
+ YEAR "Who directed the 1850 film Hamlet?" -> Laurence Olivier: the year next to a work must be that work's year
16
+ (premise_v1; replayed on PI48's recorded replies: the full release's 3 such answers and the slim release's 2 are withheld,
17
+ and no other answer on either variant, nor any on dev48.) The reply says which premise does not hold.
18
+ Never overridden: any turn the premise checks do not name. The fold never imports a runtime other than its parent, w568."""
19
+ from oracle_release_runtime_w568 import OracleReleaseRuntimeW568 as _Base
20
+
21
+ try:
22
+ import premise_v3 as _P
23
+ except Exception: # noqa: BLE001 - without its module the fold is exactly its parent
24
+ _P = None
25
+
26
+
27
+ class OracleReleaseRuntimeW571(_Base):
28
+ def chat(self, text: str, session_id: str = "default") -> dict:
29
+ out = super().chat(text, session_id=session_id)
30
+ if _P is None or not isinstance(out, dict) or out.get("status") != "answered":
31
+ return out
32
+ try:
33
+ prov = out.get("provenance") if isinstance(out.get("provenance"), dict) else {}
34
+ why = _P.check(str(text), str(out.get("response", "")), prov.get("value_qids") or [])
35
+ except Exception: # noqa: BLE001 - a failure never costs the core's own reply
36
+ return out
37
+ if not why:
38
+ return out
39
+ new = dict(out)
40
+ new.update({"status": "withheld", "path": "premise>withheld>" + str(out.get("path", ""))[:80], "references": [],
41
+ "provenance": {"withheld_reply": str(out.get("response", ""))[:300]},
42
+ "response": "I can't answer that as asked: %s. So the question's premise does not hold in my records, and I "
43
+ "won't answer it as if it did." % why})
44
+ return new
root/relstore/prop_aliases_v1.json ADDED
The diff for this file is too large to render. See raw diff
 
root/relstore/router_patterns_v5.json ADDED
@@ -0,0 +1,555 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "-|female": [
3
+ 21,
4
+ 1.0,
5
+ 1.0,
6
+ 127,
7
+ "fwd"
8
+ ],
9
+ "-|male": [
10
+ 21,
11
+ 1.0,
12
+ 1.0,
13
+ 137,
14
+ "fwd"
15
+ ],
16
+ "city|born": [
17
+ 19,
18
+ 0.962,
19
+ 0.928,
20
+ 122,
21
+ "fwd"
22
+ ],
23
+ "city|die": [
24
+ 20,
25
+ 0.966,
26
+ 0.944,
27
+ 65,
28
+ "fwd"
29
+ ],
30
+ "conflict|conflict": [
31
+ 607,
32
+ 1.0,
33
+ 1.0,
34
+ 21,
35
+ "fwd"
36
+ ],
37
+ "country|*": [
38
+ 495,
39
+ 0.906,
40
+ 0.993,
41
+ 314,
42
+ "fwd"
43
+ ],
44
+ "country|filmed": [
45
+ 495,
46
+ 0.98,
47
+ 1.0,
48
+ 98,
49
+ "fwd"
50
+ ],
51
+ "country|located": [
52
+ 17,
53
+ 0.909,
54
+ 0.929,
55
+ 25,
56
+ "fwd"
57
+ ],
58
+ "country|movie": [
59
+ 495,
60
+ 0.923,
61
+ 1.0,
62
+ 21,
63
+ "fwd"
64
+ ],
65
+ "country|origin": [
66
+ 495,
67
+ 1.0,
68
+ 1.0,
69
+ 20,
70
+ "fwd"
71
+ ],
72
+ "gender|*": [
73
+ 21,
74
+ 1.0,
75
+ 1.0,
76
+ 386,
77
+ "fwd"
78
+ ],
79
+ "gender|gender": [
80
+ 21,
81
+ 1.0,
82
+ 1.0,
83
+ 490,
84
+ "fwd"
85
+ ],
86
+ "genre|*": [
87
+ 136,
88
+ 0.901,
89
+ 0.914,
90
+ 141,
91
+ "fwd"
92
+ ],
93
+ "genre|album": [
94
+ 136,
95
+ 0.929,
96
+ 1.0,
97
+ 28,
98
+ "fwd"
99
+ ],
100
+ "group|*": [
101
+ 196,
102
+ 1.0,
103
+ 1.0,
104
+ 21,
105
+ "fwd"
106
+ ],
107
+ "group|group": [
108
+ 196,
109
+ 1.0,
110
+ 1.0,
111
+ 22,
112
+ "fwd"
113
+ ],
114
+ "instrument|instrument": [
115
+ 1303,
116
+ 0.906,
117
+ 0.929,
118
+ 60,
119
+ "fwd"
120
+ ],
121
+ "kind|music": [
122
+ 136,
123
+ 0.973,
124
+ 0.925,
125
+ 77,
126
+ "fwd"
127
+ ],
128
+ "kind|object": [
129
+ 31,
130
+ 0.95,
131
+ 0.9,
132
+ 40,
133
+ "fwd"
134
+ ],
135
+ "label|*": [
136
+ 264,
137
+ 0.938,
138
+ 0.933,
139
+ 31,
140
+ "fwd"
141
+ ],
142
+ "label|label": [
143
+ 264,
144
+ 0.969,
145
+ 0.96,
146
+ 57,
147
+ "fwd"
148
+ ],
149
+ "language|*": [
150
+ 364,
151
+ 0.983,
152
+ 0.957,
153
+ 262,
154
+ "fwd"
155
+ ],
156
+ "language|filmed": [
157
+ 364,
158
+ 1.0,
159
+ 1.0,
160
+ 31,
161
+ "fwd"
162
+ ],
163
+ "language|language": [
164
+ 364,
165
+ 0.982,
166
+ 0.957,
167
+ 357,
168
+ "fwd"
169
+ ],
170
+ "language|spoken": [
171
+ 364,
172
+ 1.0,
173
+ 0.933,
174
+ 80,
175
+ "fwd"
176
+ ],
177
+ "language|used": [
178
+ 364,
179
+ 1.0,
180
+ 1.0,
181
+ 32,
182
+ "fwd"
183
+ ],
184
+ "mode|*": [
185
+ 404,
186
+ 1.0,
187
+ 1.0,
188
+ 17,
189
+ "fwd"
190
+ ],
191
+ "mode|mode": [
192
+ 404,
193
+ 1.0,
194
+ 1.0,
195
+ 17,
196
+ "fwd"
197
+ ],
198
+ "nationality|*": [
199
+ 27,
200
+ 0.968,
201
+ 0.948,
202
+ 191,
203
+ "fwd"
204
+ ],
205
+ "nationality|nationality": [
206
+ 27,
207
+ 0.967,
208
+ 0.953,
209
+ 249,
210
+ "fwd"
211
+ ],
212
+ "nation|*": [
213
+ 27,
214
+ 1.0,
215
+ 0.917,
216
+ 27,
217
+ "fwd"
218
+ ],
219
+ "nation|nation": [
220
+ 27,
221
+ 1.0,
222
+ 0.941,
223
+ 36,
224
+ "fwd"
225
+ ],
226
+ "place|birth": [
227
+ 19,
228
+ 0.923,
229
+ 1.0,
230
+ 30,
231
+ "fwd"
232
+ ],
233
+ "position|*": [
234
+ 413,
235
+ 0.987,
236
+ 0.965,
237
+ 294,
238
+ "fwd"
239
+ ],
240
+ "position|baseball": [
241
+ 413,
242
+ 0.955,
243
+ 0.938,
244
+ 38,
245
+ "fwd"
246
+ ],
247
+ "position|football": [
248
+ 413,
249
+ 0.939,
250
+ 0.955,
251
+ 132,
252
+ "fwd"
253
+ ],
254
+ "position|play": [
255
+ 413,
256
+ 0.993,
257
+ 0.971,
258
+ 284,
259
+ "fwd"
260
+ ],
261
+ "position|position": [
262
+ 413,
263
+ 0.985,
264
+ 0.967,
265
+ 375,
266
+ "fwd"
267
+ ],
268
+ "position|soccer": [
269
+ 413,
270
+ 1.0,
271
+ 1.0,
272
+ 49,
273
+ "fwd"
274
+ ],
275
+ "profession|*": [
276
+ 106,
277
+ 1.0,
278
+ 1.0,
279
+ 50,
280
+ "fwd"
281
+ ],
282
+ "profession|profession": [
283
+ 106,
284
+ 1.0,
285
+ 0.967,
286
+ 60,
287
+ "fwd"
288
+ ],
289
+ "religion|*": [
290
+ 140,
291
+ 1.0,
292
+ 1.0,
293
+ 44,
294
+ "fwd"
295
+ ],
296
+ "religion|practice": [
297
+ 140,
298
+ 1.0,
299
+ 1.0,
300
+ 27,
301
+ "fwd"
302
+ ],
303
+ "religion|religion": [
304
+ 140,
305
+ 1.0,
306
+ 0.971,
307
+ 58,
308
+ "fwd"
309
+ ],
310
+ "sex|*": [
311
+ 21,
312
+ 0.972,
313
+ 1.0,
314
+ 65,
315
+ "fwd"
316
+ ],
317
+ "sex|sex": [
318
+ 21,
319
+ 0.972,
320
+ 1.0,
321
+ 66,
322
+ "fwd"
323
+ ],
324
+ "state|state": [
325
+ 19,
326
+ 1.0,
327
+ 0.917,
328
+ 22,
329
+ "fwd"
330
+ ],
331
+ "war|*": [
332
+ 607,
333
+ 1.0,
334
+ 1.0,
335
+ 45,
336
+ "fwd"
337
+ ],
338
+ "war|participate": [
339
+ 607,
340
+ 1.0,
341
+ 1.0,
342
+ 33,
343
+ "fwd"
344
+ ],
345
+ "war|war": [
346
+ 607,
347
+ 1.0,
348
+ 1.0,
349
+ 47,
350
+ "fwd"
351
+ ],
352
+ "what|gameplay": [
353
+ 404,
354
+ 1.0,
355
+ 1.0,
356
+ 40,
357
+ "fwd"
358
+ ],
359
+ "what|gender": [
360
+ 21,
361
+ 1.0,
362
+ 1.0,
363
+ 32,
364
+ "fwd"
365
+ ],
366
+ "what|language": [
367
+ 364,
368
+ 0.952,
369
+ 0.933,
370
+ 36,
371
+ "fwd"
372
+ ],
373
+ "what|mode": [
374
+ 404,
375
+ 1.0,
376
+ 1.0,
377
+ 43,
378
+ "fwd"
379
+ ],
380
+ "what|orbit": [
381
+ 397,
382
+ 1.0,
383
+ 1.0,
384
+ 28,
385
+ "fwd"
386
+ ],
387
+ "what|position": [
388
+ 413,
389
+ 0.909,
390
+ 0.917,
391
+ 23,
392
+ "fwd"
393
+ ],
394
+ "where|*": [
395
+ 19,
396
+ 0.954,
397
+ 0.925,
398
+ 792,
399
+ "fwd"
400
+ ],
401
+ "where|away": [
402
+ 20,
403
+ 0.98,
404
+ 0.914,
405
+ 85,
406
+ "fwd"
407
+ ],
408
+ "where|birth": [
409
+ 19,
410
+ 0.952,
411
+ 0.952,
412
+ 42,
413
+ "fwd"
414
+ ],
415
+ "where|born": [
416
+ 19,
417
+ 0.968,
418
+ 0.957,
419
+ 610,
420
+ "fwd"
421
+ ],
422
+ "where|buried": [
423
+ 119,
424
+ 1.0,
425
+ 0.929,
426
+ 26,
427
+ "fwd"
428
+ ],
429
+ "where|die": [
430
+ 20,
431
+ 0.957,
432
+ 0.966,
433
+ 341,
434
+ "fwd"
435
+ ],
436
+ "where|discovered": [
437
+ 65,
438
+ 1.0,
439
+ 1.0,
440
+ 32,
441
+ "fwd"
442
+ ],
443
+ "where|filmed": [
444
+ 495,
445
+ 1.0,
446
+ 1.0,
447
+ 22,
448
+ "fwd"
449
+ ],
450
+ "where|given": [
451
+ 19,
452
+ 1.0,
453
+ 1.0,
454
+ 22,
455
+ "fwd"
456
+ ],
457
+ "where|pass": [
458
+ 20,
459
+ 0.981,
460
+ 0.925,
461
+ 93,
462
+ "fwd"
463
+ ],
464
+ "where|take": [
465
+ 276,
466
+ 1.0,
467
+ 1.0,
468
+ 19,
469
+ "fwd"
470
+ ],
471
+ "which|album": [
472
+ 175,
473
+ 0.941,
474
+ 0.952,
475
+ 38,
476
+ "fwd"
477
+ ],
478
+ "who|after": [
479
+ 138,
480
+ 0.941,
481
+ 1.0,
482
+ 27,
483
+ "fwd"
484
+ ],
485
+ "who|author": [
486
+ 50,
487
+ 1.0,
488
+ 1.0,
489
+ 39,
490
+ "fwd"
491
+ ],
492
+ "who|authored": [
493
+ 50,
494
+ 1.0,
495
+ 1.0,
496
+ 20,
497
+ "fwd"
498
+ ],
499
+ "who|born": [
500
+ 19,
501
+ 1.0,
502
+ 1.0,
503
+ 21,
504
+ "inv"
505
+ ],
506
+ "who|child": [
507
+ 40,
508
+ 0.933,
509
+ 1.0,
510
+ 28,
511
+ "fwd"
512
+ ],
513
+ "who|cinematographer": [
514
+ 344,
515
+ 1.0,
516
+ 1.0,
517
+ 16,
518
+ "fwd"
519
+ ],
520
+ "who|cinematography": [
521
+ 344,
522
+ 1.0,
523
+ 1.0,
524
+ 17,
525
+ "fwd"
526
+ ],
527
+ "who|directed": [
528
+ 57,
529
+ 0.908,
530
+ 0.938,
531
+ 141,
532
+ "fwd"
533
+ ],
534
+ "who|parent": [
535
+ 40,
536
+ 1.0,
537
+ 1.0,
538
+ 26,
539
+ "inv"
540
+ ],
541
+ "who|published": [
542
+ 123,
543
+ 1.0,
544
+ 0.938,
545
+ 26,
546
+ "fwd"
547
+ ],
548
+ "who|publisher": [
549
+ 123,
550
+ 1.0,
551
+ 1.0,
552
+ 20,
553
+ "fwd"
554
+ ]
555
+ }
root/relstore/router_patterns_v6.json ADDED
@@ -0,0 +1,632 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "-|female": [
3
+ 21,
4
+ 1.0,
5
+ 1.0,
6
+ 152,
7
+ "fwd"
8
+ ],
9
+ "-|male": [
10
+ 21,
11
+ 1.0,
12
+ 1.0,
13
+ 163,
14
+ "fwd"
15
+ ],
16
+ "city|born": [
17
+ 19,
18
+ 0.967,
19
+ 0.937,
20
+ 139,
21
+ "fwd"
22
+ ],
23
+ "city|die": [
24
+ 20,
25
+ 0.971,
26
+ 0.953,
27
+ 77,
28
+ "fwd"
29
+ ],
30
+ "city|pass": [
31
+ 20,
32
+ 1.0,
33
+ 0.9,
34
+ 22,
35
+ "fwd"
36
+ ],
37
+ "conflict|*": [
38
+ 607,
39
+ 1.0,
40
+ 1.0,
41
+ 20,
42
+ "fwd"
43
+ ],
44
+ "conflict|conflict": [
45
+ 607,
46
+ 1.0,
47
+ 1.0,
48
+ 26,
49
+ "fwd"
50
+ ],
51
+ "country|*": [
52
+ 495,
53
+ 0.923,
54
+ 0.994,
55
+ 341,
56
+ "fwd"
57
+ ],
58
+ "country|come": [
59
+ 495,
60
+ 0.929,
61
+ 1.0,
62
+ 23,
63
+ "fwd"
64
+ ],
65
+ "country|filmed": [
66
+ 495,
67
+ 0.983,
68
+ 1.0,
69
+ 114,
70
+ "fwd"
71
+ ],
72
+ "country|origin": [
73
+ 495,
74
+ 1.0,
75
+ 0.909,
76
+ 26,
77
+ "fwd"
78
+ ],
79
+ "gender|*": [
80
+ 21,
81
+ 1.0,
82
+ 1.0,
83
+ 431,
84
+ "fwd"
85
+ ],
86
+ "gender|gender": [
87
+ 21,
88
+ 1.0,
89
+ 1.0,
90
+ 552,
91
+ "fwd"
92
+ ],
93
+ "genre|*": [
94
+ 136,
95
+ 0.92,
96
+ 0.912,
97
+ 168,
98
+ "fwd"
99
+ ],
100
+ "genre|album": [
101
+ 136,
102
+ 0.933,
103
+ 1.0,
104
+ 31,
105
+ "fwd"
106
+ ],
107
+ "group|*": [
108
+ 196,
109
+ 1.0,
110
+ 1.0,
111
+ 25,
112
+ "fwd"
113
+ ],
114
+ "group|asteroid": [
115
+ 196,
116
+ 1.0,
117
+ 1.0,
118
+ 21,
119
+ "fwd"
120
+ ],
121
+ "group|group": [
122
+ 196,
123
+ 1.0,
124
+ 1.0,
125
+ 27,
126
+ "fwd"
127
+ ],
128
+ "instrument|instrument": [
129
+ 1303,
130
+ 0.919,
131
+ 0.939,
132
+ 70,
133
+ "fwd"
134
+ ],
135
+ "instrument|play": [
136
+ 1303,
137
+ 0.909,
138
+ 0.944,
139
+ 40,
140
+ "fwd"
141
+ ],
142
+ "kind|music": [
143
+ 136,
144
+ 0.976,
145
+ 0.933,
146
+ 86,
147
+ "fwd"
148
+ ],
149
+ "kind|object": [
150
+ 31,
151
+ 0.96,
152
+ 0.905,
153
+ 46,
154
+ "fwd"
155
+ ],
156
+ "label|*": [
157
+ 264,
158
+ 0.955,
159
+ 0.944,
160
+ 40,
161
+ "fwd"
162
+ ],
163
+ "label|label": [
164
+ 264,
165
+ 0.974,
166
+ 0.966,
167
+ 68,
168
+ "fwd"
169
+ ],
170
+ "label|signed": [
171
+ 264,
172
+ 1.0,
173
+ 0.9,
174
+ 25,
175
+ "fwd"
176
+ ],
177
+ "language|*": [
178
+ 364,
179
+ 0.986,
180
+ 0.957,
181
+ 308,
182
+ "fwd"
183
+ ],
184
+ "language|filmed": [
185
+ 364,
186
+ 1.0,
187
+ 1.0,
188
+ 38,
189
+ "fwd"
190
+ ],
191
+ "language|language": [
192
+ 364,
193
+ 0.98,
194
+ 0.945,
195
+ 417,
196
+ "fwd"
197
+ ],
198
+ "language|movie": [
199
+ 364,
200
+ 1.0,
201
+ 1.0,
202
+ 19,
203
+ "fwd"
204
+ ],
205
+ "language|spoken": [
206
+ 364,
207
+ 1.0,
208
+ 0.939,
209
+ 90,
210
+ "fwd"
211
+ ],
212
+ "language|used": [
213
+ 364,
214
+ 1.0,
215
+ 1.0,
216
+ 34,
217
+ "fwd"
218
+ ],
219
+ "mode|*": [
220
+ 404,
221
+ 1.0,
222
+ 1.0,
223
+ 20,
224
+ "fwd"
225
+ ],
226
+ "mode|mode": [
227
+ 404,
228
+ 1.0,
229
+ 1.0,
230
+ 20,
231
+ "fwd"
232
+ ],
233
+ "nationality|*": [
234
+ 27,
235
+ 0.964,
236
+ 0.952,
237
+ 215,
238
+ "fwd"
239
+ ],
240
+ "nationality|nationality": [
241
+ 27,
242
+ 0.966,
243
+ 0.957,
244
+ 286,
245
+ "fwd"
246
+ ],
247
+ "nation|*": [
248
+ 27,
249
+ 1.0,
250
+ 0.929,
251
+ 32,
252
+ "fwd"
253
+ ],
254
+ "nation|nation": [
255
+ 27,
256
+ 1.0,
257
+ 0.95,
258
+ 42,
259
+ "fwd"
260
+ ],
261
+ "place|birth": [
262
+ 19,
263
+ 0.929,
264
+ 0.955,
265
+ 36,
266
+ "fwd"
267
+ ],
268
+ "position|*": [
269
+ 413,
270
+ 0.988,
271
+ 0.966,
272
+ 346,
273
+ "fwd"
274
+ ],
275
+ "position|baseball": [
276
+ 413,
277
+ 0.958,
278
+ 0.944,
279
+ 42,
280
+ "fwd"
281
+ ],
282
+ "position|football": [
283
+ 413,
284
+ 0.949,
285
+ 0.961,
286
+ 155,
287
+ "fwd"
288
+ ],
289
+ "position|play": [
290
+ 413,
291
+ 0.994,
292
+ 0.97,
293
+ 334,
294
+ "fwd"
295
+ ],
296
+ "position|position": [
297
+ 413,
298
+ 0.987,
299
+ 0.968,
300
+ 444,
301
+ "fwd"
302
+ ],
303
+ "position|soccer": [
304
+ 413,
305
+ 1.0,
306
+ 1.0,
307
+ 59,
308
+ "fwd"
309
+ ],
310
+ "profession|*": [
311
+ 106,
312
+ 1.0,
313
+ 1.0,
314
+ 59,
315
+ "fwd"
316
+ ],
317
+ "profession|profession": [
318
+ 106,
319
+ 1.0,
320
+ 0.971,
321
+ 70,
322
+ "fwd"
323
+ ],
324
+ "religion|*": [
325
+ 140,
326
+ 1.0,
327
+ 1.0,
328
+ 48,
329
+ "fwd"
330
+ ],
331
+ "religion|practice": [
332
+ 140,
333
+ 1.0,
334
+ 1.0,
335
+ 29,
336
+ "fwd"
337
+ ],
338
+ "religion|religion": [
339
+ 140,
340
+ 1.0,
341
+ 0.973,
342
+ 62,
343
+ "fwd"
344
+ ],
345
+ "series|*": [
346
+ 179,
347
+ 0.9,
348
+ 1.0,
349
+ 19,
350
+ "fwd"
351
+ ],
352
+ "series|series": [
353
+ 179,
354
+ 0.9,
355
+ 1.0,
356
+ 21,
357
+ "fwd"
358
+ ],
359
+ "sex|*": [
360
+ 21,
361
+ 0.975,
362
+ 1.0,
363
+ 72,
364
+ "fwd"
365
+ ],
366
+ "sex|sex": [
367
+ 21,
368
+ 0.975,
369
+ 1.0,
370
+ 73,
371
+ "fwd"
372
+ ],
373
+ "state|state": [
374
+ 19,
375
+ 1.0,
376
+ 0.929,
377
+ 25,
378
+ "fwd"
379
+ ],
380
+ "war|*": [
381
+ 607,
382
+ 1.0,
383
+ 1.0,
384
+ 54,
385
+ "fwd"
386
+ ],
387
+ "war|participate": [
388
+ 607,
389
+ 1.0,
390
+ 1.0,
391
+ 37,
392
+ "fwd"
393
+ ],
394
+ "war|war": [
395
+ 607,
396
+ 1.0,
397
+ 1.0,
398
+ 58,
399
+ "fwd"
400
+ ],
401
+ "what|gameplay": [
402
+ 404,
403
+ 1.0,
404
+ 1.0,
405
+ 44,
406
+ "fwd"
407
+ ],
408
+ "what|gender": [
409
+ 21,
410
+ 1.0,
411
+ 1.0,
412
+ 36,
413
+ "fwd"
414
+ ],
415
+ "what|language": [
416
+ 364,
417
+ 0.909,
418
+ 0.944,
419
+ 40,
420
+ "fwd"
421
+ ],
422
+ "what|mode": [
423
+ 404,
424
+ 1.0,
425
+ 1.0,
426
+ 48,
427
+ "fwd"
428
+ ],
429
+ "what|nationality": [
430
+ 27,
431
+ 1.0,
432
+ 1.0,
433
+ 32,
434
+ "fwd"
435
+ ],
436
+ "what|orbit": [
437
+ 397,
438
+ 1.0,
439
+ 1.0,
440
+ 30,
441
+ "fwd"
442
+ ],
443
+ "what|position": [
444
+ 413,
445
+ 0.917,
446
+ 0.929,
447
+ 26,
448
+ "fwd"
449
+ ],
450
+ "where|*": [
451
+ 19,
452
+ 0.943,
453
+ 0.92,
454
+ 914,
455
+ "fwd"
456
+ ],
457
+ "where|away": [
458
+ 20,
459
+ 0.981,
460
+ 0.923,
461
+ 91,
462
+ "fwd"
463
+ ],
464
+ "where|birth": [
465
+ 19,
466
+ 0.955,
467
+ 0.958,
468
+ 46,
469
+ "fwd"
470
+ ],
471
+ "where|birthed": [
472
+ 19,
473
+ 1.0,
474
+ 1.0,
475
+ 19,
476
+ "fwd"
477
+ ],
478
+ "where|born": [
479
+ 19,
480
+ 0.961,
481
+ 0.956,
482
+ 702,
483
+ "fwd"
484
+ ],
485
+ "where|die": [
486
+ 20,
487
+ 0.959,
488
+ 0.955,
489
+ 393,
490
+ "fwd"
491
+ ],
492
+ "where|died": [
493
+ 20,
494
+ 1.0,
495
+ 1.0,
496
+ 21,
497
+ "fwd"
498
+ ],
499
+ "where|discovered": [
500
+ 65,
501
+ 1.0,
502
+ 1.0,
503
+ 36,
504
+ "fwd"
505
+ ],
506
+ "where|filmed": [
507
+ 495,
508
+ 0.909,
509
+ 1.0,
510
+ 27,
511
+ "fwd"
512
+ ],
513
+ "where|given": [
514
+ 19,
515
+ 1.0,
516
+ 1.0,
517
+ 23,
518
+ "fwd"
519
+ ],
520
+ "where|pass": [
521
+ 20,
522
+ 0.982,
523
+ 0.932,
524
+ 99,
525
+ "fwd"
526
+ ],
527
+ "where|take": [
528
+ 276,
529
+ 1.0,
530
+ 1.0,
531
+ 24,
532
+ "fwd"
533
+ ],
534
+ "which|album": [
535
+ 175,
536
+ 0.947,
537
+ 0.909,
538
+ 41,
539
+ "fwd"
540
+ ],
541
+ "who|after": [
542
+ 138,
543
+ 0.952,
544
+ 1.0,
545
+ 34,
546
+ "fwd"
547
+ ],
548
+ "who|author": [
549
+ 50,
550
+ 1.0,
551
+ 1.0,
552
+ 49,
553
+ "fwd"
554
+ ],
555
+ "who|authored": [
556
+ 50,
557
+ 1.0,
558
+ 1.0,
559
+ 23,
560
+ "fwd"
561
+ ],
562
+ "who|born": [
563
+ 19,
564
+ 0.917,
565
+ 1.0,
566
+ 26,
567
+ "inv"
568
+ ],
569
+ "who|child": [
570
+ 40,
571
+ 0.944,
572
+ 1.0,
573
+ 32,
574
+ "fwd"
575
+ ],
576
+ "who|cinematographer": [
577
+ 344,
578
+ 1.0,
579
+ 1.0,
580
+ 19,
581
+ "fwd"
582
+ ],
583
+ "who|cinematography": [
584
+ 344,
585
+ 1.0,
586
+ 1.0,
587
+ 19,
588
+ "fwd"
589
+ ],
590
+ "who|composed": [
591
+ 86,
592
+ 1.0,
593
+ 0.917,
594
+ 23,
595
+ "fwd"
596
+ ],
597
+ "who|directed": [
598
+ 57,
599
+ 0.917,
600
+ 0.921,
601
+ 160,
602
+ "fwd"
603
+ ],
604
+ "who|founder": [
605
+ 112,
606
+ 1.0,
607
+ 1.0,
608
+ 20,
609
+ "fwd"
610
+ ],
611
+ "who|parent": [
612
+ 40,
613
+ 0.929,
614
+ 1.0,
615
+ 33,
616
+ "inv"
617
+ ],
618
+ "who|published": [
619
+ 123,
620
+ 0.917,
621
+ 0.938,
622
+ 28,
623
+ "fwd"
624
+ ],
625
+ "who|publisher": [
626
+ 123,
627
+ 1.0,
628
+ 1.0,
629
+ 24,
630
+ "fwd"
631
+ ]
632
+ }
root/specialists/_gate/standing_composed_v1.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ cmp2-k1 cmp2-k10 cmp2-k11 cmp2-k12 cmp2-k4 cmp2-k5 cmp2-k6 cmp2-k8 cmp2-k9 cmp2-l1 cmp2-l10 cmp2-l11 cmp2-l12 cmp2-l2 cmp2-l3 cmp2-l5 cmp2-l6 cmp2-l7 cmp2-l8 cmp2-l9
root/specialists/_gate/standing_composed_v2.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ cmp3-k1 cmp3-k10 cmp3-k11 cmp3-k12 cmp3-k4 cmp3-k5 cmp3-k6 cmp3-k8 cmp3-k9 cmp3-l1 cmp3-l10 cmp3-l11 cmp3-l12 cmp3-l2 cmp3-l3 cmp3-l5 cmp3-l6 cmp3-l7 cmp3-l8 cmp3-l9
root/specialists/bld2-f14-p4511/manifest.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f14-p4511",
3
+ "name": "Oracle7 Built: vertical depth (Wikidata P4511)",
4
+ "number": 400,
5
+ "tier": "B",
6
+ "sources": [
7
+ {
8
+ "name": "Wikidata property P4511 (vertical depth): items with an English Wikipedia article, fetched 2026-10-20T06:54:35Z, sha256 c5567fc0743b92fb",
9
+ "licence": "CC0 1.0",
10
+ "url": "https://www.wikidata.org/wiki/Property:P4511"
11
+ }
12
+ ],
13
+ "store": {
14
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f14-p4511/table.json"
15
+ },
16
+ "organ": {
17
+ "dir": "__ORACLE7_ROOT__/specialists/bld2-f14-p4511",
18
+ "module": "organ_table_v2",
19
+ "class": "TableOrgan",
20
+ "init": {}
21
+ },
22
+ "accept": {
23
+ "kinds": [
24
+ "lookup"
25
+ ],
26
+ "declines_in_domain": [
27
+ "unknown_item"
28
+ ],
29
+ "context_regex": "\\b(?:vertical\\ depth|oceandepth|lakedepth|depth)\\b"
30
+ },
31
+ "panel": {
32
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f14-p4511/panel_v1.json",
33
+ "splits": [
34
+ "dev",
35
+ "heldout"
36
+ ],
37
+ "exclude_kinds_composed": [],
38
+ "scorer_module": "scorer_table_v1",
39
+ "scorer_fn": "ok"
40
+ },
41
+ "routing_cues": [
42
+ "vertical depth",
43
+ "depth",
44
+ "lakedepth",
45
+ "oceandepth"
46
+ ],
47
+ "budgets": {
48
+ "latency_p50_ms": 200,
49
+ "store_mb": 8
50
+ },
51
+ "core_sample": {
52
+ "n": 400,
53
+ "seed": 20261020
54
+ },
55
+ "notes": "Built by builder_v1 for task F14 from coordinator brief (type table); property chosen from phrase 'depth' (score 2.0). Answers carry the Wikidata item id; a named property with no thing from the table is declined."
56
+ }
root/specialists/bld2-f14-p4511/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/bld2-f14-p4511/organ_table_v2.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """organ_table_v2 - the GENERIC TABLE SPECIALIST (v2: distinctive names match in any case; who/where/when/why are not lookups) the builder instantiates: one property of named things, read from a table
2
+ the builder downloaded (table.json beside this file). Built, not trained; no phrasing templates.
3
+
4
+ Reading: the property is named in the question (its label or an alias, from the source); the thing is the longest table
5
+ label or alias found in the question AS WRITTEN (case-sensitive, whole words: a name, not a common word). Answers carry the
6
+ value, its unit and the source item id.
7
+ lookup both found: "<Thing>: <property> is <value> <unit>. [wikidata:Q..]" (a unit asked for is converted when the
8
+ table's unit is a known time, length or mass unit)
9
+ unknown_item a short direct question names the property and a capitalised name the table does not hold: an in-domain
10
+ refusal (recognise, then decline)
11
+ Narrowing (the specialist factory's shared rule, narrow_v1, shipped beside this file): story-shaped and relational turns
12
+ belong to the core; a turn carrying numbers other than those inside the matched name is a calculation, not a lookup, and
13
+ belongs to the core; only a short direct question is ever declined. Everything else: no reply."""
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import os
18
+ import re
19
+
20
+ from narrow_v1 import narrative, short_direct
21
+
22
+ HERE = os.path.dirname(os.path.abspath(__file__))
23
+ UNITS = {"second": (1, "t"), "seconds": (1, "t"), "s": (1, "t"), "minute": (60, "t"), "minutes": (60, "t"), "hour": (3600, "t"),
24
+ "hours": (3600, "t"), "day": (86400, "t"), "days": (86400, "t"), "year": (31557600, "t"), "years": (31557600, "t"),
25
+ "annum": (31557600, "t"), "millisecond": (1e-3, "t"), "microsecond": (1e-6, "t"), "nanosecond": (1e-9, "t"),
26
+ "metre": (1, "l"), "meter": (1, "l"), "metres": (1, "l"), "meters": (1, "l"), "kilometre": (1e3, "l"),
27
+ "kilometer": (1e3, "l"), "kilometres": (1e3, "l"), "kilometers": (1e3, "l"), "km": (1e3, "l"), "centimetre": (1e-2, "l"),
28
+ "millimetre": (1e-3, "l"), "mm": (1e-3, "l"), "foot": (0.3048, "l"), "feet": (0.3048, "l"), "mile": (1609.344, "l"),
29
+ "miles": (1609.344, "l"), "astronomical unit": (1.495978707e11, "l"), "au": (1.495978707e11, "l"),
30
+ "kilogram": (1, "m"), "kilograms": (1, "m"), "gram": (1e-3, "m"), "grams": (1e-3, "m"), "tonne": (1e3, "m")}
31
+ DIGITS = re.compile(r"\d+(?:[.,]\d+)?")
32
+ # a lookup is ASKED: a question, or a request for the value ("Tell me / Give me / I need / Do you know / Could you ...");
33
+ # instructions ("Write a Python function ...", "Explain ...") belong to the core
34
+ DISTINCT = re.compile(r"[\d\s]|[^\w\s]|[^\x00-\x7f]")
35
+ OF_THING = re.compile(r"\bof\s+(?:the\s+|a\s+|an\s+)?([^?.,;!]{2,40}?)\s*(?:\bin\s+\w+)?\s*[?.!]?\s*$", re.I)
36
+ NOT_A_VALUE = re.compile(r"\s*(?:who|whom|whose|where|when|why)\b", re.I)
37
+ ASKING = re.compile(r"\?\s*$|^\s*(?:what|which|how|tell me|give me|i need|do you know|could you|can you|for )", re.I)
38
+ NAMEISH = re.compile(r"(?<!^)(?<![.?!]\s)\b[A-Z][\w'.-]+")
39
+
40
+
41
+ def _norm(s):
42
+ return re.sub(r"\s+", " ", str(s).replace("–", "-").replace("’", "'")).strip()
43
+
44
+
45
+ def _fmt(v):
46
+ v = float(v)
47
+ if v == 0:
48
+ return "0"
49
+ if 1e-3 <= abs(v) < 1e7:
50
+ return "%.6g" % v
51
+ return "%.4g" % v
52
+
53
+
54
+ class TableOrgan:
55
+ def __init__(self, table="table.json"):
56
+ d = json.load(open(os.path.join(HERE, table), encoding="utf-8"))
57
+ self.prop = d["property"]
58
+ # the property as named: its label, and aliases that are several words or 5+ letters (a short one-word alias such as
59
+ # "size" names too much); whole words only, never part of a hyphenated word ("mid-size")
60
+ names = sorted({_norm(x).lower() for x in [self.prop["label"]] + [a for a in self.prop.get("aliases", [])
61
+ if " " in a.strip() or len(a.strip()) >= 5] if len(_norm(x)) >= 3}, key=len, reverse=True)
62
+ self.rx_prop = re.compile(r"(?<![\w-])(?:%s)(?![\w-])" % "|".join(re.escape(n) for n in names), re.I) if names else None
63
+ self.rows = d["rows"]
64
+ self.index, self.lindex, self.aindex = {}, {}, {}
65
+ for i, r in enumerate(self.rows):
66
+ for n in [r["label"]] + r.get("aliases", []):
67
+ k = _norm(n)
68
+ if len(k) < 2:
69
+ continue
70
+ if len(k) >= 3 and any(ch.isupper() for ch in k): # names as written ("100 Federal Street" too)
71
+ self.index.setdefault(k, []).append(i)
72
+ if DISTINCT.search(k): # a digit, symbol, non-Latin character or several words: such a
73
+ self.lindex.setdefault(k.lower(), []).append(i) # name is safe to match in any case ("carbon-14")
74
+ self.aindex.setdefault(k.lower(), []).append(i) # any name, used only where grammar names it ("... of X?")
75
+
76
+ def _thing(self, text):
77
+ """(the longest table name the question contains, the rows it names): word sequences of up to 8 words, looked up
78
+ as written first, then in any case for the distinctive names - fast whatever the table's size"""
79
+ toks = [w.strip("\"'“”‘’,;:!?") for w in _norm(text).split()]
80
+ toks = [w for w in toks if w]
81
+ for n in range(min(8, len(toks)), 0, -1):
82
+ best = None
83
+ for i in range(len(toks) - n + 1):
84
+ cand = " ".join(toks[i:i + n]).rstrip(".")
85
+ if cand in self.index:
86
+ rows = self.index[cand]
87
+ elif cand.lower() in self.lindex:
88
+ rows = self.lindex[cand.lower()]
89
+ else:
90
+ continue
91
+ if best is None or len(cand) > len(best[0]):
92
+ best = (cand, rows)
93
+ if best:
94
+ return best
95
+ return None, None
96
+
97
+ def answer(self, text, session_id="default"):
98
+ t = str(text or "")
99
+ if not self.rx_prop or not self.rx_prop.search(t) or narrative(t) or "$" in t or not ASKING.search(t):
100
+ return None
101
+ if NOT_A_VALUE.match(t): # who / where / when / why ask for something else
102
+ return None
103
+ k, idx = self._thing(t)
104
+ if not k: # "the <property> of X?": X is the thing, in any case
105
+ m = OF_THING.search(t)
106
+ if m and m.group(1).strip().lower() in self.aindex:
107
+ k = m.group(1).strip()
108
+ idx = self.aindex[k.lower()]
109
+ rest = re.sub(re.escape(k), " ", _norm(t), flags=re.I) if k else t
110
+ if DIGITS.search(rest): # a calculation, not a lookup: the core's
111
+ return None
112
+ if not k:
113
+ if short_direct(t) and NAMEISH.search(t):
114
+ return {"kind": "unknown_item", "status": "declined",
115
+ "response": "I hold the %s of %d things, but not of the one named here, so I won't guess." % (self.prop["label"], len(self.rows))}
116
+ return None
117
+ if not short_direct(t):
118
+ return None
119
+ rows = [self.rows[i] for i in idx]
120
+ r = rows[0]
121
+ val, unit = r["value"], r.get("unit", "")
122
+ m = re.search(r"\bin\s+(%s)\b" % "|".join(sorted((re.escape(u) for u in UNITS), key=len, reverse=True)), t.lower())
123
+ if m and unit and unit.lower() in UNITS and m.group(1) in UNITS:
124
+ fu, fam = UNITS[unit.lower()]
125
+ tu, tfam = UNITS[m.group(1)]
126
+ if fam == tfam:
127
+ try:
128
+ val, unit = float(val) * fu / tu, m.group(1)
129
+ except ValueError:
130
+ pass
131
+ try:
132
+ shown = _fmt(val)
133
+ except (TypeError, ValueError):
134
+ shown = str(val)
135
+ extra = "" if len(rows) == 1 else " (the source lists %d values; this is the first)" % len(rows)
136
+ return {"kind": "lookup", "status": "answered",
137
+ "response": "%s: %s is %s%s.%s [wikidata:%s]" % (r["label"], self.prop["label"], shown, (" " + unit) if unit else "", extra, r["qid"])}
root/specialists/bld2-f14-p4511/panel_v1.json ADDED
@@ -0,0 +1,822 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "split": "dev",
4
+ "kind": "lookup",
5
+ "q": "What is the depth of Lake Kizi?",
6
+ "valid": true,
7
+ "expect": "4",
8
+ "unit": "metre",
9
+ "dtype": "quantity",
10
+ "qid": "Q2055517",
11
+ "why": "vertical depth of Lake Kizi (Wikidata Q2055517)"
12
+ },
13
+ {
14
+ "split": "dev",
15
+ "kind": "lookup",
16
+ "q": "Tell me the vertical depth of Zarivar Lake.",
17
+ "valid": true,
18
+ "expect": "50",
19
+ "unit": "metre",
20
+ "dtype": "quantity",
21
+ "qid": "Q3058006",
22
+ "why": "vertical depth of Zarivar Lake (Wikidata Q3058006)"
23
+ },
24
+ {
25
+ "split": "dev",
26
+ "kind": "lookup",
27
+ "q": "What's the vertical depth for Lac de Bise?",
28
+ "valid": true,
29
+ "expect": "1.2",
30
+ "unit": "metre",
31
+ "dtype": "quantity",
32
+ "qid": "Q3215373",
33
+ "why": "vertical depth of Lac de Bise (Wikidata Q3215373)"
34
+ },
35
+ {
36
+ "split": "dev",
37
+ "kind": "lookup",
38
+ "q": "What is the vertical depth of Lake Hajikabul?",
39
+ "valid": true,
40
+ "expect": "5",
41
+ "unit": "metre",
42
+ "dtype": "quantity",
43
+ "qid": "Q4057542",
44
+ "why": "vertical depth of Lake Hajikabul (Wikidata Q4057542)"
45
+ },
46
+ {
47
+ "split": "dev",
48
+ "kind": "lookup",
49
+ "q": "Tell me the lakedepth of Lake Immeln.",
50
+ "valid": true,
51
+ "expect": "28",
52
+ "unit": "metre",
53
+ "dtype": "quantity",
54
+ "qid": "Q10534731",
55
+ "why": "vertical depth of Lake Immeln (Wikidata Q10534731)"
56
+ },
57
+ {
58
+ "split": "dev",
59
+ "kind": "lookup",
60
+ "q": "What's the vertical depth for Lough Owel?",
61
+ "valid": true,
62
+ "expect": "30",
63
+ "unit": "metre",
64
+ "dtype": "quantity",
65
+ "qid": "Q2702889",
66
+ "why": "vertical depth of Lough Owel (Wikidata Q2702889)"
67
+ },
68
+ {
69
+ "split": "dev",
70
+ "kind": "lookup",
71
+ "q": "What is the vertical depth of Chambon lake?",
72
+ "valid": true,
73
+ "expect": "4",
74
+ "unit": "metre",
75
+ "dtype": "quantity",
76
+ "qid": "Q3214795",
77
+ "why": "vertical depth of Chambon lake (Wikidata Q3214795)"
78
+ },
79
+ {
80
+ "split": "dev",
81
+ "kind": "lookup",
82
+ "q": "Tell me the vertical depth of Lake Saint Clair.",
83
+ "valid": true,
84
+ "expect": "3.4",
85
+ "unit": "metre",
86
+ "dtype": "quantity",
87
+ "qid": "Q736707",
88
+ "why": "vertical depth of Lake Saint Clair (Wikidata Q736707)"
89
+ },
90
+ {
91
+ "split": "dev",
92
+ "kind": "lookup",
93
+ "q": "What's the oceandepth for Achensee?",
94
+ "valid": true,
95
+ "expect": "133",
96
+ "unit": "metre",
97
+ "dtype": "quantity",
98
+ "qid": "Q615711",
99
+ "why": "vertical depth of Achensee (Wikidata Q615711)"
100
+ },
101
+ {
102
+ "split": "dev",
103
+ "kind": "lookup",
104
+ "q": "What is the vertical depth of Lago Morto?",
105
+ "valid": true,
106
+ "expect": "56",
107
+ "unit": "metre",
108
+ "dtype": "quantity",
109
+ "qid": "Q3825736",
110
+ "why": "vertical depth of Lago Morto (Wikidata Q3825736)"
111
+ },
112
+ {
113
+ "split": "dev",
114
+ "kind": "lookup",
115
+ "q": "Tell me the vertical depth of Lake Trichonida.",
116
+ "valid": true,
117
+ "expect": "58",
118
+ "unit": "metre",
119
+ "dtype": "quantity",
120
+ "qid": "Q1422965",
121
+ "why": "vertical depth of Lake Trichonida (Wikidata Q1422965)"
122
+ },
123
+ {
124
+ "split": "dev",
125
+ "kind": "lookup",
126
+ "q": "What's the vertical depth for Lake of the Woods?",
127
+ "valid": true,
128
+ "expect": "64",
129
+ "unit": "metre",
130
+ "dtype": "quantity",
131
+ "qid": "Q845876",
132
+ "why": "vertical depth of Lake of the Woods (Wikidata Q845876)"
133
+ },
134
+ {
135
+ "split": "dev",
136
+ "kind": "lookup",
137
+ "q": "What is the depth of Lac de Servière?",
138
+ "valid": true,
139
+ "expect": "26",
140
+ "unit": "metre",
141
+ "dtype": "quantity",
142
+ "qid": "Q3215552",
143
+ "why": "vertical depth of Lac de Servière (Wikidata Q3215552)"
144
+ },
145
+ {
146
+ "split": "dev",
147
+ "kind": "lookup",
148
+ "q": "Tell me the vertical depth of Lago di Ceresole.",
149
+ "valid": true,
150
+ "expect": "23.2",
151
+ "unit": "metre",
152
+ "dtype": "quantity",
153
+ "qid": "Q3825928",
154
+ "why": "vertical depth of Lago di Ceresole (Wikidata Q3825928)"
155
+ },
156
+ {
157
+ "split": "dev",
158
+ "kind": "lookup",
159
+ "q": "What's the vertical depth for Stora Skogssjön?",
160
+ "valid": true,
161
+ "expect": "5.4",
162
+ "unit": "metre",
163
+ "dtype": "quantity",
164
+ "qid": "Q3361693",
165
+ "why": "vertical depth of Stora Skogssjön (Wikidata Q3361693)"
166
+ },
167
+ {
168
+ "split": "dev",
169
+ "kind": "lookup",
170
+ "q": "What is the vertical depth of Lake Karaka?",
171
+ "valid": true,
172
+ "expect": "5.4",
173
+ "unit": "metre",
174
+ "dtype": "quantity",
175
+ "qid": "Q6476411",
176
+ "why": "vertical depth of Lake Karaka (Wikidata Q6476411)"
177
+ },
178
+ {
179
+ "split": "dev",
180
+ "kind": "lookup",
181
+ "q": "Tell me the lakedepth of Lake Sarysu.",
182
+ "valid": true,
183
+ "expect": "6",
184
+ "unit": "metre",
185
+ "dtype": "quantity",
186
+ "qid": "Q2752255",
187
+ "why": "vertical depth of Lake Sarysu (Wikidata Q2752255)"
188
+ },
189
+ {
190
+ "split": "dev",
191
+ "kind": "lookup",
192
+ "q": "What's the vertical depth for Getaren?",
193
+ "valid": true,
194
+ "expect": "4.3",
195
+ "unit": "metre",
196
+ "dtype": "quantity",
197
+ "qid": "Q3361706",
198
+ "why": "vertical depth of Getaren (Wikidata Q3361706)"
199
+ },
200
+ {
201
+ "split": "dev",
202
+ "kind": "lookup",
203
+ "q": "What is the vertical depth of Lampaanjärvi?",
204
+ "valid": true,
205
+ "expect": "15",
206
+ "unit": "metre",
207
+ "dtype": "quantity",
208
+ "qid": "Q7362438",
209
+ "why": "vertical depth of Lampaanjärvi (Wikidata Q7362438)"
210
+ },
211
+ {
212
+ "split": "dev",
213
+ "kind": "lookup",
214
+ "q": "Tell me the vertical depth of Loch Arkaig.",
215
+ "valid": true,
216
+ "expect": "109",
217
+ "unit": "metre",
218
+ "dtype": "quantity",
219
+ "qid": "Q1867229",
220
+ "why": "vertical depth of Loch Arkaig (Wikidata Q1867229)"
221
+ },
222
+ {
223
+ "split": "dev",
224
+ "kind": "lookup",
225
+ "q": "What's the oceandepth for Lake Tremblant?",
226
+ "valid": true,
227
+ "expect": "91",
228
+ "unit": "metre",
229
+ "dtype": "quantity",
230
+ "qid": "Q18549860",
231
+ "why": "vertical depth of Lake Tremblant (Wikidata Q18549860)"
232
+ },
233
+ {
234
+ "split": "dev",
235
+ "kind": "lookup",
236
+ "q": "What is the vertical depth of Brûlé Lake?",
237
+ "valid": true,
238
+ "expect": "10",
239
+ "unit": "metre",
240
+ "dtype": "quantity",
241
+ "qid": "Q3214772",
242
+ "why": "vertical depth of Brûlé Lake (Wikidata Q3214772)"
243
+ },
244
+ {
245
+ "split": "dev",
246
+ "kind": "lookup",
247
+ "q": "Tell me the vertical depth of Futalaufquen Lake.",
248
+ "valid": true,
249
+ "expect": "101",
250
+ "unit": "metre",
251
+ "dtype": "quantity",
252
+ "qid": "Q581399",
253
+ "why": "vertical depth of Futalaufquen Lake (Wikidata Q581399)"
254
+ },
255
+ {
256
+ "split": "dev",
257
+ "kind": "lookup",
258
+ "q": "What's the vertical depth for Iisvesi?",
259
+ "valid": true,
260
+ "expect": "35",
261
+ "unit": "metre",
262
+ "dtype": "quantity",
263
+ "qid": "Q1346320",
264
+ "why": "vertical depth of Iisvesi (Wikidata Q1346320)"
265
+ },
266
+ {
267
+ "split": "dev",
268
+ "kind": "lookup",
269
+ "q": "What is the depth of Fuxian Lake?",
270
+ "valid": true,
271
+ "expect": "155",
272
+ "unit": "metre",
273
+ "dtype": "quantity",
274
+ "qid": "Q127016",
275
+ "why": "vertical depth of Fuxian Lake (Wikidata Q127016)"
276
+ },
277
+ {
278
+ "split": "dev",
279
+ "kind": "lookup",
280
+ "q": "Tell me the vertical depth of Dammtorpssjön.",
281
+ "valid": true,
282
+ "expect": "2",
283
+ "unit": "metre",
284
+ "dtype": "quantity",
285
+ "qid": "Q3361015",
286
+ "why": "vertical depth of Dammtorpssjön (Wikidata Q3361015)"
287
+ },
288
+ {
289
+ "split": "dev",
290
+ "kind": "lookup",
291
+ "q": "What's the vertical depth for Tullan?",
292
+ "valid": true,
293
+ "expect": "11",
294
+ "unit": "metre",
295
+ "dtype": "quantity",
296
+ "qid": "Q3361230",
297
+ "why": "vertical depth of Tullan (Wikidata Q3361230)"
298
+ },
299
+ {
300
+ "split": "dev",
301
+ "kind": "lookup",
302
+ "q": "What is the vertical depth of Tystrup Sø?",
303
+ "valid": true,
304
+ "expect": "21.7",
305
+ "unit": "metre",
306
+ "dtype": "quantity",
307
+ "qid": "Q12339954",
308
+ "why": "vertical depth of Tystrup Sø (Wikidata Q12339954)"
309
+ },
310
+ {
311
+ "split": "dev",
312
+ "kind": "lookup",
313
+ "q": "Tell me the lakedepth of Blatné.",
314
+ "valid": true,
315
+ "expect": "1.12",
316
+ "unit": "metre",
317
+ "dtype": "quantity",
318
+ "qid": "Q3508032",
319
+ "why": "vertical depth of Blatné (Wikidata Q3508032)"
320
+ },
321
+ {
322
+ "split": "dev",
323
+ "kind": "lookup",
324
+ "q": "What's the vertical depth for Lake Kulunda?",
325
+ "valid": true,
326
+ "expect": "4",
327
+ "unit": "metre",
328
+ "dtype": "quantity",
329
+ "qid": "Q731761",
330
+ "why": "vertical depth of Lake Kulunda (Wikidata Q731761)"
331
+ },
332
+ {
333
+ "split": "dev",
334
+ "kind": "invented",
335
+ "q": "What is the vertical depth of Talyaxorv?",
336
+ "valid": false,
337
+ "expect": null,
338
+ "unit": "",
339
+ "dtype": "quantity",
340
+ "why": "invented name: no such thing"
341
+ },
342
+ {
343
+ "split": "dev",
344
+ "kind": "invented",
345
+ "q": "Tell me the vertical depth of Lomtrinmir.",
346
+ "valid": false,
347
+ "expect": null,
348
+ "unit": "",
349
+ "dtype": "quantity",
350
+ "why": "invented name: no such thing"
351
+ },
352
+ {
353
+ "split": "dev",
354
+ "kind": "invented",
355
+ "q": "What's the vertical depth for Orvkevpell?",
356
+ "valid": false,
357
+ "expect": null,
358
+ "unit": "",
359
+ "dtype": "quantity",
360
+ "why": "invented name: no such thing"
361
+ },
362
+ {
363
+ "split": "dev",
364
+ "kind": "invented",
365
+ "q": "What is the vertical depth of Zorvelorv?",
366
+ "valid": false,
367
+ "expect": null,
368
+ "unit": "",
369
+ "dtype": "quantity",
370
+ "why": "invented name: no such thing"
371
+ },
372
+ {
373
+ "split": "dev",
374
+ "kind": "invented",
375
+ "q": "Tell me the vertical depth of Kevlomtal.",
376
+ "valid": false,
377
+ "expect": null,
378
+ "unit": "",
379
+ "dtype": "quantity",
380
+ "why": "invented name: no such thing"
381
+ },
382
+ {
383
+ "split": "dev",
384
+ "kind": "invented",
385
+ "q": "What's the vertical depth for Yaxveldex?",
386
+ "valid": false,
387
+ "expect": null,
388
+ "unit": "",
389
+ "dtype": "quantity",
390
+ "why": "invented name: no such thing"
391
+ },
392
+ {
393
+ "split": "dev",
394
+ "kind": "not_held",
395
+ "q": "What is the vertical depth of a bicycle?",
396
+ "valid": false,
397
+ "expect": null,
398
+ "unit": "",
399
+ "dtype": "quantity",
400
+ "why": "the table does not hold it"
401
+ },
402
+ {
403
+ "split": "dev",
404
+ "kind": "not_held",
405
+ "q": "Tell me the vertical depth of the Eiffel Tower.",
406
+ "valid": false,
407
+ "expect": null,
408
+ "unit": "",
409
+ "dtype": "quantity",
410
+ "why": "the table does not hold it"
411
+ },
412
+ {
413
+ "split": "heldout",
414
+ "kind": "lookup",
415
+ "q": "Bygdin: what is its depth?",
416
+ "valid": true,
417
+ "expect": "215",
418
+ "unit": "metre",
419
+ "dtype": "quantity",
420
+ "qid": "Q1018512",
421
+ "why": "vertical depth of Bygdin (Wikidata Q1018512)"
422
+ },
423
+ {
424
+ "split": "heldout",
425
+ "kind": "lookup",
426
+ "q": "Do you know the vertical depth of Lake Tharthar?",
427
+ "valid": true,
428
+ "expect": "65",
429
+ "unit": "metre",
430
+ "dtype": "quantity",
431
+ "qid": "Q1640519",
432
+ "why": "vertical depth of Lake Tharthar (Wikidata Q1640519)"
433
+ },
434
+ {
435
+ "split": "heldout",
436
+ "kind": "lookup",
437
+ "q": "I need the vertical depth of Lago di Fondi, please.",
438
+ "valid": true,
439
+ "expect": "21.5",
440
+ "unit": "metre",
441
+ "dtype": "quantity",
442
+ "qid": "Q3825952",
443
+ "why": "vertical depth of Lago di Fondi (Wikidata Q3825952)"
444
+ },
445
+ {
446
+ "split": "heldout",
447
+ "kind": "lookup",
448
+ "q": "Could you give me the vertical depth of Lac Vieux Desert?",
449
+ "valid": true,
450
+ "expect": "12",
451
+ "unit": "metre",
452
+ "dtype": "quantity",
453
+ "qid": "Q3215268",
454
+ "why": "vertical depth of Lac Vieux Desert (Wikidata Q3215268)"
455
+ },
456
+ {
457
+ "split": "heldout",
458
+ "kind": "lookup",
459
+ "q": "For Lough Conn, what is the lakedepth?",
460
+ "valid": true,
461
+ "expect": "28",
462
+ "unit": "metre",
463
+ "dtype": "quantity",
464
+ "qid": "Q949985",
465
+ "why": "vertical depth of Lough Conn (Wikidata Q949985)"
466
+ },
467
+ {
468
+ "split": "heldout",
469
+ "kind": "lookup",
470
+ "q": "Laghi di Porcile: what is its vertical depth?",
471
+ "valid": true,
472
+ "expect": "4",
473
+ "unit": "metre",
474
+ "dtype": "quantity",
475
+ "qid": "Q3825606",
476
+ "why": "vertical depth of laghi di Porcile (Wikidata Q3825606)"
477
+ },
478
+ {
479
+ "split": "heldout",
480
+ "kind": "lookup",
481
+ "q": "Do you know the vertical depth of Saimaa?",
482
+ "valid": true,
483
+ "expect": "82",
484
+ "unit": "metre",
485
+ "dtype": "quantity",
486
+ "qid": "Q192770",
487
+ "why": "vertical depth of Saimaa (Wikidata Q192770)"
488
+ },
489
+ {
490
+ "split": "heldout",
491
+ "kind": "lookup",
492
+ "q": "I need the vertical depth of Vansjø, please.",
493
+ "valid": true,
494
+ "expect": "22",
495
+ "unit": "metre",
496
+ "dtype": "quantity",
497
+ "qid": "Q3356657",
498
+ "why": "vertical depth of Vansjø (Wikidata Q3356657)"
499
+ },
500
+ {
501
+ "split": "heldout",
502
+ "kind": "lookup",
503
+ "q": "Could you give me the oceandepth of Boshkung Lake?",
504
+ "valid": true,
505
+ "expect": "71",
506
+ "unit": "metre",
507
+ "dtype": "quantity",
508
+ "qid": "Q4947263",
509
+ "why": "vertical depth of Boshkung Lake (Wikidata Q4947263)"
510
+ },
511
+ {
512
+ "split": "heldout",
513
+ "kind": "lookup",
514
+ "q": "For Lake Michigan–Huron, what is the vertical depth?",
515
+ "valid": true,
516
+ "expect": "282",
517
+ "unit": "metre",
518
+ "dtype": "quantity",
519
+ "qid": "Q1377732",
520
+ "why": "vertical depth of Lake Michigan–Huron (Wikidata Q1377732)"
521
+ },
522
+ {
523
+ "split": "heldout",
524
+ "kind": "lookup",
525
+ "q": "Blausee: what is its vertical depth?",
526
+ "valid": true,
527
+ "expect": "12",
528
+ "unit": "metre",
529
+ "dtype": "quantity",
530
+ "qid": "Q689873",
531
+ "why": "vertical depth of Blausee (Wikidata Q689873)"
532
+ },
533
+ {
534
+ "split": "heldout",
535
+ "kind": "lookup",
536
+ "q": "Do you know the vertical depth of Cardiel Lake?",
537
+ "valid": true,
538
+ "expect": "76",
539
+ "unit": "metre",
540
+ "dtype": "quantity",
541
+ "qid": "Q2439795",
542
+ "why": "vertical depth of Cardiel Lake (Wikidata Q2439795)"
543
+ },
544
+ {
545
+ "split": "heldout",
546
+ "kind": "lookup",
547
+ "q": "I need the depth of Andrusia Lake, please.",
548
+ "valid": true,
549
+ "expect": "60",
550
+ "unit": "foot",
551
+ "dtype": "quantity",
552
+ "qid": "Q19600180",
553
+ "why": "vertical depth of Andrusia Lake (Wikidata Q19600180)"
554
+ },
555
+ {
556
+ "split": "heldout",
557
+ "kind": "lookup",
558
+ "q": "Could you give me the vertical depth of Lago di Mergozzo?",
559
+ "valid": true,
560
+ "expect": "74",
561
+ "unit": "metre",
562
+ "dtype": "quantity",
563
+ "qid": "Q1467712",
564
+ "why": "vertical depth of Lago di Mergozzo (Wikidata Q1467712)"
565
+ },
566
+ {
567
+ "split": "heldout",
568
+ "kind": "lookup",
569
+ "q": "For Lac des Allemands, what is the vertical depth?",
570
+ "valid": true,
571
+ "expect": "3.3",
572
+ "unit": "metre",
573
+ "dtype": "quantity",
574
+ "qid": "Q932474",
575
+ "why": "vertical depth of Lac des Allemands (Wikidata Q932474)"
576
+ },
577
+ {
578
+ "split": "heldout",
579
+ "kind": "lookup",
580
+ "q": "Bramfelder See: what is its vertical depth?",
581
+ "valid": true,
582
+ "expect": "3",
583
+ "unit": "metre",
584
+ "dtype": "quantity",
585
+ "qid": "Q897573",
586
+ "why": "vertical depth of Bramfelder See (Wikidata Q897573)"
587
+ },
588
+ {
589
+ "split": "heldout",
590
+ "kind": "lookup",
591
+ "q": "Do you know the lakedepth of Lake Chamo?",
592
+ "valid": true,
593
+ "expect": "14",
594
+ "unit": "metre",
595
+ "dtype": "quantity",
596
+ "qid": "Q1060962",
597
+ "why": "vertical depth of Lake Chamo (Wikidata Q1060962)"
598
+ },
599
+ {
600
+ "split": "heldout",
601
+ "kind": "lookup",
602
+ "q": "I need the vertical depth of Aibi Lake, please.",
603
+ "valid": true,
604
+ "expect": "15",
605
+ "unit": "metre",
606
+ "dtype": "quantity",
607
+ "qid": "Q1922031",
608
+ "why": "vertical depth of Aibi Lake (Wikidata Q1922031)"
609
+ },
610
+ {
611
+ "split": "heldout",
612
+ "kind": "lookup",
613
+ "q": "Could you give me the vertical depth of Lake Burigi?",
614
+ "valid": true,
615
+ "expect": "4.6",
616
+ "unit": "metre",
617
+ "dtype": "quantity",
618
+ "qid": "Q6475105",
619
+ "why": "vertical depth of Lake Burigi (Wikidata Q6475105)"
620
+ },
621
+ {
622
+ "split": "heldout",
623
+ "kind": "lookup",
624
+ "q": "For Irrsee, what is the vertical depth?",
625
+ "valid": true,
626
+ "expect": "32",
627
+ "unit": "metre",
628
+ "dtype": "quantity",
629
+ "qid": "Q665961",
630
+ "why": "vertical depth of Irrsee (Wikidata Q665961)"
631
+ },
632
+ {
633
+ "split": "heldout",
634
+ "kind": "lookup",
635
+ "q": "Lake Maggiore: what is its oceandepth?",
636
+ "valid": true,
637
+ "expect": "372",
638
+ "unit": "metre",
639
+ "dtype": "quantity",
640
+ "qid": "Q14379",
641
+ "why": "vertical depth of Lake Maggiore (Wikidata Q14379)"
642
+ },
643
+ {
644
+ "split": "heldout",
645
+ "kind": "lookup",
646
+ "q": "Do you know the vertical depth of Miedwie?",
647
+ "valid": true,
648
+ "expect": "43.8",
649
+ "unit": "metre",
650
+ "dtype": "quantity",
651
+ "qid": "Q572552",
652
+ "why": "vertical depth of Miedwie (Wikidata Q572552)"
653
+ },
654
+ {
655
+ "split": "heldout",
656
+ "kind": "lookup",
657
+ "q": "I need the vertical depth of Lake Çıldır, please.",
658
+ "valid": true,
659
+ "expect": "42",
660
+ "unit": "metre",
661
+ "dtype": "quantity",
662
+ "qid": "Q272986",
663
+ "why": "vertical depth of Lake Çıldır (Wikidata Q272986)"
664
+ },
665
+ {
666
+ "split": "heldout",
667
+ "kind": "lookup",
668
+ "q": "Could you give me the vertical depth of lago di Cavedine?",
669
+ "valid": true,
670
+ "expect": "50.4",
671
+ "unit": "metre",
672
+ "dtype": "quantity",
673
+ "qid": "Q35722561",
674
+ "why": "vertical depth of lago di Cavedine (Wikidata Q35722561)"
675
+ },
676
+ {
677
+ "split": "heldout",
678
+ "kind": "lookup",
679
+ "q": "For Bear Lake, what is the depth?",
680
+ "valid": true,
681
+ "expect": "208",
682
+ "unit": "foot",
683
+ "dtype": "quantity",
684
+ "qid": "Q812997",
685
+ "why": "vertical depth of Bear Lake (Wikidata Q812997)"
686
+ },
687
+ {
688
+ "split": "heldout",
689
+ "kind": "lookup",
690
+ "q": "Tulos: what is its vertical depth?",
691
+ "valid": true,
692
+ "expect": "23",
693
+ "unit": "metre",
694
+ "dtype": "quantity",
695
+ "qid": "Q573134",
696
+ "why": "vertical depth of Tulos (Wikidata Q573134)"
697
+ },
698
+ {
699
+ "split": "heldout",
700
+ "kind": "lookup",
701
+ "q": "Do you know the vertical depth of Senftenberger See?",
702
+ "valid": true,
703
+ "expect": "25",
704
+ "unit": "metre",
705
+ "dtype": "quantity",
706
+ "qid": "Q149660",
707
+ "why": "vertical depth of Senftenberger See (Wikidata Q149660)"
708
+ },
709
+ {
710
+ "split": "heldout",
711
+ "kind": "lookup",
712
+ "q": "I need the vertical depth of Lake Hamana, please.",
713
+ "valid": true,
714
+ "expect": "16.6",
715
+ "unit": "metre",
716
+ "dtype": "quantity",
717
+ "qid": "Q1150952",
718
+ "why": "vertical depth of Lake Hamana (Wikidata Q1150952)"
719
+ },
720
+ {
721
+ "split": "heldout",
722
+ "kind": "lookup",
723
+ "q": "Could you give me the lakedepth of Lough Ennell?",
724
+ "valid": true,
725
+ "expect": "8",
726
+ "unit": "metre",
727
+ "dtype": "quantity",
728
+ "qid": "Q2639357",
729
+ "why": "vertical depth of Lough Ennell (Wikidata Q2639357)"
730
+ },
731
+ {
732
+ "split": "heldout",
733
+ "kind": "lookup",
734
+ "q": "For Lake Hazen, what is the vertical depth?",
735
+ "valid": true,
736
+ "expect": "289",
737
+ "unit": "metre",
738
+ "dtype": "quantity",
739
+ "qid": "Q1233614",
740
+ "why": "vertical depth of Lake Hazen (Wikidata Q1233614)"
741
+ },
742
+ {
743
+ "split": "heldout",
744
+ "kind": "invented",
745
+ "q": "Zorquindex: what is its vertical depth?",
746
+ "valid": false,
747
+ "expect": null,
748
+ "unit": "",
749
+ "dtype": "quantity",
750
+ "why": "invented name: no such thing"
751
+ },
752
+ {
753
+ "split": "heldout",
754
+ "kind": "invented",
755
+ "q": "Do you know the vertical depth of Snartaluth?",
756
+ "valid": false,
757
+ "expect": null,
758
+ "unit": "",
759
+ "dtype": "quantity",
760
+ "why": "invented name: no such thing"
761
+ },
762
+ {
763
+ "split": "heldout",
764
+ "kind": "invented",
765
+ "q": "I need the vertical depth of Pellpellzor, please.",
766
+ "valid": false,
767
+ "expect": null,
768
+ "unit": "",
769
+ "dtype": "quantity",
770
+ "why": "invented name: no such thing"
771
+ },
772
+ {
773
+ "split": "heldout",
774
+ "kind": "invented",
775
+ "q": "Could you give me the vertical depth of Braxlomtal?",
776
+ "valid": false,
777
+ "expect": null,
778
+ "unit": "",
779
+ "dtype": "quantity",
780
+ "why": "invented name: no such thing"
781
+ },
782
+ {
783
+ "split": "heldout",
784
+ "kind": "invented",
785
+ "q": "For Snartrinorv, what is the vertical depth?",
786
+ "valid": false,
787
+ "expect": null,
788
+ "unit": "",
789
+ "dtype": "quantity",
790
+ "why": "invented name: no such thing"
791
+ },
792
+ {
793
+ "split": "heldout",
794
+ "kind": "invented",
795
+ "q": "Pellpellorv: what is its vertical depth?",
796
+ "valid": false,
797
+ "expect": null,
798
+ "unit": "",
799
+ "dtype": "quantity",
800
+ "why": "invented name: no such thing"
801
+ },
802
+ {
803
+ "split": "heldout",
804
+ "kind": "not_held",
805
+ "q": "Do you know the vertical depth of the Eiffel Tower?",
806
+ "valid": false,
807
+ "expect": null,
808
+ "unit": "",
809
+ "dtype": "quantity",
810
+ "why": "the table does not hold it"
811
+ },
812
+ {
813
+ "split": "heldout",
814
+ "kind": "not_held",
815
+ "q": "I need the vertical depth of a bicycle, please.",
816
+ "valid": false,
817
+ "expect": null,
818
+ "unit": "",
819
+ "dtype": "quantity",
820
+ "why": "the table does not hold it"
821
+ }
822
+ ]
root/specialists/bld2-f14-p4511/scorer_table_v1.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """scorer_table_v1 - scorer for built table specialists: (good, asserted).
2
+ A must-decline item answered is a false yes. A valid quantity item is right when a number in the reply is within 0.5% of
3
+ the table's value (the exam never asks for a conversion); a valid text item is right when the value's text appears in the
4
+ reply (case-insensitive)."""
5
+ import re
6
+
7
+
8
+ def _nums(text):
9
+ out = []
10
+ for m in re.finditer(r"-?\d[\d,]*(?:\.\d+)?(?:[eE][+-]?\d+)?", text):
11
+ try:
12
+ out.append(float(m.group(0).replace(",", "")))
13
+ except ValueError:
14
+ pass
15
+ return out
16
+
17
+
18
+ def ok(p, r):
19
+ r = r or {}
20
+ text = str(r.get("response", ""))
21
+ answered = str(r.get("status", "")) == "answered"
22
+ if not p["valid"]:
23
+ return (not answered), answered
24
+ if not answered:
25
+ return False, False
26
+ if p.get("dtype") == "quantity":
27
+ want = float(p["expect"])
28
+ return any(abs(g - want) <= 0.005 * abs(want) + 1e-12 for g in _nums(text)), True
29
+ return str(p["expect"]).lower() in text.lower(), True
root/specialists/bld2-f14-p4511/table.json ADDED
The diff for this file is too large to render. See raw diff
 
root/specialists/bld2-f14-p4511/verdict_heldout.json ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f14-p4511",
3
+ "name": "Oracle7 Built: vertical depth (Wikidata P4511)",
4
+ "tier": "B",
5
+ "split": "heldout",
6
+ "head": "oracle_release_runtime_w427",
7
+ "time": "2026-10-20T07:05:39Z",
8
+ "domain": {
9
+ "head": {
10
+ "correct": 8,
11
+ "false_yes": 0,
12
+ "wrong": 0,
13
+ "n": 38,
14
+ "p50_ms": 123.01,
15
+ "fails": [
16
+ [
17
+ "lookup",
18
+ "Bygdin: what is its depth?",
19
+ "act:clarify_specific",
20
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
21
+ ],
22
+ [
23
+ "lookup",
24
+ "Do you know the vertical depth of Lake Tharthar?",
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
+ "lookup",
30
+ "I need the vertical depth of Lago di Fondi, please.",
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
+ "lookup",
36
+ "Could you give me the vertical depth of Lac Vieux Desert?",
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
+ "lookup",
42
+ "For Lough Conn, what is the lakedepth?",
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
+ "lookup",
48
+ "Laghi di Porcile: what is its vertical depth?",
49
+ "act:clarify_specific",
50
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
51
+ ],
52
+ [
53
+ "lookup",
54
+ "Do you know the vertical depth of Saimaa?",
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
+ "lookup",
60
+ "I need the vertical depth of Vansj\u00f8, please.",
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": 38,
68
+ "false_yes": 0,
69
+ "wrong": 0,
70
+ "n": 38,
71
+ "p50_ms": 0.17,
72
+ "fails": []
73
+ }
74
+ },
75
+ "core": {
76
+ "head": {
77
+ "correct": 144,
78
+ "false_yes": 2
79
+ },
80
+ "spec": {
81
+ "correct": 144,
82
+ "false_yes": 2
83
+ },
84
+ "n": 400,
85
+ "swept_in": 0,
86
+ "taken_by_specialist": []
87
+ },
88
+ "self": [
89
+ {
90
+ "q": "Who are you?",
91
+ "same": true
92
+ },
93
+ {
94
+ "q": "What are you?",
95
+ "same": true
96
+ },
97
+ {
98
+ "q": "Are you a human?",
99
+ "same": true
100
+ },
101
+ {
102
+ "q": "What do you value?",
103
+ "same": true
104
+ },
105
+ {
106
+ "q": "Are you conscious?",
107
+ "same": true
108
+ }
109
+ ],
110
+ "store_mb": 0.18,
111
+ "decision": "ADMIT",
112
+ "reasons": []
113
+ }
root/specialists/bld2-f3-p3395/manifest.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f3-p3395",
3
+ "name": "Oracle7 Built: heart rate (Wikidata P3395)",
4
+ "number": 400,
5
+ "tier": "B",
6
+ "sources": [
7
+ {
8
+ "name": "Wikidata property P3395 (heart rate): items with an English Wikipedia article, fetched 2026-10-20T06:52:03Z, sha256 51980b683ea6d138",
9
+ "licence": "CC0 1.0",
10
+ "url": "https://www.wikidata.org/wiki/Property:P3395"
11
+ }
12
+ ],
13
+ "store": {
14
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f3-p3395/table.json"
15
+ },
16
+ "organ": {
17
+ "dir": "__ORACLE7_ROOT__/specialists/bld2-f3-p3395",
18
+ "module": "organ_table_v2",
19
+ "class": "TableOrgan",
20
+ "init": {}
21
+ },
22
+ "accept": {
23
+ "kinds": [
24
+ "lookup"
25
+ ],
26
+ "declines_in_domain": [
27
+ "unknown_item"
28
+ ],
29
+ "context_regex": "\\b(?:heart\\ pulse|heart\\ rate)\\b"
30
+ },
31
+ "panel": {
32
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f3-p3395/panel_v1.json",
33
+ "splits": [
34
+ "dev",
35
+ "heldout"
36
+ ],
37
+ "exclude_kinds_composed": [],
38
+ "scorer_module": "scorer_table_v1",
39
+ "scorer_fn": "ok"
40
+ },
41
+ "routing_cues": [
42
+ "heart rate",
43
+ "heart pulse"
44
+ ],
45
+ "budgets": {
46
+ "latency_p50_ms": 200,
47
+ "store_mb": 8
48
+ },
49
+ "core_sample": {
50
+ "n": 400,
51
+ "seed": 20261020
52
+ },
53
+ "notes": "Built by builder_v1 for task F3 from coordinator brief (type table); property chosen from phrase 'heart rate' (score 3.5). Answers carry the Wikidata item id; a named property with no thing from the table is declined."
54
+ }
root/specialists/bld2-f3-p3395/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/bld2-f3-p3395/organ_table_v2.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """organ_table_v2 - the GENERIC TABLE SPECIALIST (v2: distinctive names match in any case; who/where/when/why are not lookups) the builder instantiates: one property of named things, read from a table
2
+ the builder downloaded (table.json beside this file). Built, not trained; no phrasing templates.
3
+
4
+ Reading: the property is named in the question (its label or an alias, from the source); the thing is the longest table
5
+ label or alias found in the question AS WRITTEN (case-sensitive, whole words: a name, not a common word). Answers carry the
6
+ value, its unit and the source item id.
7
+ lookup both found: "<Thing>: <property> is <value> <unit>. [wikidata:Q..]" (a unit asked for is converted when the
8
+ table's unit is a known time, length or mass unit)
9
+ unknown_item a short direct question names the property and a capitalised name the table does not hold: an in-domain
10
+ refusal (recognise, then decline)
11
+ Narrowing (the specialist factory's shared rule, narrow_v1, shipped beside this file): story-shaped and relational turns
12
+ belong to the core; a turn carrying numbers other than those inside the matched name is a calculation, not a lookup, and
13
+ belongs to the core; only a short direct question is ever declined. Everything else: no reply."""
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import os
18
+ import re
19
+
20
+ from narrow_v1 import narrative, short_direct
21
+
22
+ HERE = os.path.dirname(os.path.abspath(__file__))
23
+ UNITS = {"second": (1, "t"), "seconds": (1, "t"), "s": (1, "t"), "minute": (60, "t"), "minutes": (60, "t"), "hour": (3600, "t"),
24
+ "hours": (3600, "t"), "day": (86400, "t"), "days": (86400, "t"), "year": (31557600, "t"), "years": (31557600, "t"),
25
+ "annum": (31557600, "t"), "millisecond": (1e-3, "t"), "microsecond": (1e-6, "t"), "nanosecond": (1e-9, "t"),
26
+ "metre": (1, "l"), "meter": (1, "l"), "metres": (1, "l"), "meters": (1, "l"), "kilometre": (1e3, "l"),
27
+ "kilometer": (1e3, "l"), "kilometres": (1e3, "l"), "kilometers": (1e3, "l"), "km": (1e3, "l"), "centimetre": (1e-2, "l"),
28
+ "millimetre": (1e-3, "l"), "mm": (1e-3, "l"), "foot": (0.3048, "l"), "feet": (0.3048, "l"), "mile": (1609.344, "l"),
29
+ "miles": (1609.344, "l"), "astronomical unit": (1.495978707e11, "l"), "au": (1.495978707e11, "l"),
30
+ "kilogram": (1, "m"), "kilograms": (1, "m"), "gram": (1e-3, "m"), "grams": (1e-3, "m"), "tonne": (1e3, "m")}
31
+ DIGITS = re.compile(r"\d+(?:[.,]\d+)?")
32
+ # a lookup is ASKED: a question, or a request for the value ("Tell me / Give me / I need / Do you know / Could you ...");
33
+ # instructions ("Write a Python function ...", "Explain ...") belong to the core
34
+ DISTINCT = re.compile(r"[\d\s]|[^\w\s]|[^\x00-\x7f]")
35
+ OF_THING = re.compile(r"\bof\s+(?:the\s+|a\s+|an\s+)?([^?.,;!]{2,40}?)\s*(?:\bin\s+\w+)?\s*[?.!]?\s*$", re.I)
36
+ NOT_A_VALUE = re.compile(r"\s*(?:who|whom|whose|where|when|why)\b", re.I)
37
+ ASKING = re.compile(r"\?\s*$|^\s*(?:what|which|how|tell me|give me|i need|do you know|could you|can you|for )", re.I)
38
+ NAMEISH = re.compile(r"(?<!^)(?<![.?!]\s)\b[A-Z][\w'.-]+")
39
+
40
+
41
+ def _norm(s):
42
+ return re.sub(r"\s+", " ", str(s).replace("–", "-").replace("’", "'")).strip()
43
+
44
+
45
+ def _fmt(v):
46
+ v = float(v)
47
+ if v == 0:
48
+ return "0"
49
+ if 1e-3 <= abs(v) < 1e7:
50
+ return "%.6g" % v
51
+ return "%.4g" % v
52
+
53
+
54
+ class TableOrgan:
55
+ def __init__(self, table="table.json"):
56
+ d = json.load(open(os.path.join(HERE, table), encoding="utf-8"))
57
+ self.prop = d["property"]
58
+ # the property as named: its label, and aliases that are several words or 5+ letters (a short one-word alias such as
59
+ # "size" names too much); whole words only, never part of a hyphenated word ("mid-size")
60
+ names = sorted({_norm(x).lower() for x in [self.prop["label"]] + [a for a in self.prop.get("aliases", [])
61
+ if " " in a.strip() or len(a.strip()) >= 5] if len(_norm(x)) >= 3}, key=len, reverse=True)
62
+ self.rx_prop = re.compile(r"(?<![\w-])(?:%s)(?![\w-])" % "|".join(re.escape(n) for n in names), re.I) if names else None
63
+ self.rows = d["rows"]
64
+ self.index, self.lindex, self.aindex = {}, {}, {}
65
+ for i, r in enumerate(self.rows):
66
+ for n in [r["label"]] + r.get("aliases", []):
67
+ k = _norm(n)
68
+ if len(k) < 2:
69
+ continue
70
+ if len(k) >= 3 and any(ch.isupper() for ch in k): # names as written ("100 Federal Street" too)
71
+ self.index.setdefault(k, []).append(i)
72
+ if DISTINCT.search(k): # a digit, symbol, non-Latin character or several words: such a
73
+ self.lindex.setdefault(k.lower(), []).append(i) # name is safe to match in any case ("carbon-14")
74
+ self.aindex.setdefault(k.lower(), []).append(i) # any name, used only where grammar names it ("... of X?")
75
+
76
+ def _thing(self, text):
77
+ """(the longest table name the question contains, the rows it names): word sequences of up to 8 words, looked up
78
+ as written first, then in any case for the distinctive names - fast whatever the table's size"""
79
+ toks = [w.strip("\"'“”‘’,;:!?") for w in _norm(text).split()]
80
+ toks = [w for w in toks if w]
81
+ for n in range(min(8, len(toks)), 0, -1):
82
+ best = None
83
+ for i in range(len(toks) - n + 1):
84
+ cand = " ".join(toks[i:i + n]).rstrip(".")
85
+ if cand in self.index:
86
+ rows = self.index[cand]
87
+ elif cand.lower() in self.lindex:
88
+ rows = self.lindex[cand.lower()]
89
+ else:
90
+ continue
91
+ if best is None or len(cand) > len(best[0]):
92
+ best = (cand, rows)
93
+ if best:
94
+ return best
95
+ return None, None
96
+
97
+ def answer(self, text, session_id="default"):
98
+ t = str(text or "")
99
+ if not self.rx_prop or not self.rx_prop.search(t) or narrative(t) or "$" in t or not ASKING.search(t):
100
+ return None
101
+ if NOT_A_VALUE.match(t): # who / where / when / why ask for something else
102
+ return None
103
+ k, idx = self._thing(t)
104
+ if not k: # "the <property> of X?": X is the thing, in any case
105
+ m = OF_THING.search(t)
106
+ if m and m.group(1).strip().lower() in self.aindex:
107
+ k = m.group(1).strip()
108
+ idx = self.aindex[k.lower()]
109
+ rest = re.sub(re.escape(k), " ", _norm(t), flags=re.I) if k else t
110
+ if DIGITS.search(rest): # a calculation, not a lookup: the core's
111
+ return None
112
+ if not k:
113
+ if short_direct(t) and NAMEISH.search(t):
114
+ return {"kind": "unknown_item", "status": "declined",
115
+ "response": "I hold the %s of %d things, but not of the one named here, so I won't guess." % (self.prop["label"], len(self.rows))}
116
+ return None
117
+ if not short_direct(t):
118
+ return None
119
+ rows = [self.rows[i] for i in idx]
120
+ r = rows[0]
121
+ val, unit = r["value"], r.get("unit", "")
122
+ m = re.search(r"\bin\s+(%s)\b" % "|".join(sorted((re.escape(u) for u in UNITS), key=len, reverse=True)), t.lower())
123
+ if m and unit and unit.lower() in UNITS and m.group(1) in UNITS:
124
+ fu, fam = UNITS[unit.lower()]
125
+ tu, tfam = UNITS[m.group(1)]
126
+ if fam == tfam:
127
+ try:
128
+ val, unit = float(val) * fu / tu, m.group(1)
129
+ except ValueError:
130
+ pass
131
+ try:
132
+ shown = _fmt(val)
133
+ except (TypeError, ValueError):
134
+ shown = str(val)
135
+ extra = "" if len(rows) == 1 else " (the source lists %d values; this is the first)" % len(rows)
136
+ return {"kind": "lookup", "status": "answered",
137
+ "response": "%s: %s is %s%s.%s [wikidata:%s]" % (r["label"], self.prop["label"], shown, (" " + unit) if unit else "", extra, r["qid"])}
root/specialists/bld2-f3-p3395/panel_v1.json ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "split": "dev",
4
+ "kind": "lookup",
5
+ "q": "What is the heart pulse of chicken?",
6
+ "valid": true,
7
+ "expect": "275",
8
+ "unit": "beats per minute",
9
+ "dtype": "quantity",
10
+ "qid": "Q780",
11
+ "why": "heart rate of chicken (Wikidata Q780)"
12
+ },
13
+ {
14
+ "split": "dev",
15
+ "kind": "lookup",
16
+ "q": "Tell me the heart rate of Soricidae.",
17
+ "valid": true,
18
+ "expect": "1200",
19
+ "unit": "beats per minute",
20
+ "dtype": "quantity",
21
+ "qid": "Q41631",
22
+ "why": "heart rate of Soricidae (Wikidata Q41631)"
23
+ },
24
+ {
25
+ "split": "dev",
26
+ "kind": "lookup",
27
+ "q": "What's the heart rate for Hamster?",
28
+ "valid": true,
29
+ "expect": "450",
30
+ "unit": "beats per minute",
31
+ "dtype": "quantity",
32
+ "qid": "Q6573",
33
+ "why": "heart rate of Hamster (Wikidata Q6573)"
34
+ },
35
+ {
36
+ "split": "dev",
37
+ "kind": "lookup",
38
+ "q": "What is the heart rate of elderly people?",
39
+ "valid": true,
40
+ "expect": "65",
41
+ "unit": "beats per minute",
42
+ "dtype": "quantity",
43
+ "qid": "Q2191986",
44
+ "why": "heart rate of elderly people (Wikidata Q2191986)"
45
+ },
46
+ {
47
+ "split": "dev",
48
+ "kind": "lookup",
49
+ "q": "Tell me the heart pulse of Elephantidae.",
50
+ "valid": true,
51
+ "expect": "30",
52
+ "unit": "beats per minute",
53
+ "dtype": "quantity",
54
+ "qid": "Q2372824",
55
+ "why": "heart rate of Elephantidae (Wikidata Q2372824)"
56
+ },
57
+ {
58
+ "split": "dev",
59
+ "kind": "lookup",
60
+ "q": "What's the heart rate for Felis catus?",
61
+ "valid": true,
62
+ "expect": "125",
63
+ "unit": "beats per minute",
64
+ "dtype": "quantity",
65
+ "qid": "Q20980826",
66
+ "why": "heart rate of Felis catus (Wikidata Q20980826)"
67
+ },
68
+ {
69
+ "split": "dev",
70
+ "kind": "invented",
71
+ "q": "What is the heart rate of Uthtrinlom?",
72
+ "valid": false,
73
+ "expect": null,
74
+ "unit": "",
75
+ "dtype": "quantity",
76
+ "why": "invented name: no such thing"
77
+ },
78
+ {
79
+ "split": "dev",
80
+ "kind": "invented",
81
+ "q": "Tell me the heart rate of Orvvelquin.",
82
+ "valid": false,
83
+ "expect": null,
84
+ "unit": "",
85
+ "dtype": "quantity",
86
+ "why": "invented name: no such thing"
87
+ },
88
+ {
89
+ "split": "dev",
90
+ "kind": "invented",
91
+ "q": "What's the heart rate for Zormirpell?",
92
+ "valid": false,
93
+ "expect": null,
94
+ "unit": "",
95
+ "dtype": "quantity",
96
+ "why": "invented name: no such thing"
97
+ },
98
+ {
99
+ "split": "dev",
100
+ "kind": "invented",
101
+ "q": "What is the heart rate of Braxvelbrax?",
102
+ "valid": false,
103
+ "expect": null,
104
+ "unit": "",
105
+ "dtype": "quantity",
106
+ "why": "invented name: no such thing"
107
+ },
108
+ {
109
+ "split": "dev",
110
+ "kind": "invented",
111
+ "q": "Tell me the heart rate of Dexvelpell.",
112
+ "valid": false,
113
+ "expect": null,
114
+ "unit": "",
115
+ "dtype": "quantity",
116
+ "why": "invented name: no such thing"
117
+ },
118
+ {
119
+ "split": "dev",
120
+ "kind": "invented",
121
+ "q": "What's the heart rate for Braxuthuth?",
122
+ "valid": false,
123
+ "expect": null,
124
+ "unit": "",
125
+ "dtype": "quantity",
126
+ "why": "invented name: no such thing"
127
+ },
128
+ {
129
+ "split": "dev",
130
+ "kind": "not_held",
131
+ "q": "What is the heart rate of a bicycle?",
132
+ "valid": false,
133
+ "expect": null,
134
+ "unit": "",
135
+ "dtype": "quantity",
136
+ "why": "the table does not hold it"
137
+ },
138
+ {
139
+ "split": "dev",
140
+ "kind": "not_held",
141
+ "q": "Tell me the heart rate of Mount Everest.",
142
+ "valid": false,
143
+ "expect": null,
144
+ "unit": "",
145
+ "dtype": "quantity",
146
+ "why": "the table does not hold it"
147
+ },
148
+ {
149
+ "split": "heldout",
150
+ "kind": "lookup",
151
+ "q": "Northern giraffe: what is its heart pulse?",
152
+ "valid": true,
153
+ "expect": "150",
154
+ "unit": "beats per minute",
155
+ "dtype": "quantity",
156
+ "qid": "Q15083",
157
+ "why": "heart rate of northern giraffe (Wikidata Q15083)"
158
+ },
159
+ {
160
+ "split": "heldout",
161
+ "kind": "lookup",
162
+ "q": "Do you know the heart rate of Petaurus breviceps?",
163
+ "valid": true,
164
+ "expect": "250",
165
+ "unit": "beats per minute",
166
+ "dtype": "quantity",
167
+ "qid": "Q723435",
168
+ "why": "heart rate of Petaurus breviceps (Wikidata Q723435)"
169
+ },
170
+ {
171
+ "split": "heldout",
172
+ "kind": "lookup",
173
+ "q": "I need the heart rate of early modern human, please.",
174
+ "valid": true,
175
+ "expect": "70",
176
+ "unit": "beats per minute",
177
+ "dtype": "quantity",
178
+ "qid": "Q115690473",
179
+ "why": "heart rate of early modern human (Wikidata Q115690473)"
180
+ },
181
+ {
182
+ "split": "heldout",
183
+ "kind": "lookup",
184
+ "q": "Could you give me the heart rate of goat?",
185
+ "valid": true,
186
+ "expect": "75",
187
+ "unit": "beats per minute",
188
+ "dtype": "quantity",
189
+ "qid": "Q2934",
190
+ "why": "heart rate of goat (Wikidata Q2934)"
191
+ },
192
+ {
193
+ "split": "heldout",
194
+ "kind": "lookup",
195
+ "q": "For guinea pig, what is the heart pulse?",
196
+ "valid": true,
197
+ "expect": "250",
198
+ "unit": "beats per minute",
199
+ "dtype": "quantity",
200
+ "qid": "Q79803",
201
+ "why": "heart rate of guinea pig (Wikidata Q79803)"
202
+ },
203
+ {
204
+ "split": "heldout",
205
+ "kind": "lookup",
206
+ "q": "Gray whale: what is its heart rate?",
207
+ "valid": true,
208
+ "expect": "9",
209
+ "unit": "",
210
+ "dtype": "quantity",
211
+ "qid": "Q179154",
212
+ "why": "heart rate of gray whale (Wikidata Q179154)"
213
+ },
214
+ {
215
+ "split": "heldout",
216
+ "kind": "invented",
217
+ "q": "Kevkevtal: what is its heart rate?",
218
+ "valid": false,
219
+ "expect": null,
220
+ "unit": "",
221
+ "dtype": "quantity",
222
+ "why": "invented name: no such thing"
223
+ },
224
+ {
225
+ "split": "heldout",
226
+ "kind": "invented",
227
+ "q": "Do you know the heart rate of Orvdextal?",
228
+ "valid": false,
229
+ "expect": null,
230
+ "unit": "",
231
+ "dtype": "quantity",
232
+ "why": "invented name: no such thing"
233
+ },
234
+ {
235
+ "split": "heldout",
236
+ "kind": "invented",
237
+ "q": "I need the heart rate of Lomlombrax, please.",
238
+ "valid": false,
239
+ "expect": null,
240
+ "unit": "",
241
+ "dtype": "quantity",
242
+ "why": "invented name: no such thing"
243
+ },
244
+ {
245
+ "split": "heldout",
246
+ "kind": "invented",
247
+ "q": "Could you give me the heart rate of Lomuthorv?",
248
+ "valid": false,
249
+ "expect": null,
250
+ "unit": "",
251
+ "dtype": "quantity",
252
+ "why": "invented name: no such thing"
253
+ },
254
+ {
255
+ "split": "heldout",
256
+ "kind": "invented",
257
+ "q": "For Yaxkevkev, what is the heart rate?",
258
+ "valid": false,
259
+ "expect": null,
260
+ "unit": "",
261
+ "dtype": "quantity",
262
+ "why": "invented name: no such thing"
263
+ },
264
+ {
265
+ "split": "heldout",
266
+ "kind": "invented",
267
+ "q": "Velmirlom: what is its heart rate?",
268
+ "valid": false,
269
+ "expect": null,
270
+ "unit": "",
271
+ "dtype": "quantity",
272
+ "why": "invented name: no such thing"
273
+ },
274
+ {
275
+ "split": "heldout",
276
+ "kind": "not_held",
277
+ "q": "Do you know the heart rate of Mount Everest?",
278
+ "valid": false,
279
+ "expect": null,
280
+ "unit": "",
281
+ "dtype": "quantity",
282
+ "why": "the table does not hold it"
283
+ },
284
+ {
285
+ "split": "heldout",
286
+ "kind": "not_held",
287
+ "q": "I need the heart rate of the Eiffel Tower, please.",
288
+ "valid": false,
289
+ "expect": null,
290
+ "unit": "",
291
+ "dtype": "quantity",
292
+ "why": "the table does not hold it"
293
+ }
294
+ ]
root/specialists/bld2-f3-p3395/scorer_table_v1.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """scorer_table_v1 - scorer for built table specialists: (good, asserted).
2
+ A must-decline item answered is a false yes. A valid quantity item is right when a number in the reply is within 0.5% of
3
+ the table's value (the exam never asks for a conversion); a valid text item is right when the value's text appears in the
4
+ reply (case-insensitive)."""
5
+ import re
6
+
7
+
8
+ def _nums(text):
9
+ out = []
10
+ for m in re.finditer(r"-?\d[\d,]*(?:\.\d+)?(?:[eE][+-]?\d+)?", text):
11
+ try:
12
+ out.append(float(m.group(0).replace(",", "")))
13
+ except ValueError:
14
+ pass
15
+ return out
16
+
17
+
18
+ def ok(p, r):
19
+ r = r or {}
20
+ text = str(r.get("response", ""))
21
+ answered = str(r.get("status", "")) == "answered"
22
+ if not p["valid"]:
23
+ return (not answered), answered
24
+ if not answered:
25
+ return False, False
26
+ if p.get("dtype") == "quantity":
27
+ want = float(p["expect"])
28
+ return any(abs(g - want) <= 0.005 * abs(want) + 1e-12 for g in _nums(text)), True
29
+ return str(p["expect"]).lower() in text.lower(), True
root/specialists/bld2-f3-p3395/table.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"property": {"pid": "P3395", "label": "heart rate", "aliases": ["heart pulse"], "description": "speed of the heartbeat measured by the number of contractions of the heart per minute (bpm)", "datatype": "quantity"}, "rows": [{"qid": "Q144", "label": "dog", "aliases": ["dogs", "domestic dogs", "domestic dog"], "value": "115", "unit": "beats per minute"}, {"qid": "Q41631", "label": "Soricidae", "aliases": ["shrews", "shrew", "shrew family"], "value": "1200", "unit": "beats per minute"}, {"qid": "Q53662", "label": "Laika", "aliases": ["Limonchik", "Kudryavka", "Zhuchka", "Muttnik"], "value": "103", "unit": "beats per minute"}, {"qid": "Q53662", "label": "Laika", "aliases": ["Limonchik", "Kudryavka", "Zhuchka", "Muttnik"], "value": "240", "unit": "beats per minute"}, {"qid": "Q53662", "label": "Laika", "aliases": ["Limonchik", "Kudryavka", "Zhuchka", "Muttnik"], "value": "102", "unit": "beats per minute"}, {"qid": "Q79803", "label": "guinea pig", "aliases": ["guinea-pig", "domesticated guinea pig", "domestic guinea pig", "domestic cavy", "Cavia porcellus"], "value": "250", "unit": "beats per minute"}, {"qid": "Q179154", "label": "gray whale", "aliases": ["Rhachianectes glaucus", "Pacific gray whale", "grey whale", "Gray back whale", "Eschrichtius robustus", "Eschrichtius gibbosus", "California gray whale", "Atlantic gray whale", "devil fish", "Eschrichtius glaucus", "Balaena gibbosa", "Agaphelus glaucus"], "value": "9", "unit": ""}, {"qid": "Q576104", "label": "neonate", "aliases": ["newborn infant", "newborn human", "human newborn", "newborn", "newborn child"], "value": "160", "unit": "beats per minute"}, {"qid": "Q576104", "label": "neonate", "aliases": ["newborn infant", "newborn human", "human newborn", "newborn", "newborn child"], "value": "120", "unit": "beats per minute"}, {"qid": "Q723435", "label": "Petaurus breviceps", "aliases": ["sugar glider"], "value": "250", "unit": "beats per minute"}, {"qid": "Q2191986", "label": "elderly people", "aliases": ["older people", "old human", "elderly human", "aged human", "old people"], "value": "65", "unit": "beats per minute"}, {"qid": "Q2372824", "label": "Elephantidae", "aliases": ["elephant family", "Elephant", "Elephants"], "value": "30", "unit": "beats per minute"}, {"qid": "Q20980826", "label": "Felis catus", "aliases": ["domesticated cat", "domestic cat", "house cat"], "value": "125", "unit": "beats per minute"}, {"qid": "Q115690473", "label": "early modern human", "aliases": [], "value": "70", "unit": "beats per minute"}, {"qid": "Q726", "label": "horse", "aliases": ["nag", "horses"], "value": "34", "unit": "beats per minute"}, {"qid": "Q726", "label": "horse", "aliases": ["nag", "horses"], "value": "46.5", "unit": "beats per minute"}, {"qid": "Q726", "label": "horse", "aliases": ["nag", "horses"], "value": "38", "unit": "beats per minute"}, {"qid": "Q780", "label": "chicken", "aliases": ["Gallus gallus domesticus", "chickens", "vistas"], "value": "275", "unit": "beats per minute"}, {"qid": "Q2934", "label": "goat", "aliases": ["domestic goat", "Capra hircus", "C. hircus", "Capra aegagrus hircus", "C. aegagrus hircus", "C. a. hircus", "goats"], "value": "75", "unit": "beats per minute"}, {"qid": "Q6573", "label": "Hamster", "aliases": ["hamster subfamily", "Cricetinae", "hamsters"], "value": "450", "unit": "beats per minute"}, {"qid": "Q15083", "label": "northern giraffe", "aliases": ["three-horned giraffe", "Giraffa camelopardalis super-complex", "Giraffa camelopardalis sensu stricto", "Giraffa camelopardalis sensu lato", "Giraffa camelopardalis"], "value": "150", "unit": "beats per minute"}, {"qid": "Q18498", "label": "grey wolf", "aliases": ["timber wolves", "timber wolf", "grey wolves", "gray wolves", "gray wolf", "wolf"], "value": "200", "unit": "beats per minute"}, {"qid": "Q18498", "label": "grey wolf", "aliases": ["timber wolves", "timber wolf", "grey wolves", "gray wolves", "gray wolf", "wolf"], "value": "90", "unit": "beats per minute"}, {"qid": "Q146", "label": "cat", "aliases": ["pet cat", "housecat", "house cat", "puss", "domestic cat"], "value": "125", "unit": "beats per minute"}, {"qid": "Q146", "label": "cat", "aliases": ["pet cat", "housecat", "house cat", "puss", "domestic cat"], "value": "130", "unit": "beats per minute"}, {"qid": "Q144", "label": "dog", "aliases": ["domestic dogs", "domestic dog", "dogs"], "value": "80", "unit": "beats per minute"}, {"qid": "Q144", "label": "dog", "aliases": ["domestic dogs", "domestic dog", "dogs"], "value": "95", "unit": "beats per minute"}], "source": {"repo": "wikidata", "pid": "P3395", "sha256": "51980b683ea6d138195a96cf7cdf098bec00523d1374d4a132879ede3018a838", "fetched": "2026-10-20T06:52:03Z", "licence": "CC0 1.0"}}
root/specialists/bld2-f3-p3395/verdict_heldout.json ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f3-p3395",
3
+ "name": "Oracle7 Built: heart rate (Wikidata P3395)",
4
+ "tier": "B",
5
+ "split": "heldout",
6
+ "head": "oracle_release_runtime_w427",
7
+ "time": "2026-10-20T07:08:18Z",
8
+ "domain": {
9
+ "head": {
10
+ "correct": 8,
11
+ "false_yes": 0,
12
+ "wrong": 0,
13
+ "n": 14,
14
+ "p50_ms": 149.27,
15
+ "fails": [
16
+ [
17
+ "lookup",
18
+ "Northern giraffe: what is its heart pulse?",
19
+ "act:clarify_specific",
20
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
21
+ ],
22
+ [
23
+ "lookup",
24
+ "Do you know the heart rate of Petaurus breviceps?",
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
+ "lookup",
30
+ "I need the heart rate of early modern human, please.",
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
+ "lookup",
36
+ "Could you give me the heart rate of goat?",
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
+ "lookup",
42
+ "For guinea pig, what is the heart pulse?",
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
+ "lookup",
48
+ "Gray whale: what is its heart rate?",
49
+ "act:clarify_specific",
50
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
51
+ ]
52
+ ]
53
+ },
54
+ "spec": {
55
+ "correct": 14,
56
+ "false_yes": 0,
57
+ "wrong": 0,
58
+ "n": 14,
59
+ "p50_ms": 0.1,
60
+ "fails": []
61
+ }
62
+ },
63
+ "core": {
64
+ "head": {
65
+ "correct": 144,
66
+ "false_yes": 2
67
+ },
68
+ "spec": {
69
+ "correct": 144,
70
+ "false_yes": 2
71
+ },
72
+ "n": 400,
73
+ "swept_in": 0,
74
+ "taken_by_specialist": []
75
+ },
76
+ "self": [
77
+ {
78
+ "q": "Who are you?",
79
+ "same": true
80
+ },
81
+ {
82
+ "q": "What are you?",
83
+ "same": true
84
+ },
85
+ {
86
+ "q": "Are you a human?",
87
+ "same": true
88
+ },
89
+ {
90
+ "q": "What do you value?",
91
+ "same": true
92
+ },
93
+ {
94
+ "q": "Are you conscious?",
95
+ "same": true
96
+ }
97
+ ],
98
+ "store_mb": 0.0,
99
+ "decision": "ADMIT",
100
+ "reasons": []
101
+ }
root/specialists/bld2-f7-p2250/manifest.json ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f7-p2250",
3
+ "name": "Oracle7 Built: life expectancy (Wikidata P2250)",
4
+ "number": 400,
5
+ "tier": "B",
6
+ "sources": [
7
+ {
8
+ "name": "Wikidata property P2250 (life expectancy): items with an English Wikipedia article, fetched 2026-10-20T06:52:56Z, sha256 31cb3be4e50afe63",
9
+ "licence": "CC0 1.0",
10
+ "url": "https://www.wikidata.org/wiki/Property:P2250"
11
+ }
12
+ ],
13
+ "store": {
14
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f7-p2250/table.json"
15
+ },
16
+ "organ": {
17
+ "dir": "__ORACLE7_ROOT__/specialists/bld2-f7-p2250",
18
+ "module": "organ_table_v2",
19
+ "class": "TableOrgan",
20
+ "init": {}
21
+ },
22
+ "accept": {
23
+ "kinds": [
24
+ "lookup"
25
+ ],
26
+ "declines_in_domain": [
27
+ "unknown_item"
28
+ ],
29
+ "context_regex": "\\b(?:life\\ expectancy|life\\ span|lifespan)\\b"
30
+ },
31
+ "panel": {
32
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f7-p2250/panel_v1.json",
33
+ "splits": [
34
+ "dev",
35
+ "heldout"
36
+ ],
37
+ "exclude_kinds_composed": [],
38
+ "scorer_module": "scorer_table_v1",
39
+ "scorer_fn": "ok"
40
+ },
41
+ "routing_cues": [
42
+ "life expectancy",
43
+ "lifespan",
44
+ "life span"
45
+ ],
46
+ "budgets": {
47
+ "latency_p50_ms": 200,
48
+ "store_mb": 8
49
+ },
50
+ "core_sample": {
51
+ "n": 400,
52
+ "seed": 20261020
53
+ },
54
+ "notes": "Built by builder_v1 for task F7 from coordinator brief (type table); property chosen from phrase 'life expectancy' (score 3.5). Answers carry the Wikidata item id; a named property with no thing from the table is declined."
55
+ }
root/specialists/bld2-f7-p2250/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/bld2-f7-p2250/organ_table_v2.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """organ_table_v2 - the GENERIC TABLE SPECIALIST (v2: distinctive names match in any case; who/where/when/why are not lookups) the builder instantiates: one property of named things, read from a table
2
+ the builder downloaded (table.json beside this file). Built, not trained; no phrasing templates.
3
+
4
+ Reading: the property is named in the question (its label or an alias, from the source); the thing is the longest table
5
+ label or alias found in the question AS WRITTEN (case-sensitive, whole words: a name, not a common word). Answers carry the
6
+ value, its unit and the source item id.
7
+ lookup both found: "<Thing>: <property> is <value> <unit>. [wikidata:Q..]" (a unit asked for is converted when the
8
+ table's unit is a known time, length or mass unit)
9
+ unknown_item a short direct question names the property and a capitalised name the table does not hold: an in-domain
10
+ refusal (recognise, then decline)
11
+ Narrowing (the specialist factory's shared rule, narrow_v1, shipped beside this file): story-shaped and relational turns
12
+ belong to the core; a turn carrying numbers other than those inside the matched name is a calculation, not a lookup, and
13
+ belongs to the core; only a short direct question is ever declined. Everything else: no reply."""
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import os
18
+ import re
19
+
20
+ from narrow_v1 import narrative, short_direct
21
+
22
+ HERE = os.path.dirname(os.path.abspath(__file__))
23
+ UNITS = {"second": (1, "t"), "seconds": (1, "t"), "s": (1, "t"), "minute": (60, "t"), "minutes": (60, "t"), "hour": (3600, "t"),
24
+ "hours": (3600, "t"), "day": (86400, "t"), "days": (86400, "t"), "year": (31557600, "t"), "years": (31557600, "t"),
25
+ "annum": (31557600, "t"), "millisecond": (1e-3, "t"), "microsecond": (1e-6, "t"), "nanosecond": (1e-9, "t"),
26
+ "metre": (1, "l"), "meter": (1, "l"), "metres": (1, "l"), "meters": (1, "l"), "kilometre": (1e3, "l"),
27
+ "kilometer": (1e3, "l"), "kilometres": (1e3, "l"), "kilometers": (1e3, "l"), "km": (1e3, "l"), "centimetre": (1e-2, "l"),
28
+ "millimetre": (1e-3, "l"), "mm": (1e-3, "l"), "foot": (0.3048, "l"), "feet": (0.3048, "l"), "mile": (1609.344, "l"),
29
+ "miles": (1609.344, "l"), "astronomical unit": (1.495978707e11, "l"), "au": (1.495978707e11, "l"),
30
+ "kilogram": (1, "m"), "kilograms": (1, "m"), "gram": (1e-3, "m"), "grams": (1e-3, "m"), "tonne": (1e3, "m")}
31
+ DIGITS = re.compile(r"\d+(?:[.,]\d+)?")
32
+ # a lookup is ASKED: a question, or a request for the value ("Tell me / Give me / I need / Do you know / Could you ...");
33
+ # instructions ("Write a Python function ...", "Explain ...") belong to the core
34
+ DISTINCT = re.compile(r"[\d\s]|[^\w\s]|[^\x00-\x7f]")
35
+ OF_THING = re.compile(r"\bof\s+(?:the\s+|a\s+|an\s+)?([^?.,;!]{2,40}?)\s*(?:\bin\s+\w+)?\s*[?.!]?\s*$", re.I)
36
+ NOT_A_VALUE = re.compile(r"\s*(?:who|whom|whose|where|when|why)\b", re.I)
37
+ ASKING = re.compile(r"\?\s*$|^\s*(?:what|which|how|tell me|give me|i need|do you know|could you|can you|for )", re.I)
38
+ NAMEISH = re.compile(r"(?<!^)(?<![.?!]\s)\b[A-Z][\w'.-]+")
39
+
40
+
41
+ def _norm(s):
42
+ return re.sub(r"\s+", " ", str(s).replace("–", "-").replace("’", "'")).strip()
43
+
44
+
45
+ def _fmt(v):
46
+ v = float(v)
47
+ if v == 0:
48
+ return "0"
49
+ if 1e-3 <= abs(v) < 1e7:
50
+ return "%.6g" % v
51
+ return "%.4g" % v
52
+
53
+
54
+ class TableOrgan:
55
+ def __init__(self, table="table.json"):
56
+ d = json.load(open(os.path.join(HERE, table), encoding="utf-8"))
57
+ self.prop = d["property"]
58
+ # the property as named: its label, and aliases that are several words or 5+ letters (a short one-word alias such as
59
+ # "size" names too much); whole words only, never part of a hyphenated word ("mid-size")
60
+ names = sorted({_norm(x).lower() for x in [self.prop["label"]] + [a for a in self.prop.get("aliases", [])
61
+ if " " in a.strip() or len(a.strip()) >= 5] if len(_norm(x)) >= 3}, key=len, reverse=True)
62
+ self.rx_prop = re.compile(r"(?<![\w-])(?:%s)(?![\w-])" % "|".join(re.escape(n) for n in names), re.I) if names else None
63
+ self.rows = d["rows"]
64
+ self.index, self.lindex, self.aindex = {}, {}, {}
65
+ for i, r in enumerate(self.rows):
66
+ for n in [r["label"]] + r.get("aliases", []):
67
+ k = _norm(n)
68
+ if len(k) < 2:
69
+ continue
70
+ if len(k) >= 3 and any(ch.isupper() for ch in k): # names as written ("100 Federal Street" too)
71
+ self.index.setdefault(k, []).append(i)
72
+ if DISTINCT.search(k): # a digit, symbol, non-Latin character or several words: such a
73
+ self.lindex.setdefault(k.lower(), []).append(i) # name is safe to match in any case ("carbon-14")
74
+ self.aindex.setdefault(k.lower(), []).append(i) # any name, used only where grammar names it ("... of X?")
75
+
76
+ def _thing(self, text):
77
+ """(the longest table name the question contains, the rows it names): word sequences of up to 8 words, looked up
78
+ as written first, then in any case for the distinctive names - fast whatever the table's size"""
79
+ toks = [w.strip("\"'“”‘’,;:!?") for w in _norm(text).split()]
80
+ toks = [w for w in toks if w]
81
+ for n in range(min(8, len(toks)), 0, -1):
82
+ best = None
83
+ for i in range(len(toks) - n + 1):
84
+ cand = " ".join(toks[i:i + n]).rstrip(".")
85
+ if cand in self.index:
86
+ rows = self.index[cand]
87
+ elif cand.lower() in self.lindex:
88
+ rows = self.lindex[cand.lower()]
89
+ else:
90
+ continue
91
+ if best is None or len(cand) > len(best[0]):
92
+ best = (cand, rows)
93
+ if best:
94
+ return best
95
+ return None, None
96
+
97
+ def answer(self, text, session_id="default"):
98
+ t = str(text or "")
99
+ if not self.rx_prop or not self.rx_prop.search(t) or narrative(t) or "$" in t or not ASKING.search(t):
100
+ return None
101
+ if NOT_A_VALUE.match(t): # who / where / when / why ask for something else
102
+ return None
103
+ k, idx = self._thing(t)
104
+ if not k: # "the <property> of X?": X is the thing, in any case
105
+ m = OF_THING.search(t)
106
+ if m and m.group(1).strip().lower() in self.aindex:
107
+ k = m.group(1).strip()
108
+ idx = self.aindex[k.lower()]
109
+ rest = re.sub(re.escape(k), " ", _norm(t), flags=re.I) if k else t
110
+ if DIGITS.search(rest): # a calculation, not a lookup: the core's
111
+ return None
112
+ if not k:
113
+ if short_direct(t) and NAMEISH.search(t):
114
+ return {"kind": "unknown_item", "status": "declined",
115
+ "response": "I hold the %s of %d things, but not of the one named here, so I won't guess." % (self.prop["label"], len(self.rows))}
116
+ return None
117
+ if not short_direct(t):
118
+ return None
119
+ rows = [self.rows[i] for i in idx]
120
+ r = rows[0]
121
+ val, unit = r["value"], r.get("unit", "")
122
+ m = re.search(r"\bin\s+(%s)\b" % "|".join(sorted((re.escape(u) for u in UNITS), key=len, reverse=True)), t.lower())
123
+ if m and unit and unit.lower() in UNITS and m.group(1) in UNITS:
124
+ fu, fam = UNITS[unit.lower()]
125
+ tu, tfam = UNITS[m.group(1)]
126
+ if fam == tfam:
127
+ try:
128
+ val, unit = float(val) * fu / tu, m.group(1)
129
+ except ValueError:
130
+ pass
131
+ try:
132
+ shown = _fmt(val)
133
+ except (TypeError, ValueError):
134
+ shown = str(val)
135
+ extra = "" if len(rows) == 1 else " (the source lists %d values; this is the first)" % len(rows)
136
+ return {"kind": "lookup", "status": "answered",
137
+ "response": "%s: %s is %s%s.%s [wikidata:%s]" % (r["label"], self.prop["label"], shown, (" " + unit) if unit else "", extra, r["qid"])}
root/specialists/bld2-f7-p2250/panel_v1.json ADDED
@@ -0,0 +1,404 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "split": "dev",
4
+ "kind": "lookup",
5
+ "q": "What is the lifespan of Cesky Fousek?",
6
+ "valid": true,
7
+ "expect": "12",
8
+ "unit": "year",
9
+ "dtype": "quantity",
10
+ "qid": "Q37666",
11
+ "why": "life expectancy of Cesky Fousek (Wikidata Q37666)"
12
+ },
13
+ {
14
+ "split": "dev",
15
+ "kind": "lookup",
16
+ "q": "Tell me the life expectancy of Chippiparai.",
17
+ "valid": true,
18
+ "expect": "14",
19
+ "unit": "year",
20
+ "dtype": "quantity",
21
+ "qid": "Q37667",
22
+ "why": "life expectancy of Chippiparai (Wikidata Q37667)"
23
+ },
24
+ {
25
+ "split": "dev",
26
+ "kind": "lookup",
27
+ "q": "What's the life expectancy for Mudhol Hound?",
28
+ "valid": true,
29
+ "expect": "12.5",
30
+ "unit": "year",
31
+ "dtype": "quantity",
32
+ "qid": "Q37670",
33
+ "why": "life expectancy of Mudhol Hound (Wikidata Q37670)"
34
+ },
35
+ {
36
+ "split": "dev",
37
+ "kind": "lookup",
38
+ "q": "What is the life expectancy of Boxer?",
39
+ "valid": true,
40
+ "expect": "10.04",
41
+ "unit": "year",
42
+ "dtype": "quantity",
43
+ "qid": "Q38496",
44
+ "why": "life expectancy of Boxer (Wikidata Q38496)"
45
+ },
46
+ {
47
+ "split": "dev",
48
+ "kind": "lookup",
49
+ "q": "Tell me the lifespan of pug.",
50
+ "valid": true,
51
+ "expect": "13.5",
52
+ "unit": "year",
53
+ "dtype": "quantity",
54
+ "qid": "Q38698",
55
+ "why": "life expectancy of pug (Wikidata Q38698)"
56
+ },
57
+ {
58
+ "split": "dev",
59
+ "kind": "lookup",
60
+ "q": "What's the life expectancy for Maltese?",
61
+ "valid": true,
62
+ "expect": "15",
63
+ "unit": "year",
64
+ "dtype": "quantity",
65
+ "qid": "Q38751",
66
+ "why": "life expectancy of Maltese (Wikidata Q38751)"
67
+ },
68
+ {
69
+ "split": "dev",
70
+ "kind": "lookup",
71
+ "q": "What is the life expectancy of French Bulldog?",
72
+ "valid": true,
73
+ "expect": "11",
74
+ "unit": "year",
75
+ "dtype": "quantity",
76
+ "qid": "Q29149",
77
+ "why": "life expectancy of French Bulldog (Wikidata Q29149)"
78
+ },
79
+ {
80
+ "split": "dev",
81
+ "kind": "lookup",
82
+ "q": "Tell me the life expectancy of American Leopard Hound.",
83
+ "valid": true,
84
+ "expect": "14",
85
+ "unit": "year",
86
+ "dtype": "quantity",
87
+ "qid": "Q465537",
88
+ "why": "life expectancy of American Leopard Hound (Wikidata Q465537)"
89
+ },
90
+ {
91
+ "split": "dev",
92
+ "kind": "lookup",
93
+ "q": "What's the lifespan for Ariege Pointer?",
94
+ "valid": true,
95
+ "expect": "13",
96
+ "unit": "year",
97
+ "dtype": "quantity",
98
+ "qid": "Q37664",
99
+ "why": "life expectancy of Ariege Pointer (Wikidata Q37664)"
100
+ },
101
+ {
102
+ "split": "dev",
103
+ "kind": "lookup",
104
+ "q": "What is the life expectancy of Chinese Chongqing Dog?",
105
+ "valid": true,
106
+ "expect": "11.5",
107
+ "unit": "year",
108
+ "dtype": "quantity",
109
+ "qid": "Q37673",
110
+ "why": "life expectancy of Chinese Chongqing Dog (Wikidata Q37673)"
111
+ },
112
+ {
113
+ "split": "dev",
114
+ "kind": "lookup",
115
+ "q": "Tell me the life expectancy of Basque Shepherd Dog.",
116
+ "valid": true,
117
+ "expect": "13",
118
+ "unit": "year",
119
+ "dtype": "quantity",
120
+ "qid": "Q38653",
121
+ "why": "life expectancy of Basque Shepherd Dog (Wikidata Q38653)"
122
+ },
123
+ {
124
+ "split": "dev",
125
+ "kind": "invented",
126
+ "q": "What is the life expectancy of Mirpellbrax?",
127
+ "valid": false,
128
+ "expect": null,
129
+ "unit": "",
130
+ "dtype": "quantity",
131
+ "why": "invented name: no such thing"
132
+ },
133
+ {
134
+ "split": "dev",
135
+ "kind": "invented",
136
+ "q": "Tell me the life expectancy of Velbraxdex.",
137
+ "valid": false,
138
+ "expect": null,
139
+ "unit": "",
140
+ "dtype": "quantity",
141
+ "why": "invented name: no such thing"
142
+ },
143
+ {
144
+ "split": "dev",
145
+ "kind": "invented",
146
+ "q": "What's the life expectancy for Velpellbrax?",
147
+ "valid": false,
148
+ "expect": null,
149
+ "unit": "",
150
+ "dtype": "quantity",
151
+ "why": "invented name: no such thing"
152
+ },
153
+ {
154
+ "split": "dev",
155
+ "kind": "invented",
156
+ "q": "What is the life expectancy of Uthuthpell?",
157
+ "valid": false,
158
+ "expect": null,
159
+ "unit": "",
160
+ "dtype": "quantity",
161
+ "why": "invented name: no such thing"
162
+ },
163
+ {
164
+ "split": "dev",
165
+ "kind": "invented",
166
+ "q": "Tell me the life expectancy of Braxquinzor.",
167
+ "valid": false,
168
+ "expect": null,
169
+ "unit": "",
170
+ "dtype": "quantity",
171
+ "why": "invented name: no such thing"
172
+ },
173
+ {
174
+ "split": "dev",
175
+ "kind": "invented",
176
+ "q": "What's the life expectancy for Zorquinvel?",
177
+ "valid": false,
178
+ "expect": null,
179
+ "unit": "",
180
+ "dtype": "quantity",
181
+ "why": "invented name: no such thing"
182
+ },
183
+ {
184
+ "split": "dev",
185
+ "kind": "not_held",
186
+ "q": "What is the life expectancy of the colour blue?",
187
+ "valid": false,
188
+ "expect": null,
189
+ "unit": "",
190
+ "dtype": "quantity",
191
+ "why": "the table does not hold it"
192
+ },
193
+ {
194
+ "split": "dev",
195
+ "kind": "not_held",
196
+ "q": "Tell me the life expectancy of the Pacific Ocean.",
197
+ "valid": false,
198
+ "expect": null,
199
+ "unit": "",
200
+ "dtype": "quantity",
201
+ "why": "the table does not hold it"
202
+ },
203
+ {
204
+ "split": "heldout",
205
+ "kind": "lookup",
206
+ "q": "Perro de Presa Mallorquin: what is its lifespan?",
207
+ "valid": true,
208
+ "expect": "12",
209
+ "unit": "year",
210
+ "dtype": "quantity",
211
+ "qid": "Q37676",
212
+ "why": "life expectancy of Perro de Presa Mallorquin (Wikidata Q37676)"
213
+ },
214
+ {
215
+ "split": "heldout",
216
+ "kind": "lookup",
217
+ "q": "Do you know the life expectancy of Skye Terrier?",
218
+ "valid": true,
219
+ "expect": "13.5",
220
+ "unit": "year",
221
+ "dtype": "quantity",
222
+ "qid": "Q39052",
223
+ "why": "life expectancy of Skye Terrier (Wikidata Q39052)"
224
+ },
225
+ {
226
+ "split": "heldout",
227
+ "kind": "lookup",
228
+ "q": "I need the life expectancy of Cardigan Welsh Corgi, please.",
229
+ "valid": true,
230
+ "expect": "12",
231
+ "unit": "year",
232
+ "dtype": "quantity",
233
+ "qid": "Q29072",
234
+ "why": "life expectancy of Cardigan Welsh Corgi (Wikidata Q29072)"
235
+ },
236
+ {
237
+ "split": "heldout",
238
+ "kind": "lookup",
239
+ "q": "Could you give me the life expectancy of Great Dane?",
240
+ "valid": true,
241
+ "expect": "9",
242
+ "unit": "year",
243
+ "dtype": "quantity",
244
+ "qid": "Q5414",
245
+ "why": "life expectancy of Great Dane (Wikidata Q5414)"
246
+ },
247
+ {
248
+ "split": "heldout",
249
+ "kind": "lookup",
250
+ "q": "For Welsh Corgi, what is the lifespan?",
251
+ "valid": true,
252
+ "expect": "12",
253
+ "unit": "year",
254
+ "dtype": "quantity",
255
+ "qid": "Q858459",
256
+ "why": "life expectancy of Welsh Corgi (Wikidata Q858459)"
257
+ },
258
+ {
259
+ "split": "heldout",
260
+ "kind": "lookup",
261
+ "q": "Labrador Retriever: what is its life expectancy?",
262
+ "valid": true,
263
+ "expect": "10",
264
+ "unit": "year",
265
+ "dtype": "quantity",
266
+ "qid": "Q38726",
267
+ "why": "life expectancy of Labrador Retriever (Wikidata Q38726)"
268
+ },
269
+ {
270
+ "split": "heldout",
271
+ "kind": "lookup",
272
+ "q": "Do you know the life expectancy of Africanis?",
273
+ "valid": true,
274
+ "expect": "14",
275
+ "unit": "year",
276
+ "dtype": "quantity",
277
+ "qid": "Q516079",
278
+ "why": "life expectancy of Africanis (Wikidata Q516079)"
279
+ },
280
+ {
281
+ "split": "heldout",
282
+ "kind": "lookup",
283
+ "q": "I need the life expectancy of basset hound, please.",
284
+ "valid": true,
285
+ "expect": "11.5",
286
+ "unit": "year",
287
+ "dtype": "quantity",
288
+ "qid": "Q37716",
289
+ "why": "life expectancy of basset hound (Wikidata Q37716)"
290
+ },
291
+ {
292
+ "split": "heldout",
293
+ "kind": "lookup",
294
+ "q": "Could you give me the lifespan of German Shepherd?",
295
+ "valid": true,
296
+ "expect": "10",
297
+ "unit": "year",
298
+ "dtype": "quantity",
299
+ "qid": "Q38280",
300
+ "why": "life expectancy of German Shepherd (Wikidata Q38280)"
301
+ },
302
+ {
303
+ "split": "heldout",
304
+ "kind": "lookup",
305
+ "q": "For Pembroke Welsh Corgi, what is the life expectancy?",
306
+ "valid": true,
307
+ "expect": "12",
308
+ "unit": "year",
309
+ "dtype": "quantity",
310
+ "qid": "Q38783",
311
+ "why": "life expectancy of Pembroke Welsh Corgi (Wikidata Q38783)"
312
+ },
313
+ {
314
+ "split": "heldout",
315
+ "kind": "lookup",
316
+ "q": "Peruvian Hairless Dog: what is its life expectancy?",
317
+ "valid": true,
318
+ "expect": "14",
319
+ "unit": "year",
320
+ "dtype": "quantity",
321
+ "qid": "Q38874",
322
+ "why": "life expectancy of Peruvian Hairless Dog (Wikidata Q38874)"
323
+ },
324
+ {
325
+ "split": "heldout",
326
+ "kind": "invented",
327
+ "q": "Velkevsnar: what is its life expectancy?",
328
+ "valid": false,
329
+ "expect": null,
330
+ "unit": "",
331
+ "dtype": "quantity",
332
+ "why": "invented name: no such thing"
333
+ },
334
+ {
335
+ "split": "heldout",
336
+ "kind": "invented",
337
+ "q": "Do you know the life expectancy of Snarzorpell?",
338
+ "valid": false,
339
+ "expect": null,
340
+ "unit": "",
341
+ "dtype": "quantity",
342
+ "why": "invented name: no such thing"
343
+ },
344
+ {
345
+ "split": "heldout",
346
+ "kind": "invented",
347
+ "q": "I need the life expectancy of Braxorvbrax, please.",
348
+ "valid": false,
349
+ "expect": null,
350
+ "unit": "",
351
+ "dtype": "quantity",
352
+ "why": "invented name: no such thing"
353
+ },
354
+ {
355
+ "split": "heldout",
356
+ "kind": "invented",
357
+ "q": "Could you give me the life expectancy of Orvmirquin?",
358
+ "valid": false,
359
+ "expect": null,
360
+ "unit": "",
361
+ "dtype": "quantity",
362
+ "why": "invented name: no such thing"
363
+ },
364
+ {
365
+ "split": "heldout",
366
+ "kind": "invented",
367
+ "q": "For Talsnarsnar, what is the life expectancy?",
368
+ "valid": false,
369
+ "expect": null,
370
+ "unit": "",
371
+ "dtype": "quantity",
372
+ "why": "invented name: no such thing"
373
+ },
374
+ {
375
+ "split": "heldout",
376
+ "kind": "invented",
377
+ "q": "Quinvelyax: what is its life expectancy?",
378
+ "valid": false,
379
+ "expect": null,
380
+ "unit": "",
381
+ "dtype": "quantity",
382
+ "why": "invented name: no such thing"
383
+ },
384
+ {
385
+ "split": "heldout",
386
+ "kind": "not_held",
387
+ "q": "Do you know the life expectancy of the Eiffel Tower?",
388
+ "valid": false,
389
+ "expect": null,
390
+ "unit": "",
391
+ "dtype": "quantity",
392
+ "why": "the table does not hold it"
393
+ },
394
+ {
395
+ "split": "heldout",
396
+ "kind": "not_held",
397
+ "q": "I need the life expectancy of the Pacific Ocean, please.",
398
+ "valid": false,
399
+ "expect": null,
400
+ "unit": "",
401
+ "dtype": "quantity",
402
+ "why": "the table does not hold it"
403
+ }
404
+ ]
root/specialists/bld2-f7-p2250/scorer_table_v1.py ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """scorer_table_v1 - scorer for built table specialists: (good, asserted).
2
+ A must-decline item answered is a false yes. A valid quantity item is right when a number in the reply is within 0.5% of
3
+ the table's value (the exam never asks for a conversion); a valid text item is right when the value's text appears in the
4
+ reply (case-insensitive)."""
5
+ import re
6
+
7
+
8
+ def _nums(text):
9
+ out = []
10
+ for m in re.finditer(r"-?\d[\d,]*(?:\.\d+)?(?:[eE][+-]?\d+)?", text):
11
+ try:
12
+ out.append(float(m.group(0).replace(",", "")))
13
+ except ValueError:
14
+ pass
15
+ return out
16
+
17
+
18
+ def ok(p, r):
19
+ r = r or {}
20
+ text = str(r.get("response", ""))
21
+ answered = str(r.get("status", "")) == "answered"
22
+ if not p["valid"]:
23
+ return (not answered), answered
24
+ if not answered:
25
+ return False, False
26
+ if p.get("dtype") == "quantity":
27
+ want = float(p["expect"])
28
+ return any(abs(g - want) <= 0.005 * abs(want) + 1e-12 for g in _nums(text)), True
29
+ return str(p["expect"]).lower() in text.lower(), True
root/specialists/bld2-f7-p2250/table.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"property": {"pid": "P2250", "label": "life expectancy", "aliases": ["lifespan", "life span"], "description": "average life expectancy for this group or species", "datatype": "quantity"}, "rows": [{"qid": "Q5414", "label": "Great Dane", "aliases": ["German Mastiff", "Deutsche Dogge"], "value": "9", "unit": "year"}, {"qid": "Q5570", "label": "American Bully", "aliases": ["Bully dog", "Bully"], "value": "10", "unit": "year"}, {"qid": "Q5570", "label": "American Bully", "aliases": ["Bully dog", "Bully"], "value": "12", "unit": "year"}, {"qid": "Q7254", "label": "Affenpinscher", "aliases": ["Monkey Dog"], "value": "15", "unit": "year"}, {"qid": "Q7254", "label": "Affenpinscher", "aliases": ["Monkey Dog"], "value": "12", "unit": "year"}, {"qid": "Q21080", "label": "Afghan Hound", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q21080", "label": "Afghan Hound", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q21206", "label": "Alaskan Malamute", "aliases": ["Malamute"], "value": "10", "unit": "year"}, {"qid": "Q21206", "label": "Alaskan Malamute", "aliases": ["Malamute"], "value": "12", "unit": "year"}, {"qid": "Q29072", "label": "Cardigan Welsh Corgi", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q29149", "label": "French Bulldog", "aliases": ["Frenchie"], "value": "11", "unit": "year"}, {"qid": "Q29164", "label": "Akita", "aliases": ["Japanese Akitainu", "Japanese Akita", "American Akita", "Akita Inu"], "value": "10", "unit": "year"}, {"qid": "Q29164", "label": "Akita", "aliases": ["Japanese Akitainu", "Japanese Akita", "American Akita", "Akita Inu"], "value": "12", "unit": "year"}, {"qid": "Q37473", "label": "American Staghound", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q37473", "label": "American Staghound", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37482", "label": "Medium-sized Anglo-French Hound", "aliases": [], "value": "10", "unit": "year"}, {"qid": "Q37482", "label": "Medium-sized Anglo-French Hound", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37487", "label": "Ariégeois", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37487", "label": "Ariégeois", "aliases": [], "value": "10", "unit": "year"}, {"qid": "Q37489", "label": "Alapaha Blue Blood Bulldog", "aliases": [], "value": "13", "unit": "year"}, {"qid": "Q37489", "label": "Alapaha Blue Blood Bulldog", "aliases": [], "value": "11", "unit": "year"}, {"qid": "Q37494", "label": "Old Danish Pointer", "aliases": ["Gammel Dansk Hønsehund"], "value": "12", "unit": "year"}, {"qid": "Q37494", "label": "Old Danish Pointer", "aliases": ["Gammel Dansk Hønsehund"], "value": "13", "unit": "year"}, {"qid": "Q37498", "label": "Alpine Dachsbracke", "aliases": ["Alpenländische Dachsbracke"], "value": "12", "unit": "year"}, {"qid": "Q37498", "label": "Alpine Dachsbracke", "aliases": ["Alpenländische Dachsbracke"], "value": "14", "unit": "year"}, {"qid": "Q37510", "label": "Toy Fox Terrier", "aliases": ["American Toy Terrier"], "value": "14", "unit": "year"}, {"qid": "Q37510", "label": "Toy Fox Terrier", "aliases": ["American Toy Terrier"], "value": "13", "unit": "year"}, {"qid": "Q37508", "label": "American Hairless Terrier", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37508", "label": "American Hairless Terrier", "aliases": [], "value": "10", "unit": "year"}, {"qid": "Q37514", "label": "American foxhound", "aliases": [], "value": "11", "unit": "year"}, {"qid": "Q37514", "label": "American foxhound", "aliases": [], "value": "13", "unit": "year"}, {"qid": "Q37520", "label": "Australian Kelpie", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37520", "label": "Australian Kelpie", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q37524", "label": "Australian Silky Terrier", "aliases": ["Sydney Silky Terrier"], "value": "12", "unit": "year"}, {"qid": "Q37524", "label": "Australian Silky Terrier", "aliases": ["Sydney Silky Terrier"], "value": "15", "unit": "year"}, {"qid": "Q37534", "label": "American Akita", "aliases": ["Great Japanese Dog"], "value": "13", "unit": "year"}, {"qid": "Q37534", "label": "American Akita", "aliases": ["Great Japanese Dog"], "value": "11", "unit": "year"}, {"qid": "Q37541", "label": "Anatolian Shepherd", "aliases": ["Turkish Shepherd", "Çoban köpeği", "Anatolian Street Dog", "Anadolulu karabaş", "Karabaş"], "value": "13", "unit": "year"}, {"qid": "Q37541", "label": "Anatolian Shepherd", "aliases": ["Turkish Shepherd", "Çoban köpeği", "Anatolian Street Dog", "Anadolulu karabaş", "Karabaş"], "value": "10", "unit": "year"}, {"qid": "Q37595", "label": "Australian Cattle Dog", "aliases": ["Red Heeler", "Queensland Heeler", "Cattle Dog", "Blue Heeler", "Australian Heeler", "Heeler", "ACD"], "value": "15", "unit": "year"}, {"qid": "Q37595", "label": "Australian Cattle Dog", "aliases": ["Red Heeler", "Queensland Heeler", "Cattle Dog", "Blue Heeler", "Australian Heeler", "Heeler", "ACD"], "value": "13", "unit": "year"}, {"qid": "Q37604", "label": "American Bulldog", "aliases": [], "value": "15", "unit": "year"}, {"qid": "Q37604", "label": "American Bulldog", "aliases": [], "value": "10", "unit": "year"}, {"qid": "Q37612", "label": "American Pit Bull Terrier", "aliases": ["APBT", "Pit Bull"], "value": "13", "unit": "year"}, {"qid": "Q37612", "label": "American Pit Bull Terrier", "aliases": ["APBT", "Pit Bull"], "value": "12", "unit": "year"}, {"qid": "Q37617", "label": "Airedale Terrier", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q37617", "label": "Airedale Terrier", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37629", "label": "Australian Shepherd", "aliases": ["Aussie"], "value": "13", "unit": "year"}, {"qid": "Q37629", "label": "Australian Shepherd", "aliases": ["Aussie"], "value": "15", "unit": "year"}, {"qid": "Q37666", "label": "Cesky Fousek", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37667", "label": "Chippiparai", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q37664", "label": "Ariege Pointer", "aliases": ["Braque de l’ariège"], "value": "13", "unit": "year"}, {"qid": "Q37670", "label": "Mudhol Hound", "aliases": [], "value": "12.5", "unit": "year"}, {"qid": "Q37673", "label": "Chinese Chongqing Dog", "aliases": ["Chuandong Hound"], "value": "11.5", "unit": "year"}, {"qid": "Q37676", "label": "Perro de Presa Mallorquin", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37680", "label": "Bully Kutta", "aliases": ["Sindh Mastiff", "Pakistani Mastiff", "Indian Mastiff", "Alangu Mastiff"], "value": "8", "unit": "year"}, {"qid": "Q37680", "label": "Bully Kutta", "aliases": ["Sindh Mastiff", "Pakistani Mastiff", "Indian Mastiff", "Alangu Mastiff"], "value": "10", "unit": "year"}, {"qid": "Q37690", "label": "Alano Español", "aliases": ["Spanish Bulldog", "Spanish Alano"], "value": "11", "unit": "year"}, {"qid": "Q37690", "label": "Alano Español", "aliases": ["Spanish Bulldog", "Spanish Alano"], "value": "14", "unit": "year"}, {"qid": "Q37688", "label": "American Staffordshire Terrier", "aliases": ["AmStaff", "AST"], "value": "14", "unit": "year"}, {"qid": "Q37688", "label": "American Staffordshire Terrier", "aliases": ["AmStaff", "AST"], "value": "10", "unit": "year"}, {"qid": "Q37699", "label": "American Eskimo Dog", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q37699", "label": "American Eskimo Dog", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q37697", "label": "Appenzeller Sennenhund", "aliases": ["Blackberry Pink Justice"], "value": "12", "unit": "year"}, {"qid": "Q37697", "label": "Appenzeller Sennenhund", "aliases": ["Blackberry Pink Justice"], "value": "14", "unit": "year"}, {"qid": "Q37716", "label": "basset hound", "aliases": [], "value": "11.5", "unit": "year"}, {"qid": "Q37856", "label": "American Water Spaniel", "aliases": ["AWS"], "value": "12", "unit": "year"}, {"qid": "Q37856", "label": "American Water Spaniel", "aliases": ["AWS"], "value": "13", "unit": "year"}, {"qid": "Q37872", "label": "Armant dog", "aliases": [], "value": "11", "unit": "year"}, {"qid": "Q37872", "label": "Armant dog", "aliases": [], "value": "13", "unit": "year"}, {"qid": "Q37904", "label": "Aidi", "aliases": ["Atlas Mountain Dog"], "value": "10", "unit": "year"}, {"qid": "Q37904", "label": "Aidi", "aliases": ["Atlas Mountain Dog"], "value": "11", "unit": "year"}, {"qid": "Q38063", "label": "American Cocker Spaniel", "aliases": ["Cocker Spaniel"], "value": "14", "unit": "year"}, {"qid": "Q38063", "label": "American Cocker Spaniel", "aliases": ["Cocker Spaniel"], "value": "10", "unit": "year"}, {"qid": "Q38152", "label": "Alaskan Klee Kai", "aliases": [], "value": "13", "unit": "year"}, {"qid": "Q38152", "label": "Alaskan Klee Kai", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q38175", "label": "Akbash", "aliases": ["Akbaş köpeği", "Akbaş"], "value": "10", "unit": "year"}, {"qid": "Q38175", "label": "Akbash", "aliases": ["Akbaş köpeği", "Akbaş"], "value": "12.5", "unit": "year"}, {"qid": "Q38219", "label": "Armenian Gampr dog", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q38219", "label": "Armenian Gampr dog", "aliases": [], "value": "15", "unit": "year"}, {"qid": "Q38280", "label": "German Shepherd", "aliases": ["Schäferhund", "Deutscher Schäferhund", "Berger Allemand", "German Shepherd Dog", "Alsatian wolf dog", "Alsatian dog", "GSD", "Alsatian"], "value": "10", "unit": "year"}, {"qid": "Q38496", "label": "Boxer", "aliases": ["Deutscher Boxer", "German Boxer"], "value": "10.04", "unit": "year"}, {"qid": "Q38653", "label": "Basque Shepherd Dog", "aliases": ["Euskal Artzain Txakurra", "Euskal ardi-txakur"], "value": "13", "unit": "year"}, {"qid": "Q38698", "label": "pug", "aliases": ["carlin", "mops"], "value": "13.5", "unit": "year"}, {"qid": "Q38726", "label": "Labrador Retriever", "aliases": ["Lab", "Labrador"], "value": "10", "unit": "year"}, {"qid": "Q38751", "label": "Maltese", "aliases": ["Maltese terrier", "Maltese dog"], "value": "15", "unit": "year"}, {"qid": "Q38783", "label": "Pembroke Welsh Corgi", "aliases": [], "value": "12", "unit": "year"}, {"qid": "Q38874", "label": "Peruvian Hairless Dog", "aliases": ["Peruvian Inca Orchid"], "value": "14", "unit": "year"}, {"qid": "Q39052", "label": "Skye Terrier", "aliases": [], "value": "13.5", "unit": "year"}, {"qid": "Q465537", "label": "American Leopard Hound", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q516079", "label": "Africanis", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q858459", "label": "Welsh Corgi", "aliases": ["Corgi"], "value": "12", "unit": "year"}, {"qid": "Q3092983", "label": "Argentine Pila Dog", "aliases": [], "value": "13", "unit": "year"}, {"qid": "Q3092983", "label": "Argentine Pila Dog", "aliases": [], "value": "15", "unit": "year"}, {"qid": "Q3635150", "label": "Alopekis", "aliases": [], "value": "14", "unit": "year"}, {"qid": "Q3635150", "label": "Alopekis", "aliases": [], "value": "16", "unit": "year"}, {"qid": "Q16245559", "label": "Aksaray Malaklisi dog", "aliases": ["Malaklı Karabaş", "Anatolian Mastiff", "Anatolian Lion", "Aksaray Malaklisi"], "value": "12", "unit": "year"}, {"qid": "Q16245559", "label": "Aksaray Malaklisi dog", "aliases": ["Malaklı Karabaş", "Anatolian Mastiff", "Anatolian Lion", "Aksaray Malaklisi"], "value": "16", "unit": "year"}], "source": {"repo": "wikidata", "pid": "P2250", "sha256": "31cb3be4e50afe631534edcf167e736a7f4ff6322b88866395a72a9c8525c6af", "fetched": "2026-10-20T06:52:56Z", "licence": "CC0 1.0"}}
root/specialists/bld2-f7-p2250/verdict_heldout.json ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f7-p2250",
3
+ "name": "Oracle7 Built: life expectancy (Wikidata P2250)",
4
+ "tier": "B",
5
+ "split": "heldout",
6
+ "head": "oracle_release_runtime_w427",
7
+ "time": "2026-10-20T07:10:41Z",
8
+ "domain": {
9
+ "head": {
10
+ "correct": 8,
11
+ "false_yes": 0,
12
+ "wrong": 0,
13
+ "n": 19,
14
+ "p50_ms": 124.64,
15
+ "fails": [
16
+ [
17
+ "lookup",
18
+ "Perro de Presa Mallorquin: what is its lifespan?",
19
+ "act:clarify_specific",
20
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
21
+ ],
22
+ [
23
+ "lookup",
24
+ "Do you know the life expectancy of Skye Terrier?",
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
+ "lookup",
30
+ "I need the life expectancy of Cardigan Welsh Corgi, please.",
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
+ "lookup",
36
+ "Could you give me the life expectancy of Great Dane?",
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
+ "lookup",
42
+ "For Welsh Corgi, what is the lifespan?",
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
+ "lookup",
48
+ "Labrador Retriever: what is its life expectancy?",
49
+ "act:clarify_specific",
50
+ "What does \"its\" refer to? Nothing earlier in this conversation names it. Tell me the name."
51
+ ],
52
+ [
53
+ "lookup",
54
+ "Do you know the life expectancy of Africanis?",
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
+ "lookup",
60
+ "I need the life expectancy of basset hound, please.",
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": 19,
68
+ "false_yes": 0,
69
+ "wrong": 0,
70
+ "n": 19,
71
+ "p50_ms": 0.09,
72
+ "fails": []
73
+ }
74
+ },
75
+ "core": {
76
+ "head": {
77
+ "correct": 144,
78
+ "false_yes": 2
79
+ },
80
+ "spec": {
81
+ "correct": 144,
82
+ "false_yes": 2
83
+ },
84
+ "n": 400,
85
+ "swept_in": 0,
86
+ "taken_by_specialist": []
87
+ },
88
+ "self": [
89
+ {
90
+ "q": "Who are you?",
91
+ "same": true
92
+ },
93
+ {
94
+ "q": "What are you?",
95
+ "same": true
96
+ },
97
+ {
98
+ "q": "Are you a human?",
99
+ "same": true
100
+ },
101
+ {
102
+ "q": "What do you value?",
103
+ "same": true
104
+ },
105
+ {
106
+ "q": "Are you conscious?",
107
+ "same": true
108
+ }
109
+ ],
110
+ "store_mb": 0.01,
111
+ "decision": "ADMIT",
112
+ "reasons": []
113
+ }
root/specialists/bld2-f8-p2787/manifest.json ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "id": "bld2-f8-p2787",
3
+ "name": "Oracle7 Built: longest span (Wikidata P2787)",
4
+ "number": 400,
5
+ "tier": "B",
6
+ "sources": [
7
+ {
8
+ "name": "Wikidata property P2787 (longest span): items with an English Wikipedia article, fetched 2026-10-20T06:53:23Z, sha256 28800ab99bdc4513",
9
+ "licence": "CC0 1.0",
10
+ "url": "https://www.wikidata.org/wiki/Property:P2787"
11
+ }
12
+ ],
13
+ "store": {
14
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f8-p2787/table.json"
15
+ },
16
+ "organ": {
17
+ "dir": "__ORACLE7_ROOT__/specialists/bld2-f8-p2787",
18
+ "module": "organ_table_v2",
19
+ "class": "TableOrgan",
20
+ "init": {}
21
+ },
22
+ "accept": {
23
+ "kinds": [
24
+ "lookup"
25
+ ],
26
+ "declines_in_domain": [
27
+ "unknown_item"
28
+ ],
29
+ "context_regex": "\\b(?:length\\ of\\ longest\\ span|span\\ length\\ \\(longest\\)|longest\\ span\\ length|length\\ of\\ main\\ span|span\\ length\\ \\(main\\)|main\\ span\\ length|longest\\ span|main\\ span)\\b"
30
+ },
31
+ "panel": {
32
+ "path": "__ORACLE7_ROOT__/specialists/bld2-f8-p2787/panel_v1.json",
33
+ "splits": [
34
+ "dev",
35
+ "heldout"
36
+ ],
37
+ "exclude_kinds_composed": [],
38
+ "scorer_module": "scorer_table_v1",
39
+ "scorer_fn": "ok"
40
+ },
41
+ "routing_cues": [
42
+ "longest span",
43
+ "longest span length",
44
+ "main span length",
45
+ "main span",
46
+ "length of main span",
47
+ "length of longest span"
48
+ ],
49
+ "budgets": {
50
+ "latency_p50_ms": 200,
51
+ "store_mb": 8
52
+ },
53
+ "core_sample": {
54
+ "n": 400,
55
+ "seed": 20261020
56
+ },
57
+ "notes": "Built by builder_v1 for task F8 from coordinator brief (type table); property chosen from phrase 'longest span' (score 3.5). Answers carry the Wikidata item id; a named property with no thing from the table is declined."
58
+ }
root/specialists/bld2-f8-p2787/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/bld2-f8-p2787/organ_table_v2.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """organ_table_v2 - the GENERIC TABLE SPECIALIST (v2: distinctive names match in any case; who/where/when/why are not lookups) the builder instantiates: one property of named things, read from a table
2
+ the builder downloaded (table.json beside this file). Built, not trained; no phrasing templates.
3
+
4
+ Reading: the property is named in the question (its label or an alias, from the source); the thing is the longest table
5
+ label or alias found in the question AS WRITTEN (case-sensitive, whole words: a name, not a common word). Answers carry the
6
+ value, its unit and the source item id.
7
+ lookup both found: "<Thing>: <property> is <value> <unit>. [wikidata:Q..]" (a unit asked for is converted when the
8
+ table's unit is a known time, length or mass unit)
9
+ unknown_item a short direct question names the property and a capitalised name the table does not hold: an in-domain
10
+ refusal (recognise, then decline)
11
+ Narrowing (the specialist factory's shared rule, narrow_v1, shipped beside this file): story-shaped and relational turns
12
+ belong to the core; a turn carrying numbers other than those inside the matched name is a calculation, not a lookup, and
13
+ belongs to the core; only a short direct question is ever declined. Everything else: no reply."""
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import os
18
+ import re
19
+
20
+ from narrow_v1 import narrative, short_direct
21
+
22
+ HERE = os.path.dirname(os.path.abspath(__file__))
23
+ UNITS = {"second": (1, "t"), "seconds": (1, "t"), "s": (1, "t"), "minute": (60, "t"), "minutes": (60, "t"), "hour": (3600, "t"),
24
+ "hours": (3600, "t"), "day": (86400, "t"), "days": (86400, "t"), "year": (31557600, "t"), "years": (31557600, "t"),
25
+ "annum": (31557600, "t"), "millisecond": (1e-3, "t"), "microsecond": (1e-6, "t"), "nanosecond": (1e-9, "t"),
26
+ "metre": (1, "l"), "meter": (1, "l"), "metres": (1, "l"), "meters": (1, "l"), "kilometre": (1e3, "l"),
27
+ "kilometer": (1e3, "l"), "kilometres": (1e3, "l"), "kilometers": (1e3, "l"), "km": (1e3, "l"), "centimetre": (1e-2, "l"),
28
+ "millimetre": (1e-3, "l"), "mm": (1e-3, "l"), "foot": (0.3048, "l"), "feet": (0.3048, "l"), "mile": (1609.344, "l"),
29
+ "miles": (1609.344, "l"), "astronomical unit": (1.495978707e11, "l"), "au": (1.495978707e11, "l"),
30
+ "kilogram": (1, "m"), "kilograms": (1, "m"), "gram": (1e-3, "m"), "grams": (1e-3, "m"), "tonne": (1e3, "m")}
31
+ DIGITS = re.compile(r"\d+(?:[.,]\d+)?")
32
+ # a lookup is ASKED: a question, or a request for the value ("Tell me / Give me / I need / Do you know / Could you ...");
33
+ # instructions ("Write a Python function ...", "Explain ...") belong to the core
34
+ DISTINCT = re.compile(r"[\d\s]|[^\w\s]|[^\x00-\x7f]")
35
+ OF_THING = re.compile(r"\bof\s+(?:the\s+|a\s+|an\s+)?([^?.,;!]{2,40}?)\s*(?:\bin\s+\w+)?\s*[?.!]?\s*$", re.I)
36
+ NOT_A_VALUE = re.compile(r"\s*(?:who|whom|whose|where|when|why)\b", re.I)
37
+ ASKING = re.compile(r"\?\s*$|^\s*(?:what|which|how|tell me|give me|i need|do you know|could you|can you|for )", re.I)
38
+ NAMEISH = re.compile(r"(?<!^)(?<![.?!]\s)\b[A-Z][\w'.-]+")
39
+
40
+
41
+ def _norm(s):
42
+ return re.sub(r"\s+", " ", str(s).replace("–", "-").replace("’", "'")).strip()
43
+
44
+
45
+ def _fmt(v):
46
+ v = float(v)
47
+ if v == 0:
48
+ return "0"
49
+ if 1e-3 <= abs(v) < 1e7:
50
+ return "%.6g" % v
51
+ return "%.4g" % v
52
+
53
+
54
+ class TableOrgan:
55
+ def __init__(self, table="table.json"):
56
+ d = json.load(open(os.path.join(HERE, table), encoding="utf-8"))
57
+ self.prop = d["property"]
58
+ # the property as named: its label, and aliases that are several words or 5+ letters (a short one-word alias such as
59
+ # "size" names too much); whole words only, never part of a hyphenated word ("mid-size")
60
+ names = sorted({_norm(x).lower() for x in [self.prop["label"]] + [a for a in self.prop.get("aliases", [])
61
+ if " " in a.strip() or len(a.strip()) >= 5] if len(_norm(x)) >= 3}, key=len, reverse=True)
62
+ self.rx_prop = re.compile(r"(?<![\w-])(?:%s)(?![\w-])" % "|".join(re.escape(n) for n in names), re.I) if names else None
63
+ self.rows = d["rows"]
64
+ self.index, self.lindex, self.aindex = {}, {}, {}
65
+ for i, r in enumerate(self.rows):
66
+ for n in [r["label"]] + r.get("aliases", []):
67
+ k = _norm(n)
68
+ if len(k) < 2:
69
+ continue
70
+ if len(k) >= 3 and any(ch.isupper() for ch in k): # names as written ("100 Federal Street" too)
71
+ self.index.setdefault(k, []).append(i)
72
+ if DISTINCT.search(k): # a digit, symbol, non-Latin character or several words: such a
73
+ self.lindex.setdefault(k.lower(), []).append(i) # name is safe to match in any case ("carbon-14")
74
+ self.aindex.setdefault(k.lower(), []).append(i) # any name, used only where grammar names it ("... of X?")
75
+
76
+ def _thing(self, text):
77
+ """(the longest table name the question contains, the rows it names): word sequences of up to 8 words, looked up
78
+ as written first, then in any case for the distinctive names - fast whatever the table's size"""
79
+ toks = [w.strip("\"'“”‘’,;:!?") for w in _norm(text).split()]
80
+ toks = [w for w in toks if w]
81
+ for n in range(min(8, len(toks)), 0, -1):
82
+ best = None
83
+ for i in range(len(toks) - n + 1):
84
+ cand = " ".join(toks[i:i + n]).rstrip(".")
85
+ if cand in self.index:
86
+ rows = self.index[cand]
87
+ elif cand.lower() in self.lindex:
88
+ rows = self.lindex[cand.lower()]
89
+ else:
90
+ continue
91
+ if best is None or len(cand) > len(best[0]):
92
+ best = (cand, rows)
93
+ if best:
94
+ return best
95
+ return None, None
96
+
97
+ def answer(self, text, session_id="default"):
98
+ t = str(text or "")
99
+ if not self.rx_prop or not self.rx_prop.search(t) or narrative(t) or "$" in t or not ASKING.search(t):
100
+ return None
101
+ if NOT_A_VALUE.match(t): # who / where / when / why ask for something else
102
+ return None
103
+ k, idx = self._thing(t)
104
+ if not k: # "the <property> of X?": X is the thing, in any case
105
+ m = OF_THING.search(t)
106
+ if m and m.group(1).strip().lower() in self.aindex:
107
+ k = m.group(1).strip()
108
+ idx = self.aindex[k.lower()]
109
+ rest = re.sub(re.escape(k), " ", _norm(t), flags=re.I) if k else t
110
+ if DIGITS.search(rest): # a calculation, not a lookup: the core's
111
+ return None
112
+ if not k:
113
+ if short_direct(t) and NAMEISH.search(t):
114
+ return {"kind": "unknown_item", "status": "declined",
115
+ "response": "I hold the %s of %d things, but not of the one named here, so I won't guess." % (self.prop["label"], len(self.rows))}
116
+ return None
117
+ if not short_direct(t):
118
+ return None
119
+ rows = [self.rows[i] for i in idx]
120
+ r = rows[0]
121
+ val, unit = r["value"], r.get("unit", "")
122
+ m = re.search(r"\bin\s+(%s)\b" % "|".join(sorted((re.escape(u) for u in UNITS), key=len, reverse=True)), t.lower())
123
+ if m and unit and unit.lower() in UNITS and m.group(1) in UNITS:
124
+ fu, fam = UNITS[unit.lower()]
125
+ tu, tfam = UNITS[m.group(1)]
126
+ if fam == tfam:
127
+ try:
128
+ val, unit = float(val) * fu / tu, m.group(1)
129
+ except ValueError:
130
+ pass
131
+ try:
132
+ shown = _fmt(val)
133
+ except (TypeError, ValueError):
134
+ shown = str(val)
135
+ extra = "" if len(rows) == 1 else " (the source lists %d values; this is the first)" % len(rows)
136
+ return {"kind": "lookup", "status": "answered",
137
+ "response": "%s: %s is %s%s.%s [wikidata:%s]" % (r["label"], self.prop["label"], shown, (" " + unit) if unit else "", extra, r["qid"])}
root/specialists/bld2-f8-p2787/panel_v1.json ADDED
@@ -0,0 +1,822 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "split": "dev",
4
+ "kind": "lookup",
5
+ "q": "What is the longest span length of Xiangshan Harbor Bridge?",
6
+ "valid": true,
7
+ "expect": "688",
8
+ "unit": "metre",
9
+ "dtype": "quantity",
10
+ "qid": "Q15944436",
11
+ "why": "longest span of Xiangshan Harbor Bridge (Wikidata Q15944436)"
12
+ },
13
+ {
14
+ "split": "dev",
15
+ "kind": "lookup",
16
+ "q": "Tell me the longest span of Nijmegen railway bridge.",
17
+ "valid": true,
18
+ "expect": "235",
19
+ "unit": "metre",
20
+ "dtype": "quantity",
21
+ "qid": "Q1311533",
22
+ "why": "longest span of Nijmegen railway bridge (Wikidata Q1311533)"
23
+ },
24
+ {
25
+ "split": "dev",
26
+ "kind": "lookup",
27
+ "q": "What's the longest span for Si-o-se Pol?",
28
+ "valid": true,
29
+ "expect": "5.6",
30
+ "unit": "metre",
31
+ "dtype": "quantity",
32
+ "qid": "Q667674",
33
+ "why": "longest span of Si-o-se Pol (Wikidata Q667674)"
34
+ },
35
+ {
36
+ "split": "dev",
37
+ "kind": "lookup",
38
+ "q": "What is the longest span of Viaduc des Rochers Noirs?",
39
+ "valid": true,
40
+ "expect": "172",
41
+ "unit": "metre",
42
+ "dtype": "quantity",
43
+ "qid": "Q527017",
44
+ "why": "longest span of Viaduc des Rochers Noirs (Wikidata Q527017)"
45
+ },
46
+ {
47
+ "split": "dev",
48
+ "kind": "lookup",
49
+ "q": "Tell me the length of longest span of Pont Jacques-Chaban-Delmas.",
50
+ "valid": true,
51
+ "expect": "110",
52
+ "unit": "metre",
53
+ "dtype": "quantity",
54
+ "qid": "Q3396576",
55
+ "why": "longest span of Pont Jacques-Chaban-Delmas (Wikidata Q3396576)"
56
+ },
57
+ {
58
+ "split": "dev",
59
+ "kind": "lookup",
60
+ "q": "What's the longest span for Three Countries Bridge?",
61
+ "valid": true,
62
+ "expect": "238",
63
+ "unit": "metre",
64
+ "dtype": "quantity",
65
+ "qid": "Q205682",
66
+ "why": "longest span of Three Countries Bridge (Wikidata Q205682)"
67
+ },
68
+ {
69
+ "split": "dev",
70
+ "kind": "lookup",
71
+ "q": "What is the longest span of Bandra–Worli Sea Link?",
72
+ "valid": true,
73
+ "expect": "820",
74
+ "unit": "foot",
75
+ "dtype": "quantity",
76
+ "qid": "Q314572",
77
+ "why": "longest span of Bandra–Worli Sea Link (Wikidata Q314572)"
78
+ },
79
+ {
80
+ "split": "dev",
81
+ "kind": "lookup",
82
+ "q": "Tell me the longest span of Hohenzollern Bridge.",
83
+ "valid": true,
84
+ "expect": "167.75",
85
+ "unit": "metre",
86
+ "dtype": "quantity",
87
+ "qid": "Q696762",
88
+ "why": "longest span of Hohenzollern Bridge (Wikidata Q696762)"
89
+ },
90
+ {
91
+ "split": "dev",
92
+ "kind": "lookup",
93
+ "q": "What's the main span length for Slauerhoffbrug?",
94
+ "valid": true,
95
+ "expect": "15",
96
+ "unit": "metre",
97
+ "dtype": "quantity",
98
+ "qid": "Q2293779",
99
+ "why": "longest span of Slauerhoffbrug (Wikidata Q2293779)"
100
+ },
101
+ {
102
+ "split": "dev",
103
+ "kind": "lookup",
104
+ "q": "What is the longest span of The Iron Bridge?",
105
+ "valid": true,
106
+ "expect": "30.63",
107
+ "unit": "metre",
108
+ "dtype": "quantity",
109
+ "qid": "Q99200",
110
+ "why": "longest span of The Iron Bridge (Wikidata Q99200)"
111
+ },
112
+ {
113
+ "split": "dev",
114
+ "kind": "lookup",
115
+ "q": "Tell me the longest span of Jamestown Verrazzano Bridge.",
116
+ "valid": true,
117
+ "expect": "490",
118
+ "unit": "metre",
119
+ "dtype": "quantity",
120
+ "qid": "Q6146273",
121
+ "why": "longest span of Jamestown Verrazzano Bridge (Wikidata Q6146273)"
122
+ },
123
+ {
124
+ "split": "dev",
125
+ "kind": "lookup",
126
+ "q": "What's the longest span for Masnedsund Bridge?",
127
+ "valid": true,
128
+ "expect": "25",
129
+ "unit": "metre",
130
+ "dtype": "quantity",
131
+ "qid": "Q1636588",
132
+ "why": "longest span of Masnedsund Bridge (Wikidata Q1636588)"
133
+ },
134
+ {
135
+ "split": "dev",
136
+ "kind": "lookup",
137
+ "q": "What is the span length (main) of Lewis and Clark Bridge?",
138
+ "valid": true,
139
+ "expect": "366",
140
+ "unit": "metre",
141
+ "dtype": "quantity",
142
+ "qid": "Q1822180",
143
+ "why": "longest span of Lewis and Clark Bridge (Wikidata Q1822180)"
144
+ },
145
+ {
146
+ "split": "dev",
147
+ "kind": "lookup",
148
+ "q": "Tell me the longest span of Sørstraumen bridge.",
149
+ "valid": true,
150
+ "expect": "120",
151
+ "unit": "metre",
152
+ "dtype": "quantity",
153
+ "qid": "Q7666651",
154
+ "why": "longest span of Sørstraumen bridge (Wikidata Q7666651)"
155
+ },
156
+ {
157
+ "split": "dev",
158
+ "kind": "lookup",
159
+ "q": "What's the longest span for Fremont Bridge?",
160
+ "valid": true,
161
+ "expect": "382",
162
+ "unit": "metre",
163
+ "dtype": "quantity",
164
+ "qid": "Q3396538",
165
+ "why": "longest span of Fremont Bridge (Wikidata Q3396538)"
166
+ },
167
+ {
168
+ "split": "dev",
169
+ "kind": "lookup",
170
+ "q": "What is the longest span of Libertador General San Martín Bridge?",
171
+ "valid": true,
172
+ "expect": "222",
173
+ "unit": "metre",
174
+ "dtype": "quantity",
175
+ "qid": "Q1132178",
176
+ "why": "longest span of Libertador General San Martín Bridge (Wikidata Q1132178)"
177
+ },
178
+ {
179
+ "split": "dev",
180
+ "kind": "lookup",
181
+ "q": "Tell me the main span of Beisfjord bridge.",
182
+ "valid": true,
183
+ "expect": "40.6",
184
+ "unit": "metre",
185
+ "dtype": "quantity",
186
+ "qid": "Q1777369",
187
+ "why": "longest span of Beisfjord bridge (Wikidata Q1777369)"
188
+ },
189
+ {
190
+ "split": "dev",
191
+ "kind": "lookup",
192
+ "q": "What's the longest span for Åselistraumen bridge?",
193
+ "valid": true,
194
+ "expect": "30",
195
+ "unit": "metre",
196
+ "dtype": "quantity",
197
+ "qid": "Q1777394",
198
+ "why": "longest span of Åselistraumen bridge (Wikidata Q1777394)"
199
+ },
200
+ {
201
+ "split": "dev",
202
+ "kind": "lookup",
203
+ "q": "What is the longest span of Emmerich Rhine Bridge?",
204
+ "valid": true,
205
+ "expect": "500",
206
+ "unit": "metre",
207
+ "dtype": "quantity",
208
+ "qid": "Q469605",
209
+ "why": "longest span of Emmerich Rhine Bridge (Wikidata Q469605)"
210
+ },
211
+ {
212
+ "split": "dev",
213
+ "kind": "lookup",
214
+ "q": "Tell me the longest span of Sydney Harbour Bridge.",
215
+ "valid": true,
216
+ "expect": "503",
217
+ "unit": "metre",
218
+ "dtype": "quantity",
219
+ "qid": "Q54495",
220
+ "why": "longest span of Sydney Harbour Bridge (Wikidata Q54495)"
221
+ },
222
+ {
223
+ "split": "dev",
224
+ "kind": "lookup",
225
+ "q": "What's the span length (longest) for Saint-Nazaire Bridge?",
226
+ "valid": true,
227
+ "expect": "404",
228
+ "unit": "metre",
229
+ "dtype": "quantity",
230
+ "qid": "Q1060111",
231
+ "why": "longest span of Saint-Nazaire Bridge (Wikidata Q1060111)"
232
+ },
233
+ {
234
+ "split": "dev",
235
+ "kind": "lookup",
236
+ "q": "What is the longest span of Nanjing Baguazhou Yangtze River Bridge?",
237
+ "valid": true,
238
+ "expect": "628",
239
+ "unit": "metre",
240
+ "dtype": "quantity",
241
+ "qid": "Q210764",
242
+ "why": "longest span of Nanjing Baguazhou Yangtze River Bridge (Wikidata Q210764)"
243
+ },
244
+ {
245
+ "split": "dev",
246
+ "kind": "lookup",
247
+ "q": "Tell me the longest span of Bøkfjord Bridge.",
248
+ "valid": true,
249
+ "expect": "120",
250
+ "unit": "metre",
251
+ "dtype": "quantity",
252
+ "qid": "Q31079799",
253
+ "why": "longest span of Bøkfjord Bridge (Wikidata Q31079799)"
254
+ },
255
+ {
256
+ "split": "dev",
257
+ "kind": "lookup",
258
+ "q": "What's the longest span for Sogge Bridge?",
259
+ "valid": true,
260
+ "expect": "29",
261
+ "unit": "metre",
262
+ "dtype": "quantity",
263
+ "qid": "Q7554492",
264
+ "why": "longest span of Sogge Bridge (Wikidata Q7554492)"
265
+ },
266
+ {
267
+ "split": "dev",
268
+ "kind": "lookup",
269
+ "q": "What is the length of main span of Iron Gate II Hydroelectric Power Station?",
270
+ "valid": true,
271
+ "expect": "40",
272
+ "unit": "metre",
273
+ "dtype": "quantity",
274
+ "qid": "Q1136390",
275
+ "why": "longest span of Iron Gate II Hydroelectric Power Station (Wikidata Q1136390)"
276
+ },
277
+ {
278
+ "split": "dev",
279
+ "kind": "lookup",
280
+ "q": "Tell me the longest span of Robert O. Norris Bridge.",
281
+ "valid": true,
282
+ "expect": "648",
283
+ "unit": "foot",
284
+ "dtype": "quantity",
285
+ "qid": "Q7348116",
286
+ "why": "longest span of Robert O. Norris Bridge (Wikidata Q7348116)"
287
+ },
288
+ {
289
+ "split": "dev",
290
+ "kind": "lookup",
291
+ "q": "What's the longest span for Børøy bridge?",
292
+ "valid": true,
293
+ "expect": "43",
294
+ "unit": "metre",
295
+ "dtype": "quantity",
296
+ "qid": "Q4588847",
297
+ "why": "longest span of Børøy bridge (Wikidata Q4588847)"
298
+ },
299
+ {
300
+ "split": "dev",
301
+ "kind": "lookup",
302
+ "q": "What is the longest span of Marine Parkway-Gil Hodges Memorial Bridge?",
303
+ "valid": true,
304
+ "expect": "164.6",
305
+ "unit": "metre",
306
+ "dtype": "quantity",
307
+ "qid": "Q2487804",
308
+ "why": "longest span of Marine Parkway-Gil Hodges Memorial Bridge (Wikidata Q2487804)"
309
+ },
310
+ {
311
+ "split": "dev",
312
+ "kind": "lookup",
313
+ "q": "Tell me the longest span length of Duge Bridge.",
314
+ "valid": true,
315
+ "expect": "720",
316
+ "unit": "metre",
317
+ "dtype": "quantity",
318
+ "qid": "Q18109819",
319
+ "why": "longest span of Duge Bridge (Wikidata Q18109819)"
320
+ },
321
+ {
322
+ "split": "dev",
323
+ "kind": "lookup",
324
+ "q": "What's the longest span for Pont de Noirmoutier?",
325
+ "valid": true,
326
+ "expect": "88",
327
+ "unit": "metre",
328
+ "dtype": "quantity",
329
+ "qid": "Q3397079",
330
+ "why": "longest span of Pont de Noirmoutier (Wikidata Q3397079)"
331
+ },
332
+ {
333
+ "split": "dev",
334
+ "kind": "invented",
335
+ "q": "What is the longest span of Lompellbrax?",
336
+ "valid": false,
337
+ "expect": null,
338
+ "unit": "",
339
+ "dtype": "quantity",
340
+ "why": "invented name: no such thing"
341
+ },
342
+ {
343
+ "split": "dev",
344
+ "kind": "invented",
345
+ "q": "Tell me the longest span of Yaxquinsnar.",
346
+ "valid": false,
347
+ "expect": null,
348
+ "unit": "",
349
+ "dtype": "quantity",
350
+ "why": "invented name: no such thing"
351
+ },
352
+ {
353
+ "split": "dev",
354
+ "kind": "invented",
355
+ "q": "What's the longest span for Snartaluth?",
356
+ "valid": false,
357
+ "expect": null,
358
+ "unit": "",
359
+ "dtype": "quantity",
360
+ "why": "invented name: no such thing"
361
+ },
362
+ {
363
+ "split": "dev",
364
+ "kind": "invented",
365
+ "q": "What is the longest span of Mirlomyax?",
366
+ "valid": false,
367
+ "expect": null,
368
+ "unit": "",
369
+ "dtype": "quantity",
370
+ "why": "invented name: no such thing"
371
+ },
372
+ {
373
+ "split": "dev",
374
+ "kind": "invented",
375
+ "q": "Tell me the longest span of Velkevvel.",
376
+ "valid": false,
377
+ "expect": null,
378
+ "unit": "",
379
+ "dtype": "quantity",
380
+ "why": "invented name: no such thing"
381
+ },
382
+ {
383
+ "split": "dev",
384
+ "kind": "invented",
385
+ "q": "What's the longest span for Uthyaxyax?",
386
+ "valid": false,
387
+ "expect": null,
388
+ "unit": "",
389
+ "dtype": "quantity",
390
+ "why": "invented name: no such thing"
391
+ },
392
+ {
393
+ "split": "dev",
394
+ "kind": "not_held",
395
+ "q": "What is the longest span of the Pacific Ocean?",
396
+ "valid": false,
397
+ "expect": null,
398
+ "unit": "",
399
+ "dtype": "quantity",
400
+ "why": "the table does not hold it"
401
+ },
402
+ {
403
+ "split": "dev",
404
+ "kind": "not_held",
405
+ "q": "Tell me the longest span of the Eiffel Tower.",
406
+ "valid": false,
407
+ "expect": null,
408
+ "unit": "",
409
+ "dtype": "quantity",
410
+ "why": "the table does not hold it"
411
+ },
412
+ {
413
+ "split": "heldout",
414
+ "kind": "lookup",
415
+ "q": "Qadir Bridge: what is its longest span length?",
416
+ "valid": true,
417
+ "expect": "212",
418
+ "unit": "metre",
419
+ "dtype": "quantity",
420
+ "qid": "Q5845703",
421
+ "why": "longest span of Qadir Bridge (Wikidata Q5845703)"
422
+ },
423
+ {
424
+ "split": "heldout",
425
+ "kind": "lookup",
426
+ "q": "Do you know the longest span of Erskine Bridge?",
427
+ "valid": true,
428
+ "expect": "305",
429
+ "unit": "metre",
430
+ "dtype": "quantity",
431
+ "qid": "Q5395818",
432
+ "why": "longest span of Erskine Bridge (Wikidata Q5395818)"
433
+ },
434
+ {
435
+ "split": "heldout",
436
+ "kind": "lookup",
437
+ "q": "I need the longest span of Nordhordland Bridge, please.",
438
+ "valid": true,
439
+ "expect": "172",
440
+ "unit": "metre",
441
+ "dtype": "quantity",
442
+ "qid": "Q1998104",
443
+ "why": "longest span of Nordhordland Bridge (Wikidata Q1998104)"
444
+ },
445
+ {
446
+ "split": "heldout",
447
+ "kind": "lookup",
448
+ "q": "Could you give me the longest span of Kjellingstraumen bridge?",
449
+ "valid": true,
450
+ "expect": "260",
451
+ "unit": "metre",
452
+ "dtype": "quantity",
453
+ "qid": "Q4585915",
454
+ "why": "longest span of Kjellingstraumen bridge (Wikidata Q4585915)"
455
+ },
456
+ {
457
+ "split": "heldout",
458
+ "kind": "lookup",
459
+ "q": "For Jiangyin Yangtze River Bridge, what is the length of longest span?",
460
+ "valid": true,
461
+ "expect": "1385",
462
+ "unit": "metre",
463
+ "dtype": "quantity",
464
+ "qid": "Q2625335",
465
+ "why": "longest span of Jiangyin Yangtze River Bridge (Wikidata Q2625335)"
466
+ },
467
+ {
468
+ "split": "heldout",
469
+ "kind": "lookup",
470
+ "q": "Albert Bridge: what is its longest span?",
471
+ "valid": true,
472
+ "expect": "56",
473
+ "unit": "metre",
474
+ "dtype": "quantity",
475
+ "qid": "Q1972207",
476
+ "why": "longest span of Albert Bridge (Wikidata Q1972207)"
477
+ },
478
+ {
479
+ "split": "heldout",
480
+ "kind": "lookup",
481
+ "q": "Do you know the longest span of Taoyaomen Bridge?",
482
+ "valid": true,
483
+ "expect": "580",
484
+ "unit": "metre",
485
+ "dtype": "quantity",
486
+ "qid": "Q7684345",
487
+ "why": "longest span of Taoyaomen Bridge (Wikidata Q7684345)"
488
+ },
489
+ {
490
+ "split": "heldout",
491
+ "kind": "lookup",
492
+ "q": "I need the longest span of Millau Viaduct, please.",
493
+ "valid": true,
494
+ "expect": "342",
495
+ "unit": "metre",
496
+ "dtype": "quantity",
497
+ "qid": "Q99236",
498
+ "why": "longest span of Millau Viaduct (Wikidata Q99236)"
499
+ },
500
+ {
501
+ "split": "heldout",
502
+ "kind": "lookup",
503
+ "q": "Could you give me the main span length of Bridge of the Americas?",
504
+ "valid": true,
505
+ "expect": "344",
506
+ "unit": "metre",
507
+ "dtype": "quantity",
508
+ "qid": "Q216061",
509
+ "why": "longest span of Bridge of the Americas (Wikidata Q216061)"
510
+ },
511
+ {
512
+ "split": "heldout",
513
+ "kind": "lookup",
514
+ "q": "For Quebec Bridge, what is the longest span?",
515
+ "valid": true,
516
+ "expect": "549",
517
+ "unit": "metre",
518
+ "dtype": "quantity",
519
+ "qid": "Q1427489",
520
+ "why": "longest span of Quebec Bridge (Wikidata Q1427489)"
521
+ },
522
+ {
523
+ "split": "heldout",
524
+ "kind": "lookup",
525
+ "q": "London Bridge: what is its longest span?",
526
+ "valid": true,
527
+ "expect": "104",
528
+ "unit": "metre",
529
+ "dtype": "quantity",
530
+ "qid": "Q130206",
531
+ "why": "longest span of London Bridge (Wikidata Q130206)"
532
+ },
533
+ {
534
+ "split": "heldout",
535
+ "kind": "lookup",
536
+ "q": "Do you know the longest span of Panther Hollow Bridge?",
537
+ "valid": true,
538
+ "expect": "360",
539
+ "unit": "foot",
540
+ "dtype": "quantity",
541
+ "qid": "Q7131793",
542
+ "why": "longest span of Panther Hollow Bridge (Wikidata Q7131793)"
543
+ },
544
+ {
545
+ "split": "heldout",
546
+ "kind": "lookup",
547
+ "q": "I need the span length (main) of Mike O'Callaghan–Pat Tillman Memorial Bridge, please.",
548
+ "valid": true,
549
+ "expect": "323",
550
+ "unit": "metre",
551
+ "dtype": "quantity",
552
+ "qid": "Q1293993",
553
+ "why": "longest span of Mike O'Callaghan–Pat Tillman Memorial Bridge (Wikidata Q1293993)"
554
+ },
555
+ {
556
+ "split": "heldout",
557
+ "kind": "lookup",
558
+ "q": "Could you give me the longest span of Queen Alexandrine Bridge?",
559
+ "valid": true,
560
+ "expect": "127.5",
561
+ "unit": "metre",
562
+ "dtype": "quantity",
563
+ "qid": "Q382605",
564
+ "why": "longest span of Queen Alexandrine Bridge (Wikidata Q382605)"
565
+ },
566
+ {
567
+ "split": "heldout",
568
+ "kind": "lookup",
569
+ "q": "For Market Street Bridge, what is the longest span?",
570
+ "valid": true,
571
+ "expect": "700.2",
572
+ "unit": "foot",
573
+ "dtype": "quantity",
574
+ "qid": "Q6770753",
575
+ "why": "longest span of Market Street Bridge (Wikidata Q6770753)"
576
+ },
577
+ {
578
+ "split": "heldout",
579
+ "kind": "lookup",
580
+ "q": "Raisi Bridge: what is its longest span?",
581
+ "valid": true,
582
+ "expect": "180",
583
+ "unit": "metre",
584
+ "dtype": "quantity",
585
+ "qid": "Q138862866",
586
+ "why": "longest span of Raisi Bridge (Wikidata Q138862866)"
587
+ },
588
+ {
589
+ "split": "heldout",
590
+ "kind": "lookup",
591
+ "q": "Do you know the main span of Midsund Bridge?",
592
+ "valid": true,
593
+ "expect": "96",
594
+ "unit": "metre",
595
+ "dtype": "quantity",
596
+ "qid": "Q6843053",
597
+ "why": "longest span of Midsund Bridge (Wikidata Q6843053)"
598
+ },
599
+ {
600
+ "split": "heldout",
601
+ "kind": "lookup",
602
+ "q": "I need the longest span of Northern Spire Bridge, please.",
603
+ "valid": true,
604
+ "expect": "240",
605
+ "unit": "metre",
606
+ "dtype": "quantity",
607
+ "qid": "Q7012379",
608
+ "why": "longest span of Northern Spire Bridge (Wikidata Q7012379)"
609
+ },
610
+ {
611
+ "split": "heldout",
612
+ "kind": "lookup",
613
+ "q": "Could you give me the longest span of Tancarville Bridge?",
614
+ "valid": true,
615
+ "expect": "608",
616
+ "unit": "metre",
617
+ "dtype": "quantity",
618
+ "qid": "Q2351952",
619
+ "why": "longest span of Tancarville Bridge (Wikidata Q2351952)"
620
+ },
621
+ {
622
+ "split": "heldout",
623
+ "kind": "lookup",
624
+ "q": "For Europabrücke, what is the longest span?",
625
+ "valid": true,
626
+ "expect": "198",
627
+ "unit": "metre",
628
+ "dtype": "quantity",
629
+ "qid": "Q520543",
630
+ "why": "longest span of Europabrücke (Wikidata Q520543)"
631
+ },
632
+ {
633
+ "split": "heldout",
634
+ "kind": "lookup",
635
+ "q": "Kocher Viaduct: what is its span length (longest)?",
636
+ "valid": true,
637
+ "expect": "138",
638
+ "unit": "metre",
639
+ "dtype": "quantity",
640
+ "qid": "Q315075",
641
+ "why": "longest span of Kocher Viaduct (Wikidata Q315075)"
642
+ },
643
+ {
644
+ "split": "heldout",
645
+ "kind": "lookup",
646
+ "q": "Do you know the longest span of Claiborne Pell Newport Bridge?",
647
+ "valid": true,
648
+ "expect": "490",
649
+ "unit": "metre",
650
+ "dtype": "quantity",
651
+ "qid": "Q1094720",
652
+ "why": "longest span of Claiborne Pell Newport Bridge (Wikidata Q1094720)"
653
+ },
654
+ {
655
+ "split": "heldout",
656
+ "kind": "lookup",
657
+ "q": "I need the longest span of Gordie Howe International Bridge, please.",
658
+ "valid": true,
659
+ "expect": "853",
660
+ "unit": "metre",
661
+ "dtype": "quantity",
662
+ "qid": "Q5266001",
663
+ "why": "longest span of Gordie Howe International Bridge (Wikidata Q5266001)"
664
+ },
665
+ {
666
+ "split": "heldout",
667
+ "kind": "lookup",
668
+ "q": "Could you give me the longest span of Waldschlösschen Bridge?",
669
+ "valid": true,
670
+ "expect": "148",
671
+ "unit": "metre",
672
+ "dtype": "quantity",
673
+ "qid": "Q643881",
674
+ "why": "longest span of Waldschlösschen Bridge (Wikidata Q643881)"
675
+ },
676
+ {
677
+ "split": "heldout",
678
+ "kind": "lookup",
679
+ "q": "For Hinode Bridge, what is the length of main span?",
680
+ "valid": true,
681
+ "expect": "45",
682
+ "unit": "metre",
683
+ "dtype": "quantity",
684
+ "qid": "Q59123066",
685
+ "why": "longest span of Hinode Bridge (Wikidata Q59123066)"
686
+ },
687
+ {
688
+ "split": "heldout",
689
+ "kind": "lookup",
690
+ "q": "Manhattan Bridge: what is its longest span?",
691
+ "valid": true,
692
+ "expect": "451",
693
+ "unit": "metre",
694
+ "dtype": "quantity",
695
+ "qid": "Q125050",
696
+ "why": "longest span of Manhattan Bridge (Wikidata Q125050)"
697
+ },
698
+ {
699
+ "split": "heldout",
700
+ "kind": "lookup",
701
+ "q": "Do you know the longest span of Amizade Bridge?",
702
+ "valid": true,
703
+ "expect": "112",
704
+ "unit": "metre",
705
+ "dtype": "quantity",
706
+ "qid": "Q1318003",
707
+ "why": "longest span of Amizade Bridge (Wikidata Q1318003)"
708
+ },
709
+ {
710
+ "split": "heldout",
711
+ "kind": "lookup",
712
+ "q": "I need the longest span of Hangzhou Bay Bridge, please.",
713
+ "valid": true,
714
+ "expect": "448",
715
+ "unit": "metre",
716
+ "dtype": "quantity",
717
+ "qid": "Q326249",
718
+ "why": "longest span of Hangzhou Bay Bridge (Wikidata Q326249)"
719
+ },
720
+ {
721
+ "split": "heldout",
722
+ "kind": "lookup",
723
+ "q": "Could you give me the longest span length of Prince of Wales Bridge?",
724
+ "valid": true,
725
+ "expect": "456",
726
+ "unit": "metre",
727
+ "dtype": "quantity",
728
+ "qid": "Q1287969",
729
+ "why": "longest span of Prince of Wales Bridge (Wikidata Q1287969)"
730
+ },
731
+ {
732
+ "split": "heldout",
733
+ "kind": "lookup",
734
+ "q": "For Tamar Bridge, what is the longest span?",
735
+ "valid": true,
736
+ "expect": "335",
737
+ "unit": "metre",
738
+ "dtype": "quantity",
739
+ "qid": "Q7680729",
740
+ "why": "longest span of Tamar Bridge (Wikidata Q7680729)"
741
+ },
742
+ {
743
+ "split": "heldout",
744
+ "kind": "invented",
745
+ "q": "Trinpellmir: what is its longest span?",
746
+ "valid": false,
747
+ "expect": null,
748
+ "unit": "",
749
+ "dtype": "quantity",
750
+ "why": "invented name: no such thing"
751
+ },
752
+ {
753
+ "split": "heldout",
754
+ "kind": "invented",
755
+ "q": "Do you know the longest span of Trintalkev?",
756
+ "valid": false,
757
+ "expect": null,
758
+ "unit": "",
759
+ "dtype": "quantity",
760
+ "why": "invented name: no such thing"
761
+ },
762
+ {
763
+ "split": "heldout",
764
+ "kind": "invented",
765
+ "q": "I need the longest span of Kevsnartrin, please.",
766
+ "valid": false,
767
+ "expect": null,
768
+ "unit": "",
769
+ "dtype": "quantity",
770
+ "why": "invented name: no such thing"
771
+ },
772
+ {
773
+ "split": "heldout",
774
+ "kind": "invented",
775
+ "q": "Could you give me the longest span of Zordexuth?",
776
+ "valid": false,
777
+ "expect": null,
778
+ "unit": "",
779
+ "dtype": "quantity",
780
+ "why": "invented name: no such thing"
781
+ },
782
+ {
783
+ "split": "heldout",
784
+ "kind": "invented",
785
+ "q": "For Pellkevvel, what is the longest span?",
786
+ "valid": false,
787
+ "expect": null,
788
+ "unit": "",
789
+ "dtype": "quantity",
790
+ "why": "invented name: no such thing"
791
+ },
792
+ {
793
+ "split": "heldout",
794
+ "kind": "invented",
795
+ "q": "Dexuthyax: what is its longest span?",
796
+ "valid": false,
797
+ "expect": null,
798
+ "unit": "",
799
+ "dtype": "quantity",
800
+ "why": "invented name: no such thing"
801
+ },
802
+ {
803
+ "split": "heldout",
804
+ "kind": "not_held",
805
+ "q": "Do you know the longest span of the Eiffel Tower?",
806
+ "valid": false,
807
+ "expect": null,
808
+ "unit": "",
809
+ "dtype": "quantity",
810
+ "why": "the table does not hold it"
811
+ },
812
+ {
813
+ "split": "heldout",
814
+ "kind": "not_held",
815
+ "q": "I need the longest span of Mount Everest, please.",
816
+ "valid": false,
817
+ "expect": null,
818
+ "unit": "",
819
+ "dtype": "quantity",
820
+ "why": "the table does not hold it"
821
+ }
822
+ ]