[Bug]: user rows carry no headline — the scroll eviction index has to call the model to label a user-only span
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:
- Evicting a user-only span costs an extra model call on the eviction path; the resulting label is not persisted and cannot be reused.
- 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
- Use any session for a while under the default
scrollstrategy. - Query the history database:
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- (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).
Source: agentscope-ai/QwenPaw