gemini-worker — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited gemini-worker (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Send a prompt to Gemini via browser and return the response.
browser-start.js, browser-nav.js, browser-eval.js, browser-screenshot.jsprompt: string # The text to send to Gemini
task_type: string # qa | summary | translation | rewrite | extraction | comparison | brainstorming | analysisAlways output this JSON block first:
{
"site": "gemini",
"task_type": "<task_type>",
"status": "success | partial | error",
"answer": "<extracted response text>",
"retry_count": 0,
"elapsed_ms": 0,
"error_reason": null
}Then follow with a short human-readable summary (2–3 sentences max).
node ~/.pi/agent/skills/local-browser-tools/browser-start.jsExpected: ✓ Chrome already running on :9222 or ✓ Chrome started on :9222
If fails: return error status, stop.
node ~/.pi/agent/skills/local-browser-tools/browser-nav.js https://gemini.google.com/appAfter navigation, take a screenshot and verify:
If a full-page login form appears with no input box: return error status, stop.
Try selectors in this order until one works:
[aria-label="Enter a prompt for Gemini"][contenteditable="true"][role="textbox"]div.ql-editorUse browser-eval.js to check:
!!document.querySelector('[aria-label="Enter a prompt for Gemini"]')If no selector works after 3 attempts: trigger retry.
(function() {
const input = document.querySelector('[aria-label="Enter a prompt for Gemini"]')
|| document.querySelector('[contenteditable="true"][role="textbox"]')
|| document.querySelector('div.ql-editor');
if (!input) return "NOT_FOUND";
input.focus();
input.textContent = "";
input.textContent = PROMPT_TEXT;
input.dispatchEvent(new Event("input", { bubbles: true }));
return input.textContent;
})()Verify returned value matches the intended prompt. If mismatch: retry.
Try send button selectors in this order — use aria-label only, not class (Angular dynamic classes like ng-tns-* are unreliable):
Array.from(document.querySelectorAll('button')).find(b => b.getAttribute('aria-label') === 'Send message')?.click()Array.from(document.querySelectorAll('button')).find(b => b.getAttribute('aria-label')?.includes('Send'))?.click()If both selectors return undefined, fallback to pressing Enter on the focused input element: document.querySelector('[contenteditable]')?.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true }))
After sending, take a screenshot to confirm the message appears in the chat.
Poll every 3 seconds, maximum 120 seconds total. Do NOT use fixed sleep.
Spinner selectors are unreliable — both match static elements on the page. Use response length stability as the primary completion signal:
document.querySelector('model-response')?.innerText?.trim()?.lengthIf 120 seconds pass with no stable response: trigger retry.
(function() {
// Get all Gemini response containers
const responseEls = document.querySelectorAll('model-response, .model-response-text, [data-response-id]');
if (responseEls.length > 0) {
return responseEls[responseEls.length - 1].innerText?.trim();
}
// Fallback: find last message block that is not the user bubble
const allMessages = document.querySelectorAll('.conversation-container p, .response-content p');
if (allMessages.length > 0) {
return Array.from(allMessages).map(el => el.innerText).join('\n').trim();
}
return "EXTRACTION_FAILED";
})()Validate the result:
If validation fails: trigger retry.
https://gemini.google.com/app before retryingstatus: "error" with error_reason explaining which step failedScreenshot shows spinner still spinning → keep waiting, do not extract yet
Screenshot shows "Sign in" button only (no input box) → full login wall, return error
Screenshot shows input box + "Sign in" button → guest mode, proceed normally
Extracted text is empty or equals prompt → extraction failed, retryGoogle frequently updates Gemini's DOM. If a selector stops working:
browser-eval.js to list all [contenteditable] and button elements on the pagearia-label, role, or visible text{
"site": "gemini",
"task_type": "qa",
"status": "success",
"answer": "TEST-123",
"retry_count": 0,
"elapsed_ms": 18400,
"error_reason": null
}Summary: Gemini responded successfully in 18.4 seconds. Answer: "TEST-123".
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.