@openwop/openwop-conformance 1.153.0 → 1.155.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +11 -2
- package/api/openapi.yaml +17 -1
- package/coverage.md +3 -0
- package/dist/cli.js +7 -2
- package/package.json +31 -2
- package/requirements.json +256 -20
- package/schemas/CORPUS-STAMP.json +100 -3
- package/schemas/README.md +1 -0
- package/schemas/capabilities.schema.json +7 -0
- package/schemas/run-event-payloads.schema.json +9 -0
- package/schemas/run-snapshot.schema.json +4 -0
- package/schemas/subject.schema.json +56 -0
- package/src/cli.ts +7 -5
- package/src/global-setup.ts +13 -0
- package/src/lib/corpus-stamp.ts +125 -0
- package/src/scenarios/anonymous-actor-shape.test.ts +6 -1
- package/src/scenarios/auth-subject-link.test.ts +20 -1
- package/src/scenarios/discovery.test.ts +12 -0
- package/src/scenarios/identity-owner-shape.test.ts +7 -3
- package/src/scenarios/owner-subject-echo.test.ts +127 -0
- package/src/scenarios/owner-subject-shape.test.ts +96 -0
- package/src/scenarios/protocol-versions-array.test.ts +103 -0
- package/src/scenarios/webhook-signed-delivery.test.ts +22 -0
- package/src/lib/capabilities-auth-subject-link.test.ts +0 -103
- package/src/lib/fork-availability.test.ts +0 -69
- package/src/lib/global-setup.test.ts +0 -76
- package/src/lib/grpc-framing.test.ts +0 -96
- package/src/lib/oidc-issuer.test.ts +0 -328
- package/src/lib/otel-collector-grpc.test.ts +0 -191
- package/src/lib/otel-collector.test.ts +0 -303
- package/src/lib/otlp-protobuf.test.ts +0 -461
- package/src/lib/polling.test.ts +0 -80
- package/src/lib/requirement-ids.test.ts +0 -83
- package/src/lib/requirement-ledger.test.ts +0 -75
- package/src/lib/risk-disposition.test.ts +0 -91
- package/src/lib/saml-idp.test.ts +0 -127
- package/src/lib/spec-coherence-registry.test.ts +0 -155
- package/src/lib/webhook-receiver.test.ts +0 -144
- package/src/scenarios/artifact-schema-compile-bounded.test.ts +0 -126
- package/src/scenarios/artifact-type-legacy-ids.test.ts +0 -124
- package/src/scenarios/capability-example-root-layout.test.ts +0 -272
- package/src/scenarios/certification-floor-enforcement.test.ts +0 -204
- package/src/scenarios/chain-subchain-unsupported-refused.test.ts +0 -70
- package/src/scenarios/compensation-profile.test.ts +0 -340
- package/src/scenarios/core-manifest-and-extension-registry.test.ts +0 -250
- package/src/scenarios/discovery-canonical-family-no-shadow.test.ts +0 -219
- package/src/scenarios/edge-condition-truthy-falsy.test.ts +0 -108
- package/src/scenarios/effect-identity-composition.test.ts +0 -129
- package/src/scenarios/effect-identity-cross-scope.test.ts +0 -82
- package/src/scenarios/error-envelope-canonical-shape.test.ts +0 -64
- package/src/scenarios/form-content-packs.test.ts +0 -415
- package/src/scenarios/multi-region-effect-vocabulary.test.ts +0 -175
- package/src/scenarios/normative-example-extraction.test.ts +0 -242
- package/src/scenarios/openapi-asyncapi-sdk-parity.test.ts +0 -309
- package/src/scenarios/pack-manifest-extensions.test.ts +0 -203
- package/src/scenarios/protocol-version-grammar.test.ts +0 -119
- package/src/scenarios/registry-declarative-kinds.test.ts +0 -121
- package/src/scenarios/rfc-0147-self-audit.test.ts +0 -104
- package/src/scenarios/rfc-lifecycle-coherence.test.ts +0 -215
- package/src/scenarios/semantic-digest-v2.test.ts +0 -128
- package/src/scenarios/spec-corpus-validity.test.ts +0 -1727
- package/src/scenarios/spec-section-citations.test.ts +0 -132
- package/src/scenarios/tool-result-trust-monotone.test.ts +0 -168
- package/src/scenarios/versioned-composition-profiles.test.ts +0 -201
- package/src/scenarios/workflow-chain-internal-flag.test.ts +0 -84
- package/src/scenarios/workload-identity-profile.test.ts +0 -184
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# `@openwop/openwop-conformance` Changelog
|
|
2
2
|
|
|
3
|
+
## [1.155.0] — 2026-09-02 — RFC 0165 `Draft → Active`: `protocolVersions[]`, the Subject record, header dual emission
|
|
4
|
+
|
|
5
|
+
Three new scenario files (468 → 471) and four added legs, all additive:
|
|
6
|
+
|
|
7
|
+
- `protocol-versions-array.test.ts` — server-free: the schema declares root `protocolVersions` with the scalar's strict grammar; presence-gated: items match, are unique, contain `protocolVersion`, and profile derivation is unchanged by the array.
|
|
8
|
+
- `owner-subject-shape.test.ts` — server-free: `subject.schema.json` compiles; legacy and workload forms accepted; email/whitespace `subjectId` rejected (invariant `subject-record-opaque`); `keyClass` iff saml/scim; both `owner` sub-objects declare `subject` and the `run.started` echo declares `principalKind`.
|
|
9
|
+
- `owner-subject-echo.test.ts` — gated on a snapshot carrying `owner.subject`: consistency with the owner triple, actor depth ≤ 4, `run.started` echo, fork copies tenant + subject verbatim.
|
|
10
|
+
- Legs: `discovery.test.ts` (standard `ETag` + `If-None-Match` → 304, presence-gated); `webhook-signed-delivery.test.ts` (the `OpenWOP-*` family equals `X-openwop-*` and verifies, presence-gated); `auth-subject-link.test.ts` (legacy subjects never linked — seam-gated, records `blocked`); `identity-owner-shape.test.ts` registers `subject.schema.json`.
|
|
11
|
+
|
|
12
|
+
## [1.154.0] — 2026-09-02 — the tarball carries the suite and nothing else; the vendored contract is digest-checked (v2 charter Phase 1)
|
|
13
|
+
|
|
14
|
+
No new scenario file. Three packed changes:
|
|
15
|
+
|
|
16
|
+
- **Corpus-coherence scenarios and suite self-tests leave the package.** The 28 `SPEC_COHERENCE_SCENARIOS` (they read `spec/v1`, assert nothing about a host, and reported `blocked`/`inapplicable` in every host bundle) and every `src/lib/*.test.ts` are excluded via `package.json` `files` negations; `scripts/check-npm-pack-contents.sh` fails if either returns. The list is published as `conformance/spec-coherence-scenarios.json`. The published layout now collects 1,430 tests across 324 files; the layout gate's floors are re-measured (1,350 / 300).
|
|
17
|
+
- **`schemas/CORPUS-STAMP.json` carries per-file SHA-256 digests** of every vendored `api/` and `schemas/` file, written at `prepack`. `src/lib/corpus-stamp.ts` verifies them at global setup in the published layout and **refuses to run on a mismatch** (missing, altered, or extra vendored files are each named); repo layout and pre-1.154.0 stamps report `not checked`, never a silent pass. This removes the mechanism behind the 1.138.1 defect one layer down: a package can no longer identify its contract by a commit hash it cannot check.
|
|
18
|
+
- **`--offline` is a declared property:** exactly `fixtures-valid.test.ts` (the only server-free scenario that ships and runs in the published layout). `spec-corpus-validity.test.ts` left the set with the coherence scenarios. Documented in README §"--offline".
|
|
19
|
+
|
|
3
20
|
## [1.153.0] — 2026-09-02 — per-`it` requirement rows and the requirement registry (RFC 0148 §A / G3; v2 charter Phase 1)
|
|
4
21
|
|
|
5
22
|
No new scenario file. Three packed changes, all additive to bundle v2:
|
package/README.md
CHANGED
|
@@ -92,9 +92,18 @@ Exit code is non-zero on any failed assertion. `--certify` distinguishes: `0`
|
|
|
92
92
|
|
|
93
93
|
---
|
|
94
94
|
|
|
95
|
+
|
|
96
|
+
### `--offline` — a declared set
|
|
97
|
+
|
|
98
|
+
`openwop-conformance --offline` runs exactly **`src/scenarios/fixtures-valid.test.ts`**: the server-free scenario that ships in the tarball and runs in the published layout. That is the whole set, by declaration (suite 1.154.0), not by whatever happens to skip cleanly. `spec-corpus-validity.test.ts` and the other 27 corpus-coherence scenarios (`spec-coherence-scenarios.json`) read `spec/v1`, assert nothing about a host, and are not packed; run them from a spec checkout with `npm run openwop:check`.
|
|
99
|
+
|
|
100
|
+
### The vendored contract is digest-checked
|
|
101
|
+
|
|
102
|
+
`schemas/CORPUS-STAMP.json` carries `suiteVersion`, `corpusCommit`, and — from 1.154.0 — `files`: a SHA-256 for every vendored `api/` and `schemas/` file. At global setup in the published layout the suite verifies the map and **refuses to run on a mismatch**, naming each missing, altered, or extra file. A hand-patched vendored schema therefore cannot produce evidence. In a spec checkout nothing is vendored and the log line says `corpus stamp not checked`; an older tarball without `files` says so too. Three outcomes, never folded.
|
|
103
|
+
|
|
95
104
|
## What's Covered
|
|
96
105
|
|
|
97
|
-
The current suite has
|
|
106
|
+
The current suite has 471 scenario files under `src/scenarios/`.
|
|
98
107
|
- 2026-08-19 (suite `1.137.0 → 1.138.0`): NEW `durability-poison-exhaustion.test.ts` — RFC 0158 §C.8, the FIRST row of that RFC's conformance table to land. Asserts what `failure-path.test.ts` cannot: not just that deterministically failing work reaches terminal, but that attempts STOP — counted on the log, re-counted after a scaled quiet window, asserted unchanged. A host still redelivering records more. Seam-gated on the existing event-log seam (`blocked` = unobservable, not unmet) and outside every profile floor.
|
|
99
108
|
- 2026-08-19 (suite `1.136.15 → 1.137.0`): NEW `replay-fanout-suppression.test.ts` — capability-gated on `webhooks.supported`, **outside every profile floor**; witnesses `replay.md` §"Host-initiated fan-out is an external effect", which was the largest normative MUST NOT on the replay surface with no scenario and no SECURITY invariant. Three legs in ONE `it` against ONE receiver and ONE subscription — a positive control, the MUST NOT, and a `branch` boundary leg — because "no delivery arrived" passes identically when delivery never worked, so absence is asserted only after presence is proven on that exact wiring. A host with an SSRF guard correctly refuses the loopback receiver and records `blocked`: **unobservable, not unmet.**
|
|
100
109
|
- 2026-08-18 (suite `1.136.7 → 1.136.8`, SP-04): NEW `spec-section-citations.test.ts` — server-free; a `<doc>.md §"<Section>"` citation of a checked doc MUST resolve to a heading that exists. `storage-adapters.md §"Claim acquisition"` was cited by four artifacts, including a normative MUST in `production-profile.md` §Durability, and the section did not exist for the life of RFC 0009. Scoped to the docs whose section citations carry the durability contract; a corpus-wide sweep finds ~260 unresolved citations that need triage before they can gate.
|
|
@@ -438,7 +447,7 @@ Server-required (added in 1.7.0):
|
|
|
438
447
|
| ------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
439
448
|
| **Redaction** | [`capabilities.md`](../spec/v1/capabilities.md) §"Secrets" + NFR-7 + §"aiProviders" | Vendor-neutral assertions that the server doesn't leak secret material. Three scenario groups: (a) discovery shape contract — `secrets` + `aiProviders` advertisements are well-formed regardless of `secrets.supported`; when `supported === true`, scopes MUST be non-empty + `resolution === 'host-managed'`; `byok ⊆ supported`. (b) bearer-token redaction — invalid Bearer canary in `Authorization` header is not echoed in the 401 response body. (c) credentialRef echo control — gated on `secrets.supported === true`; canary planted in `configurable.ai.credentialRef` MUST NOT appear in any RunEvent payload (poll-based capture; transport-agnostic). Uses runtime-built canary fixtures (`lib/canaries.ts`) that defeat static secret scanners. 6 scenarios. |
|
|
440
449
|
|
|
441
|
-
Current source tree:
|
|
450
|
+
Current source tree: 471 scenario files. Use [`coverage.md`](./coverage.md) for current grade/gap tracking.
|
|
442
451
|
|
|
443
452
|
## Remaining Gaps
|
|
444
453
|
|
package/api/openapi.yaml
CHANGED
|
@@ -109,6 +109,14 @@ paths:
|
|
|
109
109
|
summary: Capability declaration handshake.
|
|
110
110
|
operationId: getCapabilities
|
|
111
111
|
security: []
|
|
112
|
+
parameters:
|
|
113
|
+
- name: If-None-Match
|
|
114
|
+
in: header
|
|
115
|
+
required: false
|
|
116
|
+
schema: { type: string }
|
|
117
|
+
description: >-
|
|
118
|
+
RFC 0165 §C.2. Standard conditional request against the discovery document's `ETag`;
|
|
119
|
+
a matching value SHOULD yield `304 Not Modified`.
|
|
112
120
|
responses:
|
|
113
121
|
'200':
|
|
114
122
|
description: Capabilities object — see `capabilities.md`.
|
|
@@ -116,13 +124,21 @@ paths:
|
|
|
116
124
|
Cache-Control:
|
|
117
125
|
schema: { type: string }
|
|
118
126
|
example: 'public, max-age=300'
|
|
127
|
+
ETag:
|
|
128
|
+
schema: { type: string }
|
|
129
|
+
description: >-
|
|
130
|
+
RFC 0165 §C.2. Standard strong validator for the response bytes (SHOULD be sent).
|
|
131
|
+
Distinct from `Capabilities-Etag`, which validates negotiation safety
|
|
132
|
+
(`capabilities-change-detection.md` §"Cache validators").
|
|
119
133
|
Capabilities-Etag:
|
|
120
134
|
schema: { type: string }
|
|
121
|
-
description: Optional probe handle for mid-session capability change detection.
|
|
135
|
+
description: Optional probe handle for mid-session capability change detection. Deprecated toward v2 (RFC 0165 §C.2).
|
|
122
136
|
content:
|
|
123
137
|
application/json:
|
|
124
138
|
schema:
|
|
125
139
|
$ref: '#/components/schemas/Capabilities'
|
|
140
|
+
'304':
|
|
141
|
+
description: RFC 0165 §C.2 — `If-None-Match` matched the current `ETag`; the body is unchanged.
|
|
126
142
|
'503':
|
|
127
143
|
description: Server unable to compute capabilities (transient).
|
|
128
144
|
content:
|
package/coverage.md
CHANGED
|
@@ -112,6 +112,9 @@ The scenario groups in the table below (one row per group; count the rows — th
|
|
|
112
112
|
| `oauth-authorization-code-roundtrip.test.ts` | `capabilities.oauth` (RFC 0047 §C) + `SECURITY/invariants.yaml` `credential-payload-redaction` | A (capability-gated on `oauth.supported` + `grants` ∋ `authorization_code`; behavioral roundtrip via optional `POST /v1/host/sample/oauth/authorize-code-roundtrip` seam against the one canonical synthetic provider in `fixtures/oauth-providers/synthetic.json` — returns a credential REFERENCE; the authorization code / state / PKCE verifier / acquired access+refresh tokens are absent from every observable surface; `connector.authorized` carries the ref not the token) | `host-pending` | Capability+grant-gated; behavioral probe soft-skips on 404. Closes the RFC 0047 Tier-2 gap — exercises the actual authorization-code dance (shape + redaction scenarios existed; the grant itself was unexercised). |
|
|
113
113
|
| `connector-manifest-validity.test.ts` | `node-pack-manifest.schema.json` §Connector (RFC 0045, `node-packs.md` §Connectors) | Server-free (schema validity of the `connector` block incl. both ConnectorAuth variants + positive/negative round-trip; §B action/trigger typeId-resolution semantics — `connector_action_unresolved` on an unknown typeId) | host-pass (server-free) | Always runs; no host needed. Behavioral idempotency-hint + rate-limit-honored scenarios deferred until a host advertises a connector. |
|
|
114
114
|
| `identity-owner-shape.test.ts` | `run-snapshot.schema.json` properties.owner (RFC 0048 §C, `auth.md` §Identity claims) | Server-free (owner triple schema validity: positive `{tenant}` + full triple; negative missing-tenant + unknown-prop) | host-pass (server-free) | Always runs; no host needed. |
|
|
115
|
+
| `protocol-versions-array.test.ts` | RFC 0165 §A (`version-negotiation.md` §"`protocolVersions[]`") | A (server-free: schema declares the array with the scalar's grammar) + B (presence-gated: items match, unique, contain `protocolVersion`; profile derivation unchanged) | host-pending (presence-gated) | A host that omits the array records `inapplicable`. |
|
|
116
|
+
| `owner-subject-shape.test.ts` | RFC 0165 §B.1–§B.2 (`schemas/subject.schema.json`; both `owner` sub-objects) | Server-free: subject compiles; legacy + workload forms accepted; email/whitespace `subjectId` rejected (invariant `subject-record-opaque`); keyClass iff saml/scim; both owner sub-objects declare `subject` and the echo declares `principalKind` | host-pass (server-free) | Always runs; no host needed. |
|
|
117
|
+
| `owner-subject-echo.test.ts` | RFC 0165 §B.2, §B.4, §B.5 (`auth.md` §"The Subject record", `replay.md` §"Fork ownership") | B (gated on a snapshot carrying `owner.subject`): tenant/subjectId/kind/keyClass consistency, actor depth ≤ 4, `run.started` echo equals the snapshot, fork copies tenant + subject verbatim | host-pending (gated) | A host that does not emit `owner.subject` records `inapplicable`. |
|
|
115
118
|
| `cross-workspace-isolation.test.ts` | RFC 0048 §C/§D (`auth.md` §Identity claims, `rest-endpoints.md` `run_forbidden`) | A (owner-echo shape if a sample run is readable; §D isolation MUST-NOT via optional `POST /v1/host/sample/identity/cross-workspace-read` seam — cross-workspace read fails closed with `run_forbidden`/`not_found`) | `host-pending` | Behavioral probe soft-skips on 404; no host advertises run ownership yet (RFC 0048 `Draft`). |
|
|
116
119
|
| `authorization-roles-shape.test.ts` | `capabilities.authorization` (RFC 0049 §A, `auth.md` §"Role-based authorization") | A (advertisement shape always — `supported` boolean; `failClosed` const true; every `roles[].role` non-empty + `scopes` array) | `host-pending` | Always runs; asserts the block is absent or well-formed. |
|
|
117
120
|
| `authorization-fail-closed.test.ts` | `capabilities.authorization` (RFC 0049 §C) + `SECURITY/invariants.yaml` `authorization-fail-closed` | A (advertisement `failClosed===true` always; fail-closed MUST-NOT via optional `POST /v1/host/sample/authorization/decide` seam — an unseeded-role principal resolves `allowed:false`) | `host-pending` | Capability-gated on `authorization.supported`; behavioral probe soft-skips on 404. Scope-match + denial-audited scenarios deferred to a host. |
|
package/dist/cli.js
CHANGED
|
@@ -161,7 +161,7 @@ Required (unless --offline):
|
|
|
161
161
|
--api-key <key> Bearer-style API key (or set OPENWOP_API_KEY env var)
|
|
162
162
|
|
|
163
163
|
Filtering:
|
|
164
|
-
--offline Run only the server-free subset (fixtures
|
|
164
|
+
--offline Run only the declared server-free subset (fixtures-valid; see README §"--offline")
|
|
165
165
|
--filter <pattern> Pass through to vitest --testNamePattern
|
|
166
166
|
|
|
167
167
|
Implementation labels (cosmetic — surface in failure messages):
|
|
@@ -572,7 +572,12 @@ async function main() {
|
|
|
572
572
|
// the conformance package is used as a workspace member.
|
|
573
573
|
const vitestArgs = ['run', '--config', resolvePath(conformanceRoot, 'vitest.config.ts')];
|
|
574
574
|
if (args.offline) {
|
|
575
|
-
|
|
575
|
+
// Suite 1.154.0: the offline set is a DECLARED property of the package —
|
|
576
|
+
// exactly the server-free scenarios that ship in the tarball and run in
|
|
577
|
+
// the published layout. `spec-corpus-validity.test.ts` left the set: it is
|
|
578
|
+
// a corpus-coherence scenario (reads spec/v1, asserts nothing about a host)
|
|
579
|
+
// and is no longer packed. See conformance/README.md §"--offline".
|
|
580
|
+
vitestArgs.push('src/scenarios/fixtures-valid.test.ts');
|
|
576
581
|
}
|
|
577
582
|
if (args.filter) {
|
|
578
583
|
vitestArgs.push('--testNamePattern', args.filter);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.155.0",
|
|
4
4
|
"description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -26,7 +26,36 @@
|
|
|
26
26
|
"vitest.config.ts",
|
|
27
27
|
"README.md",
|
|
28
28
|
"CHANGELOG.md",
|
|
29
|
-
"LICENSE"
|
|
29
|
+
"LICENSE",
|
|
30
|
+
"!src/lib/*.test.ts",
|
|
31
|
+
"!src/scenarios/artifact-schema-compile-bounded.test.ts",
|
|
32
|
+
"!src/scenarios/artifact-type-legacy-ids.test.ts",
|
|
33
|
+
"!src/scenarios/capability-example-root-layout.test.ts",
|
|
34
|
+
"!src/scenarios/certification-floor-enforcement.test.ts",
|
|
35
|
+
"!src/scenarios/chain-subchain-unsupported-refused.test.ts",
|
|
36
|
+
"!src/scenarios/compensation-profile.test.ts",
|
|
37
|
+
"!src/scenarios/core-manifest-and-extension-registry.test.ts",
|
|
38
|
+
"!src/scenarios/discovery-canonical-family-no-shadow.test.ts",
|
|
39
|
+
"!src/scenarios/edge-condition-truthy-falsy.test.ts",
|
|
40
|
+
"!src/scenarios/effect-identity-composition.test.ts",
|
|
41
|
+
"!src/scenarios/effect-identity-cross-scope.test.ts",
|
|
42
|
+
"!src/scenarios/error-envelope-canonical-shape.test.ts",
|
|
43
|
+
"!src/scenarios/form-content-packs.test.ts",
|
|
44
|
+
"!src/scenarios/multi-region-effect-vocabulary.test.ts",
|
|
45
|
+
"!src/scenarios/normative-example-extraction.test.ts",
|
|
46
|
+
"!src/scenarios/openapi-asyncapi-sdk-parity.test.ts",
|
|
47
|
+
"!src/scenarios/pack-manifest-extensions.test.ts",
|
|
48
|
+
"!src/scenarios/protocol-version-grammar.test.ts",
|
|
49
|
+
"!src/scenarios/registry-declarative-kinds.test.ts",
|
|
50
|
+
"!src/scenarios/rfc-0147-self-audit.test.ts",
|
|
51
|
+
"!src/scenarios/rfc-lifecycle-coherence.test.ts",
|
|
52
|
+
"!src/scenarios/semantic-digest-v2.test.ts",
|
|
53
|
+
"!src/scenarios/spec-corpus-validity.test.ts",
|
|
54
|
+
"!src/scenarios/spec-section-citations.test.ts",
|
|
55
|
+
"!src/scenarios/tool-result-trust-monotone.test.ts",
|
|
56
|
+
"!src/scenarios/versioned-composition-profiles.test.ts",
|
|
57
|
+
"!src/scenarios/workflow-chain-internal-flag.test.ts",
|
|
58
|
+
"!src/scenarios/workload-identity-profile.test.ts"
|
|
30
59
|
],
|
|
31
60
|
"scripts": {
|
|
32
61
|
"test": "vitest run",
|
package/requirements.json
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
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":
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
5
|
+
"files": 471,
|
|
6
|
+
"tests": 1968,
|
|
7
|
+
"withStableId": 1945,
|
|
8
8
|
"interpolatedTitles": 23,
|
|
9
9
|
"explicitIds": 0
|
|
10
10
|
},
|
|
@@ -3479,7 +3479,7 @@
|
|
|
3479
3479
|
{
|
|
3480
3480
|
"id": "openwop.it.anonymous-actor-shape.a-content-free-anon-grant-deny-record-validates-against-the-existing-def",
|
|
3481
3481
|
"file": "anonymous-actor-shape.test.ts",
|
|
3482
|
-
"line":
|
|
3482
|
+
"line": 147,
|
|
3483
3483
|
"title": "a content-free anon grant + deny record validates against the existing $def",
|
|
3484
3484
|
"explicitId": null,
|
|
3485
3485
|
"citations": []
|
|
@@ -3487,7 +3487,7 @@
|
|
|
3487
3487
|
{
|
|
3488
3488
|
"id": "openwop.it.anonymous-actor-shape.authorization-decided-is-in-the-runeventtype-enum-the-reused-audit-event",
|
|
3489
3489
|
"file": "anonymous-actor-shape.test.ts",
|
|
3490
|
-
"line":
|
|
3490
|
+
"line": 173,
|
|
3491
3491
|
"title": "authorization.decided is in the RunEventType enum (the reused audit event)",
|
|
3492
3492
|
"explicitId": null,
|
|
3493
3493
|
"citations": []
|
|
@@ -4531,6 +4531,14 @@
|
|
|
4531
4531
|
}
|
|
4532
4532
|
]
|
|
4533
4533
|
},
|
|
4534
|
+
{
|
|
4535
|
+
"id": "openwop.it.auth-subject-link.a-scim-deactivation-does-not-deny-a-saml-login-whose-run-subject-is-legacy-issue",
|
|
4536
|
+
"file": "auth-subject-link.test.ts",
|
|
4537
|
+
"line": 201,
|
|
4538
|
+
"title": "a SCIM deactivation does not deny a SAML login whose run subject is legacy-issued",
|
|
4539
|
+
"explicitId": null,
|
|
4540
|
+
"citations": []
|
|
4541
|
+
},
|
|
4534
4542
|
{
|
|
4535
4543
|
"id": "openwop.it.auth.returns-401-with-canonical-error-envelope-per-auth-md-3",
|
|
4536
4544
|
"file": "auth.test.ts",
|
|
@@ -7998,7 +8006,7 @@
|
|
|
7998
8006
|
{
|
|
7999
8007
|
"id": "openwop.it.discovery.returns-200-with-required-capabilities-fields-per-capabilities-md-2",
|
|
8000
8008
|
"file": "discovery.test.ts",
|
|
8001
|
-
"line":
|
|
8009
|
+
"line": 16,
|
|
8002
8010
|
"title": "returns 200 with required Capabilities fields per capabilities.md §2",
|
|
8003
8011
|
"explicitId": null,
|
|
8004
8012
|
"citations": [
|
|
@@ -8020,7 +8028,7 @@
|
|
|
8020
8028
|
{
|
|
8021
8029
|
"id": "openwop.it.discovery.serves-cache-control-per-capabilities-md-4-caching-guidance",
|
|
8022
8030
|
"file": "discovery.test.ts",
|
|
8023
|
-
"line":
|
|
8031
|
+
"line": 36,
|
|
8024
8032
|
"title": "serves Cache-Control per capabilities.md §4 (caching guidance)",
|
|
8025
8033
|
"explicitId": null,
|
|
8026
8034
|
"citations": [
|
|
@@ -8030,10 +8038,27 @@
|
|
|
8030
8038
|
}
|
|
8031
8039
|
]
|
|
8032
8040
|
},
|
|
8041
|
+
{
|
|
8042
|
+
"id": "openwop.it.discovery.if-a-standard-etag-is-present-a-matching-if-none-match-yields-304-rfc-0165-c-2-p",
|
|
8043
|
+
"file": "discovery.test.ts",
|
|
8044
|
+
"line": 46,
|
|
8045
|
+
"title": "IF a standard ETag is present, a matching If-None-Match yields 304 (RFC 0165 §C.2 — presence-gated)",
|
|
8046
|
+
"explicitId": null,
|
|
8047
|
+
"citations": [
|
|
8048
|
+
{
|
|
8049
|
+
"section": "RFC 0165 §C.2",
|
|
8050
|
+
"requirement": "ETag, when present, MUST be a non-empty validator"
|
|
8051
|
+
},
|
|
8052
|
+
{
|
|
8053
|
+
"section": "capabilities-change-detection.md §\"Cache validators\"",
|
|
8054
|
+
"requirement": "a matching If-None-Match SHOULD yield 304 Not Modified"
|
|
8055
|
+
}
|
|
8056
|
+
]
|
|
8057
|
+
},
|
|
8033
8058
|
{
|
|
8034
8059
|
"id": "openwop.it.discovery.if-capabilities-etag-is-present-it-is-non-empty-and-stable-within-the-cache-wind",
|
|
8035
8060
|
"file": "discovery.test.ts",
|
|
8036
|
-
"line":
|
|
8061
|
+
"line": 57,
|
|
8037
8062
|
"title": "IF Capabilities-Etag is present, it is non-empty and stable within the cache window",
|
|
8038
8063
|
"explicitId": null,
|
|
8039
8064
|
"citations": [
|
|
@@ -8054,7 +8079,7 @@
|
|
|
8054
8079
|
{
|
|
8055
8080
|
"id": "openwop.it.discovery.declares-non-zero-limits-per-capabilities-md-3-capabilitylimiter-shape",
|
|
8056
8081
|
"file": "discovery.test.ts",
|
|
8057
|
-
"line":
|
|
8082
|
+
"line": 83,
|
|
8058
8083
|
"title": "declares non-zero limits per capabilities.md §3 (CapabilityLimiter shape)",
|
|
8059
8084
|
"explicitId": null,
|
|
8060
8085
|
"citations": [
|
|
@@ -8077,7 +8102,7 @@
|
|
|
8077
8102
|
{
|
|
8078
8103
|
"id": "openwop.it.discovery.if-fixtures-is-present-it-must-be-a-string-of-unique-non-empty-entries",
|
|
8079
8104
|
"file": "discovery.test.ts",
|
|
8080
|
-
"line":
|
|
8105
|
+
"line": 107,
|
|
8081
8106
|
"title": "IF fixtures is present, it MUST be a string[] of unique non-empty entries",
|
|
8082
8107
|
"explicitId": null,
|
|
8083
8108
|
"citations": [
|
|
@@ -8102,7 +8127,7 @@
|
|
|
8102
8127
|
{
|
|
8103
8128
|
"id": "openwop.it.discovery.returns-200-with-a-parseable-openapi-3-1-document",
|
|
8104
8129
|
"file": "discovery.test.ts",
|
|
8105
|
-
"line":
|
|
8130
|
+
"line": 147,
|
|
8106
8131
|
"title": "returns 200 with a parseable OpenAPI 3.1 document",
|
|
8107
8132
|
"explicitId": null,
|
|
8108
8133
|
"citations": [
|
|
@@ -8119,7 +8144,7 @@
|
|
|
8119
8144
|
{
|
|
8120
8145
|
"id": "openwop.it.discovery.host-claiming-auth-scoped-discovery-advertises-required-fields",
|
|
8121
8146
|
"file": "discovery.test.ts",
|
|
8122
|
-
"line":
|
|
8147
|
+
"line": 206,
|
|
8123
8148
|
"title": "host claiming auth-scoped discovery advertises required fields",
|
|
8124
8149
|
"explicitId": null,
|
|
8125
8150
|
"citations": [
|
|
@@ -8140,7 +8165,7 @@
|
|
|
8140
8165
|
{
|
|
8141
8166
|
"id": "openwop.it.discovery.authenticated-discovery-preserves-required-capabilities-fields",
|
|
8142
8167
|
"file": "discovery.test.ts",
|
|
8143
|
-
"line":
|
|
8168
|
+
"line": 242,
|
|
8144
8169
|
"title": "authenticated discovery preserves required Capabilities fields",
|
|
8145
8170
|
"explicitId": null,
|
|
8146
8171
|
"citations": [
|
|
@@ -8158,7 +8183,7 @@
|
|
|
8158
8183
|
{
|
|
8159
8184
|
"id": "openwop.it.discovery.unauthorized-key-must-not-reveal-capabilities-outside-its-authorization",
|
|
8160
8185
|
"file": "discovery.test.ts",
|
|
8161
|
-
"line":
|
|
8186
|
+
"line": 283,
|
|
8162
8187
|
"title": "unauthorized key MUST NOT reveal capabilities outside its authorization",
|
|
8163
8188
|
"explicitId": null,
|
|
8164
8189
|
"citations": [
|
|
@@ -11581,7 +11606,7 @@
|
|
|
11581
11606
|
{
|
|
11582
11607
|
"id": "openwop.it.identity-owner-shape.run-snapshot-schema-json-defines-an-optional-owner-triple",
|
|
11583
11608
|
"file": "identity-owner-shape.test.ts",
|
|
11584
|
-
"line":
|
|
11609
|
+
"line": 37,
|
|
11585
11610
|
"title": "run-snapshot.schema.json defines an optional owner triple",
|
|
11586
11611
|
"explicitId": null,
|
|
11587
11612
|
"citations": []
|
|
@@ -11589,7 +11614,7 @@
|
|
|
11589
11614
|
{
|
|
11590
11615
|
"id": "openwop.it.identity-owner-shape.positive-tenant-only-owner-validates",
|
|
11591
11616
|
"file": "identity-owner-shape.test.ts",
|
|
11592
|
-
"line":
|
|
11617
|
+
"line": 50,
|
|
11593
11618
|
"title": "positive: tenant-only owner validates",
|
|
11594
11619
|
"explicitId": null,
|
|
11595
11620
|
"citations": []
|
|
@@ -11597,7 +11622,7 @@
|
|
|
11597
11622
|
{
|
|
11598
11623
|
"id": "openwop.it.identity-owner-shape.positive-full-triple-validates",
|
|
11599
11624
|
"file": "identity-owner-shape.test.ts",
|
|
11600
|
-
"line":
|
|
11625
|
+
"line": 54,
|
|
11601
11626
|
"title": "positive: full triple validates",
|
|
11602
11627
|
"explicitId": null,
|
|
11603
11628
|
"citations": []
|
|
@@ -11605,7 +11630,7 @@
|
|
|
11605
11630
|
{
|
|
11606
11631
|
"id": "openwop.it.identity-owner-shape.negative-owner-missing-tenant-is-rejected-tenant-is-required",
|
|
11607
11632
|
"file": "identity-owner-shape.test.ts",
|
|
11608
|
-
"line":
|
|
11633
|
+
"line": 61,
|
|
11609
11634
|
"title": "negative: owner missing tenant is rejected (tenant is required)",
|
|
11610
11635
|
"explicitId": null,
|
|
11611
11636
|
"citations": []
|
|
@@ -11613,7 +11638,7 @@
|
|
|
11613
11638
|
{
|
|
11614
11639
|
"id": "openwop.it.identity-owner-shape.negative-unknown-owner-property-is-rejected-additionalproperties-false",
|
|
11615
11640
|
"file": "identity-owner-shape.test.ts",
|
|
11616
|
-
"line":
|
|
11641
|
+
"line": 65,
|
|
11617
11642
|
"title": "negative: unknown owner property is rejected (additionalProperties:false)",
|
|
11618
11643
|
"explicitId": null,
|
|
11619
11644
|
"citations": []
|
|
@@ -14556,6 +14581,141 @@
|
|
|
14556
14581
|
}
|
|
14557
14582
|
]
|
|
14558
14583
|
},
|
|
14584
|
+
{
|
|
14585
|
+
"id": "openwop.it.owner-subject-echo.subject-is-consistent-with-the-owner-triple-b-2-and-the-actor-chain-is-bounded-b",
|
|
14586
|
+
"file": "owner-subject-echo.test.ts",
|
|
14587
|
+
"line": 77,
|
|
14588
|
+
"title": "subject is consistent with the owner triple (§B.2) and the actor chain is bounded (§B.5)",
|
|
14589
|
+
"explicitId": null,
|
|
14590
|
+
"citations": [
|
|
14591
|
+
{
|
|
14592
|
+
"section": "RFC 0165 §B.2",
|
|
14593
|
+
"requirement": "subject.tenant MUST equal owner.tenant"
|
|
14594
|
+
},
|
|
14595
|
+
{
|
|
14596
|
+
"section": "RFC 0165 §B.2",
|
|
14597
|
+
"requirement": "subject.subjectId MUST equal owner.principal when both are present"
|
|
14598
|
+
},
|
|
14599
|
+
{
|
|
14600
|
+
"section": "RFC 0165 §B.2",
|
|
14601
|
+
"requirement": "subject.kind MUST equal owner.principalKind when both are present"
|
|
14602
|
+
},
|
|
14603
|
+
{
|
|
14604
|
+
"section": "RFC 0165 §B.2",
|
|
14605
|
+
"requirement": "keyClass MUST be present on a linkable lane"
|
|
14606
|
+
},
|
|
14607
|
+
{
|
|
14608
|
+
"section": "RFC 0165 §B.2",
|
|
14609
|
+
"requirement": "keyClass MUST be absent off the linkable lanes"
|
|
14610
|
+
},
|
|
14611
|
+
{
|
|
14612
|
+
"section": "RFC 0165 §B.5",
|
|
14613
|
+
"requirement": "actor chain depth MUST NOT exceed 4"
|
|
14614
|
+
}
|
|
14615
|
+
]
|
|
14616
|
+
},
|
|
14617
|
+
{
|
|
14618
|
+
"id": "openwop.it.owner-subject-echo.run-started-echoes-the-snapshot-subject-verbatim-b-2-rfc-0048-c",
|
|
14619
|
+
"file": "owner-subject-echo.test.ts",
|
|
14620
|
+
"line": 99,
|
|
14621
|
+
"title": "run.started echoes the snapshot subject verbatim (§B.2, RFC 0048 §C)",
|
|
14622
|
+
"explicitId": null,
|
|
14623
|
+
"citations": [
|
|
14624
|
+
{
|
|
14625
|
+
"section": "RFC 0048 §C",
|
|
14626
|
+
"requirement": "run.started MUST be present in the event log"
|
|
14627
|
+
},
|
|
14628
|
+
{
|
|
14629
|
+
"section": "RFC 0165 §B.2",
|
|
14630
|
+
"requirement": "run.started owner.subject MUST equal RunSnapshot.owner.subject"
|
|
14631
|
+
}
|
|
14632
|
+
]
|
|
14633
|
+
},
|
|
14634
|
+
{
|
|
14635
|
+
"id": "openwop.it.owner-subject-echo.a-fork-copies-owner-tenant-and-owner-subject-verbatim-onto-the-child-b-4",
|
|
14636
|
+
"file": "owner-subject-echo.test.ts",
|
|
14637
|
+
"line": 110,
|
|
14638
|
+
"title": "a fork copies owner.tenant and owner.subject verbatim onto the child (§B.4)",
|
|
14639
|
+
"explicitId": null,
|
|
14640
|
+
"citations": [
|
|
14641
|
+
{
|
|
14642
|
+
"section": "replay.md §\"Fork ownership\"",
|
|
14643
|
+
"requirement": ":fork MUST return 201 for a completed noop run"
|
|
14644
|
+
},
|
|
14645
|
+
{
|
|
14646
|
+
"section": "RFC 0165 §B.4",
|
|
14647
|
+
"requirement": "the child owner.tenant MUST equal the source"
|
|
14648
|
+
},
|
|
14649
|
+
{
|
|
14650
|
+
"section": "RFC 0165 §B.4",
|
|
14651
|
+
"requirement": "the child owner.subject MUST be copied verbatim from the source"
|
|
14652
|
+
}
|
|
14653
|
+
]
|
|
14654
|
+
},
|
|
14655
|
+
{
|
|
14656
|
+
"id": "openwop.it.owner-subject-shape.compiles-and-accepts-a-full-saml-subject",
|
|
14657
|
+
"file": "owner-subject-shape.test.ts",
|
|
14658
|
+
"line": 43,
|
|
14659
|
+
"title": "compiles and accepts a full SAML subject",
|
|
14660
|
+
"explicitId": null,
|
|
14661
|
+
"citations": []
|
|
14662
|
+
},
|
|
14663
|
+
{
|
|
14664
|
+
"id": "openwop.it.owner-subject-shape.accepts-the-legacy-issuer-form-rfc-0165-b-3-and-a-workload-subject",
|
|
14665
|
+
"file": "owner-subject-shape.test.ts",
|
|
14666
|
+
"line": 47,
|
|
14667
|
+
"title": "accepts the legacy issuer form (RFC 0165 §B.3) and a workload subject",
|
|
14668
|
+
"explicitId": null,
|
|
14669
|
+
"citations": []
|
|
14670
|
+
},
|
|
14671
|
+
{
|
|
14672
|
+
"id": "openwop.it.owner-subject-shape.rejects-an-email-shaped-or-whitespace-subjectid-invariant-subject-record-opaque",
|
|
14673
|
+
"file": "owner-subject-shape.test.ts",
|
|
14674
|
+
"line": 52,
|
|
14675
|
+
"title": "rejects an email-shaped or whitespace subjectId (invariant subject-record-opaque)",
|
|
14676
|
+
"explicitId": null,
|
|
14677
|
+
"citations": []
|
|
14678
|
+
},
|
|
14679
|
+
{
|
|
14680
|
+
"id": "openwop.it.owner-subject-shape.requires-keyclass-on-the-saml-scim-lanes-and-forbids-it-elsewhere",
|
|
14681
|
+
"file": "owner-subject-shape.test.ts",
|
|
14682
|
+
"line": 57,
|
|
14683
|
+
"title": "requires keyClass on the saml/scim lanes and forbids it elsewhere",
|
|
14684
|
+
"explicitId": null,
|
|
14685
|
+
"citations": []
|
|
14686
|
+
},
|
|
14687
|
+
{
|
|
14688
|
+
"id": "openwop.it.owner-subject-shape.rejects-an-unknown-member-and-a-missing-required-member",
|
|
14689
|
+
"file": "owner-subject-shape.test.ts",
|
|
14690
|
+
"line": 64,
|
|
14691
|
+
"title": "rejects an unknown member and a missing required member",
|
|
14692
|
+
"explicitId": null,
|
|
14693
|
+
"citations": []
|
|
14694
|
+
},
|
|
14695
|
+
{
|
|
14696
|
+
"id": "openwop.it.owner-subject-shape.accepts-a-nested-actor-chain-depth-is-a-host-obligation-rfc-0165-b-5",
|
|
14697
|
+
"file": "owner-subject-shape.test.ts",
|
|
14698
|
+
"line": 70,
|
|
14699
|
+
"title": "accepts a nested actor chain (depth is a host obligation, RFC 0165 §B.5)",
|
|
14700
|
+
"explicitId": null,
|
|
14701
|
+
"citations": []
|
|
14702
|
+
},
|
|
14703
|
+
{
|
|
14704
|
+
"id": "openwop.it.owner-subject-shape.runsnapshot-owner-accepts-a-subject-and-still-rejects-an-undeclared-member",
|
|
14705
|
+
"file": "owner-subject-shape.test.ts",
|
|
14706
|
+
"line": 82,
|
|
14707
|
+
"title": "RunSnapshot.owner accepts a subject and still rejects an undeclared member",
|
|
14708
|
+
"explicitId": null,
|
|
14709
|
+
"citations": []
|
|
14710
|
+
},
|
|
14711
|
+
{
|
|
14712
|
+
"id": "openwop.it.owner-subject-shape.run-started-owner-echo-accepts-the-same-subject-and-principalkind-the-echo-match",
|
|
14713
|
+
"file": "owner-subject-shape.test.ts",
|
|
14714
|
+
"line": 88,
|
|
14715
|
+
"title": "run.started owner echo accepts the same subject AND principalKind (the echo matches the snapshot)",
|
|
14716
|
+
"explicitId": null,
|
|
14717
|
+
"citations": []
|
|
14718
|
+
},
|
|
14559
14719
|
{
|
|
14560
14720
|
"id": "openwop.it.pack-manifest-extension-opacity.leg-1-an-extension-bearing-manifest-installs",
|
|
14561
14721
|
"file": "pack-manifest-extension-opacity.test.ts",
|
|
@@ -16816,6 +16976,73 @@
|
|
|
16816
16976
|
"explicitId": null,
|
|
16817
16977
|
"citations": []
|
|
16818
16978
|
},
|
|
16979
|
+
{
|
|
16980
|
+
"id": "openwop.it.protocol-versions-array.declares-root-protocolversions-as-a-unique-non-empty-string-array",
|
|
16981
|
+
"file": "protocol-versions-array.test.ts",
|
|
16982
|
+
"line": 44,
|
|
16983
|
+
"title": "declares root `protocolVersions` as a unique, non-empty string array",
|
|
16984
|
+
"explicitId": null,
|
|
16985
|
+
"citations": []
|
|
16986
|
+
},
|
|
16987
|
+
{
|
|
16988
|
+
"id": "openwop.it.protocol-versions-array.item-grammar-equals-the-scalar-grammar-one-axis-one-grammar",
|
|
16989
|
+
"file": "protocol-versions-array.test.ts",
|
|
16990
|
+
"line": 52,
|
|
16991
|
+
"title": "item grammar equals the scalar grammar (one axis, one grammar)",
|
|
16992
|
+
"explicitId": null,
|
|
16993
|
+
"citations": []
|
|
16994
|
+
},
|
|
16995
|
+
{
|
|
16996
|
+
"id": "openwop.it.protocol-versions-array.accepts-1-11-2-0-rejects-01-0-1-0-0-duplicates-and-empty",
|
|
16997
|
+
"file": "protocol-versions-array.test.ts",
|
|
16998
|
+
"line": 59,
|
|
16999
|
+
"title": "accepts [\"1.11\", \"2.0\"], rejects \"01.0\", \"1.0.0\", duplicates, and empty",
|
|
17000
|
+
"explicitId": null,
|
|
17001
|
+
"citations": []
|
|
17002
|
+
},
|
|
17003
|
+
{
|
|
17004
|
+
"id": "openwop.it.protocol-versions-array.when-advertised-every-item-matches-the-grammar-items-are-unique-and-the-array-co",
|
|
17005
|
+
"file": "protocol-versions-array.test.ts",
|
|
17006
|
+
"line": 73,
|
|
17007
|
+
"title": "when advertised, every item matches the grammar, items are unique, and the array contains protocolVersion",
|
|
17008
|
+
"explicitId": null,
|
|
17009
|
+
"citations": [
|
|
17010
|
+
{
|
|
17011
|
+
"section": "RFC 0165 §A.1",
|
|
17012
|
+
"requirement": "protocolVersions MUST be an array"
|
|
17013
|
+
},
|
|
17014
|
+
{
|
|
17015
|
+
"section": "RFC 0165 §A.1",
|
|
17016
|
+
"requirement": "protocolVersions MUST be non-empty"
|
|
17017
|
+
},
|
|
17018
|
+
{
|
|
17019
|
+
"section": "RFC 0165 §A.1",
|
|
17020
|
+
"requirement": null,
|
|
17021
|
+
"interpolated": true
|
|
17022
|
+
},
|
|
17023
|
+
{
|
|
17024
|
+
"section": "RFC 0165 §A.1",
|
|
17025
|
+
"requirement": "protocolVersions items MUST be unique"
|
|
17026
|
+
},
|
|
17027
|
+
{
|
|
17028
|
+
"section": "RFC 0165 §A.2",
|
|
17029
|
+
"requirement": "protocolVersions MUST contain the value of protocolVersion"
|
|
17030
|
+
}
|
|
17031
|
+
]
|
|
17032
|
+
},
|
|
17033
|
+
{
|
|
17034
|
+
"id": "openwop.it.protocol-versions-array.profile-derivation-is-unchanged-by-the-array-iscore-reads-the-scalar-only",
|
|
17035
|
+
"file": "protocol-versions-array.test.ts",
|
|
17036
|
+
"line": 90,
|
|
17037
|
+
"title": "profile derivation is unchanged by the array (isCore reads the scalar only)",
|
|
17038
|
+
"explicitId": null,
|
|
17039
|
+
"citations": [
|
|
17040
|
+
{
|
|
17041
|
+
"section": "RFC 0165 §A.2",
|
|
17042
|
+
"requirement": "openwop-discovery-core derivation MUST NOT depend on protocolVersions in v1.x"
|
|
17043
|
+
}
|
|
17044
|
+
]
|
|
17045
|
+
},
|
|
16819
17046
|
{
|
|
16820
17047
|
"id": "openwop.it.provider-usage.capabilities-providerusage-is-either-absent-or-a-well-formed-object",
|
|
16821
17048
|
"file": "provider-usage.test.ts",
|
|
@@ -22365,13 +22592,22 @@
|
|
|
22365
22592
|
{
|
|
22366
22593
|
"section": "webhooks.md §\"Delivery headers\"",
|
|
22367
22594
|
"requirement": "X-openwop-Signature MUST be sha256=HMAC-SHA256(secret, `${X-openwop-Timestamp}.${rawBody}`)"
|
|
22595
|
+
},
|
|
22596
|
+
{
|
|
22597
|
+
"section": "RFC 0165 §C.1",
|
|
22598
|
+
"requirement": null,
|
|
22599
|
+
"interpolated": true
|
|
22600
|
+
},
|
|
22601
|
+
{
|
|
22602
|
+
"section": "RFC 0165 §C.1",
|
|
22603
|
+
"requirement": "OpenWOP-Signature MUST verify over the same bytes as X-openwop-Signature"
|
|
22368
22604
|
}
|
|
22369
22605
|
]
|
|
22370
22606
|
},
|
|
22371
22607
|
{
|
|
22372
22608
|
"id": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
|
|
22373
22609
|
"file": "webhook-signed-delivery.test.ts",
|
|
22374
|
-
"line":
|
|
22610
|
+
"line": 378,
|
|
22375
22611
|
"title": "control: with a tunnel wired, the host still refuses the loopback receiver",
|
|
22376
22612
|
"explicitId": null,
|
|
22377
22613
|
"citations": [
|