diff --git a/.agents/skills/impeccable/reference/live.md b/.agents/skills/impeccable/reference/live.md index 766f9c06c..4fd031421 100644 --- a/.agents/skills/impeccable/reference/live.md +++ b/.agents/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.agents/skills/impeccable/scripts/live-browser.js b/.agents/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.agents/skills/impeccable/scripts/live-browser.js +++ b/.agents/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.claude/skills/impeccable/reference/live.md b/.claude/skills/impeccable/reference/live.md index 894fd86a1..a0e69f315 100644 --- a/.claude/skills/impeccable/reference/live.md +++ b/.claude/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.claude/skills/impeccable/scripts/live-browser.js b/.claude/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.claude/skills/impeccable/scripts/live-browser.js +++ b/.claude/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.cursor/skills/impeccable/reference/live.md b/.cursor/skills/impeccable/reference/live.md index dd5fcd9fc..84bfd823b 100644 --- a/.cursor/skills/impeccable/reference/live.md +++ b/.cursor/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.cursor/skills/impeccable/scripts/live-browser.js b/.cursor/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.cursor/skills/impeccable/scripts/live-browser.js +++ b/.cursor/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.gemini/skills/impeccable/reference/live.md b/.gemini/skills/impeccable/reference/live.md index e868514b3..54fb1ad43 100644 --- a/.gemini/skills/impeccable/reference/live.md +++ b/.gemini/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.gemini/skills/impeccable/scripts/live-browser.js b/.gemini/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.gemini/skills/impeccable/scripts/live-browser.js +++ b/.gemini/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.github/skills/impeccable/reference/live.md b/.github/skills/impeccable/reference/live.md index d7185b7ea..1794cad05 100644 --- a/.github/skills/impeccable/reference/live.md +++ b/.github/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.github/skills/impeccable/scripts/live-browser.js b/.github/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.github/skills/impeccable/scripts/live-browser.js +++ b/.github/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.kiro/skills/impeccable/reference/live.md b/.kiro/skills/impeccable/reference/live.md index 346288d00..c67d15b00 100644 --- a/.kiro/skills/impeccable/reference/live.md +++ b/.kiro/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.kiro/skills/impeccable/scripts/live-browser.js b/.kiro/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.kiro/skills/impeccable/scripts/live-browser.js +++ b/.kiro/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.opencode/skills/impeccable/reference/live.md b/.opencode/skills/impeccable/reference/live.md index f1de2bebc..88aba8379 100644 --- a/.opencode/skills/impeccable/reference/live.md +++ b/.opencode/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.opencode/skills/impeccable/scripts/live-browser.js b/.opencode/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.opencode/skills/impeccable/scripts/live-browser.js +++ b/.opencode/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.pi/skills/impeccable/reference/live.md b/.pi/skills/impeccable/reference/live.md index a38c3f2c9..70c3cfd2b 100644 --- a/.pi/skills/impeccable/reference/live.md +++ b/.pi/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.pi/skills/impeccable/scripts/live-browser.js b/.pi/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.pi/skills/impeccable/scripts/live-browser.js +++ b/.pi/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.rovodev/skills/impeccable/reference/live.md b/.rovodev/skills/impeccable/reference/live.md index 0a9be8b16..ddafdfd44 100644 --- a/.rovodev/skills/impeccable/reference/live.md +++ b/.rovodev/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.rovodev/skills/impeccable/scripts/live-browser.js b/.rovodev/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.rovodev/skills/impeccable/scripts/live-browser.js +++ b/.rovodev/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.trae-cn/skills/impeccable/reference/live.md b/.trae-cn/skills/impeccable/reference/live.md index 25ce29189..a4ad290c4 100644 --- a/.trae-cn/skills/impeccable/reference/live.md +++ b/.trae-cn/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.trae-cn/skills/impeccable/scripts/live-browser.js b/.trae-cn/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.trae-cn/skills/impeccable/scripts/live-browser.js +++ b/.trae-cn/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/.trae/skills/impeccable/reference/live.md b/.trae/skills/impeccable/reference/live.md index 8791ab55b..970b528c7 100644 --- a/.trae/skills/impeccable/reference/live.md +++ b/.trae/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/.trae/skills/impeccable/scripts/live-browser.js b/.trae/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/.trae/skills/impeccable/scripts/live-browser.js +++ b/.trae/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) + diff --git a/source/skills/impeccable/reference/live.md b/source/skills/impeccable/reference/live.md index e836d7c57..69240cfb6 100644 --- a/source/skills/impeccable/reference/live.md +++ b/source/skills/impeccable/reference/live.md @@ -58,7 +58,9 @@ Speed matters — the user is watching a spinner. Minimize tool calls by using t ### 1. Read the screenshot (if present) -When the browser captured the element successfully, `event.screenshotPath` is an absolute path to a PNG showing the element as rendered, including any comment pins and drawn strokes the user placed before Go. **Read it before planning.** Annotations encode user intent not recoverable from `element.outerHTML` alone. +`event.screenshotPath` is **only sent when the user placed at least one comment or stroke before Go.** When present, it's an absolute path to a PNG of the element as rendered with the annotations baked in. **Read it before planning** — annotations encode user intent not recoverable from `element.outerHTML` alone. + +When `screenshotPath` is absent, don't ask for one and don't go looking for the current rendering. The omission is deliberate: without annotations, a screenshot would anchor the model on the existing design and fight the three-distinct-directions brief. Work from `element.outerHTML`, the computed styles in `event.element`, and the freeform prompt if present. `event.comments` and `event.strokes` carry structured metadata alongside the visual. Treat the screenshot as primary; use the structured data for specifics worth quoting (e.g. the exact text of a comment). diff --git a/source/skills/impeccable/scripts/live-browser.js b/source/skills/impeccable/scripts/live-browser.js index 66efd7243..32ea9a191 100644 --- a/source/skills/impeccable/scripts/live-browser.js +++ b/source/skills/impeccable/scripts/live-browser.js @@ -2548,7 +2548,12 @@ if (blob && state === 'GENERATING') { showShaderOverlay(el, blob, rect); } - if (blob) { + // Only upload + forward the screenshot when annotations (comments/strokes) + // are present. Without annotations the image is pure visual anchoring — + // it biases the model toward the current rendering and works against the + // three-distinct-directions brief. + const hasAnnotations = snapshot && (snapshot.comments.length > 0 || snapshot.strokes.length > 0); + if (blob && hasAnnotations) { try { const uploadRes = await fetch( 'http://localhost:' + PORT + '/annotation?token=' + encodeURIComponent(TOKEN) +