Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion components/InstallSection.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
</p>

<div className={styles.codeContainer}>
Expand Down
11 changes: 7 additions & 4 deletions components/MastHead.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,13 @@ export default function Home({ githubStats }) {
Automate the UI-only work your APIs can&rsquo;t reach.
</h1>
<p className="mt-0 mb-4 mx-auto max-w-2xl font-sans font-normal text-base md:text-lg text-ink-2">
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.
</p>
<p className={styles.fitLine}>
Verified business effects · fail-closed execution ·
Expand Down
2 changes: 1 addition & 1 deletion components/Pricing.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
15 changes: 15 additions & 0 deletions components/ProductStatus.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,21 @@ export default function ProductStatus() {
accessibility elements, and remote visual anchors are never
treated as interchangeable.
</p>
<p className="mx-auto mt-3 max-w-3xl text-center text-sm leading-relaxed text-ink-2 md:text-base">
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{' '}
<a
href="https://docs.openadapt.ai/get-started/what-works-today/"
target="_blank"
rel="noopener noreferrer"
className="text-accent underline"
>
qualification evidence
</a>
.
</p>

<div className="mt-8 rounded-2xl border border-hairline bg-ground p-5 md:p-7">
<div className="mt-6 grid gap-4 md:grid-cols-3">
Expand Down
6 changes: 4 additions & 2 deletions cypress/e2e/public-surface-coherence.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'
)
})
})
27 changes: 23 additions & 4 deletions tests/repositoryStatsView.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,13 @@ test('sourceLabel reports an unreachable-GitHub value as "last updated <rel>"',
assert.equal(label, 'GitHub · last updated 5m ago')
})

test('sourceLabel reports the committed snapshot as "snapshot from <rel>"', () => {
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,
Expand All @@ -66,7 +71,18 @@ test('sourceLabel reports the committed snapshot as "snapshot from <rel>"', () =
},
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', () => {
Expand All @@ -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', () => {
Expand Down
13 changes: 11 additions & 2 deletions utils/repositoryStatsView.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,16 @@ function formatRelativeTime(observedAtMs, now = Date.now()) {
// - github : a live count observed this session (updated <rel> ago)
// - stale : GitHub was unreachable on the last refresh; show when the last
// real count was observed (last updated <rel> 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 <rel> ago".
function sourceLabel(stats, now = Date.now()) {
const rel = formatRelativeTime(Date.parse(stats && stats.observedAt), now)
if (stats && stats.source === 'github' && !stats.stale) {
Expand All @@ -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 }
Loading