fix(compress): gate N-user tail guarantee to actionable turns, behavior-preserving default

Follow-up fixes on top of the salvaged #22566 mechanism:

- N-collector now counts only REAL actionable user turns via
  _is_actionable_user_turn + _is_synthetic_compression_user_turn —
  the same filter pair _find_last_user_message_idx uses post-#69291.
  The contributor's bare role=='user' + _is_context_summary_content
  check let blank platform echoes and continuation/todo rows consume
  N slots, silently degrading the guarantee.
- Default flipped 3 -> 1 (behavior-preserving): a default of 3 was
  measured to change the tail cut on transcripts whose budget covers
  only the last turn. min_tail_user_messages=1 delegates to the
  existing single-user anchor; N>1 is opt-in, and the call site is
  gated so the default path is byte-identical to main.
- Hardened config parse in agent_init (bool rejected, fractional
  floats rejected, floor 1) matching the max_attempts parser shape.
- Wired the recurring external-PR config gaps: hermes_cli/config.py
  DEFAULT_CONFIG + cli-config.yaml.example (PR only had cli.py).
- Regression tests: blank echoes / synthetic rows don't count toward
  N; tool-call/result pairs never split by the N-boundary (no-orphan
  both directions); N-guarantee wins over tail_token_budget and the
  _MAX_TAIL_MESSAGE_FLOOR (floor is a minimum, not a cap); default
  parity pin; DEFAULT_CONFIG pin.
This commit is contained in:
Teknium 2026-07-23 11:55:20 -07:00
parent a9c868225e
commit d43cc2ca80
8 changed files with 282 additions and 15 deletions

View file

@ -448,6 +448,15 @@ compression:
# compression of older turns.
protect_last_n: 20
# Minimum number of REAL (actionable) user messages guaranteed to survive in
# the uncompressed tail (default: 1 = the existing single last-user anchor,
# behavior-preserving). Raise to e.g. 3 to keep the last 3 real user turns
# verbatim even when bulky tool outputs fill the tail token budget — blank
# platform echoes, compaction handoffs, and synthetic continuation rows never
# count toward N. The tail can exceed the token budget when this pulls the
# cut back; the guarantee wins over the budget by design.
min_tail_user_messages: 1
# Compression retry rounds before a turn gives up with "max compression
# attempts reached" (default: 3, same as the previous hardcoded value).
# Raise (e.g. 6) for tool-schema-heavy sessions where 3 rounds cannot bring