Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Read-only Libretto workflow for diagnosing live browser state without clicks, typing, navigation, or mutation requests.
.claude/skills/saffron-health-libretto-readonly/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 12% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 13% | 0% |
snapshot and readonly-exec.readonly-exec reuses Libretto's normal execution pipeline, but it only exposes read-only helpers and denies mutating Playwright methods.exec, run, or any direct Playwright action that could change browser or application state.snapshot first when the visible page state is unclear.readonly-exec for focused inspection: titles, HTML, locator text, counts, visibility checks, and GET requests.readonly-exec commands at the same time.connectconnect to attach to an existing CDP endpoint for a preserved browser session.--read-only when creating the Libretto session handle for a preserved browser session.bashlibretto connect http://127.0.0.1:9222 --read-only --session failed-job-debug
pagespages when a popup, new tab, or second page exists.readonly-exec or snapshot complains about multiple pages, list ids first and then pass --page.bashlibretto pages --session failed-job-debug
snapshotsnapshot as the first high-level observation tool.snapshot <ref> to inspect a subtree from the latest full snapshot.readonly-execreadonly-exec for narrow inspection code only.ReadonlyExecDenied: ....page — a read-only Playwright Page proxy. Standard Playwright read methods work normally (url(), title(), content(), frames(), getByRole(), locator(), textContent(), isVisible(), count(), scrollIntoViewIfNeeded(), etc.). frames() returns read-only Frame proxies, including from childFrames() and parentFrame(). Anything that mutates a page or frame (click, fill, goto, evaluate, keyboard, mouse) is blocked.state — the current Libretto session state object.get(url, options?) — HTTP client restricted to GET and HEAD requests. Replaces fetch, which is blocked in readonly mode. Any request with a body or a non-GET/HEAD method throws ReadonlyExecDenied.scrollBy(deltaX, deltaY) — scroll the viewport by pixel offset. Use this to inspect content below the fold without targeting a specific element.Standard JS globals console, URL, Buffer, setTimeout, and setInterval are also available.
bashlibretto readonly-exec "return page.url()" --session failed-job-debug libretto readonly-exec "return await page.getByRole('heading').first().textContent()" --session failed-job-debug libretto readonly-exec "return await page.frames()[1]?.getByRole('heading').textContent()" --session failed-job-debug # HTTP GET inspection echo "const r = await get('https://api.example.com/status'); return await r.json()" \ | libretto readonly-exec - --session failed-job-debug # Scroll down to inspect below-the-fold content libretto readonly-exec "await scrollBy(0, 500)" --session failed-job-debug
closeclose when the inspection session is no longer needed, unless the user explicitly asks to keep the browser open.bashlibretto close --session failed-job-debug
Other measured skills in the registry, with their headline benchmark lift.