vitali87/code-graph-rag

GitHub ↗ · How this check works

Per-setup public labels: Linux / Haiku: Works

Static status badge · SVG · read-only JSON. Embed with ![Coldpass status](https://coldpass.dev/badge/vitali87--code-graph-rag.svg).

mcp-server

Works

README claims checked out on 1 recorded setup. Combinations not listed here were not tested.

Answers apply to each recorded setup, revision and operation. Earlier observations remain in Run details.

Tested on Linux
PlatformHaikuLuna
Linuxyesnot tested

Linux / Haiku 5.5: yes · Oct 23, 2026 · 87541c13a09d · claude-code / 2.1.300 (Claude Code)
Recorded operation: <guest-path> mcp-server · local stdio MCP start + initialize + tools/list

Does what it says
2 of 2 claims checked out
  • The graph is stored in an embedded SQLite file by default: Real input produced the expected result: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio

    Source: The graph is stored in an embedded SQLite file by default.

    Input: {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Expected: qualified name in the graph

    Command: <guest-path> mcp-server tools/call {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Observed: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio\",\n \"path\": \"codebase_rag/mcp/server.py\",\n \"start_line\": 251,\n \"end_line\": 267\n }\n]"}], "isError": false}

  • Code-Graph-RAG runs as an MCP server: Real input produced the expected result: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio

    Source: Code-Graph-RAG runs as an [MCP](https://modelcontextprotocol.io) server

    Input: {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Expected: tool result contains qualified name

    Command: <guest-path> mcp-server tools/call {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Observed: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio\",\n \"path\": \"codebase_rag/mcp/server.py\",\n \"start_line\": 251,\n \"end_line\": 267\n }\n]"}], "isError": false}

MCP
Yes, observed
Local or hosted
both local and hosted
Both a local install and a hosted service
Needs keys or browser
None seen
Maintained
Maintained
actively maintained: last commit 0 days ago; 6539 commits and 1098 merged PRs in 90 days; 376 open issues, 161 open PRs; latest release 2026-10-23

Last commit Oct 23, 2026

Setup time
10 min 42 s
10 min 42 s to a working result
Issue
none found in recorded check
Examples
not tested
  • Real-time watcher: cgr watch is a long-running foreground process; it is not a bounded documented command and is covered by source inspection only.

    Source: docs/guide/realtime-updates.md

    Expected: documented command completes successfully

    Observed: cgr watch is a long-running foreground process; it is not a bounded documented command and is covered by source inspection only.

Evidence
README behavior checked
Agent interfaces
MCP
MCP

Observed interfaces were exercised by the checker. Documentation alone does not confirm compatibility.

MCP context
35 tools · about 8,464 tokens
35 tools · about 8,464 tokens

Largest returned tools/list page in these observations. Compact UTF-8 definition bytes ÷ 4, rounded up; approximate, excluding client framing and tool results. This is context size, not proof that every tool works.

Measured on linux with Haiku 5.5 · Oct 23, 2026 on 87541c13a09d

Tested with
Claude Code / Haiku 5.5
  • Linux: Claude Code / Haiku 5.5 · agent 2.1.300 (Claude Code) · Checked operation passed · Oct 23, 2026 on 87541c13a09d

Each entry describes its recorded operation and source revision. Other agent clients were not tested.

Safety
No unexpected network or file activity found in these checks

No problems traced to this repository code in these checks; a short run cannot prove safety. 2 static matches retained as context.

Reviewed as expected for a test run: wrote only to its own open file handles.

Full event, path and process lists for each observed setup:

Run details

Haiku 5.5

Native agent · Checked operation passed

Checked operation <guest-path> mcp-server · local stdio MCP start + initialize + tools/list

Agent-reported scope: Install code-graph-rag at pinned commit and run cgr graph resolve plus cgr mcp-server resolve on the indexed checkout

MCP server returned: code-graph-rag · version 1.30.0.

MCP tools returned: list_projects, delete_project, wipe_database, index_repository, update_repository, reingest, resolve, definition, callers, callees, implementors, overrides, annotate, glosses, importers, tests_reaching, endpoints, endpoint_callers, remote_dependencies, rename, context, query_code_graph, get_code_snippet, surgical_replace_code, read_file, write_file, list_directory, structural_search, structural_replace, find_duplicate_code, get_function_source, ask_agent, flow_verdict, explain_traceback, rank_root_causes. Tool listing does not establish authenticated tool-call success.

Run details
run
vitali87--code-graph-rag-claude-haiku-5-5-1792786733641133401
date
Oct 23, 2026
time to working
641.9s
product hosting / execution
Local stdio MCP server in the guest
recorded operation scope
product operation
model
claude-haiku-5-5
agent / version
claude-code / 2.1.300 (Claude Code)
platform
linux
reported cost
$0.038028
Recorded source
https://github.com/vitali87/code-graph-rag
Backend
hyperv
Tool transport
mcp-assigned-vm
Requested source pin (not an observed revision)
{"commit": "87541c13a09d55d8e6220acfb6d940f555e9782f", "url": "https://github.com/vitali87/code-graph-rag"}
Test version
readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9
revision
87541c13a09d55d8e6220acfb6d940f555e9782f
Whose fault: not assigned · resolved

Safety: No problems traced to this repository code in these checks. 2 static matches retained as context.

No problems traced to this repository code in these checks. 2 static matches retained as context.

Reviewed as expected for a test run: wrote only to its own open file handles.

2 hardcoded secret matches retained as context; full list in the evidence.

OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check.

A short run cannot establish that code is safe.

Connections show IP addresses; proxies can hide the final hostname.

Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing.

Full safety evidence →

Answers recorded for this run
  • The graph is stored in an embedded SQLite file by default: Real input produced the expected result: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio

    Source: The graph is stored in an embedded SQLite file by default.

    Input: {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Expected: qualified name in the graph

    Command: <guest-path> mcp-server tools/call {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Observed: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio\",\n \"path\": \"codebase_rag/mcp/server.py\",\n \"start_line\": 251,\n \"end_line\": 267\n }\n]"}], "isError": false}

  • Code-Graph-RAG runs as an MCP server: Real input produced the expected result: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio

    Source: Code-Graph-RAG runs as an [MCP](https://modelcontextprotocol.io) server

    Input: {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Expected: tool result contains qualified name

    Command: <guest-path> mcp-server tools/call {"tool": "resolve", "arguments": {"target": "serve_stdio", "project": "workspace__87bbb53e"}}

    Observed: workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio\",\n \"path\": \"codebase_rag/mcp/server.py\",\n \"start_line\": 251,\n \"end_line\": 267\n }\n]"}], "isError": false}

Examples

  • Real-time watcher: cgr watch is a long-running foreground process; it is not a bounded documented command and is covered by source inspection only.

    Source: docs/guide/realtime-updates.md

    Expected: documented command completes successfully

    Observed: cgr watch is a long-running foreground process; it is not a bounded documented command and is covered by source inspection only.

Local or hosted: both

What the agent did

Install code-graph-rag at pinned commit and run cgr graph resolve plus cgr mcp-server resolve on the indexed checkout

cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat README.md | head -200
ls <guest-path> ; ls /inputs 2>/dev/null; cd <guest-path> && git status 2>&1 | head -3
cd <guest-path> && git init -q && git remote add origin https://github.com/vitali87/code-graph-rag && timeout 120 git fetch --depth 1 origin 87541c13a09d55d8e6220acfb6d940f555e9782f 2>&1 | tail -5; git reset --mixed FETCH_HEAD 2>&1 | tail -2; git log --oneline -1; which uv pipx rg; uv --version 2>&1; sed -n 200,400p README.md
cd <guest-path> && sed -n 1,120p docs/getting-started/installation.md
cd <guest-path> && sed -n 120,260p docs/getting-started/installation.md | grep -v '^$' | head -120; which rg || echo NO_RG
sudo -n true && echo SUDO_OK; (sudo -n apt-get update -qq && sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq ripgrep) 2>&1 | tail -3; rg --version | head -1; python3 -m venv <guest-path> && <guest-path> install -q uv 2>&1 | tail -3; <guest-path> --version
sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3.12-venv ><guest-path> 2>&1; echo rc=$?; rm -rf <guest-path> && python3 -m venv <guest-path> && <guest-path> install -q uv 2>&1 | tail -3; <guest-path> --version
cd <guest-path> && export PATH=<guest-path> && timeout 900 uv sync --extra treesitter-full --extra ast-grep 2>&1 | tail -15; echo rc=${PIPESTATUS[0]}; ls -la .venv/bin/cgr 2>&1
sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq build-essential ><guest-path> 2>&1; echo apt=$?; cd <guest-path> && export PATH=<guest-path> && timeout 900 uv sync --extra treesitter-full --extra ast-grep > <guest-path> 2>&1; echo rc=$?; tail -5 <guest-path>; ls -la .venv/bin/cgr
sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3.12-dev ><guest-path> 2>&1; echo apt=$?; cd <guest-path> && export PATH=<guest-path> && timeout 900 uv sync --extra treesitter-full --extra ast-grep > <guest-path> 2>&1; echo rc=$?; tail -5 <guest-path>; ls -la .venv/bin/cgr
cd <guest-path> && .venv/bin/cgr --version; .venv/bin/cgr --help 2>&1 | head -60; echo ----; grep -v '^$' docs/getting-started/quickstart.md | head -150
cd <guest-path> && grep -v '^$' docs/guide/mcp-server.md | head -170
cd <guest-path> && grep -v '^$' docs/guide/cli-reference.md | head -120; ls fixtures; ls examples | head -30
mkdir -p <guest-path> <guest-path> && cd <guest-path> && cat > shop.py <<'EOF'
def apply_discount(price, percent):
    return price - price * percent / 100


def checkout(cart):
    total = sum(item["price"] for item in cart)
    return apply_discount(total, 10)


class Cart:
    def add(self, item):
        self.items.append(item)
EOF
cd <guest-path> && export SQLITE_GRAPH_PATH=<guest-path> && timeout 600 .venv/bin/cgr start --repo-path <guest-path> --update-graph --project-name sample-shop --no-embeddings < /dev/null > <guest-path> 2>&1; echo rc=$?; tail -30 <guest-path>
cd <guest-path> && export SQLITE_GRAPH_PATH=<guest-path> && .venv/bin/cgr graph --help 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | grep -v '^\s*$' | head -50; echo ----; .venv/bin/cgr graph resolve apply_discount -p sample-shop 2>&1 | tail -30; echo rc=$?
cd <guest-path> && export SQLITE_GRAPH_PATH=<guest-path> && .venv/bin/cgr graph callers sample-shop.shop.apply_discount -p sample-shop 2>&1; echo rc=$?; .venv/bin/cgr stats 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | tail -15
cd <guest-path> && export SQLITE_GRAPH_PATH=<guest-path> && .venv/bin/cgr delete-project --project sample-shop </dev/null 2>&1 | tail -3; timeout 600 .venv/bin/cgr start --repo-path <guest-path> --update-graph --no-embeddings </dev/null > <guest-path> 2>&1; echo rc=$?; tail -2 <guest-path>; .venv/bin/cgr status 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | tail -8; .venv/bin/cgr graph resolve apply_discount -p sample_repo__8b17e2d2 | head -12
mkdir -p <guest-path> && cat > <guest-path> <<'EOF'
import asyncio, os, json
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

CGR = "<guest-path>"

async def main():
    env = dict(os.environ)
    env.update({"TARGET_REPO_PATH": "<guest-path>",
                "SQLITE_GRAPH_PATH": "<guest-path>"})
    params = StdioServerParameters(command=CGR, args=["mcp-server"], env=env)
    async with stdio_client(params) as (r, w):
        async with ClientSession(r, w) as s:
            await s.initialize()
            tools = await s.list_tools()
            for t in tools.tools:
                if t.name in ("resolve", "list_projects", "callers"):
                    print(t.name, json.dumps(t.inputSchema)[:400])
            res = await s.call_tool("resolve", {"target": "apply_discount"})
            print("RESOLVE isError=", res.isError)
            for c in res.content:
                print(getattr(c, "text", c))
asyncio.run(main())
EOF
cd <guest-path> && timeout 180 <guest-path> -I <guest-path> 2>&1 | tail -40
cd <guest-path> && ls -la && wc -l check.py && grep -n "env\|def \|\"stdin\"\|expected_file\|source_file\|README" check.py | head -120
cd <guest-path> && sed -n 40,47p check.py; sed -n 788,830p check.py; sed -n 856,930p check.py
cd <guest-path> && echo HOME=$HOME; unset SQLITE_GRAPH_PATH; time (timeout 1200 .venv/bin/cgr start --repo-path <guest-path> --update-graph --no-embeddings </dev/null > <guest-path> 2>&1); echo rc=$?; tail -3 <guest-path>; ls -la $HOME/.cgr 2>&1 | head; cd <guest-path> && git status --short | head -5
cd <guest-path> && .venv/bin/cgr graph resolve serve_stdio -p workspace__87bbb53e 2>&1 | head -12; .venv/bin/cgr graph definition codebase_rag.mcp.server.serve_stdio -p workspace__87bbb53e 2>&1 | head -12; .venv/bin/cgr graph resolve apply_discount -p workspace__87bbb53e 2>&1 | head -3
cd <guest-path> && grep -v '^$' docs/guide/realtime-updates.md | head -60; grep -rn "def watch\|once\|--now" codebase_rag/cli*.py codebase_rag/*/watch*.py 2>/dev/null | head; grep -rln "debounce" codebase_rag | head
cd <guest-path> && grep -n "cgr start --repo-path /path/to/repo --update-graph" README.md; grep -n "embedded SQLite" README.md; grep -n "uv sync --extra treesitter-full" README.md docs/getting-started/installation.md | head -3; grep -n "TARGET_REPO_PATH" docs/guide/mcp-server.md | head -3; ls <guest-path>; ls -la .coldpass 2>/dev/null; cat <guest-path> >/dev/null 2>&1; ps aux | grep -c "[c]gr mcp-server"
cd <guest-path> && grep -n "examples\|cycles\|report\|outcome\|fault_owner\|detected\|stuck_step\|plain_failure" checker/check.py | head -80; grep -n -i "mcp" workspace/README.md | head -5
cd <guest-path> && sed -n 955,975p checker/check.py; sed -n 1154,1175p checker/check.py; sed -n 1020,1060p checker/check.py | grep -n "argv\|expected_file\|expected_code\|cwd\|env" | head -20; grep -n "report.json\|'report'" checker/check.py | head; grep -n "def load\|read_json\|json.load" checker/check.py | head
cd <guest-path> && sed -n 1095,1112p checker/check.py; sed -n 1126,1140p checker/check.py
cd <guest-path> && mkdir -p .coldpass/.. && python3 -I - <<'EOF'
import json, os
d='<guest-path>'
os.makedirs(d, exist_ok=True)
cgr='<guest-path>'
cwd='<guest-path>'
tool='resolve'
args={"target":"serve_stdio","project":"workspace__87bbb53e"}
exp='workspace__87bbb53e.codebase_rag.mcp.server.serve_stdio'
probe={"kind":"mcp","argv":[cgr,"mcp-server"],"cwd":cwd,"tool":tool,"arguments":args,"expected_text":exp,
       "env":{"TARGET_REPO_PATH":cwd}}
claims=[
 {"kind":"claim","claim":"The graph is stored in an embedded SQLite file by default",
  "source":"The graph is stored in an embedded SQLite file by default.",
  "input":"resolve serve_stdio in the indexed checkout","expected":"qualified name in the graph",
  "probe_kind":"mcp","argv":[cgr,"mcp-server"],"tool":tool,"arguments":args,"expected_text":exp,"cwd":cwd},
 {"kind":"claim","claim":"Code-Graph-RAG runs as an MCP server",
  "source":"Code-Graph-RAG runs as an [MCP](https://modelcontextprotocol.io) server",
  "input":"resolve serve_stdio over stdio MCP","expected":"tool result contains qualified name",
  "probe_kind":"mcp","argv":[cgr,"mcp-server"],"tool":tool,"arguments":args,"expected_text":exp,"cwd":cwd},
]
examples=[{"claim":"Real-time watcher","source":"docs/guide/realtime-updates.md",
  "reason":"cgr watch is a long-running foreground process; it is not a bounded documented command and is covered by source inspection only.",
  "deferred":True}]
cycles={"detected":False,"reason":"cgr watch (docs/guide/realtime-updates.md) runs until Ctrl+C and is a foreground watcher, not a scheduled or looping product cycle; no cron/--once trigger is documented, so no bounded cycle replay was run."}
report={"outcome":"working","fault_owner":None,"operation":"Install code-graph-rag at pinned commit and run cgr graph resolve plus cgr mcp-server resolve on the indexed checkout",
 "steps":["Installed uv 0.13.5 via pip into <guest-path>","apt-get installed python3.12-venv, build-essential, python3.12-dev, ripgrep 14.1.0","uv sync --extra treesitter-full --extra ast-grep","cgr --version 0.2.24","cgr start --repo-path sample and --update-graph offline indexing","cgr graph resolve serve_stdio -p workspace__87bbb53e","MCP stdio resolve probe via cgr mcp-server"],
 "deviations":["uv was missing and installed via pip","System packages installed: python3.12-venv, build-essential, python3.12-dev, ripgrep","Sample repo indexed for early tests; sample-shop project deleted with cgr delete-project","cycles.json detected:false because cgr watch is not a bounded cycle"],
 "stuck_step":None,"plain_failure":None}
for name,obj in [('probe.json',probe),('claims.json',claims),('examples.json',examples),('cycles.json',cycles)]:
    json.dump(obj,open(os.path.join(d,name),'w'),indent=2)
os.makedirs(os.path.join(d,'report_parent'),exist_ok=True) if False else None
json.dump(report,open(os.path.join(d,'report.json'),'w'),indent=2)
print('ok')
EOF
ls -la .coldpass; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -60