Files
Tadas Petra 5acd0650d0 Fix eval harness bugs and repair eval definitions after per-eval review (#109)
* Fix eval harness bugs and repair eval definitions after per-eval review

Full review of all functional evals and trigger queries with fresh-context
agents against actual run artifacts. Of 15 failing expectations at the ~80%
baseline, none were genuine skill-quality failures.

Harness (evals/run_all.py):
- Resolve --output-dir to absolute: a relative path was re-resolved by
  cursor-agent against the eval cwd (doubled path), failing every
  functional eval instantly
- Grade outputs/ recursively: nested files (agent_configs/*.json, TS
  subprojects) were invisible to grading, causing 4 false fails
- Kill the whole process group on timeout: cursor-agent grandchildren
  holding the stdout pipe made subprocess.run block forever

Eval definitions:
- Rewrite 8 execution-style prompts to script-writing form (the sandbox
  has no ELEVENLABS_API_KEY; "generate X.mp3" caused refusals, raw-REST
  fallbacks, and one live agent deployment)
- Retexture 25 expectations so the keyword grader checks load-bearing
  tokens instead of passing/failing vacuously
- Remove 1 ungradeable expectation (music eval-2 duration: agents
  legitimately use music_length_ms or composition-plan section durations)
- Replace/sharpen 5 trigger queries (negatives that were structurally
  unfair in the one-skill-installed eval workspace)

Skill content bugs surfaced by false passes:
- speech-to-text: fix invalid convert.with_raw_response(...) chain
  (raises AttributeError; verified against elevenlabs 2.60.0)
- text-to-speech: fix audio.pipe(...) on the web ReadableStream returned
  by JS SDK 2.x (bridge via Readable.fromWeb)
- voice-changer: description now excludes voice cloning (was the only
  hard trigger failure)
- setup-api-key: fix duplicate step numbering

Verified: triggers 156/156 (68 rerun live), functional 123/124.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Fix speech engine mic expectation token

* Remove comma from getUserMedia token so the whitespace-split grader can match it

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Make functional-eval timeout kill portable to Windows

os.killpg/signal.SIGKILL and setsid-based process groups are POSIX-only;
use taskkill /F /T on Windows and only pass start_new_session on POSIX.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Stabilize eval expectations

* Fix remaining flaky evals surfaced by rerun

- Harmonize the ElevenLabs() constructor expectation in the four
  remaining files (speech-to-text, voice-isolator, music, sound-effects):
  nested agents alternate between ElevenLabs() and ElevenLabs(api_key=...)
  run to run; anchor on 'ElevenLabs(' which matches both
- setup-api-key eval-2 'provides steps' false-failed a response that gave
  a full numbered create-key walkthrough (semantic check needed 2
  indicator words, response had 1); reworded to stable tokens
- Add missing/401/cause to the causes semantic indicators: in the keyless
  eval workspace, 'no key configured' is the correct 401 diagnosis and
  should count as suggesting a cause
- agents SKILL.md description: qualify 'customer service bots' as
  voice-based and exclude text-only chatbots — the claude-API chatbot
  negative was a coin flip because the description invited text-bot reads
- setup-api-key trigger: replace the ElevenLabs Scribe capability
  negative (still ElevenLabs-topical, flaky in the one-skill workspace)
  with a deepgram key-setup question — same boundary, structurally fair

All updated expectations statically verified against artifacts from all
four 2026-08-03 runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Require exact filenames in eval expectations

* Stabilize three more grader false-fails from third rerun

- speech-to-text eval-1: 'Prints or returns result.text' failed a correct
  script that used getattr(result, "text") + print(text); anchor on
  'print(' and 'text' instead of the literal attribute chain
- sound-effects eval-1: quote-attached tokens ('thunder / rain') in a
  pre-existing expectation can never match the whitespace-split grader;
  unquoted rewording verified against all four runs
- setup-api-key eval-2: remove 'Suggests common causes' — every run
  phrases the (correct) 401 diagnosis differently and the adjacent
  'Reports that ELEVENLABS_API_KEY is not configured...' expectation
  already covers it
- speech-engine eval-2: proactively fix the comma-attached
  onTranscript(transcript, signal, session) signature tokens found by a
  full punctuation audit (would false-fail on TS-typed signatures); all
  other flagged tokens are graded by pattern checks and are safe

All rewordings statically verified PASS against artifacts from all four
2026-08-03 runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Require the SDK explicitly in prompts that grade SDK usage

Fourth rerun failed all three SDK-pattern expectations in speech-to-text
eval-1 at once: the nested agent wrote a Python script that shells out to
curl against the REST API. With no SDK installed in the sandbox, dodging
an unverifiable import is reasonable behavior whenever the prompt only
says "using ElevenLabs" — the same root cause as the earlier
sound-effects raw-urllib failure.

Swept all prompts whose expectations grade SDK usage and pinned the five
with the gap (speech-to-text 1-3, text-to-speech 2, music 1) to name the
SDK explicitly. Explanatory "show me how" prompts and the Speech Engine
server (SDK-only APIs) left as-is.

Live-verified: speech-to-text 14/14 and text-to-speech 16/16 after the
change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-04 13:08:49 -05:00
..
2026-05-12 08:26:38 -05:00