summaryrefslogtreecommitdiff
path: root/makima/src/orchestration/directive.rs
diff options
context:
space:
mode:
Diffstat (limited to 'makima/src/orchestration/directive.rs')
-rw-r--r--makima/src/orchestration/directive.rs52
1 files changed, 51 insertions, 1 deletions
diff --git a/makima/src/orchestration/directive.rs b/makima/src/orchestration/directive.rs
index 7dbfe65..1e004bf 100644
--- a/makima/src/orchestration/directive.rs
+++ b/makima/src/orchestration/directive.rs
@@ -56,7 +56,21 @@ impl DirectiveOrchestrator {
"Directive needs planning — spawning planning task"
);
- let plan = build_planning_prompt(&directive, &[], 1, &[], None);
+ // If the contract has previously-merged revisions, this is an
+ // amendment — pass the latest merged revision so the planner can
+ // reason about the delta instead of replanning from scratch.
+ let prev_merged = repository::get_latest_merged_revision(&self.pool, directive.id)
+ .await
+ .unwrap_or(None);
+
+ let plan = build_planning_prompt(
+ &directive,
+ &[],
+ 1,
+ &[],
+ None,
+ prev_merged.as_ref(),
+ );
if let Err(e) = self
.spawn_orchestrator_task(
@@ -484,12 +498,20 @@ impl DirectiveOrchestrator {
let progress_summary =
summarize_in_progress_steps(&existing_steps);
+ // If the contract has previously-merged revisions, this is an
+ // amendment — pass the latest merged revision so the planner
+ // sees the BEFORE→AFTER diff for the new PR.
+ let prev_merged = repository::get_latest_merged_revision(&self.pool, directive.id)
+ .await
+ .unwrap_or(None);
+
let plan = build_planning_prompt(
&directive,
&existing_steps,
generation,
&goal_history,
progress_summary.as_deref(),
+ prev_merged.as_ref(),
);
if let Err(e) = self
@@ -1475,9 +1497,37 @@ fn build_planning_prompt(
generation: i32,
goal_history: &[crate::db::models::DirectiveGoalHistory],
progress_summary: Option<&str>,
+ previous_merged_revision: Option<&crate::db::models::DirectiveRevision>,
) -> String {
let mut prompt = String::new();
+ // Amendments to a previously-shipped contract. When the user edits a
+ // contract whose prior revision was already merged, the planner needs to
+ // reason about the BEFORE→AFTER diff so the new PR reflects only the
+ // intended delta, not a from-scratch reinterpretation.
+ if let Some(prev) = previous_merged_revision {
+ prompt.push_str("── AMENDMENT TO A PREVIOUSLY-MERGED CONTRACT ──\n");
+ prompt.push_str(&format!(
+ "This contract was previously shipped via PR {} (revision v{}, frozen {}). \
+ The user has now edited the contract to amend or extend that work. \
+ Plan the new PR as a DELTA on top of the merged prior PR, not a fresh build.\n\n",
+ prev.pr_url,
+ prev.version,
+ prev.frozen_at.format("%Y-%m-%d %H:%M:%S UTC"),
+ ));
+ prompt.push_str("PREVIOUSLY-MERGED CONTRACT (frozen content):\n");
+ prompt.push_str(&prev.content);
+ prompt.push_str("\n\nAMENDED CONTRACT (what the user wants now):\n");
+ prompt.push_str(&directive.goal);
+ prompt.push_str(
+ "\n\nIMPORTANT:\n\
+ - Identify what CHANGED between the previously-merged contract and the amended one.\n\
+ - Keep work that already shipped — only plan the delta.\n\
+ - The amended PR should land on top of master containing JUST the additions/edits \
+ implied by the diff, not a re-implementation of the original contract.\n\n",
+ );
+ }
+
if let Some(progress) = progress_summary {
let trimmed = progress.trim();
if !trimmed.is_empty() {