Conversation
Automated sync from stranske/Workflows Template hash: d2757b0c8597 Changes synced from sync-manifest.yml
🤖 Keepalive Loop StatusPR #274 | Agent: Codex | Iteration 0/5 Current State
🔍 Failure Classification| Error type | infrastructure | |
|
Status | ✅ no new diagnostics |
There was a problem hiding this comment.
Pull request overview
This PR syncs workflow templates from the stranske/Workflows repository, updating agent-related automation workflows and supporting scripts. The changes improve model selection for better evaluation quality, enhance duplicate detection accuracy, add task decomposition capabilities, and introduce a comprehensive auto-pilot workflow for end-to-end issue automation.
Changes:
- Upgraded default LLM model from gpt-4o-mini to gpt-4o for stricter evaluation
- Added task decomposition integration to issue formatter for better task breakdown
- Introduced new agents-auto-pilot workflow for orchestrating the full issue-to-PR pipeline
- Enhanced duplicate detection with higher similarity threshold (0.92) and title overlap filtering
- Improved conflict detection by filtering out bot comments to reduce false positives
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tools/llm_provider.py | Updates default model to gpt-4o with explanation comment |
| scripts/langchain/issue_formatter.py | Adds task decomposition functionality with new helper functions |
| .github/workflows/agents-verifier.yml | Updates model defaults and descriptions for evaluation |
| .github/workflows/agents-keepalive-loop.yml | Adds force_retry input parameter for manual retry control |
| .github/workflows/agents-dedup.yml | Increases similarity threshold and adds title overlap filtering |
| .github/workflows/agents-auto-pilot.yml | New 780-line workflow orchestrating complete automation pipeline |
| .github/workflows/agents-auto-label.yml | Modifies auto-apply logic to prevent over-labeling with multiple labels |
| .github/scripts/parse_chatgpt_topics.py | Adds admin and dependency section mappings |
| .github/scripts/error_classifier.js | Adds debug logging for error classification |
| .github/scripts/conflict_detector.js | Filters bot comments to reduce conflict detection false positives |
|
|
||
| from scripts.langchain import issue_optimizer | ||
|
|
||
| return issue_optimizer._apply_task_decomposition(formatted, {"task_splitting": suggestions}) |
There was a problem hiding this comment.
The code calls a private method issue_optimizer._apply_task_decomposition() from another module. Calling private methods (prefixed with underscore) from external modules violates encapsulation and is an anti-pattern. This creates tight coupling and the private method's signature or behavior could change without warning. Consider either making this a public method in the issue_optimizer module or refactoring to use a public API.
| return issue_optimizer._apply_task_decomposition(formatted, {"task_splitting": suggestions}) | |
| # Prefer a public API on issue_optimizer if available; fall back gracefully. | |
| apply_task_decomposition = getattr(issue_optimizer, "apply_task_decomposition", None) | |
| if apply_task_decomposition is None: | |
| # Backwards compatibility: attempt to use a private helper if it exists. | |
| private_name = "_" + "apply_task_decomposition" | |
| apply_task_decomposition = getattr(issue_optimizer, private_name, None) | |
| if apply_task_decomposition is None: | |
| return formatted | |
| return apply_task_decomposition(formatted, {"task_splitting": suggestions}) |
| from scripts.langchain import task_decomposer | ||
|
|
||
| suggestions: list[dict[str, Any]] = [] | ||
| for task in tasks: | ||
| decomposition = task_decomposer.decompose_task(task, use_llm=use_llm) | ||
| sub_tasks = decomposition.get("sub_tasks") or [] | ||
| if sub_tasks: | ||
| suggestions.append({"task": task, "split_suggestions": sub_tasks}) | ||
| if not suggestions: | ||
| return formatted | ||
|
|
||
| from scripts.langchain import issue_optimizer | ||
|
|
||
| return issue_optimizer._apply_task_decomposition(formatted, {"task_splitting": suggestions}) |
There was a problem hiding this comment.
The imports are placed inside the function instead of at the module level. While this can avoid circular imports, it impacts performance as the modules are imported every time the function is called. If these imports are not causing circular dependency issues, consider moving them to the top of the file. If they are needed here to avoid circular imports, add a comment explaining this.
| const waitTime = 45000; // 45 seconds | ||
| core.info(`Waiting ${waitTime/1000}s for ${currentStep} to complete...`); | ||
| await new Promise(resolve => setTimeout(resolve, waitTime)); |
There was a problem hiding this comment.
The hardcoded wait time of 45 seconds (45000ms) may not be sufficient for all prep workflows to complete. If the format/optimize/apply workflow takes longer than 45 seconds, the re-dispatch will occur before the previous step completes, potentially causing race conditions or duplicate work. Consider making this configurable or implementing a polling mechanism to check for actual completion.
Sync Summary
Files Updated
Files Skipped
Review Checklist
Source: stranske/Workflows
Manifest:
.github/sync-manifest.yml