Correct metered Sonnet 5 admission and prepare native action packet
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a0e332-3365-77c0-8491-084e9ea33ac1
This commit is contained in:
parent
46a54acc0c
commit
11cc0d5452
13 changed files with 2111 additions and 3 deletions
94
tests/test_metered_activation_review.py
Normal file
94
tests/test_metered_activation_review.py
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
import copy
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
spec = importlib.util.spec_from_file_location('metered_review', ROOT / 'tools/prepare_metered_activation.py')
|
||||
review = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(review)
|
||||
|
||||
PROVIDER = dict(model='claude-sonnet-5', context_tokens=1_000_000,
|
||||
max_output_tokens=128_000, input_microusd_per_token=4,
|
||||
output_microusd_per_token=10, source='fixture:provider-facts')
|
||||
OWNER = {'messages_policy': dict(PROVIDER, max_output_tokens=32_000)}
|
||||
SPEND = dict(max_liability_usd='5.74', eur_per_usd='0.87', per_run_eur='5')
|
||||
|
||||
|
||||
def test_installed_200k_context_is_not_a_hard_input_bound():
|
||||
owner = copy.deepcopy(OWNER)
|
||||
owner['messages_policy']['context_tokens'] = 200_000
|
||||
result = review.review_policy(owner, SPEND, PROVIDER)
|
||||
assert result['maximum_request_microusd'] == 1_120_000
|
||||
assert result['failures'] == ['input_reservation_below_provider_context']
|
||||
assert not result['passed']
|
||||
|
||||
|
||||
def test_full_context_fits_once_and_does_not_grant_authority():
|
||||
result = review.review_policy(OWNER, SPEND, PROVIDER)
|
||||
assert result['passed']
|
||||
assert result['maximum_request_microusd'] == 4_320_000
|
||||
assert result['maximum_request_eur_at_configured_fx'] == '3.7584'
|
||||
assert result['full_output_requests_that_fit'] == 1
|
||||
assert result['authority_granted'] is False
|
||||
|
||||
|
||||
@pytest.mark.parametrize('key,value,reason', [
|
||||
('model', 'other', 'model_mismatch'),
|
||||
('input_microusd_per_token', 2, 'understated_input_microusd_per_token'),
|
||||
('output_microusd_per_token', 9, 'understated_output_microusd_per_token'),
|
||||
('max_output_tokens', 128001, 'output_exceeds_provider_limit'),
|
||||
])
|
||||
def test_invalid_provider_compatibility_refuses(key, value, reason):
|
||||
owner = copy.deepcopy(OWNER)
|
||||
owner['messages_policy'][key] = value
|
||||
assert reason in review.review_policy(owner, SPEND, PROVIDER)['failures']
|
||||
|
||||
|
||||
def test_no_capacity_and_invalid_fx_refuse():
|
||||
assert 'no_full_output_request_fits' in review.review_policy(
|
||||
OWNER, dict(SPEND, max_liability_usd='1'), PROVIDER)['failures']
|
||||
assert 'parent_exceeds_eur_cap' in review.review_policy(
|
||||
OWNER, dict(SPEND, eur_per_usd='1'), PROVIDER)['failures']
|
||||
with pytest.raises(ValueError):
|
||||
review.review_policy(OWNER, dict(SPEND, eur_per_usd='NaN'), PROVIDER)
|
||||
|
||||
|
||||
def test_packet_has_six_distinct_unapproved_actions_and_unchanged_human_controls():
|
||||
packet = review.build_packet(ROOT / 'catalog', 'glas-claude-agent-dev-anthropic',
|
||||
OWNER, SPEND, PROVIDER)
|
||||
actions = packet['actions']
|
||||
assert len(actions) == 6
|
||||
assert len({(a['catalog'], a['action']) for a in actions}) == 6
|
||||
for row in actions:
|
||||
request = row['request']
|
||||
assert request['resource']['id'] == 'catalog:' + row['catalog']
|
||||
assert request['action'] == row['action']
|
||||
assert bool(request['context'].get('human_control')) == (row['catalog'] == 'glas-claude-agent-dev-anthropic')
|
||||
assert 'approval_id' not in request['context']
|
||||
assert packet['approval_ids'] == []
|
||||
assert not packet['dispatch_enabled']
|
||||
assert not packet['host_pins_verified']
|
||||
|
||||
|
||||
def test_snapshot_must_match_the_recipient_pin(tmp_path):
|
||||
snapshot = tmp_path / 'owner.json'
|
||||
snapshot.write_text('{}')
|
||||
with pytest.raises(ValueError, match='snapshot_file_pin_mismatch'):
|
||||
review.load_pinned_snapshot(snapshot, '0' * 64)
|
||||
|
||||
|
||||
def test_actual_cli_output_and_beta_must_fit_policy():
|
||||
facts = dict(PROVIDER, observed_cli_max_tokens=64000,
|
||||
required_request_betas=['mid-conversation-system-2026-04-07'])
|
||||
result = review.review_policy(OWNER, SPEND, facts)
|
||||
assert result['failures'] == ['output_limit_below_observed_cli_request',
|
||||
'observed_cli_beta_not_admitted']
|
||||
owner = copy.deepcopy(OWNER)
|
||||
owner['messages_policy'].update(max_output_tokens=64000,
|
||||
allowed_betas=['mid-conversation-system-2026-04-07'])
|
||||
result = review.review_policy(owner, SPEND, facts)
|
||||
assert result['passed']
|
||||
assert result['maximum_request_microusd'] == 4640000
|
||||
assert result['maximum_request_eur_at_configured_fx'] == '4.0368'
|
||||
Loading…
Add table
Add a link
Reference in a new issue