Skip to content

Modes and Features

Shivamsh edited this page Sep 20, 2026 · 1 revision

Vibe Mode

Vibe Mode uses a smarter planner model to plan the work and a cheaper executor model to build it. The vibe agent pairs planner and executor models with a review gate between steps.

Run /vibe to pick both models. It switches to the vibe agent and opens the model picker dialog. Switching to the vibe agent in the agent list does the same check.

Config keys (see Configuration for types):

{
  "$schema": "https://opencode.ai/config.json",
  "plannerModel": "anthropic/claude-opus-5",
  "executorModel": "anthropic/claude-haiku-4-5-20251001",
  "vibe_review": true,
  "vibe_review_max_rounds": 2,
  "vibe_max_attempts": 2
}
  • plannerModel / executorModel: global defaults. A per-agent plannerModel / executorModel beats the global one, and a session's own /vibe choice beats both.
  • vibe_mode: true enables Vibe Mode by default for new sessions.
  • vibe_review (default true): the planner reviews each executor step using the transcript, the current contents of the step's target files and their git diff, then approves it or sends it back with feedback.
  • vibe_review_max_rounds (default 2, 0 means unlimited): rejected reviews per step before the planner rewrites the step. Read in packages/opencode/src/session/prompt.ts.
  • vibe_max_attempts (default 2, 0 means unlimited): failed executor attempts before the planner rewrites the step. Read in packages/opencode/src/session/prompt.ts.
  • If Vibe Mode is on but no planner and executor models resolve, the prompt fails with: "You haven't chosen your Vibe Mode models yet! Run /vibe to pick a smart planner and a cheap executor, then send your prompt again."

Brain Rot Mode

/brainrot (alias /brain-rot) toggles Brain Rot Mode. It also appears in the command palette as "Turn on Brain Rot Mode" / "Turn off Brain Rot Mode". A session's own choice beats the config default, so the command can turn it off as well as on.

{
  "brain_rot": true
}

What it changes: replies, progress notes, explanations, summaries and error reports turn into unhinged internet slang, plus narration around tool calls. The prompt text lives in packages/opencode/src/session/prompt/brain-rot.txt.

What it never touches: code, comments, identifiers, file contents and config; commit messages, PR text and anything written to a file or sent to another system; commands, paths, error text and numbers, which are quoted exactly. Facts stay facts: a bug is still a bug and a risk is still a risk.

Verification

After the agent edits files, RIFT runs your project's own checks and appends the real results to the reply. Set "verify": false to turn it off (default true).

What runs:

  • package.json scripts named typecheck, lint and test (placeholder scripts such as "no test specified" or guards ending in exit 1 are skipped). The runner (bun run, pnpm run, yarn run, npm run) is found from the workspace lockfile.
  • go vet ./... and go test ./... when go.mod exists.
  • cargo check and cargo test when Cargo.toml exists.
  • pytest when pytest.ini exists or pyproject.toml contains [tool.pytest.
  • In a monorepo, each edited file uses the nearest parent directory that has checks of its own.
  • "verify_commands" replaces auto-detection. Explicit commands always run from the project root.
  • "verify_timeout_ms" kills a single check after that many milliseconds (default 10 minutes; 0 disables the timeout).
  • Each check runs in your configured shell under the same bash permission rules as the shell tool. Status is passed, failed, timed_out or not_run. A check that could not run (permission denied, session cancelled) says so and is never counted as a pass. Output is trimmed to the last 40 lines.
  • "verify_scope_warn_files" (default 15, 0 disables) warns when more files changed since the task started than the threshold.

How the summary is compared with the diff:

  • A second model pass compares the agent's own summary against the real git diff of the files it edited (git diff HEAD plus untracked files rendered as additions, read-only).
  • The reviewer is told to report a mismatch only when the diff contradicts the summary or the summary claims a file change absent from the diff, and to ignore claims about running commands, tests or tools.
  • A mismatch renders as Summary does not match the diff (N) with Claimed: / Actually: lines.
  • "verify_claims" (default true) skips this pass when false. "verify_claims_model" picks the model; it defaults to the Vibe Mode planner when Vibe Mode is on, otherwise the session's own model. An unparseable reply is reported as not run, never as agreement.

Mission Control

<leader>o (or /mission, or the "Mission Control" palette entry) puts every session on one board. Rows are ordered so whatever needs a human is on top, then failures, then work still in flight. Each row names where the session got to, for example "2 permission requests waiting" or "1 check failed". The footer counts blocked, failed, running and total sessions. Type to filter, including by state: typing failed narrows the board to failed sessions.

Sidebar panel

<leader>b toggles the sidebar (session.sidebar.toggle). The panel reads the same task model as the full task view, so the two never disagree. It shows whether the agent is working or waiting on you, where it is in the plan, what changed, and whether the checks passed (long plans and change lists cap at 8 rows each so a small terminal stays usable). Session bookkeeping for context, MCP and LSP sits below. The sidebar shows automatically on wide terminals and hides on narrow ones.

Browser control

The browser tool drives a real page: load a URL, read what rendered, click and type, and see the console errors a screenshot would never show. It uses a Chromium-family browser already on the machine (Chrome, Chromium, Edge, Brave, or Playwright's cached build) in a throwaway profile, so real browser data is never touched. Set RIFT_BROWSER_PATH to point at a specific executable. Loading a page goes through the same browser_open permission as opening a URL:

{
  "$schema": "https://opencode.ai/config.json",
  "permission": {
    "browser_open": "ask"
  }
}

For hands-off UI checks, "verify_browser_url": "http://localhost:3000" loads that URL in a real browser after the commands run and reports whether it rendered and what the console said. A page that returns no HTTP response at all is reported as failed, never as a pass. When no browser is found the check reports not_run.

Clone this wiki locally