@moltzap/protocol 2026.503.2 → 2026.503.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/dist/test-fixtures/seed-data.d.ts.map +1 -1
- package/dist/test-fixtures/seed-data.js +52 -21
- package/dist/test-fixtures/seed-data.js.map +1 -1
- package/dist/testing/agent-registration.d.ts.map +1 -1
- package/dist/testing/agent-registration.js +48 -39
- package/dist/testing/agent-registration.js.map +1 -1
- package/dist/testing/arbitraries/frames.d.ts.map +1 -1
- package/dist/testing/arbitraries/frames.js +2 -1
- package/dist/testing/arbitraries/frames.js.map +1 -1
- package/dist/testing/arbitraries/from-typebox.d.ts.map +1 -1
- package/dist/testing/arbitraries/from-typebox.js +19 -10
- package/dist/testing/arbitraries/from-typebox.js.map +1 -1
- package/dist/testing/arbitraries/rpc.d.ts.map +1 -1
- package/dist/testing/arbitraries/rpc.js +12 -3
- package/dist/testing/arbitraries/rpc.js.map +1 -1
- package/dist/testing/captures.d.ts.map +1 -1
- package/dist/testing/captures.js +4 -3
- package/dist/testing/captures.js.map +1 -1
- package/dist/testing/codec.d.ts.map +1 -1
- package/dist/testing/codec.js +13 -5
- package/dist/testing/codec.js.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.d.ts.map +1 -1
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js +7 -4
- package/dist/testing/conformance/__divergence_proofs__/executable-proof-helpers.js.map +1 -1
- package/dist/testing/conformance/_helpers.d.ts +6 -1
- package/dist/testing/conformance/_helpers.d.ts.map +1 -1
- package/dist/testing/conformance/_helpers.js +24 -0
- package/dist/testing/conformance/_helpers.js.map +1 -1
- package/dist/testing/conformance/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/adversity.js +76 -66
- package/dist/testing/conformance/adversity.js.map +1 -1
- package/dist/testing/conformance/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/boundary.js +49 -39
- package/dist/testing/conformance/boundary.js.map +1 -1
- package/dist/testing/conformance/client/adversity.d.ts.map +1 -1
- package/dist/testing/conformance/client/adversity.js +20 -15
- package/dist/testing/conformance/client/adversity.js.map +1 -1
- package/dist/testing/conformance/client/boundary.d.ts.map +1 -1
- package/dist/testing/conformance/client/boundary.js +7 -5
- package/dist/testing/conformance/client/boundary.js.map +1 -1
- package/dist/testing/conformance/client/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/client/delivery.js +26 -20
- package/dist/testing/conformance/client/delivery.js.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/client/rpc-semantics.js +18 -15
- package/dist/testing/conformance/client/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/client/runner.d.ts +13 -8
- package/dist/testing/conformance/client/runner.d.ts.map +1 -1
- package/dist/testing/conformance/client/runner.js +17 -24
- package/dist/testing/conformance/client/runner.js.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/client/schema-conformance.js +11 -9
- package/dist/testing/conformance/client/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/client/suite.d.ts.map +1 -1
- package/dist/testing/conformance/client/suite.js +2 -1
- package/dist/testing/conformance/client/suite.js.map +1 -1
- package/dist/testing/conformance/delivery.d.ts.map +1 -1
- package/dist/testing/conformance/delivery.js +98 -124
- package/dist/testing/conformance/delivery.js.map +1 -1
- package/dist/testing/conformance/env.d.ts +9 -0
- package/dist/testing/conformance/env.d.ts.map +1 -1
- package/dist/testing/conformance/env.js +16 -3
- package/dist/testing/conformance/env.js.map +1 -1
- package/dist/testing/conformance/presence.d.ts.map +1 -1
- package/dist/testing/conformance/presence.js +4 -2
- package/dist/testing/conformance/presence.js.map +1 -1
- package/dist/testing/conformance/registry.d.ts +1 -1
- package/dist/testing/conformance/registry.d.ts.map +1 -1
- package/dist/testing/conformance/registry.js +1 -1
- package/dist/testing/conformance/registry.js.map +1 -1
- package/dist/testing/conformance/rpc-semantics.d.ts.map +1 -1
- package/dist/testing/conformance/rpc-semantics.js +139 -107
- package/dist/testing/conformance/rpc-semantics.js.map +1 -1
- package/dist/testing/conformance/runner.d.ts +2 -2
- package/dist/testing/conformance/runner.d.ts.map +1 -1
- package/dist/testing/conformance/runner.js +5 -10
- package/dist/testing/conformance/runner.js.map +1 -1
- package/dist/testing/conformance/schema-conformance.d.ts.map +1 -1
- package/dist/testing/conformance/schema-conformance.js +160 -120
- package/dist/testing/conformance/schema-conformance.js.map +1 -1
- package/dist/testing/conformance/suite.d.ts +1 -1
- package/dist/testing/conformance/suite.d.ts.map +1 -1
- package/dist/testing/conformance/suite.js +12 -9
- package/dist/testing/conformance/suite.js.map +1 -1
- package/dist/testing/models/dispatch.d.ts.map +1 -1
- package/dist/testing/models/dispatch.js +58 -50
- package/dist/testing/models/dispatch.js.map +1 -1
- package/dist/testing/models/state.d.ts +3 -3
- package/dist/testing/models/state.d.ts.map +1 -1
- package/dist/testing/models/state.js +14 -1
- package/dist/testing/models/state.js.map +1 -1
- package/dist/testing/test-client.d.ts +22 -3
- package/dist/testing/test-client.d.ts.map +1 -1
- package/dist/testing/test-client.js +51 -31
- package/dist/testing/test-client.js.map +1 -1
- package/dist/testing/test-server.d.ts.map +1 -1
- package/dist/testing/test-server.js +7 -11
- package/dist/testing/test-server.js.map +1 -1
- package/dist/testing/toxics/client.d.ts.map +1 -1
- package/dist/testing/toxics/client.js +39 -25
- package/dist/testing/toxics/client.js.map +1 -1
- package/dist/testing/toxics/profile.d.ts.map +1 -1
- package/dist/testing/toxics/profile.js +4 -1
- package/dist/testing/toxics/profile.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/suite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAgB,MAAM,EAAgB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIxE,OAAO,KAAK,EACV,2BAA2B,EAE3B,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../../../../src/testing/conformance/client/suite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAgB,MAAM,EAAgB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIxE,OAAO,KAAK,EACV,2BAA2B,EAE3B,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAMrB,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA+B/C;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE;QAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;KAChC,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7E;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,2BAA2B,GAC/B,IAAI,CAeN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,6BAA6B,GAClC,MAAM,CAAC,MAAM,CACd,WAAW,EACX,iBAAiB,GAAG,sBAAsB,GAAG,wBAAwB,CACtE,CA6BA;AA6KD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,6BAA6B,CAAC,YAAY,CAAC,SAAS,KAAK,GAC3E,KAAK,GACL,OAAO,CAAC;IACZ,QAAQ,CAAC,UAAU,CAAC,EAAE,6BAA6B,CAAC,YAAY,CAAC,CAAC;IAClE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC"}
|
|
@@ -32,6 +32,7 @@ import { registerModelEquivalenceClient, registerRequestIdUniquenessClient, } fr
|
|
|
32
32
|
import { registerArchiveLifecycleClient, registerFanOutCardinalityClient, registerPayloadOpacityClient, registerTaskBoundaryIsolationClient, } from "./delivery.js";
|
|
33
33
|
import { registerLatencyResilienceClient, registerResetPeerRecoveryClient, registerSlicerFramingClient, registerSlowCloseCleanupClient, registerTimeoutSurfaceClient, } from "./adversity.js";
|
|
34
34
|
import { registerSchemaExhaustiveFuzzClient } from "./boundary.js";
|
|
35
|
+
const JSON_INDENT_SPACES = 2;
|
|
35
36
|
/**
|
|
36
37
|
* Register every client-side property (A2, A4, B1, B4, C1, C3, C4, D1,
|
|
37
38
|
* D3, D4, D5, D6, E2 plus archive lifecycle — 14 total) against
|
|
@@ -205,6 +206,6 @@ function writeArtifact(dir, property, seed, payload) {
|
|
|
205
206
|
name: property.name,
|
|
206
207
|
seed,
|
|
207
208
|
...payload,
|
|
208
|
-
}, null,
|
|
209
|
+
}, null, JSON_INDENT_SPACES));
|
|
209
210
|
}
|
|
210
211
|
//# sourceMappingURL=suite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/suite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAOtD,OAAO,EACL,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EACL,oBAAoB,GAErB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,iCAAiC,EACjC,oCAAoC,GACrC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,+BAA+B,EAC/B,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kCAAkC,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../../../../src/testing/conformance/client/suite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/testing/conformance/delivery.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA+XzD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CA8D1E;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CA0DvE;AAED,6EAA6E;AAC7E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CA+CvE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAiC1E;AAED;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,qBAAqB,GACzB,IAAI,CA+BN;AAmPD,2EAA2E;AAC3E,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,qBAAqB,GACzB,IAAI,CAqDN;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,qBAAqB,GACzB,IAAI,CAiHN;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,qBAAqB,GACzB,IAAI,CAgDN;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,qBAAqB,GAAG,IAAI,CAuEzE"}
|
|
@@ -9,23 +9,28 @@
|
|
|
9
9
|
* Principle 3: every property body is `Effect<void, PropertyFailure>`.
|
|
10
10
|
*/
|
|
11
11
|
import * as fc from "fast-check";
|
|
12
|
-
import { Effect, Ref } from "effect";
|
|
12
|
+
import { Effect, Either, Ref } from "effect";
|
|
13
13
|
import { ErrorCodes } from "../../schema/errors.js";
|
|
14
14
|
import { EventNames } from "../../schema/events.js";
|
|
15
15
|
import { AppsCloseSession, AppsCreate, AppsRegister, } from "../../schema/methods/apps.js";
|
|
16
16
|
import { ConversationsArchive, ConversationsCreate, ConversationsUnarchive, ConversationsUpdate, } from "../../schema/methods/conversations.js";
|
|
17
17
|
import { MessagesSend } from "../../schema/methods/messages.js";
|
|
18
|
+
import { RpcResponseError } from "../errors.js";
|
|
18
19
|
import { makeTestClient } from "../test-client.js";
|
|
19
20
|
import { registerTestAgent } from "../agent-registration.js";
|
|
20
21
|
import { PropertyDeferred, PropertyInvariantViolation, PropertyUnavailable, assertProperty, registerProperty, } from "./registry.js";
|
|
21
|
-
import { sendUntypedRpc } from "./_helpers.js";
|
|
22
|
+
import { leftOrNull, requireRight, sendUntypedRpc } from "./_helpers.js";
|
|
22
23
|
const CATEGORY = "delivery";
|
|
23
24
|
const DEFAULT_TIMEOUT_MS = 5000;
|
|
24
25
|
const DEFAULT_CAPTURE_CAPACITY = 256;
|
|
26
|
+
const DEFAULT_PROPERTY_NUM_RUNS = 3;
|
|
27
|
+
const DATE_ID_RADIX = 36;
|
|
25
28
|
const MAX_N = 4;
|
|
26
29
|
const CONVERSATION_LIFECYCLE_PROPERTY = "conversation-lifecycle";
|
|
27
30
|
const APP_SESSION_CLOSE_LIFECYCLE_PROPERTY = "app-session-close-lifecycle";
|
|
28
31
|
const ARCHIVE_LIFECYCLE_PROPERTY = "archive-lifecycle";
|
|
32
|
+
const STORE_AND_REPLAY_PROPERTY = "store-and-replay";
|
|
33
|
+
const TASK_BOUNDARY_ISOLATION_PROPERTY = "task-boundary-isolation";
|
|
29
34
|
function violation(name, reason) {
|
|
30
35
|
return new PropertyInvariantViolation({ category: CATEGORY, name, reason });
|
|
31
36
|
}
|
|
@@ -128,15 +133,21 @@ function waitForUnarchivedEvent(observer, conversationId, byAgentId, propertyNam
|
|
|
128
133
|
function assertConversationRejectsMessages(actor, conversationId, propertyName) {
|
|
129
134
|
return Effect.gen(function* () {
|
|
130
135
|
const outcome = yield* sendText(actor, conversationId, "must-fail-while-archived").pipe(Effect.either);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
const outcomeViolation = Either.match(outcome, {
|
|
137
|
+
onRight: () => violation(propertyName, "messages/send succeeded while archived"),
|
|
138
|
+
onLeft: (error) => {
|
|
139
|
+
if (error instanceof RpcResponseError &&
|
|
140
|
+
error.code === ErrorCodes.ConversationArchived) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
const errorLabel = error instanceof RpcResponseError
|
|
144
|
+
? `${error._tag}/${error.code}`
|
|
145
|
+
: error._tag;
|
|
146
|
+
return violation(propertyName, `messages/send returned ${errorLabel}, expected ConversationArchived`);
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (outcomeViolation !== null) {
|
|
150
|
+
return yield* Effect.fail(outcomeViolation);
|
|
140
151
|
}
|
|
141
152
|
});
|
|
142
153
|
}
|
|
@@ -171,10 +182,7 @@ function acquireConversation(ctx, n, namePrefix) {
|
|
|
171
182
|
})),
|
|
172
183
|
})
|
|
173
184
|
.pipe(Effect.either);
|
|
174
|
-
|
|
175
|
-
return yield* Effect.fail(`conversations/create failed: ${createResult.left._tag}`);
|
|
176
|
-
}
|
|
177
|
-
const created = createResult.right;
|
|
185
|
+
const created = (yield* requireRight(createResult, (error) => `conversations/create failed: ${error._tag}`));
|
|
178
186
|
const conversationId = created.conversation?.id;
|
|
179
187
|
if (typeof conversationId !== "string" || conversationId.length === 0) {
|
|
180
188
|
return yield* Effect.fail(`conversations/create returned no conversation.id`);
|
|
@@ -191,34 +199,34 @@ function acquireConversation(ctx, n, namePrefix) {
|
|
|
191
199
|
* `PropertyInvariantViolation`.
|
|
192
200
|
*/
|
|
193
201
|
export function registerFanOutCardinality(ctx) {
|
|
194
|
-
registerProperty(ctx, CATEGORY, "fan-out-cardinality", "messages/send ⇒ exactly N inbound message events (one per connection)", assertProperty(CATEGORY, "fan-out-cardinality", () => fc.assert(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
s.frame.event.includes("message")).length);
|
|
214
|
-
return { kind: "ok", counts };
|
|
215
|
-
})));
|
|
202
|
+
registerProperty(ctx, CATEGORY, "fan-out-cardinality", "messages/send ⇒ exactly N inbound message events (one per connection)", assertProperty(CATEGORY, "fan-out-cardinality", () => fc.assert(fc.asyncProperty(fc.integer({ min: 2, max: 3 }), (n) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {
|
|
203
|
+
const fixture = yield* acquireConversation(ctx, n, "fan").pipe(Effect.mapError((e) => violation("fan-out-cardinality", `fixture: ${e}`)));
|
|
204
|
+
const send = yield* fixture.owner.client
|
|
205
|
+
.sendRpc(MessagesSend.name, {
|
|
206
|
+
conversationId: fixture.conversationId,
|
|
207
|
+
parts: [{ type: "text", text: "fan-out-ping" }],
|
|
208
|
+
})
|
|
209
|
+
.pipe(Effect.either);
|
|
210
|
+
if (leftOrNull(send) !== null) {
|
|
211
|
+
return { kind: "send-failed" };
|
|
212
|
+
}
|
|
213
|
+
yield* Effect.sleep("250 millis");
|
|
214
|
+
const observed = yield* Effect.forEach(fixture.participants, (p) => p.client.snapshot);
|
|
215
|
+
const counts = observed.map((snap) => snap.filter((s) => s.kind === "inbound" &&
|
|
216
|
+
s.frame?.type === "event" &&
|
|
217
|
+
typeof s.frame.event === "string" &&
|
|
218
|
+
s.frame.event.includes("message")).length);
|
|
219
|
+
return { kind: "ok", counts };
|
|
220
|
+
})).pipe(Effect.map((result) => {
|
|
216
221
|
if (result.kind !== "ok")
|
|
217
222
|
return false;
|
|
218
223
|
// Exact-cardinality predicate. Duplicates and drops both fail.
|
|
219
224
|
return (result.counts.length === fixture_n(n) &&
|
|
220
225
|
result.counts.every((c) => c === 1));
|
|
221
|
-
}), {
|
|
226
|
+
})))), {
|
|
227
|
+
seed: ctx.seed,
|
|
228
|
+
numRuns: ctx.opts.numRuns ?? DEFAULT_PROPERTY_NUM_RUNS,
|
|
229
|
+
})));
|
|
222
230
|
}
|
|
223
231
|
function fixture_n(requested) {
|
|
224
232
|
return Math.min(Math.max(1, requested), MAX_N);
|
|
@@ -248,17 +256,17 @@ function fixture_n(requested) {
|
|
|
248
256
|
* from the git history and remove the #186 pointer.
|
|
249
257
|
*/
|
|
250
258
|
export function registerStoreAndReplay(ctx) {
|
|
251
|
-
registerProperty(ctx, CATEGORY,
|
|
259
|
+
registerProperty(ctx, CATEGORY, STORE_AND_REPLAY_PROPERTY, "every messages/send lands in a live participant's capture buffer (basic-delivery-landing; #186 tracks C2 offline-replay)", Effect.scoped(Effect.gen(function* () {
|
|
252
260
|
const fixture = yield* acquireConversation(ctx, 1, "sr").pipe(Effect.mapError((e) => new PropertyInvariantViolation({
|
|
253
261
|
category: CATEGORY,
|
|
254
|
-
name:
|
|
262
|
+
name: STORE_AND_REPLAY_PROPERTY,
|
|
255
263
|
reason: `fixture: ${e}`,
|
|
256
264
|
})));
|
|
257
265
|
const participant = fixture.participants[0];
|
|
258
266
|
if (participant === undefined) {
|
|
259
267
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
260
268
|
category: CATEGORY,
|
|
261
|
-
name:
|
|
269
|
+
name: STORE_AND_REPLAY_PROPERTY,
|
|
262
270
|
reason: "fixture missing participant",
|
|
263
271
|
}));
|
|
264
272
|
}
|
|
@@ -280,7 +288,7 @@ export function registerStoreAndReplay(ctx) {
|
|
|
280
288
|
if (delivered < sent) {
|
|
281
289
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
282
290
|
category: CATEGORY,
|
|
283
|
-
name:
|
|
291
|
+
name: STORE_AND_REPLAY_PROPERTY,
|
|
284
292
|
reason: `sent ${sent}, live participant observed ${delivered}`,
|
|
285
293
|
}));
|
|
286
294
|
}
|
|
@@ -292,28 +300,24 @@ export function registerPayloadOpacity(ctx) {
|
|
|
292
300
|
// Exclude JSON-meta chars so a simple substring match is valid.
|
|
293
301
|
fc
|
|
294
302
|
.string({ minLength: 4, maxLength: 24 })
|
|
295
|
-
.filter((s) => !/[\\" \n\r\t]/.test(s)),
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
s.raw.includes(text));
|
|
314
|
-
}))).catch(() => false);
|
|
315
|
-
return found;
|
|
316
|
-
}), { seed: ctx.seed, numRuns: ctx.opts.numRuns ?? 3 })));
|
|
303
|
+
.filter((s) => !/[\\" \n\r\t]/.test(s)), (text) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {
|
|
304
|
+
const fixture = yield* acquireConversation(ctx, 1, "po").pipe(Effect.mapError((e) => violation("payload-opacity", `fixture: ${e}`)));
|
|
305
|
+
const participant = fixture.participants[0];
|
|
306
|
+
if (participant === undefined)
|
|
307
|
+
return false;
|
|
308
|
+
yield* fixture.owner.client.sendRpc(MessagesSend.name, {
|
|
309
|
+
conversationId: fixture.conversationId,
|
|
310
|
+
parts: [{ type: "text", text }],
|
|
311
|
+
});
|
|
312
|
+
yield* Effect.sleep("250 millis");
|
|
313
|
+
const snap = yield* participant.client.snapshot;
|
|
314
|
+
return snap.some((s) => s.kind === "inbound" &&
|
|
315
|
+
s.frame?.type === "event" &&
|
|
316
|
+
s.raw.includes(text));
|
|
317
|
+
})).pipe(Effect.catchAll(() => Effect.succeed(false))))), {
|
|
318
|
+
seed: ctx.seed,
|
|
319
|
+
numRuns: ctx.opts.numRuns ?? DEFAULT_PROPERTY_NUM_RUNS,
|
|
320
|
+
})));
|
|
317
321
|
}
|
|
318
322
|
/**
|
|
319
323
|
* Hook-gated delivery — admission verbs are awaitable, the verdict
|
|
@@ -340,9 +344,7 @@ export function registerPayloadOpacity(ctx) {
|
|
|
340
344
|
export function registerHookGatedDelivery(ctx) {
|
|
341
345
|
registerProperty(ctx, CATEGORY, "hook-gated-delivery", "deny drops; patch mutates recipient view; attached conv enters hooks", Effect.scoped(Effect.gen(function* () {
|
|
342
346
|
const fixture = yield* acquireAppSessionFixture(ctx, "hgd", "hook-gated-delivery").pipe(Effect.either);
|
|
343
|
-
|
|
344
|
-
return yield* Effect.fail(fixture.left);
|
|
345
|
-
}
|
|
347
|
+
yield* requireRight(fixture, (error) => error);
|
|
346
348
|
// Codex review (#327, finding 4): the protocol fixture cannot
|
|
347
349
|
// drive the deny/patch/attach scenarios end-to-end (no DB seam
|
|
348
350
|
// to inspect the recipient view; `apps/attachConversation` is a
|
|
@@ -371,9 +373,7 @@ export function registerHookGatedDelivery(ctx) {
|
|
|
371
373
|
export function registerMultiAppFifoShortCircuit(ctx) {
|
|
372
374
|
registerProperty(ctx, CATEGORY, "multi-app-fifo-short-circuit", "two apps; first denies; second hook is NOT invoked", Effect.scoped(Effect.gen(function* () {
|
|
373
375
|
const fixture = yield* acquireAppSessionFixture(ctx, "mfs", "multi-app-fifo-short-circuit").pipe(Effect.either);
|
|
374
|
-
|
|
375
|
-
return yield* Effect.fail(fixture.left);
|
|
376
|
-
}
|
|
376
|
+
yield* requireRight(fixture, (error) => error);
|
|
377
377
|
// Codex review (#327, finding 5): once apps/create succeeds, the
|
|
378
378
|
// FIFO short-circuit assertion requires registering a SECOND
|
|
379
379
|
// app on the same hook and observing the second handler is NOT
|
|
@@ -401,7 +401,7 @@ function acquireAppSessionFixture(ctx, namePrefix, propertyName) {
|
|
|
401
401
|
defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
|
|
402
402
|
captureCapacity: DEFAULT_CAPTURE_CAPACITY,
|
|
403
403
|
}).pipe(Effect.mapError((e) => unavailable(`app client acquire: ${String(e)}`)));
|
|
404
|
-
const appId = `${namePrefix}-${Date.now().toString(
|
|
404
|
+
const appId = `${namePrefix}-${Date.now().toString(DATE_ID_RADIX)}`;
|
|
405
405
|
const registerOutcome = yield* sendUntypedRpc(appClient, AppsRegister.name, {
|
|
406
406
|
manifest: {
|
|
407
407
|
appId,
|
|
@@ -416,9 +416,7 @@ function acquireAppSessionFixture(ctx, namePrefix, propertyName) {
|
|
|
416
416
|
},
|
|
417
417
|
},
|
|
418
418
|
}).pipe(Effect.either);
|
|
419
|
-
|
|
420
|
-
return yield* Effect.fail(unavailable(`apps/register failed: ${registerOutcome.left._tag}`));
|
|
421
|
-
}
|
|
419
|
+
yield* requireRight(registerOutcome, (error) => unavailable(`apps/register failed: ${error._tag}`));
|
|
422
420
|
const senderAgent = yield* registerTestAgent({
|
|
423
421
|
baseUrl: ctx.realServer.baseUrl,
|
|
424
422
|
name: `${namePrefix}-sender`,
|
|
@@ -433,14 +431,12 @@ function acquireAppSessionFixture(ctx, namePrefix, propertyName) {
|
|
|
433
431
|
const createOutcome = yield* senderClient
|
|
434
432
|
.sendRpc(AppsCreate.name, { appId, invitedAgentIds: [] })
|
|
435
433
|
.pipe(Effect.either);
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const session = createOutcome.right
|
|
443
|
-
.session;
|
|
434
|
+
const createResult = yield* requireRight(createOutcome, (error) => unavailable(
|
|
435
|
+
// Most common cause: owner_user_id is null on the sender (see
|
|
436
|
+
// app-host.ts:629). The default `startCoreTestServer` does not
|
|
437
|
+
// configure `devModeUserId`; B.9 fills the gap via DB seeding.
|
|
438
|
+
`apps/create failed (likely sender owner_user_id null; B.9 covers via DB seeding): ${error._tag}`));
|
|
439
|
+
const session = createResult.session;
|
|
444
440
|
const sessionId = session?.id;
|
|
445
441
|
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
446
442
|
return yield* Effect.fail(unavailable(`apps/create returned no session.id`));
|
|
@@ -470,7 +466,7 @@ function acquireAppSessionCloseFixture(ctx) {
|
|
|
470
466
|
defaultTimeoutMs: DEFAULT_TIMEOUT_MS,
|
|
471
467
|
captureCapacity: DEFAULT_CAPTURE_CAPACITY,
|
|
472
468
|
}).pipe(Effect.mapError((e) => unavailable(`app client acquire: ${String(e)}`)));
|
|
473
|
-
const appId = `close-life-${Date.now().toString(
|
|
469
|
+
const appId = `close-life-${Date.now().toString(DATE_ID_RADIX)}`;
|
|
474
470
|
const registerOutcome = yield* sendUntypedRpc(appClient, AppsRegister.name, {
|
|
475
471
|
manifest: {
|
|
476
472
|
appId,
|
|
@@ -481,9 +477,7 @@ function acquireAppSessionCloseFixture(ctx) {
|
|
|
481
477
|
],
|
|
482
478
|
},
|
|
483
479
|
}).pipe(Effect.either);
|
|
484
|
-
|
|
485
|
-
return yield* Effect.fail(unavailable(`apps/register failed: ${registerOutcome.left._tag}`));
|
|
486
|
-
}
|
|
480
|
+
yield* requireRight(registerOutcome, (error) => unavailable(`apps/register failed: ${error._tag}`));
|
|
487
481
|
const initiatorAgent = yield* registerTestAgent({
|
|
488
482
|
baseUrl: ctx.realServer.baseUrl,
|
|
489
483
|
name: "clinit",
|
|
@@ -514,15 +508,13 @@ function acquireAppSessionCloseFixture(ctx) {
|
|
|
514
508
|
invitedAgentIds: [inviteeAgent.agentId],
|
|
515
509
|
})
|
|
516
510
|
.pipe(Effect.either);
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
}
|
|
520
|
-
const session = createOutcome.right.session;
|
|
511
|
+
const createResult = yield* requireRight(createOutcome, (error) => unavailable(`apps/create failed (likely agents lack owner_user_id): ${error._tag}`));
|
|
512
|
+
const session = createResult.session;
|
|
521
513
|
const sessionId = session?.id;
|
|
522
514
|
const mainConversationId = session?.conversations?.["main"];
|
|
523
515
|
if (typeof sessionId !== "string" ||
|
|
524
516
|
typeof mainConversationId !== "string") {
|
|
525
|
-
return yield* Effect.fail(violation(propertyName, `apps/create response missing session id or main conversation: ${JSON.stringify(
|
|
517
|
+
return yield* Effect.fail(violation(propertyName, `apps/create response missing session id or main conversation: ${JSON.stringify(createResult)}`));
|
|
526
518
|
}
|
|
527
519
|
return {
|
|
528
520
|
initiator: { agent: initiatorAgent, client: initiatorClient },
|
|
@@ -534,15 +526,15 @@ function acquireAppSessionCloseFixture(ctx) {
|
|
|
534
526
|
}
|
|
535
527
|
/** Task-boundary isolation — conversation A's events don't leak into B. */
|
|
536
528
|
export function registerTaskBoundaryIsolation(ctx) {
|
|
537
|
-
registerProperty(ctx, CATEGORY,
|
|
529
|
+
registerProperty(ctx, CATEGORY, TASK_BOUNDARY_ISOLATION_PROPERTY, "participants in conversation B observe zero leaks from conversation A", Effect.scoped(Effect.gen(function* () {
|
|
538
530
|
const fxA = yield* acquireConversation(ctx, 1, "iso-a").pipe(Effect.mapError((e) => new PropertyInvariantViolation({
|
|
539
531
|
category: CATEGORY,
|
|
540
|
-
name:
|
|
532
|
+
name: TASK_BOUNDARY_ISOLATION_PROPERTY,
|
|
541
533
|
reason: `fixture A: ${e}`,
|
|
542
534
|
})));
|
|
543
535
|
const fxB = yield* acquireConversation(ctx, 1, "iso-b").pipe(Effect.mapError((e) => new PropertyInvariantViolation({
|
|
544
536
|
category: CATEGORY,
|
|
545
|
-
name:
|
|
537
|
+
name: TASK_BOUNDARY_ISOLATION_PROPERTY,
|
|
546
538
|
reason: `fixture B: ${e}`,
|
|
547
539
|
})));
|
|
548
540
|
yield* fxA.owner.client
|
|
@@ -560,7 +552,7 @@ export function registerTaskBoundaryIsolation(ctx) {
|
|
|
560
552
|
if (leaked) {
|
|
561
553
|
return yield* Effect.fail(new PropertyInvariantViolation({
|
|
562
554
|
category: CATEGORY,
|
|
563
|
-
name:
|
|
555
|
+
name: TASK_BOUNDARY_ISOLATION_PROPERTY,
|
|
564
556
|
reason: `conversation ${fxA.conversationId} leaked into outsider ${outsider.agent.agentId}`,
|
|
565
557
|
}));
|
|
566
558
|
}
|
|
@@ -582,31 +574,21 @@ export function registerConversationLifecycle(ctx) {
|
|
|
582
574
|
const participant = yield* firstParticipant(fixture, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
583
575
|
yield* waitForConversationCreatedEvent(participant, fixture.conversationId, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
584
576
|
const firstSend = yield* sendText(fixture.owner, fixture.conversationId, "lifecycle-before-update").pipe(Effect.either);
|
|
585
|
-
|
|
586
|
-
return yield* Effect.fail(violation(CONVERSATION_LIFECYCLE_PROPERTY, `messages/send failed before archive: ${firstSend.left._tag}`));
|
|
587
|
-
}
|
|
577
|
+
yield* requireRight(firstSend, (error) => violation(CONVERSATION_LIFECYCLE_PROPERTY, `messages/send failed before archive: ${error._tag}`));
|
|
588
578
|
yield* waitForMessageReceivedEvent(participant, fixture.conversationId, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
589
579
|
const updatedName = `Lifecycle ${ctx.seed}`;
|
|
590
580
|
const update = yield* updateConversationName(fixture.owner, fixture.conversationId, updatedName).pipe(Effect.either);
|
|
591
|
-
|
|
592
|
-
return yield* Effect.fail(violation(CONVERSATION_LIFECYCLE_PROPERTY, `conversations/update failed: ${update.left._tag}`));
|
|
593
|
-
}
|
|
581
|
+
yield* requireRight(update, (error) => violation(CONVERSATION_LIFECYCLE_PROPERTY, `conversations/update failed: ${error._tag}`));
|
|
594
582
|
yield* waitForConversationUpdatedEvent(participant, fixture.conversationId, updatedName, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
595
583
|
const archive = yield* archiveConversation(fixture.owner, fixture.conversationId).pipe(Effect.either);
|
|
596
|
-
|
|
597
|
-
return yield* Effect.fail(violation(CONVERSATION_LIFECYCLE_PROPERTY, `archive failed: ${archive.left._tag}`));
|
|
598
|
-
}
|
|
584
|
+
yield* requireRight(archive, (error) => violation(CONVERSATION_LIFECYCLE_PROPERTY, `archive failed: ${error._tag}`));
|
|
599
585
|
yield* waitForArchivedEvent(participant, fixture.conversationId, fixture.owner.agent.agentId, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
600
586
|
yield* assertConversationRejectsMessages(participant, fixture.conversationId, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
601
587
|
const unarchive = yield* unarchiveConversation(fixture.owner, fixture.conversationId).pipe(Effect.either);
|
|
602
|
-
|
|
603
|
-
return yield* Effect.fail(violation(CONVERSATION_LIFECYCLE_PROPERTY, `unarchive failed: ${unarchive.left._tag}`));
|
|
604
|
-
}
|
|
588
|
+
yield* requireRight(unarchive, (error) => violation(CONVERSATION_LIFECYCLE_PROPERTY, `unarchive failed: ${error._tag}`));
|
|
605
589
|
yield* waitForUnarchivedEvent(participant, fixture.conversationId, fixture.owner.agent.agentId, CONVERSATION_LIFECYCLE_PROPERTY);
|
|
606
590
|
const resumedSend = yield* sendText(participant, fixture.conversationId, "lifecycle-after-unarchive").pipe(Effect.either);
|
|
607
|
-
|
|
608
|
-
return yield* Effect.fail(violation(CONVERSATION_LIFECYCLE_PROPERTY, `messages/send failed after unarchive: ${resumedSend.left._tag}`));
|
|
609
|
-
}
|
|
591
|
+
yield* requireRight(resumedSend, (error) => violation(CONVERSATION_LIFECYCLE_PROPERTY, `messages/send failed after unarchive: ${error._tag}`));
|
|
610
592
|
})));
|
|
611
593
|
}
|
|
612
594
|
/**
|
|
@@ -620,11 +602,9 @@ export function registerAppSessionCloseLifecycle(ctx) {
|
|
|
620
602
|
const close = yield* fixture.initiator.client
|
|
621
603
|
.sendRpc(AppsCloseSession.name, { sessionId: fixture.sessionId })
|
|
622
604
|
.pipe(Effect.either);
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
if (close.right.closed !== true) {
|
|
627
|
-
return yield* Effect.fail(violation(APP_SESSION_CLOSE_LIFECYCLE_PROPERTY, `apps/closeSession returned unexpected result: ${JSON.stringify(close.right)}`));
|
|
605
|
+
const closeResult = yield* requireRight(close, (error) => violation(APP_SESSION_CLOSE_LIFECYCLE_PROPERTY, `apps/closeSession failed: ${error._tag}`));
|
|
606
|
+
if (closeResult.closed !== true) {
|
|
607
|
+
return yield* Effect.fail(violation(APP_SESSION_CLOSE_LIFECYCLE_PROPERTY, `apps/closeSession returned unexpected result: ${JSON.stringify(closeResult)}`));
|
|
628
608
|
}
|
|
629
609
|
yield* waitForArchivedEvent(fixture.invitee, fixture.conversationId, fixture.initiator.agent.agentId, APP_SESSION_CLOSE_LIFECYCLE_PROPERTY);
|
|
630
610
|
yield* waitForAppSessionClosedEvent(fixture.invitee, fixture.sessionId, fixture.initiator.agent.agentId, APP_SESSION_CLOSE_LIFECYCLE_PROPERTY);
|
|
@@ -644,20 +624,14 @@ export function registerArchiveLifecycle(ctx) {
|
|
|
644
624
|
const fixture = yield* acquirePropertyConversation(ctx, ARCHIVE_LIFECYCLE_PROPERTY, "arch");
|
|
645
625
|
const participant = yield* firstParticipant(fixture, ARCHIVE_LIFECYCLE_PROPERTY);
|
|
646
626
|
const archive = yield* archiveConversation(fixture.owner, fixture.conversationId).pipe(Effect.either);
|
|
647
|
-
|
|
648
|
-
return yield* Effect.fail(violation(ARCHIVE_LIFECYCLE_PROPERTY, `archive failed: ${archive.left._tag}`));
|
|
649
|
-
}
|
|
627
|
+
yield* requireRight(archive, (error) => violation(ARCHIVE_LIFECYCLE_PROPERTY, `archive failed: ${error._tag}`));
|
|
650
628
|
yield* waitForArchivedEvent(participant, fixture.conversationId, fixture.owner.agent.agentId, ARCHIVE_LIFECYCLE_PROPERTY);
|
|
651
629
|
yield* assertConversationRejectsMessages(participant, fixture.conversationId, ARCHIVE_LIFECYCLE_PROPERTY);
|
|
652
630
|
const unarchive = yield* unarchiveConversation(fixture.owner, fixture.conversationId).pipe(Effect.either);
|
|
653
|
-
|
|
654
|
-
return yield* Effect.fail(violation(ARCHIVE_LIFECYCLE_PROPERTY, `unarchive failed: ${unarchive.left._tag}`));
|
|
655
|
-
}
|
|
631
|
+
yield* requireRight(unarchive, (error) => violation(ARCHIVE_LIFECYCLE_PROPERTY, `unarchive failed: ${error._tag}`));
|
|
656
632
|
yield* waitForUnarchivedEvent(participant, fixture.conversationId, fixture.owner.agent.agentId, ARCHIVE_LIFECYCLE_PROPERTY);
|
|
657
633
|
const resumedSend = yield* sendText(participant, fixture.conversationId, "must-succeed-after-unarchive").pipe(Effect.either);
|
|
658
|
-
|
|
659
|
-
return yield* Effect.fail(violation(ARCHIVE_LIFECYCLE_PROPERTY, `messages/send failed after unarchive: ${resumedSend.left._tag}`));
|
|
660
|
-
}
|
|
634
|
+
yield* requireRight(resumedSend, (error) => violation(ARCHIVE_LIFECYCLE_PROPERTY, `messages/send failed after unarchive: ${error._tag}`));
|
|
661
635
|
})));
|
|
662
636
|
}
|
|
663
637
|
//# sourceMappingURL=delivery.js.map
|