Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
84 commits
Select commit Hold shift + click to select a range
61f2f59
feat(cli): scaffold `qwen serve` HTTP daemon (Stage 1, #3803)
wenshao May 7, 2026
8d7c03a
feat(cli): wire HttpAcpBridge + POST /session for `qwen serve` (#3803)
wenshao May 7, 2026
ca996ec
feat(cli): wire POST /session/:id/prompt + /cancel for `qwen serve` (…
wenshao May 7, 2026
41aa950
feat(cli): wire SSE streaming for `qwen serve` events (#3803)
wenshao May 7, 2026
6ee655f
feat(cli): wire POST /permission/:requestId for `qwen serve` (#3803)
wenshao May 7, 2026
8206a64
feat(sdk): add DaemonClient for the qwen serve HTTP API (#3803)
wenshao May 7, 2026
a8ce5e0
feat(cli,sdk): list workspace sessions + set session model (#3803)
wenshao May 7, 2026
ad0e6ec
fix(cli,sdk): audit round 1 follow-ups for `qwen serve` (#3803)
wenshao May 7, 2026
39a6e44
fix(cli): audit round 2 follow-ups for `qwen serve` (#3803)
wenshao May 7, 2026
db126ac
docs(cli): audit rounds 3 + 4 follow-ups for `qwen serve` (#3803)
wenshao May 7, 2026
12a8e3b
fix(cli): PR #3889 review round 1 — critical correctness (#3803)
wenshao May 7, 2026
e7144d3
fix(cli,sdk): PR #3889 review round 2 — SSE robustness + EventBus pol…
wenshao May 7, 2026
934551e
docs(cli,sdk): PR #3889 review round 3 — minor + docs (#3803)
wenshao May 7, 2026
90044f2
fix(cli,sdk): self-audit round 5+ — close orphaned EventBus + DaemonE…
wenshao May 7, 2026
8b8abc7
fix(cli,sdk): PR #3889 review round 4 — child-crash recovery + SSE/pe…
wenshao May 7, 2026
04d9805
test(integration): qwen serve daemon — routes + streaming + recovery …
wenshao May 7, 2026
05f6e05
fix(cli): PR #3889 review round 5 — claude-opus-4-7 audit (#3803)
wenshao May 7, 2026
750262b
fix(cli): PR #3889 review round 6 — gpt-5.5 audit (#3803)
wenshao May 7, 2026
eac881f
fix(cli): PR #3889 review round 7 — match CodeQL suppression to fired…
wenshao May 7, 2026
f1bf9d8
fix(cli): self-audit round 8 — concurrency + listener leak + IPv6 + C…
wenshao May 7, 2026
56dcc10
fix(cli): self-audit round 9-10 — reject empty-bracket --hostname (#3…
wenshao May 7, 2026
ece1d09
docs(cli): note SSE single-line data emit vs multi-line parser (#3803)
wenshao May 7, 2026
0337f71
fix(cli,sdk): close 11 #3889 review threads — race + leak + IPv6 + SSE
wenshao May 8, 2026
62f9d50
Merge remote-tracking branch 'origin/main' into feat/qwen-serve-stage…
wenshao May 8, 2026
da6e680
Merge branch 'feat/qwen-serve-stage1-scaffold' of github.com:QwenLM/q…
wenshao May 8, 2026
87255e1
chore(lint): allow mime/lite in import/no-internal-modules (#3803)
wenshao May 8, 2026
11567a4
fix(cli,sdk): close 14 review threads — env whitelist + races + Windo…
wenshao May 9, 2026
149999a
fix(cli): close 3 more review threads — case-insensitive Host, trim t…
wenshao May 9, 2026
2cc2305
fix(sdk): close 2 #3889 polyfill leaks — abortTimeout + composeAbortS…
wenshao May 9, 2026
988507e
fix(cli,sdk): close 13 deepseek review threads — error handling + rac…
wenshao May 9, 2026
71664ae
Merge branch 'feat/qwen-serve-stage1-scaffold' of github.com:QwenLM/q…
wenshao May 9, 2026
27a164c
docs(serve): close §08 Stage 1 doc gap — user guide + protocol refere…
wenshao May 9, 2026
73203f3
docs(serve): close 8 deepseek doc-review findings (#3803)
wenshao May 11, 2026
e74aa99
fix(cli,sdk,docs): close 21 review threads — env regression + races +…
wenshao May 11, 2026
1f370e2
docs(serve): close 2 last review threads — prompt timeout limitation …
wenshao May 11, 2026
606d970
fix(serve): close 3 copilot review threads — SSE envelope shape + int…
wenshao May 11, 2026
099b52a
fix(serve): close 3 copilot review threads — sync write throw, polyfi…
wenshao May 11, 2026
250c13d
fix(cli,sdk): close 8 review threads — DoS cap + SDK plumbing + clean…
wenshao May 11, 2026
cb04bd3
fix(cli,test): close 2 copilot review threads — case-insensitive bear…
wenshao May 11, 2026
c2c0b2b
Merge branch 'main' of github.com:QwenLM/qwen-code into feat/qwen-ser…
wenshao May 11, 2026
86c0707
fix(cli,sdk,docs): close 6 review threads — CodeQL regex, body cancel…
wenshao May 11, 2026
28552e2
fix(cli,sdk,docs): close 10 review threads — DoS observability + race…
wenshao May 11, 2026
1439826
fix(serve): add missing v field on subscriber-limit stream_error fram…
wenshao May 11, 2026
7161459
docs(users): close 1 copilot review thread — GitHub canonical casing …
wenshao May 11, 2026
f8509dd
fix(serve): close 4 deepseek review threads — closed-bus race + per-s…
wenshao May 11, 2026
d3d5d6d
ci(noop): re-trigger workflow for f8509dde5 (#3803)
wenshao May 11, 2026
053e8ad
Merge remote-tracking branch 'origin/main' into feat/qwen-serve-stage…
wenshao May 11, 2026
6f98dc6
fix(cli,sdk): close 8 review threads — sse abort + queue drain mode +…
wenshao May 11, 2026
66ffd7c
feat(serve): close 3 chiga0 audit items — ringSize 4000, --max-sessio…
wenshao May 11, 2026
39d18a9
fix(serve,sdk,docs): close 9 review threads — req.on('close') prompt-…
wenshao May 11, 2026
43e0ea0
fix(serve,sdk,test): close 7 review threads — fetchTimeoutMs negative…
wenshao May 12, 2026
ee39b1d
fix(serve,test,docs): close 6 review threads — TEST_CLI_PATH + Stage …
wenshao May 12, 2026
0dc439e
fix(serve): close 4 review threads — unhandled rejection + maxSession…
wenshao May 12, 2026
b910022
docs(sdk): close 1 review thread — sse.ts MAX_BUF_CHARS docstring lea…
wenshao May 12, 2026
c790dbd
fix(serve,sdk): close 5 review threads — disconnect/attach race + 3 s…
wenshao May 12, 2026
ce834bc
fix(serve): close 4 review threads — 2 critical (NaN cap, stderr buff…
wenshao May 12, 2026
3edf8de
fix(sdk): close 1 review thread — sse parseFrame tighter shape guard …
wenshao May 12, 2026
6d0de70
fix(sdk): close 1 review thread — fetchWithTimeout keeps timer alive …
wenshao May 12, 2026
4f722af
fix(serve,sdk): close 8 review threads — coalescing race fix + --max-…
wenshao May 12, 2026
b39ded4
fix(sdk): close 1 review thread — sse parseFrame must not drop frames…
wenshao May 12, 2026
691ec34
docs(sdk): close 1 review thread — sse MAX_BUF_CHARS comment was over…
wenshao May 12, 2026
734d833
fix(serve): close 7 review threads — atomic write, read-size cap, for…
wenshao May 12, 2026
e89919c
fix(sdk): close 1 review thread — sse parseFrame must validate option…
wenshao May 12, 2026
b176790
docs(serve): Stage 1.5 markers from chiga0 follow-up architecture rev…
wenshao May 12, 2026
bbc7b8b
docs(serve): tighten Stage 1 scope framing + durability + Stage 1.5 m…
wenshao May 12, 2026
be6725c
fix(serve): close 2 correctness findings from tanzhenxin review
wenshao May 12, 2026
3efea1b
fix(serve): close 3 review threads — maxConnections NaN/negative vali…
wenshao May 12, 2026
6525205
docs(serve): close 8 review threads — code-comment clarity + 3 new St…
wenshao May 12, 2026
cbddad1
fix(serve): close 1 review thread — catch --hostname localhost:4170 t…
wenshao May 12, 2026
9352627
docs(serve): two new Stage 1 scope boundaries (option A + option iii)…
wenshao May 12, 2026
8de72dc
docs(serve): clarify option-A across Mode 1 (headless) vs Mode 2 (TUI…
wenshao May 12, 2026
e18b8fa
fix(serve,sdk): close 12 review threads — 6 critical bugs + 6 follow-ups
wenshao May 12, 2026
02e9b02
fix(serve,sdk): close 4 more review threads — frame-scan perf + publi…
wenshao May 12, 2026
f29353a
docs(serve): correct N:1 framing — qwen-code's ACP agent natively sup…
wenshao May 12, 2026
6a170ef
feat(serve): Stage 1 bridge now multiplexes sessions on one qwen --ac…
wenshao May 12, 2026
88fe531
Merge remote-tracking branch 'origin/main' into feat/qwen-serve-stage…
wenshao May 12, 2026
b37cc01
fix(serve,sdk): close 12 review threads — 6 critical bugs + 6 follow-ups
wenshao May 12, 2026
0a4146a
fix(sdk): close 2 review threads — consumeFrames CRLF scan now actual…
wenshao May 12, 2026
c5155bc
fix(serve): close 3 review threads + Windows test skip — dangling sym…
wenshao May 12, 2026
f5e0e9a
fix(serve): close 6 review threads — 4 critical bugs + 2 doc updates
wenshao May 12, 2026
49e0af6
fix(serve): close 4 review threads — close write-mode race + 2 missin…
wenshao May 12, 2026
6f02d06
fix(sdk): close 1 review thread — parseSseStream abort path catches b…
wenshao May 13, 2026
dc2207d
fix(serve): close 1 review thread — eventBus eviction detaches abort …
wenshao May 13, 2026
e02537c
fix(serve): close 1 review thread — restore double-Ctrl+C force-kill …
wenshao May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
220 changes: 111 additions & 109 deletions .qwen/skills/codegraph/SKILL.md

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions .qwen/skills/codegraph/bug-analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@ print(result.format_report())

The result object (`BugAnalysisResult`) contains:

| Field | Type | Description |
|-------|------|-------------|
| `issue` | `ParsedIssue` | Parsed issue with extracted paths/funcs/commits |
| `candidates` | `list[RootCauseCandidate]` | Ranked root cause locations |
| `path_matches` | `int` | How many extracted paths matched graph File nodes |
| `semantic_matches` | `int` | How many semantic matches were found |
| `caller_traces` | `int` | How many mentioned functions had traceable callers |
| `analysis_time_ms` | `float` | Total analysis time |
| Field | Type | Description |
| ------------------ | -------------------------- | -------------------------------------------------- |
| `issue` | `ParsedIssue` | Parsed issue with extracted paths/funcs/commits |
| `candidates` | `list[RootCauseCandidate]` | Ranked root cause locations |
| `path_matches` | `int` | How many extracted paths matched graph File nodes |
| `semantic_matches` | `int` | How many semantic matches were found |
| `caller_traces` | `int` | How many mentioned functions had traceable callers |
| `analysis_time_ms` | `float` | Total analysis time |

### Inspecting the Parsed Issue

Expand Down
15 changes: 15 additions & 0 deletions .qwen/skills/codegraph/patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,37 @@ Run these via `cs.conn.execute(query)`. All queries return lists of tuples.
## Structural Queries

**Who calls a function?**

```cypher
MATCH (caller:Function)-[:CALLS]->(f:Function {name: 'free_irq'})
RETURN caller.name, caller.file_path
ORDER BY caller.name LIMIT 30
```

**What does a function call?**

```cypher
MATCH (f:Function {name: 'sched_fork'})-[:CALLS]->(callee:Function)
RETURN callee.name, callee.file_path
```

**Transitive callers (up to 3 hops):**

```cypher
MATCH (caller:Function)-[:CALLS*1..3]->(f:Function {name: 'kfree'})
RETURN DISTINCT caller.name, caller.file_path LIMIT 50
```

**Functions in a module:**

```cypher
MATCH (f:Function)<-[:DEFINES_FUNC]-(file:File)-[:BELONGS_TO]->(m:Module)
WHERE m.path_prefix = 'net/core'
RETURN f.name, file.path LIMIT 30
```

**Cross-module calls (e.g. fs → mm):**

```cypher
MATCH (f1:Function)-[:CALLS]->(f2:Function),
(file1:File)-[:DEFINES_FUNC]->(f1),
Expand All @@ -42,6 +47,7 @@ ORDER BY calls DESC LIMIT 20
```

**Fan-in and fan-out:**

```cypher
MATCH (caller:Function)-[:CALLS]->(f:Function)-[:CALLS]->(callee:Function)
WHERE f.is_historical = 0
Expand All @@ -51,6 +57,7 @@ ORDER BY risk DESC LIMIT 20
```

**Module sizes:**

```cypher
MATCH (f:Function)<-[:DEFINES_FUNC]-(file:File)-[:BELONGS_TO]->(m:Module)
WHERE f.is_historical = 0
Expand All @@ -59,6 +66,7 @@ ORDER BY func_count DESC LIMIT 30
```

**Functions by name pattern:**

```cypher
MATCH (f:Function) WHERE f.name STARTS WITH 'irq_'
RETURN f.name, f.file_path LIMIT 20
Expand All @@ -72,19 +80,22 @@ RETURN f.name, f.file_path LIMIT 30
## Evolution Queries

**Functions modified by a commit:**

```cypher
MATCH (c:Commit)-[:MODIFIES]->(f:Function)
WHERE c.hash STARTS WITH 'abc123'
RETURN f.name, f.file_path
```

**Commits touching a file:**

```cypher
MATCH (c:Commit)-[:TOUCHES]->(file:File {path: 'kernel/sched/core.c'})
RETURN c.hash, c.message, c.author
```

**Co-changed functions (modified together frequently):**

```cypher
MATCH (c:Commit)-[:MODIFIES]->(f1:Function),
(c)-[:MODIFIES]->(f2:Function)
Expand All @@ -94,25 +105,29 @@ ORDER BY co_changes DESC LIMIT 20
```

**Largest commits (most functions changed):**

```cypher
MATCH (c:Commit)-[:MODIFIES]->(f:Function)
RETURN c.hash, c.message, count(f) AS funcs_changed
ORDER BY funcs_changed DESC LIMIT 10
```

**Historical (deleted/renamed) functions:**

```cypher
MATCH (f:Function) WHERE f.is_historical = 1
RETURN f.name, f.file_path LIMIT 30
```

**Backfill progress:**

```cypher
MATCH (c:Commit) WHERE c.version_tag = 'bf'
RETURN count(c) AS backfilled
```

**Most frequently modified files:**

```cypher
MATCH (c:Commit)-[:TOUCHES]->(f:File)
RETURN f.path, count(c) AS commits
Expand Down
93 changes: 47 additions & 46 deletions .qwen/skills/codegraph/pr-analysis.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ Key flags:
## Step 4 — Run the unified PR review pipeline

The authoritative entry point is `pr_review.py` — a unified pipeline that combines:

- Per-PR structural risk scoring (blast radius, test coverage, interface changes, etc.)
- Cross-PR graph analysis (connected components, shared callers, function conflicts)
- A single Markdown report with three prioritized sections
Expand Down Expand Up @@ -135,21 +136,21 @@ share the same implementation — prepare via CLI, query via Python works.

**`codegraph pr-review prepare`:**

| Argument | Required | Description |
|----------|----------|-------------|
| `--db` | Yes | Path to the `.codegraph` database directory |
| `--repo` | No | GitHub repository in `owner/repo` format (auto-detected from `git remote`) |
| `--author` | No | Filter PRs by GitHub login |
| `--output` | No | Output directory for reports (default: `./pr_review_output`) |
| `--skip-single-pr` | No | Skip per-PR risk scoring; only cross-PR conflict analysis |
| Argument | Required | Description |
| ------------------ | -------- | -------------------------------------------------------------------------- |
| `--db` | Yes | Path to the `.codegraph` database directory |
| `--repo` | No | GitHub repository in `owner/repo` format (auto-detected from `git remote`) |
| `--author` | No | Filter PRs by GitHub login |
| `--output` | No | Output directory for reports (default: `./pr_review_output`) |
| `--skip-single-pr` | No | Skip per-PR risk scoring; only cross-PR conflict analysis |

**`codegraph pr-review label`:**

| Argument | Required | Description |
|----------|----------|-------------|
| `--db` | Yes | Path to the `.codegraph` database directory |
| `--repo` | No | GitHub repository in `owner/repo` format (auto-detected from `git remote`) |
| `--dry-run` | No | Preview labels and comments without making API calls |
| Argument | Required | Description |
| ----------- | -------- | -------------------------------------------------------------------------- |
| `--db` | Yes | Path to the `.codegraph` database directory |
| `--repo` | No | GitHub repository in `owner/repo` format (auto-detected from `git remote`) |
| `--dry-run` | No | Preview labels and comments without making API calls |

### Report Structure

Expand All @@ -160,6 +161,7 @@ The unified report (`pr_review.md`) has three sections:
3. **Part 3 — Conflicting PR Groups**: PRs sharing code/call paths, must be reviewed as a batch

Each PR entry includes:

- Risk level (CRITICAL/HIGH/MEDIUM/LOW/UNKNOWN) with emoji
- Impact scope (peak blast radius, clickable to call graph)
- Key risk factors
Expand All @@ -173,23 +175,23 @@ For each PR, the script computes signals at two levels.

### File-level signals

| Signal | How it's computed |
|---|---|
| **Changed files** | `gh pr diff --name-only`, filtered to source extensions (.ts/.tsx/.js/.jsx/.py/.java/.c/.cpp/.h/.go, excluding test files) |
| **Module spread** | Set of top-level `packages/xxx` directories touched |
| **Config/schema files** | File name matches common config patterns across languages (config.ts, settings.ts, settingsSchema.ts, types.ts, *.yaml, *.toml, *.cfg, etc.) |
| **Interface/abstract changes** | Diff lines starting with `+` that match `interface Foo` or `abstract class Foo` |
| **Potential dead code** | Functions in changed files that appear in `cs.dead_code()` (fan_in = 0 in graph) |
| Signal | How it's computed |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **Changed files** | `gh pr diff --name-only`, filtered to source extensions (.ts/.tsx/.js/.jsx/.py/.java/.c/.cpp/.h/.go, excluding test files) |
| **Module spread** | Set of top-level `packages/xxx` directories touched |
| **Config/schema files** | File name matches common config patterns across languages (config.ts, settings.ts, settingsSchema.ts, types.ts, _.yaml, _.toml, \*.cfg, etc.) |
| **Interface/abstract changes** | Diff lines starting with `+` that match `interface Foo` or `abstract class Foo` |
| **Potential dead code** | Functions in changed files that appear in `cs.dead_code()` (fan_in = 0 in graph) |

### Function-level signals (per function in changed files)

| Signal | How it's computed |
|---|---|
| **blast_radius** | `fan_in × fan_out` via Cypher CALLS edge counts |
| **call depth** | Fixed 1-hop and 2-hop queries from known entry points (`main`, `run`, `sendMessageStream`, etc.). Returns 1/2 if reachable, -1 if not. Variable-length path queries (`CALLS*1..N`) are intentionally avoided — they are expensive on large graphs. |
| **test coverage** | Graph CALLS from `.test.` files to this function, with filesystem fallback (same-stem `.test.ts` exists) |
| **new vs modified** | `locate_pr(pr_num)` — returns per-file `New Function` / `Hunk Function` / `Deleted Function` sets; functions in `Hunk Function - New Function` are classified as modified, the rest as new |
| **co-change risk** | `cs.co_change(func_name)` — historically co-changed files absent from PR. **Currently disabled** (`co_change_missing` weight = 0.0) |
| Signal | How it's computed |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **blast_radius** | `fan_in × fan_out` via Cypher CALLS edge counts |
| **call depth** | Fixed 1-hop and 2-hop queries from known entry points (`main`, `run`, `sendMessageStream`, etc.). Returns 1/2 if reachable, -1 if not. Variable-length path queries (`CALLS*1..N`) are intentionally avoided — they are expensive on large graphs. |
| **test coverage** | Graph CALLS from `.test.` files to this function, with filesystem fallback (same-stem `.test.ts` exists) |
| **new vs modified** | `locate_pr(pr_num)` — returns per-file `New Function` / `Hunk Function` / `Deleted Function` sets; functions in `Hunk Function - New Function` are classified as modified, the rest as new |
| **co-change risk** | `cs.co_change(func_name)` — historically co-changed files absent from PR. **Currently disabled** (`co_change_missing` weight = 0.0) |

### Per-PR confidence score

Expand All @@ -213,12 +215,12 @@ The PR score is the average per-function score plus file-level bonuses (interfac

### Risk level thresholds

| PR Risk Score | Level |
|---|---|
| ≥ 12 | CRITICAL |
| ≥ 7 | HIGH |
| ≥ 3 | MEDIUM |
| < 3 | LOW |
| PR Risk Score | Level |
| ------------- | -------- |
| ≥ 12 | CRITICAL |
| ≥ 7 | HIGH |
| ≥ 3 | MEDIUM |
| < 3 | LOW |

---

Expand Down Expand Up @@ -308,10 +310,10 @@ with open(OUTPUT_FILE, 'w') as fout:

Cross-PR conflicts are detected at three levels of granularity:

| Level | What it detects | How it's detected |
|-------|----------------|-------------------|
| **File-level overlap** | Two PRs modify the same file | Set intersection of `gh pr diff --name-only` results |
| **Function-level overlap** | Two PRs modify the same function (even different lines) | `CHANGES {info: 'hunk'}` edges to the same `Function` node — this powers the automated connected-components detection |
| Level | What it detects | How it's detected |
| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| **File-level overlap** | Two PRs modify the same file | Set intersection of `gh pr diff --name-only` results |
| **Function-level overlap** | Two PRs modify the same function (even different lines) | `CHANGES {info: 'hunk'}` edges to the same `Function` node — this powers the automated connected-components detection |
| **Dependency chain overlap** | PR A modifies function X, PR B modifies function Y, and Y calls X — git reports no conflict but merging A may break B's assumptions | Cypher: `MATCH (pr1:PR)-[c1:CHANGES]->(f:Function)-[:CALLS]->(g:Function)<-[c2:CHANGES]-(pr2:PR)` — see usecase3 (manual) queries below |

### When to Use
Expand Down Expand Up @@ -358,11 +360,11 @@ cross = CrossPRAnalyzer(cs, repo_dir=REPO_DIR)
rows1, rows2, components = cross.analyze_all(out_dir='/tmp')
```

| Usecase | What it finds | When to use |
|---------|--------------|-------------|
| **usecase1** PR → hunk functions | All functions directly modified by each PR; rendered as vis-network HTML | Quick inventory |
| **usecase2** hunk + fan-in callers | Who calls each modified function (1-hop upstream); rendered as 2-hop vis-network HTML | Blast-radius exposure per PR |
| **usecase3** Connected Components (DSU) | Groups of PRs linked by modifying or deleting the same function | Identifies conflicting PR groups requiring coordinated review |
| Usecase | What it finds | When to use |
| --------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| **usecase1** PR → hunk functions | All functions directly modified by each PR; rendered as vis-network HTML | Quick inventory |
| **usecase2** hunk + fan-in callers | Who calls each modified function (1-hop upstream); rendered as 2-hop vis-network HTML | Blast-radius exposure per PR |
| **usecase3** Connected Components (DSU) | Groups of PRs linked by modifying or deleting the same function | Identifies conflicting PR groups requiring coordinated review |

### Cypher Queries

Expand Down Expand Up @@ -404,15 +406,14 @@ RETURN pr1.id, pr2.id;

### Interpreting usecase3 Results

| Connected Component Size | Meaning | Recommended action |
|--------------------------|---------|-------------------|
| Size 1 (singleton) | PR has no cross-PR dependencies | Can be reviewed and merged independently |
| Size > 1 | PRs in the same component share code or call paths | Review as a batch; see `pr_review.py` Part 3 report |
| Connected Component Size | Meaning | Recommended action |
| ------------------------ | -------------------------------------------------- | --------------------------------------------------- |
| Size 1 (singleton) | PR has no cross-PR dependencies | Can be reviewed and merged independently |
| Size > 1 | PRs in the same component share code or call paths | Review as a batch; see `pr_review.py` Part 3 report |

---

## Index location

- Index directory: `.codegraph/` (repo root, add to `.gitignore`)
- Default output: `/tmp/pr_analysis.txt` (configurable)

Loading
Loading