diff --git a/components/InstallSection.js b/components/InstallSection.js index b5f6194..55c7d8e 100644 --- a/components/InstallSection.js +++ b/components/InstallSection.js @@ -47,7 +47,9 @@ 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. No account or hosted service is required. + 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.

diff --git a/components/MastHead.js b/components/MastHead.js index 550b5d5..82b1899 100644 --- a/components/MastHead.js +++ b/components/MastHead.js @@ -50,10 +50,13 @@ export default function Home({ githubStats }) { Automate the UI-only work your APIs can’t reach.

- OpenAdapt compiles demonstrations into governed - workflows across browser, desktop, RDP, and - Citrix. It verifies consequential results and - halts when it cannot prove the intended outcome. + OpenAdapt compiles demonstrations into one + governed loop across browser, desktop, RDP, and + Citrix. Browser runs in production today; + desktop, RDP, and Citrix run through + customer-controlled qualification. It verifies + consequential results and halts when it cannot + prove the intended outcome.

Verified business effects · fail-closed execution · diff --git a/components/Pricing.js b/components/Pricing.js index 69fcbd5..aa0fb9c 100644 --- a/components/Pricing.js +++ b/components/Pricing.js @@ -269,7 +269,7 @@ export default function Pricing({ hostedOffer = null }) { priceDetail={ hostedOffer?.cadence || LAUNCH_PRICE_CADENCE } - description="Run approved workflows with history, evidence, usage, and governed updates in one managed control plane." + description="For developers and teams evaluating browser workflows on non-regulated data: run approved workflows with history, evidence, usage, and governed updates in one managed control plane. Regulated data and production SLAs are scoped separately through qualification." features={[ 'Managed execution, evidence, usage, and workflow updates', 'Separate from enterprise qualification', diff --git a/components/ProductStatus.js b/components/ProductStatus.js index 2d8b114..3ad5835 100644 --- a/components/ProductStatus.js +++ b/components/ProductStatus.js @@ -47,6 +47,21 @@ export default function ProductStatus() { accessibility elements, and remote visual anchors are never 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{' '} + + qualification evidence + + . +

diff --git a/cypress/e2e/public-surface-coherence.cy.js b/cypress/e2e/public-surface-coherence.cy.js index 5179d50..721ba12 100644 --- a/cypress/e2e/public-surface-coherence.cy.js +++ b/cypress/e2e/public-surface-coherence.cy.js @@ -153,10 +153,12 @@ describe('public surface coherence', () => { ) }) // The refresh failed, so the committed snapshot survives and is - // labelled honestly as a snapshot rather than a fresh fetch. + // labelled honestly as last-known counts rather than a fresh fetch. The + // committed fallback carries no real observation time, so it shows a + // stable label instead of a drifting "snapshot from Nd ago". cy.get('[data-testid="footer-repository-source"]').should( 'contain.text', - 'GitHub · snapshot' + 'GitHub · last-known counts' ) }) }) diff --git a/tests/repositoryStatsView.test.js b/tests/repositoryStatsView.test.js index 765930c..b2b8b60 100644 --- a/tests/repositoryStatsView.test.js +++ b/tests/repositoryStatsView.test.js @@ -55,8 +55,13 @@ test('sourceLabel reports an unreachable-GitHub value as "last updated "', assert.equal(label, 'GitHub · last updated 5m ago') }) -test('sourceLabel reports the committed snapshot as "snapshot from "', () => { - const label = sourceLabel( +test('sourceLabel reports the committed snapshot as a stable "last-known counts"', () => { + // The committed fallback's timestamp is its authoring time, not a real + // GitHub observation, so its label must NOT drift with age. A growing + // "snapshot from Nd ago" is what made the footer read inconsistently stale + // across pages (fresh "updated 5m ago" on the home page versus an + // ever-growing snapshot age everywhere else). + const threeDaysAgo = sourceLabel( { stars: 1648, forks: 258, @@ -66,7 +71,18 @@ test('sourceLabel reports the committed snapshot as "snapshot from "', () = }, NOW ) - assert.equal(label, 'GitHub · snapshot from 3d ago') + const eightDaysAgo = sourceLabel( + { + stars: 1648, + forks: 258, + observedAt: new Date(ago(8 * 24 * 60 * 60 * 1000)).toISOString(), + source: 'snapshot', + stale: true, + }, + NOW + ) + assert.equal(threeDaysAgo, 'GitHub · last-known counts') + assert.equal(eightDaysAgo, 'GitHub · last-known counts') }) test('sourceLabel never prints NaN when the timestamp is missing', () => { @@ -78,7 +94,10 @@ test('sourceLabel never prints NaN when the timestamp is missing', () => { sourceLabel({ source: 'stale', stale: true }, NOW), 'GitHub · last-known counts' ) - assert.equal(sourceLabel({ source: 'snapshot' }, NOW), 'GitHub · snapshot') + assert.equal( + sourceLabel({ source: 'snapshot' }, NOW), + 'GitHub · last-known counts' + ) }) test('sourceLabel always begins with the honest "GitHub" attribution', () => { diff --git a/utils/repositoryStatsView.js b/utils/repositoryStatsView.js index 3b14936..cfea678 100644 --- a/utils/repositoryStatsView.js +++ b/utils/repositoryStatsView.js @@ -29,7 +29,16 @@ function formatRelativeTime(observedAtMs, now = Date.now()) { // - github : a live count observed this session (updated ago) // - stale : GitHub was unreachable on the last refresh; show when the last // real count was observed (last updated ago) -// - snapshot: no live count yet; show the committed snapshot's age +// - snapshot: no live count yet; the committed fallback's timestamp is its +// authoring time, not a real GitHub observation, so it gets a +// STABLE "last-known counts" label rather than a relative age. +// Rendering a drifting "snapshot from Nd ago" here is what made the +// footer read inconsistently stale across pages: the home page +// seeds a fresh build-time observation ("updated 5m ago") while +// every other page seeds this committed fallback, so a growing +// "8d ago" looked like a contradiction. A stable fallback label +// keeps the two honest and consistent until the client poll +// resolves both to the same live "updated ago". function sourceLabel(stats, now = Date.now()) { const rel = formatRelativeTime(Date.parse(stats && stats.observedAt), now) if (stats && stats.source === 'github' && !stats.stale) { @@ -38,7 +47,7 @@ function sourceLabel(stats, now = Date.now()) { if (stats && stats.source === 'stale') { return rel ? `GitHub · last updated ${rel}` : 'GitHub · last-known counts' } - return rel ? `GitHub · snapshot from ${rel}` : 'GitHub · snapshot' + return 'GitHub · last-known counts' } module.exports = { formatRelativeTime, sourceLabel }