Last updated: 2026-06-09. A live record of OpenWOP-compatible hosts — their advertised compatibility profiles and the conformance evidence behind each claim. A row is a claim plus evidence: the claim is the host's advertised profile; the evidence is the conformance result published with the host (or under
conformance.md).
Hosts
| Host | Use case | Repo / Path | Compatibility profile claim | Scale claim | Production profile claim | Conformance link |
|---|---|---|---|---|---|---|
| In-memory (reference example) | Local development / fastest boot / no persistence | examples/hosts/in-memory/ | openwop-core · openwop-stream-sse · openwop-stream-poll | minimal | Not claimed | conformance.md |
| SQLite (reference example) | Single-machine durability / process-restart-safe | examples/hosts/sqlite/ | openwop-core · openwop-stream-sse · openwop-stream-poll · openwop-audit-log-integrity · openwop-interrupt-quorum · openwop-interrupt-auth-required · openwop-interrupt-external-event · openwop-interrupt-cascade-cancel · openwop-auth-api-key-rotation · openwop-discovery-auth-scoped | minimal | Not claimed | conformance.md |
| Python in-memory (reference example) | Cross-language portability — Python 3.11 stdlib-only port | examples/hosts/python/ | openwop-core · openwop-stream-sse · openwop-stream-poll | minimal | Not claimed | conformance.md |
| Postgres (reference example) | Multi-process durability + first production-profile host | examples/hosts/postgres/ | openwop-core · openwop-stream-poll · openwop-stream-sse · openwop-audit-log-integrity · openwop-interrupt-quorum · openwop-interrupt-auth-required · openwop-interrupt-external-event · openwop-interrupt-cascade-cancel · openwop-production · openwop-auth-oauth2-client-credentials · openwop-auth-oidc-user-bearer · openwop-auth-mtls · openwop-auth-api-key-rotation · openwop-discovery-auth-scoped (auth profiles conditional on env) | minimal | Claimed (since 2026-05-11) | conformance-full.md |
MyndHyve workflow-runtime (steward-affiliated sibling host — separate deployment, same maintainer org; not an independent-organization host, per the GOVERNANCE.md §"Acceptance evidence tiers" taxonomy this is tier-2 evidence) | Production agent-platform deployment whose live advertisements drove the RFC 0078–0094 Active → Accepted graduations | Closed source; live discovery: https://api.myndhyve.ai/.well-known/openwop | openwop-core · openwop-interrupts · openwop-stream-sse · plus the operational-annex claims openwop-core-standard (RFC 0088) and openwop-agent-platform full (RFC 0085) in its live profiles[] | Not published | Not claimed | Per-RFC graduation evidence in the Updated fields of RFCS/0078–0094 + the CHANGELOG.md 1.1.7/1.1.8 graduation entries (RFC 0093/0094: revision 00476-xuv, suite 1.22.0, 2026-06-11) (gated scenarios pass non-vacuously under OPENWOP_REQUIRE_BEHAVIOR=true; steward-curl-verified; the steward independently re-derived the profile predicates from the public discovery document); also drove the token-economy Active → Accepted graduations of RFC 0112 / 0113 / 0115 (2026-06-27, suite 1.43.0, tier-2 revs 00511-len / 00512-pej / 00510-jiv, steward-curl-verified) — RFC 0114 + 0116 honestly opted out (headless runtime emits no a2ui surface; durable path runs no provider prompt-caching) |
Agent Platform profile (RFC 0085 — openwop-agent-platform)
The aggregate platform profile defined in spec/v1/agent-platform-profile.md (RFC 0085, Accepted 2026-06-01). A host populates the status column when it reaches partial/full. MyndHyve — the steward-affiliated sibling host whose graduation evidence accepted the RFC — derives full; no example reference host claims it yet (honest).
| Host | openwop-agent-platform status | Notes |
|---|---|---|
MyndHyve workflow-runtime | full | Advertises the profile in its live profiles[]; the steward independently re-derived isAgentPlatformFull from the public discovery doc (all 16 §B terms) and the aggregate-evidence scenario passes non-vacuously at tier full — see RFC 0085's Updated field. Steward-affiliated sibling host (same maintainer org). |
| In-memory | none | Advertises feedback + several floor constituents, not the full floor set. |
| SQLite | none | — |
| Python | none | — |
| Postgres | none (candidate) | Already production-profile-satisfying and advertises memory / authorization / httpClient — the natural first partial/full candidate. |
Connection packs (RFC 0095 — capabilities.connections.packsSupported)
The portable provider-definition pack kind defined in spec/v1/connection-packs.md (RFC 0095, Accepted 2026-06-12). A host populates the status column when it advertises connections.packsSupported: true and implements the §Manifest clause 6 resolution contract; verification is the two capability-gated behavioral scenarios (connection-provider-resolution + connection-pack-write-reconsent) run non-vacuously against the published suite.
| Host | connections.packsSupported status | Notes |
|---|---|---|
| openwop-app reference | live + strict-verified | §B.6 loader-path resolution (openwop-app#178) + §10 test seams (#194) deployed rev 00160-kjq; connections.packsSupported advertised live (steward curl-verified on the direct run.app URL; seams correctly 404 in production). All five 1.23.0 scenarios pass NON-VACUOUSLY (OPENWOP_REQUIRE_BEHAVIOR=true) against a seam-enabled instance at the deployed code. |
MyndHyve workflow-runtime | live + strict-verified | §B.6 publish-path resolution (myndhyve#167/#168) + §10 seams (#169) serving on api.myndhyve.ai (revision workflow-runtime-00268-x9l); connections.packsSupported advertised live (steward curl-verified). All five 1.23.0 scenarios pass NON-VACUOUSLY (OPENWOP_REQUIRE_BEHAVIOR=true) over the live seams — the RFC 0095 Active → Accepted non-steward evidence. |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Multi-party group conversation (RFC 0101 — capabilities.multiPartyConversation)
The shared-transcript / speaker-attribution surface defined in RFC 0101 (Accepted 2026-06-22). A host populates the status column when it advertises multiPartyConversation.supported: true, emits the optional participants: AgentRef[] on conversation.opened, stamps speakerId on role:'agent' turns, and rejects a turn from a non-participant. The always-on leg of multi-party-conversation-shape.test.ts verifies the schema shapes server-free; the capability-gated behavioral leg (isMultiPartyConversationSupported()) verifies live roster + attribution + non-participant rejection against an advertising host.
| Host | multiPartyConversation status | Notes |
|---|---|---|
| openwop-app reference | advertised live — steward-curl-verified (rev 00291-l8v) | First advertising host (Board of Advisors councils, ADR 0040 Phase 6). multiPartyConversation { supported:true, maxParticipants:8 } advertised on the live discovery doc — steward-curl-verified 2026-06-22 on the deployed Cloud Run revision openwop-app-backend-00291-l8v (curl https://app.openwop.dev/api/.well-known/openwop → supported:true, maxParticipants:8). Host emits the participants roster on conversation.opened, stamps the advisor-instance speakerId on every agent turn, and rejects a non-participant turn (422) — host-side enforcement covered by multi-party-conversation.test.ts (openwop-app#666); the always-on conformance shape leg passes. Remaining for full strict-verified: a non-vacuous behavioral conformance scenario — deferred at the suite level (a multi-party council is not a standard-wire-triggerable flow, so it can't be driven host-agnostically yet; the same Active → Accepted staging RFC 0086 used for its behavioral leg). |
MyndHyve workflow-runtime | none | — |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Localized content surface (RFC 0103 — capabilities.content.supported)
The capability-gated authored-content surface defined in spec/v1/localized-content.md (RFC 0103, Accepted 2026-06-17). A host populates the status column when it advertises content.supported: true (requires i18n.supported) and serves GET /v1/content/pages/{slug} with the §C resolveSection merge; the always-on legs of localized-content-delivery.test.ts verify the schemas + merge + capability coherence server-free, and the gated legs verify live delivery + tenant isolation.
| Host | content.supported status | Notes |
|---|---|---|
| openwop-app reference | live + non-vacuous | HOST-1 i18n.md annex (Accept-Language/Content-Language/capabilities.i18n) + HOST-2 content surface (content/resolve.ts resolveSection, /v1/content/*, SQLite/Postgres-backed, §F tenant-scoped); content { baseLocale:'en', supportedLocales:['es','pt-BR','fr'] } advertised on prod rev 00234-mg8 (app.openwop.dev, steward-curl-verified; main 999bfd0f, PR #412 / ADR 0064). Ran localized-content-delivery 18/18 NON-VACUOUSLY (incl. the live §A-coherence leg) — the second non-steward witness, closing the RFC 0103 content dual-witness bar. |
MyndHyve workflow-runtime | live + non-vacuous | Layer 1 (annex) + Layer 2 (content/resolveSection.ts + /v1/content/* over the Firestore CMS, credential-derived tenant per §F); content { baseLocale:'en', supportedLocales:['es','pt-BR','fr'] } advertised at doc root on prod rev 00273-6rf (api.myndhyve.ai, steward-curl-verified). Ran localized-content-delivery 18/18 NON-VACUOUSLY (incl. the live §A-coherence leg) + i18n-negotiation 4/4 — the Active → Accepted non-steward witness leg. |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Multi-turn conversation primitive (RFC 0005 — capabilities.conversationPrimitive)
The multi-turn conversation suspend variant defined in RFC 0005 (Accepted 2026-05-11), wiring the core.conversationGate typeId + the conversation.start / conversation.exchange / conversation.close suspend variants (normative surface in spec/v1/interrupt.md + spec/v1/capabilities.md). A host populates the status column when it advertises conversationPrimitive: true and takes the conversation path over the clarification.requested fallback; verification is the capability-gated conversationLifecycle / conversationReplayDeterminism / conversationVsLegacySuspend scenarios run non-vacuously, with conversationCapabilityNegotiation covering the negative refusal contract on hosts that do not advertise.
| Host | conversationPrimitive status | Notes |
|---|---|---|
| openwop-app reference | live + non-vacuous | ADR 0067 Phase-6 cutover: chat suspends ONLY via core.conversationGate (the per-turn fallback is retired). conversationPrimitive: true + the conversation.start/conversation.exchange/conversation.close interrupt kinds advertised at the discovery root on prod rev openwop-app-backend-00265-wtx (steward-curl-verified on the direct run.app URL; discovery-doc SHA-256 d098c9c4…c89f4c114). Ran the three positive scenarios — conversationLifecycle, conversationReplayDeterminism (incl. the §G replay/:fork byte-equal leg), conversationVsLegacySuspend — 3/3 NON-VACUOUSLY (OPENWOP_REQUIRE_BEHAVIOR=true) against suite 1.29.0 at the deployed code, 2026-06-21. conversationCapabilityNegotiation is correctly inapplicable here — it is the inverted gate, running only when the primitive is unadvertised. |
MyndHyve workflow-runtime | live + non-vacuous | conversationPrimitive: true advertised at the discovery root (+ a capabilities mirror) on prod rev workflow-runtime-00281-j8f (counter-reset by an unrelated stale-YAML rollback recovered same-day; serving code is current main) — api.myndhyve.ai, steward-curl-verified, discovery-doc SHA-256 d7d7ed32…18cd528. Ran the three positive scenarios — conversationLifecycle, conversationReplayDeterminism (the :fork returned 201, so the §G byte-equal leg ran), conversationVsLegacySuspend — 3/3 NON-VACUOUSLY (OPENWOP_REQUIRE_BEHAVIOR=true, serial) against suite 1.29.0, 2026-06-21; conversationCapabilityNegotiation correctly skipped (inverted gate). The conversation. suspend variants are proven on the wire by conversationVsLegacySuspend (emits conversation., zero clarification.*), not discovery-enumerated — MyndHyve ships no interrupts.kinds array. The second non-steward witness, closing the RFC 0005 dual-witness bar. |
| In-memory | none | — |
| SQLite | none | Wires only the negative refusal contract (GATED_TYPEID_MAP → core.conversationGate refused when referenced); deliberately does not advertise the primitive. |
| Python | none | Does not claim conversationPrimitive; the refusal contract is unwired (conformance.md). |
| Postgres | none | — |
Self-hosted / OpenAI-compatible provider class (RFC 0108 — aiProviders.selfHosted[])
The operator-/tenant-configured OpenAI-compatible endpoint class defined in spec/v1/capabilities.md §aiProviders.selfHosted (RFC 0108, Active 2026-06-24). A host populates the status column when it advertises aiProviders.selfHosted: string[] (a subset of supported[]) for a configured, reachable endpoint — honestly (§A.2, under OPENWOP_REQUIRE_BEHAVIOR), with an opaque non-URL id (§A.3), keeping the endpoint location off every wire surface (self-hosted-endpoint-no-disclosure). The always-on aiproviders-selfhosted-shape.test.ts verifies the §A field shape + the §A.1 subset / §A.3 no-URL rules server-free; the gated aiproviders-selfhosted-honesty.test.ts (lands at Active → Accepted) verifies a real dispatch against a selfHosted id with no endpoint-URL leak.
| Host | aiProviders.selfHosted status | Notes |
|---|---|---|
| openwop-app reference | harness-witnessed (non-vacuous) | ADR 0121 (PR #725 merged): compat dispatch case + per-connection base-URL Connection (ADR 0024) + modelCapabilityProbe (§B). Advertises aiProviders { supported:[…,"compat"], selfHosted:["compat"] } and passes aiproviders-selfhosted-shape + aiproviders-selfhosted-honesty non-vacuously under OPENWOP_REQUIRE_BEHAVIOR=true vs conformance 1.37.0 — the honesty leg dispatches against compat, reaches a real loopback OpenAI-compatible endpoint (HTTP 200, not capability_not_provided → §A.2 honest), the id is non-URL (§A.3), and the endpoint location leaks into no response/error payload (§D). Witness = the host's conformance harness (conformance/run.ts stands up the real mock + sets OPENWOP_TEST_COMPAT_ENDPOINT), production-dark (OPENWOP_COMPAT_PROVIDER_ENABLED unset ⇒ selfHosted:[]) — the appropriate evidence tier for an operator-private surface §D says MUST NOT be publicly exposed (mirrors the RFC 0035 harness-graduation precedent; no deployed public discovery doc by design). Steward-verified by code-inspecting the honesty-gated emission + the real-mock setup. The RFC 0108 Active → Accepted single-witness close under the bootstrap steward waiver (2026-06-24). |
MyndHyve workflow-runtime | none | — |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Parallel sub-workflow fan-out and join (RFC 0118 — capabilities.dispatch.fanOutSupported)
RFC 0118 graduated Active → Accepted on 2026-06-28. Both legs are now dual-witness and steward-verified (2026-06-28): the discovery/advertisement leg by /.well-known/openwop curl of each host, and the behavioral leg by a direct steward probe of each host's seam-enabled POST /v1/host/sample/dispatch/fanout returning a real, non-vacuous coordinator+fold. (At the original flip the behavioral leg was single-witness host-self-reported with a steward cross-check deferred; the deferred cross-check was subsequently run once both hosts stood up auth-exempt conf-fanout seam revisions — see the rows below. The full @openwop/openwop-conformance harness against openwop-app's tag URL tripped that host's per-IP 429 read budget during its multi-file discovery burst and soft-skipped the gated legs, so the direct seam probe is the steward behavioral artifact, alongside each host's own harness runs.) Per GOVERNANCE.md §"Acceptance evidence tiers" this remains a tier-2 (steward-affiliated sibling) + reference-host graduation — not independent-organization dual-witness.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral both live + non-vacuous (steward-verified) | Discovery: prod app.openwop.dev/api advertises dispatch { supported:true, fanOutSupported:true, fanOutPolicies:["sequential","reject","parallel"], joinModes:["wait-all"], onChildFailureModes:["collect","absorb"], maxFanOut:16 } — steward-curl-verified 2026-06-28 (HTTP 200). Honest narrower advertisement: joinModes is ["wait-all"]-only and fail-fast is omitted from onChildFailureModes because the host cannot cancel in-flight siblings honestly (host/dispatchFanOut.ts, ENG-9). Behavioral: the /v1/host/sample/dispatch/fanout seam stays dark in prod by posture (OPENWOP_TEST_SEAM_ENABLED off, RFC 0117 parity), but the host stood up an auth-exempt seam-enabled tag revision 00355-zag (--no-traffic --tag conf-fanout, same image as prod 00348-mzh, code main@c2abc784 / #997). Steward direct probe 2026-06-28 (wait-all/collect ×3) → { joinOutcome:"satisfied", children:[3×completed], mergeOrder:[3], completedCount:3, failedCount:0, cancelledCount:0 } — real coordinator+fold, non-vacuous (no auth header). The always-on dispatch-fanout-parallel schema legs also pass server-free. |
MyndHyve workflow-runtime | discovery + behavioral both live + non-vacuous (steward-verified) | Tier-2 steward-affiliated sibling. Seam-enabled conformance revision 00513-qib (--no-traffic --tag conf-fanout from main@66fc108e with OPENWOP_CONFORMANCE_FIXTURES=1; prod traffic untouched on 00508-qis). Discovery: GET /.well-known/openwop advertises the full dispatch { fanOutSupported:true, fanOutPolicies:["sequential","reject","parallel"], joinModes:["wait-all","quorum","first","race"], onChildFailureModes:["collect","fail-fast","absorb"], maxFanOut:16 } — steward-curl-verified 2026-06-28 (HTTP 200). Behavioral: steward direct probe 2026-06-28 of the auth-exempt seam (wait-all/collect ×3) → { joinOutcome:"satisfied", children:[3×completed], mergeOrder:[3], completedCount:3, failedCount:0, cancelledCount:0 } — non-vacuous; corroborated by the host's own @openwop/openwop-conformance@1.45.0 … --filter dispatch-fanout → dispatch-fanout-parallel.test.ts 10/10 exit 0 (OPENWOP_REQUIRE_BEHAVIOR=true). |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
The joinModes / onChildFailureModes divergence between the two witnesses (["wait-all"] + ["collect","absorb"] vs the full four-mode + three-mode sets) is the intended, discoverable outcome of the capability gating — a portable workflow pinning joinPolicy.mode:'quorum' or onChildFailure:'fail-fast' registers on MyndHyve and is honestly rejected at registration on openwop-app, and the author can see exactly that from each host's /.well-known/openwop at edit time (the gap RFC 0118's joinModes + openwop#789's onChildFailureModes descriptors close).
Subscription-reuse provider auth mode (RFC 0121 — aiProviders.authModes: "subscription")
The subscription auth mode defined in spec/v1/capabilities.md §aiProviders.authModes (RFC 0121, Active 2026-07-01; conformance 1.47.0). A host advertises subscription when it accepts a credential derived from reusing the caller's personal consumer subscription (Claude Pro/Max, ChatGPT Plus) — the mode is a BYOK path (§B.7, MUST be in byok), its credential MUST bind at host.credentials scope:"user" and MUST reject a tenant/workspace binding with credential_scope_forbidden (§B.8, the protocol-tier subscription-credential-user-scope-only invariant), and it MUST be advertised only when a real acquisition mechanism is configured (§B.9, truthful-advertisement). The always-on aiproviders-subscription-scope.test.ts verifies the enum shape server-free; the §B.7 leg is advertisement-gated; the §B.8 leg is bind-seam-gated (POST /v1/host/sample/credentials/bind, soft-skip on 404) so the user-scope safety rail is witnessable without a live subscription advertisement.
Partial graduation (2026-07-01): scope-safety rail only; 0121 stays Active. UQ1 (does any provider's consumer ToS permit third-party API-shaped reuse?) is UNRESOLVED — no citation exists; the steward issued an at-own-risk waiver (RFC 0121 Status history) of the acquisition-bearing gate. No host advertises subscription on a live discovery doc — the reference host is the scope-safety / reference-impl witness, not a full-advertisement witness. A full Active → Accepted graduation remains open, pending a deploy-model-compatible + UQ1-cleared advertising host (candidate: MyndHyve tier-2, per steward direction).
| Host | aiProviders.authModes: subscription status | Notes |
|---|---|---|
| openwop-app reference | §B.8 request-scope REJECTION rail steward-curl-verified on the wire; storage-resolvability half host-test-covered (openwop-app#1444); advertisement dark by design | Scope of the wire witness (precise): §B.8 has TWO clauses — (a) a subscription credential MUST bind at scope:"user", and (b) it MUST NOT be resolvable at tenant/workspace scope (a STORAGE property, not just the request field). The steward-curl-verified legs prove clause (a)'s request-scope rejection only. The bind seam is served under /api/** (POST /v1/host/openwop-app/credentials/bind, + /v1/host/sample/ alias; assertSubscriptionScopeAllowed in byok/subscriptionCredentialScope.ts, called unconditionally before any consent/acquisition). Steward-curl-verified 2026-07-07 on app.openwop.dev/api (unauthed): {provider,mode:"subscription",scope:"tenant"} → 403 credential_scope_forbidden; scope:"workspace" → 403 same; scope:"user" → 200 {bound:true,scope:"user"}; mode:"api_key" → 400 (seam binds subscription only, so the 403s aren't a blanket tenant block). Clause (b) — storage-resolvability — is black-box-invisible on the wire and was host-buggy until openwop-app#1444: the accepted scope:"user" credential was written at req.tenantId = the active* workspace (may be a shared ws: tenant, ADR 0015), so a user acting inside a shared workspace passed the request-scope rail yet had their personal token stored at a workspace-shared row → resolvable at workspace scope. Fixed in #1444 (store at the caller's own user:-scoped personal tenant personalTenantOf + fail-closed assertSubscriptionStorageTenant; host-test-covered: user:→ok, ws:→403, anon/default/undefined→403). Clause (b) is inherently host-test territory — see docs/KNOWN-LIMITS.md §"Behavior tests too coarse". Host unit tests subscriptionCredentialScope.test.ts (#1439) + the #1444 storage-tenant test + the pinned conformance aiproviders-subscription-scope.test.ts §B.8 request-scope leg. Discovery dark by default (no subscription authMode emitted — §B.9), acquisition mechanism-only (drift-guard test asserts no login code). Evidence tier = steward wire witness of the §B.8 request-scope rejection rail (advert UQ1-gated + dark; storage half host-test-covered). |
MyndHyve workflow-runtime | none | Candidate full-advertisement witness (tier-2) if/when an at-own-risk advertising path is stood up; not yet advertised. |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Anonymous-actor authorization (RFC 0132 — capabilities.anonymousActor)
The anonymous-actor model defined in spec/v1/capabilities.md §anonymousActor + spec/v1/auth.md §"Anonymous actors" (RFC 0132, Active 2026-07-22). A host advertises anonymousActor { supported:true, tiers, writeEgressControls?, failClosed:true } when it honors authorization for a caller on a public agent surface who authenticated no identity: an opaque, origin-bound, ephemeral, non-cross-linkable, non-PII principal (owner.principalKind:"anonymous") whose authority is a default-deny, explicit per-surface tool grant — never a role, never the ADR 0315-style default-on tool baseline. The read tier is tenant-scoped with no egress and no secret/BYOK reach; the bounded-write-egress tier is permitted only behind a mandatory HITL/approval (RFC 0051) or rate-limit + per-session cap, over the RFC 0076/0079 SSRF-guarded, audience-bound egress path. Every anon tool call audits via the existing RFC 0049 authorization.decided event (no new event type). The always-on anonymous-actor-shape.test.ts verifies the advert shape + the §B.2 conditional + owner.principalKind + the audit reuse server-free; the five gated behavioral scenarios (anonymous-actor-default-deny, -no-secret-reach, -egress-guarded, -write-gated, -audit-opaque) drive the POST /v1/host/sample/anon-surface/dispatch + GET /v1/host/sample/anon-surface/tools seam and soft-skip until a host wires a tool-enabled public surface.
Graduated Active → Accepted 2026-07-22 on the openwop-app tier-1 reference witness. The five SECURITY invariants landed at reference-impl tier at Active and GRADUATED to protocol tier at Active → Accepted once openwop-app wired the surface and passed all five behavioral scenarios non-vacuously under OPENWOP_REQUIRE_BEHAVIOR=true (RFC 0079 egress-credential-audience-bound precedent). The host ships the surface gated behind OPENWOP_ANON_ACTOR_ENABLED (default OFF) — honest-off, not advertised on the live production discovery doc until an operator opts in.
| Host | capabilities.anonymousActor status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral non-vacuous (tier-1 reference witness; gated OFF by default) | PR openwop-app#2403 merged, rev 03d06d1f2. host/anonymousActor.ts mints the opaque origin-bound anon principal + owner.principalKind:"anonymous", resolves a default-deny per-surface grant (never the ADR 0315 baseline; the anon run carries actingUserId:undefined so deliverable/secret tools fail closed by construction), gates write/egress via an RFC 0051 HITL interrupt over the RFC 0079 SSRF-guarded egress path, and emits opaque authorization.decided. Steward-verified 2026-07-22: booted the host in-memory with OPENWOP_ANON_ACTOR_ENABLED=true, /.well-known/openwop → anonymousActor {supported:true, tiers:["read","bounded-write-egress"], writeEgressControls:["hitl"], failClosed:true}, the /v1/host/sample/anon-surface/{tools,dispatch} seam served 200, and @openwop/openwop-conformance@1.55.1 anon-actor scenarios passed 10/10 non-vacuously under OPENWOP_REQUIRE_BEHAVIOR=true (default-deny anon-not-granted; planted BYOK canary never surfaced; cross-tenant attempt neutralized to the surface tenant; out-of-audience egress anon-egress-denied + credentialAttached:false; hitl write → approval interrupt before the durable write; uncontrolled surface → anon-write-ungated; opaque anon principal + no PII in the audit record). Host npm run ci green (2099 tests). Discovery dark by default (OPENWOP_ANON_ACTOR_ENABLED unset ⇒ block omitted + seam 404). |
MyndHyve workflow-runtime | none | Candidate tier-2 second witness; not yet advertised (single tier-1 witness sufficed to graduate, per the RFC 0129 precedent). |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Self-hosted runner (RFC 0122 — capabilities.selfHostedRunner)
The runner↔host channel defined in spec/v1/self-hosted-runner.md (RFC 0122, Accepted 2026-07-02; conformance 1.48.0). A host advertises selfHostedRunner { supported:true, dispatchKinds? } when it routes a run's per-step model/tool dispatch to a user-controlled runner that dials OUT (SSE receive + POST result, no inbound exposure) and holds local credentials the host cannot reach. The host stays the sole orchestration/persistence/replay authority; dispatch is per-step ({runId, stepId, seq, kind, provider?/model?/tool?, inputs}), results persist as normal step records (replay never re-dispatches), subject-first match rejects a cross-subject dispatch with a retriable runner_unavailable, and a redelivered {runId, stepId} is dropped at-most-once (deduped:true). The always-on self-hosted-runner.test.ts schema legs verify the frame/registration/capability shape server-free (the closed frames are the runner-credential-non-transit rail); the gated behavioral legs drive the POST /v1/host/sample/runner/{register,dispatch} seam (host-sample-test-seams.md §19) to assert subject-first runner_unavailable+retriable and at-most-once dedup non-vacuously. The runner_unavailable numeric HTTP status is host-chosen (any >= 400) — the witness asserts the envelope { error: { code, retriable:true } }, not a fixed status (mirrors run_forbidden / capability_required; registered in rest-endpoints.md §"Common error codes" per #815).
Graduated on dual-witness evidence vs suite 1.48.0 — per GOVERNANCE.md §"Acceptance evidence tiers" a tier-1 reference (openwop-app) + tier-2 (MyndHyve steward-affiliated sibling) graduation, not independent-organization dual-witness. Both invariants (runner-credential-non-transit, runner-output-untrusted-transport) are protocol-tier.
| Host | selfHostedRunner status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | PR openwop-app#1066 merged; live in prod app.openwop.dev, Cloud Run rev openwop-app-backend-00363-gtg @ 100% — steward-curl-verified 2026-07-02 (/.well-known/openwop → selfHostedRunner {supported:false, dispatchKinds:["model"]} honest-off; POST /v1/host/sample/runner/register → HTTP 400 route-live, not 404). (CI red = GitHub-Actions billing outage, 0-step fails; local npm run ci 3889 green authoritative per CLAUDE.md; admin-override merge.) host/selfHostedRunner.ts per-subject registry + subject-first match (no cross-subject fallback) + at-most-once {runId, stepId} dedup on a real DurableCollection; §19 seam via routes/runnerSeam.ts. Published @openwop/openwop-conformance@1.48.0 self-hosted-runner.test.ts 7/7 under OPENWOP_REQUIRE_BEHAVIOR=true — tier-3 seam RUNS (register → 200, not 404 soft-skip), subject-first runner_unavailable (409 + retriable:true), deduped:true on redelivered {runId, stepId} from persisted result; hard-assertion route test (no soft-skip escape). Both invariants honored (closed frames — token stays on runner; output fenced <UNTRUSTED>). Model-dispatch arm (ADR 0182 Phase 5); SSE outbound-dial deferred; no vendor-CLI spawn in backend/src. |
MyndHyve workflow-runtime | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | Tier-2 steward-affiliated sibling. PR myndhyve#192. Live-deployed witness rev workflow-runtime-00516-yuz (tag rfc0122, 0% traffic — prod serving untouched, RFC 0115 pattern) — steward-curl-verified 2026-07-02 (/.well-known/openwop → selfHostedRunner {supported:false, dispatchKinds:["model","tool"]} honest-off; register → route live, not 404). host/selfHostedRunner.ts SSOT: subject-first match keyed on the RFC 0048 Principal (subject-before-capability, no cross-subject fallback) + at-most-once {runId, stepId} dedup on a real persisted store (run_claims-pattern) + a loopback runner that really answers (non-vacuous dedup). Published @openwop/openwop-conformance@1.48.0 --filter self-hosted-runner 16/0 under OPENWOP_REQUIRE_BEHAVIOR=true (OPENWOP_OPTED_OUT_PROFILES=openwop-self-hosted-runner; tier-3 seam RUNS register → 200). Non-vacuity re-proven live via curl (fresh ids): subject-first → 503 {error:{code:"runner_unavailable",retriable:true}} no cross-subject fallback; deduped:false → deduped:true; result fenced <UNTRUSTED>…</UNTRUSTED> + contentTrust:"untrusted"; closed frames, no credential field. |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Data-parallel dispatch per-item input (RFC 0126 — capabilities.dispatch.perItemInput)
RFC 0126 graduated Active → Accepted on 2026-07-04 on a single-witness bootstrap steward waiver (0120/0121/0125 precedent); it is now dual-witness live (2026-07-05) — openwop-app (tier-1) + MyndHyve workflow-runtime (tier-2 steward-affiliated sibling), both advertising dispatch.perItemInput: true on live-deployed hosts, steward-curl-verified. The nextWorkerInputs[] array on NextWorkerDecision (orchestrator-decision.schema.json) lets a next-worker decision fan ONE childWorkflowId over N runtime items with distinct per-item inputs, projected over the RFC 0022 inputMapping (per-item wins on collision). A host advertises capabilities.dispatch.perItemInput: true (a prose descriptor in capabilities.md §dispatch, alongside the prose-only RFC 0118 dispatch.* family) when it honors per-index projection, the length-equality + fail-closed runtime validation_error gates, and the replay-freeze re-read of the recorded runOrchestrator.decided decision. The always-on dispatch-per-item-input.test.ts schema legs verify the nextWorkerInputs shape + the additionalProperties:false fail-closed rail server-free; the capability-gated behavioral legs (projection, merge-precedence, length-mismatch, replay-freeze, fail-closed) drive the POST /v1/host/sample/dispatch/per-item seam and soft-skip until a host wires it.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | Witness #1, live. PR #1278: subWorkflowDispatcher.perItemInputs projected over the RFC 0022 mapping (per-item override); decision.nextWorkerInputs[idx] projected into each child on both the parallel fan-out and sequential-loop arms; the fail-closed gate (non-advertising host + length-mismatch each ⇒ validation_error, 0 children); replay-safe re-read of the recorded decision (CP-2). Witness dispatch-per-item-input-executor.test.ts 5/5 on a real core.dispatch node + real dispatcher; 64 existing dispatch/scheduler tests still green. PR #1283 flipped dispatch.perItemInput honest-ON + shipped the installable campaign-journeys.segment-winback chain (workflow-chain-segment-winback-execution.test.ts — a live 3-contact segment → 3 children each with its own contactId, ADR 0255). Corroborating consumer witness: #1279 (segment-winback supervisor node → real core.dispatch e2e). Discovery: app.openwop.dev/api/.well-known/openwop → dispatch.perItemInput: true — steward-curl-verified 2026-07-05. |
MyndHyve workflow-runtime | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | RFC 0126 dual-witness #2 — tier-2 steward-affiliated sibling (per the RFC 0122 precedent), a genuinely different code base from openwop-app. PR #194 (789480099) mirrors #1278 in dispatch.node.ts: decision.nextWorkerInputs[idx] projected over inputMapping/perWorkerInputMappings (per-item wins) on both the parallel + sequential arms, threaded on the TRUE dispatch index (duplicate nextWorkerIds safe); fail-closed rail (unadvertised + length-mismatch ⇒ validation_error, 0 children); replay-freeze on the recorded runOrchestrator.decided decision (CP-2, by construction — same anchor as nextWorkerIds); one-source honest-off→on gate (OPENWOP_DISPATCH_PER_ITEM_INPUT). Witness dispatch.node.test.ts 56/56 (the 5 + a parallel-arm duplicate-worker leg); root+engine tsc clean; engine core+protocol 960/960; no engine/event-version bump. Discovery: workflow-runtime-…run.app/.well-known/openwop → dispatch.perItemInput: true — steward-curl-verified 2026-07-05, serving rev workflow-runtime-00294-hcp (deployed under the Firestore deploy-lock + read-before-promote ritual). The published-suite POST /v1/host/sample/dispatch/per-item server-free seam (optional G5) is not wired here, so the published behavioral legs soft-skip against this host — a logged follow-up; the executor witness is the 56/56 unit suite + the live advertisement. |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Portable per-run parameter deferral (RFC 0124 — capabilities.workflowChainPacks.deferredParameters)
RFC 0124 graduated Active → Accepted on 2026-07-04 on a single-witness bootstrap steward waiver (0120/0121/0125/0126 precedent; the dual-witness path is a tracked follow-up per gap G6 — MyndHyve workflow-runtime and the in-memory host both lack a chain-expansion / PromptTemplate-compose path). Deferred mode materializes a workflow-chain pack's parameters into top-level variables[] and rewrites {{params.}} into spec'd runtime bindings (PromptTemplate {{varName}} source:"variable", or a variable-sourced PortValue), keeping parameters overridable per run via configurable while the persisted definition holds ZERO {{params.}} tokens. A host advertises workflowChainPacks.deferredParameters.supported: true when it implements this AND the §Security handling for x-openwop-sensitive params (materialize source:"secret", prompt-body-only, fail-closed sensitive_param_not_deferrable 422 elsewhere, per-run supply = credentialRef not plaintext). The always-on workflow-chain-deferred-parameters.test.ts legs verify deferred expansion + the §Security fail-closed/no-plaintext MUSTs server-free against the reference expandChainDeferred; the capability-gated host legs drive the POST /v1/host/sample/chain/deferred-expand seam (override / :fork replay / untrusted-fence / [REDACTED] compose) and soft-skip until a host wires it.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | RFC 0124 witness #1, live end-to-end. Host stack #1245 (Path A) → #1252/#1262/#1265/#1270 (increments) → #1273 (durability: re-register metadata.mintedPromptTemplates at run-start) → #1281 (source:"secret" §Security) → #1289 (9361e646) advertise + pin @openwop/openwop-conformance@^1.51.0. Discovery: app.openwop.dev/api/.well-known/openwop advertises workflowChainPacks { supported: true, deferredParameters: { supported: true } } — steward-curl-verified 2026-07-05, Cloud Run rev openwop-app-backend-00404-6mw @ 100%. Behavioral: deferred expansion materializes → bare-param configurable override rebinds the value → :fork replays the same value → a x-openwop-sensitive param materializes source:"secret" (BYOK, [REDACTED:<credentialRef>]) with the plaintext appearing nowhere (body, RunSnapshot, at-rest, observability, override request); whole-value / non-prompt / no-secrets positions fail closed sensitive_param_not_deferrable (422); a plaintext sensitive configurable ⇒ validation_error. Green under OPENWOP_REQUIRE_BEHAVIOR=true — the published workflow-chain-* scenarios 56/0 against corpus b6ed2752 (#828); the always-on workflow-chain-deferred-parameters legs (materialization / fail-closed / credentialRef-string) + the host's own gated runpath vitest (workflow-chain-deferred-runpath.test.ts, plaintext-never-anywhere); backend discovery+chain 269/0. In-process harness witnesses (2026-07-05). The host now serves BOTH test-only seams (behind OPENWOP_TEST_SEAM_ENABLED, 404 in prod per the RFC 0117 posture, so prod discovery stays clean): /v1/host/sample/chain/deferred-expand (#1292) drives the workflow-chain-deferred-parameters gated legs non-vacuously (12/0) through the real deferred pipeline (materialize → bare-param override → :fork byte-stable replay → [REDACTED:<credentialRef>]), pinning the contentTrust:"untrusted" fence + plaintext-never-anywhere on the live compose fn; and /v1/host/sample/workflow-chain:expand (#1298) makes RFC 0013 host-expansion 6/6 (see the RFC 0013 host-expansion row). The former hostExpansionSeam opt-out is dropped — the flag is advertised only behind the seam gate. ADR 0250's plaintext-400 concern is now covered by the deferred-expand route test (#1292, chain-deferred-expand-seam.test.ts 3/3). |
MyndHyve workflow-runtime | ruled out (no chain-compose path) | — |
| In-memory | none | — |
| SQLite | none | — |
| Python | none | — |
| Postgres | none | — |
Streaming & CDC trigger sources (RFC 0127 — triggerBridge.sources: "stream" | "change")
RFC 0127 graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver (tier-1 reference host). It additively extends the RFC 0083/0099 trigger source enum with stream (a Kafka/Kinesis/Pub-Sub broker message) and change (a warehouse/DB CDC row; op insert|update|delete REQUIRED in the ChangeEvent sub-object). Both reuse the RFC 0099 TriggerEvent envelope, SSRF posture, SR-1 content-free trigger.* events, and the RFC 0083 ≥24h dedup floor unchanged. A host advertises stream/change in triggerBridge.sources[] + ingestion.externalSources[] only when it operates a real broker/CDC consumer (RFC 0099 honesty rule). The always-on trigger-stream-cdc-sources.test.ts schema legs verify the envelope shape (op-required negative, exactly-one rule, vocabulary pins) server-free; the capability-gated behavioral legs drive the POST /v1/host/sample/trigger-bridge/{ingest,deliver} seams.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | behavioral live + non-vacuous (live-deployed, steward-verified); advert honest-off | Witness #1. PRs #1332 (ingest seam accepts stream/change on both /v1/host/openwop-app/… + /v1/host/sample/… paths; op REQUIRED; before/after CDC row images; dedup (topic,partition,offset)/(table,changelogId); SR-1 body never on the durable event) + a source-gate flag (OPENWOP_TRIGGER_STREAM_CDC_ENABLED). Cloud Run rev openwop-app-backend-00411-77q @ 100%. @openwop/openwop-conformance@1.53.1 trigger-stream-cdc-sources.test.ts non-vacuous for BOTH sources under OPENWOP_REQUIRE_BEHAVIOR=true. Steward-curl-verified 2026-07-06 on the *.run.app backend: stream + change ingest → 200 with schema-valid op/offset-carrying envelopes, body-canary absent from the durable delivery event; stream/change absent from advertised triggerBridge.sources[]/ingestion.externalSources[] (honest-off — no real broker/CDC consumer yet, gap G4).<br>Update 2026-07-06 (rev openwop-app-backend-00413-jcm) — G4 CLOSED, real consumer operating + steward-fired end-to-end. Advert FLIPPED ON: triggerBridge.sources[] + ingestion.externalSources[] now include stream/change (steward-curl-verified on /.well-known/openwop). Steward independently provisioned a real core.openwop.streams connection (conn:d0a76f77-…, source stream, BYOK HMAC) and fired the consumer boundary himself: valid signed push → 202 {accepted:true} → a REAL run (694cf46f-…, workflow openwop-app.agents.lead-routing) via trigger.delivery (ingestExternalEvent, NOT resolveAndResume); bad-signature → 401 no run (real HMAC, not the 404 of an unknown connection); a signature valid-for-a-stale-ts → 401 no run (real ±5min replay window); same-(topic,partition,offset) replay → 202 {deduped:true} no second run (effectively-once); exactly one run created across all legs. This is the "first host operating a real streaming/CDC consumer" — G4's second/real witness. |
MyndHyve workflow-runtime | ruled out (no broker/CDC consumer) — natural G4 second witness when one exists | — |
| In-memory / SQLite / Python / Postgres | none | — |
Purpose-propagation permitted-use labels (RFC 0128 — capabilities.purposePropagation)
RFC 0128 graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver + maintainer call. Gap G4 (a real onward label-carrying egress, steward-witnessed) — CLOSED 2026-07-06: tier-1 openwop-app built the openwop-app.cdp.sync-to-openwop-host reference workflow (prepare-onward node → the sanctioned core.openwop.http.fetch node → a steward capture bin) and fired the four onward legs local-on-origin/main; the steward independently read the bin and verified ⊆received / never-widen (marketing dropped on the real send) / []-drop with an unlabelled positive control. openwop-app is now the first host with a real onward label-carrying OpenWOP-envelope egress. An OPTIONAL permittedPurposes: string[] label (opaque purpose categories; absent = unlabelled, [] = no onward use) rides the A2A metadata.openwop.permittedPurposes extension + the top-level TriggerEvent.permittedPurposes field; a host advertising purposePropagation {supported, propagatesOnward} MUST re-emit the label on onward OpenWOP-envelope hops (MAY narrow, MUST NOT widen), a derived output MUST NOT carry a purpose absent from any contributing labelled input, and []-labelled data MUST NOT be forwarded onward. Non-OpenWOP destinations are a field-mapping SHOULD (untestable); internal use is §4 declared-intent (not gated). The always-on schema legs verify the label + family shape; the seam-gated purpose-propagation.test.ts behavioral legs drive the POST /v1/host/sample/purpose-propagation/forward two-hop seam.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (live-deployed, steward-verified) | Witness #1. PRs #1334 (the purposeLabels algebra + the /v1/host/sample/purpose-propagation/forward hop-B capture seam: forward→re-emit, merge→intersect, []→dropped/contagious, unlabelled→top element) + #1336 (advert behind OPENWOP_CDP_PURPOSE_PROPAGATION_ENABLED). Cloud Run rev openwop-app-backend-00411-77q advertises purposePropagation {supported:true, propagatesOnward:true}. @openwop/openwop-conformance@1.53.1 purpose-propagation.test.ts (seam-gated) — all four §3 legs non-vacuous under OPENWOP_REQUIRE_BEHAVIOR=true. Steward-curl-verified 2026-07-06 on the *.run.app backend: forward label ⊆ input; merge ⊆ intersection (marketing-email dropped when a contributing input lacked it); []-labelled blocked dropped while the unlabelled control twin forwarded (fail-closed positive control). G4 CLOSED 2026-07-06 (real onward egress, steward-witnessed): PR #1391 added the feature.destination-sync.nodes.prepare-onward node + reference workflow openwop-app.cdp.sync-to-openwop-host (prepare-onward → the sanctioned core.openwop.http.fetch node → the steward capture bin webhook.site/4c0267e7; feature never sends, SR-1 clean; ADR 0289), fired local-on-origin/main (run nonce mr9ovt8u). Steward independently read the bin (5 captures, L4-DROP absent): re-emit L1→["billing","support"]==received; narrow L2→["billing"]⊆received; never-widen L3→["billing"] only, marketing dropped on the real send (the falsifiable core); []-drop L4-DROP no egress while unlabelled twin L4-TWIN arrived (fail-closed, not a timeout). First host with a real onward label-carrying OpenWOP-envelope egress. |
MyndHyve workflow-runtime | honest opt-out (tier-2, gap G4) — architect-reviewed 2026-07-06 (repo @ 789480099): no genuine onward OpenWOP-envelope egress for the label (A2A ingress-only, no outbound client / no metadata field on task types; trigger delivery content-free in-run only). Declined to serve a fabricated-carrier seam (vacuous-witness trap). Natural tier-2 witness once it grows a real A2A-forward or connector-destination-sink boundary. | — |
| In-memory / SQLite / Python / Postgres | none | — |
Front-end plugin packs (RFC 0117 + 0119 — capabilities.uiPlugins)
RFC 0117 (+ 0119 isolation mechanism-neutrality) graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver + maintainer autonomy grant. A host advertising uiPlugins {supported:true, isolation} loads SIGNED, SANDBOXED kind:"frontend-plugin" packs in an origin/execution-isolated boundary and talks to them over the closed ui-plugin/1 host-RPC allowlist. Four protocol-tier SECURITY invariants: frontend-plugin-isolation / -egress / -rpc-allowlist / -no-byok. Witness ruling: isolation + egress are serve/apply-control MUSTs — the host MUST apply a sandboxed cross-origin iframe (no allow-same-origin) and serve the plugin under a deny-egress CSP; those controls are falsifiable by the steward on the wire + the reference host's FE unit tests, while the browser's runtime enforcement of correctly-applied controls is a platform guarantee (the §4-parallel unobservable-runtime split). rpc-allowlist + no-byok are wire-observable and steward-curl-verified.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + serve-controls live + non-vacuous (steward-verified) | Witness #1. Host code merged openwop-app #1408 (400ef677, ADR 0300): FE iframe loader (PluginFrame, srcDoc sandbox="allow-scripts" no-same-origin + withPluginCsp deny-egress meta) + signed community.openwop.artifact-viewer kind:"frontend-plugin" pack + backend serve routes. Steward-curl-verified 2026-07-06 on app.openwop.dev/api: (1) /.well-known/openwop advertises uiPlugins {supported:true, isolation:"cross-origin-iframe", hostApi:[artifact.read,write,host.toast,navigate], maxEntryBytes:2097152}; (2) GET /ui-plugin/packs → isolation:"cross-origin-iframe", signed pack served with closed hostApi:["artifact.read"]; (3) the entry endpoint serves the self-witnessing plugin (window.origin==='null' / exfil-fetch→CSP-block / artifact.write→method_not_allowed); (4) POST /ui-plugin/rpc undeclared host.exec → {ok:false, error:{code:"method_not_allowed"}} (frontend-plugin-rpc-allowlist); (5) stale artifact.write → {artifact_conflict, currentVersion:"1"}, envelope carries no secret (frontend-plugin-no-byok). #1408 FE unit tests (green) assert PLUGIN_SANDBOX allow-scripts-without-allow-same-origin (frontend-plugin-isolation) + PLUGIN_CSP deny-egress + withPluginCsp injection (frontend-plugin-egress) + the allowlist bridge. Defense-in-depth: openwop-app's backend deny-egress CSP response header on the entry endpoint — initially a no-op (Firebase Hosting's global CSP overrode it on /api/), resolved 2026-07-06 (openwop-app#1414): a scoped firebase.json header rule now wins on the entry path. Steward-re-curl-verified** — the entry endpoint returns content-security-policy: default-src 'none'; … with NO connect-src, so a direct browser load of a plugin entry is deny-egress too. Real second layer end-to-end (in addition to the load-bearing frontend withPluginCsp srcDoc meta). |
| MyndHyve / In-memory / SQLite / Python / Postgres | none (tier-2 gap) | Tier-2 witness = a second host, or a non-iframe isolation mechanism (wasm/process/…) proving 0119's mechanism-neutrality on the wire. Carried forward as the named gap. |
Portable prompt-prefix cache (RFC 0116 — aiProviders.promptPrefixCache)
RFC 0116 graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver. A supporting host MAY route a stable, tenant-namespaced, secret-free cachePrefixId label to its provider's context cache; the outcome is cost-hint-only + replay-invariant (a hit/miss MUST NOT change the recorded envelope or inputTokens/outputTokens), witnessed by the cost-only provider.usage.cacheReadTokens/cacheWriteTokens. Protocol-tier invariant prompt-prefix-cache-cross-tenant-isolation mandates a (tenant, cachePrefixId) cache key.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (steward-verified) | Witness #1. Advert aiProviders.promptPrefixCache {supported:true, providers:["anthropic"]} live on app.openwop.dev/api. Steward-curl-verified 2026-07-06 via POST /v1/host/openwop-app/aiProviders/prefix-cache-probe (prod OPENWOP_TEST_SEAM_ENABLED): tenant-A prefix probe-prefix-1 → {cacheWriteTokens:1000, cacheHit:false} (write); tenant-A same prefix → {cacheReadTokens:1000, cacheHit:true} (hit); tenant-B same prefix → {cacheReadTokens:0, cacheHit:false} (MISS) = prompt-prefix-cache-cross-tenant-isolation proven ((tenant, cachePrefixId) keying, no cross-tenant leak). Anthropic call mocked → RFC 0108 production-dark tier (key-isolation real, provider routing dark). |
| MyndHyve / In-memory / SQLite / Python / Postgres | none (tier-2 gap) | Second host advertising promptPrefixCache — carried forward. |
A2UI surface deltas (RFC 0114 — a2uiSurface.deltaTransport)
RFC 0114 graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver. A host MAY deliver RFC 6902 (JSON-Patch) delta frames over the run event stream to subscribers that negotiate ?a2uiDelta=1; the RECORDED envelope stays the FULL ui.a2ui-surface (replay-pinned, unchanged) and the consumer re-validates the post-patch surface against the closed A2UI catalog fail-closed.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | discovery + behavioral live + non-vacuous (steward-verified) | Witness #1. Advert a2uiSurface.deltaTransport:true live on app.openwop.dev/api; host code openwop-app#1416 (806fb747, host test a2uiSurfaceDelta.test.ts 5 passed). ① delta delivered + reconstructs: ?a2uiDelta=1 subscriber receives an RFC 6902 frame (op enum add/remove/replace, no test) that applyPatch-round-trips + re-validates (host test). ② recorded stays FULL (replay-pinned core): non-negotiating subscriber → {kind:'full'}, recorded event is the full envelope; steward-curl-verified 2026-07-06 valid emit → 201 {eventId, sequence:1, surfaceRef, catalogVersion:"0.9.1"}. ③ post-patch fail-closed: steward-curl-verified an out-of-catalog iframe → 422 a2ui_surface_invalid (#/anyOf closed catalog). |
| MyndHyve / In-memory / SQLite / Python / Postgres | none (tier-2 gap) | Second host advertising deltaTransport — carried forward. |
Connection-pack provider vendor grouping (RFC 0123 — provider.vendor)
RFC 0123 graduated Active → Accepted on 2026-07-06 on a single-witness bootstrap steward waiver — an OPTIONAL presentational vendor string on the RFC 0095 connection-pack provider object, so a host/registry groups pack-delivered connectors by commercial vendor. It gates no capability and carries no wire behavior, so the observable contract is the schema shape (accept string / accept-absent / reject non-string), witnessed by three conformance legs; the rendering MUSTs (SHOULD-group / MUST-fallback-to-displayName) are the 0128/0129 §4 unobservable-runtime class. Evidence UPGRADE 2026-07-07 (CARRIED-FORWARD → host-served real grouping): the flip was steward-only on the schema-shape witness, but a tier-1 host now serves pack-delivered vendor grouping on the wire — lifting the host row from "schema-shape witnessed" to "host-served real grouping witnessed." Tier-2 (a second host) is carried forward.
| Host | Status | Evidence |
|---|---|---|
| openwop-app reference | host-served real grouping (steward-verified) | Host code openwop-app#1430 (d3b29559, ADR 0303: connectionPackLoader.toProviderManifest reads provider.vendor → groups via the ADR 0185 catalog); deployed rev openwop-app-backend-00428-9st. Steward-authored wire witness 2026-07-07 on app.openwop.dev/api (both seams live under OPENWOP_TEST_SEAM_ENABLED): ① accept+honor — steward's own POST …/connection-packs/install of community.steward-witness.conn with provider.vendor:"Steward-Witness-Co" → {"installed":true}; ② served real grouping — GET …/providers then surfaces the steward's connector stwtns1 with vendor:"Steward-Witness-Co" on the wire (self-authored value, not a pre-seed); ③ fail-closed on type — a valid-named pack with provider.vendor:123 → {"installed":false, errors:[{code:"validation_error", "… /provider/vendor must be string"}]} (rejection only on vendor). |
| MyndHyve / In-memory / SQLite / Python / Postgres | none (tier-2 gap) | Second host serving pack-delivered provider.vendor grouping — carried forward. |
Agent-manifest role + the Skill profile (RFC 0131 — AgentManifest.role)
RFC 0131 graduated Draft → Accepted on 2026-07-07 via the bootstrap single-maintainer comment-window waiver (steward architect-reviewed). It adds an additive OPTIONAL AgentManifest.role ("skill" | "assistant") plus a schema-encoded Skill profile (if role==="skill" then {required:["handoff"], memoryShape.{conversation,longTerm} !== true}). Enforcement is universal JSON-Schema validation at publish/install — it introduces **no capabilities.* advertisement and no host runtime behavior — so, unlike a capability-gated surface, there is no per-host interop variance to track: every conformant validator rejects a stateful/handoff-less skill manifest identically, and an absent role (or role:"assistant") is unconstrained on every host. The witness is therefore the always-on, server-free** agent-manifest-role-profile.test.ts (validate skill/assistant/no-role; reject the stateful skill, the handoff-less skill, and a bad enum value) — no host-witness table applies. SECURITY invariant agent-skill-profile-stateless. Reference host: openwop-app ADR 0312 (Phase-0 marketplace "Skill" label; Phase-2 worker-memory normalization).
Conformance pass rates
Measured against @openwop/openwop-conformance@1.22.0 (the published suite has since advanced to 1.46.0 — 1.23.0 added the +5 RFC 0095 connection-pack scenarios, 1.24.0 the RFC 0096/0097/0098 scenarios, 1.25.0 the RFC 0099/0100 scenarios, 1.26.0 the RFC 0102 A2UI scenarios, 1.27.0 the RFC 0103 localized-content scenario, 1.28.0 the RFC 0104 approver-routing scenario, and 1.29.0–1.46.0 a further sequence of capability-gated scenarios (1.29.0 RFC 0105 speech-synthesis through 1.46.0 RFC 0120 connection-pack apiHosts egress allow-list); all are capability-gated and soft-skip on these reference hosts (which advertise none of those surfaces), so applicable rates are unchanged, and the table below re-measures on the next suite cycle) — all five hosts measured 2026-06-11, then re-measured the same day after the gap-closure fixes landed (openwop-examples#7 + openwop-app#164): the morning run's findings — the RFC 0093 §A3 webhook-tenant-isolation registration-gate gap on SQLite/Postgres/Python, the Python RFC 0058 runTimeoutMs gap, and the workflow-engine's 12 long-carried pre-existing failures — were all root-cause fixed and verified. Current posture: zero deterministic failures on the workflow-engine, Postgres, SQLite, and Python hosts; the in-memory host's 45 failures remain its documented honest-non-claim set (advertised-fixture surfaces the minimal host doesn't implement). Modes: in-memory/python/postgres default (Postgres via pglite), SQLite strict with honest profile/fixture opt-outs, workflow-engine in-process serial. Suite total 1963. Measurement basis: full 82-fixture catalog (fixture resolution now env-overridable + sibling-probing and loud on fallback — the silent degraded loading of pre-1.22.0 readings is fixed). Pass rate is passed/total.
Workflow-engine row re-measured 2026-06-21 at suite 1.29.0 (in-process, serial via --no-file-parallelism, full repo corpus via OPENWOP_CONFORMANCE_ROOT, OPENWOP_TEST_SEAM_ENABLED=true, memory://): 2059 / 0 / 89 / 2148, zero deterministic failures. The total rises 1963 → 2148 because the 1.23.0–1.29.0 scenarios now register (and the repo corpus carries the spec-corpus-validity prose/link/index cases the published package omits by design — so the repo-corpus total is the apples-to-apples basis the other reference rows are also measured on). The 89 skips are honest-non-claims: capability-gated families this host advertises none of (RFC 0104 approver-routing, RFC 0105 speech-synthesis, the unadvertised-profile families) soft-skip in default mode. The other four reference rows remain at the 1.22.0 basis pending their next re-measure cycle.
| Host | Passed | Failed | Skipped | Todo | Total | Pass rate (default) |
|---|---|---|---|---|---|---|
| Workflow-engine reference (in-process, 1.29.0) | 2059 | 0 | 89 | 0 | 2148 | 95.9% |
| Postgres reference | 1848 | 0 | 115 | 0 | 1963 | 94.1% |
| SQLite reference (strict) | 1826 | 0 | 137 | 0 | 1963 | 93.0% |
| In-memory reference | 1793 | 45 | 125 | 0 | 1963 | 91.3% |
| Python reference | 1786 | 0 | 177 | 0 | 1963 | 91.0% |
Composition partners — interop evidence
The conformance suite's MCP and A2A probes run against live reference implementations of the adjacent protocols. See A2A vs MCP vs OpenWOP for how the three layers compose.
| Partner | Reference impl | Sync round-trip | Async / durable (RFC 0100) |
|---|---|---|---|
| MCP | @modelcontextprotocol/sdk@1.29.0 (all three transports) | ✅ pass | — |
| A2A | @a2a-js/sdk@0.3.13 reference peer (echo skill, JSON-RPC) | ✅ 1/1 pass (a2a-task-roundtrip.test.ts) | ⏳ corpus landed (capabilities.a2a + A2ATaskState + durable-tasks/get/resubscribe/push subtests); reference-host durable-Task evidence at Active → Accepted |
Reading Rows
- Compatibility profile claim is derived from
/.well-known/openwopaccording tospec/v1/profiles.md. - Scale claim follows
spec/v1/scale-profiles.md. - Production profile claim follows
spec/v1/production-profile.mdand is recorded separately because durability, retention, backpressure, and observability are operational evidence, not discovery-payload predicates. - Conformance evidence should name the suite version, command used, target URL class, and pass/fail/skip counts. Do not include private deployment identifiers, secrets, or internal result paths.
Add A Host
1. Implement the openwop v1 wire contract. 2. Run @openwop/openwop-conformance against the host. 3. Publish a result file or Markdown summary in a public repository. 4. Add a row above with compatibility, scale, production-profile, and evidence claims.
See Also
conformance/README.md— how to run the suite.spec/v1/profiles.md— compatibility profile predicates.spec/v1/scale-profiles.md— scale tier definitions.spec/v1/production-profile.md— public-release operational profile.