feat: show history compression progress and fix action trace overlays
This commit is contained in:
1 parent
ab03e1d2bb
commit
c79c6eb27b
7 files changed
+468
-43
No files matched your search
@@ -78,6 +78,7 @@ class FakeEngine:
|
||||
self.session_start_time = SESSION_START
|
||||
self.current_session_id = "session-1"
|
||||
self.chunk_writes: list[dict] = []
|
||||
self.traces: list[dict] = []
|
||||
if base_dir is not None:
|
||||
self.base_dir = base_dir
|
||||
|
||||
@@ -88,6 +89,10 @@ class FakeEngine:
|
||||
self.chunk_writes.append(kwargs)
|
||||
return f"chunk-row-{len(self.chunk_writes)}"
|
||||
|
||||
def record_trace(self, **kwargs):
|
||||
self.traces.append(kwargs)
|
||||
return kwargs.get("trace_id")
|
||||
|
||||
|
||||
class StubCapsuleService(StepMemoryService):
|
||||
"""Records capsule submissions without spawning asyncio tasks (sync tests).
|
||||
@@ -1097,6 +1102,75 @@ def test_hard_threshold_force_swaps_pending_chunks_into_l3():
|
||||
assert len(ledger.unchunked_turns()) < 8 # turns actually consumed
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Timeline announcement (compress_history trace)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_compression_announces_one_tool_line_from_dispatch_to_swap():
|
||||
"""Dispatch and swap share a trace ID and report the change in token usage."""
|
||||
steps = [_step(i, "hash-a" if i <= 4 else "hash-b") for i in range(1, 9)]
|
||||
meter = {"value": 60_000}
|
||||
ledger, chunker, engine, capsule = _make(steps, min_active=2, meter=lambda: meter["value"])
|
||||
_run_turns(ledger, chunker, 1, 8, _hashes(4))
|
||||
|
||||
assert len(engine.traces) == 1
|
||||
running = engine.traces[0]
|
||||
assert (running["type"], running["name"], running["status"]) == (
|
||||
"tool",
|
||||
"compress_history",
|
||||
"running",
|
||||
)
|
||||
args = running["payload"]["args"]
|
||||
assert (args["start_step"], args["end_step"], args["steps"]) == (1, 4, 4)
|
||||
assert args["trigger"] == "milestone"
|
||||
assert args["source_tokens"] > 0
|
||||
assert "context_tokens" not in args
|
||||
|
||||
capsule.resolve("chunk:1-4", _capsule(1, 4))
|
||||
ledger.commit_staged(step_key="s8", validator_result={"status": "success"})
|
||||
ledger.render([_observation(9)])
|
||||
|
||||
done = engine.traces[-1]
|
||||
assert done["trace_id"] == running["trace_id"]
|
||||
assert done["status"] == "success"
|
||||
assert done["duration"] is not None and done["duration"] >= 0
|
||||
done_args = done["payload"]["args"]
|
||||
assert done_args["source_tokens"] == args["source_tokens"]
|
||||
assert done_args["summary_tokens"] > 0
|
||||
assert done_args["context_budget"] == 100_000
|
||||
assert done_args["context_estimated"] is True
|
||||
assert done_args["context_tokens"] == (
|
||||
60_000 - done_args["source_tokens"] + done_args["summary_tokens"]
|
||||
)
|
||||
assert "forced" not in done_args
|
||||
|
||||
|
||||
def test_forced_swap_announces_snapshot_without_a_ratio():
|
||||
"""Forced swaps report estimated context usage without a summary size."""
|
||||
steps = [_step(i, "hash-a" if i <= 4 else "hash-b") for i in range(1, 9)]
|
||||
meter = {"value": None}
|
||||
ledger, chunker, engine, _ = _make(steps, min_active=2, meter=lambda: meter["value"])
|
||||
_run_turns(ledger, chunker, 1, 8, _hashes(4))
|
||||
assert any(t["status"] == "running" for t in engine.traces)
|
||||
|
||||
meter["value"] = 95_000
|
||||
ledger.commit_staged(step_key="s8", validator_result={"status": "success"})
|
||||
ledger.render([_observation(9)]) # pressure closes the open tail too, then force-swaps all
|
||||
|
||||
running_ids = {t["trace_id"] for t in engine.traces if t["status"] == "running"}
|
||||
done = [t for t in engine.traces if t["status"] == "success"]
|
||||
assert done and {t["trace_id"] for t in done} <= running_ids
|
||||
for trace in done:
|
||||
assert trace["payload"]["args"]["forced"] is True
|
||||
assert trace["payload"]["args"]["summary_tokens"] is None
|
||||
last_args = done[-1]["payload"]["args"]
|
||||
assert last_args["context_budget"] == 100_000
|
||||
assert 0 < last_args["context_tokens"] < 95_000
|
||||
# The prompt-size figure appears once per swap event, on the last line.
|
||||
assert all("context_tokens" not in t["payload"]["args"] for t in done[:-1])
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Band ① note-linkage machine check
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in new issue
Block a user