# 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 (OBSOLETE)
### Title
`g3-research` produces invalid JSON when query contains actual newlines
### Repro
```bash
# In skills/research/g3-research, the write_status function uses:
escaped_query=$(echo -n "$query" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g')
# Test with actual newlines:
QUERY=$'What is\nthe best\nRust library?'
escaped=$(echo -n "$QUERY" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g')
echo "{\"query\": \"$escaped\"}" | python3 -m json.tool
# Output: Invalid control character at: line 1 column 19 (char 18)
```
**Expected**: Valid JSON with `\n` escape sequences
**Actual**: Invalid JSON with literal newline characters
### Diagnosis
- **File**: `skills/research/g3-research:66`
- **Root cause**: The sed pattern `s/\n/\\n/g` matches the literal two-character string `\n`, not actual newline characters. Sed processes line-by-line by default and doesn't see newlines in the pattern space.
- **Triggering condition**: User query contains actual newline characters (e.g., from multi-line input or programmatic construction)
- **Deterministic**: Yes
### Impact
- **Severity**: Incorrect behavior - `status.json` becomes unparseable
- **Likelihood**: Uncommon but possible - queries are typically single-line, but multi-line queries from programmatic sources or copy-paste could trigger this
### Fix
Replace sed with perl which handles newlines correctly:
```bash
escaped_query=$(echo -n "$query" | perl -pe 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g')
```
---
## Issue 2: Embedded Skill Path Not Readable
### Title
Embedded skills have non-existent file paths that agents are instructed to `read_file`
### Repro
```
# When no repo skills/ directory exists, embedded skills are loaded
# The generated prompt contains:
example-skill
...
/SKILL.md
# The prompt instructs:
"read the full skill file using `read_file` to get detailed instructions"
# Agent attempts:
read_file("/SKILL.md")
# Result: File not found error
```
**Expected**: Agent can read skill documentation
**Actual**: File path doesn't exist on disk
### Diagnosis
- **File**: `crates/g3-core/src/skills/discovery.rs:97` - sets path to `/SKILL.md`
- **File**: `crates/g3-core/src/skills/prompt.rs:14-15` - instructs agent to use `read_file`
- **Root cause**: Embedded skills use a synthetic path marker, but the prompt doesn't account for this
- **Triggering condition**: User has no `skills/` directory in their repo (embedded skill not overridden)
- **Deterministic**: Yes
### Impact
- **Severity**: Annoying - agent will fail to read skill docs and may hallucinate or ask for help
- **Likelihood**: Common for users outside the g3 repo itself
### Possible Fixes
1. Include the full skill body in the prompt for embedded skills (increases prompt size)
2. Add special handling in `read_file` for `` paths
3. Change prompt to say "skill instructions are below" for embedded skills and inline the body
---
## Issue 3: Hardcoded 'main' Branch in SDLC Pipeline
### Title
`studio sdlc` assumes default branch is named 'main'
### Repro
```bash
# In a repo where default branch is 'master':
studio sdlc run
# has_commits_on_branch runs:
git rev-list --count main..sdlc/session-branch
# Fails silently (returns Ok(false)) because 'main' doesn't exist
# merge_to_main runs:
git checkout main
# Fails with "Failed to checkout main"
```
**Expected**: Works with any default branch name
**Actual**: Fails or behaves incorrectly on repos using 'master' or other branch names
### Diagnosis
- **File**: `crates/studio/src/main.rs:720` - `has_commits_on_branch()` hardcodes `main..{branch}`
- **File**: `crates/studio/src/git.rs` - `merge_to_main()` hardcodes `checkout main`
- **Root cause**: No detection of actual default branch name
- **Triggering condition**: Repository uses 'master' or custom default branch
- **Deterministic**: Yes
### Impact
- **Severity**: Incorrect behavior - merge fails or skipped incorrectly
- **Likelihood**: Common - many repos still use 'master'
### Fix
Detect default branch:
```bash
git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
# or
git config --get init.defaultBranch
```
---
## Summary
| # | Issue | Severity | Likelihood |
|---|-------|----------|------------|
| 1 | JSON escaping with newlines | Incorrect behavior | Uncommon |
| 2 | Embedded skill path unreadable | Annoying | Common |
| 3 | Hardcoded 'main' branch | Incorrect behavior | Common |
All issues are deterministic and reproducible.