skills/golem-powers/frustration-capture/SKILL.md
Capture user corrections as high-importance BrainLayer entries. Use when user says no/wrong/stop, repeats instructions, expresses frustration, or during session mining. Triggers on: user correction, 'I told you', 'not that', frustration signal.
npx skillsauth add etanhey/golems frustration-captureInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
"We should probably have filters to look for all my frustration when I start cursing and maybe even the amount of cursing I do." — User, April 4 2026 session (L2709-2711)
"Search for 'frustration' or 'should have known' returned ZERO — meaning user corrections and frustration signals are NOT being captured." — Session mining finding (ST9)
BrainLayer has ZERO records of user corrections. This is the single biggest knowledge gap — corrections are the most valuable signals for improving agent behavior, and they're all being lost. This skill closes that gap.
Activate this skill when you detect ANY of these signals in a user message:
When you detect a correction, store it in BrainLayer with this format:
brain_store(
content: "USER CORRECTION [category]: I did [what you did wrong]. User wanted [what they actually wanted]. Quote: '[exact user words]'. Context: [1-sentence situation]. Behavioral rule: [what to do differently next time].",
tags: ["user-correction", "frustration", "<category>", "<project>"],
importance: <see scale below>
)
| Signal | Importance | Why | |--------|-----------|-----| | First-time correction, calm tone | 7 | Standard correction | | Correction with frustration markers | 8 | User is annoyed — this matters more | | Repeated correction (user said it before) | 9 | Pattern — you're not learning | | Correction with profanity + repetition signal | 10 | Critical — user is considering giving up on you |
| Category | Pattern | Example |
|----------|---------|---------|
| routing-violation | Wrong agent/tool for the task | "Cursor is for gathering, not implementing" |
| fabrication | Made up data, prices, facts | "Don't fake these data" |
| scope-drift | Doing the wrong task | "Wait, are we not doing /claude-desktop-research?" |
| tool-misuse | Wrong flag, wrong command, wrong tool | "orcClaude -s -c will continue you dummy" |
| assumption | Wrong personal/project fact | "I'm not a student" / "I use Helium" |
| communication | Didn't listen, unclear, repeated self | "I told you I want to not consume too much context" |
| deferral | Postponed when user wanted action | "Not good one for later" |
| overcomplicate | Made simple thing complex | "Why not just convert it?" |
Don't just apologize. "Sorry about that" without a brain_store = the correction is lost forever. The apology is social; the brain_store is functional.
Don't argue. When the user corrects you, they are RIGHT. Store the correction first. If you genuinely believe the user made an error, store the correction AND ask a clarifying question — but never push back on the correction itself.
Don't store vague summaries. "User was frustrated about routing" is useless. Store: exact quote, what you did wrong, what's correct, and the behavioral rule.
Don't inflate importance. A calm "no, use Cursor for that" is importance 7, not 10. Save 9-10 for repeated corrections with frustration.
Don't capture user's emotional state. This is NOT a mood tracker. Capture the CORRECTION (what you did wrong and what's right), not the EMOTION. The frustration level only affects importance scoring.
When mining session exports (JSONL or text), use these patterns to find corrections:
# Tier 1: Direct corrections
patterns_tier1 = [
r'\bno[,.]?\s', # "No, that's wrong"
r'\bnot that\b', # "Not that"
r'\bwrong\b', # "Wrong"
r'\bstop\b', # "Stop doing X"
r'I told you', # Repetition signal
r'as I said', # Repetition signal
r"it's not new", # Repetition signal
r'we spoke about', # Repetition signal
r'wait,?\s*(are|why)', # Redirect
r'what do you mean', # Confusion about agent's claim
]
# Tier 2: Frustration escalation
patterns_tier2 = [
r'what the (hell|fuck)',
r'damn it',
r'dumb\s?ass',
r'come on',
r'(mother)?fuck',
r'are you (serious|kidding)',
r'no{3,}', # "no no no no"
r'[A-Z]{4,}', # ALL CAPS words (4+ chars)
]
# Tier 3: Subtle
patterns_tier3 = [
r'why not just', # Simpler solution
r"that's fine,?\s*I guess", # Gave up
r'anyway', # Moving on from your failure
r'I can .* myself', # User doing it themselves
]
When mining, extract:
| Skill | How Frustration Capture Integrates |
|-------|-----------------------------------|
| /agent-routing | Routing violations are the #1 correction category (UC1-UC2) |
| /orc | R15 (BrainLayer store discipline) — corrections are the highest-priority stores |
| /never-fabricate | Fabrication corrections (UC4) compound with /never-fabricate rules |
| /session-handoff | Corrections must survive handoffs — store in BrainLayer, not just conversation |
| Session mining | Mining mode uses the regex patterns above to bulk-extract corrections |
After storing a correction, verify:
brain_search("user-correction <category>")
If the search returns your store → good. If it returns ZERO → the store failed or tags are wrong. Fix immediately. Evidence: April 4 mining found zero correction records despite 34 corrections across the session.
User says: "No, I use Helium as my main, not Brave."
Agent should:
assumption — wrong personal factbrain_store(
content: "USER CORRECTION [assumption]: I assumed user's main browser is Brave. User corrected: main browser is Helium, not Brave or Chrome. Quote: 'No, I use Helium as my main, not Brave.' Behavioral rule: never assume browser — check BrainLayer for user preferences before suggesting browser-specific actions.",
tags: ["user-correction", "frustration", "assumption", "browser-preference"],
importance: 7
)
brain_search("user-correction browser") → confirm storedtools
The human-eval UX contract for Phoenix views: turn-by-turn scrollable replay (not a scorecard), hide-but-copyable IDs, collapsed thinking, identity chips, tool filters, tiny frozen starter datasets, mark-wrong-in-thread, mobile-first. Use when: building or reviewing ANY Phoenix/eval view, annotation UI, session replay, or human-grading surface. Triggers: phoenix view, eval UI, annotation view, session replay, human eval UX, grading interface. NOT for: Phoenix data pipelines/ingest (capture scripts have their own specs).
tools
macOS systems specialist — AppKit NSPanel architecture, launchd services, socket activation, MCP bridge resilience, syspolicyd, and high-frequency SwiftUI dashboards. Use when building menu-bar apps, LaunchAgents, debugging syspolicyd/Gatekeeper/TCC, resilient UDS/MCP bridges, or SwiftUI dashboards at 10Hz+.
development
Bulk LLM-judging protocol for fleet-dispatched verdict runs (KG cluster, eval harness). Use when: dispatching or running judge workers (J1/J2/RT), planning bulk-apply from verdict JSONL, or triaging evidence_degraded outputs. Triggers: judge fleet, bulk judge, R3 verdicts, kg-judge, RT gate, evidence_degraded. NOT for: single-item code review, Phoenix view UX (use phoenix-human-view), or non-judge eval pipelines.
development
Quiet-down protocol for sprint close: when the fleet wraps, delete ALL polling crons and monitors, send ONE final dashboard + ONE message, then go SILENT. Use when: fleet wraps, all workers done, overnight queue exhausted, sprint close, Etan asleep/away with nothing approved left. Triggers: fleet wrap, wrap the fleet, stand down, going quiet, sprint close. NOT for: mid-sprint monitoring (keep your loops), spawning a successor (use /session-handoff first).