{"id":51288122,"url":"https://github.com/frizfealer/ground-check","last_synced_at":"2026-06-30T08:01:22.571Z","repository":{"id":367608115,"uuid":"1275627511","full_name":"frizfealer/ground-check","owner":"frizfealer","description":"Claude Code plugin for grounded, auditable AI answers: forces machine-checkable citations (file:line, tool calls) and mechanically verifies them to catch LLM hallucinations. Hooks-based, warn-only by default.","archived":false,"fork":false,"pushed_at":"2026-06-28T13:32:04.000Z","size":175,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T15:10:48.678Z","etag":null,"topics":["ai-agents","anthropic","attribution","auditability","citations","claude","claude-code","claude-code-plugin","fact-checking","grounding","hallucination","hallucination-detection","hooks","llm","provenance","verification"],"latest_commit_sha":null,"homepage":"https://frizfealer.github.io/","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/frizfealer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"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-06-21T00:13:26.000Z","updated_at":"2026-06-28T13:32:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/frizfealer/ground-check","commit_stats":null,"previous_names":["frizfealer/grounding-attribution","frizfealer/ground-check"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/frizfealer/ground-check","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frizfealer%2Fground-check","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frizfealer%2Fground-check/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frizfealer%2Fground-check/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frizfealer%2Fground-check/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/frizfealer","download_url":"https://codeload.github.com/frizfealer/ground-check/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/frizfealer%2Fground-check/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34957627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ai-agents","anthropic","attribution","auditability","citations","claude","claude-code","claude-code-plugin","fact-checking","grounding","hallucination","hallucination-detection","hooks","llm","provenance","verification"],"created_at":"2026-06-30T08:01:20.252Z","updated_at":"2026-06-30T08:01:22.559Z","avatar_url":"https://github.com/frizfealer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GroundCheck\n\nA **Claude Code plugin** that fights LLM hallucination by making answers\n**grounded and auditable**: every non-trivial claim must cite a\nmachine-checkable source, and those citations are mechanically **verified**\nagainst your filesystem. It has two halves:\n\n- **Injection** (`UserPromptSubmit`) — adds a policy telling Claude to mark every\n  non-trivial claim as VERIFIABLE (with a machine-checkable citation like\n  `Read(path:line)`, `Bash(cmd)`, `MCP(server.tool)`) or `unverified`.\n- **Verifier** (`Stop` **and** `PreToolUse`/`AskUserQuestion`) — mechanically\n  re-checks the filesystem-checkable citations (`Read`/`Edit`/`Write`/`MultiEdit`)\n  against the **current** files and against what was actually opened this session.\n  Fabricated, out-of-range, or never-opened citations are flagged. It runs both\n  when Claude finishes a turn **and** when Claude pauses to ask you a question\n  (where `Stop` does not fire), so question-ending answers still get checked.\n\nThe tool taxonomy lives once in `scripts/grounding_spec.py`; both halves derive\nfrom it, so coverage cannot drift between the policy and the verifier.\n\n## What problem does this solve?\n\nLarge language models confidently cite files, line numbers, and command output\nthat don't exist — the `app.py:42` that was never opened, the test result that\nwas never run. If you've wanted to **stop Claude Code from hallucinating\ncitations**, **verify that AI-generated `file:line` references are real**, or\n**audit which claims in an answer are actually grounded in your codebase**, that\nis exactly what this plugin enforces:\n\n- **Catch fabricated file:line citations** — every `Read`/`Edit`/`Write`\n  citation is re-checked against the current file on disk; pointers to missing\n  files or out-of-range lines are flagged.\n- **Catch never-opened references** — a citation to a file the session never\n  actually read is flagged, even if the file exists.\n- **Force a grounded-vs-unverified split** — Claude must label every non-trivial\n  claim as a machine-checkable citation or an explicit `unverified`, so you can\n  see at a glance what rests on evidence and what rests on the model's guess.\n\nIt is a **provenance and fact-checking layer for AI coding agents**, built on\nClaude Code hooks — no API keys, no external services, standard-library Python\nonly.\n\n## Install\n\nLocal (development):\n\n    claude --plugin-dir /path/to/ground-check\n\nOr via a marketplace / GitHub repo once published (see Claude Code plugin docs).\n\n## Requirements\n\n- Python 3 on `PATH` (standard library only — no pip installs)\n\n## Behavior \u0026 tuning\n\n- **Mostly warn-only.** By default only `CONTENT_MISMATCH` blocks (a backticked\n  quote that isn't a verbatim slice of the cited line); every other finding just\n  warns. Tune the blocking set via `BLOCK_CODES` in\n  `scripts/grounding_engine.py` — `BLOCK_CODES = set()` for pure warn-only, or\n  add codes like `{\"CONTENT_MISMATCH\", \"FABRICATED\"}`.\n- When blocking is on, a **loop guard** caps forced retries\n  (`MAX_FORCED_CONTINUATIONS`, default 3), stops on no-progress, and resets on a\n  clean turn or after `STATE_RESET_SECONDS`. State persists in\n  `$CLAUDE_PLUGIN_DATA` (survives plugin updates).\n- To change which tools are cited/checked, edit the `TOOLS` table in\n  `scripts/grounding_spec.py` — policy text, citation regex, and read-tracking\n  all update together.\n\n## Enable / disable\n\nThe plugin ships **on**. Toggle it globally with the `/grounding` slash command:\n\n    /grounding on        # enable policy injection + verifier\n    /grounding off       # disable both (policy not injected, verifier no-ops)\n    /grounding toggle    # flip the current state\n    /grounding           # show the current state without changing it\n\nThe state is a global flag file under your Claude config dir\n(`$CLAUDE_CONFIG_DIR` or `~/.claude`), so both halves agree and it persists\nacross sessions until you change it. Equivalent CLI:\n`python3 scripts/grounding_spec.py --set on|off|toggle`.\n\n## Verify / self-check\n\n    python3 scripts/grounding_spec.py --check         # consistency assertions\n    python3 scripts/grounding_spec.py --emit-policy    # preview the injected policy\n\n## Scope (honest limits)\n\n- Verifies citation **integrity** (pointer real, in range, actually read), not\n  semantic correctness of the prose.\n- Only `Read`/`Edit`/`Write`/`MultiEdit` pointers are auto-checked. A `Bash`\n  citation is checked by command presence (the cited command really ran this\n  session; the verifier then supplies the recorded output), and backticked\n  file-line content is checked against the source — but neither is semantically\n  judged. `Grep`/`Glob` and other recorded-output/conversation citations are not\n  auto-checked yet, so the absence of a flag on those is not confirmation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrizfealer%2Fground-check","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrizfealer%2Fground-check","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrizfealer%2Fground-check/lists"}