From f93078720050c4ddb5b9d93f2821c4e3b728fd5b Mon Sep 17 00:00:00 2001 From: Michael Chihlas Date: Fri, 24 Apr 2026 03:00:04 -0400 Subject: [PATCH] =?UTF-8?q?feat(pilot):=20TemplateMatchPanel=20=E2=80=94?= =?UTF-8?q?=20explicit=20'I=20ran=20this'=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generate and Copy alone don't declare a run — the engineer can walk away after copying. Phase 9 §5 defines an explicit run-declaration affordance so applied_at only stamps on the engineer's positive commitment. Wiring from AssistantChatPage lands in Task 13. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../pilot/script/TemplateMatchPanel.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/pilot/script/TemplateMatchPanel.tsx b/frontend/src/components/pilot/script/TemplateMatchPanel.tsx index 142be724..deae0ad2 100644 --- a/frontend/src/components/pilot/script/TemplateMatchPanel.tsx +++ b/frontend/src/components/pilot/script/TemplateMatchPanel.tsx @@ -28,6 +28,9 @@ interface TemplateMatchPanelProps { fix: SessionSuggestedFix sessionId: string onClose: () => void + /** Fires when the engineer declares the script was run. Parent calls + * applyFix() to stamp applied_at. */ + onMarkRun?: () => void } interface ParamSchemaEntry { @@ -39,7 +42,7 @@ interface ParamSchemaEntry { options?: Array<{ label: string; value: string }> } -export function TemplateMatchPanel({ fix, sessionId, onClose }: TemplateMatchPanelProps) { +export function TemplateMatchPanel({ fix, sessionId, onClose, onMarkRun }: TemplateMatchPanelProps) { const [template, setTemplate] = useState(null) const [templateLoading, setTemplateLoading] = useState(true) const [templateError, setTemplateError] = useState(null) @@ -243,6 +246,16 @@ export function TemplateMatchPanel({ fix, sessionId, onClose }: TemplateMatchPan > Edit parameters + {onMarkRun && ( + + )} )}