Skip to content

feat: onboarding feedback — Chromium setup step, pinned response language, ports, and no polling - #1329

Merged
sergiofilhowz merged 4 commits into
mainfrom
sergio/onboarding-feedback
Oct 7, 2026
Merged

sergiofilhowz merged 4 commits into
mainfrom
sergio/onboarding-feedback

Conversation

@sergiofilhowz

@sergiofilhowz sergiofilhowz commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Summary

We ran a first-run test of the harness template, recorded end to end, with the published workers:

  • iii project init -t harness, moved to its own ports;
  • the setup wizard, with Claude Code and the TypeSafe Judge;
  • Create an app or tool on Claude Sonnet 5.5, asked for a TODO app.

That run surfaced a set of problems. This PR fixes them:

  • No Chromium. On a machine without Chromium, the agent could never check the page it built, and nothing told the user why.
  • Labels in the wrong language. Tool-call labels came out in Spanish for an English prompt.
  • Misleading error. A malformed tool call was reported as a truncation.
  • Wrong starting model. New chats started on the alphabetically first model.
  • Codex re-checked. Codex came back checked after connecting only Claude Code.
  • Collision on port 3111. Two projects on one machine collided on 3111, and the agent assumed 3111 anyway.
  • Bind address mismatch. The ADE's and http's manifests declared 127.0.0.1 while their code binds 0.0.0.0.
  • Polling. Several parts of the system polled.

The same test then ran against workers built from this branch. Every one of those problems is gone (see Evidence).

The harness template follows in iii-hq/templates#106: README sections for ports, network access, Judge and Chromium, and the builder profile reading the public URL from http::status.

Improvements

Chromium for the browser worker (new)

  • One resolver (browser/src/chromium/), used by sessions, browser::doctor and the scraping tiers alike. It checks, in order:
    1. the configured executable;
    2. $CHROME;
    3. a system install (PATH and the usual locations);
    4. the managed download;
    5. Playwright's cache;
    6. Puppeteer's cache.
  • Missing Chromium: the error starts with chromium_missing: and says what to do.
  • browser::chromium::status {} (read-only, allowed for agents) reports:
    • whether a browser was found, with its path, version and source;
    • where the resolver looked;
    • whether a download is supported on this platform;
    • the latest install job.
  • browser::chromium::install { force? } returns immediately and downloads Chrome for Testing (Stable, about 200 MB) into ~/.cache/iii/browser. The base folder can be changed with III_BROWSER_CACHE_DIR.
    • Only one install runs at a time, guarded by a lock file.
    • The zip is extracted with ditto on macOS.
    • The new binary is checked with --version before it is used.
    • It stays at the default needs-approval permission for agents.
  • New trigger browser::chromium-install-progress: phases plus downloaded and total bytes.
  • Sandbox: on Linux hosts that restrict unprivileged user namespaces (Ubuntu 24.04+), a browser from a user cache is launched with --no-sandbox, as Playwright does. Status reports sandboxed: false.
  • Doctor reports chromium_source, and the worker logs a warning at startup when no Chromium is found.

ADE setup wizard

  • Browser step: shown only when the browser worker is installed and Chromium is missing.
    • One-click Download Chromium, with progress (MB done and total, phase) driven by events.
    • Retry on failure.
    • A folded "I'd rather install it myself" section, with the OS command and Check again.
  • Other ways to install Chromium:
    • a command palette entry, Install Chromium for the browser worker;
    • an inline Install Chromium action on a failed browser::* call whose error contains chromium_missing.
  • Step numbering: "Step N of M" counts the real steps, and Ready lists the Chromium install.
  • Recommended providers stay unchecked once you leave them out. Recommendations are preselected only until the first provider is connected, so Back (or reopening setup) never re-checks Codex.
  • The wizard no longer polls:
    • adding workers follows compose-operation events;
    • worker connection waits on engine::workers-available;
    • configuration, models and judge waits use their change triggers.

Setup wizard: plain words, and example prompts instead of the tour

  • Plain words: Models, Browser, Judge and Ready say what happens in plain words. Gone are:
    • sign-in file paths, CLI paths and versions, and worker versions;
    • function ids, key references (secret://…) and configuration entries;
    • install folders;
    • registry descriptions written for worker authors.
  • Workers stay explicit: what stays explicit is every worker a step adds ("Adds a new worker: provider-claude-code"). The plan, the activity log and Ready ("Workers added to your project") add one line on iii being composable: each worker adds behavior and lives in worker-compose.yaml. Failure messages keep the error and its hint.
  • Finish replaces the tour: Ready drops Start the tour, which added the onboarding worker, along with the tour code that only served it. Instead there is a Finish button and the project's example prompts.
  • Example prompts:
    • The prompts come from onboarding.yaml in the project folder, read on each call by the new console::onboarding::prompts. Invalid entries are skipped, and a missing or broken file shows none.
    • Each prompt names its agent profile and a priority list of { provider, model, effort? }.
    • Clicking one opens a new chat with the prompt in the message box (not sent), the profile selected, and the first listed model the router serves here, at that effort.
    • The harness template ships four prompts (docs(harness): ports, network access, Judge and Chromium; the builder reads the http port templates#106).

Starting model

Response language (harness, iii-directory, session-manager, ADE)

  • Root cause:
    • no prompt contained another language;
    • the prompts said to answer in the language of the latest message;
    • agent_trigger's schema said "in the user's language", without ever naming it.
  • Fix in the harness:
    • it now detects the language of the user's first message (whatlang, after stripping code, mentions, quotes, URLs and paths), with a confidence of at least 0.8;
    • the language is pinned for the session (metadata) and inherited by later turns and sub-agents;
    • it is named in the session context ("Response language: English (from the user's first message) …") and in agent_trigger's description schema.
  • Prompts: the bundled prompts in harness and iii-directory use "the response language named in your session context" instead of the latest message.
  • Labels after a reload: session::messages-tail now keeps function and description of collapsed agent_trigger calls, so the ADE keeps the label after a reload instead of showing the bare function id.

Malformed tool calls (llm-router, harness, providers)

  • Root cause: the failed coder::update-file was not truncated. The model wrote invalid JSON (a stray ]). With eager_input_streaming, the API no longer validates tool input, and the harness told the model its call had been cut off.
  • Fix:
    • degraded_arguments adds _invalid {error, offset, context} for text that is not JSON.
    • The harness reports one of three distinct causes:
      • max_output_tokens;
      • incomplete_json;
      • invalid_json, showing the parser message and the text near the error.
    • The eager_input_streaming comments in both providers are corrected.
    • provider-claude-code logs an SSE data: line it has to drop.

Ports and network access

  • http::status (new, read-only, allowed for agents) returns { host, port, url, last_reload_error }. Agents and the builder profile use it instead of assuming http://127.0.0.1:3111.
  • Manifest defaults now match the code: the http and ade manifests declared host/http_host: 127.0.0.1, while the binaries bind 0.0.0.0. With a config_override, Compose builds the value from the manifest defaults, so the bind address changed depending on whether an override existed. Both now declare 0.0.0.0.
  • http_host in the ADE is now read from the stored configuration at startup, so config_override can set it; --http-host still wins.

No polling

Where Before Now
IDE branch chip (loaded into the ADE) 3× shell::exec (git) on every focus change, throttled to 3 s, so every click in the ADE produced traces shell::git-changed trigger (new: HEAD, index, refs and worktrees watched with 200 ms batching); a non-repository folder is not re-read until .git appears
IDE turns list shell::turns::list every 1.5 s while a turn runs shell::turns::changed trigger (new)
IDE new-worker flow, ADE Workers page, judge UI, setup wizard compose::operation every 0.7 to 3 s compose-operation events, subscribed before the operation starts
harness binding expiry state::list sweep every 30 s one-shot timer per binding at its expires_at; a full pass at boot and on worker connect/disconnect
harness orphaned turns state::list_keys every 120 s boot pass, then engine::workers-available events and failed enqueues
harness discovery and skills reload every 5 minutes reload on worker announce
harness/queue engine-restart check engine::workers::list every 1 s per call in flight once per engine event
queue builtin adapter dequeue every 100 ms while idle wake-up on enqueue/nack/requeue/redrive, plus a one-shot timer at a backoff's due time; poll_interval_ms is deprecated and ignored
queue waiting for a function repeated engine::functions::info engine::functions-available / engine::workers-available
browser human hand-off page check every 250 ms CDP binding (Runtime.addBinding)
browser tab titles (UI) browser::sessions::list every 15 s in-page title reporter → session-updated
browser idle-tab cleanup sweep every 60 s per-tab deadline timers
browser annotate hint, network settle, history 120 ms / 25 ms / 50 ms loops pointermove + rAF, request events, load event
ADE compose file watch 25 ms tick sleeps until the next coalesced change
ADE workspace layout, useWorkerLive (console-ui) 5 s / 15 s fallback polls re-read on the change ring and on tab focus

Other fixes

  • Duplicate "Binding exhausted" card (harness): a second, concurrent fire of a spent once-binding no longer writes a "Binding exhausted / delivery skipped" record next to the real "Trigger fired" one.
  • Permissions: harness::on-engine-change, harness::on-compose-operation and queue::on-engine-change are denied to agents; http::status and browser::chromium::status are allowed.
  • ADE queue form: "Poll interval (ms)" is gone. The poll_interval_ms key is no longer sent by harness, eval and sentinel.
  • eval compiles again: SendOptions.reasoning (from feat: providers declare default models and thinking levels; harness and ADE start on them #1306), with its schema goldens regenerated.

Evidence

Before, with the published workers (ade 1.9.52, harness 1.8.44, browser 0.2.25):

  • Codex comes back checked.
  • New chats start on Claude Fable 5.
  • Tool-call labels are in Spanish.
  • The agent reports "no Chrome executable was found".
  • http stops with Address in use on 3111, and :3111/todo-app answers another project's 404.

Recording (MP4, 4 min)

Codex re-checked after Connect Spanish labels, unverified page 3111 owned by another project

After, with workers built from this branch and the same prompt:

  • Chromium is hidden from the browser worker, so the Browser step appears and downloads it.
  • Codex stays unchecked after Connect and after Back.
  • A new chat starts on Claude Sonnet 5.5.
  • Labels are in English.
  • http runs on 3137 through config_override. The agent reads it from http::status, opens http://127.0.0.1:3137/todo-app in the downloaded Chromium, and verifies it.

setup wizard with the Browser step

Recording (MP4, 2 min 24 s)

Browser step Downloading Ready
Codex stays unchecked after Back New chat on Sonnet 5.5 English labels, page verified on 3137

Plainer wizard and example prompts (second commit): Codex is left out, Chromium downloads, then the Judge, Ready with the template's prompts, and Build a TODO app. The chat opens on Create an app or tool with Claude Sonnet 5.5 Medium and the prompt ready to send.

simplified setup wizard

Recording (MP4, 54 s)

Models Browser Judge
Chromium ready Ready: workers added, example prompts, Finish After clicking an example

Test plan

  • Rust, cargo test for each changed worker:

    Worker Passed
    ade 160
    harness 724 lib + 5 event_driven (new) + the rest; harness-integration --lib 116
    llm-router 248
    provider-claude-code 118
    provider-anthropic 126
    ide 1834
    browser (default features) 318, including real-Chromium hand-off and title tests
    queue 161
    http 144
    sentinel 226
    eval 41
    session-manager 98
    iii-directory 528
  • CI checks run locally:

    • cargo fmt --all -- --check and cargo clippy --locked --all-targets -- -D warnings (plus --all-features where the CI uses it) are clean;
    • validate_worker.py passes for every changed worker;
    • .github/scripts pytest: 321 passed.
  • Frontends:

    • ade/web vitest: 2995 passed;
    • pnpm build (tsc -b && vite build) passes;
    • Biome is clean on the changed files;
    • ide/ui: 662 passed;
    • browser/ui: 60 passed;
    • judge/ui: 25 passed;
    • ade/ui configuration forms: 23 passed.
  • End to end: a project generated from the template, with these workers and Chromium hidden, went through:

    • the setup wizard (Claude Code, Browser download, TypeSafe Judge);
    • one Create an app or tool run.

    It shows English labels, http::status → :3137, the page verified in the downloaded Chromium, and a single "Trigger fired" card for the compose wake.

  • CI: harness-integration runs locally against iii 0.24.5-rc.2, with all 35 scenarios passing and Console Playwright 16/16. The integration runner now expects the response-language line, and ignores the boot-time "skills changed" notice that could land inside a scenario. The validate job stubs the harness UI bundle (SKIP_UI_BUILD=1), since the integration crate now links the harness. Reproduced without pnpm on PATH: 118 unit tests pass, 41 fixtures are valid, and actionlint is clean.

  • Plainer wizard and example prompts:

    • ade/web onboarding, prompts and conversation suites: 270 passed, and the full suite has no new failures;
    • pnpm build passes;
    • ADE cargo test: 165 passed, with clippy and fmt clean;
    • the templates smoke-init.sh passes.

    End to end, a project generated from docs(harness): ports, network access, Judge and Chromium; the builder reads the http port templates#106 shows the four prompts. Clicking one prefills the composer and selects the profile and Claude Sonnet 5.5 Medium.

  • Language detection: English and Portuguese prompts are detected (confidence 1.0 and 0.93). Prompts too short to tell ("Create a todo app with a notes field") stay unset instead of guessing.

Notes

  • Releases needed: ade, browser, harness, http, ide, queue, llm-router, provider-claude-code, provider-anthropic, session-manager, iii-directory and judge (and feat: providers declare default models and thinking levels; harness and ADE start on them #1306, which is not published yet).
  • Failures that also happen on origin/main:
    • ade/web icon-size-conformance (DeviceSignIn) and MermaidDiagram;
    • ProviderConfigurationPanel is flaky only under the full suite;
    • the bdd suites of iii-directory (32 registry/network scenarios) and session-manager (10 live-engine scenarios);
    • queue's e2e_rabbitmq needs Docker.
  • Polling left, which needs changes outside this repo or a protocol change:
    • Engine: the engine's engine::functions-available is itself a 5 s hash comparison. It should fire on register/unregister and cover schema changes.
    • Harness: the daily harness::sweep-pending cron.
    • Browser: startup retries, waitFor(selector) and the scrapling challenge loops.
    • Workers log viewer: compose::logs long-poll (Compose has no log stream).
    • Login and catalog: the GitHub device login (protocol) and provider-claude-code's 15-minute catalog refresh (external API).

…uage, ports, and no polling

Findings from a first-run test of the harness template (TypeSafe Judge,
Claude Sonnet 5.5, "Create an app or tool") and their fixes:

- browser: one Chromium resolver for sessions, doctor and scraping
  (configured, $CHROME, system, managed download, Playwright, Puppeteer
  caches); browser::chromium::status and browser::chromium::install (Chrome
  for Testing into ~/.cache/iii/browser, progress events); a
  `chromium_missing:` error that says what to do.
- ade: a Browser step in the setup wizard when Chromium is missing (one-click
  download with progress, or manual install), a palette command and an inline
  "Install Chromium" action; recommended providers stay unchecked after a
  connection; new chats start on the provider's default, then the router's
  first model; http_host from the stored configuration; manifest default
  0.0.0.0; no idle wake-ups in the compose watch.
- harness: the response language is detected from the user's first message,
  pinned for the session and named in the session context and in
  agent_trigger's schema; invalid tool-call JSON is reported as such, with
  the text around the error; binding expiry, orphaned-turn recovery and
  discovery are event-driven; a duplicate fire of a spent binding no longer
  writes a second outcome.
- llm-router: degraded tool arguments carry `_invalid` {error, offset,
  context} for text that is not JSON.
- session-manager: collapsed agent_trigger calls keep function and
  description, so labels survive a reload.
- http: http::status (host, port, local URL); manifest default 0.0.0.0.
- queue: wake-ups on enqueue and due times instead of a 100 ms poll;
  engine events instead of 1 s re-checks.
- ide, ADE Workers page, judge UI, browser UI, console-ui: triggers instead
  of timers (git and turn-log watches, compose-operation events).
- iii-directory prompts: the session's response language, not the latest
  message's.
- eval: SendOptions.reasoning; regenerated schema goldens.
@vercel

vercel Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
workers Ready Ready Preview Oct 7, 2026 5:03pm UTC
workers-tech-spec Ready Ready Preview Oct 7, 2026 5:03pm UTC

Request Review

@coderabbitai

coderabbitai Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 198 files, which is 98 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: f737c2cf-9161-4080-a939-fbb1fe488ce8
📥 Commits

Reviewing files that changed from the base of the PR and between 94da046 and ef6d5a1.

⛔ Files ignored due to path filters (3)
  • browser/Cargo.lock is excluded by !**/*.lock
  • eval/Cargo.lock is excluded by !**/*.lock
  • harness/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (198)
  • .github/workflows/_harness-integration.yml
  • ade/README.md
  • ade/iii.worker.yaml
  • ade/src/compose/watch.rs
  • ade/src/configuration.rs
  • ade/src/functions/mod.rs
  • ade/src/main.rs
  • ade/src/onboarding.rs
  • ade/ui/src/configuration-forms/specs/collections-services.ts
  • ade/web/src/components/PaletteHost.tsx
  • ade/web/src/components/function-trigger/FunctionTriggerCard.tsx
  • ade/web/src/components/onboarding/BrowserStep.test.tsx
  • ade/web/src/components/onboarding/BrowserStep.tsx
  • ade/web/src/components/onboarding/ChromiumMissingAction.tsx
  • ade/web/src/components/onboarding/JudgeStep.tsx
  • ade/web/src/components/onboarding/ModelsStep.test.ts
  • ade/web/src/components/onboarding/ModelsStep.tsx
  • ade/web/src/components/onboarding/OnboardingSteps.test.tsx
  • ade/web/src/components/onboarding/OnboardingWizard.tsx
  • ade/web/src/components/onboarding/ReadyStep.tsx
  • ade/web/src/components/onboarding/WelcomeStep.tsx
  • ade/web/src/components/onboarding/example-prompt.test.tsx
  • ade/web/src/components/onboarding/example-prompt.ts
  • ade/web/src/components/onboarding/parts.tsx
  • ade/web/src/components/onboarding/use-onboarding.browser.test.tsx
  • ade/web/src/components/onboarding/use-onboarding.ts
  • ade/web/src/hooks/use-conversations.test.ts
  • ade/web/src/hooks/use-conversations.ts
  • ade/web/src/hooks/use-model-picker-source.ts
  • ade/web/src/hooks/use-workspace-tabs.ring.test.tsx
  • ade/web/src/hooks/use-workspace-tabs.ts
  • ade/web/src/lib/console-ui-hooks.test.tsx
  • ade/web/src/lib/engine-trigger.test.ts
  • ade/web/src/lib/engine-trigger.ts
  • ade/web/src/lib/models-catalog.test.ts
  • ade/web/src/lib/models-catalog.ts
  • ade/web/src/lib/onboarding/api.test.ts
  • ade/web/src/lib/onboarding/api.ts
  • ade/web/src/lib/onboarding/catalog.ts
  • ade/web/src/lib/onboarding/chromium.test.ts
  • ade/web/src/lib/onboarding/chromium.ts
  • ade/web/src/lib/onboarding/event-wait.test.ts
  • ade/web/src/lib/onboarding/event-wait.ts
  • ade/web/src/lib/onboarding/open.ts
  • ade/web/src/lib/onboarding/plan.test.ts
  • ade/web/src/lib/onboarding/plan.ts
  • ade/web/src/lib/onboarding/prompts.test.ts
  • ade/web/src/lib/onboarding/prompts.ts
  • ade/web/src/lib/onboarding/tour.test.ts
  • ade/web/src/lib/onboarding/tour.ts
  • ade/web/src/lib/sessions/entry-mapper.test.ts
  • ade/web/src/lib/sessions/entry-mapper.ts
  • ade/web/src/lib/sessions/types.ts
  • ade/web/src/lib/ui-slots.test.ts
  • ade/web/src/lib/ui-slots.ts
  • ade/web/src/pages/Workers/add-worker.tsx
  • ade/web/src/pages/Workers/compose-api.ts
  • ade/web/src/pages/Workers/container.tsx
  • ade/web/src/pages/Workers/follow-operation.test.ts
  • ade/web/src/pages/Workers/follow-operation.ts
  • ade/web/src/pages/Workers/index.tsx
  • ade/web/src/pages/Workers/project.tsx
  • ade/web/src/pages/Workers/settings.tsx
  • ade/web/src/pages/Workers/source.tsx
  • browser/Cargo.toml
  • browser/README.md
  • browser/iii-permissions.yaml
  • browser/skills/SKILL.md
  • browser/src/chromium/install.rs
  • browser/src/chromium/mod.rs
  • browser/src/configuration.rs
  • browser/src/deadline.rs
  • browser/src/events.rs
  • browser/src/functions/chromium.rs
  • browser/src/functions/doctor.rs
  • browser/src/functions/handoff.rs
  • browser/src/functions/mod.rs
  • browser/src/lib.rs
  • browser/src/main.rs
  • browser/src/scrapling/raw_browser.rs
  • browser/src/scrapling/sessions.rs
  • browser/src/session.rs
  • browser/tests/golden/schemas/browser.chromium.install.json
  • browser/tests/golden/schemas/browser.chromium.status.json
  • browser/tests/golden/schemas/browser.doctor.json
  • browser/tests/golden/schemas/browser.frame.json
  • browser/tests/integration.rs
  • browser/tests/schemas.rs
  • browser/ui/src/page/Viewport.tsx
  • browser/ui/src/page/hint-scheduler.test.ts
  • browser/ui/src/page/hint-scheduler.ts
  • browser/ui/src/page/useBrowserSessionsLive.test.tsx
  • browser/ui/src/page/useBrowserSessionsLive.ts
  • browser/ui/src/page/useLiveFrames.ts
  • eval/src/queue.rs
  • eval/src/runtime.rs
  • eval/tests/golden/schemas/eval.assert.exact.json
  • eval/tests/golden/schemas/eval.assert.normalized_text.json
  • eval/tests/golden/schemas/eval.compare-sessions.json
  • eval/tests/golden/schemas/eval.result.json
  • eval/tests/golden/schemas/eval.start.json
  • harness/Cargo.toml
  • harness/README.md
  • harness/architecture/reactive-triggers.md
  • harness/architecture/trigger-bindings.md
  • harness/prompts/default.txt
  • harness/src/bindings/compose.rs
  • harness/src/bindings/expiry.rs
  • harness/src/bindings/gc.rs
  • harness/src/bindings/mod.rs
  • harness/src/bindings/store.rs
  • harness/src/clients/engine.rs
  • harness/src/deps.rs
  • harness/src/discovery.rs
  • harness/src/engine_events.rs
  • harness/src/functions/send.rs
  • harness/src/functions/subscribe.rs
  • harness/src/functions/system_prompt.rs
  • harness/src/functions/trigger_deliver.rs
  • harness/src/inflight.rs
  • harness/src/language.rs
  • harness/src/lib.rs
  • harness/src/main.rs
  • harness/src/policy.rs
  • harness/src/queue.rs
  • harness/src/skills.rs
  • harness/src/subagent.rs
  • harness/src/timer.rs
  • harness/src/trigger.rs
  • harness/src/turn_loop.rs
  • harness/src/types/turn.rs
  • harness/tests/event_driven.rs
  • harness/tests/integration/Cargo.toml
  • harness/tests/integration/src/evidence_data.rs
  • harness/tests/integration/src/expand.rs
  • harness/tests/integration/src/scenarios/dsl.rs
  • harness/tests/integration/src/scenarios/wake_expiry_notice.rs
  • harness/tests/integration/src/scripted_router.rs
  • http/README.md
  • http/iii.worker.yaml
  • http/src/configuration.rs
  • http/src/main.rs
  • http/tests/webhook_listener.rs
  • ide/CHANGELOG.md
  • ide/README.md
  • ide/src/git_events.rs
  • ide/src/lib.rs
  • ide/src/main.rs
  • ide/src/turn_events.rs
  • ide/src/turns.rs
  • ide/ui/src/function-trigger/ScaffoldView.tsx
  • ide/ui/src/page/NewWorkerDialog.tsx
  • ide/ui/src/page/TimelineTab.tsx
  • ide/ui/src/page/WorktreeSwitcher.tsx
  • ide/ui/src/page/__tests__/git-watch.test.ts
  • ide/ui/src/page/__tests__/new-worker.test.ts
  • ide/ui/src/page/__tests__/turns-changed.test.ts
  • ide/ui/src/page/__tests__/use-git-log.test.ts
  • ide/ui/src/page/__tests__/worktree-head.test.ts
  • ide/ui/src/page/git-watch.ts
  • ide/ui/src/page/index.tsx
  • ide/ui/src/page/live.ts
  • ide/ui/src/page/new-worker.ts
  • ide/ui/src/page/turn.ts
  • ide/ui/src/page/use-git-log.ts
  • ide/ui/src/page/worktree-head.ts
  • iii-directory/prompts/default.md
  • iii-directory/prompts/iii-minimal.md
  • iii-directory/prompts/iii.md
  • iii-directory/src/bundled.rs
  • iii-directory/src/functions/search.rs
  • iii-directory/src/hook.rs
  • iii-permissions.yaml
  • judge/ui/src/session/engine.ts
  • judge/ui/src/session/index.test.tsx
  • judge/ui/src/session/index.tsx
  • llm-router/src/types/messages.rs
  • packages/console-ui/README.md
  • packages/console-ui/hooks.d.mts
  • packages/console-ui/hooks.mjs
  • provider-anthropic/src/wire/tools.rs
  • provider-claude-code/src/sse.rs
  • provider-claude-code/src/wire/tools.rs
  • queue/Cargo.toml
  • queue/README.md
  • queue/src/adapter.rs
  • queue/src/adapters/builtin.rs
  • queue/src/boot.rs
  • queue/src/runtime.rs
  • queue/src/store.rs
  • queue/src/trigger.rs
  • queue/tests/e2e_durability.rs
  • sentinel/src/iii_runtime/mod.rs
  • session-manager/architecture/integration.md
  • session-manager/src/functions/messages_tail.rs
  • session-manager/src/pagination.rs
  • session-manager/tests/golden/schemas/session.messages-range.json
  • session-manager/tests/golden/schemas/session.messages-tail.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

skill-check — worker

0 verified, 82 skipped (no docs/).

Layer Result
structure ✓
vale ✓
ai ✓
render ✓

Four for four. Nicely done.

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

🟢 Harness E2E · ade, harness, ide, iii-directory, judge, llm-router, provider-anthropic, queue, session-manager @ ef6d5a1

4/4 passed
Run

…kills-changed notices

The harness now names the session's response language in the system prompt
("Response language: English (from the user's first message) …") once it can
tell it from the first message. The integration runner's expected prompt
lacked that line, so the scripted router's hash check rejected the first
request: INT-011/019/020/023 and the Console Playwright specs failed or timed
out. The expected prompt now carries a `__RESPONSE_LANGUAGE__` marker that
expand.rs fills with the harness's own detector on the actual send message.

iii-directory downloads registry skills shortly after boot; the resulting
"available skills have changed" notice could land inside a scenario depending
on network timing. The scripted router ignores the skills-changed and
skills-removed notices when matching, like the registry-changed notice, and
evidence no longer counts that notice as a user message.
…ate instead of the tour

- Models, Browser, Judge and Ready say what happens in plain words: no sign-in
  file paths, CLI paths or versions, worker versions, function ids, key
  references, configuration entries or install folders. What stays explicit
  is every worker a step adds ("Adds a new worker: provider-claude-code"),
  with one line on iii being composable: each worker adds behavior and lives
  in worker-compose.yaml. Failure messages keep the error and its hint.
- Ready drops "Start the tour" (and the tour code that only served it) for a
  Finish button and the project's example prompts. They come from
  onboarding.yaml in the project folder, read on each call by the new
  console::onboarding::prompts (invalid entries skipped, a missing or broken
  file shows none). Each prompt names its agent profile and a priority list
  of { provider, model, effort? }. Clicking one opens a new chat with the
  prompt in the message box (not sent), that profile selected, and the first
  listed model the router serves here at that effort.
- Registry providers without a recipe say "Set it up after it is added."
  instead of their registry description.
- ADE README: the Browser step, the example prompts and onboarding.yaml.
…e's unit tests

The integration crate now links the harness for its response-language
detector, so `cargo test -p harness-integration` builds the harness, whose
build script wants pnpm to bundle the UI. The validate job has no Node; it
now creates a stub ui/dist and sets SKIP_UI_BUILD=1, as ci.yml already does
for iii-directory. These tests never serve the harness UI.
@sergiofilhowz
sergiofilhowz merged commit 859dfda into main Oct 7, 2026
90 checks passed
guibeira added a commit that referenced this pull request Oct 9, 2026
…OT-3619)

main drifted after #1329 (harness gained whatlang/regex; console-ui moved to iii-sdk 0.23.0). Adds whatlang 0.18.0 + allocator-api2 0.2.21 and dependency edges only; no existing crate version changes. Unblocks approval-gate rust lint + test and interface boot smoke.
guibeira added a commit that referenced this pull request Oct 9, 2026
…#1353)

* chore(ci): drop stale "harness enables iii-stream" comment (MOT-3619)

* chore(fp): note that the stream:: pipe block covers deprecated iii-stream (MOT-3619)

* chore(mcp): document stream:: hidden prefix as deprecated iii-stream (MOT-3619)

* chore(lsp): tag iii-stream trigger types deprecated in completions and hover (MOT-3619)

* chore(permissions): mark the stream::set deny as deprecated iii-stream (MOT-3619)

* chore(docs): stop suggesting iii-stream in guidelines and worker-yaml docs (MOT-3619)

* chore(image-resize): drop unused iii-stream from the example engine config (MOT-3619)

* chore(openwiki): point the multi-instance note at an owned trigger type (MOT-3619)

* chore(console-ui): use a state trigger in the useWorkerLive config example (MOT-3619)

* chore(harness): drop unused iii-stream from test stacks and mark stream triggers deprecated in docs (MOT-3619)

* chore(approval-gate): drop unused iii-pubsub from the testkit engine config (MOT-3619)

* chore(approval-gate): refresh stale Cargo.lock for --locked builds (MOT-3619)

main drifted after #1329 (harness gained whatlang/regex; console-ui moved to iii-sdk 0.23.0). Adds whatlang 0.18.0 + allocator-api2 0.2.21 and dependency edges only; no existing crate version changes. Unblocks approval-gate rust lint + test and interface boot smoke.

This branch was successfully deployed

2 active deployments
Preview – workers — ef6d5a1f Deployed Oct 7, 2026 by vercel[bot]
Preview – workers-tech-spec — ef6d5a1f Deployed Oct 7, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants