pbakaus/impeccable · warning
[impeccable] The helper already answered this agent target…
Error message
[impeccable] The helper already answered this agent target; clearing session
What it means
The in-page live-mode helper (live-browser.js) detected that an in-flight session's agent target had already been answered, so it logs this warning, marks the session handled, tears down the session chrome, and shows a toast telling the user to pick a new element. It is a deliberate cleanup path for superseded/stale sessions (abandonSupersededGo), not a crash.
Solutions
- No action needed for correctness: the stale session is auto-cleared; pick an element again to start a fresh session per the toast.
- If it recurs on every request, reload the page to resync page-side session state with the helper.
- If it is caused by client retries, check the agent/driver for duplicate sends of the same target and remove the retry.
Example fix
// before: driver re-sends for an already-answered target await sendGo(sessionId); await sendGo(sessionId); // after: send once per session, or check handled state first if (!isSessionHandled(sessionId)) await sendGo(sessionId);
Defensive patterns
Strategy: type-guard
Validate before calling
if (isSessionHandled(sessionId) || sessionId !== currentSessionId) return; // skip duplicate send
Type guard
function canSendGo(sessionId) { return sessionId === currentSessionId && !handledSessions.has(sessionId); } Prevention
- Track handled sessions and never send `go` twice for the same sessionId.
- Reload the page after extension/overlay updates to keep session state in sync.
- Treat this warning as informational cleanup, not a bug, unless it fires on every fresh session.
When it happens
Trigger: A `go` (send) response arrives for a sessionId that the helper already resolved for the same agent target — e.g. the agent answered twice, the page reconnected and re-sent for a handled target, or the user re-triggered an element whose session was already completed.
Common situations: Double-clicking or re-invoking a live request on an element that was already processed; a live-mode client retrying after a slow response; the extension/overlay and page state getting out of sync after a reload mid-session.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- ${cap.error}
- Error
- [impeccable] apply returned no verified edits:
- [impeccable] Could not find original element in live DOM.
- [impeccable] Discarding orphaned session
AI-assisted analysis of pbakaus/impeccable@f2c7051853 (2026-09-16).
Data as JSON: /api/errors/191e415876e11292.
Report an issue: GitHub.
Appendix: source
Thrown at skill/scripts/live-browser.js:7837
if (body.error === 'unknown_session' && msg.type === 'checkpoint'
&& msg.id && msg.id === currentSessionId) {
abandonForeignSession(msg.id);
return null;
}
return handleFailure(new Error(body.error || ('HTTP ' + res.status + ' ' + res.statusText)));
}).catch(handleFailure);
if (msg.type === 'generate' || msg.type === 'steer') {
const creation = doSend();
sessionCreationGate = creation.then(() => {}, () => {});
return creation;
}
return sessionCreationGate.then(doSend);
}
function abandonSupersededGo(sessionId) {
if (sessionId !== currentSessionId) return;
console.warn('[impeccable] The helper already answered this agent target; clearing session ' + sessionId + '.');
markSessionHandled();
cleanup({ instantChrome: true });
showToast('The helper already answered this request, so this session was cleared. Pick an element to start fresh.', 6000);
}
let abandonedForeignSessionId = null;
function abandonForeignSession(sessionId) {
if (abandonedForeignSessionId === sessionId || sessionId !== currentSessionId) return;
abandonedForeignSessionId = sessionId;
console.warn('[impeccable] The live server has no record of session ' + sessionId + '; clearing stale local state.');
markSessionHandled();
cleanup({ instantChrome: true });
showToast('A saved live session belonged to a different project, so it was cleared. Pick an element to start fresh.', 6000);
}
function checkpointPayload(reason) {
return {
type: 'checkpoint',View on GitHub (pinned to f2c7051853)