@openwop/openwop-conformance 2.40.3 → 2.41.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 CHANGED
@@ -1,5 +1,15 @@
1
1
  # `@openwop/openwop-conformance` Changelog
2
2
 
3
+ ## [2.41.0] — 2026-09-26 — RFC 0111's context-budget witness can fail
4
+
5
+ - **Conformance Soak is green again: the receiver modules count as harness doubles.** `host-callback-declaration` keys on imports of modules that stand up a server the host must reach, and its list omitted `scoped-receiver` and `effect-receiver`. So `v2-a2a-push-delivery`'s correct `REQUIRES_HOST_CALLBACK` read as a callback it "does not make", and the post-merge Soak failed on every run from #1546 (2026-09-24) on, which no PR check saw. Both modules join the list, and the eight scenarios that take a host callback through them now declare it (`v2-bound-id-kinds`, `v2-webhook-delivery-isolation`, `v2-webhook-delivery-shape`, `v2-webhook-durable-delivery`, `v2-webhook-unregister-stops-delivery`, `webhook-signed-delivery`, `v2-durability-recovery`, `v2-terminal-event-once`), so an off-process consumer can list them before running. Sabotage: dropping `scoped-receiver` again reproduces the Soak failure.
6
+ - **`context-budget-transcript-bound` can now fail in the ways RFC 0111 names.** It checked that each fed event id existed and was unique, so a wrong `tokenCount`, a window that was not a recent tail, or a budget of 10⁹ the run never reached all passed. The checks now live in the pure checker `src/lib/context-budget.ts` (15 self-tests, one per sabotage). For `tokenCounter: "chars"`, the transcript-window seam must return `entries[] { eventId, rendered }` and the suite sums the rendered Unicode code points, which must equal `tokenCount`. It also checks every id is a real event and the verbatim entries equal `eventIds` in order. For the recent tail, fed events are in log order, none at or after the turn's own `runOrchestrator.decided`, and no newer eligible event (same `(type, nodeId)`) is dropped. A turn with no budget pressure records `partial-witness:`, not a pass. Other token units are advertise-and-attest. See the COMPATIBILITY.md correction on record of 2026-09-26.
7
+ - **`context-summarization-replay` compares the summary text the model saw.** Equal `summaryRef`s showed the fork cited the same artifact. When the seam serves `entries[]` for both runs, the fork's fed summary text must now equal the source's byte for byte.
8
+ - **Both scenarios run at major 2.** They are added to `BOTH_MAJORS`, so v2-applicable files go from 121 to 123. At major 2 they read the `multiAgent` record by presence and record `inapplicable` when `contextBudget` or `summarization` is absent. That is never a strict-mode failure, so no currently certified host is affected. Paths resolve through `runsPath()` and the driver's seam rewrite, and the seam is added to `api/seams-v2.yaml` at `/conformance/seams/sample/agent/transcript-window`.
9
+ - **New fixture `conformance-context-budget-live`.** A supervisor driven by the host's live model, with no mock keys and bounded by `settings.maxLoopbackIterations: 8`. Both scenarios gate on it. `conformance-context-budget-multiturn` is kept but no longer gates anything: it scripts a mock supervisor, which RFC 0111 §Scope forbids from advertising `contextBudget`.
10
+ - **RFC 0121 gap G1 closes** (UQ1 resolved for GitHub Copilot individual plans): `spec/v1/gaps.json` in `@openwop/spec-artifacts` moves. No scenario changes.
11
+ - **Version moved ahead of publication.** `@openwop/openwop-conformance` and its exact-pinned peer `@openwop/spec-artifacts` move to `2.41.0`, absorbing the unpublished `2.40.4` cycle (its one entry, RFC 0121 G1, is above): the major-2 scenario promotion makes this a minor. Not tagged, not published.
12
+
3
13
  ## [2.40.3] — 2026-09-26 — a cookie-borne lane can be revoke-witnessed, and a secret-named setting no longer corrupts the discovery digest
4
14
 
5
15
  - **`v2-revocation-honored` presents a cookie-lane credential as a cookie.** When the mint seam answers `presentation: { kind: "cookie", name }`, the probe sends `Cookie: <name>=<credential>` instead of a bearer token. The seams contract's `mintLaneCredential` response gains that optional member. Bearer stays the default when `presentation` is absent. The cookie branch is unexercised until a host serves it; openwop-app's `session` lane is the first expected.
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  # --legacy-peer-deps is REQUIRED, not optional: the exact peer pin is what npm's
12
12
  # default resolver refuses. npm 10.9 fails outright with
13
13
  # "Cannot read properties of null (reading 'edgesOut')" — use npm >= 11.
14
- npm install --legacy-peer-deps @openwop/openwop-conformance@2.40.3 @openwop/spec-artifacts@2.40.3
14
+ npm install --legacy-peer-deps @openwop/openwop-conformance@2.41.0 @openwop/spec-artifacts@2.41.0
15
15
  # or run without install:
16
16
  npx @openwop/openwop-conformance --base-url https://api.example.com --api-key hk_test_...
17
17
  ```
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "package": "@openwop/spec-artifacts",
3
- "version": "2.40.3",
4
- "stampSha256": "a3da70b5c189e692914fd3516f841bfaff477a365503009b761bccc1842f43e2"
3
+ "version": "2.41.0",
4
+ "stampSha256": "6b53adc27c8d6212c78dd08bf0be7b3c2d740d4290a72ce55324fd1fb4a6fe46"
5
5
  }
@@ -0,0 +1,44 @@
1
+ {
2
+ "id": "conformance-context-budget-live",
3
+ "name": "Conformance: Context-Budget Live Orchestrator (RFC 0111)",
4
+ "version": "1.0",
5
+ "description": "RFC 0111, the witness fixture (suite 2.41.0). A `core.orchestrator.supervisor` loop driven by the host's LIVE model — no `mockDecisions`, `mockDispatchPlan` or `mockPendingDecision` — because RFC 0111 §Scope forbids a mock supervisor from advertising `contextBudget`. The supervisor receives `config.instructions` as its objective and dispatches `conformance-noop` until it terminates, bounded by `settings.maxLoopbackIterations`. Each iteration's transcript grows; a host advertising `multiAgent.executionModel.contextBudget` reports what it fed the model through `GET /v1/host/sample/agent/transcript-window` (`host-sample-test-seams.md` §14), including `entries[] { eventId, rendered }`. For a full witness the run MUST put the budget under pressure (an older eligible event evicted or summarized); a host whose advertised budget this run never reaches records `partial-witness`. Hosts SHOULD run the live supervisor at temperature 0 with structured output so the decision shape is stable; the scenario asserts the host's accounting, never the model's words.",
6
+ "nodes": [
7
+ {
8
+ "id": "supervisor",
9
+ "typeId": "core.orchestrator.supervisor",
10
+ "name": "Supervisor",
11
+ "position": { "x": 0, "y": 0 },
12
+ "config": {
13
+ "instructions": "You are testing a transcript budget. Dispatch the worker conformance-noop once per turn. After it has completed six times, terminate with reason goal-reached. Do not ask the user anything."
14
+ },
15
+ "inputs": {},
16
+ "agent": {
17
+ "agentId": "core.conformance.supervisor",
18
+ "modelClass": "reasoning"
19
+ }
20
+ },
21
+ {
22
+ "id": "dispatch",
23
+ "typeId": "core.dispatch",
24
+ "name": "Dispatch",
25
+ "position": { "x": 200, "y": 0 },
26
+ "config": {
27
+ "askUserRouting": "auto",
28
+ "workerDispatchModel": "child-run",
29
+ "fanOutPolicy": "sequential"
30
+ },
31
+ "inputs": {}
32
+ }
33
+ ],
34
+ "edges": [
35
+ { "id": "e1", "sourceNodeId": "supervisor", "targetNodeId": "dispatch" },
36
+ { "id": "e2", "sourceNodeId": "dispatch", "targetNodeId": "supervisor" }
37
+ ],
38
+ "triggers": [
39
+ { "id": "manual", "type": "manual", "enabled": true }
40
+ ],
41
+ "variables": [],
42
+ "metadata": { "tags": ["conformance", "multi-agent", "orchestrator", "context-budget", "rfc-0111", "live-model"] },
43
+ "settings": { "timeout": 300000, "maxLoopbackIterations": 8 }
44
+ }
@@ -2,7 +2,7 @@
2
2
  "id": "conformance-context-budget-multiturn",
3
3
  "name": "Conformance: Context-Budget Multi-Turn Orchestrator (RFC 0111)",
4
4
  "version": "1.0",
5
- "description": "RFC 0111. Drives a multi-iteration `core.orchestrator.supervisor` loop so the per-turn transcript grows across iterations — enough turns that an UNBOUNDED transcript would exceed a host's advertised `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. A host that bounds the transcript exposes its per-iteration accounting via the OPTIONAL seam `GET /v1/host/sample/agent/transcript-window?runId=…&iteration=N` (`host-sample-test-seams.md` §14): `{ tokenCounter, tokenCount, eventIds, summarizedRanges }`. The conformance scenario `context-budget-transcript-bound.test.ts` asserts `tokenCount ≤ budget`, independently re-counts the events named in `eventIds` from the run event-log, confirms the recent-tail + keepLastTurns-verbatim rules, and (for `summarization.supported` hosts) `context-summarization-replay.test.ts` replays the run and asserts the recorded `context.summarized` → `summaryRef` is reused (never re-summarized). Reference hosts that do not advertise `contextBudget` soft-skip both scenarios.",
5
+ "description": "RFC 0111 — SUPERSEDED as the witness gate in suite 2.41.0. This fixture scripts the supervisor with `mockDecisions`, i.e. a mock supervisor, which RFC 0111 §Scope forbids from advertising `contextBudget`; no honest host can witness the capability against it. Kept so hosts that still list it keep validating. Both RFC 0111 scenarios (`context-budget-transcript-bound`, `context-summarization-replay`) gate on `conformance-context-budget-live`, which drives the host's live model.",
6
6
  "nodes": [
7
7
  {
8
8
  "id": "supervisor",
package/fixtures.md CHANGED
@@ -99,7 +99,8 @@ All fixtures MUST advertise:
99
99
  | Agent Memory Redaction | `conformance-agent-memory-redaction` | Phase 3 / SR-1 — BYOK plaintext surfaces as `[REDACTED:<id>]` on read | `completed` | ≤ 15s |
100
100
  | 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 |
101
101
  | 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 |
102
- | Context-Budget Multi-Turn | `conformance-context-budget-multiturn` | RFC 0111 — multi-iteration `core.orchestrator.supervisor` loop whose per-turn transcript grows; a host bounding it exposes `{ tokenCounter, tokenCount, eventIds, summarizedRanges }` via the `GET /v1/host/sample/agent/transcript-window` seam (`tokenCount ≤ transcriptTokenBudget`, internally consistent, keepLastTurns verbatim); the summarization leg replays and asserts `context.summarized` → `summaryRef` reuse. Reference hosts that do not advertise `contextBudget` soft-skip | `completed` | ≤ 60s |
102
+ | Context-Budget Multi-Turn | `conformance-context-budget-multiturn` | RFC 0111 — **superseded as the witness gate in suite 2.41.0.** Drives the supervisor through `mockDecisions`, i.e. a mock supervisor — exactly what RFC 0111 §Scope forbids from advertising `contextBudget`, so no honest host can witness against it. Kept (v1 compatibility: hosts may still list it); both RFC 0111 scenarios now gate on `conformance-context-budget-live` | `completed` | ≤ 60s |
103
+ | Context-Budget Live Orchestrator | `conformance-context-budget-live` | RFC 0111 witness (suite 2.41.0) — `core.orchestrator.supervisor` driven by the host's LIVE model (no mock keys; `config.instructions` is the objective), dispatching `conformance-noop` until it terminates, bounded by `settings.maxLoopbackIterations: 8`. The host reports each iteration's fed transcript through `GET /v1/host/sample/agent/transcript-window` including `entries[] { eventId, rendered }`; `context-budget-transcript-bound` recounts `chars`, checks real events + the recent tail + budget PRESSURE (no pressure ⇒ `partial-witness`); `context-summarization-replay` replays and compares the fed summary text byte for byte. A host whose supervisor has no live model MUST NOT advertise this fixture | `completed` | ≤ 300s |
103
104
  | Conversation Lifecycle | `conformance-conversation-lifecycle` | Phase 4 — open → exchange → close event ordering | `completed` | ≤ 20s |
104
105
  | Conversation vs Clarification | `conformance-conversation-vs-clarification` | Phase 4 — conversation suspend emits `conversation.*`, NOT `clarification.*` | `completed` | ≤ 15s |
105
106
  | Conversation Replay | `conformance-conversation-replay` | Phase 4 — `:fork` preserves conversation channel projection | `completed` | ≤ 30s |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "2.40.3",
3
+ "version": "2.41.0",
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.40.3"
59
+ "@openwop/spec-artifacts": "2.41.0"
60
60
  }
61
61
  }
package/requirements.json CHANGED
@@ -9179,7 +9179,7 @@
9179
9179
  {
9180
9180
  "id": "openwop.it.context-budget-transcript-bound.bounds-the-per-turn-transcript-to-transcripttokenbudget-with-an-internally-consi",
9181
9181
  "file": "context-budget-transcript-bound.test.ts",
9182
- "line": 135,
9182
+ "line": 89,
9183
9183
  "title": "bounds the per-turn transcript to transcriptTokenBudget with an internally-consistent, recent-tail accounting",
9184
9184
  "explicitId": "openwop.it.context-budget-transcript-bound.bounds-the-per-turn-transcript-to-transcripttokenbudget-with-an-internally-consi",
9185
9185
  "citations": [
@@ -9187,22 +9187,6 @@
9187
9187
  "section": "RFC 0111",
9188
9188
  "requirement": "tokenCounter MUST be advertised when transcriptTokenBudget is present (schema if/then)"
9189
9189
  },
9190
- {
9191
- "section": "RFC 0111",
9192
- "requirement": "POST /v1/runs MUST return a runId"
9193
- },
9194
- {
9195
- "section": "host-sample-test-seams.md §14",
9196
- "requirement": "the transcript-window seam MUST return 200 for a valid iteration"
9197
- },
9198
- {
9199
- "section": "host-sample-test-seams.md §14",
9200
- "requirement": "the seam MUST return { tokenCounter, tokenCount, eventIds, summarizedRanges }"
9201
- },
9202
- {
9203
- "section": "host-sample-test-seams.md §14",
9204
- "requirement": "a wired transcript-window seam MUST report at least one orchestrator iteration"
9205
- },
9206
9190
  {
9207
9191
  "section": "RFC 0111",
9208
9192
  "requirement": null,
@@ -9210,21 +9194,24 @@
9210
9194
  },
9211
9195
  {
9212
9196
  "section": "RFC 0111",
9213
- "requirement": null,
9214
- "interpolated": true
9197
+ "requirement": "the create response MUST carry a runId"
9215
9198
  },
9216
9199
  {
9217
- "section": "RFC 0111 §\"Conformance seam\"",
9200
+ "section": "host-sample-test-seams.md §14",
9218
9201
  "requirement": null,
9219
9202
  "interpolated": true
9220
9203
  },
9221
9204
  {
9222
- "section": "RFC 0111 §\"Conformance seam\"",
9205
+ "section": "host-sample-test-seams.md §14",
9223
9206
  "requirement": null,
9224
9207
  "interpolated": true
9225
9208
  },
9226
9209
  {
9227
- "section": "RFC 0111",
9210
+ "section": "host-sample-test-seams.md §14",
9211
+ "requirement": "a wired transcript-window seam MUST report at least one orchestrator iteration"
9212
+ },
9213
+ {
9214
+ "section": "RFC 0111 §\"Conformance seam\" (b)/(c), host-sample-test-seams.md §14",
9228
9215
  "requirement": null,
9229
9216
  "interpolated": true
9230
9217
  },
@@ -9238,13 +9225,18 @@
9238
9225
  {
9239
9226
  "id": "openwop.it.context-summarization-replay.replay-reuses-the-recorded-context-summarized-summaryref-never-re-summarizes",
9240
9227
  "file": "context-summarization-replay.test.ts",
9241
- "line": 99,
9228
+ "line": 106,
9242
9229
  "title": "replay reuses the recorded context.summarized summaryRef — never re-summarizes",
9243
9230
  "explicitId": "openwop.it.context-summarization-replay.replay-reuses-the-recorded-context-summarized-summaryref-never-re-summarizes",
9244
9231
  "citations": [
9245
9232
  {
9246
- "section": "rest-endpoints.md POST /v1/runs/{runId}:fork",
9247
- "requirement": "POST /v1/runs MUST return a runId"
9233
+ "section": "RFC 0111",
9234
+ "requirement": null,
9235
+ "interpolated": true
9236
+ },
9237
+ {
9238
+ "section": "rest-endpoints.md POST /v1/runs",
9239
+ "requirement": "the create response MUST carry a runId"
9248
9240
  },
9249
9241
  {
9250
9242
  "section": "rest-endpoints.md POST /v1/runs/{runId}:fork",
@@ -9257,6 +9249,14 @@
9257
9249
  {
9258
9250
  "section": "RFC 0111 §\"Replay determinism\"",
9259
9251
  "requirement": "a replay fork MUST reuse the recorded context.summarized summaryRef (never re-summarize to a different transcript)"
9252
+ },
9253
+ {
9254
+ "section": "RFC 0111 §\"Replay determinism\"",
9255
+ "requirement": "the source run summarized, so its transcript windows MUST carry the summary text it fed"
9256
+ },
9257
+ {
9258
+ "section": "RFC 0111 §\"Replay determinism\"",
9259
+ "requirement": "the replay MUST feed the model the recorded summary text, byte for byte — never a re-summarization"
9260
9260
  }
9261
9261
  ]
9262
9262
  },
@@ -27686,7 +27686,7 @@
27686
27686
  {
27687
27687
  "id": "openwop.it.v2-bound-id-kinds.subscriptionid-post-webhooks-mints-a-bound-webhookid-the-projected-segment-is-ac",
27688
27688
  "file": "v2-bound-id-kinds.test.ts",
27689
- "line": 89,
27689
+ "line": 91,
27690
27690
  "title": "subscriptionId: POST /webhooks mints a bound webhookId, the projected segment is accepted, and a foreign tenant segment is refused 403",
27691
27691
  "explicitId": "openwop.requirement.0187.bound-id-kinds.webhook",
27692
27692
  "citations": [
@@ -27713,7 +27713,7 @@
27713
27713
  {
27714
27714
  "id": "openwop.it.v2-bound-id-kinds.subscriptionid-the-webhookid-a-host-emits-on-a-delivery-is-the-one-it-minted",
27715
27715
  "file": "v2-bound-id-kinds.test.ts",
27716
- "line": 140,
27716
+ "line": 142,
27717
27717
  "title": "subscriptionId: the webhookId a host EMITS on a delivery is the one it minted",
27718
27718
  "explicitId": "openwop.requirement.0187.bound-id-kinds.webhook-emitted",
27719
27719
  "citations": [
@@ -27732,7 +27732,7 @@
27732
27732
  {
27733
27733
  "id": "openwop.it.v2-bound-id-kinds.interruptid-the-id-a-suspension-puts-on-the-wire-is-bound",
27734
27734
  "file": "v2-bound-id-kinds.test.ts",
27735
- "line": 192,
27735
+ "line": 194,
27736
27736
  "title": "interruptId: the id a suspension puts on the wire is bound",
27737
27737
  "explicitId": null,
27738
27738
  "citations": []
@@ -27740,7 +27740,7 @@
27740
27740
  {
27741
27741
  "id": "openwop.it.v2-bound-id-kinds.effectid-every-row-get-runs-runid-effects-serves-is-bound",
27742
27742
  "file": "v2-bound-id-kinds.test.ts",
27743
- "line": 213,
27743
+ "line": 215,
27744
27744
  "title": "effectId: every row GET /runs/{runId}/effects serves is bound",
27745
27745
  "explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
27746
27746
  "citations": [
@@ -27753,7 +27753,7 @@
27753
27753
  {
27754
27754
  "id": "openwop.it.v2-bound-id-kinds.deliveryid-every-record-in-the-dead-letter-read-carries-a-bound-id-in-the-caller",
27755
27755
  "file": "v2-bound-id-kinds.test.ts",
27756
- "line": 228,
27756
+ "line": 230,
27757
27757
  "title": "deliveryId: every record in the dead-letter read carries a bound id in the caller's tenant",
27758
27758
  "explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
27759
27759
  "citations": [
@@ -28676,7 +28676,7 @@
28676
28676
  {
28677
28677
  "id": "openwop.it.v2-durability-recovery.accepted-work-survives-a-kill-before-dispatch-and-dispatches-on-resume",
28678
28678
  "file": "v2-durability-recovery.test.ts",
28679
- "line": 280,
28679
+ "line": 282,
28680
28680
  "title": "accepted work survives a kill before dispatch and dispatches on resume",
28681
28681
  "explicitId": "openwop.requirement.0158.kill-after-accept",
28682
28682
  "citations": [
@@ -28690,7 +28690,7 @@
28690
28690
  {
28691
28691
  "id": "openwop.it.v2-durability-recovery.work-executing-at-a-real-process-death-is-never-reported-complete-and-resumes",
28692
28692
  "file": "v2-durability-recovery.test.ts",
28693
- "line": 334,
28693
+ "line": 336,
28694
28694
  "title": "work executing at a real process death is never reported complete, and resumes",
28695
28695
  "explicitId": "openwop.requirement.0158.kill-during-execution",
28696
28696
  "citations": [
@@ -28709,7 +28709,7 @@
28709
28709
  {
28710
28710
  "id": "openwop.it.v2-durability-recovery.the-same-accepted-work-delivered-twice-fires-each-effect-exactly-once",
28711
28711
  "file": "v2-durability-recovery.test.ts",
28712
- "line": 390,
28712
+ "line": 392,
28713
28713
  "title": "the same accepted work delivered twice fires each effect exactly once",
28714
28714
  "explicitId": "openwop.requirement.0158.duplicate-delivery",
28715
28715
  "citations": [
@@ -28728,7 +28728,7 @@
28728
28728
  {
28729
28729
  "id": "openwop.it.v2-durability-recovery.the-declared-recovery-bound-is-derived-from-the-mechanism-that-enforces-it",
28730
28730
  "file": "v2-durability-recovery.test.ts",
28731
- "line": 524,
28731
+ "line": 526,
28732
28732
  "title": "the declared recovery bound is derived from the mechanism that enforces it",
28733
28733
  "explicitId": "openwop.requirement.0158.bound-is-derived",
28734
28734
  "citations": [
@@ -28742,7 +28742,7 @@
28742
28742
  {
28743
28743
  "id": "openwop.it.v2-durability-recovery.deterministically-failing-work-reaches-a-terminal-state-and-stops-being-retried",
28744
28744
  "file": "v2-durability-recovery.test.ts",
28745
- "line": 555,
28745
+ "line": 557,
28746
28746
  "title": "deterministically failing work reaches a terminal state and stops being retried",
28747
28747
  "explicitId": "openwop.requirement.0158.poison-exhaustion",
28748
28748
  "citations": [
@@ -32964,7 +32964,7 @@
32964
32964
  {
32965
32965
  "id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
32966
32966
  "file": "v2-terminal-event-once.test.ts",
32967
- "line": 81,
32967
+ "line": 83,
32968
32968
  "title": "every run observed to a terminal state has exactly one terminal event and no forward execution after it",
32969
32969
  "explicitId": "openwop.requirement.0194.terminal-once",
32970
32970
  "citations": [
@@ -32982,7 +32982,7 @@
32982
32982
  {
32983
32983
  "id": "openwop.it.v2-terminal-event-once.work-delivered-twice-still-leaves-one-terminal-event-and-no-forward-execution-af",
32984
32984
  "file": "v2-terminal-event-once.test.ts",
32985
- "line": 109,
32985
+ "line": 111,
32986
32986
  "title": "work delivered twice still leaves one terminal event and no forward execution after it",
32987
32987
  "explicitId": "openwop.requirement.0194.terminal-once.duplicate-delivery",
32988
32988
  "citations": [
@@ -33221,7 +33221,7 @@
33221
33221
  {
33222
33222
  "id": "openwop.requirement.0215.no-head-of-line",
33223
33223
  "file": "v2-webhook-delivery-isolation.test.ts",
33224
- "line": 109,
33224
+ "line": 111,
33225
33225
  "title": null,
33226
33226
  "explicitId": "openwop.requirement.0215.no-head-of-line",
33227
33227
  "citations": [
@@ -33262,7 +33262,7 @@
33262
33262
  {
33263
33263
  "id": "openwop.it.v2-webhook-delivery-shape.a-major-2-subscriber-receives-the-v2-rendering-the-delivery-validates-and-run-st",
33264
33264
  "file": "v2-webhook-delivery-shape.test.ts",
33265
- "line": 217,
33265
+ "line": 219,
33266
33266
  "title": "a major-2 subscriber receives the v2 rendering: the delivery validates, and run.started.owner carries subject, never principal",
33267
33267
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
33268
33268
  "citations": [
@@ -33293,7 +33293,7 @@
33293
33293
  {
33294
33294
  "id": "openwop.it.v2-webhook-delivery-shape.a-major-1-subscriber-still-receives-the-v1-rendering-the-v1-wire-does-not-move-m",
33295
33295
  "file": "v2-webhook-delivery-shape.test.ts",
33296
- "line": 237,
33296
+ "line": 239,
33297
33297
  "title": "a major-1 subscriber still receives the v1 rendering — the v1 wire does not move mid-overlap",
33298
33298
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
33299
33299
  "citations": [
@@ -33311,7 +33311,7 @@
33311
33311
  {
33312
33312
  "id": "openwop.it.v2-webhook-delivery-shape.a-seeded-era-2-run-is-delivered-projected-too-the-fan-out-branch-a-fresh-run-can",
33313
33313
  "file": "v2-webhook-delivery-shape.test.ts",
33314
- "line": 261,
33314
+ "line": 263,
33315
33315
  "title": "a seeded era-2 run is delivered projected too — the fan-out branch a fresh run cannot reach (seam-gated)",
33316
33316
  "explicitId": "openwop.requirement.0171.webhook-delivery-shape",
33317
33317
  "citations": [
@@ -33329,7 +33329,7 @@
33329
33329
  {
33330
33330
  "id": "openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once",
33331
33331
  "file": "v2-webhook-durable-delivery.test.ts",
33332
- "line": 256,
33332
+ "line": 258,
33333
33333
  "title": "a failed attempt is retried and the event is delivered at least once",
33334
33334
  "explicitId": "openwop.requirement.0173.webhook-durable-delivery",
33335
33335
  "citations": [
@@ -33361,7 +33361,7 @@
33361
33361
  {
33362
33362
  "id": "openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped",
33363
33363
  "file": "v2-webhook-durable-delivery.test.ts",
33364
- "line": 358,
33364
+ "line": 360,
33365
33365
  "title": "an exhausted delivery is dead-lettered, never dropped",
33366
33366
  "explicitId": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
33367
33367
  "citations": [
@@ -33395,7 +33395,7 @@
33395
33395
  {
33396
33396
  "id": "openwop.it.v2-webhook-durable-delivery.the-dead-letter-read-is-served-and-its-records-carry-no-payload",
33397
33397
  "file": "v2-webhook-durable-delivery.test.ts",
33398
- "line": 452,
33398
+ "line": 454,
33399
33399
  "title": "the dead-letter read is served and its records carry no payload",
33400
33400
  "explicitId": "openwop.requirement.0188.dead-letter-read",
33401
33401
  "citations": [
@@ -33408,7 +33408,7 @@
33408
33408
  {
33409
33409
  "id": "openwop.it.v2-webhook-durable-delivery.a-dead-letter-record-carries-no-delivered-payload",
33410
33410
  "file": "v2-webhook-durable-delivery.test.ts",
33411
- "line": 473,
33411
+ "line": 475,
33412
33412
  "title": "a dead-letter record carries no delivered payload",
33413
33413
  "explicitId": "openwop.requirement.0188.dead-letter-content-free",
33414
33414
  "citations": [
@@ -33752,7 +33752,7 @@
33752
33752
  {
33753
33753
  "id": "openwop.it.v2-webhook-unregister-stops-delivery.no-attempt-for-an-unregistered-subscription-starts-after-the-204-while-its-contr",
33754
33754
  "file": "v2-webhook-unregister-stops-delivery.test.ts",
33755
- "line": 83,
33755
+ "line": 85,
33756
33756
  "title": "no attempt for an unregistered subscription starts after the 204, while its control keeps being retried",
33757
33757
  "explicitId": "openwop.requirement.0215.unregister-stops-delivery",
33758
33758
  "citations": [
@@ -34566,7 +34566,7 @@
34566
34566
  {
34567
34567
  "id": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
34568
34568
  "file": "webhook-signed-delivery.test.ts",
34569
- "line": 168,
34569
+ "line": 170,
34570
34570
  "title": "host POSTs run events to subscriber with valid X-openwop-Signature",
34571
34571
  "explicitId": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
34572
34572
  "citations": [
@@ -34617,7 +34617,7 @@
34617
34617
  {
34618
34618
  "id": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
34619
34619
  "file": "webhook-signed-delivery.test.ts",
34620
- "line": 423,
34620
+ "line": 425,
34621
34621
  "title": "control: with a tunnel wired, the host still refuses the loopback receiver",
34622
34622
  "explicitId": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
34623
34623
  "citations": [
@@ -3,7 +3,7 @@
3
3
  "counts": {
4
4
  "files": 561,
5
5
  "v1": 449,
6
- "v2": 121
6
+ "v2": 123
7
7
  },
8
8
  "majors": {
9
9
  "a2a-1-0-agent-card.test.ts": [
@@ -410,10 +410,12 @@
410
410
  1
411
411
  ],
412
412
  "context-budget-transcript-bound.test.ts": [
413
- 1
413
+ 1,
414
+ 2
414
415
  ],
415
416
  "context-summarization-replay.test.ts": [
416
- 1
417
+ 1,
418
+ 2
417
419
  ],
418
420
  "contract-provenance.test.ts": [
419
421
  1
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
3
3
  "package": "@openwop/spec-artifacts",
4
- "version": "2.40.3",
5
- "corpusTag": "v2.40.3",
4
+ "version": "2.41.0",
5
+ "corpusTag": "v2.41.0",
6
6
  "files": {
7
7
  "api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
8
8
  "api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
9
9
  "api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
10
10
  "api/openapi.yaml": "6366b5514be71098e9ea41fc81ff52bc39db1a547b353c0b344cc2a2bf5370aa",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "96b5b49ba8aab1595b547d568ece7c4fb9fae9d7bdde29aff7c39f20ef31b120",
13
- "api/v2/asyncapi.yaml": "cc4d94df8eb1e168f30f8c12279bc65cf34c948a5ed95cc062288728fc605618",
14
- "api/v2/openapi.yaml": "5029e637cd61c900b169cb3f79e61e48b3ee89a6c3c11f3262158bf2fa910125",
12
+ "api/seams-v2.yaml": "1309f1f087272e74b836b436fa08160a1009feb9c341b6d359332e875ee7475f",
13
+ "api/v2/asyncapi.yaml": "b34dcda44b69de1d9d41ede8c2c69cc0fdbb6cc3533588057dd3a71acc42da5a",
14
+ "api/v2/openapi.yaml": "12ccdda2cf32ec21392fe84366607e0c69c4e07ae960a9fda3fd407a5cd7be78",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -204,13 +204,13 @@
204
204
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
205
205
  "spec/v1/alias-detectors.json": "2401fcb1c18cdd688c018b3d716ae6bca85c5e356220ee2b793bd9d81872412d",
206
206
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
207
- "spec/v1/core-standard-manifest.json": "c8d01314ab747038fb9b3ef17552d336f61211591b4af07379e65f65a6e55454",
207
+ "spec/v1/core-standard-manifest.json": "a8008e40cb7e5e68ccd4fe6761e563354d34b5ab278722fab75bc7ed4bc40cae",
208
208
  "spec/v1/deprecations.json": "2d03f4729810280147ea08c630ea65434f2dc5370567d0aac41c3595f8337d40",
209
209
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
210
210
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
211
211
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
212
212
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
213
- "spec/v1/gaps.json": "41e5bbd50515eb08923a29a79dfeb41d045f2b28dec9b2af3473c18db148c7be",
213
+ "spec/v1/gaps.json": "392a3d7f4b869a67d5861fcd47bc7eca83b6805b95b6520a91d9beb91df51c52",
214
214
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
215
215
  "spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
216
216
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -294,9 +294,9 @@
294
294
  "spec/v2/path-manifest.json": "ae9b56d03a701061fd48ad0b73cb0373493f6a4547da92763b422295b5e19535",
295
295
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
296
296
  "spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
297
- "spec/v2/release.json": "4c84997343779f46a54f9c4caf3d02714abc563f618b25729ca4b52468a23d39",
297
+ "spec/v2/release.json": "6849e210dc510d008596f51718f01f8deb32c6f5f9c3114f6e2707e778f38dcc",
298
298
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
299
- "spec/v2/surface-baseline.json": "2f1da906609307ec885cb04c36d7e688cd3124933759c88dc9ae3fa0ee9ec88b"
299
+ "spec/v2/surface-baseline.json": "18c79a71b4b65cf8f9f8bf345d3828627bb17673b7279de276c1120d540a4746"
300
300
  },
301
- "corpusCommit": "5d3d440cac757fb2b6c08452f64785eaeda086d3"
301
+ "corpusCommit": "d0da968bd70f57f4844b58f1b2544029dc576efb"
302
302
  }