Skip to content

Commit c9ffc2d

Browse files
authored
feat: Implement LLM Triage & Smart Routing System (#24)
* feat: Complete previous development session with details on the implemented transfer rules engine and start a new development session. * feat(config): add LLM routing configuration and pipeline result extensions - Add Description field to RepositoryConfig for LLM routing - Add LLMRoutingEnabled, HighConfidence, MediumConfidence to TransferConfig - Extend pipeline Result struct with quality, transfer, and duplicate fields - Set default confidence thresholds (0.9 high, 0.6 medium) * feat(gemini): add LLM methods for routing, quality, and duplicate detection - Add RouteIssue() method for repository routing with confidence scores - Add AssessQuality() method for issue quality assessment (0.0-1.0 scale) - Add DetectDuplicate() method for semantic duplicate detection - Add corresponding prompt builders with JSON-structured outputs - Define data structures: RouterResult, QualityResult, DuplicateResult * feat(steps): add three new pipeline steps for intelligent triage - Add llm_router step for LLM-based repository routing - Confidence-based actions: auto-transfer (≥0.9), suggest (0.6-0.9), silent (<0.6) - Graceful degradation when LLM unavailable - Add quality_checker step for issue quality assessment - Evaluates completeness and clarity - Provides actionable suggestions - Add duplicate_detector step for semantic duplicate detection - Analyzes top 3 similar issues - High-confidence threshold (≥0.8) * feat(steps): rewrite response builder for comprehensive triage summaries BREAKING CHANGE: Response builder now ALWAYS posts triage summaries - Remove early return logic - post summary on every issue - Add quality assessment section with score and suggestions - Add labels applied section - Add transfer suggestion section with confidence display - Add similar issues section with similarity percentages - Add duplicate warning section with reasoning - Format as structured markdown with visual indicators (✅, ⚠️, 🔄) * refactor(steps): simplify triage step to focus on label suggestion - Remove quality assessment logic (moved to quality_checker step) - Focus solely on label suggestion using LLM - Update error handling for graceful degradation * feat(pipeline): integrate new steps into issue-triage workflow - Register llm_router, quality_checker, duplicate_detector steps - Update issue-triage preset workflow order: gatekeeper → vectordb_prep → llm_router → transfer_check → similarity_search → duplicate_detector → quality_checker → triage → response_builder → action_executor → pending_action_scheduler → indexer * fix: address Copilot code review feedback - Replace deprecated strings.Title with custom capitalizeFirst function - Make duplicate confidence threshold configurable via TransferConfig - Change 'Labels Applied' to 'Suggested Labels' for accuracy - Add DuplicateConfidenceThreshold field with 0.8 default
1 parent 53abf8b commit c9ffc2d

14 files changed

Lines changed: 1211 additions & 82 deletions

File tree

.claude/sessions/.current-session

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2026-02-04-0000.md
1+
2026-02-04-1204.md

.claude/sessions/2026-02-04-0000.md

Lines changed: 342 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,352 @@
22

33
## Session Overview
44
- **Start Time**: 2026-02-04 00:00
5-
- **Status**: Active
5+
- **End Time**: 2026-02-04 (session completed)
6+
- **Status**: Completed
7+
- **Duration**: ~2-3 hours
68

79
## Goals
8-
- Develop and implement new features for simili-bot
10+
- Implement Transfer Rules Engine for cross-repository issue routing (Issue #15)
911

10-
## Progress
12+
---
1113

12-
### Tasks Completed
13-
- Session started
14+
## Git Summary
1415

15-
### Current Work
16-
- Ready to begin feature development
16+
### Statistics
17+
- **Total Files Changed**: 12 files
18+
- **Lines Added**: +829
19+
- **Lines Deleted**: -29
20+
- **Commits Made**: 2 commits
1721

18-
### Notes
19-
-
22+
### Changed Files
23+
```
24+
Modified (9 files):
25+
- internal/core/config/config.go
26+
- internal/core/pipeline/registry.go
27+
- internal/integrations/github/auth.go
28+
- internal/integrations/github/client.go
29+
- internal/integrations/github/client_test.go
30+
- internal/steps/action_executor.go
31+
- internal/steps/similarity.go
32+
- internal/steps/transfer_check.go
33+
34+
New Files (4 files):
35+
- internal/integrations/github/graphql.go
36+
- internal/transfer/matcher.go
37+
- internal/transfer/matcher_test.go
38+
- internal/transfer/types.go
39+
```
40+
41+
### Commits
42+
1. `269757b` - fix: address code review feedback
43+
2. `53abf8b` - feat: Implement Transfer Rules Engine for Cross-Repository Issue Routing (#22)
44+
45+
### Final Git Status
46+
- Branch: `feature/repo-tranfer-010`
47+
- Status: Clean (all changes committed and pushed)
48+
- PR: #22 (ready for review)
49+
50+
---
51+
52+
## Key Accomplishments
53+
54+
### 1. Complete Transfer Rules Engine Implementation
55+
Implemented a comprehensive rule-based transfer routing system that enables automated cross-repository issue transfers based on configurable conditions.
56+
57+
### 2. Configuration System
58+
- Added `TransferRule` struct with support for:
59+
- `labels` (ALL must match - AND logic)
60+
- `labels_any` (ANY must match - OR logic)
61+
- `title_contains` (case-insensitive substring matching)
62+
- `body_contains` (case-insensitive substring matching)
63+
- `author` (exact match, case-insensitive)
64+
- `priority` (for rule ordering)
65+
- `enabled` (per-rule toggle)
66+
- Added `TransferConfig` struct with global enable/disable
67+
- Implemented proper config merging to allow child configs to override parent settings
68+
69+
### 3. Rule Matching Engine (`internal/transfer/`)
70+
- Created `RuleMatcher` with priority-based evaluation (higher priority rules evaluated first)
71+
- All condition matching is case-insensitive
72+
- AND logic between different condition types
73+
- OR logic within condition arrays (labels_any, title_contains, body_contains, author)
74+
- Comprehensive test coverage: 12 unit tests covering all scenarios
75+
76+
### 4. GitHub GraphQL Integration
77+
- Implemented full GraphQL client (`internal/integrations/github/graphql.go`)
78+
- Added `GetIssueNodeID()` - fetches GraphQL node ID for issues
79+
- Added `GetRepositoryNodeID()` - fetches GraphQL node ID for repositories
80+
- Added `TransferIssue()` mutation - performs actual issue transfer
81+
- Returns new issue URL after successful transfer
82+
- Proper error handling with truncated error messages (security fix)
83+
84+
### 5. Pipeline Integration
85+
- Moved `transfer_check` step BEFORE `similarity_search` (critical for performance)
86+
- Added `skip_duplicate_detection` metadata flag to prevent unnecessary VDB searches
87+
- Updated `similarity_search` to respect skip flag
88+
- Updated `action_executor` to handle new TransferIssue signature
89+
90+
### 6. Code Review Fixes
91+
Addressed all GitHub Copilot code review feedback:
92+
- Added whitespace trimming for targetRepo validation
93+
- Truncated error response bodies to prevent sensitive data leaks (200 char limit)
94+
- Added empty URL validation after transfer completion
95+
- Fixed Transfer config merge logic to allow child configs to disable parent's enabled transfer
96+
97+
---
98+
99+
## Features Implemented
100+
101+
### Core Features
102+
1. **Rule-Based Transfer Routing**
103+
- Priority-ordered rule evaluation
104+
- Multiple condition types with flexible matching
105+
- Enable/disable per rule or globally
106+
107+
2. **GitHub GraphQL API Integration**
108+
- Issue transfer mutation
109+
- Node ID resolution for issues and repositories
110+
- Authenticated operations
111+
112+
3. **Pipeline Optimization**
113+
- Transfer detection before duplicate search
114+
- Metadata-based step coordination
115+
- Logging for transparency
116+
117+
### Configuration Example
118+
```yaml
119+
transfer:
120+
enabled: true
121+
rules:
122+
- name: "critical-security-bugs"
123+
priority: 100
124+
target: "org/security-repo"
125+
labels: ["security", "critical"]
126+
127+
- name: "documentation-issues"
128+
priority: 50
129+
target: "org/docs-repo"
130+
labels_any: ["docs", "documentation"]
131+
```
132+
133+
---
134+
135+
## Problems Encountered & Solutions
136+
137+
### Problem 1: Go Not Installed
138+
**Issue**: New laptop didn't have Go installed, build failed.
139+
**Solution**: Installed Go 1.25.6 via Homebrew: `brew install go`
140+
141+
### Problem 2: TransferIssue Signature Mismatch
142+
**Issue**: Changed TransferIssue to return `(string, error)` but callers expected `error` only.
143+
**Solution**: Updated `action_executor.go` to capture new URL return value and log it.
144+
145+
### Problem 3: Test Failures After Signature Change
146+
**Issue**: `client_test.go` expected old signature.
147+
**Solution**: Updated test to use `_, err :=` pattern and adjusted expected error messages.
148+
149+
### Problem 4: GitHub Copilot Review Findings
150+
**Issue**: Four code quality issues identified:
151+
1. No whitespace trimming on input
152+
2. Potential sensitive data leak in error messages
153+
3. Missing empty URL validation
154+
4. Config merge logic prevented disabling parent's enabled transfer
155+
156+
**Solution**: Fixed all issues in separate commit with proper validation and truncation.
157+
158+
---
159+
160+
## Dependencies
161+
162+
### Added
163+
- None (used existing dependencies)
164+
165+
### Existing Dependencies Used
166+
- `github.com/google/go-github/v60/github` - REST API
167+
- Native `net/http` - GraphQL client
168+
- `encoding/json` - GraphQL request/response handling
169+
- `gopkg.in/yaml.v3` - Config parsing
170+
171+
---
172+
173+
## Configuration Changes
174+
175+
### New Config Fields
176+
```go
177+
type Config struct {
178+
// ... existing fields
179+
Transfer TransferConfig `yaml:"transfer,omitempty"`
180+
}
181+
182+
type TransferConfig struct {
183+
Enabled bool `yaml:"enabled"`
184+
Rules []TransferRule `yaml:"rules,omitempty"`
185+
}
186+
187+
type TransferRule struct {
188+
Name string `yaml:"name"`
189+
Priority int `yaml:"priority,omitempty"`
190+
Target string `yaml:"target"`
191+
Labels []string `yaml:"labels,omitempty"`
192+
LabelsAny []string `yaml:"labels_any,omitempty"`
193+
TitleContains []string `yaml:"title_contains,omitempty"`
194+
BodyContains []string `yaml:"body_contains,omitempty"`
195+
Author []string `yaml:"author,omitempty"`
196+
Enabled *bool `yaml:"enabled,omitempty"`
197+
}
198+
```
199+
200+
### Pipeline Changes
201+
```go
202+
// Old order:
203+
"similarity_search", "transfer_check"
204+
205+
// New order (critical change):
206+
"transfer_check", "similarity_search"
207+
```
208+
209+
---
210+
211+
## Testing
212+
213+
### Test Coverage
214+
- **Transfer Package**: 12/12 tests passing
215+
- Rule filtering (enabled/disabled)
216+
- Priority sorting
217+
- Label matching (ALL and ANY)
218+
- Title/body substring matching
219+
- Author matching
220+
- Multiple condition combinations
221+
- Empty conditions (catch-all rules)
222+
223+
- **Integration Tests**: All passing
224+
- **Build**: Successful with no errors
225+
226+
### Test Commands Used
227+
```bash
228+
go test ./internal/transfer/... -v
229+
go test ./...
230+
go build ./...
231+
```
232+
233+
---
234+
235+
## Deployment/Release
236+
237+
### PR Created
238+
- **PR #22**: "feat: Implement Transfer Rules Engine for Cross-Repository Issue Routing"
239+
- **Status**: Ready for review (marked as ready, not draft)
240+
- **Commits**: 2 (main implementation + code review fixes)
241+
- **Checks**: CI/CD running (Build & Test, Lint, Vet)
242+
243+
### Issue Created
244+
- **Issue #23**: "Hybrid Transfer Routing: Combine Rule-Based + VDB Semantic Matching"
245+
- **Milestone**: 0.2.0v
246+
- **Type**: Future enhancement proposal
247+
- **Details**: Comprehensive design for hybrid approach combining rules + VDB semantic search
248+
249+
---
250+
251+
## Lessons Learned
252+
253+
### Technical Insights
254+
1. **GraphQL vs REST**: GitHub's REST API doesn't support issue transfers; GraphQL is required
255+
2. **Node IDs**: GraphQL operations require node IDs, not numeric IDs (requires 2 queries before mutation)
256+
3. **Config Merging**: Boolean fields need special handling to allow explicit false values
257+
4. **Error Truncation**: Full API error responses can leak sensitive data in logs
258+
259+
### Design Decisions
260+
1. **Rule-First Approach**: Start with deterministic rules, add VDB later (hybrid approach for v0.2.0)
261+
2. **Pipeline Ordering**: Transfer check MUST run before similarity search for performance
262+
3. **Metadata Communication**: Use `ctx.Metadata` for step coordination (skip flags, reasoning)
263+
4. **Case-Insensitive Matching**: All rule matching uses `strings.ToLower()` for UX
264+
265+
### Best Practices
266+
1. Always trim whitespace on user input
267+
2. Truncate error messages to prevent data leaks
268+
3. Validate output (e.g., empty URL check)
269+
4. Write comprehensive tests before implementation
270+
5. Address code review feedback in separate, focused commits
271+
272+
---
273+
274+
## What Wasn't Completed
275+
276+
### Deferred to Future Versions
277+
1. **VDB Semantic Router** (Issue #23, v0.2.0)
278+
- Search similar issues across repos
279+
- Analyze distribution for confidence scoring
280+
- LLM-based transfer justification for transparency
281+
282+
2. **Manual Approval Flow**
283+
- Optional approval step before transfer execution
284+
- Useful for high-risk transfers
285+
286+
3. **Transfer History/Analytics**
287+
- Track transfer success rates
288+
- Identify misconfigured rules
289+
290+
4. **Rule Testing CLI**
291+
- Test rules against historical issues
292+
- Validate rule effectiveness before deployment
293+
294+
---
295+
296+
## Tips for Future Developers
297+
298+
### Understanding the Architecture
299+
```
300+
Config → RuleMatcher → Context.TransferTarget → ActionExecutor → GraphQL Transfer
301+
```
302+
303+
### Key Files to Review
304+
1. `internal/transfer/matcher.go` - Core rule evaluation logic
305+
2. `internal/integrations/github/graphql.go` - GitHub API integration
306+
3. `internal/steps/transfer_check.go` - Pipeline integration
307+
4. `internal/core/config/config.go` - Configuration schema
308+
309+
### Testing Transfer Rules
310+
```yaml
311+
# Test config for local development
312+
transfer:
313+
enabled: true
314+
rules:
315+
- name: "test-rule"
316+
priority: 100
317+
target: "your-org/test-repo"
318+
labels: ["test"]
319+
enabled: true
320+
```
321+
322+
### Debugging Tips
323+
1. Check logs for `[transfer_check]` entries
324+
2. Verify `ctx.Metadata["skip_duplicate_detection"]` is set when transfer detected
325+
3. Use dry-run mode to test without actual transfers
326+
4. GraphQL errors often require checking GitHub permissions
327+
328+
### Common Pitfalls
329+
1. **Forgetting to trim whitespace**: Always `strings.TrimSpace()` on config values
330+
2. **Wrong pipeline order**: `transfer_check` MUST be before `similarity_search`
331+
3. **Missing GraphQL client**: Requires authentication token in environment
332+
4. **Node ID confusion**: GitHub has both numeric IDs and GraphQL node IDs
333+
334+
### Future Enhancement Ideas
335+
- Add regex support for title/body matching
336+
- Support negative conditions ("NOT contains")
337+
- Add dry-run flag per rule for testing
338+
- Implement transfer webhooks/notifications
339+
- Add transfer rollback capability
340+
341+
---
342+
343+
## Related Issues & PRs
344+
- Issue #15: Initial transfer logic requirements
345+
- PR #22: This implementation (merged)
346+
- Issue #23: Future hybrid approach with VDB routing
347+
348+
## Notes
349+
- All code follows existing project style and patterns
350+
- Comprehensive documentation in code comments
351+
- Test coverage ensures reliability
352+
- Security considerations addressed (input validation, data leak prevention)
20353

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Development Session - 2026-02-04 12:04
2+
3+
## Session Overview
4+
**Start Time:** 2026-02-04 12:04
5+
**Status:** Active
6+
7+
## Goals
8+
- New feature development
9+
10+
## Progress
11+
12+
### Current Work
13+
14+
15+
### Completed
16+
17+
18+
### Notes
19+

0 commit comments

Comments
 (0)