accounts
무료Manage multiple Claude Code accounts: add, list, check, launch, and install shell aliases for 10+ isolated CLAUDE_CONFIG_DIR profiles.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Jev-driven browser automation: Jev picks operations, programs execute, a text model writes field values only when Jev cannot pick one from the goal.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
Zero-dependency browser harness. Programs read the DOM and execute actions, Jev makes every judgment call, an LLM writes text only when the goal does not already contain the value. Built in-house; no pip or npm packages.
python3 scripts/jev-browser-agent.py \
--url http://127.0.0.1:8000/ \
--goal "Sign in with username alice, choose country Canada, and submit." \
--check-text-contains "Welcome alice" --json-compact
Requires TYPESAFE_API_KEY, Node 22+, and a local Chromium (Playwright cache or CHROME_PATH). Output is one JSON object: status (done|blocked|budget|error), reason, steps, requests, final_url, verify, log (full probability distributions per step), usage.
Measured on a local login form: 5 steps, 7 Jev calls, 1.4 s wall, zero LLM tokens, goal verified.
| Tier | Role | Cost |
|---|---|---|
| Programs (tier 1) | Snapshot DOM, extract goal candidates, execute actions, deterministic checks, secret scrubbing | CPU only |
| Jev (tier 2) | Pick operation + target, pick field value from goal candidates, verify goal | ~$0.042/M tokens, <300 ms |
| LLM (tier 3) | Compose text for TYPE_TEXT only when Jev says no goal candidate fits | Per-token, rare |
One Jev call per decision cycle. Speculative fan-out: operation Choice + per-operation target Choices evaluated in one forward pass. Only the target matching the selected operation executes.
| File | Role |
|---|---|
scripts/lib/jev_browser/snapshot.js | In-page snapshot: viewport-visible controls, labels, values, operations, code-owned node ids, freshness guards |
scripts/lib/jev_browser/cdp_driver.mjs | Node ESM, node: builtins only. Launches Chromium, speaks CDP over the built-in WebSocket, evaluates in an isolated world, serves JSON-lines commands: open, observe, fresh, act, navigate, screenshot, close |
scripts/jev-browser-decide.py | One Jev call: operation + target with speculative fan-out, validated against observed ids |
scripts/jev-browser-verify.py | Independent Jev goal check (goal_met Noul, evidence Score, has_error, page_loaded, evidence_element Choice) plus deterministic url_contains / text_contains checks that veto |
scripts/jev-browser-agent.py | Loop: preflight, observe, scrub, decide, text (secret, Jev pick, LLM), freshness, act, log, verify |
| Flag | Meaning |
|---|---|
--url, --goal | Required. Loopback URLs only unless --allow-remote |
--check-url-contains X, --check-text-contains Y | Deterministic checks that must pass for DONE |
--secret-env LABEL=ENV_VAR | Type the variable's value into fields whose label contains LABEL; unset variable fails preflight. Refused with --allow-remote: name the host with --allow-host so a hostile page cannot collect a secret |
--allow-host HOST | Permit one host and its subdomains (repeatable). Off-origin navigation elsewhere is reverted |
--allow-remote | Permit any host. Page text then reaches Jev and, for composed text, the text model |
--header NAME=ENV_VAR | Send a header on every request with the variable's value (staging bypass tokens). Never logged |
--trace FILE | Write every observed, scrubbed snapshot to FILE |
--headed | Show the browser window |
--max-steps (60), --max-requests (120) | Budgets; requests count Jev calls including text picks and verifies |
--json-compact | Single-line output |
| Env | Meaning |
|---|---|
TYPESAFE_API_KEY | Required |
JEV_KEY_ONLY=1 | Skip the Claude Code plugin toggle check (cron, standalone) |
CHROME_PATH | Chromium binary; default is the newest Playwright cache build |
JEV_BROWSER_SANDBOX=1 | Forbid the --no-sandbox fallback |
TEXT_MODEL (claude-opus-4-6), TEXT_MODEL_BACKEND (auto | api | claude-cli), TEXT_MODEL_BASE_URL (https://api.anthropic.com), TEXT_MODEL_API_KEY (falls back to ANTHROPIC_API_KEY), TEXT_MODEL_REASONING (none) | Tier 3 text model. auto uses the API when a key is set, else claude -p (logged-in CLI, run from /tmp, no tools). Owner prefers opus 4.6 here |
JEV_BROWSER_DEBUG=1 | Enables the driver's debug_eval command for development |
jev-browser-verify.py also opens pages itself:
python3 scripts/jev-browser-verify.py --url http://127.0.0.1:8002/five-star \
--goal "at least 8 promotions can be toggled" --goal "there is a Start button"
python3 scripts/jev-browser-verify.py --audit-file pages.json # {"base": "...", "pages": {"/path": ["goal", ...]}}
One browser per audit, one snapshot per page, one Jev call per goal (~100-200 ms each). passed needs goal_met and evidence score >= 0.5. Same --allow-host, --header, --check-* flags as the agent.
snapshot.js; the driver resolves geometry itself and rejects covered, hidden, disabled, or read-only targets.typeof window.__jevBrowser === "undefined" from the page).--allow-host widens per host. If a click leaves the allowed origin (sign-in redirect, external link), the agent returns to the last good URL, tells Jev which action caused it, and blocks after three such trips.(secret); after a secret is typed, every later snapshot is scrubbed before Jev, the text model, or the log sees it. Password inputs never expose their value ((filled)).scripts/lib/jev_untrusted.py, so it cannot forge a new element row. The text-model prompt wraps page data in <untrusted-page-data> tags after redaction and removes any copy of the tag the page planted. jev_router_common redacts every Jev payload before send.RETRY, bounded by the stall guard), never executed.--allow-host is refused before it is sent; a link with no known host is refused too. Text from the text model over 500 characters is refused, not typed.https (loopback http allowed for tests) and never follows a redirect, so its key stays with the configured host. The Node driver and Chromium get an environment without keys, tokens, or the --secret-env and --header variables.jev-browser-verify.py --url and --audit-file do not send a page to Jev if it redirected off the allowed hosts.--no-sandbox only when Chromium reports "No usable sandbox" (user namespaces disabled). The ready line reports sandbox: true|false.observe runs snapshot.js once. Jev sees that snapshot.act compares page_key + the target's guard (value, enabled state, position, nearby text) for targeted actions, or the page marker for scroll/wait. A stale page returns stale: true; the loop re-observes without a stall penalty, capped at STALE_LIMIT (5).act, so a navigation cannot erase the record.jev-browser-verify.py runs as a separate question set; a rejected DONE goes back into history so Jev re-decides with that evidence. Three rejected DONEs mean BLOCKED.operation_probabilities and target_probabilities.(url, target, label, current value).STALL_LIMIT (3); unavailable blocks at once.LOW_CONFIDENCE (0.45) is not executed; the loop re-observes and counts toward the stall guard.LOW_CONFIDENCE before replacing it.probabilities is the retry after a no-effect action; never sample.observe waits for the DOM to be quiet (600 ms, capped at 3 s) and reports quiet; WAIT pauses 1.5 s then settles up to 8 s; a rejected DONE triggers a WAIT before the next decision. Jev sees page.settled and history notes when content was still changing.offscreen; the driver scrolls them into view. Covered controls (modal backdrop, sticky header) are dropped at snapshot time, so an open modal leaves only its own controls.navigates away to /path or leaves this site, and decide's rules forbid them unless the goal names that page.Order for a TYPE_TEXT target:
--secret-env match on the field label.username X, search for X, numbers).NONE. Accepted at confidence >= 0.5.urllib, no SDK). Strict {"text": "..."} reply.The text model writes one value. It never picks actions or judges progress.
When DOM text cannot identify the target (canvas, charts, icon-only controls, text in images), take a screenshot, ask a Box question for the target plus a "visible?" Noul, and click the box center. Keep deterministic verifiers as the veto. Load references/jev-images.md for the pattern and code; API and limits: images.md.
observe evaluates snapshot.js in the isolated world. Output:
[1] heading Sign in []
[2] textbox Username [CLICK, TYPE_TEXT]
[3] combobox Country (value=USA) [SELECT] options 3:1 USA, 3:2 Canada
[4] checkbox Remember (checked=False) [CLICK]
[5] button Sign in [CLICK]
Plus actions (e2:fill, e3:sel:ca, scroll_down, wait), page_key, guards, marker, and page text (<= 6000 chars).
Gate: snapshot captured and scrubbed. Phase 2.
jev-browser-decide.py returns operation, target, confidence, needs_text, and both probability maps. Invalid targets resolve to BLOCKED. Jev unavailable resolves to BLOCKED with source: unavailable.
Gate: operation and target decided and logged. Phase 3.
(kind, index). Missing action: record, count toward stall.act with the snapshot's page_key, guards, marker. Stale: re-observe.Gate: action executed. Phase 4.
jev-browser-verify.py with deterministic checks. Verified: stop done. Rejected: history entry, re-decide.STALL_LIMIT (3) consecutive non-WAIT actions with an unchanged marker: stop blocked.MAX_STEPS 60, MAX_REQUESTS 120.Gate: loop or stop. Every exit carries reason.
The loop above picks every step with Jev. For tasks longer than a few steps, use checkpoint search: an LLM or the caller sets subgoals, and Jev beam-searches between them (../../meta/building-with-jev/references/composition-patterns.md, Checkpoint search; scripts/jev_search.py). Branching needs a way back to a kept state (re-navigate to the checkpoint URL and replay); count that cost. The agent loop does not run checkpoint search yet. Adopt it only after this eval:
| Arm | Planner | Step picker |
|---|---|---|
| a | LLM plans every step | LLM |
| b | none | Jev picks every step (current loop) |
| c | LLM sets checkpoints | Jev beam search between them |
Apply Jev production rules when you change the decide, text, or verify calls:
python3 scripts/jev-size-probe.py --payload <dumped requests> (2.5–4k tokens via Gateway until measured). Large pages grow the element table: bound it by the priority sort and field limits rather than sending the whole page.Retry-After and retry-after-ms. Never retry 401/402/422.--max-requests.Every Jev failure resolves to BLOCKED or a bounded WAIT retry. Scripts exit 0 with JSON. Preflight fails before Chromium launches on: remote URL without --allow-remote, Jev unavailable, unset secret variable, malformed --secret-env. A failed text tier blocks the run and names the cause in reason. Driver failures return status: error with the Node stderr tail.
| File | Covers |
|---|---|
scripts/tests/test_jev_browser_harness.py | Offline: decide payload/parse, verify parse and veto, agent loop with fake driver (secrets, stale, stall, budget, rejected DONE, Jev-error retry, preflight, scrub) |
scripts/tests/test_jev_browser_live.py | Real Chromium on a loopback fixture: snapshot contract, password masking, isolated world, covered-target rejection, stale guard, select/checkbox/scroll/submit, end-to-end secret scrubbing. Skips without Node + Chromium |
Field-tested on a booking-sim web app (loopback dev server): closes the help modal, selects promotions, picks a mode, starts booking, spins the venue; a three-page audit script runs through --audit-file unchanged.
references/jev-images.md: screenshot and Box locate patterndocs/PHILOSOPHY.md: three execution tiersscripts/jev_router_common.py: validated_call_jev, bound_text, typesafe_available아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Manage multiple Claude Code accounts: add, list, check, launch, and install shell aliases for 10+ isolated CLAUDE_CONFIG_DIR profiles.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Improve architecture across modules by deepening interfaces.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Assessment: read-only inspection, codebase overview, value analysis, health checks, ADR consultation, decision analysis, multi-perspective critique.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Background memory consolidation — overnight review, merge, and injection payload for memory files.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Write, compose, integrate, and improve programs that call Jev, TypeSafe's System One judgment model.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Business operations: strategy, technology, growth, competitive intelligence, support, finance, HR, legal, operations, sales, productivity, product management.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.