OpenWriterControle/evals
Darren Hinde 926d68de93
fix(evals): repair deterministic eval baseline (behavioral regressions + tsc build) (#334)
* fix(evals): repair six eval-framework behavioral regressions

Restore the deterministic eval baseline by fixing false-negatives and
identity/discovery bugs across the framework:

- error-handling: correct severity-boundary fixtures so mixed-severity
  cases actually cross the >1000 warning threshold (deterministic
  error/warning/info), plus explicit 1000-vs-1001 boundary tests.
- context-loading-evaluator: emit `no-context-loaded` and
  `context-loaded-after-execution` as errors so missing/late context
  fails (was a passing warning); update focused test accordingly.
- tool-usage-evaluator: enforce dedicated tools — bash `cat`/`ls`/`ls -la`
  now fail as `bash-antipattern-*` errors (ls de-allowlisted); npm/git/
  piped commands still pass.
- test-case-loader: canonicalize legacy agent ids via normalizeAgentId
  (`openagent` -> `core/openagent`), preserving canonical/unknown ids.
- suite-validator: accept category-based agent ids, resolve test paths
  under the canonical dir, add requested-vs-declared conflict detection;
  new suite-validator.test.ts.
- validate-suites-cli: recursive suite discovery (nested <cat>/<agent>/
  config), deterministic order, fail-closed on zero suites; new
  validate-suites-cli.test.ts.

Deterministic Vitest allowlist green; validate:suites:all non-vacuous
and exits 0. No model/network/eval:sdk execution.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(evals): clear pre-existing TypeScript build errors (tsc 39 -> 0)

`npm run build` (tsc) failed on 39 pre-existing errors in files outside
the behavioral-repair scope, blocking the baseline gate. Root causes:

- glob: drop obsolete @types/glob ^8 so glob v13's own types (globSync)
  resolve (fixes run-sdk-tests.ts).
- task-type-detector: introduce a local DetectedTaskType union for this
  (dead/unused) detector; shared TaskType union left unchanged.
- behavior-evaluator: the expectedResponse check filtered a nonexistent
  `message` event type and was silently dead — route through
  base-evaluator.getAssistantMessages (assistant_message/text). Adds
  three deterministic tests exercising the now-live check.
- integration tests: remove unused `expectedOutcome` fixture metadata
  (not on TestCase, never asserted) and add the required `category`
  field the excess-property error had masked.

tsc now exits 0. Vitest allowlist 112/112. Lint remains unconfigured in
evals/framework (no ESLint config has ever existed) and is deferred to a
separate follow-up; it is not part of this change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* fix(evals): sync bun.lock after @types/glob removal

The previous commit removed @types/glob via npm, updating package-lock.json
but leaving the primary bun.lock stale, which broke CI's
`bun install --frozen-lockfile`. Regenerate bun.lock so both lockfiles
agree (drops @types/glob and its transitive @types/minimatch only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* ci(evals): add evals/framework/package-lock.json for build-check

The pr-checks `build-check` job caches on and runs `npm ci` in
evals/framework, but that workspace had no local lockfile, so the job
failed at Setup Node.js ("Some specified paths were not resolved") and
would fail `npm ci`. Add a standalone, in-sync package-lock.json
(lockfileVersion 3, no @types/glob) so the job's cache path resolves and
`npm ci` succeeds. Validated locally with `npm ci --dry-run`.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 23:22:27 +01:00
..
agents docs: fix agent name casing in documentation (#117) 2026-01-25 03:40:21 +00:00
framework fix(evals): repair deterministic eval baseline (behavioral regressions + tsc build) (#334) 2026-07-14 23:22:27 +01:00
results fix(context): Add frontmatter to context files with missing metadata (#97) 2026-01-17 21:29:48 +00:00
test_tmp Add Production-Ready Eval Framework for OpenAgent (#25) 2025-11-28 11:48:13 +00:00
CORE_TEST_SUITE.md feat: repository review and MVI context system implementation (#85) 2026-01-09 14:02:15 +00:00
CREATING_TESTS.md refactor(evals): consolidate documentation and enhance test infrastructure (#56) 2025-12-18 09:52:11 +00:00
EVAL_FRAMEWORK_GUIDE.md docs: fix agent name casing in documentation (#117) 2026-01-25 03:40:21 +00:00
GROK_TEST_RESULTS.md feat: repository review and MVI context system implementation (#85) 2026-01-09 14:02:15 +00:00
PRODUCTION_READINESS_ASSESSMENT.md feat: repository review and MVI context system implementation (#85) 2026-01-09 14:02:15 +00:00
README.md docs: fix agent name casing in documentation (#117) 2026-01-25 03:40:21 +00:00
SUBAGENT_TESTING.md feat: repository review and MVI context system implementation (#85) 2026-01-09 14:02:15 +00:00
SUMMARY.md feat: repository review and MVI context system implementation (#85) 2026-01-09 14:02:15 +00:00

Agent Evaluation Framework

Test and validate agent behavior with automated evaluations.

Quick Start

cd evals/framework

# Run golden tests (baseline - 8 tests, ~2-3 min)
npm run eval:sdk -- --agent=openagent --pattern="**/golden/*.yaml"

# Run a specific test
npm run eval:sdk -- --agent=openagent --pattern="**/smoke-test.yaml"

# Run with debug output (includes multi-agent logging)
npm run eval:sdk -- --agent=openagent --pattern="**/golden/*.yaml" --debug

✨ New Features

Multi-Agent Logging (Dec 2025)

Beautiful hierarchical logging shows parent-child delegation chains:

┌────────────────────────────────────────────────────────────┐
│ 🎯 PARENT: OpenAgent (ses_xxx...)                          │
└────────────────────────────────────────────────────────────┘
  
  ┌────────────────────────────────────────────────────────────┐
  │ 🎯 CHILD: simple-responder (ses_yyy...)                    │
  │    Parent: ses_xxx...                                      │
  │    Depth: 1                                                │
  └────────────────────────────────────────────────────────────┘
  
  ✅ CHILD COMPLETE (2.9s)
✅ PARENT COMPLETE (20.9s)

Enable with --debug flag. See MULTI_AGENT_LOGGING_COMPLETE.md for details.

Performance Improvements (Dec 2025)

  • 10-20% faster tests - Grace period reduced from 5s to 2s
  • Performance metrics - Automatic collection of tool latencies, inference time
  • 37 unit tests - Complete test coverage for logging system

Golden Tests

8 curated tests that validate core agent behaviors:

Test What It Validates
01-smoke-test Agent & subagent delegation (multi-agent)
02-context-loading Agent reads context before answering
03-read-before-write Agent inspects before modifying
04-write-with-approval Agent asks before writing
05-multi-turn-context Agent remembers conversation
06-task-breakdown Agent reads standards before implementing
07-tool-selection Agent uses dedicated tools (not bash)
08-error-handling Agent handles errors gracefully
# Run all golden tests
npm run eval:sdk -- --agent=openagent --pattern="**/golden/*.yaml"

Creating Custom Tests

See CREATING_TESTS.md for:

  • Test templates (copy and modify)
  • Behavior options (mustUseTools, requiresApproval, etc.)
  • NEW: expectedContextFiles - Explicitly specify which context files to validate
  • Expected violations
  • Examples

New Feature: Explicit Context File Validation

You can now explicitly specify which context files the agent must read:

behavior:
  requiresContext: true
  expectedContextFiles:
    - .opencode/context/core/standards/code.md
    - standards/code.md

See agents/shared/tests/EXPLICIT_CONTEXT_FILES.md for detailed guide.

Quick example:

id: my-test
name: "My Test"
description: What this tests.
category: developer

prompts:
  - text: Read evals/test_tmp/README.md and summarize it.

approvalStrategy:
  type: auto-approve

behavior:
  mustUseTools: [read]

expectedViolations:
  - rule: approval-gate
    shouldViolate: false
    severity: error

timeout: 60000

Evaluators

Evaluator What It Checks
approval-gate Approval requested before risky operations
context-loading Context files loaded before acting (supports explicit file specification)
execution-balance Read operations before write operations
tool-usage Dedicated tools used instead of bash
behavior Expected tools used, forbidden tools avoided
delegation Complex tasks delegated to subagents
stop-on-failure Agent stops on errors instead of auto-fixing

Directory Structure

evals/
├── README.md                    # This file
├── CREATING_TESTS.md           # How to create custom tests
├── framework/                   # Test runner and evaluators
│   ├── src/
│   │   ├── sdk/                # Test execution
│   │   └── evaluators/         # Rule validators
│   └── README.md               # Technical details
├── agents/
│   ├── shared/tests/
│   │   ├── golden/             # 8 baseline tests
│   │   └── templates/          # Test templates
│   └── core/openagent/tests/   # Agent-specific tests
├── results/                     # Test results
│   ├── latest.json
│   └── index.html              # Dashboard
└── test_tmp/                    # Temp files (auto-cleaned)

CLI Options

npm run eval:sdk -- [options]

Options:
  --agent=NAME           Agent to test (openagent, opencoder, core/openagent)
  --subagent=NAME        Test a subagent (coder-agent, tester, reviewer, etc.)
                         Default: Standalone mode (forces mode: primary)
  --delegate             Test subagent via parent delegation (requires --subagent)
  --pattern=GLOB         Test file pattern (default: **/*.yaml)
  --debug                Enable debug output, keep sessions for inspection
  --verbose              Show full conversation (prompts + responses) after each test
                         (automatically enables --debug)
  --model=PROVIDER/MODEL Override model (default: opencode/big-pickle)
  --timeout=MS           Test timeout (default: 60000)
  --prompt-variant=NAME  Use specific prompt variant (gpt, gemini, grok, llama)
                         Auto-detects recommended model from prompt metadata
  --no-evaluators        Skip running evaluators (faster iteration)
  --core                 Run core test suite only (7 tests, ~5-8 min)

Examples

# Run golden tests with verbose output (see full conversations)
npm run eval:sdk -- --agent=openagent --pattern="**/golden/*.yaml" --verbose

# Test subagent standalone (forces mode: primary)
npm run eval:sdk -- --subagent=coder-agent

# Test subagent via delegation (uses parent agent)
npm run eval:sdk -- --subagent=coder-agent --delegate

# Test with a specific model
npm run eval:sdk -- --agent=openagent --model=anthropic/claude-3-5-sonnet-20241022

# Test with a prompt variant (auto-detects model)
npm run eval:sdk -- --agent=openagent --prompt-variant=llama

# Quick iteration without evaluators
npm run eval:sdk -- --agent=openagent --pattern="**/01-smoke-test.yaml" --no-evaluators

Quick Commands (Makefile)

From the project root, you can use these shortcuts:

# Full pipeline: build, validate, run golden tests
make test-evals

# Just run golden tests (8 tests, ~3-5 min)
make test-golden

# Quick smoke test (1 test, ~30s)
make test-smoke

# Run with verbose output (see full conversations)
make test-verbose

# Test specific agent
make test-agent AGENT=opencoder

# Test subagent (standalone mode)
make test-subagent SUBAGENT=coder-agent

# Test subagent (delegation mode)
make test-subagent-delegate SUBAGENT=coder-agent

# Test with specific model
make test-model MODEL=anthropic/claude-3-5-sonnet-20241022

# Test with prompt variant
make test-variant VARIANT=llama

# View results
make view-results    # Open dashboard in browser
make show-results    # Show summary in terminal

For detailed subagent testing guide, see SUBAGENT_TESTING.md

Results

Results are saved to evals/results/:

  • latest.json - Most recent run
  • history/ - Historical results (by month)
  • index.html - Dashboard (open in browser)
# View dashboard
make view-results
# Or manually:
cd evals/results && python -m http.server 8080
# Open http://localhost:8080