harness-benchmarking — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited harness-benchmarking (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Attribution: Derived from arXiv:2605.26112v1 — From Model Scaling to System Scaling: Scaling the Harness in Agentic AI by Shangding Gu (UC Berkeley), May 2026.
Current agentic benchmarks (SWE-bench, AgentBench, WebArena, Terminal-Bench) measure single-score endpoint success. This obscures whether performance gains come from stronger models or better harness design, and fails to capture the systemic qualities that determine production reliability.
This skill encodes the move from outcome metrics to process metrics and from single-episode evaluation to longitudinal evaluation.
Activate this skill when:
Single endpoint success rate is necessary but insufficient for agentic evaluation:
What single-score HIDES:
- Did the agent succeed via a reliable process or a lucky path?
- Did it use 10K tokens or 500K tokens?
- Did it verify its own work or just produce output?
- Would it succeed again on a different rollout?
- Did memory drift contribute to the failure?
What single-score SHOWS:
- Whether the final output is correct (once)Field finding (Kapoor et al., 2024): Agent results often conflate capability with costs, prompting quality, and demonstrations. Many published results are non-Pareto-optimal when controlled for these factors.
Pass@1 = "did the agent succeed on this one attempt?" — the default benchmark.
Pass^k = "did the agent succeed on all k independent rollouts?" — the production-reliability metric.
Agent A: pass@1 = 0.90, pass^10 = 0.35 ← High peak, low consistency
Agent B: pass@1 = 0.75, pass^10 = 0.65 ← Lower peak, high consistency
Production verdict: Agent B is more reliable despite lower benchmark score.τ-bench finding: Agents strong under single-shot pass rates collapse under pass^k — revealing that apparent capability was partly luck, not reliability.
| Metric Category | Specific Metrics | Why It Matters |
|---|---|---|
| Token efficiency | Tokens/task, useful-tokens ratio | High token use ≠ better performance |
| Tool use | Tool calls/task, tool failure rate | Reveals skill routing quality |
| Memory quality | Retrieval precision, memory hygiene over time | Detects stale-but-confident failure |
| Context quality | Context efficiency, provenance coverage | Detects noise loading and attention dilution |
| Trajectory quality | Steps to completion, backtrack rate | Reveals planning quality |
| Verification | Post-condition pass rate, verification cost | Reveals confident-but-unchecked risk |
| Communication | Cross-agent fidelity (in multi-agent) | Detects telephone-game degradation |
| Safety | Irreversible action rate, permission escalation rate | Governance quality |
Start with these three metrics beyond pass@1:
class MinimumViableEval:
def evaluate(self, agent: Agent, task_suite: list[Task]) -> MVEReport:
results = []
for task in task_suite:
run = agent.run(task)
results.append({
"task_id": task.id,
# Tier 1 must-haves:
"success": run.succeeded,
"token_count": run.total_tokens,
"tool_calls": len(run.tool_calls),
# Pass^k via multiple rollouts
"pass_k": self.compute_pass_k(agent, task, k=5),
})
return MVEReport(
pass_at_1=sum(r["success"] for r in results) / len(results),
pass_at_5=sum(r["pass_k"] for r in results) / len(results),
avg_tokens=sum(r["token_count"] for r in results) / len(results),
avg_tool_calls=sum(r["tool_calls"] for r in results) / len(results),
)
def compute_pass_k(self, agent: Agent, task: Task, k: int) -> float:
runs = [agent.run(task, seed=i) for i in range(k)]
return sum(1 for r in runs if r.succeeded) / kclass HarnessLevelEval:
def evaluate_memory_quality(self, agent: Agent, tasks: list[Task]) -> MemoryReport:
"""Measure memory quality before and after task execution."""
before = agent.memory.snapshot()
results = [agent.run(t) for t in tasks]
after = agent.memory.snapshot()
# Memory hygiene: how many entries are still accurate after tasks?
stale_count = sum(
1 for entry in after.entries
if agent.env.verify(entry.content).contradicts(entry)
)
return MemoryReport(
entries_added=len(after.entries) - len(before.entries),
stale_entries=stale_count,
hygiene_score=1 - (stale_count / max(1, len(after.entries))),
retrieval_precision=self.measure_retrieval_precision(agent, tasks),
)
def evaluate_context_efficiency(self, agent: Agent, tasks: list[Task]) -> ContextReport:
"""Measure how efficiently agent uses its context budget."""
runs = [agent.run_with_context_logging(t) for t in tasks]
efficiency_scores = []
for run in runs:
total_tokens = run.context_stats.total_tokens
useful_tokens = run.context_stats.tokens_actually_referenced
efficiency_scores.append(useful_tokens / max(1, total_tokens))
return ContextReport(
avg_efficiency=sum(efficiency_scores) / len(efficiency_scores),
avg_total_tokens=sum(r.context_stats.total_tokens for r in runs) / len(runs),
provenance_coverage=sum(
r.context_stats.provenance_coverage for r in runs
) / len(runs),
)
def evaluate_verification_quality(self, agent: Agent, tasks: list[Task]) -> VerificationReport:
"""Measure how well the agent verifies its own outputs."""
runs = [agent.run_with_verification_logging(t) for t in tasks]
return VerificationReport(
postcondition_pass_rate=sum(
r.verification_stats.all_passed for r in runs
) / len(runs),
avg_verification_cost_tokens=sum(
r.verification_stats.tokens_spent for r in runs
) / len(runs),
unverified_action_rate=sum(
r.verification_stats.unverified_actions for r in runs
) / sum(r.verification_stats.total_actions for r in runs),
)class LongitudinalEval:
"""Evaluate agent stability over time and across sessions."""
def measure_session_drift(
self, agent: Agent, task_suite: list[Task], session_length: int = 50
) -> DriftReport:
"""
Measure how agent performance degrades within a single long session.
Reveals context accumulation problems.
"""
# Run task suite fresh (no prior context)
fresh_scores = [agent.evaluate_fresh(t) for t in task_suite]
# Simulate a long session of unrelated work
agent.run_filler_session(n_tasks=session_length)
# Now re-evaluate same tasks with accumulated context
accumulated_scores = [agent.evaluate_with_history(t) for t in task_suite]
drift_per_task = [f - a for f, a in zip(fresh_scores, accumulated_scores)]
return DriftReport(
avg_drift=sum(drift_per_task) / len(drift_per_task),
max_drift=max(drift_per_task),
degraded_tasks=[
task_suite[i] for i, d in enumerate(drift_per_task) if d > 0.1
]
)
def measure_cross_session_memory_quality(
self, agent: Agent, n_sessions: int = 10
) -> MemoryDriftReport:
"""
Measure whether memory quality degrades across repeated sessions.
Detects stale-but-confident accumulation.
"""
precision_by_session = []
for session_num in range(n_sessions):
# Run a session
agent.run_session(session_num)
# Measure retrieval precision
precision = self.measure_retrieval_precision(agent)
precision_by_session.append(precision)
trend = compute_linear_trend(precision_by_session)
return MemoryDriftReport(
precision_by_session=precision_by_session,
trend=trend, # Negative = degrading over time
sessions_before_degradation=next(
(i for i, p in enumerate(precision_by_session) if p < 0.8),
n_sessions # No degradation within n_sessions
)
)
def measure_regression_rate(
self, agent_v1: Agent, agent_v2: Agent, regression_suite: list[Task]
) -> RegressionReport:
"""
Compare two agent versions. Identify tasks v2 FAILS that v1 PASSED.
Rolling success rate improvements can hide regressions.
"""
v1_results = {t.id: agent_v1.run(t).succeeded for t in regression_suite}
v2_results = {t.id: agent_v2.run(t).succeeded for t in regression_suite}
regressions = [
t for t in regression_suite
if v1_results[t.id] and not v2_results[t.id]
]
improvements = [
t for t in regression_suite
if not v1_results[t.id] and v2_results[t.id]
]
return RegressionReport(
v1_pass_rate=sum(v1_results.values()) / len(v1_results),
v2_pass_rate=sum(v2_results.values()) / len(v2_results),
regression_count=len(regressions),
improvement_count=len(improvements),
net_delta=len(improvements) - len(regressions),
regressed_tasks=regressions,
)class MultiAgentEval:
"""
Evaluates multi-agent system performance beyond single-agent metrics.
Based on Anthropic research finding: token usage explains 80% of variance.
"""
def evaluate_coordination_quality(
self, system: MultiAgentSystem, tasks: list[Task]
) -> CoordinationReport:
runs = [system.run(t) for t in tasks]
return CoordinationReport(
# Communication fidelity: does info survive agent-to-agent handoffs?
communication_fidelity=self.measure_fidelity(runs),
# De-duplication: do agents avoid doing the same work twice?
deduplication_rate=self.measure_deduplication(runs),
# Shared state consistency: do agents agree on world state?
shared_state_consistency=self.measure_state_consistency(runs),
# Contradiction rate: how often do agents contradict each other?
contradiction_rate=self.measure_contradictions(runs),
# Token breakdown: per-agent token distribution
token_distribution=self.measure_token_distribution(runs),
)
def measure_fidelity(self, runs: list[MultiAgentRun]) -> float:
"""Measure information preservation across agent handoffs."""
fidelity_scores = []
for run in runs:
for handoff in run.handoffs:
# Compare: what agent A sent vs. what agent B received/reported
sent = handoff.sent_content
received_and_used = handoff.downstream_references
score = content_overlap(sent, received_and_used)
fidelity_scores.append(score)
return sum(fidelity_scores) / max(1, len(fidelity_scores))| Benchmark | What It Measures | Limitation | Use When |
|---|---|---|---|
| SWE-bench | Coding task success (GitHub issues) | Single-score; doesn't measure process quality | Evaluating coding agents' endpoint capability |
| AgentBench | Multi-domain agentic task success | No token efficiency or reliability metrics | Broad capability survey |
| WebArena | Web navigation task success | No memory or context metrics | Evaluating web-browsing capability |
| Terminal-Bench | Terminal/CLI task success | No longitudinal or multi-session metrics | Evaluating CLI agents |
| τ-bench | pass^k reliability across rollouts | Infrastructure-intensive | Measuring production reliability |
| LoCoMo | Memory retention over long conversations | Only measures memory, not full harness | Evaluating memory quality specifically |
| LongMemEval | Temporal memory accuracy | Evaluates retrieval, not action quality | Memory system benchmarking |
When comparing two agents, don't just compare pass@1. Check the Pareto frontier:
Better agent: higher success AND lower token cost AND higher pass^k
Dominated agent: any agent that can be beaten on all three axes
Plot: token_cost (x) vs. success_rate (y) vs. pass^10 (bubble size)From the paper (Kapoor et al., 2024): Many published agent results are non-Pareto-optimal when controlled for token costs, prompting, and demonstrations.
From Anthropic research (cited in paper):
def compute_efficiency_adjusted_score(
success_rate: float, token_cost: int, baseline_tokens: int = 10000
) -> float:
"""
Adjust success rate by token efficiency.
Agents spending 10x tokens should be held to higher success standards.
"""
efficiency = baseline_tokens / max(1, token_cost)
return success_rate * efficiencyThis skill complements:
Created: 2026-05-26 Source Paper: arXiv:2605.26112v1 — Shangding Gu, UC Berkeley Version: 1.0.0
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.