@openwop/openwop-conformance 2.40.2 → 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 +17 -0
- package/README.md +1 -1
- package/dist/lib/certification-bundle-verify.js +24 -2
- package/dist/spec-artifacts.lock.json +2 -2
- package/fixtures/conformance-context-budget-live.json +44 -0
- package/fixtures/conformance-context-budget-multiturn.json +1 -1
- package/fixtures.md +2 -1
- package/package.json +2 -2
- package/requirements.json +85 -56
- package/scenario-majors.json +5 -3
- package/schemas/CORPUS-STAMP.json +11 -11
- package/src/lib/certification-bundle-verify.ts +23 -1
- package/src/lib/context-budget.ts +198 -0
- package/src/lib/host-callback.ts +8 -0
- package/src/scenarios/certification-bundle-redaction.test.ts +30 -7
- package/src/scenarios/context-budget-transcript-bound.test.ts +85 -183
- package/src/scenarios/context-summarization-replay.test.ts +81 -81
- package/src/scenarios/v2-bound-id-kinds.test.ts +2 -0
- package/src/scenarios/v2-durability-recovery.test.ts +2 -0
- package/src/scenarios/v2-revocation-honored.test.ts +11 -4
- package/src/scenarios/v2-terminal-event-once.test.ts +2 -0
- package/src/scenarios/v2-webhook-delivery-isolation.test.ts +2 -0
- package/src/scenarios/v2-webhook-delivery-shape.test.ts +2 -0
- package/src/scenarios/v2-webhook-durable-delivery.test.ts +2 -0
- package/src/scenarios/v2-webhook-unregister-stops-delivery.test.ts +2 -0
- package/src/scenarios/webhook-signed-delivery.test.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
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
|
+
|
|
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
|
|
14
|
+
|
|
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.
|
|
16
|
+
- **RFC 0215 gap G1 closes in the contract peer.** `@openwop/spec-artifacts`' `spec/v1/gaps.json` records MyndHyve's measurement (openwop#1595), and `spec/v2/core/webhooks.md`'s `Stable` banner cites RFC 0215 now that it is `Accepted`. No scenario change.
|
|
17
|
+
- **A setting that names a secret is not scrubbed as one.** `evidenceSecretsFromEnv` sweeps every `OPENWOP_*` value whose NAME mentions a key/token/secret/password, and `scrubEvidence` then rewrites that value everywhere in the bundle. openwop-app's RFC 0201 setting `OPENWOP_WEBHOOK_SECRET_ROTATION_OVERLAP_S=60` was swept, the "60" inside `discovery.sha256` was rewritten, the bundle failed `^[0-9a-f]{64}$`, and its deploy certify refused to ship. Values guessed from names are now swept only when credential-shaped (at least 8 characters and not a bare integer); a credential the emitter hands over explicitly is scrubbed whatever its shape. Sabotage: without the floor the new redaction leg fails.
|
|
18
|
+
- **Version moved ahead of publication.** `@openwop/openwop-conformance` and its exact-pinned peer `@openwop/spec-artifacts` move to `2.40.3` because `2.40.2` is tagged. Not tagged, not published.
|
|
19
|
+
|
|
3
20
|
## [2.40.2] — 2026-09-26 — production bundles stop carrying harness-issuer blocked rows, and a colocated companion is marked
|
|
4
21
|
|
|
5
22
|
- **RFC 0216: `--as-colocated-companion`, and a companion witnesses only the harness-trust-anchor rows.** The flag marks a v3 bundle `host.deployment: "colocated-companion"`. It is refused without `--certify` and bundle version 3. `witnessDigest` takes the marker into the preimage when present (`{ rows, relaxations?, deployment }`), so a signed companion cannot shed it: `--verify` then refuses with `witness-digest`. New coherence scenario `v2-colocated-companion` (7 legs, one id each) drives `scripts/check-harness-trust-anchors.mjs` and `scripts/check-companion-pairing.mjs` on tmpdir fixtures signed by the suite's own `signBundleV3`. Five sabotages were each run red.
|
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.
|
|
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
|
```
|
|
@@ -267,6 +267,25 @@ export function scrubEvidence(value, secrets) {
|
|
|
267
267
|
* are excluded, and a caller may name values that MUST stay visible (`except`)
|
|
268
268
|
* regardless of which variable carried them.
|
|
269
269
|
*/
|
|
270
|
+
/**
|
|
271
|
+
* Whether an environment VALUE can be a credential at all (suite 2.40.3).
|
|
272
|
+
*
|
|
273
|
+
* The name filter above matches settings ABOUT secrets as well as secrets:
|
|
274
|
+
* openwop-app's `OPENWOP_WEBHOOK_SECRET_ROTATION_OVERLAP_S=60` (RFC 0201's
|
|
275
|
+
* rotation overlap) was swept in, and `scrubEvidence` then rewrote every "60"
|
|
276
|
+
* in the bundle — including the one inside `discovery.sha256`, which stopped
|
|
277
|
+
* matching `^[0-9a-f]{64}$` and failed the host's own deploy certify. A short
|
|
278
|
+
* value occurs by chance inside digests, counts and timestamps, so scrubbing it
|
|
279
|
+
* corrupts the evidence without protecting anything: no credential is a bare
|
|
280
|
+
* integer or under 8 characters (NIST SP 800-63B's floor for a memorized
|
|
281
|
+
* secret). The floor applies only to values GUESSED from variable names; a
|
|
282
|
+
* credential the emitter hands over explicitly (`extra`) is always scrubbed,
|
|
283
|
+
* whatever its shape.
|
|
284
|
+
*/
|
|
285
|
+
export function credentialShaped(v) {
|
|
286
|
+
const t = v.trim();
|
|
287
|
+
return t.length >= 8 && !/^\d+$/.test(t);
|
|
288
|
+
}
|
|
270
289
|
export function evidenceSecretsFromEnv(env, extra = [], except = []) {
|
|
271
290
|
const keep = new Set(except.filter((s) => s !== undefined && s.trim() !== ''));
|
|
272
291
|
const out = new Set();
|
|
@@ -277,8 +296,11 @@ export function evidenceSecretsFromEnv(env, extra = [], except = []) {
|
|
|
277
296
|
continue;
|
|
278
297
|
if (/_ID$/.test(k))
|
|
279
298
|
continue; // a key's identifier is published, not secret
|
|
280
|
-
if (v
|
|
281
|
-
|
|
299
|
+
if (v === undefined || v.trim() === '' || keep.has(v))
|
|
300
|
+
continue;
|
|
301
|
+
if (!credentialShaped(v))
|
|
302
|
+
continue; // a setting that names a secret, not a secret
|
|
303
|
+
out.add(v);
|
|
282
304
|
}
|
|
283
305
|
for (const s of extra)
|
|
284
306
|
if (s !== undefined && s.trim() !== '' && !keep.has(s))
|
|
@@ -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
|
|
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 —
|
|
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.
|
|
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.
|
|
59
|
+
"@openwop/spec-artifacts": "2.41.0"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/requirements.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"generatedFrom": "src/scenarios/*.test.ts",
|
|
4
4
|
"counts": {
|
|
5
5
|
"files": 636,
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
6
|
+
"tests": 2438,
|
|
7
|
+
"withStableId": 2438,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2332
|
|
10
10
|
},
|
|
11
11
|
"records": [
|
|
12
12
|
{
|
|
@@ -7170,9 +7170,38 @@
|
|
|
7170
7170
|
]
|
|
7171
7171
|
},
|
|
7172
7172
|
{
|
|
7173
|
-
"id": "openwop.it.certification-bundle-redaction.evidencesecretsfromenv-never-
|
|
7173
|
+
"id": "openwop.it.certification-bundle-redaction.evidencesecretsfromenv-never-treats-a-setting-about-a-secret-as-one-a-bare-integ",
|
|
7174
7174
|
"file": "certification-bundle-redaction.test.ts",
|
|
7175
7175
|
"line": 157,
|
|
7176
|
+
"title": "evidenceSecretsFromEnv never treats a setting ABOUT a secret as one: a bare integer or a value under 8 characters is not swept from the environment",
|
|
7177
|
+
"explicitId": "openwop.it.certification-bundle-redaction.setting-about-a-secret-not-swept",
|
|
7178
|
+
"citations": [
|
|
7179
|
+
{
|
|
7180
|
+
"section": "RFC 0148 §C",
|
|
7181
|
+
"requirement": "a bare-integer setting whose NAME mentions a secret (a rotation overlap, a TTL) MUST NOT be swept as a credential"
|
|
7182
|
+
},
|
|
7183
|
+
{
|
|
7184
|
+
"section": "RFC 0148 §C",
|
|
7185
|
+
"requirement": "a value under 8 characters is not credential-shaped and is not swept from the environment"
|
|
7186
|
+
},
|
|
7187
|
+
{
|
|
7188
|
+
"section": "RFC 0148 §C",
|
|
7189
|
+
"requirement": "a credential-shaped value is still swept"
|
|
7190
|
+
},
|
|
7191
|
+
{
|
|
7192
|
+
"section": "RFC 0148 §C",
|
|
7193
|
+
"requirement": "a credential the emitter hands over explicitly is scrubbed whatever its shape"
|
|
7194
|
+
},
|
|
7195
|
+
{
|
|
7196
|
+
"section": "RFC 0148 §C",
|
|
7197
|
+
"requirement": "scrubbing MUST NOT corrupt a digest the bundle carries"
|
|
7198
|
+
}
|
|
7199
|
+
]
|
|
7200
|
+
},
|
|
7201
|
+
{
|
|
7202
|
+
"id": "openwop.it.certification-bundle-redaction.evidencesecretsfromenv-never-scrubs-a-key-identifier-id-variables-are-excluded-a",
|
|
7203
|
+
"file": "certification-bundle-redaction.test.ts",
|
|
7204
|
+
"line": 180,
|
|
7176
7205
|
"title": "evidenceSecretsFromEnv never scrubs a key IDENTIFIER: *_ID variables are excluded and `except` values stay visible whichever variable carried them",
|
|
7177
7206
|
"explicitId": "openwop.it.certification-bundle-redaction.key-identifier-never-scrubbed",
|
|
7178
7207
|
"citations": [
|
|
@@ -7189,7 +7218,7 @@
|
|
|
7189
7218
|
{
|
|
7190
7219
|
"id": "openwop.it.certification-bundle-redaction.verifybundlev2-rejects-a-bundle-carrying-the-conformance-canary-anywhere-and-acc",
|
|
7191
7220
|
"file": "certification-bundle-redaction.test.ts",
|
|
7192
|
-
"line":
|
|
7221
|
+
"line": 200,
|
|
7193
7222
|
"title": "verifyBundleV2 REJECTS a bundle carrying the conformance canary anywhere, and accepts the scrubbed twin",
|
|
7194
7223
|
"explicitId": "openwop.it.certification-bundle-redaction.verifybundlev2-rejects-a-bundle-carrying-the-conformance-canary-anywhere-and-acc",
|
|
7195
7224
|
"citations": [
|
|
@@ -7202,7 +7231,7 @@
|
|
|
7202
7231
|
{
|
|
7203
7232
|
"id": "openwop.it.certification-bundle-redaction.the-canary-in-a-discovery-document-key-is-still-a-rejection-keys-are-evidence",
|
|
7204
7233
|
"file": "certification-bundle-redaction.test.ts",
|
|
7205
|
-
"line":
|
|
7234
|
+
"line": 215,
|
|
7206
7235
|
"title": "the canary in a discovery-document KEY is still a rejection (keys are evidence)",
|
|
7207
7236
|
"explicitId": "openwop.it.certification-bundle-redaction.the-canary-in-a-discovery-document-key-is-still-a-rejection-keys-are-evidence",
|
|
7208
7237
|
"citations": [
|
|
@@ -7215,7 +7244,7 @@
|
|
|
7215
7244
|
{
|
|
7216
7245
|
"id": "openwop.it.certification-bundle-redaction.the-target-configuration-digest-is-a-digest-the-api-key-is-not-a-substring-of-an",
|
|
7217
7246
|
"file": "certification-bundle-redaction.test.ts",
|
|
7218
|
-
"line":
|
|
7247
|
+
"line": 221,
|
|
7219
7248
|
"title": "the target-configuration digest is a digest: the API key is not a substring of any string in the document",
|
|
7220
7249
|
"explicitId": "openwop.it.certification-bundle-redaction.the-target-configuration-digest-is-a-digest-the-api-key-is-not-a-substring-of-an",
|
|
7221
7250
|
"citations": [
|
|
@@ -9150,7 +9179,7 @@
|
|
|
9150
9179
|
{
|
|
9151
9180
|
"id": "openwop.it.context-budget-transcript-bound.bounds-the-per-turn-transcript-to-transcripttokenbudget-with-an-internally-consi",
|
|
9152
9181
|
"file": "context-budget-transcript-bound.test.ts",
|
|
9153
|
-
"line":
|
|
9182
|
+
"line": 89,
|
|
9154
9183
|
"title": "bounds the per-turn transcript to transcriptTokenBudget with an internally-consistent, recent-tail accounting",
|
|
9155
9184
|
"explicitId": "openwop.it.context-budget-transcript-bound.bounds-the-per-turn-transcript-to-transcripttokenbudget-with-an-internally-consi",
|
|
9156
9185
|
"citations": [
|
|
@@ -9158,22 +9187,6 @@
|
|
|
9158
9187
|
"section": "RFC 0111",
|
|
9159
9188
|
"requirement": "tokenCounter MUST be advertised when transcriptTokenBudget is present (schema if/then)"
|
|
9160
9189
|
},
|
|
9161
|
-
{
|
|
9162
|
-
"section": "RFC 0111",
|
|
9163
|
-
"requirement": "POST /v1/runs MUST return a runId"
|
|
9164
|
-
},
|
|
9165
|
-
{
|
|
9166
|
-
"section": "host-sample-test-seams.md §14",
|
|
9167
|
-
"requirement": "the transcript-window seam MUST return 200 for a valid iteration"
|
|
9168
|
-
},
|
|
9169
|
-
{
|
|
9170
|
-
"section": "host-sample-test-seams.md §14",
|
|
9171
|
-
"requirement": "the seam MUST return { tokenCounter, tokenCount, eventIds, summarizedRanges }"
|
|
9172
|
-
},
|
|
9173
|
-
{
|
|
9174
|
-
"section": "host-sample-test-seams.md §14",
|
|
9175
|
-
"requirement": "a wired transcript-window seam MUST report at least one orchestrator iteration"
|
|
9176
|
-
},
|
|
9177
9190
|
{
|
|
9178
9191
|
"section": "RFC 0111",
|
|
9179
9192
|
"requirement": null,
|
|
@@ -9181,21 +9194,24 @@
|
|
|
9181
9194
|
},
|
|
9182
9195
|
{
|
|
9183
9196
|
"section": "RFC 0111",
|
|
9184
|
-
"requirement":
|
|
9185
|
-
"interpolated": true
|
|
9197
|
+
"requirement": "the create response MUST carry a runId"
|
|
9186
9198
|
},
|
|
9187
9199
|
{
|
|
9188
|
-
"section": "
|
|
9200
|
+
"section": "host-sample-test-seams.md §14",
|
|
9189
9201
|
"requirement": null,
|
|
9190
9202
|
"interpolated": true
|
|
9191
9203
|
},
|
|
9192
9204
|
{
|
|
9193
|
-
"section": "
|
|
9205
|
+
"section": "host-sample-test-seams.md §14",
|
|
9194
9206
|
"requirement": null,
|
|
9195
9207
|
"interpolated": true
|
|
9196
9208
|
},
|
|
9197
9209
|
{
|
|
9198
|
-
"section": "
|
|
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",
|
|
9199
9215
|
"requirement": null,
|
|
9200
9216
|
"interpolated": true
|
|
9201
9217
|
},
|
|
@@ -9209,13 +9225,18 @@
|
|
|
9209
9225
|
{
|
|
9210
9226
|
"id": "openwop.it.context-summarization-replay.replay-reuses-the-recorded-context-summarized-summaryref-never-re-summarizes",
|
|
9211
9227
|
"file": "context-summarization-replay.test.ts",
|
|
9212
|
-
"line":
|
|
9228
|
+
"line": 106,
|
|
9213
9229
|
"title": "replay reuses the recorded context.summarized summaryRef — never re-summarizes",
|
|
9214
9230
|
"explicitId": "openwop.it.context-summarization-replay.replay-reuses-the-recorded-context-summarized-summaryref-never-re-summarizes",
|
|
9215
9231
|
"citations": [
|
|
9216
9232
|
{
|
|
9217
|
-
"section": "
|
|
9218
|
-
"requirement":
|
|
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"
|
|
9219
9240
|
},
|
|
9220
9241
|
{
|
|
9221
9242
|
"section": "rest-endpoints.md POST /v1/runs/{runId}:fork",
|
|
@@ -9228,6 +9249,14 @@
|
|
|
9228
9249
|
{
|
|
9229
9250
|
"section": "RFC 0111 §\"Replay determinism\"",
|
|
9230
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"
|
|
9231
9260
|
}
|
|
9232
9261
|
]
|
|
9233
9262
|
},
|
|
@@ -27657,7 +27686,7 @@
|
|
|
27657
27686
|
{
|
|
27658
27687
|
"id": "openwop.it.v2-bound-id-kinds.subscriptionid-post-webhooks-mints-a-bound-webhookid-the-projected-segment-is-ac",
|
|
27659
27688
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27660
|
-
"line":
|
|
27689
|
+
"line": 91,
|
|
27661
27690
|
"title": "subscriptionId: POST /webhooks mints a bound webhookId, the projected segment is accepted, and a foreign tenant segment is refused 403",
|
|
27662
27691
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.webhook",
|
|
27663
27692
|
"citations": [
|
|
@@ -27684,7 +27713,7 @@
|
|
|
27684
27713
|
{
|
|
27685
27714
|
"id": "openwop.it.v2-bound-id-kinds.subscriptionid-the-webhookid-a-host-emits-on-a-delivery-is-the-one-it-minted",
|
|
27686
27715
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27687
|
-
"line":
|
|
27716
|
+
"line": 142,
|
|
27688
27717
|
"title": "subscriptionId: the webhookId a host EMITS on a delivery is the one it minted",
|
|
27689
27718
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.webhook-emitted",
|
|
27690
27719
|
"citations": [
|
|
@@ -27703,7 +27732,7 @@
|
|
|
27703
27732
|
{
|
|
27704
27733
|
"id": "openwop.it.v2-bound-id-kinds.interruptid-the-id-a-suspension-puts-on-the-wire-is-bound",
|
|
27705
27734
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27706
|
-
"line":
|
|
27735
|
+
"line": 194,
|
|
27707
27736
|
"title": "interruptId: the id a suspension puts on the wire is bound",
|
|
27708
27737
|
"explicitId": null,
|
|
27709
27738
|
"citations": []
|
|
@@ -27711,7 +27740,7 @@
|
|
|
27711
27740
|
{
|
|
27712
27741
|
"id": "openwop.it.v2-bound-id-kinds.effectid-every-row-get-runs-runid-effects-serves-is-bound",
|
|
27713
27742
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27714
|
-
"line":
|
|
27743
|
+
"line": 215,
|
|
27715
27744
|
"title": "effectId: every row GET /runs/{runId}/effects serves is bound",
|
|
27716
27745
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
|
|
27717
27746
|
"citations": [
|
|
@@ -27724,7 +27753,7 @@
|
|
|
27724
27753
|
{
|
|
27725
27754
|
"id": "openwop.it.v2-bound-id-kinds.deliveryid-every-record-in-the-dead-letter-read-carries-a-bound-id-in-the-caller",
|
|
27726
27755
|
"file": "v2-bound-id-kinds.test.ts",
|
|
27727
|
-
"line":
|
|
27756
|
+
"line": 230,
|
|
27728
27757
|
"title": "deliveryId: every record in the dead-letter read carries a bound id in the caller's tenant",
|
|
27729
27758
|
"explicitId": "openwop.requirement.0187.bound-id-kinds.per-kind",
|
|
27730
27759
|
"citations": [
|
|
@@ -28647,7 +28676,7 @@
|
|
|
28647
28676
|
{
|
|
28648
28677
|
"id": "openwop.it.v2-durability-recovery.accepted-work-survives-a-kill-before-dispatch-and-dispatches-on-resume",
|
|
28649
28678
|
"file": "v2-durability-recovery.test.ts",
|
|
28650
|
-
"line":
|
|
28679
|
+
"line": 282,
|
|
28651
28680
|
"title": "accepted work survives a kill before dispatch and dispatches on resume",
|
|
28652
28681
|
"explicitId": "openwop.requirement.0158.kill-after-accept",
|
|
28653
28682
|
"citations": [
|
|
@@ -28661,7 +28690,7 @@
|
|
|
28661
28690
|
{
|
|
28662
28691
|
"id": "openwop.it.v2-durability-recovery.work-executing-at-a-real-process-death-is-never-reported-complete-and-resumes",
|
|
28663
28692
|
"file": "v2-durability-recovery.test.ts",
|
|
28664
|
-
"line":
|
|
28693
|
+
"line": 336,
|
|
28665
28694
|
"title": "work executing at a real process death is never reported complete, and resumes",
|
|
28666
28695
|
"explicitId": "openwop.requirement.0158.kill-during-execution",
|
|
28667
28696
|
"citations": [
|
|
@@ -28680,7 +28709,7 @@
|
|
|
28680
28709
|
{
|
|
28681
28710
|
"id": "openwop.it.v2-durability-recovery.the-same-accepted-work-delivered-twice-fires-each-effect-exactly-once",
|
|
28682
28711
|
"file": "v2-durability-recovery.test.ts",
|
|
28683
|
-
"line":
|
|
28712
|
+
"line": 392,
|
|
28684
28713
|
"title": "the same accepted work delivered twice fires each effect exactly once",
|
|
28685
28714
|
"explicitId": "openwop.requirement.0158.duplicate-delivery",
|
|
28686
28715
|
"citations": [
|
|
@@ -28699,7 +28728,7 @@
|
|
|
28699
28728
|
{
|
|
28700
28729
|
"id": "openwop.it.v2-durability-recovery.the-declared-recovery-bound-is-derived-from-the-mechanism-that-enforces-it",
|
|
28701
28730
|
"file": "v2-durability-recovery.test.ts",
|
|
28702
|
-
"line":
|
|
28731
|
+
"line": 526,
|
|
28703
28732
|
"title": "the declared recovery bound is derived from the mechanism that enforces it",
|
|
28704
28733
|
"explicitId": "openwop.requirement.0158.bound-is-derived",
|
|
28705
28734
|
"citations": [
|
|
@@ -28713,7 +28742,7 @@
|
|
|
28713
28742
|
{
|
|
28714
28743
|
"id": "openwop.it.v2-durability-recovery.deterministically-failing-work-reaches-a-terminal-state-and-stops-being-retried",
|
|
28715
28744
|
"file": "v2-durability-recovery.test.ts",
|
|
28716
|
-
"line":
|
|
28745
|
+
"line": 557,
|
|
28717
28746
|
"title": "deterministically failing work reaches a terminal state and stops being retried",
|
|
28718
28747
|
"explicitId": "openwop.requirement.0158.poison-exhaustion",
|
|
28719
28748
|
"citations": [
|
|
@@ -32080,7 +32109,7 @@
|
|
|
32080
32109
|
{
|
|
32081
32110
|
"id": "openwop.it.v2-revocation-honored.a-revoked-next-request-credential-is-refused-on-the-next-request-with-credential",
|
|
32082
32111
|
"file": "v2-revocation-honored.test.ts",
|
|
32083
|
-
"line":
|
|
32112
|
+
"line": 40,
|
|
32084
32113
|
"title": "a revoked next-request credential is refused on the next request with credential_revoked",
|
|
32085
32114
|
"explicitId": "openwop.requirement.0170.revocation-honored",
|
|
32086
32115
|
"citations": [
|
|
@@ -32935,7 +32964,7 @@
|
|
|
32935
32964
|
{
|
|
32936
32965
|
"id": "openwop.it.v2-terminal-event-once.every-run-observed-to-a-terminal-state-has-exactly-one-terminal-event-and-no-for",
|
|
32937
32966
|
"file": "v2-terminal-event-once.test.ts",
|
|
32938
|
-
"line":
|
|
32967
|
+
"line": 83,
|
|
32939
32968
|
"title": "every run observed to a terminal state has exactly one terminal event and no forward execution after it",
|
|
32940
32969
|
"explicitId": "openwop.requirement.0194.terminal-once",
|
|
32941
32970
|
"citations": [
|
|
@@ -32953,7 +32982,7 @@
|
|
|
32953
32982
|
{
|
|
32954
32983
|
"id": "openwop.it.v2-terminal-event-once.work-delivered-twice-still-leaves-one-terminal-event-and-no-forward-execution-af",
|
|
32955
32984
|
"file": "v2-terminal-event-once.test.ts",
|
|
32956
|
-
"line":
|
|
32985
|
+
"line": 111,
|
|
32957
32986
|
"title": "work delivered twice still leaves one terminal event and no forward execution after it",
|
|
32958
32987
|
"explicitId": "openwop.requirement.0194.terminal-once.duplicate-delivery",
|
|
32959
32988
|
"citations": [
|
|
@@ -33192,7 +33221,7 @@
|
|
|
33192
33221
|
{
|
|
33193
33222
|
"id": "openwop.requirement.0215.no-head-of-line",
|
|
33194
33223
|
"file": "v2-webhook-delivery-isolation.test.ts",
|
|
33195
|
-
"line":
|
|
33224
|
+
"line": 111,
|
|
33196
33225
|
"title": null,
|
|
33197
33226
|
"explicitId": "openwop.requirement.0215.no-head-of-line",
|
|
33198
33227
|
"citations": [
|
|
@@ -33233,7 +33262,7 @@
|
|
|
33233
33262
|
{
|
|
33234
33263
|
"id": "openwop.it.v2-webhook-delivery-shape.a-major-2-subscriber-receives-the-v2-rendering-the-delivery-validates-and-run-st",
|
|
33235
33264
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
33236
|
-
"line":
|
|
33265
|
+
"line": 219,
|
|
33237
33266
|
"title": "a major-2 subscriber receives the v2 rendering: the delivery validates, and run.started.owner carries subject, never principal",
|
|
33238
33267
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
33239
33268
|
"citations": [
|
|
@@ -33264,7 +33293,7 @@
|
|
|
33264
33293
|
{
|
|
33265
33294
|
"id": "openwop.it.v2-webhook-delivery-shape.a-major-1-subscriber-still-receives-the-v1-rendering-the-v1-wire-does-not-move-m",
|
|
33266
33295
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
33267
|
-
"line":
|
|
33296
|
+
"line": 239,
|
|
33268
33297
|
"title": "a major-1 subscriber still receives the v1 rendering — the v1 wire does not move mid-overlap",
|
|
33269
33298
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
33270
33299
|
"citations": [
|
|
@@ -33282,7 +33311,7 @@
|
|
|
33282
33311
|
{
|
|
33283
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",
|
|
33284
33313
|
"file": "v2-webhook-delivery-shape.test.ts",
|
|
33285
|
-
"line":
|
|
33314
|
+
"line": 263,
|
|
33286
33315
|
"title": "a seeded era-2 run is delivered projected too — the fan-out branch a fresh run cannot reach (seam-gated)",
|
|
33287
33316
|
"explicitId": "openwop.requirement.0171.webhook-delivery-shape",
|
|
33288
33317
|
"citations": [
|
|
@@ -33300,7 +33329,7 @@
|
|
|
33300
33329
|
{
|
|
33301
33330
|
"id": "openwop.it.v2-webhook-durable-delivery.a-failed-attempt-is-retried-and-the-event-is-delivered-at-least-once",
|
|
33302
33331
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33303
|
-
"line":
|
|
33332
|
+
"line": 258,
|
|
33304
33333
|
"title": "a failed attempt is retried and the event is delivered at least once",
|
|
33305
33334
|
"explicitId": "openwop.requirement.0173.webhook-durable-delivery",
|
|
33306
33335
|
"citations": [
|
|
@@ -33332,7 +33361,7 @@
|
|
|
33332
33361
|
{
|
|
33333
33362
|
"id": "openwop.it.v2-webhook-durable-delivery.an-exhausted-delivery-is-dead-lettered-never-dropped",
|
|
33334
33363
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33335
|
-
"line":
|
|
33364
|
+
"line": 360,
|
|
33336
33365
|
"title": "an exhausted delivery is dead-lettered, never dropped",
|
|
33337
33366
|
"explicitId": "openwop.requirement.0173.webhook-durable-delivery.dead-letter",
|
|
33338
33367
|
"citations": [
|
|
@@ -33366,7 +33395,7 @@
|
|
|
33366
33395
|
{
|
|
33367
33396
|
"id": "openwop.it.v2-webhook-durable-delivery.the-dead-letter-read-is-served-and-its-records-carry-no-payload",
|
|
33368
33397
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33369
|
-
"line":
|
|
33398
|
+
"line": 454,
|
|
33370
33399
|
"title": "the dead-letter read is served and its records carry no payload",
|
|
33371
33400
|
"explicitId": "openwop.requirement.0188.dead-letter-read",
|
|
33372
33401
|
"citations": [
|
|
@@ -33379,7 +33408,7 @@
|
|
|
33379
33408
|
{
|
|
33380
33409
|
"id": "openwop.it.v2-webhook-durable-delivery.a-dead-letter-record-carries-no-delivered-payload",
|
|
33381
33410
|
"file": "v2-webhook-durable-delivery.test.ts",
|
|
33382
|
-
"line":
|
|
33411
|
+
"line": 475,
|
|
33383
33412
|
"title": "a dead-letter record carries no delivered payload",
|
|
33384
33413
|
"explicitId": "openwop.requirement.0188.dead-letter-content-free",
|
|
33385
33414
|
"citations": [
|
|
@@ -33723,7 +33752,7 @@
|
|
|
33723
33752
|
{
|
|
33724
33753
|
"id": "openwop.it.v2-webhook-unregister-stops-delivery.no-attempt-for-an-unregistered-subscription-starts-after-the-204-while-its-contr",
|
|
33725
33754
|
"file": "v2-webhook-unregister-stops-delivery.test.ts",
|
|
33726
|
-
"line":
|
|
33755
|
+
"line": 85,
|
|
33727
33756
|
"title": "no attempt for an unregistered subscription starts after the 204, while its control keeps being retried",
|
|
33728
33757
|
"explicitId": "openwop.requirement.0215.unregister-stops-delivery",
|
|
33729
33758
|
"citations": [
|
|
@@ -34537,7 +34566,7 @@
|
|
|
34537
34566
|
{
|
|
34538
34567
|
"id": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
|
|
34539
34568
|
"file": "webhook-signed-delivery.test.ts",
|
|
34540
|
-
"line":
|
|
34569
|
+
"line": 170,
|
|
34541
34570
|
"title": "host POSTs run events to subscriber with valid X-openwop-Signature",
|
|
34542
34571
|
"explicitId": "openwop.it.webhook-signed-delivery.host-posts-run-events-to-subscriber-with-valid-x-openwop-signature",
|
|
34543
34572
|
"citations": [
|
|
@@ -34588,7 +34617,7 @@
|
|
|
34588
34617
|
{
|
|
34589
34618
|
"id": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
|
|
34590
34619
|
"file": "webhook-signed-delivery.test.ts",
|
|
34591
|
-
"line":
|
|
34620
|
+
"line": 425,
|
|
34592
34621
|
"title": "control: with a tunnel wired, the host still refuses the loopback receiver",
|
|
34593
34622
|
"explicitId": "openwop.it.webhook-signed-delivery.control-with-a-tunnel-wired-the-host-still-refuses-the-loopback-receiver",
|
|
34594
34623
|
"citations": [
|
package/scenario-majors.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"counts": {
|
|
4
4
|
"files": 561,
|
|
5
5
|
"v1": 449,
|
|
6
|
-
"v2":
|
|
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
|