Skip to content
Draft
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
18 changes: 12 additions & 6 deletions .github/workflows/platform-manifest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ on:
branches:
- main
schedule:
# DAILY drift check. The manifest goes stale because openadapt-flow,
# -capture, or -desktop released in ANOTHER repository, so no commit
# DAILY drift check. The manifest goes stale when a component releases in
# ANOTHER repository, so no commit
# lands here and only the schedule can notice. This was weekly, which
# meant up to seven days of serving wrong sha256 digests from
# raw.githubusercontent; flow 1.24.0 published on 2026-07-27 and the
Expand All @@ -24,8 +24,8 @@ on:
# Receiver for a component repository to announce its release immediately
# rather than waiting for the daily sweep.
#
# NOT YET WIRED: as of 2026-07-28 no component repository sends this. None of
# openadapt-flow, -capture, or -desktop has a dispatch step in its release
# NOT YET WIRED: as of 2026-07-28 no component repository sends this. No
# component has a dispatch step in its release
# workflow, so the daily cron above is in practice the ONLY thing that
# notices a component release. That is how flow 1.25.0 and 1.25.1 published
# on 2026-07-27 after the manifest was regenerated at 15:42 that day and the
Expand All @@ -50,7 +50,9 @@ on:
types: [component-released]

concurrency:
group: platform-manifest-${{ github.ref }}
group: >-
platform-manifest-${{ github.event_name }}-${{
github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
Expand All @@ -75,6 +77,8 @@ jobs:

# Standard library only: no dependency install, no lockfile, no cache.
- name: Validate platform manifest against published artifacts
env:
GITHUB_TOKEN: ${{ github.token }}
run: python scripts/validate_platform_manifest.py

- name: Prove the drift guard fails when it should
Expand All @@ -84,7 +88,9 @@ jobs:
if: github.event_name == 'pull_request' || github.event_name == 'push'
run: |
python -m pip install --quiet 'pytest>=8.0.0'
python -m pytest tests/test_platform_manifest_drift.py -q
python -m pytest \
tests/test_platform_manifest_drift.py \
tests/test_platform_version_display.py -q

report-manifest-drift:
# A red scheduled run in a repository nobody has open is not a signal.
Expand Down
83 changes: 83 additions & 0 deletions docs/platform-compatibility-report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# OpenAdapt platform compatibility report

<!-- Generated by scripts/render_platform_versions.py. Do not edit. -->

- Generated: `2026-07-28T11:01:07+00:00`
- Release channel: **beta**
- Selection: `latest-published`
- Compatibility: **dependency-compatible**
- Signature: `unsigned (signing infrastructure pending)`

## Published components

| Role | Package | Version | Release source reference | Published artifacts |
|---|---|---:|---|---|
| launcher | `openadapt` | `1.10.2` | [`v1.10.2`](https://github.com/OpenAdaptAI/OpenAdapt/tree/v1.10.2)<br>commit `9cddb87ca5f78a47ed5d379a57e2f53ca4484c71`<br>tree `98464eb5f9d16afb0af32de7c585a3155843a5a0` | `openadapt-1.10.2-py3-none-any.whl` `717adffae146a3dea22f82a57317e45d15c98b1f115285e60a93b01fe45464d6`<br>`openadapt-1.10.2.tar.gz` `cae5a1421213521c7d60f613024d8683b2cb0c118186202279c5cb03d2731a38` |
| flow | `openadapt-flow` | `1.25.1` | [`v1.25.1`](https://github.com/OpenAdaptAI/openadapt-flow/tree/v1.25.1)<br>commit `b3966d01f0b574c07d7a46429f60769f859b6a23`<br>tree `c3ee13d43a56df9d394a60a5f9fc5f18114daedd` | `openadapt_flow-1.25.1-py3-none-any.whl` `375c516837a44bc8bea87ba0429967f92561d6df92eef41e624f55c281bed9ae`<br>`openadapt_flow-1.25.1.tar.gz` `15393bb978283e87f043e6fa5f05d7b1d3fc0f9a497a4cf9561a23e8fc5f76ac` |
| capture | `openadapt-capture` | `1.2.2` | [`v1.2.2`](https://github.com/OpenAdaptAI/openadapt-capture/tree/v1.2.2)<br>commit `06ade22948c12dcc6608bd54b5cca5c9c306e77c`<br>tree `b0a3b5b53f23536e01314f36aa46fd5b2d8baba6` | `openadapt_capture-1.2.2-py3-none-any.whl` `550fffe50990fa8431d332bdd5fe4755976d83baa7ad62553f50ad9e4ddcd1ae`<br>`openadapt_capture-1.2.2.tar.gz` `6f4298d3daadf9cced8994207e34b3116a79209ef792e98f778a0770e2f3406c` |
| privacy | `openadapt-privacy` | `1.0.1` | [`v1.0.1`](https://github.com/OpenAdaptAI/openadapt-privacy/tree/v1.0.1)<br>commit `741e1546aab65676f5e5811c306fc77f6131824d`<br>tree `ca7db739ca7c14f0b25078c13ed5e1c7566d12a6` | `openadapt_privacy-1.0.1-py3-none-any.whl` `0109127838e854b22a2e90a911f0b83812d32dd1e7b8340faf8ebdb69ef2a478`<br>`openadapt_privacy-1.0.1.tar.gz` `e9bc90d7a8306088341d83432faf547c16f6bc141c4776e96359571d93923a27` |
| types | `openadapt-types` | `0.6.4` | [`v0.6.4`](https://github.com/OpenAdaptAI/openadapt-types/tree/v0.6.4)<br>commit `a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c`<br>tree `abdaad39abe87521168c26b12fab5c2ad2fe5717` | `openadapt_types-0.6.4-py3-none-any.whl` `115e5040bf5a03cbe68a6f5d9b5a412d48432b46e546cded9f5e977d76687837`<br>`openadapt_types-0.6.4.tar.gz` `3e4752c90daf989485f9d9f5f364643a8a6bcca9e06a934b7b7598cdf145b8d3` |
| desktop | `openadapt-desktop` | `0.14.0` | [`desktop-v0.14.0`](https://github.com/OpenAdaptAI/openadapt-desktop/tree/desktop-v0.14.0)<br>commit `778c8384369c75b31c24c1de92c9597c0e09b469`<br>tree `f8b7260f9d459f1d4a3a9640c501d8125d8f353a` | `openadapt_desktop-0.14.0-py3-none-any.whl` `7ee5a1d2e00f5cbd887edd070916e53530c9548b04713a1aa7d9960f2d313082`<br>`openadapt_desktop-0.14.0.tar.gz` `44a50bd2c126524a76b4d0c0eb0bed9f24667940f735eed1dfed03dce7e9862b` |
| agent | `openadapt-agent` | `2.0.1` | [`v2.0.1`](https://github.com/OpenAdaptAI/openadapt-agent/tree/v2.0.1)<br>commit `d9f16b2946dfdd0228eeb2660047347df9dce8d8`<br>tree `26606c89b4294603b628f1b3aaa8283c45765326` | `openadapt_agent-2.0.1-py3-none-any.whl` `5c5f6e3eca4c127d87b3affb8944223c0836916e0df57d0c6b8ba737b3bc8b5a`<br>`openadapt_agent-2.0.1.tar.gz` `67e05b299a4f035a0482b3032decc151fafc22de9a12bb3d8f884f37ea4cc937` |

## Runtime selections

| Unit | Version | Selected or locked OpenAdapt packages |
|---|---:|---|
| launcher_environment | `1.10.2` | `openadapt==1.10.2`<br>`openadapt-flow==1.25.1` |
| customer_runner | `1.25.1` | `openadapt-flow==1.25.1`<br>`openadapt-types==0.6.4` |
| desktop_sidecar | `0.14.0` | `openadapt-capture==1.1.1`<br>`openadapt-flow==1.23.0`<br>`openadapt-privacy==1.0.0`<br>`openadapt-types==0.5.0` |
| agent_bridge | `2.0.1` | `openadapt-agent==2.0.1`<br>`openadapt-flow==1.25.1` |

## Selected-platform dependency compatibility

These edges show whether each selected integration version satisfies its published dependency constraint. Optional markers do not mean that every package is installed in every runtime unit.

| Scope | Source | Target | Constraint | Selected | Activation |
|---|---|---|---|---:|---|
| desktop-sidecar-lock | `openadapt-desktop==0.14.0` | `openadapt-capture` | `>=1.1.0` | `1.1.1` | `always` |
| desktop-sidecar-lock | `openadapt-desktop==0.14.0` | `openadapt-flow` | `==1.23.0` | `1.23.0` | `extra == "build"` |
| desktop-sidecar-lock | `openadapt-desktop==0.14.0` | `openadapt-privacy` | `>=1.0.0` | `1.0.0` | `always` |
| desktop-sidecar-lock | `openadapt-desktop==0.14.0` | `openadapt-types` | `==0.5.0` | `0.5.0` | `always` |
| selected-platform | `openadapt-agent==2.0.1` | `openadapt-flow` | `<2,>=1.18.1` | `1.25.1` | `always` |
| selected-platform | `openadapt-capture==1.2.2` | `openadapt-privacy` | `>=0.1.0` | `1.0.1` | `extra == "all"`<br>`extra == "privacy"` |
| selected-platform | `openadapt-flow==1.25.1` | `openadapt-capture` | `>=1.2.0` | `1.2.2` | `extra == "capture"` |
| selected-platform | `openadapt-flow==1.25.1` | `openadapt-privacy` | `>=1.0.0` | `1.0.1` | `extra == "privacy"` |
| selected-platform | `openadapt-flow==1.25.1` | `openadapt-types` | `<0.7.0,>=0.6.0` | `0.6.4` | `extra == "console"`<br>`extra == "dev"`<br>`extra == "interop"` |
| selected-platform | `openadapt==1.10.2` | `openadapt-capture` | `<2.0.0,>=1.0.4` | `1.2.2` | `extra == "all"`<br>`extra == "capture"`<br>`extra == "core"` |
| selected-platform | `openadapt==1.10.2` | `openadapt-flow` | `<2.0.0,>=1.20.1` | `1.25.1` | `always`<br>`extra == "all"`<br>`extra == "capture"`<br>`extra == "core"`<br>`extra == "flow"`<br>`extra == "privacy"`<br>`extra == "rdp"`<br>`extra == "windows"`<br>`sys_platform == "darwin" and extra == "all"`<br>`sys_platform == "darwin" and extra == "macos"`<br>`sys_platform == "linux" and extra == "all"`<br>`sys_platform == "linux" and extra == "linux"` |

## Cross-component schemas

| Contract | Owner | Accepted versions | Exact source |
|---|---|---|---|
| `workflow_bundle` | `flow` | `schema_version` [1, 2] | [`openadapt_flow/bundle_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/b3966d01f0b574c07d7a46429f60769f859b6a23/openadapt_flow/bundle_validation.py) `1163fe77d786b0a5481d4d4f5f82d5bd9e95c0808586951b1fcd50e6f8a8eb63`<br>[`openadapt_flow/ir.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/b3966d01f0b574c07d7a46429f60769f859b6a23/openadapt_flow/ir.py) `f55d9a078b208a5204e7b72ddf1c90228a5ce772bb5350323525e6f6593bc614` |
| `capture_structural_observation` | `capture` | `openadapt.capture.structural-observation/v` [1] | [`openadapt_capture/structural.py`](https://github.com/OpenAdaptAI/openadapt-capture/blob/06ade22948c12dcc6608bd54b5cca5c9c306e77c/openadapt_capture/structural.py) `8f8bce37148a3357ace147c46a7c45e6d5501b70622b24b1ac2490f2def304fc` |
| `control_overlay_frame` | `types` | `openadapt.control-overlay-frame/v` [1, 2] | [`openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`<br>[`openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `control_overlay_timeline` | `types` | `openadapt.control-overlay-timeline/v` [1, 2] | [`openadapt_types/control_overlay.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/control_overlay.py) `3aa01f89b43e12478c9e2ff1a9e61689397370691d15247ded9dcd5b05242790`<br>[`openadapt_types/control_overlay_tracking.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/control_overlay_tracking.py) `af8d934f0572c5f4e9c63ba720d4a1d0e73c8cdf3f7b87cc4562c01a8a551755` |
| `human_decision_task` | `types` | `openadapt.human-decision-task/v` [1] | [`openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/human_decision.py) `30aedcdb7bf7291d7b0f061703a1feecd672c9a0529c539bdb09c47d2bb1271b` |
| `human_decision_receipt` | `types` | `openadapt.human-decision-receipt/v` [1] | [`openadapt_types/human_decision.py`](https://github.com/OpenAdaptAI/openadapt-types/blob/a93c12e29d9cb50d7c5b8e0e4c816cf3f4fe305c/openadapt_types/human_decision.py) `30aedcdb7bf7291d7b0f061703a1feecd672c9a0529c539bdb09c47d2bb1271b` |
| `remote_decision_projection` | `flow` | `openadapt.remote-decision-projection/v` [1] | [`openadapt_flow/console/human_decisions.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/b3966d01f0b574c07d7a46429f60769f859b6a23/openadapt_flow/console/human_decisions.py) `5956b9677dfe6d9fca43be8b0201ea707c7e303ac9c1987b1ef24336452dfaf5` |
| `runtime_validation` | `flow` | `openadapt.runtime-validation/v` [1, 2] | [`openadapt_flow/runtime_validation.py`](https://github.com/OpenAdaptAI/openadapt-flow/blob/b3966d01f0b574c07d7a46429f60769f859b6a23/openadapt_flow/runtime_validation.py) `5f6e81e1c170419f0b755b8cb1cbdd61064a4b02b37439c65fbd027285d6a4b2` |

## Host operating systems

`windows`, `macos`, `linux`

## Substrate delivery

| Substrate | Public label | Delivery |
|---|---|---|
| Browser | Available | Local, managed OpenAdapt Cloud, or customer-controlled |
| Windows | Available | Local or customer-controlled |
| macOS | Available | Local or customer-controlled |
| Linux | Available | Local or customer-controlled |
| RDP | Available | Local or customer-controlled |
| Citrix / VDI | Available | Local or customer-controlled |
| Hosted Cloud | Beta | Managed browser runner and control plane |

## Qualification evidence

- [openadapt-public-status](https://openadapt.ai/status.json): Canonical machine-readable release, capability, and substrate qualification status, maintained in openadapt-web (public/status.json).
- [flow-public-demo-evidence-packs](https://github.com/OpenAdaptAI/openadapt-flow/tree/b3966d01f0b574c07d7a46429f60769f859b6a23/public-demo/evidence-packs): Versioned public evidence packs with per-pack manifest files, replay evidence, and fault-case results.
- [flow-effectbench-task-pack](https://github.com/OpenAdaptAI/openadapt-flow/blob/b3966d01f0b574c07d7a46429f60769f859b6a23/benchmark/effectbench/task_pack/manifest.json): Effect-verification benchmark task pack manifest used by the flow qualification harness.
Loading