{"id":49570245,"url":"https://github.com/zack-dev-cm/antirot","last_synced_at":"2026-05-03T13:50:42.973Z","repository":{"id":351479227,"uuid":"1193270411","full_name":"zack-dev-cm/antirot","owner":"zack-dev-cm","description":"Lint Markdown drafts for unsupported claims, broken citations, and draft markers.","archived":false,"fork":false,"pushed_at":"2026-04-24T13:48:16.000Z","size":97,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T13:50:36.642Z","etag":null,"topics":["citations","fact-checking","linting","markdown","research","sarif","scientific-writing"],"latest_commit_sha":null,"homepage":"https://zack-dev-cm.github.io/projects/antirot-research-artifact-linter.md","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zack-dev-cm.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T03:34:52.000Z","updated_at":"2026-04-15T17:15:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zack-dev-cm/antirot","commit_stats":null,"previous_names":["zack-dev-cm/antirot"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/zack-dev-cm/antirot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zack-dev-cm%2Fantirot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zack-dev-cm%2Fantirot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zack-dev-cm%2Fantirot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zack-dev-cm%2Fantirot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zack-dev-cm","download_url":"https://codeload.github.com/zack-dev-cm/antirot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zack-dev-cm%2Fantirot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32571456,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["citations","fact-checking","linting","markdown","research","sarif","scientific-writing"],"created_at":"2026-05-03T13:50:42.340Z","updated_at":"2026-05-03T13:50:42.968Z","avatar_url":"https://github.com/zack-dev-cm.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AntiRot\n\n![CI](https://github.com/zack-dev-cm/antirot/actions/workflows/ci.yml/badge.svg)\n![Python](https://img.shields.io/badge/python-3.10%2B-0b5fff)\n![License](https://img.shields.io/badge/license-MIT-111111)\n![Output](https://img.shields.io/badge/output-text%20%7C%20json%20%7C%20markdown%20%7C%20sarif-0a7f5a)\n![Runtime](https://img.shields.io/badge/runtime-local--first-6f42c1)\n\n**Catch unsupported claims before Markdown drafts ship.**\n\nAntiRot is a local-first CLI for AI-assisted papers, proposals, reports, and design docs.\nIt flags claim-heavy sentences with no nearby evidence anchor, broken citations, numeric claims\nwithout support, overclaim language, and leftover draft markers before the text gets shipped.\n\nStyle linters focus on wording. AntiRot focuses on evidence hygiene.\n\n## Install\n\nInstall directly from GitHub:\n\n```bash\npython3.10 -m venv .venv\nsource .venv/bin/activate\npip install \"antirot @ git+https://github.com/zack-dev-cm/antirot.git\"\n```\n\n## Quick Start\n\n```bash\nantirot lint examples/sloppy_paper.md \\\n  --references examples/references.md \\\n  --format markdown\n```\n\nIf you want a project config:\n\n```bash\nantirot init\n# edit .antirot.toml for your draft_glob and optional references path\nantirot lint\n```\n\n## Example\n\nInput draft:\n\n```md\nWe present a breakthrough system that outperforms frontier scientific agents by 37% on molecular reasoning.\n\nThe system reduces hallucinations to 0.0% while producing world-class papers in minutes TODO add benchmark table.\n\nWe show a 2.7x improvement in experiment throughput compared with prior work [@ghost2026].\n```\n\nReport:\n\n```text\nAntiRot report for examples/sloppy_paper.md\nscore=0/100 claims=5 coverage=0.0% citation_validity=0.0% issues=17\n- ERROR unsupported-claim line 3: Claim-like sentence has no nearby evidence anchor in the sentence or paragraph.\n- WARNING absolute-claim line 5: Absolute or universal wording should be narrowed, scoped, or backed by unusually strong evidence.\n- WARNING draft-marker line 7: Draft marker present. Remove TODO/TBD/FIXME before release.\n- ERROR citation-not-found line 9: Citation `ghost2026` is not defined in the references file or document references section.\n```\n\n## What It Checks\n\n- unsupported claims without nearby evidence anchors\n- numeric claims without nearby support\n- citations that do not resolve in the references file\n- citation-like markers that cannot be verified because no references source was loaded\n- footnote citations and references sections inside the same Markdown draft\n- inline Markdown links, DOIs, arXiv ids, and raw URLs as evidence anchors\n- paragraph-level evidence carry for wrapped Markdown prose\n- hype language without evidence\n- comparative claims without benchmark grounding\n- absolute or universal claim language that should be narrowed\n- TODO, TBD, FIXME, XXX, and HACK markers\n- fenced code blocks and non-prose Markdown are ignored instead of treated as claims\n\n## Typical Uses\n\n- AI-generated research drafts before submission or internal review\n- benchmark summaries written by agents or analysts\n- proposals and memos with lots of numeric claims\n- Markdown docs that need a cheap evidence gate in CI\n\n## Output Formats\n\n- `text` for local review\n- `json` for scripts and pipelines\n- `markdown` for human-readable reports\n- `sarif` for GitHub code scanning and CI flows\n\n## GitHub Actions\n\nAntiRot can feed GitHub code scanning with SARIF output:\n\n```yaml\nname: antirot\n\non:\n  pull_request:\n    paths:\n      - \"docs/**/*.md\"\n\njobs:\n  lint-drafts:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-python@v5\n        with:\n          python-version: \"3.12\"\n      - run: python -m pip install \"antirot @ git+https://github.com/zack-dev-cm/antirot.git\"\n      - run: |\n          antirot lint docs/paper.md \\\n            --references docs/references.bib \\\n            --format sarif \\\n            --output antirot.sarif\n      - uses: github/codeql-action/upload-sarif@v3\n        with:\n          sarif_file: antirot.sarif\n```\n\n## Why Use It Alongside Vale or textlint\n\nAntiRot is not a general prose or style linter. It is a narrow check for claim grounding,\ncitation hygiene, and draft leftovers in Markdown artifacts. Use Vale or textlint for style;\nuse AntiRot when the main failure mode is \"this sounds publishable, but the evidence is weak.\"\n\n## Configuration\n\n`antirot init` writes a starter `.antirot.toml`:\n\n```toml\n# draft_glob = \"docs/**/*.md\"\n# references = \"docs/references.md\"\nstrict = true\nmin_score = 80\n```\n\nSet `draft_glob` to the Markdown drafts you want to lint. The `references` path is optional. If\nyou set it, point it at a real `.bib`, Markdown references file, or numbered reference list before\nlinting. Citation markers only count as evidence when AntiRot can resolve them from that file or\nfrom a `References` section or footnote definition inside the draft.\n\n## Current Boundaries\n\n- the linter is still Markdown-first; it does not parse DOCX, LaTeX, or PDFs\n- evidence detection is local and structural, not semantic fact verification\n- score thresholds are best used as review gates, not as publication truth guarantees\n- config parsing supports scalar values only\n\n## Docs\n\n- [Release notes](docs/releases/v0.2.0.md)\n- [Reproducibility log](docs/releases/v0.2.0-reproducibility.md)\n- [Contributing](CONTRIBUTING.md)\n- [Security](SECURITY.md)\n- [Changelog](CHANGELOG.md)\n\n## Development\n\n```bash\npip install -e '.[dev]'\npython3 -m pytest -q\npython3 -m antirot.cli lint examples/sloppy_paper.md --references examples/references.md --strict\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzack-dev-cm%2Fantirot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzack-dev-cm%2Fantirot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzack-dev-cm%2Fantirot/lists"}