@openwop/openwop-conformance 2.46.43 → 2.47.0

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.
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": 749,
6
- "tests": 2874,
7
- "withStableId": 2874,
5
+ "files": 754,
6
+ "tests": 2903,
7
+ "withStableId": 2903,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2744
9
+ "explicitIds": 2747
10
10
  },
11
11
  "records": [
12
12
  {
@@ -13611,7 +13611,7 @@
13611
13611
  {
13612
13612
  "id": "openwop.it.fixtures-valid.finds-at-least-one-fixture-file",
13613
13613
  "file": "fixtures-valid.test.ts",
13614
- "line": 49,
13614
+ "line": 56,
13615
13615
  "title": "finds at least one fixture file",
13616
13616
  "explicitId": "openwop.it.fixtures-valid.finds-at-least-one-fixture-file",
13617
13617
  "citations": [
@@ -13624,7 +13624,7 @@
13624
13624
  {
13625
13625
  "id": "openwop.it.fixtures-valid.validates-against-workflow-definition-schema-json",
13626
13626
  "file": "fixtures-valid.test.ts",
13627
- "line": 54,
13627
+ "line": 61,
13628
13628
  "title": null,
13629
13629
  "explicitId": "openwop.it.fixtures-valid.validates-against-workflow-definition-schema-json",
13630
13630
  "citations": [
@@ -13638,7 +13638,7 @@
13638
13638
  {
13639
13639
  "id": "openwop.it.fixtures-valid.every-fixture-id-matches-its-filename",
13640
13640
  "file": "fixtures-valid.test.ts",
13641
- "line": 64,
13641
+ "line": 76,
13642
13642
  "title": "every fixture id matches its filename",
13643
13643
  "explicitId": "openwop.it.fixtures-valid.every-fixture-id-matches-its-filename",
13644
13644
  "citations": [
@@ -13652,7 +13652,7 @@
13652
13652
  {
13653
13653
  "id": "openwop.it.fixtures-valid.every-fixture-has-a-manual-trigger-so-the-conformance-driver-can-start-it",
13654
13654
  "file": "fixtures-valid.test.ts",
13655
- "line": 75,
13655
+ "line": 87,
13656
13656
  "title": "every fixture has a manual trigger so the conformance driver can start it",
13657
13657
  "explicitId": "openwop.it.fixtures-valid.every-fixture-has-a-manual-trigger-so-the-conformance-driver-can-start-it",
13658
13658
  "citations": [
@@ -13666,7 +13666,7 @@
13666
13666
  {
13667
13667
  "id": "openwop.it.fixtures-valid.finds-at-least-one-pack-manifest-fixture-private-scope-coverage",
13668
13668
  "file": "fixtures-valid.test.ts",
13669
- "line": 123,
13669
+ "line": 135,
13670
13670
  "title": "finds at least one pack-manifest fixture (private-scope coverage)",
13671
13671
  "explicitId": "openwop.it.fixtures-valid.finds-at-least-one-pack-manifest-fixture-private-scope-coverage",
13672
13672
  "citations": [
@@ -13679,7 +13679,7 @@
13679
13679
  {
13680
13680
  "id": "openwop.it.fixtures-valid.pack-manifests-validates-against-its-kind-s-manifest-schema",
13681
13681
  "file": "fixtures-valid.test.ts",
13682
- "line": 128,
13682
+ "line": 140,
13683
13683
  "title": null,
13684
13684
  "explicitId": "openwop.it.fixtures-valid.pack-manifests-validates-against-its-kind-s-manifest-schema",
13685
13685
  "citations": [
@@ -13693,7 +13693,7 @@
13693
13693
  {
13694
13694
  "id": "openwop.it.fixtures-valid.the-private-scope-fixture-exercises-the-v1-0-private-pack-pattern",
13695
13695
  "file": "fixtures-valid.test.ts",
13696
- "line": 148,
13696
+ "line": 160,
13697
13697
  "title": "the private-scope fixture exercises the v1.0 private-pack pattern",
13698
13698
  "explicitId": "openwop.it.fixtures-valid.the-private-scope-fixture-exercises-the-v1-0-private-pack-pattern",
13699
13699
  "citations": [
@@ -13706,7 +13706,7 @@
13706
13706
  {
13707
13707
  "id": "openwop.it.fixtures-valid.finds-at-least-one-connection-pack-fixture-rfc-0095-coverage",
13708
13708
  "file": "fixtures-valid.test.ts",
13709
- "line": 182,
13709
+ "line": 194,
13710
13710
  "title": "finds at least one connection-pack fixture (RFC 0095 coverage)",
13711
13711
  "explicitId": "openwop.it.fixtures-valid.finds-at-least-one-connection-pack-fixture-rfc-0095-coverage",
13712
13712
  "citations": [
@@ -13719,7 +13719,7 @@
13719
13719
  {
13720
13720
  "id": "openwop.it.fixtures-valid.connection-packs-validates-against-connection-pack-manifest-schema-json",
13721
13721
  "file": "fixtures-valid.test.ts",
13722
- "line": 187,
13722
+ "line": 199,
13723
13723
  "title": null,
13724
13724
  "explicitId": "openwop.it.fixtures-valid.connection-packs-validates-against-connection-pack-manifest-schema-json",
13725
13725
  "citations": [
@@ -13733,7 +13733,7 @@
13733
13733
  {
13734
13734
  "id": "openwop.it.fixtures-valid.finds-at-least-one-trigger-event-fixture-rfc-0099-coverage",
13735
13735
  "file": "fixtures-valid.test.ts",
13736
- "line": 222,
13736
+ "line": 234,
13737
13737
  "title": "finds at least one trigger-event fixture (RFC 0099 coverage)",
13738
13738
  "explicitId": "openwop.it.fixtures-valid.finds-at-least-one-trigger-event-fixture-rfc-0099-coverage",
13739
13739
  "citations": [
@@ -13746,7 +13746,7 @@
13746
13746
  {
13747
13747
  "id": "openwop.it.fixtures-valid.trigger-events-validates-against-its-schema",
13748
13748
  "file": "fixtures-valid.test.ts",
13749
- "line": 227,
13749
+ "line": 239,
13750
13750
  "title": null,
13751
13751
  "explicitId": "openwop.it.fixtures-valid.trigger-events-validates-against-its-schema",
13752
13752
  "citations": [
@@ -13760,7 +13760,7 @@
13760
13760
  {
13761
13761
  "id": "openwop.it.fixtures-valid.finds-at-least-one-prompt-template-fixture",
13762
13762
  "file": "fixtures-valid.test.ts",
13763
- "line": 265,
13763
+ "line": 277,
13764
13764
  "title": "finds at least one prompt-template fixture",
13765
13765
  "explicitId": "openwop.it.fixtures-valid.finds-at-least-one-prompt-template-fixture",
13766
13766
  "citations": [
@@ -13773,7 +13773,7 @@
13773
13773
  {
13774
13774
  "id": "openwop.it.fixtures-valid.prompt-templates-validates-against-prompt-template-schema-json",
13775
13775
  "file": "fixtures-valid.test.ts",
13776
- "line": 273,
13776
+ "line": 285,
13777
13777
  "title": null,
13778
13778
  "explicitId": "openwop.it.fixtures-valid.prompt-templates-validates-against-prompt-template-schema-json",
13779
13779
  "citations": [
@@ -13787,7 +13787,7 @@
13787
13787
  {
13788
13788
  "id": "openwop.it.fixtures-valid.every-fixture-templateid-matches-its-filename",
13789
13789
  "file": "fixtures-valid.test.ts",
13790
- "line": 288,
13790
+ "line": 300,
13791
13791
  "title": "every fixture templateId matches its filename",
13792
13792
  "explicitId": "openwop.it.fixtures-valid.every-fixture-templateid-matches-its-filename",
13793
13793
  "citations": [
@@ -13801,7 +13801,7 @@
13801
13801
  {
13802
13802
  "id": "openwop.it.fixtures-valid.every-secret-source-variable-lives-in-a-fixture-tagged-for-the-secret-redaction",
13803
13803
  "file": "fixtures-valid.test.ts",
13804
- "line": 307,
13804
+ "line": 319,
13805
13805
  "title": "every secret-source variable lives in a fixture tagged for the secret-redaction scenario",
13806
13806
  "explicitId": "openwop.it.fixtures-valid.every-secret-source-variable-lives-in-a-fixture-tagged-for-the-secret-redaction",
13807
13807
  "citations": [
@@ -13815,7 +13815,7 @@
13815
13815
  {
13816
13816
  "id": "openwop.it.fixtures-valid.v1-v2-one-positive-per-kind-and-every-one-validates-including-the-minimal-conver",
13817
13817
  "file": "fixtures-valid.test.ts",
13818
- "line": 373,
13818
+ "line": 385,
13819
13819
  "title": "v1 + v2: one positive per kind, and every one validates — including the minimal conversation.start / conversation.close",
13820
13820
  "explicitId": "openwop.it.fixtures-valid.interrupt-payloads-positive-per-kind-validates",
13821
13821
  "citations": [
@@ -13833,7 +13833,7 @@
13833
13833
  {
13834
13834
  "id": "openwop.it.fixtures-valid.v1-v2-every-mismatched-kind-data-negative-is-refused-and-only-because-of-the-bin",
13835
13835
  "file": "fixtures-valid.test.ts",
13836
- "line": 387,
13836
+ "line": 399,
13837
13837
  "title": "v1 + v2: every mismatched kind/data negative is refused, and only because of the binding",
13838
13838
  "explicitId": "openwop.it.fixtures-valid.interrupt-payloads-mismatched-kind-data-refused",
13839
13839
  "citations": [
@@ -28789,6 +28789,149 @@
28789
28789
  }
28790
28790
  ]
28791
28791
  },
28792
+ {
28793
+ "id": "openwop.it.v2-bounded-loopback.edgeloopback-the-marker-approvaldata-loopback-the-cap-kind-and-the-facet-validat",
28794
+ "file": "v2-bounded-loopback.test.ts",
28795
+ "line": 128,
28796
+ "title": "EdgeLoopback, the marker, ApprovalData.loopback, the cap kind and the facet validate as declared",
28797
+ "explicitId": null,
28798
+ "citations": [
28799
+ {
28800
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28801
+ "requirement": "a loopback edge MUST validate"
28802
+ },
28803
+ {
28804
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28805
+ "requirement": "maxIterations is required"
28806
+ },
28807
+ {
28808
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28809
+ "requirement": "maxIterations has minimum 1"
28810
+ },
28811
+ {
28812
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28813
+ "requirement": "on admits only refine"
28814
+ },
28815
+ {
28816
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28817
+ "requirement": "onExhausted is withdraw or fail"
28818
+ },
28819
+ {
28820
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28821
+ "requirement": null,
28822
+ "interpolated": true
28823
+ },
28824
+ {
28825
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28826
+ "requirement": "a plain edge with a condition still validates"
28827
+ },
28828
+ {
28829
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28830
+ "requirement": "the marker MUST validate"
28831
+ },
28832
+ {
28833
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28834
+ "requirement": "round has minimum 1"
28835
+ },
28836
+ {
28837
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28838
+ "requirement": "rearmed holds at least the target and the gate"
28839
+ },
28840
+ {
28841
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28842
+ "requirement": "ApprovalData.loopback MUST validate"
28843
+ },
28844
+ {
28845
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28846
+ "requirement": "exhausted is required"
28847
+ },
28848
+ {
28849
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28850
+ "requirement": "cap.breached admits kind loopback-iterations"
28851
+ },
28852
+ {
28853
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28854
+ "requirement": "the loopback record MUST validate"
28855
+ },
28856
+ {
28857
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28858
+ "requirement": "maxHistoryEntryBytes has minimum 4096"
28859
+ },
28860
+ {
28861
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28862
+ "requirement": "maxHistoryEntryBytes is required"
28863
+ }
28864
+ ]
28865
+ },
28866
+ {
28867
+ "id": "openwop.it.v2-bounded-loopback.a-refine-re-arms-the-region-the-marker-a-new-visit-of-the-target-a-new-key-nothi",
28868
+ "file": "v2-bounded-loopback.test.ts",
28869
+ "line": 159,
28870
+ "title": "a refine re-arms the region: the marker, a new visit of the target, a new key, nothing released forward",
28871
+ "explicitId": null,
28872
+ "citations": []
28873
+ },
28874
+ {
28875
+ "id": "openwop.it.v2-bounded-loopback.the-target-receives-the-round-history-rebuilt-from-the-log-with-no-run-scoped-by",
28876
+ "file": "v2-bounded-loopback.test.ts",
28877
+ "line": 167,
28878
+ "title": "the target receives the round history rebuilt from the log, with no run-scoped bytes",
28879
+ "explicitId": null,
28880
+ "citations": []
28881
+ },
28882
+ {
28883
+ "id": "openwop.it.v2-bounded-loopback.each-visit-of-the-gate-carries-approvaldata-loopback-round-maxiterations-exhaust",
28884
+ "file": "v2-bounded-loopback.test.ts",
28885
+ "line": 175,
28886
+ "title": "each visit of the gate carries ApprovalData.loopback {round, maxIterations, exhausted}",
28887
+ "explicitId": null,
28888
+ "citations": []
28889
+ },
28890
+ {
28891
+ "id": "openwop.it.v2-bounded-loopback.the-exhausted-visit-withdraws-refine-refuses-a-refine-resume-and-accept-complete",
28892
+ "file": "v2-bounded-loopback.test.ts",
28893
+ "line": 185,
28894
+ "title": "the exhausted visit withdraws refine, refuses a refine resume, and accept completes the run",
28895
+ "explicitId": null,
28896
+ "citations": [
28897
+ {
28898
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28899
+ "requirement": "a refine resume on the exhausted visit MUST answer 400"
28900
+ },
28901
+ {
28902
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28903
+ "requirement": "the refusal MUST carry validation_error"
28904
+ },
28905
+ {
28906
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28907
+ "requirement": "the refused refine MUST leave the run waiting-approval"
28908
+ },
28909
+ {
28910
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28911
+ "requirement": "accept MUST complete the run"
28912
+ },
28913
+ {
28914
+ "section": "workflow-definition.schema.json $defs/EdgeLoopback; run-event-payloads.schema.json $defs/nodeCompleted.loopback (RFC 0258)",
28915
+ "requirement": "apply MUST run exactly once, after accept"
28916
+ }
28917
+ ]
28918
+ },
28919
+ {
28920
+ "id": "openwop.it.v2-bounded-loopback.under-onexhausted-fail-a-refine-on-the-exhausted-visit-fails-the-run-with-loop-l",
28921
+ "file": "v2-bounded-loopback.test.ts",
28922
+ "line": 198,
28923
+ "title": "under onExhausted: fail, a refine on the exhausted visit fails the run with loop_limit_exceeded",
28924
+ "explicitId": null,
28925
+ "citations": []
28926
+ },
28927
+ {
28928
+ "id": "openwop.it.v2-bounded-loopback.a-replay-fork-at-round-1-s-marked-completion-re-arms-and-asks-the-gate-again",
28929
+ "file": "v2-bounded-loopback.test.ts",
28930
+ "line": 214,
28931
+ "title": "a replay fork at round 1's marked completion re-arms and asks the gate again",
28932
+ "explicitId": null,
28933
+ "citations": []
28934
+ },
28792
28935
  {
28793
28936
  "id": "openwop.it.v2-budget-enforcement.a-budgeted-run-emits-budget-reserved-budget-threshold-crossed-and-budget-exhaust",
28794
28937
  "file": "v2-budget-enforcement.test.ts",
@@ -32603,6 +32746,157 @@
32603
32746
  }
32604
32747
  ]
32605
32748
  },
32749
+ {
32750
+ "id": "openwop.it.v2-interrupt-resolved-via.resolvedvia-is-a-closed-object-with-a-registered-scheme-boundto-is-a-non-legacy",
32751
+ "file": "v2-interrupt-resolved-via.test.ts",
32752
+ "line": 159,
32753
+ "title": "resolvedVia is a closed object with a registered scheme; boundTo is a non-legacy user or agent Subject",
32754
+ "explicitId": null,
32755
+ "citations": [
32756
+ {
32757
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32758
+ "requirement": "interrupt.resolved without resolvedVia MUST validate"
32759
+ },
32760
+ {
32761
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32762
+ "requirement": "a bare token resolution (no resolvedBy) with resolvedVia MUST validate"
32763
+ },
32764
+ {
32765
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32766
+ "requirement": "tokenRef and a user boundTo MUST validate"
32767
+ },
32768
+ {
32769
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32770
+ "requirement": "scheme is REQUIRED"
32771
+ },
32772
+ {
32773
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32774
+ "requirement": "an unregistered scheme MUST fail"
32775
+ },
32776
+ {
32777
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32778
+ "requirement": "resolvedVia is closed: a token member MUST fail"
32779
+ },
32780
+ {
32781
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32782
+ "requirement": "tokenRef is opaque: a dotted token-shaped value MUST fail the grammar"
32783
+ },
32784
+ {
32785
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32786
+ "requirement": "boundTo of kind anonymous MUST fail"
32787
+ },
32788
+ {
32789
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32790
+ "requirement": "boundTo of kind workload MUST fail"
32791
+ },
32792
+ {
32793
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32794
+ "requirement": "boundTo with the legacy issuer MUST fail"
32795
+ }
32796
+ ]
32797
+ },
32798
+ {
32799
+ "id": "openwop.it.v2-interrupt-resolved-via.an-unauthenticated-token-resolution-records-no-resolvedby",
32800
+ "file": "v2-interrupt-resolved-via.test.ts",
32801
+ "line": 177,
32802
+ "title": "an unauthenticated token resolution records no resolvedBy",
32803
+ "explicitId": null,
32804
+ "citations": [
32805
+ {
32806
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32807
+ "requirement": "the token resolution logged no interrupt.resolved for the gate"
32808
+ },
32809
+ {
32810
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32811
+ "requirement": "a resolution whose request authenticated nothing MUST NOT record resolvedBy (§A.1)"
32812
+ }
32813
+ ]
32814
+ },
32815
+ {
32816
+ "id": "openwop.it.v2-interrupt-resolved-via.a-host-advertising-interrupt-resolvedvia-records-scheme-interrupt-token-and-no-b",
32817
+ "file": "v2-interrupt-resolved-via.test.ts",
32818
+ "line": 188,
32819
+ "title": "a host advertising interrupt.resolvedVia records scheme interrupt-token and no boundTo on an unbound token resolution",
32820
+ "explicitId": null,
32821
+ "citations": [
32822
+ {
32823
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32824
+ "requirement": "a host advertising interrupt.resolvedVia MUST record resolvedVia.scheme \"interrupt-token\" on a token resolution"
32825
+ },
32826
+ {
32827
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32828
+ "requirement": "boundTo MUST be absent when the host bound the presentation to no one"
32829
+ }
32830
+ ]
32831
+ },
32832
+ {
32833
+ "id": "openwop.it.v2-interrupt-resolved-via.tokenref-when-present-is-not-the-token-and-not-computable-from-it",
32834
+ "file": "v2-interrupt-resolved-via.test.ts",
32835
+ "line": 201,
32836
+ "title": "tokenRef, when present, is not the token and not computable from it",
32837
+ "explicitId": null,
32838
+ "citations": [
32839
+ {
32840
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32841
+ "requirement": "tokenRef MUST NOT equal, contain or be a bare digest of the token or its segments (§A.3)"
32842
+ }
32843
+ ]
32844
+ },
32845
+ {
32846
+ "id": "openwop.it.v2-interrupt-resolved-via.a-run-scoped-resolution-records-no-resolvedvia",
32847
+ "file": "v2-interrupt-resolved-via.test.ts",
32848
+ "line": 214,
32849
+ "title": "a run-scoped resolution records no resolvedVia",
32850
+ "explicitId": null,
32851
+ "citations": [
32852
+ {
32853
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32854
+ "requirement": "the run-scoped resolution logged no interrupt.resolved for the gate"
32855
+ },
32856
+ {
32857
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32858
+ "requirement": "resolvedVia MUST NOT be recorded on a resolution that presented no token"
32859
+ }
32860
+ ]
32861
+ },
32862
+ {
32863
+ "id": "openwop.it.v2-interrupt-resolved-via.a-binding-the-host-made-to-the-caller-is-recorded-as-boundto-equal-to-the-caller",
32864
+ "file": "v2-interrupt-resolved-via.test.ts",
32865
+ "line": 228,
32866
+ "title": "a binding the host made to the caller is recorded as boundTo, equal to the caller's owner subject",
32867
+ "explicitId": null,
32868
+ "citations": [
32869
+ {
32870
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32871
+ "requirement": "boundTo MUST be the Subject the host bound the presentation to, built with the owner.subject mapping (§A.4)"
32872
+ },
32873
+ {
32874
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32875
+ "requirement": "a bound but unauthenticated presentation still MUST NOT record resolvedBy (§A.1)"
32876
+ }
32877
+ ]
32878
+ },
32879
+ {
32880
+ "id": "openwop.it.v2-interrupt-resolved-via.a-binding-altered-to-claim-someone-else-binds-no-one",
32881
+ "file": "v2-interrupt-resolved-via.test.ts",
32882
+ "line": 242,
32883
+ "title": "a binding altered to claim someone else binds no one",
32884
+ "explicitId": null,
32885
+ "citations": [
32886
+ {
32887
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32888
+ "requirement": "refusing a presentation whose binding does not verify satisfies §A.4"
32889
+ },
32890
+ {
32891
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32892
+ "requirement": "a host MUST NOT set boundTo from a binding it did not make (§A.4)"
32893
+ },
32894
+ {
32895
+ "section": "run-event-payloads.schema.json $defs/interruptResolved.resolvedBy + .resolvedVia (RFC 0259)",
32896
+ "requirement": "and MUST NOT record the claimed name in resolvedBy (§A.1)"
32897
+ }
32898
+ ]
32899
+ },
32606
32900
  {
32607
32901
  "id": "openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused",
32608
32902
  "file": "v2-interrupt-token-scheme.test.ts",
@@ -36758,6 +37052,84 @@
36758
37052
  }
36759
37053
  ]
36760
37054
  },
37055
+ {
37056
+ "id": "openwop.it.v2-replay-llm-cache-key.the-effect-ledger-record-admits-cachekey-recipe-digest-and-refuses-anything-else",
37057
+ "file": "v2-replay-llm-cache-key.test.ts",
37058
+ "line": 102,
37059
+ "title": "the effect-ledger record admits cacheKey {recipe, digest} and refuses anything else",
37060
+ "explicitId": null,
37061
+ "citations": [
37062
+ {
37063
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37064
+ "requirement": "a record without cacheKey MUST validate (the facet is opt-in)"
37065
+ },
37066
+ {
37067
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37068
+ "requirement": "cacheKey {recipe: openwop-llm-key-2, digest: 64 hex} MUST validate"
37069
+ },
37070
+ {
37071
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37072
+ "requirement": "an unregistered recipe MUST fail"
37073
+ },
37074
+ {
37075
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37076
+ "requirement": "an uppercase or short digest MUST fail"
37077
+ },
37078
+ {
37079
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37080
+ "requirement": "digest is REQUIRED"
37081
+ },
37082
+ {
37083
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37084
+ "requirement": "cacheKey is closed: a preimage member MUST fail"
37085
+ }
37086
+ ]
37087
+ },
37088
+ {
37089
+ "id": "openwop.it.v2-replay-llm-cache-key.a-host-advertising-replay-llmcachekeyrecipe-also-advertises-idempotency",
37090
+ "file": "v2-replay-llm-cache-key.test.ts",
37091
+ "line": 117,
37092
+ "title": "a host advertising replay.llmCacheKeyRecipe also advertises idempotency",
37093
+ "explicitId": null,
37094
+ "citations": [
37095
+ {
37096
+ "section": "replay facet llmCacheKeyRecipe + effect-ledger-projection cacheKey (RFC 0260)",
37097
+ "requirement": "a host advertising replay.llmCacheKeyRecipe MUST advertise idempotency: the effect ledger is where the key is recorded"
37098
+ }
37099
+ ]
37100
+ },
37101
+ {
37102
+ "id": "openwop.it.v2-replay-llm-cache-key.the-provider-call-record-carries-cachekey-with-recipe-openwop-llm-key-2",
37103
+ "file": "v2-replay-llm-cache-key.test.ts",
37104
+ "line": 125,
37105
+ "title": "the provider-call record carries cacheKey with recipe openwop-llm-key-2",
37106
+ "explicitId": null,
37107
+ "citations": []
37108
+ },
37109
+ {
37110
+ "id": "openwop.it.v2-replay-llm-cache-key.two-runs-that-differ-only-in-maxtokens-have-different-keys",
37111
+ "file": "v2-replay-llm-cache-key.test.ts",
37112
+ "line": 133,
37113
+ "title": "two runs that differ only in maxTokens have different keys",
37114
+ "explicitId": null,
37115
+ "citations": []
37116
+ },
37117
+ {
37118
+ "id": "openwop.it.v2-replay-llm-cache-key.two-identical-runs-have-the-same-key",
37119
+ "file": "v2-replay-llm-cache-key.test.ts",
37120
+ "line": 143,
37121
+ "title": "two identical runs have the same key",
37122
+ "explicitId": null,
37123
+ "citations": []
37124
+ },
37125
+ {
37126
+ "id": "openwop.it.v2-replay-llm-cache-key.the-key-equals-recipe-2-recomputed-over-the-inputs-the-fixture-pins",
37127
+ "file": "v2-replay-llm-cache-key.test.ts",
37128
+ "line": 153,
37129
+ "title": "the key equals recipe 2 recomputed over the inputs the fixture pins",
37130
+ "explicitId": null,
37131
+ "citations": []
37132
+ },
36761
37133
  {
36762
37134
  "id": "openwop.it.v2-replay-suppression-ordinal.a-replay-fork-resolves-each-execution-of-a-looped-side-effecting-node-by-its-own",
36763
37135
  "file": "v2-replay-suppression-ordinal.test.ts",
@@ -38416,6 +38788,133 @@
38416
38788
  }
38417
38789
  ]
38418
38790
  },
38791
+ {
38792
+ "id": "openwop.it.v2-telemetry-export.the-telemetry-record-requires-otlp-protocols-from-the-closed-transports-genaisem",
38793
+ "file": "v2-telemetry-export.test.ts",
38794
+ "line": 102,
38795
+ "title": "the telemetry record requires otlp.protocols from the closed transports; genAiSemconv is semver",
38796
+ "explicitId": null,
38797
+ "citations": [
38798
+ {
38799
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38800
+ "requirement": "a record with otlp.protocols MUST validate"
38801
+ },
38802
+ {
38803
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38804
+ "requirement": "genAiSemconv as semver MUST validate"
38805
+ },
38806
+ {
38807
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38808
+ "requirement": "otlp is REQUIRED"
38809
+ },
38810
+ {
38811
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38812
+ "requirement": "protocols MUST be non-empty"
38813
+ },
38814
+ {
38815
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38816
+ "requirement": "an unknown transport MUST fail"
38817
+ },
38818
+ {
38819
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38820
+ "requirement": "a non-semver genAiSemconv MUST fail"
38821
+ }
38822
+ ]
38823
+ },
38824
+ {
38825
+ "id": "openwop.it.v2-telemetry-export.a-run-exports-an-openwop-run-span-with-its-run-and-workflow-ids",
38826
+ "file": "v2-telemetry-export.test.ts",
38827
+ "line": 115,
38828
+ "title": "a run exports an openwop.run span with its run and workflow ids",
38829
+ "explicitId": null,
38830
+ "citations": [
38831
+ {
38832
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38833
+ "requirement": "every run MUST produce a span named openwop.run carrying openwop.run_id"
38834
+ },
38835
+ {
38836
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38837
+ "requirement": "the run span MUST carry openwop.workflow_id"
38838
+ }
38839
+ ]
38840
+ },
38841
+ {
38842
+ "id": "openwop.it.v2-telemetry-export.each-node-execution-exports-an-openwop-node-typeid-span-with-its-node-attributes",
38843
+ "file": "v2-telemetry-export.test.ts",
38844
+ "line": 125,
38845
+ "title": "each node execution exports an openwop.node.<typeId> span with its node attributes",
38846
+ "explicitId": null,
38847
+ "citations": [
38848
+ {
38849
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38850
+ "requirement": "every node execution MUST produce a span named openwop.node.<typeId>"
38851
+ },
38852
+ {
38853
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38854
+ "requirement": "the node span MUST carry openwop.node_id"
38855
+ },
38856
+ {
38857
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38858
+ "requirement": "the node span MUST carry openwop.node_type, and its name MUST be openwop.node.<typeId>"
38859
+ },
38860
+ {
38861
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38862
+ "requirement": "openwop.node_attempt MUST be a non-negative integer"
38863
+ }
38864
+ ]
38865
+ },
38866
+ {
38867
+ "id": "openwop.it.v2-telemetry-export.a-run-created-with-a-traceparent-exports-its-spans-in-that-trace",
38868
+ "file": "v2-telemetry-export.test.ts",
38869
+ "line": 139,
38870
+ "title": "a run created with a traceparent exports its spans in that trace",
38871
+ "explicitId": null,
38872
+ "citations": [
38873
+ {
38874
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38875
+ "requirement": "a run created with a valid W3C traceparent MUST emit its spans in that trace"
38876
+ }
38877
+ ]
38878
+ },
38879
+ {
38880
+ "id": "openwop.it.v2-telemetry-export.no-exported-span-carries-the-resolved-store-secret",
38881
+ "file": "v2-telemetry-export.test.ts",
38882
+ "line": 149,
38883
+ "title": "no exported span carries the resolved store secret",
38884
+ "explicitId": null,
38885
+ "citations": [
38886
+ {
38887
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38888
+ "requirement": "a span name, attribute, event or resource attribute MUST NOT carry a resolved secret"
38889
+ }
38890
+ ]
38891
+ },
38892
+ {
38893
+ "id": "openwop.it.v2-telemetry-export.a-host-advertising-genaisemconv-puts-the-gen-ai-attributes-on-the-model-call-spa",
38894
+ "file": "v2-telemetry-export.test.ts",
38895
+ "line": 167,
38896
+ "title": "a host advertising genAiSemconv puts the gen_ai attributes on the model-call span",
38897
+ "explicitId": null,
38898
+ "citations": [
38899
+ {
38900
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38901
+ "requirement": null,
38902
+ "interpolated": true
38903
+ },
38904
+ {
38905
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38906
+ "requirement": "the model-call span MUST carry the provider attribute its version names"
38907
+ },
38908
+ {
38909
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38910
+ "requirement": "the model-call span MUST carry gen_ai.request.model"
38911
+ },
38912
+ {
38913
+ "section": "spec/v2/core/telemetry.md (RFC 0262)",
38914
+ "requirement": "the model-call span MUST carry input and output token usage"
38915
+ }
38916
+ ]
38917
+ },
38419
38918
  {
38420
38919
  "id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
38421
38920
  "file": "v2-terminal-event-once.test.ts",
@@ -48348,7 +48847,7 @@
48348
48847
  {
48349
48848
  "id": "openwop.it.v2-front-door-counts.every-stated-count-of-spec-v2-core-documents-equals-the-tree",
48350
48849
  "file": "v2-front-door-counts.test.ts",
48351
- "line": 51,
48850
+ "line": 52,
48352
48851
  "title": "every stated count of spec/v2/core/ documents equals the tree",
48353
48852
  "explicitId": "openwop.requirement.front-door.core-doc-count",
48354
48853
  "citations": [
@@ -48362,7 +48861,7 @@
48362
48861
  {
48363
48862
  "id": "openwop.it.v2-front-door-counts.capabilities-md-5-names-as-many-core-families-as-the-declaration-declares",
48364
48863
  "file": "v2-front-door-counts.test.ts",
48365
- "line": 74,
48864
+ "line": 75,
48366
48865
  "title": "capabilities.md §5 names as many core families as the declaration declares",
48367
48866
  "explicitId": "openwop.requirement.front-door.core-family-count",
48368
48867
  "citations": [
@@ -49134,6 +49633,130 @@
49134
49633
  }
49135
49634
  ]
49136
49635
  },
49636
+ {
49637
+ "id": "openwop.it.v2-sabotage-ledger.a-every-witnessable-falsifiability-row-names-an-id-or-says-planned",
49638
+ "file": "v2-sabotage-ledger.test.ts",
49639
+ "line": 85,
49640
+ "title": "§A every witnessable Falsifiability row names an id or says planned",
49641
+ "explicitId": "openwop.requirement.0263.falsifiability-names-ids",
49642
+ "citations": [
49643
+ {
49644
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49645
+ "requirement": null,
49646
+ "interpolated": true
49647
+ },
49648
+ {
49649
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49650
+ "requirement": "a table naming an id, a planned row and a claims-check row MUST pass at Active"
49651
+ },
49652
+ {
49653
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49654
+ "requirement": "a witnessable row with no id and no `planned` MUST fail"
49655
+ },
49656
+ {
49657
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49658
+ "requirement": "the refusal MUST name §A"
49659
+ },
49660
+ {
49661
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49662
+ "requirement": "an RFC before 0258 is not in scope"
49663
+ },
49664
+ {
49665
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49666
+ "requirement": "a Draft RFC is not in scope"
49667
+ },
49668
+ {
49669
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49670
+ "requirement": "from RFC 0260 a planned row MUST block Accepted"
49671
+ },
49672
+ {
49673
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49674
+ "requirement": "the refusal MUST name the planned row"
49675
+ },
49676
+ {
49677
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49678
+ "requirement": "before RFC 0260 a planned row does not block Accepted"
49679
+ }
49680
+ ]
49681
+ },
49682
+ {
49683
+ "id": "openwop.it.v2-sabotage-ledger.c-an-accepted-rfc-from-0260-has-a-red-ledger-row-for-every-id-it-cites",
49684
+ "file": "v2-sabotage-ledger.test.ts",
49685
+ "line": 101,
49686
+ "title": "§C an Accepted RFC from 0260 has a red ledger row for every id it cites",
49687
+ "explicitId": "openwop.requirement.0263.sabotage-recorded-before-accepted",
49688
+ "citations": [
49689
+ {
49690
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49691
+ "requirement": "an executed-fail row for the cited id MUST satisfy §C"
49692
+ },
49693
+ {
49694
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49695
+ "requirement": "a red row on a leg under the cited id MUST satisfy §C"
49696
+ },
49697
+ {
49698
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49699
+ "requirement": "with no ledger row the flip MUST fail"
49700
+ },
49701
+ {
49702
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49703
+ "requirement": "the refusal MUST name the id"
49704
+ },
49705
+ {
49706
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49707
+ "requirement": "a red row for a different id MUST NOT satisfy §C"
49708
+ },
49709
+ {
49710
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49711
+ "requirement": "§C binds the Accepted flip, not Active"
49712
+ },
49713
+ {
49714
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49715
+ "requirement": "an RFC before 0260 is not retroactively invalidated"
49716
+ }
49717
+ ]
49718
+ },
49719
+ {
49720
+ "id": "openwop.it.v2-sabotage-ledger.b-the-ledger-records-red-runs-in-a-closed-shape-never-on-a-certified-bundle",
49721
+ "file": "v2-sabotage-ledger.test.ts",
49722
+ "line": 114,
49723
+ "title": "§B the ledger records red runs, in a closed shape, never on a certified bundle",
49724
+ "explicitId": "openwop.requirement.0263.ledger-shape",
49725
+ "citations": [
49726
+ {
49727
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49728
+ "requirement": "well-formed rows, one with a red digest, MUST pass"
49729
+ },
49730
+ {
49731
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49732
+ "requirement": "a sabotage that passed MUST fail the shape"
49733
+ },
49734
+ {
49735
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49736
+ "requirement": "the refusal MUST say why"
49737
+ },
49738
+ {
49739
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49740
+ "requirement": "an unknown member MUST fail"
49741
+ },
49742
+ {
49743
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49744
+ "requirement": "a sabotage that does not say what was broken MUST fail"
49745
+ },
49746
+ {
49747
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49748
+ "requirement": "a subject without a build MUST fail"
49749
+ },
49750
+ {
49751
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49752
+ "requirement": "a row naming a certified bundle's digest MUST fail — that bundle recorded the pass"
49753
+ },
49754
+ {
49755
+ "section": "RFC 0263 · scripts/check-accepted-predicate.mjs rules 5 and 6",
49756
+ "requirement": "the refusal MUST name the certified bundle"
49757
+ }
49758
+ ]
49759
+ },
49137
49760
  {
49138
49761
  "id": "openwop.it.v2-seams-not-in-canonical.the-corpus-gate-script-exits-0",
49139
49762
  "file": "v2-seams-not-in-canonical.test.ts",