From 30b6dcc8e6b45ff62e2b43b44601906b18e43f53 Mon Sep 17 00:00:00 2001
From: abrichr
Date: Wed, 26 Aug 2026 12:52:28 -0400
Subject: [PATCH 1/5] Add GUI automation discovery guides
---
data/compare/api.json | 80 ++++++
data/compare/autohotkey.json | 82 +++++++
data/compare/computer-use-agents.json | 2 +-
data/compare/playwright.json | 80 ++++++
data/compare/power-automate.json | 2 +-
data/compare/selenium.json | 80 ++++++
data/compare/uipath.json | 2 +-
data/comparisons.js | 111 ++++++++-
pages/compare.js | 12 +
pages/compare/[slug].js | 26 +-
pages/guides/automate-repetitive-gui-tasks.js | 228 ++++++++++++++++++
public/llms-full.txt | 61 ++++-
public/llms.txt | 7 +-
public/sitemap.xml | 30 +++
tests/comparisonPages.test.js | 4 +
tests/growthGenerators.test.js | 13 +-
tests/guiAutomationGuide.test.js | 49 ++++
17 files changed, 834 insertions(+), 35 deletions(-)
create mode 100644 data/compare/api.json
create mode 100644 data/compare/autohotkey.json
create mode 100644 data/compare/playwright.json
create mode 100644 data/compare/selenium.json
create mode 100644 pages/guides/automate-repetitive-gui-tasks.js
create mode 100644 tests/guiAutomationGuide.test.js
diff --git a/data/compare/api.json b/data/compare/api.json
new file mode 100644
index 00000000..bd1fbd82
--- /dev/null
+++ b/data/compare/api.json
@@ -0,0 +1,80 @@
+{
+ "slug": "api",
+ "competitor": "a supported API",
+ "positioningSummary": "Use a supported API whenever it exposes the full operation. Use OpenAdapt only for the UI-bound remainder, and use a read-only API as the verifier when one exists.",
+ "dimensions": [
+ {
+ "id": "determinism-on-drift",
+ "label": "Determinism when interfaces drift",
+ "openadapt": "A compiled workflow re-resolves targets from retained evidence, produces a governed repair proposal, or halts when the visible interface changes beyond its contract.",
+ "them": "An API bypasses interface layout entirely. Its callers depend on the service's published request, response, authentication, and versioning contract instead of screen geometry.",
+ "sources": [
+ {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "cost-per-run",
+ "label": "Cost per run",
+ "openadapt": "A healthy compiled run makes no model call, but GUI execution still needs a browser, desktop, or remote session.",
+ "them": "A direct HTTP API exchanges request and response messages without GUI actuation. Provider charges and rate limits are service-specific.",
+ "sources": [
+ {"label": "HTTP messages", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "verification-of-effects",
+ "label": "Verification of business effects",
+ "openadapt": "OpenAdapt separates actuation from verification. A read-only API, SQL query, file check, or second interface can prove the effect after the GUI action.",
+ "them": "A response status describes how the server handled the request. For consequential work, the caller can add a separate read-back or postcondition check instead of treating request acceptance as the complete business result.",
+ "sources": [
+ {"label": "HTTP status code semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "halting-behavior",
+ "label": "Halting behavior",
+ "openadapt": "The workflow refuses before actuation when identity, target, or policy checks fail. If an action may have been dispatched but its effect cannot be proved, it returns RECONCILIATION_REQUIRED without a blind retry.",
+ "them": "The client owns error handling, idempotency, retries, and reconciliation. HTTP defines conditional request and method semantics, but the application must use them correctly.",
+ "sources": [
+ {"label": "HTTP conditional requests", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-conditional-requests"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "data-locality",
+ "label": "Data locality",
+ "openadapt": "The GUI runtime and retained evidence can stay inside a customer-controlled boundary.",
+ "them": "The client sends request messages to the API server. The service's deployment contract governs the data after it crosses that network boundary.",
+ "sources": [
+ {"label": "HTTP messages", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"},
+ {"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
+ ]
+ },
+ {
+ "id": "scope",
+ "label": "Scope: browser, desktop, RDP/Citrix",
+ "openadapt": "OpenAdapt handles operations that exist only through browser, native desktop, or customer-qualified remote-window interfaces.",
+ "them": "An API is the best fit when the service owner exposes the complete operation through a supported machine interface. HTTP defines the exchange, while the service defines the available business operations.",
+ "sources": [
+ {"label": "OpenAdapt comparison overview", "url": "https://openadapt.ai/compare"},
+ {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}
+ ]
+ }
+ ],
+ "strengths": [
+ {"text": "A direct API bypasses screen rendering, focus, pointer movement, and visual target resolution.", "source": {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
+ {"text": "Requests and responses can carry typed, machine-readable data and explicit status codes.", "source": {"label": "HTTP message semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"}},
+ {"text": "Authentication and conditional requests have standard protocol semantics that clients can test directly.", "source": {"label": "HTTP authentication and conditions", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
+ {"text": "The service owner can support the integration contract as the user interface changes.", "source": null}
+ ],
+ "faq": [
+ {
+ "question": "Should I use OpenAdapt when an API already does the job?",
+ "answer": "No. Use the supported API for the complete operation. OpenAdapt fits the steps the API does not expose, and the API can still serve as an independent verifier after GUI actuation.",
+ "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/api"}]
+ }
+ ]
+}
diff --git a/data/compare/autohotkey.json b/data/compare/autohotkey.json
new file mode 100644
index 00000000..e2e7ab11
--- /dev/null
+++ b/data/compare/autohotkey.json
@@ -0,0 +1,82 @@
+{
+ "slug": "autohotkey",
+ "competitor": "AutoHotkey",
+ "positioningSummary": "AutoHotkey is a fast local tool for Windows hotkeys and macros. OpenAdapt is for shared workflows that need retained evidence, governed repair, qualification, and independent effect verification.",
+ "dimensions": [
+ {
+ "id": "determinism-on-drift",
+ "label": "Determinism when interfaces drift",
+ "openadapt": "A compiled workflow resolves targets from retained evidence and halts or proposes a reviewable repair when the interface leaves its contract.",
+ "them": "An AutoHotkey script deterministically sends the commands its author wrote. Coordinate and active-window macros can break under layout changes; control-oriented scripts can be more stable when the application exposes useful controls.",
+ "sources": [
+ {"label": "AutoHotkey Send", "url": "https://www.autohotkey.com/docs/v2/lib/Send.htm"},
+ {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"},
+ {"label": "AutoHotkey ControlSend", "url": "https://www.autohotkey.com/docs/v2/lib/ControlSend.htm"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "cost-per-run",
+ "label": "Cost per run",
+ "openadapt": "The MIT local runtime has no per-run license fee, and a healthy compiled run makes no model call.",
+ "them": "AutoHotkey is free and open source. A normal local macro has no per-run license fee and makes no model call.",
+ "sources": [
+ {"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "verification-of-effects",
+ "label": "Verification of business effects",
+ "openadapt": "A consequential run returns VERIFIED only after an independent check proves the intended change in the system of record.",
+ "them": "AutoHotkey can read window and control state, but the author must build any business-level read-back, file check, database query, or other effect oracle.",
+ "sources": [
+ {"label": "AutoHotkey ControlSend", "url": "https://www.autohotkey.com/docs/v2/lib/ControlSend.htm"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "halting-behavior",
+ "label": "Halting behavior",
+ "openadapt": "Identity, target, policy, and effect checks define explicit halt conditions, and uncertain delivery is preserved for reconciliation.",
+ "them": "The script decides when to stop. AutoHotkey supplies exceptions, return values, window waits, and process control, but it does not impose a business transaction outcome contract.",
+ "sources": [
+ {"label": "AutoHotkey WinWait", "url": "https://www.autohotkey.com/docs/v2/lib/WinWait.htm"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "data-locality",
+ "label": "Data locality",
+ "openadapt": "Recordings, compiled bundles, and run evidence can stay in a customer-controlled boundary.",
+ "them": "AutoHotkey runs on the Windows machine. Data stays local unless the script sends it to another service.",
+ "sources": [
+ {"label": "AutoHotkey overview", "url": "https://www.autohotkey.com/"},
+ {"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
+ ]
+ },
+ {
+ "id": "scope",
+ "label": "Scope: browser, desktop, RDP/Citrix",
+ "openadapt": "The runtime covers browser, native desktop, and customer-qualified remote-window workflows, with current scope bound to published qualification evidence.",
+ "them": "AutoHotkey targets Windows input, windows, and controls. It can drive whatever is visible to that Windows session, but remote and browser semantics remain the script author's responsibility.",
+ "sources": [
+ {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"},
+ {"label": "OpenAdapt qualification evidence", "url": "https://docs.openadapt.ai/get-started/what-works-today/"}
+ ]
+ }
+ ],
+ "strengths": [
+ {"text": "Send can simulate keystrokes and mouse clicks in the active window.", "source": {"label": "AutoHotkey Send", "url": "https://www.autohotkey.com/docs/v2/lib/Send.htm"}},
+ {"text": "ControlClick and ControlSend can target a window control without relying only on the current pointer position.", "source": {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"}},
+ {"text": "Small hotkey, remapping, and text-expansion scripts are quick to write and easy for one operator to run.", "source": {"label": "AutoHotkey quick reference", "url": "https://www.autohotkey.com/docs/v2/"}},
+ {"text": "The runtime is free, open source, and local to Windows.", "source": {"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"}}
+ ],
+ "faq": [
+ {
+ "question": "When should a personal macro become an OpenAdapt workflow?",
+ "answer": "The change makes sense when other people depend on it, failures become hard to see, the target drifts often, or a wrong business result costs more than a visible macro error.",
+ "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/autohotkey"}]
+ }
+ ]
+}
diff --git a/data/compare/computer-use-agents.json b/data/compare/computer-use-agents.json
index 95b81f40..66eb6c24 100644
--- a/data/compare/computer-use-agents.json
+++ b/data/compare/computer-use-agents.json
@@ -44,7 +44,7 @@
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt":
- "Every consequential run ends VERIFIED or HALTED based on an independent check of the system of record, with silent incorrect success counted as a tracked failure metric in published evidence.",
+ "VERIFIED requires an independent check of the system of record. Refusal before effect and RECONCILIATION_REQUIRED after uncertain delivery remain distinct, with silent incorrect success counted in published evidence.",
"them":
"The acting model reports task completion from what it sees; providers direct developers to keep a human in the loop for high-impact actions rather than providing an out-of-band business-effect oracle.",
"sources": [
diff --git a/data/compare/playwright.json b/data/compare/playwright.json
new file mode 100644
index 00000000..abe74dd1
--- /dev/null
+++ b/data/compare/playwright.json
@@ -0,0 +1,80 @@
+{
+ "slug": "playwright",
+ "competitor": "Playwright",
+ "positioningSummary": "Playwright is the direct choice for developer-owned browser automation. OpenAdapt is for demonstrated workflows that cross GUI surfaces or need governed effect verification and explicit outcomes.",
+ "dimensions": [
+ {
+ "id": "determinism-on-drift",
+ "label": "Determinism when interfaces drift",
+ "openadapt": "A compiled workflow replays from retained evidence. If the target cannot be resolved or verified, the run halts or produces a reviewable repair proposal.",
+ "them": "A Playwright script replays explicit code. User-facing locators and auto-waiting make ordinary page changes easier to tolerate, but a changed contract still requires code or locator maintenance.",
+ "sources": [
+ {"label": "Playwright locators", "url": "https://playwright.dev/docs/locators"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "cost-per-run",
+ "label": "Cost per run",
+ "openadapt": "The MIT local runtime has no per-run license fee, and a healthy compiled run makes no model call.",
+ "them": "The Playwright library is open source. A normal script makes no model call, while browser, compute, and any grid service remain operating costs.",
+ "sources": [
+ {"label": "Playwright repository and license", "url": "https://github.com/microsoft/playwright"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "verification-of-effects",
+ "label": "Verification of business effects",
+ "openadapt": "A consequential run can finish only after an independent verifier checks the intended effect against the system of record.",
+ "them": "Playwright supplies web assertions and retrying checks. The developer decides whether those assertions inspect the page, a separate API, a database, or another effect oracle.",
+ "sources": [
+ {"label": "Playwright auto-retrying assertions", "url": "https://playwright.dev/docs/test-assertions"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "halting-behavior",
+ "label": "Halting behavior",
+ "openadapt": "Identity, target, policy, and effect checks define halt conditions. An uncertain write is preserved for reconciliation and is not retried blindly.",
+ "them": "Playwright waits for actionability before an action and fails an action when its checks or timeouts do not pass. Business retry and reconciliation behavior belongs to the script.",
+ "sources": [
+ {"label": "Playwright actionability", "url": "https://playwright.dev/docs/actionability"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "data-locality",
+ "label": "Data locality",
+ "openadapt": "Recordings, compiled bundles, and run evidence can stay in a customer-controlled boundary on the MIT runtime.",
+ "them": "Playwright can run on local or customer-controlled machines. Data leaves that boundary only when the script or its surrounding services send it elsewhere.",
+ "sources": [
+ {"label": "Playwright installation and local browser support", "url": "https://playwright.dev/docs/intro"},
+ {"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
+ ]
+ },
+ {
+ "id": "scope",
+ "label": "Scope: browser, desktop, RDP/Citrix",
+ "openadapt": "The runtime covers browser, native desktop, and customer-qualified remote-window workflows. Each exact surface remains bound to its published qualification evidence.",
+ "them": "Playwright automates Chromium, Firefox, and WebKit. It is a browser library, not a native desktop or remote-window automation system.",
+ "sources": [
+ {"label": "Playwright browser support", "url": "https://playwright.dev/"},
+ {"label": "OpenAdapt qualification evidence", "url": "https://docs.openadapt.ai/get-started/what-works-today/"}
+ ]
+ }
+ ],
+ "strengths": [
+ {"text": "User-facing locators prioritize roles, labels, text, and test IDs instead of long CSS or XPath chains.", "source": {"label": "Playwright locators", "url": "https://playwright.dev/docs/locators"}},
+ {"text": "Actionability checks wait for visibility, stability, event reception, and enabled state before common actions.", "source": {"label": "Playwright actionability", "url": "https://playwright.dev/docs/actionability"}},
+ {"text": "One API supports Chromium, Firefox, and WebKit across major operating systems.", "source": {"label": "Playwright overview", "url": "https://playwright.dev/"}},
+ {"text": "The project supports TypeScript, JavaScript, Python, Java, and .NET.", "source": {"label": "Playwright languages", "url": "https://playwright.dev/docs/languages"}}
+ ],
+ "faq": [
+ {
+ "question": "Should I replace a working Playwright script with OpenAdapt?",
+ "answer": "Usually not. Keep a well-owned browser script when it covers the full task and its assertions prove the right result. Consider OpenAdapt when the work crosses surfaces, starts from a human demonstration, or needs a governed verification contract.",
+ "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/playwright"}]
+ }
+ ]
+}
diff --git a/data/compare/power-automate.json b/data/compare/power-automate.json
index 3b4a24db..51e66aee 100644
--- a/data/compare/power-automate.json
+++ b/data/compare/power-automate.json
@@ -40,7 +40,7 @@
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt":
- "Every consequential run ends VERIFIED or HALTED based on an out-of-band check of the system of record - REST readback, SQL, table-delta audit, or file arrival - never the acting session's own report.",
+ "VERIFIED requires an out-of-band check of the system of record, such as REST readback, SQL, table-delta audit, or file arrival. Refusal before effect and uncertain delivery remain separate typed outcomes.",
"them":
"Cloud flows surface run history and error details in the Power Platform admin center; Dataverse stores the data flows act on. Verification of a desktop flow's business effect is typically expressed as configured assertions or downstream checks the builder authors.",
"sources": [
diff --git a/data/compare/selenium.json b/data/compare/selenium.json
new file mode 100644
index 00000000..f8c20bdb
--- /dev/null
+++ b/data/compare/selenium.json
@@ -0,0 +1,80 @@
+{
+ "slug": "selenium",
+ "competitor": "Selenium",
+ "positioningSummary": "Selenium is the established standards-based choice for browser control. OpenAdapt adds demonstration-based compilation and a governed result contract across browser, desktop, and remote interfaces.",
+ "dimensions": [
+ {
+ "id": "determinism-on-drift",
+ "label": "Determinism when interfaces drift",
+ "openadapt": "A compiled workflow replays from retained evidence, re-resolves within its contract, proposes a governed repair, or halts.",
+ "them": "WebDriver runs explicit commands against selected elements. Changed locators or page behavior require waits, fallback logic, or code maintenance by the owner.",
+ "sources": [
+ {"label": "Selenium WebDriver", "url": "https://www.selenium.dev/documentation/webdriver/"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "cost-per-run",
+ "label": "Cost per run",
+ "openadapt": "The MIT local runtime has no per-run license fee, and healthy compiled replay makes no model call.",
+ "them": "Selenium is open source and a normal WebDriver run makes no model call. Browser fleet, grid, and maintenance costs depend on the deployment.",
+ "sources": [
+ {"label": "Selenium project", "url": "https://www.selenium.dev/about/"},
+ {"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
+ ]
+ },
+ {
+ "id": "verification-of-effects",
+ "label": "Verification of business effects",
+ "openadapt": "An independent verifier can check the system of record before a consequential run returns VERIFIED.",
+ "them": "WebDriver returns browser command results. The automation author must add page assertions or a separate API, database, file, or service check for the business effect.",
+ "sources": [
+ {"label": "Selenium WebDriver commands", "url": "https://www.selenium.dev/documentation/webdriver/"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "halting-behavior",
+ "label": "Halting behavior",
+ "openadapt": "The workflow refuses before actuation when identity, target, or policy checks fail. If delivery may have occurred but the effect cannot be proved, it returns RECONCILIATION_REQUIRED without a blind retry.",
+ "them": "Selenium supports explicit and implicit waits, then raises errors when conditions or commands fail. Retry, rollback, and reconciliation rules live in the surrounding test or application code.",
+ "sources": [
+ {"label": "Selenium waits", "url": "https://www.selenium.dev/documentation/webdriver/waits/"},
+ {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ ]
+ },
+ {
+ "id": "data-locality",
+ "label": "Data locality",
+ "openadapt": "Recordings, compiled bundles, and run evidence can remain on customer-controlled infrastructure.",
+ "them": "WebDriver can run locally or through a remote endpoint. The operator controls whether screenshots and browser data stay local or travel to a grid service.",
+ "sources": [
+ {"label": "Selenium remote WebDriver", "url": "https://www.selenium.dev/documentation/webdriver/drivers/remote_webdriver/"},
+ {"label": "OpenAdapt trust center", "url": "https://openadapt.ai/security"}
+ ]
+ },
+ {
+ "id": "scope",
+ "label": "Scope: browser, desktop, RDP/Citrix",
+ "openadapt": "The runtime covers browser, native desktop, and customer-qualified remote-window workflows, subject to the exact published qualification evidence.",
+ "them": "Selenium WebDriver drives major browsers locally or remotely. It does not provide native desktop or remote-window GUI automation.",
+ "sources": [
+ {"label": "Selenium WebDriver", "url": "https://www.selenium.dev/documentation/webdriver/"},
+ {"label": "OpenAdapt qualification evidence", "url": "https://docs.openadapt.ai/get-started/what-works-today/"}
+ ]
+ }
+ ],
+ "strengths": [
+ {"text": "WebDriver became a W3C Recommendation for remote browser control in 2018.", "source": {"label": "W3C WebDriver Recommendation", "url": "https://www.w3.org/TR/2018/REC-webdriver1-20180605/"}},
+ {"text": "Selenium supports local and remote browser sessions, including distributed Grid deployments.", "source": {"label": "Selenium Grid", "url": "https://www.selenium.dev/documentation/grid/"}},
+ {"text": "The project publishes language bindings for Java, Python, C#, Ruby, JavaScript, and Kotlin.", "source": {"label": "Selenium downloads", "url": "https://www.selenium.dev/downloads/"}},
+ {"text": "Established teams can keep their existing tests, infrastructure, and maintenance practices.", "source": null}
+ ],
+ "faq": [
+ {
+ "question": "Is OpenAdapt a Selenium replacement?",
+ "answer": "No. Selenium remains a strong browser-control layer. OpenAdapt addresses a broader workflow contract: demonstration-based authoring, cross-surface replay, independent effect verification, and explicit halt behavior.",
+ "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/selenium"}]
+ }
+ ]
+}
diff --git a/data/compare/uipath.json b/data/compare/uipath.json
index 730be7ef..330c2de2 100644
--- a/data/compare/uipath.json
+++ b/data/compare/uipath.json
@@ -40,7 +40,7 @@
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt":
- "Success is established out of band - read-only API reads, SQL queries, table-delta audits, or file checks against the system of record - and every run ends VERIFIED or HALTED with preserved evidence.",
+ "Success is established out of band through read-only API reads, SQL queries, table-delta audits, or file checks. VERIFIED, refusal before effect, and RECONCILIATION_REQUIRED after uncertain delivery remain distinct outcomes with preserved evidence.",
"them":
"Orchestrator provides centralized audit trails, search, filter, and export of audit events, and queue-based transaction status. The acting session's own success signals remain the primary in-band check; an independent read-back of the business system of record is not part of the published core loop.",
"sources": [
diff --git a/data/comparisons.js b/data/comparisons.js
index c5882c51..e4c2f59e 100644
--- a/data/comparisons.js
+++ b/data/comparisons.js
@@ -19,7 +19,7 @@ export const OPENADAPT_DIFFERENTIATORS = [
},
{
title: 'Explicit transaction outcomes',
- body: 'Every consequential run ends verified or halted with a preserved run report. There is no silent third state where the workflow looked finished but the record never changed.',
+ body: 'Every consequential run ends with a typed outcome and a preserved run report. VERIFIED requires independent proof. A refusal before actuation and uncertain delivery after possible actuation remain distinct, so an unconfirmed write cannot appear as success.',
},
{
title: 'Deterministic healthy runs',
@@ -70,6 +70,7 @@ export const COMPARISONS = [
'Choose OpenAdapt when the workflows that matter are consequential transactions where you need the system of record independently confirmed after every run, when sensitive data must stay in your boundary on an inspectable MIT runtime, or when you want a zero-install lane into managed remote estates.',
honestNote:
'Recording a demonstration, visual targeting, and repairing broken selectors are not differentiators in either direction: modern RPA platforms and OpenAdapt all do these. The difference is how a run is judged and what a failure is allowed to look like.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-uipath/',
},
{
slug: 'power-automate',
@@ -91,9 +92,10 @@ export const COMPARISONS = [
chooseThem:
'Choose Power Automate when the work lives inside the Microsoft ecosystem, when a supported connector already reaches the system you need, or when low per-seat cost across many light automations matters more than transaction-level verification.',
chooseUs:
- 'Choose OpenAdapt when the last mile is a non-Microsoft or legacy GUI, when a wrong write is expensive enough that you need the business effect independently verified out of band, when runs must end in an explicit verified-or-halted outcome, or when the runtime must be open, local, and customer-controlled.',
+ 'Choose OpenAdapt when the last mile is a non-Microsoft or legacy GUI, when a wrong write is expensive enough that you need the business effect independently verified out of band, when every run needs a typed transaction outcome, or when the runtime must be open, local, and customer-controlled.',
honestNote:
'If a supported connector or API completes the workflow reliably, use it. OpenAdapt exists for the UI-only remainder where no practical API exists and correctness has to be proved, not assumed.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-power-automate/',
},
{
slug: 'computer-use-agents',
@@ -114,9 +116,10 @@ export const COMPARISONS = [
chooseThem:
'Choose a computer-use agent for exploratory, novel, or constantly changing work, for research and triage, or for tasks you will run a handful of times and never again.',
chooseUs:
- 'Choose OpenAdapt when the same consequential workflow repeats: healthy runs are deterministic with zero model calls and zero per-run token cost, every run ends verified or halted against an independent check of the system of record, and the runtime is MIT-licensed and can execute entirely inside your boundary.',
+ 'Choose OpenAdapt when the same consequential workflow repeats: healthy runs are deterministic with zero model calls and zero per-run token cost, VERIFIED requires an independent check of the system of record, uncertain delivery has its own reconciliation outcome, and the runtime is MIT-licensed and can execute entirely inside your boundary.',
honestNote:
'These approaches are complementary rather than rivals: agent providers themselves recommend human oversight for consequential actions, and OpenAdapt uses models too, at compile and repair time rather than on every healthy run. The question is whether each run should re-reason the task or replay a verified program.',
+ blogUrl: 'https://blog.openadapt.ai/posts/the-500th-run/',
},
{
slug: 'record-and-replay',
@@ -139,7 +142,7 @@ export const COMPARISONS = [
chooseUs:
'Choose OpenAdapt when a replayed action writes to a system of record that matters: the compiled program is reviewable, healthy runs are deterministic with zero model calls, the business effect is verified out of band after the run, ambiguity halts instead of guessing, and the MIT runtime plus your data can stay entirely inside your boundary.',
honestNote:
- 'Recording is the commodity; OpenAdapt does not claim to record better. The difference is governance: an independent verifier, an explicit verified-or-halted outcome for every run, and published qualification evidence per execution surface.',
+ 'Recording is the commodity; OpenAdapt does not claim to record better. The difference is governance: an independent verifier, typed transaction outcomes that preserve uncertainty, and published qualification evidence per execution surface.',
},
{
slug: 'browser-agents',
@@ -160,7 +163,7 @@ export const COMPARISONS = [
chooseThem:
'Choose a browser-agent platform for web-only, read-heavy, or exploratory automation, for prototypes, and for workloads where a failed or repeated attempt has little cost.',
chooseUs:
- 'Choose OpenAdapt when the workflow also crosses desktop or remote surfaces, when the acting session must not be the judge of its own success, when every consequential run needs an explicit verified-or-halted outcome, or when sensitive data cannot transit a vendor cloud and must run on a customer-controlled MIT runtime.',
+ 'Choose OpenAdapt when the workflow also crosses desktop or remote surfaces, when the acting session must not be the judge of its own success, when every consequential run needs a typed outcome that preserves uncertainty, or when sensitive data cannot transit a vendor cloud and must run on a customer-controlled MIT runtime.',
honestNote:
'Most browser-agent stacks judge success in-band: the same session that acted decides whether it worked. OpenAdapt verifies the business effect out of band, against the system of record, after the run.',
},
@@ -183,10 +186,106 @@ export const COMPARISONS = [
chooseThem:
'Keep a hand-rolled script when it already works, a developer owns and maintains it, and its failure modes are understood and affordable.',
chooseUs:
- 'Choose OpenAdapt when scripts have become an unowned maintenance burden, when non-developers need to author workflows by demonstration, or when you need what scripts rarely include: independent out-of-band verification of the business effect, an explicit verified-or-halted outcome with a preserved run report, and halts on ambiguity instead of best-effort clicks. The runtime is MIT-licensed, so you trade none of the openness.',
+ 'Choose OpenAdapt when scripts have become an unowned maintenance burden, when non-developers need to author workflows by demonstration, or when you need what scripts rarely include: independent out-of-band verification, typed outcomes for refusal and uncertain delivery, and a preserved run report. The runtime is MIT-licensed, so you trade none of the openness.',
honestNote:
'OpenAdapt does not claim your script cannot work. It packages the verification, outcome discipline, and audit trail that consequential scripts eventually grow by hand, and it publishes qualification evidence per surface instead of assuming coverage.',
},
+ {
+ slug: 'playwright',
+ name: 'Playwright',
+ title: 'OpenAdapt vs Playwright',
+ metaDescription:
+ 'Use Playwright for direct, developer-owned browser automation. Use OpenAdapt when a demonstrated workflow crosses surfaces or needs governed effect verification.',
+ intro: 'Playwright is an excellent browser automation library. Its locators, actionability checks, auto-waiting, tracing, and cross-browser support make it the first tool we would reach for when a developer owns a web-only workflow. OpenAdapt compiles a person’s demonstration into governed replay across browser, desktop, and remote applications.',
+ theirStrengths: {
+ heading: 'Where Playwright is strong',
+ items: [
+ 'First-class browser automation across Chromium, Firefox, and WebKit.',
+ 'User-facing locators and automatic actionability checks reduce brittle waits and selectors.',
+ 'Precise control in TypeScript, JavaScript, Python, Java, and .NET, with a strong test runner and trace viewer.',
+ 'A small Playwright script is often the clearest answer when a developer owns one stable web workflow.',
+ ],
+ },
+ chooseThem:
+ 'Choose Playwright when the workflow is browser-only, a developer can maintain the code, DOM access is available, and normal assertions can prove the result.',
+ chooseUs:
+ 'Choose OpenAdapt when the workflow starts with a human demonstration, crosses browser and desktop surfaces, runs outside the page DOM, or needs typed transaction outcomes backed by an independent effect check.',
+ honestNote:
+ 'OpenAdapt uses Playwright where browser-native identity is useful. Playwright can remain part of the OpenAdapt execution path.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-playwright/',
+ },
+ {
+ slug: 'selenium',
+ name: 'Selenium',
+ title: 'OpenAdapt vs Selenium',
+ metaDescription:
+ 'Use Selenium for standards-based browser control and established test fleets. Use OpenAdapt for demonstrated, governed workflows across GUI surfaces.',
+ intro: 'Selenium WebDriver is the durable standard for controlling browsers locally or on remote machines. It has broad language support, a large ecosystem, and years of production use. OpenAdapt does not replace that browser-control layer. It adds demonstration-based compilation, cross-surface execution, and a governed result contract for repeated business work.',
+ theirStrengths: {
+ heading: 'Where Selenium is strong',
+ items: [
+ 'A W3C-standard browser-control protocol supported by all major browsers.',
+ 'Remote WebDriver and Grid support for distributed browser fleets.',
+ 'Language bindings and a large ecosystem built over many years.',
+ 'A good fit for organizations with established Selenium tests, infrastructure, and maintainers.',
+ ],
+ },
+ chooseThem:
+ 'Choose Selenium when you need standards-based browser control, already operate a Selenium fleet, or want explicit code and assertions for a web-only workflow.',
+ chooseUs:
+ 'Choose OpenAdapt when the job must be authored by demonstration, continue into desktop or remote applications, or finish only after an independent verifier proves the intended business effect.',
+ honestNote:
+ 'A well-owned Selenium workflow should stay in place. OpenAdapt earns its keep when the work is broader than browser control or the missing parts are qualification, effect verification, and safe halting.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-selenium/',
+ },
+ {
+ slug: 'autohotkey',
+ name: 'AutoHotkey',
+ title: 'OpenAdapt vs AutoHotkey',
+ metaDescription:
+ 'Use AutoHotkey for fast personal Windows macros and hotkeys. Use OpenAdapt for governed, reviewable workflows with independent effect verification.',
+ intro: 'AutoHotkey is hard to beat for a quick Windows macro. A short script can send keys, click controls, remap input, and remove hours of personal repetition with almost no ceremony. OpenAdapt is for the point where that macro becomes shared operational software and a wrong result matters.',
+ theirStrengths: {
+ heading: 'Where AutoHotkey is strong',
+ items: [
+ 'Fast Windows hotkeys, text expansion, remapping, and desktop macros in small scripts.',
+ 'Direct control over keys, mouse input, windows, and many native controls.',
+ 'No service dependency and no model call is required to run a normal script.',
+ 'A very good fit for personal automation where the author is also the operator and maintainer.',
+ ],
+ },
+ chooseThem:
+ 'Choose AutoHotkey for a personal Windows shortcut, a compact macro, or a stable task whose occasional failure is easy for the operator to see and correct.',
+ chooseUs:
+ 'Choose OpenAdapt when several people rely on the workflow, authoring must begin with a demonstration, the target can drift, or every consequential run must end with preserved evidence and a typed transaction result.',
+ honestNote:
+ 'AutoHotkey is open, local, deterministic, and cheap. OpenAdapt does not improve those traits. It adds a compiler, retained visual evidence, reviewable repair, qualification, and independent effect checks.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-autohotkey/',
+ },
+ {
+ slug: 'api',
+ name: 'a supported API',
+ title: 'OpenAdapt vs a direct API',
+ metaDescription:
+ 'Use a supported API whenever it reaches the required business operation. Use OpenAdapt for the UI-only remainder and verify the effect independently.',
+ intro: 'A supported API is usually the best automation interface. It is direct, testable, and easier to operate than a GUI. OpenAdapt is not an argument against APIs. It handles the last mile when the required operation exists only behind a browser, desktop application, RDP session, or Citrix window.',
+ theirStrengths: {
+ heading: 'Where a direct API is strong',
+ items: [
+ 'It calls the system directly without rendering or manipulating an interface.',
+ 'Requests, responses, authentication, versioning, and error handling can be tested in code.',
+ 'It usually runs faster and with less infrastructure than GUI automation.',
+ 'The service owner can publish a stable contract and support it as the product changes.',
+ ],
+ },
+ chooseThem:
+ 'Choose the API when it exposes the complete operation you need, its use is permitted, and you can verify the resulting record through the same or a separate read-only interface.',
+ chooseUs:
+ 'Choose OpenAdapt for the exact steps the API does not expose, including legacy, desktop, remote, and vendor-controlled interfaces. Keep API calls for the parts they can do, including independent verification after GUI actuation.',
+ honestNote:
+ 'Use APIs for data movement, orchestration, and verification. Limit OpenAdapt actuation to the UI-bound transaction that the API does not expose.',
+ blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-api/',
+ },
]
export const COMPARISON_LINKS = COMPARISONS.map(({ slug, name, title }) => ({
diff --git a/pages/compare.js b/pages/compare.js
index 0c8d6704..c42c80b6 100644
--- a/pages/compare.js
+++ b/pages/compare.js
@@ -178,6 +178,18 @@ export default function ComparePage() {
>
See measured results
+
+ track(EVENTS.COMPARE_CTA_CLICK, {
+ cta: 'gui_automation_guide',
+ location: 'compare_hero',
+ })
+ }
+ >
+ Read the practical guide
+
diff --git a/pages/compare/[slug].js b/pages/compare/[slug].js
index 44b7c557..e936c227 100644
--- a/pages/compare/[slug].js
+++ b/pages/compare/[slug].js
@@ -30,14 +30,8 @@ export async function getStaticPaths() {
export async function getStaticProps({ params }) {
const comparison = COMPARISONS.find(({ slug }) => slug === params.slug)
- let dimensionData = null
- try {
- const structured = loadComparisons('data/compare')
- dimensionData = findComparison(structured, params.slug)
- } catch (error) {
- if (process.env.NODE_ENV !== 'production') throw error
- dimensionData = null
- }
+ const structured = loadComparisons('data/compare')
+ const dimensionData = findComparison(structured, params.slug)
return { props: { comparison, dimensionData } }
}
@@ -153,6 +147,17 @@ export default function ComparisonDetailPage({ comparison, dimensionData }) {
+ )}
{/* Capability dimensions, generated from data/compare/.json */}
{dimensionData && (
@@ -383,8 +388,9 @@ export default function ComparisonDetailPage({ comparison, dimensionData }) {
Bring one repeated, consequential workflow and measure
authoring time, run time, intervention rate, and
incorrect-success rate against your current approach.
- Or watch the governed-execution demo first: every run
- shown ends verified or halted.
+ Or watch the governed-execution demo first. It shows
+ result checks and safe stops against the retained event
+ evidence.
diff --git a/pages/guides/automate-repetitive-gui-tasks.js b/pages/guides/automate-repetitive-gui-tasks.js
new file mode 100644
index 00000000..a2e1015b
--- /dev/null
+++ b/pages/guides/automate-repetitive-gui-tasks.js
@@ -0,0 +1,228 @@
+import Head from 'next/head'
+import Link from 'next/link'
+
+import Footer from '@components/Footer'
+import { track, EVENTS } from 'utils/analytics'
+
+const url = 'https://openadapt.ai/guides/automate-repetitive-gui-tasks'
+const description =
+ 'A practical guide to automating repetitive GUI tasks with APIs, Playwright, Selenium, AutoHotkey, Power Automate, UiPath, computer-use agents, or OpenAdapt.'
+
+const approaches = [
+ {
+ name: 'OpenAdapt',
+ fit: 'The same consequential GUI workflow repeats, no practical API covers it, and another interface can verify the result.',
+ reason: 'You demonstrate the task once. OpenAdapt compiles it into deterministic local replay, then re-resolves, proposes a governed repair, or halts under drift.',
+ href: '/how-it-works',
+ linkLabel: 'See how OpenAdapt works',
+ },
+ {
+ name: 'A supported API',
+ fit: 'The application exposes the complete operation through a supported machine interface.',
+ reason: 'It skips the screen. That usually makes the workflow faster, easier to test, and cheaper to run.',
+ href: '/compare/api',
+ linkLabel: 'Compare OpenAdapt with an API',
+ },
+ {
+ name: 'Playwright',
+ fit: 'The task is browser-only, and a developer can own the script.',
+ reason: 'Its locators, auto-waiting, tracing, and cross-browser support make web automation pleasant to maintain.',
+ href: '/compare/playwright',
+ linkLabel: 'Compare OpenAdapt with Playwright',
+ },
+ {
+ name: 'Selenium',
+ fit: 'You need standards-based browser control or already run a Selenium fleet.',
+ reason: 'WebDriver has broad browser, language, and remote-grid support, plus a large mature ecosystem.',
+ href: '/compare/selenium',
+ linkLabel: 'Compare OpenAdapt with Selenium',
+ },
+ {
+ name: 'AutoHotkey',
+ fit: 'One person needs a fast Windows shortcut, hotkey, text expansion, or small macro.',
+ reason: 'A short local script can remove personal repetition with very little setup.',
+ href: '/compare/autohotkey',
+ linkLabel: 'Compare OpenAdapt with AutoHotkey',
+ },
+ {
+ name: 'Microsoft Power Automate',
+ fit: 'The work sits inside Microsoft 365, Dataverse, Teams, Excel, or a supported connector.',
+ reason: 'It joins cloud flows, desktop automation, connectors, identity, and administration in the Microsoft stack.',
+ href: '/compare/power-automate',
+ linkLabel: 'Compare OpenAdapt with Power Automate',
+ },
+ {
+ name: 'UiPath',
+ fit: 'You need an enterprise RPA platform for a large robot fleet and an established automation program.',
+ reason: 'Its orchestration, queues, credentials, audit tools, training, partners, and activity ecosystem are mature.',
+ href: '/compare/uipath',
+ linkLabel: 'Compare OpenAdapt with UiPath',
+ },
+ {
+ name: 'A computer-use agent',
+ fit: 'The task is novel, exploratory, or changes so often that you want a model to reason through each run.',
+ reason: 'It can start from a plain-language goal and work through unfamiliar interfaces without a recorded workflow.',
+ href: '/compare/computer-use-agents',
+ linkLabel: 'Compare OpenAdapt with computer-use agents',
+ },
+]
+
+const faq = [
+ {
+ question: 'What is the best tool for automating repetitive GUI tasks?',
+ answer: 'OpenAdapt fits repeated GUI transactions that need deterministic replay and an independent effect check. Use a supported API when it covers the complete operation. Playwright or Selenium fits developer-owned browser work, AutoHotkey fits a personal Windows macro, Power Automate fits Microsoft-centric work, UiPath fits an enterprise RPA program, and a computer-use agent fits novel tasks.',
+ },
+ {
+ question: 'How do I automate a GUI application with no API?',
+ answer: 'Define one bounded task, record or script it, separate inputs from recorded examples, add identity and effect checks, test normal and changed interfaces, then deploy it inside the correct data boundary. OpenAdapt packages that path around a demonstration.',
+ },
+ {
+ question: 'How do I automate a Citrix or RDP application?',
+ answer: 'Treat the remote session as a visible window. Keep capture and actuation outside the managed environment when you cannot install inside it. Use fresh frames, visual and OCR evidence, window identity, and an independent effect check. Qualify the exact client, application, display, and workflow before consequential use.',
+ },
+ {
+ question: 'Can I turn a screen recording into automation?',
+ answer: 'Yes, but a video alone is not enough for a dependable transaction. The useful artifact also needs action timing, target evidence, inputs, postconditions, and a rule for what to do when the live interface no longer matches the demonstration.',
+ },
+]
+
+const faqSchema = {
+ '@context': 'https://schema.org',
+ '@type': 'FAQPage',
+ mainEntity: faq.map((item) => ({
+ '@type': 'Question',
+ name: item.question,
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
+ })),
+}
+
+const howToSchema = {
+ '@context': 'https://schema.org',
+ '@type': 'HowTo',
+ name: 'How to automate a repetitive GUI task',
+ description,
+ step: [
+ { '@type': 'HowToStep', name: 'Bound the task', text: 'Name one start state, one intended result, and the allowed applications.' },
+ { '@type': 'HowToStep', name: 'Check for an API', text: 'Use a supported API or connector wherever it covers the required operation.' },
+ { '@type': 'HowToStep', name: 'Choose the GUI tool', text: 'Match the tool to the browser, desktop, remote, personal, or enterprise operating boundary.' },
+ { '@type': 'HowToStep', name: 'Add a separate result check', text: 'Verify the effect through a read-only API, database query, file check, or independent screen state.' },
+ { '@type': 'HowToStep', name: 'Test change and uncertainty', text: 'Test normal runs, interface drift, wrong identity, ambiguous targets, and uncertain delivery.' },
+ ],
+}
+
+export default function AutomateRepetitiveGuiTasksPage() {
+ return (
+
+ OpenAdapt compiles a demonstrated GUI task into deterministic local replay and proves consequential results through an independent check. It fits repeated work trapped behind browser, desktop, RDP, or Citrix interfaces. When a direct API covers the complete job, use it. For other tasks, choose the browser library, macro, RPA platform, or computer-use agent that owns the full result.
+
+
+
+
+ Pick the smallest tool that owns the whole result
+
+
+ The click is rarely the hard part. The hard part is knowing that the right record changed once, in the right account, and that a timeout didn’t leave the result uncertain. Choose the tool by the task boundary and the cost of a wrong result.
+
+ A five-part method that survives the first demo
+
+
+
1. Bound one task. Name the start state, the intended result, the allowed applications, and the person or service that can authorize the action.
+
2. Remove every GUI step you can. Keep supported APIs and connectors for the parts they cover. This leaves a smaller visible workflow to maintain.
+
3. Separate inputs from the demonstration. A name, date, record identifier, or amount is an input. It should not become a fixed click or copied literal from the recorded example.
+
4. Verify the effect somewhere else. Read the saved record through an API, query the database, check the exact file, or inspect a fresh independent state. Don’t let the session that acted grade itself.
+
5. Test every refusal and uncertain delivery path. Move a button, show two matching records, change the active window, reject the write, and interrupt the response after dispatch. An uncertain dispatch must return RECONCILIATION_REQUIRED without a blind retry. Count silent wrong results and unnecessary halts, not only successful runs.
+
+
+
+
+
+ Where OpenAdapt fits
+
+
+ OpenAdapt compiles a demonstrated GUI workflow into a reviewable program. A healthy run is deterministic and makes no model call. If the interface changes, the runtime re-resolves from retained evidence, proposes a governed repair, or halts. For consequential work, a separate verifier checks the business effect before the run returns VERIFIED.
+
+
+ That makes it a good fit for repeated work trapped behind legacy, desktop, browser, RDP, or Citrix interfaces. The exact application, environment, input, action, identity, effect, and policy contract still has to be qualified. A working recording is the start, not the proof.
+
+
+ track(EVENTS.COMPARE_CTA_CLICK, {
+ cta: 'guide_start',
+ location: 'gui_automation_guide',
+ })}
+ >
+ Run the local quickstart
+
+ track(EVENTS.COMPARE_CTA_CLICK, {
+ cta: 'guide_qualify',
+ location: 'gui_automation_guide',
+ })}
+ >
+ Qualify one workflow
+
+
+
+
+
+
Common questions
+
+ {faq.map((item) => (
+
+ {item.question}
+
{item.answer}
+
+ ))}
+
+
+
+
+
+ )
+}
diff --git a/public/llms-full.txt b/public/llms-full.txt
index be9d3254..23fc6930 100644
--- a/public/llms-full.txt
+++ b/public/llms-full.txt
@@ -1,13 +1,12 @@
# OpenAdapt.AI — extended reference for AI assistants
-Last reviewed: 2026-08-26. Capability inventory: https://openadapt.ai/status.json
-Production admission: https://openadapt.ai/production-lifecycle.json
+Last reviewed: 2026-07-27. Canonical machine-readable status: https://openadapt.ai/status.json
Index version of this file: https://openadapt.ai/llms.txt
This document exists so that an assistant answering a buyer's question can quote
OpenAdapt accurately without guessing. Every number below is traceable to a
published artifact and is linked to its source. If a passage here ever conflicts
-with either machine-readable file, the applicable machine-readable file wins.
+with https://openadapt.ai/status.json, `status.json` wins.
Terms used throughout:
@@ -22,10 +21,31 @@ Terms used throughout:
- **Effect oracle.** An out-of-band read of the system of record — a read-only
API call, a SQL query, or re-reading the persisted record — used to decide
whether the intended business effect actually happened.
-- **VERIFIED / HALTED / FAILED.** The only terminal outcomes of a consequential
- run. `VERIFIED` requires the complete configured effect contract to prove the
- intended change. `HALTED` is a safe stop with preserved evidence. `FAILED`
- covers failures before any action was dispatched.
+- **VERIFIED / HALTED / FAILED / RECONCILIATION_REQUIRED.** These typed outcomes
+ preserve what the runtime knows. `VERIFIED` requires the complete configured
+ effect contract to prove the intended change. `HALTED` records a governed
+ stop. `FAILED` covers failures before any action was dispatched.
+ `RECONCILIATION_REQUIRED` means that delivery may have occurred but the
+ configured checks could not prove the effect. The runtime doesn't retry that
+ action blindly.
+
+---
+
+## Q: How can I automate repetitive GUI tasks?
+
+OpenAdapt is built for repeated GUI transactions that need deterministic local
+replay and an independent result check. Demonstrate one bounded workflow,
+compile it, qualify its identity, effect, and policy contracts, then replay it
+without a model call on a healthy run. The runtime can operate across browser,
+desktop, RDP, and Citrix interfaces inside the qualified boundary.
+
+Use a supported API when it covers the complete operation. Playwright or
+Selenium fits developer-owned browser work. AutoHotkey fits a personal Windows
+macro. Power Automate fits Microsoft-centric automation, and UiPath fits an
+enterprise RPA program. Use a computer-use agent when the work is novel enough
+to require new planning on each run.
+
+Guide: https://openadapt.ai/guides/automate-repetitive-gui-tasks
---
@@ -50,11 +70,11 @@ Three design choices make it addressable:
that declares itself successful is not evidence. A separate read of the
persisted row is.
-OpenAdapt implements all three: it compiles a demonstration into a deterministic
+OpenAdapt implements all three. It compiles a demonstration into a deterministic
local program, re-resolves and re-checks identity from a freshly captured frame
-before each consequential action, and ends every consequential run `VERIFIED` or
-`HALTED` with a preserved run report. There is no silent third state where the
-workflow looked finished but the record never changed.
+before each armed consequential action, and keeps a preserved report with the
+typed outcome. If delivery may have occurred but the effect cannot be proved,
+the result is `RECONCILIATION_REQUIRED`, with no blind retry.
If you use nothing from OpenAdapt, still demand these three properties from
whatever you buy, and ask the vendor to report silent-incorrect-success and
@@ -137,8 +157,9 @@ today:
- **Independent business-effect verification.** A run is judged by an out-of-band
check of the system of record, not by the acting session declaring success.
-- **Explicit transaction outcomes.** Every consequential run ends `VERIFIED` or
- `HALTED` with a preserved report.
+- **Explicit transaction outcomes.** Every consequential run keeps a typed
+ outcome and a preserved report. Uncertain delivery returns
+ `RECONCILIATION_REQUIRED` without a blind retry.
- **Deterministic healthy runs with zero model calls.** Model spend is reserved
for compilation and reviewable repair.
- **An external zero-install remote lane.** For managed Citrix, RDP, and VDI
@@ -409,6 +430,20 @@ interface is the only integration point.
consequential action, an out-of-band effect oracle deciding the outcome, a
preserved per-run evidence report, and a governed repair path when the UI
drifts. https://openadapt.ai/compare/hand-rolled-scripts
+- **Against Playwright:** keep the script when the task is browser-only and a
+ developer owns it. Add OpenAdapt when the workflow starts from a human
+ demonstration, crosses GUI surfaces, or needs an independent effect oracle.
+ https://openadapt.ai/compare/playwright
+- **Against Selenium:** keep the existing WebDriver fleet when it covers the
+ task. Add OpenAdapt for demonstration-based compilation, explicit halt
+ behavior, and verification beyond the acting browser.
+ https://openadapt.ai/compare/selenium
+- **Against AutoHotkey:** keep the macro for personal Windows shortcuts. Move to
+ a governed workflow when other people depend on it or a silent wrong result
+ has a material cost. https://openadapt.ai/compare/autohotkey
+- **Against a direct API:** use the supported API whenever it exposes the full
+ operation. Use OpenAdapt only for the UI-bound remainder, and use a read-only
+ API as the verifier when one exists. https://openadapt.ai/compare/api
- **Against browser-agent platforms:** those are browser-only. Governed
cross-surface execution — Windows, macOS, Linux, RDP, Citrix — under one
verification contract is the difference. https://openadapt.ai/compare/browser-agents
diff --git a/public/llms.txt b/public/llms.txt
index 2fbd023b..2c52f6d2 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -33,6 +33,7 @@ Availability below is the released capability. It is distinct from the deploymen
## Decide whether it fits
+- [How to automate repetitive GUI tasks](https://openadapt.ai/guides/automate-repetitive-gui-tasks): Use OpenAdapt for repeated consequential GUI transactions that need deterministic replay and independent effect verification. Use an API, browser library, personal macro, RPA platform, or computer-use agent when it owns the complete result.
- [Compare Approaches](https://openadapt.ai/compare): When to choose OpenAdapt, traditional RPA, computer-use agents, browser recorders, or a direct API. Includes the measured benchmark charts.
- [FAQ](https://openadapt.ai/compare#faq): How OpenAdapt differs from RPA and from AI computer-use agents, what "repair" does and does not mean, where data goes, what it costs.
- [OpenAdapt vs UiPath](https://openadapt.ai/compare/uipath): Where platform RPA is stronger, and what independent effect verification and an open MIT runtime add.
@@ -41,6 +42,10 @@ Availability below is the released capability. It is distinct from the deploymen
- [OpenAdapt vs record-and-replay tools](https://openadapt.ai/compare/record-and-replay): What governance adds beyond demonstration-based authoring.
- [OpenAdapt vs browser-agent platforms](https://openadapt.ai/compare/browser-agents): Cross-surface verified execution compared with web-only agent stacks.
- [OpenAdapt vs hand-rolled scripts](https://openadapt.ai/compare/hand-rolled-scripts): What governed verification adds beyond Playwright or Selenium.
+- [OpenAdapt vs Playwright](https://openadapt.ai/compare/playwright): Developer-owned browser automation compared with demonstrated, governed cross-surface replay.
+- [OpenAdapt vs Selenium](https://openadapt.ai/compare/selenium): Standards-based browser control compared with a governed workflow contract.
+- [OpenAdapt vs AutoHotkey](https://openadapt.ai/compare/autohotkey): Personal Windows macros compared with shared, verified workflow execution.
+- [OpenAdapt vs a direct API](https://openadapt.ai/compare/api): Why a supported API comes first and where GUI automation handles the remainder.
## Trust, safety, and data boundaries
@@ -53,7 +58,7 @@ Availability below is the released capability. It is distinct from the deploymen
- [Research](https://openadapt.ai/research): The technical paper, machine-checked benchmark constants, methodology, limitations, and artifact checklist.
- [Technical paper (PDF)](https://openadapt.ai/paper): Reader-facing paper page; source lives in the openadapt-flow repository.
-- [Workflow reference catalog](https://openadapt.ai/workflows): Every reference workflow with its substrate, oracle, and released-capability label reconciled against `status.json`.
+- [Workflow reference catalog](https://openadapt.ai/workflows): Every reference workflow with its substrate, oracle, and status label reconciled against `status.json`.
- [Customer Case Study: RVU Audits](https://openadapt.ai/customers/rvu-audit-heart-care): A board-certified cardiac electrophysiologist's monthly Cerner PowerChart evidence collection and RVU spreadsheet reconciliation, helping recover about $75,000 a year in missed billables while saving several hours of physician time each month. Disclosed on the page: the physician is the founder's brother, this is OpenAdapt's founding deployment rather than independent validation, and the figures are preliminary pending customer confirmation. The same page separately reports a reproducible six-month synthetic governed-validation cohort: 2,880 cases (480/month), 2,856 VERIFIED (99.2%), 18 HALTED, 6 FAILED before actuation, zero observed silent incorrect successes, zero model calls, $0.03 modeled reference cost per case.
## Where it is used
diff --git a/public/sitemap.xml b/public/sitemap.xml
index b811c9dd..7280788c 100644
--- a/public/sitemap.xml
+++ b/public/sitemap.xml
@@ -48,6 +48,12 @@
monthly0.8
+
+ https://openadapt.ai/guides/automate-repetitive-gui-tasks
+ 2026-08-26
+ monthly
+ 0.9
+ https://openadapt.ai/about2026-07-16
@@ -204,6 +210,30 @@
monthly0.7
+
+ https://openadapt.ai/compare/playwright
+ 2026-08-26
+ monthly
+ 0.7
+
+
+ https://openadapt.ai/compare/selenium
+ 2026-08-26
+ monthly
+ 0.7
+
+
+ https://openadapt.ai/compare/autohotkey
+ 2026-08-26
+ monthly
+ 0.7
+
+
+ https://openadapt.ai/compare/api
+ 2026-08-26
+ monthly
+ 0.7
+ https://openadapt.ai/workflows2026-07-27
diff --git a/tests/comparisonPages.test.js b/tests/comparisonPages.test.js
index 2a154a99..922314e9 100644
--- a/tests/comparisonPages.test.js
+++ b/tests/comparisonPages.test.js
@@ -23,6 +23,10 @@ const EXPECTED_SLUGS = [
'record-and-replay',
'browser-agents',
'hand-rolled-scripts',
+ 'playwright',
+ 'selenium',
+ 'autohotkey',
+ 'api',
]
test('every targeted comparison page exists with complete, structured content', async () => {
diff --git a/tests/growthGenerators.test.js b/tests/growthGenerators.test.js
index 5fbe47f1..fde10025 100644
--- a/tests/growthGenerators.test.js
+++ b/tests/growthGenerators.test.js
@@ -187,10 +187,19 @@ test('validator rejects fabricated or malformed evidence', () => {
const comparisons = loadComparisons(path.join(root, 'data', 'compare'))
-test('four comparison datasets cover the required dimensions with citations', () => {
+test('eight comparison datasets cover the required dimensions with citations', () => {
assert.deepEqual(
comparisons.map((c) => c.slug).sort(),
- ['browser-agents', 'computer-use-agents', 'power-automate', 'uipath']
+ [
+ 'api',
+ 'autohotkey',
+ 'browser-agents',
+ 'computer-use-agents',
+ 'playwright',
+ 'power-automate',
+ 'selenium',
+ 'uipath',
+ ]
)
for (const comparison of comparisons) {
const ids = comparison.dimensions.map((d) => d.id)
diff --git a/tests/guiAutomationGuide.test.js b/tests/guiAutomationGuide.test.js
new file mode 100644
index 00000000..f004e2fa
--- /dev/null
+++ b/tests/guiAutomationGuide.test.js
@@ -0,0 +1,49 @@
+const assert = require('node:assert/strict')
+const fs = require('node:fs')
+const path = require('node:path')
+const test = require('node:test')
+
+const root = path.join(__dirname, '..')
+const read = (relativePath) => fs.readFileSync(path.join(root, relativePath), 'utf8')
+
+const page = read('pages/guides/automate-repetitive-gui-tasks.js')
+const comparePage = read('pages/compare.js')
+const sitemap = read('public/sitemap.xml')
+const llms = read('public/llms.txt')
+
+test('GUI automation guide routes readers to every explicit comparison', () => {
+ for (const route of [
+ '/compare/api',
+ '/compare/playwright',
+ '/compare/selenium',
+ '/compare/autohotkey',
+ '/compare/power-automate',
+ '/compare/uipath',
+ '/compare/computer-use-agents',
+ ]) {
+ assert.ok(page.includes(route), route)
+ }
+})
+
+test('GUI automation guide publishes FAQ and HowTo structured data', () => {
+ assert.ok(page.includes('FAQPage'))
+ assert.ok(page.includes('HowTo'))
+})
+
+test('GUI automation guide is indexed for people and assistants', () => {
+ assert.match(sitemap, /https:\/\/openadapt\.ai\/guides\/automate-repetitive-gui-tasks/)
+ assert.match(llms, /https:\/\/openadapt\.ai\/guides\/automate-repetitive-gui-tasks/)
+})
+
+test('comparison readers can reach the guide and guide actions are measured', () => {
+ assert.ok(comparePage.includes('/guides/automate-repetitive-gui-tasks'))
+ assert.ok(page.includes('EVENTS.COMPARE_CTA_CLICK'))
+ assert.ok(page.includes("location: 'gui_automation_guide'"))
+})
+
+test('every guide card has a distinct accessible action name', () => {
+ const labels = [...page.matchAll(/linkLabel: '([^']+)'/g)].map((match) => match[1])
+ assert.equal(labels.length, 8)
+ assert.equal(new Set(labels).size, labels.length)
+ assert.ok(page.includes('{approach.linkLabel}'))
+})
From 16e578c3fcdff626f21e60cfa817a78f4f95b36c Mon Sep 17 00:00:00 2001
From: abrichr
Date: Wed, 26 Aug 2026 12:47:46 -0400
Subject: [PATCH 2/5] feat: measure assistant-referred visits safely
---
docs/ANALYTICS.md | 8 +++
pages/_app.js | 12 +++-
tests/assistantReferral.test.js | 53 ++++++++++++++++++
utils/analytics.js | 19 ++++++-
utils/assistantReferral.mjs | 98 +++++++++++++++++++++++++++++++++
5 files changed, 186 insertions(+), 4 deletions(-)
create mode 100644 tests/assistantReferral.test.js
create mode 100644 utils/assistantReferral.mjs
diff --git a/docs/ANALYTICS.md b/docs/ANALYTICS.md
index cc234a39..6c860086 100644
--- a/docs/ANALYTICS.md
+++ b/docs/ANALYTICS.md
@@ -27,6 +27,7 @@ named funnel events:
| `compare_cta_click` | clicks a CTA on `/compare` | `pages/compare.js` |
| `workflow_card_click` | opens a reference from the `/workflows` catalog | `pages/workflows.js` |
| `pricing_cta_click` | starts hosted checkout or the "start with our team" path | `components/Pricing.js` |
+| `assistant_referral_landed` | lands from a known assistant referrer or assistant `utm_source` | `pages/_app.js` |
Event properties are limited to non-identifying context such as the platform
tab selected (`macOS`/`Linux`/`Windows`), the copy variant
@@ -160,6 +161,13 @@ Checkout, which collects the email on its own hosted page.
and every conversion event carries them, so cost-per-qualified-lead can be
attributed per campaign/ad set/placement.
+`utils/assistantReferral.mjs` checks a fixed list of assistant hosts and
+`utm_source` values in the browser. It emits `assistant_referral_landed`
+without a provider name, referrer URL, query, or custom event property. PostHog
+also removes its automatic referrer fields before capture. This count is
+directional. Some assistants suppress referrers, and anyone can copy a campaign
+value.
+
### Privacy posture (deltas vs the PostHog layer)
- Event properties remain campaign labels + enum locations only — never
diff --git a/pages/_app.js b/pages/_app.js
index d04d1d91..2bd97451 100644
--- a/pages/_app.js
+++ b/pages/_app.js
@@ -8,7 +8,11 @@ import { useRouter } from 'next/router'
import NavHeader from '@components/NavHeader'
import GoogleAnalytics from '@components/analytics/GoogleAnalytics'
import MetaPixel from '@components/analytics/MetaPixel'
-import { initAnalytics, capturePageview } from 'utils/analytics'
+import {
+ initAnalytics,
+ captureAssistantReferral,
+ capturePageview,
+} from 'utils/analytics'
import { captureAttribution } from 'utils/attribution'
export default function MyApp({ Component, pageProps }) {
@@ -20,8 +24,10 @@ export default function MyApp({ Component, pageProps }) {
// First-touch utm_* capture for paid-acquisition tests (E1); no-op
// when the landing URL carries no campaign params.
captureAttribution()
- initAnalytics()
- capturePageview(window.location.pathname + window.location.search)
+ void initAnalytics().then(() => {
+ capturePageview(window.location.pathname)
+ captureAssistantReferral(window.location.search, document.referrer)
+ })
const handleRouteChange = (url) => capturePageview(url)
router.events.on('routeChangeComplete', handleRouteChange)
return () => router.events.off('routeChangeComplete', handleRouteChange)
diff --git a/tests/assistantReferral.test.js b/tests/assistantReferral.test.js
new file mode 100644
index 00000000..3c67a881
--- /dev/null
+++ b/tests/assistantReferral.test.js
@@ -0,0 +1,53 @@
+const assert = require('node:assert/strict')
+const test = require('node:test')
+
+test('assistant referral classification returns one closed boolean', async () => {
+ const { isAssistantReferral } = await import(
+ '../utils/assistantReferral.mjs'
+ )
+
+ for (const input of [
+ { search: '?utm_source=chatgpt.com' },
+ { search: '?utm_source=Claude' },
+ { referrer: 'https://www.perplexity.ai/search?q=private-query' },
+ { referrer: 'https://gemini.google.com/app/secret-thread-id' },
+ { referrer: 'https://search.chatgpt.com/c/example' },
+ ]) {
+ assert.equal(isAssistantReferral(input), true)
+ }
+
+ for (const input of [
+ {},
+ { search: '?utm_source=google' },
+ { referrer: 'https://chatgpt.com.evil.example/c/example' },
+ { referrer: 'javascript:alert(1)' },
+ ]) {
+ assert.equal(isAssistantReferral(input), false)
+ }
+})
+
+test('assistant referral capture strips referrer and campaign values', async () => {
+ const {
+ ASSISTANT_REFERRAL_EVENT,
+ sanitizeAnalyticsProperties,
+ } = await import('../utils/assistantReferral.mjs')
+ const sanitized = sanitizeAnalyticsProperties(
+ {
+ $current_url: 'https://openadapt.ai/compare?utm_source=chatgpt.com',
+ $pathname: '/compare?utm_source=chatgpt.com',
+ $referrer: 'https://chatgpt.com/c/private-thread',
+ $referring_domain: 'chatgpt.com',
+ $initial_referrer: 'https://chatgpt.com/c/private-thread',
+ $utm_source: 'chatgpt.com',
+ gclid: 'external-click-id',
+ $browser: 'Chrome',
+ },
+ ASSISTANT_REFERRAL_EVENT
+ )
+
+ assert.deepEqual(sanitized, {
+ $current_url: 'https://openadapt.ai/compare',
+ $pathname: '/compare',
+ $browser: 'Chrome',
+ })
+})
diff --git a/utils/analytics.js b/utils/analytics.js
index f0f6a57d..06d36159 100644
--- a/utils/analytics.js
+++ b/utils/analytics.js
@@ -16,6 +16,11 @@
*/
import { analyticsAllowed } from 'utils/consent'
+import {
+ ASSISTANT_REFERRAL_EVENT,
+ isAssistantReferral,
+ sanitizeAnalyticsProperties,
+} from 'utils/assistantReferral.mjs'
// Named funnel events. Keep this list in sync with docs/ANALYTICS.md.
export const EVENTS = {
@@ -44,6 +49,7 @@ export const EVENTS = {
QUALIFICATION_FORM_START: 'qualification_form_start',
QUALIFICATION_FORM_SUBMIT: 'qualification_form_submit',
QUALIFIED_WORKFLOW: 'qualified_workflow',
+ ASSISTANT_REFERRAL_LANDED: ASSISTANT_REFERRAL_EVENT,
}
const POSTHOG_KEY =
@@ -107,6 +113,7 @@ export async function initAnalytics() {
},
// Honor the browser Do-Not-Track signal at the SDK level too.
respect_dnt: true,
+ sanitize_properties: sanitizeAnalyticsProperties,
})
client = posthog
} catch (err) {
@@ -131,9 +138,19 @@ export function track(event, properties) {
export function capturePageview(path) {
if (!isEnabled() || !client) return
try {
- client.capture('$pageview', path ? { $current_url: path } : undefined)
+ const pathname = path ? path.split(/[?#]/, 1)[0] : undefined
+ client.capture(
+ '$pageview',
+ pathname ? { $current_url: pathname } : undefined
+ )
} catch (err) {
// eslint-disable-next-line no-console
console.warn('[analytics] pageview skipped:', err)
}
}
+
+/** Emit one property-free, closed event when the landing came from an assistant. */
+export function captureAssistantReferral(search, referrer) {
+ if (!isAssistantReferral({ search, referrer })) return
+ track(EVENTS.ASSISTANT_REFERRAL_LANDED)
+}
diff --git a/utils/assistantReferral.mjs b/utils/assistantReferral.mjs
new file mode 100644
index 00000000..55f223e9
--- /dev/null
+++ b/utils/assistantReferral.mjs
@@ -0,0 +1,98 @@
+const ASSISTANT_UTM_SOURCES = new Set([
+ 'chatgpt',
+ 'chatgpt.com',
+ 'claude',
+ 'claude.ai',
+ 'copilot',
+ 'gemini',
+ 'perplexity',
+ 'perplexity.ai',
+ 'poe',
+ 'poe.com',
+ 'you.com',
+])
+
+const ASSISTANT_REFERRER_HOSTS = [
+ 'chatgpt.com',
+ 'chat.openai.com',
+ 'claude.ai',
+ 'gemini.google.com',
+ 'bard.google.com',
+ 'perplexity.ai',
+ 'copilot.microsoft.com',
+ 'm365.cloud.microsoft',
+ 'poe.com',
+ 'you.com',
+]
+
+export const ASSISTANT_REFERRAL_EVENT = 'assistant_referral_landed'
+
+const REFERRER_PROPERTIES = [
+ '$referrer',
+ '$referring_domain',
+ '$initial_referrer',
+ '$initial_referring_domain',
+]
+
+function normalizedHost(referrer) {
+ try {
+ const parsed = new URL(referrer)
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return ''
+ return parsed.hostname.toLowerCase().replace(/\.$/, '')
+ } catch (err) {
+ return ''
+ }
+}
+
+function knownAssistantHost(host) {
+ return ASSISTANT_REFERRER_HOSTS.some(
+ (candidate) => host === candidate || host.endsWith(`.${candidate}`)
+ )
+}
+
+/**
+ * Classify an assistant-referred landing without returning the provider or URL.
+ * The caller emits one closed event and discards the inputs.
+ */
+export function isAssistantReferral({ search = '', referrer = '' } = {}) {
+ try {
+ const source = new URLSearchParams(search)
+ .get('utm_source')
+ ?.trim()
+ .toLowerCase()
+ if (source && ASSISTANT_UTM_SOURCES.has(source)) return true
+ } catch (err) {
+ // A malformed query is not assistant attribution.
+ }
+
+ const host = normalizedHost(referrer)
+ return Boolean(host) && knownAssistantHost(host)
+}
+
+export function sanitizeAnalyticsProperties(properties, eventName) {
+ const sanitized = { ...properties }
+ for (const key of REFERRER_PROPERTIES) delete sanitized[key]
+
+ if (typeof sanitized.$current_url === 'string') {
+ if (sanitized.$current_url.startsWith('/')) {
+ sanitized.$current_url = sanitized.$current_url.split(/[?#]/, 1)[0]
+ } else {
+ try {
+ const current = new URL(sanitized.$current_url)
+ sanitized.$current_url = `${current.origin}${current.pathname}`
+ } catch (err) {
+ delete sanitized.$current_url
+ }
+ }
+ }
+ if (typeof sanitized.$pathname === 'string') {
+ sanitized.$pathname = sanitized.$pathname.split(/[?#]/, 1)[0]
+ }
+
+ if (eventName === ASSISTANT_REFERRAL_EVENT) {
+ for (const key of Object.keys(sanitized)) {
+ if (/^(\$?utm_|gclid$|fbclid$)/i.test(key)) delete sanitized[key]
+ }
+ }
+ return sanitized
+}
From bbd9c70e4cce575f9b4dcdc3c2d846128fcfd6f0 Mon Sep 17 00:00:00 2001
From: abrichr
Date: Wed, 26 Aug 2026 13:38:57 -0400
Subject: [PATCH 3/5] fix: align comparison claims with product truth
---
components/StructuredData.js | 2 +-
data/compare/api.json | 13 ++-
data/compare/autohotkey.json | 18 ++--
data/compare/browser-agents.json | 40 +++++---
data/compare/computer-use-agents.json | 62 ++++++++----
data/compare/playwright.json | 10 +-
data/compare/power-automate.json | 30 +++++-
data/compare/selenium.json | 14 ++-
data/compare/uipath.json | 38 ++++++--
data/comparisons.js | 22 ++---
data/templates/native-desktop-data-entry.json | 2 +-
pages/compare/[slug].js | 14 ++-
public/llms-full.txt | 14 +--
tests/comparisonPages.test.js | 96 ++++++-------------
tests/growthGenerators.test.js | 12 ++-
15 files changed, 219 insertions(+), 168 deletions(-)
diff --git a/components/StructuredData.js b/components/StructuredData.js
index 1d74407d..f0e21901 100644
--- a/components/StructuredData.js
+++ b/components/StructuredData.js
@@ -149,7 +149,7 @@ export const softwareApplicationNode = {
'Re-resolve a drifted target from structure, template, OCR, and geometry evidence before any model is consulted',
'Re-check record identity against a freshly captured frame immediately before each consequential input',
'Verify the intended business effect out-of-band against the system of record rather than trusting the acting session',
- 'End every consequential run verified or halted, with a preserved run report',
+ 'Preserve a typed transaction outcome, including RECONCILIATION_REQUIRED when possible delivery cannot be proved',
'Keep recordings, screenshots, and compiled bundles inside the customer boundary; egress only an approved, hash-bound sanitized derivative',
'Execute on browser, Windows UI Automation, macOS Accessibility, Linux AT-SPI, RDP, and Citrix/VDI surfaces',
],
diff --git a/data/compare/api.json b/data/compare/api.json
index bd1fbd82..bc94e538 100644
--- a/data/compare/api.json
+++ b/data/compare/api.json
@@ -7,7 +7,7 @@
"id": "determinism-on-drift",
"label": "Determinism when interfaces drift",
"openadapt": "A compiled workflow re-resolves targets from retained evidence, produces a governed repair proposal, or halts when the visible interface changes beyond its contract.",
- "them": "An API bypasses interface layout entirely. Its callers depend on the service's published request, response, authentication, and versioning contract instead of screen geometry.",
+ "them": "An API bypasses interface layout entirely. Its callers depend on the service's published request, response, and authentication contract instead of screen geometry.",
"sources": [
{"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
@@ -30,7 +30,7 @@
"them": "A response status describes how the server handled the request. For consequential work, the caller can add a separate read-back or postcondition check instead of treating request acceptance as the complete business result.",
"sources": [
{"label": "HTTP status code semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
@@ -40,7 +40,7 @@
"them": "The client owns error handling, idempotency, retries, and reconciliation. HTTP defines conditional request and method semantics, but the application must use them correctly.",
"sources": [
{"label": "HTTP conditional requests", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-conditional-requests"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
@@ -66,7 +66,7 @@
],
"strengths": [
{"text": "A direct API bypasses screen rendering, focus, pointer movement, and visual target resolution.", "source": {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
- {"text": "Requests and responses can carry typed, machine-readable data and explicit status codes.", "source": {"label": "HTTP message semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"}},
+ {"text": "HTTP requests and responses have a defined message structure, and responses carry explicit status codes.", "source": {"label": "HTTP message semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html#name-messages"}},
{"text": "Authentication and conditional requests have standard protocol semantics that clients can test directly.", "source": {"label": "HTTP authentication and conditions", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"}},
{"text": "The service owner can support the integration contract as the user interface changes.", "source": null}
],
@@ -74,7 +74,10 @@
{
"question": "Should I use OpenAdapt when an API already does the job?",
"answer": "No. Use the supported API for the complete operation. OpenAdapt fits the steps the API does not expose, and the API can still serve as an independent verifier after GUI actuation.",
- "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/api"}]
+ "sources": [
+ {"label": "HTTP semantics", "url": "https://www.rfc-editor.org/rfc/rfc9110.html"},
+ {"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare"}
+ ]
}
]
}
diff --git a/data/compare/autohotkey.json b/data/compare/autohotkey.json
index e2e7ab11..708371c8 100644
--- a/data/compare/autohotkey.json
+++ b/data/compare/autohotkey.json
@@ -22,6 +22,7 @@
"them": "AutoHotkey is free and open source. A normal local macro has no per-run license fee and makes no model call.",
"sources": [
{"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"},
+ {"label": "OpenAdapt MIT license", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
@@ -29,20 +30,20 @@
"id": "verification-of-effects",
"label": "Verification of business effects",
"openadapt": "A consequential run returns VERIFIED only after an independent check proves the intended change in the system of record.",
- "them": "AutoHotkey can read window and control state, but the author must build any business-level read-back, file check, database query, or other effect oracle.",
+ "them": "AutoHotkey can read text from a window control. The author must build any business-level read-back, file check, database query, or other effect oracle.",
"sources": [
- {"label": "AutoHotkey ControlSend", "url": "https://www.autohotkey.com/docs/v2/lib/ControlSend.htm"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "AutoHotkey ControlGetText", "url": "https://www.autohotkey.com/docs/v2/lib/ControlGetText.htm"},
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt": "Identity, target, policy, and effect checks define explicit halt conditions, and uncertain delivery is preserved for reconciliation.",
- "them": "The script decides when to stop. AutoHotkey supplies exceptions, return values, window waits, and process control, but it does not impose a business transaction outcome contract.",
+ "them": "The script decides when to stop. WinWait can pause until a matching window exists, but the author still defines every business stop and reconciliation rule.",
"sources": [
{"label": "AutoHotkey WinWait", "url": "https://www.autohotkey.com/docs/v2/lib/WinWait.htm"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
@@ -68,7 +69,7 @@
],
"strengths": [
{"text": "Send can simulate keystrokes and mouse clicks in the active window.", "source": {"label": "AutoHotkey Send", "url": "https://www.autohotkey.com/docs/v2/lib/Send.htm"}},
- {"text": "ControlClick and ControlSend can target a window control without relying only on the current pointer position.", "source": {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"}},
+ {"text": "ControlClick can target a window control without relying only on the current pointer position.", "source": {"label": "AutoHotkey ControlClick", "url": "https://www.autohotkey.com/docs/v2/lib/ControlClick.htm"}},
{"text": "Small hotkey, remapping, and text-expansion scripts are quick to write and easy for one operator to run.", "source": {"label": "AutoHotkey quick reference", "url": "https://www.autohotkey.com/docs/v2/"}},
{"text": "The runtime is free, open source, and local to Windows.", "source": {"label": "AutoHotkey license", "url": "https://www.autohotkey.com/docs/v2/license.htm"}}
],
@@ -76,7 +77,10 @@
{
"question": "When should a personal macro become an OpenAdapt workflow?",
"answer": "The change makes sense when other people depend on it, failures become hard to see, the target drifts often, or a wrong business result costs more than a visible macro error.",
- "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/autohotkey"}]
+ "sources": [
+ {"label": "AutoHotkey quick reference", "url": "https://www.autohotkey.com/docs/v2/"},
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
+ ]
}
]
}
diff --git a/data/compare/browser-agents.json b/data/compare/browser-agents.json
index e4da28c7..6117de41 100644
--- a/data/compare/browser-agents.json
+++ b/data/compare/browser-agents.json
@@ -15,6 +15,10 @@
{
"label": "Workflow Use README: deterministic workflows with agent fallback",
"url": "https://github.com/browser-use/workflow-use/blob/main/README.md"
+ },
+ {
+ "label": "OpenAdapt method",
+ "url": "https://openadapt.ai/how-it-works"
}
]
},
@@ -36,7 +40,11 @@
},
{
"label": "Frappe Lending benchmark: $0 model cost",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/main/benchmark/frappe_lending"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/80dc49b7296e5e6999b04124f26a647047a14b95/benchmark/frappe_lending"
+ },
+ {
+ "label": "OpenAdapt MIT license",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"
}
]
},
@@ -46,11 +54,15 @@
"openadapt":
"Success is judged out of band against the system of record (SQL, REST readback, table-delta audit, file arrival); the acting session cannot certify its own result.",
"them":
- "Both stacks judge success in band: the session that acted reports completion. Workflow Use offers progress events, recordings, and observability; no independent read-back of a business system of record is part of the published loop.",
+ "Both stacks judge success in band. The session that acted reports completion. Workflow Use offers progress events, recordings, and observability; no independent read-back of a business system of record is part of the published loop.",
"sources": [
{
"label": "Browser Use developer index: recordings and observability",
"url": "https://browser-use.com/"
+ },
+ {
+ "label": "OpenAdapt effect-verifier kit",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"
}
]
},
@@ -58,13 +70,17 @@
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt":
- "Ambiguity or wrong identity halts before acting; a refuted effect ends the run HALTED with evidence preserved for reconciliation - never a silent third state.",
+ "Ambiguity or wrong identity halts before acting. If delivery may have occurred but the effect cannot be proved, the run returns RECONCILIATION_REQUIRED without a blind retry.",
"them":
- "Failure handling is retry-or-fallback oriented: Workflow Use's advertised roadmap item is improving LLM fallback when a step fails, which hands control back to the model rather than stopping for review.",
+ "Failure handling favors retry or fallback. Workflow Use's advertised roadmap includes improved LLM fallback when a step fails, which hands control back to the model rather than stopping for review.",
"sources": [
{
"label": "Workflow Use README: roadmap and fallback",
"url": "https://github.com/browser-use/workflow-use/blob/main/README.md"
+ },
+ {
+ "label": "OpenAdapt execution outcomes",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"
}
]
},
@@ -82,7 +98,7 @@
},
{
"label": "mockmed-triage-v3 pack: egress observed false",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/main/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
}
]
},
@@ -90,9 +106,9 @@
"id": "scope",
"label": "Scope: browser, desktop, RDP/Citrix",
"openadapt":
- "Browser in production today plus native desktop and external-lane remote execution for managed RDP/Citrix estates, each surface carrying published acceptance evidence.",
+ "Browser supports the complete record, compile, replay, and verify loop. Native desktop and external-lane RDP/Citrix execution carry separate published acceptance evidence.",
"them":
- "Web only: Workflow Use records browser sessions and Browser Use drives managed or local Chromium; desktop applications and remote desktop surfaces are outside the published scope.",
+ "Workflow Use records browser sessions, and Browser Use drives managed or local Chromium. Desktop applications and remote desktop surfaces are outside the published scope.",
"sources": [
{
"label": "Workflow Use README: browser recording focus",
@@ -108,12 +124,12 @@
"strengths": [
{
"text":
- "Fastest setup for web tasks: point a Browser Use agent at a URL and useful behavior often emerges in minutes; Workflow Use converts one recording into a reusable workflow file.",
+ "Setup for web tasks can be quick. Browser Use starts from a URL, and Workflow Use converts one recording into a reusable workflow file.",
"source": null
},
{
"text":
- "Deterministic rerun without an LLM: Browser Use Cloud advertises cached-script reruns at up to 99% lower cost than an agent run.",
+ "Browser Use Cloud advertises deterministic cached-script reruns without an LLM at up to 99% lower cost than an agent run.",
"source": {
"label": "Browser Use docs: deterministic rerun",
"url": "https://docs.browser-use.com/cloud/agent/cache-script"
@@ -121,7 +137,7 @@
},
{
"text":
- "Published benchmark results: 82% of 106 internal Bench Hard tasks solved at $0.17 per solved task and 98% across Online-Mind2Web.",
+ "Published internal results report 82% of 106 Bench Hard tasks solved at $0.17 per solved task and 98% across Online-Mind2Web.",
"source": {
"label": "Browser Use developer index: benchmarks",
"url": "https://browser-use.com/"
@@ -140,7 +156,7 @@
{
"question": "Is Workflow Use production ready?",
"answer":
- "Not by its own description: the README states the project is in very early development and recommends against production use. It is a strong signal of where demonstration-based authoring is heading.",
+ "No, according to its own README. The project describes itself as very early in development and recommends against production use. Its direction still shows where demonstration-based authoring is heading.",
"sources": [
{
"label": "Workflow Use README",
@@ -151,7 +167,7 @@
{
"question": "What does OpenAdapt add over deterministic browser replay?",
"answer":
- "Out-of-band verification against the system of record, explicit VERIFIED-or-HALTED outcomes with preserved evidence, identity checks before consequential actions, and execution beyond the browser - native desktop and zero-install remote lanes - with published qualification evidence per surface.",
+ "Out-of-band verification against the system of record, typed outcomes that preserve refusal and uncertain delivery, identity checks before consequential actions, and execution beyond the browser - native desktop and zero-install remote lanes - with published qualification evidence per surface.",
"sources": [
{
"label": "OpenAdapt qualification evidence",
diff --git a/data/compare/computer-use-agents.json b/data/compare/computer-use-agents.json
index 66eb6c24..2f245eef 100644
--- a/data/compare/computer-use-agents.json
+++ b/data/compare/computer-use-agents.json
@@ -10,11 +10,15 @@
"openadapt":
"Healthy runs replay the same compiled steps deterministically with zero model calls; drift outside what was demonstrated halts for a governed decision.",
"them":
- "Every run re-reasons from screenshots: OpenAI's loop sends a screenshot back after each action batch so the model can plan the next step, which adapts to novelty but makes each run non-deterministic by construction.",
+ "OpenAI's loop sends a screenshot back after each action batch so the model can plan the next step. That adapts to novelty but also makes each run non-deterministic by construction.",
"sources": [
{
"label": "OpenAI computer use guide: screenshot-action loop",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
+ },
+ {
+ "label": "OpenAdapt method",
+ "url": "https://openadapt.ai/how-it-works"
}
]
},
@@ -24,7 +28,7 @@
"openadapt":
"$0 model cost per healthy run on the MIT runtime - published trials across MockMed triage (18 trials), Frappe Lending (6/6), and openIMIS eligibility (6 runs) all recorded zero model calls.",
"them":
- "Metered per model turn: screenshots are billed as image inputs every step. Claude's computer-use toolset definition alone adds about 4,500 input tokens to a request before any screenshot; OpenAI recommends original-detail screenshots each turn for click accuracy.",
+ "Costs accrue on each model turn. Screenshots are billed as image inputs every step. Claude's computer-use toolset definition alone adds about 4,500 input tokens to a request before any screenshot; OpenAI recommends original-detail screenshots each turn for click accuracy.",
"sources": [
{
"label": "Claude computer use tool: pricing",
@@ -32,11 +36,15 @@
},
{
"label": "OpenAI computer use guide: screenshot detail guidance",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
},
{
"label": "OpenAdapt published trials with 0 model calls",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/main/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
+ },
+ {
+ "label": "OpenAdapt MIT license",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"
}
]
},
@@ -50,7 +58,11 @@
"sources": [
{
"label": "OpenAI computer use guide: human-in-the-loop safeguards",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
+ },
+ {
+ "label": "OpenAdapt effect-verifier kit",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"
}
]
},
@@ -58,13 +70,17 @@
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt":
- "Halting is a designed outcome: ambiguity, wrong identity, or a refuted effect stops the run with preserved evidence instead of proceeding or retrying blindly.",
+ "Ambiguity, wrong identity, or a refuted effect stops the run with preserved evidence instead of proceeding or retrying blindly.",
"them":
- "The model keeps attempting until it believes the task is done or its budget is exhausted; stopping criteria are prompt- and harness-level, not contract-level.",
+ "The model keeps attempting until it believes the task is done or its budget is exhausted; stopping criteria belong to the prompt and host application, not a transaction contract.",
"sources": [
{
"label": "OpenAI computer use guide: agent loop semantics",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
+ },
+ {
+ "label": "OpenAdapt execution outcomes",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"
}
]
},
@@ -74,7 +90,7 @@
"openadapt":
"Runs execute locally inside your boundary; egress is an explicit observed flag (false in the published demo pack), and Claude computer use is documented as ZDR eligible when your application controls storage.",
"them":
- "Screen content leaves the machine to the model provider on every step: OpenAI's reference loop ships screenshots to the API each action batch, and Anthropic bills those screenshots as image input under standard API data handling.",
+ "Screen content leaves the machine for the model provider on every step. OpenAI's reference loop ships screenshots to the API after each action batch, and Anthropic bills those screenshots as image input under standard API data handling.",
"sources": [
{
"label": "Claude computer use tool: data retention and ZDR",
@@ -82,7 +98,7 @@
},
{
"label": "mockmed-triage-v3 pack: off-box egress observed false",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/main/public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/outcome.json"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs/mockmed-triage-v3/artifacts/cases/representative/trial-01/outcome.json"
}
]
},
@@ -90,13 +106,17 @@
"id": "scope",
"label": "Scope: browser, desktop, RDP/Citrix",
"openadapt":
- "Browser in production today plus native desktop and external-lane remote execution into managed RDP/Citrix estates, with published acceptance evidence per surface.",
+ "Browser supports the complete record, compile, replay, and verify loop. Native desktop and external-lane RDP/Citrix execution carry separate published acceptance evidence.",
"them":
- "Any UI a screenshot can describe, including desktops inside VMs or containers the harness controls; consumer agents such as Operator extend the same approach to end users.",
+ "Any UI a screenshot can describe, including desktops inside VMs or containers the runtime controls; consumer agents such as Operator extend the same approach to end users.",
"sources": [
{
- "label": "OpenAI computer use guide: browser and VM harnesses",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "label": "OpenAI computer use guide: browser and VM runtimes",
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
+ },
+ {
+ "label": "OpenAdapt qualification evidence per surface",
+ "url": "https://docs.openadapt.ai/get-started/what-works-today/"
}
]
}
@@ -114,10 +134,10 @@
},
{
"text":
- "A plain-language instruction is the whole interface; OpenAI documents harness shapes from built-in loops to code-execution environments mixing visual and programmatic interaction.",
+ "A plain-language instruction is the whole interface; OpenAI documents integration patterns from built-in loops to code-execution environments that mix visual and programmatic interaction.",
"source": {
"label": "OpenAI computer use guide: integration paths",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
}
},
{
@@ -133,22 +153,22 @@
{
"question": "Are computer-use agents and OpenAdapt rivals?",
"answer":
- "They are complementary. Agent providers themselves recommend isolated environments and human oversight for high-impact actions; OpenAdapt uses models too - at compile and repair time - while healthy runs replay deterministically with zero model calls.",
+ "They are complementary. Agent providers recommend isolated environments and human oversight for high-impact actions. OpenAdapt uses models at compile and repair time, while healthy runs replay deterministically with zero model calls.",
"sources": [
{
"label": "OpenAI computer use guide: safeguards",
- "url": "https://platform.openai.com/docs/guides/tools-computer-use"
+ "url": "https://developers.openai.com/api/docs/guides/tools-computer-use"
}
]
},
{
"question": "Which should run the same workflow a thousand times?",
"answer":
- "When correctness matters, replay a verified program: OpenAdapt's published evidence counts verified outcomes, expected halts, and silent incorrect successes per workflow - for example 18 MockMed triage trials with 0 model calls and 0 silent incorrect successes - instead of re-reasoning the task on every run.",
+ "When correctness matters, replay a verified program. OpenAdapt's published evidence counts verified outcomes, expected halts, and silent incorrect successes per workflow. The 18 MockMed triage trials recorded 0 model calls and 0 silent incorrect successes.",
"sources": [
{
"label": "mockmed-triage-v3 evidence pack",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/main/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
}
]
}
diff --git a/data/compare/playwright.json b/data/compare/playwright.json
index abe74dd1..9f8707b8 100644
--- a/data/compare/playwright.json
+++ b/data/compare/playwright.json
@@ -20,6 +20,7 @@
"them": "The Playwright library is open source. A normal script makes no model call, while browser, compute, and any grid service remain operating costs.",
"sources": [
{"label": "Playwright repository and license", "url": "https://github.com/microsoft/playwright"},
+ {"label": "OpenAdapt MIT license", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
@@ -30,7 +31,7 @@
"them": "Playwright supplies web assertions and retrying checks. The developer decides whether those assertions inspect the page, a separate API, a database, or another effect oracle.",
"sources": [
{"label": "Playwright auto-retrying assertions", "url": "https://playwright.dev/docs/test-assertions"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
@@ -40,7 +41,7 @@
"them": "Playwright waits for actionability before an action and fails an action when its checks or timeouts do not pass. Business retry and reconciliation behavior belongs to the script.",
"sources": [
{"label": "Playwright actionability", "url": "https://playwright.dev/docs/actionability"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
@@ -74,7 +75,10 @@
{
"question": "Should I replace a working Playwright script with OpenAdapt?",
"answer": "Usually not. Keep a well-owned browser script when it covers the full task and its assertions prove the right result. Consider OpenAdapt when the work crosses surfaces, starts from a human demonstration, or needs a governed verification contract.",
- "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/playwright"}]
+ "sources": [
+ {"label": "Playwright assertions", "url": "https://playwright.dev/docs/test-assertions"},
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
+ ]
}
]
}
diff --git a/data/compare/power-automate.json b/data/compare/power-automate.json
index 51e66aee..dba288b9 100644
--- a/data/compare/power-automate.json
+++ b/data/compare/power-automate.json
@@ -15,6 +15,10 @@
{
"label": "Power Automate plans: desktop flows (RPA)",
"url": "https://www.microsoft.com/en-us/power-platform/products/power-automate/pricing"
+ },
+ {
+ "label": "OpenAdapt method",
+ "url": "https://openadapt.ai/how-it-works"
}
]
},
@@ -24,7 +28,7 @@
"openadapt":
"The local runtime carries no license fee and healthy runs make zero model calls; published trials recorded $0 model cost per run.",
"them":
- "Published list pricing: Premium $15.00 user/month, Process $150.00 bot/month for unattended desktop flows, Hosted Process $215.00 bot/month including a Microsoft-hosted Azure VM (paid yearly). A bot executes one unattended run at a time.",
+ "Published annual-billing prices are $15.00 per user each month for Premium, $150.00 per bot each month for unattended desktop flows, and $215.00 per bot each month for Hosted Process with a Microsoft-hosted Azure VM. A bot executes one unattended run at a time.",
"sources": [
{
"label": "Power Automate pricing page",
@@ -32,7 +36,11 @@
},
{
"label": "Frappe Lending benchmark: $0 model cost",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/main/benchmark/frappe_lending"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/80dc49b7296e5e6999b04124f26a647047a14b95/benchmark/frappe_lending"
+ },
+ {
+ "label": "OpenAdapt MIT license",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"
}
]
},
@@ -47,6 +55,10 @@
{
"label": "Power Automate pricing: admin and capacity features",
"url": "https://www.microsoft.com/en-us/power-platform/products/power-automate/pricing"
+ },
+ {
+ "label": "OpenAdapt effect-verifier kit",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"
}
]
},
@@ -54,13 +66,17 @@
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt":
- "Ambiguity halts before acting; a refuted effect halts after acting without blind retry, classifying delivery as uncertain for operator reconciliation.",
+ "Ambiguity halts before acting. If delivery may have occurred but the effect cannot be proved, the run returns RECONCILIATION_REQUIRED without a blind retry.",
"them":
"Desktop flows support configurable error handling, retries, and timeouts defined by the flow author; unattended runs proceed under the machine/bot license without a human unless the flow requests one.",
"sources": [
{
"label": "Power Automate pricing: attended vs unattended desktop flows",
"url": "https://www.microsoft.com/en-us/power-platform/products/power-automate/pricing"
+ },
+ {
+ "label": "OpenAdapt execution outcomes",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"
}
]
},
@@ -68,13 +84,17 @@
"id": "data-locality",
"label": "Data locality",
"openadapt":
- "Execution is local-first and customer-controlled: recordings, bundles, and evidence can remain inside your boundary on an inspectable MIT runtime.",
+ "Execution is local-first and customer-controlled. Recordings, bundles, and evidence can remain inside your boundary on an inspectable MIT runtime.",
"them":
"Runs ride Microsoft-hosted infrastructure; the Hosted Process tier explicitly places the automation VM on Azure-managed infrastructure, and capacities pool at the tenant level in Dataverse.",
"sources": [
{
"label": "Power Automate pricing: Hosted Process plan",
"url": "https://www.microsoft.com/en-us/power-platform/products/power-automate/pricing"
+ },
+ {
+ "label": "OpenAdapt trust center",
+ "url": "https://openadapt.ai/security"
}
]
},
@@ -82,7 +102,7 @@
"id": "scope",
"label": "Scope: browser, desktop, RDP/Citrix",
"openadapt":
- "Browser in production today, native desktop via accessibility plus visual evidence, and an external zero-install lane into managed RDP/Citrix estates qualified per customer before consequential use.",
+ "Browser supports the complete record, compile, replay, and verify loop. Native desktop uses accessibility plus visual evidence. The external zero-install RDP/Citrix lane is qualified per customer before consequential use.",
"them":
"Deep Microsoft 365 coverage plus hundreds of prebuilt connectors for API-first work; desktop RPA covers Windows applications, with remote scenarios handled through the hosted VM tier.",
"sources": [
diff --git a/data/compare/selenium.json b/data/compare/selenium.json
index f8c20bdb..8b4b6f43 100644
--- a/data/compare/selenium.json
+++ b/data/compare/selenium.json
@@ -20,6 +20,7 @@
"them": "Selenium is open source and a normal WebDriver run makes no model call. Browser fleet, grid, and maintenance costs depend on the deployment.",
"sources": [
{"label": "Selenium project", "url": "https://www.selenium.dev/about/"},
+ {"label": "OpenAdapt MIT license", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"},
{"label": "OpenAdapt method", "url": "https://openadapt.ai/how-it-works"}
]
},
@@ -30,7 +31,7 @@
"them": "WebDriver returns browser command results. The automation author must add page assertions or a separate API, database, file, or service check for the business effect.",
"sources": [
{"label": "Selenium WebDriver commands", "url": "https://www.selenium.dev/documentation/webdriver/"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt effect-verifier kit", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"}
]
},
{
@@ -40,7 +41,7 @@
"them": "Selenium supports explicit and implicit waits, then raises errors when conditions or commands fail. Retry, rollback, and reconciliation rules live in the surrounding test or application code.",
"sources": [
{"label": "Selenium waits", "url": "https://www.selenium.dev/documentation/webdriver/waits/"},
- {"label": "OpenAdapt safety model", "url": "https://openadapt.ai/safety"}
+ {"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
]
},
{
@@ -67,14 +68,17 @@
"strengths": [
{"text": "WebDriver became a W3C Recommendation for remote browser control in 2018.", "source": {"label": "W3C WebDriver Recommendation", "url": "https://www.w3.org/TR/2018/REC-webdriver1-20180605/"}},
{"text": "Selenium supports local and remote browser sessions, including distributed Grid deployments.", "source": {"label": "Selenium Grid", "url": "https://www.selenium.dev/documentation/grid/"}},
- {"text": "The project publishes language bindings for Java, Python, C#, Ruby, JavaScript, and Kotlin.", "source": {"label": "Selenium downloads", "url": "https://www.selenium.dev/downloads/"}},
+ {"text": "The project publishes core language bindings for Java, Python, C#, Ruby, and JavaScript.", "source": {"label": "Selenium downloads", "url": "https://www.selenium.dev/downloads/"}},
{"text": "Established teams can keep their existing tests, infrastructure, and maintenance practices.", "source": null}
],
"faq": [
{
"question": "Is OpenAdapt a Selenium replacement?",
- "answer": "No. Selenium remains a strong browser-control layer. OpenAdapt addresses a broader workflow contract: demonstration-based authoring, cross-surface replay, independent effect verification, and explicit halt behavior.",
- "sources": [{"label": "OpenAdapt comparison guide", "url": "https://openadapt.ai/compare/selenium"}]
+ "answer": "No. Selenium remains a strong browser-control layer. OpenAdapt adds demonstration-based authoring, cross-surface replay, independent effect verification, and explicit halt behavior.",
+ "sources": [
+ {"label": "Selenium WebDriver", "url": "https://www.selenium.dev/documentation/webdriver/"},
+ {"label": "OpenAdapt execution outcomes", "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"}
+ ]
}
]
}
diff --git a/data/compare/uipath.json b/data/compare/uipath.json
index 330c2de2..d4ccc597 100644
--- a/data/compare/uipath.json
+++ b/data/compare/uipath.json
@@ -15,6 +15,10 @@
{
"label": "UiPath plans and pricing: Healing Agent",
"url": "https://www.uipath.com/pricing"
+ },
+ {
+ "label": "OpenAdapt method",
+ "url": "https://openadapt.ai/how-it-works"
}
]
},
@@ -22,9 +26,9 @@
"id": "cost-per-run",
"label": "Cost per run",
"openadapt":
- "The local runtime is MIT licensed with no per-run license fee: healthy runs make zero model calls at $0 model cost, as measured in the published Frappe Lending trials.",
+ "The local runtime is MIT licensed with no per-run license fee. Healthy runs make zero model calls at $0 model cost, as measured in the published Frappe Lending trials.",
"them":
- "License-based pricing: Automation Cloud Basic starts at $25 per month for individuals and small teams; Standard and Enterprise are quoted by sales, and users/robots may require additional licenses. No per-run price is published.",
+ "Automation Cloud Basic starts at $25 per month for individuals and small teams. Standard and Enterprise are quoted by sales, and users or robots may require more licenses. No per-run price is published.",
"sources": [
{
"label": "UiPath plans and pricing",
@@ -32,7 +36,11 @@
},
{
"label": "Frappe Lending benchmark: 0 model calls, $0 model cost",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/main/benchmark/frappe_lending"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/tree/80dc49b7296e5e6999b04124f26a647047a14b95/benchmark/frappe_lending"
+ },
+ {
+ "label": "OpenAdapt MIT license",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/LICENSE"
}
]
},
@@ -47,6 +55,10 @@
{
"label": "UiPath pricing comparison: audit and governance features",
"url": "https://www.uipath.com/pricing"
+ },
+ {
+ "label": "OpenAdapt effect-verifier kit",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EFFECT_KIT.md"
}
]
},
@@ -54,13 +66,17 @@
"id": "halting-behavior",
"label": "Halting behavior",
"openadapt":
- "Ambiguity, wrong identity, or a refuted effect stops the run before or after the consequential action with a preserved halt report; uncertain delivery is classified for reconciliation rather than retried blindly.",
+ "Ambiguity or wrong identity halts before acting. If delivery may have occurred but the effect cannot be proved, the run returns RECONCILIATION_REQUIRED without a blind retry.",
"them":
"Unattended robots are designed to run task-heavy, long-running processes without human supervision; attended robots put the human in the loop. Queue items expose retry and exception statuses for operators.",
"sources": [
{
"label": "UiPath pricing comparison: robot limits descriptions",
"url": "https://www.uipath.com/pricing"
+ },
+ {
+ "label": "OpenAdapt execution outcomes",
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/docs/EXECUTION_PROFILES.md"
}
]
},
@@ -68,13 +84,17 @@
"id": "data-locality",
"label": "Data locality",
"openadapt":
- "Recordings, bundles, and evidence stay inside your boundary by design: local execution is the default path, and screenshots-may-leave-box is an explicit per-run flag observed false in the published demo pack.",
+ "Recordings, bundles, and evidence stay inside your boundary by design. Local execution is the default path, and screenshots-may-leave-box is an explicit per-run flag observed false in the published demo pack.",
"them":
- "Strong enterprise options: self-hosted deployment including air-gapped installs, bring-your-own encryption keys and credential vaults (Enterprise), and opt-out of data collection (Standard and above). Basic-tier cloud hosting is Europe-region only.",
+ "Enterprise options include self-hosted deployment with air-gapped installs, bring-your-own encryption keys and credential vaults, and an opt-out from data collection. Basic-tier cloud hosting is Europe-region only.",
"sources": [
{
"label": "UiPath plans and pricing: deployment and governance rows",
"url": "https://www.uipath.com/pricing"
+ },
+ {
+ "label": "OpenAdapt trust center",
+ "url": "https://openadapt.ai/security"
}
]
},
@@ -84,7 +104,7 @@
"openadapt":
"Browser runs in production today; native desktop through accessibility plus visual evidence; managed remote estates through an external zero-install lane qualified against a stand-in and a real FreeRDP round trip, with real ICA/HDX qualified per customer before consequential use.",
"them":
- "Broadest published surface coverage in the market: web, desktop, Citrix virtual desktops, SAP, and APIs, with a very large activity library and mature Orchestrator fleet management.",
+ "UiPath publishes support for web, desktop, Citrix virtual desktops, SAP, and APIs, with a large activity library and Orchestrator fleet management.",
"sources": [
{
"label": "OpenAdapt qualification evidence per surface",
@@ -100,7 +120,7 @@
"strengths": [
{
"text":
- "Mature enterprise platform: Orchestrator provides scheduling, work queues, credential vaults, role-based access, audit export, and cold data retention up to five years on Enterprise.",
+ "Orchestrator provides scheduling, work queues, credential vaults, role-based access, audit export, and cold data retention up to five years on Enterprise.",
"source": {
"label": "UiPath plans and pricing",
"url": "https://www.uipath.com/pricing"
@@ -150,7 +170,7 @@
"sources": [
{
"label": "mockmed-triage-v3 evidence pack",
- "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/main/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
+ "url": "https://github.com/OpenAdaptAI/openadapt-flow/blob/80dc49b7296e5e6999b04124f26a647047a14b95/public-demo/evidence-packs/mockmed-triage-v3/manifest.json"
}
]
}
diff --git a/data/comparisons.js b/data/comparisons.js
index e4c2f59e..9d40f3c9 100644
--- a/data/comparisons.js
+++ b/data/comparisons.js
@@ -69,7 +69,7 @@ export const COMPARISONS = [
chooseUs:
'Choose OpenAdapt when the workflows that matter are consequential transactions where you need the system of record independently confirmed after every run, when sensitive data must stay in your boundary on an inspectable MIT runtime, or when you want a zero-install lane into managed remote estates.',
honestNote:
- 'Recording a demonstration, visual targeting, and repairing broken selectors are not differentiators in either direction: modern RPA platforms and OpenAdapt all do these. The difference is how a run is judged and what a failure is allowed to look like.',
+ 'Modern RPA platforms and OpenAdapt can record demonstrations, target visually, and repair selectors. The useful difference is how a run is judged and what a failure is allowed to look like.',
blogUrl: 'https://blog.openadapt.ai/posts/openadapt-vs-uipath/',
},
{
@@ -85,7 +85,7 @@ export const COMPARISONS = [
'Deep, native integration with Microsoft 365, Teams, Excel, SharePoint, Dataverse, and Azure identity.',
'Hundreds of prebuilt connectors for cloud flows, so API-first automation often needs no custom code at all.',
'Power Automate for desktop is included with Windows 11 for attended local flows, which makes experimentation essentially free.',
- 'Aggressive published pricing for an enterprise suite: premium per-user plans start around $15 per user per month, and hosted RPA bots are in the roughly $215 per bot per month class.',
+ 'Published pricing starts around $15 per user per month, while hosted RPA bots are in the roughly $215 per bot per month class.',
'Centralized administration and governance through the Power Platform admin center for organizations already run on Microsoft tooling.',
],
},
@@ -116,9 +116,9 @@ export const COMPARISONS = [
chooseThem:
'Choose a computer-use agent for exploratory, novel, or constantly changing work, for research and triage, or for tasks you will run a handful of times and never again.',
chooseUs:
- 'Choose OpenAdapt when the same consequential workflow repeats: healthy runs are deterministic with zero model calls and zero per-run token cost, VERIFIED requires an independent check of the system of record, uncertain delivery has its own reconciliation outcome, and the runtime is MIT-licensed and can execute entirely inside your boundary.',
+ 'Choose OpenAdapt when the same consequential workflow repeats. Healthy runs are deterministic with zero model calls and zero per-run token cost. VERIFIED requires an independent check of the system of record, uncertain delivery has its own reconciliation outcome, and the MIT-licensed runtime can execute entirely inside your boundary.',
honestNote:
- 'These approaches are complementary rather than rivals: agent providers themselves recommend human oversight for consequential actions, and OpenAdapt uses models too, at compile and repair time rather than on every healthy run. The question is whether each run should re-reason the task or replay a verified program.',
+ 'Agent providers recommend human oversight for consequential actions. OpenAdapt also uses models, but at compile and repair time rather than on every healthy run. The question is whether each run should re-reason the task or replay a verified program.',
blogUrl: 'https://blog.openadapt.ai/posts/the-500th-run/',
},
{
@@ -131,7 +131,7 @@ export const COMPARISONS = [
theirStrengths: {
heading: 'Where record-and-replay tools are strong',
items: [
- 'The fastest possible authoring: demonstrate the task once and it becomes repeatable, with no selectors or code.',
+ 'Authoring is quick. Demonstrate the task once and it becomes repeatable, with no selectors or code.',
'Accessible to non-developers, so the people who actually do the work can automate it themselves.',
'Replay avoids re-reasoning the task from scratch on every run, which keeps repeat runs fast and cheap.',
"OpenAI's Record & Replay brings demonstration-based authoring to a mainstream audience, which validates the model for everyone building on it.",
@@ -140,9 +140,9 @@ export const COMPARISONS = [
chooseThem:
'Choose a lightweight record-and-replay tool for personal productivity, low-stakes repetitive tasks, and workflows where an occasional silent miss costs little.',
chooseUs:
- 'Choose OpenAdapt when a replayed action writes to a system of record that matters: the compiled program is reviewable, healthy runs are deterministic with zero model calls, the business effect is verified out of band after the run, ambiguity halts instead of guessing, and the MIT runtime plus your data can stay entirely inside your boundary.',
+ 'Choose OpenAdapt when a replayed action writes to a system of record that matters. The compiled program is reviewable, healthy runs are deterministic with zero model calls, the business effect is verified out of band, ambiguity halts instead of guessing, and the MIT runtime plus your data can stay entirely inside your boundary.',
honestNote:
- 'Recording is the commodity; OpenAdapt does not claim to record better. The difference is governance: an independent verifier, typed transaction outcomes that preserve uncertainty, and published qualification evidence per execution surface.',
+ 'Recording is common, and OpenAdapt does not claim to record better. It adds an independent verifier, typed transaction outcomes that preserve uncertainty, and published qualification evidence per execution surface.',
},
{
slug: 'browser-agents',
@@ -154,7 +154,7 @@ export const COMPARISONS = [
theirStrengths: {
heading: 'Where browser-agent platforms are strong',
items: [
- 'Very fast setup for web tasks: point an agent at a URL and useful behavior often emerges in minutes.',
+ 'Setup for web tasks can be quick. Point an agent at a URL and useful behavior can emerge in minutes.',
'Managed cloud-browser infrastructure removes the burden of running and scaling browsers yourself.',
'Strong fit for scraping, research, monitoring, and other read-heavy web work where a retry is cheap.',
'Active open-source and commercial ecosystems iterating quickly on web-agent capability.',
@@ -165,7 +165,7 @@ export const COMPARISONS = [
chooseUs:
'Choose OpenAdapt when the workflow also crosses desktop or remote surfaces, when the acting session must not be the judge of its own success, when every consequential run needs a typed outcome that preserves uncertainty, or when sensitive data cannot transit a vendor cloud and must run on a customer-controlled MIT runtime.',
honestNote:
- 'Most browser-agent stacks judge success in-band: the same session that acted decides whether it worked. OpenAdapt verifies the business effect out of band, against the system of record, after the run.',
+ 'Most browser-agent stacks let the acting session decide whether the task worked. OpenAdapt verifies the business effect out of band, against the system of record, after the run.',
},
{
slug: 'hand-rolled-scripts',
@@ -177,7 +177,7 @@ export const COMPARISONS = [
theirStrengths: {
heading: 'Where hand-rolled scripts are strong',
items: [
- 'Zero license cost and no vendor relationship: the whole stack is open source and yours.',
+ 'The whole stack is open source and yours, with no license cost or vendor relationship.',
'Exact control over every step, wait, and assertion, with the full power of a general-purpose language.',
'Mature frameworks, huge communities, and years of accumulated answers for almost any situation.',
'For a developer who owns the workflow, a small script is often the fastest and simplest correct answer.',
@@ -186,7 +186,7 @@ export const COMPARISONS = [
chooseThem:
'Keep a hand-rolled script when it already works, a developer owns and maintains it, and its failure modes are understood and affordable.',
chooseUs:
- 'Choose OpenAdapt when scripts have become an unowned maintenance burden, when non-developers need to author workflows by demonstration, or when you need what scripts rarely include: independent out-of-band verification, typed outcomes for refusal and uncertain delivery, and a preserved run report. The runtime is MIT-licensed, so you trade none of the openness.',
+ 'Choose OpenAdapt when scripts have become an unowned maintenance burden or non-developers need to author workflows by demonstration. It adds independent out-of-band verification, typed outcomes for refusal and uncertain delivery, and a preserved run report. The runtime is MIT-licensed, so you trade none of the openness.',
honestNote:
'OpenAdapt does not claim your script cannot work. It packages the verification, outcome discipline, and audit trail that consequential scripts eventually grow by hand, and it publishes qualification evidence per surface instead of assuming coverage.',
},
diff --git a/data/templates/native-desktop-data-entry.json b/data/templates/native-desktop-data-entry.json
index 78c66c26..7d90654c 100644
--- a/data/templates/native-desktop-data-entry.json
+++ b/data/templates/native-desktop-data-entry.json
@@ -14,7 +14,7 @@
"Evidence in progress. The native execution surface is described on the product surfaces page, but we have not yet published per-workflow trial counts for a desktop-application template. This card makes no performance claim; when qualified evidence exists it will be published here with the same structure as the proven templates.",
"provenance": [
{
- "label": "Execution surfaces (browser in production today; desktop through customer-controlled qualification)",
+ "label": "Execution surfaces (complete browser loop; desktop through customer-controlled qualification)",
"url": "https://openadapt.ai/"
}
],
diff --git a/pages/compare/[slug].js b/pages/compare/[slug].js
index e936c227..b534fbe7 100644
--- a/pages/compare/[slug].js
+++ b/pages/compare/[slug].js
@@ -149,7 +149,7 @@ export default function ComparisonDetailPage({ comparison, dimensionData }) {
{comparison.blogUrl && (
- The blog examines the operating tradeoffs in more detail.{' '}
+ The companion article traces the maintenance and failure costs in more detail.{' '}