proofpath 0.0.1__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.
- proofpath-0.0.1/.editorconfig +15 -0
- proofpath-0.0.1/.github/ISSUE_TEMPLATE/bug_report.yml +31 -0
- proofpath-0.0.1/.github/ISSUE_TEMPLATE/config.yml +1 -0
- proofpath-0.0.1/.github/ISSUE_TEMPLATE/feature_request.yml +23 -0
- proofpath-0.0.1/.github/ISSUE_TEMPLATE/wrong_verdict.yml +39 -0
- proofpath-0.0.1/.github/PULL_REQUEST_TEMPLATE.md +16 -0
- proofpath-0.0.1/.github/workflows/ci.yml +41 -0
- proofpath-0.0.1/.github/workflows/release.yml +35 -0
- proofpath-0.0.1/.gitignore +33 -0
- proofpath-0.0.1/CHANGELOG.md +23 -0
- proofpath-0.0.1/CLAUDE.md +52 -0
- proofpath-0.0.1/CONTRIBUTING.md +34 -0
- proofpath-0.0.1/LICENSE +21 -0
- proofpath-0.0.1/PKG-INFO +112 -0
- proofpath-0.0.1/README.md +43 -0
- proofpath-0.0.1/SECURITY.md +24 -0
- proofpath-0.0.1/docs/superpowers/OPEN-ITEMS.md +120 -0
- proofpath-0.0.1/docs/superpowers/plans/2026-09-10-proofpath-implementation-plan.md +238 -0
- proofpath-0.0.1/docs/superpowers/specs/2026-09-10-proofpath-design.md +587 -0
- proofpath-0.0.1/pyproject.toml +95 -0
- proofpath-0.0.1/src/proofpath/__init__.py +5 -0
- proofpath-0.0.1/src/proofpath/cli.py +69 -0
- proofpath-0.0.1/src/proofpath/py.typed +0 -0
- proofpath-0.0.1/tests/test_cli.py +23 -0
- proofpath-0.0.1/tests/test_version.py +6 -0
- proofpath-0.0.1/uv.lock +3650 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
charset = utf-8
|
|
5
|
+
end_of_line = lf
|
|
6
|
+
insert_final_newline = true
|
|
7
|
+
trim_trailing_whitespace = true
|
|
8
|
+
indent_style = space
|
|
9
|
+
indent_size = 4
|
|
10
|
+
|
|
11
|
+
[*.{yml,yaml,json,toml}]
|
|
12
|
+
indent_size = 2
|
|
13
|
+
|
|
14
|
+
[*.md]
|
|
15
|
+
trim_trailing_whitespace = false
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Something behaves differently than documented
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: what
|
|
7
|
+
attributes:
|
|
8
|
+
label: What happened
|
|
9
|
+
description: Include the exact command and the output.
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: expected
|
|
14
|
+
attributes:
|
|
15
|
+
label: What you expected
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: input
|
|
19
|
+
id: version
|
|
20
|
+
attributes:
|
|
21
|
+
label: proofpath version
|
|
22
|
+
placeholder: "output of: proofpath --version"
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: dropdown
|
|
26
|
+
id: os
|
|
27
|
+
attributes:
|
|
28
|
+
label: Operating system
|
|
29
|
+
options: [Linux, macOS, Windows]
|
|
30
|
+
validations:
|
|
31
|
+
required: true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
blank_issues_enabled: true
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest a capability
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: textarea
|
|
6
|
+
id: problem
|
|
7
|
+
attributes:
|
|
8
|
+
label: The problem
|
|
9
|
+
description: What are you unable to do today?
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: textarea
|
|
13
|
+
id: proposal
|
|
14
|
+
attributes:
|
|
15
|
+
label: What you propose
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: checkboxes
|
|
19
|
+
id: spec
|
|
20
|
+
attributes:
|
|
21
|
+
label: Design check
|
|
22
|
+
options:
|
|
23
|
+
- label: I have read the design spec and this is not already covered or explicitly ruled out
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Wrong verdict
|
|
2
|
+
description: A claim was judged incorrectly
|
|
3
|
+
labels: ["accuracy"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Accuracy reports are the most valuable issues this project receives.
|
|
9
|
+
They become regression cases in the evaluation set.
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: claim
|
|
12
|
+
attributes:
|
|
13
|
+
label: The claim
|
|
14
|
+
validations:
|
|
15
|
+
required: true
|
|
16
|
+
- type: input
|
|
17
|
+
id: source
|
|
18
|
+
attributes:
|
|
19
|
+
label: The cited source (DOI or URL)
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
- type: dropdown
|
|
23
|
+
id: reported
|
|
24
|
+
attributes:
|
|
25
|
+
label: What proofpath reported
|
|
26
|
+
options: [SUPPORTED, REFUTED, NEI, GHOST REFERENCE, AMBIGUOUS, RETRACTED, UNVERIFIED]
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
- type: dropdown
|
|
30
|
+
id: correct
|
|
31
|
+
attributes:
|
|
32
|
+
label: What it should have reported
|
|
33
|
+
options: [SUPPORTED, REFUTED, NEI, GHOST REFERENCE, AMBIGUOUS, RETRACTED, UNVERIFIED]
|
|
34
|
+
validations:
|
|
35
|
+
required: true
|
|
36
|
+
- type: textarea
|
|
37
|
+
id: passage
|
|
38
|
+
attributes:
|
|
39
|
+
label: The passage that settles it
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
## What this changes
|
|
2
|
+
|
|
3
|
+
<!-- One or two sentences. -->
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
<!-- Link the issue, or explain the problem this solves. -->
|
|
8
|
+
|
|
9
|
+
## Checklist
|
|
10
|
+
|
|
11
|
+
- [ ] `ruff check` and `ruff format --check` are clean
|
|
12
|
+
- [ ] `pytest` passes
|
|
13
|
+
- [ ] Type annotations on every new function signature
|
|
14
|
+
- [ ] No network access in unit tests
|
|
15
|
+
- [ ] If a new reported state was added, spec section 15 is updated too
|
|
16
|
+
- [ ] This change does not make the tool sound more confident than its evidence
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: astral-sh/setup-uv@v5
|
|
19
|
+
with:
|
|
20
|
+
enable-cache: true
|
|
21
|
+
- run: uv sync --extra dev
|
|
22
|
+
- run: uv run ruff check
|
|
23
|
+
- run: uv run ruff format --check
|
|
24
|
+
|
|
25
|
+
test:
|
|
26
|
+
# The tool promises identical behaviour on all three platforms, so all three
|
|
27
|
+
# are tested on every change.
|
|
28
|
+
strategy:
|
|
29
|
+
fail-fast: false
|
|
30
|
+
matrix:
|
|
31
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
32
|
+
python-version: ["3.10", "3.13"]
|
|
33
|
+
runs-on: ${{ matrix.os }}
|
|
34
|
+
steps:
|
|
35
|
+
- uses: actions/checkout@v4
|
|
36
|
+
- uses: astral-sh/setup-uv@v5
|
|
37
|
+
with:
|
|
38
|
+
enable-cache: true
|
|
39
|
+
python-version: ${{ matrix.python-version }}
|
|
40
|
+
- run: uv sync --extra dev
|
|
41
|
+
- run: uv run pytest
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
# Publishes to PyPI via Trusted Publishing (OIDC). No API token is stored
|
|
4
|
+
# anywhere in this repository or its secrets.
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
tags: ["v*"]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: astral-sh/setup-uv@v5
|
|
16
|
+
with:
|
|
17
|
+
enable-cache: true
|
|
18
|
+
- run: uv build
|
|
19
|
+
- uses: actions/upload-artifact@v4
|
|
20
|
+
with:
|
|
21
|
+
name: dist
|
|
22
|
+
path: dist/
|
|
23
|
+
|
|
24
|
+
publish:
|
|
25
|
+
needs: build
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
environment: pypi
|
|
28
|
+
permissions:
|
|
29
|
+
id-token: write # required for Trusted Publishing
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/download-artifact@v4
|
|
32
|
+
with:
|
|
33
|
+
name: dist
|
|
34
|
+
path: dist/
|
|
35
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
.venv/
|
|
5
|
+
venv/
|
|
6
|
+
*.egg-info/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
.pytest_cache/
|
|
10
|
+
.ruff_cache/
|
|
11
|
+
.mypy_cache/
|
|
12
|
+
|
|
13
|
+
# Secrets
|
|
14
|
+
.env
|
|
15
|
+
.env.*
|
|
16
|
+
!.env.example
|
|
17
|
+
*.pem
|
|
18
|
+
*.key
|
|
19
|
+
secrets/
|
|
20
|
+
config.local.*
|
|
21
|
+
|
|
22
|
+
# proofpath local state
|
|
23
|
+
.proofpath/
|
|
24
|
+
*.sqlite
|
|
25
|
+
*.sqlite3
|
|
26
|
+
data/cache/
|
|
27
|
+
models/
|
|
28
|
+
|
|
29
|
+
# OS / editors
|
|
30
|
+
.DS_Store
|
|
31
|
+
Thumbs.db
|
|
32
|
+
.idea/
|
|
33
|
+
.vscode/
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to
|
|
5
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.0.1] - 2026-09-10
|
|
10
|
+
|
|
11
|
+
First release. The verification pipeline is not implemented; this reserves the name
|
|
12
|
+
and establishes the interface, packaging and CI that later phases build on.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- Design specification with measured source-access data (spec §6), the fetch ladder
|
|
16
|
+
and its permission model (§7), and corrected reference resolution (§8).
|
|
17
|
+
- Phased implementation plan, ordered by risk retired rather than user-visible
|
|
18
|
+
progress.
|
|
19
|
+
- `proofpath` command. A bare invocation is a first-class entry point rather than a
|
|
20
|
+
help screen, which is where the TUI will attach. Exit codes are fixed: `0` clean,
|
|
21
|
+
`1` findings, `2` the run itself failed.
|
|
22
|
+
- Cross-platform CI on Linux, macOS and Windows, and PyPI publishing through trusted
|
|
23
|
+
publishing rather than a stored API token.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# proofpath — project instructions
|
|
2
|
+
|
|
3
|
+
`proofpath` verifies that the sources behind a claim actually say what the claim
|
|
4
|
+
says. Read `docs/superpowers/specs/2026-09-10-proofpath-design.md` before making
|
|
5
|
+
design decisions; it is the source of truth and records *why* things are the way
|
|
6
|
+
they are.
|
|
7
|
+
|
|
8
|
+
## Non-negotiable product rules
|
|
9
|
+
|
|
10
|
+
These are not style preferences. Breaking one breaks the product's reason to exist.
|
|
11
|
+
|
|
12
|
+
1. **Never assert without a passage.** A `SUPPORTED` or `REFUTED` verdict must carry
|
|
13
|
+
the quoted evidence it is based on. No passage, no verdict.
|
|
14
|
+
2. **Never present absence of evidence as evidence of absence.** Unreachable,
|
|
15
|
+
blocked, paywalled and ambiguous are distinct reported states (spec §15), never
|
|
16
|
+
silently collapsed into a verdict.
|
|
17
|
+
3. **Never call a real reference a ghost.** Uncertainty resolves to `AMBIGUOUS`, not
|
|
18
|
+
`GHOST REFERENCE` (spec §8). The false-ghost rate is a release gate.
|
|
19
|
+
4. **Never prompt without a TTY.** In CI or when piped, an `ask` permission is
|
|
20
|
+
treated as `deny` and reported (spec §7.1).
|
|
21
|
+
5. **Never install anything large without explicit consent** (spec §7.1).
|
|
22
|
+
6. **Every report states its own coverage.** A low-coverage run must not look like a
|
|
23
|
+
clean one.
|
|
24
|
+
|
|
25
|
+
## Stack
|
|
26
|
+
|
|
27
|
+
| Concern | Choice | Why |
|
|
28
|
+
|---|---|---|
|
|
29
|
+
| CLI / TUI | `typer` + `textual` | bare `proofpath` opens the TUI via `invoke_without_command=True` |
|
|
30
|
+
| HTTP | `httpx`, then `curl_cffi`, then browser on consent | fetch ladder, spec §7 |
|
|
31
|
+
| PDF | `pymupdf` | pure Python, no Java/Docker |
|
|
32
|
+
| Vector store | `sqlite-vec` | per-document corpora are small; no server |
|
|
33
|
+
| Embeddings / NLI | ONNX runtime by default, `torch` only via the `[gpu]` extra | keeps base install small |
|
|
34
|
+
| Config / cache paths | `platformdirs` | Windows/macOS/Linux parity |
|
|
35
|
+
|
|
36
|
+
## Conventions
|
|
37
|
+
|
|
38
|
+
- Python 3.10+. **Type annotations are mandatory** on every function signature.
|
|
39
|
+
- `ruff check` and `ruff format --check` must be clean.
|
|
40
|
+
- `pytest` must pass on Linux, macOS and Windows.
|
|
41
|
+
- Device preference order is always **CUDA → MPS → CPU** (and the ONNX equivalent:
|
|
42
|
+
CUDA → CoreML → CPU).
|
|
43
|
+
- `pathlib` everywhere. Every file read/write passes `encoding="utf-8"` explicitly.
|
|
44
|
+
- Code, identifiers and comments in English.
|
|
45
|
+
|
|
46
|
+
## Hard constraints
|
|
47
|
+
|
|
48
|
+
- **No Docker or Java requirement** in any default path. GROBID stays opt-in.
|
|
49
|
+
- **No hardcoded secrets, tokens or emails.** The Crossref/OpenAlex contact address
|
|
50
|
+
comes from config or `PROOFPATH_CONTACT_EMAIL` and is optional.
|
|
51
|
+
- No network access in unit tests. Provider responses are fixtures.
|
|
52
|
+
- `cli` and `tui` contain no logic; both call the same `verify()` entry point.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for considering a contribution.
|
|
4
|
+
|
|
5
|
+
## Before you start
|
|
6
|
+
|
|
7
|
+
Read `docs/superpowers/specs/2026-09-10-proofpath-design.md`. It records the design
|
|
8
|
+
decisions and, more importantly, the measurements behind them. Several obvious-looking
|
|
9
|
+
approaches were tested and rejected — the spec says which and why.
|
|
10
|
+
|
|
11
|
+
For anything beyond a small fix, open an issue first so we can agree on the approach.
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
uv sync --all-extras
|
|
17
|
+
uv run pytest
|
|
18
|
+
uv run ruff check
|
|
19
|
+
uv run ruff format --check
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Standards
|
|
23
|
+
|
|
24
|
+
- Type annotations on every function signature.
|
|
25
|
+
- `ruff check` and `ruff format --check` clean.
|
|
26
|
+
- Tests pass on Linux, macOS and Windows.
|
|
27
|
+
- No network access in unit tests — use fixtures.
|
|
28
|
+
- New reported states go in the table in spec §15, not just in code.
|
|
29
|
+
|
|
30
|
+
## The rules that matter most
|
|
31
|
+
|
|
32
|
+
A pull request that makes the tool sound more confident than the evidence supports
|
|
33
|
+
will be rejected, however good the code is. See the non-negotiable rules in
|
|
34
|
+
`CLAUDE.md`.
|
proofpath-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Yigit Erdogan
|
|
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.
|
proofpath-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: proofpath
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Check whether the sources behind a claim actually say what the claim says.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Yigtwxx/proofpath
|
|
6
|
+
Project-URL: Repository, https://github.com/Yigtwxx/proofpath
|
|
7
|
+
Project-URL: Issues, https://github.com/Yigtwxx/proofpath/issues
|
|
8
|
+
Project-URL: Changelog, https://github.com/Yigtwxx/proofpath/blob/main/CHANGELOG.md
|
|
9
|
+
Author: Yigit Erdogan
|
|
10
|
+
License: MIT License
|
|
11
|
+
|
|
12
|
+
Copyright (c) 2026 Yigit Erdogan
|
|
13
|
+
|
|
14
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
15
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
16
|
+
in the Software without restriction, including without limitation the rights
|
|
17
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
18
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
19
|
+
furnished to do so, subject to the following conditions:
|
|
20
|
+
|
|
21
|
+
The above copyright notice and this permission notice shall be included in all
|
|
22
|
+
copies or substantial portions of the Software.
|
|
23
|
+
|
|
24
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
25
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
26
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
27
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
28
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
29
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
30
|
+
SOFTWARE.
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Keywords: citation,cli,entailment,fact-checking,nli,rag,research-integrity,retrieval-augmented-generation
|
|
33
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
34
|
+
Classifier: Environment :: Console
|
|
35
|
+
Classifier: Intended Audience :: Science/Research
|
|
36
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
37
|
+
Classifier: Operating System :: OS Independent
|
|
38
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
42
|
+
Classifier: Topic :: Scientific/Engineering
|
|
43
|
+
Classifier: Topic :: Text Processing :: Linguistic
|
|
44
|
+
Classifier: Typing :: Typed
|
|
45
|
+
Requires-Python: >=3.10
|
|
46
|
+
Requires-Dist: curl-cffi>=0.16.1
|
|
47
|
+
Requires-Dist: fastembed>=0.5
|
|
48
|
+
Requires-Dist: httpx>=0.28
|
|
49
|
+
Requires-Dist: orjson>=3.11
|
|
50
|
+
Requires-Dist: platformdirs>=4.3
|
|
51
|
+
Requires-Dist: pymupdf>=1.25
|
|
52
|
+
Requires-Dist: python-docx>=1.1
|
|
53
|
+
Requires-Dist: scrapling>=0.4.15
|
|
54
|
+
Requires-Dist: sqlite-vec>=0.1.6
|
|
55
|
+
Requires-Dist: textual>=1.0
|
|
56
|
+
Requires-Dist: typer>=0.15
|
|
57
|
+
Provides-Extra: browser
|
|
58
|
+
Requires-Dist: scrapling[fetchers]>=0.4.15; extra == 'browser'
|
|
59
|
+
Provides-Extra: dev
|
|
60
|
+
Requires-Dist: mypy>=1.14; extra == 'dev'
|
|
61
|
+
Requires-Dist: pytest-cov>=6.0; extra == 'dev'
|
|
62
|
+
Requires-Dist: pytest>=8.3; extra == 'dev'
|
|
63
|
+
Requires-Dist: respx>=0.22; extra == 'dev'
|
|
64
|
+
Requires-Dist: ruff>=0.9; extra == 'dev'
|
|
65
|
+
Provides-Extra: gpu
|
|
66
|
+
Requires-Dist: sentence-transformers>=3.3; extra == 'gpu'
|
|
67
|
+
Requires-Dist: torch>=2.5; extra == 'gpu'
|
|
68
|
+
Description-Content-Type: text/markdown
|
|
69
|
+
|
|
70
|
+
# proofpath
|
|
71
|
+
|
|
72
|
+
> Don't guess. Show the evidence.
|
|
73
|
+
|
|
74
|
+
`proofpath` checks whether the sources behind a claim actually say what the claim
|
|
75
|
+
says. Point it at a paper, a draft, or a link — it verifies every citation on three
|
|
76
|
+
levels and shows you the passage behind each verdict.
|
|
77
|
+
|
|
78
|
+
1. **Does the source exist?** — resolved against Crossref, OpenAlex, PubMed, arXiv.
|
|
79
|
+
2. **Is it still valid?** — checked against Retraction Watch.
|
|
80
|
+
3. **Does it support the claim?** — retrieval + entailment against the source text.
|
|
81
|
+
|
|
82
|
+
Most tools stop at step 1. Step 3 is the point.
|
|
83
|
+
|
|
84
|
+
Runs offline and free by default: no API key, no Docker, no server. Windows, Linux
|
|
85
|
+
and macOS.
|
|
86
|
+
|
|
87
|
+
## What it will not do
|
|
88
|
+
|
|
89
|
+
It does not pretend to be certain. Full text is openly available for well under half
|
|
90
|
+
of published citations, so many verdicts will honestly be *not enough information*,
|
|
91
|
+
and every report ends with its own coverage figures. A tool that sounds sure about
|
|
92
|
+
everything is the problem this one exists to fight.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
uv tool install proofpath
|
|
96
|
+
|
|
97
|
+
proofpath # interactive TUI
|
|
98
|
+
proofpath check paper.pdf # one-shot report
|
|
99
|
+
proofpath check draft.md --format sarif
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Status
|
|
103
|
+
|
|
104
|
+
🚧 Design stage — no working code yet.
|
|
105
|
+
|
|
106
|
+
- [Design specification](docs/superpowers/specs/2026-09-10-proofpath-design.md) — what it does and the measurements behind each decision
|
|
107
|
+
- [Implementation plan](docs/superpowers/plans/2026-09-10-proofpath-implementation-plan.md) — phases, ordered by risk retired
|
|
108
|
+
- [Open items](docs/superpowers/OPEN-ITEMS.md) — what is unresolved, and what has not been verified yet
|
|
109
|
+
|
|
110
|
+
## License
|
|
111
|
+
|
|
112
|
+
MIT
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# proofpath
|
|
2
|
+
|
|
3
|
+
> Don't guess. Show the evidence.
|
|
4
|
+
|
|
5
|
+
`proofpath` checks whether the sources behind a claim actually say what the claim
|
|
6
|
+
says. Point it at a paper, a draft, or a link — it verifies every citation on three
|
|
7
|
+
levels and shows you the passage behind each verdict.
|
|
8
|
+
|
|
9
|
+
1. **Does the source exist?** — resolved against Crossref, OpenAlex, PubMed, arXiv.
|
|
10
|
+
2. **Is it still valid?** — checked against Retraction Watch.
|
|
11
|
+
3. **Does it support the claim?** — retrieval + entailment against the source text.
|
|
12
|
+
|
|
13
|
+
Most tools stop at step 1. Step 3 is the point.
|
|
14
|
+
|
|
15
|
+
Runs offline and free by default: no API key, no Docker, no server. Windows, Linux
|
|
16
|
+
and macOS.
|
|
17
|
+
|
|
18
|
+
## What it will not do
|
|
19
|
+
|
|
20
|
+
It does not pretend to be certain. Full text is openly available for well under half
|
|
21
|
+
of published citations, so many verdicts will honestly be *not enough information*,
|
|
22
|
+
and every report ends with its own coverage figures. A tool that sounds sure about
|
|
23
|
+
everything is the problem this one exists to fight.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
uv tool install proofpath
|
|
27
|
+
|
|
28
|
+
proofpath # interactive TUI
|
|
29
|
+
proofpath check paper.pdf # one-shot report
|
|
30
|
+
proofpath check draft.md --format sarif
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Status
|
|
34
|
+
|
|
35
|
+
🚧 Design stage — no working code yet.
|
|
36
|
+
|
|
37
|
+
- [Design specification](docs/superpowers/specs/2026-09-10-proofpath-design.md) — what it does and the measurements behind each decision
|
|
38
|
+
- [Implementation plan](docs/superpowers/plans/2026-09-10-proofpath-implementation-plan.md) — phases, ordered by risk retired
|
|
39
|
+
- [Open items](docs/superpowers/OPEN-ITEMS.md) — what is unresolved, and what has not been verified yet
|
|
40
|
+
|
|
41
|
+
## License
|
|
42
|
+
|
|
43
|
+
MIT
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
Please **do not** open a public issue for a security problem.
|
|
6
|
+
|
|
7
|
+
Use GitHub's private vulnerability reporting on this repository
|
|
8
|
+
(Security → Report a vulnerability). You should get an initial response within a
|
|
9
|
+
week.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
`proofpath` fetches remote content and can, with explicit consent, download and run a
|
|
14
|
+
browser engine. Reports about the following are especially welcome:
|
|
15
|
+
|
|
16
|
+
- Fetched content escaping its parsing boundary.
|
|
17
|
+
- The permission prompt being bypassed, or a large install happening without consent.
|
|
18
|
+
- Secrets or the configured contact address leaking into reports, logs or caches.
|
|
19
|
+
- Path traversal through a crafted document or archive.
|
|
20
|
+
|
|
21
|
+
## Out of scope
|
|
22
|
+
|
|
23
|
+
- A wrong verdict on a claim. That is an accuracy issue — open a normal issue.
|
|
24
|
+
- Rate limiting or availability of third-party APIs.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Open items
|
|
2
|
+
|
|
3
|
+
Everything left unresolved as of **2026-09-10**, written down so none of it has to be
|
|
4
|
+
reconstructed from memory. Each entry says enough to be picked up cold.
|
|
5
|
+
|
|
6
|
+
Spec: `specs/2026-09-10-proofpath-design.md` · Plan: `plans/2026-09-10-proofpath-implementation-plan.md`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 1. Blocked — needs an action outside this repo
|
|
11
|
+
|
|
12
|
+
| # | Item | What to do |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| 1.1 | **CI workflow is not in the repo.** The file is written and working locally but the GitHub token lacks the `workflow` scope, so the push was rejected. | Run `gh auth refresh -h github.com -s workflow`, complete the device flow, then commit `.github/workflows/ci.yml` on its own. The file already exists on disk, untracked. |
|
|
15
|
+
| 1.2 | PyPI name `proofpath` is free but **not reserved**. | Publish `0.0.1` once there is a working skeleton. Publishing an empty placeholder is against PyPI policy, so this waits for Phase 0 to finish. |
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. Decisions taken but not confirmed by the author
|
|
20
|
+
|
|
21
|
+
Recorded with the recommendation that was made, so they can be accepted or reversed
|
|
22
|
+
deliberately rather than by default.
|
|
23
|
+
|
|
24
|
+
| # | Decision | Recommended | Why it might change |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| 2.1 | `install_browser` default (spec §7.1) | `ask` | `deny` is safer but hides from the user that a blocked source was recoverable |
|
|
27
|
+
| 2.2 | Reddit in v0.4 | include, optional | needs a user-registered OAuth app; Bluesky and HN work without one, so Reddit is never blocking |
|
|
28
|
+
| 2.3 | `spiyweb` keeps its name | yes | the spider-web-as-graph metaphor fits; every clean alternative on PyPI was worse |
|
|
29
|
+
| 2.4 | `reasonhound` keeps its name | yes | already a good name |
|
|
30
|
+
| 2.5 | Turkish sources | after v0.4 | OpenAlex/Crossref coverage is much weaker for Turkish; half-supporting it would damage trust |
|
|
31
|
+
| 2.6 | `--summarize` in the TUI | off by default there too | keeping "offline unless asked" true in both front-ends |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 3. Unvalidated assumptions — test before building on them
|
|
36
|
+
|
|
37
|
+
These were asserted during design without being checked. Each one, if wrong, changes
|
|
38
|
+
a phase.
|
|
39
|
+
|
|
40
|
+
| # | Assumption | How to check | If wrong |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| 3.1 | **A usable NLI cross-encoder exists as ONNX.** The whole "no torch in the base install" decision rests on this and it was never verified. | Search the ONNX model zoo / HF for a DeBERTa-MNLI or similar exported model; measure it on SciFact dev | either export one with `optimum`, or make `[gpu]`/torch the default and accept the install size |
|
|
43
|
+
| 3.2 | `sqlite-vec` ships working wheels for Windows and macOS arm64 | install on all three in CI during Phase 0 | fall back to numpy brute force; per-document corpora are small enough |
|
|
44
|
+
| 3.3 | `textual` renders the §13.1 layout correctly in Windows Terminal at 80 columns | render a fixture screen in CI on Windows | simplify the box drawing to ASCII |
|
|
45
|
+
| 3.4 | SciFact, AVeriTeC and PubHealth are still downloadable and pinnable | fetch each once, record the revision | substitute a comparable set and note it in the spec |
|
|
46
|
+
| 3.5 | X Community Notes dumps are still published and parseable | download one day's file, inspect the columns | drop the X path entirely; Bluesky and HN already carry the social provider |
|
|
47
|
+
| 3.6 | `fastembed` model quality is sufficient for passage ranking | compare recall@k against a sentence-transformers baseline in Phase 1 | move embeddings to the `[gpu]` extra as well |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 4. Design details deliberately left to implementation
|
|
52
|
+
|
|
53
|
+
Not oversights — they need real data to set, and guessing now would be false
|
|
54
|
+
precision. Each must end up written into the spec once measured.
|
|
55
|
+
|
|
56
|
+
| # | Detail | Set during |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| 4.1 | Title token-set Jaccard threshold for reference matching (spec §8) | Phase 3, tuned on the ghost test set |
|
|
59
|
+
| 4.2 | Year tolerance beyond ±1 for online-first publications | Phase 3 |
|
|
60
|
+
| 4.3 | Numeric comparison tolerance, and how to treat ranges vs point values (spec §10) | Phase 2 |
|
|
61
|
+
| 4.4 | Confidence threshold that routes a verdict to the judge | Phase 1 calibration |
|
|
62
|
+
| 4.5 | Chunk size and `k` for retrieval. Abstracts are trivial; a 12,000-word full text is not, and the two may need different settings | Phase 1, re-checked in Phase 4 |
|
|
63
|
+
| 4.6 | Which embedding model and which NLI model, by name and revision | Phase 1 |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 5. Genuinely unsolved problems
|
|
68
|
+
|
|
69
|
+
Known gaps with no chosen answer yet. These are the ones worth thinking about away
|
|
70
|
+
from the keyboard.
|
|
71
|
+
|
|
72
|
+
**5.1 — A citation that supports a paragraph, not a sentence.**
|
|
73
|
+
Spec §5.1 mentions a paragraph-level fallback but does not define when it triggers.
|
|
74
|
+
Attaching a paragraph-wide claim to one sentence produces confident nonsense. Needs a
|
|
75
|
+
rule, and probably a distinct reported state.
|
|
76
|
+
|
|
77
|
+
**5.2 — Author-year citation styles.**
|
|
78
|
+
`(Smith et al., 2020)` is much harder than `[12]`: the marker does not index the
|
|
79
|
+
bibliography directly, several works share an author-year, and `ibid.`/`op. cit.`
|
|
80
|
+
exist. Phase 5 currently treats both styles as one task; they are not.
|
|
81
|
+
|
|
82
|
+
**5.3 — Coverage is the real product ceiling.**
|
|
83
|
+
Measured: direct full text for well under half of sampled citations (spec §6.1). Every
|
|
84
|
+
abstract-only verdict is a weak verdict. Worth investigating whether Semantic Scholar,
|
|
85
|
+
CORE, or OpenAIRE meaningfully raise this before accepting the number.
|
|
86
|
+
|
|
87
|
+
**5.4 — What "confidence" means to a user.**
|
|
88
|
+
A `0.91` is a model score, not a probability of being right. Showing it as-is invites
|
|
89
|
+
misreading, hiding it removes signal. No decision yet on how to present it.
|
|
90
|
+
|
|
91
|
+
**5.5 — Caching fetched full text.**
|
|
92
|
+
Spec §16 says cached locally, not redistributed, clearable. Retention period and
|
|
93
|
+
whether publisher content should be cached at all are unresolved.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 6. Deferred by choice
|
|
98
|
+
|
|
99
|
+
Not problems, just not now. Recorded so they are not rediscovered as new ideas.
|
|
100
|
+
|
|
101
|
+
| Item | Revisit when |
|
|
102
|
+
|---|---|
|
|
103
|
+
| Landing site: one Astro site, four pages (`evidencelab.dev/`, `/proofpath`, `/reasonhound`, `/spiyweb`) | after v0.1 ships something runnable |
|
|
104
|
+
| GitHub org `evidencelab` (free at time of checking) | when the landing site is built |
|
|
105
|
+
| `evidencelab.dev` domain (free at time of checking) | same |
|
|
106
|
+
| `spiyweb` as an alternative retrieval backend for `proofpath` | after Phase 6; the real tie between the three projects |
|
|
107
|
+
| GROBID parser as an opt-in `--parser` | if Phase 5 citation pairing accuracy proves inadequate |
|
|
108
|
+
| Turkish sources | after v0.4 |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 7. Next session starts here
|
|
113
|
+
|
|
114
|
+
1. Finish item **1.1** — CI is a prerequisite for every "works on three platforms" claim.
|
|
115
|
+
2. Check assumption **3.1** — if no usable ONNX NLI model exists, the packaging story
|
|
116
|
+
changes and it is better to know before Phase 1 than during it.
|
|
117
|
+
3. Begin **Phase 1**: pin SciFact, build `scripts/eval.py`, get a first number.
|
|
118
|
+
|
|
119
|
+
Phase 1 carries a kill criterion on purpose. Getting to a real number quickly is the
|
|
120
|
+
point of the whole ordering.
|