diff --git a/README.md b/README.md index c7e6e65..456d2f9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # openadapt-web -**Lifecycle: Beta** +**Lifecycle: Internal** + +This label classifies the website publishing repository. It does not change the +OpenAdapt product lifecycle in `public/status.json`, which is Beta. Source for the [openadapt.ai](https://openadapt.ai) marketing site. diff --git a/components/Faq.js b/components/Faq.js index 747be95..c82a35a 100644 --- a/components/Faq.js +++ b/components/Faq.js @@ -27,6 +27,10 @@ export const faqItems = [ question: 'Is managed hosted execution available?', answer: 'Yes. OpenAdapt Cloud provides managed browser execution plus run history, reports, usage, and governed workflow updates. Desktop, RDP, and Citrix connect through self-hosted or customer-controlled runtimes under the same governance model. Start from the pricing section, then qualify the first workflow and its verification boundary during onboarding.', }, + { + question: 'How does OpenAdapt qualify production use?', + answer: 'OpenAdapt qualifies production use per deployment, not with one platform-wide readiness label. Browser is the available end-to-end reference path. Each production deployment qualifies the exact workflow, application, environment, identity contract, effect verifier, data boundary, and operator responsibilities. The public Cloud readiness page checks service dependencies; it is not an SLA or a workflow certificate. A production SLA or regulated deployment is scoped separately.', + }, { question: 'What software does OpenAdapt work with?', answer: 'OpenAdapt targets repeated workflows across browser applications, Windows UI Automation, native macOS Accessibility, Linux AT-SPI, RDP, Citrix, and other remote desktop environments. Choose managed browser execution or connect a local, self-hosted, or customer-controlled runtime for desktop, remote, private-system, and regulated workflows.', diff --git a/components/InstallSection.js b/components/InstallSection.js index 19507c8..a4a2c0f 100644 --- a/components/InstallSection.js +++ b/components/InstallSection.js @@ -47,9 +47,10 @@ export default function InstallSection() { One command installs the OpenAdapt launcher and governed workflow compiler. The same CLI records, compiles, and replays across browser, Windows, macOS, Linux, RDP, and Citrix under one - governed loop; browser runs in production today, and the desktop - and remote surfaces run through customer-controlled - qualification. No account or hosted service is required. + governed loop. Browser is the available end-to-end reference + path. Desktop and remote surfaces run through + customer-controlled qualification. + No account or hosted service is required.

diff --git a/components/MastHead.js b/components/MastHead.js index 0e4d035..c1b0612 100644 --- a/components/MastHead.js +++ b/components/MastHead.js @@ -58,8 +58,9 @@ export default function Home({ githubStats: initialGithubStats }) {

OpenAdapt compiles demonstrations into one governed loop across browser, desktop, RDP, and - Citrix. Browser runs in production today; - desktop, RDP, and Citrix run through + Citrix. Browser is the available end-to-end + reference path. + Desktop, RDP, and Citrix run through customer-controlled qualification. It verifies consequential results and halts when it cannot prove the intended outcome. diff --git a/components/ProductStatus.js b/components/ProductStatus.js index 3ad5835..396bd8c 100644 --- a/components/ProductStatus.js +++ b/components/ProductStatus.js @@ -48,10 +48,10 @@ export default function ProductStatus() { treated as interchangeable.

- Browser runs in production today; desktop, RDP, and Citrix - run through customer-controlled qualification. Each surface - carries its own measured acceptance evidence, published per - surface in the{' '} + Browser is the available end-to-end reference path. + Desktop, RDP, and Citrix run through customer-controlled + qualification. Each surface carries its own measured + acceptance evidence, published per surface in the{' '} { } }) -test('llms.txt and llms-full.txt never promote a substrate above status.json', () => { +test('llms.txt and llms-full.txt bind a production-ready claim to immutable evidence', () => { // status.json is the canonical machine-readable source of truth. The // superseded ladder wording ("early access", "exploratory") must never - // reappear, and neither may an unqualified "production ready" claim. + // reappear. The target browser claim can publish only with an immutable + // acceptance record from the engine or hosted control-plane repository. for (const [name, text] of [ ['llms.txt', llms], ['llms-full.txt', llmsFull], @@ -381,11 +382,19 @@ test('llms.txt and llms-full.txt never promote a substrate above status.json', ( /early access|exploratory|design.partner/i, `${name} must not use the superseded maturity ladder` ) - assert.doesNotMatch( - text, - /production[- ]ready|fully certified|guaranteed/i, - `${name} must not overstate maturity` - ) + assert.doesNotMatch(text, /fully certified|guaranteed/i) + if (/production[- ]ready/i.test(text)) { + assert.match( + text, + /production-ready for qualified browser workflows/i, + `${name} must scope a production-ready claim to qualified browser workflows` + ) + assert.match( + text, + /Production-readiness evidence:\s+https:\/\/github\.com\/OpenAdaptAI\/(?:openadapt-flow|openadapt-cloud)\/blob\/[0-9a-f]{40}\/\S+/i, + `${name} must bind the production-ready claim to an immutable acceptance record` + ) + } for (const substrate of status.substrates) { assert.ok( text.includes(substrate.name), @@ -439,6 +448,43 @@ test('llms-full.txt states the limitations rather than only the strengths', () = ) }) +test('llms files make production qualification workflow-specific', () => { + // Assistants often collapse a Beta product and a live service dependency + // check into one global verdict. The published answer must keep product, + // workflow, deployment, and SLA status separate. + for (const [name, text] of [ + ['llms.txt', llms], + ['llms-full.txt', llmsFull], + ]) { + const normalized = text.replace(/\s+/g, ' ') + assert.match(normalized, /not with one platform-wide readiness label/i) + assert.match(normalized, /Browser is the available end-to-end reference path/i) + assert.match(normalized, /Each production deployment qualifies the exact workflow/i) + assert.match(normalized, /not an SLA or a workflow certificate/i) + assert.match(normalized, /Desktop is a Beta supporting surface/i) + assert.doesNotMatch( + normalized, + /no unattended desktop runs/i, + `${name} must not invent a platform-wide unattended-run prohibition` + ) + } +}) + +test('llms files publish the canonical launcher quickstart', () => { + for (const [name, text] of [ + ['llms.txt', llms], + ['llms-full.txt', llmsFull], + ]) { + assert.match(text, /python -m pip install --upgrade 'openadapt\[browser\]'/) + assert.match(text, /openadapt quickstart/) + assert.doesNotMatch( + text, + /^demo-record\b/m, + `${name} must not drop the launcher or engine command prefix` + ) + } +}) + test('llms.txt points at the canonical machine-readable status', () => { assert.ok(llms.includes(`${SITE}/status.json`)) assert.ok(llms.includes(`${SITE}/llms-full.txt`)) diff --git a/tests/publicTruth.test.js b/tests/publicTruth.test.js index 429304d..3053810 100644 --- a/tests/publicTruth.test.js +++ b/tests/publicTruth.test.js @@ -207,7 +207,8 @@ test('machine-readable use cases do not claim mortgage, LOS, or a healthcare ver }) test('public repository declares its lifecycle state', () => { - assert.match(read('README.md'), /Lifecycle: Beta/) + assert.match(read('README.md'), /Lifecycle: Internal/) + assert.match(read('README.md'), /product lifecycle.*Beta/is) }) test('lending demo media has durable synthetic evidence provenance', () => {