#7837·QwenPaw

[Bug]: user rows carry no headline — the scroll eviction index has to call the model to label a user-only span

Author: chcsyfCreated Sep 17, 2026Updated Sep 17, 2026

QwenPaw Version

2.2.x (observed on a managed cloud deployment, qwenpaw.platform.agentscope.io).

Description

user rows in history.db carry no headline while assistant rows do. As a result the scroll eviction index cannot give an evicted user request a stable anchor and has to label it with a runtime model call.

scroll/manager.py (2.2.0) documents this as a known weak point:

"user rows do not carry headlines, so the eviction index must call the model to label a user-only span"

Two consequences:

  1. Evicting a user-only span costs an extra model call on the eviction path; the resulting label is not persisted and cannot be reused.
  2. A user request has no stable anchor in the eviction index, so the model can only blind-search to find it again — directly related to #7836 (a user turn inside a tool-heavy span can be evicted and become invisible).

Related PR(s): #5848 (merged) generates labels for un-headlined spans, but at eviction time and without persistence — it does not address user rows carrying no headline in the first place.

Security considerations: N/A

Component(s) Affected

  • Core / Backend (app, agents, config, providers, utils, local_models)
  • Console (frontend web UI)
  • Channels (DingTalk, Feishu, QQ, Discord, iMessage, etc.)
  • Skills
  • CLI
  • Documentation (website)
  • Tests
  • CI/CD
  • Scripts / Deploy

Environment

  • QwenPaw version: 2.2.x
  • OS: Linux (managed Docker container)
  • Install method: Docker (managed platform runtime)
  • Python version (if applicable): 3.11

Steps to Reproduce

  1. Use any session for a while under the default scroll strategy.
  2. Query the history database:
sql
SELECT role, COUNT(*) AS total, COUNT(headline) AS with_headline
FROM conversation_history
GROUP BY role;

Observed:

role        total   with_headline
---------   -----   -------------
assistant     ...            ...      <- headlines present
user          220              0      <- never any headline
  1. (Optional) Force a compression so that a user-only span is evicted, and watch the eviction index: the span has to be labelled by a model call at that moment, and the label is not stored anywhere.

Actual vs Expected

  • Actual: user rows never carry a headline. Evicting a user-only span requires a runtime model call to label it; nothing is persisted, so the work is repeated and the request has no durable anchor in the index.
  • Expected: user rows carry a headline/index entry the same way assistant rows do, so that (a) an evicted user request has a stable anchor, and (b) the eviction path needs no extra model call.

Logs / Screenshots

Not a crash — no error is logged. The evidence is the docstring quoted above plus the query result in Steps to Reproduce.

Additional Notes

Suggested fix: generate and persist a headline/index entry for user messages, rather than falling back to a runtime model call on the eviction path.

Related: #7836 (user turn evicted inside a tool-heavy span), #7733 (long-term context-eviction design).