Skip to content
Open
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
63 changes: 63 additions & 0 deletions .github/workflows/proofrun.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: ProofRun product journeys

on:
pull_request:
workflow_dispatch:
schedule:
- cron: '13 5 * * 1'

permissions:
contents: read

concurrency:
group: proofrun-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
journeys:
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
timeout-minutes: 120
strategy:
fail-fast: false
max-parallel: 1
matrix:
workflow:
- docs/proofrun/workflows/papertrade-admin-review-ledger-payout.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-author-submission-preview.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-feedback-usercom-signals.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-reader-free-first-page.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-reader-paid-page-purchase.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-reader-paid-page-reread-no-second-charge.v1.proofrun.yaml
- docs/proofrun/workflows/papertrade-wallet-failure-recovery.v1.proofrun.yaml
steps:
- uses: actions/checkout@v4
- name: Verify ProofRun API ingress
run: curl --fail --show-error --location --retry 3 --retry-all-errors --connect-timeout 10 --max-time 30 https://app.proofrun.metanet.app/healthz
- name: Checkout pinned private ProofRun action
uses: actions/checkout@v4
with:
repository: p2ppsr/proofrun-github
ref: e2c18409dfad50aff196cbf4d59a9f0b60592c67
ssh-key: ${{ secrets.PROOFRUN_ACTION_SSH_KEY }}
persist-credentials: false
path: .proofrun/action
- uses: ./.proofrun/action
with:
mode: hosted
workflow: ${{ matrix.workflow }}
profiles: |
proofrun/catalog/profiles/impatient-newcomer.yaml
proofrun/catalog/profiles/domain-expert.yaml
devices: |
proofrun/catalog/devices/android-emulator.yaml
proofrun/catalog/devices/chromium-desktop.yaml
proofrun/catalog/devices/chromium-mobile.yaml
proofrun/catalog/devices/ios-simulator.yaml
proofrun/catalog/devices/metanet-client-macos.yaml
proofrun/catalog/devices/webkit-desktop.yaml
proofrun/catalog/devices/webkit-mobile.yaml
platform-url: https://app.proofrun.metanet.app
token: ${{ secrets.PROOFRUN_TOKEN }}
warn-behavior: success
timeout-seconds: '6900'
20 changes: 10 additions & 10 deletions docs/proofrun/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ The YAML files in this directory are executable `proofrun.dev/v1` contracts.
They were migrated from the operator checklists in `../flows`; those source
checklists remain available for audit history during the transition.

Execution resolves versioned customer and device contracts from the private
`p2ppsr/proofrun-presets` catalog. The migration baseline is ProofRun core
`283f357309a844dde0821dcdc61facbb7f9def64` and catalog
`017c11ec2edbec22371a8e53e7b6511e47ab56b6`.
Execution resolves versioned customer and device contracts from the vendored
`proofrun/catalog` inputs. Their README records the exact private catalog
revision and immutable update rule. The GitHub workflow submits the complete
bundle to the private control plane without requiring an operator checkout.

Ordinary Chromium/WebKit viewport cases can run on Playwright workers today.
Cases naming `ios-simulator`, `android-emulator`, Metanet Explorer, or
Metanet Client remain unschedulable until a runner advertises the corresponding
real device bridge and capabilities. A workflow never executes the arbitrary
local shell commands from the legacy `preflight.commands`; required-state
statements were converted to V1 oracle assertions.
Chromium and WebKit cases run on hosted Playwright workers. Capability-matched
iOS Simulator, Android Emulator, Metanet Explorer, and Metanet Client cases are
leased to the managed Evans Creek macOS runner with state-snapshot restoration.
State-changing and spending journeys still stop at the V1 manual approval
boundary. A workflow never executes arbitrary legacy `preflight.commands`;
required-state statements are portable oracle assertions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: Workflow
metadata:
id: papertrade-feedback-usercom-signals
name: PaperTrade feedback and UserCom signal capture
version: 1.0.0
version: 1.0.1
description: A reader, author, or evaluator who needs to send feedback or support context from a real PaperTrade surface.
labels:
migration: proofrunVersion-1
Expand Down Expand Up @@ -39,7 +39,7 @@ matrix:
- agent: openai-computer
profile: customer.impatient-newcomer@1.0.0
accessibility: standard
device: device.chromium-mobile@1.0.0
device: device.chromium-mobile@1.1.0
legacyMobileBrowser: android-chrome
legacyNetworks: mainnet
- agent: openai-computer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: Workflow
metadata:
id: papertrade-reader-free-first-page
name: PaperTrade reader discovery to first free page
version: 1.0.0
version: 1.0.1
description: A new reader who is curious about PaperTrade but may not yet understand BSV, wallets, or pay-per-page publishing.
labels:
migration: proofrunVersion-1
Expand Down Expand Up @@ -39,7 +39,7 @@ matrix:
- agent: openai-computer
profile: customer.impatient-newcomer@1.0.0
accessibility: standard
device: device.chromium-mobile@1.0.0
device: device.chromium-mobile@1.1.0
legacyMobileBrowser: android-chrome
legacyNetworks: mainnet
- agent: openai-computer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ kind: Workflow
metadata:
id: papertrade-wallet-failure-recovery
name: PaperTrade wallet missing, denied, timeout, and recovery
version: 1.0.0
version: 1.0.1
description: A reader who tries to continue past page 1 without a supported wallet, denies a wallet request, or experiences a wallet timeout.
labels:
migration: proofrunVersion-1
Expand Down Expand Up @@ -42,7 +42,7 @@ matrix:
- agent: openai-computer
profile: customer.impatient-newcomer@1.0.0
accessibility: standard
device: device.chromium-mobile@1.0.0
device: device.chromium-mobile@1.1.0
legacyMobileBrowser: android-chrome
legacyMobileWallets: metanet-explorer-android
legacyNetworks: mainnet
Expand Down
9 changes: 9 additions & 0 deletions proofrun/catalog/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Vendored ProofRun contracts

These immutable CustomerProfile and DeviceProfile inputs are vendored from
private `p2ppsr/proofrun-presets` commit
`233abfc20895d1efac264885d5b05610bc2f5dfd`. They contain no credentials;
secret names are runner-side handles. Update a file only by importing a new
catalog version and updating every `id@version` reference. The pinned GitHub
workflow submits these files with each executable workflow so CI never depends
on an operator checkout or product-specific logic in the ProofRun runtime.
18 changes: 18 additions & 0 deletions proofrun/catalog/devices/android-emulator.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.android-emulator
version: 1.0.0
name: Generic Android small-phone emulator
description: A portable contract that opens the workflow target in Chrome on an isolated Android Emulator.
platform: android
driver: android-emulator
screen: {width: 412, height: 915, scale: 2.6, orientation: portrait, colorScheme: light}
browser: {engine: custom, name: Chrome for Android}
accessibility: [talkback, font-scale, reduce-motion]
capabilities: [device.screenshot, device.trace, device.lifecycle, touch]
provision:
bridgeProfile: generic-android-emulator
mode: browser
image: android-small-phone
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: true}
13 changes: 13 additions & 0 deletions proofrun/catalog/devices/chromium-desktop.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.chromium-desktop
version: 1.0.0
name: Chromium desktop 1440x900
platform: web
driver: playwright
screen: {width: 1440, height: 900, scale: 1, orientation: landscape, colorScheme: light}
browser: {engine: chromium, channel: stable}
accessibility: [keyboard, axe, zoom]
capabilities: [browser.screenshot, browser.dom, browser.trace]
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: false}
14 changes: 14 additions & 0 deletions proofrun/catalog/devices/chromium-mobile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.chromium-mobile
version: 1.1.0
name: Chromium mobile viewport 412x915
description: Portable Android-sized Chromium coverage without an emulator or product-specific app.
platform: web
driver: playwright
screen: {width: 412, height: 915, scale: 2.6, orientation: portrait, colorScheme: light}
browser: {engine: chromium}
accessibility: [keyboard, axe, zoom]
capabilities: [browser.screenshot, browser.dom, browser.trace, touch]
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: false}
18 changes: 18 additions & 0 deletions proofrun/catalog/devices/ios-simulator.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.ios-simulator
version: 1.0.0
name: Generic iOS small-phone simulator
description: A portable contract that opens the workflow target in Mobile Safari on an isolated iOS Simulator.
platform: ios
driver: ios-simulator
screen: {width: 390, height: 844, scale: 3, orientation: portrait, colorScheme: light}
browser: {engine: custom, name: Mobile Safari}
accessibility: [voiceover, dynamic-type, reduce-motion]
capabilities: [device.screenshot, device.trace, device.lifecycle, touch]
provision:
bridgeProfile: generic-ios-simulator
mode: browser
image: ios-small-phone
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: true}
18 changes: 18 additions & 0 deletions proofrun/catalog/devices/metanet-client-macos.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: p2ppsr.metanet-client-macos
version: 1.0.0
name: macOS with Metanet Client
description: Isolated macOS VM with Metanet Client preinstalled and a disposable QA profile.
platform: macos
driver: macos-host
screen: {width: 1512, height: 982, scale: 2, orientation: landscape, colorScheme: light}
browser: {engine: custom, name: System browser with Metanet Client}
accessibility: [voiceover, keyboard, zoom, reduce-motion]
capabilities: [device.screenshot, device.trace, desktop.input, app.preinstalled, wallet.profile-restore]
provision:
bridgeProfile: metanet-client-macos
image: metanet-client-macos-v1
walletSnapshotHandle: PROOFRUN_P0_WALLET_SNAPSHOT
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: true}
14 changes: 14 additions & 0 deletions proofrun/catalog/devices/webkit-desktop.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.webkit-desktop
version: 1.0.0
name: WebKit desktop 1440x900
description: Portable desktop WebKit coverage without a product-specific browser image.
platform: web
driver: playwright
screen: {width: 1440, height: 900, scale: 1, orientation: landscape, colorScheme: light}
browser: {engine: webkit}
accessibility: [keyboard, axe, zoom]
capabilities: [browser.screenshot, browser.dom, browser.trace]
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: false}
13 changes: 13 additions & 0 deletions proofrun/catalog/devices/webkit-mobile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
apiVersion: proofrun.dev/v1
kind: DeviceProfile
metadata:
id: device.webkit-mobile
version: 1.0.0
name: WebKit mobile viewport 390x844
platform: web
driver: playwright
screen: {width: 390, height: 844, scale: 3, orientation: portrait, colorScheme: light}
browser: {engine: webkit, channel: stable}
accessibility: [keyboard, axe, zoom]
capabilities: [browser.screenshot, browser.dom, browser.trace, touch]
isolation: {ephemeral: true, networkPolicy: allowlisted, trustedRefsOnly: false}
24 changes: 24 additions & 0 deletions proofrun/catalog/profiles/domain-expert.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
apiVersion: proofrun.dev/v1
kind: CustomerProfile
metadata:
id: customer.domain-expert
version: 1.0.0
name: Domain expert
description: High familiarity, high technical confidence, still sensitive to wasted motion.
labels: {family: expert}
traits:
goals: [Complete advanced tasks efficiently, Verify operational detail]
domainFamiliarity: 0.95
technicalConfidence: 0.95
riskTolerance: 0.5
language: en-US
readingLevel: expert
accessibilityNeeds: []
cognition:
attentionBudget: 45
confusionThreshold: 35
jargonTolerance: 0.9
patienceActions: 35
maxIdleSeconds: 6
onConfused: backtrack
onBored: skip
27 changes: 27 additions & 0 deletions proofrun/catalog/profiles/impatient-newcomer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
apiVersion: proofrun.dev/v1
kind: CustomerProfile
metadata:
id: customer.impatient-newcomer
version: 1.0.0
name: Impatient newcomer
description: Low domain familiarity and a deliberately short attention budget.
labels: {family: newcomer}
traits:
goals: [Understand the offer quickly, Complete one useful task]
domainFamiliarity: 0.1
technicalConfidence: 0.35
riskTolerance: 0.2
language: en-US
readingLevel: general
accessibilityNeeds: []
cognition:
attentionBudget: 18
confusionThreshold: 14
jargonTolerance: 0.1
patienceActions: 10
maxIdleSeconds: 8
onConfused: ask
onBored: abandon
instructions:
- Do not infer unexplained industry terms from model training; react as this customer would.
- Stop when the attention budget is exhausted and explain the causal UI friction.
Loading