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.
- noether_physics-0.1.0/.gitattributes +10 -0
- noether_physics-0.1.0/.gitignore +26 -0
- noether_physics-0.1.0/LICENSE +21 -0
- noether_physics-0.1.0/PKG-INFO +193 -0
- noether_physics-0.1.0/README.md +151 -0
- noether_physics-0.1.0/docs/DEFERRED.md +276 -0
- noether_physics-0.1.0/pyproject.toml +84 -0
- noether_physics-0.1.0/research/README.md +24 -0
- noether_physics-0.1.0/research/benchmarks/.gitkeep +0 -0
- noether_physics-0.1.0/research/benchmarks/equations.yaml +149 -0
- noether_physics-0.1.0/research/benchmarks/retrieval.yaml +62 -0
- noether_physics-0.1.0/research/labels/.gitkeep +0 -0
- noether_physics-0.1.0/research/results/.gitkeep +0 -0
- noether_physics-0.1.0/research/results/citations.json +38 -0
- noether_physics-0.1.0/research/results/equations.json +12 -0
- noether_physics-0.1.0/research/results/retrieval.json +31 -0
- noether_physics-0.1.0/research/sources/source_registry.yaml +74 -0
- noether_physics-0.1.0/scripts/seed_corpus.py +98 -0
- noether_physics-0.1.0/server.json +20 -0
- noether_physics-0.1.0/skill/README.md +9 -0
- noether_physics-0.1.0/skill/noether/SKILL.md +87 -0
- noether_physics-0.1.0/src/noether/__init__.py +11 -0
- noether_physics-0.1.0/src/noether/answer/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/answer/pipeline.py +244 -0
- noether_physics-0.1.0/src/noether/answer/records.py +208 -0
- noether_physics-0.1.0/src/noether/bench.py +267 -0
- noether_physics-0.1.0/src/noether/cassettes.py +167 -0
- noether_physics-0.1.0/src/noether/cli.py +611 -0
- noether_physics-0.1.0/src/noether/cli_explain.py +149 -0
- noether_physics-0.1.0/src/noether/compute/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/compute/normalise.py +414 -0
- noether_physics-0.1.0/src/noether/compute/plots.py +155 -0
- noether_physics-0.1.0/src/noether/compute/run.py +215 -0
- noether_physics-0.1.0/src/noether/compute/symbolic.py +313 -0
- noether_physics-0.1.0/src/noether/compute/units.py +280 -0
- noether_physics-0.1.0/src/noether/config.py +100 -0
- noether_physics-0.1.0/src/noether/draft.py +183 -0
- noether_physics-0.1.0/src/noether/explain/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/explain/compose.py +244 -0
- noether_physics-0.1.0/src/noether/explain/concepts.py +143 -0
- noether_physics-0.1.0/src/noether/explain/library.py +496 -0
- noether_physics-0.1.0/src/noether/export.py +209 -0
- noether_physics-0.1.0/src/noether/index/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/index/chunk.py +80 -0
- noether_physics-0.1.0/src/noether/index/embed.py +106 -0
- noether_physics-0.1.0/src/noether/index/retrieve.py +145 -0
- noether_physics-0.1.0/src/noether/index/store.py +384 -0
- noether_physics-0.1.0/src/noether/ingest/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/ingest/bibliography.py +184 -0
- noether_physics-0.1.0/src/noether/ingest/document.py +195 -0
- noether_physics-0.1.0/src/noether/ingest/latex.py +439 -0
- noether_physics-0.1.0/src/noether/ingest/preprocess.py +347 -0
- noether_physics-0.1.0/src/noether/library.py +228 -0
- noether_physics-0.1.0/src/noether/maps.py +226 -0
- noether_physics-0.1.0/src/noether/mcp_server.py +434 -0
- noether_physics-0.1.0/src/noether/netclient.py +215 -0
- noether_physics-0.1.0/src/noether/provenance/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/provenance/bundle.py +184 -0
- noether_physics-0.1.0/src/noether/sim/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/sim/classical.py +271 -0
- noether_physics-0.1.0/src/noether/sim/engine.py +163 -0
- noether_physics-0.1.0/src/noether/sim/models.py +114 -0
- noether_physics-0.1.0/src/noether/sim/quantum.py +339 -0
- noether_physics-0.1.0/src/noether/sim/result.py +121 -0
- noether_physics-0.1.0/src/noether/sources/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/sources/arxiv.py +279 -0
- noether_physics-0.1.0/src/noether/sources/registry.py +79 -0
- noether_physics-0.1.0/src/noether/sources/resolvers.py +270 -0
- noether_physics-0.1.0/src/noether/verify/__init__.py +0 -0
- noether_physics-0.1.0/src/noether/verify/citations.py +313 -0
- noether_physics-0.1.0/src/noether/verify/gate.py +221 -0
- noether_physics-0.1.0/src/noether/verify/matching.py +304 -0
- noether_physics-0.1.0/src/noether/watch.py +146 -0
- noether_physics-0.1.0/tests/__init__.py +0 -0
- noether_physics-0.1.0/tests/conftest.py +47 -0
- noether_physics-0.1.0/tests/fixtures/arxiv_feed.xml +40 -0
- noether_physics-0.1.0/tests/fixtures/cassettes/.gitkeep +0 -0
- noether_physics-0.1.0/tests/test_arxiv.py +93 -0
- noether_physics-0.1.0/tests/test_cassettes.py +95 -0
- noether_physics-0.1.0/tests/test_document.py +96 -0
- noether_physics-0.1.0/tests/test_index_and_gate.py +325 -0
- noether_physics-0.1.0/tests/test_ingest.py +300 -0
- noether_physics-0.1.0/tests/test_matching.py +156 -0
- noether_physics-0.1.0/tests/test_mcp_server.py +98 -0
- noether_physics-0.1.0/tests/test_netclient.py +85 -0
- noether_physics-0.1.0/tests/test_outputs.py +247 -0
- noether_physics-0.1.0/tests/test_sim_and_explain.py +318 -0
- noether_physics-0.1.0/tests/test_source_hygiene.py +126 -0
- noether_physics-0.1.0/tests/test_symbolic.py +272 -0
- 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.
|