feat(agent): the transcript on by default

First landed flag-gated: the mechanics were unproven at coding-traffic
scale and the view changes what the model sees past the budget. The
claw then ran every surface on it and nothing fell over, the only user
is the deployment's own, and the sessions most likely to hit the
budget were the ones least likely to find a flag. Below the budget the
decorator is a pass-through, so the default's only always-on cost is
the zoom spec in the prompt.

transcript: None is the off switch; rhema-code spells it
--no-transcript, the claw's transcript: false now writes the resolved
value so false still means off. Saved sessions view fine: the log
stays complete and the view derives per request. The system preview
names zoom too, so what is previewed is what turns send.
This commit is contained in:
vhaudiquet committed 2026-10-20 06:01:24 +02:00
1 parent 50b8feba07
commit 60f3b5eb9b
3 files changed
+15 -12

No files matched your search

+3 -4
View File
@@ -280,10 +280,9 @@ pub struct ClawConfig {
pub listen: Option<String>, pub listen: Option<String>,
/// The bounded request view over the claw's sessions — past a byte /// The bounded request view over the claw's sessions — past a byte
/// budget, older messages summarize into lines the agent's `zoom` /// budget, older messages summarize into lines the agent's `zoom`
/// tool can open. On when unset; `transcript: false` sends the /// tool can open. On when unset, matching the coding agent's
/// whole history every step, as the coding agent does by default. /// default; `transcript: false` sends the whole history every
/// The claw turns it on because its chats and coding jobs never end /// step.
/// by design: a stashed session only ever grows.
pub transcript: Option<bool>, pub transcript: Option<bool>,
/// Bearer token for the `/v1` routes. Unset means the surface is /// Bearer token for the `/v1` routes. Unset means the surface is
/// open on its interface; set it when the port is reachable from /// open on its interface; set it when the port is reachable from
+5 -3
View File
@@ -234,9 +234,11 @@ impl ClawHandler {
/// the view its history would ride whole on every step. /// the view its history would ride whole on every step.
fn agent_config(&self, model: &str, workspace: &Path) -> CodingAgentConfig { fn agent_config(&self, model: &str, workspace: &Path) -> CodingAgentConfig {
let mut config = CodingAgentConfig::new(model, workspace); let mut config = CodingAgentConfig::new(model, workspace);
if self.transcript { // Write the resolved value, not an override: the coding agent's
config.transcript = Some(rhema_transcript::TranscriptSettings::default()); // own default is on now, and the config's `false` must win.
} config.transcript = self
.transcript
.then(rhema_transcript::TranscriptSettings::default);
config config
} }
+7 -5
View File
@@ -200,11 +200,13 @@ impl CodingJobHandler {
let (provider, model) = self.backends.current(); let (provider, model) = self.backends.current();
let mut config = CodingAgentConfig::new(model, &workspace); let mut config = CodingAgentConfig::new(model, &workspace);
config.max_turn_steps = self.max_turn_steps; config.max_turn_steps = self.max_turn_steps;
if self.transcript { // A job's stashed session carries across runs and only ever
// A job's stashed session carries across runs and only ever // grows; the view is what keeps a repeat run's steps cheap.
// grows; the view is what keeps a repeat run's steps cheap. // Write the resolved value, not an override: the coding agent's
config.transcript = Some(rhema_transcript::TranscriptSettings::default()); // own default is on now, and the config's `false` must win.
} config.transcript = self
.transcript
.then(rhema_transcript::TranscriptSettings::default);
let stashed = self let stashed = self
.store .store
.session(&instance_name) .session(&instance_name)