Pre-submission manuscript checker powered by Claude agents
Project description
sub-checker
繁體中文 | English
Pre-submission manuscript checker powered by Claude agents with a Plan-Execute-Verify harness. Each check is performed by a specialized AI agent, then validated by deterministic checks and a reviewer agent to eliminate false positives.
What it checks
| Agent | What it does |
|---|---|
| typo_grammar | Spelling, grammar, awkward phrasing (skips reference list) |
| figure_table | Figure/table references exist, numbering is sequential, files present |
| citation_exist | In-text citations match the reference list (deterministic pre-scan + agent) |
| citation_format | Reference list follows target journal's citation style (APA, Vancouver, AMA, etc.) |
| journal_guidelines | Word count, required sections, abstract format, required statements (COI, ethics, data availability) |
| logic | Contradictions, unsupported claims, methods-results mismatches |
| citation_claim | Multi-source verification (PubMed + Semantic Scholar + Crossref), then verifies claims against abstracts |
Install
pip install sub-checker
Setup
You need an Anthropic API key:
export ANTHROPIC_API_KEY=sk-ant-...
Or create a .env file in your working directory:
ANTHROPIC_API_KEY=sk-ant-...
Usage
CLI
# Full check with target journal
sub-check paper.docx -j "The Lancet"
# Chinese report output
sub-check paper.docx -j "Nature Medicine" --lang zh-TW
# Only run specific checkers (cheaper & faster)
sub-check paper.docx --only figure,citation
# Skip expensive checkers
sub-check paper.docx --skip claim,logic
# Output as styled HTML report (includes COT viewer + confidence scores)
sub-check paper.docx -o html --output-file report.html
# Output as JSON (for programmatic use)
sub-check paper.docx -o json --output-file report.json
# Dry run (just parse, no agents)
sub-check paper.docx --dry-run
Web GUI
The GUI needs the source repo (the React frontend is not shipped on PyPI), plus the optional web backend dependencies:
git clone https://github.com/odafeng/sub-checker.git
cd sub-checker
pip install -e ".[web]" # backend: FastAPI + uvicorn
# Start backend
uvicorn sub_checker.api:app --reload
# Start frontend (in another terminal)
cd frontend && npm install && npm run dev
Open http://localhost:5173 — upload a .docx, pick a journal, run, and view the report with confidence badges and filtered false positives.
CLI options
sub-check [OPTIONS] MANUSCRIPT_PATH
Arguments:
MANUSCRIPT_PATH Path to .docx file or directory containing one (optional with --init)
Options:
-j, --journal Target journal name (e.g. "The Lancet")
-c, --config Path to a config file (default: ./.sub-checker.yaml if present)
-o, --output terminal | json | markdown | html (default: terminal)
--output-file Write report to file
--lang Report language: en (default) or zh-TW
--only Comma-separated: typo,logic,figure,citation,format,guidelines,claim
--skip Comma-separated checkers to skip
-v, --verbose Show agent tool calls in real-time
--dry-run Only parse .docx, don't run agents
--init Generate default .sub-checker.yaml
Pipeline (Plan-Execute-Verify)
Checkers │ 7 agents run concurrently (global concurrency cap, default 3 at a time)
Validate │ Deterministic post-validation (date math, citation cross-check)
Review │ Reviewer agent scores every surviving finding → confidence
Dedup │ Same issue from multiple checkers collapsed to the highest-confidence one
- Pre-execution: deterministic citation pre-scan + multi-source reference verification
- Post-validation: false positives filtered, remaining findings get confidence scores (0-100%), cross-checker duplicates merged
- See harness-architecture.md for full technical details
HTML report features
- Dark-themed styled report with severity badges
- Confidence scores — each finding shows reviewer-assigned confidence (%)
- False positive filtering — deterministic + reviewer agent removes incorrect findings
- Chain of Thought viewer — expand to see every API call, tool use, and reasoning step
- Model display — shows which Claude model generated the report
- i18n support (English / Traditional Chinese)
Cost estimate
By default judgment-heavy checkers (logic, citation_claim, journal_guidelines) and the
reviewer run on Claude Opus 4.8, while mechanical checkers (typo, figure, citation_exist,
citation_format) run on the cheaper Claude Sonnet 4.6. Per-checker effort is tuned to
keep token use low. Measured on a real ~5,000-word, 25-reference manuscript:
| Scope | Agents | Time | Cost |
|---|---|---|---|
| Quick check | --only figure,citation |
~3 min | ~$1 |
| Standard | --skip claim |
~6 min | ~$2–3 |
| Full check | all 7 agents + harness | ~10–12 min | ~$3–5 |
Cost scales with manuscript length and reference count (citation_claim verifies each
reference against PubMed/Semantic Scholar/Crossref). Override any model in
.sub-checker.yaml (e.g. set everything to claude-sonnet-4-6 for cheaper runs).
Logging
All logs are stored in ~/.sub-checker/:
logs/sub-checker.log— application log (auto-rotated, 10MB x 5)logs/sub-checker.error.log— errors onlycot/— agent chain-of-thought JSON logs (every tool call, every response)
Set cot_dir: "disabled" in .sub-checker.yaml to turn off COT file logging (entries still appear in HTML reports).
Architecture
- Plan-Execute-Verify harness: concurrent checkers → deterministic validation → reviewer → dedup (ADR-0010)
- 7 agents + reviewer agent, each with system prompt + curated tools + agentic loop (ADR-0002)
- Parser provides raw data; agents judge document structure (ADR-0009)
- Multi-source citation verification: PubMed + Semantic Scholar + Crossref (ADR-0005)
- FastAPI + React + TypeScript GUI (ADR-0006)
- Benchmark comparison | Harness architecture
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sub_checker-0.1.1.tar.gz.
File metadata
- Download URL: sub_checker-0.1.1.tar.gz
- Upload date:
- Size: 78.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b40d6e559a4251dc0186444787a5b2f5add1c74f6e864def6ff5b23c03b0d236
|
|
| MD5 |
b329d6017c977b6c1310f3de6ec9084d
|
|
| BLAKE2b-256 |
50eb89fb028a318f1cc0c225d155a9443fdf262a1f0a6c576b82a9b42238a9c7
|
Provenance
The following attestation bundles were made for sub_checker-0.1.1.tar.gz:
Publisher:
publish.yml on odafeng/sub-checker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sub_checker-0.1.1.tar.gz -
Subject digest:
b40d6e559a4251dc0186444787a5b2f5add1c74f6e864def6ff5b23c03b0d236 - Sigstore transparency entry: 1790335633
- Sigstore integration time:
-
Permalink:
odafeng/sub-checker@84d0fa557adc17590689e9091b897e7391a3175a -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/odafeng
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@84d0fa557adc17590689e9091b897e7391a3175a -
Trigger Event:
push
-
Statement type:
File details
Details for the file sub_checker-0.1.1-py3-none-any.whl.
File metadata
- Download URL: sub_checker-0.1.1-py3-none-any.whl
- Upload date:
- Size: 86.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a5be2b043024cee6c4c523bc95edf45c1a39740d8fa3dd567c93e818803bf33
|
|
| MD5 |
a963200cbd54210e0af88d3271eb9bdc
|
|
| BLAKE2b-256 |
1a0642e1f955f9cc240c091f648a375de4eed508df253ad30ae87c69747b946c
|
Provenance
The following attestation bundles were made for sub_checker-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on odafeng/sub-checker
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sub_checker-0.1.1-py3-none-any.whl -
Subject digest:
9a5be2b043024cee6c4c523bc95edf45c1a39740d8fa3dd567c93e818803bf33 - Sigstore transparency entry: 1790335695
- Sigstore integration time:
-
Permalink:
odafeng/sub-checker@84d0fa557adc17590689e9091b897e7391a3175a -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/odafeng
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@84d0fa557adc17590689e9091b897e7391a3175a -
Trigger Event:
push
-
Statement type: