@openwop/openwop-conformance 2.0.0-rc.0 → 2.0.0-rc.1

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 (71) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +209 -14
  3. package/dist/lib/certification-bundle-v3.js +142 -0
  4. package/dist/lib/requirement-ids.js +23 -0
  5. package/dist/lib/requirement-ledger.js +1 -0
  6. package/dist/lib/scenario-disposition.js +5 -1
  7. package/dist/spec-artifacts.lock.json +2 -2
  8. package/package.json +2 -2
  9. package/requirements.json +2701 -4
  10. package/scenario-majors.json +152 -2
  11. package/schemas/CORPUS-STAMP.json +17 -17
  12. package/src/cli.ts +190 -19
  13. package/src/lib/certification-bundle-v3.ts +175 -0
  14. package/src/lib/driver.ts +9 -1
  15. package/src/lib/era2-seed.ts +197 -0
  16. package/src/lib/requirement-ids.ts +21 -0
  17. package/src/lib/requirement-ledger.ts +7 -1
  18. package/src/lib/scenario-disposition.ts +5 -1
  19. package/src/lib/seams.ts +45 -0
  20. package/src/lib/v2.ts +62 -0
  21. package/src/scenarios/v2-approver-enforced.test.ts +97 -0
  22. package/src/scenarios/v2-assurance-downgrade-audited.test.ts +75 -0
  23. package/src/scenarios/v2-bundle-v3-signed.test.ts +96 -0
  24. package/src/scenarios/v2-capabilities-root-closed.test.ts +63 -0
  25. package/src/scenarios/v2-capability-record-shape.test.ts +104 -0
  26. package/src/scenarios/v2-chain-pin-exact.test.ts +118 -0
  27. package/src/scenarios/v2-coherence-not-in-bundle.test.ts +98 -0
  28. package/src/scenarios/v2-compensation-read-projection.test.ts +85 -0
  29. package/src/scenarios/v2-configurable-closed.test.ts +67 -0
  30. package/src/scenarios/v2-dual-stack-negotiation.test.ts +118 -0
  31. package/src/scenarios/v2-effect-identity-business-key.test.ts +132 -0
  32. package/src/scenarios/v2-effect-seam-manifest.test.ts +163 -0
  33. package/src/scenarios/v2-enum-growth-rule.test.ts +69 -0
  34. package/src/scenarios/v2-era-key.test.ts +86 -0
  35. package/src/scenarios/v2-error-registry.test.ts +89 -0
  36. package/src/scenarios/v2-event-type-closed.test.ts +97 -0
  37. package/src/scenarios/v2-fork-a-v1-run.test.ts +109 -0
  38. package/src/scenarios/v2-form-when-reuses-edge-conditions.test.ts +70 -0
  39. package/src/scenarios/v2-header-scheme.test.ts +67 -0
  40. package/src/scenarios/v2-id-grammar.test.ts +77 -0
  41. package/src/scenarios/v2-idempotency-key-grammar.test.ts +65 -0
  42. package/src/scenarios/v2-interrupt-token-scheme.test.ts +55 -0
  43. package/src/scenarios/v2-lane-issuer-advertised.test.ts +62 -0
  44. package/src/scenarios/v2-legacy-profiles-absent.test.ts +78 -0
  45. package/src/scenarios/v2-manifest-ceiling-refused.test.ts +130 -0
  46. package/src/scenarios/v2-manifest-hatch-carried.test.ts +120 -0
  47. package/src/scenarios/v2-min-client-version.test.ts +48 -0
  48. package/src/scenarios/v2-minimum-version-refused.test.ts +141 -0
  49. package/src/scenarios/v2-mrtr-rounds-ceiling.test.ts +95 -0
  50. package/src/scenarios/v2-negotiation-authenticated.test.ts +125 -0
  51. package/src/scenarios/v2-negotiation-decided-emitted.test.ts +149 -0
  52. package/src/scenarios/v2-no-transport-advertisement.test.ts +57 -0
  53. package/src/scenarios/v2-owner-subject-required.test.ts +72 -0
  54. package/src/scenarios/v2-pack-isolation.test.ts +147 -0
  55. package/src/scenarios/v2-payload-registry-closed.test.ts +110 -0
  56. package/src/scenarios/v2-peer-dependency-declared.test.ts +132 -0
  57. package/src/scenarios/v2-pinned-run-disposition.test.ts +124 -0
  58. package/src/scenarios/v2-poll-cursor-v2.test.ts +114 -0
  59. package/src/scenarios/v2-preferred-version-default.test.ts +83 -0
  60. package/src/scenarios/v2-profiles-derived-only.test.ts +70 -0
  61. package/src/scenarios/v2-provider-conflict.test.ts +115 -0
  62. package/src/scenarios/v2-refresh-sla.test.ts +78 -0
  63. package/src/scenarios/v2-relaxation-recorded.test.ts +134 -0
  64. package/src/scenarios/v2-revocation-honored.test.ts +66 -0
  65. package/src/scenarios/v2-subject-link-record.test.ts +102 -0
  66. package/src/scenarios/v2-unmapped-type-refused.test.ts +95 -0
  67. package/src/scenarios/v2-v1-events-translated.test.ts +105 -0
  68. package/src/scenarios/v2-v1-signed-webhook-accepted.test.ts +109 -0
  69. package/src/scenarios/v2-webhook-durable-delivery.test.ts +238 -0
  70. package/src/scenarios/v2-well-known-one-resource.test.ts +129 -0
  71. package/src/setup.ts +40 -4
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": 473,
6
- "tests": 1974,
7
- "withStableId": 1974,
5
+ "files": 538,
6
+ "tests": 2106,
7
+ "withStableId": 2106,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 1939
9
+ "explicitIds": 2057
10
10
  },
11
11
  "records": [
12
12
  {
@@ -25741,6 +25741,2406 @@
25741
25741
  }
25742
25742
  ]
25743
25743
  },
25744
+ {
25745
+ "id": "openwop.it.v2-approver-enforced.a-resolver-outside-approverslist-is-refused-at-resolve-time",
25746
+ "file": "v2-approver-enforced.test.ts",
25747
+ "line": 52,
25748
+ "title": "a resolver outside approversList is refused at resolve time",
25749
+ "explicitId": "openwop.requirement.0173.approver-enforced",
25750
+ "citations": [
25751
+ {
25752
+ "section": "facets/interrupt.schema.json refKinds",
25753
+ "requirement": null,
25754
+ "interpolated": true
25755
+ },
25756
+ {
25757
+ "section": "runs.md §Create",
25758
+ "requirement": null,
25759
+ "interpolated": true
25760
+ },
25761
+ {
25762
+ "section": "interrupt.md §Approver enforcement",
25763
+ "requirement": "the fixture MUST suspend on its approval gate (status waiting-approval) before a resolve can be attempted"
25764
+ },
25765
+ {
25766
+ "section": "interrupt.md §Approver enforcement",
25767
+ "requirement": "a host advertising `interrupt` MUST refuse a resolver not in approversList with 403 (RFC 0173 §B — enforcement, not advice)"
25768
+ },
25769
+ {
25770
+ "section": "errors.json",
25771
+ "requirement": "the refusal MUST carry a registered 403 code (forbidden | run_forbidden) in the canonical envelope"
25772
+ },
25773
+ {
25774
+ "section": "interrupt.md §Approver enforcement",
25775
+ "requirement": "a refused resolve MUST NOT resume the run — the interrupt stays pending"
25776
+ }
25777
+ ]
25778
+ },
25779
+ {
25780
+ "id": "openwop.it.v2-assurance-downgrade-audited.an-identity-below-the-lane-floor-is-refused-with-sender-constraint-missing",
25781
+ "file": "v2-assurance-downgrade-audited.test.ts",
25782
+ "line": 53,
25783
+ "title": "an identity below the lane floor is refused with sender_constraint_missing",
25784
+ "explicitId": "openwop.requirement.0170.assurance-downgrade-audited.refused",
25785
+ "citations": [
25786
+ {
25787
+ "section": null,
25788
+ "requirement": null,
25789
+ "interpolated": true
25790
+ },
25791
+ {
25792
+ "section": null,
25793
+ "requirement": "the refusal code MUST be sender_constraint_missing",
25794
+ "interpolated": true
25795
+ }
25796
+ ]
25797
+ },
25798
+ {
25799
+ "id": "openwop.it.v2-assurance-downgrade-audited.a-resolved-identity-records-the-assurance-actually-used-never-a-downgraded-beare",
25800
+ "file": "v2-assurance-downgrade-audited.test.ts",
25801
+ "line": 63,
25802
+ "title": "a resolved identity records the assurance actually used, never a downgraded bearer under a sender-constrained label",
25803
+ "explicitId": "openwop.requirement.0170.assurance-downgrade-audited.audited",
25804
+ "citations": [
25805
+ {
25806
+ "section": null,
25807
+ "requirement": null,
25808
+ "interpolated": true
25809
+ },
25810
+ {
25811
+ "section": null,
25812
+ "requirement": null,
25813
+ "interpolated": true
25814
+ }
25815
+ ]
25816
+ },
25817
+ {
25818
+ "id": "openwop.it.v2-bundle-v3-signed.a-signed-v3-bundle-validates-against-the-closed-root-schema-an-extra-root-key-is",
25819
+ "file": "v2-bundle-v3-signed.test.ts",
25820
+ "line": 60,
25821
+ "title": "a signed v3 bundle validates against the closed-root schema; an extra root key is rejected",
25822
+ "explicitId": "openwop.requirement.0168.bundle-v3-signed.schema-closed-root",
25823
+ "citations": [
25824
+ {
25825
+ "section": null,
25826
+ "requirement": null,
25827
+ "interpolated": true
25828
+ },
25829
+ {
25830
+ "section": null,
25831
+ "requirement": "the v3 root is closed — an unknown root key MUST be rejected (RFC 0168 §E.1)",
25832
+ "interpolated": true
25833
+ }
25834
+ ]
25835
+ },
25836
+ {
25837
+ "id": "openwop.it.v2-bundle-v3-signed.the-attestation-verifies-under-the-host-key-and-a-flipped-witnesssha256-is-refus",
25838
+ "file": "v2-bundle-v3-signed.test.ts",
25839
+ "line": 69,
25840
+ "title": "the attestation verifies under the host key, and a flipped witnessSha256 is refused with witness-digest",
25841
+ "explicitId": "openwop.requirement.0168.bundle-v3-signed.witness-digest",
25842
+ "citations": [
25843
+ {
25844
+ "section": null,
25845
+ "requirement": null,
25846
+ "interpolated": true
25847
+ },
25848
+ {
25849
+ "section": null,
25850
+ "requirement": "the Ed25519 attestation MUST verify under the host key",
25851
+ "interpolated": true
25852
+ },
25853
+ {
25854
+ "section": null,
25855
+ "requirement": "a witnessSha256 that is not the digest of the rows MUST be refused with witness-digest (RFC 0148 §C)",
25856
+ "interpolated": true
25857
+ },
25858
+ {
25859
+ "section": null,
25860
+ "requirement": "the attestation covers witnessSha256, so a flipped digest MUST NOT verify under the host key",
25861
+ "interpolated": true
25862
+ }
25863
+ ]
25864
+ },
25865
+ {
25866
+ "id": "openwop.it.v2-bundle-v3-signed.an-independent-claim-self-signed-under-the-host-key-is-refused-a-distinct-verifi",
25867
+ "file": "v2-bundle-v3-signed.test.ts",
25868
+ "line": 82,
25869
+ "title": "an independent claim self-signed under the host key is refused; a distinct verifier key verifies",
25870
+ "explicitId": "openwop.requirement.0168.bundle-v3-signed.independent-self-signed",
25871
+ "citations": [
25872
+ {
25873
+ "section": null,
25874
+ "requirement": "an independent claim whose verifier key id equals the host key id MUST be refused with independent-self-signed (RFC 0148 R5)",
25875
+ "interpolated": true
25876
+ },
25877
+ {
25878
+ "section": null,
25879
+ "requirement": "a refused independent claim MUST NOT certify",
25880
+ "interpolated": true
25881
+ },
25882
+ {
25883
+ "section": null,
25884
+ "requirement": null,
25885
+ "interpolated": true
25886
+ },
25887
+ {
25888
+ "section": null,
25889
+ "requirement": "the verifier attestation MUST verify under the verifier key",
25890
+ "interpolated": true
25891
+ }
25892
+ ]
25893
+ },
25894
+ {
25895
+ "id": "openwop.it.v2-capabilities-root-closed.the-host-document-validates-against-capabilities-schema-json",
25896
+ "file": "v2-capabilities-root-closed.test.ts",
25897
+ "line": 32,
25898
+ "title": "the host document validates against capabilities.schema.json",
25899
+ "explicitId": "openwop.requirement.0169.capabilities-root-closed.valid",
25900
+ "citations": [
25901
+ {
25902
+ "section": null,
25903
+ "requirement": null,
25904
+ "interpolated": true
25905
+ }
25906
+ ]
25907
+ },
25908
+ {
25909
+ "id": "openwop.it.v2-capabilities-root-closed.an-unknown-root-key-fails-validation",
25910
+ "file": "v2-capabilities-root-closed.test.ts",
25911
+ "line": 40,
25912
+ "title": "an unknown root key fails validation",
25913
+ "explicitId": "openwop.requirement.0169.capabilities-root-closed.unknown-root-key",
25914
+ "citations": [
25915
+ {
25916
+ "section": null,
25917
+ "requirement": "any root key that is not a metadata key, a declared family, or `extensions` MUST fail validation",
25918
+ "interpolated": true
25919
+ }
25920
+ ]
25921
+ },
25922
+ {
25923
+ "id": "openwop.it.v2-capabilities-root-closed.a-dotted-mirror-key-fails-validation",
25924
+ "file": "v2-capabilities-root-closed.test.ts",
25925
+ "line": 46,
25926
+ "title": "a dotted mirror key fails validation",
25927
+ "explicitId": "openwop.requirement.0169.capabilities-root-closed.dotted-key",
25928
+ "citations": [
25929
+ {
25930
+ "section": null,
25931
+ "requirement": "a dotted key (the v1 `host.<family>` mirror) MUST fail validation at the closed root",
25932
+ "interpolated": true
25933
+ }
25934
+ ]
25935
+ },
25936
+ {
25937
+ "id": "openwop.it.v2-capabilities-root-closed.the-v1-capabilities-wrapper-fails-validation",
25938
+ "file": "v2-capabilities-root-closed.test.ts",
25939
+ "line": 52,
25940
+ "title": "the v1 `capabilities` wrapper fails validation",
25941
+ "explicitId": "openwop.requirement.0169.capabilities-root-closed.wrapper",
25942
+ "citations": [
25943
+ {
25944
+ "section": null,
25945
+ "requirement": "the v1 `capabilities` wrapper MUST fail validation at the closed root (migration row C2.1)",
25946
+ "interpolated": true
25947
+ }
25948
+ ]
25949
+ },
25950
+ {
25951
+ "id": "openwop.it.v2-capabilities-root-closed.a-root-profiles-fails-validation",
25952
+ "file": "v2-capabilities-root-closed.test.ts",
25953
+ "line": 58,
25954
+ "title": "a root `profiles[]` fails validation",
25955
+ "explicitId": "openwop.requirement.0169.capabilities-root-closed.profiles",
25956
+ "citations": [
25957
+ {
25958
+ "section": "spec/v2/core/capabilities.md §7",
25959
+ "requirement": "no `profiles[]` exists at the v2 root; a host that emits one MUST fail schema validation (row C2.10)"
25960
+ }
25961
+ ]
25962
+ },
25963
+ {
25964
+ "id": "openwop.it.v2-capability-record-shape.every-family-record-carries-status-since-and-witness-from-the-wire-legal-sets",
25965
+ "file": "v2-capability-record-shape.test.ts",
25966
+ "line": 66,
25967
+ "title": "every family record carries status, since and witness from the wire-legal sets",
25968
+ "explicitId": "openwop.requirement.0169.capability-record-shape.required-fields",
25969
+ "citations": [
25970
+ {
25971
+ "section": null,
25972
+ "requirement": null,
25973
+ "interpolated": true
25974
+ },
25975
+ {
25976
+ "section": null,
25977
+ "requirement": null,
25978
+ "interpolated": true
25979
+ },
25980
+ {
25981
+ "section": null,
25982
+ "requirement": null,
25983
+ "interpolated": true
25984
+ },
25985
+ {
25986
+ "section": null,
25987
+ "requirement": null,
25988
+ "interpolated": true
25989
+ }
25990
+ ]
25991
+ },
25992
+ {
25993
+ "id": "openwop.it.v2-capability-record-shape.until-is-present-iff-the-record-is-experimental-or-deprecated",
25994
+ "file": "v2-capability-record-shape.test.ts",
25995
+ "line": 79,
25996
+ "title": "`until` is present iff the record is experimental or deprecated",
25997
+ "explicitId": "openwop.requirement.0169.capability-record-shape.until-iff-not-stable",
25998
+ "citations": [
25999
+ {
26000
+ "section": null,
26001
+ "requirement": null,
26002
+ "interpolated": true
26003
+ },
26004
+ {
26005
+ "section": null,
26006
+ "requirement": null,
26007
+ "interpolated": true
26008
+ }
26009
+ ]
26010
+ },
26011
+ {
26012
+ "id": "openwop.it.v2-capability-record-shape.no-advertised-record-carries-an-until-already-in-the-past",
26013
+ "file": "v2-capability-record-shape.test.ts",
26014
+ "line": 94,
26015
+ "title": "no advertised record carries an `until` already in the past",
26016
+ "explicitId": "openwop.requirement.0169.capability-record-shape.until-not-past",
26017
+ "citations": [
26018
+ {
26019
+ "section": "spec/v2/core/capabilities.md §2 (`until` in the past)",
26020
+ "requirement": null,
26021
+ "interpolated": true
26022
+ }
26023
+ ]
26024
+ },
26025
+ {
26026
+ "id": "openwop.it.v2-chain-pin-exact.a-chain-reference-carrying-a-range-core-ai-callprompt-1-is-refused-at-register",
26027
+ "file": "v2-chain-pin-exact.test.ts",
26028
+ "line": 102,
26029
+ "title": "a chain reference carrying a range (core.ai.callPrompt@^1) is refused at register",
26030
+ "explicitId": "openwop.requirement.0177.chain-pin-exact.range-refused",
26031
+ "citations": [
26032
+ {
26033
+ "section": null,
26034
+ "requirement": null,
26035
+ "interpolated": true
26036
+ },
26037
+ {
26038
+ "section": null,
26039
+ "requirement": "the refusal MUST carry an error code in the canonical envelope",
26040
+ "interpolated": true
26041
+ }
26042
+ ]
26043
+ },
26044
+ {
26045
+ "id": "openwop.it.v2-chain-pin-exact.a-chain-reference-pinning-an-exact-version-core-ai-callprompt-1-0-0-registers",
26046
+ "file": "v2-chain-pin-exact.test.ts",
26047
+ "line": 111,
26048
+ "title": "a chain reference pinning an exact version (core.ai.callPrompt@1.0.0) registers",
26049
+ "explicitId": "openwop.requirement.0177.chain-pin-exact.exact-accepted",
26050
+ "citations": [
26051
+ {
26052
+ "section": null,
26053
+ "requirement": null,
26054
+ "interpolated": true
26055
+ }
26056
+ ]
26057
+ },
26058
+ {
26059
+ "id": "openwop.it.v2-coherence-not-in-bundle.every-corpus-ledger-id-has-a-scenario-in-src-coherence-and-none-in-src-scenarios",
26060
+ "file": "v2-coherence-not-in-bundle.test.ts",
26061
+ "line": 60,
26062
+ "title": "every corpus-ledger id has a scenario in src/coherence and none in src/scenarios — the two id sets are disjoint by construction",
26063
+ "explicitId": "openwop.requirement.0168.coherence-not-in-bundle.disjoint-by-construction",
26064
+ "citations": [
26065
+ {
26066
+ "section": null,
26067
+ "requirement": "the corpus ledger MUST carry at least one requirement id",
26068
+ "interpolated": true
26069
+ },
26070
+ {
26071
+ "section": null,
26072
+ "requirement": null,
26073
+ "interpolated": true
26074
+ },
26075
+ {
26076
+ "section": null,
26077
+ "requirement": null,
26078
+ "interpolated": true
26079
+ },
26080
+ {
26081
+ "section": null,
26082
+ "requirement": null,
26083
+ "interpolated": true
26084
+ },
26085
+ {
26086
+ "section": null,
26087
+ "requirement": null,
26088
+ "interpolated": true
26089
+ }
26090
+ ]
26091
+ },
26092
+ {
26093
+ "id": "openwop.it.v2-coherence-not-in-bundle.the-bundle-schema-rejects-a-v3-bundle-carrying-a-corpus-coherence-id-and-accepts",
26094
+ "file": "v2-coherence-not-in-bundle.test.ts",
26095
+ "line": 89,
26096
+ "title": "the bundle schema rejects a v3 bundle carrying a corpus-coherence id and accepts one under openwop.requirement.",
26097
+ "explicitId": "openwop.requirement.0168.coherence-not-in-bundle.schema-forbids-coherence-ids",
26098
+ "citations": [
26099
+ {
26100
+ "section": null,
26101
+ "requirement": null,
26102
+ "interpolated": true
26103
+ },
26104
+ {
26105
+ "section": null,
26106
+ "requirement": "a v3 bundle carrying an openwop.it.spec-corpus-validity. id MUST be rejected by the bundle schema",
26107
+ "interpolated": true
26108
+ }
26109
+ ]
26110
+ },
26111
+ {
26112
+ "id": "openwop.it.v2-compensation-read-projection.get-runs-runid-compensation-on-a-fresh-run-validates-with-status-none",
26113
+ "file": "v2-compensation-read-projection.test.ts",
26114
+ "line": 43,
26115
+ "title": "GET /runs/{runId}/compensation on a fresh run validates with status none",
26116
+ "explicitId": "openwop.requirement.0173.compensation-read-projection",
26117
+ "citations": [
26118
+ {
26119
+ "section": "runs.md §Create",
26120
+ "requirement": "POST /runs MUST answer 201 for the noop fixture"
26121
+ },
26122
+ {
26123
+ "section": "security-defaults.md §Compensation",
26124
+ "requirement": "a host advertising `compensation` MUST serve GET /runs/{runId}/compensation with 200 (RFC 0173 §B — the read projection is the obligation's witness)"
26125
+ },
26126
+ {
26127
+ "section": "compensation-projection.schema.json",
26128
+ "requirement": null,
26129
+ "interpolated": true
26130
+ },
26131
+ {
26132
+ "section": "compensation-projection.schema.json runId",
26133
+ "requirement": "runId MUST echo the run read"
26134
+ },
26135
+ {
26136
+ "section": "compensation-projection.schema.json status",
26137
+ "requirement": "a run with nothing to compensate MUST project status \"none\""
26138
+ },
26139
+ {
26140
+ "section": "compensation-projection.schema.json attempts",
26141
+ "requirement": "no attempt exists before an unwind"
26142
+ }
26143
+ ]
26144
+ },
26145
+ {
26146
+ "id": "openwop.it.v2-compensation-read-projection.an-unknown-run-projects-404-not-found-through-the-canonical-envelope",
26147
+ "file": "v2-compensation-read-projection.test.ts",
26148
+ "line": 74,
26149
+ "title": "an unknown run projects 404 not_found through the canonical envelope",
26150
+ "explicitId": "openwop.requirement.0173.compensation-read-projection.not-found",
26151
+ "citations": [
26152
+ {
26153
+ "section": "openapi.yaml getRunCompensation 404",
26154
+ "requirement": "an unknown runId MUST answer 404"
26155
+ },
26156
+ {
26157
+ "section": "errors.md §Envelope",
26158
+ "requirement": "the 404 MUST carry the registered not_found code in the flat envelope"
26159
+ }
26160
+ ]
26161
+ },
26162
+ {
26163
+ "id": "openwop.it.v2-configurable-closed.the-standalone-schema-rejects-a-dotted-key-and-an-unknown-root-key-and-accepts-t",
26164
+ "file": "v2-configurable-closed.test.ts",
26165
+ "line": 46,
26166
+ "title": "the standalone schema rejects a dotted key and an unknown root key and accepts the versioned control",
26167
+ "explicitId": "openwop.requirement.0171.configurable-closed.schema",
26168
+ "citations": [
26169
+ {
26170
+ "section": null,
26171
+ "requirement": "{ version: 1 } is the smallest valid configurable (version REQUIRED, const 1)",
26172
+ "interpolated": true
26173
+ },
26174
+ {
26175
+ "section": null,
26176
+ "requirement": "a dotted key (`ai.provider` as a string key) MUST fail the closed nested schema",
26177
+ "interpolated": true
26178
+ },
26179
+ {
26180
+ "section": null,
26181
+ "requirement": "an unknown root key MUST fail the closed schema (additionalProperties: false in the standalone artifact)",
26182
+ "interpolated": true
26183
+ },
26184
+ {
26185
+ "section": null,
26186
+ "requirement": "a configurable without `version` MUST fail",
26187
+ "interpolated": true
26188
+ }
26189
+ ]
26190
+ },
26191
+ {
26192
+ "id": "openwop.it.v2-configurable-closed.post-runs-rejects-a-dotted-key-with-400-validation-error",
26193
+ "file": "v2-configurable-closed.test.ts",
26194
+ "line": 54,
26195
+ "title": "POST /runs rejects a dotted key with 400 validation_error",
26196
+ "explicitId": "openwop.requirement.0171.configurable-closed.dotted-key",
26197
+ "citations": [
26198
+ {
26199
+ "section": null,
26200
+ "requirement": "a dotted key inside a section MUST be rejected with 400",
26201
+ "interpolated": true
26202
+ },
26203
+ {
26204
+ "section": null,
26205
+ "requirement": "the refusal code MUST be validation_error",
26206
+ "interpolated": true
26207
+ }
26208
+ ]
26209
+ },
26210
+ {
26211
+ "id": "openwop.it.v2-configurable-closed.post-runs-rejects-an-unknown-root-key-with-400-validation-error",
26212
+ "file": "v2-configurable-closed.test.ts",
26213
+ "line": 61,
26214
+ "title": "POST /runs rejects an unknown root key with 400 validation_error",
26215
+ "explicitId": "openwop.requirement.0171.configurable-closed.unknown-key",
26216
+ "citations": [
26217
+ {
26218
+ "section": null,
26219
+ "requirement": "an unknown root key MUST be rejected with 400",
26220
+ "interpolated": true
26221
+ },
26222
+ {
26223
+ "section": null,
26224
+ "requirement": "the refusal code MUST be validation_error",
26225
+ "interpolated": true
26226
+ }
26227
+ ]
26228
+ },
26229
+ {
26230
+ "id": "openwop.it.v2-dual-stack-negotiation.a-run-created-through-v1-runs-with-no-header-is-readable-through-runs-under-open",
26231
+ "file": "v2-dual-stack-negotiation.test.ts",
26232
+ "line": 68,
26233
+ "title": "a run created through /v1/runs with no header is readable through /runs under OpenWOP-Version: 2.0",
26234
+ "explicitId": "openwop.requirement.0172.dual-stack-negotiation.cross-major-read",
26235
+ "citations": [
26236
+ {
26237
+ "section": "spec/v2/core/versioning.md §1.4",
26238
+ "requirement": "a /v1/ response MUST report the 1.x contract that produced it"
26239
+ },
26240
+ {
26241
+ "section": "spec/v2/core/versioning.md §5",
26242
+ "requirement": "the overlap: a run created through /v1/runs MUST be readable through GET /runs/{runId} with OpenWOP-Version: 2.0"
26243
+ },
26244
+ {
26245
+ "section": "spec/v2/core/versioning.md §5",
26246
+ "requirement": "the v2 read MUST name the same run"
26247
+ },
26248
+ {
26249
+ "section": "spec/v2/core/versioning.md §1.4",
26250
+ "requirement": "the v2 read MUST report the 2.x contract that produced it"
26251
+ }
26252
+ ]
26253
+ },
26254
+ {
26255
+ "id": "openwop.it.v2-dual-stack-negotiation.an-unlisted-major-is-406-protocol-version-unsupported-with-details-protocolversi",
26256
+ "file": "v2-dual-stack-negotiation.test.ts",
26257
+ "line": 83,
26258
+ "title": "an unlisted major is 406 protocol_version_unsupported with details.protocolVersions[]",
26259
+ "explicitId": "openwop.requirement.0172.dual-stack-negotiation.unlisted-major",
26260
+ "citations": [
26261
+ {
26262
+ "section": null,
26263
+ "requirement": "a header naming a major not in protocolVersions[] MUST be answered 406",
26264
+ "interpolated": true
26265
+ },
26266
+ {
26267
+ "section": null,
26268
+ "requirement": "the refusal code MUST be protocol_version_unsupported",
26269
+ "interpolated": true
26270
+ },
26271
+ {
26272
+ "section": null,
26273
+ "requirement": "details.protocolVersions[] MUST echo the advertised list",
26274
+ "interpolated": true
26275
+ }
26276
+ ]
26277
+ },
26278
+ {
26279
+ "id": "openwop.it.v2-dual-stack-negotiation.openwop-version-2-0-on-a-v1-path-is-400-protocol-version-mismatch",
26280
+ "file": "v2-dual-stack-negotiation.test.ts",
26281
+ "line": 94,
26282
+ "title": "OpenWOP-Version: 2.0 on a /v1/ path is 400 protocol_version_mismatch",
26283
+ "explicitId": "openwop.requirement.0172.dual-stack-negotiation.v1-path-mismatch",
26284
+ "citations": [
26285
+ {
26286
+ "section": null,
26287
+ "requirement": "a /v1/… path with OpenWOP-Version other than 1 MUST be answered 400",
26288
+ "interpolated": true
26289
+ },
26290
+ {
26291
+ "section": null,
26292
+ "requirement": "the refusal code MUST be protocol_version_mismatch",
26293
+ "interpolated": true
26294
+ }
26295
+ ]
26296
+ },
26297
+ {
26298
+ "id": "openwop.it.v2-dual-stack-negotiation.every-response-reports-the-contract-that-produced-it",
26299
+ "file": "v2-dual-stack-negotiation.test.ts",
26300
+ "line": 103,
26301
+ "title": "every response reports the contract that produced it",
26302
+ "explicitId": "openwop.requirement.0172.dual-stack-negotiation.response-header",
26303
+ "citations": [
26304
+ {
26305
+ "section": "spec/v2/core/versioning.md §1.4",
26306
+ "requirement": "a header-less /v1/ response MUST carry OpenWOP-Version: 1.<minor> — the contract used, never another (silent downgrade)"
26307
+ },
26308
+ {
26309
+ "section": "spec/v2/core/versioning.md §1.4",
26310
+ "requirement": "a /v1/ response under OpenWOP-Version: 1.0 MUST carry OpenWOP-Version: 1.<minor>"
26311
+ },
26312
+ {
26313
+ "section": "spec/v2/core/versioning.md §1.4",
26314
+ "requirement": "a response under OpenWOP-Version: 2.0 MUST carry OpenWOP-Version: 2.<minor>"
26315
+ },
26316
+ {
26317
+ "section": "spec/v2/core/versioning.md §1.4",
26318
+ "requirement": null,
26319
+ "interpolated": true
26320
+ }
26321
+ ]
26322
+ },
26323
+ {
26324
+ "id": "openwop.it.v2-effect-identity-business-key.get-runs-runid-effects-validates-and-every-row-is-keyed-on-business-identity-or",
26325
+ "file": "v2-effect-identity-business-key.test.ts",
26326
+ "line": 49,
26327
+ "title": "GET /runs/{runId}/effects validates and every row is keyed on business identity or the activity recipe",
26328
+ "explicitId": "openwop.requirement.0173.effect-identity-business-key",
26329
+ "citations": [
26330
+ {
26331
+ "section": "runs.md §Create",
26332
+ "requirement": "POST /runs MUST answer 201 for the noop fixture"
26333
+ },
26334
+ {
26335
+ "section": "security-defaults.md §Layer-2 effect identity",
26336
+ "requirement": "a host advertising `idempotency` MUST serve GET /runs/{runId}/effects with 200 (RFC 0173 §B)"
26337
+ },
26338
+ {
26339
+ "section": "effect-ledger-projection.schema.json",
26340
+ "requirement": null,
26341
+ "interpolated": true
26342
+ },
26343
+ {
26344
+ "section": "effect-ledger-projection.schema.json runId",
26345
+ "requirement": "runId MUST echo the run read"
26346
+ },
26347
+ {
26348
+ "section": "security-defaults.md §Layer-2 effect identity",
26349
+ "requirement": null,
26350
+ "interpolated": true
26351
+ },
26352
+ {
26353
+ "section": "RFC 0150 §B",
26354
+ "requirement": null,
26355
+ "interpolated": true
26356
+ },
26357
+ {
26358
+ "section": "effect-ledger-projection.schema.json providerKey",
26359
+ "requirement": "providerKey is a redaction-safe identity, never credential material"
26360
+ }
26361
+ ]
26362
+ },
26363
+ {
26364
+ "id": "openwop.it.v2-effect-identity-business-key.the-same-provider-key-is-presented-across-two-transport-retries",
26365
+ "file": "v2-effect-identity-business-key.test.ts",
26366
+ "line": 96,
26367
+ "title": "the same provider key is presented across two transport retries",
26368
+ "explicitId": "openwop.requirement.0173.effect-identity-business-key.retry",
26369
+ "citations": [
26370
+ {
26371
+ "section": "spec/v2/core/replay.md §Effect identity",
26372
+ "requirement": null,
26373
+ "interpolated": true
26374
+ },
26375
+ {
26376
+ "section": "spec/v2/core/replay.md §Effect identity",
26377
+ "requirement": null,
26378
+ "interpolated": true
26379
+ }
26380
+ ]
26381
+ },
26382
+ {
26383
+ "id": "openwop.it.v2-effect-seam-manifest.get-host-effect-seams-validates-and-every-row-is-guarded",
26384
+ "file": "v2-effect-seam-manifest.test.ts",
26385
+ "line": 51,
26386
+ "title": "GET /host/effect-seams validates and every row is guarded",
26387
+ "explicitId": "openwop.requirement.0173.effect-seam-manifest",
26388
+ "citations": [
26389
+ {
26390
+ "section": "replay.md §The effect-seam manifest",
26391
+ "requirement": "a host advertising `replay` MUST serve GET /host/effect-seams with 200 (RFC 0173 §C.1)"
26392
+ },
26393
+ {
26394
+ "section": "effect-seam-manifest.schema.json",
26395
+ "requirement": null,
26396
+ "interpolated": true
26397
+ },
26398
+ {
26399
+ "section": "replay.md §The effect-seam manifest",
26400
+ "requirement": "the manifest MUST enumerate at least one outbound effect seam — a node runtime with no effect path does not need `replay`"
26401
+ },
26402
+ {
26403
+ "section": "RFC 0173 §C.1",
26404
+ "requirement": null,
26405
+ "interpolated": true
26406
+ },
26407
+ {
26408
+ "section": "RFC 0173 §C.1",
26409
+ "requirement": null,
26410
+ "interpolated": true
26411
+ },
26412
+ {
26413
+ "section": "effect-seam-manifest.schema.json seams[].kind",
26414
+ "requirement": null,
26415
+ "interpolated": true
26416
+ },
26417
+ {
26418
+ "section": "RFC 0173 §C.1",
26419
+ "requirement": null,
26420
+ "interpolated": true
26421
+ },
26422
+ {
26423
+ "section": "effect-seam-manifest.schema.json seams[].branchReFires",
26424
+ "requirement": null,
26425
+ "interpolated": true
26426
+ }
26427
+ ]
26428
+ },
26429
+ {
26430
+ "id": "openwop.it.v2-effect-seam-manifest.the-replay-facet-names-the-manifest-address-as-the-constant-host-effect-seams",
26431
+ "file": "v2-effect-seam-manifest.test.ts",
26432
+ "line": 106,
26433
+ "title": "the replay facet names the manifest address as the constant /host/effect-seams",
26434
+ "explicitId": "openwop.requirement.0173.effect-seam-manifest.facet",
26435
+ "citations": [
26436
+ {
26437
+ "section": "facets/replay.schema.json effectSeamsManifest",
26438
+ "requirement": "the facet MUST carry the constant \"/host/effect-seams\" (replay.md §The surface)"
26439
+ }
26440
+ ]
26441
+ },
26442
+ {
26443
+ "id": "openwop.it.v2-effect-seam-manifest.driving-one-seam-of-each-kind-observes-no-re-fire-on-replay",
26444
+ "file": "v2-effect-seam-manifest.test.ts",
26445
+ "line": 117,
26446
+ "title": "driving one seam of each kind observes no re-fire on replay",
26447
+ "explicitId": "openwop.requirement.0173.effect-seam-manifest.no-re-fire",
26448
+ "citations": [
26449
+ {
26450
+ "section": "spec/v2/core/replay.md §The effect-seam manifest",
26451
+ "requirement": null,
26452
+ "interpolated": true
26453
+ }
26454
+ ]
26455
+ },
26456
+ {
26457
+ "id": "openwop.it.v2-enum-growth-rule.the-envelope-accepts-a-registered-but-unknown-to-this-suite-vendor-member",
26458
+ "file": "v2-enum-growth-rule.test.ts",
26459
+ "line": 53,
26460
+ "title": "the envelope accepts a registered-but-unknown-to-this-suite vendor member",
26461
+ "explicitId": "openwop.requirement.0171.enum-growth-rule.unknown-member-accepted",
26462
+ "citations": [
26463
+ {
26464
+ "section": null,
26465
+ "requirement": null,
26466
+ "interpolated": true
26467
+ },
26468
+ {
26469
+ "section": null,
26470
+ "requirement": null,
26471
+ "interpolated": true
26472
+ },
26473
+ {
26474
+ "section": null,
26475
+ "requirement": "the vendor branch admits an optional third segment (<org>.<domain>.<name>)",
26476
+ "interpolated": true
26477
+ }
26478
+ ]
26479
+ },
26480
+ {
26481
+ "id": "openwop.it.v2-enum-growth-rule.the-reserved-prefix-and-a-malformed-member-are-rejected",
26482
+ "file": "v2-enum-growth-rule.test.ts",
26483
+ "line": 63,
26484
+ "title": "the reserved prefix and a malformed member are rejected",
26485
+ "explicitId": "openwop.requirement.0171.enum-growth-rule.reserved-rejected",
26486
+ "citations": [
26487
+ {
26488
+ "section": null,
26489
+ "requirement": "openwop. is the only reserved prefix; a type under it that is not in the enum MUST fail",
26490
+ "interpolated": true
26491
+ },
26492
+ {
26493
+ "section": null,
26494
+ "requirement": "a member outside the positive pattern (upper-case) MUST fail",
26495
+ "interpolated": true
26496
+ },
26497
+ {
26498
+ "section": null,
26499
+ "requirement": "a single-segment member MUST fail — every type is <domain>.<name> or <org>.<name>",
26500
+ "interpolated": true
26501
+ }
26502
+ ]
26503
+ },
26504
+ {
26505
+ "id": "openwop.it.v2-era-key.a-run-created-now-carries-eventlogschemaversion-3-on-its-snapshot",
26506
+ "file": "v2-era-key.test.ts",
26507
+ "line": 52,
26508
+ "title": "a run created now carries eventLogSchemaVersion 3 on its snapshot",
26509
+ "explicitId": "openwop.requirement.0176.era-key",
26510
+ "citations": [
26511
+ {
26512
+ "section": null,
26513
+ "requirement": "eventLogSchemaVersion is REQUIRED on every run snapshot (run-snapshot.schema.json) — the era key is never absent on a run a v2 host created",
26514
+ "interpolated": true
26515
+ },
26516
+ {
26517
+ "section": null,
26518
+ "requirement": null,
26519
+ "interpolated": true
26520
+ }
26521
+ ]
26522
+ },
26523
+ {
26524
+ "id": "openwop.it.v2-era-key.discovery-advertises-the-value-the-host-writes-for-new-runs-and-nothing-else",
26525
+ "file": "v2-era-key.test.ts",
26526
+ "line": 67,
26527
+ "title": "discovery advertises the value the host writes for new runs and nothing else",
26528
+ "explicitId": "openwop.requirement.0176.era-key.discovery",
26529
+ "citations": [
26530
+ {
26531
+ "section": "spec/v2/core/versioning.md §2.2",
26532
+ "requirement": null,
26533
+ "interpolated": true
26534
+ },
26535
+ {
26536
+ "section": "spec/v2/core/versioning.md §2.2",
26537
+ "requirement": null,
26538
+ "interpolated": true
26539
+ },
26540
+ {
26541
+ "section": null,
26542
+ "requirement": "the value stamped on a run created now MUST equal the value discovery advertises",
26543
+ "interpolated": true
26544
+ }
26545
+ ]
26546
+ },
26547
+ {
26548
+ "id": "openwop.it.v2-error-registry.an-error-response-is-the-closed-envelope-with-a-registered-code-at-its-registere",
26549
+ "file": "v2-error-registry.test.ts",
26550
+ "line": 52,
26551
+ "title": "an error response is the closed envelope with a registered code at its registered status",
26552
+ "explicitId": "openwop.requirement.0171.error-registry.envelope",
26553
+ "citations": [
26554
+ {
26555
+ "section": null,
26556
+ "requirement": null,
26557
+ "interpolated": true
26558
+ },
26559
+ {
26560
+ "section": null,
26561
+ "requirement": null,
26562
+ "interpolated": true
26563
+ }
26564
+ ]
26565
+ },
26566
+ {
26567
+ "id": "openwop.it.v2-error-registry.retry-timing-is-never-spelled-inside-details",
26568
+ "file": "v2-error-registry.test.ts",
26569
+ "line": 64,
26570
+ "title": "retry timing is never spelled inside details",
26571
+ "explicitId": "openwop.requirement.0171.error-registry.no-retry-details",
26572
+ "citations": [
26573
+ {
26574
+ "section": "spec/v2/core/errors.md §Retry timing",
26575
+ "requirement": "details.retryAfter / retryAfterMs / retryAfterSeconds are not part of v2 and a host MUST NOT emit them — Retry-After is the only retry timing"
26576
+ }
26577
+ ]
26578
+ },
26579
+ {
26580
+ "id": "openwop.it.v2-error-registry.a-429-rate-limited-response-carries-retry-after",
26581
+ "file": "v2-error-registry.test.ts",
26582
+ "line": 72,
26583
+ "title": "a 429 rate_limited response carries Retry-After",
26584
+ "explicitId": "openwop.requirement.0171.error-registry.retry-after",
26585
+ "citations": [
26586
+ {
26587
+ "section": "spec/v2/core/errors.md §Retry timing",
26588
+ "requirement": "a 429 MUST carry the registered code rate_limited"
26589
+ },
26590
+ {
26591
+ "section": "spec/v2/core/errors.md §Retry timing",
26592
+ "requirement": "a 429 rate_limited response MUST set Retry-After"
26593
+ }
26594
+ ]
26595
+ },
26596
+ {
26597
+ "id": "openwop.it.v2-event-type-closed.every-emitted-type-is-a-registered-protocol-type-or-a-vendor-type-under-an-adver",
26598
+ "file": "v2-event-type-closed.test.ts",
26599
+ "line": 71,
26600
+ "title": "every emitted type is a registered protocol type or a vendor type under an advertised org",
26601
+ "explicitId": "openwop.requirement.0171.event-type-closed.type",
26602
+ "citations": [
26603
+ {
26604
+ "section": null,
26605
+ "requirement": null,
26606
+ "interpolated": true
26607
+ }
26608
+ ]
26609
+ },
26610
+ {
26611
+ "id": "openwop.it.v2-event-type-closed.every-emitted-event-validates-as-a-runeventdoc",
26612
+ "file": "v2-event-type-closed.test.ts",
26613
+ "line": 84,
26614
+ "title": "every emitted event validates as a RunEventDoc",
26615
+ "explicitId": "openwop.requirement.0171.event-type-closed.envelope",
26616
+ "citations": [
26617
+ {
26618
+ "section": "spec/v2/core/events.md §The envelope",
26619
+ "requirement": null,
26620
+ "interpolated": true
26621
+ },
26622
+ {
26623
+ "section": "spec/v2/core/events.md §The envelope",
26624
+ "requirement": "sequence is the one ordering field: integer ≥ 0, strictly increasing per run"
26625
+ }
26626
+ ]
26627
+ },
26628
+ {
26629
+ "id": "openwop.it.v2-fork-a-v1-run.the-fork-of-an-era-2-run-is-accepted-and-its-prefix-is-byte-equivalent-to-the-tr",
26630
+ "file": "v2-fork-a-v1-run.test.ts",
26631
+ "line": 62,
26632
+ "title": "the fork of an era-2 run is accepted and its prefix is byte-equivalent to the translated parent",
26633
+ "explicitId": "openwop.requirement.0176.fork-a-v1-run.prefix",
26634
+ "citations": [
26635
+ {
26636
+ "section": null,
26637
+ "requirement": null,
26638
+ "interpolated": true
26639
+ },
26640
+ {
26641
+ "section": null,
26642
+ "requirement": null,
26643
+ "interpolated": true
26644
+ },
26645
+ {
26646
+ "section": null,
26647
+ "requirement": null,
26648
+ "interpolated": true
26649
+ },
26650
+ {
26651
+ "section": "spec/v2/core/replay.md §Byte-equivalence of the prefix",
26652
+ "requirement": null,
26653
+ "interpolated": true
26654
+ }
26655
+ ]
26656
+ },
26657
+ {
26658
+ "id": "openwop.it.v2-fork-a-v1-run.run-started-on-the-fork-carries-the-legacy-subject-where-the-parent-had-none",
26659
+ "file": "v2-fork-a-v1-run.test.ts",
26660
+ "line": 86,
26661
+ "title": "run.started on the fork carries the legacy Subject where the parent had none",
26662
+ "explicitId": "openwop.requirement.0176.fork-a-v1-run.legacy-subject",
26663
+ "citations": [
26664
+ {
26665
+ "section": null,
26666
+ "requirement": "the fork's log MUST carry run.started at its head",
26667
+ "interpolated": true
26668
+ },
26669
+ {
26670
+ "section": "spec/v2/core/identity.md §1.2",
26671
+ "requirement": "run.started on the fork MUST carry owner.subject — the seeded parent had none, so the host stamps the legacy Subject at first v2 read (RFC 0170 §A.3) and the fork copies it verbatim (replay.md §The surface)"
26672
+ },
26673
+ {
26674
+ "section": "spec/v2/core/identity.md §1.2",
26675
+ "requirement": null,
26676
+ "interpolated": true
26677
+ },
26678
+ {
26679
+ "section": "spec/v2/core/persistence.md §Everything else a v1 host persisted",
26680
+ "requirement": null,
26681
+ "interpolated": true
26682
+ }
26683
+ ]
26684
+ },
26685
+ {
26686
+ "id": "openwop.it.v2-form-when-reuses-edge-conditions.a-field-when-is-the-edge-condition-grammar-type-left-right-and-no-other-expressi",
26687
+ "file": "v2-form-when-reuses-edge-conditions.test.ts",
26688
+ "line": 51,
26689
+ "title": "a field `when` is the edge-condition grammar { type, left, right } and no other expression language",
26690
+ "explicitId": "openwop.requirement.0177.form-when-reuses-edge-conditions",
26691
+ "citations": [
26692
+ {
26693
+ "section": null,
26694
+ "requirement": null,
26695
+ "interpolated": true
26696
+ },
26697
+ {
26698
+ "section": null,
26699
+ "requirement": "a `when` outside the edge-condition grammar (a second expression language) MUST be rejected",
26700
+ "interpolated": true
26701
+ },
26702
+ {
26703
+ "section": null,
26704
+ "requirement": "an operator outside expression|equals|notEquals|contains|regex|truthy|falsy MUST be rejected",
26705
+ "interpolated": true
26706
+ }
26707
+ ]
26708
+ },
26709
+ {
26710
+ "id": "openwop.it.v2-header-scheme.no-removed-header-family-appears-on-any-response",
26711
+ "file": "v2-header-scheme.test.ts",
26712
+ "line": 49,
26713
+ "title": "no removed header family appears on any response",
26714
+ "explicitId": "openwop.requirement.0171.header-scheme.no-legacy-headers",
26715
+ "citations": [
26716
+ {
26717
+ "section": null,
26718
+ "requirement": null,
26719
+ "interpolated": true
26720
+ }
26721
+ ]
26722
+ },
26723
+ {
26724
+ "id": "openwop.it.v2-header-scheme.openwop-version-names-the-contract-on-every-response",
26725
+ "file": "v2-header-scheme.test.ts",
26726
+ "line": 58,
26727
+ "title": "OpenWOP-Version names the contract on every response",
26728
+ "explicitId": "openwop.requirement.0171.header-scheme.version-on-every-response",
26729
+ "citations": [
26730
+ {
26731
+ "section": "spec/v2/core/versioning.md §1.4",
26732
+ "requirement": null,
26733
+ "interpolated": true
26734
+ },
26735
+ {
26736
+ "section": "spec/v2/core/versioning.md §1.4",
26737
+ "requirement": null,
26738
+ "interpolated": true
26739
+ }
26740
+ ]
26741
+ },
26742
+ {
26743
+ "id": "openwop.it.v2-id-grammar.every-id-on-the-run-snapshot-matches-its-ids-schema-json-kind",
26744
+ "file": "v2-id-grammar.test.ts",
26745
+ "line": 43,
26746
+ "title": "every id on the run snapshot matches its ids.schema.json kind",
26747
+ "explicitId": "openwop.requirement.0170.id-grammar.snapshot",
26748
+ "citations": [
26749
+ {
26750
+ "section": null,
26751
+ "requirement": null,
26752
+ "interpolated": true
26753
+ },
26754
+ {
26755
+ "section": null,
26756
+ "requirement": null,
26757
+ "interpolated": true
26758
+ }
26759
+ ]
26760
+ },
26761
+ {
26762
+ "id": "openwop.it.v2-id-grammar.every-id-on-the-run-events-matches-its-ids-schema-json-kind",
26763
+ "file": "v2-id-grammar.test.ts",
26764
+ "line": 53,
26765
+ "title": "every id on the run events matches its ids.schema.json kind",
26766
+ "explicitId": "openwop.requirement.0170.id-grammar.events",
26767
+ "citations": [
26768
+ {
26769
+ "section": null,
26770
+ "requirement": null,
26771
+ "interpolated": true
26772
+ },
26773
+ {
26774
+ "section": null,
26775
+ "requirement": "every event MUST carry the run's own runId",
26776
+ "interpolated": true
26777
+ }
26778
+ ]
26779
+ },
26780
+ {
26781
+ "id": "openwop.it.v2-id-grammar.a-run-id-whose-tenant-segment-is-not-the-caller-s-is-refused",
26782
+ "file": "v2-id-grammar.test.ts",
26783
+ "line": 68,
26784
+ "title": "a run id whose tenant segment is not the caller's is refused",
26785
+ "explicitId": "openwop.requirement.0170.id-grammar.tenant-binding",
26786
+ "citations": [
26787
+ {
26788
+ "section": null,
26789
+ "requirement": null,
26790
+ "interpolated": true
26791
+ },
26792
+ {
26793
+ "section": null,
26794
+ "requirement": null,
26795
+ "interpolated": true
26796
+ },
26797
+ {
26798
+ "section": "spec/v2/core/errors.md",
26799
+ "requirement": "the code MUST be answered with its registered HTTP status (id_tenant_mismatch → 403, not_found → 404)"
26800
+ }
26801
+ ]
26802
+ },
26803
+ {
26804
+ "id": "openwop.it.v2-idempotency-key-grammar.a-22-character-key-inside-the-grammar-is-accepted",
26805
+ "file": "v2-idempotency-key-grammar.test.ts",
26806
+ "line": 38,
26807
+ "title": "a 22+ character key inside the grammar is accepted",
26808
+ "explicitId": "openwop.requirement.0170.idempotency-key-grammar.valid-accepted",
26809
+ "citations": [
26810
+ {
26811
+ "section": null,
26812
+ "requirement": "the suite's key MUST itself be inside ^[A-Za-z0-9._~-]{22,128}$",
26813
+ "interpolated": true
26814
+ },
26815
+ {
26816
+ "section": null,
26817
+ "requirement": "a UUIDv4-strength key in base64url form satisfies the grammar and MUST NOT be refused as idempotency_key_invalid",
26818
+ "interpolated": true
26819
+ }
26820
+ ]
26821
+ },
26822
+ {
26823
+ "id": "openwop.it.v2-idempotency-key-grammar.a-key-outside-the-grammar-is-refused-with-400-idempotency-key-invalid",
26824
+ "file": "v2-idempotency-key-grammar.test.ts",
26825
+ "line": 50,
26826
+ "title": "a key outside the grammar is refused with 400 idempotency_key_invalid",
26827
+ "explicitId": "openwop.requirement.0170.idempotency-key-grammar.invalid-refused",
26828
+ "citations": [
26829
+ {
26830
+ "section": null,
26831
+ "requirement": "a host MUST reject an Idempotency-Key outside ^[A-Za-z0-9._~-]{22,128}$ with 400",
26832
+ "interpolated": true
26833
+ },
26834
+ {
26835
+ "section": null,
26836
+ "requirement": "the refusal code MUST be idempotency_key_invalid",
26837
+ "interpolated": true
26838
+ }
26839
+ ]
26840
+ },
26841
+ {
26842
+ "id": "openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused",
26843
+ "file": "v2-interrupt-token-scheme.test.ts",
26844
+ "line": 37,
26845
+ "title": "a token without the ow2. prefix is refused",
26846
+ "explicitId": "openwop.requirement.0170.interrupt-token-scheme.unprefixed-refused",
26847
+ "citations": [
26848
+ {
26849
+ "section": null,
26850
+ "requirement": null,
26851
+ "interpolated": true
26852
+ },
26853
+ {
26854
+ "section": "spec/v2/core/interrupt.md §Tokens",
26855
+ "requirement": null,
26856
+ "interpolated": true
26857
+ }
26858
+ ]
26859
+ },
26860
+ {
26861
+ "id": "openwop.it.v2-interrupt-token-scheme.a-well-formed-token-under-a-kid-the-host-does-not-hold-is-401-interrupt-token-in",
26862
+ "file": "v2-interrupt-token-scheme.test.ts",
26863
+ "line": 46,
26864
+ "title": "a well-formed token under a kid the host does not hold is 401 interrupt_token_invalid",
26865
+ "explicitId": "openwop.requirement.0170.interrupt-token-scheme.unheld-kid-refused",
26866
+ "citations": [
26867
+ {
26868
+ "section": null,
26869
+ "requirement": "a host MUST refuse a token whose kid it does not hold with 401",
26870
+ "interpolated": true
26871
+ },
26872
+ {
26873
+ "section": null,
26874
+ "requirement": "the refusal code MUST be interrupt_token_invalid (one code per state — never not_found for a token the host cannot verify)",
26875
+ "interpolated": true
26876
+ }
26877
+ ]
26878
+ },
26879
+ {
26880
+ "id": "openwop.it.v2-lane-issuer-advertised.every-auth-lanes-member-names-lane-issuers-revocation-and-minimumassurance",
26881
+ "file": "v2-lane-issuer-advertised.test.ts",
26882
+ "line": 36,
26883
+ "title": "every auth.lanes[] member names lane, issuers[], revocation and minimumAssurance",
26884
+ "explicitId": "openwop.requirement.0170.lane-issuer-advertised.members",
26885
+ "citations": [
26886
+ {
26887
+ "section": null,
26888
+ "requirement": null,
26889
+ "interpolated": true
26890
+ },
26891
+ {
26892
+ "section": "spec/v2/core/identity.md §2.2",
26893
+ "requirement": null,
26894
+ "interpolated": true
26895
+ },
26896
+ {
26897
+ "section": "spec/v2/core/identity.md §2.2",
26898
+ "requirement": null,
26899
+ "interpolated": true
26900
+ },
26901
+ {
26902
+ "section": "spec/v2/core/identity.md §2.3",
26903
+ "requirement": null,
26904
+ "interpolated": true
26905
+ },
26906
+ {
26907
+ "section": "spec/v2/core/identity.md §2.4",
26908
+ "requirement": null,
26909
+ "interpolated": true
26910
+ }
26911
+ ]
26912
+ },
26913
+ {
26914
+ "id": "openwop.it.v2-lane-issuer-advertised.a-windowed-revocation-rule-advertises-revocationwindowseconds",
26915
+ "file": "v2-lane-issuer-advertised.test.ts",
26916
+ "line": 52,
26917
+ "title": "a windowed revocation rule advertises revocationWindowSeconds",
26918
+ "explicitId": "openwop.requirement.0170.lane-issuer-advertised.window",
26919
+ "citations": [
26920
+ {
26921
+ "section": "spec/v2/core/identity.md §2.2",
26922
+ "requirement": null,
26923
+ "interpolated": true
26924
+ }
26925
+ ]
26926
+ },
26927
+ {
26928
+ "id": "openwop.it.v2-legacy-profiles-absent.no-legacy-id-appears-in-a2a-profiles-or-mcp-profiles-and-each-id-matches-its-fac",
26929
+ "file": "v2-legacy-profiles-absent.test.ts",
26930
+ "line": 41,
26931
+ "title": "no -legacy id appears in a2a.profiles or mcp.profiles and each id matches its facet pattern",
26932
+ "explicitId": "openwop.requirement.0175.legacy-profiles-absent",
26933
+ "citations": [
26934
+ {
26935
+ "section": "interop.md §Legacy profiles are absent",
26936
+ "requirement": null,
26937
+ "interpolated": true
26938
+ },
26939
+ {
26940
+ "section": null,
26941
+ "requirement": null,
26942
+ "interpolated": true
26943
+ },
26944
+ {
26945
+ "section": null,
26946
+ "requirement": null,
26947
+ "interpolated": true
26948
+ }
26949
+ ]
26950
+ },
26951
+ {
26952
+ "id": "openwop.it.v2-legacy-profiles-absent.no-root-profiles-exists-in-the-v2-representation",
26953
+ "file": "v2-legacy-profiles-absent.test.ts",
26954
+ "line": 70,
26955
+ "title": "no root profiles[] exists in the v2 representation",
26956
+ "explicitId": "openwop.requirement.0175.legacy-profiles-absent.no-root-profiles",
26957
+ "citations": [
26958
+ {
26959
+ "section": "capabilities.md §Profiles",
26960
+ "requirement": "no `profiles[]` exists at the v2 root — a profile is a predicate over the declaration file, not an advertisement (RFC 0169 §C.1)"
26961
+ }
26962
+ ]
26963
+ },
26964
+ {
26965
+ "id": "openwop.it.v2-manifest-ceiling-refused.an-engines-openwop-range-with-no-upper-bound-1-0-0-reads-2-0-0-and-is-refused-at",
26966
+ "file": "v2-manifest-ceiling-refused.test.ts",
26967
+ "line": 105,
26968
+ "title": "an engines.openwop range with no upper bound (>=1.0.0) reads <2.0.0 and is refused at install with pack_engine_unsupported",
26969
+ "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.unbounded",
26970
+ "citations": [
26971
+ {
26972
+ "section": null,
26973
+ "requirement": "an unbounded range does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported",
26974
+ "interpolated": true
26975
+ },
26976
+ {
26977
+ "section": null,
26978
+ "requirement": "the refusal code MUST be pack_engine_unsupported (not pack_runtime_requirement_unmet)",
26979
+ "interpolated": true
26980
+ }
26981
+ ]
26982
+ },
26983
+ {
26984
+ "id": "openwop.it.v2-manifest-ceiling-refused.a-v1-ceiling-1-0-0-2-0-0-is-refused-at-install-with-pack-engine-unsupported",
26985
+ "file": "v2-manifest-ceiling-refused.test.ts",
26986
+ "line": 114,
26987
+ "title": "a v1 ceiling (>=1.0.0 <2.0.0) is refused at install with pack_engine_unsupported",
26988
+ "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.v1-ceiling",
26989
+ "citations": [
26990
+ {
26991
+ "section": null,
26992
+ "requirement": "a <2.0.0 ceiling does not admit protocol major 2 and MUST be refused with 400 pack_engine_unsupported",
26993
+ "interpolated": true
26994
+ },
26995
+ {
26996
+ "section": null,
26997
+ "requirement": "the refusal code MUST be pack_engine_unsupported",
26998
+ "interpolated": true
26999
+ }
27000
+ ]
27001
+ },
27002
+ {
27003
+ "id": "openwop.it.v2-manifest-ceiling-refused.a-range-admitting-the-host-major-2-0-0-3-0-0-installs",
27004
+ "file": "v2-manifest-ceiling-refused.test.ts",
27005
+ "line": 123,
27006
+ "title": "a range admitting the host major (>=2.0.0 <3.0.0) installs",
27007
+ "explicitId": "openwop.requirement.0177.manifest-ceiling-refused.v2-installs",
27008
+ "citations": [
27009
+ {
27010
+ "section": null,
27011
+ "requirement": null,
27012
+ "interpolated": true
27013
+ }
27014
+ ]
27015
+ },
27016
+ {
27017
+ "id": "openwop.it.v2-manifest-hatch-carried.an-x-field-inside-agents-0-of-a-node-pack-is-ignored-not-rejected-the-pack-insta",
27018
+ "file": "v2-manifest-hatch-carried.test.ts",
27019
+ "line": 85,
27020
+ "title": "an x- field inside agents[0] of a node pack is ignored, not rejected — the pack installs",
27021
+ "explicitId": "openwop.requirement.0177.manifest-hatch-carried.agents-x-field",
27022
+ "citations": [
27023
+ {
27024
+ "section": null,
27025
+ "requirement": null,
27026
+ "interpolated": true
27027
+ }
27028
+ ]
27029
+ },
27030
+ {
27031
+ "id": "openwop.it.v2-manifest-hatch-carried.an-x-field-inside-a-prompt-template-of-a-prompt-pack-is-ignored-not-rejected-the",
27032
+ "file": "v2-manifest-hatch-carried.test.ts",
27033
+ "line": 103,
27034
+ "title": "an x- field inside a prompt template of a prompt pack is ignored, not rejected — the pack installs",
27035
+ "explicitId": "openwop.requirement.0177.manifest-hatch-carried.prompt-template-x-field",
27036
+ "citations": [
27037
+ {
27038
+ "section": null,
27039
+ "requirement": null,
27040
+ "interpolated": true
27041
+ }
27042
+ ]
27043
+ },
27044
+ {
27045
+ "id": "openwop.it.v2-min-client-version.a-client-below-minclientversion-is-refused-with-426-client-version-unsupported",
27046
+ "file": "v2-min-client-version.test.ts",
27047
+ "line": 35,
27048
+ "title": "a client below minClientVersion is refused with 426 client_version_unsupported",
27049
+ "explicitId": "openwop.requirement.0172.min-client-version",
27050
+ "citations": [
27051
+ {
27052
+ "section": null,
27053
+ "requirement": "minClientVersion MUST use the <major>.<minor> grammar (axis 15, as axis 1)",
27054
+ "interpolated": true
27055
+ },
27056
+ {
27057
+ "section": null,
27058
+ "requirement": "a 426 refusal MUST carry client_version_unsupported",
27059
+ "interpolated": true
27060
+ },
27061
+ {
27062
+ "section": "spec/v2/core/errors.md §The envelope",
27063
+ "requirement": null,
27064
+ "interpolated": true
27065
+ }
27066
+ ]
27067
+ },
27068
+ {
27069
+ "id": "openwop.it.v2-minimum-version-refused.an-a2a-peer-offering-only-a-version-below-minimumversion-is-refused",
27070
+ "file": "v2-minimum-version-refused.test.ts",
27071
+ "line": 86,
27072
+ "title": "an A2A peer offering only a version below minimumVersion is refused",
27073
+ "explicitId": "openwop.requirement.0175.minimum-version-refused",
27074
+ "citations": [
27075
+ {
27076
+ "section": "interop.md §The floor",
27077
+ "requirement": null,
27078
+ "interpolated": true
27079
+ }
27080
+ ]
27081
+ },
27082
+ {
27083
+ "id": "openwop.it.v2-minimum-version-refused.an-mcp-server-offering-only-a-revision-below-minimumrevision-is-refused",
27084
+ "file": "v2-minimum-version-refused.test.ts",
27085
+ "line": 114,
27086
+ "title": "an MCP server offering only a revision below minimumRevision is refused",
27087
+ "explicitId": "openwop.requirement.0175.minimum-version-refused.mcp",
27088
+ "citations": [
27089
+ {
27090
+ "section": "interop.md §The floor",
27091
+ "requirement": null,
27092
+ "interpolated": true
27093
+ }
27094
+ ]
27095
+ },
27096
+ {
27097
+ "id": "openwop.it.v2-mrtr-rounds-ceiling.mcp-mrtr-maxrounds-is-an-integer-ceiling-in-1-16",
27098
+ "file": "v2-mrtr-rounds-ceiling.test.ts",
27099
+ "line": 46,
27100
+ "title": "mcp.mrtr.maxRounds is an integer ceiling in 1..16",
27101
+ "explicitId": "openwop.requirement.0175.mrtr-rounds-ceiling",
27102
+ "citations": [
27103
+ {
27104
+ "section": "facets/mcp.schema.json mrtr.maxRounds",
27105
+ "requirement": null,
27106
+ "interpolated": true
27107
+ }
27108
+ ]
27109
+ },
27110
+ {
27111
+ "id": "openwop.it.v2-mrtr-rounds-ceiling.round-maxrounds-1-is-refused-with-mcp-mrtr-rounds-exceeded",
27112
+ "file": "v2-mrtr-rounds-ceiling.test.ts",
27113
+ "line": 59,
27114
+ "title": "round maxRounds + 1 is refused with mcp_mrtr_rounds_exceeded",
27115
+ "explicitId": "openwop.requirement.0175.mrtr-rounds-ceiling.refused",
27116
+ "citations": [
27117
+ {
27118
+ "section": "interop.md §The MCP round ceiling",
27119
+ "requirement": null,
27120
+ "interpolated": true
27121
+ },
27122
+ {
27123
+ "section": "errors.json mcp_mrtr_rounds_exceeded",
27124
+ "requirement": null,
27125
+ "interpolated": true
27126
+ },
27127
+ {
27128
+ "section": "interop.md §The MCP round ceiling",
27129
+ "requirement": null,
27130
+ "interpolated": true
27131
+ }
27132
+ ]
27133
+ },
27134
+ {
27135
+ "id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-a2a-exchange-cannot-lower-the-version-below-preferredversion",
27136
+ "file": "v2-negotiation-authenticated.test.ts",
27137
+ "line": 86,
27138
+ "title": "an unauthenticated A2A exchange cannot lower the version below preferredVersion",
27139
+ "explicitId": null,
27140
+ "citations": []
27141
+ },
27142
+ {
27143
+ "id": "openwop.it.v2-negotiation-authenticated.an-unauthenticated-mcp-exchange-cannot-lower-the-revision-below-preferredversion",
27144
+ "file": "v2-negotiation-authenticated.test.ts",
27145
+ "line": 106,
27146
+ "title": "an unauthenticated MCP exchange cannot lower the revision below preferredVersion",
27147
+ "explicitId": null,
27148
+ "citations": []
27149
+ },
27150
+ {
27151
+ "id": "openwop.it.v2-negotiation-decided-emitted.an-a2a-exchange-leaves-negotiation-decided-on-the-host-log",
27152
+ "file": "v2-negotiation-decided-emitted.test.ts",
27153
+ "line": 143,
27154
+ "title": "an A2A exchange leaves negotiation.decided on the host log",
27155
+ "explicitId": null,
27156
+ "citations": []
27157
+ },
27158
+ {
27159
+ "id": "openwop.it.v2-negotiation-decided-emitted.an-mcp-exchange-leaves-negotiation-decided-on-the-host-log",
27160
+ "file": "v2-negotiation-decided-emitted.test.ts",
27161
+ "line": 146,
27162
+ "title": "an MCP exchange leaves negotiation.decided on the host log",
27163
+ "explicitId": null,
27164
+ "citations": []
27165
+ },
27166
+ {
27167
+ "id": "openwop.it.v2-no-transport-advertisement.the-v2-root-carries-no-supportedtransports-and-no-grpc-block",
27168
+ "file": "v2-no-transport-advertisement.test.ts",
27169
+ "line": 29,
27170
+ "title": "the v2 root carries no supportedTransports and no grpc block",
27171
+ "explicitId": "openwop.requirement.0175.no-transport-advertisement",
27172
+ "citations": [
27173
+ {
27174
+ "section": "interop.md §REST is the wire",
27175
+ "requirement": "a v2 host MUST NOT advertise a transport list — `supportedTransports` does not exist in v2 (RFC 0175 §B.1, row C8.2)"
27176
+ },
27177
+ {
27178
+ "section": "interop.md §gRPC",
27179
+ "requirement": "a v2 host MUST NOT advertise a `grpc` capability block — an unwitnessable family is not advertisable (RFC 0175 §A.1, row C8.3)"
27180
+ },
27181
+ {
27182
+ "section": "interop.md §The facets",
27183
+ "requirement": null,
27184
+ "interpolated": true
27185
+ },
27186
+ {
27187
+ "section": "capabilities.schema.json (closed root)",
27188
+ "requirement": null,
27189
+ "interpolated": true
27190
+ }
27191
+ ]
27192
+ },
27193
+ {
27194
+ "id": "openwop.it.v2-owner-subject-required.owner-subject-is-present-and-validates-against-subject-schema-json",
27195
+ "file": "v2-owner-subject-required.test.ts",
27196
+ "line": 54,
27197
+ "title": "owner.subject is present and validates against subject.schema.json",
27198
+ "explicitId": "openwop.requirement.0170.owner-subject-required.subject",
27199
+ "citations": [
27200
+ {
27201
+ "section": null,
27202
+ "requirement": "RunSnapshot.owner.subject is REQUIRED",
27203
+ "interpolated": true
27204
+ },
27205
+ {
27206
+ "section": null,
27207
+ "requirement": null,
27208
+ "interpolated": true
27209
+ },
27210
+ {
27211
+ "section": null,
27212
+ "requirement": "RunSnapshot.owner.tenant is REQUIRED",
27213
+ "interpolated": true
27214
+ }
27215
+ ]
27216
+ },
27217
+ {
27218
+ "id": "openwop.it.v2-owner-subject-required.owner-carries-no-principal-principalkind",
27219
+ "file": "v2-owner-subject-required.test.ts",
27220
+ "line": 64,
27221
+ "title": "owner carries no principal / principalKind",
27222
+ "explicitId": "openwop.requirement.0170.owner-subject-required.no-principal",
27223
+ "citations": [
27224
+ {
27225
+ "section": null,
27226
+ "requirement": "`principal` is removed from RunSnapshot.owner — subject.subjectId carries it",
27227
+ "interpolated": true
27228
+ },
27229
+ {
27230
+ "section": null,
27231
+ "requirement": "`principalKind` is removed from RunSnapshot.owner — subject.kind carries it",
27232
+ "interpolated": true
27233
+ },
27234
+ {
27235
+ "section": null,
27236
+ "requirement": "owner is the closed block { tenant, workspace?, subject }",
27237
+ "interpolated": true
27238
+ }
27239
+ ]
27240
+ },
27241
+ {
27242
+ "id": "openwop.it.v2-pack-isolation.sandbox-isolationmodel-names-a-real-mechanism-never-node-vm",
27243
+ "file": "v2-pack-isolation.test.ts",
27244
+ "line": 70,
27245
+ "title": "sandbox.isolationModel names a real mechanism, never node:vm",
27246
+ "explicitId": "openwop.requirement.0173.pack-isolation",
27247
+ "citations": [
27248
+ {
27249
+ "section": "facets/sandbox.schema.json isolationModel",
27250
+ "requirement": "isolationModel MUST NOT be node:vm — it is escapable by design (RFC 0035 §130) and is not a v2 value (RFC 0173 §D.1)"
27251
+ },
27252
+ {
27253
+ "section": "facets/sandbox.schema.json isolationModel",
27254
+ "requirement": null,
27255
+ "interpolated": true
27256
+ }
27257
+ ]
27258
+ },
27259
+ {
27260
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-fs-gated-a-host-filesystem-read-is-refused",
27261
+ "file": "v2-pack-isolation.test.ts",
27262
+ "line": 84,
27263
+ "title": "node-pack-sandbox-fs-gated: a host filesystem read is refused",
27264
+ "explicitId": null,
27265
+ "citations": []
27266
+ },
27267
+ {
27268
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-fs-gated-a-host-filesystem-write-is-refused",
27269
+ "file": "v2-pack-isolation.test.ts",
27270
+ "line": 91,
27271
+ "title": "node-pack-sandbox-fs-gated: a host filesystem write is refused",
27272
+ "explicitId": null,
27273
+ "citations": []
27274
+ },
27275
+ {
27276
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-no-env-the-host-environment-does-not-leak",
27277
+ "file": "v2-pack-isolation.test.ts",
27278
+ "line": 98,
27279
+ "title": "node-pack-sandbox-no-env: the host environment does not leak",
27280
+ "explicitId": null,
27281
+ "citations": []
27282
+ },
27283
+ {
27284
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-network-gated-ungated-network-egress-is-refused",
27285
+ "file": "v2-pack-isolation.test.ts",
27286
+ "line": 105,
27287
+ "title": "node-pack-sandbox-network-gated: ungated network egress is refused",
27288
+ "explicitId": null,
27289
+ "citations": []
27290
+ },
27291
+ {
27292
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-no-process-host-process-access-is-refused",
27293
+ "file": "v2-pack-isolation.test.ts",
27294
+ "line": 112,
27295
+ "title": "node-pack-sandbox-no-process: host process access is refused",
27296
+ "explicitId": null,
27297
+ "citations": []
27298
+ },
27299
+ {
27300
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-timeout-exceeding-wallclocklimitms-fails-with-sandbox-timeout",
27301
+ "file": "v2-pack-isolation.test.ts",
27302
+ "line": 119,
27303
+ "title": "node-pack-sandbox-timeout: exceeding wallClockLimitMs fails with sandbox_timeout",
27304
+ "explicitId": "openwop.requirement.0173.pack-isolation.timeout",
27305
+ "citations": [
27306
+ {
27307
+ "section": "security-defaults.md §Sandbox isolation",
27308
+ "requirement": "node-pack-sandbox-timeout: a wall-clock overrun MUST fail with sandbox_timeout"
27309
+ }
27310
+ ]
27311
+ },
27312
+ {
27313
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-memory-cap-exceeding-memorylimitbytes-fails-with-sandbox-memor",
27314
+ "file": "v2-pack-isolation.test.ts",
27315
+ "line": 126,
27316
+ "title": "node-pack-sandbox-memory-cap: exceeding memoryLimitBytes fails with sandbox_memory_exceeded",
27317
+ "explicitId": "openwop.requirement.0173.pack-isolation.memory-cap",
27318
+ "citations": [
27319
+ {
27320
+ "section": "security-defaults.md §Sandbox isolation",
27321
+ "requirement": "node-pack-sandbox-memory-cap: a memory overrun MUST fail with sandbox_memory_exceeded"
27322
+ }
27323
+ ]
27324
+ },
27325
+ {
27326
+ "id": "openwop.it.v2-pack-isolation.node-pack-sandbox-isolated-context-a-pack-cannot-mutate-state-another-invocation",
27327
+ "file": "v2-pack-isolation.test.ts",
27328
+ "line": 133,
27329
+ "title": "node-pack-sandbox-isolated-context: a pack cannot mutate state another invocation sees",
27330
+ "explicitId": "openwop.requirement.0173.pack-isolation.isolated-context",
27331
+ "citations": [
27332
+ {
27333
+ "section": "host-sample-test-seams.md §8",
27334
+ "requirement": "misbehave.cross-pack-mutate is not a failure mode — it MUST return a result"
27335
+ },
27336
+ {
27337
+ "section": "security-defaults.md §Sandbox isolation",
27338
+ "requirement": "node-pack-sandbox-isolated-context: result.shared MUST equal 1 on every invocation — a mutation MUST NOT leak into a fresh context"
27339
+ }
27340
+ ]
27341
+ },
27342
+ {
27343
+ "id": "openwop.it.v2-payload-registry-closed.every-registered-event-carries-a-payload-that-validates-against-its-typeindex-en",
27344
+ "file": "v2-payload-registry-closed.test.ts",
27345
+ "line": 94,
27346
+ "title": "every registered event carries a payload that validates against its _typeIndex entry",
27347
+ "explicitId": "openwop.requirement.0171.payload-registry-closed",
27348
+ "citations": [
27349
+ {
27350
+ "section": null,
27351
+ "requirement": null,
27352
+ "interpolated": true
27353
+ },
27354
+ {
27355
+ "section": null,
27356
+ "requirement": null,
27357
+ "interpolated": true
27358
+ }
27359
+ ]
27360
+ },
27361
+ {
27362
+ "id": "openwop.it.v2-peer-dependency-declared.a-peerdependencies-key-the-declaration-file-does-not-name-is-refused-with-pack-p",
27363
+ "file": "v2-peer-dependency-declared.test.ts",
27364
+ "line": 104,
27365
+ "title": "a peerDependencies key the declaration file does not name is refused with pack_peer_dependency_undefined",
27366
+ "explicitId": "openwop.requirement.0177.peer-dependency-declared.undefined-key",
27367
+ "citations": [
27368
+ {
27369
+ "section": null,
27370
+ "requirement": "a key absent from spec/v2/declaration.json MUST be refused with 400 pack_peer_dependency_undefined",
27371
+ "interpolated": true
27372
+ },
27373
+ {
27374
+ "section": null,
27375
+ "requirement": "the refusal code MUST be pack_peer_dependency_undefined",
27376
+ "interpolated": true
27377
+ }
27378
+ ]
27379
+ },
27380
+ {
27381
+ "id": "openwop.it.v2-peer-dependency-declared.an-alias-table-row-host-fs-fs-resolves-through-the-overlap-and-the-pack-installs",
27382
+ "file": "v2-peer-dependency-declared.test.ts",
27383
+ "line": 113,
27384
+ "title": "an alias-table row (host.fs → fs) resolves through the overlap and the pack installs",
27385
+ "explicitId": "openwop.requirement.0177.peer-dependency-declared.alias-overlap",
27386
+ "citations": [
27387
+ {
27388
+ "section": "packs.md §\"The alias table\" (RFC 0177 §B.2)",
27389
+ "requirement": null,
27390
+ "interpolated": true
27391
+ }
27392
+ ]
27393
+ },
27394
+ {
27395
+ "id": "openwop.it.v2-pinned-run-disposition.a-pin-naming-a-change-id-the-host-does-not-implement-is-cancelled-with-v1-pin-un",
27396
+ "file": "v2-pinned-run-disposition.test.ts",
27397
+ "line": 76,
27398
+ "title": "a pin naming a change id the host does not implement is cancelled with v1_pin_unsupported / v2-cutover",
27399
+ "explicitId": "openwop.requirement.0176.pinned-run-disposition.cancelled",
27400
+ "citations": [
27401
+ {
27402
+ "section": null,
27403
+ "requirement": null,
27404
+ "interpolated": true
27405
+ },
27406
+ {
27407
+ "section": null,
27408
+ "requirement": "the cancellation MUST be an event on the run's own log (run.cancelled), not a silent status flip",
27409
+ "interpolated": true
27410
+ },
27411
+ {
27412
+ "section": "run-event-payloads.schema.json runCancelled.reason",
27413
+ "requirement": null,
27414
+ "interpolated": true
27415
+ },
27416
+ {
27417
+ "section": "run-event-payloads.schema.json runCancelled.cancelledBy",
27418
+ "requirement": null,
27419
+ "interpolated": true
27420
+ },
27421
+ {
27422
+ "section": null,
27423
+ "requirement": "the version.pinned row MUST survive the cancellation — the log is preserved (adversarial review 4)",
27424
+ "interpolated": true
27425
+ },
27426
+ {
27427
+ "section": null,
27428
+ "requirement": "version.pinned is never rewritten: the pin still names the change id it was seeded with",
27429
+ "interpolated": true
27430
+ }
27431
+ ]
27432
+ },
27433
+ {
27434
+ "id": "openwop.it.v2-pinned-run-disposition.a-pin-naming-a-change-id-the-host-still-implements-continues-under-the-reader-ru",
27435
+ "file": "v2-pinned-run-disposition.test.ts",
27436
+ "line": 101,
27437
+ "title": "a pin naming a change id the host still implements continues under the reader rule with the pin verbatim",
27438
+ "explicitId": "openwop.requirement.0176.pinned-run-disposition.continued",
27439
+ "citations": [
27440
+ {
27441
+ "section": null,
27442
+ "requirement": null,
27443
+ "interpolated": true
27444
+ },
27445
+ {
27446
+ "section": null,
27447
+ "requirement": null,
27448
+ "interpolated": true
27449
+ },
27450
+ {
27451
+ "section": null,
27452
+ "requirement": "the pin is honoured verbatim — version.pinned reads back with the seeded changeId and version",
27453
+ "interpolated": true
27454
+ }
27455
+ ]
27456
+ },
27457
+ {
27458
+ "id": "openwop.it.v2-poll-cursor-v2.the-response-is-the-closed-runid-events-lastsequence-status-isterminal",
27459
+ "file": "v2-poll-cursor-v2.test.ts",
27460
+ "line": 60,
27461
+ "title": "the response is the closed { runId, events, lastSequence, status, isTerminal }",
27462
+ "explicitId": "openwop.requirement.0171.poll-cursor-v2.shape",
27463
+ "citations": [
27464
+ {
27465
+ "section": null,
27466
+ "requirement": "pollRunEvents MUST answer 200",
27467
+ "interpolated": true
27468
+ },
27469
+ {
27470
+ "section": null,
27471
+ "requirement": "the poll response MUST be exactly { runId, events, lastSequence, status, isTerminal } (closed)",
27472
+ "interpolated": true
27473
+ },
27474
+ {
27475
+ "section": null,
27476
+ "requirement": "runId MUST echo the polled run",
27477
+ "interpolated": true
27478
+ },
27479
+ {
27480
+ "section": null,
27481
+ "requirement": "events MUST be an array",
27482
+ "interpolated": true
27483
+ },
27484
+ {
27485
+ "section": null,
27486
+ "requirement": "lastSequence is the highest sequence in the log (−1 when empty)",
27487
+ "interpolated": true
27488
+ },
27489
+ {
27490
+ "section": null,
27491
+ "requirement": "status is the snapshot status",
27492
+ "interpolated": true
27493
+ },
27494
+ {
27495
+ "section": null,
27496
+ "requirement": "isTerminal is a boolean",
27497
+ "interpolated": true
27498
+ },
27499
+ {
27500
+ "section": null,
27501
+ "requirement": "lastSequence MUST equal the highest sequence returned when the response carries the whole log",
27502
+ "interpolated": true
27503
+ }
27504
+ ]
27505
+ },
27506
+ {
27507
+ "id": "openwop.it.v2-poll-cursor-v2.omitting-the-cursor-returns-from-the-first-event-sequence-0",
27508
+ "file": "v2-poll-cursor-v2.test.ts",
27509
+ "line": 77,
27510
+ "title": "omitting the cursor returns from the first event (sequence 0)",
27511
+ "explicitId": "openwop.requirement.0171.poll-cursor-v2.from-first",
27512
+ "citations": [
27513
+ {
27514
+ "section": null,
27515
+ "requirement": "omission of afterSequence means \"from the first event\": the first returned sequence MUST be 0",
27516
+ "interpolated": true
27517
+ }
27518
+ ]
27519
+ },
27520
+ {
27521
+ "id": "openwop.it.v2-poll-cursor-v2.aftersequence-n-returns-only-events-with-sequence-n",
27522
+ "file": "v2-poll-cursor-v2.test.ts",
27523
+ "line": 87,
27524
+ "title": "afterSequence=N returns only events with sequence > N",
27525
+ "explicitId": "openwop.requirement.0171.poll-cursor-v2.after-sequence",
27526
+ "citations": [
27527
+ {
27528
+ "section": null,
27529
+ "requirement": "afterSequence is an integer ≥ 0 and MUST be accepted",
27530
+ "interpolated": true
27531
+ },
27532
+ {
27533
+ "section": null,
27534
+ "requirement": null,
27535
+ "interpolated": true
27536
+ },
27537
+ {
27538
+ "section": null,
27539
+ "requirement": "the cursor is exclusive and the log is not renumbered: afterSequence=first yields exactly the rest of the log",
27540
+ "interpolated": true
27541
+ }
27542
+ ]
27543
+ },
27544
+ {
27545
+ "id": "openwop.it.v2-poll-cursor-v2.a-cursor-past-the-end-of-the-log-returns-200-with-an-empty-events-array",
27546
+ "file": "v2-poll-cursor-v2.test.ts",
27547
+ "line": 103,
27548
+ "title": "a cursor past the end of the log returns 200 with an empty events array",
27549
+ "explicitId": "openwop.requirement.0171.poll-cursor-v2.past-end",
27550
+ "citations": [
27551
+ {
27552
+ "section": null,
27553
+ "requirement": "a cursor past the end of the log MUST return 200",
27554
+ "interpolated": true
27555
+ },
27556
+ {
27557
+ "section": null,
27558
+ "requirement": "a cursor past the end of the log MUST return an empty events array",
27559
+ "interpolated": true
27560
+ }
27561
+ ]
27562
+ },
27563
+ {
27564
+ "id": "openwop.it.v2-preferred-version-default.preferredversion-is-a-member-of-protocolversions",
27565
+ "file": "v2-preferred-version-default.test.ts",
27566
+ "line": 40,
27567
+ "title": "preferredVersion is a member of protocolVersions[]",
27568
+ "explicitId": "openwop.requirement.0172.preferred-version-default.member",
27569
+ "citations": [
27570
+ {
27571
+ "section": null,
27572
+ "requirement": "preferredVersion is REQUIRED root metadata with the <major>.<minor> grammar",
27573
+ "interpolated": true
27574
+ },
27575
+ {
27576
+ "section": null,
27577
+ "requirement": null,
27578
+ "interpolated": true
27579
+ },
27580
+ {
27581
+ "section": null,
27582
+ "requirement": "on a host serving a single major, preferredVersion MUST equal protocolVersion (RFC 0179 §A.1)",
27583
+ "interpolated": true
27584
+ }
27585
+ ]
27586
+ },
27587
+ {
27588
+ "id": "openwop.it.v2-preferred-version-default.a-header-less-get-well-known-openwop-is-the-preferredversion-representation",
27589
+ "file": "v2-preferred-version-default.test.ts",
27590
+ "line": 52,
27591
+ "title": "a header-less GET /.well-known/openwop is the preferredVersion representation",
27592
+ "explicitId": "openwop.requirement.0172.preferred-version-default.headerless",
27593
+ "citations": [
27594
+ {
27595
+ "section": "spec/v2/core/versioning.md §1.3",
27596
+ "requirement": "the discovery resource MUST answer a header-less request"
27597
+ },
27598
+ {
27599
+ "section": "spec/v2/core/versioning.md §1.3",
27600
+ "requirement": null,
27601
+ "interpolated": true
27602
+ },
27603
+ {
27604
+ "section": "spec/v2/core/capabilities.md §1",
27605
+ "requirement": null,
27606
+ "interpolated": true
27607
+ },
27608
+ {
27609
+ "section": "spec/v2/core/capabilities.md §1",
27610
+ "requirement": "preferredVersion is 1.x, so the header-less representation MUST be the v1 document (protocolVersion present) through the overlap"
27611
+ },
27612
+ {
27613
+ "section": "spec/v2/core/capabilities.md §1",
27614
+ "requirement": "the v1 representation MUST carry protocolVersions[] and preferredVersion additively so a single fetch names the other major"
27615
+ }
27616
+ ]
27617
+ },
27618
+ {
27619
+ "id": "openwop.it.v2-preferred-version-default.through-the-overlap-preferredversion-names-a-1-x-member",
27620
+ "file": "v2-preferred-version-default.test.ts",
27621
+ "line": 70,
27622
+ "title": "through the overlap preferredVersion names a 1.x member",
27623
+ "explicitId": "openwop.requirement.0172.preferred-version-default.overlap",
27624
+ "citations": [
27625
+ {
27626
+ "section": "spec/v2/core/versioning.md §1.1",
27627
+ "requirement": null,
27628
+ "interpolated": true
27629
+ }
27630
+ ]
27631
+ },
27632
+ {
27633
+ "id": "openwop.it.v2-profiles-derived-only.the-v2-document-carries-no-root-profiles",
27634
+ "file": "v2-profiles-derived-only.test.ts",
27635
+ "line": 43,
27636
+ "title": "the v2 document carries no root `profiles[]`",
27637
+ "explicitId": "openwop.requirement.0169.profiles-derived-only.no-root-profiles",
27638
+ "citations": [
27639
+ {
27640
+ "section": null,
27641
+ "requirement": "no `profiles[]` exists at the v2 root; a profile is a derived predicate, never a wire field (row C2.10)",
27642
+ "interpolated": true
27643
+ }
27644
+ ]
27645
+ },
27646
+ {
27647
+ "id": "openwop.it.v2-profiles-derived-only.every-registry-profile-is-derivable-from-the-document-the-discovery-core-predica",
27648
+ "file": "v2-profiles-derived-only.test.ts",
27649
+ "line": 49,
27650
+ "title": "every registry profile is derivable from the document; the discovery-core predicate holds on a valid document",
27651
+ "explicitId": "openwop.requirement.0169.profiles-derived-only.derivable",
27652
+ "citations": [
27653
+ {
27654
+ "section": null,
27655
+ "requirement": "spec/v2/profiles.json MUST list at least one profile",
27656
+ "interpolated": true
27657
+ },
27658
+ {
27659
+ "section": null,
27660
+ "requirement": null,
27661
+ "interpolated": true
27662
+ },
27663
+ {
27664
+ "section": null,
27665
+ "requirement": null,
27666
+ "interpolated": true
27667
+ },
27668
+ {
27669
+ "section": null,
27670
+ "requirement": "openwop-discovery-core (metadata protocolVersions + preferredVersion, both REQUIRED at the root) MUST derive true from every valid v2 document",
27671
+ "interpolated": true
27672
+ }
27673
+ ]
27674
+ },
27675
+ {
27676
+ "id": "openwop.it.v2-provider-conflict.two-definitions-of-one-bare-provider-id-fail-closed-the-later-registration-is-re",
27677
+ "file": "v2-provider-conflict.test.ts",
27678
+ "line": 84,
27679
+ "title": "two definitions of one bare provider id fail closed: the later registration is refused with connection_provider_conflict",
27680
+ "explicitId": "openwop.requirement.0177.provider-conflict.fail-closed",
27681
+ "citations": [
27682
+ {
27683
+ "section": null,
27684
+ "requirement": null,
27685
+ "interpolated": true
27686
+ },
27687
+ {
27688
+ "section": null,
27689
+ "requirement": "the later registration of a bare provider id MUST NOT install (no version precedence)",
27690
+ "interpolated": true
27691
+ },
27692
+ {
27693
+ "section": null,
27694
+ "requirement": "the later registration MUST be refused with connection_provider_conflict",
27695
+ "interpolated": true
27696
+ }
27697
+ ]
27698
+ },
27699
+ {
27700
+ "id": "openwop.it.v2-provider-conflict.the-qualified-form-packname-github-resolves-to-the-named-pack-s-definition",
27701
+ "file": "v2-provider-conflict.test.ts",
27702
+ "line": 102,
27703
+ "title": "the qualified form <packName>#github resolves to the named pack's definition",
27704
+ "explicitId": "openwop.requirement.0177.provider-conflict.qualified-form",
27705
+ "citations": [
27706
+ {
27707
+ "section": "connection-packs.md §\"The qualified form\" (RFC 0177 §D.1)",
27708
+ "requirement": null,
27709
+ "interpolated": true
27710
+ },
27711
+ {
27712
+ "section": "connection-packs.md §\"The qualified form\" (RFC 0177 §D.1)",
27713
+ "requirement": "a qualified reference resolves only to the named pack's definition (source: pack)"
27714
+ }
27715
+ ]
27716
+ },
27717
+ {
27718
+ "id": "openwop.it.v2-refresh-sla.refreshedat-on-each-embedded-protocol-facet-is-within-90-days-of-now",
27719
+ "file": "v2-refresh-sla.test.ts",
27720
+ "line": 34,
27721
+ "title": "refreshedAt on each embedded-protocol facet is within 90 days of now",
27722
+ "explicitId": "openwop.requirement.0175.refresh-sla",
27723
+ "citations": [
27724
+ {
27725
+ "section": null,
27726
+ "requirement": null,
27727
+ "interpolated": true
27728
+ },
27729
+ {
27730
+ "section": "interop.md §The refresh SLA",
27731
+ "requirement": null,
27732
+ "interpolated": true
27733
+ },
27734
+ {
27735
+ "section": "interop.md §The refresh SLA",
27736
+ "requirement": null,
27737
+ "interpolated": true
27738
+ },
27739
+ {
27740
+ "section": null,
27741
+ "requirement": null,
27742
+ "interpolated": true
27743
+ },
27744
+ {
27745
+ "section": "interop.md §The facets",
27746
+ "requirement": null,
27747
+ "interpolated": true
27748
+ },
27749
+ {
27750
+ "section": "interop.md §The facets",
27751
+ "requirement": null,
27752
+ "interpolated": true
27753
+ }
27754
+ ]
27755
+ },
27756
+ {
27757
+ "id": "openwop.it.v2-relaxation-recorded.a-bundle-recording-a-relaxation-cannot-certify-the-relaxed-profile",
27758
+ "file": "v2-relaxation-recorded.test.ts",
27759
+ "line": 68,
27760
+ "title": "a bundle recording a relaxation cannot certify the relaxed profile",
27761
+ "explicitId": "openwop.requirement.0173.relaxation-recorded",
27762
+ "citations": [
27763
+ {
27764
+ "section": "security-defaults.md §Relaxations",
27765
+ "requirement": "control: a bundle with no relaxation and a fully witnessed profile MUST verify clean"
27766
+ },
27767
+ {
27768
+ "section": "security-defaults.md §Relaxations",
27769
+ "requirement": "control: the unrelaxed profile certifies"
27770
+ },
27771
+ {
27772
+ "section": "security-defaults.md §Relaxations",
27773
+ "requirement": "a bundle that records a relaxation MUST NOT certify the profile the relaxed obligation belongs to (`relaxed-profile-certified`, RFC 0173 §A.2)"
27774
+ },
27775
+ {
27776
+ "section": "security-defaults.md §Relaxations",
27777
+ "requirement": "the rejection names the relaxed profile"
27778
+ },
27779
+ {
27780
+ "section": "security-defaults.md §Relaxations",
27781
+ "requirement": "the relaxed profile is not in `certifiedProfiles`"
27782
+ },
27783
+ {
27784
+ "section": "security-defaults.md §Relaxations",
27785
+ "requirement": "an unrelated profile still certifies — the relaxation is scoped to the obligation it names"
27786
+ },
27787
+ {
27788
+ "section": "security-defaults.md §Relaxations",
27789
+ "requirement": "a relaxation recorded against an unclaimed profile is not a rejection — recording is the obligation, claiming is the defect"
27790
+ }
27791
+ ]
27792
+ },
27793
+ {
27794
+ "id": "openwop.it.v2-relaxation-recorded.durability-is-a-closed-set-session-deployment-persisted",
27795
+ "file": "v2-relaxation-recorded.test.ts",
27796
+ "line": 108,
27797
+ "title": "durability is a closed set: session | deployment | persisted",
27798
+ "explicitId": "openwop.requirement.0173.relaxation-recorded.durability-closed",
27799
+ "citations": [
27800
+ {
27801
+ "section": "certification-bundle.schema.json host.relaxations[].durability",
27802
+ "requirement": null,
27803
+ "interpolated": true
27804
+ },
27805
+ {
27806
+ "section": "certification-bundle.schema.json host.relaxations[].durability",
27807
+ "requirement": null,
27808
+ "interpolated": true
27809
+ },
27810
+ {
27811
+ "section": "certification-bundle.schema.json host.relaxations[].durability",
27812
+ "requirement": "the failure names the durability enum"
27813
+ }
27814
+ ]
27815
+ },
27816
+ {
27817
+ "id": "openwop.it.v2-revocation-honored.a-revoked-next-request-credential-is-refused-on-the-next-request-with-credential",
27818
+ "file": "v2-revocation-honored.test.ts",
27819
+ "line": 38,
27820
+ "title": "a revoked next-request credential is refused on the next request with credential_revoked",
27821
+ "explicitId": "openwop.requirement.0170.revocation-honored",
27822
+ "citations": [
27823
+ {
27824
+ "section": null,
27825
+ "requirement": null,
27826
+ "interpolated": true
27827
+ },
27828
+ {
27829
+ "section": null,
27830
+ "requirement": null,
27831
+ "interpolated": true
27832
+ },
27833
+ {
27834
+ "section": null,
27835
+ "requirement": null,
27836
+ "interpolated": true
27837
+ },
27838
+ {
27839
+ "section": null,
27840
+ "requirement": null,
27841
+ "interpolated": true
27842
+ },
27843
+ {
27844
+ "section": null,
27845
+ "requirement": null,
27846
+ "interpolated": true
27847
+ }
27848
+ ]
27849
+ },
27850
+ {
27851
+ "id": "openwop.it.v2-subject-link-record.the-link-formed-across-scim-and-saml-is-a-closed-subjectlink-record",
27852
+ "file": "v2-subject-link-record.test.ts",
27853
+ "line": 80,
27854
+ "title": "the link formed across SCIM and SAML is a closed SubjectLink record",
27855
+ "explicitId": "openwop.requirement.0170.subject-link-record.shape",
27856
+ "citations": [
27857
+ {
27858
+ "section": null,
27859
+ "requirement": null,
27860
+ "interpolated": true
27861
+ },
27862
+ {
27863
+ "section": null,
27864
+ "requirement": "a link MUST join exactly two distinct subjects",
27865
+ "interpolated": true
27866
+ },
27867
+ {
27868
+ "section": null,
27869
+ "requirement": "a freshly formed link carries no deniedAt",
27870
+ "interpolated": true
27871
+ }
27872
+ ]
27873
+ },
27874
+ {
27875
+ "id": "openwop.it.v2-subject-link-record.deactivation-sets-deniedat-and-the-saml-decision-path-consults-it",
27876
+ "file": "v2-subject-link-record.test.ts",
27877
+ "line": 91,
27878
+ "title": "deactivation sets deniedAt and the SAML decision path consults it",
27879
+ "explicitId": "openwop.requirement.0170.subject-link-record.denied-at",
27880
+ "citations": [
27881
+ {
27882
+ "section": null,
27883
+ "requirement": null,
27884
+ "interpolated": true
27885
+ },
27886
+ {
27887
+ "section": null,
27888
+ "requirement": "deactivation MUST set deniedAt (date-time) on the link record",
27889
+ "interpolated": true
27890
+ },
27891
+ {
27892
+ "section": null,
27893
+ "requirement": "after deniedAt is set the SAML decision path MUST deny the linked subject (the leaver contract)",
27894
+ "interpolated": true
27895
+ }
27896
+ ]
27897
+ },
27898
+ {
27899
+ "id": "openwop.it.v2-unmapped-type-refused.poll-over-a-log-with-an-unmapped-unprefixed-type-fails-with-500-event-type-unmap",
27900
+ "file": "v2-unmapped-type-refused.test.ts",
27901
+ "line": 48,
27902
+ "title": "poll over a log with an unmapped, unprefixed type fails with 500 event_type_unmapped",
27903
+ "explicitId": "openwop.requirement.0176.unmapped-type-refused",
27904
+ "citations": [
27905
+ {
27906
+ "section": null,
27907
+ "requirement": null,
27908
+ "interpolated": true
27909
+ },
27910
+ {
27911
+ "section": null,
27912
+ "requirement": null,
27913
+ "interpolated": true
27914
+ },
27915
+ {
27916
+ "section": "spec/v2/errors.json",
27917
+ "requirement": null,
27918
+ "interpolated": true
27919
+ }
27920
+ ]
27921
+ },
27922
+ {
27923
+ "id": "openwop.it.v2-unmapped-type-refused.a-fork-of-the-same-log-is-refused-for-the-same-reason-the-rule-binds-every-reade",
27924
+ "file": "v2-unmapped-type-refused.test.ts",
27925
+ "line": 71,
27926
+ "title": "a fork of the same log is refused for the same reason — the rule binds every reader",
27927
+ "explicitId": "openwop.requirement.0176.unmapped-type-refused.fork",
27928
+ "citations": [
27929
+ {
27930
+ "section": "spec/v2/core/replay.md §Replay-from-event-log internals",
27931
+ "requirement": null,
27932
+ "interpolated": true
27933
+ },
27934
+ {
27935
+ "section": null,
27936
+ "requirement": null,
27937
+ "interpolated": true
27938
+ }
27939
+ ]
27940
+ },
27941
+ {
27942
+ "id": "openwop.it.v2-v1-events-translated.poll-reads-an-era-2-log-with-v2-type-names-and-sequence-0-present",
27943
+ "file": "v2-v1-events-translated.test.ts",
27944
+ "line": 56,
27945
+ "title": "poll reads an era-2 log with v2 type names and sequence 0 present",
27946
+ "explicitId": "openwop.requirement.0176.v1-events-translated.poll",
27947
+ "citations": [
27948
+ {
27949
+ "section": null,
27950
+ "requirement": null,
27951
+ "interpolated": true
27952
+ }
27953
+ ]
27954
+ },
27955
+ {
27956
+ "id": "openwop.it.v2-v1-events-translated.sse-reads-the-same-era-2-log-with-v2-type-names",
27957
+ "file": "v2-v1-events-translated.test.ts",
27958
+ "line": 70,
27959
+ "title": "SSE reads the same era-2 log with v2 type names",
27960
+ "explicitId": "openwop.requirement.0176.v1-events-translated.sse",
27961
+ "citations": [
27962
+ {
27963
+ "section": null,
27964
+ "requirement": null,
27965
+ "interpolated": true
27966
+ }
27967
+ ]
27968
+ },
27969
+ {
27970
+ "id": "openwop.it.v2-v1-events-translated.a-fork-of-the-era-2-run-reads-its-inherited-prefix-with-v2-type-names",
27971
+ "file": "v2-v1-events-translated.test.ts",
27972
+ "line": 84,
27973
+ "title": "a fork of the era-2 run reads its inherited prefix with v2 type names",
27974
+ "explicitId": "openwop.requirement.0176.v1-events-translated.fork",
27975
+ "citations": [
27976
+ {
27977
+ "section": "spec/v2/core/replay.md §Forking a v1 run",
27978
+ "requirement": null,
27979
+ "interpolated": true
27980
+ }
27981
+ ]
27982
+ },
27983
+ {
27984
+ "id": "openwop.it.v2-v1-signed-webhook-accepted.the-webhooks-facet-lists-scheme-v1-the-scheme-a-v1-signed-delivery-is-verified-u",
27985
+ "file": "v2-v1-signed-webhook-accepted.test.ts",
27986
+ "line": 79,
27987
+ "title": "the webhooks facet lists scheme \"v1\" — the scheme a v1-signed delivery is verified under",
27988
+ "explicitId": "openwop.requirement.0176.v1-signed-webhook-accepted.facet",
27989
+ "citations": [
27990
+ {
27991
+ "section": "spec/v2/core/webhooks.md §Surfaces",
27992
+ "requirement": "the webhooks facet is { signatureAlgorithms[] }"
27993
+ },
27994
+ {
27995
+ "section": "spec/v2/core/webhooks.md §Surfaces",
27996
+ "requirement": "signatureAlgorithms MUST list \"v1\" — the cut adds no signature scheme (RFC 0176 §D.2)"
27997
+ }
27998
+ ]
27999
+ },
28000
+ {
28001
+ "id": "openwop.it.v2-v1-signed-webhook-accepted.the-host-s-v2-receiver-path-accepts-an-x-openwop-only-scheme-v1-delivery-and-ref",
28002
+ "file": "v2-v1-signed-webhook-accepted.test.ts",
28003
+ "line": 89,
28004
+ "title": "the host's v2 receiver path accepts an X-openwop-*-only scheme-v1 delivery and refuses a tampered one",
28005
+ "explicitId": "openwop.requirement.0176.v1-signed-webhook-accepted",
28006
+ "citations": [
28007
+ {
28008
+ "section": null,
28009
+ "requirement": null,
28010
+ "interpolated": true
28011
+ },
28012
+ {
28013
+ "section": "spec/v2/core/webhooks.md §Verification",
28014
+ "requirement": "a receiver MUST verify before acting: the same delivery with a wrong X-openwop-Signature MUST be refused (a receiver that accepts everything is not verifying the v1 bytes)"
28015
+ }
28016
+ ]
28017
+ },
28018
+ {
28019
+ "id": "openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once",
28020
+ "file": "v2-webhook-durable-delivery.test.ts",
28021
+ "line": 145,
28022
+ "title": "a failed attempt is retried and the event is delivered at least once",
28023
+ "explicitId": "openwop.requirement.0173.webhook-durable-delivery",
28024
+ "citations": [
28025
+ {
28026
+ "section": "runs.md §Create",
28027
+ "requirement": "POST /runs MUST answer 201 for the noop fixture"
28028
+ },
28029
+ {
28030
+ "section": "webhooks.md §Durability",
28031
+ "requirement": "the host MUST attempt delivery of run.completed for THIS run to the registered subscriber"
28032
+ },
28033
+ {
28034
+ "section": "webhooks.md §Durability",
28035
+ "requirement": null,
28036
+ "interpolated": true
28037
+ },
28038
+ {
28039
+ "section": "webhooks.md §Durability",
28040
+ "requirement": "at-least-once: after the failing attempts the retry MUST land (the receiver answered 204 to the third attempt for the key)"
28041
+ },
28042
+ {
28043
+ "section": "webhooks.md §Durability",
28044
+ "requirement": null,
28045
+ "interpolated": true
28046
+ },
28047
+ {
28048
+ "section": "webhooks.md §Surfaces",
28049
+ "requirement": "DELETE /webhooks/{webhookId} MUST answer 204"
28050
+ }
28051
+ ]
28052
+ },
28053
+ {
28054
+ "id": "openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped",
28055
+ "file": "v2-webhook-durable-delivery.test.ts",
28056
+ "line": 199,
28057
+ "title": "an exhausted delivery is dead-lettered, never dropped",
28058
+ "explicitId": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
28059
+ "citations": [
28060
+ {
28061
+ "section": "runs.md §Create",
28062
+ "requirement": "POST /runs MUST answer 201 for the noop fixture"
28063
+ },
28064
+ {
28065
+ "section": "webhooks.md §Durability",
28066
+ "requirement": "a delivery that keeps failing MUST be retried before it can be exhausted (one attempt is a drop)"
28067
+ },
28068
+ {
28069
+ "section": "webhooks.md §Durability",
28070
+ "requirement": null,
28071
+ "interpolated": true
28072
+ }
28073
+ ]
28074
+ },
28075
+ {
28076
+ "id": "openwop.it.v2-well-known-one-resource.a-header-less-get-and-an-openwop-version-2-0-get-are-two-representations-of-one",
28077
+ "file": "v2-well-known-one-resource.test.ts",
28078
+ "line": 65,
28079
+ "title": "a header-less GET and an OpenWOP-Version: 2.0 GET are two representations of one path with equal protocolVersions[]",
28080
+ "explicitId": "openwop.requirement.0176.well-known-one-resource",
28081
+ "citations": [
28082
+ {
28083
+ "section": null,
28084
+ "requirement": null,
28085
+ "interpolated": true
28086
+ },
28087
+ {
28088
+ "section": null,
28089
+ "requirement": null,
28090
+ "interpolated": true
28091
+ },
28092
+ {
28093
+ "section": null,
28094
+ "requirement": "both representations MUST be JSON objects",
28095
+ "interpolated": true
28096
+ },
28097
+ {
28098
+ "section": null,
28099
+ "requirement": "the v1 representation MUST carry protocolVersions[] (RFC 0165 §A, additive) — a single fetch names the other major",
28100
+ "interpolated": true
28101
+ },
28102
+ {
28103
+ "section": null,
28104
+ "requirement": "the v2 representation MUST carry protocolVersions[]",
28105
+ "interpolated": true
28106
+ },
28107
+ {
28108
+ "section": null,
28109
+ "requirement": null,
28110
+ "interpolated": true
28111
+ },
28112
+ {
28113
+ "section": null,
28114
+ "requirement": "the header MUST select a representation — a host that serves one document for both majors is the charter's \"per-major sub-objects\" the RFC does not adopt (adversarial review 3)",
28115
+ "interpolated": true
28116
+ }
28117
+ ]
28118
+ },
28119
+ {
28120
+ "id": "openwop.it.v2-well-known-one-resource.the-v2-representation-carries-no-capabilities-wrapper-no-dotted-host-key-no-prof",
28121
+ "file": "v2-well-known-one-resource.test.ts",
28122
+ "line": 104,
28123
+ "title": "the v2 representation carries no `capabilities` wrapper, no dotted `host.*` key, no `profiles[]`, no Capabilities-Etag",
28124
+ "explicitId": "openwop.requirement.0176.well-known-one-resource.v2-representation",
28125
+ "citations": [
28126
+ {
28127
+ "section": "RFC 0176 §C.2",
28128
+ "requirement": "the `capabilities` wrapper (deprecation capabilities-wrapper, removalTrigger v2.0-cut) MUST be absent from the v2 representation"
28129
+ },
28130
+ {
28131
+ "section": "RFC 0176 §C.2",
28132
+ "requirement": "the dotted `host.*` mirror (deprecation host-dotted-mirror) MUST be absent from the v2 representation"
28133
+ },
28134
+ {
28135
+ "section": "spec/v2/core/capabilities.md §7",
28136
+ "requirement": "no `profiles[]` exists at the v2 root (RFC 0169 §C.1, row C2.10)"
28137
+ },
28138
+ {
28139
+ "section": "RFC 0176 §C.2",
28140
+ "requirement": "Capabilities-Etag (deprecation capabilities-etag-header) MUST be absent from the v2 representation — the standard ETag is the probe handle"
28141
+ }
28142
+ ]
28143
+ },
25744
28144
  {
25745
28145
  "id": "openwop.it.vector-knn-roundtrip.capabilities-vectorstore-is-either-absent-or-a-well-formed-object",
25746
28146
  "file": "vector-knn-roundtrip.test.ts",
@@ -31969,6 +34369,303 @@
31969
34369
  }
31970
34370
  ]
31971
34371
  },
34372
+ {
34373
+ "id": "openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0",
34374
+ "file": "v2-alias-covers-reword.test.ts",
34375
+ "line": 32,
34376
+ "title": "the corpus gate script exits 0",
34377
+ "explicitId": "openwop.requirement.0168.alias-covers-reword",
34378
+ "citations": [
34379
+ {
34380
+ "section": "RFC 0168 §A.1",
34381
+ "requirement": null,
34382
+ "interpolated": true
34383
+ }
34384
+ ]
34385
+ },
34386
+ {
34387
+ "id": "openwop.it.v2-corpus-tag-pinned.every-vendoring-consumer-in-the-cross-repo-inventory-records-a-published-corpus",
34388
+ "file": "v2-corpus-tag-pinned.test.ts",
34389
+ "line": 33,
34390
+ "title": "every vendoring consumer in the cross-repo inventory records a published corpus tag",
34391
+ "explicitId": null,
34392
+ "citations": [
34393
+ {
34394
+ "section": null,
34395
+ "requirement": null,
34396
+ "interpolated": true
34397
+ }
34398
+ ]
34399
+ },
34400
+ {
34401
+ "id": "openwop.it.v2-declaration-parity.the-corpus-gate-script-exits-0",
34402
+ "file": "v2-declaration-parity.test.ts",
34403
+ "line": 31,
34404
+ "title": "the corpus gate script exits 0",
34405
+ "explicitId": "openwop.requirement.0169.declaration-parity",
34406
+ "citations": [
34407
+ {
34408
+ "section": "RFC 0169 §B.2",
34409
+ "requirement": null,
34410
+ "interpolated": true
34411
+ }
34412
+ ]
34413
+ },
34414
+ {
34415
+ "id": "openwop.it.v2-event-naming-rule.every-closed-enum-v2-event-type-is-two-kebab-segments-and-every-recorded-artifac",
34416
+ "file": "v2-event-naming-rule.test.ts",
34417
+ "line": 36,
34418
+ "title": "every closed-enum v2 event type is two kebab segments, and every recorded artifact exception is an enum member",
34419
+ "explicitId": null,
34420
+ "citations": [
34421
+ {
34422
+ "section": null,
34423
+ "requirement": "run-event.schema.json properties.type.oneOf[0] MUST be the closed enum of v2 event types",
34424
+ "interpolated": true
34425
+ },
34426
+ {
34427
+ "section": null,
34428
+ "requirement": null,
34429
+ "interpolated": true
34430
+ },
34431
+ {
34432
+ "section": null,
34433
+ "requirement": null,
34434
+ "interpolated": true
34435
+ }
34436
+ ]
34437
+ },
34438
+ {
34439
+ "id": "openwop.it.v2-event-naming-rule.the-closed-enum-and-the-vendor-branch-are-disjoint-every-registered-type-validat",
34440
+ "file": "v2-event-naming-rule.test.ts",
34441
+ "line": 51,
34442
+ "title": "the closed enum and the vendor branch are disjoint: every registered type validates, and a typo of a registered domain does not",
34443
+ "explicitId": null,
34444
+ "citations": [
34445
+ {
34446
+ "section": "RFC 0171 §A.1",
34447
+ "requirement": null,
34448
+ "interpolated": true
34449
+ },
34450
+ {
34451
+ "section": "RFC 0171 §A.1",
34452
+ "requirement": null,
34453
+ "interpolated": true
34454
+ },
34455
+ {
34456
+ "section": "RFC 0171 §A.1",
34457
+ "requirement": "a genuine vendor type under an unregistered org MUST still validate"
34458
+ },
34459
+ {
34460
+ "section": "RFC 0171 §A.1",
34461
+ "requirement": "`openwop.` is reserved and MUST NOT match the vendor branch"
34462
+ }
34463
+ ]
34464
+ },
34465
+ {
34466
+ "id": "openwop.it.v2-events-channel-parity.the-corpus-gate-script-exits-0",
34467
+ "file": "v2-events-channel-parity.test.ts",
34468
+ "line": 31,
34469
+ "title": "the corpus gate script exits 0",
34470
+ "explicitId": "openwop.requirement.0171.events-channel-parity",
34471
+ "citations": [
34472
+ {
34473
+ "section": "RFC 0171 §E.1",
34474
+ "requirement": null,
34475
+ "interpolated": true
34476
+ }
34477
+ ]
34478
+ },
34479
+ {
34480
+ "id": "openwop.it.v2-externally-gated-never-stable.the-corpus-gate-script-exits-0",
34481
+ "file": "v2-externally-gated-never-stable.test.ts",
34482
+ "line": 31,
34483
+ "title": "the corpus gate script exits 0",
34484
+ "explicitId": "openwop.requirement.0169.externally-gated-never-stable",
34485
+ "citations": [
34486
+ {
34487
+ "section": "RFC 0169 §C.4",
34488
+ "requirement": null,
34489
+ "interpolated": true
34490
+ }
34491
+ ]
34492
+ },
34493
+ {
34494
+ "id": "openwop.it.v2-one-signing-scheme.registry-version-manifest-signing-has-exactly-one-scheme-ed25519-canonical-json",
34495
+ "file": "v2-one-signing-scheme.test.ts",
34496
+ "line": 37,
34497
+ "title": "registry-version-manifest signing has exactly one scheme, ed25519-canonical-json, and no method / publicKeyRef",
34498
+ "explicitId": null,
34499
+ "citations": [
34500
+ {
34501
+ "section": null,
34502
+ "requirement": "registry-version-manifest.schema.json MUST define a `signing` object",
34503
+ "interpolated": true
34504
+ },
34505
+ {
34506
+ "section": null,
34507
+ "requirement": "signing.scheme MUST be the single const `ed25519-canonical-json` — one scheme, not a menu",
34508
+ "interpolated": true
34509
+ },
34510
+ {
34511
+ "section": null,
34512
+ "requirement": "signing MUST require `keyId` and `scheme`",
34513
+ "interpolated": true
34514
+ },
34515
+ {
34516
+ "section": null,
34517
+ "requirement": "signing MUST be closed (additionalProperties: false) so a second scheme cannot be smuggled in",
34518
+ "interpolated": true
34519
+ },
34520
+ {
34521
+ "section": null,
34522
+ "requirement": "signing.method is gone in v2 — it MUST NOT appear in the signing object",
34523
+ "interpolated": true
34524
+ },
34525
+ {
34526
+ "section": null,
34527
+ "requirement": "signing.publicKeyRef is gone in v2 — the key is addressed by keyId alone",
34528
+ "interpolated": true
34529
+ }
34530
+ ]
34531
+ },
34532
+ {
34533
+ "id": "openwop.it.v2-path-parity.the-corpus-gate-script-exits-0",
34534
+ "file": "v2-path-parity.test.ts",
34535
+ "line": 31,
34536
+ "title": "the corpus gate script exits 0",
34537
+ "explicitId": "openwop.requirement.0172.path-parity",
34538
+ "citations": [
34539
+ {
34540
+ "section": "RFC 0172 §C.2",
34541
+ "requirement": null,
34542
+ "interpolated": true
34543
+ }
34544
+ ]
34545
+ },
34546
+ {
34547
+ "id": "openwop.it.v2-release-identity.the-corpus-gate-script-exits-0",
34548
+ "file": "v2-release-identity.test.ts",
34549
+ "line": 32,
34550
+ "title": "the corpus gate script exits 0",
34551
+ "explicitId": "openwop.requirement.0172.release-identity",
34552
+ "citations": [
34553
+ {
34554
+ "section": "RFC 0172 §D.1",
34555
+ "requirement": null,
34556
+ "interpolated": true
34557
+ },
34558
+ {
34559
+ "section": "RFC 0172 §D.1",
34560
+ "requirement": null,
34561
+ "interpolated": true
34562
+ }
34563
+ ]
34564
+ },
34565
+ {
34566
+ "id": "openwop.it.v2-req-only-assertions.the-corpus-gate-script-exits-0",
34567
+ "file": "v2-req-only-assertions.test.ts",
34568
+ "line": 31,
34569
+ "title": "the corpus gate script exits 0",
34570
+ "explicitId": "openwop.requirement.0168.req-only-assertions",
34571
+ "citations": [
34572
+ {
34573
+ "section": "RFC 0168 §A.1",
34574
+ "requirement": null,
34575
+ "interpolated": true
34576
+ }
34577
+ ]
34578
+ },
34579
+ {
34580
+ "id": "openwop.it.v2-seams-not-in-canonical.the-corpus-gate-script-exits-0",
34581
+ "file": "v2-seams-not-in-canonical.test.ts",
34582
+ "line": 31,
34583
+ "title": "the corpus gate script exits 0",
34584
+ "explicitId": "openwop.requirement.0168.seams-not-in-canonical",
34585
+ "citations": [
34586
+ {
34587
+ "section": "RFC 0168 §C.2",
34588
+ "requirement": null,
34589
+ "interpolated": true
34590
+ }
34591
+ ]
34592
+ },
34593
+ {
34594
+ "id": "openwop.it.v2-security-defaults-table.the-obligation-table-has-a-witness-column-and-no-row-is-unwitnessable",
34595
+ "file": "v2-security-defaults-table.test.ts",
34596
+ "line": 33,
34597
+ "title": "the obligation table has a Witness column and no row is unwitnessable",
34598
+ "explicitId": null,
34599
+ "citations": [
34600
+ {
34601
+ "section": null,
34602
+ "requirement": "spec/v2/core/security-defaults.md MUST exist — it is the obligation table RFC 0173 §A.1 names",
34603
+ "interpolated": true
34604
+ },
34605
+ {
34606
+ "section": null,
34607
+ "requirement": "the obligation table MUST have a `Witness` column (surface · obligation · witness · invariant)",
34608
+ "interpolated": true
34609
+ },
34610
+ {
34611
+ "section": null,
34612
+ "requirement": "the obligation table MUST list at least one obligation row",
34613
+ "interpolated": true
34614
+ },
34615
+ {
34616
+ "section": null,
34617
+ "requirement": null,
34618
+ "interpolated": true
34619
+ },
34620
+ {
34621
+ "section": null,
34622
+ "requirement": null,
34623
+ "interpolated": true
34624
+ }
34625
+ ]
34626
+ },
34627
+ {
34628
+ "id": "openwop.it.v2-spec-artifacts-digest.the-corpus-gate-script-exits-0",
34629
+ "file": "v2-spec-artifacts-digest.test.ts",
34630
+ "line": 31,
34631
+ "title": "the corpus gate script exits 0",
34632
+ "explicitId": "openwop.requirement.0168.spec-artifacts-digest",
34633
+ "citations": [
34634
+ {
34635
+ "section": "RFC 0168 §D.2",
34636
+ "requirement": null,
34637
+ "interpolated": true
34638
+ }
34639
+ ]
34640
+ },
34641
+ {
34642
+ "id": "openwop.it.v2-threat-model-template.the-corpus-gate-script-exits-0",
34643
+ "file": "v2-threat-model-template.test.ts",
34644
+ "line": 32,
34645
+ "title": "the corpus gate script exits 0",
34646
+ "explicitId": "openwop.requirement.0173.threat-model-template",
34647
+ "citations": [
34648
+ {
34649
+ "section": "RFC 0173 §E.2 / RFC 0175 §F.1",
34650
+ "requirement": null,
34651
+ "interpolated": true
34652
+ }
34653
+ ]
34654
+ },
34655
+ {
34656
+ "id": "openwop.it.v2-witness-required.the-corpus-gate-script-exits-0",
34657
+ "file": "v2-witness-required.test.ts",
34658
+ "line": 31,
34659
+ "title": "the corpus gate script exits 0",
34660
+ "explicitId": "openwop.requirement.0168.witness-required",
34661
+ "citations": [
34662
+ {
34663
+ "section": "RFC 0168 §B.1",
34664
+ "requirement": null,
34665
+ "interpolated": true
34666
+ }
34667
+ ]
34668
+ },
31972
34669
  {
31973
34670
  "id": "openwop.it.versioned-composition-profiles.a-versioned-advertisement-validates",
31974
34671
  "file": "versioned-composition-profiles.test.ts",