From a1f30ee21021c99bfe62371b0a56d30c0df77019 Mon Sep 17 00:00:00 2001 From: Sirajuddin Khan Date: Mon, 17 Aug 2026 17:21:37 +0530 Subject: [PATCH] docs: update Rook guide for public 0.1.0 Documents installer and runtime behavior verified against the public release, including dated controller availability, Windows and shell-installer gaps, and evidence limitations.\n\nAssumption: time-sensitive service observations remain explicitly dated August 17, 2026 and should be replaced when a later release restores the end-to-end journey. --- assets/images/rook/rook-install-public.png | Bin 0 -> 65580 bytes docs/rook-ci-cd.md | 15 +- docs/rook-command-doctor.md | 27 +-- docs/rook-installation.md | 200 ++++++++++++++------- docs/rook-overview.md | 9 +- docs/rook-quickstart.md | 7 +- docs/rook-troubleshooting.md | 61 +++++-- docs/rook-use-cases.md | 51 +++++- 8 files changed, 270 insertions(+), 100 deletions(-) create mode 100644 assets/images/rook/rook-install-public.png diff --git a/assets/images/rook/rook-install-public.png b/assets/images/rook/rook-install-public.png new file mode 100644 index 0000000000000000000000000000000000000000..d64c2ef5e646cdb3979a584c11b17a791a65005e GIT binary patch literal 65580 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 doctor and a real controller-backed smoke command succeed from the runner. A binary that installed successfully is not proof that the testing service is reachable. +::: + ## Prepare the Project Interactively Before enabling a pipeline: @@ -159,13 +163,8 @@ jobs: with: node-version: 20 - - name: Install pinned Rook build - env: - GH_TOKEN: ${{ secrets.ROOK_REPOSITORY_TOKEN }} - ROOK_VERSION: - run: | - curl -fsSL -H "Authorization: Bearer ${GH_TOKEN}" \ - https://raw.githubusercontent.com/LambdatestIncPrivate/rook/stage/scripts/install.sh | bash + - name: Install pinned public Rook release + run: npm install -g @testmuai/rook@0.1.0 - name: Verify Rook environment run: | @@ -195,7 +194,7 @@ jobs: path: .testmuai/rook/agents/refund-desk/runs/ ``` -Pin Rook by commit SHA and review updates before changing it. Scope the repository token to read access for the private release repository. +Pin Rook by an exact public semantic version and review the [Rook changelog](https://github.com/LambdaTest/rook/blob/main/CHANGELOG.md) before changing it. The public npm package does not require a GitHub repository token. ## Separate Generation From the Gate diff --git a/docs/rook-command-doctor.md b/docs/rook-command-doctor.md index 6e9f78110..1da0ad42c 100644 --- a/docs/rook-command-doctor.md +++ b/docs/rook-command-doctor.md @@ -8,7 +8,7 @@ slug: rook-command-doctor/ # /doctor Command -Use /doctor as the first diagnostic when Rook cannot start, authenticate, discover an agent, or reach its controller. +Use /doctor as the first diagnostic when Rook cannot start, authenticate, or find the expected workspace. Headless rook doctor prints the configured controller and API endpoints without probing them. Interactive /doctor can contact the controller while resolving a signed-in session, but it is not a general connectivity test. Rook doctor command help @@ -30,22 +30,23 @@ rook doctor | Check | rook doctor | Interactive /doctor | |---|---|---| -| Rook and Node.js versions | Yes | Rook version only | -| Environment and controller URL | Yes | Yes | -| Controller reachability and providers | Yes | Yes | -| Authentication | Locally cached state; not a live token verification | Cached state, plus a live controller verification when signed in | -| Workspace and TTY | Both | Workspace | +| Rook version | Exact installed version | First row shows rook v<version-label> | +| Active Node.js runtime version | Yes | No | +| Environment, controller URL, and API URL | Yes | Yes | +| Controller DNS or HTTP reachability | No | Conditional: signed-in authentication resolution can contact the controller | +| Authentication | Cached, signed-out, or local-development state | Current session state | +| Workspace and TTY | Both | Workspace storage directory only | | Registered project entities | No | Yes | -Neither form tests the endpoint in an agent invocation profile. +Neither form tests the endpoint in an agent invocation profile. A signed-out interactive session also provides no controller-reachability result. ## Step-by-step troubleshooting 1. Run rook doctor outside the TUI if the TUI will not start. -2. Fix the first failing check. -3. Verify authentication with rook whoami. -4. Return to the intended workspace. -5. Start Rook and retry the original command. +2. Confirm the version, environment, endpoint URLs, workspace, and TTY are the ones you intended. +3. Resolve the printed controller hostname with your normal DNS tools, or retry the controller-backed command and read its specific error. +4. Verify authentication with rook whoami after the controller is reachable. +5. Return to the intended workspace, start Rook, and retry the original command. ## Real-world examples @@ -57,7 +58,9 @@ rook doctor rook whoami ~~~ -When a remote agent is unreachable, also test the profile's exported request with /profile curl; doctor checks Rook's controller, not every target endpoint. +When a remote agent is unreachable, also test the profile's exported request with /profile curl; doctor shows Rook's configured service URLs, not the health of every target endpoint. + +As verified on August 17, 2026, public Rook 0.1.0 rook doctor can exit successfully while the configured production controller hostname is not resolvable. Treat the printed endpoint as configuration, not a green health check. ## Privacy diff --git a/docs/rook-installation.md b/docs/rook-installation.md index b1ecb287a..04e05a349 100644 --- a/docs/rook-installation.md +++ b/docs/rook-installation.md @@ -3,10 +3,11 @@ id: rook-installation title: Install the Rook CLI hide_title: false sidebar_label: Install the CLI -description: Install and authenticate the published Rook CLI without cloning or building the Rook source code. +description: Install the public Rook CLI with npm, the checksummed shell installer, or Homebrew without cloning or building Rook. keywords: - install rook cli - - rook authentication + - rook npm + - rook homebrew - rook installer url: https://www.testmuai.com/support/docs/rook-installation/ site_name: TestMu AI @@ -16,141 +17,210 @@ canonical: https://www.testmuai.com/support/docs/rook-installation/ # Install the Rook CLI -This page installs the packaged Rook CLI. You do not need to clone the Rook repository, install its source dependencies, start a controller, or build any code. +Rook is publicly available as an npm package, a checksummed platform archive, and a Homebrew formula. You install only the CLI. You do not need to clone the Rook source repository, build Rook, start its backend services, or provide a model API key. -:::note Current access -Rook is currently distributed from a private GitHub repository. Your GitHub account must be allowed to read LambdatestIncPrivate/rook. This requirement is for downloading the packaged CLI, not for accessing the source during normal use. +The current public release is **0.1.0**. See the [Rook changelog](https://github.com/LambdaTest/rook/blob/main/CHANGELOG.md) for release notes and later fixes. + +:::warning Rook 0.1.0 service availability +As verified on August 17, 2026, the production controller hostname configured in the public 0.1.0 package is not resolvable. Installation, command help, local diagnostics, and the read-only viewer work, but model-backed commands such as /explore, /generate, and /run cannot complete until the production service is available. After installing, use rook doctor and confirm controller availability before starting an end-to-end run. ::: -## Prerequisites +## Choose an Installation Method + +| Method | Best for | Node.js requirement | +|---|---|---| +| npm | Developers who already manage Node.js and npm | Node.js 20 or newer and npm are required to install the package | +| Shell installer | macOS or Linux machines where you do not want to install Node.js | No system Node.js; the archive includes Node.js 24.19.0 | +| Homebrew | macOS or Linux users who manage CLIs with Homebrew | No Node.js prerequisite; the formula installs Node as a dependency but Rook runs on its bundled runtime | + +Support differs by installation method: + +| Operating system | npm | Shell installer | Homebrew | +|---|---|---|---| +| macOS x64 and arm64 | Supported | Supported | Supported | +| Linux x64 and arm64 | Supported | Supported | Supported | +| Windows x64 | Package published, but not fully validated in 0.1.0 | Not supported | Not supported | +| Windows arm64 | Not supported | Not supported | Not supported | -- macOS or Linux. -- Node.js 20 or newer. -- A LambdaTest account with Rook access. -- GitHub CLI authenticated to an approved GitHub account, or a GitHub token with private-repository read access. -- The runtime needed by your own target agent. For example, a remote HTTP agent must be reachable and a local command agent must be installed on PATH. +The npm package publishes a Windows x64 runtime and uses npm's Windows command shim. In version 0.1.0, resolving the bundled Windows runtime is a known gap and has not been fully validated. If you evaluate this path, install Node.js 20 or newer and do not use it as a release gate until startup is confirmed on your machine. The shell release archive contains a POSIX launcher, and the shell installer does not accept Windows. For the fully validated 0.1.0 journey, use macOS, Linux, or WSL. -Check Node.js: +## Option 1: Install with npm + +### Prerequisites + +Check Node.js and npm: ~~~bash node --version +npm --version ~~~ -The major version must be 20 or newer. - -## Step 1: Authenticate GitHub CLI +Node.js must be version 20 or newer. -If gh is already authenticated, confirm it: +### Install and verify ~~~bash -gh auth status +npm install -g @testmuai/rook +rook --version +rook doctor +~~~ + +As verified on August 17, 2026, the current release prints: + +~~~text +0.1.0 ~~~ -Otherwise run: +Update later with: ~~~bash -gh auth login +npm update -g @testmuai/rook ~~~ -This login only authorizes the package download from the private repository. +## Option 2: Install with the Shell Installer -## Step 2: Install the Packaged CLI +:::warning v0.1.0 pipe-install defect +Do not run the published curl ... | bash one-liner with version 0.1.0. It exits with BASH_SOURCE[0]: unbound variable. Until the changelog records a fix, download the same public script and execute it as a file using the working steps below. +::: -Run: +The affected published command is curl -fsSL https://raw.githubusercontent.com/LambdaTest/rook/main/install.sh | bash. + +### Download, inspect, and run the script ~~~bash -curl -fsSL -H "Authorization: Bearer $(gh auth token)" \ - https://raw.githubusercontent.com/LambdatestIncPrivate/rook/stage/scripts/install.sh | bash +rook_installer="$(mktemp "${TMPDIR:-/tmp}/rook-install.XXXXXX")" +curl -fsSL https://raw.githubusercontent.com/LambdaTest/rook/main/install.sh \ + -o "$rook_installer" && + less "$rook_installer" && + bash "$rook_installer" +rm -f "$rook_installer" ~~~ The installer: -1. Checks for Node.js 20 or newer. -2. Finds the newest Rook CLI release. -3. Downloads and verifies the release archive. -4. Installs it below ~/.testmuai/rook/versions/<version>. -5. Links the rook executable into a writable directory on PATH. +1. Detects macOS or Linux and the x64 or arm64 architecture. +2. Resolves the latest public release. +3. Downloads the matching platform archive and its SHA-256 sidecar. +4. Computes the archive checksum locally and refuses a mismatch. +5. Installs the versioned runtime under ~/.testmuai/rook-<version>. +6. Creates ~/.local/bin/rook by default. -If the final message prints a PATH command, run that exact command and open a new terminal. +If ~/.local/bin is not on PATH, run the PATH command printed by the installer and open a new terminal. -## Step 3: Verify the CLI +Verify that the bundled runtime works: ~~~bash rook --version rook doctor ~~~ -rook doctor checks the CLI version, Node.js, workspace, selected environment, controller reachability, authentication, and terminal support. +### Install a specific version -## Step 4: Sign In to Rook +~~~bash +rook_installer="$(mktemp "${TMPDIR:-/tmp}/rook-install.XXXXXX")" +curl -fsSL https://raw.githubusercontent.com/LambdaTest/rook/main/install.sh \ + -o "$rook_installer" && + bash "$rook_installer" --version 0.1.0 +rm -f "$rook_installer" +~~~ -Start browser authentication: +### Install the command link in another directory ~~~bash -rook login +rook_installer="$(mktemp "${TMPDIR:-/tmp}/rook-install.XXXXXX")" +curl -fsSL https://raw.githubusercontent.com/LambdaTest/rook/main/install.sh \ + -o "$rook_installer" && + bash "$rook_installer" --dir "$HOME/bin" +rm -f "$rook_installer" ~~~ -Or start the interactive terminal and enter /login: +The versioned runtime still lives under ~/.testmuai; --dir changes where the rook command link is created. + +## Option 3: Install with Homebrew + +Add the public tap and install the fully qualified formula: ~~~bash -rook +brew tap lambdatest/rook https://github.com/LambdaTest/rook.git +brew install lambdatest/rook/rook ~~~ -After the browser flow, verify the account: +On macOS arm64 and Linux x64, Homebrew pours a precompiled bottle. Intel macOS and Linux arm64 can build the formula from source, so installation takes longer on those platforms. + +Rook uses the Node.js runtime bundled into the installed formula, including when Homebrew builds the formula from source. In version 0.1.0, the formula also declares Homebrew Node as a dependency used to run npm during installation, so Homebrew may install or upgrade Node and related packages even when it pours a bottle. You do not need to install Node manually before running the command. + +Verify the formula: ~~~bash -rook whoami +rook --version ~~~ -Authentication is global. Multiple Rook terminals on the same machine use the credentials stored below ~/.testmuai/rook/. +Update later with: -Rook whoami command help in a terminal +~~~bash +brew update +brew upgrade lambdatest/rook/rook +~~~ -## Install Without GitHub CLI +## Verify the First-Run Environment -Use a GitHub token with repository read access: +Run: ~~~bash -export ROOK_GITHUB_TOKEN="" - -curl -fsSL -H "Authorization: Bearer $ROOK_GITHUB_TOKEN" \ - https://raw.githubusercontent.com/LambdatestIncPrivate/rook/stage/scripts/install.sh | bash +command -v rook +rook --version +rook doctor ~~~ -Avoid putting the token in project files, screenshots, or shared shell history. +Public Rook 0.1.0 installation verification showing the version and doctor output -## Install a Specific Release +rook doctor prints the installed Rook version, active Node.js runtime version, selected environment, controller and API URLs, workspace, cached authentication state, and TTY availability. It does not label that Node.js process as bundled or system-provided, and it does not by itself prove that the configured controller hostname is reachable. Verify DNS and connectivity if a model-backed command reports a controller error. -Rook release identifiers use a commit SHA. Pin a known version for CI or a controlled rollout: +## Sign In to Rook -~~~bash -export ROOK_VERSION="" +When the production controller is available, start browser authentication: -curl -fsSL -H "Authorization: Bearer $(gh auth token)" \ - https://raw.githubusercontent.com/LambdatestIncPrivate/rook/stage/scripts/install.sh | bash +~~~bash +rook login ~~~ -Installed versions remain side by side, so installing a new build does not overwrite the previous version directory. +Or start the interactive terminal and enter /login: -## Update Rook +~~~bash +rook +~~~ -Run the same installer again, then verify the selected version: +After the browser flow, verify the account: ~~~bash -rook --version -rook doctor +rook whoami ~~~ +Authentication is global. Multiple Rook terminals on the same machine use credentials stored below ~/.testmuai/rook/. + +## Release Integrity + +The public release process builds the CLI once, generates a changelog, waits for an approved human to authorize publication, and only then publishes npm, GitHub release, and Homebrew artifacts. The shell archives include a bundled runtime and a SHA-256 sidecar; the installer compares the downloaded archive with that published digest before copying release files into place. This detects corruption or unexpected rewriting in transit, but the archive and digest come from the same release origin and do not protect against that origin itself being compromised. + +Use these public sources when reviewing an installation: + +- [Rook repository](https://github.com/LambdaTest/rook) +- [Release notes](https://github.com/LambdaTest/rook/releases) +- [Changelog](https://github.com/LambdaTest/rook/blob/main/CHANGELOG.md) +- [npm package](https://www.npmjs.com/package/@testmuai/rook) + ## Troubleshooting | Symptom | What to do | |---|---| -| rook: command not found | Run the PATH or link command printed by the installer, then open a new terminal. | -| Node.js version error | Install Node.js 20 or newer and rerun the installer. | -| GitHub returns 401 or 404 | Confirm that the authenticated account can read the private repository. | -| Release asset connection resets | Retry outside the VPN or corporate proxy; the download uses GitHub's release asset CDN. | -| Rook account is not recognized | Run rook login, then rook whoami. | +| rook: command not found | Open a new terminal. For the shell installer, add ~/.local/bin to PATH. | +| npm reports an unsupported Node.js version | Install Node.js 20 or newer, then repeat the npm installation. | +| The piped shell command reports BASH_SOURCE[0] | Use the download-then-run steps on this page until a later release fixes the v0.1.0 installer. | +| Homebrew proposes Node.js and dependency upgrades | This is current 0.1.0 formula behavior. Review the proposed changes before confirming, or use the shell installer to avoid Homebrew dependencies. | +| The checksum does not match | Do not bypass the check. Delete the download and retry from the public release. | +| /explore reports that the controller is unreachable | Run rook doctor and check DNS for the printed controller host. As verified on August 17, 2026, the public 0.1.0 production endpoint was unavailable. | +| Rook account is not recognized | After the controller is available, run rook login, then rook whoami. | ## Next Step -Continue with [Test Your First Agent](/support/docs/rook-quickstart/). You only need your own PRD, documentation, source workspace, or live endpoint from this point onward. +Continue with [Test Your First Agent](/support/docs/rook-quickstart/) after rook doctor shows the expected environment and the controller is reachable. Your workspace only needs your own PRD, documentation, checked-out source, or live-agent connection details. diff --git a/docs/rook-overview.md b/docs/rook-overview.md index 4c9194d39..e44c7ef39 100644 --- a/docs/rook-overview.md +++ b/docs/rook-overview.md @@ -21,10 +21,16 @@ Rook is a terminal application that autonomously tests AI agents you own. Give i You install only the Rook CLI. You do not need the Rook source repository, a Rook development environment, Docker, or your own model API key. -:::caution Pre-alpha +Rook 0.1.0 is publicly available through npm, a checksummed shell installer, and Homebrew, with full support for macOS and Linux on x64 and arm64. The npm package also publishes a Windows x64 runtime, subject to the startup limitation described in [Install the Rook CLI](/support/docs/rook-installation/). The shell and Homebrew packages carry a matching Node.js runtime; npm installation requires Node.js 20 or newer. + +:::warning Pre-alpha Commands and stored file formats can change. Test against a disposable or staging target and review the target and write warning before every run. ::: +:::warning Public 0.1.0 controller availability +As verified on August 17, 2026, the production controller hostname configured in public version 0.1.0 is not resolvable. You can install Rook, inspect commands, run local diagnostics, and open the read-only viewer, but the model-backed testing sequence requires the production service to be available. Confirm connectivity before planning an end-to-end evaluation. +::: + Rook terminal home showing the autonomous agent testing workflow ## Conversation Testing and Autonomous Testing @@ -109,3 +115,4 @@ Use staging endpoints, disposable fixtures, and --concurrency 1 for - [Test your first agent](/support/docs/rook-quickstart/) - [Choose a real-world setup](/support/docs/rook-use-cases/) - [Browse every command](/support/docs/rook-command-reference/) +- [Review public releases and the changelog](https://github.com/LambdaTest/rook) diff --git a/docs/rook-quickstart.md b/docs/rook-quickstart.md index 05075e697..7471dca84 100644 --- a/docs/rook-quickstart.md +++ b/docs/rook-quickstart.md @@ -22,13 +22,18 @@ Replace the example filenames, URL, token, and JSON fields with values from your ## What You Need -- [Rook installed and authenticated](/support/docs/rook-installation/). +- [Rook installed](/support/docs/rook-installation/), with rook doctor showing the intended environment. +- A reachable Rook controller and an authenticated LambdaTest account. - A local PRD or specification for the agent. - A working staging cURL request. - Test data that the agent is allowed to read or change. Do not use a production refund endpoint for this walkthrough. +:::warning Public 0.1.0 limitation +As verified on August 17, 2026, the production controller hostname in public version 0.1.0 is not resolvable, so the model-backed steps in this walkthrough cannot complete with the default production configuration. Do not substitute a private or staging controller unless your Rook administrator explicitly gives you that environment and access. You can still install the CLI, read /guide and /help, run diagnostics, and prepare the PRD and staging request. +::: + ## Step 1: Open the Specification Workspace Open a terminal in the folder that contains your product materials: diff --git a/docs/rook-troubleshooting.md b/docs/rook-troubleshooting.md index 0df01a03d..d13c074dc 100644 --- a/docs/rook-troubleshooting.md +++ b/docs/rook-troubleshooting.md @@ -53,35 +53,70 @@ command -v rook echo "$PATH" ``` -If you installed a tarball manually, link `rook-/bin/rook` into a directory already on `PATH`. +If you installed a public archive manually, link `~/.testmuai/rook-/bin/rook` into a directory already on `PATH`. -### Node.js version error +For the public shell installer, the default command link is `~/.local/bin/rook`: -Rook requires Node.js 20 or newer: +```bash +export PATH="$HOME/.local/bin:$PATH" +``` + +### npm reports a Node.js version error + +The npm installation method requires Node.js 20 or newer: ```bash node --version ``` -Upgrade Node.js and rerun `rook --version`. +Upgrade Node.js and repeat: -### GitHub download is unauthorized +```bash +npm install -g @testmuai/rook +``` + +The public shell archives and Homebrew formula carry their own Rook runtime, so you do not need to preinstall Node.js for those methods. -Confirm that the authenticated GitHub account can read the private repository: +### The shell installer reports `BASH_SOURCE[0]: unbound variable` + +The documented pipe form is broken in Rook 0.1.0. Download and execute the script as a file: ```bash -gh auth status -gh repo view LambdatestIncPrivate/rook +rook_installer="$(mktemp "${TMPDIR:-/tmp}/rook-install.XXXXXX")" +curl -fsSL https://raw.githubusercontent.com/LambdaTest/rook/main/install.sh \ + -o "$rook_installer" && + bash "$rook_installer" +rm -f "$rook_installer" ``` -Then retry the installer using `gh auth token`. +Do not remove checksum verification or pipe a modified copy around the failure. + +### Homebrew wants to install or upgrade Node.js + +This is version 0.1.0 formula behavior. The installed Rook CLI uses its bundled Node.js runtime, but the formula declares Homebrew Node as a dependency used to run npm during installation. Homebrew can therefore propose Node.js and related dependency upgrades even when it pours a precompiled Rook bottle. + +Review the proposed Homebrew changes before confirming. Use the public shell installer if you want to avoid Homebrew's dependency transaction. + +### Windows installation does not run + +The shell installer and Homebrew path support macOS and Linux, not native Windows. The npm package publishes a Windows x64 runtime and npm command shim, but version 0.1.0 has a known, not-fully-validated gap in resolving its bundled runtime. Install Node.js 20 or newer before evaluating the npm method, and confirm startup on your machine before relying on it. Windows arm64 is not supported. For the fully validated 0.1.0 journey, run Rook inside WSL, Linux, or macOS. + +### The checksum does not match + +The shell installer calculates the downloaded archive's SHA-256 and compares it with the public release sidecar. Do not bypass a mismatch. Remove the partial install, download again, and check whether a proxy is rewriting release downloads. + +Review the assets directly on the [public Rook releases page](https://github.com/LambdaTest/rook/releases). ### Download resets after the release lookup -Release assets are served from a different GitHub asset domain. A VPN or corporate proxy can allow the repository request and reset the redirected asset download. Try the installer off VPN or use: +Release assets are served from a GitHub asset domain that can be handled differently by a VPN or corporate proxy. Retry outside the proxy, or download the platform archive and matching `.sha256` file from the public release page. + +For example, if the optional GitHub CLI is installed: ```bash -gh release download --repo LambdatestIncPrivate/rook --pattern '*.tar.gz' +gh release download v0.1.0 \ + --repo LambdaTest/rook \ + --pattern 'rook-0.1.0-darwin-arm64.tar.gz*' ``` ## Authentication and Credits @@ -97,7 +132,9 @@ If the token was revoked, logging in again is required. Nothing signs in automat ### Controller is unreachable -Check `rook doctor`. A network failure is not evidence that the token is invalid. Verify VPN, DNS, proxy, and controller availability before repeating login. +Check the controller URL printed by `rook doctor`. A network failure is not evidence that the token is invalid. Verify DNS, proxy, and controller availability before repeating login. + +As verified on August 17, 2026, the production hostname configured in the public 0.1.0 package, `rook-api.lambdatest.com`, is not resolvable. This blocks `/explore`, `/generate`, `/run`, and other model-backed work in the default production environment. Local profile setup can still use request-field heuristics and probe a reachable agent target, although controller-assisted classification is unavailable. Installation and headless `rook doctor` can also exit successfully because doctor prints the configured endpoint; it does not prove DNS reachability. If the controller remains unreachable, confirm the network, VPN, or proxy requirements with your Rook administrator. diff --git a/docs/rook-use-cases.md b/docs/rook-use-cases.md index c8454a06a..bfe6af704 100644 --- a/docs/rook-use-cases.md +++ b/docs/rook-use-cases.md @@ -21,6 +21,10 @@ You do not need the Rook source code, and your workspace does not need to contai Use this page to choose the journey that matches the access you actually have. +:::note Current public release +These are supported testing patterns and setup examples. As verified on August 17, 2026, the default production controller in public Rook 0.1.0 is unavailable, so controller-backed commands cannot complete until that service is deployed. You can prepare the workspaces, PRDs, profiles, test data, and expected evidence now. +::: + ## Access Matrix | Your access | Explore | Invoke | What Rook can establish | @@ -262,7 +266,52 @@ Switch to another verified profile and repeat the same scenario IDs. Runs retain Do not use a production profile for scenarios that can write. Rook does not provide rollback. -## Use Case 10: Continuous Regression Testing +## Use Case 10: Verify What the Agent Did, Not Only What It Said + +**Situation:** An expense agent reads an expense, applies a category limit, approves or rejects it, and writes an audit record for every tool call. + +Suppose the policy says: + +| Category | Limit | Required action above the limit | +|---|---:|---| +| Meals | $100 | Reject and notify a manager | +| Software | $200 | Reject and notify a manager | +| Travel | $1,000 | Reject and notify a manager | + +The test request is: + +~~~json +{ + "input": "Please review EXP-1002", + "session_id": "rook-SC-004" +} +~~~ + +The live agent responds: + +~~~text +EXP-1002 approved for $450. This is within the $200 limit for software. +~~~ + +This is a functional failure even though the reply is fluent. Strong evidence includes all three facts: + +1. The expense amount is $450. +2. The policy limit is $200. +3. The session-scoped audit record contains approve_expense and does not contain the required manager notification. + +Generate focused scenarios: + +~~~text +/generate -- test every category boundary, already-reimbursed expenses, unknown IDs, and manager escalation +~~~ + +Configure the request's session field as {{session}} so the live agent's audit records can be isolated during manual investigation. In tested version 0.1.0 behavior, that generated session value is available to the agent invocation but not to the judge's read-only verification request. Rook can therefore compare $450 with the $200 policy limit, but it cannot safely attribute an audit record to this exact scenario automatically. + +Record the tool-call assertion as Unable to Verify with version 0.1.0. Do not use approve_expense or another write operation to check the result; verification must not create the state it is checking. An unscoped audit lookup is also insufficient because it can mix evidence from concurrent or earlier scenarios. + + + +## Use Case 11: Continuous Regression Testing After the interactive journey is verified, use headless commands: