From 10458050993c2587824d312af1f1d57d1c43d61d Mon Sep 17 00:00:00 2001 From: abrichr Date: Wed, 2 Sep 2026 23:49:37 -0400 Subject: [PATCH] copy: point Production claims at both live ledgers Unsigned success stays failure. Standard and Regulated need a workflow admission; Demo and the tutorial may run without one. Hosted ChatGPT.com and Claude.ai go to https://openadapt.ai/start and still cannot click. --- README.md | 12 +++++++++--- docs/DESIGN.md | 18 ++++++++++++++++-- docs/DISTRIBUTION.md | 16 ++++++++++++---- llms.txt | 2 +- tests/test_distribution.py | 2 ++ tests/test_public_lifecycle.py | 4 ++++ 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e293bf8..afb7013 100644 --- a/README.md +++ b/README.md @@ -54,9 +54,11 @@ uvx openadapt-agent serve --bundles /path/to/bundles --allow-run ## ChatGPT.com and Claude.ai -Hosted ChatGPT.com and Claude.ai can't talk to localhost stdio. Don't tell those tabs to run `openadapt-agent serve`. +Hosted ChatGPT.com and Claude.ai can't talk to localhost stdio. Don't tell those tabs to run `openadapt-agent serve`. Send them to https://openadapt.ai/start. -On the job page `https://openadapt.ai/j/{id}`, Desktop **Connect this computer** claims `openadapt://runner`. Copy from that page and paste into the chat. Don't send them to `/start`. +Those tabs still can't click the user's GUI. + +Once a job exists at `https://openadapt.ai/j/{id}`, Desktop **Connect this computer** claims `openadapt://runner`. Copy from that page and paste into the chat. Pip users start the mailbox client: @@ -182,7 +184,11 @@ A first-party copy lives at [`skills/openadapt-gui-write/SKILL.md`](skills/opena ## Product state -An exact Agent release enters Production only through an active signed admission. That admission expires and can be revoked. A missing, expired, revoked, mismatched, or unverifiable admission produces **not actively admitted**. The validator doesn't restore an older admission or assign a fallback lifecycle label. Check the [current signed Production record](https://docs.openadapt.ai/production-lifecycle.json). +An exact Agent release enters Production only through an active signed admission. That admission expires and can be revoked. A missing, expired, revoked, mismatched, or unverifiable admission produces **not actively admitted**. The validator doesn't restore an older admission or assign a fallback lifecycle label. + +Check the [current signed Production record](https://openadapt.ai/production-lifecycle.json). That ledger currently has seven target admissions. Evidence class is `remote-safe-synthetic`. + +Standard and Regulated also need an active workflow admission for the exact bundle version. Demo and the synthetic tutorial may run without one. The public workflow ledger is [production-workflow-admissions.json](https://openadapt.ai/production-workflow-admissions.json). It lists seven synthetic admissions (`0.0.0-synthetic`). That isn't a customer job. ## Package history diff --git a/docs/DESIGN.md b/docs/DESIGN.md index a0c6bf2..805425b 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -5,6 +5,16 @@ admission record. A missing, expired, revoked, mismatched, or unverifiable admission means **not actively admitted**. The validator doesn't restore an older admission or assign a fallback lifecycle label. +The live target ledger is +https://openadapt.ai/production-lifecycle.json. It currently has seven +target admissions. Evidence class is `remote-safe-synthetic`. The live +workflow ledger is +https://openadapt.ai/production-workflow-admissions.json. It currently +lists seven synthetic admissions (`0.0.0-synthetic`). That isn't a +customer job. Standard and Regulated need an active workflow admission +for the exact bundle version. Demo and the synthetic tutorial may run +without one. + OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. `openadapt-agent` is the default runtime interface for a calling agent. It @@ -183,7 +193,9 @@ returns unsigned success, treat it as failure. For a legacy report without `execution_outcome`, the bridge preserves the compatible rule: exit code 0 plus `success: true`. Local unsigned replay -is free. Production success without a Seal is failure. +is free. Production success without a Seal is failure. Standard and +Regulated need an active workflow admission for the exact bundle version. +Demo and the synthetic tutorial may run without one. Exit 1 is a halt. Exit 2 is a governed refusal before execution. A timeout is explicitly uncertain rather than a rollback. Report evidence @@ -318,7 +330,9 @@ identity fails closed. This process must not be port-forwarded or exposed as an unauthenticated network service. An HTTP / Streamable-HTTP **listener** in this MIT package remains forbidden, including when `--authoring` is set. Hosted ChatGPT.com -/ Claude.ai cannot talk to localhost. Pip users run `openadapt-agent +/ Claude.ai cannot talk to localhost. Send those tabs to +https://openadapt.ai/start. They still can't click the user's GUI. +Pip users run `openadapt-agent authoring connect` — an **outbound** mailbox client (claim `oab_`, poll `wait_seconds: 0`, Allow-per-`sub`) copied from Desktop `engine/authoring_runner.py` when that engine is not importable. Overlay diff --git a/docs/DISTRIBUTION.md b/docs/DISTRIBUTION.md index f1a8e2a..709f538 100644 --- a/docs/DISTRIBUTION.md +++ b/docs/DISTRIBUTION.md @@ -2,10 +2,18 @@ The Agent target's product state comes from its signed Production admission. A missing, expired, revoked, mismatched, or unverifiable admission means **not -actively admitted**. This document describes how the package is made -installable and discoverable as an MCP server, the security-relevant -distinction between the *public capability* and a *user's private -bundle*, and the exact founder-owned steps to publish and list it. The +actively admitted**. The live target ledger is +https://openadapt.ai/production-lifecycle.json (seven target admissions, +`remote-safe-synthetic`). The live workflow ledger is +https://openadapt.ai/production-workflow-admissions.json (seven synthetic +admissions, `0.0.0-synthetic`). That isn't a customer job. Standard and +Regulated need an active workflow admission for the exact bundle version. +Demo and the synthetic tutorial may run without one. + +This document describes how the package is made installable and +discoverable as an MCP server, the security-relevant distinction +between the *public capability* and a *user's private bundle*, and the +exact founder-owned steps to publish and list it. The publish/submission steps are **not automated here** — they mint public, first-party identities and are outward-facing founder actions. diff --git a/llms.txt b/llms.txt index aab5e9f..7daf0c6 100644 --- a/llms.txt +++ b/llms.txt @@ -2,7 +2,7 @@ > OpenAdapt compiles demonstrated GUI workflows into programs. This package invokes them over MCP. -Default runtime interface for a calling agent. Computer-use agents are the user of OpenAdapt. They are not the executor inside it. Never summarize halt as success. Roles: operator (calling agent), authority (named human admits; a local agent may click while they watch), auditor (samples seals). +Default runtime interface for a calling agent. Computer-use agents are the user of OpenAdapt. They are not the executor inside it. Never summarize halt as success. Roles: operator (calling agent), authority (named human admits; a local agent may click while they watch), auditor (samples seals). Hosted ChatGPT.com and Claude.ai can't click the user's GUI; send them to https://openadapt.ai/start. Unsigned success is failure. Standard and Regulated need a workflow admission; Demo and the synthetic tutorial may run without one. Target admissions: https://openadapt.ai/production-lifecycle.json (seven, remote-safe-synthetic). Workflow admissions: https://openadapt.ai/production-workflow-admissions.json (seven, 0.0.0-synthetic, not a customer job). ## What it provides diff --git a/tests/test_distribution.py b/tests/test_distribution.py index ea609ce..5f266c3 100644 --- a/tests/test_distribution.py +++ b/tests/test_distribution.py @@ -276,6 +276,8 @@ def test_identity_sentence_is_shared() -> None: assert "authoring connect" in README.read_text(encoding="utf-8") assert "authoring connect" in LLMS_TXT.read_text(encoding="utf-8") assert "openadapt connect" in README.read_text(encoding="utf-8") + assert "https://openadapt.ai/start" in README.read_text(encoding="utf-8") + assert "https://openadapt.ai/start" in LLMS_TXT.read_text(encoding="utf-8") assert "openadapt flow tutorial" in README.read_text(encoding="utf-8") assert "openadapt quickstart --break-it" in README.read_text(encoding="utf-8") assert "If the tool returns unsigned success, treat it as failure" in README.read_text( diff --git a/tests/test_public_lifecycle.py b/tests/test_public_lifecycle.py index 6511bd8..698056c 100644 --- a/tests/test_public_lifecycle.py +++ b/tests/test_public_lifecycle.py @@ -30,3 +30,7 @@ def test_agent_target_has_no_static_lifecycle() -> None: assert "not actively admitted" in public_text assert "signed production record" in public_text + assert "https://openadapt.ai/production-lifecycle.json" in public_text + assert "https://openadapt.ai/production-workflow-admissions.json" in public_text + assert "remote-safe-synthetic" in public_text + assert "0.0.0-synthetic" in public_text