noether-physics 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. noether_physics-0.1.0/.gitattributes +10 -0
  2. noether_physics-0.1.0/.gitignore +26 -0
  3. noether_physics-0.1.0/LICENSE +21 -0
  4. noether_physics-0.1.0/PKG-INFO +193 -0
  5. noether_physics-0.1.0/README.md +151 -0
  6. noether_physics-0.1.0/docs/DEFERRED.md +276 -0
  7. noether_physics-0.1.0/pyproject.toml +84 -0
  8. noether_physics-0.1.0/research/README.md +24 -0
  9. noether_physics-0.1.0/research/benchmarks/.gitkeep +0 -0
  10. noether_physics-0.1.0/research/benchmarks/equations.yaml +149 -0
  11. noether_physics-0.1.0/research/benchmarks/retrieval.yaml +62 -0
  12. noether_physics-0.1.0/research/labels/.gitkeep +0 -0
  13. noether_physics-0.1.0/research/results/.gitkeep +0 -0
  14. noether_physics-0.1.0/research/results/citations.json +38 -0
  15. noether_physics-0.1.0/research/results/equations.json +12 -0
  16. noether_physics-0.1.0/research/results/retrieval.json +31 -0
  17. noether_physics-0.1.0/research/sources/source_registry.yaml +74 -0
  18. noether_physics-0.1.0/scripts/seed_corpus.py +98 -0
  19. noether_physics-0.1.0/server.json +20 -0
  20. noether_physics-0.1.0/skill/README.md +9 -0
  21. noether_physics-0.1.0/skill/noether/SKILL.md +87 -0
  22. noether_physics-0.1.0/src/noether/__init__.py +11 -0
  23. noether_physics-0.1.0/src/noether/answer/__init__.py +0 -0
  24. noether_physics-0.1.0/src/noether/answer/pipeline.py +244 -0
  25. noether_physics-0.1.0/src/noether/answer/records.py +208 -0
  26. noether_physics-0.1.0/src/noether/bench.py +267 -0
  27. noether_physics-0.1.0/src/noether/cassettes.py +167 -0
  28. noether_physics-0.1.0/src/noether/cli.py +611 -0
  29. noether_physics-0.1.0/src/noether/cli_explain.py +149 -0
  30. noether_physics-0.1.0/src/noether/compute/__init__.py +0 -0
  31. noether_physics-0.1.0/src/noether/compute/normalise.py +414 -0
  32. noether_physics-0.1.0/src/noether/compute/plots.py +155 -0
  33. noether_physics-0.1.0/src/noether/compute/run.py +215 -0
  34. noether_physics-0.1.0/src/noether/compute/symbolic.py +313 -0
  35. noether_physics-0.1.0/src/noether/compute/units.py +280 -0
  36. noether_physics-0.1.0/src/noether/config.py +100 -0
  37. noether_physics-0.1.0/src/noether/draft.py +183 -0
  38. noether_physics-0.1.0/src/noether/explain/__init__.py +0 -0
  39. noether_physics-0.1.0/src/noether/explain/compose.py +244 -0
  40. noether_physics-0.1.0/src/noether/explain/concepts.py +143 -0
  41. noether_physics-0.1.0/src/noether/explain/library.py +496 -0
  42. noether_physics-0.1.0/src/noether/export.py +209 -0
  43. noether_physics-0.1.0/src/noether/index/__init__.py +0 -0
  44. noether_physics-0.1.0/src/noether/index/chunk.py +80 -0
  45. noether_physics-0.1.0/src/noether/index/embed.py +106 -0
  46. noether_physics-0.1.0/src/noether/index/retrieve.py +145 -0
  47. noether_physics-0.1.0/src/noether/index/store.py +384 -0
  48. noether_physics-0.1.0/src/noether/ingest/__init__.py +0 -0
  49. noether_physics-0.1.0/src/noether/ingest/bibliography.py +184 -0
  50. noether_physics-0.1.0/src/noether/ingest/document.py +195 -0
  51. noether_physics-0.1.0/src/noether/ingest/latex.py +439 -0
  52. noether_physics-0.1.0/src/noether/ingest/preprocess.py +347 -0
  53. noether_physics-0.1.0/src/noether/library.py +228 -0
  54. noether_physics-0.1.0/src/noether/maps.py +226 -0
  55. noether_physics-0.1.0/src/noether/mcp_server.py +434 -0
  56. noether_physics-0.1.0/src/noether/netclient.py +215 -0
  57. noether_physics-0.1.0/src/noether/provenance/__init__.py +0 -0
  58. noether_physics-0.1.0/src/noether/provenance/bundle.py +184 -0
  59. noether_physics-0.1.0/src/noether/sim/__init__.py +0 -0
  60. noether_physics-0.1.0/src/noether/sim/classical.py +271 -0
  61. noether_physics-0.1.0/src/noether/sim/engine.py +163 -0
  62. noether_physics-0.1.0/src/noether/sim/models.py +114 -0
  63. noether_physics-0.1.0/src/noether/sim/quantum.py +339 -0
  64. noether_physics-0.1.0/src/noether/sim/result.py +121 -0
  65. noether_physics-0.1.0/src/noether/sources/__init__.py +0 -0
  66. noether_physics-0.1.0/src/noether/sources/arxiv.py +279 -0
  67. noether_physics-0.1.0/src/noether/sources/registry.py +79 -0
  68. noether_physics-0.1.0/src/noether/sources/resolvers.py +270 -0
  69. noether_physics-0.1.0/src/noether/verify/__init__.py +0 -0
  70. noether_physics-0.1.0/src/noether/verify/citations.py +313 -0
  71. noether_physics-0.1.0/src/noether/verify/gate.py +221 -0
  72. noether_physics-0.1.0/src/noether/verify/matching.py +304 -0
  73. noether_physics-0.1.0/src/noether/watch.py +146 -0
  74. noether_physics-0.1.0/tests/__init__.py +0 -0
  75. noether_physics-0.1.0/tests/conftest.py +47 -0
  76. noether_physics-0.1.0/tests/fixtures/arxiv_feed.xml +40 -0
  77. noether_physics-0.1.0/tests/fixtures/cassettes/.gitkeep +0 -0
  78. noether_physics-0.1.0/tests/test_arxiv.py +93 -0
  79. noether_physics-0.1.0/tests/test_cassettes.py +95 -0
  80. noether_physics-0.1.0/tests/test_document.py +96 -0
  81. noether_physics-0.1.0/tests/test_index_and_gate.py +325 -0
  82. noether_physics-0.1.0/tests/test_ingest.py +300 -0
  83. noether_physics-0.1.0/tests/test_matching.py +156 -0
  84. noether_physics-0.1.0/tests/test_mcp_server.py +98 -0
  85. noether_physics-0.1.0/tests/test_netclient.py +85 -0
  86. noether_physics-0.1.0/tests/test_outputs.py +247 -0
  87. noether_physics-0.1.0/tests/test_sim_and_explain.py +318 -0
  88. noether_physics-0.1.0/tests/test_source_hygiene.py +126 -0
  89. noether_physics-0.1.0/tests/test_symbolic.py +272 -0
  90. noether_physics-0.1.0/uv.lock +1899 -0
@@ -0,0 +1,10 @@
1
+ # Normalise line endings so the repo is identical on every platform.
2
+ # Without this, a Windows checkout rewrites every file to CRLF and the next
3
+ # contributor on Linux sees the whole tree as modified.
4
+ * text=auto eol=lf
5
+
6
+ # Binary assets git must not touch.
7
+ *.png binary
8
+ *.pdf binary
9
+ *.tar.gz binary
10
+ *.parquet binary
@@ -0,0 +1,26 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .pytest_cache/
5
+ .mypy_cache/
6
+ .ruff_cache/
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+
11
+ # Local data root, if the user points it inside the repo
12
+ .noether/
13
+ *.sqlite
14
+ *.sqlite-*
15
+ *.duckdb
16
+
17
+ # Bulk artefacts stay outside the repo, referenced by manifest + checksum
18
+ research/**/*.parquet
19
+ research/**/*.pdf
20
+ research/**/*.tar.gz
21
+ !research/**/.gitkeep
22
+
23
+ # Small tabular artefacts ARE tracked (see research/README.md size policy)
24
+ !research/labels/*.json
25
+ !research/results/*.json
26
+ !research/benchmarks/*.yaml
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ranshiv Kumar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,193 @@
1
+ Metadata-Version: 2.5
2
+ Name: noether-physics
3
+ Version: 0.1.0
4
+ Summary: Physics research assistant: explains concepts with checked equations and live simulations, and verifies claims against real arXiv papers.
5
+ Project-URL: Homepage, https://github.com/Ranshiv/noether-physics
6
+ Project-URL: Repository, https://github.com/Ranshiv/noether-physics
7
+ Project-URL: Issues, https://github.com/Ranshiv/noether-physics/issues
8
+ Project-URL: Honest status, https://github.com/Ranshiv/noether-physics/blob/main/docs/DEFERRED.md
9
+ Author-email: Ranshiv Kumar <ranshiv369@gmail.com>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: arxiv,citations,latex,mcp,physics,quantum,qutip,research,simulation,sympy
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Science/Research
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Topic :: Scientific/Engineering :: Physics
18
+ Classifier: Topic :: Text Processing :: Markup :: LaTeX
19
+ Requires-Python: >=3.12
20
+ Requires-Dist: httpx>=0.27
21
+ Requires-Dist: matplotlib>=3.9
22
+ Requires-Dist: numpy>=1.26
23
+ Requires-Dist: pint>=0.24
24
+ Requires-Dist: platformdirs>=4.2
25
+ Requires-Dist: pylatexenc>=2.10
26
+ Requires-Dist: pyyaml>=6.0
27
+ Requires-Dist: rich>=13.7
28
+ Requires-Dist: scipy>=1.13
29
+ Requires-Dist: sympy>=1.13
30
+ Requires-Dist: typer>=0.12
31
+ Provides-Extra: dev
32
+ Requires-Dist: mypy>=1.11; extra == 'dev'
33
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
34
+ Requires-Dist: pytest>=8.2; extra == 'dev'
35
+ Requires-Dist: ruff>=0.6; extra == 'dev'
36
+ Provides-Extra: mcp
37
+ Requires-Dist: mcp>=1.2; extra == 'mcp'
38
+ Provides-Extra: quantum
39
+ Requires-Dist: qiskit>=1.2; extra == 'quantum'
40
+ Requires-Dist: qutip>=5.0; extra == 'quantum'
41
+ Description-Content-Type: text/markdown
42
+
43
+ # NOETHER
44
+
45
+ <!-- mcp-name: io.github.ranshiv/noether-physics -->
46
+
47
+ **A physics research assistant that shows its work.**
48
+
49
+ Explains physics concepts with everyday analogies, dimension-checked equations, worked examples it
50
+ recomputes, and simulations it actually runs. Answers questions from real arXiv papers with every
51
+ sentence anchored to a verbatim span. Audits your own draft's bibliography for references that don't
52
+ exist.
53
+
54
+ ```bash
55
+ pip install noether-physics
56
+ noether explain decoherence
57
+ ```
58
+
59
+ ---
60
+
61
+ ## Read this before you trust it
62
+
63
+ This is a research-integrity tool, so its limits matter more than its features.
64
+
65
+ **The verification gate checks that a quote is real. It does not check that the quote supports the
66
+ claim.** A claim can contradict its own citation and still pass. Demonstrated during development: a
67
+ claim asserting *"the experiment detected a nonzero neutron EDM at five sigma"* was accepted while
68
+ citing a passage reporting **d_n = 0.0 ± 1.1 × 10⁻²⁶ e·cm** — a null result. The quote was genuine,
69
+ so the gate let it through. Closing that gap needs entailment checking, which needs a language
70
+ model, and keeping the model outside the verifier is what makes the other guarantees meaningful. So
71
+ every answer this tool emits ends by saying so, and **you should read the quotes.**
72
+
73
+ **The reference resolver's false-positive rate is unmeasured.** It finds 86.5% of real references.
74
+ Nobody knows how often it would confidently match a *fabricated* one. For a tool whose first
75
+ promise concerns hallucinated citations, that is the most important number that does not yet exist.
76
+
77
+ **It is small.** 58 papers in the test corpus, 8 concepts in the explanation library, quantum
78
+ coverage limited to two-level systems and one cavity mode. No PDF fallback, so roughly 9% of
79
+ quant-ph papers (measured: 5 of 55) cannot be ingested at all.
80
+
81
+ [`docs/DEFERRED.md`](docs/DEFERRED.md) is the full account — every gap, with the measurement behind
82
+ it. It is the honest document; this README is the summary.
83
+
84
+ ---
85
+
86
+ ## Why it exists
87
+
88
+ 2026 audits found a **17% phantom-citation rate** in AI-assisted survey papers — references
89
+ resolving to no digital object — and roughly **146,900 AI-generated fake citations** across 2.5M
90
+ papers in 2025. arXiv now bans authors who submit hallucinated references.
91
+
92
+ Physics has a structural advantage nobody exploits: **arXiv distributes the actual LaTeX source.**
93
+ Equations arrive with their `\label`s, citations with their `\cite` keys, sections with their real
94
+ structure — read, not guessed. Tools in other fields OCR PDFs because their domains have no source.
95
+ Physics does.
96
+
97
+ ## What it does
98
+
99
+ **Explains.** Curated prose, not generated — then machine-checked. Every equation is parsed and
100
+ dimension-checked; every worked example is *recomputed* and compared against its stored answer, so a
101
+ typo in the library fails CI rather than teaching you a wrong number.
102
+
103
+ ```bash
104
+ noether explain decoherence # analogy, maths, worked example, live simulation
105
+ noether concepts # what the library covers
106
+ ```
107
+
108
+ **Simulates.** Six models — pendulum, damped/driven oscillator, projectile with drag (SciPy); Rabi,
109
+ decoherence, Jaynes-Cummings (QuTiP). Every run halves the step size and reports the drift, and
110
+ where a closed form exists the numerics are compared against it automatically.
111
+
112
+ ```bash
113
+ noether simulate rabi --params "detuning=6.28" --bloch
114
+ noether models
115
+ ```
116
+
117
+ **Checks equations.** Undeclared symbols return `unknown`, never a guess — `h` is Planck's constant
118
+ *or* a height, `T` a period *or* a temperature. `unknown` is not a pass.
119
+
120
+ ```bash
121
+ noether eq 'T = 2 \pi \sqrt{\frac{L}{g}}' --units 'T=second,L=meter,g=meter/second**2' --vary 'L=0.1..2' --at 'g=9.81'
122
+ ```
123
+
124
+ **Reads papers.** Ingests LaTeX source, so "equation 14" means the equation *the authors* numbered 14.
125
+
126
+ ```bash
127
+ noether ingest 2001.11966
128
+ noether equations arXiv:2001.11966
129
+ noether find "vacuum Rabi oscillations"
130
+ ```
131
+
132
+ **Audits your draft.** Resolves every `\bibitem` against arXiv, Crossref, OpenAlex and INSPIRE.
133
+ Exits non-zero on unresolvable references or cite keys with no bibliography entry, so it works as a
134
+ pre-commit hook.
135
+
136
+ ```bash
137
+ noether audit path/to/your-paper.tex
138
+ ```
139
+
140
+ ## Measured results
141
+
142
+ Run `noether bench status` yourself. As of the last run:
143
+
144
+ | gate | result | threshold | verdict |
145
+ |---|---|---|---|
146
+ | equations | 100% (31/31) | 90% | pass |
147
+ | retrieval | 83.3% (10/12) **at top-3 of 58 papers** | 80% | pass |
148
+ | citations | 86.5% (32/37) | 85% | pass |
149
+
150
+ Read these with their scope attached. "Right paper in the top 3" over 58 papers is a real task; over
151
+ 8 it was nearly free, and an earlier run reported a meaningless 100% because `top_k` exceeded the
152
+ corpus size. The citation threshold is 85% rather than 100% because books, theses and pre-digital
153
+ articles are genuinely not in any index — the residual failures on the nEDM letter are a 1954 Danish
154
+ journal, a 1955 Pauli chapter and a 1982 Oxford book.
155
+
156
+ ## Use it from Claude
157
+
158
+ ```bash
159
+ pip install "noether-physics[mcp]"
160
+ claude mcp add --scope user noether -- python -m noether.mcp_server
161
+ ```
162
+
163
+ 14 tools. Claude reasons and writes; NOETHER retrieves, checks and records. There is deliberately no
164
+ `write_answer` tool — the component that can hallucinate is not the component that decides what
165
+ ships.
166
+
167
+ ## Install
168
+
169
+ ```bash
170
+ pip install noether-physics # core
171
+ pip install "noether-physics[quantum]" # + QuTiP simulations
172
+ pip install "noether-physics[mcp]" # + MCP server
173
+ ```
174
+
175
+ Python 3.12+. From source: `uv venv && uv pip install -e ".[dev,quantum,mcp]"`, then `uv run pytest`
176
+ (285 tests, no network — cassettes default to replay and a miss is an error, not a live fallback).
177
+
178
+ ## Terms
179
+
180
+ arXiv forbids bulk crawling. This fetches one paper at a time behind a 3-second interval and caches
181
+ permanently, so a given paper is downloaded exactly once. Every source, its rate limit and its terms
182
+ are declared in `research/sources/source_registry.yaml`; a source not in that file is not called.
183
+
184
+ **No AI-generated imagery.** Every figure is extracted from a real paper or rendered
185
+ deterministically from code and data, and is tagged with which.
186
+
187
+ ## Licence
188
+
189
+ MIT — see [LICENSE](LICENSE).
190
+
191
+ The name honours Emmy Noether. The PyPI distribution is `noether-physics` because `noether` belongs
192
+ to an unrelated [physical-units library](https://github.com/yunruse/noether); the command is
193
+ `noether` either way.
@@ -0,0 +1,151 @@
1
+ # NOETHER
2
+
3
+ <!-- mcp-name: io.github.ranshiv/noether-physics -->
4
+
5
+ **A physics research assistant that shows its work.**
6
+
7
+ Explains physics concepts with everyday analogies, dimension-checked equations, worked examples it
8
+ recomputes, and simulations it actually runs. Answers questions from real arXiv papers with every
9
+ sentence anchored to a verbatim span. Audits your own draft's bibliography for references that don't
10
+ exist.
11
+
12
+ ```bash
13
+ pip install noether-physics
14
+ noether explain decoherence
15
+ ```
16
+
17
+ ---
18
+
19
+ ## Read this before you trust it
20
+
21
+ This is a research-integrity tool, so its limits matter more than its features.
22
+
23
+ **The verification gate checks that a quote is real. It does not check that the quote supports the
24
+ claim.** A claim can contradict its own citation and still pass. Demonstrated during development: a
25
+ claim asserting *"the experiment detected a nonzero neutron EDM at five sigma"* was accepted while
26
+ citing a passage reporting **d_n = 0.0 ± 1.1 × 10⁻²⁶ e·cm** — a null result. The quote was genuine,
27
+ so the gate let it through. Closing that gap needs entailment checking, which needs a language
28
+ model, and keeping the model outside the verifier is what makes the other guarantees meaningful. So
29
+ every answer this tool emits ends by saying so, and **you should read the quotes.**
30
+
31
+ **The reference resolver's false-positive rate is unmeasured.** It finds 86.5% of real references.
32
+ Nobody knows how often it would confidently match a *fabricated* one. For a tool whose first
33
+ promise concerns hallucinated citations, that is the most important number that does not yet exist.
34
+
35
+ **It is small.** 58 papers in the test corpus, 8 concepts in the explanation library, quantum
36
+ coverage limited to two-level systems and one cavity mode. No PDF fallback, so roughly 9% of
37
+ quant-ph papers (measured: 5 of 55) cannot be ingested at all.
38
+
39
+ [`docs/DEFERRED.md`](docs/DEFERRED.md) is the full account — every gap, with the measurement behind
40
+ it. It is the honest document; this README is the summary.
41
+
42
+ ---
43
+
44
+ ## Why it exists
45
+
46
+ 2026 audits found a **17% phantom-citation rate** in AI-assisted survey papers — references
47
+ resolving to no digital object — and roughly **146,900 AI-generated fake citations** across 2.5M
48
+ papers in 2025. arXiv now bans authors who submit hallucinated references.
49
+
50
+ Physics has a structural advantage nobody exploits: **arXiv distributes the actual LaTeX source.**
51
+ Equations arrive with their `\label`s, citations with their `\cite` keys, sections with their real
52
+ structure — read, not guessed. Tools in other fields OCR PDFs because their domains have no source.
53
+ Physics does.
54
+
55
+ ## What it does
56
+
57
+ **Explains.** Curated prose, not generated — then machine-checked. Every equation is parsed and
58
+ dimension-checked; every worked example is *recomputed* and compared against its stored answer, so a
59
+ typo in the library fails CI rather than teaching you a wrong number.
60
+
61
+ ```bash
62
+ noether explain decoherence # analogy, maths, worked example, live simulation
63
+ noether concepts # what the library covers
64
+ ```
65
+
66
+ **Simulates.** Six models — pendulum, damped/driven oscillator, projectile with drag (SciPy); Rabi,
67
+ decoherence, Jaynes-Cummings (QuTiP). Every run halves the step size and reports the drift, and
68
+ where a closed form exists the numerics are compared against it automatically.
69
+
70
+ ```bash
71
+ noether simulate rabi --params "detuning=6.28" --bloch
72
+ noether models
73
+ ```
74
+
75
+ **Checks equations.** Undeclared symbols return `unknown`, never a guess — `h` is Planck's constant
76
+ *or* a height, `T` a period *or* a temperature. `unknown` is not a pass.
77
+
78
+ ```bash
79
+ noether eq 'T = 2 \pi \sqrt{\frac{L}{g}}' --units 'T=second,L=meter,g=meter/second**2' --vary 'L=0.1..2' --at 'g=9.81'
80
+ ```
81
+
82
+ **Reads papers.** Ingests LaTeX source, so "equation 14" means the equation *the authors* numbered 14.
83
+
84
+ ```bash
85
+ noether ingest 2001.11966
86
+ noether equations arXiv:2001.11966
87
+ noether find "vacuum Rabi oscillations"
88
+ ```
89
+
90
+ **Audits your draft.** Resolves every `\bibitem` against arXiv, Crossref, OpenAlex and INSPIRE.
91
+ Exits non-zero on unresolvable references or cite keys with no bibliography entry, so it works as a
92
+ pre-commit hook.
93
+
94
+ ```bash
95
+ noether audit path/to/your-paper.tex
96
+ ```
97
+
98
+ ## Measured results
99
+
100
+ Run `noether bench status` yourself. As of the last run:
101
+
102
+ | gate | result | threshold | verdict |
103
+ |---|---|---|---|
104
+ | equations | 100% (31/31) | 90% | pass |
105
+ | retrieval | 83.3% (10/12) **at top-3 of 58 papers** | 80% | pass |
106
+ | citations | 86.5% (32/37) | 85% | pass |
107
+
108
+ Read these with their scope attached. "Right paper in the top 3" over 58 papers is a real task; over
109
+ 8 it was nearly free, and an earlier run reported a meaningless 100% because `top_k` exceeded the
110
+ corpus size. The citation threshold is 85% rather than 100% because books, theses and pre-digital
111
+ articles are genuinely not in any index — the residual failures on the nEDM letter are a 1954 Danish
112
+ journal, a 1955 Pauli chapter and a 1982 Oxford book.
113
+
114
+ ## Use it from Claude
115
+
116
+ ```bash
117
+ pip install "noether-physics[mcp]"
118
+ claude mcp add --scope user noether -- python -m noether.mcp_server
119
+ ```
120
+
121
+ 14 tools. Claude reasons and writes; NOETHER retrieves, checks and records. There is deliberately no
122
+ `write_answer` tool — the component that can hallucinate is not the component that decides what
123
+ ships.
124
+
125
+ ## Install
126
+
127
+ ```bash
128
+ pip install noether-physics # core
129
+ pip install "noether-physics[quantum]" # + QuTiP simulations
130
+ pip install "noether-physics[mcp]" # + MCP server
131
+ ```
132
+
133
+ Python 3.12+. From source: `uv venv && uv pip install -e ".[dev,quantum,mcp]"`, then `uv run pytest`
134
+ (285 tests, no network — cassettes default to replay and a miss is an error, not a live fallback).
135
+
136
+ ## Terms
137
+
138
+ arXiv forbids bulk crawling. This fetches one paper at a time behind a 3-second interval and caches
139
+ permanently, so a given paper is downloaded exactly once. Every source, its rate limit and its terms
140
+ are declared in `research/sources/source_registry.yaml`; a source not in that file is not called.
141
+
142
+ **No AI-generated imagery.** Every figure is extracted from a real paper or rendered
143
+ deterministically from code and data, and is tagged with which.
144
+
145
+ ## Licence
146
+
147
+ MIT — see [LICENSE](LICENSE).
148
+
149
+ The name honours Emmy Noether. The PyPI distribution is `noether-physics` because `noether` belongs
150
+ to an unrelated [physical-units library](https://github.com/yunruse/noether); the command is
151
+ `noether` either way.