From 93e784a3ed7fa80fa85c8cdcb388ff77a0a40e1f Mon Sep 17 00:00:00 2001 From: Hare Date: Fri, 14 Aug 2026 14:02:01 +0900 Subject: [PATCH] prompt: route source assertions through effective catalog --- crates/manifest/src/profile.rs | 15 --------------- .../src/feature/builtin/worker_observation.rs | 7 +++---- crates/worker/src/prompt/catalog.rs | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/crates/manifest/src/profile.rs b/crates/manifest/src/profile.rs index b830eb5c..65b8d99c 100644 --- a/crates/manifest/src/profile.rs +++ b/crates/manifest/src/profile.rs @@ -1457,21 +1457,6 @@ mod tests { assert!(reviewer.compaction.is_some()); } - #[test] - fn orchestrator_role_keeps_review_routing_owned_by_coder() { - let prompt = include_str!("../../../resources/prompts/role/orchestrator.md"); - - assert!(prompt.contains("assigned Coder owns its review/fix loop")); - assert!(prompt.contains("then use `SpawnTicketCoder`")); - assert!(prompt.contains("verify its current assignment names that Coder")); - assert!(prompt.contains("never route implementation to an unassigned Coder")); - assert!(prompt.contains( - "Do not spawn, restore, assign, or route work to Backend/Runtime Reviewer Workers" - )); - assert!(prompt.contains("never compensate by creating an independent Reviewer Worker")); - assert!(!prompt.contains("sibling Coder/Reviewer Workers")); - } - #[test] fn profile_resolution_requires_runtime_worker_name() { let tmp = TempDir::new().unwrap(); diff --git a/crates/worker/src/feature/builtin/worker_observation.rs b/crates/worker/src/feature/builtin/worker_observation.rs index b7186ff4..376c31ce 100644 --- a/crates/worker/src/feature/builtin/worker_observation.rs +++ b/crates/worker/src/feature/builtin/worker_observation.rs @@ -24,9 +24,6 @@ const MAX_PAGE_LIMIT: usize = 100; const MAX_READ_BYTES: usize = 16 * 1024; const OBSERVATION_INSTRUCTION_ID: &str = "worker-observation.policy"; const OBSERVATION_PROMPT_REF: &str = "common.worker_observation"; -#[cfg(test)] -const OBSERVATION_PROMPT_SOURCE: &str = - include_str!("../../../../../resources/prompts/common/worker-observation.md"); fn observation_instruction() -> FeatureInstructionDeclaration { FeatureInstructionDeclaration::new( @@ -801,6 +798,8 @@ mod tests { #[test] fn prompt_source_names_the_worker_observation_contract() { + let catalog = crate::PromptCatalog::builtins_only().unwrap(); + let source = &catalog.projection().templates["common.worker_observation"]; for token in [ "ListWorkerSessions", "ViewSessionOverview", @@ -808,7 +807,7 @@ mod tests { "ReadSessionEntry", "SessionEntryRef", ] { - assert!(OBSERVATION_PROMPT_SOURCE.contains(token), "missing {token}"); + assert!(source.contains(token), "missing {token}"); } } diff --git a/crates/worker/src/prompt/catalog.rs b/crates/worker/src/prompt/catalog.rs index f3480cbc..0b874567 100644 --- a/crates/worker/src/prompt/catalog.rs +++ b/crates/worker/src/prompt/catalog.rs @@ -595,6 +595,21 @@ mod tests { ); } + #[test] + fn orchestrator_role_keeps_review_routing_owned_by_coder() { + let catalog = PromptCatalog::builtins_only().unwrap(); + let prompt = &catalog.projection.templates["role.orchestrator"]; + assert!(prompt.contains("assigned Coder owns its review/fix loop")); + assert!(prompt.contains("then use `SpawnTicketCoder`")); + assert!(prompt.contains("verify its current assignment names that Coder")); + assert!(prompt.contains("never route implementation to an unassigned Coder")); + assert!(prompt.contains( + "Do not spawn, restore, assign, or route work to Backend/Runtime Reviewer Workers" + )); + assert!(prompt.contains("never compensate by creating an independent Reviewer Worker")); + assert!(!prompt.contains("sibling Coder/Reviewer Workers")); + } + #[test] fn existing_internal_prompt_render_contracts_are_preserved() { let catalog = PromptCatalog::builtins_only().unwrap();