@openwop/openwop-conformance 2.42.2 → 2.42.4
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 +46 -0
- package/README.md +1 -1
- package/dist/spec-artifacts.lock.json +2 -2
- package/package.json +2 -2
- package/requirements.json +353 -133
- package/schemas/CORPUS-STAMP.json +10 -10
- package/src/lib/agentOrgChart.ts +21 -4
- package/src/lib/effect-receiver.ts +23 -2
- package/src/lib/toolCatalog.ts +29 -5
- package/src/scenarios/agent-manifest-runtime.test.ts +17 -4
- package/src/scenarios/agent-org-chart-scoping.test.ts +27 -4
- package/src/scenarios/agent-roster-attribution.test.ts +28 -4
- package/src/scenarios/agentPackExport.test.ts +33 -0
- package/src/scenarios/agentPackInstall.test.ts +32 -0
- package/src/scenarios/agentReasoningEvents.test.ts +22 -13
- package/src/scenarios/agents-run-tool-allowlist.test.ts +6 -2
- package/src/scenarios/ai-envelope-shape.test.ts +9 -8
- package/src/scenarios/anonymous-actor-write-gated.test.ts +12 -6
- package/src/scenarios/audit-log-integrity.test.ts +37 -0
- package/src/scenarios/context-budget-transcript-bound.test.ts +14 -4
- package/src/scenarios/context-summarization-replay.test.ts +17 -8
- package/src/scenarios/conversationLifecycle.test.ts +12 -1
- package/src/scenarios/conversationReplayDeterminism.test.ts +19 -3
- package/src/scenarios/cost-attribution.test.ts +12 -0
- package/src/scenarios/debug-bundle-truncation.test.ts +16 -3
- package/src/scenarios/distillation-shape.test.ts +30 -0
- package/src/scenarios/envelope-truncated.test.ts +6 -2
- package/src/scenarios/feedback-fork-not-copied.test.ts +28 -7
- package/src/scenarios/idempotency-concurrent-claim.test.ts +27 -9
- package/src/scenarios/idempotency-key-determinism.test.ts +6 -2
- package/src/scenarios/inbound-credential-no-passthrough.test.ts +13 -2
- package/src/scenarios/mcp-server-untrusted-args.test.ts +20 -5
- package/src/scenarios/mcp-tool-roundtrip.test.ts +7 -21
- package/src/scenarios/memory-compaction-provenance-tag.test.ts +11 -3
- package/src/scenarios/orchestratorDispatch.test.ts +18 -2
- package/src/scenarios/pack-registry.test.ts +8 -1
- package/src/scenarios/production-backpressure.test.ts +17 -11
- package/src/scenarios/redaction.test.ts +8 -2
- package/src/scenarios/replay-fanout-suppression.test.ts +18 -2
- package/src/scenarios/runner-ledger.test.ts +7 -2
- package/src/scenarios/stream-modes.test.ts +27 -0
- package/src/scenarios/tool-catalog-projection.test.ts +35 -12
- package/src/scenarios/v2-advertised-fixtures-exist.test.ts +17 -3
- package/src/scenarios/v2-artifact-a2a-shape.test.ts +8 -2
- package/src/scenarios/v2-bound-id-kinds.test.ts +13 -4
- package/src/scenarios/v2-effect-identity-business-key.test.ts +71 -13
- package/src/scenarios/v2-effect-seam-manifest.test.ts +3 -9
- package/src/scenarios/v2-era-2-append-vocabulary.test.ts +52 -9
- package/src/scenarios/v2-idempotency-in-flight.test.ts +16 -0
- package/src/scenarios/v2-interop-trace-context.test.ts +23 -0
- package/src/scenarios/v2-mcp-tasks.test.ts +33 -6
- package/src/scenarios/v2-min-client-version.test.ts +11 -1
- package/src/scenarios/v2-mrtr-rounds-ceiling.test.ts +11 -0
- package/src/scenarios/v2-poll-cursor-v2.test.ts +28 -5
- package/src/scenarios/v2-profiles-derived-only.test.ts +9 -2
- package/src/scenarios/v2-run-diff-identical.test.ts +13 -5
- package/src/scenarios/v2-run-pause-resume.test.ts +4 -1
- package/src/scenarios/v2-sse-last-event-id.test.ts +7 -0
- package/src/scenarios/v2-version-header-honored.test.ts +22 -3
- package/src/scenarios/v2-webhook-delivery-isolation.test.ts +28 -8
- package/src/scenarios/v2-webhook-durable-delivery.test.ts +24 -0
- package/src/scenarios/v2-webhook-endpoint-verification.test.ts +25 -6
- package/src/scenarios/v2-webhook-message-id-stable.test.ts +10 -2
- package/src/scenarios/v2-webhook-unregister-stops-delivery.test.ts +6 -1
- package/src/scenarios/version-negotiation.test.ts +12 -1
- package/src/scenarios/webhook-signed-delivery.test.ts +18 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# `@openwop/openwop-conformance` Changelog
|
|
2
2
|
|
|
3
|
+
## [2.42.4] — 2026-09-27 — unfailable-leg audit wave 2, an on-the-wire Idempotency-Key witness, and a gate so the class stops growing
|
|
4
|
+
|
|
5
|
+
- **Wave 2 of the unfailable-leg audit.** `scripts/audit-unfailable-legs.mjs --all` widened the scan from Accepted-RFC ids to every leg, and added a sixth shape: *asserts, then soft-skips*. At major 2 an `inapplicable` or `skipped` note after an assertion records `executed-pass` with a `partial-witness:` detail; at major 1 a `blocked` note does too. Certification counts both.
|
|
6
|
+
- **Reviewed:** 111 new candidates in four parallel reviews: 38 confirmed, 18 plausible. Most are fixed; each fix names the non-conforming host it now catches.
|
|
7
|
+
- **Fixes that only make a leg check what its title already promised:** exact error codes, required schema members, sequence order, per-type (not per-count) supersets, positive controls.
|
|
8
|
+
- **Changed dispositions:** where a leg asserted setup and then never observed its requirement, it now calls `blockedDespiteAssertions`.
|
|
9
|
+
- **Guard against over-correction:** a `blocked` row denies the whole bundle, so every new `blocked` was checked against the committed certified bundles. None of them locks out a conforming host. Three changes were reverted to the honest form:
|
|
10
|
+
- the dead-letter sink half without the optional `deadLetter` read is an annotated partial witness (RFC 0188 §A.5);
|
|
11
|
+
- backpressure without an advertised `inflightCap` is `inapplicable` before any assertion;
|
|
12
|
+
- a SHOULD-level `traceId` and an optional `settings` echo are left untouched.
|
|
13
|
+
- **Left as they are, with reasons:** fixes that need a per-attempt budget seam, a fixture change, or a spec decision (the audit-verify checkpoint signature preimage is stated two different ways).
|
|
14
|
+
- **The RFC 0173 retry leg counts the key on the wire.** `lib/effect-receiver.ts` gains a fail-first mode: it cuts the first attempt's connection, a genuine transport failure, after recording its `Idempotency-Key`. `v2-effect-identity-business-key`'s retry leg now requires the provider to see one key across attempts, equal to the ledger's. The seam contract always said "the suite fixture provider records the idempotency key of each attempt"; until now the leg sent the host to an address nothing listened on. Checked on the v2 reference host, which passes. Sabotaged with a fresh key per attempt behind a constant ledger key: it fails with "2 attempt(s) on the wire carried 2 distinct key(s)".
|
|
15
|
+
- **New gate `scripts/check-softskip-after-assert.mjs`** in `openwop:check`.
|
|
16
|
+
- A soft-skip after an assertion must be `blockedDespiteAssertions` or carry a `// partial-witness-ok: <why the requirement was already observed>` reason.
|
|
17
|
+
- Existing sites are a per-file baseline (`conformance/softskip-after-assert.baseline.json`). The baseline is unreviewed debt, not approval, and `--write` refuses to raise it without `--allow-raise`.
|
|
18
|
+
- **Version moved ahead of publication.** `@openwop/openwop-conformance` and its exact-pinned peer `@openwop/spec-artifacts` move to `2.42.4` because `2.42.3` is tagged. Not tagged, not published.
|
|
19
|
+
|
|
20
|
+
## [2.42.3] — 2026-09-27 — the unfailable-leg audit: 19 legs a non-conforming host could pass now measure their requirement
|
|
21
|
+
|
|
22
|
+
- **The unfailable-leg audit: 19 legs that a non-conforming host could pass now measure their requirement.** A scanner (`scripts/audit-unfailable-legs.mjs`, an audit aid, not a gate) flagged 66 legs that witness an Accepted RFC's Falsifiability row and have a shape this corpus has shipped as a defect before: satisfiable bounds (the 1 ≤ 1 no-refire leg), loops over a possibly empty list, `if`-guarded assertions, always-defined checks, and the host's own ledger as the only witness. A reviewer judged each one against a single bar: would a host that breaks the rule record `executed-pass`?
|
|
23
|
+
- **Confirmed and fixed (12):**
|
|
24
|
+
- `0173.effect-identity-business-key`: a no-op run's empty ledger passed on setup asserts.
|
|
25
|
+
- `.retry`: an omitted `providerKey` folded to `''`, so "one distinct key" passed.
|
|
26
|
+
- `0205.artifact-url-part-scoped`: a 3xx to a public pre-signed URL passed.
|
|
27
|
+
- `0176.era-2-append-vocabulary`: cancel appends names that are the same in v1 and v2, so the writer rule was never tested. It now records `blocked` unless a renamed type is appended. Its `era` leg now requires `eventLogSchemaVersion`.
|
|
28
|
+
- `0171.poll-cursor-v2.shape`: `lastSequence` must equal the log's highest sequence, and `status`/`isTerminal` must say terminal.
|
|
29
|
+
- `0173.webhook-durable-delivery`: exponential backoff must actually grow, second gap ≥ 1.5× the first.
|
|
30
|
+
- `0175.mrtr-rounds-ceiling.refused`: the refusal must come at the ceiling, not before it.
|
|
31
|
+
- `0215.no-head-of-line`: a serial dispatcher with a short timeout passed as a partial witness. It now fails below the concurrency floor and is otherwise `blocked`.
|
|
32
|
+
- `0187.bound-id-kinds.per-kind`, effectId/deliveryId: no-op runs record `inapplicable` before any assertion.
|
|
33
|
+
- `0173.effect-seam-manifest`: removed a loop that could not fail.
|
|
34
|
+
- RFC 0173 cites `effect-seam-no-refire` for replay suppression.
|
|
35
|
+
- RFC 0186 says its row is a schema-validation witness.
|
|
36
|
+
- **Plausible, tightened (7):**
|
|
37
|
+
- `0201.message-id-stable`: all four delivery keys are required, otherwise `blocked`.
|
|
38
|
+
- `0169.profiles-derived-only`: records need `status`, `since` and `witness`; a tautology is removed.
|
|
39
|
+
- `0200.inbound-credential-no-passthrough`: waits for THIS run's delivery.
|
|
40
|
+
- `0168.advertised-fixtures-exist`: samples across the whole list.
|
|
41
|
+
- `0198.task-update-approver-checked`: polls about 3 s rather than one 750 ms read.
|
|
42
|
+
- `0201.endpoint-verification`: a late echo control and a scaled grace; a missing control is `blocked`.
|
|
43
|
+
- `0207.a2a-malformed-ignored`: the task must not fail or be rejected.
|
|
44
|
+
- **Not defects:** 47 of the 66 flags; each reviewer recorded its reason.
|
|
45
|
+
- **Measured against the v2 reference host** (loopback regression lane) before merge.
|
|
46
|
+
- **RFC 0217 gap G1 closes in the contract peer.** `spec/v1/gaps.json` records MyndHyve's certified production witness of `0217.dead-letter-read-after-unregister` (openwop#1631). No scenario change.
|
|
47
|
+
- **Version moved ahead of publication.** `@openwop/openwop-conformance` and its exact-pinned peer `@openwop/spec-artifacts` move to `2.42.3` because `2.42.2` is tagged. Not tagged, not published.
|
|
48
|
+
|
|
3
49
|
## [2.42.2] — 2026-09-26 — four conformance legs now measure what their spec says: effect re-fire, keying fallback, A2UI JSON values, digest-safe scrubbing
|
|
4
50
|
|
|
5
51
|
- **`0173.effect-seam-no-refire` can detect a re-fire.** The leg asserted that the replay fork's ledger count was at most the parent's. The seam fires one attempt on the source run, so a host that re-fires on replay read 1 ≤ 1 and passed, over exactly the defect the leg exists for. ws3 measured it: openwop-app with `sideEffecting` dropped still passed. The leg now fails if the fork records any attempt the parent never made, using the new `lib/effect-refire.ts`. An inherited row repeats a parent attempt's `(nodeId, attempt, at)`, while a re-fire is a new attempt, and one parent row covers at most one fork row. A host whose fork projection is empty passes, as does one that projects the parent's attempts as history. The `effect-ledger-projection` schema description, which said the scenario "compares row COUNTS", is corrected. New suite self-test `src/lib/effect-refire.test.ts` uses a re-firing host stub as its first leg. It is sabotage-proved: with the old count rule restored, that leg fails.
|
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.42.
|
|
14
|
+
npm install --legacy-peer-deps @openwop/openwop-conformance@2.42.4 @openwop/spec-artifacts@2.42.4
|
|
15
15
|
# or run without install:
|
|
16
16
|
npx @openwop/openwop-conformance --base-url https://api.example.com --api-key hk_test_...
|
|
17
17
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "2.42.
|
|
3
|
+
"version": "2.42.4",
|
|
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.42.
|
|
59
|
+
"@openwop/spec-artifacts": "2.42.4"
|
|
60
60
|
}
|
|
61
61
|
}
|