headroom/tests/test_output_verbosity_policy.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

72 lines
2.2 KiB
Python
Raw Permalink Normal View History

refactor(proxy): isolate output verbosity policy (#1963) ## Description Extracts output verbosity steering text and sentinel replacement into a pure `output_verbosity_policy` module. `output_shaper` continues to mutate Anthropic/OpenAI request bodies, while the byte-stable steering block and replacement rules now live behind deterministic, directly tested policy functions. Closes # ## Type of Change - [ ] Bug fix (non-breaking change that fixes an issue) - [ ] New feature (non-breaking change that adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update - [ ] Performance improvement - [x] Code refactoring (no functional changes) ## Changes Made - Added `headroom.proxy.output_verbosity_policy` for steering sentinels, level text, `steering_text`, and `replace_or_append_steering_block`. - Updated `output_shaper` to delegate pure steering text/replacement rules while preserving existing public imports and request mutation behavior. - Added direct policy tests for byte-stable steering text, append, replacement, malformed sentinel handling, and idempotency. - Included the current LiteLLM callback signature compatibility shim required for repo-wide mypy on main-based slices. ## Testing - [x] Unit tests pass (`pytest`) - [x] Linting passes (`ruff check .`) - [x] Type checking passes (`mypy headroom`) - [x] New tests added for new functionality - [ ] Manual testing performed ### Test Output ```text python -m pytest tests/test_output_verbosity_policy.py tests/test_output_shaper.py tests/test_litellm_callback.py -q 58 passed in 6.23s python -m ruff check . All checks passed! python -m ruff format --check . 1095 files already formatted python -m mypy headroom --ignore-missing-imports Success: no issues found in 409 source files gitleaks protect --staged --no-banner --redact no leaks found ``` ## Real Behavior Proof - Environment: Windows, Python 3.13.13, clean worktree based on `headroomlabs/main`. - Exact command / steps: targeted pytest, ruff, format check, repo-wide mypy, staged gitleaks scan. - Observed result: output verbosity policy/shaper/callback tests pass; static checks pass; no staged secrets detected. - Not tested: live provider calls; this slice preserves existing request mutation behavior and only moves pure steering rules. ## Review Readiness - [x] I have performed a self-review - [x] This PR is ready for human review ## Checklist - [x] My code follows the project's style guidelines - [x] I have performed a self-review of my code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] I have updated the CHANGELOG.md if applicable ## Screenshots (if applicable) N/A ## Additional Notes Documentation and changelog updates are not applicable for this internal architecture slice. PR-specific GHAS checks will be monitored after opening.
2026-07-13 04:35:09 +00:00
"""Tests for pure output verbosity steering policy."""
from __future__ import annotations
from headroom.proxy.output_verbosity_policy import (
STEERING_SENTINEL,
STEERING_SUFFIX,
replace_or_append_steering_block,
steering_text,
)
def test_level_zero_and_unknown_levels_have_no_steering_text() -> None:
assert steering_text(0) is None
assert steering_text(99) is None
def test_steering_text_is_wrapped_and_byte_stable() -> None:
first = steering_text(2)
second = steering_text(2)
assert first == second
assert first is not None
assert first.startswith(f"{STEERING_SENTINEL}\n")
assert first.endswith(f"\n{STEERING_SUFFIX}")
assert "Never restate code" in first
def test_replace_or_append_adds_block_to_nonempty_instructions() -> None:
block = steering_text(3)
assert block is not None
updated, changed = replace_or_append_steering_block("System.", block)
assert changed is True
assert updated == f"System.\n\n{block}"
def test_replace_or_append_uses_block_for_empty_instructions() -> None:
block = steering_text(1)
assert block is not None
updated, changed = replace_or_append_steering_block(" ", block)
assert changed is True
assert updated == block
def test_replace_or_append_replaces_existing_complete_block_once() -> None:
old = steering_text(1)
new = steering_text(4)
assert old is not None
assert new is not None
updated, changed = replace_or_append_steering_block(f"System.\n\n{old}\n\nTail.", new)
assert changed is True
assert old not in updated
assert updated == f"System.\n\n{new}\n\nTail."
def test_replace_or_append_replaces_unclosed_sentinel_to_end() -> None:
new = steering_text(2)
assert new is not None
updated, changed = replace_or_append_steering_block(
f"System.\n\n{STEERING_SENTINEL}\nold text without close",
new,
)
assert changed is True
assert updated == f"System.\n\n{new}"
def test_replace_or_append_is_idempotent_when_block_matches() -> None:
block = steering_text(2)
assert block is not None
updated, changed = replace_or_append_steering_block(f"System.\n\n{block}", block)
assert changed is False
assert updated == f"System.\n\n{block}"