This is a benchmark for evaluating coding agents on real-world Business Central (AL) development tasks, inspired by SWE-Bench. Unlike traditional model benchmarks, BC-Bench is designed to help select models and rapidly iterate on mcp servers, custom instruction/agents, etc for engineers. The repository contains:
- Dataset: Benchmark entries following SWE-Bench schema with BC-specific adjustments
- Python Package (
src/bcbench/): CLI tools, agent implementations, and validation utilities - PowerShell Scripts (
scripts/): Environment setup and dataset verification using AL-GO/BCContainerHelper - Tools (
tools/): Standalone scripts for downloading and analyzing GitHub Actions artifacts - Agent Evaluations: Focuses on GitHub Copilot CLI and Claude Code
- Experiments: MCP Servers, custom instructions, custom agents, skills, etc. and their performance on the benchmark
- Notebooks (
notebooks/): Analysis and visualization of benchmark results
- Primary language: Python (with AL/Business Central as the target evaluation language)
- Uses
uvfor dependency management: e.g.uv add <package>to add packages,uv run <command>to run commands - Uses
pre-commitfor code quality checks (ruff linting/formatting, trailing whitespace, etc.)
BC-Bench is category-based and designed to grow over time. It currently has two base categories, bug-fix and test-generation, plus four counterfactual categories (cf-1, cf-2, cf-3, cf-4) that split CF variants for batched evaluation. The base categories share the same dataset tasks and execution-based setup, but use different prompts, expected outputs, and evaluation pipelines. CF categories reuse the bug-fix pipeline with entries from counterfactual.jsonl. Future categories such as code-review can be added within the same overall benchmark structure, though they may require different inputs, setup, or evaluation methods.
- Prefer strong typing and type hints
- Prefer simple code for fast iteration
- Prefer modular, testable components
- Prefer pure functions where possible
- Prefer explicit over implicit
- Prefer high-order functions like map, filter, reduce over loops
- Prefer immutable data structures where possible
Function names should be self-explanatory. Do NOT add docstrings to functions unless absolutely necessary.
Bad:
def test_full_metrics_flow_to_success_result(self, sample_context):
"""Test parsing metrics, setting them on context, and creating a success result."""Good:
def test_full_metrics_flow_to_success_result(self, sample_context):
# No docstring needed - the name says it all- Do NOT worry about backward compatibility unless explicitly stated
- Do NOT worry about breaking changes
- User is a software engineer, not a statistician — explain statistical concepts in plain terms
- Challenge or question statistical methods when appropriate (e.g., sample size, assumptions, alternatives)
- Prefer clear visualizations over complex statistical jargon
- Use pandas and plotly for data manipulation and visualization