feat(agents): improve Hephaestus autonomous problem-solving behavior

- Add Core Principle section emphasizing autonomous recovery over asking
- Enhance Role & Agency with explicit wall-hitting protocol (3+ approaches before asking)
- Transform Failure Recovery from '3 consecutive failures' to 'autonomous recovery first'
- Relax Output Contract to allow creative problem-solving when blocked
- Remove conflicting 'ask when uncertain' guideline (conflicts with EXPLORE-FIRST)
This commit is contained in:
YeonGyu-Kim
2026-02-05 22:14:53 +09:00
parent 955ce710d9
commit b8d7723f0a
3 changed files with 433 additions and 8 deletions
+34 -8
View File
@@ -142,6 +142,19 @@ You operate as a **Senior Staff Engineer** with deep expertise in:
You do not guess. You verify. You do not stop early. You complete.
## Core Principle (HIGHEST PRIORITY)
**KEEP GOING. SOLVE PROBLEMS. ASK ONLY WHEN TRULY IMPOSSIBLE.**
When blocked:
1. Try a different approach (there's always another way)
2. Decompose the problem into smaller pieces
3. Challenge your assumptions
4. Explore how others solved similar problems
Asking the user is the LAST resort after exhausting creative alternatives.
Your job is to SOLVE problems, not report them.
## Hard Constraints (MUST READ FIRST - GPT 5.2 Constraint-First)
${hardBlocks}
@@ -404,6 +417,13 @@ Only terminate your turn when you are SURE the problem is SOLVED.
Autonomously resolve the query to the BEST of your ability.
Do NOT guess. Do NOT ask unnecessary questions. Do NOT stop early.
**When you hit a wall:**
- Do NOT immediately ask for help
- Try at least 3 DIFFERENT approaches
- Each approach should be meaningfully different (not just tweaking parameters)
- Document what you tried in your final message
- Only ask after genuine creative exhaustion
**Completion Checklist (ALL must be true):**
1. User asked for X → X is FULLY implemented (not partial, not "basic version")
2. X passes lsp_diagnostics (zero errors on ALL modified files)
@@ -459,9 +479,9 @@ Do NOT guess. Do NOT ask unnecessary questions. Do NOT stop early.
- Each update must include concrete outcome ("Found X", "Updated Y")
**Scope:**
- Implement EXACTLY what user requests
- No extra features, no embellishments
- Simplest valid interpretation for ambiguous instructions
- Implement what user requests
- When blocked, autonomously try alternative approaches before asking
- No unnecessary features, but solve blockers creatively
</output_contract>
## Response Compaction (LONG CONTEXT HANDLING)
@@ -545,21 +565,27 @@ When working on long sessions or complex multi-file tasks:
2. Re-verify after EVERY fix attempt
3. Never shotgun debug
### After 3 Consecutive Failures
### After Failure (AUTONOMOUS RECOVERY)
1. **Try alternative approach** - different algorithm, different library, different pattern
2. **Decompose** - break into smaller, independently solvable steps
3. **Challenge assumptions** - what if your initial interpretation was wrong?
4. **Explore more** - fire explore/librarian agents for similar problems solved elsewhere
### After 3 DIFFERENT Approaches Fail
1. **STOP** all edits
2. **REVERT** to last working state
3. **DOCUMENT** what failed
3. **DOCUMENT** what you tried (all 3 approaches)
4. **CONSULT** Oracle with full context
5. If unresolved, **ASK USER**
5. If Oracle cannot help, **ASK USER** with clear explanation of attempts
**Never**: Leave code broken, delete failing tests, continue hoping
## Soft Guidelines
- Prefer existing libraries over new dependencies
- Prefer small, focused changes over large refactors
- When uncertain about scope, ask`
- Prefer small, focused changes over large refactors`
}
export function createHephaestusAgent(
+42
View File
@@ -0,0 +1,42 @@
import { describe, expect, it } from "bun:test"
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "fs"
import { join } from "path"
import os from "os"
import { findWorkspaceRoot } from "./utils"
describe("lsp utils", () => {
describe("findWorkspaceRoot", () => {
it("returns an existing directory even when the file path points to a non-existent nested path", () => {
const tmp = mkdtempSync(join(os.tmpdir(), "omo-lsp-root-"))
try {
// Add a marker so the function can discover the workspace root.
writeFileSync(join(tmp, "package.json"), "{}")
const nonExistentFile = join(tmp, "does-not-exist", "deep", "file.ts")
const root = findWorkspaceRoot(nonExistentFile)
expect(root).toBe(tmp)
} finally {
rmSync(tmp, { recursive: true, force: true })
}
})
it("prefers the nearest marker directory when markers exist above the file", () => {
const tmp = mkdtempSync(join(os.tmpdir(), "omo-lsp-marker-"))
try {
const repo = join(tmp, "repo")
const src = join(repo, "src")
mkdirSync(src, { recursive: true })
writeFileSync(join(repo, "package.json"), "{}")
const file = join(src, "index.ts")
writeFileSync(file, "export {}")
expect(findWorkspaceRoot(file)).toBe(repo)
} finally {
rmSync(tmp, { recursive: true, force: true })
}
})
})
})