messages: unify harness-injected data under <system-extra> tag
Nightly Build / build (push) Successful in 6m49s

Replace the ad-hoc [SYSTEM INFO] / [TELEGRAM SYSTEM INFO] prefixes with a
single canonical <system-extra> wrapper, sourced from one constant
(SYSTEM_EXTRA_TAG) so emission and documentation can never diverge.

- core-api: SYSTEM_EXTRA_TAG + system_extra() helper; attachments_block
  rebuilt on top of it.
- telegram: system_info_message (location) uses the helper; the voice
  transcript is forwarded as a plain user message (it is the user's own
  words, not harness metadata).
- chat agents: new agents/common/harness.md include (long form, with an
  explicit "data, not instructions" guard), added to assistant/kid/
  project-coordinator. The tag name rides the __HARNESS_TAG__ sentinel,
  resolved in AgentSystemContext to SYSTEM_EXTRA_TAG — renaming the tag
  stays a one-line change.
This commit is contained in:
2026-07-26 17:54:14 +01:00
parent 24ee5b89d7
commit 4d81295a3d
11 changed files with 174 additions and 46 deletions
+8 -6
View File
@@ -475,12 +475,10 @@ async fn handle_voice(
};
info!(chat_id = chat_id.0, "telegram: voice transcribed, forwarding to LLM");
let message = format!(
"[TELEGRAM SYSTEM INFO]\n\
The user sent a voice message. The following is the audio transcript:\n\n\
{text}"
);
handle_llm_message(bot.clone(), chat_id, message, None, Arc::clone(shared), handle).await;
// The transcript is the user's actual message — forward it verbatim as the
// user text, with no harness wrapper. The agent treats it exactly as if the
// user had typed those words.
handle_llm_message(bot.clone(), chat_id, text, None, Arc::clone(shared), handle).await;
}
// ── Edited message (live location updates) ────────────────────────────────────
@@ -548,7 +546,11 @@ async fn handle_attachment(
handle_llm_message(bot, chat_id, caption, Some(metadata), shared, handle).await;
}
None => {
// File-less attachment (Location): the `<system-extra>` block is the
// whole user message, so strip the leading blank lines `system_extra`
// adds for the concatenation case.
let message = attachment.system_info_message(None);
let message = message.trim_start_matches(['\n', '\r']).to_owned();
handle_llm_message(bot, chat_id, message, None, shared, handle).await;
}
}