This release is a pre-release and may not be stable for production use.
An evidence-first agent harness for replayable, verifiable AI UI automation.
Quick Start • Why FSQ • Platforms • Documentation • Contributing
Why FSQ?
|
Evidence-First Every step captures screenshots, UI snapshots, and action traces. You verify through evidence, not agent self-reports. |
Replayable Successful AI runs auto-generate strict YAML. Replay deterministically without LLM — same harness, same evidence, zero flakiness. |
Verifiable Results are judged by an evidence-based verifier, not the agent claiming success. Auditable, trustworthy, CI-ready. |
Other AI agents say "I'm done." FSQ shows you the proof.
See It in Action
┌──────────────────────────────────────────────────────────────────────┐
│ $ cd /path/to/workspaces/web-demo │
│ $ fsq case create --platform web │
│ --goal "Search for FSQ on Bing" │
├──────────────────────────────────────────────────────────────────────┤
│ ► Planning: 3 key actions identified │
│ ► Step 1: startBrowser 📸 screenshot + UI snapshot │
│ ► Step 2: navigateTo bing.com 📸 screenshot + UI snapshot │
│ ► Step 3: typeText "FSQ" 📸 screenshot + UI snapshot │
│ ► Step 4: pressKey Enter 📸 screenshot + UI snapshot │
│ ► Verification: PASSED ✅ (evidence-based) │
│ ► Recording manifest → .fsq/runs/web/<run-id>/recording.json │
│ ► Replayable YAML → .fsq/runs/web/<run-id>/recorded.fsq.yaml │
└──────────────────────────────────────────────────────────────────────┘
What Can FSQ Do?
| Dynamic Mode 🤖 AI-driven exploration |
Strict Mode 🔁 Deterministic replay |
|
|---|---|---|
| AI explores and operates your app | ✅ | — |
| Evidence captured on every step | ✅ | ✅ |
| Auto-generates replayable YAML | ✅ | — |
| Deterministic regression execution | — | ✅ |
| AI-powered visual assertions | ✅ | ✅ |
| Runs without LLM | — | ✅ |
The Dual Loop: AI explores → evidence proves it worked → strict YAML locks it down → replay catches regressions.
Quick Start
1. Install
pip install fsq-agent
Using uv (recommended for development)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv sync --extra dev
The default installation includes the Python dependencies for Android, Web, Windows, and macOS. FSQ does not use platform extras. Applications, browsers, devices, and host services such as Appium remain system prerequisites.
2. Initialize a Workspace
mkdir web-demo && cd web-demo
fsq init --platform web --browser-channel chrome
init uses the exact current directory as the Workspace root and derives the Workspace name from that directory. It initializes one platform per invocation. To configure another platform in the same Workspace, run init again from the same directory:
cd /path/to/workspaces/web-demo
# Initialize Web. The executable path is optional when one matching browser is discoverable.
fsq init \
--platform web \
--browser-channel chrome
# Add Android to the same registered workspace.
fsq init \
--platform android \
--app-id com.example.app
Platform target options are:
| Platform | init target options |
|---|---|
| Android | --app-id APP_ID (required) |
| Web | --browser-channel CHANNEL (required), optional --browser-executable-path FILE |
| Windows | --app-path PATH (required), plus optional --window-title-re and --launch-args |
| macOS | --bundle-id or --app-path (at least one required) |
Repeating an equal platform configuration returns unchanged. If its target or private environment mapping differs, pass --update-existing to replace only that platform's target and --env NAME=VALUE entries. Use fsq --output json init ... or --output jsonl for machine output. init checks readiness but never installs Driver/Runtime packages or system prerequisites.
Run fsq doctor from the exact Workspace root to inspect configured-platform readiness. Commands do not search parent directories or migrate legacy .fsq/config.yaml and .fsq-agent-workspace layouts.
3. Configure a Provider
Configure and inspect the user-level Provider from any directory:
fsq providers configure github_copilot
fsq providers status
| Provider | Setup |
|---|---|
| GitHub Copilot GPT | Model name and GitHub device-code authentication |
| Azure GPT | Azure OpenAI-compatible base URL, model/deployment name, and API key |
Provider configuration is stored under ~/.fsq and shared with the Control Plane UI. Azure OpenAI can be configured with fsq providers configure azure_openai.
4. Create and Test Cases
cd /path/to/workspaces/web-demo
# AI-driven exploration with evidence and a Run-local candidate Case
fsq case create --platform web \
--goal "Open https://www.bing.com, search for 'FSQ automation', verify results appear."
# Deterministic execution of an existing Case
fsq case test --platform web path/to/case.fsq.yaml
# Execute once, then ask AI to analyze the persisted execution facts
fsq case test --platform web --suggest path/to/case.fsq.yaml
Every execution writes evidence and reports under .fsq/runs/<platform>/<run-id>/. Suggestions and candidate Cases are Run-local and never overwrite the source Case or cases/<platform>. Inspect history with fsq runs list, fsq runs show RUN_ID, and fsq runs logs RUN_ID. fsq runs show RUN_ID --open builds and opens an offline static HTML report.
Control Plane
Launch the local browser Control Plane for multi-platform workspace management, platform readiness, target and case discovery, Explore runs, Strict Replay, and live evidence:
fsq ui
It listens on 127.0.0.1:8879 and opens a browser by default. Use --host, --port, and --no-open-browser to override those defaults. A wheel installation includes the compiled frontend and needs no Node.js runtime. From a source checkout, run npm ci && npm run build before starting the Control Plane.
Supported Platforms
| Platform | Backend | Install |
|---|---|---|
| 🌐 Web | Playwright | Included with fsq-agent |
| 📱 Android | uiautomator2 | Included with fsq-agent |
| 🖥️ Windows | pywinauto | Included with fsq-agent |
| 🍎 macOS | Appium Mac2 | Included with fsq-agent |
All platforms share the same HarnessInterface, evidence model, and FSQ YAML format. A registered workspace may configure one or more platforms independently:
<workspace-root>/
.fsq/config/config.<platform>.yaml
cases/<platform>/
knowledge/<platform>/
.fsq/runs/<platform>/
Workspace commands use the exact current directory as the registered Workspace root. fsq doctor checks all configured platforms; fsq case create/test select a platform; fsq runs queries Workspace history across all platforms unless filtered. fsq ui starts the browser Control Plane and uses its own Workspace selection.
Platform setup details
Web — Set the browser executable in .fsq/config/config.web.yaml:
target:
browser_executable_path: /usr/bin/google-chrome
Android — Set the app ID in .fsq/config/config.android.yaml, then select a connected ADB device per run:
target:
app_id: com.example.app
cd /path/to/workspaces/my-workspace
fsq case create --platform android --goal "Open the app"
Device selection and readiness are resolved from the initialized Workspace and connected-device state.
Windows — Keep backend_kind in the repository preset config.windows.yaml; set app-specific values in .fsq/config/config.windows.yaml:
target:
app_path: C:\Program Files\MyApp\app.exe
window_title_re: .*MyApp.*
macOS — Keep appium_server_url in the repository preset config.macos.yaml; set the app identity in .fsq/config/config.macos.yaml:
target:
bundle_id: com.example.app
How It Works
The Dual Loop in a nutshell:
- Dynamic (AI) → LLM agent explores → evidence captured at every step → replayable YAML generated
- Strict (Replay) → replays YAML deterministically (no LLM) → evidence captured → pass/fail
Compared To...
| FSQ | Browser Use | Midscene.js | Playwright | Appium | |
|---|---|---|---|---|---|
| Evidence per step | ✅ screenshots + UI snapshots + traces | ❌ | ❌ | ❌ | ❌ |
| AI → Replay YAML | ✅ auto-generated strict cases | ❌ | ❌ | Codegen (manual) | ❌ |
| Verification | Evidence-based verifier | Agent self-report | Vision assert | Manual assertion | Manual assertion |
| Cross-platform | Web + Android + Windows + macOS | Web only | Web + Mobile | Web only | Multi (different APIs) |
| Runs without LLM | ✅ Strict mode | ❌ | ❌ | ✅ | ✅ |
| Extensible harness | Protocol-based plugin system | ❌ | ❌ | ❌ | Driver plugins |
Documentation
| Resource | Description |
|---|---|
| Architecture Overview | Dual Loop design and module structure |
| Platform Setup | Detailed per-platform configuration |
| FSQ YAML Reference | DSL syntax, lifecycle hooks, replay semantics |
| Harness Development Guide | Build a new platform harness |
| Roadmap | Product direction and planned phases |
| Governance | Roles, decisions, and maintainer responsibilities |
Contributing
We welcome contributions! FSQ is designed to be extended.
git clone https://github.com/microsoft/FSQ.git && cd FSQ
uv sync --extra dev
npm ci && npm run build
uv run python -m pytest
Ways to contribute:
| Path | For whom |
|---|---|
| 🐛 Report bugs / suggest features | Everyone |
| 📝 Improve docs and examples | Beginners welcome |
| 🧪 Add FSQ YAML test cases | QA engineers |
| 🔌 Build a new platform harness | Platform experts |
| ⚡ Improve agent / verification | AI engineers |
See CONTRIBUTING.md for the full guide and contributor growth path. Project decisions and role progression follow GOVERNANCE.md.
License
MIT — Copyright (c) Microsoft Corporation.
Built with ❤️ by the FSQ team at Microsoft
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fsq_agent-0.1.0a1.tar.gz.
File metadata
- Download URL: fsq_agent-0.1.0a1.tar.gz
- Upload date:
- Size: 692.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
663b3c5b64daba5e3539d6c141a673046fe63c36fcf0c2e9e3adb908380b2eeb
|
|
| MD5 |
88d298ae089754a245d2cdd470c62b39
|
|
| BLAKE2b-256 |
6637828ce93c7b66ef646a2c138b9298540cfcf691239b30e07825945410bd31
|
File details
Details for the file fsq_agent-0.1.0a1-py3-none-any.whl.
File metadata
- Download URL: fsq_agent-0.1.0a1-py3-none-any.whl
- Upload date:
- Size: 815.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e7e5d7f9dbd64948c1f2364a74ed0343fc9d4ab229033e684b2188cb005660a
|
|
| MD5 |
33a4c9e90f2aaf91a9cad43296ac72a2
|
|
| BLAKE2b-256 |
66c6d52e58573ff54457df47f0e386fd43b10a79a366b926ae80e766a5a95b66
|