Obscura is a headless browser engine written from scratch in Rust. It embeds V8 and speaks the Chrome DevTools Protocol, so Puppeteer and Playwright scripts connect by changing one endpoint, and it ships an MCP server with 37 tools. The headline numbers (about 30 MB per process, about 85 ms per page load) come from the project's own benchmarks; it passes 83.3% of its core WPT subtests, and long-tail CSS and some Web APIs still differ from Chromium.
The biggest problem when an agent enters CI is approval: no TTY, nobody to click approve. The five reference projects converge on two strategies — delegate permission decisions to the calling program (claude-code's control protocol), or replace approval semantics entirely (codex defaults to Never plus sandboxing, opencode auto-rejects). looplane keeps one AgentRunner loop and injects a different ApprovalPolicy: headless uses HeadlessApprovalPolicy, which never reads stdin so it cannot hang the pipeline, and denies EXECUTE by default — fail closed.
claude -p turns Claude Code from an interactive terminal session into a command you can embed in scripts and CI: pipe data in, get structured JSON out with --output-format json, and skip most auto-discovery with --bare. This post focuses on CLI usage, then covers the four signals that mean it's time to switch to the Python or TypeScript Agent SDK.