Commit Graph
1129 Commits
Author SHA1 Message Date
ciregenzandClaude Opus 5 a982e3361f [eric] browser: an approval nobody can answer declines now instead of parking a turn for 5 minutes
The wait was a bare `timeout=300.0` at the call site: invisible, unchangeable, and
longer than WALL_BUDGET_S (180s) itself, so a single prompt could outlive the whole
run's budget.

Measured 2026-08-08. deepl bot-detected the browser profile, the agent correctly
refused to solve the challenge ("handing to the user, not solving it") and asked for
help via RequestHumanIntervention. Headless, nobody answered, so it burned the full
306s and then denied -- the identical verdict it can reach instantly. That single
wait consumed the entire 420s task budget and was the whole of what looked like a
"249s spawn stall" while profiling. Cron runs, scheduled agents, CI and benchmarks
all sit in exactly this position.

Two changes, neither of which weakens the gate:
- ws_manager.has_listener(session_id) reports whether ANY socket would receive the
  session's events, reading the same two lists send_to_session broadcasts to so it
  cannot drift from where messages actually go.
- p_request_browser_approval checks it BEFORE building a request, and declines with
  an honest reason when no UI is attached. The decision is unchanged (deny); only
  the five minutes of waiting for it are gone.

The timeout is now P_APPROVAL_TIMEOUT_S, overridable via OSW_APPROVAL_TIMEOUT_S for
automation contexts that want a different budget.

A human at the keyboard sees no change: with a socket attached the request is sent
and awaited exactly as before.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 09:28:53 -07:00
ciregenz 7a942fa9fa Merge remote-tracking branch 'origin/eric/dev' into eric/browser-merged 2026-08-08 09:22:33 -07:00
ciregenz bb906d81b8 [eric] apps: a frozen app runtime is thawed before it is reaped, so a parked ghost stops surviving every TERM we send it 2026-08-07 21:48:58 -07:00
ciregenz b537a4ed63 [eric] apps: the ghost reaper reads working directories too, so an orphaned app backend whose argv never names the workspace stops being invisible 2026-08-07 21:36:51 -07:00
ciregenz 01e295ac5c [eric] agents: parked CLIs die at 10 minutes and the warm cap drops to 8, cutting the measured 1.3GB idle ceiling roughly in half 2026-08-07 21:10:44 -07:00
ciregenz 08694d18b8 [eric] apps: the ghost reaper matches workspace paths case-insensitively, so a packaged app's openswarm vs OpenSwarm casing no longer spares orphans 2026-08-07 21:00:44 -07:00
ciregenz 2bd42f7f35 [eric] tests: the sync-test contract tests now pin the progress-based wait, not the deleted fixed budget 2026-08-07 20:27:10 -07:00
ciregenz 8e9baee839 [eric] workflows: at most 3 run at once, extra due fires queue for a slot and give up honestly, so 30 saved workflows can never become 30 live agents 2026-08-07 20:26:27 -07:00
ciregenz dfed363db7 [eric] apps: the scaffold ships a durable store and the skill forbids memory-only state, since the runtime dies on a timer 2026-08-07 20:01:06 -07:00
ciregenz dec16d78db [eric] apps: the ghost sweep fails closed, a bad ps scan or a mid-spawn race can no longer read working apps as ghosts 2026-08-07 19:54:11 -07:00
ciregenz f32bcafc01 [eric] apps: idle pool holds 6 frozen runtimes instead of 3, affordable now that the TTL bounds their lifetime 2026-08-07 19:51:25 -07:00
ciregenz 913f597656 [eric] apps: ghosts get swept every 10 minutes not just at boot, and a frozen idle runtime dies after 15 minutes instead of squatting RAM forever 2026-08-07 19:47:16 -07:00
ciregenz 0417e70b72 [eric] memory: the profile is about the person, not the project, and saying nothing is the default 2026-08-07 17:53:40 -07:00
ciregenz 0c83bb8f78 [eric] canvas: an app window owns its wheel whether or not you clicked in first; workflow tests wait on progress, not a clock 2026-08-07 17:37:30 -07:00
ciregenz 9b54b39dde [eric] workflows: a test that runs long hands back what it has instead of telling the agent to poll; memory stops re-deriving facts it already stored 2026-08-07 17:33:20 -07:00
ciregenz bde92de062 [eric] prompt: reading the web starts with WebSearch/WebFetch and only escalates to the browser when they come back thin 2026-08-07 17:18:30 -07:00
ciregenz 050a02fc52 [eric] workflows: a new workflow runs on the model you actually configured, not Anthropic's API lane 2026-08-07 17:06:48 -07:00
ciregenz 6d8ecc6fd4 [eric] canvas: the host window allows visual zoom, so macOS actually delivers a trackpad pinch to the dashboard (ENG-186) 2026-08-07 16:24:07 -07:00
ciregenz d1d8597513 [eric] help: the 1.7.5 notes describe the build that exists, not the one that was planned 2026-08-07 15:52:28 -07:00
ciregenz 69797ba88a [eric] workflows: pausing one clears its queued missed fires, so a switched-off workflow leaves nothing behind 2026-08-07 15:47:31 -07:00
ciregenz 5485021b7b [eric] workflows: a stalled label lane can no longer hold a step edit open, which is what bricked the editor 2026-08-07 15:41:07 -07:00
ciregenz f018eefdb9 [eric] workflows: a deleted workflow stays deleted, so the immortal 45-minute ghost can't write itself back to life 2026-08-07 15:05:42 -07:00
ciregenz 48bcdd4f85 [eric] workflows: off means off on every path, and the refusal shows up in History 2026-08-07 14:35:08 -07:00
ciregenz d05963884d [eric] workflows: deleted or switched off means it cannot run, from any path, including mid-run 2026-08-07 14:30:29 -07:00
ciregenz e5f4144f72 [eric] workflows: an agent will not start a workflow the user switched off 2026-08-07 14:26:33 -07:00
ciregenz bb5893ff46 [eric] apps: a crash no longer leaves app runtimes running for days, boot reaps what no live backend owns 2026-08-07 14:23:25 -07:00
ciregenz 21e1400e3c [eric] telemetry: a silent quit carries the same envelope as a hard error, found by reading the sink 2026-08-07 12:27:38 -07:00
ciregenz 48b46d17a1 [eric] skills: pnpm dlx and yarn dlx pastes install, which is the form READMEs actually print 2026-08-07 12:08:56 -07:00
ciregenz eaecf19579 [eric] usage: agent time stops billing idle cards as work, and the panel gains real figures 2026-08-07 11:07:43 -07:00
ciregenz 42b14165d5 [eric] telemetry: the missing-CLI error card carries a flight envelope, and a test keeps every error family honest 2026-08-07 07:25:57 -07:00
ciregenz 44af7d29d9 [eric] skills: an unrelated npx paste no longer installs a skill named after it 2026-08-07 06:38:39 -07:00
ciregenz c6a0c1f34b [eric] telemetry: silent-recovery rows carry journey context, and packaged builds stop shipping test files 2026-08-07 06:35:20 -07:00
ciregenz bbf086329f [eric] agents: a router-down turn names its cause instead of dying unclassified, found by the forced-failure battery 2026-08-07 06:23:45 -07:00
ciregenz 260d5a3de3 [eric] agents: the CLI's silent provider-500 retries become breadcrumbs and near-miss ledger entries 2026-08-07 05:39:46 -07:00
ciregenz 007bd47f3b [eric] workflows: TestWorkflow waits for the run and returns the transcript in-turn, so the agent keeps going instead of parking on the user 2026-08-07 04:06:02 -07:00
ciregenz 45fdff8173 [eric] skills: the Add box accepts the install commands people paste from READMEs (npx/npm/pnpm/bunx, URLs, bare names) 2026-08-07 01:16:35 -07:00
ciregenz dbea61b109 [eric] telemetry: the last two envelope-less diagnostics (pressure valve, router start) now carry context too 2026-08-07 01:08:00 -07:00
ciregenz 3324d63ab1 [eric] release: What's New card + endpoint serve the same story as Help and GitHub, header punctuation fixed 2026-08-07 01:05:05 -07:00
ciregenz a7fd7168ec [eric] help: changelog import belongs at module scope, a decorator was left dangling over it 2026-08-07 01:02:06 -07:00
ciregenz 9d8fe2e545 [eric] release: one changelog source feeds the Help agent, the GitHub body, and the in-app card 2026-08-07 00:45:06 -07:00
ciregenz ef8806eda3 [eric] latency: a short first message no longer drifts the boot fingerprint, so the pre-warmed CLI is actually used (3.92s -> 1.58s median, 0 wasted spawns) 2026-08-07 00:34:54 -07:00
ciregenz 2b6178c12e [eric] telemetry: crumbs at every spawn phase and stream milestone, envelopes carry journey and auth context 2026-08-07 00:02:29 -07:00
ciregenz 792605e530 [eric] telemetry: OSW_FLIGHT=0 kill switch for the recorder 2026-08-06 23:36:53 -07:00
ciregenz c4ff6dad93 Merge remote-tracking branch 'origin/eric/dev' into eric/browser-merged
# Conflicts:
#	electron/package-lock.json
2026-08-06 23:22:12 -07:00
ciregenzandClaude Opus 5 3c50359146 [eric] browser-v3: fix the instrument first, then the two composer bugs it could finally see
Six of the eleven defects here were in the MEASUREMENT, not the product, and they
were wrong in both directions.

Harness, all of which silently produced wrong numbers:
- coverage.py preflight refused every sweep on a box holding exactly one backend:
  stack.sh's supervisor is a `bash -c` quoting the whole uvicorn line, so it carries
  both "-m uvicorn backend.main" AND the venv python path. Discriminate on POSITION.
- stack.sh status reported 2 backends over 1 and 0 webpack over a live dev server
  (webpack retitles its process). A status check whose job is preventing a second
  stack, failing in the direction that lets one land.
- c7_run.sh/c8_run.sh slice r6_be.log while stack.sh names logs by TAG: a stack under
  any other tag hands every trial an empty slice and the sweep reports a confident
  0/108. Now refuses loudly; it caught this exact mistake on first use.
- "Browser command timed out" was bucketed infra. It is ONE command blowing its own
  budget, not a dead webview: all 4 such rows were BrowserFindComposer at exactly its
  30s cap, every run completed after, zero card-gone markers in the whole log. Filed
  as infra it read as 11.8% flake AND lifted holdout reach 70% -> 84%.
- api_retry / rate_limit_error now grade as infra. A provider 429 storm turned clean
  15-21s exclusions into 188s product_no_composer rows.
- bench.py prints reach BOTH ways when a row is UNVERIFIED. An exclusion resting on
  the agent's own word quietly flatters the score, and coverage.py's own instruction
  to confirm it by hand goes unread (I quoted a 100% that excluded onlinegdb).

Timing was measuring 0.2% of the run: prestage completes BEFORE metrics_started_at,
so other_ms was 25ms of a 12700ms median while prestage (4146ms, ~61%) sat in no
bucket at all. prestage_ms/task_ms are now recorded; total_ms is deliberately NOT
redefined, which would invalidate every before/after already taken against it.

Product:
- find_composer rejected ACE/CodeMirror-5/Monaco composers. Their input is a ~1x1
  offscreen textarea that paints into a sibling div, so it can never pass a size
  gate. Accept it when a VISIBLE ancestor is composer-sized; honeypots stay out
  because the input itself must not be display:none/visibility:hidden/opacity:0.
  anon reach 80% -> 100%, holdout 89% -> 90%, p95 38.6s -> 9.7s.
- the composer poll slept a blind 0+1.2+1.4 = 2.6s whenever prestage staged nothing,
  which is nearly every run, and it was the whole of other_ms's suspicious constancy
  (2610-2613ms regardless of tools_ms). Stop when two reads are identical, the rule
  the opener poll 40 lines below already applies. other_ms -53.7%, tools_ms flat.
- prestage no longer navigates to the page it is already on, nor sleeps 0.35s before
  its first settle probe.
- is_replay_boundary reasoned from the NAME alone, so x.com's composer textbox named
  "Post text" was ruled an irreversible send and truncated its replay to a bare
  navigate. Excluded by ROLE; first_unsafe_step now passes role through at all.

Measured on this box: reach 100% (83% if onlinegdb's unverified exclusion is bogus),
0 false successes in ~155 runs, prestage tier-0/1 2702ms, other_ms -53.7%, infra
flake 0/158, holdout 18/20. Criteria 2/4/9 need live writes and are untouched.
Full evidence, including what did NOT work, in e2e/browser-v3/RESULTS_2026-08-06.md.

Also drops the tracked electron/node_modules symlink pointing at another machine's
Downloads folder; it is dangling on every other checkout and re-breaks the install on
any stash or checkout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 23:21:05 -07:00
ciregenz d082af7e03 [eric] telemetry: envelopes get real concurrency via a sessions provider, every turn opens with a baseline crumb 2026-08-06 22:57:53 -07:00
ciregenz 565009f0c5 [eric] telemetry: auth and overflow errors carry flight envelopes, router revives hit the near-miss ledger 2026-08-06 22:42:48 -07:00
ciregenz 5be3bb842d [eric] telemetry: OPENSWARM_DIAG_SINK writes every diagnostic to a rotating local flight file 2026-08-06 22:40:49 -07:00
ciregenz 86e323cbce [eric] telemetry: per-session flight recorder, error envelopes name cause+lane+phase+crumbs, silent recoveries hit the ledger 2026-08-06 22:39:30 -07:00
ciregenz d492c46f02 [eric] apps: runtimes get OPENSWARM_HOST_TOKEN_FILE (path not value) so app backends can call the host API across rotations 2026-08-06 21:39:58 -07:00