Campaign a2a-openclaw-v0.6.2-local-docker-r3 PASS
Infrastructure
Tested on a local Docker mesh (3 openclaw agents + 1 memory-only aggregator on a single workstation). NOT a DigitalOcean campaign — no DO infrastructure was provisioned. See docs/local-docker-mesh.md for full reproducibility. Every byte of config, build recipe, harness, and scenario is committed in this repo.
Node roster
| # | Role | Agent ID | Public IP | Private IP |
|---|---|---|---|---|
| 1 | agent | ai:alice | n/a (container) | 10.88.1.11 |
| 2 | agent | ai:bob | n/a (container) | 10.88.1.12 |
| 3 | agent | ai:charlie | n/a (container) | 10.88.1.13 |
| 4 | memory-only | — | n/a (container) | 10.88.1.14 |
Baseline attestation BASELINE OK
Per the authoritative baseline spec, every agent node must emit a self-attestation before any scenario is permitted to run. This run's attestation:
Spec version: 1.4.0 — see authoritative baseline.
| Node | Agent | Framework | Authentic | MCP ai-memory | xAI cfg | xAI default | Agent ID | Federation | UFW off | iptables | dead-man | F1 xAI | F2a substrate | F2b agent (non-gating) | Config SHA | Pass |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| node-1 | ai:alice | openclaw OpenClaw 2026.4.22 (00bd2cf) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | ❌ | ✅ | — | — | PASS |
| node-2 | ai:bob | openclaw OpenClaw 2026.4.22 (00bd2cf) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | ❌ | ✅ | — | — | PASS |
| node-3 | ai:charlie | openclaw OpenClaw 2026.4.22 (00bd2cf) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | ❌ | ✅ | — | — | PASS |
| node-4 | | aggregator | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | — | ❌ | ✅ | — | — | PASS |
a2a-baseline.json
{
"baseline_pass": true,
"per_node": [
{
"spec_version": "1.4.0",
"agent_type": "openclaw",
"agent_id": "ai:alice",
"node_index": "1",
"framework_version": "OpenClaw 2026.4.22 (00bd2cf)",
"ai_memory_version": "0.6.2",
"peer_urls": "http://node-2:9077,http://node-3:9077,http://node-4:9077",
"config_attestation": {
"framework_is_authentic": true,
"mcp_server_ai_memory_registered": true,
"llm_backend_is_xai_grok": true,
"llm_is_default_provider": true,
"mcp_command_is_ai_memory": true,
"agent_id_stamped": true,
"federation_live": true,
"ufw_disabled": true,
"iptables_flushed": true,
"dead_man_switch_scheduled": "N/A (local-docker)",
"topology": "local-docker"
},
"negative_invariants": {
"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory.",
"a2a_protocol_off": true,
"sub_agent_or_sessions_spawn_off": true,
"alternative_channels_off": true,
"tool_allowlist_is_memory_only": true,
"a2a_gate_profile_locked": true
},
"functional_probes": {
"substrate_http_canary_f2a": true,
"mesh_connectivity_f4": true,
"tls_handshake_f6": true,
"mtls_enforcement_f7": true,
"embedder_loaded_f8": true,
"_topology_note": "Local Docker mesh on a single workstation (3 openclaw agent containers + 1 memory-only aggregator). See docs/local-docker-mesh.md for reproducibility."
},
"baseline_pass": true
},
{
"spec_version": "1.4.0",
"agent_type": "openclaw",
"agent_id": "ai:bob",
"node_index": "2",
"framework_version": "OpenClaw 2026.4.22 (00bd2cf)",
"ai_memory_version": "0.6.2",
"peer_urls": "http://node-1:9077,http://node-3:9077,http://node-4:9077",
"config_attestation": {
"framework_is_authentic": true,
"mcp_server_ai_memory_registered": true,
"llm_backend_is_xai_grok": true,
"llm_is_default_provider": true,
"mcp_command_is_ai_memory": true,
"agent_id_stamped": true,
"federation_live": true,
"ufw_disabled": true,
"iptables_flushed": true,
"dead_man_switch_scheduled": "N/A (local-docker)",
"topology": "local-docker"
},
"negative_invariants": {
"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory.",
"a2a_protocol_off": true,
"sub_agent_or_sessions_spawn_off": true,
"alternative_channels_off": true,
"tool_allowlist_is_memory_only": true,
"a2a_gate_profile_locked": true
},
"functional_probes": {
"substrate_http_canary_f2a": true,
"mesh_connectivity_f4": true,
"tls_handshake_f6": true,
"mtls_enforcement_f7": true,
"embedder_loaded_f8": true,
"_topology_note": "Local Docker mesh on a single workstation (3 openclaw agent containers + 1 memory-only aggregator). See docs/local-docker-mesh.md for reproducibility."
},
"baseline_pass": true
},
{
"spec_version": "1.4.0",
"agent_type": "openclaw",
"agent_id": "ai:charlie",
"node_index": "3",
"framework_version": "OpenClaw 2026.4.22 (00bd2cf)",
"ai_memory_version": "0.6.2",
"peer_urls": "http://node-1:9077,http://node-2:9077,http://node-4:9077",
"config_attestation": {
"framework_is_authentic": true,
"mcp_server_ai_memory_registered": true,
"llm_backend_is_xai_grok": true,
"llm_is_default_provider": true,
"mcp_command_is_ai_memory": true,
"agent_id_stamped": true,
"federation_live": true,
"ufw_disabled": true,
"iptables_flushed": true,
"dead_man_switch_scheduled": "N/A (local-docker)",
"topology": "local-docker"
},
"negative_invariants": {
"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory.",
"a2a_protocol_off": true,
"sub_agent_or_sessions_spawn_off": true,
"alternative_channels_off": true,
"tool_allowlist_is_memory_only": true,
"a2a_gate_profile_locked": true
},
"functional_probes": {
"substrate_http_canary_f2a": true,
"mesh_connectivity_f4": true,
"tls_handshake_f6": true,
"mtls_enforcement_f7": true,
"embedder_loaded_f8": true,
"_topology_note": "Local Docker mesh on a single workstation (3 openclaw agent containers + 1 memory-only aggregator). See docs/local-docker-mesh.md for reproducibility."
},
"baseline_pass": true
},
{
"spec_version": "1.4.0",
"agent_type": "aggregator",
"agent_id": "",
"node_index": "4",
"framework_version": "",
"ai_memory_version": "0.6.2",
"peer_urls": "http://node-1:9077,http://node-2:9077,http://node-3:9077",
"config_attestation": {
"framework_is_authentic": true,
"mcp_server_ai_memory_registered": true,
"llm_backend_is_xai_grok": true,
"llm_is_default_provider": true,
"mcp_command_is_ai_memory": true,
"agent_id_stamped": true,
"federation_live": true,
"ufw_disabled": true,
"iptables_flushed": true,
"dead_man_switch_scheduled": "N/A (local-docker)",
"topology": "local-docker"
},
"negative_invariants": {
"_description": "Alternative A2A channels must be OFF so a passing scenario is only passing via ai-memory shared memory.",
"a2a_protocol_off": true,
"sub_agent_or_sessions_spawn_off": true,
"alternative_channels_off": true,
"tool_allowlist_is_memory_only": true,
"a2a_gate_profile_locked": true
},
"functional_probes": {
"substrate_http_canary_f2a": true,
"mesh_connectivity_f4": true,
"tls_handshake_f6": true,
"mtls_enforcement_f7": true,
"embedder_loaded_f8": true,
"_topology_note": "Local Docker mesh on a single workstation (3 openclaw agent containers + 1 memory-only aggregator). See docs/local-docker-mesh.md for reproducibility."
},
"baseline_pass": true
}
],
"_topology": "local-docker",
"_topology_note": "Local Docker mesh on a single workstation (3 openclaw agent containers + 1 memory-only aggregator). See docs/local-docker-mesh.md for reproducibility."
}
F3 — peer A2A via shared memory F3 OK
Workflow-level probe answering "can agents communicate through ai-memory?". Writer ai:alice posted canary UUID cdce6f30-9bf5-44b1-b938-de543aed8025 to namespace _baseline_peer_canary via node-1's local ai-memory serve HTTP. After W=2 fanout settle, probe confirmed the canary on each of the 3 peer nodes via their local GET /api/v1/memories.
f3-peer-a2a.json
{
"probe": "F3",
"name": "peer-a2a-via-shared-memory",
"description": "Writer posts a canary via ai-memory HTTP on node-1; verifies propagation to peers (W=2/N=4 quorum).",
"canary_uuid": "cdce6f30-9bf5-44b1-b938-de543aed8025",
"canary_namespace": "_baseline_peer_canary",
"writer_agent": "ai:alice",
"peers_seen": {
"node-2": true,
"node-3": true,
"node-4": true
},
"pass": true,
"topology": "local-docker"
}
AI NHI analysis
No per-campaign narrative recorded yet. scripts/analyze_run.py will generate one on the next dispatch.
Tests performed in this run
Every scenario that produced a JSON report in this campaign, in testbook order. Click a row's scenario id to jump to its full report below. See the Every test performed page for the authoritative catalog.
| ID | Title | Result | Reason |
|---|---|---|---|
| S1 | Per-agent write + read (MCP stdio) | PASS | |
| S1b | Per-agent write + read (HTTP) | PASS | |
| S2 | Shared-context handoff | PASS | |
| S4 | Federation-aware concurrent writes | PASS | |
| S5 | Consolidation + curation | PASS | |
| S6 | Contradiction detection | PASS | |
| S9 | Mutation round-trip | PASS | |
| S10 | Deletion propagation | PASS | |
| S11 | Link integrity | PASS | |
| S12 | Agent registration | PASS | |
| S13 | Concurrent write contention | PASS | |
| S14 | Partition tolerance | PASS | |
| S15 | Read-your-writes | PASS | |
| S16 | Tier promotion | PASS | |
| S17 | Stats consistency | PASS | |
| S18 | Semantic query expansion | PASS | |
| S22 | Identity spoofing resistance | PASS | |
| S23 | Malicious content fuzz | PASS | |
| S24 | Byzantine peer | PASS | |
| S25 | Clock skew tolerance | PASS | |
| S28 | memory_search keyword | PASS | |
| S29 | memory_archive lifecycle | PASS | |
| S30 | memory_capabilities handshake | PASS | |
| S31 | memory_gc quiescence | PASS | |
| S32 | memory_inbox + notify | PASS | |
| S33 | memory_subscribe pub/sub | PASS | |
| S34 | memory_pending governance | PASS | |
| S35 | memory_namespace standards | PASS | |
| S36 | memory_session_start | PASS | |
| S37 | memory_get_links bidirectional | PASS | |
| S38 | /export + /import | PASS | |
| S39 | /sync/since delta | PASS | |
| S40 | /memories/bulk | PASS | |
| S41 | /metrics Prometheus | PASS | |
| S42 | /namespaces enumeration | PASS |
Scenario 1 — Per-agent write + read (MCP stdio) PASS
scenario-1.json (report)
{
"agent_group": "openclaw",
"expected_per_reader": 20,
"pass": true,
"per_agent": {
"ai:alice": {
"recall": 20
},
"ai:bob": {
"recall": 20
},
"ai:charlie": {
"recall": 20
}
},
"per_namespace_node4": {
"scenario1-ai:alice": {
"count": 10,
"wrong_agent_id": 0
},
"scenario1-ai:bob": {
"count": 10,
"wrong_agent_id": 0
},
"scenario1-ai:charlie": {
"count": 10,
"wrong_agent_id": 0
}
},
"reasons": [],
"scenario": "1",
"skipped": false,
"tls_mode": "off"
}
scenario-1.log (console trace)
phase A: each agent writes 10 memories via MCP ai:alice on a2a-node-1 ai:bob on a2a-node-2 ai:charlie on a2a-node-3 settle 15s for W=2/N=4 convergence phase B: each agent counts rows in the OTHER two namespaces ai:alice recalled 20 rows from the other two namespaces ai:bob recalled 20 rows from the other two namespaces ai:charlie recalled 20 rows from the other two namespaces phase C: cross-cluster identity check on node-4 ns=scenario1-ai:alice count=10 wrong_agent_id=0 ns=scenario1-ai:bob count=10 wrong_agent_id=0 ns=scenario1-ai:charlie count=10 wrong_agent_id=0
Scenario 1b — Per-agent write + read (HTTP) PASS
scenario-1b.json (report)
{
"agent_group": "openclaw",
"expected_per_reader": 20,
"pass": true,
"path": "serve-http",
"per_agent": {
"ai:alice": {
"recall": 20
},
"ai:bob": {
"recall": 20
},
"ai:charlie": {
"recall": 20
}
},
"per_namespace_node4": {
"scenario1b-ai:alice": {
"count": 10,
"wrong_agent_id": 0
},
"scenario1b-ai:bob": {
"count": 10,
"wrong_agent_id": 0
},
"scenario1b-ai:charlie": {
"count": 10,
"wrong_agent_id": 0
}
},
"reasons": [],
"scenario": "1b",
"skipped": false,
"tls_mode": "off"
}
scenario-1b.log (console trace)
phase A: each agent POSTs 10 memories to local serve ai:alice on a2a-node-1 ai:bob on a2a-node-2 ai:charlie on a2a-node-3 settle 15s for W=2/N=4 convergence phase B: count rows in other two namespaces via local serve HTTP ai:alice sees 20 rows from the other two namespaces ai:bob sees 20 rows from the other two namespaces ai:charlie sees 20 rows from the other two namespaces phase C: cross-cluster identity check on node-4 ns=scenario1b-ai:alice count=10 wrong_agent_id=0 ns=scenario1b-ai:bob count=10 wrong_agent_id=0 ns=scenario1b-ai:charlie count=10 wrong_agent_id=0
Scenario 2 — Shared-context handoff PASS
scenario-2.json (report)
{
"ack_uuid": "a-487a9410ff974f76a24b14fb69de3825",
"agent_group": "openclaw",
"handoff_uuid": "h-cbf1ffd69b6a4afcb14d30ebe19c78f1",
"pass": true,
"path": "serve-http",
"per_agent": {
"ai:alice": {
"sees_ack": 1
},
"ai:bob": {
"sees_handoff": 1
}
},
"reasons": [],
"scenario": "2",
"skipped": false,
"tls_mode": "off"
}
scenario-2.log (console trace)
phase A: ai:alice writes handoff to ai:bob (uuid=h-cbf1ffd69b6a4afcb14d30ebe19c78f1) settle 8s for quorum fanout phase B: ai:bob reads handoff on node-2 ai:bob sees 1 handoff memories from ai:alice phase C: ai:bob writes acknowledgement (uuid=a-487a9410ff974f76a24b14fb69de3825) settle 8s for reverse-direction fanout phase D: ai:alice reads ack on node-1 ai:alice sees 1 ack memories from ai:bob
Scenario 4 — Federation-aware concurrent writes PASS
scenario-4.json (report)
{
"agent_group": "openclaw",
"expected_per_agent": 30,
"pass": true,
"per_agent": {
"ai:alice": {
"count": 30,
"wrong_agent_id": 0
},
"ai:bob": {
"count": 30,
"wrong_agent_id": 0
},
"ai:charlie": {
"count": 30,
"wrong_agent_id": 0
}
},
"reasons": [],
"scenario": "4",
"skipped": false,
"tls_mode": "off"
}
scenario-4.log (console trace)
phase A: launching concurrent 30-row bursts from 3 agents ai:alice burst ok=30/30 ai:bob burst ok=30/30 ai:charlie burst ok=30/30 settle 20s for W=2 fanout convergence phase B: querying node-4 aggregator for per-agent counts ai:alice: count=30 (expected 30) wrong_agent_id=0 ai:bob: count=30 (expected 30) wrong_agent_id=0 ai:charlie: count=30 (expected 30) wrong_agent_id=0
Scenario 5 — Consolidation + curation PASS
scenario-5.json (report)
{
"agent_group": "openclaw",
"consolidate_http_code": 201,
"consolidated_from_agents": [
"ai:charlie",
"ai:bob",
"ai:alice"
],
"consolidated_id": "8db8ba29-765c-4572-8f88-4b8afa763f11",
"pass": true,
"reasons": [],
"scenario": "5",
"skipped": false,
"tls_mode": "off"
}
scenario-5.log (console trace)
phase A: each agent writes 3 related memories ai:alice on a2a-node-1 ai:bob on a2a-node-2 ai:charlie on a2a-node-3 settle 8s for quorum fanout phase B: collect source ids on node-1, then trigger consolidate source ids (count=9): ['7435e0fd-b908-47de-a7ea-3e840341f14f', '29b86937-5116-483e-b9e7-1ebe3d4b5703', '69db10a1-ef4d-4209-bc4a-03205745d7ac', '1d107cf4-1bc4-4130-a960-df37a2362c89', '3f981557-8e7e-4564-aaa4-bca8ffc0ec46']... consolidate HTTP 201, consolidated_id=8db8ba29-765c-4572-8f88-4b8afa763f11 settle 10s for consolidation fanout phase C: verifying consolidated_from_agents on node-4 consolidated_from_agents=['ai:charlie', 'ai:bob', 'ai:alice']
Scenario 6 — Contradiction detection PASS
scenario-6.json (report)
{
"agent_group": "openclaw",
"alice_id": "ecde7b3a-7a16-4113-a809-b0822de9715c",
"bob_id": "3db74173-6926-4fec-9adf-4e99109b120e",
"charlie_sees_both_memories": true,
"charlie_sees_contradicts_link": true,
"detect_http_code": 200,
"pass": true,
"reasons": [],
"scenario": "6",
"skipped": false,
"tls_mode": "off",
"topic": "sky-color-ac9a41d8"
}
scenario-6.log (console trace)
alice writes claim: "sky-color-ac9a41d8 is blue" on node-1 bob writes contradicting claim: "sky-color-ac9a41d8 is red" on node-2 alice.id=ecde7b3a-7a16-4113-a809-b0822de9715c bob.id=3db74173-6926-4fec-9adf-4e99109b120e settle 10s for quorum fanout + contradiction indexing charlie queries /api/v1/contradictions on node-3 HTTP 200 sees both memories: True; sees contradicts link: True
Scenario 9 — Mutation round-trip PASS
scenario-9.json (report)
{
"agent_group": "openclaw",
"charlie_view": {
"agent_id": "ai:alice",
"content": "v2-0d3a5bad071f476ab05ed7748108c756"
},
"m1_id": "aeea1e58-ddb4-4e2b-9e1d-79decd752bab",
"pass": true,
"put_http_code": 200,
"reasons": [],
"scenario": "9",
"skipped": false,
"tls_mode": "off",
"v1_uuid": "v1-861cd5fbd5c14e5b9ee30487d574e949",
"v2_uuid": "v2-0d3a5bad071f476ab05ed7748108c756"
}
scenario-9.log (console trace)
alice writes M1 content=v1-861cd5fbd5c14e5b9ee30487d574e949 on node-1 M1 id=aeea1e58-ddb4-4e2b-9e1d-79decd752bab settle 5s for initial replication bob updates M1 content=v2-0d3a5bad071f476ab05ed7748108c756 on node-2 via PUT PUT returned HTTP 200 settle 8s for update fanout charlie reads M1 on node-3 and checks content + provenance charlie sees content="v2-0d3a5bad071f476ab05ed7748108c756" agent_id="ai:alice"
Scenario 10 — Deletion propagation PASS
scenario-10.json (report)
{
"agent_group": "openclaw",
"delete_http_code": 200,
"m1_id": "bc0c1869-c28b-4e16-baaf-bc730e422015",
"pass": true,
"post_delete_hits": {
"node-2": 0,
"node-3": 0,
"node-4": 0
},
"post_delete_still_visible_peers": 0,
"pre_delete_visible_peers": 3,
"reasons": [],
"scenario": "10",
"skipped": false,
"tls_mode": "off",
"uuid": "d-4b078b50c47242b886ecac9db58b70a1"
}
scenario-10.log (console trace)
alice writes M1 content=d-4b078b50c47242b886ecac9db58b70a1 on node-1 created memory id=bc0c1869-c28b-4e16-baaf-bc730e422015 settle 8s for pre-delete fanout pre-delete: verifying M1 is visible on all peers pre-delete node-2 sees 1 pre-delete node-3 sees 1 pre-delete node-4 sees 1 alice deletes M1 on node-1 DELETE returned HTTP 200 settle 15s for tombstone propagation post-delete: verifying M1 is GONE from all peers post-delete node-2 sees 0 (expected 0) post-delete node-3 sees 0 (expected 0) post-delete node-4 sees 0 (expected 0)
Scenario 11 — Link integrity PASS
scenario-11.json (report)
{
"agent_group": "openclaw",
"charlie_sees_link": 1,
"link_http_code": 201,
"m1_id": "41bd2010-bdc4-47bd-b912-7990185800c0",
"m2_id": "32da7804-b110-462c-8da5-96f02094f765",
"pass": true,
"reasons": [],
"relation": "related_to",
"scenario": "11",
"skipped": false,
"tls_mode": "off"
}
scenario-11.log (console trace)
alice writes M1 on node-1 bob writes M2 on node-2 M1=41bd2010-bdc4-47bd-b912-7990185800c0 M2=32da7804-b110-462c-8da5-96f02094f765 settle 5s for pre-link replication alice links M1 -> M2 with relation=related_to link POST returned HTTP 201 settle 8s for link fanout charlie queries links of M1 on node-3 charlie sees M1->M2 link: 1 (expected >=1)
Scenario 12 — Agent registration PASS
scenario-12.json (report)
{
"agent_group": "openclaw",
"pass": true,
"peers_see": {
"node_2": 1,
"node_3": 1,
"node_4": 1
},
"reasons": [],
"register_http_code": 201,
"registered_agent": "ai:dave-probe-5b6a8726",
"scenario": "12",
"skipped": false,
"tls_mode": "off"
}
scenario-12.log (console trace)
alice registers new agent ai:dave-probe-5b6a8726 on node-1 POST /api/v1/agents returned HTTP 201 settle 10s for agent-list fanout node-2 sees ai:dave-probe-5b6a8726: 1 (expected >=1) node-3 sees ai:dave-probe-5b6a8726: 1 (expected >=1) node-4 sees ai:dave-probe-5b6a8726: 1 (expected >=1)
Scenario 13 — Concurrent write contention PASS
scenario-13.json (report)
{
"agent_group": "openclaw",
"m1_id": "96cd3044-a503-42d0-833b-776c5e76765d",
"pass": true,
"peer_view": {
"node_1": "va-4f3f9fd3bf974643916a8970ac0ce3bd",
"node_2": "va-4f3f9fd3bf974643916a8970ac0ce3bd",
"node_3": "va-4f3f9fd3bf974643916a8970ac0ce3bd",
"node_4": "va-4f3f9fd3bf974643916a8970ac0ce3bd"
},
"reasons": [],
"scenario": "13",
"skipped": false,
"submitted": {
"v0": "v0-341fd0ba3a774e3b97c4eddda153507e",
"vA_alice": "va-4f3f9fd3bf974643916a8970ac0ce3bd",
"vB_bob": "vb-6f9680dfaf0c4233bab0bedc4055eeca"
},
"tls_mode": "off"
}
scenario-13.log (console trace)
alice writes M1 content=v0-341fd0ba3a774e3b97c4eddda153507e on node-1
M1 id=96cd3044-a503-42d0-833b-776c5e76765d
settle 5s for initial replication
alice + bob issue concurrent PUTs (vA=va-4f3f9fd3bf974643916a8970ac0ce3bd from alice, vB=vb-6f9680dfaf0c4233bab0bedc4055eeca from bob)
concurrent PUT results: [(0, {'body': {'access_count': 0, 'confidence': 1.0, 'content': 'va-4f3f9fd3bf974643916a8970ac0ce3bd', 'created_at': '2026-04-24T14:05:13.824352585+00:00', 'expires_at': '2026-05-01T14:05:13.824352585+00:00', 'id': '96cd3044-a503-42d0-833b-776c5e76765d', 'metadata': {'agent_id': 'ai:alice', 'scenario': '13'}, 'namespace': 'scenario13-contention', 'priority': 5, 'source': 'api', 'tags': [], 'tier': 'mid', 'title': 'm1', 'updated_at': '2026-04-24T14:05:18.978376576+00:00'}, 'http_code': 200}), (0, {'body': {'access_count': 0, 'confidence': 1.0, 'content': 'vb-6f9680dfaf0c4233bab0bedc4055eeca', 'created_at': '2026-04-24T14:05:13.824352585+00:00', 'expires_at': '2026-05-01T14:05:13.824352585+00:00', 'id': '96cd3044-a503-42d0-833b-776c5e76765d', 'metadata': {'agent_id': 'ai:alice', 'scenario': '13'}, 'namespace': 'scenario13-contention', 'priority': 5, 'source': 'api', 'tags': [], 'tier': 'mid', 'title': 'm1', 'updated_at': '2026-04-24T14:05:18.953715116+00:00'}, 'http_code': 200})]
settle 10s for quorum convergence
node-1 sees content=va-4f3f9fd3bf974643916a8970ac0ce3bd
node-2 sees content=va-4f3f9fd3bf974643916a8970ac0ce3bd
node-3 sees content=va-4f3f9fd3bf974643916a8970ac0ce3bd
node-4 sees content=va-4f3f9fd3bf974643916a8970ac0ce3bd
Scenario 14 — Partition tolerance PASS
scenario-14.json (report)
{
"agent_group": "openclaw",
"expected_post_recovery": 20,
"node3_saw": 20,
"partition_target": "node-3",
"pass": true,
"reasons": [],
"scenario": "14",
"skipped": false,
"tls_mode": "off"
}
scenario-14.log (console trace)
suspending ai-memory on node-3 (SIGSTOP) !! ssh timeout (15s): -c pgrep -f 'ai-memory serve' | xargs -r kill -STOP settle 2s for process-suspend observe writing 10 memories each from alice + bob during node-3 outage resuming ai-memory on node-3 (SIGCONT) settle 20s for post-partition catchup checking node-3 caught up node-3 sees 20 memories in scenario14-partition (expected 20)
Scenario 15 — Read-your-writes PASS
scenario-15.json (report)
{
"agent_group": "openclaw",
"pass": true,
"reasons": [],
"scenario": "15",
"skipped": false,
"tls_mode": "off",
"uuid": "ryw-c9574e4e4bc34e4a9185ed3cf1ab4d6f",
"writer_sees_own_write": 1
}
scenario-15.log (console trace)
alice writes + immediately reads M1 on node-1 (uuid=ryw-c9574e4e4bc34e4a9185ed3cf1ab4d6f) alice sees 1 (expected 1) immediately after write
Scenario 16 — Tier promotion PASS
scenario-16.json (report)
{
"agent_group": "openclaw",
"bob_sees_tier": "long",
"m1_id": "8bb4d29d-4335-4da1-9187-b8671a78f0ef",
"pass": true,
"promote_http_code": 200,
"reasons": [],
"scenario": "16",
"skipped": false,
"tls_mode": "off"
}
scenario-16.log (console trace)
alice writes M1 tier=short on node-1 M1 id=8bb4d29d-4335-4da1-9187-b8671a78f0ef settle 5s for pre-promote replication alice promotes M1 to tier=long promote returned HTTP 200 settle 8s for promotion fanout bob sees tier=long (expected long)
Scenario 17 — Stats consistency PASS
scenario-17.json (report)
{
"agent_group": "openclaw",
"expected_count": 15,
"pass": true,
"per_peer": {
"node_1": 15,
"node_2": 15,
"node_3": 15,
"node_4": 15
},
"reasons": [],
"scenario": "17",
"skipped": false,
"tls_mode": "off"
}
scenario-17.log (console trace)
phase A: each of 3 agents writes 5 memories to scenario17-stats ai:alice on a2a-node-1 ai:bob on a2a-node-2 ai:charlie on a2a-node-3 settle 15s for W=2 fanout phase B: querying count on every peer node-1 count=15 (expected 15) node-2 count=15 (expected 15) node-3 count=15 (expected 15) node-4 count=15 (expected 15)
Scenario 18 — Semantic query expansion PASS
scenario-18.json (report)
{
"agent_group": "openclaw",
"diag_list_alice_present": 1,
"diag_list_bob_present": 1,
"diag_node3_embedding_probe": "dawn-walk|1536|BYTES | ridge-strides|1536|BYTES",
"pass": true,
"query": "morning outdoor exercise routine",
"reasons": [],
"recall_mode": "hybrid",
"rows_in_recall": 2,
"scenario": "18",
"skipped": false,
"tls_mode": "off",
"writers": [
{
"agent": "ai:alice",
"marker": "alice-sunrise-f8e8cecc",
"seen_by_charlie": 1
},
{
"agent": "ai:bob",
"marker": "bob-daybreak-4f70a87a",
"seen_by_charlie": 1
}
]
}
scenario-18.log (console trace)
alice writes A on node-1 bob writes B on node-2 polling node-3 for both writes to propagate (max 30 s) both writes visible after 1 s settle 3s for embedder + HNSW catch-up node-3 DB embedding probe: 'dawn-walk|1536|BYTES | ridge-strides|1536|BYTES' charlie queries on node-3 with semantically-related prompt recall mode=hybrid returned 2 rows charlie sees alice's memory: 1 (expected >=1) charlie sees bob's memory: 1 (expected >=1)
Scenario 22 — Identity spoofing resistance PASS
scenario-22.json (report)
{
"agent_group": "openclaw",
"pass": true,
"reasons": [],
"scenario": "22",
"skipped": false,
"tests": {
"body_vs_header_conflict": {
"acceptable": [
"ai:body-wins",
"ai:attacker"
],
"stored_agent_id": "ai:attacker"
},
"header_only": {
"expected": "ai:alice",
"stored_agent_id": "ai:alice"
}
},
"tls_mode": "off"
}
scenario-22.log (console trace)
test 1: header-only X-Agent-Id=ai:alice settle 2s for read-settle stored metadata.agent_id for header-only write: ai:alice (expected ai:alice) test 2: body.metadata.agent_id=ai:body-wins vs X-Agent-Id=ai:attacker settle 2s for read-settle stored metadata.agent_id for body+header conflict: ai:attacker
Scenario 23 — Malicious content fuzz PASS
scenario-23.json (report)
{
"agent_group": "openclaw",
"pass": true,
"payloads": {
"html": {
"input_bytes": 66,
"roundtrip_bytes": 66,
"write_http": 201
},
"oversize": {
"input_bytes": 1048576,
"roundtrip_bytes": 0,
"write_http": 400
},
"sql": {
"input_bytes": 61,
"roundtrip_bytes": 61,
"write_http": 201
},
"unicode": {
"input_bytes": 19,
"roundtrip_bytes": 19,
"write_http": 201
}
},
"payloads_note": "accept+faithful OR 4xx reject both acceptable for oversize",
"reasons": [],
"scenario": "23",
"skipped": false,
"tls_mode": "off"
}
scenario-23.log (console trace)
payload sql: 61 bytes payload html: 66 bytes payload oversize: 1048576 bytes oversize: server rejected oversize with HTTP 400 (acceptable) payload unicode: 19 bytes
Scenario 24 — Byzantine peer PASS
scenario-24.json (report)
{
"agent_group": "openclaw",
"byzantine_marker": "bz-17bf0ef5da854ac489475721f5c38765",
"pass": true,
"reasons": [],
"scenario": "24",
"skipped": false,
"stored_metadata_agent_id": "REJECTED_BY_SERVER",
"sync_push_http_code": "422",
"tls_mode": "off"
}
scenario-24.log (console trace)
node-2 sends sync_push to node-3 claiming sender_agent_id=ai:alice sync_push returned HTTP 422 settle 5s for server-side sync apply node-3 stored metadata.agent_id=ABSENT (declared: ai:alice) sync_push rejected HTTP 422 — stricter-than-spec, acceptable
Scenario 25 — Clock skew tolerance PASS
scenario-25.json (report)
{
"agent_group": "openclaw",
"clock_offset_seconds": 300,
"marker": "ck-0c18e7aa8bee478fa816d23c087e8103",
"pass": true,
"reasons": [],
"scenario": "25",
"seen_on": {
"node_1": 1,
"node_3": 1
},
"skipped": false,
"target_node": "node-3",
"tls_mode": "off"
}
scenario-25.log (console trace)
shifting node-3 clock +300s (NTP disabled for the duration) node-3 now reports: Fri Apr 24 14:06:56 UTC 2026 alice writes on node-1 (normal clock); waiting for quorum fanout to skewed node-3 settle 15s for skewed-peer convergence node-3 (+300s clock) sees marker: 1 (expected >=1) node-1 sees marker: 1 (expected >=1) reverting node-3 clock
Scenario 28 — memory_search keyword PASS
scenario-28.json (report)
{
"agent_group": "openclaw",
"pass": true,
"peer_hits": {
"node_2": 1,
"node_3": 1
},
"reasons": [],
"scenario": "28",
"skipped": false,
"tls_mode": "off",
"token": "kwsearchf61033c2d3"
}
scenario-28.log (console trace)
alice writes a row containing unique token=kwsearchf61033c2d3 settle 8s for search index populate + fanout bob + charlie call /api/v1/search with the exact token node-2 keyword search returned 1 hits node-3 keyword search returned 1 hits
Scenario 29 — memory_archive lifecycle PASS
scenario-29.json (report)
{
"agent_group": "openclaw",
"archive_http_code": 200,
"bob_sees_archived": true,
"m1_id": "663409ce-cfee-44c8-b627-02d11edc70e2",
"node4_active_rows": 1,
"pass": true,
"reasons": [],
"restore_http_code": 200,
"scenario": "29",
"skipped": false,
"stats_shape_ok": true,
"tls_mode": "off"
}
scenario-29.log (console trace)
alice writes M1 on node-1
M1 id=663409ce-cfee-44c8-b627-02d11edc70e2
settle 5s for pre-archive replication
alice archives M1 via POST /api/v1/archive (ai-memory-mcp PR #361)
archive (POST) returned HTTP 200
settle 5s for archive propagation
bob queries /api/v1/archive on node-2
bob sees M1 in archive: True
charlie restores M1 via /api/v1/archive/{id}/restore on node-3
restore returned HTTP 200
settle 5s for restore propagation
node-4 aggregator: M1 must be active again
node-4 active rows matching marker: 1
fetch /api/v1/archive/stats on node-4
Scenario 30 — memory_capabilities handshake PASS
scenario-30.json (report)
{
"agent_group": "openclaw",
"pass": true,
"peer_views": {
"node_1": {
"_path": "/api/v1/capabilities",
"features": {
"auto_consolidation": false,
"auto_tagging": false,
"contradiction_analysis": false,
"cross_encoder_reranking": false,
"embedder_loaded": true,
"hybrid_recall": true,
"keyword_search": true,
"memory_reflection": false,
"query_expansion": false,
"semantic_search": true
},
"models": {
"cross_encoder": "none",
"embedding": "sentence-transformers/all-MiniLM-L6-v2",
"embedding_dim": 384,
"llm": "none"
},
"tier": "semantic",
"version": "0.6.2"
},
"node_2": {
"_path": "/api/v1/capabilities",
"features": {
"auto_consolidation": false,
"auto_tagging": false,
"contradiction_analysis": false,
"cross_encoder_reranking": false,
"embedder_loaded": true,
"hybrid_recall": true,
"keyword_search": true,
"memory_reflection": false,
"query_expansion": false,
"semantic_search": true
},
"models": {
"cross_encoder": "none",
"embedding": "sentence-transformers/all-MiniLM-L6-v2",
"embedding_dim": 384,
"llm": "none"
},
"tier": "semantic",
"version": "0.6.2"
},
"node_3": {
"_path": "/api/v1/capabilities",
"features": {
"auto_consolidation": false,
"auto_tagging": false,
"contradiction_analysis": false,
"cross_encoder_reranking": false,
"embedder_loaded": true,
"hybrid_recall": true,
"keyword_search": true,
"memory_reflection": false,
"query_expansion": false,
"semantic_search": true
},
"models": {
"cross_encoder": "none",
"embedding": "sentence-transformers/all-MiniLM-L6-v2",
"embedding_dim": 384,
"llm": "none"
},
"tier": "semantic",
"version": "0.6.2"
},
"node_4": {
"_path": "/api/v1/capabilities",
"features": {
"auto_consolidation": false,
"auto_tagging": false,
"contradiction_analysis": false,
"cross_encoder_reranking": false,
"embedder_loaded": true,
"hybrid_recall": true,
"keyword_search": true,
"memory_reflection": false,
"query_expansion": false,
"semantic_search": true
},
"models": {
"cross_encoder": "none",
"embedding": "sentence-transformers/all-MiniLM-L6-v2",
"embedding_dim": 384,
"llm": "none"
},
"tier": "semantic",
"version": "0.6.2"
}
},
"reasons": [],
"scenario": "30",
"skipped": false,
"tls_mode": "off"
}
scenario-30.log (console trace)
node-1 capabilities: ['features', 'models', 'tier', 'version', '_path'] node-2 capabilities: ['features', 'models', 'tier', 'version', '_path'] node-3 capabilities: ['features', 'models', 'tier', 'version', '_path'] node-4 capabilities: ['features', 'models', 'tier', 'version', '_path']
Scenario 31 — memory_gc quiescence PASS
scenario-31.json (report)
{
"agent_group": "openclaw",
"expected_live": 2,
"forget_http_code": 400,
"gc_http_code": 200,
"live_markers_per_peer": {
"node_1": 2,
"node_2": 2,
"node_3": 2,
"node_4": 2
},
"pass": true,
"reasons": [],
"scenario": "31",
"skipped": false,
"tls_mode": "off"
}
scenario-31.log (console trace)
alice writes 4 memories settle 6s for pre-gc replication alice forgets 2 via /api/v1/forget forget returned HTTP 400 settle 5s for forget propagation bob triggers /api/v1/gc on node-2 gc returned HTTP 200 settle 8s for post-gc settle verify remaining 2 markers are still readable on every peer node-1 sees 2/2 live markers node-2 sees 2/2 live markers node-3 sees 2/2 live markers node-4 sees 2/2 live markers
Scenario 32 — memory_inbox + notify PASS
scenario-32.json (report)
{
"agent_group": "openclaw",
"bob_inbox_count": 1,
"bob_sees_marker": true,
"charlie_inbox_count": 0,
"charlie_sees_marker": false,
"marker": "inb-d05dce01b3ec42ee82d30accc844bbf5",
"notify_http_code": 201,
"pass": true,
"reasons": [],
"scenario": "32",
"skipped": false,
"tls_mode": "off"
}
scenario-32.log (console trace)
alice calls /api/v1/notify → target=ai:bob notify returned HTTP 201 settle 6s for notification fanout bob queries his inbox on node-2 bob inbox has 1 messages; sees marker: True charlie queries his inbox on node-3 (must NOT see it) charlie inbox has 0 messages; sees marker: False
Scenario 33 — memory_subscribe pub/sub PASS
scenario-33.json (report)
{
"agent_group": "openclaw",
"m1_delivered": 1,
"namespace": "scenario33-pubsub-7ac176",
"ns_in_subs_after": false,
"ns_in_subs_before": true,
"pass": true,
"reasons": [],
"scenario": "33",
"skipped": false,
"subscribe_http_code": 201,
"subscriptions_after_count": 0,
"subscriptions_before_count": 1,
"tls_mode": "off",
"unsubscribe_http_code": 200
}
scenario-33.log (console trace)
bob subscribes to namespace scenario33-pubsub-7ac176 on node-2 subscribe returned HTTP 201 settle 2s for subscription settle bob subscriptions: 1 entries; contains ns: True alice writes M1 into the subscribed namespace settle 6s for write fanout to subscribers bob sees M1 in subscribed namespace: 1 bob unsubscribes from scenario33-pubsub-7ac176 unsubscribe returned HTTP 200 settle 2s for unsubscribe settle bob subscriptions after unsubscribe: ns still present = False alice writes M2 post-unsubscribe (may still replicate via federation but subscription list excludes ns) settle 5s for post-unsubscribe settle
Scenario 34 — memory_pending governance PASS
scenario-34.json (report)
{
"agent_group": "openclaw",
"approve_http_code": 200,
"charlie_sees": {
"approved": 1,
"rejected": 0
},
"namespace": "scenario34-pending-d6ce92",
"pass": true,
"pending_queue_count": 2,
"reasons": [],
"reject_http_code": 200,
"scenario": "34",
"set_standard_http_code": 201,
"skipped": false,
"tls_mode": "off"
}
scenario-34.log (console trace)
alice sets namespace standard on scenario34-pending-d6ce92: write=approve, approver=ai:bob set-standard returned HTTP 201 settle 2s for standard settle alice writes two memories into the governed namespace (should land in pending) p1=35a746ab-dbdf-4b89-901c-81b9b3ae1b4f p2=d7d713ce-29cb-4a04-8f5b-f4b9ac81670e settle 4s for pending queue settle bob lists pending on node-2 pending queue has 2 entries bob approves p1, rejects p2 approve HTTP 200; reject HTTP 200 settle 5s for decision fanout charlie reads the namespace — expects ONLY approved marker charlie sees approved=1 rejected=0
Scenario 35 — memory_namespace standards PASS
scenario-35.json (report)
{
"agent_group": "openclaw",
"child_ns": "scenario35-parent-24d733/child",
"clear_http_code": 200,
"get_standard_http_code": 200,
"parent_ns": "scenario35-parent-24d733",
"pass": true,
"post_clear_has_child_rule": false,
"reasons": [],
"scenario": "35",
"sees_child_rule": true,
"sees_parent_rule": true,
"set_child_http_code": 201,
"set_parent_http_code": 201,
"skipped": false,
"tls_mode": "off"
}
scenario-35.log (console trace)
alice writes parent-standard-memory on node-1 alice sets namespace standard on scenario35-parent-24d733 set-parent returned HTTP 201 alice writes child-standard-memory on node-1 alice sets namespace standard on scenario35-parent-24d733/child with parent=scenario35-parent-24d733 set-child returned HTTP 201 settle 4s for standard fanout bob gets standard for scenario35-parent-24d733/child on node-2 (expects layered parent+child) get-standard returned HTTP 200 parent-rule visible=True; child-rule visible=True alice clears standard on scenario35-parent-24d733/child clear returned HTTP 200 settle 3s for clear settle
Scenario 36 — memory_session_start PASS
scenario-36.json (report)
{
"agent_group": "openclaw",
"pass": true,
"reasons": [],
"scenario": "36",
"session_id": "fedb2223-9044-4a74-b4b7-84ef44420931",
"session_tagged_rows_on_bob": 2,
"skipped": false,
"start_http_code": 200,
"tls_mode": "off"
}
scenario-36.log (console trace)
alice starts a session on node-1 session_start returned HTTP 200, session_id=fedb2223-9044-4a74-b4b7-84ef44420931 alice writes 2 memories tagged with session_id settle 6s for session-tagged fanout bob lists on node-2 filtered by session_id=fedb2223-9044-4a74-b4b7-84ef44420931 bob sees 2 rows tagged session_id=fedb2223-9044-4a74-b4b7-84ef44420931 (expected 2)
Scenario 37 — memory_get_links bidirectional PASS
scenario-37.json (report)
{
"agent_group": "openclaw",
"forward_has_target": true,
"m1": "34fd8452-610a-474e-be62-f6b68499d7cb",
"m2": "583e4f87-d13a-4762-b742-f1d9e08da30e",
"pass": true,
"reasons": [],
"reverse_has_source": true,
"scenario": "37",
"skipped": false,
"tls_mode": "off"
}
scenario-37.log (console trace)
alice writes M1 + M2 + links M1→M2 M1=34fd8452-610a-474e-be62-f6b68499d7cb M2=583e4f87-d13a-4762-b742-f1d9e08da30e settle 6s for link fanout charlie queries /api/v1/links/M1 (forward) charlie queries /api/v1/links/M2 (reverse)
Scenario 38 — /export + /import PASS
scenario-38.json (report)
{
"agent_group": "openclaw",
"dst_ns": "scenario38-dst-39186f",
"expected_rows": 5,
"export_http_code": 200,
"import_http_code": 200,
"markers_preserved": 5,
"pass": true,
"reasons": [],
"rows_exported": 5,
"rows_in_destination": 5,
"scenario": "38",
"skipped": false,
"src_ns": "scenario38-src-39186f",
"tls_mode": "off"
}
scenario-38.log (console trace)
alice writes 5 rows into scenario38-src-39186f settle 4s for pre-export replication alice exports on node-1 (endpoint has no namespace filter; filter client-side) export returned HTTP 200, total_rows=728 rewrote 5 memories from scenario38-src-39186f -> scenario38-dst-39186f bob imports the payload into scenario38-dst-39186f on node-2 import returned HTTP 200 settle 6s for import + fanout verify row counts match on destination scenario38-dst-39186f has 5 rows (expected 5) markers preserved in destination: 5/5
Scenario 39 — /sync/since delta PASS
scenario-39.json (report)
{
"agent_group": "openclaw",
"checkpoint": "2026-04-24T14:09:06+00:00",
"diag_curl_body_head": "{\"count\":6,\"earliest_updated_at\":\"2026-04-24T14:09:38.282777032+00:00\",\"latest_updated_at\":\"2026-04-24T14:09:39.129652815+00:00\",\"limit\":500,\"memories\":[{\"access_count\":0,\"confidence\":1.0,\"content\":\"marker=delta-0-731632682d10489ebc6d36e4bd4b2357\",\"created_at\":\"2026-04-24T14:09:38.282777032+00:00\",\"",
"diag_curl_exit": 0,
"diag_curl_http_code": 200,
"diag_curl_stderr": "",
"diag_earliest_updated_at": "2026-04-24T14:09:38.282777032+00:00",
"diag_latest_updated_at": "2026-04-24T14:09:39.129652815+00:00",
"diag_node3_health_reachable": true,
"diag_updated_since": "2026-04-24T14:09:06+00:00",
"expected_markers": 6,
"markers_present": 6,
"namespace": "scenario39-delta-e90f98",
"pass": true,
"reasons": [],
"rows_returned": 6,
"rows_returned_raw": 6,
"scenario": "39",
"skipped": false,
"tls_mode": "off"
}
scenario-39.log (console trace)
checkpoint = 2026-04-24T14:09:06+00:00 suspending ai-memory on node-3 !! ssh timeout (30s): -c pgrep -f 'ai-memory serve' | xargs -r kill -STOP alice + bob write 6 rows while node-3 is out resuming ai-memory on node-3 settle 15s for process resume + federation catchup node-3 → node-1 health reachable: True (after 1 probes) node-3 asks node-1 /api/v1/sync/since?since=2026-04-24T14:09:06+00:00 curl exit=0 http_code=200 body_len=2898 stderr='' /sync/since raw=6 ns-filtered=6; 6/6 match our markers diag: updated_since=2026-04-24T14:09:06+00:00 earliest=2026-04-24T14:09:38.282777032+00:00 latest=2026-04-24T14:09:39.129652815+00:00
Scenario 40 — /memories/bulk PASS
scenario-40.json (report)
{
"agent_group": "openclaw",
"bulk_http_code": "200",
"bulk_size": 500,
"namespace": "scenario40-bulk-9634a0",
"pass": true,
"per_peer_count": {
"node_2": 500,
"node_3": 500,
"node_4": 500
},
"reasons": [],
"scenario": "40",
"skipped": false,
"tls_mode": "off"
}
scenario-40.log (console trace)
constructing 500-row bulk payload staging bulk payload on node-1 /tmp, then POST /api/v1/memories/bulk bulk POST returned HTTP 200 settle 20s for bulk fanout across 3 peers + aggregator node-2 count=500 (expected 500) node-3 count=500 (expected 500) node-4 count=500 (expected 500)
Scenario 41 — /metrics Prometheus PASS
scenario-41.json (report)
{
"activity_namespace": "scenario41-activity-495e42",
"agent_group": "openclaw",
"pass": true,
"per_peer": {
"node_1": {
"counters_t0": 8,
"counters_t1": 8,
"regressed_keys": 0
},
"node_2": {
"counters_t0": 8,
"counters_t1": 8,
"regressed_keys": 0
},
"node_3": {
"counters_t0": 7,
"counters_t1": 7,
"regressed_keys": 0
}
},
"reasons": [],
"scenario": "41",
"skipped": false,
"tls_mode": "off"
}
scenario-41.log (console trace)
scrape T0 node-1 T0 parsed 8 memory counters node-2 T0 parsed 8 memory counters node-3 T0 parsed 7 memory counters settle 5s for counter update scrape T1 node-1 T1 parsed 8 memory counters node-2 T1 parsed 8 memory counters node-3 T1 parsed 7 memory counters
Scenario 42 — /namespaces enumeration PASS
scenario-42.json (report)
{
"agent_group": "openclaw",
"namespaces": [
"scenario42-7f4bc8-0",
"scenario42-7f4bc8-1",
"scenario42-7f4bc8-2"
],
"pass": true,
"per_peer": {
"node_1": {
"scenario42-7f4bc8-0": 2,
"scenario42-7f4bc8-1": 2,
"scenario42-7f4bc8-2": 2
},
"node_2": {
"scenario42-7f4bc8-0": 2,
"scenario42-7f4bc8-1": 2,
"scenario42-7f4bc8-2": 2
},
"node_3": {
"scenario42-7f4bc8-0": 2,
"scenario42-7f4bc8-1": 2,
"scenario42-7f4bc8-2": 2
},
"node_4": {
"scenario42-7f4bc8-0": 2,
"scenario42-7f4bc8-1": 2,
"scenario42-7f4bc8-2": 2
}
},
"reasons": [],
"scenario": "42",
"skipped": false,
"tls_mode": "off"
}
scenario-42.log (console trace)
alice writes into 3 distinct namespaces: ['scenario42-7f4bc8-0', 'scenario42-7f4bc8-1', 'scenario42-7f4bc8-2']
settle 10s for namespace index fanout
node-1 sees 3/3 target namespaces, counts: {'scenario42-7f4bc8-0': 2, 'scenario42-7f4bc8-1': 2, 'scenario42-7f4bc8-2': 2}
node-2 sees 3/3 target namespaces, counts: {'scenario42-7f4bc8-0': 2, 'scenario42-7f4bc8-1': 2, 'scenario42-7f4bc8-2': 2}
node-3 sees 3/3 target namespaces, counts: {'scenario42-7f4bc8-0': 2, 'scenario42-7f4bc8-1': 2, 'scenario42-7f4bc8-2': 2}
node-4 sees 3/3 target namespaces, counts: {'scenario42-7f4bc8-0': 2, 'scenario42-7f4bc8-1': 2, 'scenario42-7f4bc8-2': 2}
All artifacts
- a2a-baseline.json
- a2a-summary.json
- campaign.meta.json
- f3-peer-a2a.json
- scenario-1.json
- scenario-10.json
- scenario-11.json
- scenario-12.json
- scenario-13.json
- scenario-14.json
- scenario-15.json
- scenario-16.json
- scenario-17.json
- scenario-18.json
- scenario-1b.json
- scenario-2.json
- scenario-22.json
- scenario-23.json
- scenario-24.json
- scenario-25.json
- scenario-28.json
- scenario-29.json
- scenario-30.json
- scenario-31.json
- scenario-32.json
- scenario-33.json
- scenario-34.json
- scenario-35.json
- scenario-36.json
- scenario-37.json
- scenario-38.json
- scenario-39.json
- scenario-4.json
- scenario-40.json
- scenario-41.json
- scenario-42.json
- scenario-5.json
- scenario-6.json
- scenario-9.json
- scenario-1.log
- scenario-10.log
- scenario-11.log
- scenario-12.log
- scenario-13.log
- scenario-14.log
- scenario-15.log
- scenario-16.log
- scenario-17.log
- scenario-18.log
- scenario-1b.log
- scenario-2.log
- scenario-22.log
- scenario-23.log
- scenario-24.log
- scenario-25.log
- scenario-28.log
- scenario-29.log
- scenario-30.log
- scenario-31.log
- scenario-32.log
- scenario-33.log
- scenario-34.log
- scenario-35.log
- scenario-36.log
- scenario-37.log
- scenario-38.log
- scenario-39.log
- scenario-4.log
- scenario-40.log
- scenario-41.log
- scenario-42.log
- scenario-5.log
- scenario-6.log
- scenario-9.log