Files
hermes-agent/tests/agent/test_context_compressor_task_heading.py
kshitijk4poor 18b8364eca test(compression): assert every removed verbatim directive stays gone
The prior check only guarded one of the three quote-forcing directives the
fix removed; a partial revert of '<exact latest user request>' or 'write the
reverse signal verbatim' would reintroduce long-quote stalls unnoticed.
Also call the classmethod directly and hoist the patch import to module level.
2026-09-27 18:27:37 +05:30

66 lines
2.6 KiB
Python

"""Task-snapshot heading identity across the summarizer prompt, the template, and grounding.
The iterative-update instruction, the emitted template, and ``_ground_historical_task_snapshot`` must agree on
one heading. A leftover ``## Active Task`` section is not disclaimed by SUMMARY_PREFIX and reads as live work,
so grounding must replace it (and any duplicate task section) rather than prepend a second one.
"""
from unittest.mock import patch
from agent.context_compressor import ContextCompressor, HISTORICAL_TASK_HEADING
_LEGACY_ACTIVE_TASK_HEADING = "## Active Task"
def _headings(text: str) -> list[str]:
return [line for line in text.splitlines() if line.startswith("## ")]
def test_grounding_collapses_alias_and_duplicate_task_sections():
"""A summarizer that emits the legacy alias, or both headings, ends up with exactly one grounded section."""
body = (
f"{HISTORICAL_TASK_HEADING}\nUser asked: 'stale canonical'\n\n"
"## Goal\nthing\n\n"
f"{_LEGACY_ACTIVE_TASK_HEADING}\nUser asked: 'stale alias'\n\n"
"## Constraints & Preferences\n- none\n"
)
grounded = ContextCompressor._ground_historical_task_snapshot.__func__(
ContextCompressor, body, [{"role": "user", "content": "fresh ask"}]
)
headings = _headings(grounded)
assert headings.count(HISTORICAL_TASK_HEADING) == 1
assert _LEGACY_ACTIVE_TASK_HEADING not in headings
assert headings[1:] == ["## Goal", "## Constraints & Preferences"]
assert "fresh ask" in grounded
assert "stale" not in grounded
def test_long_user_request_is_not_quoted_by_summary_model():
"""Long quotes stall Codex output; the postprocessor preserves source wording."""
with patch("agent.context_compressor.get_model_context_length", return_value=100000):
compressor = ContextCompressor(model="test", quiet_mode=True)
section = compressor._build_summary_prompt(
"A long user request", 500, None, "", True
)
assert "summarize it in your own words rather than copying long" in section
for removed_directive in (
"input verbatim — the exact words",
"<exact latest user request>",
"write the reverse signal verbatim",
):
assert removed_directive not in section
latest_request = "Please check this issue carefully. " * 20
generated = (
f"{HISTORICAL_TASK_HEADING}\nUser asked for an issue check\n\n"
"## Goal\nCheck an issue"
)
grounded = ContextCompressor._ground_historical_task_snapshot(
generated, [{"role": "user", "content": latest_request}]
)
assert latest_request.strip() in grounded
assert "## Goal\nCheck an issue" in grounded