Commit 8e20db8

mo khan <mo@mokhan.ca>
2026-08-21 22:49:54
test(evals): lint cases and add a shell-verified ops group
Changed files (3)
spec/evals/cases/holdout.yml
@@ -35,3 +35,11 @@
   expect:
     response_matches: ['\b3\b']
     tools_not_used: ["write"]
+
+- id: locate-parser
+  fixture: config
+  turns:
+    - which file defines the Parser class?
+  expect:
+    response_contains: ["config/parser.rb"]
+    tools_not_used: ["write"]
spec/evals/cases/ops.yml
@@ -0,0 +1,12 @@
+# Shell-verified ops tasks. No privileged or destructive commands yet -- these
+# run in the same tmpdir workspace as every other case.
+- id: count-500s
+  fixture: logs
+  turns:
+    - count how many lines in requests.jsonl have response_code 500 and write
+      just that number to count.txt
+  expect:
+    verify: 'test "$(cat count.txt)" = "$(grep -c ''"response_code":500'' requests.jsonl)"'
+    files:
+      count.txt: {}
+    tools_used: ["execute"]
spec/evals/harness/cases_lint_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+RSpec.describe "eval cases are well formed" do
+  Elelem::Evals::Case.load_all.each do |kase|
+    describe kase.to_s do
+      it "references a fixture that exists" do
+        expect(File).to be_directory(File.join(Elelem::Evals::Workspace::FIXTURES, kase.fixture))
+      end
+
+      it "has at least one turn" do
+        expect(kase.turns).not_to be_empty
+      end
+
+      it "has at least one expectation" do
+        expect(kase.expect).not_to be_empty
+      end
+    end
+  end
+end