fix(background-review): preserve gateway prompt context

This commit is contained in:
Quark Assistant 2026-08-02 12:08:50 -05:00 committed by kshitij
parent 177f1d7c53
commit 857926cceb
2 changed files with 49 additions and 0 deletions

View File

@ -745,6 +745,13 @@ def _run_review_in_thread(
# _cached_system_prompt below.
if not _routed:
_fork_kwargs["reasoning_config"] = getattr(agent, "reasoning_config", None)
# Gateway session context is appended to the parent's cached
# system prompt at API-call time through this field. Preserve
# it on same-model forks so the complete effective system
# prompt remains byte-identical and can reuse the warm prefix.
_fork_kwargs["ephemeral_system_prompt"] = getattr(
agent, "ephemeral_system_prompt", None
)
review_agent = AIAgent(
model=_rt.get("model") or agent.model,
max_iterations=16,

View File

@ -33,6 +33,9 @@ def _make_agent_stub(agent_cls):
"PARENT-SYSTEM-PROMPT-BYTES — must be inherited verbatim "
"for prefix-cache parity"
)
agent.ephemeral_system_prompt = (
"WebUI session context:\n- Pinned per-request gateway context"
)
import datetime as _dt
agent.session_start = _dt.datetime(2026, 1, 1, 12, 0, 0)
agent._MEMORY_REVIEW_PROMPT = "review memory"
@ -88,6 +91,7 @@ def _make_recorder_class(captured=None, record_on_run=()):
self.suppress_status_output = None
self.session_start = None
self.session_id = None
self.ephemeral_system_prompt = kwargs.get("ephemeral_system_prompt")
def run_conversation(self, *args, **kwargs):
if captured is not None:
@ -152,6 +156,44 @@ def test_review_fork_inherits_parent_cached_system_prompt():
)
def test_review_fork_inherits_parent_ephemeral_system_prompt():
"""The fork must send the parent's complete effective system prompt.
Gateway session context is appended through ``ephemeral_system_prompt`` at
API-call time, outside ``_cached_system_prompt``. Copying only the cached
base therefore makes every background review diverge at the gateway block
and miss the parent's warm prefix cache.
"""
import run_agent
agent = _make_agent_stub(run_agent.AIAgent)
captured = {}
_Recorder = _make_recorder_class(
captured,
record_on_run=("_cached_system_prompt", "ephemeral_system_prompt"),
)
with patch.object(run_agent, "AIAgent", _Recorder), \
patch("threading.Thread", _SyncThread):
agent._spawn_background_review(
messages_snapshot=[],
review_memory=True,
review_skills=False,
)
parent_effective = (
getattr(agent, "_cached_system_prompt")
+ "\n\n"
+ getattr(agent, "ephemeral_system_prompt")
).strip()
fork_effective = (
captured["_cached_system_prompt"]
+ "\n\n"
+ captured["ephemeral_system_prompt"]
).strip()
assert fork_effective == parent_effective
def test_review_fork_pins_session_start_and_session_id():
"""Defensive complement to cached-system-prompt inheritance.