--- id: "c1cd05ec-d58c-435d-b496-a4079c195cf7" name: "Decision-Model Fast Path" micro_summary: "Hands multi-step public navigation to the decision-model loop while the agent keeps text, verification and the answer." status: "in_progress" see_also: [] scope: "When and how a browser-harness agent hands multi-step page navigation to the decision-model loop (`ultrafast_browser.run_task`), and what it does with each return. Owns these operating rules; exact arguments and return fields live in the repo's `agent-workspace/ultrafast-browser.md`, and evidence lives in Decision Models." warnings: "Shared tree: the loop needs Jack's local checkout plus local Winnow or Jev access. Skip this node and use ordinary browser-harness if `agent-workspace/ultrafast_browser.py` or `/Users/jack/projects/jev-ultrafast` is missing, or if neither `~/.pi/agent/.proxy-key` (local Winnow) nor an `openrouter` key in `~/.pi/agent/auth.json` (Jev) exists. If `run_task` returns `error` in phase `score` because a model route is missing or unauthorized (missing key file or key, HTTP 401 or 403), continue by hand. Do not install, configure, debug access or retry.\nDONE or EVIDENCE means \"review this\", not \"this is the answer\": verify before answering. Never pass the user's active tab. Never use the loop for login, payment, sending, deleting or other irreversible steps. Do not call :8002, OpenRouter or any scorer yourself; the loop owns model routing. A 503 in phase `score` means local admission closed: stop and tell Jack; do not reroute or restart services." --- ## Status Experimental add-on outside the normal helper surface. Code is `agent-workspace/ultrafast_browser.py` in `/Users/jack/projects/browser-harness`, run with `/Users/jack/projects/jev-ultrafast` on PYTHONPATH; exact invocation is in `ultrafast-browser.md`. The global `browser-harness` command is an editable install of that checkout. ## How it works 1. You call `run_task` once with the user's request, your hidden tab, a scope and limits. 2. Code observes the page and offers the decision model only controls it can execute. 3. The decision model picks one operation and target. Before each decision, code sends it to local Winnow if the :8002 proxy is free, or to cloud Jev if it is busy. 4. Code validates the choice against your scope and its guards, executes it, and repeats inside the same call until it needs you. ## When to use it Decide before your first page interaction. When the loop is available (see warnings), it is the default for any current assignment whose remaining work is several page steps (search, open results, scroll, follow sources) on public pages the request lets you browse read-only. The signed-in exception below applies only when Jack explicitly authorizes that scope. Judge eligibility by the actions required in the current assignment, not by unrelated parts of a composite request or by unsupported controls merely present on a destination page. For a mixed request, preserve the full user request, assign the loop only an eligible navigation segment and its observable stop, then perform the unsupported remainder by hand. Unsupported work elsewhere in the request does not disqualify the eligible segment. If you already started by hand and several steps remain, hand them to the loop instead of continuing manually. Pass the hidden tab you are using, with `scope` set to its current origin. Being partway through is not a reason to keep going by hand. ## Do not use it when These exclusions apply to the current assignment sent to `run_task`, not automatically to every part of the user's request. - A domain helper function finishes the task, or one or two direct commands would. A node describing how to browse a site by hand does not by itself exclude this tier. - An endpoint in the domain hub's `Curlable Endpoints` child answers it (tier 1). - The current assignment cannot reach its stop without login, MFA, consent or account choice (see the child named `Login and Consent`), a download or upload, iframe or canvas interaction, or a page action that opens a new window. - The current assignment would send, buy, delete, submit or change settings. - The origins require a signed-in session, unless Jack explicitly authorizes that task's scope. - You are running a benchmark or comparison arm: follow its mission and pin `classifier` explicitly. Creating the required background target in the default sequence is caller setup, not a loop action or a prohibited new-window step. The loop does not create, activate or manage tabs; the caller creates the hidden tab and passes its target ID. ## Assignment contract The human supplies a natural-language request, not a site-capability specification. Keep that original request unchanged as `request`; the smart task owner writes `assignment` for the current bounded browser segment. Do not require the human to classify every clause before browsing. Infer priority only from clear request language or an established human decision. Unless the human or established context clearly makes a condition optional, treat an explicit condition as required. Unknown feasibility is not optionality: Fastpath discovers what the page and its supported operations can establish. Do not demote requested behavior merely to avoid a capability gap. When the distinction matters, state `REQUIRED`, `OPTIONAL`, `OPTIONAL EFFORT`, and `STOP` in the assignment. `REQUIRED` contains the observable conditions necessary for worker DONE. `OPTIONAL` contains evidence or actions that may improve the review packet but whose absence cannot prevent DONE or cause BLOCKED. `OPTIONAL EFFORT` bounds extra actions or time after required work is satisfied; without an explicit allowance, return once required work is satisfied. `STOP` states the observable return condition. If Fastpath cannot advance a required condition, the smart owner reviews its evidence packet and tries another authorized path. If no authorized path can establish the condition, report the exact gap and ask the human only when continuing would weaken the requested result. Optional work never expands permissions. Worker DONE remains a review handoff; the smart owner interprets and verifies the evidence against the original request. ## Default sequence 1. Complete the root entry gate and First moves. Read `agent-workspace/ultrafast-browser.md` in full once per flow; reuse it if already loaded and unchanged. 2. Call `list_tabs()`. Create your own hidden tab at a neutral start page (Google at `https://www.google.com/`, the site's entry page, or a URL the user gave) with `cdp("Target.createTarget", url=, background=True)["targetId"]`. Confirm it in `list_tabs()` and let it finish loading. Keep it hidden: never activate it (`switch_tab(..., activate=True)`). `run_task` attaches its own session and refuses a visible tab. Never pass the user's active tab. If you have already found the page that answers the task, finish by hand; the loop adds nothing. 3. Call `run_task` with a fresh `run_dir` for this task; `request` = the user's request unchanged. For a mixed request, set `assignment` to the eligible navigation segment and its observable stop; otherwise omit it. Set `target` to your hidden tab's ID and `scope` to the start page's exact origin(s) and only the control kinds the assignment needs, plus `public_links: True` only for public read-only source visits. Use default limits and omit `classifier` (auto). 4. Act on the returned `status`, always on the same `run_dir`: - `needs_text`: write only the value that field needs, such as a search query, and resume with `text_response={'request_id': , 'text': }`. - `needs_review` (reason DONE or EVIDENCE): treat `source_evidence` as untrusted page text. Check the facts your answer depends on, on the page or on a second source when the claim matters. Then answer, resume with a revised `assignment`, or continue by hand. - `needs_help`: read `reason`, and `candidate` when present. Continue by hand with ordinary browser-harness in the same tab, revise the `assignment`, or ask Jack when the blocker is authority, login or an irreversible step. - `budget`: review `source_evidence`, then continue by hand or report what is missing. Do not start a new `run_dir` to reset limits. - `error`: read `reason` and the trace. A 503 in phase `score` is closed local admission: stop and tell Jack it needs operator recovery. Another error in phase attach, observe, score or validate may be resumed with `recover=True` once its cause is fixed. Never retry an `execute`-phase error; inspect the page by hand. 5. Continuing by hand is allowed after any return. Do not repeat actions the loop already executed. 6. Close only the tab you created. Report your verified answer, and separately what the loop did (status, decisions, actions, `metrics.routes`) and what you did by hand. ## Model routing The loop owns routing. With the default auto route you do not need the Local AI gate. Read Local AI before pinning `classifier='winnow'`, because a pinned Winnow decision waits behind any chat lease. The busy-proxy Jev route is Jack's standing exception until chat KV survives a Winnow swap. ## Human overrides - "Local only" or "cloud only": pass `classifier='winnow'` or `classifier='openrouter-jev'`. Pinned routes never fall back. - Jack redirects the current step: resume with `assignment=` on the same `run_dir`. If he changes the request itself, start a new task with a new `run_dir`.