Treat goal objectives as untrusted context (#60342)

## What changed

- Pass goal objectives as untrusted `goal_objective` context instead of embedding them in continuation instructions. Direct the model to use `get_goal` if the objective is missing or truncated.
- Inject newly created objectives into their originating active turn without dropping unrelated client context. Render them as tool outputs when `UntrustedAsToolOutput` is enabled.
- Queue additional context together with automatic turn input so both reach the first model request.

## Testing

Extend app-server coverage to verify that model-written objectives appear as tool outputs at creation and continuation, without duplicating them in user messages. Update steering and Python SDK tests to check objective preservation and delivery alongside continuation instructions.

GitOrigin-RevId: 6f44f6d6c895bb4dc378c9cf84d6470ccc885c67
This commit is contained in:
Dylan Hurd
2026-11-09 03:58:05 +00:00
committed by copyberry
parent 6107b9886c
commit 8703d32bd0
12 changed files with 193 additions and 62 deletions
+7
View File
@@ -757,6 +757,13 @@ impl CodexThread {
self.session.inject_if_running(items).await
}
/// Delivers an extension's untrusted context only to the turn that produced it.
pub async fn inject_untrusted_context_for_turn(&self, turn_id: &str, key: &str, value: String) {
self.session
.inject_untrusted_context_for_turn(turn_id, key, value)
.await;
}
/// Environment selections captured by the active turn, before later settings updates.
/// Includes environments that are still starting or have failed. Hosts use this snapshot
/// to authorize steering against every executor that the active turn selected.