Restore research as first-class tool, remove research skill

Restores the research tool that was previously externalized as a skill:

- Add pending_research.rs: PendingResearchManager with thread-safe task tracking
- Add tools/research.rs: execute_research (async), execute_research_status
- Add research/research_status tool definitions with exclude_research config
- Integrate PendingResearchManager into Agent and ToolContext
- Inject completed research results in streaming loop

Remove research skill:
- Clear EMBEDDED_SKILLS array in embedded.rs
- Delete skills/research/ directory
- Update all tests expecting embedded research skill
- Update docs and memory to reflect the change

The research tool now:
- Spawns scout agent in background tokio task
- Returns immediately with research_id
- Automatically injects results into conversation when ready
- Supports status checks via research_status tool
This commit is contained in:
Dhanji R. Prasanna
2026-02-06 07:38:06 +11:00
parent b673827076
commit ff15db44c0
17 changed files with 1240 additions and 285 deletions

View File

@@ -1,8 +1,12 @@
# Breaker Report: 2025-02-05
> **Note**: Issue 1 below is now obsolete. The research skill was removed and replaced
> with a first-class `research` tool in `crates/g3-core/src/tools/research.rs`.
> The g3-research script no longer exists.
Focused on changes in commits b6d2582..9443f933 (past 10 commits).
## Issue 1: JSON Escaping Bug in g3-research Script
## Issue 1: JSON Escaping Bug in g3-research Script (OBSOLETE)
### Title
`g3-research` produces invalid JSON when query contains actual newlines
@@ -47,19 +51,19 @@ Embedded skills have non-existent file paths that agents are instructed to `read
### Repro
```
# When no repo skills/ directory exists, the research skill is loaded from embedded
# When no repo skills/ directory exists, embedded skills are loaded
# The generated prompt contains:
<skill>
<name>research</name>
<name>example-skill</name>
<description>...</description>
<location><embedded:research>/SKILL.md</location>
<location><embedded:example-skill>/SKILL.md</location>
</skill>
# The prompt instructs:
"read the full skill file using `read_file` to get detailed instructions"
# Agent attempts:
read_file("<embedded:research>/SKILL.md")
read_file("<embedded:example-skill>/SKILL.md")
# Result: File not found error
```