@openwop/openwop-conformance 2.45.1 → 2.45.3
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 +62 -0
- package/README.md +2 -2
- package/dist/cli.js +1 -1
- package/dist/lib/certification-bundle-verify.js +22 -1
- package/dist/lib/profiles.js +17 -2
- package/dist/lib/requirement-registry.js +15 -0
- package/dist/lib/scenario-disposition.js +50 -9
- package/dist/spec-artifacts.lock.json +2 -2
- package/fixtures/conformance-fs-probe.json +25 -0
- package/fixtures/conformance-queue-consume.json +27 -0
- package/fixtures/conformance-queue-publish.json +29 -0
- package/fixtures/conformance-safefetch-probe.json +23 -0
- package/fixtures/conformance-secret-resolve-then-fail.json +33 -0
- package/fixtures/conformance-storage-probe.json +27 -0
- package/fixtures/conformance-tool-scope-probe.json +27 -0
- package/fixtures/openwop-secrets-run-witness.json +29 -0
- package/fixtures.md +102 -1
- package/package.json +2 -2
- package/requirement-aliases.json +72 -71
- package/requirements.json +1017 -49
- package/scenario-majors.json +39 -3
- package/schemas/CORPUS-STAMP.json +22 -22
- package/src/cli.ts +1 -1
- package/src/lib/certification-bundle-verify.ts +23 -2
- package/src/lib/driver.ts +61 -2
- package/src/lib/memoryAttribution.ts +41 -6
- package/src/lib/polling.ts +2 -18
- package/src/lib/profiles.ts +26 -2
- package/src/lib/requirement-registry.ts +12 -0
- package/src/lib/run-secrets-witness.ts +240 -0
- package/src/lib/scenario-disposition.ts +45 -7
- package/src/lib/secret-scan.ts +141 -0
- package/src/lib/timeout-scale.ts +25 -0
- package/src/lib/triggerBridge.ts +69 -1
- package/src/scenarios/byok-roundtrip.test.ts +20 -4
- package/src/scenarios/runner-ledger.test.ts +6 -1
- package/src/scenarios/secrets-run-witness.test.ts +154 -0
- package/src/scenarios/trigger-bridge-delivery.test.ts +183 -126
- package/src/scenarios/trigger-refused-event-keeps-subscription.test.ts +141 -0
- package/src/scenarios/v2-error-registry.test.ts +7 -10
- package/src/scenarios/v2-eval-mode-unadvertised-refused.test.ts +55 -0
- package/src/scenarios/v2-fs-sandbox-escape-refused.test.ts +161 -0
- package/src/scenarios/v2-memory-cross-tenant-isolation.test.ts +113 -0
- package/src/scenarios/v2-queue-cross-tenant-isolation.test.ts +118 -0
- package/src/scenarios/v2-safefetch-ssrf-refused.test.ts +198 -0
- package/src/scenarios/v2-secret-canary-absent.test.ts +211 -0
- package/src/scenarios/v2-secrets-run-witness.test.ts +167 -0
- package/src/scenarios/v2-storage-cross-tenant-isolation.test.ts +213 -0
- package/src/scenarios/v2-tool-authorization-fail-closed.test.ts +197 -0
- package/src/scenarios/v2-workspace-scope-from-identity.test.ts +146 -0
package/fixtures.md
CHANGED
|
@@ -100,7 +100,7 @@ All fixtures MUST advertise:
|
|
|
100
100
|
| Multi-Agent Handoff (child) | `conformance-multi-agent-handoff-child` | RFC 0037 (`version: 1`) — child for `conformance-multi-agent-handoff`. Declares `childOutcome.defaultValue='handoff-complete'`; the parent's outputMapping harvests it onto `parentResult`, triggering the `output.harvested` transition event. | `completed` | ≤ 5s |
|
|
101
101
|
| Multi-Agent Confidence Escalation | `conformance-multi-agent-confidence-escalation` | RFC 0039 §A (`version: 2`) — exercises the confidence-floor escalation contract. Supervisor's `mockDispatchPlan` carries ONE decision with `confidence: 0.3` (below the 0.5 spec floor). The host MUST emit `core.workflowChain.confidence-escalated` AND suspend with a clarification interrupt BEFORE any dispatch.began fires; conformance asserts zero `core.workflowChain.event` records (no dispatch). Capability-gated on `capabilities.multiAgent.executionModel.version >= 2`. | `waiting-clarification` | ≤ 30s |
|
|
102
102
|
| Agent Memory Round-Trip | `conformance-agent-memory-roundtrip` | Phase 3 — `MemoryAdapter.list/get` write → read | `completed` | ≤ 15s |
|
|
103
|
-
| Agent Memory Cross-Tenant | `conformance-agent-memory-cross-tenant` | Phase 3 / CTI-1 — TWO-SIDED (S35, 2026-08-17): owner write+list lands `ownerEntryId` + non-empty `ownerProbe` (positive control); the cross-tenant probe at `config.probeMemoryRef` lands `crossTenantProbe`, which MUST be exactly `[]` / `null` and MUST be set | `completed` | ≤ 10s |
|
|
103
|
+
| Agent Memory Cross-Tenant | `conformance-agent-memory-cross-tenant` | Phase 3 / CTI-1 — TWO-SIDED (S35, 2026-08-17): owner write+list lands `ownerEntryId` + non-empty `ownerProbe` (positive control); the cross-tenant probe at `config.probeMemoryRef` lands `crossTenantProbe`, which MUST be exactly `[]` / `null` and MUST be set. At major 2, `v2-memory-cross-tenant-isolation` runs it once per tenant (`OPENWOP_API_KEY`, then `OPENWOP_TEST_TENANT_B_API_KEY`) at the same `memoryRef`: a host advertising it MUST run it for the second-tenant credential too, and entry ids MUST NOT repeat across tenants | `completed` | ≤ 10s |
|
|
104
104
|
| Agent Memory Redaction | `conformance-agent-memory-redaction` | Phase 3 / SR-1 — BYOK plaintext surfaces as `[REDACTED:<id>]` on read | `completed` | ≤ 15s |
|
|
105
105
|
| Agent Memory TTL | `conformance-agent-memory-ttl` | Phase 3 — `expiresAt` excludes expired entries from list/get; TWO-SIDED (S35, 2026-08-17): host lands `freshId` / `expiredId`, `memoryList` MUST include the fresh id and exclude the expired id | `completed` | ≤ 10s |
|
|
106
106
|
| Agent Memory Injection Budget | `conformance-agent-memory-injection-budget` | RFC 0113 — token-budgeted `MemoryAdapter.list` (`tokenBudget`/`rank`/`query`): cumulative tokens ≤ budget, over-budget single entry omitted, SR-1 + CTI-1 re-asserted on the budgeted path; `rank:'relevance'` delegates to `memory.search` semantic | `completed` | ≤ 15s |
|
|
@@ -115,11 +115,19 @@ All fixtures MUST advertise:
|
|
|
115
115
|
| Orchestrator Low-Confidence | `conformance-orchestrator-low-confidence` | Phase 5 / CP-1 — supervisor low-confidence suspend | `waiting-approval` (suspends) | unbounded (suspends) |
|
|
116
116
|
| MCP Tool Roundtrip | `conformance-mcp-tool-roundtrip` | Track 6 — host invokes a tool on the conformance suite's synthetic MCP server; trust-boundary visibility in the event log. Node `core.conformance.mcp-invoke` is a **conformance-RESERVED** typeId (renamed 2026-08-17 from `core.ai.callPrompt` with a `config.mcp` shape that vendor pack-tier node never read — it requires `promptId` and ignores `config.mcp`, so the fixture could not execute as declared on the first host that shipped the vendor node): a host that consumes MCP MUST map it to its own MCP invoke bridge node and honour `config.mcp { tool, arguments }`; a host that does not consume MCP MUST NOT advertise this fixture (the host-mediated leg then records inapplicable) — the same treatment as `core.conformance.a2a-invoke` | `completed` | ≤ 30s |
|
|
117
117
|
| v2 `ctx.mcp` Client | `conformance-mcp-client` | RFC 0204 — one `core.conformance.mcp-client` node (conformance-RESERVED) calls the host's `ctx.mcp.<method>` with the run's inputs and completes with `outputs.result` = the resolved value verbatim; a rejection fails the node with its code. See §"The `ctx.mcp` fixture (RFC 0204)" | `completed`, or `failed` (`not_found`) for an unknown `serverId` | ≤ 30s |
|
|
118
|
+
| v2 Storage Tenant-Isolation Probe | `conformance-storage-probe` | `storage.md` §Shared rules — one `core.conformance.storage-probe` node (conformance-RESERVED) calls the host's own storage `family` for the run's tenant: `write` stores `value` at `key`, `read` returns every value and key the family's isolated reads return for `key`, `delete` removes it. See §"The storage probe fixtures" | `completed`, or `failed` (`forbidden` / `not_found`) for a refused read | ≤ 30s |
|
|
119
|
+
| v2 fs Sandbox Probe | `conformance-fs-probe` | `storage.md` §`fs` — one `core.conformance.fs-probe` node (conformance-RESERVED) calls the host's own `ctx.fs.read` / `write` with the run's `path`, unchanged; a rejection fails the node with its code and details. Operator symlink `<sandboxRoot>/conformance/escape-link` points outside the root. See §"The storage probe fixtures" | `completed` inside the root; `failed` (`forbidden`, `details.reason: path-outside-sandbox`) for an escape | ≤ 30s |
|
|
120
|
+
| v2 safeFetch SSRF Probe | `conformance-safefetch-probe` | `host-services.md` §`httpClient` — one `core.conformance.safefetch-probe` node (conformance-RESERVED) calls the host's own `ctx.http.safeFetch(url)` with the run's `url`, unchanged; completes with the response `status` only; a rejection fails the node with its code and details. See §"The safeFetch probe fixture" | `failed` (`egress_denied`, `details.reason: ssrf-blocked`) for a refused target | ≤ 60s |
|
|
118
121
|
| A2A Task Roundtrip | `conformance-a2a-task-roundtrip` | Track 6 — host consumes the conformance suite's synthetic A2A peer; covers drift points #3 (`AUTH_REQUIRED`) and #4 (`REJECTED`). Node `core.conformance.a2a-invoke` is a **conformance-RESERVED** typeId (renamed 2026-08-16 from `core.a2a.invoke`, a multi-segment `core.*` id no host shipped and the corpus never defined): a host that consumes A2A peers MUST map it to its A2A bridge node (a host-extension node — `a2a-integration.md` §"State projection"); a host that does not consume A2A MUST NOT advertise this fixture | `failed` or `waiting-input` (per `driftScenario` input) | ≤ 30s |
|
|
119
122
|
| WASM Pack Roundtrip | `conformance-wasm-pack-roundtrip` | RFC 0008 — invokes `vendor.openwop.rust-hello.greet` (loaded WASM pack); exercises required exports + at least one import | `completed` | ≤ 10s |
|
|
120
123
|
| WASM Pack Memory-Cap Breach | `conformance-wasm-pack-memory-cap-breach` | RFC 0008 §K — invokes the deliberately-misbehaving `vendor.openwop.misbehaving.memory-bomb` pack (allocates 1 GiB beyond the host's `memoryPagesMax`). Host MUST emit `cap.breached` with `kind: "wasm-memory"` and drive the run to terminal `failed`. Misbehaving pack lives at `openwop-examples:examples/packs/rust-misbehaving-memory/` (repo-qualified per the 2026-06 monorepo split — the `openwop-examples` sibling repo) and is fixture-only (NOT signed for registry publication). | `failed` (with `cap.breached`) | ≤ 10s |
|
|
121
124
|
| Configurable Schema | `conformance-configurable-schema` | Track 13 — workflow declares `configurableSchema` (`additionalProperties: false`, `recursionLimit: integer ≥ 1`). Suite verifies `GET /v1/workflows/{id}` surfaces the schema AND `POST /v1/runs` with a mismatched `configurable` returns `validation_error`. | `completed` (with accepted overlay) | ≤ 5s |
|
|
122
125
|
| Smoke — BYOK Roundtrip | `openwop-smoke-byok-roundtrip` | End-to-end BYOK secret-resolution smoke. Single `conformance.secret.echo` node fetches the host-provisioned canary secret `openwop-conformance-canary-secret`, emits SHA-256 hex + byte length to variables — never the raw value. Spec: `run-options.md` §"Credential references" + `auth.md` §"Secret resolution" + `observability.md` §"Redaction". | `completed` | ≤ 10s |
|
|
126
|
+
| Secrets — Run Witness | `openwop-secrets-run-witness` | RFC 0229 §C — one `core.secret.witness` node. The client supplies a value with the run (`runSecrets`, a `run:` ref) and its SHA-256 as an input; the node outputs only `{ matched }`. It can confirm only a value the caller already holds, so it is safe to advertise in production. Advertised by every host that advertises `secrets.runSecrets`. | `completed` (`matched: true` or `false`); `failed` (`credential_forbidden` / `credential_not_found`) on the scope legs | ≤ 10s |
|
|
127
|
+
| Secret — resolve then fail | `conformance-secret-resolve-then-fail` | `host-services.md` §`secrets` — resolves the byok canary exactly as `openwop-smoke-byok-roundtrip`, then `core.fail` fails the run; the canary MUST appear on no surface of the failed run | `failed` | ≤ 10s |
|
|
128
|
+
| Queue — publish | `conformance-queue-publish` | `host-services.md` §`queueBus` — `conformance.queue.probe` publishes `inputs.message` on `inputs.topic` under the run's tenant | `completed` | ≤ 10s |
|
|
129
|
+
| Queue — consume | `conformance-queue-consume` | `host-services.md` §`queueBus` — `conformance.queue.probe` consumes `inputs.topic` under the run's tenant for `config.waitMs`, acks, outputs `consumed` | `completed` | ≤ 10s |
|
|
130
|
+
| Tool — scope probe | `conformance-tool-scope-probe` | `host-services.md` §`toolHooks` — `core.conformance.scoped-tool` calls the tool `conformance.scope-probe` (which POSTs to `inputs.url`) as the run's principal, with `requiredScopes: [inputs.requiredScope]` | `completed` (no scope) / `failed` `forbidden` (lacked or unevaluable scope) | ≤ 15s |
|
|
123
131
|
| Smoke — Cost Emit (G6 allowlist) | `openwop-smoke-cost-emit` | End-to-end cost-attribute allowlist smoke (G6 / O4). Single `conformance.cost.emit` node configured with a mix of allowlisted `openwop.cost.*` attributes + one non-allowlisted key + one credential-shaped canary under a non-allowlisted name. Scenario reads the live OTel span (when `OPENWOP_OTEL_COLLECTOR=true`) and asserts the cost-namespace attrs ⊆ `OPENWOP_COST_ATTRIBUTE_NAMES` AND that no canary plaintext leaks. Pairs with the `cost-attribution-allowlist-redaction` SECURITY invariant. Spec: `observability.md §"Cost attribution attributes"`. | `completed` | ≤ 10s |
|
|
124
132
|
| Model Capability Insufficient | `conformance-model-capability-insufficient` | RFC 0031 §B step 4 + §D — single `conformance.modelCapability.insufficient` node whose NodeModule declares `requiredModelCapabilities: ['nonexistent-capability-9b3f']`. Executor's gate MUST refuse at dispatch with `error.code = "capability_not_provided"` and emit `model.capability.insufficient` BEFORE `node.failed`. Capability-gated on `capabilities.modelCapabilities.supported: true`. | `failed` (`error.code='capability_not_provided'`) | ≤ 5s |
|
|
125
133
|
| Envelope Retry Attempted | `conformance-envelope-retry-attempted` | RFC 0032 §B.1 — single `core.ai.structuredOutput` node calls the conformance mock provider with a pre-seeded `MockProgram[]` (POSTed to `/v1/host/sample/test/mock-ai/program` by nodeId BEFORE run start). Attempt 1 returns invalid JSON; attempt 2 returns a valid envelope. Host's `dispatchStructured()` retry loop MUST emit exactly one `envelope.retry.attempted` event between the two attempts. Pairs with `envelope-retry-attempted.test.ts`. Capability-gated on `capabilities.envelopes.reliability.supported: true` AND `capabilities.testing.mockProviders` advertised. | `completed` | ≤ 10s |
|
|
@@ -518,6 +526,64 @@ Hosts that don't ship a BYOK SecretResolver MAY return `404` / `422` on the star
|
|
|
518
526
|
|
|
519
527
|
---
|
|
520
528
|
|
|
529
|
+
## `openwop-secrets-run-witness` (production-safe secret witness, RFC 0229 §C)
|
|
530
|
+
|
|
531
|
+
> **Status: RFC 0229 `Active`.** Exercised by `src/scenarios/secrets-run-witness.test.ts` (v1) and `src/scenarios/v2-secrets-run-witness.test.ts` (v2). A host that advertises `secrets.runSecrets` MUST advertise it.
|
|
532
|
+
|
|
533
|
+
- **Purpose**: witness that a run-supplied secret resolves intact and never leaves the host, without an oracle over any stored secret. The `openwop-smoke-byok-roundtrip` node hashes a secret the workflow names and shows the digest and length to every run viewer, so a production host rightly withholds it. This fixture's node reads only a `run:` ref, which resolves only to a value supplied with the same run, and outputs only a boolean.
|
|
534
|
+
- **Topology**: single node `witness` with `typeId: core.secret.witness`. Its `ref` and `expectedSha256` inputs are bound to the run inputs of the same names (`variables` `ref` and `expectedSha256`).
|
|
535
|
+
- **Node contract** (`host-services.md` §Run-supplied secrets; v1 `capabilities.md` §"Run-supplied secrets"):
|
|
536
|
+
- a `ref` without the `run:` prefix fails `credential_forbidden` without resolving anything;
|
|
537
|
+
- an unsupplied `run:` ref fails `credential_not_found`;
|
|
538
|
+
- otherwise the output is `{ matched }`: whether the lowercase-hex SHA-256 of the value's UTF-8 bytes equals `expectedSha256`. No value, digest or length appears on any surface.
|
|
539
|
+
- **Conformance test driver** (per run the suite draws `C`, 48 CSPRNG bytes base64url-encoded, 64 characters, no fixed prefix):
|
|
540
|
+
1. POST the create route with `{ workflowId: "openwop-secrets-run-witness", inputs: { ref: "run:openwop-witness", expectedSha256: sha256(C) }, runSecrets: [{ ref: "run:openwop-witness", value: C }] }`. **Assert** the run completes and `witness` outputs `matched: true`.
|
|
541
|
+
2. The same with a different `expectedSha256`. **Assert** `matched: false`.
|
|
542
|
+
3. **Assert** `C` is absent from the create response, the snapshot, every event (read under the most verbose stream mode served), node outputs and variables, the run-list entry and error bodies — raw, base64 (standard and URL-safe, padded and not), hex (both cases), percent-encoded, JSON-escaped, and as `sha256(C)`.
|
|
543
|
+
4. Scope legs, each ending in `node.failed`: a non-`run:` ref (`openwop-conformance-canary-secret`, and a fresh random name) fails `credential_forbidden`; `run:openwop-witness` with no `runSecrets` fails `credential_not_found`; an earlier run's `ref` fails `credential_not_found`; where `replay` is advertised, a `branch` fork taken before `witness` fails `credential_not_found`.
|
|
544
|
+
5. Idempotency: the create under a fresh `Idempotency-Key`, then the same key with a different value `C′`. **Assert** the retry replays (same `runId`, `OpenWOP-Idempotent-Replay: true`), is never `409 idempotency_key_mismatch`, and `C′` appears on no surface of the run.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
## `conformance-secret-resolve-then-fail` (`host-services.md` §`secrets` — the canary through a failure)
|
|
549
|
+
|
|
550
|
+
> **Status: capability-gated (`secrets`).** Exercised by `src/scenarios/v2-secret-canary-absent.test.ts`. A host advertises it only when it also serves `openwop-smoke-byok-roundtrip` (the same node and canary).
|
|
551
|
+
|
|
552
|
+
- **Purpose**: a secret resolved from the host's own store MUST NOT reach any readable surface of a run that then fails — the snapshot `error`, `node.failed`, `run.failed`, or an error envelope answered about the run (`host-services.md` §`secrets`: "Raw key material MUST NOT appear in any event, log, trace, prompt, error, export or screenshot").
|
|
553
|
+
- **Topology**: `resolve-secret` (`conformance.secret.echo`, `config.secretId: "openwop-conformance-canary-secret"`, the node contract of `openwop-smoke-byok-roundtrip`: outputs only `{secretSha256, secretLength}`) → `fail` (`core.fail`).
|
|
554
|
+
- **Terminal**: `failed`.
|
|
555
|
+
- **Conformance test driver**: create the run, settle it, read the createRun answer, the snapshot, the `debug` poll log and SSE stream, the answer to cancelling the terminal run and (with `runList`) the list page; the canary MUST be on none of them. The suite recognises it by the surfaced digest (every `secretLength`-byte window hashed against `secretSha256`) and, when the operator supplies it, by `OPENWOP_CANARY_SECRET_VALUE` in every common encoding.
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## `conformance-queue-publish` + `conformance-queue-consume` (`host-services.md` §`queueBus` — tenant isolation)
|
|
560
|
+
|
|
561
|
+
> **Status: capability-gated (`queueBus`).** Exercised by `src/scenarios/v2-queue-cross-tenant-isolation.test.ts`. A host advertises the pair together, or neither.
|
|
562
|
+
|
|
563
|
+
- **Purpose**: "A tenant's consumer MUST NOT receive another tenant's messages, even on the same topic." The tenant is the run's — the credential that created it — never a request field.
|
|
564
|
+
- **Node `conformance.queue.probe`**, one node per fixture, `config.action` selects:
|
|
565
|
+
- `publish` — `ctx.queueBus.publish({ topic: inputs.topic, payload: { message: inputs.message } })` under the run's tenant; outputs `{ published: true }`.
|
|
566
|
+
- `consume` — `ctx.queueBus.consume({ topic: inputs.topic })` under the run's tenant for up to `config.waitMs` (1000), `ack`s every message it receives, and outputs `{ consumed: [<payload.message of each, in order>] }`. It MUST output `consumed: []` when nothing arrived, never leave it unset, so an idle consume cannot pass the isolation check vacuously.
|
|
567
|
+
- **Terminal**: `completed` for both.
|
|
568
|
+
- **Conformance test driver**: tenant A (`OPENWOP_API_KEY`) publishes a fresh nonce on a fresh topic T; tenant B (`OPENWOP_TEST_TENANT_B_API_KEY`, a different tenant) consumes T — `consumed` MUST NOT contain the nonce; then A consumes T — `consumed` MUST contain it (the positive control).
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## `conformance-tool-scope-probe` (`host-services.md` §`toolHooks` — per-tool authorization fails closed)
|
|
573
|
+
|
|
574
|
+
> **Status: capability-gated (`toolHooks.perToolAuthorization`).** Exercised by `src/scenarios/v2-tool-authorization-fail-closed.test.ts`. A host that advertises `perToolAuthorization` advertises this fixture; one that withholds it records `blocked`.
|
|
575
|
+
|
|
576
|
+
- **Purpose**: "Before invoking, the host MUST check the principal's scopes against the tool's `requiredScopes`. If one is missing or cannot be evaluated, it MUST NOT invoke, MUST emit `agent.toolReturned` with `status: forbidden`, and MUST answer `403 forbidden` with `details.scope: "tool"`, `toolName` and `requiredScopes`."
|
|
577
|
+
- **Node `core.conformance.scoped-tool`** (conformance-RESERVED). The host maps it to ONE external tool call, made through its ordinary tool-invocation path (the same authorization check, the same `agent.tool-called` / `agent.tool-returned` pair) as the run's principal — the credential that created the run, never a request field:
|
|
578
|
+
- the tool is `conformance.scope-probe` (`config.toolName`), and its `requiredScopes` is `[inputs.requiredScope]`, or `[]` when `requiredScope` is empty or absent;
|
|
579
|
+
- when invoked, the tool POSTs `{}` to `inputs.url` and returns `{ invoked: true }`; the node completes with `outputs.result = { invoked: true }`;
|
|
580
|
+
- a refusal fails the node with the refusal as its error, code and details unchanged (`errors.md` §Host-service refusals): `forbidden`, `details.scope: "tool"`, `details.toolName: "conformance.scope-probe"`, `details.requiredScopes`.
|
|
581
|
+
- **Operator contract.** No principal holds the scope `conformance:never-granted`. Evaluating the scope `conformance:unevaluable` errors (the operator binds its check to a resolver that throws or cannot be reached), so the host's evaluator reaches its "cannot be evaluated" branch rather than a plain "not held".
|
|
582
|
+
- **Terminal**: `completed` with no required scope; `failed` (`forbidden`) for either scope above.
|
|
583
|
+
- **Conformance test driver**: for each of `""` (control), `conformance:never-granted` and `conformance:unevaluable`, start a fresh receiver and run the fixture with its URL. The control MUST reach the receiver once and return `status: ok`; each scoped run MUST reach it zero times, emit `agent.tool-returned { toolName: "conformance.scope-probe", status: "forbidden" }` without `durationMs`, emit no `ok` return for the tool, and fail the node `forbidden` with the three `details` members.
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
521
587
|
## `conformance-channel-ttl` (closes C3 — channel TTL reducer fold)
|
|
522
588
|
|
|
523
589
|
> **Status: included in the v1.0 conformance baseline.** Server-side `core.channelWrite` support is exercised by `src/scenarios/channel-ttl.test.ts`.
|
|
@@ -625,6 +691,41 @@ For `v2-tool-catalog-annotations`' unclassified-MCP leg, a host that advertises
|
|
|
625
691
|
|
|
626
692
|
---
|
|
627
693
|
|
|
694
|
+
## The storage probe fixtures (storage.md)
|
|
695
|
+
|
|
696
|
+
`conformance-storage-probe` is what `v2-storage-cross-tenant-isolation` drives, and `conformance-fs-probe` is what `v2-fs-sandbox-escape-refused` drives. Both nodes are conformance-RESERVED: a host maps each to a node that calls its OWN storage service (`spec/v2/core/storage.md` §Operations, reached through `ctx`) for the run's tenant and nothing else, and passes a rejection through as the node's failure, code and details unchanged (`errors.md` §Host-service refusals). They are fixtures, not seams: they run through `POST /runs` under the caller's own credential, so the tenant is the one the caller authenticated as.
|
|
697
|
+
|
|
698
|
+
**`core.conformance.storage-probe`.** Inputs `family`, `action` (`write` | `read` | `delete`), `key`, `value`, and optionally `ref`. The node's `node.completed.outputs.result` is `{ written: true, ref? }` for `write`, `{ values: string[], keys: string[] }` for `read` (every value and every key the family's read operations below return; empty arrays when nothing is found) and `{ deleted: true }` for `delete`. Target names (`conformance`, `conformance_probe`) are the same in every tenant, so two tenants collide on them by construction.
|
|
699
|
+
|
|
700
|
+
| `family` | `write` | `read` |
|
|
701
|
+
|---|---|---|
|
|
702
|
+
| `kvStorage` | `put(key, value)` | `get(key)` → its value; `list(prefix: key)` → its keys |
|
|
703
|
+
| `cache` | `put(key, value, min(300, maxTtlSeconds))` | `get(key)` → its value |
|
|
704
|
+
| `blobStorage` | `put("conformance", key, utf8(value), "text/plain")` | `get("conformance", key)` decoded as UTF-8; `list("conformance", prefix: key)` → its keys |
|
|
705
|
+
| `tableStorage` | `createTable("conformance_probe", { k: string, v: string })` once, then `insert` `{ k: key, v: value }`; `ref` = the `rowId` | `query("conformance_probe", { k: key })` → each row's `v` and `k`; with `ref`, also `get("conformance_probe", ref)` |
|
|
706
|
+
| `vectorStore` | `upsert("conformance", [{ id: key, embedding: E(key), metadata: { value } }])` | `query("conformance", E(key), 10)` → each match's `metadata.value` and `id` |
|
|
707
|
+
| `searchIndex` | `index("conformance", [{ id: key, fields: { value } }])` | `query("conformance", value, 10)` → each hit's `fields.value` and `id` (the scenario passes `value` on read) |
|
|
708
|
+
| `sql` | on datasource `conformance`: create table `conformance_probe (k, v)` if absent, then `execute` an INSERT with `[key, value]` bound through `params` | `query` a SELECT of `k, v` where `k` is the bound `key` |
|
|
709
|
+
| `nosql` | `insert("conformance", "conformance_probe", { k: key, v: value })`; `ref` = the id | `query(…, { k: key })` → each doc's `v` and `k`; with `ref`, also `get(…, ref)` |
|
|
710
|
+
|
|
711
|
+
`E(key)` is a deterministic embedding the host derives from `key` alone, so the same key gives the same vector in every tenant. The datasource, bucket, collection and index named `conformance` are bound by the operator for every tenant under that one name; the host keeps them tenant-scoped as `storage.md` requires. `delete` removes what `write` stored. A host MUST NOT advertise the fixture unless it implements every storage family it advertises.
|
|
712
|
+
|
|
713
|
+
**`core.conformance.fs-probe`.** Inputs `op` (`write` | `read`), `path`, `content`. `write` calls `ctx.fs.write(path, utf8(content), "text/plain")`; `read` calls `ctx.fs.read(path)` and completes with `outputs.result = { content }` (UTF-8). The node does no path handling of its own. **Operator contract:** `<sandboxRoot>/conformance/escape-link` is a symbolic link to a readable file outside `sandboxRoot`. When the link is missing the symlink leg records `blocked`.
|
|
714
|
+
|
|
715
|
+
---
|
|
716
|
+
|
|
717
|
+
## The safeFetch probe fixture (host-services.md)
|
|
718
|
+
|
|
719
|
+
`conformance-safefetch-probe` is what `v2-safefetch-ssrf-refused` drives. Its node, `core.conformance.safefetch-probe`, is conformance-RESERVED: a host that advertises `httpClient.safeFetch` maps it to a node that calls its OWN `ctx.http.safeFetch(url)` (`spec/v2/core/host-services.md` §`httpClient`) with the run's `url` input unchanged, method `GET`, no headers and no body, and nothing else. It is a fixture, not a seam: it runs through `POST /runs` under the caller's own credential.
|
|
720
|
+
|
|
721
|
+
- **Success.** `node.completed.outputs.result` is `{ status }`, the response status only. The body is never output, so advertising the fixture does not turn the host into a read proxy.
|
|
722
|
+
- **Rejection.** The node fails with the rejection's code and details unchanged (`errors.md` §Host-service refusals): a refused target is `egress_denied` with `details.reason: ssrf-blocked`; an unreachable one is `upstream_unavailable`.
|
|
723
|
+
- **No normalisation.** The node does not parse, resolve or rewrite `url`, so the host's own guard is what is exercised.
|
|
724
|
+
|
|
725
|
+
A host MUST NOT advertise the fixture unless it advertises `httpClient.safeFetch`.
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
628
729
|
## The per-agent card pack (RFC 0202)
|
|
629
730
|
|
|
630
731
|
`v2-a2a-agent-cards` reads the caller's `GET /agents`; it needs no workflow fixture. Two suite requirements (COMPATIBILITY §2.3), not spec MUSTs:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "2.45.
|
|
3
|
+
"version": "2.45.3",
|
|
4
4
|
"description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,6 +56,6 @@
|
|
|
56
56
|
"@openwop/spec-artifacts": "file:../spec-artifacts"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@openwop/spec-artifacts": "2.45.
|
|
59
|
+
"@openwop/spec-artifacts": "2.45.3"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/requirement-aliases.json
CHANGED
|
@@ -1,41 +1,50 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "old id
|
|
2
|
+
"$comment": "old id \u2192 new id. Add a row when a test title is reworded so bundles citing the old id still resolve. Suite 2.0.5 added 165 rows for a SECOND cause: the registry generator now resolves module-level const bindings, so a leg that soft-skips is labelled by its explicit requirement id instead of the title-derived slug it used to fall back to. The label moved without any title changing, and the generator --check cannot see it (it compares the record id, which did not move) \u2014 11 rows across the three committed host bundles cited slugs the 2.0.5 suite no longer mints.",
|
|
3
3
|
"aliases": {
|
|
4
|
-
"openwop.it.
|
|
5
|
-
"openwop.it.
|
|
6
|
-
"openwop.it.era-key-stamped-v1.a-run-the-host-just-created-carries-eventlogschemaversion": "openwop.requirement.version-negotiation.era-key-stamped",
|
|
4
|
+
"openwop.it.bundle-maturity-gate.the-committed-corpus-is-green-and-the-report-names-the-overstated-families-and-t": "openwop.it.bundle-maturity-gate.the-committed-corpus-is-green-and-the-gate-states-when-c-7-binds",
|
|
5
|
+
"openwop.it.bundle-maturity-gate.the-same-committed-bundle-re-labelled-onto-the-rfc-s-suite-fails-naming-every-ov": "openwop.it.bundle-maturity-gate.the-superseded-myndhyve-bundle-re-labelled-onto-the-rfc-s-suite-fails-naming-eve",
|
|
7
6
|
"openwop.it.era-key-stamped-v1.a-freshly-created-run-is-not-classified-legacy-by-the-host-s-own-rule": "openwop.requirement.version-negotiation.era-key-not-legacy",
|
|
8
7
|
"openwop.it.era-key-stamped-v1.a-run-the-host-just-created-carries-engineversion-the-legacy-escape-cannot-reach": "openwop.requirement.version-negotiation.engine-version-stamped",
|
|
8
|
+
"openwop.it.era-key-stamped-v1.a-run-the-host-just-created-carries-eventlogschemaversion": "openwop.requirement.version-negotiation.era-key-stamped",
|
|
9
|
+
"openwop.it.pause-resume.pause-on-an-already-paused-run-is-a-no-op-200-202-idempotent": "openwop.it.pause-resume.pause-on-an-already-paused-run-returns-409-with-details-runstatus-paused-unless",
|
|
10
|
+
"openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-retries-to-dead-letter-and-links-delivery-run-causation": "openwop.it.trigger-bridge-delivery.de-dups-by-dedupkey-a-repeated-delivery-is-effectively-once",
|
|
9
11
|
"openwop.it.v2-advertised-fixtures-exist.a-sampled-advertised-fixture-is-actually-creatable-not-just-listed": "openwop.requirement.0168.advertised-fixtures-exist",
|
|
10
12
|
"openwop.it.v2-advertised-path-space-served.a-host-advertising-major-2-reaches-the-surfaces-it-already-serves-under-v1": "openwop.requirement.0172.advertised-path-space-served",
|
|
13
|
+
"openwop.it.v2-alias-covers-reword.the-corpus-gate-script-exits-0": "openwop.requirement.0168.alias-covers-reword",
|
|
11
14
|
"openwop.it.v2-approver-enforced.a-resolver-outside-approverslist-is-refused-at-resolve-time": "openwop.requirement.0173.approver-enforced",
|
|
12
|
-
"openwop.it.v2-assurance-downgrade-audited.an-identity-below-the-lane-floor-is-refused-with-sender-constraint-missing": "openwop.requirement.0170.assurance-downgrade-audited.refused",
|
|
13
15
|
"openwop.it.v2-assurance-downgrade-audited.a-resolved-identity-records-the-assurance-actually-used-never-a-downgraded-beare": "openwop.requirement.0170.assurance-downgrade-audited.audited",
|
|
16
|
+
"openwop.it.v2-assurance-downgrade-audited.an-identity-below-the-lane-floor-is-refused-with-sender-constraint-missing": "openwop.requirement.0170.assurance-downgrade-audited.refused",
|
|
17
|
+
"openwop.it.v2-bundle-signature-attributable.signingkeys-is-reachable-from-a-v1-root-too-a-bundle-is-v3-regardless-of-major": "openwop.requirement.0168.bundle-signature-attributable.v1-root",
|
|
18
|
+
"openwop.it.v2-bundle-signature-attributable.the-four-signature-outcomes-stay-distinct-collapsing-any-two-restores-the-defect": "openwop.requirement.0168.bundle-signature-attributable.outcomes",
|
|
19
|
+
"openwop.it.v2-bundle-signature-attributable.the-front-door-gate-verifies-the-attestation-instead-of-inspecting-the-string": "openwop.requirement.0168.bundle-signature-attributable.verifies",
|
|
20
|
+
"openwop.it.v2-bundle-signature-attributable.the-v2-discovery-root-publishes-signingkeys-the-surface-the-rfc-named": "openwop.requirement.0168.bundle-signature-attributable.surface",
|
|
14
21
|
"openwop.it.v2-bundle-v3-signed.a-signed-v3-bundle-validates-against-the-closed-root-schema-an-extra-root-key-is": "openwop.requirement.0168.bundle-v3-signed.schema-closed-root",
|
|
15
|
-
"openwop.it.v2-bundle-v3-signed.the-attestation-verifies-under-the-host-key-and-a-flipped-witnesssha256-is-refus": "openwop.requirement.0168.bundle-v3-signed.witness-digest",
|
|
16
22
|
"openwop.it.v2-bundle-v3-signed.an-independent-claim-self-signed-under-the-host-key-is-refused-a-distinct-verifi": "openwop.requirement.0168.bundle-v3-signed.independent-self-signed",
|
|
17
|
-
"openwop.it.v2-
|
|
18
|
-
"openwop.it.v2-capabilities-root-closed.an-unknown-root-key-fails-validation": "openwop.requirement.0169.capabilities-root-closed.unknown-root-key",
|
|
23
|
+
"openwop.it.v2-bundle-v3-signed.the-attestation-verifies-under-the-host-key-and-a-flipped-witnesssha256-is-refus": "openwop.requirement.0168.bundle-v3-signed.witness-digest",
|
|
19
24
|
"openwop.it.v2-capabilities-root-closed.a-dotted-mirror-key-fails-validation": "openwop.requirement.0169.capabilities-root-closed.dotted-key",
|
|
20
|
-
"openwop.it.v2-capabilities-root-closed.the-v1-capabilities-wrapper-fails-validation": "openwop.requirement.0169.capabilities-root-closed.wrapper",
|
|
21
25
|
"openwop.it.v2-capabilities-root-closed.a-root-profiles-fails-validation": "openwop.requirement.0169.capabilities-root-closed.profiles",
|
|
26
|
+
"openwop.it.v2-capabilities-root-closed.an-unknown-root-key-fails-validation": "openwop.requirement.0169.capabilities-root-closed.unknown-root-key",
|
|
27
|
+
"openwop.it.v2-capabilities-root-closed.the-host-document-validates-against-capabilities-schema-json": "openwop.requirement.0169.capabilities-root-closed.valid",
|
|
28
|
+
"openwop.it.v2-capabilities-root-closed.the-v1-capabilities-wrapper-fails-validation": "openwop.requirement.0169.capabilities-root-closed.wrapper",
|
|
22
29
|
"openwop.it.v2-capability-record-shape.every-family-record-carries-status-since-and-witness-from-the-wire-legal-sets": "openwop.requirement.0169.capability-record-shape.required-fields",
|
|
23
|
-
"openwop.it.v2-capability-record-shape.until-is-present-iff-the-record-is-experimental-or-deprecated": "openwop.requirement.0169.capability-record-shape.until-iff-not-stable",
|
|
24
30
|
"openwop.it.v2-capability-record-shape.no-advertised-record-carries-an-until-already-in-the-past": "openwop.requirement.0169.capability-record-shape.until-not-past",
|
|
31
|
+
"openwop.it.v2-capability-record-shape.until-is-present-iff-the-record-is-experimental-or-deprecated": "openwop.requirement.0169.capability-record-shape.until-iff-not-stable",
|
|
25
32
|
"openwop.it.v2-chain-pin-exact.a-chain-reference-carrying-a-range-core-ai-callprompt-1-is-refused-at-register": "openwop.requirement.0177.chain-pin-exact.range-refused",
|
|
26
33
|
"openwop.it.v2-chain-pin-exact.a-chain-reference-pinning-an-exact-version-core-ai-callprompt-1-0-0-registers": "openwop.requirement.0177.chain-pin-exact.exact-accepted",
|
|
27
34
|
"openwop.it.v2-coherence-not-in-bundle.every-corpus-ledger-id-has-a-scenario-in-src-coherence-and-none-in-src-scenarios": "openwop.requirement.0168.coherence-not-in-bundle.disjoint-by-construction",
|
|
28
35
|
"openwop.it.v2-coherence-not-in-bundle.the-bundle-schema-rejects-a-v3-bundle-carrying-a-corpus-coherence-id-and-accepts": "openwop.requirement.0168.coherence-not-in-bundle.schema-forbids-coherence-ids",
|
|
29
|
-
"openwop.it.v2-compensation-read-projection.get-runs-runid-compensation-on-a-fresh-run-validates-with-status-none": "openwop.requirement.0173.compensation-read-projection",
|
|
30
36
|
"openwop.it.v2-compensation-read-projection.an-unknown-run-projects-404-not-found-through-the-canonical-envelope": "openwop.requirement.0173.compensation-read-projection.not-found",
|
|
31
|
-
"openwop.it.v2-
|
|
37
|
+
"openwop.it.v2-compensation-read-projection.get-runs-runid-compensation-on-a-fresh-run-validates-with-status-none": "openwop.requirement.0173.compensation-read-projection",
|
|
32
38
|
"openwop.it.v2-configurable-closed.post-runs-rejects-a-dotted-key-with-400-validation-error": "openwop.requirement.0171.configurable-closed.dotted-key",
|
|
33
39
|
"openwop.it.v2-configurable-closed.post-runs-rejects-an-unknown-root-key-with-400-validation-error": "openwop.requirement.0171.configurable-closed.unknown-key",
|
|
40
|
+
"openwop.it.v2-configurable-closed.the-standalone-schema-rejects-a-dotted-key-and-an-unknown-root-key-and-accepts-t": "openwop.requirement.0171.configurable-closed.schema",
|
|
41
|
+
"openwop.it.v2-corpus-tag-pinned.every-vendoring-consumer-in-the-cross-repo-inventory-records-a-published-corpus": "openwop.requirement.0176.corpus-tag-pinned",
|
|
34
42
|
"openwop.it.v2-created-run-readable.a-run-created-at-this-base-is-readable-and-pollable-at-this-base-by-the-id-it-re": "openwop.requirement.0172.created-run-readable",
|
|
43
|
+
"openwop.it.v2-declaration-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0169.declaration-parity",
|
|
35
44
|
"openwop.it.v2-dual-stack-negotiation.a-run-created-through-v1-runs-with-no-header-is-readable-through-runs-under-open": "openwop.requirement.0172.dual-stack-negotiation.cross-major-read",
|
|
36
45
|
"openwop.it.v2-dual-stack-negotiation.an-unlisted-major-is-406-protocol-version-unsupported-with-details-protocolversi": "openwop.requirement.0172.dual-stack-negotiation.unlisted-major",
|
|
37
|
-
"openwop.it.v2-dual-stack-negotiation.openwop-version-2-0-on-a-v1-path-is-400-protocol-version-mismatch": "openwop.requirement.0172.dual-stack-negotiation.v1-path-mismatch",
|
|
38
46
|
"openwop.it.v2-dual-stack-negotiation.every-response-reports-the-contract-that-produced-it": "openwop.requirement.0172.dual-stack-negotiation.response-header",
|
|
47
|
+
"openwop.it.v2-dual-stack-negotiation.openwop-version-2-0-on-a-v1-path-is-400-protocol-version-mismatch": "openwop.requirement.0172.dual-stack-negotiation.v1-path-mismatch",
|
|
39
48
|
"openwop.it.v2-effect-identity-business-key.get-runs-runid-effects-validates-and-every-row-is-keyed-on-business-identity-or": "openwop.requirement.0173.effect-identity-business-key",
|
|
40
49
|
"openwop.it.v2-effect-identity-business-key.the-same-provider-key-is-presented-across-two-transport-retries": "openwop.requirement.0173.effect-identity-business-key.retry",
|
|
41
50
|
"openwop.it.v2-effect-seam-manifest.get-host-effect-seams-validates-and-every-row-is-guarded": "openwop.requirement.0173.effect-seam-manifest",
|
|
@@ -43,132 +52,124 @@
|
|
|
43
52
|
"openwop.it.v2-effect-seam-no-refire.driving-one-seam-of-each-kind-observes-no-re-fire-on-replay": "openwop.requirement.0173.effect-seam-no-refire",
|
|
44
53
|
"openwop.it.v2-enum-growth-rule.the-envelope-accepts-a-registered-but-unknown-to-this-suite-vendor-member": "openwop.requirement.0171.enum-growth-rule.unknown-member-accepted",
|
|
45
54
|
"openwop.it.v2-enum-growth-rule.the-reserved-prefix-and-a-malformed-member-are-rejected": "openwop.requirement.0171.enum-growth-rule.reserved-rejected",
|
|
55
|
+
"openwop.it.v2-eos-clock.check-removal-dates-fails-the-v1-tree-sources-of-v1-end-of-support-rows-once-the": "openwop.requirement.0174.v1-eos-clock",
|
|
56
|
+
"openwop.it.v2-eos-clock.check-removal-dates-passes-under-the-same-clock-when-today-is-before-the-date-an": "openwop.requirement.0174.v1-eos-clock",
|
|
57
|
+
"openwop.it.v2-eos-clock.the-clock-file-is-current-with-the-matrix-and-the-public-history": "openwop.requirement.0174.v1-eos-clock",
|
|
46
58
|
"openwop.it.v2-era-2-append-vocabulary.a-host-append-to-an-open-era-2-run-keeps-the-log-in-v1-vocabulary-so-the-whole-l": "openwop.requirement.0176.era-2-append-vocabulary",
|
|
47
59
|
"openwop.it.v2-era-2-append-vocabulary.the-run-keeps-the-era-it-was-created-with-an-append-does-not-promote-it-to-era-3": "openwop.requirement.0176.era-2-append-vocabulary",
|
|
48
60
|
"openwop.it.v2-era-key.a-run-created-now-carries-eventlogschemaversion-3-on-its-snapshot": "openwop.requirement.0176.era-key",
|
|
49
61
|
"openwop.it.v2-era-key.discovery-advertises-the-value-the-host-writes-for-new-runs-and-nothing-else": "openwop.requirement.0176.era-key.discovery",
|
|
50
|
-
"openwop.it.v2-era-stamp-universal.discovery-advertises-an-era-the-host-actually-writes-and-a-new-run-carries-it": "openwop.requirement.0176.era-stamp-universal",
|
|
51
62
|
"openwop.it.v2-era-stamp-universal.a-v2-era-host-stamps-3-so-its-new-runs-are-never-read-as-the-v1-era": "openwop.requirement.0176.era-stamp-universal",
|
|
63
|
+
"openwop.it.v2-era-stamp-universal.discovery-advertises-an-era-the-host-actually-writes-and-a-new-run-carries-it": "openwop.requirement.0176.era-stamp-universal",
|
|
64
|
+
"openwop.it.v2-error-registry-prose-parity.errors-md-states-the-registry-count-it-was-generated-from-and-renders-every-code": "openwop.requirement.0171.error-registry-prose-parity",
|
|
65
|
+
"openwop.it.v2-error-registry.a-429-rate-limited-response-carries-retry-after": "openwop.requirement.0171.error-registry.retry-after",
|
|
52
66
|
"openwop.it.v2-error-registry.an-error-response-is-the-closed-envelope-with-a-registered-code-at-its-registere": "openwop.requirement.0171.error-registry.envelope",
|
|
53
67
|
"openwop.it.v2-error-registry.retry-timing-is-never-spelled-inside-details": "openwop.requirement.0171.error-registry.no-retry-details",
|
|
54
|
-
"openwop.it.v2-
|
|
55
|
-
"openwop.it.v2-event-
|
|
68
|
+
"openwop.it.v2-event-naming-rule.every-closed-enum-v2-event-type-is-two-kebab-segments-and-every-recorded-artifac": "openwop.requirement.0171.event-naming-rule",
|
|
69
|
+
"openwop.it.v2-event-naming-rule.the-closed-enum-and-the-vendor-branch-are-disjoint-every-registered-type-validat": "openwop.requirement.0171.event-naming-rule",
|
|
56
70
|
"openwop.it.v2-event-type-closed.every-emitted-event-validates-as-a-runeventdoc": "openwop.requirement.0171.event-type-closed.envelope",
|
|
57
|
-
"openwop.it.v2-
|
|
71
|
+
"openwop.it.v2-event-type-closed.every-emitted-type-is-a-registered-protocol-type-or-a-vendor-type-under-an-adver": "openwop.requirement.0171.event-type-closed.type",
|
|
72
|
+
"openwop.it.v2-events-channel-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0171.events-channel-parity",
|
|
73
|
+
"openwop.it.v2-externally-gated-never-stable.the-corpus-gate-script-exits-0": "openwop.requirement.0169.externally-gated-never-stable",
|
|
58
74
|
"openwop.it.v2-fork-a-v1-run.run-started-on-the-fork-carries-the-legacy-subject-where-the-parent-had-none": "openwop.requirement.0176.fork-a-v1-run.legacy-subject",
|
|
75
|
+
"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": "openwop.requirement.0176.fork-a-v1-run.prefix",
|
|
59
76
|
"openwop.it.v2-form-when-reuses-edge-conditions.a-field-when-is-the-edge-condition-grammar-type-left-right-and-no-other-expressi": "openwop.requirement.0177.form-when-reuses-edge-conditions",
|
|
60
77
|
"openwop.it.v2-header-scheme.no-removed-header-family-appears-on-any-response": "openwop.requirement.0171.header-scheme.no-legacy-headers",
|
|
61
78
|
"openwop.it.v2-header-scheme.openwop-version-names-the-contract-on-every-response": "openwop.requirement.0171.header-scheme.version-on-every-response",
|
|
62
|
-
"openwop.it.v2-id-grammar.every-id-on-the-run-snapshot-matches-its-ids-schema-json-kind": "openwop.requirement.0170.id-grammar.snapshot",
|
|
63
|
-
"openwop.it.v2-id-grammar.every-id-on-the-run-events-matches-its-ids-schema-json-kind": "openwop.requirement.0170.id-grammar.events",
|
|
64
79
|
"openwop.it.v2-id-grammar.a-run-id-whose-tenant-segment-is-not-the-caller-s-is-refused": "openwop.requirement.0170.id-grammar.tenant-binding",
|
|
80
|
+
"openwop.it.v2-id-grammar.every-id-on-the-run-events-matches-its-ids-schema-json-kind": "openwop.requirement.0170.id-grammar.events",
|
|
81
|
+
"openwop.it.v2-id-grammar.every-id-on-the-run-snapshot-matches-its-ids-schema-json-kind": "openwop.requirement.0170.id-grammar.snapshot",
|
|
82
|
+
"openwop.it.v2-id-kinds-bound.every-v2-id-field-refs-its-kind-and-every-id-property-is-triaged": "openwop.requirement.0170.id-kinds-bound",
|
|
65
83
|
"openwop.it.v2-idempotency-key-grammar.a-22-character-key-inside-the-grammar-is-accepted": "openwop.requirement.0170.idempotency-key-grammar.valid-accepted",
|
|
66
84
|
"openwop.it.v2-idempotency-key-grammar.a-key-outside-the-grammar-is-refused-with-400-idempotency-key-invalid": "openwop.requirement.0170.idempotency-key-grammar.invalid-refused",
|
|
67
85
|
"openwop.it.v2-interrupt-token-scheme.a-token-without-the-ow2-prefix-is-refused": "openwop.requirement.0170.interrupt-token-scheme.unprefixed-refused",
|
|
68
86
|
"openwop.it.v2-interrupt-token-scheme.a-well-formed-token-under-a-kid-the-host-does-not-hold-is-401-interrupt-token-in": "openwop.requirement.0170.interrupt-token-scheme.unheld-kid-refused",
|
|
69
|
-
"openwop.it.v2-lane-issuer-advertised.every-auth-lanes-member-names-lane-issuers-revocation-and-minimumassurance": "openwop.requirement.0170.lane-issuer-advertised.members",
|
|
70
87
|
"openwop.it.v2-lane-issuer-advertised.a-windowed-revocation-rule-advertises-revocationwindowseconds": "openwop.requirement.0170.lane-issuer-advertised.window",
|
|
88
|
+
"openwop.it.v2-lane-issuer-advertised.every-auth-lanes-member-names-lane-issuers-revocation-and-minimumassurance": "openwop.requirement.0170.lane-issuer-advertised.members",
|
|
71
89
|
"openwop.it.v2-legacy-profiles-absent.no-legacy-id-appears-in-a2a-profiles-or-mcp-profiles-and-each-id-matches-its-fac": "openwop.requirement.0175.legacy-profiles-absent",
|
|
72
90
|
"openwop.it.v2-legacy-profiles-absent.no-root-profiles-exists-in-the-v2-representation": "openwop.requirement.0175.legacy-profiles-absent.no-root-profiles",
|
|
73
|
-
"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": "openwop.requirement.0177.manifest-ceiling-refused.unbounded",
|
|
74
|
-
"openwop.it.v2-manifest-ceiling-refused.a-v1-ceiling-1-0-0-2-0-0-is-refused-at-install-with-pack-engine-unsupported": "openwop.requirement.0177.manifest-ceiling-refused.v1-ceiling",
|
|
75
91
|
"openwop.it.v2-manifest-ceiling-refused.a-range-admitting-the-host-major-2-0-0-3-0-0-installs": "openwop.requirement.0177.manifest-ceiling-refused.v2-installs",
|
|
76
|
-
"openwop.it.v2-manifest-
|
|
92
|
+
"openwop.it.v2-manifest-ceiling-refused.a-v1-ceiling-1-0-0-2-0-0-is-refused-at-install-with-pack-engine-unsupported": "openwop.requirement.0177.manifest-ceiling-refused.v1-ceiling",
|
|
93
|
+
"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": "openwop.requirement.0177.manifest-ceiling-refused.unbounded",
|
|
77
94
|
"openwop.it.v2-manifest-hatch-carried.an-x-field-inside-a-prompt-template-of-a-prompt-pack-is-ignored-not-rejected-the": "openwop.requirement.0177.manifest-hatch-carried.prompt-template-x-field",
|
|
95
|
+
"openwop.it.v2-manifest-hatch-carried.an-x-field-inside-agents-0-of-a-node-pack-is-ignored-not-rejected-the-pack-insta": "openwop.requirement.0177.manifest-hatch-carried.agents-x-field",
|
|
78
96
|
"openwop.it.v2-min-client-version.a-client-below-minclientversion-is-refused-with-426-client-version-unsupported": "openwop.requirement.0172.min-client-version",
|
|
79
97
|
"openwop.it.v2-minimum-version-refused.an-a2a-peer-offering-only-a-version-below-minimumversion-is-refused": "openwop.requirement.0175.minimum-version-refused",
|
|
80
98
|
"openwop.it.v2-minimum-version-refused.an-mcp-server-offering-only-a-revision-below-minimumrevision-is-refused": "openwop.requirement.0175.minimum-version-refused.mcp",
|
|
81
99
|
"openwop.it.v2-mrtr-rounds-ceiling.mcp-mrtr-maxrounds-is-an-integer-ceiling-in-1-16": "openwop.requirement.0175.mrtr-rounds-ceiling",
|
|
82
100
|
"openwop.it.v2-mrtr-rounds-ceiling.round-maxrounds-1-is-refused-with-mcp-mrtr-rounds-exceeded": "openwop.requirement.0175.mrtr-rounds-ceiling.refused",
|
|
83
101
|
"openwop.it.v2-no-transport-advertisement.the-v2-root-carries-no-supportedtransports-and-no-grpc-block": "openwop.requirement.0175.no-transport-advertisement",
|
|
84
|
-
"openwop.it.v2-
|
|
102
|
+
"openwop.it.v2-one-signing-scheme.registry-version-manifest-signing-has-exactly-one-scheme-ed25519-canonical-json": "openwop.requirement.0177.one-signing-scheme",
|
|
85
103
|
"openwop.it.v2-owner-subject-required.owner-carries-no-principal-principalkind": "openwop.requirement.0170.owner-subject-required.no-principal",
|
|
86
|
-
"openwop.it.v2-
|
|
87
|
-
"openwop.it.v2-pack-isolation.node-pack-sandbox-timeout-exceeding-wallclocklimitms-fails-with-sandbox-timeout": "openwop.requirement.0173.pack-isolation.timeout",
|
|
88
|
-
"openwop.it.v2-pack-isolation.node-pack-sandbox-memory-cap-exceeding-memorylimitbytes-fails-with-sandbox-memor": "openwop.requirement.0173.pack-isolation.memory-cap",
|
|
104
|
+
"openwop.it.v2-owner-subject-required.owner-subject-is-present-and-validates-against-subject-schema-json": "openwop.requirement.0170.owner-subject-required.subject",
|
|
89
105
|
"openwop.it.v2-pack-isolation.node-pack-sandbox-isolated-context-a-pack-cannot-mutate-state-another-invocation": "openwop.requirement.0173.pack-isolation.isolated-context",
|
|
106
|
+
"openwop.it.v2-pack-isolation.node-pack-sandbox-memory-cap-exceeding-memorylimitbytes-fails-with-sandbox-memor": "openwop.requirement.0173.pack-isolation.memory-cap",
|
|
107
|
+
"openwop.it.v2-pack-isolation.node-pack-sandbox-timeout-exceeding-wallclocklimitms-fails-with-sandbox-timeout": "openwop.requirement.0173.pack-isolation.timeout",
|
|
108
|
+
"openwop.it.v2-pack-isolation.sandbox-isolationmodel-names-a-real-mechanism-never-node-vm": "openwop.requirement.0173.pack-isolation",
|
|
109
|
+
"openwop.it.v2-path-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0172.path-parity",
|
|
90
110
|
"openwop.it.v2-payload-registry-closed.every-registered-event-carries-a-payload-that-validates-against-its-typeindex-en": "openwop.requirement.0171.payload-registry-closed",
|
|
91
111
|
"openwop.it.v2-peer-dependency-declared.a-peerdependencies-key-the-declaration-file-does-not-name-is-refused-with-pack-p": "openwop.requirement.0177.peer-dependency-declared.undefined-key",
|
|
92
112
|
"openwop.it.v2-peer-dependency-declared.an-alias-table-row-host-fs-fs-resolves-through-the-overlap-and-the-pack-installs": "openwop.requirement.0177.peer-dependency-declared.alias-overlap",
|
|
93
113
|
"openwop.it.v2-pinned-run-disposition.a-pin-naming-a-change-id-the-host-does-not-implement-is-cancelled-with-v1-pin-un": "openwop.requirement.0176.pinned-run-disposition.cancelled",
|
|
94
114
|
"openwop.it.v2-pinned-run-disposition.a-pin-naming-a-change-id-the-host-still-implements-continues-under-the-reader-ru": "openwop.requirement.0176.pinned-run-disposition.continued",
|
|
95
|
-
"openwop.it.v2-poll-cursor-v2.the-response-is-the-closed-runid-events-lastsequence-status-isterminal": "openwop.requirement.0171.poll-cursor-v2.shape",
|
|
96
|
-
"openwop.it.v2-poll-cursor-v2.omitting-the-cursor-returns-from-the-first-event-sequence-0": "openwop.requirement.0171.poll-cursor-v2.from-first",
|
|
97
|
-
"openwop.it.v2-poll-cursor-v2.aftersequence-n-returns-only-events-with-sequence-n": "openwop.requirement.0171.poll-cursor-v2.after-sequence",
|
|
98
115
|
"openwop.it.v2-poll-cursor-v2.a-cursor-past-the-end-of-the-log-returns-200-with-an-empty-events-array": "openwop.requirement.0171.poll-cursor-v2.past-end",
|
|
99
|
-
"openwop.it.v2-
|
|
116
|
+
"openwop.it.v2-poll-cursor-v2.aftersequence-n-returns-only-events-with-sequence-n": "openwop.requirement.0171.poll-cursor-v2.after-sequence",
|
|
117
|
+
"openwop.it.v2-poll-cursor-v2.omitting-the-cursor-returns-from-the-first-event-sequence-0": "openwop.requirement.0171.poll-cursor-v2.from-first",
|
|
118
|
+
"openwop.it.v2-poll-cursor-v2.the-response-is-the-closed-runid-events-lastsequence-status-isterminal": "openwop.requirement.0171.poll-cursor-v2.shape",
|
|
100
119
|
"openwop.it.v2-preferred-version-default.a-header-less-get-well-known-openwop-is-the-preferredversion-representation": "openwop.requirement.0172.preferred-version-default.headerless",
|
|
120
|
+
"openwop.it.v2-preferred-version-default.preferredversion-is-a-member-of-protocolversions": "openwop.requirement.0172.preferred-version-default.member",
|
|
101
121
|
"openwop.it.v2-preferred-version-default.through-the-overlap-preferredversion-names-a-1-x-member": "openwop.requirement.0172.preferred-version-default.overlap",
|
|
102
|
-
"openwop.it.v2-profiles-derived-only.the-v2-document-carries-no-root-profiles": "openwop.requirement.0169.profiles-derived-only.no-root-profiles",
|
|
103
122
|
"openwop.it.v2-profiles-derived-only.every-registry-profile-is-derivable-from-the-document-the-discovery-core-predica": "openwop.requirement.0169.profiles-derived-only.derivable",
|
|
104
|
-
"openwop.it.v2-
|
|
123
|
+
"openwop.it.v2-profiles-derived-only.the-v2-document-carries-no-root-profiles": "openwop.requirement.0169.profiles-derived-only.no-root-profiles",
|
|
105
124
|
"openwop.it.v2-provider-conflict.the-qualified-form-packname-acme-widgets-resolves-to-the-named-pack-s-definition": "openwop.requirement.0177.provider-conflict.qualified-form",
|
|
125
|
+
"openwop.it.v2-provider-conflict.two-definitions-of-one-bare-provider-id-fail-closed-the-later-registration-is-re": "openwop.requirement.0177.provider-conflict.fail-closed",
|
|
106
126
|
"openwop.it.v2-refresh-sla.refreshedat-on-each-embedded-protocol-facet-is-within-90-days-of-now": "openwop.requirement.0175.refresh-sla",
|
|
107
127
|
"openwop.it.v2-relaxation-recorded.a-bundle-recording-a-relaxation-cannot-certify-the-relaxed-profile": "openwop.requirement.0173.relaxation-recorded",
|
|
108
128
|
"openwop.it.v2-relaxation-recorded.durability-is-a-closed-set-session-deployment-persisted": "openwop.requirement.0173.relaxation-recorded.durability-closed",
|
|
129
|
+
"openwop.it.v2-release-identity.the-corpus-gate-script-exits-0": "openwop.requirement.0172.release-identity",
|
|
130
|
+
"openwop.it.v2-req-only-assertions.the-corpus-gate-script-exits-0": "openwop.requirement.0168.req-only-assertions",
|
|
131
|
+
"openwop.it.v2-retention-floors.a-pinned-old-major-version-missing-from-its-registry-while-the-floor-is-open-fai": "openwop.requirement.0174.retention-floors",
|
|
132
|
+
"openwop.it.v2-retention-floors.the-registry-validates-and-the-script-prints-the-floor-state-offline": "openwop.requirement.0174.retention-floors",
|
|
133
|
+
"openwop.it.v2-retention-floors.the-same-probe-with-every-pinned-version-present-passes-while-the-floor-is-open": "openwop.requirement.0174.retention-floors",
|
|
109
134
|
"openwop.it.v2-revocation-honored.a-revoked-next-request-credential-is-refused-on-the-next-request-with-credential": "openwop.requirement.0170.revocation-honored",
|
|
110
135
|
"openwop.it.v2-run-annotation-not-event.an-annotation-is-created-and-listed-and-never-enters-the-run-s-event-log": "openwop.requirement.0170.run-annotation-not-event",
|
|
111
136
|
"openwop.it.v2-run-bulk-cancel.101-ids-are-refused-400-validation-error-with-details-maxrunids": "openwop.requirement.0170.run-bulk-cancel",
|
|
112
137
|
"openwop.it.v2-run-bulk-cancel.results-come-back-in-request-order-each-id-processed-independently-a-foreign-id": "openwop.requirement.0170.run-bulk-cancel",
|
|
113
|
-
"openwop.it.v2-run-cancel.cancelling-a-terminal-run-is-refused-409-run-terminal": "openwop.requirement.0170.run-cancel",
|
|
114
138
|
"openwop.it.v2-run-cancel.cancelling-a-running-run-answers-200-with-cancelling-cancelled-emits-run-cancell": "openwop.requirement.0170.run-cancel",
|
|
139
|
+
"openwop.it.v2-run-cancel.cancelling-a-terminal-run-answers-409-run-terminal-or-200-idempotently-the-prose": "openwop.it.v2-run-cancel.cancelling-a-terminal-run-is-refused-409-run-terminal",
|
|
140
|
+
"openwop.it.v2-run-cancel.cancelling-a-terminal-run-is-refused-409-run-terminal": "openwop.requirement.0170.run-cancel",
|
|
115
141
|
"openwop.it.v2-run-completed-outputs.the-run-completed-event-of-a-run-that-completed-carries-an-outputs-object": "openwop.requirement.0171.run-completed-outputs",
|
|
116
142
|
"openwop.it.v2-run-diff-identical.two-identical-logs-diff-to-divergedatseq-null-and-empty-eventdiffs-in-a-response": "openwop.requirement.0170.run-diff-identical",
|
|
117
143
|
"openwop.it.v2-run-fork-prefix.a-replay-fork-inherits-exactly-0-fromseq-the-event-at-fromseq-is-re-executed-nev": "openwop.requirement.0170.fork-prefix-boundary",
|
|
118
144
|
"openwop.it.v2-run-fork-refusals.replay-overlay-400-a-fromseq-outside-the-log-422-fork-point-invalid-a-valid-repl": "openwop.requirement.0170.run-fork-refusals",
|
|
119
145
|
"openwop.it.v2-run-options-limits.odd-format-tags-and-free-form-metadata-are-accepted-and-surface-unchanged-on-the": "openwop.requirement.0171.run-options-limits",
|
|
120
|
-
"openwop.it.v2-run-pause-resume.pause-and-resume-on-a-terminal-run-answer-409-with-an-error-envelope": "openwop.requirement.0170.run-pause-resume",
|
|
121
146
|
"openwop.it.v2-run-pause-resume.a-running-run-pauses-202-paused-refuses-a-second-pause-409-resumes-202-running-a": "openwop.requirement.0170.run-pause-resume",
|
|
147
|
+
"openwop.it.v2-run-pause-resume.pause-and-resume-on-a-terminal-run-answer-409-with-an-error-envelope": "openwop.requirement.0170.run-pause-resume",
|
|
122
148
|
"openwop.it.v2-run-snapshot-etag.a-matching-if-none-match-receives-304-with-no-body-and-the-version-header-a-non": "openwop.requirement.0170.run-snapshot-etag",
|
|
149
|
+
"openwop.it.v2-seams-not-in-canonical.the-corpus-gate-script-exits-0": "openwop.requirement.0168.seams-not-in-canonical",
|
|
150
|
+
"openwop.it.v2-security-defaults-table.the-obligation-table-has-a-witness-column-and-no-row-is-unwitnessable": "openwop.requirement.0173.security-defaults-table",
|
|
151
|
+
"openwop.it.v2-spec-artifacts-digest.the-corpus-gate-script-exits-0": "openwop.requirement.0168.spec-artifacts-digest",
|
|
123
152
|
"openwop.it.v2-sse-last-event-id.last-event-id-resumes-at-the-next-sequence-never-re-emits-the-resumption-point-l": "openwop.requirement.0171.sse-last-event-id",
|
|
124
153
|
"openwop.it.v2-stream-mode-refusal.a-value-outside-the-pattern-a-forbidden-combination-and-an-unimplemented-mode-ar": "openwop.requirement.0171.stream-mode-refusal",
|
|
125
154
|
"openwop.it.v2-stream-mode-refusal.updates-streams-200-text-event-stream-with-frames-bufferms-yields-at-least-one-b": "openwop.requirement.0171.stream-mode-refusal",
|
|
126
155
|
"openwop.it.v2-stream-sse-projection.every-data-frame-on-the-major-2-stream-carries-the-tenant-bound-runid-of-the-run": "openwop.requirement.0171.stream-sse-projection",
|
|
127
|
-
"openwop.it.v2-subject-link-record.the-link-formed-across-scim-and-saml-is-a-closed-subjectlink-record": "openwop.requirement.0170.subject-link-record.shape",
|
|
128
156
|
"openwop.it.v2-subject-link-record.deactivation-sets-deniedat-and-the-saml-decision-path-consults-it": "openwop.requirement.0170.subject-link-record.denied-at",
|
|
129
|
-
"openwop.it.v2-
|
|
130
|
-
"openwop.it.v2-
|
|
157
|
+
"openwop.it.v2-subject-link-record.the-link-formed-across-scim-and-saml-is-a-closed-subjectlink-record": "openwop.requirement.0170.subject-link-record.shape",
|
|
158
|
+
"openwop.it.v2-threat-model-template.the-corpus-gate-script-exits-0": "openwop.requirement.0173.threat-model-template",
|
|
131
159
|
"openwop.it.v2-unmapped-type-refused.a-fork-of-the-same-log-is-refused-for-the-same-reason-the-rule-binds-every-reade": "openwop.requirement.0176.unmapped-type-refused.fork",
|
|
160
|
+
"openwop.it.v2-unmapped-type-refused.a-registered-vendor-type-the-codemap-does-not-name-is-read-under-its-own-name-un": "openwop.requirement.0176.vendor-type-passthrough",
|
|
161
|
+
"openwop.it.v2-unmapped-type-refused.poll-over-a-log-with-an-unmapped-unprefixed-type-fails-with-500-event-type-unmap": "openwop.requirement.0176.unmapped-type-refused",
|
|
162
|
+
"openwop.it.v2-v1-events-translated.a-fork-of-the-era-2-run-reads-its-inherited-prefix-with-v2-type-names": "openwop.requirement.0176.v1-events-translated.fork",
|
|
132
163
|
"openwop.it.v2-v1-events-translated.poll-reads-an-era-2-log-with-v2-type-names-and-sequence-0-present": "openwop.requirement.0176.v1-events-translated.poll",
|
|
133
164
|
"openwop.it.v2-v1-events-translated.sse-reads-the-same-era-2-log-with-v2-type-names": "openwop.requirement.0176.v1-events-translated.sse",
|
|
134
|
-
"openwop.it.v2-v1-events-translated.a-fork-of-the-era-2-run-reads-its-inherited-prefix-with-v2-type-names": "openwop.requirement.0176.v1-events-translated.fork",
|
|
135
|
-
"openwop.it.v2-v1-signed-webhook-accepted.the-webhooks-facet-lists-scheme-v1-the-scheme-a-v1-signed-delivery-is-verified-u": "openwop.requirement.0176.v1-signed-webhook-accepted.facet",
|
|
136
165
|
"openwop.it.v2-v1-signed-webhook-accepted.the-host-s-v2-receiver-path-accepts-an-x-openwop-only-scheme-v1-delivery-and-ref": "openwop.requirement.0176.v1-signed-webhook-accepted",
|
|
137
|
-
"openwop.it.v2-
|
|
166
|
+
"openwop.it.v2-v1-signed-webhook-accepted.the-webhooks-facet-lists-scheme-v1-the-scheme-a-v1-signed-delivery-is-verified-u": "openwop.requirement.0176.v1-signed-webhook-accepted.facet",
|
|
138
167
|
"openwop.it.v2-version-header-honored.a-host-advertising-two-majors-serves-two-different-representations": "openwop.requirement.0172.version-header-honored",
|
|
168
|
+
"openwop.it.v2-version-header-honored.openwop-version-is-honored-or-refused-never-ignored": "openwop.requirement.0172.version-header-honored",
|
|
139
169
|
"openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once": "openwop.requirement.0173.webhook-durable-delivery",
|
|
140
170
|
"openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
|
|
141
171
|
"openwop.it.v2-well-known-one-resource.a-header-less-get-and-an-openwop-version-2-0-get-are-two-representations-of-one": "openwop.requirement.0176.well-known-one-resource",
|
|
142
172
|
"openwop.it.v2-well-known-one-resource.the-v2-representation-carries-no-capabilities-wrapper-no-dotted-host-key-no-prof": "openwop.requirement.0176.well-known-one-resource.v2-representation",
|
|
143
|
-
"openwop.it.v2-
|
|
144
|
-
"openwop.it.v2-bundle-signature-attributable.the-v2-discovery-root-publishes-signingkeys-the-surface-the-rfc-named": "openwop.requirement.0168.bundle-signature-attributable.surface",
|
|
145
|
-
"openwop.it.v2-bundle-signature-attributable.the-front-door-gate-verifies-the-attestation-instead-of-inspecting-the-string": "openwop.requirement.0168.bundle-signature-attributable.verifies",
|
|
146
|
-
"openwop.it.v2-bundle-signature-attributable.the-four-signature-outcomes-stay-distinct-collapsing-any-two-restores-the-defect": "openwop.requirement.0168.bundle-signature-attributable.outcomes",
|
|
147
|
-
"openwop.it.v2-bundle-signature-attributable.signingkeys-is-reachable-from-a-v1-root-too-a-bundle-is-v3-regardless-of-major": "openwop.requirement.0168.bundle-signature-attributable.v1-root",
|
|
148
|
-
"openwop.it.v2-corpus-tag-pinned.every-vendoring-consumer-in-the-cross-repo-inventory-records-a-published-corpus": "openwop.requirement.0176.corpus-tag-pinned",
|
|
149
|
-
"openwop.it.v2-declaration-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0169.declaration-parity",
|
|
150
|
-
"openwop.it.v2-eos-clock.the-clock-file-is-current-with-the-matrix-and-the-public-history": "openwop.requirement.0174.v1-eos-clock",
|
|
151
|
-
"openwop.it.v2-eos-clock.check-removal-dates-fails-the-v1-tree-sources-of-v1-end-of-support-rows-once-the": "openwop.requirement.0174.v1-eos-clock",
|
|
152
|
-
"openwop.it.v2-eos-clock.check-removal-dates-passes-under-the-same-clock-when-today-is-before-the-date-an": "openwop.requirement.0174.v1-eos-clock",
|
|
153
|
-
"openwop.it.v2-error-registry-prose-parity.errors-md-states-the-registry-count-it-was-generated-from-and-renders-every-code": "openwop.requirement.0171.error-registry-prose-parity",
|
|
154
|
-
"openwop.it.v2-event-naming-rule.every-closed-enum-v2-event-type-is-two-kebab-segments-and-every-recorded-artifac": "openwop.requirement.0171.event-naming-rule",
|
|
155
|
-
"openwop.it.v2-event-naming-rule.the-closed-enum-and-the-vendor-branch-are-disjoint-every-registered-type-validat": "openwop.requirement.0171.event-naming-rule",
|
|
156
|
-
"openwop.it.v2-events-channel-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0171.events-channel-parity",
|
|
157
|
-
"openwop.it.v2-externally-gated-never-stable.the-corpus-gate-script-exits-0": "openwop.requirement.0169.externally-gated-never-stable",
|
|
158
|
-
"openwop.it.v2-id-kinds-bound.every-v2-id-field-refs-its-kind-and-every-id-property-is-triaged": "openwop.requirement.0170.id-kinds-bound",
|
|
159
|
-
"openwop.it.v2-one-signing-scheme.registry-version-manifest-signing-has-exactly-one-scheme-ed25519-canonical-json": "openwop.requirement.0177.one-signing-scheme",
|
|
160
|
-
"openwop.it.v2-path-parity.the-corpus-gate-script-exits-0": "openwop.requirement.0172.path-parity",
|
|
161
|
-
"openwop.it.v2-release-identity.the-corpus-gate-script-exits-0": "openwop.requirement.0172.release-identity",
|
|
162
|
-
"openwop.it.v2-req-only-assertions.the-corpus-gate-script-exits-0": "openwop.requirement.0168.req-only-assertions",
|
|
163
|
-
"openwop.it.v2-retention-floors.the-registry-validates-and-the-script-prints-the-floor-state-offline": "openwop.requirement.0174.retention-floors",
|
|
164
|
-
"openwop.it.v2-retention-floors.a-pinned-old-major-version-missing-from-its-registry-while-the-floor-is-open-fai": "openwop.requirement.0174.retention-floors",
|
|
165
|
-
"openwop.it.v2-retention-floors.the-same-probe-with-every-pinned-version-present-passes-while-the-floor-is-open": "openwop.requirement.0174.retention-floors",
|
|
166
|
-
"openwop.it.v2-seams-not-in-canonical.the-corpus-gate-script-exits-0": "openwop.requirement.0168.seams-not-in-canonical",
|
|
167
|
-
"openwop.it.v2-security-defaults-table.the-obligation-table-has-a-witness-column-and-no-row-is-unwitnessable": "openwop.requirement.0173.security-defaults-table",
|
|
168
|
-
"openwop.it.v2-spec-artifacts-digest.the-corpus-gate-script-exits-0": "openwop.requirement.0168.spec-artifacts-digest",
|
|
169
|
-
"openwop.it.v2-threat-model-template.the-corpus-gate-script-exits-0": "openwop.requirement.0173.threat-model-template",
|
|
170
|
-
"openwop.it.v2-witness-required.the-corpus-gate-script-exits-0": "openwop.requirement.0168.witness-required",
|
|
171
|
-
"openwop.it.bundle-maturity-gate.the-committed-corpus-is-green-and-the-report-names-the-overstated-families-and-t": "openwop.it.bundle-maturity-gate.the-committed-corpus-is-green-and-the-gate-states-when-c-7-binds",
|
|
172
|
-
"openwop.it.bundle-maturity-gate.the-same-committed-bundle-re-labelled-onto-the-rfc-s-suite-fails-naming-every-ov": "openwop.it.bundle-maturity-gate.the-superseded-myndhyve-bundle-re-labelled-onto-the-rfc-s-suite-fails-naming-eve"
|
|
173
|
+
"openwop.it.v2-witness-required.the-corpus-gate-script-exits-0": "openwop.requirement.0168.witness-required"
|
|
173
174
|
}
|
|
174
175
|
}
|