@openwop/openwop-conformance 1.72.2 → 1.98.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +2 -2
  3. package/api/asyncapi.yaml +58 -0
  4. package/api/openapi.yaml +4 -1
  5. package/dist/cli.js +107 -1
  6. package/dist/lib/profiles.js +70 -4
  7. package/package.json +2 -1
  8. package/schemas/CORPUS-STAMP.json +2 -2
  9. package/schemas/README.md +2 -0
  10. package/schemas/capabilities.schema.json +2054 -572
  11. package/schemas/certification-bundle-v2.schema.json +108 -0
  12. package/schemas/run-event-payloads.schema.json +3411 -857
  13. package/schemas/run-event.schema.json +31 -9
  14. package/schemas/workflow-definition.schema.json +492 -130
  15. package/schemas/workload-identity.schema.json +73 -0
  16. package/src/cli.ts +119 -1
  17. package/src/lib/a2a-fake-peer.ts +20 -0
  18. package/src/lib/behavior-gate.ts +42 -7
  19. package/src/lib/llm-cache-key-recipe.ts +51 -0
  20. package/src/lib/mcp-fake-server.ts +20 -0
  21. package/src/lib/profiles.ts +95 -4
  22. package/src/lib/requirement-ledger.ts +138 -0
  23. package/src/lib/requirement-registry.ts +62 -0
  24. package/src/scenarios/a2a-version-negotiation.test.ts +159 -0
  25. package/src/scenarios/capability-example-root-layout.test.ts +113 -0
  26. package/src/scenarios/certification-bundle-v2.test.ts +157 -0
  27. package/src/scenarios/certification-floor-enforcement.test.ts +115 -0
  28. package/src/scenarios/compensation-behavior.test.ts +164 -0
  29. package/src/scenarios/compensation-profile.test.ts +175 -0
  30. package/src/scenarios/contract-provenance.test.ts +209 -0
  31. package/src/scenarios/core-manifest-and-extension-registry.test.ts +198 -0
  32. package/src/scenarios/discovery-canonical-family-no-shadow.test.ts +219 -0
  33. package/src/scenarios/effect-identity-composition.test.ts +129 -0
  34. package/src/scenarios/effect-identity-cross-scope.test.ts +82 -0
  35. package/src/scenarios/mcp-version-negotiation.test.ts +159 -0
  36. package/src/scenarios/multi-region-effect-vocabulary.test.ts +175 -0
  37. package/src/scenarios/multi-region-idempotency.test.ts +17 -7
  38. package/src/scenarios/openapi-resolved-paths.test.ts +127 -0
  39. package/src/scenarios/protocol-version-grammar.test.ts +119 -0
  40. package/src/scenarios/requirement-ledger.test.ts +162 -0
  41. package/src/scenarios/rfc-0147-self-audit.test.ts +104 -0
  42. package/src/scenarios/rfc-lifecycle-coherence.test.ts +137 -0
  43. package/src/scenarios/semantic-digest-v2.test.ts +128 -0
  44. package/src/scenarios/semantic-digest-vectors.test.ts +140 -0
  45. package/src/scenarios/spec-corpus-validity.test.ts +22 -8
  46. package/src/scenarios/strict-behavior-gate.test.ts +120 -0
  47. package/src/scenarios/versioned-composition-profiles.test.ts +183 -0
  48. package/src/scenarios/workload-identity-behavior.test.ts +188 -0
  49. package/src/scenarios/workload-identity-profile.test.ts +175 -0
  50. package/vectors/semantic-request-digest-v2.json +236 -0
@@ -0,0 +1,108 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/certification-bundle-v2.schema.json",
4
+ "title": "OpenWOP certification bundle, version 2 (RFC 0148 §C)",
5
+ "description": "A certification bundle that records what EXECUTED, not merely what passed.\n\nThe v1 bundle carried `{passed, failed, skipped}` scenario-file lists. Those three cannot express the distinction the whole program turns on: a scenario file counted as `passed` whether its assertions ran or its runner returned early, and a `skipped` entry could mean 'the operator excluded this', 'the requirement does not apply', or 'we could not check' — three claims with different consequences flattened into one word.\n\nv2 replaces the lists with per-requirement dispositions from RFC 0148 §A, and adds the counts §A.4 requires so a reader can tell a thorough run from a thin one without re-running it. `blocked` is its own total precisely because it is the one that invalidates a claim.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": ["bundleVersion", "suite", "host", "discovery", "claimedProfiles", "results", "scenarioManifestSha256", "targetConfigurationSha256"],
9
+ "properties": {
10
+ "bundleVersion": { "const": "2" },
11
+ "suite": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "required": ["package", "version"],
15
+ "properties": {
16
+ "package": { "type": "string", "minLength": 1 },
17
+ "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }
18
+ }
19
+ },
20
+ "host": {
21
+ "type": "object",
22
+ "additionalProperties": true,
23
+ "required": ["name", "version"],
24
+ "properties": {
25
+ "name": { "type": "string", "minLength": 1 },
26
+ "version": { "type": "string", "minLength": 1 },
27
+ "vendor": { "type": "string" }
28
+ }
29
+ },
30
+ "discovery": {
31
+ "type": "object",
32
+ "additionalProperties": true,
33
+ "required": ["sha256", "document"],
34
+ "properties": {
35
+ "url": { "type": "string" },
36
+ "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
37
+ "document": { "type": "object" }
38
+ }
39
+ },
40
+ "claimedProfiles": {
41
+ "type": "array",
42
+ "minItems": 1,
43
+ "uniqueItems": true,
44
+ "items": { "type": "string", "pattern": "^openwop-[a-z0-9-]+$" },
45
+ "description": "RFC 0155 §E — canonical profile IDs only. Deprecated aliases go in `aliases`, never here, so a badge cannot be substantiated by a name that no longer means what it did."
46
+ },
47
+ "aliases": {
48
+ "type": "array",
49
+ "uniqueItems": true,
50
+ "items": { "type": "string" }
51
+ },
52
+ "results": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": ["totals", "requirements"],
56
+ "properties": {
57
+ "totals": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "required": ["executedPass", "executedFail", "skipped", "inapplicable", "blocked"],
61
+ "description": "RFC 0148 §A/§C. All five are REQUIRED — an omitted total is indistinguishable from zero, and `blocked: 0` asserted is a different claim from `blocked` unstated.",
62
+ "properties": {
63
+ "executedPass": { "type": "integer", "minimum": 0 },
64
+ "executedFail": { "type": "integer", "minimum": 0 },
65
+ "skipped": { "type": "integer", "minimum": 0 },
66
+ "inapplicable": { "type": "integer", "minimum": 0 },
67
+ "blocked": { "type": "integer", "minimum": 0 }
68
+ }
69
+ },
70
+ "requirements": {
71
+ "type": "array",
72
+ "minItems": 1,
73
+ "description": "Per-requirement dispositions. Non-empty: a bundle with no requirement rows records no execution, and RFC 0148 §C exists because an empty evidence set was reading as proof.",
74
+ "items": {
75
+ "type": "object",
76
+ "additionalProperties": false,
77
+ "required": ["requirementId", "scenarioId", "disposition"],
78
+ "properties": {
79
+ "requirementId": { "type": "string", "minLength": 1 },
80
+ "scenarioId": { "type": "string", "minLength": 1 },
81
+ "disposition": { "enum": ["executed-pass", "executed-fail", "skipped", "inapplicable", "blocked"] },
82
+ "assertionCount": {
83
+ "type": "integer",
84
+ "minimum": 0,
85
+ "description": "How many assertions actually ran. `executed-pass` with `assertionCount: 0` is the vacuous pass this program exists to close, and a reader can now see it."
86
+ },
87
+ "witnessSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
88
+ "detail": {
89
+ "type": "string",
90
+ "description": "Required by RFC 0148 §A for any disposition other than `executed-pass` — an unexplained `blocked` is an outcome nobody can act on."
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "scenarioManifestSha256": {
98
+ "type": "string",
99
+ "pattern": "^[0-9a-f]{64}$",
100
+ "description": "Digest of the scenario set this run executed. Without it a bundle cannot be distinguished from one produced against a different, smaller suite."
101
+ },
102
+ "targetConfigurationSha256": {
103
+ "type": "string",
104
+ "pattern": "^[0-9a-f]{64}$",
105
+ "description": "RFC 0147 §A.4 — configuration identity. Two runs of the same suite against differently-configured hosts are different evidence, and this is what says so."
106
+ }
107
+ }
108
+ }