feat(autopilot): PR Dependency Graph Resolver with tier labelling#185
Conversation
🤖 DRC Agent AnalysisRecommendation: 🟠 P1 IMPORTANT Summary: Hybrid Regex-LLM DAG Engine with Tier Labelling (Dreamer ID 3, Realist recommended) Next steps:
Strategic fit: Consulting: high · Product: high · Tech debt: reduces Analysed by GadgetLab DRC Agent (Dreamer → Realist → Critic) · Run |
…yser
- Update PR template with mandatory 'Depends on' field
- Add networkx>=3.0 to requirements.txt
- Add autopilot/dependency_graph.py with:
- Regex pre-pass for 'Depends on #X' patterns
- LLM (claude-haiku) extraction with structured JSON schema
- NetworkX DAG + topological sort
- Tier labels: tier-0-blocker, tier-1-dependent, tier-2-leaf
- Targets 3 active repos (autonomous-github-agent, ai-automation-engine,
github-multi-agent-system)
- Dry-run by default; live mode via ENABLE_LIVE_MODE=true
- CLI entry point
- Add tests/unit/test_dependency_graph.py (46 tests, all passing)
Closes #183
🤖 DRC Agent AnalysisRecommendation: 🟠 P1 IMPORTANT Summary: BugHunterAgent as Self-Validating Claude Tool-Use Loop (Dreamer ID 2) - recommended by REALIST as primary implementation path Next steps:
Strategic fit: Consulting: high · Product: high · Tech debt: neutral Analysed by GadgetLab DRC Agent (Dreamer → Realist → Critic) · Run |
📊 Code Complexity AnalysisSummary:
|
| File | Function | Complexity | Line |
|---|---|---|---|
core/risk_scorer.py |
score_pull_request |
35 | 141 |
autopilot/autopilot.py |
generate_summary |
24 | 195 |
autopilot/staleness_engine.py |
process_stale_prs |
16 | 281 |
autopilot/ai_optimization/performance_monitor.py |
get_benchmark_stats |
15 | 184 |
.github/scripts/weekly_digest.py |
build_blocks |
15 | 38 |
.github/scripts/metrics_collector.py |
parse_workflow_metrics |
14 | 148 |
.github/scripts/setup_branch_protection.py |
main |
14 | 240 |
.github/scripts/self_healing_system.py |
analyze_failure_patterns |
14 | 256 |
.github/scripts/ai_code_suggestor.py |
_check_import_organization |
14 | 113 |
.github/scripts/prometheus_exporter.py |
collect_metrics |
14 | 99 |
... and 16 more
Recommendations:
- Break down large functions into smaller, focused units
- Extract complex conditional logic into separate functions
- Use early returns to reduce nesting
🔧 Low Maintainability Files
These files have low maintainability scores and may need refactoring:
| File | Score | Status |
|---|---|---|
.github/scripts/health_dashboard_generator.py |
28.14 | 🔴 |
.github/scripts/workflow_monitor.py |
33.73 | 🔴 |
.github/scripts/ai_code_suggestor.py |
33.76 | 🔴 |
.github/scripts/ai_workflow_optimizer.py |
35.51 | 🔴 |
.github/scripts/performance_benchmark.py |
39.46 | 🔴 |
.github/scripts/self_healing_system.py |
40.27 | 🔴 |
.github/scripts/threshold_monitor.py |
41.13 | 🔴 |
.github/scripts/parallel_code_analyzer_optimized.py |
41.16 | 🔴 |
autopilot/autopilot.py |
42.45 | 🔴 |
autopilot/ai_optimization/anomaly_detector.py |
42.56 | 🔴 |
agents/triage_agent.py |
42.79 | 🔴 |
.github/scripts/refactoring_assistant.py |
43.03 | 🔴 |
autopilot/ai_optimization/intelligent_cache.py |
43.28 | 🔴 |
autopilot/ai_optimization/commit_summarizer.py |
44.05 | 🔴 |
.github/scripts/async_parallel_analyzer.py |
44.47 | 🔴 |
autopilot/ai_optimization/performance_monitor.py |
44.69 | 🔴 |
.github/scripts/badge_generator.py |
45.28 | 🔴 |
.github/scripts/copilot_integration.py |
45.37 | 🔴 |
.github/scripts/distributed_monitoring.py |
45.53 | 🔴 |
.github/scripts/elite_copilot.py |
45.69 | 🔴 |
autopilot/dependency_graph.py |
45.74 | 🔴 |
agents/dependency_agent.py |
45.76 | 🔴 |
.github/scripts/issue_auto_creator.py |
46.39 | 🔴 |
.github/scripts/cost_calculator.py |
46.4 | 🔴 |
.github/scripts/inline_pr_commenter.py |
46.63 | 🔴 |
.github/scripts/complexity_reporter.py |
46.78 | 🔴 |
.github/scripts/pr_triage.py |
47.13 | 🔴 |
core/risk_scorer.py |
48.15 | 🔴 |
autopilot/ai_optimization/nlp_relevance_filter.py |
48.43 | 🔴 |
.github/scripts/pr_inline_commenter.py |
48.47 | 🔴 |
autopilot/staleness_engine.py |
48.73 | 🔴 |
.github/scripts/metrics_collector.py |
48.91 | 🔴 |
.github/scripts/dependency_updater.py |
48.91 | 🔴 |
autopilot/ai_optimization/ml_priority_scorer.py |
49.53 | 🔴 |
.github/scripts/changelog_generator.py |
49.75 | 🔴 |
.github/scripts/parallel_code_analyzer.py |
49.96 | 🔴 |
autopilot/ai_optimization/api_optimizer.py |
50.46 | 🟡 |
agents/security_scan_agent.py |
51.04 | 🟡 |
.github/scripts/workflow_optimizer.py |
51.67 | 🟡 |
.github/scripts/cot_selector.py |
51.73 | 🟡 |
.github/scripts/release_manager.py |
51.92 | 🟡 |
.github/scripts/llm_router.py |
52.35 | 🟡 |
.github/scripts/auto_pr.py |
52.72 | 🟡 |
.github/scripts/notification_manager.py |
53.58 | 🟡 |
.github/scripts/prometheus_exporter.py |
54.96 | 🟡 |
.github/scripts/weekly_digest.py |
55.02 | 🟡 |
core/audit_logger.py |
55.6 | 🟡 |
.github/scripts/gather_context.py |
56.0 | 🟡 |
core/llm_provider.py |
56.32 | 🟡 |
.github/scripts/streaming_results.py |
56.64 | 🟡 |
.github/scripts/setup_branch_protection.py |
57.0 | 🟡 |
.github/scripts/optimized_github_client.py |
58.27 | 🟡 |
agents/orchestrator_agent.py |
59.02 | 🟡 |
agents/code_review_agent.py |
60.45 | 🟡 |
core/github_client.py |
61.96 | 🟡 |
core/message_queue.py |
63.22 | 🟡 |
core/agent_config.py |
63.86 | 🟡 |
core/idempotency.py |
64.45 | 🟡 |
Maintainability Index Guide:
- 🟢 85-100: Excellent maintainability
- 🟡 65-84: Good maintainability
- 🟠 50-64: Moderate maintainability (consider refactoring)
- 🔴 0-49: Poor maintainability (needs refactoring)
🟡 Risk Assessment: MEDIUM (3.2/10)Analysed 5 files, 1216+ / 0− lines. Security-sensitive paths detected. Test coverage unchanged or improved. Scoring breakdown
|
🔍 Pre-commit Checks🔧 Pre-commit issues were automatically fixed and committed. Please pull the latest changes before pushing again: git pull origin copilot/fix-import-errors-bughunteragent-againPre-commit hooks help maintain code quality and consistency. |
🤖 Elite AI Copilot AnalysisElite AI Copilot Analysis ReportGenerated: 2026-07-04 06:45:11 🎯 Health Score: 100.0/100🚀 Top Recommendations
📊 Detailed InsightsCode Quality Baseline Established
Security Scan Initiated
Repository Structure Analyzed
Performance Baseline Captured
Documentation Structure Good
Powered by Elite AI Copilot v1.0 |
Code Quality Analysis ❌ FAILEDDuration: 0.01s Tool Results
View detailed results{
"timestamp": "2026-07-04 06:45:11",
"elapsed_seconds": 0.01,
"summary": {
"total_issues": 10,
"critical": 0,
"high": 0,
"medium": 0,
"low": 0
},
"tools": {
"pylint": {
"status": "failed",
"output": "",
"errors": "Pylint error: [Errno 2] No such file or directory: 'pylint'"
},
"flake8": {
"status": "failed",
"output": "",
"errors": "Flake8 error: [Errno 2] No such file or directory: 'flake8'"
},
"bandit": {
"status": "failed",
"output": "",
"errors": "Bandit error: [Errno 2] No such file or directory: 'bandit'"
},
"radon_cc": {
"status": "failed",
"output": "",
"errors": "Radon error: [Errno 2] No such file or directory: 'radon'"
},
"radon_mi": {
"status": "failed",
"output": "",
"errors": "Radon MI error: [Errno 2] No such file or directory: 'radon'"
}
},
"passed": false
} |
🔒 Security Scan Results🛡️ Bandit Security Scan
📦 Dependency Vulnerabilities
Vulnerable Dependencies:
Security scans run automatically on every PR. View detailed reports in the Actions tab. |
🤖 DRC Agent AnalysisRecommendation: 🟠 P1 IMPORTANT Summary: BugHunterAgent as Lightweight Import-Error Sentinel (Dreamer ID 3, Realist Recommended Solution) Next steps:
Strategic fit: Consulting: medium · Product: high · Tech debt: reduces Analysed by GadgetLab DRC Agent (Dreamer → Realist → Critic) · Run |
There was a problem hiding this comment.
Pull request overview
Adds an Autopilot “PR Dependency Graph Resolver” that scans open PR bodies across the three active repos, extracts dependency references (regex with optional LLM fallback), builds a NetworkX DAG, and applies tier labels to PRs (dry-run by default, live mode opt-in).
Changes:
- Introduces
autopilot/dependency_graph.pyimplementing dependency extraction, DAG construction, tier assignment, and GitHub label application. - Adds a “Dependencies” section to the PR template intended to provide structured dependency hints.
- Adds
networkx>=3.0and a comprehensive unit test suite for the resolver.
Reviewed changes
Copilot reviewed 3 out of 5 changed files in this pull request and generated 7 comments.
| File | Description |
|---|---|
.github/PULL_REQUEST_TEMPLATE.md |
Adds a Dependencies section intended to feed the resolver’s regex extraction. |
autopilot/dependency_graph.py |
New resolver engine: scanning, extraction, DAG build, tiering, and label application. |
requirements.txt |
Adds NetworkX dependency needed for DAG operations. |
tests/unit/test_dependency_graph.py |
Adds unit tests for regex/LLM extraction, DAG logic, tiering, label application, and cycle breaking. |
| ## Dependencies | ||
| <!-- List any PRs this PR depends on using the syntax below. | ||
| The dependency graph resolver reads this field automatically. --> | ||
| Depends on: <!-- e.g. Depends on #123, Depends on owner/repo#456 --> |
| # Find the dep's repo (assume same repo if not qualified) | ||
| dep_node = next((n for n in nodes if n.pr_id == dep_id), None) | ||
| dep_repo = dep_node.repo if dep_node else node.repo | ||
| dep_key = f"{dep_repo}#{dep_id}" | ||
| dag.add_edge(key, dep_key) |
| { | ||
| "llm_provider": "anthropic", | ||
| "anthropic_api_key": self._anthropic_api_key, | ||
| "model": _HAIKU_MODEL, | ||
| "llm_max_cost_usd": 5.0, | ||
| } |
| assert attrs["url"] == "http://x/7" | ||
|
|
||
| def test_llm_called_when_no_regex_match(self): | ||
| from autopilot.dependency_graph import extract_deps_llm |
|
|
||
| class TestApplyLabelsDryRun: | ||
| def test_dry_run_no_api_calls(self): | ||
| from autopilot.dependency_graph import TIER_LABELS |
| assert "llm_calls_used" in summary | ||
|
|
||
| def test_run_counts_match(self): | ||
| from autopilot.dependency_graph import ACTIVE_REPOS |
| _DEPENDS_ON_LOCAL_RE = re.compile(r"depends[\s_-]+on\s+#(\d+)", re.IGNORECASE) | ||
| _DEPENDS_ON_QUALIFIED_RE = re.compile( | ||
| r"depends[\s_-]+on\s+[\w.\-]+/[\w.\-]+#(\d+)", re.IGNORECASE | ||
| ) |
DRC agent recommended building a dependency chain resolver to surface PR blocking relationships across the three active repos. This adds
autopilot/dependency_graph.pyimplementing the full pipeline.Changes
.github/PULL_REQUEST_TEMPLATE.mdDepends on #X/Depends on owner/repo#Xsyntax — the structured input the resolver readsautopilot/dependency_graph.pyDepends on #Xpatterns (case-insensitive, hyphen/underscore variants) at zero API cost; LLM only called when regex finds nothingclaude-3-5-haiku-20241022with enforced JSON schema:{pr_id, repo, depends_on[], confidence_score}; skipped ifconfidence_score < 0.5A → B= "A depends on B"; two-pass build (nodes first, then edges); cycle detection + breakingtier-0-blocker— has in-edges (others depend on it)tier-1-dependent— has out-edges only (depends on others)tier-2-leaf— isolated (no edges)ENABLE_LIVE_MODE=trueto write;max_llm_callsbudget capautonomous-github-agent,ai-automation-engine,github-multi-agent-systempython autopilot/dependency_graph.py [--live] [--max-llm-calls N] [--no-llm]requirements.txtnetworkx>=3.0tests/unit/test_dependency_graph.pyrun()orchestration