@openwop/openwop-conformance 2.45.22 → 2.45.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +2 -2
  3. package/dist/spec-artifacts.lock.json +2 -2
  4. package/fixtures/conformance-multi-party-council-oversize.json +244 -0
  5. package/fixtures/conformance-multi-party-council.json +61 -0
  6. package/fixtures/conformance-nondeterminism.json +23 -0
  7. package/fixtures/conformance-wasm-pack-memory-cap-breach.json +23 -5
  8. package/fixtures/frontend-plugin-packs/ui/narrow.html +4 -0
  9. package/fixtures/frontend-plugin-packs/ui-plugin-pack-narrow.json +16 -0
  10. package/fixtures/wasm-packs/build.mjs +43 -0
  11. package/fixtures/wasm-packs/misbehaving-abi/module.wasm +0 -0
  12. package/fixtures/wasm-packs/misbehaving-abi/module.wat +24 -0
  13. package/fixtures/wasm-packs/misbehaving-abi/pack.json +27 -0
  14. package/fixtures/wasm-packs/misbehaving-memory/module.wasm +0 -0
  15. package/fixtures/wasm-packs/misbehaving-memory/module.wat +30 -0
  16. package/fixtures/wasm-packs/misbehaving-memory/pack.json +27 -0
  17. package/fixtures.md +32 -0
  18. package/package.json +2 -2
  19. package/requirements.json +251 -7
  20. package/scenario-majors.json +17 -2
  21. package/schemas/CORPUS-STAMP.json +29 -27
  22. package/src/lib/council-roster-witness.ts +144 -0
  23. package/src/lib/ui-plugin-boundary-witness.ts +180 -0
  24. package/src/lib/wasm-memory-cap-witness.ts +46 -0
  25. package/src/scenarios/v2-bound-id-path-projection.test.ts +20 -0
  26. package/src/scenarios/v2-envelope-contracts-advertisement.test.ts +8 -0
  27. package/src/scenarios/v2-multi-party-council.test.ts +56 -0
  28. package/src/scenarios/v2-nondeterminism-policy-advertisement.test.ts +11 -1
  29. package/src/scenarios/v2-nondeterminism-sources.test.ts +83 -0
  30. package/src/scenarios/v2-purpose-propagation-advertisement.test.ts +1 -1
  31. package/src/scenarios/v2-purpose-propagation-onward.test.ts +119 -0
  32. package/src/scenarios/v2-ui-plugin-boundary.test.ts +68 -0
  33. package/src/scenarios/v2-wasm-memory-cap.test.ts +34 -0
package/fixtures.md CHANGED
@@ -43,6 +43,7 @@ All fixtures MUST advertise:
43
43
  | Fixture | `workflowId` | Purpose | Terminal status | Bounded duration |
44
44
  | ----------------------------------------- | ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------- |
45
45
  | Noop | `conformance-noop` | Cheapest possible run-lifecycle test | `completed` | ≤ 5s |
46
+ | Nondeterminism Sources | `conformance-nondeterminism` | RFC 0237 §D — one `core.conformance.nondeterminism` node draws one value per source the host lists in `nondeterminismPolicy.sources` into the run outputs; a `replay` fork from `fromSeq: 0` MUST reproduce each | `completed`; replay outputs byte-equal per listed source | ≤ 10s |
46
47
  | Identity | `conformance-identity` | Verifies input/output passthrough | `completed` | ≤ 5s |
47
48
  | Delay | `conformance-delay` | Verifies poll/SSE behavior over time | `completed` | ≤ 30s (input-controlled) |
48
49
  | Failure | `conformance-failure` | Verifies error-event surface | `failed` | ≤ 5s |
@@ -108,6 +109,8 @@ All fixtures MUST advertise:
108
109
  | Context-Budget Multi-Turn | `conformance-context-budget-multiturn` | RFC 0111 — **superseded as the witness gate in suite 2.41.0.** Drives the supervisor through `mockDecisions`, i.e. a mock supervisor — exactly what RFC 0111 §Scope forbids from advertising `contextBudget`, so no honest host can witness against it. Kept (v1 compatibility: hosts may still list it); both RFC 0111 scenarios now gate on `conformance-context-budget-live` | `completed` | ≤ 60s |
109
110
  | Context-Budget Live Orchestrator | `conformance-context-budget-live` | RFC 0111 witness (suite 2.41.0) — `core.orchestrator.supervisor` driven by the host's LIVE model (no mock keys; `config.instructions` is the objective), dispatching `conformance-noop` until it terminates, bounded by `settings.maxLoopbackIterations: 8`. The host reports each iteration's fed transcript through `GET /v1/host/sample/agent/transcript-window` including `entries[] { eventId, rendered }`; `context-budget-transcript-bound` recounts `chars`, checks real events + the recent tail + budget PRESSURE (no pressure ⇒ `partial-witness`); `context-summarization-replay` replays and compares the fed summary text byte for byte. A host whose supervisor has no live model MUST NOT advertise this fixture | `completed` | ≤ 300s |
110
111
  | Conversation Lifecycle | `conformance-conversation-lifecycle` | Phase 4 — open → exchange → close event ordering | `completed` | ≤ 20s |
112
+ | Multi-Party Council | `conformance-multi-party-council` | RFC 0239 §E.1 — a `core.conversationGate` with a three-member `participants` roster and `mockAutoResume: false`. `conversation.opened` carries the roster; a resumed turn from a non-member is refused `422 conversation_speaker_not_participant` and left unconsumed, then a member's turn resolves it. A host advertises it in `fixtures` when it can run it (RFC 0003) | `completed` | ≤ 20s |
113
+ | Multi-Party Council (oversize) | `conformance-multi-party-council-oversize` | RFC 0239 §E.2 — the same gate with a 64-member roster. A host advertising `multiPartyConversation.maxParticipants` below 64 refuses run creation `422 conversation_roster_exceeded` and opens no conversation | refused at creation | — |
111
114
  | Conversation vs Clarification | `conformance-conversation-vs-clarification` | Phase 4 — conversation suspend emits `conversation.*`, NOT `clarification.*` | `completed` | ≤ 15s |
112
115
  | Conversation Replay | `conformance-conversation-replay` | Phase 4 — `:fork` preserves conversation channel projection | `completed` | ≤ 30s |
113
116
  | Conversation Capability Negotiation | `conformance-conversation-capability-negotiation` | Phase 4 — INVERTED gate: hosts without `conversationPrimitive: true` MUST refuse | `failed` / refusal | ≤ 5s |
@@ -148,6 +151,14 @@ The `messages`-mode stream fixture (AI token streaming) is covered by the determ
148
151
 
149
152
  ## Per-fixture contracts
150
153
 
154
+ ### `conformance-nondeterminism`
155
+
156
+ - **Purpose**: verify RFC 0237 §B — a value drawn from a source the host lists in `nondeterminismPolicy.sources` is recorded where it is read, and a `replay` fork reproduces it.
157
+ - **Shape**: one node, `draw` (`core.conformance.nondeterminism`).
158
+ - **`core.conformance.nondeterminism` is a conformance-RESERVED typeId** (same pattern as `core.conformance.side-effect`): a host listing `sources` maps it to a node that, for each listed source, draws one value and writes it to the run's outputs under the source's name: `clock` an RFC 3339 time, `random` and `id` the drawn value as a string, `env` a configuration value of the host's choosing, an `x-*` source a string.
159
+ - **Expected behavior**: the run reaches `completed`, and `run.completed.outputs` carries one string per listed source. A `replay` fork with `fromSeq: 0` reaches `completed` with byte-equal outputs for every listed source.
160
+ - **Advertise only if** the host lists `nondeterminismPolicy.sources` and records the drawn values. Consumed by `v2-nondeterminism-sources`.
161
+
151
162
  ### `conformance-noop`
152
163
 
153
164
  - **Purpose**: cheapest run-lifecycle test. Used by the conformance suite's `runs.test.ts` to verify create/read/terminal-event/cleanup work end-to-end.
@@ -815,6 +826,27 @@ Pack-manifest fixtures are exercised by the server-free `fixtures-valid.test.ts`
815
826
 
816
827
  ---
817
828
 
829
+ ## Front-end plugin pack fixtures
830
+
831
+ The `fixtures/frontend-plugin-packs/` sub-directory holds front-end plugin packs (RFC 0117, `kind: "frontend-plugin"`) that an operator installs to make the plugin boundary observable (RFC 0238 §D). Their shape is checked server-free by `src/coherence/ui-plugin-fixtures.test.ts`.
832
+
833
+ | Fixture | Plugin | Purpose |
834
+ | --- | --- | --- |
835
+ | `ui-plugin-pack-narrow` | `narrow` | RFC 0238 §D: one plugin declaring only `artifact.read` and no `connectSrc` (entry `ui/narrow.html`). The operator installs it under a key trusted for this pack only, never by default, and creates `ui-plugin-narrow-artifact`, a record whose content references the BYOK canary `openwop-conformance-canary-secret` without resolving it. Drives `v2-ui-plugin-boundary`: the frame's isolation and egress policy, `method_not_allowed` for undeclared methods, and no canary material in any dispatch response. Not advertised in discovery `fixtures`. |
836
+
837
+ ---
838
+
839
+ ## WASM fixture packs
840
+
841
+ The `fixtures/wasm-packs/` sub-directory holds two node packs (`language: "wasm"`) an operator installs to make `node-pack-runtimes.md` §WASM observable. Each is a hand-written WebAssembly text module (`module.wat`) with its built `module.wasm` (`build.mjs`, using `wabt`; no Rust toolchain), exporting the RFC 0008 §B functions. Their shape is checked server-free by `src/coherence/wasm-fixture-packs.test.ts`.
842
+
843
+ | Pack | Node | Purpose |
844
+ | --- | --- | --- |
845
+ | `misbehaving-memory` (`vendor.openwop.misbehaving`) | `vendor.openwop.misbehaving.memory-bomb` | Grows linear memory 64 MiB at a time until the host refuses, then traps. A host advertising `nodePackRuntimes.wasm.maxMemoryBytes` MUST emit `cap.breached` `kind: "wasm-memory"`. Drives `conformance-wasm-pack-memory-cap-breach` and `v2-wasm-memory-cap`. |
846
+ | `misbehaving-abi` (`vendor.openwop.misbehaving-abi`) | `vendor.openwop.misbehaving.abi-bomb` | Reports `openwop_abi_version` 999, which no host lists, so a conforming host refuses it at load. Rejection at load is not yet observable over the protocol (TODO §8), so no v2 leg reads it. |
847
+
848
+ ---
849
+
818
850
  ## Connection pack fixtures
819
851
 
820
852
  The `fixtures/connection-packs/` sub-directory holds canonical connection-pack manifests (RFC 0095, `kind: "connection"`) used as schema-level proof points (validated server-free against `../schemas/connection-pack-manifest.schema.json`) AND as the install payloads the capability-gated behavioral scenarios POST to the `POST /v1/host/sample/connection-packs/install` seam. They are NOT seeded into a server.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "2.45.22",
3
+ "version": "2.45.23",
4
4
  "description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -56,6 +56,6 @@
56
56
  "@openwop/spec-artifacts": "file:../spec-artifacts"
57
57
  },
58
58
  "peerDependencies": {
59
- "@openwop/spec-artifacts": "2.45.22"
59
+ "@openwop/spec-artifacts": "2.45.23"
60
60
  }
61
61
  }
package/requirements.json CHANGED
@@ -2,11 +2,11 @@
2
2
  "$comment": "GENERATED by conformance/scripts/generate-requirement-registry.mjs — do not edit. One record per it()/test() in src/scenarios. Ids: openwop.it.<file-stem>.<title-slug>[~n] (src/lib/requirement-ids.ts). A record with id null has an interpolated title; its run-time row is keyed by the rendered title and maps here by file+line only. Renamed ids need a row in requirement-aliases.json.",
3
3
  "generatedFrom": "src/scenarios/*.test.ts",
4
4
  "counts": {
5
- "files": 728,
6
- "tests": 2763,
7
- "withStableId": 2763,
5
+ "files": 735,
6
+ "tests": 2780,
7
+ "withStableId": 2780,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2626
9
+ "explicitIds": 2643
10
10
  },
11
11
  "records": [
12
12
  {
@@ -28969,7 +28969,7 @@
28969
28969
  {
28970
28970
  "id": "openwop.it.v2-bound-id-path-projection.a-tenant-bound-id-is-readable-at-its-escaped-path-segment-links-carry-that-form",
28971
28971
  "file": "v2-bound-id-path-projection.test.ts",
28972
- "line": 69,
28972
+ "line": 74,
28973
28973
  "title": "a tenant-bound id is readable at its ~-escaped path segment, links carry that form, and a malformed escape is refused",
28974
28974
  "explicitId": "openwop.requirement.0184.bound-id-path-projection",
28975
28975
  "citations": [
@@ -29016,10 +29016,15 @@
29016
29016
  {
29017
29017
  "id": "openwop.it.v2-bound-id-path-projection.a-tenant-bound-id-the-host-mints-for-this-run-contains-no-bites-only-when-the-cr",
29018
29018
  "file": "v2-bound-id-path-projection.test.ts",
29019
- "line": 154,
29019
+ "line": 159,
29020
29020
  "title": "a tenant-bound id the host mints for this run contains no ~ (bites only when the credential tenant is not grammar-clean)",
29021
29021
  "explicitId": "openwop.requirement.0184.mint-no-tilde",
29022
29022
  "citations": [
29023
+ {
29024
+ "section": "spec/v2/core/identity.md §5",
29025
+ "requirement": null,
29026
+ "interpolated": true
29027
+ },
29023
29028
  {
29024
29029
  "section": "spec/v2/core/identity.md §5",
29025
29030
  "requirement": null,
@@ -30714,6 +30719,19 @@
30714
30719
  }
30715
30720
  ]
30716
30721
  },
30722
+ {
30723
+ "id": "openwop.it.v2-envelope-contracts-advertisement.envelopecontracts-advertised-is-not-false-a-host-that-does-not-offer-the-family",
30724
+ "file": "v2-envelope-contracts-advertisement.test.ts",
30725
+ "line": 41,
30726
+ "title": "envelopeContracts.advertised is not false: a host that does not offer the family omits it",
30727
+ "explicitId": "openwop.requirement.0237.no-false-advertisement",
30728
+ "citations": [
30729
+ {
30730
+ "section": "RFC 0237 §C; capabilities.md §2",
30731
+ "requirement": "envelopeContracts.advertised: false is not a v2 state; a host that does not offer the family MUST omit it"
30732
+ }
30733
+ ]
30734
+ },
30717
30735
  {
30718
30736
  "id": "openwop.requirement.envelopes.reasoning-declared-optional-string",
30719
30737
  "file": "v2-envelope-reasoning-shape.test.ts",
@@ -33669,6 +33687,45 @@
33669
33687
  }
33670
33688
  ]
33671
33689
  },
33690
+ {
33691
+ "id": "openwop.it.v2-multi-party-council.the-configured-roster-is-carried-on-conversation-opened",
33692
+ "file": "v2-multi-party-council.test.ts",
33693
+ "line": 39,
33694
+ "title": "the configured roster is carried on conversation.opened",
33695
+ "explicitId": "openwop.requirement.0239.council.roster-carried",
33696
+ "citations": [
33697
+ {
33698
+ "section": "spec/v2/core/conversation.md §multiPartyConversation",
33699
+ "requirement": "a host MUST accept participants in core.conversationGate config and carry them on conversation.opened"
33700
+ }
33701
+ ]
33702
+ },
33703
+ {
33704
+ "id": "openwop.it.v2-multi-party-council.a-turn-from-outside-the-roster-is-refused-and-left-unconsumed",
33705
+ "file": "v2-multi-party-council.test.ts",
33706
+ "line": 45,
33707
+ "title": "a turn from outside the roster is refused and left unconsumed",
33708
+ "explicitId": "openwop.requirement.0239.council.speaker-refused",
33709
+ "citations": [
33710
+ {
33711
+ "section": "spec/v2/core/conversation.md §multiPartyConversation",
33712
+ "requirement": "a host MUST refuse a resumed turn whose speakerId is off the roster with conversation_speaker_not_participant, leaving the interrupt open"
33713
+ }
33714
+ ]
33715
+ },
33716
+ {
33717
+ "id": "openwop.it.v2-multi-party-council.an-oversized-roster-is-refused-at-run-creation",
33718
+ "file": "v2-multi-party-council.test.ts",
33719
+ "line": 51,
33720
+ "title": "an oversized roster is refused at run creation",
33721
+ "explicitId": "openwop.requirement.0239.council.roster-exceeded",
33722
+ "citations": [
33723
+ {
33724
+ "section": "spec/v2/core/conversation.md §multiPartyConversation",
33725
+ "requirement": "a host MUST refuse at run creation, never truncate, a roster over maxParticipants, with conversation_roster_exceeded"
33726
+ }
33727
+ ]
33728
+ },
33672
33729
  {
33673
33730
  "id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-a2a-exchange-cannot-lower-the-version-below-preferredversion",
33674
33731
  "file": "v2-negotiation-authenticated.test.ts",
@@ -33759,7 +33816,7 @@
33759
33816
  {
33760
33817
  "id": "openwop.it.v2-nondeterminism-policy-advertisement.the-nondeterminismpolicy-record-validates-against-its-capabilities-schema-seat",
33761
33818
  "file": "v2-nondeterminism-policy-advertisement.test.ts",
33762
- "line": 33,
33819
+ "line": 35,
33763
33820
  "title": "the nondeterminismPolicy record validates against its capabilities-schema seat",
33764
33821
  "explicitId": "openwop.requirement.nondeterminism-policy.advert-record-schema",
33765
33822
  "citations": [
@@ -33770,6 +33827,43 @@
33770
33827
  }
33771
33828
  ]
33772
33829
  },
33830
+ {
33831
+ "id": "openwop.it.v2-nondeterminism-policy-advertisement.nondeterminismpolicy-declared-is-not-false-a-host-that-does-not-offer-the-family",
33832
+ "file": "v2-nondeterminism-policy-advertisement.test.ts",
33833
+ "line": 44,
33834
+ "title": "nondeterminismPolicy.declared is not false: a host that does not offer the family omits it",
33835
+ "explicitId": "openwop.requirement.0237.no-false-advertisement",
33836
+ "citations": [
33837
+ {
33838
+ "section": "RFC 0237 §C; capabilities.md §2",
33839
+ "requirement": "nondeterminismPolicy.declared: false is not a v2 state; a host that does not offer the family MUST omit it"
33840
+ }
33841
+ ]
33842
+ },
33843
+ {
33844
+ "id": "openwop.it.v2-nondeterminism-sources.a-replay-fork-reproduces-every-value-drawn-from-a-listed-source",
33845
+ "file": "v2-nondeterminism-sources.test.ts",
33846
+ "line": 52,
33847
+ "title": "a replay fork reproduces every value drawn from a listed source",
33848
+ "explicitId": "openwop.requirement.0237.declared-source-replays",
33849
+ "citations": [
33850
+ {
33851
+ "section": "spec/v2/core/replay.md §Declared nondeterminism",
33852
+ "requirement": null,
33853
+ "interpolated": true
33854
+ },
33855
+ {
33856
+ "section": "spec/v2/core/replay.md §Declared nondeterminism",
33857
+ "requirement": null,
33858
+ "interpolated": true
33859
+ },
33860
+ {
33861
+ "section": "spec/v2/core/replay.md §Declared nondeterminism",
33862
+ "requirement": null,
33863
+ "interpolated": true
33864
+ }
33865
+ ]
33866
+ },
33773
33867
  {
33774
33868
  "id": "openwop.it.v2-oauth-client-pkce-state-iss.sends-pkce-s256-and-the-verifier-at-the-token-endpoint-hashes-to-the-challenge",
33775
33869
  "file": "v2-oauth-client-pkce-state-iss.test.ts",
@@ -35506,6 +35600,39 @@
35506
35600
  }
35507
35601
  ]
35508
35602
  },
35603
+ {
35604
+ "id": "openwop.it.v2-purpose-propagation-onward.a-received-label-is-re-emitted-on-the-onward-message-never-widened",
35605
+ "file": "v2-purpose-propagation-onward.test.ts",
35606
+ "line": 83,
35607
+ "title": "a received label is re-emitted on the onward message, never widened",
35608
+ "explicitId": "openwop.requirement.purpose-propagation.onward-reemit-no-widen",
35609
+ "citations": [
35610
+ {
35611
+ "section": "spec/v2/core/security-defaults.md §Onward hops",
35612
+ "requirement": null,
35613
+ "interpolated": true
35614
+ },
35615
+ {
35616
+ "section": "spec/v2/core/security-defaults.md §Onward hops",
35617
+ "requirement": null,
35618
+ "interpolated": true
35619
+ }
35620
+ ]
35621
+ },
35622
+ {
35623
+ "id": "openwop.it.v2-purpose-propagation-onward.an-empty-label-means-no-onward-call-while-an-unlabelled-control-call-goes-throug",
35624
+ "file": "v2-purpose-propagation-onward.test.ts",
35625
+ "line": 102,
35626
+ "title": "an empty label means no onward call, while an unlabelled control call goes through",
35627
+ "explicitId": "openwop.requirement.purpose-propagation.empty-no-onward",
35628
+ "citations": [
35629
+ {
35630
+ "section": "spec/v2/core/security-defaults.md §Onward hops",
35631
+ "requirement": null,
35632
+ "interpolated": true
35633
+ }
35634
+ ]
35635
+ },
35509
35636
  {
35510
35637
  "id": "openwop.it.v2-queue-cross-tenant-isolation.a-message-tenant-a-publishes-on-topic-t-is-never-consumed-by-tenant-b-on-t-and-a",
35511
35638
  "file": "v2-queue-cross-tenant-isolation.test.ts",
@@ -37631,6 +37758,58 @@
37631
37758
  }
37632
37759
  ]
37633
37760
  },
37761
+ {
37762
+ "id": "openwop.it.v2-ui-plugin-boundary.the-frame-is-sandboxed-without-same-origin",
37763
+ "file": "v2-ui-plugin-boundary.test.ts",
37764
+ "line": 45,
37765
+ "title": "the frame is sandboxed without same-origin",
37766
+ "explicitId": "openwop.requirement.0238.ui-plugin.frame-isolated",
37767
+ "citations": [
37768
+ {
37769
+ "section": "spec/v2/core/packs.md §Front-end plugin packs",
37770
+ "requirement": "a cross-origin-iframe plugin frame MUST carry a sandbox directive admitting allow-scripts and never allow-same-origin"
37771
+ }
37772
+ ]
37773
+ },
37774
+ {
37775
+ "id": "openwop.it.v2-ui-plugin-boundary.the-frame-denies-egress",
37776
+ "file": "v2-ui-plugin-boundary.test.ts",
37777
+ "line": 51,
37778
+ "title": "the frame denies egress",
37779
+ "explicitId": "openwop.requirement.0238.ui-plugin.frame-deny-egress",
37780
+ "citations": [
37781
+ {
37782
+ "section": "spec/v2/core/packs.md §Front-end plugin packs",
37783
+ "requirement": "the frame MUST set default-src 'none' and admit no connect-src source the plugin did not declare"
37784
+ }
37785
+ ]
37786
+ },
37787
+ {
37788
+ "id": "openwop.it.v2-ui-plugin-boundary.the-dispatch-refuses-methods-outside-the-allowlists-and-runs-the-declared-one",
37789
+ "file": "v2-ui-plugin-boundary.test.ts",
37790
+ "line": 57,
37791
+ "title": "the dispatch refuses methods outside the allowlists and runs the declared one",
37792
+ "explicitId": "openwop.requirement.0238.ui-plugin.rpc-allowlist",
37793
+ "citations": [
37794
+ {
37795
+ "section": "spec/v2/core/packs.md §Front-end plugin packs",
37796
+ "requirement": "a method outside the plugin's declared hostApi or the advertised uiPlugins.hostApi MUST return method_not_allowed and MUST NOT execute"
37797
+ }
37798
+ ]
37799
+ },
37800
+ {
37801
+ "id": "openwop.it.v2-ui-plugin-boundary.no-dispatch-response-carries-credential-material",
37802
+ "file": "v2-ui-plugin-boundary.test.ts",
37803
+ "line": 63,
37804
+ "title": "no dispatch response carries credential material",
37805
+ "explicitId": "openwop.requirement.0238.ui-plugin.no-byok",
37806
+ "citations": [
37807
+ {
37808
+ "section": "spec/v2/core/packs.md §Front-end plugin packs",
37809
+ "requirement": "a ui-plugin/1 response MUST NOT carry credential material across the boundary"
37810
+ }
37811
+ ]
37812
+ },
37634
37813
  {
37635
37814
  "id": "openwop.it.v2-ui-plugins-advertisement.the-uiplugins-record-validates-against-its-capabilities-schema-seat",
37636
37815
  "file": "v2-ui-plugins-advertisement.test.ts",
@@ -37922,6 +38101,19 @@
37922
38101
  }
37923
38102
  ]
37924
38103
  },
38104
+ {
38105
+ "id": "openwop.it.v2-wasm-memory-cap.a-module-exceeding-maxmemorybytes-produces-cap-breached-wasm-memory-and-fails-th",
38106
+ "file": "v2-wasm-memory-cap.test.ts",
38107
+ "line": 29,
38108
+ "title": "a module exceeding maxMemoryBytes produces cap.breached wasm-memory and fails the run",
38109
+ "explicitId": "openwop.requirement.node-pack-runtimes.wasm-memory-cap",
38110
+ "citations": [
38111
+ {
38112
+ "section": "spec/v2/core/node-pack-runtimes.md §WASM",
38113
+ "requirement": "a host advertising maxMemoryBytes MUST enforce it and emit cap.breached with kind wasm-memory on a breach"
38114
+ }
38115
+ ]
38116
+ },
37925
38117
  {
37926
38118
  "id": "openwop.requirement.0215.no-head-of-line",
37927
38119
  "file": "v2-webhook-delivery-isolation.test.ts",
@@ -45792,6 +45984,32 @@
45792
45984
  }
45793
45985
  ]
45794
45986
  },
45987
+ {
45988
+ "id": "openwop.it.ui-plugin-fixtures.ui-plugin-pack-narrow-validates-against-the-v2-frontend-plugin-manifest-schema",
45989
+ "file": "ui-plugin-fixtures.test.ts",
45990
+ "line": 29,
45991
+ "title": "ui-plugin-pack-narrow validates against the v2 frontend-plugin manifest schema",
45992
+ "explicitId": "openwop.it.ui-plugin-fixtures.ui-plugin-pack-narrow-validates-against-the-v2-frontend-plugin-manifest-s",
45993
+ "citations": [
45994
+ {
45995
+ "section": "RFCS/0238-ui-plugin-observation-path.md §D",
45996
+ "requirement": "the fixture pack is a valid v2 frontend-plugin manifest"
45997
+ }
45998
+ ]
45999
+ },
46000
+ {
46001
+ "id": "openwop.it.ui-plugin-fixtures.declares-one-plugin-narrow-with-only-artifact-read-and-no-connectsrc-and-ships-i",
46002
+ "file": "ui-plugin-fixtures.test.ts",
46003
+ "line": 36,
46004
+ "title": "declares one plugin, narrow, with only artifact.read and no connectSrc, and ships its entry",
46005
+ "explicitId": "openwop.it.ui-plugin-fixtures.declares-one-plugin-narrow-with-only-artifact-read-and-no-connectsrc-and-ships-its",
46006
+ "citations": [
46007
+ {
46008
+ "section": "RFCS/0238-ui-plugin-observation-path.md §D",
46009
+ "requirement": "the legs depend on exactly this shape"
46010
+ }
46011
+ ]
46012
+ },
45795
46013
  {
45796
46014
  "id": "openwop.it.v1-webhook-rotation-contract.the-v1-rotation-route-the-prose-mandates-is-an-api-openapi-yaml-operation-with-t",
45797
46015
  "file": "v1-webhook-rotation-contract.test.ts",
@@ -48423,6 +48641,32 @@
48423
48641
  }
48424
48642
  ]
48425
48643
  },
48644
+ {
48645
+ "id": "openwop.it.wasm-fixture-packs.misbehaving-memory-is-the-memory-bomb-pack-its-manifest-describes-at-abi-version",
48646
+ "file": "wasm-fixture-packs.test.ts",
48647
+ "line": 70,
48648
+ "title": "misbehaving-memory is the memory-bomb pack its manifest describes, at ABI version 1",
48649
+ "explicitId": "openwop.it.wasm-fixture-packs.misbehaving-memory-is-the-memory-bomb-pack-its-manifest-describes-at-abi-version-1",
48650
+ "citations": [
48651
+ {
48652
+ "section": "spec/v2/core/node-pack-runtimes.md §WASM",
48653
+ "requirement": "the fixture module is the pack its manifest describes"
48654
+ }
48655
+ ]
48656
+ },
48657
+ {
48658
+ "id": "openwop.it.wasm-fixture-packs.misbehaving-abi-is-the-abi-bomb-pack-its-manifest-describes-at-the-unlisted-abi",
48659
+ "file": "wasm-fixture-packs.test.ts",
48660
+ "line": 76,
48661
+ "title": "misbehaving-abi is the abi-bomb pack its manifest describes, at the unlisted ABI version 999",
48662
+ "explicitId": "openwop.it.wasm-fixture-packs.misbehaving-abi-is-the-abi-bomb-pack-its-manifest-describes-at-the-unlisted-abi-versi",
48663
+ "citations": [
48664
+ {
48665
+ "section": "spec/v2/core/node-pack-runtimes.md §WASM",
48666
+ "requirement": "the fixture module is the pack its manifest describes"
48667
+ }
48668
+ ]
48669
+ },
48426
48670
  {
48427
48671
  "id": "openwop.it.workflow-chain-internal-flag.the-manifest-workflowchain-declares-a-boolean-internal-property",
48428
48672
  "file": "workflow-chain-internal-flag.test.ts",
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$comment": "GENERATED by conformance/scripts/generate-scenario-majors.mjs (RFC 0168 §D.3). Do not edit; add a file to BOTH_MAJORS in the generator to target both majors.",
3
3
  "counts": {
4
- "files": 644,
4
+ "files": 649,
5
5
  "v1": 455,
6
- "v2": 204
6
+ "v2": 209
7
7
  },
8
8
  "majors": {
9
9
  "a2a-1-0-agent-card.test.ts": [
@@ -1569,6 +1569,9 @@
1569
1569
  "v2-multi-party-conversation-advertisement.test.ts": [
1570
1570
  2
1571
1571
  ],
1572
+ "v2-multi-party-council.test.ts": [
1573
+ 2
1574
+ ],
1572
1575
  "v2-negotiation-authenticated.test.ts": [
1573
1576
  2
1574
1577
  ],
@@ -1584,6 +1587,9 @@
1584
1587
  "v2-nondeterminism-policy-advertisement.test.ts": [
1585
1588
  2
1586
1589
  ],
1590
+ "v2-nondeterminism-sources.test.ts": [
1591
+ 2
1592
+ ],
1587
1593
  "v2-oauth-client-pkce-state-iss.test.ts": [
1588
1594
  2
1589
1595
  ],
@@ -1671,6 +1677,9 @@
1671
1677
  "v2-purpose-propagation-advertisement.test.ts": [
1672
1678
  2
1673
1679
  ],
1680
+ "v2-purpose-propagation-onward.test.ts": [
1681
+ 2
1682
+ ],
1674
1683
  "v2-queue-cross-tenant-isolation.test.ts": [
1675
1684
  2
1676
1685
  ],
@@ -1788,6 +1797,9 @@
1788
1797
  "v2-trigger-dead-letter-read.test.ts": [
1789
1798
  2
1790
1799
  ],
1800
+ "v2-ui-plugin-boundary.test.ts": [
1801
+ 2
1802
+ ],
1791
1803
  "v2-ui-plugins-advertisement.test.ts": [
1792
1804
  2
1793
1805
  ],
@@ -1806,6 +1818,9 @@
1806
1818
  "v2-version-header-honored.test.ts": [
1807
1819
  2
1808
1820
  ],
1821
+ "v2-wasm-memory-cap.test.ts": [
1822
+ 2
1823
+ ],
1809
1824
  "v2-webhook-delivery-isolation.test.ts": [
1810
1825
  2
1811
1826
  ],