Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"providers": {
"anthropic": {
"status": "fail",
"error": "[claude-sonnet-4-6] tool call dropped"
"error": "[claude-sonnet-5] tool call dropped"
},
"bedrock_invoke": {
"status": "not_applicable",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@
{
"feature_id": "basic_messaging_non_streaming",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-sonnet-4-6]",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-sonnet-5]",
"result": {"status": "pass"}
},
{
"feature_id": "basic_messaging_non_streaming",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-opus-4-7]",
"nodeid": "tests/e2e/claude_code/basic_messaging_non_streaming/test_anthropic.py::test_basic_messaging_non_streaming_anthropic[claude-opus-4-8]",
"result": {"status": "pass"}
},
{
Expand All @@ -28,8 +28,8 @@
{
"feature_id": "tool_use",
"provider": "anthropic",
"nodeid": "tests/e2e/claude_code/tool_use/test_anthropic.py::test_x[claude-sonnet-4-6]",
"result": {"status": "fail", "error": "[claude-sonnet-4-6] tool call dropped"}
"nodeid": "tests/e2e/claude_code/tool_use/test_anthropic.py::test_x[claude-sonnet-5]",
"result": {"status": "fail", "error": "[claude-sonnet-5] tool call dropped"}
},
{
"feature_id": "tool_use",
Expand Down
14 changes: 7 additions & 7 deletions tests/e2e/claude_code/_builder_unit_tests/test_matrix_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def test_build_matrix_any_fail_makes_cell_fail():
{
"feature_id": "f",
"provider": "anthropic",
"result": {"status": "fail", "error": "[claude-opus-4-7] timeout"},
"result": {"status": "fail", "error": "[claude-opus-4-8] timeout"},
},
{"feature_id": "f", "provider": "anthropic", "result": {"status": "pass"}},
]
Expand All @@ -87,7 +87,7 @@ def test_build_matrix_any_fail_makes_cell_fail():
)
cell = matrix["features"][0]["providers"]["anthropic"]
assert cell["status"] == "fail"
assert cell["error"] == "[claude-opus-4-7] timeout"
assert cell["error"] == "[claude-opus-4-8] timeout"


def test_build_matrix_joins_all_failure_errors_in_one_cell():
Expand All @@ -110,7 +110,7 @@ def test_build_matrix_joins_all_failure_errors_in_one_cell():
{
"feature_id": "f",
"provider": "anthropic",
"result": {"status": "fail", "error": "[claude-opus-4-7] timeout"},
"result": {"status": "fail", "error": "[claude-opus-4-8] timeout"},
},
]
matrix = build_matrix(
Expand All @@ -123,7 +123,7 @@ def test_build_matrix_joins_all_failure_errors_in_one_cell():
cell = matrix["features"][0]["providers"]["anthropic"]
assert cell["status"] == "fail"
assert "[claude-haiku-4-5] 429" in cell["error"]
assert "[claude-opus-4-7] timeout" in cell["error"]
assert "[claude-opus-4-8] timeout" in cell["error"]


def test_build_matrix_mixed_pass_and_not_tested_surfaces_pass():
Expand Down Expand Up @@ -393,7 +393,7 @@ def test_build_matrix_6x5_grid_matches_published_sample():

feature_ids = [feature["id"] for feature in manifest["features"]]
providers = manifest["providers"]
models = ["claude-haiku-4-5", "claude-sonnet-4-6", "claude-opus-4-7"]
models = ["claude-haiku-4-5", "claude-sonnet-5", "claude-opus-4-8"]

results = []
for feature_id in feature_ids:
Expand Down Expand Up @@ -440,7 +440,7 @@ def test_build_matrix_1x5_grid_one_failing_model_breaks_cell():
"provider": "bedrock_invoke",
"result": {
"status": "fail",
"error": "[claude-opus-4-7-bedrock-invoke] claude CLI exited 1: throttled",
"error": "[claude-opus-4-8-bedrock-invoke] claude CLI exited 1: throttled",
},
},
{
Expand All @@ -459,7 +459,7 @@ def test_build_matrix_1x5_grid_one_failing_model_breaks_cell():
)
cell = matrix["features"][0]["providers"]["bedrock_invoke"]
assert cell["status"] == "fail"
assert "claude-opus-4-7-bedrock-invoke" in cell["error"]
assert "claude-opus-4-8-bedrock-invoke" in cell["error"]


def test_build_from_paths_writes_output(tmp_path):
Expand Down
31 changes: 25 additions & 6 deletions tests/e2e/claude_code/_builder_unit_tests/test_v0_layout.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,18 +141,37 @@ def test_every_manifest_feature_has_per_provider_test_file(feature_id, provider)
assert test_file.is_file(), f"missing per-provider test file: {test_file}"


DEFAULT_TIERS = ("haiku-4-5", "sonnet-5", "opus-4-8")

PROVIDER_TIER_OVERRIDES = {
"vertex_ai": ("haiku-4-5", "sonnet-4-6", "opus-4-7"),
"azure": ("haiku-4-5", "sonnet-4-6", "opus-4-8"),
}


@pytest.mark.parametrize("feature_id", EXPECTED_FEATURE_IDS)
@pytest.mark.parametrize("provider", EXPECTED_PROVIDERS)
def test_per_provider_test_file_imports_and_parametrizes_three_models(
feature_id, provider
):
"""Every test file must reference the three Claude tiers required
by the PRD: Haiku 4.5, Sonnet 4.6, Opus 4.7. Implementations may
use plain aliases or per-provider-suffixed aliases (e.g.
`claude-opus-4-7-bedrock-invoke`), so we check for the tier
substrings rather than exact alias names."""
by the PRD: small, mid, and large; Haiku 4.5, Sonnet 5, and Opus
4.8 as of the 2026-07 tier bump. Implementations may use plain
aliases or per-provider-suffixed aliases (e.g.
`claude-opus-4-8-bedrock-invoke`), so we check for the tier
substrings rather than exact alias names.

Two provider columns are pinned to older tiers until quota is
granted: Vertex AI has 0 TPM for the sonnet-5 / opus-4-8 base
models in the suite's project+region (deterministic 429), and
Microsoft Foundry has a hard 0 TPM quota limit for Claude Sonnet 5
in the suite's subscription, so its sonnet slot stays on
sonnet-4-6 while its opus slot runs the deployed opus-4-8. Once
quota requests land, flip the overrides here and the matching
aliases in `test_config.yaml` and the per-provider test files."""
tiers = PROVIDER_TIER_OVERRIDES.get(provider, DEFAULT_TIERS)
text = (REPO_ROOT / feature_id / f"test_{provider}.py").read_text()
for tier in ("haiku-4-5", "sonnet-4-6", "opus-4-7"):
for tier in tiers:
assert (
tier in text
), f"{feature_id}/test_{provider}.py does not reference {tier}"
Expand All @@ -179,5 +198,5 @@ def test_azure_test_file_drives_the_proxy(feature_id):
)
assert '"status": "not_applicable"' not in text, (
f"{feature_id}/test_azure.py still reports not_applicable; Microsoft Foundry "
"now hosts Claude (Haiku 4.5, Sonnet 4.6, Opus 4.7), so this row must run."
"now hosts Claude (Haiku 4.5, Sonnet 4.6, Opus 4.8), so this row must run."
)
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,8 @@ def test_verify_streaming_requires_all_models_to_stream(monkeypatch):
fake_result = _FakeResult()
outcomes = {
"claude-haiku-4-5": DriverResult(text="ok", events=_streamed_events(5)),
"claude-sonnet-4-6": DriverResult(text="ok", events=_buffered_events()),
"claude-opus-4-7": DriverResult(text="ok", events=_streamed_events(5)),
"claude-sonnet-5": DriverResult(text="ok", events=_buffered_events()),
"claude-opus-4-8": DriverResult(text="ok", events=_streamed_events(5)),
}
_install_fake_runner(monkeypatch, outcomes_by_model=outcomes)

Expand Down
18 changes: 9 additions & 9 deletions tests/e2e/claude_code/_driver_unit_tests/test_cli_driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ def test_run_claude_overlays_proxy_env():
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://proxy.example:4000",
api_key="sk-abc",
runner=runner,
Expand All @@ -112,7 +112,7 @@ def test_run_claude_extra_env_is_added_to_subprocess_env():
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
extra_env={"MAX_THINKING_TOKENS": "4096"},
Expand Down Expand Up @@ -146,7 +146,7 @@ def test_run_claude_inherits_only_allowlisted_os_environ(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand Down Expand Up @@ -178,7 +178,7 @@ def test_run_claude_uses_isolated_per_invocation_home(monkeypatch, tmp_path):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand Down Expand Up @@ -209,7 +209,7 @@ def test_run_claude_isolated_home_is_distinct_per_invocation(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand All @@ -219,7 +219,7 @@ def test_run_claude_isolated_home_is_distinct_per_invocation(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand All @@ -243,7 +243,7 @@ def test_run_claude_isolated_home_cleaned_up_after_run(monkeypatch):
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand Down Expand Up @@ -275,7 +275,7 @@ def runner(cmd, env, capture_output, text, timeout, check, input=None):
with pytest.raises(ClaudeCLIError):
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
runner=runner,
Expand All @@ -294,7 +294,7 @@ def test_run_claude_extra_env_can_pass_through_otherwise_blocked_var(monkeypatch
runner, captured = _make_runner(stdout="")
run_claude(
prompt="hi",
model="claude-opus-4-7",
model="claude-opus-4-8",
base_url="http://localhost",
api_key="sk-abc",
extra_env={"ANTHROPIC_API_KEY": "from-arg"},
Expand Down
10 changes: 5 additions & 5 deletions tests/e2e/claude_code/_driver_unit_tests/test_rate_limiter.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@
"model, expected",
[
("claude-haiku-4-5", PROVIDER_ANTHROPIC),
("claude-sonnet-4-6", PROVIDER_ANTHROPIC),
("claude-opus-4-7", PROVIDER_ANTHROPIC),
("claude-sonnet-5", PROVIDER_ANTHROPIC),
("claude-opus-4-8", PROVIDER_ANTHROPIC),
("claude-haiku-4-5-azure", PROVIDER_AZURE),
("claude-sonnet-4-6-azure", PROVIDER_AZURE),
("claude-opus-4-7-vertex", PROVIDER_VERTEX_AI),
("claude-sonnet-5-azure", PROVIDER_AZURE),
("claude-opus-4-8-vertex", PROVIDER_VERTEX_AI),
("claude-haiku-4-5-bedrock-converse", PROVIDER_BEDROCK_CONVERSE),
("claude-haiku-4-5-bedrock-invoke", PROVIDER_BEDROCK_INVOKE),
],
Expand All @@ -87,7 +87,7 @@ def test_infer_provider_rejects_empty_string():
def test_infer_provider_is_case_insensitive():
"""Aliases in the proxy config sometimes drift between cases; we
should still route them to the right column."""
assert infer_provider("CLAUDE-OPUS-4-7-AZURE") == PROVIDER_AZURE
assert infer_provider("CLAUDE-OPUS-4-8-AZURE") == PROVIDER_AZURE


# ---------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^
feature_id provider

Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
Expand All @@ -27,8 +27,8 @@
# routing config; the driver only sends the alias.
ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
feature_id provider

Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
Expand All @@ -34,7 +34,7 @@
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
feature_id provider

Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
Expand All @@ -28,8 +28,8 @@
# strategy.
BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
feature_id provider

Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 4.6, and Opus
4.7; the cell only goes green if all three pass. The shared
Per the PRD, every cell exercises Claude Haiku 4.5, Sonnet 5, and Opus
4.8; the cell only goes green if all three pass. The shared
`run_basic_messaging_cell` helper fans the three model runs out in
parallel and reports one `compat_result.add(...)` entry per model so
the matrix builder still sees three rows for this (feature, provider).
Expand All @@ -28,8 +28,8 @@
# routing strategy.
BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@

ANTHROPIC_MODELS = [
"claude-haiku-4-5",
"claude-sonnet-4-6",
"claude-opus-4-7",
"claude-sonnet-5",
"claude-opus-4-8",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
AZURE_MODELS = [
"claude-haiku-4-5-azure",
"claude-sonnet-4-6-azure",
"claude-opus-4-7-azure",
"claude-opus-4-8-azure",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

BEDROCK_CONVERSE_MODELS = [
"claude-haiku-4-5-bedrock-converse",
"claude-sonnet-4-6-bedrock-converse",
"claude-opus-4-7-bedrock-converse",
"claude-sonnet-5-bedrock-converse",
"claude-opus-4-8-bedrock-converse",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

BEDROCK_INVOKE_MODELS = [
"claude-haiku-4-5-bedrock-invoke",
"claude-sonnet-4-6-bedrock-invoke",
"claude-opus-4-7-bedrock-invoke",
"claude-sonnet-5-bedrock-invoke",
"claude-opus-4-8-bedrock-invoke",
]


Expand Down
Loading
Loading