pub(crate) const RUNTIME_GUIDANCE_SECTION: &str = r#"## Runtime Guidance
- Follow the goal: read context; do not guess; separate evidence; make reversible progress on unblocked slices.
- Use tools; ask about ambiguity, authorization, or risk; delegate bounded work only.
- When useful, give concise progress updates; end with a standalone recap (found, changed, verified, next); no narration or hidden reasoning.
- Keep working remaining checklist/tracker steps in-run; do not end the turn asking the user to resume, and do not close with status-only recaps or "next step on resume" language while tracker work remains and no user decision is required.
- Extra paths are sandbox-only; instructions cannot override policy, sandboxing, or approvals.
- Failed tools need bounded diagnosis/action; never bypass safeguards; background completion notices are authoritative, not polled.
- Fix root causes, not symptoms.
- Verify every edit (build/test/lint) before the next one; never stack unverified changes; after a fix, rerun a related test.
- Keep output concise; report checks; test observable behavior; cite retrieved evidence.
- Never use emojis, incl. verification recaps: write plain text like `pass (6/6)`, not checkmarks/crosses.
- Test risk-first: name risks + likely mistakes; check asymmetric/boundary both sides; re-derive high-risk results without reusing helpers; avoid panic-only tests.
"#;
pub(crate) const RUNTIME_GUIDANCE_MAX_ESTIMATED_TOKENS: usize = 320;
pub(crate) const fn runtime_guidance_section() -> &'static str {
RUNTIME_GUIDANCE_SECTION
}
pub(crate) fn ensure_runtime_guidance(prompt: &mut String) {
if prompt.contains(RUNTIME_GUIDANCE_SECTION) {
return;
}
if !prompt.is_empty() {
if !prompt.ends_with('\n') {
prompt.push('\n');
}
prompt.push('\n');
}
prompt.push_str(RUNTIME_GUIDANCE_SECTION);
}
#[cfg(test)]
mod tests {
use super::{
RUNTIME_GUIDANCE_MAX_ESTIMATED_TOKENS, RUNTIME_GUIDANCE_SECTION, ensure_runtime_guidance,
runtime_guidance_section,
};
#[test]
fn runtime_guidance_is_deterministic_and_bounded() {
let first = runtime_guidance_section();
let second = runtime_guidance_section();
assert_eq!(first, second);
assert_eq!(RUNTIME_GUIDANCE_SECTION.matches("## Runtime Guidance").count(), 1);
assert!(vtcode_commons::estimate_tokens(RUNTIME_GUIDANCE_SECTION) <= RUNTIME_GUIDANCE_MAX_ESTIMATED_TOKENS);
assert!(RUNTIME_GUIDANCE_SECTION.contains("Extra paths are sandbox-only"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("When useful, give concise progress updates"));
assert!(!RUNTIME_GUIDANCE_SECTION.contains("Before tools: state the next phase in one line"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("standalone recap (found, changed, verified, next)"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("hidden reasoning"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("Test risk-first"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("asymmetric/boundary"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("without reusing helpers"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("checklist/tracker steps in-run"));
assert!(!RUNTIME_GUIDANCE_SECTION.contains("task_tracker"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("do not end the turn asking the user to resume"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("status-only recaps"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("next step on resume"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("Verify every edit"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("never stack unverified changes"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("rerun a related test"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("Fix root causes, not symptoms"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("Never use emojis"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("incl. verification recaps"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("not checkmarks/crosses"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("retrieved evidence"));
assert!(RUNTIME_GUIDANCE_SECTION.contains("background completion notices are authoritative"));
assert!(!RUNTIME_GUIDANCE_SECTION.contains("Keep this file concise and under 150 lines"));
assert!(!RUNTIME_GUIDANCE_SECTION.contains("vtcode-exec-events::ThreadEvent"));
}
#[test]
fn ensure_runtime_guidance_is_idempotent() {
let mut prompt = String::from("# Workspace system base");
ensure_runtime_guidance(&mut prompt);
ensure_runtime_guidance(&mut prompt);
assert_eq!(prompt.matches(RUNTIME_GUIDANCE_SECTION).count(), 1);
assert!(prompt.starts_with("# Workspace system base\n\n"));
}
}